@techextensor/tab-core-utility 2.2.181 → 2.2.184

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 (73) hide show
  1. package/esm2022/index.mjs +5 -1
  2. package/esm2022/lib/tab-core-utility/app/constants/api-constants.mjs +24 -13
  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-crud.service.mjs +38 -49
  6. package/esm2022/lib/tab-core-utility/app/crud/tab-delete.service.mjs +81 -30
  7. package/esm2022/lib/tab-core-utility/app/crud/tab-formio.service.mjs +141 -12
  8. package/esm2022/lib/tab-core-utility/app/crud/tab-get.service.mjs +136 -35
  9. package/esm2022/lib/tab-core-utility/app/crud/tab-insert.service.mjs +89 -38
  10. package/esm2022/lib/tab-core-utility/app/crud/tab-update.service.mjs +152 -131
  11. package/esm2022/lib/tab-core-utility/app/enums/query.enum.mjs +7 -7
  12. package/esm2022/lib/tab-core-utility/app/helpers/common/app.helpers.mjs +6 -17
  13. package/esm2022/lib/tab-core-utility/app/helpers/common/dsq.helpers.mjs +9 -11
  14. package/esm2022/lib/tab-core-utility/app/helpers/common/meta-data.helpers.mjs +13 -13
  15. package/esm2022/lib/tab-core-utility/app/helpers/common/req-res.helpers.mjs +7 -45
  16. package/esm2022/lib/tab-core-utility/app/helpers/common/where-clause.helpers.mjs +79 -76
  17. package/esm2022/lib/tab-core-utility/app/helpers/response.adapter.mjs +38 -0
  18. package/esm2022/lib/tab-core-utility/app/helpers/screen/grid.helpers.mjs +8 -4
  19. package/esm2022/lib/tab-core-utility/app/helpers/screen/screen.helpers.mjs +8 -33
  20. package/esm2022/lib/tab-core-utility/app/interfaces/common.interface.mjs +1 -1
  21. package/esm2022/lib/tab-core-utility/app/interfaces/signalr.interface.mjs +42 -0
  22. package/esm2022/lib/tab-core-utility/app/models/api-query.class.mjs +39 -1
  23. package/esm2022/lib/tab-core-utility/app/models/app-field.model.mjs +36 -7
  24. package/esm2022/lib/tab-core-utility/app/models/app-object.model.mjs +84 -47
  25. package/esm2022/lib/tab-core-utility/app/models/app-screen.model.mjs +24 -13
  26. package/esm2022/lib/tab-core-utility/app/models/data-source-query.model.mjs +57 -23
  27. package/esm2022/lib/tab-core-utility/app/models/filter.model.mjs +21 -10
  28. package/esm2022/lib/tab-core-utility/app/models/parameter.model.mjs +12 -6
  29. package/esm2022/lib/tab-core-utility/app/models/sort.model.mjs +11 -4
  30. package/esm2022/lib/tab-core-utility/app/utils/json.util.mjs +17 -16
  31. package/esm2022/lib/tab-core-utility/app/utils/req-res.util.mjs +1 -55
  32. package/esm2022/lib/tab-core-utility/app/utils/tab-app.util.mjs +1 -164
  33. package/esm2022/lib/tab-core-utility/core/http-client/api.service.mjs +63 -1
  34. package/esm2022/lib/tab-core-utility/core/service/signalr/operation-tracker.service.mjs +82 -0
  35. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.mjs +252 -0
  36. package/esm2022/lib/tab-core-utility/core/service/signalr/signalr.service.mjs +207 -0
  37. package/index.d.ts +4 -0
  38. package/lib/tab-core-utility/app/constants/api-constants.d.ts +13 -10
  39. package/lib/tab-core-utility/app/constants/common.d.ts +9 -0
  40. package/lib/tab-core-utility/app/constants/storage-constants.d.ts +1 -1
  41. package/lib/tab-core-utility/app/crud/tab-crud.service.d.ts +8 -1
  42. package/lib/tab-core-utility/app/crud/tab-delete.service.d.ts +20 -10
  43. package/lib/tab-core-utility/app/crud/tab-formio.service.d.ts +33 -6
  44. package/lib/tab-core-utility/app/crud/tab-get.service.d.ts +45 -3
  45. package/lib/tab-core-utility/app/crud/tab-insert.service.d.ts +16 -21
  46. package/lib/tab-core-utility/app/crud/tab-update.service.d.ts +34 -19
  47. package/lib/tab-core-utility/app/enums/query.enum.d.ts +3 -6
  48. package/lib/tab-core-utility/app/helpers/common/app.helpers.d.ts +3 -8
  49. package/lib/tab-core-utility/app/helpers/common/dsq.helpers.d.ts +3 -0
  50. package/lib/tab-core-utility/app/helpers/common/meta-data.helpers.d.ts +3 -3
  51. package/lib/tab-core-utility/app/helpers/common/req-res.helpers.d.ts +7 -51
  52. package/lib/tab-core-utility/app/helpers/common/where-clause.helpers.d.ts +1 -0
  53. package/lib/tab-core-utility/app/helpers/response.adapter.d.ts +22 -0
  54. package/lib/tab-core-utility/app/helpers/screen/grid.helpers.d.ts +2 -1
  55. package/lib/tab-core-utility/app/helpers/screen/screen.helpers.d.ts +1 -0
  56. package/lib/tab-core-utility/app/interfaces/common.interface.d.ts +50 -2
  57. package/lib/tab-core-utility/app/interfaces/signalr.interface.d.ts +80 -0
  58. package/lib/tab-core-utility/app/models/api-query.class.d.ts +54 -9
  59. package/lib/tab-core-utility/app/models/app-field.model.d.ts +4 -2
  60. package/lib/tab-core-utility/app/models/app-object.model.d.ts +5 -3
  61. package/lib/tab-core-utility/app/models/app-screen.model.d.ts +2 -2
  62. package/lib/tab-core-utility/app/models/data-source-query.model.d.ts +7 -2
  63. package/lib/tab-core-utility/app/models/filter.model.d.ts +2 -2
  64. package/lib/tab-core-utility/app/models/parameter.model.d.ts +2 -2
  65. package/lib/tab-core-utility/app/models/sort.model.d.ts +1 -1
  66. package/lib/tab-core-utility/app/utils/json.util.d.ts +3 -2
  67. package/lib/tab-core-utility/app/utils/req-res.util.d.ts +1 -9
  68. package/lib/tab-core-utility/app/utils/tab-app.util.d.ts +0 -61
  69. package/lib/tab-core-utility/core/http-client/api.service.d.ts +37 -0
  70. package/lib/tab-core-utility/core/service/signalr/operation-tracker.service.d.ts +40 -0
  71. package/lib/tab-core-utility/core/service/signalr/signalr-infrastructure.service.d.ts +68 -0
  72. package/lib/tab-core-utility/core/service/signalr/signalr.service.d.ts +122 -0
  73. package/package.json +3 -2
@@ -1,90 +1,4 @@
1
- import { Common } from '../constants/common';
2
1
  import { deleteKeyFromResponse } from './req-res.util';
