@techextensor/tab-core-utility 2.2.192 → 2.2.193

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 (85) hide show
  1. package/esm2022/index.mjs +6 -1
  2. package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +38 -22
  3. package/esm2022/lib/tab-core-utility/app/constants/common.mjs +14 -50
  4. package/esm2022/lib/tab-core-utility/app/constants/storage-constants.mjs +2 -2
  5. package/esm2022/lib/tab-core-utility/app/crud/tab-blueprint.service.mjs +41 -14
  6. package/esm2022/lib/tab-core-utility/app/crud/tab-crud.service.mjs +38 -49
  7. package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +84 -30
  8. package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +141 -12
  9. package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +137 -42
  10. package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +89 -38
  11. package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +156 -128
  12. package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
  13. package/esm2022/lib/tab-core-utility/app/helpers/auth-response.adapter.mjs +79 -0
  14. package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +28 -23
  15. package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +9 -11
  16. package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
  17. package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +7 -45
  18. package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +79 -76
  19. package/esm2022/lib/tab-core-utility/app/helpers/login-response.adapter.mjs +76 -0
  20. package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +38 -0
  21. package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +8 -4
  22. package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +8 -33
  23. package/esm2022/lib/tab-core-utility/app/helpers/transition-response.adapter.mjs +83 -0
  24. package/esm2022/lib/tab-core-utility/app/interfaces/auth.interface.mjs +1 -1
  25. package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
  26. package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +42 -0
  27. package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +39 -1
  28. package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +36 -7
  29. package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +84 -47
  30. package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +24 -13
  31. package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +57 -23
  32. package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +21 -10
  33. package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +12 -6
  34. package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +11 -4
  35. package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +17 -16
  36. package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +1 -55
  37. package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +1 -164
  38. package/esm2022/lib/tab-core-utility/auth/auth.service.mjs +36 -11
  39. package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +78 -1
  40. package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +90 -0
  41. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +268 -0
  42. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +207 -0
  43. package/index.d.ts +5 -0
  44. package/lib/tab-core-utility/app/constants/api-constants.d.ts +25 -18
  45. package/lib/tab-core-utility/app/constants/common.d.ts +9 -0
  46. package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
  47. package/lib/tab-core-utility/app/crud/tab-blueprint.service.d.ts +14 -8
  48. package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +8 -1
  49. package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +20 -10
  50. package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +33 -6
  51. package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +50 -8
  52. package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +16 -21
  53. package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +34 -19
  54. package/lib/tab-core-utility/app/enums/query.enum.d.ts +3 -6
  55. package/lib/tab-core-utility/app/helpers/auth-response.adapter.d.ts +32 -0
  56. package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +5 -8
  57. package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +3 -0
  58. package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
  59. package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +7 -51
  60. package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +1 -0
  61. package/lib/tab-core-utility/app/helpers/login-response.adapter.d.ts +29 -0
  62. package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +22 -0
  63. package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +2 -1
  64. package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +1 -0
  65. package/lib/tab-core-utility/app/helpers/transition-response.adapter.d.ts +30 -0
  66. package/lib/tab-core-utility/app/interfaces/auth.interface.d.ts +1 -1
  67. package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +56 -6
  68. package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +84 -0
  69. package/lib/tab-core-utility/app/models/api-query.class.d.ts +54 -9
  70. package/lib/tab-core-utility/app/models/app-field.model.d.ts +4 -2
  71. package/lib/tab-core-utility/app/models/app-object.model.d.ts +5 -3
  72. package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
  73. package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +7 -2
  74. package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
  75. package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
  76. package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
  77. package/lib/tab-core-utility/app/utils/json.util.d.ts +3 -2
  78. package/lib/tab-core-utility/app/utils/req-res.util.d.ts +1 -9
  79. package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +0 -61
  80. package/lib/tab-core-utility/auth/auth.service.d.ts +6 -0
  81. package/lib/tab-core-utility/core/http-client/api.service.d.ts +46 -0
  82. package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +40 -0
  83. package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +73 -0
  84. package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +122 -0
  85. package/package.json +3 -2
@@ -1,42 +1,171 @@
1
1
  import { Injectable, inject } from "@angular/core";
2
2
  import { ApiService } from "../../core/http-client/api.service";
3
3
  import { getHeaders } from "../utils/req-res.util";
4
- import { API } from "../constants/api-constants";
4
+ import { API, APIServices } from "../constants/api-constants";
5
+ import { of, throwError } from "rxjs";
6
+ import { switchMap, map, catchError } from "rxjs/operators";
7
+ import { ConjuctionClause, FilterValueType, RelationalOperator } from "../enums/dsq.enum";
8
+ import { SignalRService } from "../../core/service/signalr/signalr.service";
5
9
  import * as i0 from "@angular/core";
