@firestitch/system 18.0.43 → 18.0.44

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,5 +1,6 @@
1
1
  import { OnDestroy, OnInit } from '@angular/core';
2
2
  import { BuildData } from '@firestitch/build';
3
+ import { Observable } from 'rxjs';
3
4
  import { DashboardAction } from './../../interfaces/dashboard-action';
4
5
  import * as i0 from "@angular/core";
5
6
  export declare class DashboardComponent implements OnInit, OnDestroy {
@@ -7,9 +8,15 @@ export declare class DashboardComponent implements OnInit, OnDestroy {
7
8
  private _cdRef;
8
9
  private _buildService;
9
10
  private _process;
10
- init: () => any;
11
- upgrade: () => any;
12
- load: () => any;
11
+ private _api;
12
+ /**
13
+ * All three are optional. Left unset, the component reads the standard system
14
+ * endpoints itself — the paths every application using this library already
15
+ * serves. One is supplied only to point the component somewhere else.
16
+ */
17
+ init: () => Observable<any>;
18
+ upgrade: () => Observable<any>;
19
+ load: () => Observable<any>;
13
20
  actions: DashboardAction[];
14
21
  dashboard: any;
15
22
  buttonActions: DashboardAction[];
@@ -48,6 +55,15 @@ export declare class DashboardComponent implements OnInit, OnDestroy {
48
55
  * would bury the events worth reading.
49
56
  */
50
57
  private _upgradeLine;
58
+ private _dashboardGet;
59
+ private _init;
60
+ /**
61
+ * The upgrade endpoint is read as a stream by default, which is what fills the
62
+ * process log line by line while the run is still going. An application that
63
+ * supplies its own `upgrade` decides for itself — a plain request emits once,
64
+ * produces no lines, and the process is a labelled spinner.
65
+ */
66
+ private _upgrade;
51
67
  private _load;
52
68
  static ɵfac: i0.ɵɵFactoryDeclaration<DashboardComponent, never>;
53
69
  static ɵcmp: i0.ɵɵComponentDeclaration<DashboardComponent, "fs-system-dashboard", never, { "init": { "alias": "init"; "required": false; }; "upgrade": { "alias": "upgrade"; "required": false; }; "load": { "alias": "load"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; }, {}, never, never, true, never>;
@@ -1,5 +1,5 @@
1
1
  import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject } from '@angular/core';
2
- import { StreamEventData } from '@firestitch/api';
2
+ import { FsApi, StreamEventData } from '@firestitch/api';
3
3
  import { FsBuildService } from '@firestitch/build';
4
4
  import { FsMessage } from '@firestitch/message';
5
5
  import { FsProcess, ProcessState } from '@firestitch/process';
@@ -24,6 +24,12 @@ export class DashboardComponent {
24
24
  _cdRef = inject(ChangeDetectorRef);
25
25
  _buildService = inject(FsBuildService);
26
26
  _process = inject(FsProcess);
27
+ _api = inject(FsApi);
28
+ /**
29
+ * All three are optional. Left unset, the component reads the standard system
30
+ * endpoints itself — the paths every application using this library already
31
+ * serves. One is supplied only to point the component somewhere else.
32
+ */
27
33
  init;
28
34
  upgrade;
29
35
  load;
@@ -57,7 +63,7 @@ export class DashboardComponent {
57
63
  action.click();
58
64
  }
59
65
  initClick() {
60
- this.init()
66
+ this._init()
61
67
  .subscribe(() => {
62
68
  this._message.success('Successfully initialized the system');
63
69
  });
@@ -77,7 +83,7 @@ export class DashboardComponent {
77
83
  * is what every application had before this.
78
84
  */
79
85
  upgradeClick() {
80
- const process = this._process.run('System upgrade', this.upgrade()
86
+ const process = this._process.run('System upgrade', this._upgrade()
81
87
  .pipe(map((event) => this._upgradeLine(event)), filter((line) => line !== null)));
82
88
  // The pending-upgrade count on this screen is the thing the button was
83
89
  // pressed to change, so it is re-read when the run settles — including when
@@ -133,8 +139,29 @@ export class DashboardComponent {
133
139
  return data.message || null;
134
140
  }
135
141
  }
142
+ _dashboardGet() {
143
+ return this.load
144
+ ? this.load()
145
+ : this._api.get('system/dashboard', {}, { key: 'dashboard' });
146
+ }
147
+ _init() {
148
+ return this.init
149
+ ? this.init()
150
+ : this._api.get('system/init', {}, { key: '' });
151
+ }
152
+ /**
153
+ * The upgrade endpoint is read as a stream by default, which is what fills the
154
+ * process log line by line while the run is still going. An application that
155
+ * supplies its own `upgrade` decides for itself — a plain request emits once,
156
+ * produces no lines, and the process is a labelled spinner.
157
+ */
158
+ _upgrade() {
159
+ return this.upgrade
160
+ ? this.upgrade()
161
+ : this._api.stream('GET', 'system/upgrade', { stream: true }, { key: '' });
162
+ }
136
163
  _load() {
137
- this.load()
164
+ this._dashboardGet()
138
165
  .subscribe((dashboard) => {
139
166
  this.dashboard = dashboard;
140
167
  this.dashboard.cronRanAttention = !dashboard.cronRan ||
@@ -166,4 +193,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
166
193
  }], actions: [{
167
194
  type: Input
168
195
  }] } });
169
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBYSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFB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T0FBTywySUFDUCxVQUFVLGlSQUNWLFNBQVMsZ0xBQ1QsWUFBWSxpU0FDWixZQUFZOzsyRkFHUCxrQkFBa0I7a0JBakI5QixTQUFTOytCQUNJLHFCQUFxQixtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxPQUFPO3dCQUNQLFVBQVU7d0JBQ1YsU0FBUzt3QkFDVCxZQUFZO3dCQUNaLFlBQVk7cUJBQ2Y7OEJBU2EsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBRVUsT0FBTztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdHJlYW1FdmVudERhdGEgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuaW1wb3J0IHsgQnVpbGREYXRhLCBGc0J1aWxkU2VydmljZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2J1aWxkJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9jZXNzLCBQcm9jZXNzU3RhdGUgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZGlmZmVyZW5jZUluTWludXRlcyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgRGFzaGJvYXJkQWN0aW9uIH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL2Rhc2hib2FyZC1hY3Rpb24nO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzTGFiZWxNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9sYWJlbCc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgVXBncmFkZUV2ZW50IH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL3VwZ3JhZGUtZXZlbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZnMtc3lzdGVtLWRhc2hib2FyZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEZzU2tlbGV0b25Nb2R1bGUsXG4gICAgICAgIEZzTGFiZWxNb2R1bGUsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIE1hdEljb24sXG4gICAgICAgIE1hdFRvb2x0aXAsXG4gICAgICAgIE1hdEJ1dHRvbixcbiAgICAgICAgRnNNZW51TW9kdWxlLFxuICAgICAgICBGc0RhdGVNb2R1bGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfYnVpbGRTZXJ2aWNlID0gaW5qZWN0KEZzQnVpbGRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuXG5cbiAgQElucHV0KCkgcHVibGljIGluaXQ6ICgpID0+IGFueTtcbiAgQElucHV0KCkgcHVibGljIHVwZ3JhZGU6ICgpID0+IGFueTtcbiAgQElucHV0KCkgcHVibGljIGxvYWQ6ICgpID0+IGFueTtcblxuICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBwdWJsaWMgZGFzaGJvYXJkO1xuICBwdWJsaWMgYnV0dG9uQWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcbiAgcHVibGljIGJ1aWxkOiBCdWlsZERhdGE7XG4gIHB1YmxpYyBtZW51QWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2xvYWQoKTtcbiAgICB0aGlzLmJ1dHRvbkFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gIWl0ZW0ubWVudTsgXG4gICAgfSk7XG4gICAgdGhpcy5tZW51QWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBpdGVtLm1lbnU7IFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZCA9IHRoaXMuX2J1aWxkU2VydmljZS5idWlsZDtcbiAgICB0aGlzLl9idWlsZFNlcnZpY2UuYnVpbGQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGJ1aWxkOiBCdWlsZERhdGEpID0+IHtcbiAgICAgICAgdGhpcy5idWlsZCA9IGJ1aWxkO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhY3Rpb25DbGljayhhY3Rpb24pIHtcbiAgICBhY3Rpb24uY2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0Q2xpY2soKSB7XG4gICAgdGhpcy5pbml0KClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1N1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCB0aGUgc3lzdGVtJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIHBlbmRpbmcgdXBncmFkZXMgYXMgYSBwcm9jZXNzIHJhdGhlciB0aGFuIGJlaGluZCBhIHNwaW5uZXIuXG4gICAqXG4gICAqIEEgc3Bpbm5lciBzYXlzIHRoZSBzYW1lIHRoaW5nIGZvciB0ZW4gc2Vjb25kcyBhbmQgZm9yIHRlbiBtaW51dGVzLCB3aGljaCBpc1xuICAgKiB0aGUgd2hvbGUgcHJvYmxlbTogYW4gdXBncmFkZSB0aGF0IHJlYnVpbGRzIHRoZSBsYXJnZXN0IHRhYmxlIGluIGEgc2NoZW1hXG4gICAqIGxvb2tzIGV4YWN0bHkgbGlrZSBvbmUgdGhhdCBoYXMgaHVuZywgYW5kIHRoZSBvbmx5IHdheSBhbnlib2R5IGZvdW5kIG91dFxuICAgKiB3aGljaCB3YXMgdG8gd2FpdCBmb3IgYSBwcm94eSB0byBnaXZlIHVwLlxuICAgKlxuICAgKiBXb3JrcyB3aGV0aGVyIG9yIG5vdCB0aGUgYXBwbGljYXRpb24ncyBlbmRwb2ludCBzdHJlYW1zLiBXaGVyZSBpdCBkb2VzLCBlYWNoXG4gICAqIE5ESlNPTiBldmVudCBiZWNvbWVzIGEgbGluZSBpbiB0aGUgcHJvY2VzcyBsb2cg4oCUIHdoaWNoIGZ1bmN0aW9uIGlzIHJ1bm5pbmcsXG4gICAqIGhvdyBmYXIgdGhyb3VnaCBpdCBpcywgd2hhdCBlYWNoIG9uZSBjb3N0LiBXaGVyZSBpdCBkb2VzIG5vdCwgdGhlIHNpbmdsZVxuICAgKiByZXBseSBwcm9kdWNlcyBubyBsaW5lcyBhbmQgdGhlIHByb2Nlc3MgaXMgc2ltcGx5IGEgbGFiZWxsZWQgc3Bpbm5lciwgd2hpY2hcbiAgICogaXMgd2hhdCBldmVyeSBhcHBsaWNhdGlvbiBoYWQgYmVmb3JlIHRoaXMuXG4gICAqL1xuICBwdWJsaWMgdXBncmFkZUNsaWNrKCkge1xuICAgIGNvbnN0IHByb2Nlc3MgPSB0aGlzLl9wcm9jZXNzLnJ1bihcbiAgICAgICdTeXN0ZW0gdXBncmFkZScsXG4gICAgICB0aGlzLnVwZ3JhZGUoKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoKGV2ZW50KSA9PiB0aGlzLl91cGdyYWRlTGluZShldmVudCkpLFxuICAgICAgICAgIGZpbHRlcigobGluZSk6IGxpbmUgaXMgc3RyaW5nID0+IGxpbmUgIT09IG51bGwpLFxuICAgICAgICApLFxuICAgICk7XG5cbiAgICAvLyBUaGUgcGVuZGluZy11cGdyYWRlIGNvdW50IG9uIHRoaXMgc2NyZWVuIGlzIHRoZSB0aGluZyB0aGUgYnV0dG9uIHdhc1xuICAgIC8vIHByZXNzZWQgdG8gY2hhbmdlLCBzbyBpdCBpcyByZS1yZWFkIHdoZW4gdGhlIHJ1biBzZXR0bGVzIOKAlCBpbmNsdWRpbmcgd2hlblxuICAgIC8vIGl0IEZBSUxTLCBiZWNhdXNlIGEgcnVuIHRoYXQgc3RvcHBlZCBoYWxmd2F5IHN0aWxsIGNvbXBsZXRlZCBldmVyeXRoaW5nXG4gICAgLy8gYmVmb3JlIHRoZSBvbmUgdGhhdCBicm9rZS5cbiAgICBwcm9jZXNzLmNvbXBsZXRlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoc3RhdGU6IFByb2Nlc3NTdGF0ZSkgPT4ge1xuICAgICAgICB0aGlzLl9sb2FkKCk7XG5cbiAgICAgICAgaWYgKHN0YXRlID09PSBQcm9jZXNzU3RhdGUuU3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuX21lc3NhZ2Uuc3VjY2VzcygnU3VjY2Vzc2Z1bGx5IHVwZ3JhZGVkIHRoZSBzeXN0ZW0nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT25lIGVtaXNzaW9uIG9mZiB0aGUgdXBncmFkZSBlbmRwb2ludCwgYXMgYSBsaW5lIGZvciB0aGUgcHJvY2VzcyBsb2cg4oCUIG9yXG4gICAqIG51bGwgZm9yIGFueXRoaW5nIHdpdGggbm90aGluZyB0byBzYXksIHdoaWNoIGlzIGRyb3BwZWQgcmF0aGVyIHRoYW4gbG9nZ2VkLlxuICAgKlxuICAgKiBgRnNBcGkuc3RyZWFtKClgIHdyYXBzIGV2ZXJ5IE5ESlNPTiBsaW5lIGluIGEgYFN0cmVhbUV2ZW50RGF0YWAsIGFuZFxuICAgKiBgRnNQcm9jZXNzYCBsb2dzIGEgc3RyaW5nIGVtaXNzaW9uIHZlcmJhdGltLiBTbyB0aGUgbWFwcGluZyBoYXBwZW5zIGhlcmU6IGFuXG4gICAqIG9iamVjdCBoYW5kZWQgdG8gdGhlIGxvZyByZW5kZXJzIGFzIGBbb2JqZWN0IE9iamVjdF1gLlxuICAgKlxuICAgKiBgcGluZ2AgaXMgZGVsaWJlcmF0ZWx5IHNpbGVudC4gSXQgaXMgdGhlIGhlYXJ0YmVhdCB0aGF0IHN0b3BzIGEgcHJveHlcbiAgICogY2xvc2luZyBhIHJ1biB0aGF0IGlzIHN0aWxsIHdvcmtpbmcsIGl0IGZpcmVzIGFmdGVyIGV2ZXJ5IHN0YXRlbWVudCwgYW5kIGl0XG4gICAqIHdvdWxkIGJ1cnkgdGhlIGV2ZW50cyB3b3J0aCByZWFkaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBncmFkZUxpbmUoZXZlbnQ6IHVua25vd24pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkYXRhOiBVcGdyYWRlRXZlbnQgPSAoZXZlbnQgaW5zdGFuY2VvZiBTdHJlYW1FdmVudERhdGEgPyBldmVudC5kYXRhIDogZXZlbnQpIGFzIFVwZ3JhZGVFdmVudDtcblxuICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGlmICghZGF0YSB8fCAhZGF0YS50eXBlIHx8IGRhdGEudHlwZSA9PT0gJ3BpbmcnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzdGVwID0gYCR7ZGF0YS5pbmRleH0gb2YgJHtkYXRhLnRvdGFsfWA7XG5cbiAgICBzd2l0Y2ggKGRhdGEudHlwZSkge1xuICAgICAgY2FzZSAnc3RhcnQnOlxuICAgICAgICByZXR1cm4gZGF0YS50b3RhbFxuICAgICAgICAgID8gYCR7ZGF0YS50b3RhbH0gdXBncmFkZShzKSB0byBydW46ICR7KGRhdGEuZnVuY3Rpb25zIHx8IFtdKS5qb2luKCcsICcpfWBcbiAgICAgICAgICA6ICdOb3RoaW5nIHRvIHVwZ3JhZGUnO1xuXG4gICAgICBjYXNlICd1cGdyYWRlJzpcbiAgICAgICAgaWYgKGRhdGEuc3RhdGUgPT09ICdzdGFydGVkJykge1xuICAgICAgICAgIHJldHVybiBgJHtzdGVwfSAke2RhdGEubmFtZX3igKZgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGEuc3RhdGUgPT09ICdjb21wbGV0ZWQnXG4gICAgICAgICAgPyBgJHtzdGVwfSAke2RhdGEubmFtZX0g4oCUICR7ZGF0YS5kdXJhdGlvbn1gXG4gICAgICAgICAgOiBgJHtzdGVwfSAke2RhdGEubmFtZX0gRkFJTEVEIOKAlCAke2RhdGEubWVzc2FnZX1gO1xuXG4gICAgICBjYXNlICdkb25lJzpcbiAgICAgICAgcmV0dXJuIGRhdGEuY29tcGxldGVkXG4gICAgICAgICAgPyBgQ29tcGxldGVkICR7ZGF0YS5jb21wbGV0ZWR9IHVwZ3JhZGUocylgXG4gICAgICAgICAgOiAnTm90aGluZyB0byB1cGdyYWRlJztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRhdGEubWVzc2FnZSB8fCBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xvYWQoKSB7XG4gICAgdGhpcy5sb2FkKClcbiAgICAgIC5zdWJzY3JpYmUoKGRhc2hib2FyZCkgPT4ge1xuICAgICAgICB0aGlzLmRhc2hib2FyZCA9IGRhc2hib2FyZDtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmQuY3JvblJhbkF0dGVudGlvbiA9ICFkYXNoYm9hcmQuY3JvblJhbiB8fFxuICAgICAgICAgZGlmZmVyZW5jZUluTWludXRlcyhuZXcgRGF0ZSgpLCBuZXcgRGF0ZShkYXNoYm9hcmQuY3JvblJhbikpID4gMTU7XG4gICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgKmZzU2tlbGV0b249XCJkYXNoYm9hcmRcIj5cbiAgPGRpdiBjbGFzcz1cImZzLXJvdy5nYXAtbGcud3JhcC5hbGlnbi1zdGFydFwiPlxuICAgIDxkaXY+XG4gICAgICA8aDI+XG4gICAgICAgIFNlcnZlclxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIERhdGUvVGltZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuc2VydmVyVGltZSB8IGZzRGF0ZUZvcm1hdDogJ2RhdGUtdGltZScgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBUaW1lem9uZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuc2VydmVyVGltZXpvbmUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBIb3N0bmFtZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuc2VydmVySG9zdG5hbWUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBEaXJlY3RvcnlcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmFwcERpcmVjdG9yeSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGgyPlxuICAgICAgICBTeXN0ZW1cbiAgICAgIDwvaDI+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBNb2RlXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5hcHBNb2RlIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgTm90aWZpY2F0aW9uIFJlY2lwaWVudHNcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLm5vdGlmeVJlY2lwaWVudHMuam9pbignLCAnKSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2PlxuICAgICAgPGgyPlxuICAgICAgICBEYXRhYmFzZVxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIE5hbWVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmRhdGFiYXNlTmFtZSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIERhdGUvVGltZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuZGF0YWJhc2VUaW1lIHwgZnNEYXRlRm9ybWF0OiAnZGF0ZS10aW1lJyB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFRpbWV6b25lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5kYXRhYmFzZVRpbWV6b25lIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIEBpZiAoYnVpbGQgfHwgZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCkge1xuICAgICAgPGRpdj5cbiAgICAgICAgQGlmIChidWlsZCkge1xuICAgICAgICAgIDxoMj5cbiAgICAgICAgICAgIEJ1aWxkXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIFZlcnNpb25cbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7eyBidWlsZC52ZXJzaW9uIHx8ICdVbmtub3duJyB9fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICBEYXRlXG4gICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAge3sgKGJ1aWxkLmRhdGUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnKSB8fCAnVW5rbm93bicgfX1cbiAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCkge1xuICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgUGVuZGluZyBVcGdyYWRlc1xuICAgICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzPVwiYXR0ZW50aW9uXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbmVlZHMtYXR0ZW50aW9uJzogISFkYXNoYm9hcmQudXBncmFkZXMubGVuZ3RoIH1cIj5cbiAgICAgICAgICAgICAge3sgZGFzaGJvYXJkLnVwZ3JhZGVzLmxlbmd0aCB9fVxuICAgICAgICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJkYXNoYm9hcmQudXBncmFkZXMuam9pbignXFxuJylcIlxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBDbGFzcz1cInRvb2x0aXAtcGVuZGluZy11cGdyYWRlc1wiPlxuICAgICAgICAgICAgICAgIHdhcm5pbmdcbiAgICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGRpdj5cbiAgICAgIDxoMj5cbiAgICAgICAgQ3JvblxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIExhc3QgUmFuXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJhdHRlbnRpb25cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ25lZWRzLWF0dGVudGlvbic6IGRhc2hib2FyZC5jcm9uUmFuQXR0ZW50aW9uIH1cIj5cbiAgICAgICAgICBAaWYgKCFkYXNoYm9hcmQuY3JvblJhbikge1xuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIE5ldmVyXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoZGFzaGJvYXJkLmNyb25SYW4pIHtcbiAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICB7eyBkYXNoYm9hcmQuY3JvblJhbiB8IGZzRGF0ZUZvcm1hdDogJ2RhdGUtdGltZScgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPG1hdC1pY29uPlxuICAgICAgICAgICAgd2FybmluZ1xuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwidXBncmFkZUNsaWNrKClcIj5cbiAgICAgICAgUnVuIFVwZ3JhZGVzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJpbml0Q2xpY2soKVwiPlxuICAgICAgICBJbml0IFN5c3RlbVxuICAgICAgPC9idXR0b24+XG4gICAgICBAZm9yIChhY3Rpb24gb2YgYnV0dG9uQWN0aW9uczsgdHJhY2sgYWN0aW9uKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ2xpY2soYWN0aW9uKVwiPlxuICAgICAgICAgIHt7IGFjdGlvbi5sYWJlbCB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICAgIEBpZiAobWVudUFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgIDxmcy1tZW51IGJ1dHRvbkNsYXNzPVwibWF0LXN0cm9rZWQtYnV0dG9uIG1lbnUtYnV0dG9uXCI+XG4gICAgICAgICAgQGZvciAoYWN0aW9uIG9mIG1lbnVBY3Rpb25zOyB0cmFjayBhY3Rpb24pIHtcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICBmcy1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbkNsaWNrKGFjdGlvbilcIj5cbiAgICAgICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9mcy1tZW51PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PiJdfQ==
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9zeXN0ZW0vY29tcG9uZW50cy9kYXNoYm9hcmQvZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQWEsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9DLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFB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QUFuQixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsSUFBSTtzQkFBbkIsS0FBSztnQkFFVSxPQUFPO3NCQUF0QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZzQXBpLCBTdHJlYW1FdmVudERhdGEgfSBmcm9tICdAZmlyZXN0aXRjaC9hcGknO1xuaW1wb3J0IHsgQnVpbGREYXRhLCBGc0J1aWxkU2VydmljZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2J1aWxkJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNQcm9jZXNzLCBQcm9jZXNzU3RhdGUgfSBmcm9tICdAZmlyZXN0aXRjaC9wcm9jZXNzJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZGlmZmVyZW5jZUluTWludXRlcyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgRGFzaGJvYXJkQWN0aW9uIH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL2Rhc2hib2FyZC1hY3Rpb24nO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzTGFiZWxNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9sYWJlbCc7XG5pbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBGc01lbnVNb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9tZW51JztcbmltcG9ydCB7IEZzRGF0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgVXBncmFkZUV2ZW50IH0gZnJvbSAnLi8uLi8uLi9pbnRlcmZhY2VzL3VwZ3JhZGUtZXZlbnQnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZnMtc3lzdGVtLWRhc2hib2FyZCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGFzaGJvYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEZzU2tlbGV0b25Nb2R1bGUsXG4gICAgICAgIEZzTGFiZWxNb2R1bGUsXG4gICAgICAgIE5nQ2xhc3MsXG4gICAgICAgIE1hdEljb24sXG4gICAgICAgIE1hdFRvb2x0aXAsXG4gICAgICAgIE1hdEJ1dHRvbixcbiAgICAgICAgRnNNZW51TW9kdWxlLFxuICAgICAgICBGc0RhdGVNb2R1bGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2NkUmVmID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgcHJpdmF0ZSBfYnVpbGRTZXJ2aWNlID0gaW5qZWN0KEZzQnVpbGRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfcHJvY2VzcyA9IGluamVjdChGc1Byb2Nlc3MpO1xuICBwcml2YXRlIF9hcGkgPSBpbmplY3QoRnNBcGkpO1xuXG5cbiAgLyoqXG4gICAqIEFsbCB0aHJlZSBhcmUgb3B0aW9uYWwuIExlZnQgdW5zZXQsIHRoZSBjb21wb25lbnQgcmVhZHMgdGhlIHN0YW5kYXJkIHN5c3RlbVxuICAgKiBlbmRwb2ludHMgaXRzZWxmIOKAlCB0aGUgcGF0aHMgZXZlcnkgYXBwbGljYXRpb24gdXNpbmcgdGhpcyBsaWJyYXJ5IGFscmVhZHlcbiAgICogc2VydmVzLiBPbmUgaXMgc3VwcGxpZWQgb25seSB0byBwb2ludCB0aGUgY29tcG9uZW50IHNvbWV3aGVyZSBlbHNlLlxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGluaXQ6ICgpID0+IE9ic2VydmFibGU8YW55PjtcbiAgQElucHV0KCkgcHVibGljIHVwZ3JhZGU6ICgpID0+IE9ic2VydmFibGU8YW55PjtcbiAgQElucHV0KCkgcHVibGljIGxvYWQ6ICgpID0+IE9ic2VydmFibGU8YW55PjtcblxuICBASW5wdXQoKSBwdWJsaWMgYWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBwdWJsaWMgZGFzaGJvYXJkO1xuICBwdWJsaWMgYnV0dG9uQWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcbiAgcHVibGljIGJ1aWxkOiBCdWlsZERhdGE7XG4gIHB1YmxpYyBtZW51QWN0aW9uczogRGFzaGJvYXJkQWN0aW9uW10gPSBbXTtcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2xvYWQoKTtcbiAgICB0aGlzLmJ1dHRvbkFjdGlvbnMgPSB0aGlzLmFjdGlvbnMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICByZXR1cm4gIWl0ZW0ubWVudTsgXG4gICAgfSk7XG4gICAgdGhpcy5tZW51QWN0aW9ucyA9IHRoaXMuYWN0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgIHJldHVybiBpdGVtLm1lbnU7IFxuICAgIH0pO1xuXG4gICAgdGhpcy5idWlsZCA9IHRoaXMuX2J1aWxkU2VydmljZS5idWlsZDtcbiAgICB0aGlzLl9idWlsZFNlcnZpY2UuYnVpbGQkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGJ1aWxkOiBCdWlsZERhdGEpID0+IHtcbiAgICAgICAgdGhpcy5idWlsZCA9IGJ1aWxkO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhY3Rpb25DbGljayhhY3Rpb24pIHtcbiAgICBhY3Rpb24uY2xpY2soKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0Q2xpY2soKSB7XG4gICAgdGhpcy5faW5pdCgpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgdGhlIHN5c3RlbScpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBwZW5kaW5nIHVwZ3JhZGVzIGFzIGEgcHJvY2VzcyByYXRoZXIgdGhhbiBiZWhpbmQgYSBzcGlubmVyLlxuICAgKlxuICAgKiBBIHNwaW5uZXIgc2F5cyB0aGUgc2FtZSB0aGluZyBmb3IgdGVuIHNlY29uZHMgYW5kIGZvciB0ZW4gbWludXRlcywgd2hpY2ggaXNcbiAgICogdGhlIHdob2xlIHByb2JsZW06IGFuIHVwZ3JhZGUgdGhhdCByZWJ1aWxkcyB0aGUgbGFyZ2VzdCB0YWJsZSBpbiBhIHNjaGVtYVxuICAgKiBsb29rcyBleGFjdGx5IGxpa2Ugb25lIHRoYXQgaGFzIGh1bmcsIGFuZCB0aGUgb25seSB3YXkgYW55Ym9keSBmb3VuZCBvdXRcbiAgICogd2hpY2ggd2FzIHRvIHdhaXQgZm9yIGEgcHJveHkgdG8gZ2l2ZSB1cC5cbiAgICpcbiAgICogV29ya3Mgd2hldGhlciBvciBub3QgdGhlIGFwcGxpY2F0aW9uJ3MgZW5kcG9pbnQgc3RyZWFtcy4gV2hlcmUgaXQgZG9lcywgZWFjaFxuICAgKiBOREpTT04gZXZlbnQgYmVjb21lcyBhIGxpbmUgaW4gdGhlIHByb2Nlc3MgbG9nIOKAlCB3aGljaCBmdW5jdGlvbiBpcyBydW5uaW5nLFxuICAgKiBob3cgZmFyIHRocm91Z2ggaXQgaXMsIHdoYXQgZWFjaCBvbmUgY29zdC4gV2hlcmUgaXQgZG9lcyBub3QsIHRoZSBzaW5nbGVcbiAgICogcmVwbHkgcHJvZHVjZXMgbm8gbGluZXMgYW5kIHRoZSBwcm9jZXNzIGlzIHNpbXBseSBhIGxhYmVsbGVkIHNwaW5uZXIsIHdoaWNoXG4gICAqIGlzIHdoYXQgZXZlcnkgYXBwbGljYXRpb24gaGFkIGJlZm9yZSB0aGlzLlxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVDbGljaygpIHtcbiAgICBjb25zdCBwcm9jZXNzID0gdGhpcy5fcHJvY2Vzcy5ydW4oXG4gICAgICAnU3lzdGVtIHVwZ3JhZGUnLFxuICAgICAgdGhpcy5fdXBncmFkZSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcCgoZXZlbnQpID0+IHRoaXMuX3VwZ3JhZGVMaW5lKGV2ZW50KSksXG4gICAgICAgICAgZmlsdGVyKChsaW5lKTogbGluZSBpcyBzdHJpbmcgPT4gbGluZSAhPT0gbnVsbCksXG4gICAgICAgICksXG4gICAgKTtcblxuICAgIC8vIFRoZSBwZW5kaW5nLXVwZ3JhZGUgY291bnQgb24gdGhpcyBzY3JlZW4gaXMgdGhlIHRoaW5nIHRoZSBidXR0b24gd2FzXG4gICAgLy8gcHJlc3NlZCB0byBjaGFuZ2UsIHNvIGl0IGlzIHJlLXJlYWQgd2hlbiB0aGUgcnVuIHNldHRsZXMg4oCUIGluY2x1ZGluZyB3aGVuXG4gICAgLy8gaXQgRkFJTFMsIGJlY2F1c2UgYSBydW4gdGhhdCBzdG9wcGVkIGhhbGZ3YXkgc3RpbGwgY29tcGxldGVkIGV2ZXJ5dGhpbmdcbiAgICAvLyBiZWZvcmUgdGhlIG9uZSB0aGF0IGJyb2tlLlxuICAgIHByb2Nlc3MuY29tcGxldGVkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChzdGF0ZTogUHJvY2Vzc1N0YXRlKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvYWQoKTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IFByb2Nlc3NTdGF0ZS5TdWNjZXNzKSB7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTdWNjZXNzZnVsbHkgdXBncmFkZWQgdGhlIHN5c3RlbScpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgZW1pc3Npb24gb2ZmIHRoZSB1cGdyYWRlIGVuZHBvaW50LCBhcyBhIGxpbmUgZm9yIHRoZSBwcm9jZXNzIGxvZyDigJQgb3JcbiAgICogbnVsbCBmb3IgYW55dGhpbmcgd2l0aCBub3RoaW5nIHRvIHNheSwgd2hpY2ggaXMgZHJvcHBlZCByYXRoZXIgdGhhbiBsb2dnZWQuXG4gICAqXG4gICAqIGBGc0FwaS5zdHJlYW0oKWAgd3JhcHMgZXZlcnkgTkRKU09OIGxpbmUgaW4gYSBgU3RyZWFtRXZlbnREYXRhYCwgYW5kXG4gICAqIGBGc1Byb2Nlc3NgIGxvZ3MgYSBzdHJpbmcgZW1pc3Npb24gdmVyYmF0aW0uIFNvIHRoZSBtYXBwaW5nIGhhcHBlbnMgaGVyZTogYW5cbiAgICogb2JqZWN0IGhhbmRlZCB0byB0aGUgbG9nIHJlbmRlcnMgYXMgYFtvYmplY3QgT2JqZWN0XWAuXG4gICAqXG4gICAqIGBwaW5nYCBpcyBkZWxpYmVyYXRlbHkgc2lsZW50LiBJdCBpcyB0aGUgaGVhcnRiZWF0IHRoYXQgc3RvcHMgYSBwcm94eVxuICAgKiBjbG9zaW5nIGEgcnVuIHRoYXQgaXMgc3RpbGwgd29ya2luZywgaXQgZmlyZXMgYWZ0ZXIgZXZlcnkgc3RhdGVtZW50LCBhbmQgaXRcbiAgICogd291bGQgYnVyeSB0aGUgZXZlbnRzIHdvcnRoIHJlYWRpbmcuXG4gICAqL1xuICBwcml2YXRlIF91cGdyYWRlTGluZShldmVudDogdW5rbm93bik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGRhdGE6IFVwZ3JhZGVFdmVudCA9IChldmVudCBpbnN0YW5jZW9mIFN0cmVhbUV2ZW50RGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudCkgYXMgVXBncmFkZUV2ZW50O1xuXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhIHx8ICFkYXRhLnR5cGUgfHwgZGF0YS50eXBlID09PSAncGluZycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHN0ZXAgPSBgJHtkYXRhLmluZGV4fSBvZiAke2RhdGEudG90YWx9YDtcblxuICAgIHN3aXRjaCAoZGF0YS50eXBlKSB7XG4gICAgICBjYXNlICdzdGFydCc6XG4gICAgICAgIHJldHVybiBkYXRhLnRvdGFsXG4gICAgICAgICAgPyBgJHtkYXRhLnRvdGFsfSB1cGdyYWRlKHMpIHRvIHJ1bjogJHsoZGF0YS5mdW5jdGlvbnMgfHwgW10pLmpvaW4oJywgJyl9YFxuICAgICAgICAgIDogJ05vdGhpbmcgdG8gdXBncmFkZSc7XG5cbiAgICAgIGNhc2UgJ3VwZ3JhZGUnOlxuICAgICAgICBpZiAoZGF0YS5zdGF0ZSA9PT0gJ3N0YXJ0ZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3N0ZXB9ICR7ZGF0YS5uYW1lfeKApmA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0YS5zdGF0ZSA9PT0gJ2NvbXBsZXRlZCdcbiAgICAgICAgICA/IGAke3N0ZXB9ICR7ZGF0YS5uYW1lfSDigJQgJHtkYXRhLmR1cmF0aW9ufWBcbiAgICAgICAgICA6IGAke3N0ZXB9ICR7ZGF0YS5uYW1lfSBGQUlMRUQg4oCUICR7ZGF0YS5tZXNzYWdlfWA7XG5cbiAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICByZXR1cm4gZGF0YS5jb21wbGV0ZWRcbiAgICAgICAgICA/IGBDb21wbGV0ZWQgJHtkYXRhLmNvbXBsZXRlZH0gdXBncmFkZShzKWBcbiAgICAgICAgICA6ICdOb3RoaW5nIHRvIHVwZ3JhZGUnO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGF0YS5tZXNzYWdlIHx8IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGFzaGJvYXJkR2V0KCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZFxuICAgICAgPyB0aGlzLmxvYWQoKVxuICAgICAgOiB0aGlzLl9hcGkuZ2V0KCdzeXN0ZW0vZGFzaGJvYXJkJywge30sIHsga2V5OiAnZGFzaGJvYXJkJyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5pbml0XG4gICAgICA/IHRoaXMuaW5pdCgpXG4gICAgICA6IHRoaXMuX2FwaS5nZXQoJ3N5c3RlbS9pbml0Jywge30sIHsga2V5OiAnJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdXBncmFkZSBlbmRwb2ludCBpcyByZWFkIGFzIGEgc3RyZWFtIGJ5IGRlZmF1bHQsIHdoaWNoIGlzIHdoYXQgZmlsbHMgdGhlXG4gICAqIHByb2Nlc3MgbG9nIGxpbmUgYnkgbGluZSB3aGlsZSB0aGUgcnVuIGlzIHN0aWxsIGdvaW5nLiBBbiBhcHBsaWNhdGlvbiB0aGF0XG4gICAqIHN1cHBsaWVzIGl0cyBvd24gYHVwZ3JhZGVgIGRlY2lkZXMgZm9yIGl0c2VsZiDigJQgYSBwbGFpbiByZXF1ZXN0IGVtaXRzIG9uY2UsXG4gICAqIHByb2R1Y2VzIG5vIGxpbmVzLCBhbmQgdGhlIHByb2Nlc3MgaXMgYSBsYWJlbGxlZCBzcGlubmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBfdXBncmFkZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnVwZ3JhZGVcbiAgICAgID8gdGhpcy51cGdyYWRlKClcbiAgICAgIDogdGhpcy5fYXBpLnN0cmVhbSgnR0VUJywgJ3N5c3RlbS91cGdyYWRlJywgeyBzdHJlYW06IHRydWUgfSwgeyBrZXk6ICcnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfbG9hZCgpIHtcbiAgICB0aGlzLl9kYXNoYm9hcmRHZXQoKVxuICAgICAgLnN1YnNjcmliZSgoZGFzaGJvYXJkKSA9PiB7XG4gICAgICAgIHRoaXMuZGFzaGJvYXJkID0gZGFzaGJvYXJkO1xuICAgICAgICB0aGlzLmRhc2hib2FyZC5jcm9uUmFuQXR0ZW50aW9uID0gIWRhc2hib2FyZC5jcm9uUmFuIHx8XG4gICAgICAgICBkaWZmZXJlbmNlSW5NaW51dGVzKG5ldyBEYXRlKCksIG5ldyBEYXRlKGRhc2hib2FyZC5jcm9uUmFuKSkgPiAxNTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiAqZnNTa2VsZXRvbj1cImRhc2hib2FyZFwiPlxuICA8ZGl2IGNsYXNzPVwiZnMtcm93LmdhcC1sZy53cmFwLmFsaWduLXN0YXJ0XCI+XG4gICAgPGRpdj5cbiAgICAgIDxoMj5cbiAgICAgICAgU2VydmVyXG4gICAgICA8L2gyPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgRGF0ZS9UaW1lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5zZXJ2ZXJUaW1lIHwgZnNEYXRlRm9ybWF0OiAnZGF0ZS10aW1lJyB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIFRpbWV6b25lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5zZXJ2ZXJUaW1lem9uZSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIEhvc3RuYW1lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5zZXJ2ZXJIb3N0bmFtZSB9fVxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIERpcmVjdG9yeVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuYXBwRGlyZWN0b3J5IH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8aDI+XG4gICAgICAgIFN5c3RlbVxuICAgICAgPC9oMj5cbiAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgIE1vZGVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmFwcE1vZGUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICBOb3RpZmljYXRpb24gUmVjaXBpZW50c1xuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQubm90aWZ5UmVjaXBpZW50cy5qb2luKCcsICcpIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8aDI+XG4gICAgICAgIERhdGFiYXNlXG4gICAgICA8L2gyPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgTmFtZVxuICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICB7eyBkYXNoYm9hcmQuZGF0YWJhc2VOYW1lIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgRGF0ZS9UaW1lXG4gICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgIHt7IGRhc2hib2FyZC5kYXRhYmFzZVRpbWUgfCBmc0RhdGVGb3JtYXQ6ICdkYXRlLXRpbWUnIH19XG4gICAgICA8L2ZzLWxhYmVsLWZpZWxkPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgVGltZXpvbmVcbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAge3sgZGFzaGJvYXJkLmRhdGFiYXNlVGltZXpvbmUgfX1cbiAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgQGlmIChidWlsZCB8fCBkYXNoYm9hcmQudXBncmFkZXMubGVuZ3RoKSB7XG4gICAgICA8ZGl2PlxuICAgICAgICBAaWYgKGJ1aWxkKSB7XG4gICAgICAgICAgPGgyPlxuICAgICAgICAgICAgQnVpbGRcbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDxmcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICAgIDxmcy1sYWJlbD5cbiAgICAgICAgICAgICAgVmVyc2lvblxuICAgICAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgICAgIHt7IGJ1aWxkLnZlcnNpb24gfHwgJ1Vua25vd24nIH19XG4gICAgICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICAgICAgICA8ZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgICAgIERhdGVcbiAgICAgICAgICAgIDwvZnMtbGFiZWw+XG4gICAgICAgICAgICB7eyAoYnVpbGQuZGF0ZSB8IGZzRGF0ZUZvcm1hdDogJ2RhdGUtdGltZScpIHx8ICdVbmtub3duJyB9fVxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIH1cbiAgICAgICAgQGlmIChkYXNoYm9hcmQudXBncmFkZXMubGVuZ3RoKSB7XG4gICAgICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICAgICAgPGZzLWxhYmVsPlxuICAgICAgICAgICAgICBQZW5kaW5nIFVwZ3JhZGVzXG4gICAgICAgICAgICA8L2ZzLWxhYmVsPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgY2xhc3M9XCJhdHRlbnRpb25cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICduZWVkcy1hdHRlbnRpb24nOiAhIWRhc2hib2FyZC51cGdyYWRlcy5sZW5ndGggfVwiPlxuICAgICAgICAgICAgICB7eyBkYXNoYm9hcmQudXBncmFkZXMubGVuZ3RoIH19XG4gICAgICAgICAgICAgIDxtYXQtaWNvblxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImRhc2hib2FyZC51cGdyYWRlcy5qb2luKCdcXG4nKVwiXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcENsYXNzPVwidG9vbHRpcC1wZW5kaW5nLXVwZ3JhZGVzXCI+XG4gICAgICAgICAgICAgICAgd2FybmluZ1xuICAgICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZnMtbGFiZWwtZmllbGQ+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2PlxuICAgICAgPGgyPlxuICAgICAgICBDcm9uXG4gICAgICA8L2gyPlxuICAgICAgPGZzLWxhYmVsLWZpZWxkPlxuICAgICAgICA8ZnMtbGFiZWw+XG4gICAgICAgICAgTGFzdCBSYW5cbiAgICAgICAgPC9mcy1sYWJlbD5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImF0dGVudGlvblwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnbmVlZHMtYXR0ZW50aW9uJzogZGFzaGJvYXJkLmNyb25SYW5BdHRlbnRpb24gfVwiPlxuICAgICAgICAgIEBpZiAoIWRhc2hib2FyZC5jcm9uUmFuKSB7XG4gICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgTmV2ZXJcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChkYXNoYm9hcmQuY3JvblJhbikge1xuICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgIHt7IGRhc2hib2FyZC5jcm9uUmFuIHwgZnNEYXRlRm9ybWF0OiAnZGF0ZS10aW1lJyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICB3YXJuaW5nXG4gICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9mcy1sYWJlbC1maWVsZD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXY+XG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LXN0cm9rZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJ1cGdyYWRlQ2xpY2soKVwiPlxuICAgICAgICBSdW4gVXBncmFkZXNcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtc3Ryb2tlZC1idXR0b25cbiAgICAgICAgKGNsaWNrKT1cImluaXRDbGljaygpXCI+XG4gICAgICAgIEluaXQgU3lzdGVtXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIEBmb3IgKGFjdGlvbiBvZiBidXR0b25BY3Rpb25zOyB0cmFjayBhY3Rpb24pIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1zdHJva2VkLWJ1dHRvblxuICAgICAgICAgIChjbGljayk9XCJhY3Rpb25DbGljayhhY3Rpb24pXCI+XG4gICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgQGlmIChtZW51QWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgPGZzLW1lbnUgYnV0dG9uQ2xhc3M9XCJtYXQtc3Ryb2tlZC1idXR0b24gbWVudS1idXR0b25cIj5cbiAgICAgICAgICBAZm9yIChhY3Rpb24gb2YgbWVudUFjdGlvbnM7IHRyYWNrIGFjdGlvbikge1xuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGZzLW1lbnUtaXRlbVxuICAgICAgICAgICAgICAoY2xpY2spPVwiYWN0aW9uQ2xpY2soYWN0aW9uKVwiPlxuICAgICAgICAgICAgICB7eyBhY3Rpb24ubGFiZWwgfX1cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgfVxuICAgICAgICA8L2ZzLW1lbnU+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+Il19
@@ -849,6 +849,12 @@ class DashboardComponent {
849
849
  _cdRef = inject(ChangeDetectorRef);
850
850
  _buildService = inject(FsBuildService);
851
851
  _process = inject(FsProcess);
852
+ _api = inject(FsApi);
853
+ /**
854
+ * All three are optional. Left unset, the component reads the standard system
855
+ * endpoints itself — the paths every application using this library already
856
+ * serves. One is supplied only to point the component somewhere else.
857
+ */
852
858
  init;
853
859
  upgrade;
854
860
  load;
@@ -882,7 +888,7 @@ class DashboardComponent {
882
888
  action.click();
883
889
  }
884
890
  initClick() {
885
- this.init()
891
+ this._init()
886
892
  .subscribe(() => {
887
893
  this._message.success('Successfully initialized the system');
888
894
  });
@@ -902,7 +908,7 @@ class DashboardComponent {
902
908
  * is what every application had before this.
903
909
  */
904
910
  upgradeClick() {
905
- const process = this._process.run('System upgrade', this.upgrade()
911
+ const process = this._process.run('System upgrade', this._upgrade()
906
912
  .pipe(map((event) => this._upgradeLine(event)), filter((line) => line !== null)));
907
913
  // The pending-upgrade count on this screen is the thing the button was
908
914
  // pressed to change, so it is re-read when the run settles — including when
@@ -958,8 +964,29 @@ class DashboardComponent {
958
964
  return data.message || null;
959
965
  }
960
966
  }
967
+ _dashboardGet() {
968
+ return this.load
969
+ ? this.load()
970
+ : this._api.get('system/dashboard', {}, { key: 'dashboard' });
971
+ }
972
+ _init() {
973
+ return this.init
974
+ ? this.init()
975
+ : this._api.get('system/init', {}, { key: '' });
976
+ }
977
+ /**
978
+ * The upgrade endpoint is read as a stream by default, which is what fills the
979
+ * process log line by line while the run is still going. An application that
980
+ * supplies its own `upgrade` decides for itself — a plain request emits once,
981
+ * produces no lines, and the process is a labelled spinner.
982
+ */
983
+ _upgrade() {
984
+ return this.upgrade
985
+ ? this.upgrade()
986
+ : this._api.stream('GET', 'system/upgrade', { stream: true }, { key: '' });
987
+ }
961
988
  _load() {
962
- this.load()
989
+ this._dashboardGet()
963
990
  .subscribe((dashboard) => {
964
991
  this.dashboard = dashboard;
965
992
  this.dashboard.cronRanAttention = !dashboard.cronRan ||