3
- /** Get the DataSourceQuery ID from the selected AppObject's DataSourceQuery array
4
- * @param dsqList - The list of DataSourceQueries
5
- * @param table - The table name
6
- * @param like - The like string
7
- * @returns string - The ID of the DataSourceQuery
8
- */
9
- export function getDsqIdfromSelectedAppObjectDSQArray(dsqList, table, like) {
10
- if (dsqList) {
11
- const matchName = like + '_' + table;
12
- const result = dsqList.find((d) => d.QueryName === matchName);
13
- return result?.ID;
14
- }
15
- }
16
- /** Get the AppObject based on the provided ID
17
- * @param id - The ID of the AppObject
18
- * @returns AppObject | null - The found AppObject or null
19
- */
20
- export function getAppObject(id) {
21
- const tabData = Common.tabJson;
22
- return (tabData?.AppObjects.find((t) => t.ID === id?.toLowerCase()) || null);
23
- }
24
- // function waitForData(timeout = 5000): Promise<void> {
25
- // return new Promise((resolve, reject) => {
26
- // const interval = 100; // Check every 100ms
27
- // let waited = 0;
28
- // const checkData = () => {
29
- // if (Common.tabJson) {
30
- // resolve();
31
- // } else if (waited >= timeout) {
32
- // reject(new Error('Timeout waiting for Common.tabJson'));
33
- // } else {
34
- // waited += interval;
35
- // setTimeout(checkData, interval);
36
- // }
37
- // };
38
- // checkData();
39
- // });
40
- // }
41
- /**
42
- * Get the AppObject from the DataSourceQuery ID
43
- * @param dsqId - The DataSourceQuery ID
44
- * @returns AppObject | null - The found AppObject or null
45
- */
46
- export function getAppObjectFromDataSourceQueryID(dsqId) {
47
- const tabData = Common.tabJson;
48
- if (!dsqId || !tabData) {
49
- return null;
50
- }
51
- for (const appObject of tabData.AppObjects) {
52
- const dsq = appObject.DataSourceQueries.find((l) => l.ID === dsqId?.toLowerCase());
53
- if (dsq) {
54
- return appObject;
55
- }
56
- }
57
- return null;
58
- }
59
- /**
60
- * Get the DataSourceQuery ID from the QueryName and table
61
- * @param table - The table name
62
- * @param dsq - The DataSourceQuery name
63
- * @returns any - The found DataSourceQuery
64
- */
65
- export function getDsqIDFromQueryName(table, dsq) {
66
- const appObjectList = getAppObjectFromSystemDBTableName(table);
67
- return appObjectList?.DataSourceQueries.find((d) => d.QueryName === dsq);
68
- }
69
- /**
70
- * Get the Data from the DataSourceQuery ID
71
- *
72
- * @param dsqId - The DataSourceQuery ID
73
- * @returns any - The found Data
74
- */
75
- export function getDataFromDataSourceQueryID(dsqId) {
76
- const tabData = Common.tabJson;
77
- if (!tabData) {
78
- return null;
79
- }
80
- for (const appObject of tabData.AppObjects) {
81
- const DSQ = appObject.DataSourceQueries.find((l) => l.ID === dsqId?.toLowerCase());
82
- if (DSQ) {
83
- return DSQ;
84
- }
85
- }
86
- return null;
87
- }
88
2
  /**
89
3
  * Synchronize AppObject fields with the response
90
4
  *
@@ -102,81 +16,4 @@ export function syncAppObjectFields(response, appObject) {
102
16
  }
103
17
  return response;
104
18
  }
105
- /**
106
- * Get the AppObject based on the SystemDBTableName
107
- *
108
- * @param tableName - The SystemDBTableName
109
- * @returns AppObject | null - The found AppObject or null
110
- */
111
- export function getAppObjectFromSystemDBTableName(tableName) {
112
- const tabData = Common.tabJson;
113
- return (tabData?.AppObjects.find((t) => t.SystemDBTableName === tableName) || null);
114
- }
115
- /**
116
- * Get the fields based on the appobjectid
117
- *
118
- * @param appObjectId - The appobjectid
119
- * @returns AppObject | null - The found AppObject or null
120
- */
121
- export function getAppfieldsFromAppObjectId(appObjectId) {
122
- const tabData = Common.tabJson;
123
- const findAppObject = tabData?.AppObjects.find((t) => t.ID === appObjectId) || null;
124
- if (findAppObject) {
125
- return findAppObject.Fields;
126
- }
127
- else {
128
- return null;
129
- }
130
- }
131
- export function getLookupAppfieldsFromAppObjectId(appObjectId) {
132
- const tabData = Common.tabJson;
133
- const findAppObject = tabData?.AppObjects.find((t) => t.ID === appObjectId) || null;
134
- if (findAppObject) {
135
- const lookupFields = findAppObject.Fields.filter((t) => t.LookUpDetails);
136
- if (lookupFields) {
137
- return lookupFields;
138
- }
139
- else {
140
- return null;
141
- }
142
- }
143
- }
144
- export function getViewAppObjectDetailsFromDSQID(dsqID) {
145
- const appObject = getAppObjectFromDataSourceQueryID(dsqID);
146
- let viewAppObjectDetailsOfGrid = appObject;
147
- // check appobject is table or view
148
- if (appObject && appObject.ObjectType == 2) {
149
- viewAppObjectDetailsOfGrid = getAppObject(appObject?.CRUDAppObjectId);
150
- }
151
- return viewAppObjectDetailsOfGrid;
152
- }
153
- /**
154
- * Retrieves all appObjects and their DSQs in a single list
155
- * suitable for tree view representation.
156
- * @author : Parth B Thakkar
157
- * @Usage : HTTP Request
158
- * @returns Array<{ id: string; name: string; hasChildren: boolean; parentID: string | null }>
159
- */
160
- export function getAllAppObjectsForTreeViewJson() {
161
- const tabData = Common.tabJson;
162
- const fieldData = [];
163
- for (const appObject of tabData?.AppObjects || []) {
164
- fieldData.push({
165
- id: appObject.ID,
166
- name: appObject.DisplayName,
167
- hasChildren: true,
168
- parentID: null,
169
- });
170
- // looping children
171
- for (const dsq of appObject.DataSourceQueries) {
172
- fieldData.push({
173
- id: dsq.ID,
174
- name: dsq.DisplayName,
175
- hasChildren: false,
176
- parentID: appObject.ID,
177
- });
178
- }
179
- }
180
- return fieldData.sort((a, b) => a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1);
181
- }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWFwcC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL3V0aWxzL3RhYi1hcHAudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFFSCxNQUFNLFVBQVUscUNBQXFDLENBQ25ELE9BQVksRUFDWixLQUFhLEVBQ2IsSUFBWTtJQUVaLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztJQUNwQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUVILE1BQU0sVUFBVSxZQUFZLENBQUMsRUFBVTtJQUNyQyxNQUFNLE9BQU8sR0FBZSxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQzNDLE9BQU8sQ0FDTCxPQUFPLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQ3pFLENBQUM7QUFDSixDQUFDO0FBRUQsd0RBQXdEO0FBQ3hELDhDQUE4QztBQUM5QyxpREFBaUQ7QUFDakQsc0JBQXNCO0FBRXRCLGdDQUFnQztBQUNoQyw4QkFBOEI7QUFDOUIscUJBQXFCO0FBQ3JCLHdDQUF3QztB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QUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQzdCLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb24gfSBmcm9tICcuLi9jb25zdGFudHMvY29tbW9uJztcclxuaW1wb3J0IHsgQXBwT2JqZWN0IH0gZnJvbSAnLi4vbW9kZWxzL2FwcC1vYmplY3QuY2xhc3MnO1xyXG5pbXBvcnQgeyBkZWxldGVLZXlGcm9tUmVzcG9uc2UgfSBmcm9tICcuL3JlcS1yZXMudXRpbCc7XHJcblxyXG4vKiogR2V0IHRoZSBEYXRhU291cmNlUXVlcnkgSUQgZnJvbSB0aGUgc2VsZWN0ZWQgQXBwT2JqZWN0J3MgRGF0YVNvdXJjZVF1ZXJ5IGFycmF5XHJcbiAqIEBwYXJhbSBkc3FMaXN0IC0gVGhlIGxpc3Qgb2YgRGF0YVNvdXJjZVF1ZXJpZXNcclxuICogQHBhcmFtIHRhYmxlIC0gVGhlIHRhYmxlIG5hbWVcclxuICogQHBhcmFtIGxpa2UgLSBUaGUgbGlrZSBzdHJpbmdcclxuICogQHJldHVybnMgc3RyaW5nIC0gVGhlIElEIG9mIHRoZSBEYXRhU291cmNlUXVlcnlcclxuICovXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RHNxSWRmcm9tU2VsZWN0ZWRBcHBPYmplY3REU1FBcnJheShcclxuICBkc3FMaXN0OiBhbnksXHJcbiAgdGFibGU6IHN0cmluZyxcclxuICBsaWtlOiBzdHJpbmdcclxuKSB7XHJcbiAgaWYgKGRzcUxpc3QpIHtcclxuICAgIGNvbnN0IG1hdGNoTmFtZSA9IGxpa2UgKyAnXycgKyB0YWJsZTtcclxuICAgIGNvbnN0IHJlc3VsdCA9IGRzcUxpc3QuZmluZCgoZDogYW55KSA9PiBkLlF1ZXJ5TmFtZSA9PT0gbWF0Y2hOYW1lKTtcclxuICAgIHJldHVybiByZXN1bHQ/LklEO1xyXG4gIH1cclxufVxyXG5cclxuLyoqIEdldCB0aGUgQXBwT2JqZWN0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBJRFxyXG4gKiBAcGFyYW0gaWQgLSBUaGUgSUQgb2YgdGhlIEFwcE9iamVjdFxyXG4gKiBAcmV0dXJucyBBcHBPYmplY3QgfCBudWxsIC0gVGhlIGZvdW5kIEFwcE9iamVjdCBvciBudWxsXHJcbiAqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwcE9iamVjdChpZDogc3RyaW5nKSB7XHJcbiAgY29uc3QgdGFiRGF0YTogYW55IHwgbnVsbCA9IENvbW1vbi50YWJKc29uO1xyXG4gIHJldHVybiAoXHJcbiAgICB0YWJEYXRhPy5BcHBPYmplY3RzLmZpbmQoKHQ6IGFueSkgPT4gdC5JRCA9PT0gaWQ/LnRvTG93ZXJDYXNlKCkpIHx8IG51bGxcclxuICApO1xyXG59XHJcblxyXG4vLyBmdW5jdGlvbiB3YWl0Rm9yRGF0YSh0aW1lb3V0ID0gNTAwMCk6IFByb21pc2U8dm9pZD4ge1xyXG4vLyAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbi8vICAgICBjb25zdCBpbnRlcnZhbCA9IDEwMDsgLy8gQ2hlY2sgZXZlcnkgMTAwbXNcclxuLy8gICAgIGxldCB3YWl0ZWQgPSAwO1xyXG5cclxuLy8gICAgIGNvbnN0IGNoZWNrRGF0YSA9ICgpID0+IHtcclxuLy8gICAgICAgaWYgKENvbW1vbi50YWJKc29uKSB7XHJcbi8vICAgICAgICAgcmVzb2x2ZSgpO1xyXG4vLyAgICAgICB9IGVsc2UgaWYgKHdhaXRlZCA+PSB0aW1lb3V0KSB7XHJcbi8vICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVGltZW91dCB3YWl0aW5nIGZvciBDb21tb24udGFiSnNvbicpKTtcclxuLy8gICAgICAgfSBlbHNlIHtcclxuLy8gICAgICAgICB3YWl0ZWQgKz0gaW50ZXJ2YWw7XHJcbi8vICAgICAgICAgc2V0VGltZW91dChjaGVja0RhdGEsIGludGVydmFsKTtcclxuLy8gICAgICAgfVxyXG4vLyAgICAgfTtcclxuXHJcbi8vICAgICBjaGVja0RhdGEoKTtcclxuLy8gICB9KTtcclxuLy8gfVxyXG5cclxuLyoqXHJcbiAqIEdldCB0aGUgQXBwT2JqZWN0IGZyb20gdGhlIERhdGFTb3VyY2VRdWVyeSBJRFxyXG4gKiBAcGFyYW0gZHNxSWQgLSBUaGUgRGF0YVNvdXJjZVF1ZXJ5IElEXHJcbiAqIEByZXR1cm5zIEFwcE9iamVjdCB8IG51bGwgLSBUaGUgZm91bmQgQXBwT2JqZWN0IG9yIG51bGxcclxuICovXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwT2JqZWN0RnJvbURhdGFTb3VyY2VRdWVyeUlEKGRzcUlkOiBzdHJpbmcpIHtcclxuICBjb25zdCB0YWJEYXRhOiBhbnkgPSBDb21tb24udGFiSnNvbjtcclxuICBpZiAoIWRzcUlkIHx8ICF0YWJEYXRhKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGZvciAoY29uc3QgYXBwT2JqZWN0IG9mIHRhYkRhdGEuQXBwT2JqZWN0cykge1xyXG4gICAgY29uc3QgZHNxID0gYXBwT2JqZWN0LkRhdGFTb3VyY2VRdWVyaWVzLmZpbmQoXHJcbiAgICAgIChsOiBhbnkpID0+IGwuSUQgPT09IGRzcUlkPy50b0xvd2VyQ2FzZSgpXHJcbiAgICApO1xyXG4gICAgaWYgKGRzcSkge1xyXG4gICAgICByZXR1cm4gYXBwT2JqZWN0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIG51bGw7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdGhlIERhdGFTb3VyY2VRdWVyeSBJRCBmcm9tIHRoZSBRdWVyeU5hbWUgYW5kIHRhYmxlXHJcbiAqIEBwYXJhbSB0YWJsZSAtIFRoZSB0YWJsZSBuYW1lXHJcbiAqIEBwYXJhbSBkc3EgLSBUaGUgRGF0YVNvdXJjZVF1ZXJ5IG5hbWVcclxuICogQHJldHVybnMgYW55IC0gVGhlIGZvdW5kIERhdGFTb3VyY2VRdWVyeVxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERzcUlERnJvbVF1ZXJ5TmFtZSh0YWJsZTogc3RyaW5nLCBkc3E6IHN0cmluZykge1xyXG4gIGNvbnN0IGFwcE9iamVjdExpc3QgPSBnZXRBcHBPYmplY3RGcm9tU3lzdGVtREJUYWJsZU5hbWUodGFibGUpO1xyXG4gIHJldHVybiBhcHBPYmplY3RMaXN0Py5EYXRhU291cmNlUXVlcmllcy5maW5kKChkOiBhbnkpID0+IGQuUXVlcnlOYW1lID09PSBkc3EpO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBEYXRhIGZyb20gdGhlIERhdGFTb3VyY2VRdWVyeSBJRFxyXG4gKlxyXG4gKiBAcGFyYW0gZHNxSWQgLSBUaGUgRGF0YVNvdXJjZVF1ZXJ5IElEXHJcbiAqIEByZXR1cm5zIGFueSAtIFRoZSBmb3VuZCBEYXRhXHJcbiAqL1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldERhdGFGcm9tRGF0YVNvdXJjZVF1ZXJ5SUQoZHNxSWQ6IHN0cmluZykge1xyXG4gIGNvbnN0IHRhYkRhdGE6IGFueSA9IENvbW1vbi50YWJKc29uO1xyXG4gIGlmICghdGFiRGF0YSkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBmb3IgKGNvbnN0IGFwcE9iamVjdCBvZiB0YWJEYXRhLkFwcE9iamVjdHMpIHtcclxuICAgIGNvbnN0IERTUSA9IGFwcE9iamVjdC5EYXRhU291cmNlUXVlcmllcy5maW5kKFxyXG4gICAgICAobDogYW55KSA9PiBsLklEID09PSBkc3FJZD8udG9Mb3dlckNhc2UoKVxyXG4gICAgKTtcclxuICAgIGlmIChEU1EpIHtcclxuICAgICAgcmV0dXJuIERTUTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcblxyXG4vKipcclxuICogU3luY2hyb25pemUgQXBwT2JqZWN0IGZpZWxkcyB3aXRoIHRoZSByZXNwb25zZVxyXG4gKlxyXG4gKiBAcGFyYW0gcmVzcG9uc2UgLSBUaGUgcmVzcG9uc2Ugb2JqZWN0XHJcbiAqIEBwYXJhbSBhcHBPYmplY3QgLSBUaGUgQXBwT2JqZWN0XHJcbiAqIEByZXR1cm5zIGFueSAtIFRoZSBzeW5jaHJvbml6ZWQgcmVzcG9uc2Ugb2JqZWN0XHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc3luY0FwcE9iamVjdEZpZWxkcyhyZXNwb25zZTogYW55LCBhcHBPYmplY3Q6IEFwcE9iamVjdCkge1xyXG4gIGZvciAoY29uc3Qga2V5IGluIHJlc3BvbnNlKSB7XHJcbiAgICBjb25zdCBmb3VuZE9iaiA9IGFwcE9iamVjdC5GaWVsZHMuZmluZCgoZjogYW55KSA9PiBmLkZpZWxkTmFtZSA9PT0ga2V5KTtcclxuICAgIGNvbnN0IGNoaWxEYXRhID0gYXBwT2JqZWN0LkNoaWxkUmVsYXRpb25TaGlwcz8ubWFwKFxyXG4gICAgICAoeCkgPT4geC5jaGlsZERldGFpbHMuTG9va3VwT2JqZWN0XHJcbiAgICApO1xyXG4gICAgaWYgKCFmb3VuZE9iaiAmJiAhKGNoaWxEYXRhICYmIGNoaWxEYXRhLnNvbWUoKHgpID0+IHguaW5jbHVkZXMoa2V5KSkpKSB7XHJcbiAgICAgIGRlbGV0ZUtleUZyb21SZXNwb25zZShyZXNwb25zZSwga2V5KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHJlc3BvbnNlO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBBcHBPYmplY3QgYmFzZWQgb24gdGhlIFN5c3RlbURCVGFibGVOYW1lXHJcbiAqXHJcbiAqIEBwYXJhbSB0YWJsZU5hbWUgLSBUaGUgU3lzdGVtREJUYWJsZU5hbWVcclxuICogQHJldHVybnMgQXBwT2JqZWN0IHwgbnVsbCAtIFRoZSBmb3VuZCBBcHBPYmplY3Qgb3IgbnVsbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldEFwcE9iamVjdEZyb21TeXN0ZW1EQlRhYmxlTmFtZSh0YWJsZU5hbWU6IHN0cmluZykge1xyXG4gIGNvbnN0IHRhYkRhdGE6IGFueSA9IENvbW1vbi50YWJKc29uO1xyXG4gIHJldHVybiAoXHJcbiAgICB0YWJEYXRhPy5BcHBPYmplY3RzLmZpbmQoXHJcbiAgICAgICh0OiB7IFN5c3RlbURCVGFibGVOYW1lOiBzdHJpbmcgfSkgPT4gdC5TeXN0ZW1EQlRhYmxlTmFtZSA9PT0gdGFibGVOYW1lXHJcbiAgICApIHx8IG51bGxcclxuICApO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IHRoZSBmaWVsZHMgYmFzZWQgb24gdGhlIGFwcG9iamVjdGlkXHJcbiAqXHJcbiAqIEBwYXJhbSBhcHBPYmplY3RJZCAtIFRoZSBhcHBvYmplY3RpZFxyXG4gKiBAcmV0dXJucyBBcHBPYmplY3QgfCBudWxsIC0gVGhlIGZvdW5kIEFwcE9iamVjdCBvciBudWxsXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwZmllbGRzRnJvbUFwcE9iamVjdElkKGFwcE9iamVjdElkOiBzdHJpbmcpIHtcclxuICBjb25zdCB0YWJEYXRhOiBhbnkgPSBDb21tb24udGFiSnNvbjtcclxuICBjb25zdCBmaW5kQXBwT2JqZWN0ID1cclxuICAgIHRhYkRhdGE/LkFwcE9iamVjdHMuZmluZCgodDogYW55KSA9PiB0LklEID09PSBhcHBPYmplY3RJZCkgfHwgbnVsbDtcclxuICBpZiAoZmluZEFwcE9iamVjdCkge1xyXG4gICAgcmV0dXJuIGZpbmRBcHBPYmplY3QuRmllbGRzO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRMb29rdXBBcHBmaWVsZHNGcm9tQXBwT2JqZWN0SWQoYXBwT2JqZWN0SWQ6IHN0cmluZykge1xyXG4gIGNvbnN0IHRhYkRhdGE6IGFueSA9IENvbW1vbi50YWJKc29uO1xyXG4gIGNvbnN0IGZpbmRBcHBPYmplY3QgPVxyXG4gICAgdGFiRGF0YT8uQXBwT2JqZWN0cy5maW5kKCh0OiBhbnkpID0+IHQuSUQgPT09IGFwcE9iamVjdElkKSB8fCBudWxsO1xyXG4gIGlmIChmaW5kQXBwT2JqZWN0KSB7XHJcbiAgICBjb25zdCBsb29rdXBGaWVsZHMgPSBmaW5kQXBwT2JqZWN0LkZpZWxkcy5maWx0ZXIoXHJcbiAgICAgICh0OiBhbnkpID0+IHQuTG9va1VwRGV0YWlsc1xyXG4gICAgKTtcclxuICAgIGlmIChsb29rdXBGaWVsZHMpIHtcclxuICAgICAgcmV0dXJuIGxvb2t1cEZpZWxkcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld0FwcE9iamVjdERldGFpbHNGcm9tRFNRSUQoZHNxSUQ6IHN0cmluZykge1xyXG4gIGNvbnN0IGFwcE9iamVjdCA9IGdldEFwcE9iamVjdEZyb21EYXRhU291cmNlUXVlcnlJRChkc3FJRCk7XHJcbiAgbGV0IHZpZXdBcHBPYmplY3REZXRhaWxzT2ZHcmlkID0gYXBwT2JqZWN0O1xyXG4gIC8vIGNoZWNrIGFwcG9iamVjdCBpcyB0YWJsZSBvciB2aWV3XHJcbiAgaWYgKGFwcE9iamVjdCAmJiBhcHBPYmplY3QuT2JqZWN0VHlwZSA9PSAyKSB7XHJcbiAgICB2aWV3QXBwT2JqZWN0RGV0YWlsc09mR3JpZCA9IGdldEFwcE9iamVjdChhcHBPYmplY3Q/LkNSVURBcHBPYmplY3RJZCk7XHJcbiAgfVxyXG4gIHJldHVybiB2aWV3QXBwT2JqZWN0RGV0YWlsc09mR3JpZDtcclxufVxyXG5cclxuLyoqXHJcbiAqIFJldHJpZXZlcyBhbGwgYXBwT2JqZWN0cyBhbmQgdGhlaXIgRFNRcyBpbiBhIHNpbmdsZSBsaXN0XHJcbiAqIHN1aXRhYmxlIGZvciB0cmVlIHZpZXcgcmVwcmVzZW50YXRpb24uXHJcbiAqIEBhdXRob3IgOiBQYXJ0aCBCIFRoYWtrYXJcclxuICogQFVzYWdlIDogSFRUUCBSZXF1ZXN0XHJcbiAqIEByZXR1cm5zIEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBoYXNDaGlsZHJlbjogYm9vbGVhbjsgcGFyZW50SUQ6IHN0cmluZyB8IG51bGwgfT5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxBcHBPYmplY3RzRm9yVHJlZVZpZXdKc29uKCkge1xyXG4gIGNvbnN0IHRhYkRhdGEgPSBDb21tb24udGFiSnNvbjtcclxuXHJcbiAgY29uc3QgZmllbGREYXRhOiBBcnJheTx7XHJcbiAgICBpZDogc3RyaW5nOyAvLyBVVUlEIGFzIGEgc3RyaW5nXHJcbiAgICBuYW1lOiBzdHJpbmc7IC8vIE5hbWUgb2YgdGhlIG5vZGVcclxuICAgIGhhc0NoaWxkcmVuOiBib29sZWFuOyAvLyBXaGV0aGVyIHRoZSBub2RlIGhhcyBjaGlsZHJlblxyXG4gICAgcGFyZW50SUQ6IHN0cmluZyB8IG51bGw7IC8vIFBhcmVudCBJRCBpZiBhcHBsaWNhYmxlLCBvdGhlcndpc2UgbnVsbFxyXG4gIH0+ID0gW107XHJcbiAgZm9yIChjb25zdCBhcHBPYmplY3Qgb2YgdGFiRGF0YT8uQXBwT2JqZWN0cyB8fCBbXSkge1xyXG4gICAgZmllbGREYXRhLnB1c2goe1xyXG4gICAgICBpZDogYXBwT2JqZWN0LklELFxyXG4gICAgICBuYW1lOiBhcHBPYmplY3QuRGlzcGxheU5hbWUsXHJcbiAgICAgIGhhc0NoaWxkcmVuOiB0cnVlLFxyXG4gICAgICBwYXJlbnRJRDogbnVsbCxcclxuICAgIH0pO1xyXG4gICAgLy8gbG9vcGluZyBjaGlsZHJlblxyXG4gICAgZm9yIChjb25zdCBkc3Egb2YgYXBwT2JqZWN0LkRhdGFTb3VyY2VRdWVyaWVzKSB7XHJcbiAgICAgIGZpZWxkRGF0YS5wdXNoKHtcclxuICAgICAgICBpZDogZHNxLklELFxyXG4gICAgICAgIG5hbWU6IGRzcS5EaXNwbGF5TmFtZSxcclxuICAgICAgICBoYXNDaGlsZHJlbjogZmFsc2UsXHJcbiAgICAgICAgcGFyZW50SUQ6IGFwcE9iamVjdC5JRCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmaWVsZERhdGEuc29ydCgoYSwgYikgPT5cclxuICAgIGEubmFtZS50b0xvd2VyQ2FzZSgpID4gYi5uYW1lLnRvTG93ZXJDYXNlKCkgPyAxIDogLTFcclxuICApO1xyXG59XHJcbiJdfQ==
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWFwcC51dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9kYXRhLWFjY2Vzcy9zcmMvbGliL3RhYi1jb3JlLXV0aWxpdHkvYXBwL3V0aWxzL3RhYi1hcHAudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsUUFBYSxFQUFFLFNBQW9CO0lBQ3JFLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDeEUsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNuQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEUscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcE9iamVjdCB9IGZyb20gJy4uL21vZGVscy9hcHAtb2JqZWN0LmNsYXNzJztcclxuaW1wb3J0IHsgZGVsZXRlS2V5RnJvbVJlc3BvbnNlIH0gZnJvbSAnLi9yZXEtcmVzLnV0aWwnO1xyXG5cclxuLyoqXHJcbiAqIFN5bmNocm9uaXplIEFwcE9iamVjdCBmaWVsZHMgd2l0aCB0aGUgcmVzcG9uc2VcclxuICpcclxuICogQHBhcmFtIHJlc3BvbnNlIC0gVGhlIHJlc3BvbnNlIG9iamVjdFxyXG4gKiBAcGFyYW0gYXBwT2JqZWN0IC0gVGhlIEFwcE9iamVjdFxyXG4gKiBAcmV0dXJucyBhbnkgLSBUaGUgc3luY2hyb25pemVkIHJlc3BvbnNlIG9iamVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHN5bmNBcHBPYmplY3RGaWVsZHMocmVzcG9uc2U6IGFueSwgYXBwT2JqZWN0OiBBcHBPYmplY3QpIHtcclxuICBmb3IgKGNvbnN0IGtleSBpbiByZXNwb25zZSkge1xyXG4gICAgY29uc3QgZm91bmRPYmogPSBhcHBPYmplY3QuRmllbGRzLmZpbmQoKGY6IGFueSkgPT4gZi5GaWVsZE5hbWUgPT09IGtleSk7XHJcbiAgICBjb25zdCBjaGlsRGF0YSA9IGFwcE9iamVjdC5DaGlsZFJlbGF0aW9uU2hpcHM/Lm1hcChcclxuICAgICAgKHgpID0+IHguY2hpbGREZXRhaWxzLkxvb2t1cE9iamVjdFxyXG4gICAgKTtcclxuICAgIGlmICghZm91bmRPYmogJiYgIShjaGlsRGF0YSAmJiBjaGlsRGF0YS5zb21lKCh4KSA9PiB4LmluY2x1ZGVzKGtleSkpKSkge1xyXG4gICAgICBkZWxldGVLZXlGcm9tUmVzcG9uc2UocmVzcG9uc2UsIGtleSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiByZXNwb25zZTtcclxufSJdfQ==
@@ -1,7 +1,10 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { Injectable, inject } from '@angular/core';
3
3
  import { HttpClient, HttpParams } from '@angular/common/http';
