http-request-manager 0.0.20 → 4.1.2

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.
Files changed (79) hide show
  1. package/README.md +44 -253
  2. package/esm2022/lib/http-request-manager.module.mjs +145 -0
  3. package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +41 -0
  4. package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +175 -0
  5. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +80 -0
  6. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +42 -0
  7. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +85 -0
  8. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +11 -0
  9. package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +29 -0
  10. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +9 -0
  11. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +12 -0
  12. package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +10 -0
  13. package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +276 -0
  14. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +268 -0
  15. package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +75 -0
  16. package/esm2022/lib/index.mjs +4 -0
  17. package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +47 -0
  18. package/esm2022/lib/interceptors/request-error.interceptor.mjs +5 -5
  19. package/esm2022/lib/models/config-http-options.model.mjs +18 -0
  20. package/esm2022/lib/models/config-local-storage-options.model.mjs +12 -0
  21. package/esm2022/lib/models/config-options.model.mjs +12 -0
  22. package/esm2022/lib/models/config-token.model.mjs +8 -0
  23. package/esm2022/lib/models/index.mjs +4 -1
  24. package/esm2022/lib/models/retry-options.model.mjs +3 -3
  25. package/esm2022/lib/services/index.mjs +1 -1
  26. package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +34 -9
  27. package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +1 -2
  28. package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +2 -2
  29. package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +3 -3
  30. package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +87 -51
  31. package/esm2022/lib/services/request-manager-services/request.service.mjs +70 -28
  32. package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +7 -5
  33. package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +1 -1
  34. package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +6 -39
  35. package/esm2022/lib/services/utils/app.service.mjs +7 -1
  36. package/esm2022/lib/services/utils/object-merger.service.mjs +34 -0
  37. package/esm2022/lib/services/utils/path-query.service.mjs +2 -1
  38. package/esm2022/lib/services/utils/utils.service.mjs +23 -2
  39. package/esm2022/public-api.mjs +4 -4
  40. package/fesm2022/http-request-manager.mjs +1782 -435
  41. package/fesm2022/http-request-manager.mjs.map +1 -1
  42. package/http-request-manager-4.1.2.tgz +0 -0
  43. package/lib/http-request-manager.module.d.ts +33 -0
  44. package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +24 -0
  45. package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +56 -0
  46. package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +26 -0
  47. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +13 -0
  48. package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +26 -0
  49. package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +12 -0
  50. package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +16 -0
  51. package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +8 -0
  52. package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +14 -0
  53. package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +10 -0
  54. package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +98 -0
  55. package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +110 -0
  56. package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +16 -0
  57. package/lib/index.d.ts +3 -0
  58. package/lib/interceptors/proxy-debugger.interceptor.d.ts +12 -0
  59. package/lib/interceptors/request-error.interceptor.d.ts +1 -1
  60. package/lib/models/config-http-options.model.d.ts +21 -0
  61. package/lib/models/config-local-storage-options.model.d.ts +13 -0
  62. package/lib/models/config-options.model.d.ts +12 -0
  63. package/lib/models/config-token.model.d.ts +8 -0
  64. package/lib/models/index.d.ts +3 -0
  65. package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +7 -2
  66. package/lib/services/local-storage-manager-service/models/index.d.ts +0 -1
  67. package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +2 -2
  68. package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +4 -4
  69. package/lib/services/request-manager-services/http-manager.service.d.ts +12 -7
  70. package/lib/services/request-manager-services/request.service.d.ts +1 -0
  71. package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +1 -1
  72. package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +11 -15
  73. package/lib/services/utils/object-merger.service.d.ts +7 -0
  74. package/lib/services/utils/utils.service.d.ts +1 -1
  75. package/package.json +27 -18
  76. package/public-api.d.ts +3 -3
  77. package/esm2022/lib/services/local-storage-manager-service/models/storage-option-settings.model.mjs +0 -13
  78. package/http-request-manager-0.0.20.tgz +0 -0
  79. package/lib/services/local-storage-manager-service/models/storage-option-settings.model.d.ts +0 -15