6
10
  export class TabFormioService {
7
11
  constructor() {
8
12
  this.apiService = inject(ApiService);
13
+ this.signalRService = inject(SignalRService);
9
14
  }
10
15
  /**
11
16
  * Fetches screen data from the server based on the screen ID and optional configuration.
17
+ * NEW: Uses metadata service endpoint - returns new API format directly
12
18
  *
13
19
  * @param screenId - The ID of the screen to retrieve.
14
20
  * @param config - Optional configuration including layoutId and version.
15
21
  * @param params - Additional parameters for the API call.
16
- * @returns The screen data if headers are available, otherwise null.
22
+ * @returns The screen data in new API format (camelCase)
17
23
  */
18
24
  getScreen(screenId, config, params) {
19
25
  // Retrieve headers for the API request
20
26
  const headers = getHeaders();
21
- // Construct the API endpoint with the screenId and optional configuration
22
- return this.apiService.get(`${API.getScreen}?screenId=${screenId}${config?.layoutId ? `&layoutId=${config?.layoutId}` : ''}${config?.version ? `&version=${config?.version}` : ''}`, params, headers);
27
+ // NEW API: GET /screen/{screenId} via metadata service
28
+ // Query params: layoutId, version (if provided)
29
+ let endpoint = `${API.screen}/${screenId}`;
30
+ const queryParams = [];
31
+ if (config?.layoutId) {
32
+ queryParams.push(`layoutId=${config.layoutId}`);
33
+ }
34
+ if (config?.version) {
35
+ queryParams.push(`version=${config.version}`);
36
+ }
37
+ if (queryParams.length > 0) {
38
+ endpoint += `?${queryParams.join('&')}`;
39
+ }
40
+ return this.apiService.getFromService(APIServices.metadataService, endpoint, params, headers);
23
41
  }
24
42
  /**
25
43
  * Retrieves the submission data from the server.
26
- * @param data - Object containing screenId and reqtokens
27
- * @returns A Subject emitting the submission data or undefined.
44
+ * NEW: Uses formio service endpoint - returns new API format directly
45
+ *
46
+ * @param screenId - The ID of the screen to retrieve data for
47
+ * @param requestPayload - Request payload containing Reqtokens and other parameters
48
+ * @returns The screen data in new API format (camelCase)
28
49
  */
29
50
  getScreenData(screenId, requestPayload) {
30
51
  const headers = getHeaders();
31
- return this.apiService.post(`${API.getScreenData}/${screenId}`, requestPayload, headers);
52
+ // NEW API: POST /formio/screendata/{screenId} via formio service
53
+ return this.apiService.postToService(APIServices.formioService, `${API.screenData}/${screenId}`, requestPayload, headers);
32
54
  }
33
55
  /**
34
- * Called when the form is submitted.
35
- * @param data Object containing submission data.
36
- */
56
+ * Process form request - handles both SYNC and ASYNC operations transparently
57
+ *
58
+ * SYNC Operation: Backend returns insertedId immediately → Fetch full record → Return
59
+ * ASYNC Operation: Backend returns correlationId → Wait for SignalR notification → Fetch full record → Return
60
+ *
61
+ * Developer code stays the same for both cases - platform handles complexity
62
+ *
63
+ * @param data Object containing submission data (ScreenId, Data)
64
+ * @returns Observable with full record data (always returns complete record)
65
+ */
37
66
  processRequest(data) {
38
67
  const headers = getHeaders();
39
- return this.apiService.post(`${API.processRequest}`, data, headers);
68
+ return this.apiService.postToService(APIServices.formioService, `${API.processRequest}`, data, headers).pipe(switchMap((response) => {
69
+ // Check for success
70
+ if (!response?.IsSuccess) {
71
+ console.error('[TabFormioService] ProcessRequest failed:', response?.Errors);
72
+ return of(response);
73
+ }
74
+ // CASE 1: SYNC - Has insertedId immediately (not null)
75
+ if (response?.Result?.insertedId) {
76
+ return this.handleSyncOperation(response);
77
+ }
78
+ // CASE 2: ASYNC - Has CorrelationId and insertedId is null
79
+ else if (response?.CorrelationId) {
80
+ return this.handleAsyncOperation(response);
81
+ }
82
+ // CASE 3: Other response (return as-is)
83
+ return of(response);
84
+ }), catchError((error) => {
85
+ console.error('[TabFormioService] ProcessRequest error:', error);
86
+ return throwError(() => error);
87
+ }));
88
+ }
89
+ /**
90
+ * Handle SYNC operation - fetch full record immediately
91
+ */
92
+ handleSyncOperation(response) {
93
+ const { insertedId, objectName, primaryKeyField } = response?.Result || {};
94
+ if (!objectName || !insertedId) {
95
+ console.error('[TabFormioService] Missing objectName or insertedId in sync response');
96
+ return of(response);
97
+ }
98
+ const pkField = primaryKeyField || 'Id'; // Default to 'Id' if not provided
99
+ return this.fetchFullRecord(objectName, insertedId, pkField).pipe(map((fullRecord) => ({
100
+ ...response,
101
+ Result: fullRecord
102
+ })), catchError((error) => {
103
+ console.error('[TabFormioService] Failed to fetch full record:', error);
104
+ // Return partial response if fetch fails
105
+ return of(response);
106
+ }));
107
+ }
108
+ /**
109
+ * Handle ASYNC operation - wait for SignalR notification, then fetch full record
110
+ */
111
+ handleAsyncOperation(response) {
112
+ const correlationId = response?.CorrelationId;
113
+ const primaryKeyField = response?.Result?.primaryKeyField || 'Id'; // Get from original response
114
+ if (!correlationId) {
115
+ console.error('[TabFormioService] Missing correlationId in async response');
116
+ return of(response);
117
+ }
118
+ // Wait for SignalR notification with matching correlationId
119
+ return this.signalRService.waitForOperation(correlationId).pipe(switchMap((notification) => {
120
+ // Check if operation succeeded
121
+ if (!notification.isSuccess) {
122
+ return throwError(() => new Error(notification.errorMessage || 'Operation failed'));
123
+ }
124
+ // Fetch full record using result from notification
125
+ return this.fetchFullRecord(notification.entityName, notification.result?.[0], primaryKeyField);
126
+ }),
127
+ // Build normalized response
128
+ map((fullRecord) => ({
129
+ ...response,
130
+ Result: fullRecord
131
+ })),
132
+ // Handle errors (timeout, fetch failure, etc.)
133
+ catchError((error) => {
134
+ if (error.message === 'Operation timed out') {
135
+ return throwError(() => new Error('Operation timed out. The operation may still complete in the background. Please refresh to see the result.'));
136
+ }
137
+ return throwError(() => error);
138
+ }));
139
+ }
140
+ /**
141
+ * Fetch full record from CRUD service
142
+ * @param objectName - Entity/Table name
143
+ * @param recordId - Record ID to fetch
144
+ * @param primaryKeyField - Primary key field name (defaults to 'Id')
145
+ */
146
+ fetchFullRecord(objectName, recordId, primaryKeyField = 'Id') {
147
+ return this.apiService.postToService(APIServices.crudService, API.QueriesSelect, {
148
+ EntityName: objectName,
149
+ ResultField_AppfieldIds: ['*'],
150
+ whereClause: {
151
+ filters: [
152
+ {
153
+ fieldName: primaryKeyField, // Use dynamic primary key field
154
+ operator: RelationalOperator.EqualTo,
155
+ value: recordId,
156
+ valueType: FilterValueType.Literal,
157
+ conjunction: ConjuctionClause.AND,
158
+ groupId: 0,
159
+ sequence: 1
160
+ }
161
+ ]
162
+ },
163
+ }).pipe(map((selectResponse) => {
164
+ if (selectResponse?.Result && selectResponse?.Result?.length) {
165
+ return selectResponse.Result[0];
166
+ }
167
+ throw new Error('Record not found after operation');
168
+ }));
40
169
  }
41
170
  /**
42
171
  * Retrieves the formIO components for the given appObjectId and type.
@@ -56,4 +185,4 @@ export class TabFormioService {
56
185
  type: Injectable,
57
186
  args: [{ providedIn: 'root' }]
58
187
  }], null, null); })();
59
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWZvcm1pby5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWZvcm1pby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQU1qRCxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBRW1CLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7S0ErRGxEO0lBN0RDOzs7Ozs7O09BT0c7SUFDSCxTQUFTLENBQUMsUUFBZ0IsRUFBRSxNQUF3QixFQUFFLE1BQVk7UUFDaEUsdUNBQXVDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLDBFQUEwRTtRQUMxRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN4QixHQUFHLEdBQUcsQ0FBQyxTQUFTLGFBQWEsUUFBUSxHQUFHLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUN4SixNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxRQUFnQixFQUFFLGNBQW1CO1FBQ2pELE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLEdBQUcsR0FBRyxDQUFDLGFBQWEsSUFBSSxRQUFRLEVBQUUsRUFDbEMsY0FBYyxFQUNkLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7TUFHRTtJQUNGLGNBQWMsQ0FBQyxJQUEyQjtRQUN4QyxNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN6QixHQUFHLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFDdkIsSUFBSSxFQUNKLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILHFCQUFxQixDQUFDLFdBQW1CLEVBQUUsSUFBNEIsRUFBRSxNQUFZO1FBQ25GLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQ3hCLEdBQUcsR0FBRyxDQUFDLHFCQUFxQixnQkFBZ0IsV0FBVyxTQUFTLElBQUksRUFBRSxFQUN0RSxNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO2lGQS9EVSxnQkFBZ0I7dUVBQWhCLGdCQUFnQixXQUFoQixnQkFBZ0IsbUJBREgsTUFBTTs7aUZBQ25CLGdCQUFnQjtjQUQ1QixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQXBpU2VydmljZSB9IGZyb20gXCIuLi8uLi9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IGdldEhlYWRlcnMgfSBmcm9tIFwiLi4vdXRpbHMvcmVxLXJlcy51dGlsXCI7XHJcbmltcG9ydCB7IEFQSSB9IGZyb20gXCIuLi9jb25zdGFudHMvYXBpLWNvbnN0YW50c1wiO1xyXG5pbXBvcnQgeyBDb21tb25BcGlSZXNwb25zZSwgR2V0U2NyZWVuQ29uZmlnLCBQcm9jZXNzUmVxdWVzdFBheWxvYWQgfSBmcm9tIFwiLi4vaW50ZXJmYWNlcy9jb21tb24uaW50ZXJmYWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBCdWlsZEZvcm1Db21wb25lbnRUeXBlIH0gZnJvbSBcIi4uL2VudW1zL2NvbW1vbi5lbnVtXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVGFiRm9ybWlvU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlTZXJ2aWNlID0gaW5qZWN0KEFwaVNlcnZpY2UpO1xyXG5cclxuICAvKipcclxuICAgKiBGZXRjaGVzIHNjcmVlbiBkYXRhIGZyb20gdGhlIHNlcnZlciBiYXNlZCBvbiB0aGUgc2NyZWVuIElEIGFuZCBvcHRpb25hbCBjb25maWd1cmF0aW9uLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCAtIFRoZSBJRCBvZiB0aGUgc2NyZWVuIHRvIHJldHJpZXZlLlxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBsYXlvdXRJZCBhbmQgdmVyc2lvbi5cclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgQVBJIGNhbGwuXHJcbiAgICogQHJldHVybnMgVGhlIHNjcmVlbiBkYXRhIGlmIGhlYWRlcnMgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIG51bGwuXHJcbiAgICovXHJcbiAgZ2V0U2NyZWVuKHNjcmVlbklkOiBzdHJpbmcsIGNvbmZpZz86IEdldFNjcmVlbkNvbmZpZywgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgLy8gUmV0cmlldmUgaGVhZGVycyBmb3IgdGhlIEFQSSByZXF1ZXN0XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgLy8gQ29uc3RydWN0IHRoZSBBUEkgZW5kcG9pbnQgd2l0aCB0aGUgc2NyZWVuSWQgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0KFxyXG4gICAgICBgJHtBUEkuZ2V0U2NyZWVufT9zY3JlZW5JZD0ke3NjcmVlbklkfSR7Y29uZmlnPy5sYXlvdXRJZCA/IGAmbGF5b3V0SWQ9JHtjb25maWc/LmxheW91dElkfWAgOiAnJ30ke2NvbmZpZz8udmVyc2lvbiA/IGAmdmVyc2lvbj0ke2NvbmZpZz8udmVyc2lvbn1gIDogJyd9YCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBzdWJtaXNzaW9uIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIEBwYXJhbSBkYXRhIC0gT2JqZWN0IGNvbnRhaW5pbmcgc2NyZWVuSWQgYW5kIHJlcXRva2Vuc1xyXG4gICAqIEByZXR1cm5zIEEgU3ViamVjdCBlbWl0dGluZyB0aGUgc3VibWlzc2lvbiBkYXRhIG9yIHVuZGVmaW5lZC5cclxuICAgKi9cclxuICBnZXRTY3JlZW5EYXRhKHNjcmVlbklkOiBzdHJpbmcsIHJlcXVlc3RQYXlsb2FkOiBhbnkpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0KFxyXG4gICAgICBgJHtBUEkuZ2V0U2NyZWVuRGF0YX0vJHtzY3JlZW5JZH1gLFxyXG4gICAgICByZXF1ZXN0UGF5bG9hZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQ2FsbGVkIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLlxyXG4gICogQHBhcmFtIGRhdGEgT2JqZWN0IGNvbnRhaW5pbmcgc3VibWlzc2lvbiBkYXRhLlxyXG4gICovXHJcbiAgcHJvY2Vzc1JlcXVlc3QoZGF0YTogUHJvY2Vzc1JlcXVlc3RQYXlsb2FkKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UucG9zdChcclxuICAgICAgYCR7QVBJLnByb2Nlc3NSZXF1ZXN0fWAsXHJcbiAgICAgIGRhdGEsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZXMgdGhlIGZvcm1JTyBjb21wb25lbnRzIGZvciB0aGUgZ2l2ZW4gYXBwT2JqZWN0SWQgYW5kIHR5cGUuXHJcbiAgICogQHBhcmFtIGFwcE9iamVjdElkIC0gVGhlIElEIG9mIHRoZSBhcHAgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGNvbXBvbmVudHMgdG8gcmV0cmlldmUuIENhbiBiZSBlaXRoZXIgJ0NvbW1vbkZpbHRlcicgb3IgJ0J1bGtVcGRhdGUnXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIEFQSSBjYWxsLlxyXG4gICAqIEByZXR1cm5zIFRoZSBmb3JtSU8gY29tcG9uZW50cyBpbiB0aGUgcmVzcG9uc2UgYm9keS5cclxuICAgKi9cclxuICBidWlsZEZvcm1JT0NvbXBvbmVudHMoYXBwT2JqZWN0SWQ6IHN0cmluZywgdHlwZTogQnVpbGRGb3JtQ29tcG9uZW50VHlwZSwgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2UuZ2V0KFxyXG4gICAgICBgJHtBUEkuQnVpbGRGb3JtSU9Db21wb25lbnRzfT9hcHBPYmplY3RJZD0ke2FwcE9iamVjdElkfSZUeXBlPSR7dHlwZX1gLFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIGhlYWRlcnNcclxuICAgICk7XHJcbiAgfVxyXG59Il19
188
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWZvcm1pby5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL2NydWQvdGFiLWZvcm1pby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUU5RCxPQUFPLEVBQWMsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQUc1RSxNQUFNLE9BQU8sZ0JBQWdCO0lBRDdCO1FBRW1CLGVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7S0FzTzFEO0lBcE9DOzs7Ozs7OztPQVFHO0lBQ0gsU0FBUyxDQUFDLFFBQWdCLEVBQUUsTUFBd0IsRUFBRSxNQUFZO1FBQ2hFLHVDQUF1QztRQUN2QyxNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUU3Qix1REFBdUQ7UUFDdkQsZ0RBQWdEO1FBQ2hELElBQUksUUFBUSxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7UUFFakMsSUFBSSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7WUFDckIsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNwQixXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQixRQUFRLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQ25DLFdBQVcsQ0FBQyxlQUFlLEVBQzNCLFFBQVEsRUFDUixNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILGFBQWEsQ0FBQyxRQUFnQixFQUFFLGNBQW1CO1FBQ2pELE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBRTdCLGlFQUFpRTtRQUNqRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUNsQyxXQUFXLENBQUMsYUFBYSxFQUN6QixHQUFHLEdBQUcsQ0FBQyxVQUFVLElBQUksUUFBUSxFQUFFLEVBQy9CLGNBQWMsRUFDZCxPQUFPLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsY0FBYyxDQUFDLElBQTJCO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO1FBRTdCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQ2xDLFdBQVcsQ0FBQyxhQUFhLEVBQ3pCLEdBQUcsR0FBRyxDQUFDLGNBQWMsRUFBRSxFQUN2QixJQUFJLEVBQ0osT0FBTyxDQUNSLENBQUMsSUFBSSxDQUNKLFNBQVMsQ0FBQyxDQUFDLFFBQTJCLEVBQUUsRUFBRTtZQUN4QyxvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDekIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RCLENBQUM7WUFFRCx1REFBdUQ7WUFDdkQsSUFBSSxRQUFRLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxDQUFDO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBRUQsMkRBQTJEO2lCQUN0RCxJQUFJLFFBQVEsRUFBRSxhQUFhLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUVELHdDQUF3QztZQUN4QyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxtQkFBbUIsQ0FBQyxRQUEyQjtRQUNyRCxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsR0FBRyxRQUFRLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztRQUUzRSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1lBQ3RGLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUMsa0NBQWtDO1FBRTNFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDL0QsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ25CLEdBQUcsUUFBUTtZQUNYLE1BQU0sRUFBRSxVQUFVO1NBQ25CLENBQUMsQ0FBQyxFQUNILFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEUseUNBQXlDO1lBQ3pDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUEyQjtRQUN0RCxNQUFNLGFBQWEsR0FBRyxRQUFRLEVBQUUsYUFBYSxDQUFDO1FBQzlDLE1BQU0sZUFBZSxHQUFHLFFBQVEsRUFBRSxNQUFNLEVBQUUsZUFBZSxJQUFJLElBQUksQ0FBQyxDQUFDLDZCQUE2QjtRQUVoRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO1lBQzVFLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FDN0QsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDekIsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sVUFBVSxDQUNmLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLElBQUksa0JBQWtCLENBQUMsQ0FDakUsQ0FBQztZQUNKLENBQUM7WUFFRCxtREFBbUQ7WUFDbkQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2xHLENBQUMsQ0FBQztRQUVGLDRCQUE0QjtRQUM1QixHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkIsR0FBRyxRQUFRO1lBQ1gsTUFBTSxFQUFFLFVBQVU7U0FDbkIsQ0FBQyxDQUFDO1FBRUgsK0NBQStDO1FBQy9DLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ25CLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLFVBQVUsQ0FDZixHQUFHLEVBQUUsQ0FDSCxJQUFJLEtBQUssQ0FDUCw0R0FBNEcsQ0FDN0csQ0FDSixDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUMsVUFBa0IsRUFBRSxRQUFnQixFQUFFLGVBQWUsR0FBRyxJQUFJO1FBQ2xGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQ2xDLFdBQVcsQ0FBQyxXQUFXLEVBQ3ZCLEdBQUcsQ0FBQyxhQUFhLEVBQ2pCO1lBQ0UsVUFBVSxFQUFFLFVBQVU7WUFDdEIsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLENBQUM7WUFDOUIsV0FBVyxFQUFFO2dCQUNYLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxTQUFTLEVBQUUsZUFBZSxFQUFFLGdDQUFnQzt3QkFDNUQsUUFBUSxFQUFFLGtCQUFrQixDQUFDLE9BQU87d0JBQ3BDLEtBQUssRUFBRSxRQUFRO3dCQUNmLFNBQVMsRUFBRSxlQUFlLENBQUMsT0FBTzt3QkFDbEMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLEdBQUc7d0JBQ2pDLE9BQU8sRUFBRSxDQUFDO3dCQUNWLFFBQVEsRUFBRSxDQUFDO3FCQUNaO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFDLGNBQWlDLEVBQUUsRUFBRTtZQUN4QyxJQUFJLGNBQWMsRUFBRSxNQUFNLElBQUksY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztnQkFDN0QsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxxQkFBcUIsQ0FBQyxXQUFtQixFQUFFLElBQTRCLEVBQUUsTUFBWTtRQUNuRixNQUFNLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUN4QixHQUFHLEdBQUcsQ0FBQyxxQkFBcUIsZ0JBQWdCLFdBQVcsU0FBUyxJQUFJLEVBQUUsRUFDdEUsTUFBTSxFQUNOLE9BQU8sQ0FDUixDQUFDO0lBQ0osQ0FBQztpRkF2T1UsZ0JBQWdCO3VFQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCLG1CQURILE1BQU07O2lGQUNuQixnQkFBZ0I7Y0FENUIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vY29yZS9odHRwLWNsaWVudC9hcGkuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBnZXRIZWFkZXJzIH0gZnJvbSBcIi4uL3V0aWxzL3JlcS1yZXMudXRpbFwiO1xyXG5pbXBvcnQgeyBBUEksIEFQSVNlcnZpY2VzIH0gZnJvbSBcIi4uL2NvbnN0YW50cy9hcGktY29uc3RhbnRzXCI7XHJcbmltcG9ydCB7IENvbW1vbkFwaVJlc3BvbnNlLCBHZXRTY3JlZW5Db25maWcsIFByb2Nlc3NSZXF1ZXN0UGF5bG9hZCB9IGZyb20gXCIuLi9pbnRlcmZhY2VzL2NvbW1vbi5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHRocm93RXJyb3IgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBCdWlsZEZvcm1Db21wb25lbnRUeXBlIH0gZnJvbSBcIi4uL2VudW1zL2NvbW1vbi5lbnVtXCI7XHJcbmltcG9ydCB7IENvbmp1Y3Rpb25DbGF1c2UsIEZpbHRlclZhbHVlVHlwZSwgUmVsYXRpb25hbE9wZXJhdG9yIH0gZnJvbSBcIi4uL2VudW1zL2RzcS5lbnVtXCI7XHJcbmltcG9ydCB7IFNpZ25hbFJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvc2VydmljZS9zaWduYWxyL3NpZ25hbHIuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIFRhYkZvcm1pb1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpU2VydmljZSA9IGluamVjdChBcGlTZXJ2aWNlKTtcclxuICBwcml2YXRlIHJlYWRvbmx5IHNpZ25hbFJTZXJ2aWNlID0gaW5qZWN0KFNpZ25hbFJTZXJ2aWNlKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBzY3JlZW4gZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHNjcmVlbiBJRCBhbmQgb3B0aW9uYWwgY29uZmlndXJhdGlvbi5cclxuICAgKiBORVc6IFVzZXMgbWV0YWRhdGEgc2VydmljZSBlbmRwb2ludCAtIHJldHVybnMgbmV3IEFQSSBmb3JtYXQgZGlyZWN0bHlcclxuICAgKlxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCAtIFRoZSBJRCBvZiB0aGUgc2NyZWVuIHRvIHJldHJpZXZlLlxyXG4gICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIGluY2x1ZGluZyBsYXlvdXRJZCBhbmQgdmVyc2lvbi5cclxuICAgKiBAcGFyYW0gcGFyYW1zIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgQVBJIGNhbGwuXHJcbiAgICogQHJldHVybnMgVGhlIHNjcmVlbiBkYXRhIGluIG5ldyBBUEkgZm9ybWF0IChjYW1lbENhc2UpXHJcbiAgICovXHJcbiAgZ2V0U2NyZWVuKHNjcmVlbklkOiBzdHJpbmcsIGNvbmZpZz86IEdldFNjcmVlbkNvbmZpZywgcGFyYW1zPzogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgLy8gUmV0cmlldmUgaGVhZGVycyBmb3IgdGhlIEFQSSByZXF1ZXN0XHJcbiAgICBjb25zdCBoZWFkZXJzID0gZ2V0SGVhZGVycygpO1xyXG5cclxuICAgIC8vIE5FVyBBUEk6IEdFVCAvc2NyZWVuL3tzY3JlZW5JZH0gdmlhIG1ldGFkYXRhIHNlcnZpY2VcclxuICAgIC8vIFF1ZXJ5IHBhcmFtczogbGF5b3V0SWQsIHZlcnNpb24gKGlmIHByb3ZpZGVkKVxyXG4gICAgbGV0IGVuZHBvaW50ID0gYCR7QVBJLnNjcmVlbn0vJHtzY3JlZW5JZH1gO1xyXG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gICAgaWYgKGNvbmZpZz8ubGF5b3V0SWQpIHtcclxuICAgICAgcXVlcnlQYXJhbXMucHVzaChgbGF5b3V0SWQ9JHtjb25maWcubGF5b3V0SWR9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnPy52ZXJzaW9uKSB7XHJcbiAgICAgIHF1ZXJ5UGFyYW1zLnB1c2goYHZlcnNpb249JHtjb25maWcudmVyc2lvbn1gKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocXVlcnlQYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBlbmRwb2ludCArPSBgPyR7cXVlcnlQYXJhbXMuam9pbignJicpfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5nZXRGcm9tU2VydmljZShcclxuICAgICAgQVBJU2VydmljZXMubWV0YWRhdGFTZXJ2aWNlLFxyXG4gICAgICBlbmRwb2ludCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBzdWJtaXNzaW9uIGRhdGEgZnJvbSB0aGUgc2VydmVyLlxyXG4gICAqIE5FVzogVXNlcyBmb3JtaW8gc2VydmljZSBlbmRwb2ludCAtIHJldHVybnMgbmV3IEFQSSBmb3JtYXQgZGlyZWN0bHlcclxuICAgKlxyXG4gICAqIEBwYXJhbSBzY3JlZW5JZCAtIFRoZSBJRCBvZiB0aGUgc2NyZWVuIHRvIHJldHJpZXZlIGRhdGEgZm9yXHJcbiAgICogQHBhcmFtIHJlcXVlc3RQYXlsb2FkIC0gUmVxdWVzdCBwYXlsb2FkIGNvbnRhaW5pbmcgUmVxdG9rZW5zIGFuZCBvdGhlciBwYXJhbWV0ZXJzXHJcbiAgICogQHJldHVybnMgVGhlIHNjcmVlbiBkYXRhIGluIG5ldyBBUEkgZm9ybWF0IChjYW1lbENhc2UpXHJcbiAgICovXHJcbiAgZ2V0U2NyZWVuRGF0YShzY3JlZW5JZDogc3RyaW5nLCByZXF1ZXN0UGF5bG9hZDogYW55KTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuXHJcbiAgICAvLyBORVcgQVBJOiBQT1NUIC9mb3JtaW8vc2NyZWVuZGF0YS97c2NyZWVuSWR9IHZpYSBmb3JtaW8gc2VydmljZVxyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0VG9TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5mb3JtaW9TZXJ2aWNlLFxyXG4gICAgICBgJHtBUEkuc2NyZWVuRGF0YX0vJHtzY3JlZW5JZH1gLFxyXG4gICAgICByZXF1ZXN0UGF5bG9hZCxcclxuICAgICAgaGVhZGVyc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3MgZm9ybSByZXF1ZXN0IC0gaGFuZGxlcyBib3RoIFNZTkMgYW5kIEFTWU5DIG9wZXJhdGlvbnMgdHJhbnNwYXJlbnRseVxyXG4gICAqXHJcbiAgICogU1lOQyBPcGVyYXRpb246IEJhY2tlbmQgcmV0dXJucyBpbnNlcnRlZElkIGltbWVkaWF0ZWx5IOKGkiBGZXRjaCBmdWxsIHJlY29yZCDihpIgUmV0dXJuXHJcbiAgICogQVNZTkMgT3BlcmF0aW9uOiBCYWNrZW5kIHJldHVybnMgY29ycmVsYXRpb25JZCDihpIgV2FpdCBmb3IgU2lnbmFsUiBub3RpZmljYXRpb24g4oaSIEZldGNoIGZ1bGwgcmVjb3JkIOKGkiBSZXR1cm5cclxuICAgKlxyXG4gICAqIERldmVsb3BlciBjb2RlIHN0YXlzIHRoZSBzYW1lIGZvciBib3RoIGNhc2VzIC0gcGxhdGZvcm0gaGFuZGxlcyBjb21wbGV4aXR5XHJcbiAgICpcclxuICAgKiBAcGFyYW0gZGF0YSBPYmplY3QgY29udGFpbmluZyBzdWJtaXNzaW9uIGRhdGEgKFNjcmVlbklkLCBEYXRhKVxyXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgd2l0aCBmdWxsIHJlY29yZCBkYXRhIChhbHdheXMgcmV0dXJucyBjb21wbGV0ZSByZWNvcmQpXHJcbiAgICovXHJcbiAgcHJvY2Vzc1JlcXVlc3QoZGF0YTogUHJvY2Vzc1JlcXVlc3RQYXlsb2FkKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaGVhZGVycyA9IGdldEhlYWRlcnMoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLnBvc3RUb1NlcnZpY2UoXHJcbiAgICAgIEFQSVNlcnZpY2VzLmZvcm1pb1NlcnZpY2UsXHJcbiAgICAgIGAke0FQSS5wcm9jZXNzUmVxdWVzdH1gLFxyXG4gICAgICBkYXRhLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgocmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgLy8gQ2hlY2sgZm9yIHN1Y2Nlc3NcclxuICAgICAgICBpZiAoIXJlc3BvbnNlPy5Jc1N1Y2Nlc3MpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWJGb3JtaW9TZXJ2aWNlXSBQcm9jZXNzUmVxdWVzdCBmYWlsZWQ6JywgcmVzcG9uc2U/LkVycm9ycyk7XHJcbiAgICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ0FTRSAxOiBTWU5DIC0gSGFzIGluc2VydGVkSWQgaW1tZWRpYXRlbHkgKG5vdCBudWxsKVxyXG4gICAgICAgIGlmIChyZXNwb25zZT8uUmVzdWx0Py5pbnNlcnRlZElkKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVTeW5jT3BlcmF0aW9uKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENBU0UgMjogQVNZTkMgLSBIYXMgQ29ycmVsYXRpb25JZCBhbmQgaW5zZXJ0ZWRJZCBpcyBudWxsXHJcbiAgICAgICAgZWxzZSBpZiAocmVzcG9uc2U/LkNvcnJlbGF0aW9uSWQpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUFzeW5jT3BlcmF0aW9uKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENBU0UgMzogT3RoZXIgcmVzcG9uc2UgKHJldHVybiBhcy1pcylcclxuICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdbVGFiRm9ybWlvU2VydmljZV0gUHJvY2Vzc1JlcXVlc3QgZXJyb3I6JywgZXJyb3IpO1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgU1lOQyBvcGVyYXRpb24gLSBmZXRjaCBmdWxsIHJlY29yZCBpbW1lZGlhdGVseVxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlU3luY09wZXJhdGlvbihyZXNwb25zZTogQ29tbW9uQXBpUmVzcG9uc2UpOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCB7IGluc2VydGVkSWQsIG9iamVjdE5hbWUsIHByaW1hcnlLZXlGaWVsZCB9ID0gcmVzcG9uc2U/LlJlc3VsdCB8fCB7fTtcclxuXHJcbiAgICBpZiAoIW9iamVjdE5hbWUgfHwgIWluc2VydGVkSWQpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW1RhYkZvcm1pb1NlcnZpY2VdIE1pc3Npbmcgb2JqZWN0TmFtZSBvciBpbnNlcnRlZElkIGluIHN5bmMgcmVzcG9uc2UnKTtcclxuICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwa0ZpZWxkID0gcHJpbWFyeUtleUZpZWxkIHx8ICdJZCc7IC8vIERlZmF1bHQgdG8gJ0lkJyBpZiBub3QgcHJvdmlkZWRcclxuXHJcbiAgICByZXR1cm4gdGhpcy5mZXRjaEZ1bGxSZWNvcmQob2JqZWN0TmFtZSwgaW5zZXJ0ZWRJZCwgcGtGaWVsZCkucGlwZShcclxuICAgICAgbWFwKChmdWxsUmVjb3JkKSA9PiAoe1xyXG4gICAgICAgIC4uLnJlc3BvbnNlLFxyXG4gICAgICAgIFJlc3VsdDogZnVsbFJlY29yZFxyXG4gICAgICB9KSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignW1RhYkZvcm1pb1NlcnZpY2VdIEZhaWxlZCB0byBmZXRjaCBmdWxsIHJlY29yZDonLCBlcnJvcik7XHJcbiAgICAgICAgLy8gUmV0dXJuIHBhcnRpYWwgcmVzcG9uc2UgaWYgZmV0Y2ggZmFpbHNcclxuICAgICAgICByZXR1cm4gb2YocmVzcG9uc2UpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBBU1lOQyBvcGVyYXRpb24gLSB3YWl0IGZvciBTaWduYWxSIG5vdGlmaWNhdGlvbiwgdGhlbiBmZXRjaCBmdWxsIHJlY29yZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgaGFuZGxlQXN5bmNPcGVyYXRpb24ocmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKTogT2JzZXJ2YWJsZTxDb21tb25BcGlSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IHJlc3BvbnNlPy5Db3JyZWxhdGlvbklkO1xyXG4gICAgY29uc3QgcHJpbWFyeUtleUZpZWxkID0gcmVzcG9uc2U/LlJlc3VsdD8ucHJpbWFyeUtleUZpZWxkIHx8ICdJZCc7IC8vIEdldCBmcm9tIG9yaWdpbmFsIHJlc3BvbnNlXHJcblxyXG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tUYWJGb3JtaW9TZXJ2aWNlXSBNaXNzaW5nIGNvcnJlbGF0aW9uSWQgaW4gYXN5bmMgcmVzcG9uc2UnKTtcclxuICAgICAgcmV0dXJuIG9mKHJlc3BvbnNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBXYWl0IGZvciBTaWduYWxSIG5vdGlmaWNhdGlvbiB3aXRoIG1hdGNoaW5nIGNvcnJlbGF0aW9uSWRcclxuICAgIHJldHVybiB0aGlzLnNpZ25hbFJTZXJ2aWNlLndhaXRGb3JPcGVyYXRpb24oY29ycmVsYXRpb25JZCkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChub3RpZmljYXRpb24pID0+IHtcclxuICAgICAgICAvLyBDaGVjayBpZiBvcGVyYXRpb24gc3VjY2VlZGVkXHJcbiAgICAgICAgaWYgKCFub3RpZmljYXRpb24uaXNTdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihcclxuICAgICAgICAgICAgKCkgPT4gbmV3IEVycm9yKG5vdGlmaWNhdGlvbi5lcnJvck1lc3NhZ2UgfHwgJ09wZXJhdGlvbiBmYWlsZWQnKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZldGNoIGZ1bGwgcmVjb3JkIHVzaW5nIHJlc3VsdCBmcm9tIG5vdGlmaWNhdGlvblxyXG4gICAgICAgIHJldHVybiB0aGlzLmZldGNoRnVsbFJlY29yZChub3RpZmljYXRpb24uZW50aXR5TmFtZSwgbm90aWZpY2F0aW9uLnJlc3VsdD8uWzBdLCBwcmltYXJ5S2V5RmllbGQpO1xyXG4gICAgICB9KSxcclxuXHJcbiAgICAgIC8vIEJ1aWxkIG5vcm1hbGl6ZWQgcmVzcG9uc2VcclxuICAgICAgbWFwKChmdWxsUmVjb3JkKSA9PiAoe1xyXG4gICAgICAgIC4uLnJlc3BvbnNlLFxyXG4gICAgICAgIFJlc3VsdDogZnVsbFJlY29yZFxyXG4gICAgICB9KSksXHJcblxyXG4gICAgICAvLyBIYW5kbGUgZXJyb3JzICh0aW1lb3V0LCBmZXRjaCBmYWlsdXJlLCBldGMuKVxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSAnT3BlcmF0aW9uIHRpbWVkIG91dCcpIHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxyXG4gICAgICAgICAgICAoKSA9PlxyXG4gICAgICAgICAgICAgIG5ldyBFcnJvcihcclxuICAgICAgICAgICAgICAgICdPcGVyYXRpb24gdGltZWQgb3V0LiBUaGUgb3BlcmF0aW9uIG1heSBzdGlsbCBjb21wbGV0ZSBpbiB0aGUgYmFja2dyb3VuZC4gUGxlYXNlIHJlZnJlc2ggdG8gc2VlIHRoZSByZXN1bHQuJ1xyXG4gICAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGZXRjaCBmdWxsIHJlY29yZCBmcm9tIENSVUQgc2VydmljZVxyXG4gICAqIEBwYXJhbSBvYmplY3ROYW1lIC0gRW50aXR5L1RhYmxlIG5hbWVcclxuICAgKiBAcGFyYW0gcmVjb3JkSWQgLSBSZWNvcmQgSUQgdG8gZmV0Y2hcclxuICAgKiBAcGFyYW0gcHJpbWFyeUtleUZpZWxkIC0gUHJpbWFyeSBrZXkgZmllbGQgbmFtZSAoZGVmYXVsdHMgdG8gJ0lkJylcclxuICAgKi9cclxuICBwcml2YXRlIGZldGNoRnVsbFJlY29yZChvYmplY3ROYW1lOiBzdHJpbmcsIHJlY29yZElkOiBzdHJpbmcsIHByaW1hcnlLZXlGaWVsZCA9ICdJZCcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZS5wb3N0VG9TZXJ2aWNlKFxyXG4gICAgICBBUElTZXJ2aWNlcy5jcnVkU2VydmljZSxcclxuICAgICAgQVBJLlF1ZXJpZXNTZWxlY3QsXHJcbiAgICAgIHtcclxuICAgICAgICBFbnRpdHlOYW1lOiBvYmplY3ROYW1lLFxyXG4gICAgICAgIFJlc3VsdEZpZWxkX0FwcGZpZWxkSWRzOiBbJyonXSxcclxuICAgICAgICB3aGVyZUNsYXVzZToge1xyXG4gICAgICAgICAgZmlsdGVyczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgZmllbGROYW1lOiBwcmltYXJ5S2V5RmllbGQsIC8vIFVzZSBkeW5hbWljIHByaW1hcnkga2V5IGZpZWxkXHJcbiAgICAgICAgICAgICAgb3BlcmF0b3I6IFJlbGF0aW9uYWxPcGVyYXRvci5FcXVhbFRvLFxyXG4gICAgICAgICAgICAgIHZhbHVlOiByZWNvcmRJZCxcclxuICAgICAgICAgICAgICB2YWx1ZVR5cGU6IEZpbHRlclZhbHVlVHlwZS5MaXRlcmFsLFxyXG4gICAgICAgICAgICAgIGNvbmp1bmN0aW9uOiBDb25qdWN0aW9uQ2xhdXNlLkFORCxcclxuICAgICAgICAgICAgICBncm91cElkOiAwLFxyXG4gICAgICAgICAgICAgIHNlcXVlbmNlOiAxXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICB9LFxyXG4gICAgICB9KS5waXBlKFxyXG4gICAgICAgIG1hcCgoc2VsZWN0UmVzcG9uc2U6IENvbW1vbkFwaVJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0UmVzcG9uc2U/LlJlc3VsdCAmJiBzZWxlY3RSZXNwb25zZT8uUmVzdWx0Py5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdFJlc3BvbnNlLlJlc3VsdFswXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjb3JkIG5vdCBmb3VuZCBhZnRlciBvcGVyYXRpb24nKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmVzIHRoZSBmb3JtSU8gY29tcG9uZW50cyBmb3IgdGhlIGdpdmVuIGFwcE9iamVjdElkIGFuZCB0eXBlLlxyXG4gICAqIEBwYXJhbSBhcHBPYmplY3RJZCAtIFRoZSBJRCBvZiB0aGUgYXBwIG9iamVjdC5cclxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBjb21wb25lbnRzIHRvIHJldHJpZXZlLiBDYW4gYmUgZWl0aGVyICdDb21tb25GaWx0ZXInIG9yICdCdWxrVXBkYXRlJ1xyXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBBUEkgY2FsbC5cclxuICAgKiBAcmV0dXJucyBUaGUgZm9ybUlPIGNvbXBvbmVudHMgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICovXHJcbiAgYnVpbGRGb3JtSU9Db21wb25lbnRzKGFwcE9iamVjdElkOiBzdHJpbmcsIHR5cGU6IEJ1aWxkRm9ybUNvbXBvbmVudFR5cGUsIHBhcmFtcz86IGFueSk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlLmdldChcclxuICAgICAgYCR7QVBJLkJ1aWxkRm9ybUlPQ29tcG9uZW50c30/YXBwT2JqZWN0SWQ9JHthcHBPYmplY3RJZH0mVHlwZT0ke3R5cGV9YCxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBoZWFkZXJzXHJcbiAgICApO1xyXG4gIH1cclxufSJdfQ==