4
+ import { map } from 'rxjs/operators';
4
5
  import { API_URL } from './api-url.token';
6
+ import { Common } from '../../app/constants/common';
7
+ import { ResponseAdapter } from '../../app/helpers/response.adapter';
5
8
  import * as i0 from "@angular/core";
6
9
  export class ApiService {
7
10
  constructor() {
@@ -121,6 +124,65 @@ export class ApiService {
121
124
  deleteByUrl(url, options) {
122
125
  return this.http.delete(url, { ...options });
123
126
  }
127
+ // ==================== NEW MICROSERVICE METHODS ====================
128
+ /**
129
+ * Makes an HTTP GET request to a specific microservice
130
+ * @param serviceName - Name of the microservice (e.g., 'crudService', 'metadataService')
131
+ * @param endPointName - Endpoint path relative to the service
132
+ * @param params - Query parameters for the request
133
+ * @param reqHeader - Custom headers for the request
134
+ * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
135
+ */
136
+ getFromService(serviceName, endPointName, params = new HttpParams(), reqHeader) {
137
+ const serviceUrl = Common.apiServiceUrls[serviceName];
138
+ return this.http.get(`${serviceUrl}${endPointName}`, {
139
+ headers: reqHeader,
140
+ params,
141
+ }).pipe(map(response => ResponseAdapter.normalize(response)));
142
+ }
143
+ /**
144
+ * Makes an HTTP POST request to a specific microservice
145
+ * @param serviceName - Name of the microservice (e.g., 'crudService', 'formioService')
146
+ * @param endPointName - Endpoint path relative to the service
147
+ * @param data - Data to send with the request
148
+ * @param reqHeader - Custom headers for the request
149
+ * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
150
+ */
151
+ postToService(serviceName, endPointName, data, reqHeader) {
152
+ const serviceUrl = Common.apiServiceUrls[serviceName];
153
+ return this.http.post(`${serviceUrl}${endPointName}`, JSON.stringify(data), {
154
+ headers: reqHeader,
155
+ }).pipe(map(response => ResponseAdapter.normalize(response)));
156
+ }
157
+ /**
158
+ * Makes an HTTP PUT request to a specific microservice
159
+ * @param serviceName - Name of the microservice
160
+ * @param endPointName - Endpoint path relative to the service
161
+ * @param data - Data to send with the request
162
+ * @param reqHeader - Custom headers for the request
163
+ * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
164
+ */
165
+ putToService(serviceName, endPointName, data, reqHeader) {
166
+ const serviceUrl = Common.apiServiceUrls[serviceName];
167
+ return this.http.put(`${serviceUrl}${endPointName}`, JSON.stringify(data), {
168
+ headers: reqHeader,
169
+ }).pipe(map(response => ResponseAdapter.normalize(response)));
170
+ }
171
+ /**
172
+ * Makes an HTTP DELETE request to a specific microservice
173
+ * @param serviceName - Name of the microservice
174
+ * @param endPointName - Endpoint path relative to the service
175
+ * @param data - Data to send with the request (optional, for DELETE with body)
176
+ * @param reqHeader - Custom headers for the request
177
+ * @returns An Observable emitting the response data (auto-normalized to CommonApiResponse format)
178
+ */
179
+ deleteFromService(serviceName, endPointName, data, reqHeader) {
180
+ const serviceUrl = Common.apiServiceUrls[serviceName];
181
+ return this.http.delete(`${serviceUrl}${endPointName}`, {
182
+ headers: reqHeader,
183
+ body: data ? JSON.stringify(data) : undefined
184
+ }).pipe(map(response => ResponseAdapter.normalize(response)));
185
+ }
124
186
  static { this.ɵfac = function ApiService_Factory(t) { return new (t || ApiService)(); }; }
125
187
  static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ApiService, factory: ApiService.ɵfac, providedIn: 'root' }); }