@@ -0,0 +1,268 @@
1
+ import { Component, ViewChild, inject } from '@angular/core';
2
+ import { StateManagerDemoService } from './services/state-manager-demo.service';
3
+ import { FormBuilder, Validators } from '@angular/forms';
4
+ import { BehaviorSubject, EMPTY } from 'rxjs';
5
+ import { ClientInfo } from '../request-manager-demo/models/sample-client-info';
6
+ import { ClientInfoMapper } from '../request-manager-demo/models/sample-mapper-client-info';
7
+ import { AIPrompt } from '../request-manager-demo/models/sample-ai-prompt';
8
+ import { map, tap } from 'rxjs/operators';
9
+ import { DataType } from '../../models';
10
+ import { DatabaseStorage } from '../../models/database-storage.model';
11
+ import { HTTPManagerService, ApiRequest } from '../../services';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/common";
14
+ import * as i2 from "@angular/forms";
15
+ import * as i3 from "@angular/material/button";
16
+ import * as i4 from "@angular/material/form-field";
17
+ import * as i5 from "@angular/material/select";
18
+ import * as i6 from "@angular/material/core";
19
+ import * as i7 from "@angular/material/icon";
20
+ import * as i8 from "@angular/material/table";
21
+ import * as i9 from "@angular/material/progress-bar";
22
+ import * as i10 from "@angular/material/slide-toggle";
23
+ import * as i11 from "@angular/material/divider";
24
+ import * as i12 from "@angular/material/input";
25
+ export class RequestManagerStateDemoComponent {
26
+ get dataObservable$() {
27
+ switch (this.requestType) {
28
+ case 'GET':
29
+ return this.GET$;
30
+ case 'PUT':
31
+ return this.PUT$;
32
+ case 'POST':
33
+ return this.POST$;
34
+ case 'DELETE':
35
+ return this.DELETE$;
36
+ case 'STREAM':
37
+ return this.STREAM;
38
+ case 'STREAM_AI':
39
+ return this.STREAM_AI;
40
+ default:
41
+ return this.GET$;
42
+ break;
43
+ }
44
+ }
45
+ get hasChanged() {
46
+ return this.requestForm.dirty;
47
+ }
48
+ get dataType() {
49
+ return this.requestForm.get("datatype")?.value;
50
+ }
51
+ get database() {
52
+ return this.requestForm.get("database")?.value;
53
+ }
54
+ get retry() {
55
+ return this.requestForm.get("retry")?.value;
56
+ }
57
+ get headers() {
58
+ return this.requestForm.get('headers');
59
+ }
60
+ get isValid() {
61
+ this.requestForm.markAllAsTouched();
62
+ return this.requestForm.valid;
63
+ }
64
+ constructor() {
65
+ this.stateManagerDemoService = inject(StateManagerDemoService);
66
+ this.displayedColumns = ['id', 'name', 'lastName', 'age'];
67
+ this.fb = inject(FormBuilder);
68
+ this.httpManagerService = inject(HTTPManagerService);
69
+ this.isPending$ = this.stateManagerDemoService.isPending$;
70
+ this.error$ = this.stateManagerDemoService.error$;
71
+ this.countdown$ = this.httpManagerService.countdown$;
72
+ this.GET_error$ = new BehaviorSubject('');
73
+ this.POST_error$ = new BehaviorSubject('');
74
+ this.PUT_error$ = new BehaviorSubject('');
75
+ this.DELETE_error$ = new BehaviorSubject('');
76
+ this.STREAM_error$ = new BehaviorSubject('');
77
+ this.GET$ = new BehaviorSubject(null);
78
+ this.POST$ = new BehaviorSubject(null);
79
+ this.PUT$ = new BehaviorSubject(null);
80
+ this.DELETE$ = new BehaviorSubject(null);
81
+ this.STREAM = new BehaviorSubject(null);
82
+ this.STREAM$ = this.STREAM.asObservable();
83
+ this.STREAM_AI = new BehaviorSubject(null);
84
+ this.STREAM_AI$ = this.STREAM_AI.asObservable()
85
+ .pipe(map((items) => (items) ? items.map((item) => item.response) : []), map((items) => items.join('').trim()));
86
+ this.questionControl = this.fb.control("", [Validators.required]);
87
+ this.requestType = '';
88
+ this.sampleClientData = {
89
+ id: 0,
90
+ name: "Old School Dates",
91
+ domain: "osd.com",
92
+ service: "osd",
93
+ spiffe: "osd.com/osd",
94
+ secret: "SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX",
95
+ created: 1693003138,
96
+ modified: 1693003138,
97
+ icon: "",
98
+ imageFile: "",
99
+ };
100
+ this.selectedRecord = this.fb.control(null);
101
+ this.requestForm = this.fb.group({
102
+ datatype: this.fb.control('ARRAY'),
103
+ path: this.fb.control(""),
104
+ headers: this.fb.array([]),
105
+ adapter: [null],
106
+ mapper: [null],
107
+ retry: this.fb.group({
108
+ times: [3],
109
+ delay: [3],
110
+ }),
111
+ polling: [3],
112
+ database: this.fb.group({
113
+ table: [''],
114
+ expiresIn: ['1m'],
115
+ })
116
+ });
117
+ this.sampleAdaptors = [
118
+ { label: "ClientInfo Basic", value: ClientInfo.adapt },
119
+ { label: "AI Prompt", value: AIPrompt.adapt },
120
+ ];
121
+ this.sampleMappers = [
122
+ { label: "Mapper Basic", value: ClientInfoMapper.adapt },
123
+ { label: "AI Prompt", value: AIPrompt.adapt },
124
+ ];
125
+ // server = `http://sample-endpoint/as/authorization.oauth2`
126
+ this.arrayObjectsToObjects = (arr) => {
127
+ return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {};
128
+ };
129
+ }
130
+ ngOnInit() {
131
+ this.selectedRecord.valueChanges
132
+ .subscribe((data) => {
133
+ this.selectedRecord$ = (data) ? this.stateManagerDemoService.selectRecord$(data.id) : EMPTY;
134
+ });
135
+ this.stateManagerDemoService.data$
136
+ .pipe(tap((data) => {
137
+ switch (this.requestType) {
138
+ case 'GET':
139
+ this.GET$.next(data);
140
+ break;
141
+ case 'PUT':
142
+ this.PUT$.next(data);
143
+ break;
144
+ case 'POST':
145
+ this.POST$.next(data);
146
+ break;
147
+ case 'DELETE':
148
+ this.DELETE$.next(data);
149
+ break;
150
+ case 'STREAM':
151
+ this.STREAM.next(data);
152
+ break;
153
+ case 'STREAM_AI':
154
+ this.STREAM_AI.next(data);
155
+ break;
156
+ default:
157
+ break;
158
+ }
159
+ })).subscribe();
160
+ }
161
+ addHeader() {
162
+ const header = this.fb.group({
163
+ key: ['', Validators.required],
164
+ value: ['']
165
+ });
166
+ this.headers.push(header);
167
+ }
168
+ removeHeader(index) {
169
+ this.headers.removeAt(index);
170
+ }
171
+ compileRequest() {
172
+ const requestParams = this.requestForm.value;
173
+ requestParams.headers = this.arrayObjectsToObjects(requestParams.headers || []);
174
+ const pathReq = (requestParams.path || "").split("/");
175
+ if (!this.pollingState.checked)
176
+ requestParams.polling = 0;
177
+ if (!this.failedState.checked) {
178
+ requestParams.retry = { times: 0, delay: 0 };
179
+ }
180
+ return ApiRequest.adapt({
181
+ ...requestParams,
182
+ // ...{ path: pathReq, server: this.server },
183
+ ...{ path: pathReq },
184
+ });
185
+ }
186
+ onSetStateOptions() {
187
+ if (!this.isValid)
188
+ return;
189
+ const reqParams = this.compileRequest();
190
+ const db = DatabaseStorage.adapt(this.database);
191
+ const type = this.dataType === "ARRAY" ? DataType.ARRAY : DataType.OBJECT;
192
+ this.stateManagerDemoService.setAPIOptions(reqParams, type, db);
193
+ this.requestForm.markAsPristine();
194
+ }
195
+ onClearRecords() {
196
+ this.stateManagerDemoService.clearRecords();
197
+ }
198
+ onRefreshRecords() {
199
+ this.stateManagerDemoService.refreshData();
200
+ }
201
+ onGetRequest() {
202
+ this.requestType = 'GET';
203
+ this.stateManagerDemoService.getClients();
204
+ }
205
+ onCreateRequest() {
206
+ this.requestType = 'POST';
207
+ this.stateManagerDemoService.createClient(this.sampleClientData);
208
+ }
209
+ onUpdateRequest() {
210
+ this.requestType = 'PUT';
211
+ this.stateManagerDemoService.updateClient(this.sampleClientData);
212
+ }
213
+ onDeleteRequest() {
214
+ this.requestType = 'DELETE';
215
+ this.stateManagerDemoService.deleteClient(this.sampleClientData);
216
+ }
217
+ onStreamPostRequest() {
218
+ if (!this.isValid)
219
+ return;
220
+ this.requestType = 'STREAM_AI';
221
+ const reqParams = this.compileRequest();
222
+ reqParams.server = "http://localhost:11434/api";
223
+ reqParams.path = ["generate"];
224
+ reqParams.stream = true;
225
+ this.stateManagerDemoService.setAPIOptions(reqParams, DataType.ARRAY);
226
+ const payload = {
227
+ model: "mistral",
228
+ prompt: this.questionControl.value,
229
+ stream: reqParams.stream
230
+ };
231
+ this.stateManagerDemoService.streamAIRequest(payload);
232
+ }
233
+ onStreamRequest() {
234
+ if (!this.isValid)
235
+ return;
236
+ this.requestType = 'STREAM';
237
+ const reqParams = this.compileRequest();
238
+ reqParams.server = "oidc";
239
+ reqParams.stream = true;
240
+ this.stateManagerDemoService.setAPIOptions(reqParams, DataType.ARRAY);
241
+ this.stateManagerDemoService.streamRequest();
242
+ }
243
+ errorHandling(err, type) {
244
+ if (type === 'GET')
245
+ this.GET_error$.next(err.message);
246
+ if (type === 'POST')
247
+ this.POST_error$.next(err.message);
248
+ if (type === 'PUT')
249
+ this.PUT_error$.next(err.message);
250
+ if (type === 'DELETE')
251
+ this.DELETE_error$.next(err.message);
252
+ if (type === 'STREAM')
253
+ this.STREAM_error$.next(err.message);
254
+ }
255
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestManagerStateDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
256
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RequestManagerStateDemoComponent, selector: "app-request-manager-state-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error | json }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\" \n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\" \n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\" \n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.domain}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n \n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div>{{ (GET$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div>{{ (POST$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div>{{ (PUT$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div>{{ (DELETE$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n \n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n</div>", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }] }); }
257
+ }
258
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RequestManagerStateDemoComponent, decorators: [{
259
+ type: Component,
260
+ args: [{ selector: 'app-request-manager-state-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\">\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error | json }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\" \n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\" \n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\" \n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.domain}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n \n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div>{{ (GET$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div>{{ (POST$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div>{{ (PUT$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div>{{ (DELETE$ | async) | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n \n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n \n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n \n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">STREAMING POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamPostRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Ask Me</button>\n </div>\n </div>\n\n <div style=\"display: flex;\">\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Ask me a Question</mat-label>\n <textarea matInput placeholder=\"Why is the sky blue?\" [formControl]=\"questionControl\"></textarea>\n </mat-form-field>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM_AI$ | async) as data\">\n <p style=\"margin-bottom: .5rem; white-space:pre-wrap;\">{{data}}</p>\n </div>\n </div>\n\n </div>\n\n</div>", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}\n"] }]
261
+ }], ctorParameters: function () { return []; }, propDecorators: { failedState: [{
262
+ type: ViewChild,
263
+ args: ["failedState", { static: true }]
264
+ }], pollingState: [{
265
+ type: ViewChild,
266
+ args: ["pollingState", { static: true }]
267
+ }] } });
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLXN0YXRlLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBYyxlQUFlLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM1RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFFM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zdGF0ZS1tYW5hZ2VyLWRlbW8uc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgRm9ybUFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QsIEVNUFRZIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENsaWVudEluZm8gfSBmcm9tICcuLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLWNsaWVudC1pbmZvJztcbmltcG9ydCB7IENsaWVudEluZm9NYXBwZXIgfSBmcm9tICcuLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLW1hcHBlci1jbGllbnQtaW5mbyc7XG5pbXBvcnQgeyBBSVByb21wdCB9IGZyb20gJy4uL3JlcXVlc3QtbWFuYWdlci1kZW1vL21vZGVscy9zYW1wbGUtYWktcHJvbXB0JztcblxuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBEYXRhYmFzZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0YWJhc2Utc3RvcmFnZS5tb2RlbCc7XG5pbXBvcnQgeyBIVFRQTWFuYWdlclNlcnZpY2UsIEFwaVJlcXVlc3QgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcmVxdWVzdC1tYW5hZ2VyLXN0YXRlLWRlbW8uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVxdWVzdE1hbmFnZXJTdGF0ZURlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlID0gaW5qZWN0KFN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlKVxuXG4gIGRpc3BsYXllZENvbHVtbnMgPSBbJ2lkJywnbmFtZScsICdsYXN0TmFtZScsICdhZ2UnXVxuXG4gIHNlbGVjdGVkUmVjb3JkJD86IE9ic2VydmFibGU8Q2xpZW50SW5mb3xudWxsPlxuXG4gIGZiID0gaW5qZWN0KEZvcm1CdWlsZGVyKVxuXG4gIGh0dHBNYW5hZ2VyU2VydmljZSA9IGluamVjdChIVFRQTWFuYWdlclNlcnZpY2UpXG5cbiAgaXNQZW5kaW5nJCA9IHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuaXNQZW5kaW5nJFxuICBlcnJvciQgPSB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmVycm9yJFxuXG4gIGNvdW50ZG93biQgPSB0aGlzLmh0dHBNYW5hZ2VyU2VydmljZS5jb3VudGRvd24kXG5cbiAgR0VUX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcbiAgUE9TVF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIFBVVF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIERFTEVURV9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG5cbiAgU1RSRUFNX2Vycm9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPignJylcblxuICBHRVQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpXG4gIFBPU1QkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuICBQVVQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuICBERUxFVEUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuXG4gIFNUUkVBTSA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbClcbiAgU1RSRUFNJCA9IHRoaXMuU1RSRUFNLmFzT2JzZXJ2YWJsZSgpXG5cbiAgU1RSRUFNX0FJID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKVxuICBTVFJFQU1fQUkkID0gdGhpcy5TVFJFQU1fQUkuYXNPYnNlcnZhYmxlKClcbiAgLnBpcGUoXG4gICAgbWFwKChpdGVtczogYW55KSA9PiAoaXRlbXMpID8gaXRlbXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0ucmVzcG9uc2UpIDogW10pLFxuICAgIG1hcCgoaXRlbXM6IGFueSkgPT4gaXRlbXMuam9pbignJykudHJpbSgpKSxcbiAgKVxuXG4gIEBWaWV3Q2hpbGQoXCJmYWlsZWRTdGF0ZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBmYWlsZWRTdGF0ZTogYW55XG4gIEBWaWV3Q2hpbGQoXCJwb2xsaW5nU3RhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgcG9sbGluZ1N0YXRlOiBhbnlcblxuICBxdWVzdGlvbkNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2woXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuXG4gIHJlcXVlc3RUeXBlID0gJydcblxuICBnZXQgZGF0YU9ic2VydmFibGUkKCkge1xuXG4gICAgc3dpdGNoICh0aGlzLnJlcXVlc3RUeXBlKSB7XG4gICAgICBjYXNlICdHRVQnOlxuICAgICAgICByZXR1cm4gdGhpcy5HRVQkXG5cbiAgICAgIGNhc2UgJ1BVVCc6XG4gICAgICAgIHJldHVybiB0aGlzLlBVVCRcblxuICAgICAgY2FzZSAnUE9TVCc6XG4gICAgICAgIHJldHVybiB0aGlzLlBPU1QkXG5cbiAgICAgIGNhc2UgJ0RFTEVURSc6XG4gICAgICAgIHJldHVybiB0aGlzLkRFTEVURSRcblxuICAgICAgY2FzZSAnU1RSRUFNJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuU1RSRUFNXG5cbiAgICAgIGNhc2UgJ1NUUkVBTV9BSSc6XG4gICAgICAgIHJldHVybiB0aGlzLlNUUkVBTV9BSVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5HRVQkXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICB9XG5cbiAgc2FtcGxlQ2xpZW50RGF0YSA9IHtcbiAgICAgIGlkOiAwLFxuICAgICAgbmFtZTogXCJPbGQgU2Nob29sIERhdGVzXCIsXG4gICAgICBkb21haW46IFwib3NkLmNvbVwiLFxuICAgICAgc2VydmljZTogXCJvc2RcIixcbiAgICAgIHNwaWZmZTogXCJvc2QuY29tL29zZFwiLFxuICAgICAgc2VjcmV0OiBcIlNNT1BFQ1hQLU9TNFAtVVNPRy1YMklJLTNYTUQxRlFEUjNJSlhcIixcbiAgICAgIGNyZWF0ZWQ6IDE2OTMwMDMxMzgsXG4gICAgICBtb2RpZmllZDogMTY5MzAwMzEzOCxcbiAgICAgIGljb246IFwiXCIsXG4gICAgICBpbWFnZUZpbGU6IFwiXCIsXG4gIH1cblxuICBzZWxlY3RlZFJlY29yZCA9IHRoaXMuZmIuY29udHJvbChudWxsKVxuXG4gIHJlcXVlc3RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgZGF0YXR5cGU6IHRoaXMuZmIuY29udHJvbCgnQVJSQVknKSxcbiAgICBwYXRoOiB0aGlzLmZiLmNvbnRyb2w8c3RyaW5nPihcIlwiKSxcbiAgICBoZWFkZXJzOiB0aGlzLmZiLmFycmF5KFtdKSxcbiAgICBhZGFwdGVyOiBbbnVsbF0sXG4gICAgbWFwcGVyOiBbbnVsbF0sXG4gICAgcmV0cnk6IHRoaXMuZmIuZ3JvdXAoe1xuICAgIHRpbWVzOiBbM10sXG4gICAgZGVsYXk6IFszXSxcbiAgICB9KSxcbiAgICBwb2xsaW5nOiBbM10sXG4gICAgZGF0YWJhc2U6IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgdGFibGU6IFsnJ10sXG4gICAgICBleHBpcmVzSW46IFsnMW0nXSxcbiAgICB9KVxuICB9KVxuXG4gIGdldCBoYXNDaGFuZ2VkKCkge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLmRpcnR5XG4gIH1cblxuICBnZXQgZGF0YVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0uZ2V0KFwiZGF0YXR5cGVcIik/LnZhbHVlXG4gIH1cblxuICBnZXQgZGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0uZ2V0KFwiZGF0YWJhc2VcIik/LnZhbHVlXG4gIH1cblxuICBnZXQgcmV0cnkoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0uZ2V0KFwicmV0cnlcIik/LnZhbHVlXG4gIH1cblxuICBzYW1wbGVBZGFwdG9ycyA9IFtcbiAgICB7IGxhYmVsOiBcIkNsaWVudEluZm8gQmFzaWNcIiwgdmFsdWU6IENsaWVudEluZm8uYWRhcHQgfSxcbiAgICB7IGxhYmVsOiBcIkFJIFByb21wdFwiLCB2YWx1ZTogQUlQcm9tcHQuYWRhcHQgfSxcbiAgXVxuXG4gIHNhbXBsZU1hcHBlcnMgPSBbXG4gICAgeyBsYWJlbDogXCJNYXBwZXIgQmFzaWNcIiwgdmFsdWU6IENsaWVudEluZm9NYXBwZXIuYWRhcHQgfSxcbiAgICB7IGxhYmVsOiBcIkFJIFByb21wdFwiLCB2YWx1ZTogQUlQcm9tcHQuYWRhcHQgfSxcbiAgXVxuXG4gIGdldCBoZWFkZXJzKCk6IEZvcm1BcnJheSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0uZ2V0KCdoZWFkZXJzJykgYXMgRm9ybUFycmF5XG4gIH1cblxuICBnZXQgaXNWYWxpZCgpIHtcbiAgICB0aGlzLnJlcXVlc3RGb3JtLm1hcmtBbGxBc1RvdWNoZWQoKVxuICAgIHJldHVybiB0aGlzLnJlcXVlc3RGb3JtLnZhbGlkXG4gIH1cblxuICAvLyBzZXJ2ZXIgPSBgaHR0cDovL3NhbXBsZS1lbmRwb2ludC9hcy9hdXRob3JpemF0aW9uLm9hdXRoMmBcblxuICBhcnJheU9iamVjdHNUb09iamVjdHMgPSAoYXJyOiBhbnlbXSkgPT4ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFycikgPyBhcnIucmVkdWNlKChvYmosIGl0ZW0pID0+IE9iamVjdC5hc3NpZ24ob2JqLCB7IFtpdGVtLmtleV06IGl0ZW0udmFsdWUgfSksIHt9KSA6IHt9XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2VsZWN0ZWRSZWNvcmQudmFsdWVDaGFuZ2VzXG4gICAgLnN1YnNjcmliZSgoZGF0YTogQ2xpZW50SW5mb3xudWxsKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkUmVjb3JkJCA9IChkYXRhKSA/IHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2Uuc2VsZWN0UmVjb3JkJChkYXRhLmlkKSA6IEVNUFRZXG4gICAgfSlcblxuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuZGF0YSRcbiAgICAucGlwZShcbiAgICAgIHRhcCgoZGF0YSkgPT4ge1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5yZXF1ZXN0VHlwZSkge1xuICAgICAgICAgIGNhc2UgJ0dFVCc6XG4gICAgICAgICAgICB0aGlzLkdFVCQubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdQVVQnOlxuICAgICAgICAgICAgdGhpcy5QVVQkLm5leHQoZGF0YSlcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnUE9TVCc6XG4gICAgICAgICAgICB0aGlzLlBPU1QkLm5leHQoZGF0YSlcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnREVMRVRFJzpcbiAgICAgICAgICAgIHRoaXMuREVMRVRFJC5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1NUUkVBTSc6XG4gICAgICAgICAgICB0aGlzLlNUUkVBTS5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1NUUkVBTV9BSSc6XG4gICAgICAgICAgICB0aGlzLlNUUkVBTV9BSS5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKClcblxuICB9XG5cbiAgYWRkSGVhZGVyKCkge1xuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAga2V5OiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgdmFsdWU6IFsnJ11cbiAgICB9KTtcbiAgICB0aGlzLmhlYWRlcnMucHVzaChoZWFkZXIpXG4gIH1cblxuICByZW1vdmVIZWFkZXIoaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuaGVhZGVycy5yZW1vdmVBdChpbmRleClcbiAgfVxuXG4gIGNvbXBpbGVSZXF1ZXN0KCkge1xuXG4gICAgY29uc3QgcmVxdWVzdFBhcmFtcyA9IHRoaXMucmVxdWVzdEZvcm0udmFsdWU7XG5cbiAgICByZXF1ZXN0UGFyYW1zLmhlYWRlcnMgPSB0aGlzLmFycmF5T2JqZWN0c1RvT2JqZWN0cyhcbiAgICAgIHJlcXVlc3RQYXJhbXMuaGVhZGVycyB8fCBbXVxuICAgICk7XG4gICAgY29uc3QgcGF0aFJlcSA9IChyZXF1ZXN0UGFyYW1zLnBhdGggfHwgXCJcIikuc3BsaXQoXCIvXCIpO1xuXG4gICAgaWYgKCF0aGlzLnBvbGxpbmdTdGF0ZS5jaGVja2VkKSByZXF1ZXN0UGFyYW1zLnBvbGxpbmcgPSAwO1xuXG4gICAgaWYgKCF0aGlzLmZhaWxlZFN0YXRlLmNoZWNrZWQpIHtcbiAgICAgIHJlcXVlc3RQYXJhbXMucmV0cnkgPSB7IHRpbWVzOiAwLGRlbGF5OiAwIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXBpUmVxdWVzdC5hZGFwdCh7XG4gICAgICAuLi5yZXF1ZXN0UGFyYW1zLFxuICAgICAgLy8gLi4ueyBwYXRoOiBwYXRoUmVxLCBzZXJ2ZXI6IHRoaXMuc2VydmVyIH0sXG4gICAgICAuLi57IHBhdGg6IHBhdGhSZXEgfSxcbiAgICB9KVxuXG4gIH1cblxuICBvblNldFN0YXRlT3B0aW9ucygpIHtcblxuICAgIGlmKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgY29uc3QgcmVxUGFyYW1zID0gdGhpcy5jb21waWxlUmVxdWVzdCgpXG5cbiAgICBjb25zdCBkYiA9IERhdGFiYXNlU3RvcmFnZS5hZGFwdCh0aGlzLmRhdGFiYXNlKVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRhdGFUeXBlID09PSBcIkFSUkFZXCIgPyBEYXRhVHlwZS5BUlJBWSA6IERhdGFUeXBlLk9CSkVDVFxuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2Uuc2V0QVBJT3B0aW9ucyhyZXFQYXJhbXMsIHR5cGUsIGRiKVxuXG4gICAgdGhpcy5yZXF1ZXN0Rm9ybS5tYXJrQXNQcmlzdGluZSgpXG4gIH1cblxuICBvbkNsZWFyUmVjb3JkcygpIHtcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmNsZWFyUmVjb3JkcygpXG4gIH1cblxuICBvblJlZnJlc2hSZWNvcmRzKCkge1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UucmVmcmVzaERhdGEoKVxuICB9XG5cbiAgb25HZXRSZXF1ZXN0KCkge1xuICAgIHRoaXMucmVxdWVzdFR5cGUgPSAnR0VUJ1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuZ2V0Q2xpZW50cygpXG4gIH1cblxuICBvbkNyZWF0ZVJlcXVlc3QoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdQT1NUJ1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuY3JlYXRlQ2xpZW50KHRoaXMuc2FtcGxlQ2xpZW50RGF0YSlcbiAgfVxuXG4gIG9uVXBkYXRlUmVxdWVzdCgpIHtcbiAgICB0aGlzLnJlcXVlc3RUeXBlID0gJ1BVVCdcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnVwZGF0ZUNsaWVudCh0aGlzLnNhbXBsZUNsaWVudERhdGEpXG4gIH1cblxuICBvbkRlbGV0ZVJlcXVlc3QoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdERUxFVEUnXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5kZWxldGVDbGllbnQodGhpcy5zYW1wbGVDbGllbnREYXRhKVxuICB9XG5cbiAgb25TdHJlYW1Qb3N0UmVxdWVzdCgpIHtcblxuICAgIGlmKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdTVFJFQU1fQUknXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcblxuICAgIHJlcVBhcmFtcy5zZXJ2ZXIgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MTE0MzQvYXBpXCJcbiAgICByZXFQYXJhbXMucGF0aCA9IFtcImdlbmVyYXRlXCJdXG5cbiAgICByZXFQYXJhbXMuc3RyZWFtID0gdHJ1ZVxuXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5zZXRBUElPcHRpb25zKHJlcVBhcmFtcywgRGF0YVR5cGUuQVJSQVkpXG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbW9kZWw6IFwibWlzdHJhbFwiLFxuICAgICAgcHJvbXB0OiB0aGlzLnF1ZXN0aW9uQ29udHJvbC52YWx1ZSxcbiAgICAgIHN0cmVhbTogcmVxUGFyYW1zLnN0cmVhbVxuICAgIH1cblxuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2Uuc3RyZWFtQUlSZXF1ZXN0KHBheWxvYWQpXG5cbiAgfVxuXG4gIG9uU3RyZWFtUmVxdWVzdCgpIHtcblxuICAgIGlmKCF0aGlzLmlzVmFsaWQpIHJldHVyblxuXG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdTVFJFQU0nXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcblxuICAgIHJlcVBhcmFtcy5zZXJ2ZXIgPSBcIm9pZGNcIlxuICAgIHJlcVBhcmFtcy5zdHJlYW0gPSB0cnVlXG5cbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnNldEFQSU9wdGlvbnMocmVxUGFyYW1zLCBEYXRhVHlwZS5BUlJBWSlcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnN0cmVhbVJlcXVlc3QoKVxuXG4gIH1cblxuICBlcnJvckhhbmRsaW5nKGVycjogYW55LCB0eXBlOiBzdHJpbmcpIHtcbiAgICBpZih0eXBlID09PSAnR0VUJykgdGhpcy5HRVRfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1BPU1QnKSB0aGlzLlBPU1RfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1BVVCcpIHRoaXMuUFVUX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICAgIGlmKHR5cGUgPT09ICdERUxFVEUnKSB0aGlzLkRFTEVURV9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgICBpZih0eXBlID09PSAnU1RSRUFNJykgdGhpcy5TVFJFQU1fZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gIH1cblxufVxuIiwiPGRpdiBzdHlsZT1cIm1hcmdpbjogMnJlbTtcIj5cblxuICA8aDI+XG4gICAgSFRUUCBSZXF1ZXN0IFN0YXRlIE1hbmFnZXJcbiAgPC9oMj5cblxuICA8ZGl2IFtmb3JtR3JvdXBdPVwicmVxdWVzdEZvcm1cIiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW1cIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPlN0YXRlIERhdGEgVHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJkYXRhdHlwZVwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiQVJSQVlcIj5BcnJheTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIk9CSkVDVFwiPk9iamVjdDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbVwiPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+QWRhcHRlciAoTW9kZWwpPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImFkYXB0ZXJcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbj5Ob25lPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBhZGFwdGVyIG9mIHNhbXBsZUFkYXB0b3JzXCIgW3ZhbHVlXT1cImFkYXB0ZXIudmFsdWVcIj5cbiAgICAgICAgICAgIHt7YWRhcHRlci5sYWJlbH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+TWFwcGVyIChNb2RlbCk8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwibWFwcGVyXCI+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWFwcGVyIG9mIHNhbXBsZU1hcHBlcnNcIiBbdmFsdWVdPVwibWFwcGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e21hcHBlci5sYWJlbH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5SZXN0UGF0aCAoLyBkZWxpbWl0ZWQpPC9tYXQtbGFiZWw+XG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cImNsaWVudHMvbGlzdFwiIGZvcm1Db250cm9sTmFtZT1cInBhdGhcIj5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdj5cbiAgICAgIDxkaXYgZm9ybUFycmF5TmFtZT1cImhlYWRlcnNcIj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGFzayBvZiBoZWFkZXJzLmNvbnRyb2xzOyBsZXQgaSA9IGluZGV4XCIgW2Zvcm1Hcm91cE5hbWVdPVwiaVwiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtXCI+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5LZXk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiYXV0aGVudGljYXRpb25cIiBmb3JtQ29udHJvbE5hbWU9XCJrZXlcIj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cImZsZXg6MVwiPlxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlZhbHVlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cInNhbXBsZVwiIGZvcm1Db250cm9sTmFtZT1cInZhbHVlXCI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlSGVhZGVyKGkpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cImFkZEhlYWRlcigpXCI+QWRkIEhlYWRlcjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjpjb2x1bW47IGdhcDogMXJlbTtcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNmYWlsZWRTdGF0ZT5SZXRyeSBvbiBGYWlsZWQ8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJmYWlsZWRTdGF0ZS5jaGVja2VkXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtOyBtYXJnaW4tdG9wOiAxcmVtO1wiIGZvcm1Hcm91cE5hbWU9XCJyZXRyeVwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD4jb2YgVGltZXM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aW1lc1wiIHZhbHVlPVwiM1wiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkRlbGF5IFVudGlsIE5leHQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJkZWxheVwiIHZhbHVlPVwiM1wiPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjcG9sbGluZ1N0YXRlPlBvbGxpbmc8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJwb2xsaW5nU3RhdGUuY2hlY2tlZFwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD4jb2YgU2Vjb25kczwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiM1wiIGZvcm1Db250cm9sTmFtZT1cInBvbGxpbmdcIiB2YWx1ZT1cIjNcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgI0RCU3RhdGU+RGF0YWJhc2UgU3RvcmFnZTwvbWF0LXNsaWRlLXRvZ2dsZT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIkRCU3RhdGUuY2hlY2tlZFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbTsgbWFyZ2luLXRvcDogMXJlbVwiIGZvcm1Hcm91cE5hbWU9XCJkYXRhYmFzZVwiPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5UYWJsZSBOYW1lPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJ0YWJsZVwiIGZvcm1Db250cm9sTmFtZT1cInRhYmxlXCIgdmFsdWU9XCJcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FeHBpcmVzIEluPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImV4cGlyZXNJblwiPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiMW1cIj5PbmUgTWludXRlPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiMWhcIj5PbmUgSG91cjwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIjFkXCI+T25lIERheTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtOyBkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MVwiPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uU2V0U3RhdGVPcHRpb25zKClcIiBbZGlzYWJsZWRdPVwiIWhhc0NoYW5nZWRcIj5cbiAgICAgICAgICBTZXQgQVBJIFJlcXVlc3QgT3B0aW9uc1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cIihlcnJvciQgfCBhc3luYykgYXMgZXJyb3JcIj5cbiAgICAgICAgICB7eyBlcnJvciB8IGpzb24gfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDFyZW07IG1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIiBcbiAgICAgICpuZ0lmPVwiKGlzUGVuZGluZyQgfCBhc3luYylcIlxuICAgID48L21hdC1wcm9ncmVzcy1iYXI+XG4gICAgPGRpdiAqbmdJZj1cInBvbGxpbmdTdGF0ZS5jaGVja2VkXCI+XG4gICAgICA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiZGV0ZXJtaW5hdGVcIiBcbiAgICAgICpuZ0lmPVwiIShpc1BlbmRpbmckIHwgYXN5bmMpICYmICh0aGlzLmNvdW50ZG93biQgfCBhc3luYykgfHwgLTEgPiAwXCIgXG4gICAgICBbdmFsdWVdPVwiKHRoaXMuY291bnRkb3duJCB8IGFzeW5jKVwiXG4gICAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCIgKm5nSWY9XCIoR0VUJCB8IGFzeW5jKSBhcyBkYXRhXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjE7XCI+Q1VSUkVOVCBTVEFURSAoe3sgZGF0YVR5cGUgfX0pPC9oMj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5SZWNvcmRzPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZFJlY29yZFwiIFtkaXNhYmxlZF09XCJkYXRhID09PSBudWxsICYmIGRhdGE/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJcIj5Ob25lPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGFcIiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAge3tpdGVtLmRvbWFpbn19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCIoZGF0YU9ic2VydmFibGUkIHwgYXN5bmMpIGFzIGRhdGFSZWNvcmRcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIoc2VsZWN0ZWRSZWNvcmQkIHwgYXN5bmMpIGFzIHJlY29yZDsgZWxzZSBOT19SRUNPUkRcIj5cbiAgICAgICAge3sgcmVjb3JkIHwganNvbiB9fVxuICAgICAgPC9kaXY+XG4gICAgICA8bmctdGVtcGxhdGUgI05PX1JFQ09SRD5ObyBSZWNvcmQgU2VsZWN0ZWQgZnJvbSBTdGF0ZTwvbmctdGVtcGxhdGU+XG4gICAgICBcbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiZGF0YSAhPT0gbnVsbCAmJiBkYXRhPy5sZW5ndGggPiAwOyBlbHNlIE5PX0RBVEFcIj5cbiAgICAgICAgU3RhdGUgY29udGFpbnMgYSBUb3RhbCBvZiB7eyBkYXRhLmxlbmd0aCB9fSBSZWNvcmRzXG4gICAgICA8L3NwYW4+XG4gICAgICA8bmctdGVtcGxhdGUgI05PX0RBVEE+Tm8gUmVjb3JkczwvbmctdGVtcGxhdGU+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbTsgdGV4dC1hbGlnbjogZW5kOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJvbkNsZWFyUmVjb3JkcygpXCI+Q2xlYXI8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25SZWZyZXNoUmVjb3JkcygpXCI+UmVmcmVzaDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG5cblxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5HRVQgUmVxdWVzdCAoe3sgZGF0YVR5cGUgfX0pPC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uR2V0UmVxdWVzdCgpXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihHRVRfZXJyb3IkIHwgYXN5bmMpIGFzIGdldF9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IGdldF9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoR0VUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgPGRpdj57eyAoR0VUJCB8IGFzeW5jKSB8IGpzb24gfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+UE9TVCBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uQ3JlYXRlUmVxdWVzdCgpXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihQT1NUX2Vycm9yJCB8IGFzeW5jKSBhcyBwb3N0X2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgcG9zdF9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoUE9TVCQgfCBhc3luYykgfCBqc29udlwiPjwvZGl2PiAtLT5cbiAgICAgIDxkaXY+e3sgKFBPU1QkIHwgYXN5bmMpIHwganNvbiB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5QVVQgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvblVwZGF0ZVJlcXVlc3QoKVwiIFtkaXNhYmxlZF09XCJoYXNDaGFuZ2VkXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoUFVUX2Vycm9yJCB8IGFzeW5jKSBhcyBwdXRfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwdXRfZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgPCEtLSA8ZGl2IFtpbm5lckhUTUxdPVwiKFBVVCQgfCBhc3luYykgfCBqc29udlwiPjwvZGl2PiAtLT5cbiAgICAgIDxkaXY+e3sgKFBVVCQgfCBhc3luYykgfCBqc29uIH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPkRFTEVURSBSZXF1ZXN0PC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uRGVsZXRlUmVxdWVzdCgpXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihERUxFVEVfZXJyb3IkIHwgYXN5bmMpIGFzIGRlbGV0ZV9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IGRlbGV0ZV9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoREVMRVRFJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgPGRpdj57eyAoREVMRVRFJCB8IGFzeW5jKSB8IGpzb24gfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cbiAgXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5TdHJlYW1pbmcgR0VUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdHJlYW1SZXF1ZXN0KClcIiBbZGlzYWJsZWRdPVwiaGFzQ2hhbmdlZFwiIGNsYXNzPVwiYnRuXCI+UmVxdWVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKFNUUkVBTV9lcnJvciQgfCBhc3luYykgYXMgc3RyZWFtX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgc3RyZWFtX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIoU1RSRUFNJCB8IGFzeW5jKSBhcyBkYXRhXCIgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHRhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJpZFwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gSUQgPC90aD5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudC5pZH19IDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm5hbWVcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEZpcnN0IE5hbWUgPC90aD5cbiAgICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudC5uYW1lfX0gPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0TmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gTGFzdCBOYW1lIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQubGFzdE5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICBcbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImFnZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gQWdlIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQuYWdlfX0gPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgXG4gICAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cbiAgICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIj48L3RyPlxuICAgICAgICA8L3RhYmxlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPlNUUkVBTUlORyBQT1NUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25TdHJlYW1Qb3N0UmVxdWVzdCgpXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIiBjbGFzcz1cImJ0blwiPkFzayBNZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwiZmxleDoxXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+QXNrIG1lIGEgUXVlc3Rpb248L21hdC1sYWJlbD5cbiAgICAgICAgPHRleHRhcmVhIG1hdElucHV0IHBsYWNlaG9sZGVyPVwiV2h5IGlzIHRoZSBza3kgYmx1ZT9cIiBbZm9ybUNvbnRyb2xdPVwicXVlc3Rpb25Db250cm9sXCI+PC90ZXh0YXJlYT5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKFNUUkVBTV9lcnJvciQgfCBhc3luYykgYXMgc3RyZWFtX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgc3RyZWFtX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDxkaXYgKm5nSWY9XCIoU1RSRUFNX0FJJCB8IGFzeW5jKSBhcyBkYXRhXCI+XG4gICAgICAgIDxwIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogLjVyZW07IHdoaXRlLXNwYWNlOnByZS13cmFwO1wiPnt7ZGF0YX19PC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbjwvZGl2PiJdfQ==
@@ -0,0 +1,75 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { DataType, DatabaseStorage } from '../../../models';
3
+ import { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../services';
4
+ import { ClientInfo } from '../../request-manager-demo/models/sample-client-info';
5
+ import { ClientInfoMapper } from '../../request-manager-demo/models/sample-mapper-client-info';
6
+ import * as i0 from "@angular/core";
7
+ export class StateManagerDemoService extends HTTPManagerStateService {
8
+ constructor() {
9
+ super(ApiRequest.adapt({
10
+ server: "",
11
+ path: [],
12
+ headers: {},
13
+ adapter: ClientInfo.adapt,
14
+ mapper: ClientInfoMapper.adapt,
15
+ stream: false,
16
+ }), DataType.ARRAY, DatabaseStorage.adapt());
17
+ }
18
+ setAPIOptions(apiOptions, dataType, database) {
19
+ this.setApiRequestOptions(apiOptions, dataType, database);
20
+ }
21
+ getClients() {
22
+ // const headers = {
23
+ // auth: "sample-auth-token"
24
+ // }
25
+ // const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
26
+ this.fetchRecords();
27
+ }
28
+ createClient(data) {
29
+ // const headers = {
30
+ // auth: "sample-auth-token"
31
+ // }
32
+ // const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
33
+ this.createRecord(data);
34
+ }
35
+ updateClient(data) {
36
+ // const headers = {
37
+ // auth: "sample-auth-token"
38
+ // }
39
+ data.id = 1031;
40
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] });
41
+ this.updateRecord(data, sampleOptions);
42
+ }
43
+ deleteClient(data) {
44
+ // const headers = {
45
+ // auth: "sample-auth-token"
46
+ // }
47
+ data.id = 1031;
48
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] });
49
+ this.deleteRecord(sampleOptions);
50
+ }
51
+ streamRequest() {
52
+ const headers = {
53
+ auth: "sample-auth-token"
54
+ };
55
+ // const sampleOptions = RequestOptions.adapt({ path: [1], headers })
56
+ this.fetchStream();
57
+ }
58
+ streamAIRequest(data) {
59
+ const headers = {
60
+ auth: "sample-auth-token"
61
+ };
62
+ const sampleOptions = RequestOptions.adapt({ path: [data.id] });
63
+ this.createStream(data, sampleOptions);
64
+ // this.fetchStream(sampleOptions)
65
+ }
66
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
67
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, providedIn: 'root' }); }
68
+ }
69
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: StateManagerDemoService, decorators: [{
70
+ type: Injectable,
71
+ args: [{
72
+ providedIn: 'root'
73
+ }]
74
+ }], ctorParameters: function () { return []; } });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtbWFuYWdlci1kZW1vLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vL3NlcnZpY2VzL3N0YXRlLW1hbmFnZXItZGVtby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQzs7QUFLL0YsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHVCQUE0QjtJQUV2RTtRQUNFLEtBQUssQ0FDSCxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ2YsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQ3pCLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO1lBQzlCLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUN4QixDQUFBO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFzQixFQUFFLFFBQWtCLEVBQUUsUUFBMEI7UUFDbEYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELFVBQVU7UUFFUixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBRXJCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUztRQUVwQixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV6QixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWdCO1FBRTNCLG9CQUFvQjtRQUNwQiw4QkFBOEI7UUFDOUIsSUFBSTtRQUNKLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ2QsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFFeEMsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFnQjtRQUUzQixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNkLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFbEMsQ0FBQztJQUVELGFBQWE7UUFFWCxNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxtQkFBbUI7U0FDMUIsQ0FBQTtRQUVELHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFcEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxJQUFTO1FBRXZCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLG1CQUFtQjtTQUMxQixDQUFBO1FBRUQsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7UUFDdEMsa0NBQWtDO0lBRXBDLENBQUM7K0dBdkZVLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRnRCLE1BQU07OzRGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERhdGFUeXBlLCBEYXRhYmFzZVN0b3JhZ2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSFRUUE1hbmFnZXJTdGF0ZVNlcnZpY2UsIEFwaVJlcXVlc3QsIFJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuXG5pbXBvcnQgeyBDbGllbnRJbmZvIH0gZnJvbSAnLi4vLi4vcmVxdWVzdC1tYW5hZ2VyLWRlbW8vbW9kZWxzL3NhbXBsZS1jbGllbnQtaW5mbyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvTWFwcGVyIH0gZnJvbSAnLi4vLi4vcmVxdWVzdC1tYW5hZ2VyLWRlbW8vbW9kZWxzL3NhbXBsZS1tYXBwZXItY2xpZW50LWluZm8nO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTdGF0ZU1hbmFnZXJEZW1vU2VydmljZSBleHRlbmRzIEhUVFBNYW5hZ2VyU3RhdGVTZXJ2aWNlPGFueT4ge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFxuICAgICAgQXBpUmVxdWVzdC5hZGFwdCh7XG4gICAgICAgIHNlcnZlcjogXCJcIixcbiAgICAgICAgcGF0aDogW10sXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBhZGFwdGVyOiBDbGllbnRJbmZvLmFkYXB0LFxuICAgICAgICBtYXBwZXI6IENsaWVudEluZm9NYXBwZXIuYWRhcHQsXG4gICAgICAgIHN0cmVhbTogZmFsc2UsXG4gICAgICB9KSxcbiAgICAgIERhdGFUeXBlLkFSUkFZLFxuICAgICAgRGF0YWJhc2VTdG9yYWdlLmFkYXB0KClcbiAgICApXG4gIH1cblxuICBzZXRBUElPcHRpb25zKGFwaU9wdGlvbnM6IEFwaVJlcXVlc3QsIGRhdGFUeXBlOiBEYXRhVHlwZSwgZGF0YWJhc2U/OiBEYXRhYmFzZVN0b3JhZ2UpIHtcbiAgICB0aGlzLnNldEFwaVJlcXVlc3RPcHRpb25zKGFwaU9wdGlvbnMsIGRhdGFUeXBlLCBkYXRhYmFzZSlcbiAgfVxuXG4gIGdldENsaWVudHMoKSB7XG5cbiAgICAvLyBjb25zdCBoZWFkZXJzID0ge1xuICAgIC8vICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgLy8gfVxuXG4gICAgLy8gY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogW1wiaWRcIiwgMTJdLCBoZWFkZXJzLCBzYW1wbGU6IHRydWUgfSlcbiAgICB0aGlzLmZldGNoUmVjb3JkcygpXG5cbiAgfVxuXG4gIGNyZWF0ZUNsaWVudChkYXRhOiBhbnkpIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCBzYW1wbGVPcHRpb25zID0gUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBbXCJpZFwiLCAxMl0sIGhlYWRlcnMsIHNhbXBsZTogdHJ1ZSB9KVxuICAgIHRoaXMuY3JlYXRlUmVjb3JkKGRhdGEpXG5cbiAgfVxuXG4gIHVwZGF0ZUNsaWVudChkYXRhOiBDbGllbnRJbmZvKSB7XG5cbiAgICAvLyBjb25zdCBoZWFkZXJzID0ge1xuICAgIC8vICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgLy8gfVxuICAgIGRhdGEuaWQgPSAxMDMxXG4gICAgY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogW2RhdGEuaWRdIH0pXG4gICAgdGhpcy51cGRhdGVSZWNvcmQoZGF0YSwgc2FtcGxlT3B0aW9ucylcblxuICB9XG5cbiAgZGVsZXRlQ2xpZW50KGRhdGE6IENsaWVudEluZm8pIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG5cbiAgICBkYXRhLmlkID0gMTAzMVxuICAgIGNvbnN0IHNhbXBsZU9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFtkYXRhLmlkXSB9KVxuICAgIHRoaXMuZGVsZXRlUmVjb3JkKHNhbXBsZU9wdGlvbnMpXG5cbiAgfVxuXG4gIHN0cmVhbVJlcXVlc3QoKSB7XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgfVxuXG4gICAgLy8gY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogWzFdLCBoZWFkZXJzIH0pXG4gICAgdGhpcy5mZXRjaFN0cmVhbSgpXG5cbiAgfVxuXG4gIHN0cmVhbUFJUmVxdWVzdChkYXRhOiBhbnkpIHtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICB9XG5cbiAgICBjb25zdCBzYW1wbGVPcHRpb25zID0gUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBbZGF0YS5pZF0gfSlcbiAgICB0aGlzLmNyZWF0ZVN0cmVhbShkYXRhLCBzYW1wbGVPcHRpb25zKVxuICAgIC8vIHRoaXMuZmV0Y2hTdHJlYW0oc2FtcGxlT3B0aW9ucylcblxuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from "./services/index";
2
+ export * from "./interceptors/index";
3
+ export * from "./models/index";
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLGdCQUFnQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc2VydmljZXMvaW5kZXhcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW50ZXJjZXB0b3JzL2luZGV4XCJcbmV4cG9ydCAqIGZyb20gXCIuL21vZGVscy9pbmRleFwiXG4iXX0=
@@ -0,0 +1,47 @@
1
+ import { Inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export const PROXY_CONFIG = new InjectionToken('PROXY_CONFIG');
4
+ export class ProxyDebuggerInterceptor {
5
+ constructor(proxyConfig) {
6
+ this.proxyConfig = proxyConfig;
7
+ }
8
+ intercept(req, next) {
9
+ if (!this.proxyConfig) {
10
+ return next.handle(req);
11
+ }
12
+ const headers = req.headers.keys().reduce((acc, key) => {
13
+ acc[key] = req.headers.get(key) || '';
14
+ return acc;
15
+ }, {});
16
+ for (const proxyPath in this.proxyConfig) {
17
+ if (this.proxyConfig.hasOwnProperty(proxyPath)) {
18
+ const proxyDetails = this.proxyConfig[proxyPath];
19
+ const regex = new RegExp('^' + proxyPath.replace('/', '').replace('*', '(.*)'));
20
+ if (regex.test(req.url)) {
21
+ const target = proxyDetails.target;
22
+ const endpoint = req.url.replace(regex, '$1');
23
+ const actualPath = target + '/' + endpoint;
24
+ console.log('Request Proxied:', {
25
+ requestUrl: req.url,
26
+ requestPayload: req.body,
27
+ headers: headers,
28
+ proxyPath: proxyPath,
29
+ actualPath: actualPath,
30
+ });
31
+ }
32
+ }
33
+ }
34
+ return next.handle(req);
35
+ }
36
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor, deps: [{ token: PROXY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
37
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor }); }
38
+ }
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ProxyDebuggerInterceptor, decorators: [{
40
+ type: Injectable
41
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
42
+ type: Optional
43
+ }, {
44
+ type: Inject,
45
+ args: [PROXY_CONFIG]
46
+ }] }]; } });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHktZGVidWdnZXIuaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2ludGVyY2VwdG9ycy9wcm94eS1kZWJ1Z2dlci5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUk3RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQXNCLGNBQWMsQ0FBQyxDQUFDO0FBR3BGLE1BQU0sT0FBTyx3QkFBd0I7SUFFbkMsWUFBc0QsV0FBZ0M7UUFBaEMsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO0lBQUcsQ0FBQztJQUUxRixTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUVoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekI7UUFFRCxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNyRCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RDLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQTRCLENBQUMsQ0FBQztRQUVqQyxLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDOUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFFaEYsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDdkIsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztvQkFDbkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM5QyxNQUFNLFVBQVUsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztvQkFFM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRTt3QkFDOUIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxHQUFHO3dCQUNuQixjQUFjLEVBQUUsR0FBRyxDQUFDLElBQUk7d0JBQ3hCLE9BQU8sRUFBRSxPQUFPO3dCQUNoQixTQUFTLEVBQUUsU0FBUzt3QkFDcEIsVUFBVSxFQUFFLFVBQVU7cUJBQ3ZCLENBQUMsQ0FBQztpQkFDSjthQUNGO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQzsrR0FyQ1Usd0JBQXdCLGtCQUVILFlBQVk7bUhBRmpDLHdCQUF3Qjs7NEZBQXhCLHdCQUF3QjtrQkFEcEMsVUFBVTs7MEJBR0ksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3QsIEh0dHBIYW5kbGVyLCBIdHRwRXZlbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCBjb25zdCBQUk9YWV9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48UmVjb3JkPHN0cmluZywgYW55Pj4oJ1BST1hZX0NPTkZJRycpO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJveHlEZWJ1Z2dlckludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KFBST1hZX0NPTkZJRykgcHJpdmF0ZSBwcm94eUNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pikge31cblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcblxuICAgIGlmICghdGhpcy5wcm94eUNvbmZpZykge1xuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzLmtleXMoKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IHJlcS5oZWFkZXJzLmdldChrZXkpIHx8ICcnO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTtcblxuICAgIGZvciAoY29uc3QgcHJveHlQYXRoIGluIHRoaXMucHJveHlDb25maWcpIHtcbiAgICAgIGlmICh0aGlzLnByb3h5Q29uZmlnLmhhc093blByb3BlcnR5KHByb3h5UGF0aCkpIHtcbiAgICAgICAgY29uc3QgcHJveHlEZXRhaWxzID0gdGhpcy5wcm94eUNvbmZpZ1twcm94eVBhdGhdO1xuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcHJveHlQYXRoLnJlcGxhY2UoJy8nLCAnJykucmVwbGFjZSgnKicsICcoLiopJykpO1xuXG4gICAgICAgIGlmIChyZWdleC50ZXN0KHJlcS51cmwpKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gcHJveHlEZXRhaWxzLnRhcmdldDtcbiAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IHJlcS51cmwucmVwbGFjZShyZWdleCwgJyQxJyk7XG4gICAgICAgICAgY29uc3QgYWN0dWFsUGF0aCA9IHRhcmdldCArICcvJyArIGVuZHBvaW50O1xuXG4gICAgICAgICAgY29uc29sZS5sb2coJ1JlcXVlc3QgUHJveGllZDonLCB7XG4gICAgICAgICAgICByZXF1ZXN0VXJsOiByZXEudXJsLFxuICAgICAgICAgICAgcmVxdWVzdFBheWxvYWQ6IHJlcS5ib2R5LFxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgIHByb3h5UGF0aDogcHJveHlQYXRoLFxuICAgICAgICAgICAgYWN0dWFsUGF0aDogYWN0dWFsUGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICB9XG59XG4iXX0=