126
188
  }
@@ -128,4 +190,4 @@ export class ApiService {
128
190
  type: Injectable,
129
191
  args: [{ providedIn: 'root' }]
130
192
  }], null, null); })();
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2RhdGEtYWNjZXNzL3NyYy9saWIvdGFiLWNvcmUtdXRpbGl0eS9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFHMUMsTUFBTSxPQUFPLFVBQVU7SUFEdkI7UUFFbUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixZQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBd0o1QztJQXRKQzs7Ozs7O09BTUc7SUFDSCxHQUFHLENBQ0QsWUFBb0IsRUFDcEIsU0FBcUIsSUFBSSxVQUFVLEVBQUUsRUFDckMsU0FBdUI7UUFFdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFLEVBQUU7WUFDeEQsT0FBTyxFQUFFLFNBQVM7WUFDbEIsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQ0YsWUFBb0IsRUFDcEIsSUFBUSxFQUNSLFNBQXVCO1FBRXZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ25CLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLEVBQUUsRUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFDcEI7WUFDRSxPQUFPLEVBQUUsU0FBUztTQUNuQixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsR0FBRyxDQUNELFlBQW9CLEVBQ3BCLElBQU8sRUFDUCxTQUF1QjtRQUV2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNsQixHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFLEVBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ3BCO1lBQ0UsT0FBTyxFQUFFLFNBQVM7U0FDbkIsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFJLFlBQW9CLEVBQUUsU0FBdUI7UUFDckQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFLEVBQUU7WUFDM0QsT0FBTyxFQUFFLFNBQVM7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE9BQU8sQ0FDTCxZQUFvQixFQUNwQixTQUFxQixJQUFJLFVBQVUsRUFBRSxFQUNyQyxTQUF1QjtRQUV2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxZQUFZLEVBQUUsRUFBRTtZQUN4RCxPQUFPLEVBQUUsU0FBUztZQUNsQixNQUFNO1lBQ04sWUFBWSxFQUFFLE1BQWdCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxRQUFRLENBQ04sWUFBb0IsRUFDcEIsSUFBUSxFQUNSLFNBQXVCO1FBRXZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksRUFBRSxFQUFFLElBQUksRUFBRTtZQUMvRCxPQUFPLEVBQUUsU0FBUztZQUNsQixZQUFZLEVBQUUsTUFBZ0I7U0FDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFJLEdBQVcsRUFBRSxPQUFhO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUksR0FBRyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxTQUFTLENBQU8sR0FBVyxFQUFFLElBQVEsRUFBRSxPQUFhO1FBQ2xELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVEsQ0FBTyxHQUFXLEVBQUUsSUFBUSxFQUFFLE9BQWE7UUFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUksR0FBVyxFQUFFLE9BQWE7UUFDdkMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBSSxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQzsyRUF6SlUsVUFBVTt1RUFBVixVQUFVLFdBQVYsVUFBVSxtQkFERyxNQUFNOztpRkFDbkIsVUFBVTtjQUR0QixVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcywgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQVBJX1VSTCB9IGZyb20gJy4vYXBpLXVybC50b2tlbic7XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZSB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBodHRwID0gaW5qZWN0KEh0dHBDbGllbnQpO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpX3VybCA9IGluamVjdChBUElfVVJMKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZXMgYW4gSFRUUCBHRVQgcmVxdWVzdCB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSBUaGUgVVJMIGZvciB0aGUgSFRUUCBHRVQgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcmVxdWVzdCAoZGVmYXVsdCBpcyBhbiBlbXB0eSBIdHRwUGFyYW1zIG9iamVjdCkuXHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciBUaGUgY3VzdG9tIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2UgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICovXHJcbiAgZ2V0PFQ+KFxyXG4gICAgZW5kUG9pbnROYW1lOiBzdHJpbmcsXHJcbiAgICBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLFxyXG4gICAgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnNcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4oYCR7dGhpcy5hcGlfdXJsfSR7ZW5kUG9pbnROYW1lfWAsIHtcclxuICAgICAgaGVhZGVyczogcmVxSGVhZGVyLFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgUE9TVCByZXF1ZXN0IHRvIHNlbmQgZGF0YSB0byB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgKiBAcGFyYW0gZW5kUG9pbnROYW1lIFRoZSBVUkwgZm9yIHRoZSBIVFRQIFBPU1QgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBzZW5kIHdpdGggdGhlIHJlcXVlc3QgKG9wdGlvbmFsKS5cclxuICAgKiBAcGFyYW0gcmVxSGVhZGVyIFRoZSBjdXN0b20gaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QgKG9wdGlvbmFsKS5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBkYXRhIG9mIHR5cGUgVC5cclxuICAgKi9cclxuICBwb3N0PFQsIEQ+KFxyXG4gICAgZW5kUG9pbnROYW1lOiBzdHJpbmcsXHJcbiAgICBkYXRhPzogRCxcclxuICAgIHJlcUhlYWRlcj86IEh0dHBIZWFkZXJzXHJcbiAgKTogT2JzZXJ2YWJsZTxEIHwgYW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4oXHJcbiAgICAgIGAke3RoaXMuYXBpX3VybH0ke2VuZFBvaW50TmFtZX1gLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcixcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgUFVUIHJlcXVlc3QgdG8gdXBkYXRlIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSBUaGUgVVJMIGZvciB0aGUgSFRUUCBQVVQgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBzZW5kIHdpdGggdGhlIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciBUaGUgY3VzdG9tIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2UgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICovXHJcbiAgcHV0PFQsIEQ+KFxyXG4gICAgZW5kUG9pbnROYW1lOiBzdHJpbmcsXHJcbiAgICBkYXRhOiBELFxyXG4gICAgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnNcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8VD4oXHJcbiAgICAgIGAke3RoaXMuYXBpX3VybH0ke2VuZFBvaW50TmFtZX1gLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKSxcclxuICAgICAge1xyXG4gICAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcixcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgREVMRVRFIHJlcXVlc3QgdG8gZGVsZXRlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgKiBAcGFyYW0gZW5kUG9pbnROYW1lIFRoZSBVUkwgZm9yIHRoZSBIVFRQIERFTEVURSByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSByZXFIZWFkZXIgVGhlIGN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIGRlbGV0ZTxUPihlbmRQb2ludE5hbWU6IHN0cmluZywgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8VD4oYCR7dGhpcy5hcGlfdXJsfSR7ZW5kUG9pbnROYW1lfWAsIHtcclxuICAgICAgaGVhZGVyczogcmVxSGVhZGVyLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIEdFVCByZXF1ZXN0IHRvIHJldHJpZXZlIGJsb2IgZGF0YSB3aXRoIGN1c3RvbSBoZWFkZXJzLlxyXG4gICAqIEBwYXJhbSBlbmRQb2ludE5hbWUgVGhlIFVSTCBmb3IgdGhlIEhUVFAgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIGZvciB0aGUgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gcmVxSGVhZGVyIFRoZSBjdXN0b20gaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2UgYXMgYSBCbG9iLlxyXG4gICAqL1xyXG4gIGdldEJsb2I8VD4oXHJcbiAgICBlbmRQb2ludE5hbWU6IHN0cmluZyxcclxuICAgIHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCksXHJcbiAgICByZXFIZWFkZXI/OiBIdHRwSGVhZGVyc1xyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPihgJHt0aGlzLmFwaV91cmx9JHtlbmRQb2ludE5hbWV9YCwge1xyXG4gICAgICBoZWFkZXJzOiByZXFIZWFkZXIsXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIFBPU1QgcmVxdWVzdCB0byBzZW5kIGRhdGEgYW5kIHJldHJpZXZlIGJsb2IgZGF0YSB3aXRoIGN1c3RvbSBoZWFkZXJzLlxyXG4gICAqIEBwYXJhbSBlbmRQb2ludE5hbWUgVGhlIFVSTCBmb3IgdGhlIEhUVFAgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBzZW5kIHdpdGggdGhlIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciBUaGUgY3VzdG9tIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGFzIGEgQmxvYi5cclxuICAgKi9cclxuICBwb3N0QmxvYjxULCBEPihcclxuICAgIGVuZFBvaW50TmFtZTogc3RyaW5nLFxyXG4gICAgZGF0YT86IEQsXHJcbiAgICByZXFIZWFkZXI/OiBIdHRwSGVhZGVyc1xyXG4gICk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8VD4oYCR7dGhpcy5hcGlfdXJsfSR7ZW5kUG9pbnROYW1lfWAsIGRhdGEsIHtcclxuICAgICAgaGVhZGVyczogcmVxSGVhZGVyLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdibG9iJyBhcyAnanNvbicsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgR0VUIHJlcXVlc3QgdG8gcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBmb3IgdGhlIEhUVFAgR0VUIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGN1c3RvbSBvcHRpb25zIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIGdldEJ5VXJsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KHVybCwgeyAuLi5vcHRpb25zIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZXMgYW4gSFRUUCBQT1NUIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIHVybCBUaGUgVVJMIGZvciB0aGUgSFRUUCBQT1NUIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGN1c3RvbSBvcHRpb25zIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIHBvc3RCeVVybDxULCBEPih1cmw6IHN0cmluZywgZGF0YT86IEQsIG9wdGlvbnM/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFQ+KHVybCwgSlNPTi5zdHJpbmdpZnkoZGF0YSksIHsgLi4ub3B0aW9ucyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgUFVUIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIHVybCBUaGUgVVJMIGZvciB0aGUgSFRUUCBQVVQgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBzZW5kIHdpdGggdGhlIHJlcXVlc3QgKG9wdGlvbmFsKS5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgY3VzdG9tIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2UgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICovXHJcbiAgcHV0QnlVcmw8VCwgRD4odXJsOiBzdHJpbmcsIGRhdGE/OiBELCBvcHRpb25zPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFQ+KHVybCwgSlNPTi5zdHJpbmdpZnkoZGF0YSksIHsgLi4ub3B0aW9ucyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgREVMRVRFIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIHVybCBUaGUgVVJMIGZvciB0aGUgSFRUUCBERUxFVEUgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgY3VzdG9tIG9wdGlvbnMgZm9yIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2UgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICovXHJcbiAgZGVsZXRlQnlVcmw8VD4odXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5kZWxldGU8VD4odXJsLCB7IC4uLm9wdGlvbnMgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2RhdGEtYWNjZXNzL3NyYy9saWIvdGFiLWNvcmUtdXRpbGl0eS9jb3JlL2h0dHAtY2xpZW50L2FwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7QUFHckUsTUFBTSxPQUFPLFVBQVU7SUFEdkI7UUFFbUIsU0FBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQixZQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBNFA1QztJQTFQQzs7Ozs7O09BTUc7SUFDSCxHQUFHLENBQ0QsWUFBb0IsRUFDcEIsU0FBcUIsSUFBSSxVQUFVLEVBQUUsRUFDckMsU0FBdUI7UUFFdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxFQUFFLEVBQUU7WUFDeEQsT0FBTyxFQUFFLFNBQVM7WUFDbEIsTUFBTTtTQUNQLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLENBQ0YsWUFBb0IsRUFDcEIsSUFBUSxFQUNSLFNBQXVCO1FBRXZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJ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QUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLENBQ2YsV0FBMkIsRUFDM0IsWUFBb0IsRUFDcEIsSUFBUSxFQUNSLFNBQXVCO1FBRXZCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBc0IsR0FBRyxVQUFVLEdBQUcsWUFBWSxFQUFFLEVBQUU7WUFDM0UsT0FBTyxFQUFFLFNBQVM7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUM5QyxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FDckQsQ0FBQztJQUNKLENBQUM7MkVBN1BVLFVBQVU7dUVBQVYsVUFBVSxXQUFWLFVBQVUsbUJBREcsTUFBTTs7aUZBQ25CLFVBQVU7Y0FEdEIsVUFBVTtlQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBQYXJhbXMsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQVBJX1VSTCB9IGZyb20gJy4vYXBpLXVybC50b2tlbic7XHJcbmltcG9ydCB7IENvbW1vbiB9IGZyb20gJy4uLy4uL2FwcC9jb25zdGFudHMvY29tbW9uJztcclxuaW1wb3J0IHsgQVBJU2VydmljZU5hbWUsIENvbW1vbkFwaVJlc3BvbnNlLCBTdGFuZGFyZEFwaVJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBwL2ludGVyZmFjZXMvY29tbW9uLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IFJlc3BvbnNlQWRhcHRlciB9IGZyb20gJy4uLy4uL2FwcC9oZWxwZXJzL3Jlc3BvbnNlLmFkYXB0ZXInO1xyXG5cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcclxuZXhwb3J0IGNsYXNzIEFwaVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgaHR0cCA9IGluamVjdChIdHRwQ2xpZW50KTtcclxuICBwcml2YXRlIHJlYWRvbmx5IGFwaV91cmwgPSBpbmplY3QoQVBJX1VSTCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgR0VUIHJlcXVlc3QgdG8gcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAqIEBwYXJhbSBlbmRQb2ludE5hbWUgVGhlIFVSTCBmb3IgdGhlIEhUVFAgR0VUIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhlIHJlcXVlc3QgKGRlZmF1bHQgaXMgYW4gZW1wdHkgSHR0cFBhcmFtcyBvYmplY3QpLlxyXG4gICAqIEBwYXJhbSByZXFIZWFkZXIgVGhlIGN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIGdldDxUPihcclxuICAgIGVuZFBvaW50TmFtZTogc3RyaW5nLFxyXG4gICAgcGFyYW1zOiBIdHRwUGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKSxcclxuICAgIHJlcUhlYWRlcj86IEh0dHBIZWFkZXJzXHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFQ+KGAke3RoaXMuYXBpX3VybH0ke2VuZFBvaW50TmFtZX1gLCB7XHJcbiAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcixcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIFBPU1QgcmVxdWVzdCB0byBzZW5kIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSBUaGUgVVJMIGZvciB0aGUgSFRUUCBQT1NUIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciBUaGUgY3VzdG9tIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBlbWl0dGluZyB0aGUgcmVzcG9uc2UgZGF0YSBvZiB0eXBlIFQuXHJcbiAgICovXHJcbiAgcG9zdDxULCBEPihcclxuICAgIGVuZFBvaW50TmFtZTogc3RyaW5nLFxyXG4gICAgZGF0YT86IEQsXHJcbiAgICByZXFIZWFkZXI/OiBIdHRwSGVhZGVyc1xyXG4gICk6IE9ic2VydmFibGU8RCB8IGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFQ+KFxyXG4gICAgICBgJHt0aGlzLmFwaV91cmx9JHtlbmRQb2ludE5hbWV9YCxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXJzOiByZXFIZWFkZXIsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIFBVVCByZXF1ZXN0IHRvIHVwZGF0ZSBkYXRhIGF0IHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAqIEBwYXJhbSBlbmRQb2ludE5hbWUgVGhlIFVSTCBmb3IgdGhlIEhUVFAgUFVUIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSByZXFIZWFkZXIgVGhlIGN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIHB1dDxULCBEPihcclxuICAgIGVuZFBvaW50TmFtZTogc3RyaW5nLFxyXG4gICAgZGF0YTogRCxcclxuICAgIHJlcUhlYWRlcj86IEh0dHBIZWFkZXJzXHJcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFQ+KFxyXG4gICAgICBgJHt0aGlzLmFwaV91cmx9JHtlbmRQb2ludE5hbWV9YCxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoZGF0YSksXHJcbiAgICAgIHtcclxuICAgICAgICBoZWFkZXJzOiByZXFIZWFkZXIsXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIERFTEVURSByZXF1ZXN0IHRvIGRlbGV0ZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSBUaGUgVVJMIGZvciB0aGUgSFRUUCBERUxFVEUgcmVxdWVzdC5cclxuICAgKiBAcGFyYW0gcmVxSGVhZGVyIFRoZSBjdXN0b20gaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QgKG9wdGlvbmFsKS5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBkYXRhIG9mIHR5cGUgVC5cclxuICAgKi9cclxuICBkZWxldGU8VD4oZW5kUG9pbnROYW1lOiBzdHJpbmcsIHJlcUhlYWRlcj86IEh0dHBIZWFkZXJzKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KGAke3RoaXMuYXBpX3VybH0ke2VuZFBvaW50TmFtZX1gLCB7XHJcbiAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZXMgYW4gSFRUUCBHRVQgcmVxdWVzdCB0byByZXRyaWV2ZSBibG9iIGRhdGEgd2l0aCBjdXN0b20gaGVhZGVycy5cclxuICAgKiBAcGFyYW0gZW5kUG9pbnROYW1lIFRoZSBVUkwgZm9yIHRoZSBIVFRQIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIHBhcmFtcyBUaGUgcXVlcnkgcGFyYW1ldGVycyBmb3IgdGhlIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciBUaGUgY3VzdG9tIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0LlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGFzIGEgQmxvYi5cclxuICAgKi9cclxuICBnZXRCbG9iPFQ+KFxyXG4gICAgZW5kUG9pbnROYW1lOiBzdHJpbmcsXHJcbiAgICBwYXJhbXM6IEh0dHBQYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpLFxyXG4gICAgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnNcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8VD4oYCR7dGhpcy5hcGlfdXJsfSR7ZW5kUG9pbnROYW1lfWAsIHtcclxuICAgICAgaGVhZGVyczogcmVxSGVhZGVyLFxyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InIGFzICdqc29uJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWFrZXMgYW4gSFRUUCBQT1NUIHJlcXVlc3QgdG8gc2VuZCBkYXRhIGFuZCByZXRyaWV2ZSBibG9iIGRhdGEgd2l0aCBjdXN0b20gaGVhZGVycy5cclxuICAgKiBAcGFyYW0gZW5kUG9pbnROYW1lIFRoZSBVUkwgZm9yIHRoZSBIVFRQIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSByZXFIZWFkZXIgVGhlIGN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdC5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBhcyBhIEJsb2IuXHJcbiAgICovXHJcbiAgcG9zdEJsb2I8VCwgRD4oXHJcbiAgICBlbmRQb2ludE5hbWU6IHN0cmluZyxcclxuICAgIGRhdGE/OiBELFxyXG4gICAgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnNcclxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFQ+KGAke3RoaXMuYXBpX3VybH0ke2VuZFBvaW50TmFtZX1gLCBkYXRhLCB7XHJcbiAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcixcclxuICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicgYXMgJ2pzb24nLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIEdFVCByZXF1ZXN0IHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgKiBAcGFyYW0gdXJsIFRoZSBVUkwgZm9yIHRoZSBIVFRQIEdFVCByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBjdXN0b20gb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3QgKG9wdGlvbmFsKS5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBkYXRhIG9mIHR5cGUgVC5cclxuICAgKi9cclxuICBnZXRCeVVybDxUPih1cmw6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxUPih1cmwsIHsgLi4ub3B0aW9ucyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgUE9TVCByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBmb3IgdGhlIEhUVFAgUE9TVCByZXF1ZXN0LlxyXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIHNlbmQgd2l0aCB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBjdXN0b20gb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3QgKG9wdGlvbmFsKS5cclxuICAgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIGVtaXR0aW5nIHRoZSByZXNwb25zZSBkYXRhIG9mIHR5cGUgVC5cclxuICAgKi9cclxuICBwb3N0QnlVcmw8VCwgRD4odXJsOiBzdHJpbmcsIGRhdGE/OiBELCBvcHRpb25zPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxUPih1cmwsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB7IC4uLm9wdGlvbnMgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIFBVVCByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBmb3IgdGhlIEhUVFAgUFVUIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0IChvcHRpb25hbCkuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGN1c3RvbSBvcHRpb25zIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIHB1dEJ5VXJsPFQsIEQ+KHVybDogc3RyaW5nLCBkYXRhPzogRCwgb3B0aW9ucz86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnB1dDxUPih1cmwsIEpTT04uc3RyaW5naWZ5KGRhdGEpLCB7IC4uLm9wdGlvbnMgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIERFTEVURSByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBmb3IgdGhlIEhUVFAgREVMRVRFIHJlcXVlc3QuXHJcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIGN1c3RvbSBvcHRpb25zIGZvciB0aGUgcmVxdWVzdCAob3B0aW9uYWwpLlxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgb2YgdHlwZSBULlxyXG4gICAqL1xyXG4gIGRlbGV0ZUJ5VXJsPFQ+KHVybDogc3RyaW5nLCBvcHRpb25zPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFQ+KHVybCwgeyAuLi5vcHRpb25zIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT0gTkVXIE1JQ1JPU0VSVklDRSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgR0VUIHJlcXVlc3QgdG8gYSBzcGVjaWZpYyBtaWNyb3NlcnZpY2VcclxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgLSBOYW1lIG9mIHRoZSBtaWNyb3NlcnZpY2UgKGUuZy4sICdjcnVkU2VydmljZScsICdtZXRhZGF0YVNlcnZpY2UnKVxyXG4gICAqIEBwYXJhbSBlbmRQb2ludE5hbWUgLSBFbmRwb2ludCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0XHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciAtIEN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgKGF1dG8tbm9ybWFsaXplZCB0byBDb21tb25BcGlSZXNwb25zZSBmb3JtYXQpXHJcbiAgICovXHJcbiAgZ2V0RnJvbVNlcnZpY2UoXHJcbiAgICBzZXJ2aWNlTmFtZTogQVBJU2VydmljZU5hbWUsXHJcbiAgICBlbmRQb2ludE5hbWU6IHN0cmluZyxcclxuICAgIHBhcmFtczogSHR0cFBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCksXHJcbiAgICByZXFIZWFkZXI/OiBIdHRwSGVhZGVyc1xyXG4gICk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VVcmwgPSBDb21tb24uYXBpU2VydmljZVVybHNbc2VydmljZU5hbWVdO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U3RhbmRhcmRBcGlSZXNwb25zZT4oYCR7c2VydmljZVVybH0ke2VuZFBvaW50TmFtZX1gLCB7XHJcbiAgICAgIGhlYWRlcnM6IHJlcUhlYWRlcixcclxuICAgICAgcGFyYW1zLFxyXG4gICAgfSkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IFJlc3BvbnNlQWRhcHRlci5ub3JtYWxpemUocmVzcG9uc2UpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIGFuIEhUVFAgUE9TVCByZXF1ZXN0IHRvIGEgc3BlY2lmaWMgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWljcm9zZXJ2aWNlIChlLmcuLCAnY3J1ZFNlcnZpY2UnLCAnZm9ybWlvU2VydmljZScpXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSAtIEVuZHBvaW50IHBhdGggcmVsYXRpdmUgdG8gdGhlIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0XHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciAtIEN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgKGF1dG8tbm9ybWFsaXplZCB0byBDb21tb25BcGlSZXNwb25zZSBmb3JtYXQpXHJcbiAgICovXHJcbiAgcG9zdFRvU2VydmljZTxULCBEPihcclxuICAgIHNlcnZpY2VOYW1lOiBBUElTZXJ2aWNlTmFtZSxcclxuICAgIGVuZFBvaW50TmFtZTogc3RyaW5nLFxyXG4gICAgZGF0YT86IEQsXHJcbiAgICByZXFIZWFkZXI/OiBIdHRwSGVhZGVyc1xyXG4gICk6IE9ic2VydmFibGU8Q29tbW9uQXBpUmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VVcmwgPSBDb21tb24uYXBpU2VydmljZVVybHNbc2VydmljZU5hbWVdO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PFN0YW5kYXJkQXBpUmVzcG9uc2U+KFxyXG4gICAgICBgJHtzZXJ2aWNlVXJsfSR7ZW5kUG9pbnROYW1lfWAsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczogcmVxSGVhZGVyLFxyXG4gICAgICB9XHJcbiAgICApLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiBSZXNwb25zZUFkYXB0ZXIubm9ybWFsaXplKHJlc3BvbnNlKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIFBVVCByZXF1ZXN0IHRvIGEgc3BlY2lmaWMgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSAtIEVuZHBvaW50IHBhdGggcmVsYXRpdmUgdG8gdGhlIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0XHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciAtIEN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgKGF1dG8tbm9ybWFsaXplZCB0byBDb21tb25BcGlSZXNwb25zZSBmb3JtYXQpXHJcbiAgICovXHJcbiAgcHV0VG9TZXJ2aWNlPFQsIEQ+KFxyXG4gICAgc2VydmljZU5hbWU6IEFQSVNlcnZpY2VOYW1lLFxyXG4gICAgZW5kUG9pbnROYW1lOiBzdHJpbmcsXHJcbiAgICBkYXRhOiBELFxyXG4gICAgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnNcclxuICApOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBzZXJ2aWNlVXJsID0gQ29tbW9uLmFwaVNlcnZpY2VVcmxzW3NlcnZpY2VOYW1lXTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PFN0YW5kYXJkQXBpUmVzcG9uc2U+KFxyXG4gICAgICBgJHtzZXJ2aWNlVXJsfSR7ZW5kUG9pbnROYW1lfWAsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRhdGEpLFxyXG4gICAgICB7XHJcbiAgICAgICAgaGVhZGVyczogcmVxSGVhZGVyLFxyXG4gICAgICB9XHJcbiAgICApLnBpcGUoXHJcbiAgICAgIG1hcChyZXNwb25zZSA9PiBSZXNwb25zZUFkYXB0ZXIubm9ybWFsaXplKHJlc3BvbnNlKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNYWtlcyBhbiBIVFRQIERFTEVURSByZXF1ZXN0IHRvIGEgc3BlY2lmaWMgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlcnZpY2VOYW1lIC0gTmFtZSBvZiB0aGUgbWljcm9zZXJ2aWNlXHJcbiAgICogQHBhcmFtIGVuZFBvaW50TmFtZSAtIEVuZHBvaW50IHBhdGggcmVsYXRpdmUgdG8gdGhlIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gZGF0YSAtIERhdGEgdG8gc2VuZCB3aXRoIHRoZSByZXF1ZXN0IChvcHRpb25hbCwgZm9yIERFTEVURSB3aXRoIGJvZHkpXHJcbiAgICogQHBhcmFtIHJlcUhlYWRlciAtIEN1c3RvbSBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdFxyXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgZW1pdHRpbmcgdGhlIHJlc3BvbnNlIGRhdGEgKGF1dG8tbm9ybWFsaXplZCB0byBDb21tb25BcGlSZXNwb25zZSBmb3JtYXQpXHJcbiAgICovXHJcbiAgZGVsZXRlRnJvbVNlcnZpY2U8RD4oXHJcbiAgICBzZXJ2aWNlTmFtZTogQVBJU2VydmljZU5hbWUsXHJcbiAgICBlbmRQb2ludE5hbWU6IHN0cmluZyxcclxuICAgIGRhdGE/OiBELFxyXG4gICAgcmVxSGVhZGVyPzogSHR0cEhlYWRlcnNcclxuICApOiBPYnNlcnZhYmxlPENvbW1vbkFwaVJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBzZXJ2aWNlVXJsID0gQ29tbW9uLmFwaVNlcnZpY2VVcmxzW3NlcnZpY2VOYW1lXTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlPFN0YW5kYXJkQXBpUmVzcG9uc2U+KGAke3NlcnZpY2VVcmx9JHtlbmRQb2ludE5hbWV9YCwge1xyXG4gICAgICBoZWFkZXJzOiByZXFIZWFkZXIsXHJcbiAgICAgIGJvZHk6IGRhdGEgPyBKU09OLnN0cmluZ2lmeShkYXRhKSA6IHVuZGVmaW5lZFxyXG4gICAgfSkucGlwZShcclxuICAgICAgbWFwKHJlc3BvbnNlID0+IFJlc3BvbnNlQWRhcHRlci5ub3JtYWxpemUocmVzcG9uc2UpKVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,82 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, throwError, TimeoutError } from 'rxjs';
3
+ import { filter, take, timeout, catchError } from 'rxjs/operators';
4
+ import { SIGNALR_CONFIG, } from '../../../app/interfaces/signalr.interface';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Operation Tracker Service
8
+ * Tracks async operations by correlationId and matches them with SignalR notifications
9
+ * Used by TabFormioService for handling async processRequest operations
10
+ */
11
+ export class OperationTrackerService {
12
+ constructor() {
13
+ // Map<correlationId, PendingOperation>
14
+ this.pendingOperations = new Map();
15
+ // Observable for completed operations
16
+ this.operationCompleted$ = new Subject();
17
+ }
18
+ /**
19
+ * Register an async operation for tracking
20
+ */
21
+ registerOperation(operation) {
22
+ this.pendingOperations.set(operation.correlationId, operation);
23
+ // Auto-cleanup after timeout
24
+ setTimeout(() => {
25
+ if (this.pendingOperations.has(operation.correlationId)) {
26
+ this.pendingOperations.delete(operation.correlationId);
27
+ }
28
+ }, operation.timeout || SIGNALR_CONFIG.DEFAULT_TIMEOUT);
29
+ }
30
+ /**
31
+ * Wait for operation to complete via SignalR notification
32
+ * Returns Observable that emits when notification with matching correlationId is received
33
+ */
34
+ waitForOperation(correlationId, timeoutMs = SIGNALR_CONFIG.DEFAULT_TIMEOUT) {
35
+ return this.operationCompleted$.pipe(filter((notification) => notification.correlationId === correlationId), take(1), timeout(timeoutMs), catchError((error) => {
36
+ // Cleanup on timeout
37
+ this.pendingOperations.delete(correlationId);
38
+ if (error instanceof TimeoutError) {
39
+ return throwError(() => new Error('Operation timed out'));
40
+ }
41
+ return throwError(() => error);
42
+ }));
43
+ }
44
+ /**
45
+ * Handle incoming SignalR notification
46
+ * Called by SignalRService when notification is received
47
+ */
48
+ handleNotification(notification) {
49
+ const operation = this.pendingOperations.get(notification.correlationId);
50
+ if (operation) {
51
+ // Emit to observers waiting for this operation
52
+ this.operationCompleted$.next(notification);
53
+ // Cleanup
54
+ this.pendingOperations.delete(notification.correlationId);
55
+ }
56
+ }
57
+ /**
58
+ * Check if operation is pending
59
+ */
60
+ isPending(correlationId) {
61
+ return this.pendingOperations.has(correlationId);
62
+ }
63
+ /**
64
+ * Get pending operations count (for debugging)
65
+ */
66
+ getPendingCount() {
67
+ return this.pendingOperations.size;
68
+ }
69
+ /**
70
+ * Get all pending operations (for debugging)
71
+ */
72
+ getAllPending() {
73
+ return Array.from(this.pendingOperations.values());
74
+ }
75
+ static { this.ɵfac = function OperationTrackerService_Factory(t) { return new (t || OperationTrackerService)(); }; }
76
+ static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: OperationTrackerService, factory: OperationTrackerService.ɵfac, providedIn: 'root' }); }
77
+ }
78
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OperationTrackerService, [{
79
+ type: Injectable,
80
+ args: [{ providedIn: 'root' }]
81
+ }], null, null); })();
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLXRyYWNrZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvZGF0YS1hY2Nlc3Mvc3JjL2xpYi90YWItY29yZS11dGlsaXR5L2NvcmUvc2VydmljZS9zaWduYWxyL29wZXJhdGlvbi10cmFja2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sRUFHTCxjQUFjLEdBQ2YsTUFBTSwyQ0FBMkMsQ0FBQzs7QUFFbkQ7Ozs7R0FJRztBQUVILE1BQU0sT0FBTyx1QkFBdUI7SUFEcEM7UUFFRSx1Q0FBdUM7UUFDL0Isc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFaEUsc0NBQXNDO1FBQzlCLHdCQUFtQixHQUFHLElBQUksT0FBTyxFQUFvQixDQUFDO0tBeUUvRDtJQXZFQzs7T0FFRztJQUNILGlCQUFpQixDQUFDLFNBQTJCO1FBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUvRCw2QkFBNkI7UUFDN0IsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUMsRUFBRSxTQUFTLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCLENBQUMsYUFBcUIsRUFBRSxZQUFvQixjQUFjLENBQUMsZUFBZTtRQUN4RixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQ2xDLE1BQU0sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsRUFDdEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFDbEIsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIscUJBQXFCO1lBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFN0MsSUFBSSxLQUFLLFlBQVksWUFBWSxFQUFFLENBQUM7Z0JBQ2xDLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztZQUM1RCxDQUFDO1lBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSCxrQkFBa0IsQ0FBQyxZQUE4QjtRQUMvQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV6RSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsK0NBQStDO1lBQy9DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7WUFFNUMsVUFBVTtZQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsYUFBcUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO3dGQTdFVSx1QkFBdUI7dUVBQXZCLHVCQUF1QixXQUF2Qix1QkFBdUIsbUJBRFYsTUFBTTs7aUZBQ25CLHVCQUF1QjtjQURuQyxVQUFVO2VBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0aHJvd0Vycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZmlsdGVyLCB0YWtlLCB0aW1lb3V0LCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gIENydWROb3RpZmljYXRpb24sXHJcbiAgUGVuZGluZ09wZXJhdGlvbixcclxuICBTSUdOQUxSX0NPTkZJRyxcclxufSBmcm9tICcuLi8uLi8uLi9hcHAvaW50ZXJmYWNlcy9zaWduYWxyLmludGVyZmFjZSc7XHJcblxyXG4vKipcclxuICogT3BlcmF0aW9uIFRyYWNrZXIgU2VydmljZVxyXG4gKiBUcmFja3MgYXN5bmMgb3BlcmF0aW9ucyBieSBjb3JyZWxhdGlvbklkIGFuZCBtYXRjaGVzIHRoZW0gd2l0aCBTaWduYWxSIG5vdGlmaWNhdGlvbnNcclxuICogVXNlZCBieSBUYWJGb3JtaW9TZXJ2aWNlIGZvciBoYW5kbGluZyBhc3luYyBwcm9jZXNzUmVxdWVzdCBvcGVyYXRpb25zXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgT3BlcmF0aW9uVHJhY2tlclNlcnZpY2Uge1xyXG4gIC8vIE1hcDxjb3JyZWxhdGlvbklkLCBQZW5kaW5nT3BlcmF0aW9uPlxyXG4gIHByaXZhdGUgcGVuZGluZ09wZXJhdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ09wZXJhdGlvbj4oKTtcclxuXHJcbiAgLy8gT2JzZXJ2YWJsZSBmb3IgY29tcGxldGVkIG9wZXJhdGlvbnNcclxuICBwcml2YXRlIG9wZXJhdGlvbkNvbXBsZXRlZCQgPSBuZXcgU3ViamVjdDxDcnVkTm90aWZpY2F0aW9uPigpO1xyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhbiBhc3luYyBvcGVyYXRpb24gZm9yIHRyYWNraW5nXHJcbiAgICovXHJcbiAgcmVnaXN0ZXJPcGVyYXRpb24ob3BlcmF0aW9uOiBQZW5kaW5nT3BlcmF0aW9uKTogdm9pZCB7XHJcbiAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLnNldChvcGVyYXRpb24uY29ycmVsYXRpb25JZCwgb3BlcmF0aW9uKTtcclxuXHJcbiAgICAvLyBBdXRvLWNsZWFudXAgYWZ0ZXIgdGltZW91dFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmhhcyhvcGVyYXRpb24uY29ycmVsYXRpb25JZCkpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmRlbGV0ZShvcGVyYXRpb24uY29ycmVsYXRpb25JZCk7XHJcbiAgICAgIH1cclxuICAgIH0sIG9wZXJhdGlvbi50aW1lb3V0IHx8IFNJR05BTFJfQ09ORklHLkRFRkFVTFRfVElNRU9VVCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXYWl0IGZvciBvcGVyYXRpb24gdG8gY29tcGxldGUgdmlhIFNpZ25hbFIgbm90aWZpY2F0aW9uXHJcbiAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiBub3RpZmljYXRpb24gd2l0aCBtYXRjaGluZyBjb3JyZWxhdGlvbklkIGlzIHJlY2VpdmVkXHJcbiAgICovXHJcbiAgd2FpdEZvck9wZXJhdGlvbihjb3JyZWxhdGlvbklkOiBzdHJpbmcsIHRpbWVvdXRNczogbnVtYmVyID0gU0lHTkFMUl9DT05GSUcuREVGQVVMVF9USU1FT1VUKTogT2JzZXJ2YWJsZTxDcnVkTm90aWZpY2F0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25Db21wbGV0ZWQkLnBpcGUoXHJcbiAgICAgIGZpbHRlcigobm90aWZpY2F0aW9uKSA9PiBub3RpZmljYXRpb24uY29ycmVsYXRpb25JZCA9PT0gY29ycmVsYXRpb25JZCksXHJcbiAgICAgIHRha2UoMSksXHJcbiAgICAgIHRpbWVvdXQodGltZW91dE1zKSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyBDbGVhbnVwIG9uIHRpbWVvdXRcclxuICAgICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcclxuXHJcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGltZW91dEVycm9yKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ09wZXJhdGlvbiB0aW1lZCBvdXQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgaW5jb21pbmcgU2lnbmFsUiBub3RpZmljYXRpb25cclxuICAgKiBDYWxsZWQgYnkgU2lnbmFsUlNlcnZpY2Ugd2hlbiBub3RpZmljYXRpb24gaXMgcmVjZWl2ZWRcclxuICAgKi9cclxuICBoYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBDcnVkTm90aWZpY2F0aW9uKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmdldChub3RpZmljYXRpb24uY29ycmVsYXRpb25JZCk7XHJcblxyXG4gICAgaWYgKG9wZXJhdGlvbikge1xyXG4gICAgICAvLyBFbWl0IHRvIG9ic2VydmVycyB3YWl0aW5nIGZvciB0aGlzIG9wZXJhdGlvblxyXG4gICAgICB0aGlzLm9wZXJhdGlvbkNvbXBsZXRlZCQubmV4dChub3RpZmljYXRpb24pO1xyXG5cclxuICAgICAgLy8gQ2xlYW51cFxyXG4gICAgICB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmRlbGV0ZShub3RpZmljYXRpb24uY29ycmVsYXRpb25JZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBvcGVyYXRpb24gaXMgcGVuZGluZ1xyXG4gICAqL1xyXG4gIGlzUGVuZGluZyhjb3JyZWxhdGlvbklkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBlbmRpbmdPcGVyYXRpb25zLmhhcyhjb3JyZWxhdGlvbklkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBwZW5kaW5nIG9wZXJhdGlvbnMgY291bnQgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0UGVuZGluZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nT3BlcmF0aW9ucy5zaXplO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IGFsbCBwZW5kaW5nIG9wZXJhdGlvbnMgKGZvciBkZWJ1Z2dpbmcpXHJcbiAgICovXHJcbiAgZ2V0QWxsUGVuZGluZygpOiBQZW5kaW5nT3BlcmF0aW9uW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5wZW5kaW5nT3BlcmF0aW9ucy52YWx1ZXMoKSk7XHJcbiAgfVxyXG59Il19