@yuuvis/client-core 0.6.5

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 (153) hide show
  1. package/README.md +111 -0
  2. package/esm2022/index.mjs +65 -0
  3. package/esm2022/lib/client-core.module.mjs +117 -0
  4. package/esm2022/lib/client-core.shared.module.mjs +18 -0
  5. package/esm2022/lib/common/pipes/filesize.pipe.mjs +37 -0
  6. package/esm2022/lib/common/pipes/index.mjs +6 -0
  7. package/esm2022/lib/common/pipes/keys.pipe.mjs +17 -0
  8. package/esm2022/lib/common/pipes/locale-date.pipe.mjs +45 -0
  9. package/esm2022/lib/common/pipes/locale-number.pipe.mjs +115 -0
  10. package/esm2022/lib/common/pipes/safe-html.pipe.mjs +44 -0
  11. package/esm2022/lib/common/services/native-notifications.interface.mjs +2 -0
  12. package/esm2022/lib/common/services/native-notifications.mjs +40 -0
  13. package/esm2022/lib/model/dms-object.interface.mjs +2 -0
  14. package/esm2022/lib/model/dms-object.model.mjs +79 -0
  15. package/esm2022/lib/model/object-flavor.interface.mjs +2 -0
  16. package/esm2022/lib/model/range-value.interface.mjs +2 -0
  17. package/esm2022/lib/model/yuv-error.model.mjs +37 -0
  18. package/esm2022/lib/model/yuv-user.model.mjs +38 -0
  19. package/esm2022/lib/service/audit/audit.interface.mjs +2 -0
  20. package/esm2022/lib/service/audit/audit.service.mjs +135 -0
  21. package/esm2022/lib/service/auth/auth.interceptor.mjs +50 -0
  22. package/esm2022/lib/service/auth/auth.interface.mjs +7 -0
  23. package/esm2022/lib/service/auth/auth.service.mjs +130 -0
  24. package/esm2022/lib/service/auth/oidc.service.mjs +81 -0
  25. package/esm2022/lib/service/backend/api.enum.mjs +11 -0
  26. package/esm2022/lib/service/backend/backend.interface.mjs +2 -0
  27. package/esm2022/lib/service/backend/backend.service.mjs +206 -0
  28. package/esm2022/lib/service/bpm/bpm.interface.mjs +8 -0
  29. package/esm2022/lib/service/bpm/bpm.service.mjs +51 -0
  30. package/esm2022/lib/service/cache/app-cache.service.mjs +51 -0
  31. package/esm2022/lib/service/catalog/catalog.interface.mjs +2 -0
  32. package/esm2022/lib/service/catalog/catalog.service.mjs +13 -0
  33. package/esm2022/lib/service/clipboard/clipboard.interface.mjs +2 -0
  34. package/esm2022/lib/service/clipboard/clipboard.service.mjs +90 -0
  35. package/esm2022/lib/service/config/config.interface.mjs +6 -0
  36. package/esm2022/lib/service/config/config.service.mjs +115 -0
  37. package/esm2022/lib/service/config/core-config.mjs +20 -0
  38. package/esm2022/lib/service/config/core-config.tokens.mjs +9 -0
  39. package/esm2022/lib/service/connection/connection.service.mjs +36 -0
  40. package/esm2022/lib/service/connection/offline.interceptor.mjs +28 -0
  41. package/esm2022/lib/service/core-init/core-init.service.mjs +29 -0
  42. package/esm2022/lib/service/core-init/missing-translation-handler.mjs +10 -0
  43. package/esm2022/lib/service/core-init/translate-json-loader.mjs +117 -0
  44. package/esm2022/lib/service/device/device.interface.mjs +6 -0
  45. package/esm2022/lib/service/device/device.service.mjs +144 -0
  46. package/esm2022/lib/service/dms/dms.service.interface.mjs +2 -0
  47. package/esm2022/lib/service/dms/dms.service.mjs +440 -0
  48. package/esm2022/lib/service/event/event.interface.mjs +2 -0
  49. package/esm2022/lib/service/event/event.service.mjs +38 -0
  50. package/esm2022/lib/service/event/events.mjs +14 -0
  51. package/esm2022/lib/service/idm/idm.interface.mjs +2 -0
  52. package/esm2022/lib/service/idm/idm.service.mjs +34 -0
  53. package/esm2022/lib/service/logger/logger-console.service.mjs +73 -0
  54. package/esm2022/lib/service/logger/logger.interface.mjs +2 -0
  55. package/esm2022/lib/service/logger/logger.mjs +27 -0
  56. package/esm2022/lib/service/notification/notification.service.mjs +131 -0
  57. package/esm2022/lib/service/object-config/object-config.interface.mjs +2 -0
  58. package/esm2022/lib/service/object-config/object-config.service.mjs +229 -0
  59. package/esm2022/lib/service/pending-changes/pending-changes-component.interface.mjs +5 -0
  60. package/esm2022/lib/service/pending-changes/pending-changes-guard.service.mjs +25 -0
  61. package/esm2022/lib/service/pending-changes/pending-changes.service.mjs +123 -0
  62. package/esm2022/lib/service/prediction/prediction.interface.mjs +2 -0
  63. package/esm2022/lib/service/prediction/prediction.service.mjs +60 -0
  64. package/esm2022/lib/service/search/search.service.interface.mjs +39 -0
  65. package/esm2022/lib/service/search/search.service.mjs +178 -0
  66. package/esm2022/lib/service/session-storage/session-storage.service.mjs +50 -0
  67. package/esm2022/lib/service/system/object-form.interface.mjs +2 -0
  68. package/esm2022/lib/service/system/system.enum.mjs +179 -0
  69. package/esm2022/lib/service/system/system.interface.mjs +2 -0
  70. package/esm2022/lib/service/system/system.service.mjs +597 -0
  71. package/esm2022/lib/service/upload/upload.interface.mjs +2 -0
  72. package/esm2022/lib/service/upload/upload.service.mjs +228 -0
  73. package/esm2022/lib/service/user/user.service.mjs +211 -0
  74. package/esm2022/lib/util/utils.helper.enum.mjs +15 -0
  75. package/esm2022/lib/util/utils.mjs +373 -0
  76. package/esm2022/yuuvis-client-core.mjs +5 -0
  77. package/fesm2022/yuuvis-client-core.mjs +4775 -0
  78. package/fesm2022/yuuvis-client-core.mjs.map +1 -0
  79. package/index.d.ts +61 -0
  80. package/lib/client-core.module.d.ts +20 -0
  81. package/lib/client-core.shared.module.d.ts +10 -0
  82. package/lib/common/pipes/filesize.pipe.d.ts +18 -0
  83. package/lib/common/pipes/index.d.ts +5 -0
  84. package/lib/common/pipes/keys.pipe.d.ts +10 -0
  85. package/lib/common/pipes/locale-date.pipe.d.ts +12 -0
  86. package/lib/common/pipes/locale-number.pipe.d.ts +47 -0
  87. package/lib/common/pipes/safe-html.pipe.d.ts +28 -0
  88. package/lib/common/services/native-notifications.d.ts +8 -0
  89. package/lib/common/services/native-notifications.interface.d.ts +5 -0
  90. package/lib/model/dms-object.interface.d.ts +16 -0
  91. package/lib/model/dms-object.model.d.ts +26 -0
  92. package/lib/model/object-flavor.interface.d.ts +30 -0
  93. package/lib/model/range-value.interface.d.ts +9 -0
  94. package/lib/model/yuv-error.model.d.ts +18 -0
  95. package/lib/model/yuv-user.model.d.ts +44 -0
  96. package/lib/service/audit/audit.interface.d.ts +47 -0
  97. package/lib/service/audit/audit.service.d.ts +35 -0
  98. package/lib/service/auth/auth.interceptor.d.ts +12 -0
  99. package/lib/service/auth/auth.interface.d.ts +34 -0
  100. package/lib/service/auth/auth.service.d.ts +50 -0
  101. package/lib/service/auth/oidc.service.d.ts +16 -0
  102. package/lib/service/backend/api.enum.d.ts +7 -0
  103. package/lib/service/backend/backend.interface.d.ts +29 -0
  104. package/lib/service/backend/backend.service.d.ts +118 -0
  105. package/lib/service/bpm/bpm.interface.d.ts +86 -0
  106. package/lib/service/bpm/bpm.service.d.ts +19 -0
  107. package/lib/service/cache/app-cache.service.d.ts +18 -0
  108. package/lib/service/catalog/catalog.interface.d.ts +12 -0
  109. package/lib/service/catalog/catalog.service.d.ts +5 -0
  110. package/lib/service/clipboard/clipboard.interface.d.ts +11 -0
  111. package/lib/service/clipboard/clipboard.service.d.ts +23 -0
  112. package/lib/service/config/config.interface.d.ts +34 -0
  113. package/lib/service/config/config.service.d.ts +45 -0
  114. package/lib/service/config/core-config.d.ts +14 -0
  115. package/lib/service/config/core-config.tokens.d.ts +7 -0
  116. package/lib/service/connection/connection.service.d.ts +25 -0
  117. package/lib/service/connection/offline.interceptor.d.ts +15 -0
  118. package/lib/service/core-init/core-init.service.d.ts +11 -0
  119. package/lib/service/core-init/missing-translation-handler.d.ts +8 -0
  120. package/lib/service/core-init/translate-json-loader.d.ts +20 -0
  121. package/lib/service/device/device.interface.d.ts +15 -0
  122. package/lib/service/device/device.service.d.ts +54 -0
  123. package/lib/service/dms/dms.service.d.ts +153 -0
  124. package/lib/service/dms/dms.service.interface.d.ts +59 -0
  125. package/lib/service/event/event.interface.d.ts +13 -0
  126. package/lib/service/event/event.service.d.ts +23 -0
  127. package/lib/service/event/events.d.ts +12 -0
  128. package/lib/service/idm/idm.interface.d.ts +5 -0
  129. package/lib/service/idm/idm.service.d.ts +9 -0
  130. package/lib/service/logger/logger-console.service.d.ts +20 -0
  131. package/lib/service/logger/logger.d.ts +17 -0
  132. package/lib/service/logger/logger.interface.d.ts +10 -0
  133. package/lib/service/notification/notification.service.d.ts +71 -0
  134. package/lib/service/object-config/object-config.interface.d.ts +62 -0
  135. package/lib/service/object-config/object-config.service.d.ts +38 -0
  136. package/lib/service/pending-changes/pending-changes-component.interface.d.ts +6 -0
  137. package/lib/service/pending-changes/pending-changes-guard.service.d.ts +14 -0
  138. package/lib/service/pending-changes/pending-changes.service.d.ts +57 -0
  139. package/lib/service/prediction/prediction.interface.d.ts +18 -0
  140. package/lib/service/prediction/prediction.service.d.ts +15 -0
  141. package/lib/service/search/search.service.d.ts +46 -0
  142. package/lib/service/search/search.service.interface.d.ts +119 -0
  143. package/lib/service/session-storage/session-storage.service.d.ts +15 -0
  144. package/lib/service/system/object-form.interface.d.ts +46 -0
  145. package/lib/service/system/system.enum.d.ts +141 -0
  146. package/lib/service/system/system.interface.d.ts +146 -0
  147. package/lib/service/system/system.service.d.ts +168 -0
  148. package/lib/service/upload/upload.interface.d.ts +55 -0
  149. package/lib/service/upload/upload.service.d.ts +34 -0
  150. package/lib/service/user/user.service.d.ts +69 -0
  151. package/lib/util/utils.d.ts +118 -0
  152. package/lib/util/utils.helper.enum.d.ts +13 -0
  153. package/package.json +33 -0
@@ -0,0 +1,440 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { of } from 'rxjs';
3
+ import { delay, map, switchMap, tap } from 'rxjs/operators';
4
+ import { DmsObject } from '../../model/dms-object.model';
5
+ import { Utils } from '../../util/utils';
6
+ import { ApiBase } from '../backend/api.enum';
7
+ import { BackendService } from '../backend/backend.service';
8
+ import { EventService } from '../event/event.service';
9
+ import { YuvEventType } from '../event/events';
10
+ import { SearchService } from '../search/search.service';
11
+ import { BaseObjectTypeField, ContentStreamField, SystemResult } from '../system/system.enum';
12
+ import { UploadService } from '../upload/upload.service';
13
+ import { Sort } from '../../util/utils.helper.enum';
14
+ import * as i0 from "@angular/core";
15
+ /**
16
+ * Service for working with dms objects: create them, delete, etc.
17
+ */
18
+ export class DmsService {
19
+ #searchService = inject(SearchService);
20
+ #backend = inject(BackendService);
21
+ #eventService = inject(EventService);
22
+ #uploadService = inject(UploadService);
23
+ // general trigger operator to handle all dms events
24
+ triggerEvent(event, id, silent = false) {
25
+ return (stream) => stream.pipe(
26
+ // update does not return permissions, so we need to re-load the whole dms object
27
+ // TODO: Remove once permissions are provided
28
+ switchMap((res) => (!id ? of(res) : this.getDmsObject(id))),
29
+ // TODO: enable once permissions are provided
30
+ // map((res) => this.searchResultToDmsObject(this.searchService.toSearchResult(res).items[0])),
31
+ tap((res) => !silent && this.#eventService.trigger(event, res)));
32
+ }
33
+ // general trigger operator to handle all dms events
34
+ #triggerEvents(event, ids, silent = false) {
35
+ return (stream) => stream.pipe(
36
+ // update does not return permissions, so we need to re-load the whole dms object
37
+ // TODO: Remove once permissions are provided
38
+ switchMap((res) => (!ids ? of(res) : this.getDmsObjects(ids))),
39
+ // TODO: enable once permissions are provided
40
+ // map((_res: any[]) => _res.map((res, i) => res?._error ? { ...res, id: ids?[i] } : this.searchResultToDmsObject(this.searchService.toSearchResult(res).items[0]))),
41
+ map((_res) => _res.map((res, i) => (res?._error && ids ? { ...res, id: ids[i] } : res))), tap((res) => !silent && res.forEach((o) => o && this.#eventService.trigger(event, o))));
42
+ }
43
+ /**
44
+ * Create new dms object(s). Providing an array of files here instead of one will create
45
+ * a new dms object for every file. In this case indexdata will shared across all files.
46
+ * @param objectTypeId The ID of the object type to be created
47
+ * @param indexdata Indexdata for the new object(s)
48
+ * @param files File(s) to create dms objects content(s) with
49
+ * @param label A label that will show up in the upload overlay dialog while uploading
50
+ *
51
+ * @returns Array of IDs of the objects that have been created
52
+ */
53
+ createDmsObject(objectTypeId, indexdata, files, label, silent = false) {
54
+ const url = `${this.#backend.getApiBase(ApiBase.apiWeb)}/dms/objects`;
55
+ const data = indexdata;
56
+ data[BaseObjectTypeField.OBJECT_TYPE_ID] = objectTypeId;
57
+ const upload = files.length ? this.#uploadService.uploadMultipart(url, files, data, label, silent) : this.#uploadService.createDocument(url, data);
58
+ return upload
59
+ .pipe(map((res) => res.map((r) => r.properties[BaseObjectTypeField.OBJECT_ID].value)),
60
+ // TODO: Replace by proper solution
61
+ // Right now there is a gap between when the object was
62
+ // created and when it is indexed. So delaying here will
63
+ // give backend time to get its stuff together.
64
+ delay(1000))
65
+ .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_CREATED, '', silent));
66
+ }
67
+ /**
68
+ * Delete a dms object.
69
+ * @param id ID of the object to be deleted
70
+ */
71
+ deleteDmsObject(id, silent = false) {
72
+ const url = `/dms/objects/${id}`;
73
+ return this.#backend
74
+ .delete(url, ApiBase.apiWeb)
75
+ .pipe(map(() => ({ id })))
76
+ .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_DELETED, '', silent));
77
+ }
78
+ /**
79
+ * Restore older version of a dms object.
80
+ * @param id ID of the object to be restored
81
+ * @param version version of the object to be restored
82
+ */
83
+ restoreDmsObject(id, version, silent = false) {
84
+ const url = `/dms/objects/${id}/versions/${version}/actions/restore?waitForSearchConsistency=true&restoreParentId=false`;
85
+ return this.#backend.post(url, {}, ApiBase.apiWeb).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
86
+ }
87
+ /**
88
+ * Upload (add/replace) content to a dms object.
89
+ * @param objectId ID of the dms object to upload the file to
90
+ * @param file The file to be uploaded
91
+ */
92
+ uploadContent(objectId, file) {
93
+ return this.#uploadService.upload(this.getContentPath(objectId), file).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, objectId));
94
+ }
95
+ /**
96
+ * Path of dms object content file.
97
+ * @param objectId ID of the dms object
98
+ * @param version version number of the dms object
99
+ */
100
+ getContentPath(objectId, version) {
101
+ return `${this.#backend.getApiBase(ApiBase.apiWeb)}/dms/objects/${objectId}/contents/file${version ? '?version=' + version : ''}`;
102
+ }
103
+ /**
104
+ * Original API Path of dms object content file.
105
+ * @param objectId ID of the dms object
106
+ * @param version version number of the dms object
107
+ * @param rendition should return rendition path of the dms object
108
+ */
109
+ getFullContentPath(objectId, version, rendition = false) {
110
+ return `${this.#backend.getApiBase(ApiBase.core, true)}/dms/objects/${objectId}${version ? '/versions/' + version : ''}/contents/${rendition ? 'renditions/pdf' : 'file'}`;
111
+ }
112
+ getSlideURI(objectId, mimeType) {
113
+ const supportedMimeTypes = ['*/*'];
114
+ let supported = false;
115
+ if (mimeType) {
116
+ // check if mime type supports slides
117
+ supportedMimeTypes.forEach((p) => (supported = supported || Utils.patternToRegExp(p).test(mimeType)));
118
+ }
119
+ return !mimeType || supported ? `${this.#backend.getApiBase(ApiBase.core, true)}/dms/objects/${objectId}/contents/renditions/slide` : undefined;
120
+ }
121
+ /**
122
+ * Downloads the content of dms objects.
123
+ *
124
+ * @param DmsObject[] dmsObjects Array of dms objects to be downloaded
125
+ * @param withVersion should download specific version of the object
126
+ */
127
+ downloadContent(objects, withVersion) {
128
+ objects.forEach((object, i) => setTimeout(() => {
129
+ const uri = `${this.getContentPath(object?.id, withVersion ? object?.version : undefined)}`;
130
+ this.#backend.download(uri);
131
+ }, Utils.isSafari() ? i * 1000 : 0 // Safari does not allow multi download
132
+ ));
133
+ }
134
+ /**
135
+ * Fetch a dms object.
136
+ * @param id ID of the object to be retrieved
137
+ * @param version Desired version of the object
138
+ */
139
+ getDmsObject(id, version, silent = false, requestOptions) {
140
+ return this.#backend
141
+ .get(`/dms/objects/${id}${version ? '/versions/' + version : ''}`, undefined, requestOptions)
142
+ .pipe(map((res) => {
143
+ const item = this.#searchService.toSearchResult(res).items[0];
144
+ return this.#searchResultToDmsObject(item);
145
+ }))
146
+ .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_LOADED, '', silent));
147
+ }
148
+ /**
149
+ * Updates a tag on a dms object.
150
+ * @param id The ID of the object
151
+ * @param tag The tag to be updated
152
+ * @param value The tags new value
153
+ */
154
+ setDmsObjectTag(id, tag, value, silent = false) {
155
+ return this.#backend
156
+ .post(`/dms/objects/tags/${tag}/state/${value}?query=SELECT * FROM system:object WHERE system:objectId='${id}'`, {}, ApiBase.core)
157
+ .pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
158
+ }
159
+ /**
160
+ * Deletes a tag from a dms object.
161
+ * @param id The ID of the object
162
+ * @param tag The tag to be deleted
163
+ */
164
+ deleteDmsObjectTag(id, tag, silent = false) {
165
+ return this.#backend.delete(`/dms/objects/${id}/tags/${tag}`, ApiBase.core).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
166
+ }
167
+ /**
168
+ * Update indexdata of a dms object.
169
+ * @param id ID of the object to apply the data to
170
+ * @param data Indexdata to be applied
171
+ * @param silent flag to trigger DMS_OBJECT_UPDATED event
172
+ */
173
+ updateDmsObject(id, data, silent = false) {
174
+ return this.#backend.patch(`/dms/objects/${id}`, data).pipe(this.triggerEvent(YuvEventType.DMS_OBJECT_UPDATED, id, silent));
175
+ }
176
+ /**
177
+ * Updates given objects.
178
+ * @param objects the objects to updated
179
+ */
180
+ updateDmsObjects(objects, silent = false) {
181
+ return this.#backend
182
+ .patch(`/dms/objects`, {
183
+ patches: objects.map((o) => ({
184
+ id: o.id,
185
+ data: o.data
186
+ }))
187
+ })
188
+ .pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_UPDATED, objects.map((o) => o.id), silent));
189
+ }
190
+ /**
191
+ * Updates a tag on a dms object.
192
+ * @param ids List of IDs of objects
193
+ * @param tag The tag to be updated
194
+ * @param value The tags new value
195
+ */
196
+ updateDmsObjectsTag(ids, tag, value, silent = false) {
197
+ return this.batchUpdateTag(ids, tag, value).pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_UPDATED, ids, silent));
198
+ }
199
+ /**
200
+ * Moves given objects to a different folder.
201
+ * @param folderId the id of the new parent folder
202
+ * @param objects objects to be moved
203
+ * @param options options for the move operation
204
+ */
205
+ moveDmsObjects(targetFolderId, objects, options) {
206
+ return this.updateDmsObjects(objects.map((o) => ({ id: o.id, data: { [BaseObjectTypeField.PARENT_ID]: targetFolderId } }), true)).pipe(tap((res) => !options?.silent && this.#eventService.trigger(YuvEventType.DMS_OBJECTS_MOVED, res)));
207
+ }
208
+ /**
209
+ * Copy given objects to a different folder. The objects will be copied with their indexdata referencing
210
+ * the existing content of the source object.
211
+ * @param targetFolderId The ID of the target folder
212
+ * @param objects The objects to be copied
213
+ * @param options options for the copy operation
214
+ */
215
+ copyDmsObjects(targetFolderId, objects, options) {
216
+ const excludeProperties = [
217
+ BaseObjectTypeField.OBJECT_ID,
218
+ BaseObjectTypeField.CREATED_BY,
219
+ BaseObjectTypeField.CREATION_DATE,
220
+ BaseObjectTypeField.MODIFIED_BY,
221
+ BaseObjectTypeField.MODIFICATION_DATE,
222
+ BaseObjectTypeField.VERSION_NUMBER,
223
+ BaseObjectTypeField.TRACE_ID,
224
+ BaseObjectTypeField.PARENT_OBJECT_TYPE_ID,
225
+ BaseObjectTypeField.PARENT_VERSION_NUMBER
226
+ ];
227
+ const mappedObjects = objects.map((o) => {
228
+ o.data[BaseObjectTypeField.PARENT_ID] = targetFolderId;
229
+ // Remove properties that are not allowed to be copied.
230
+ // This also includes content stream fields bundled into the objects data field.
231
+ // Properties ending with '_title' are also excluded as they are enrichment values
232
+ // provided by API-Web.
233
+ Object.keys(o.data)
234
+ .filter((key) => key.endsWith('_title') || excludeProperties.includes(key) || Object.values(ContentStreamField).includes(key))
235
+ .forEach((key) => Reflect.deleteProperty(o.data, key));
236
+ // map filtered data field to data format required by the Core-API
237
+ const properties = Object.keys(o.data).reduce((acc, key) => {
238
+ acc[key] = { value: o.data[key] };
239
+ return acc;
240
+ }, {});
241
+ return {
242
+ properties: properties,
243
+ objectTypeId: o.objectTypeId,
244
+ ...(o.content
245
+ ? {
246
+ contentStreams: [o.content]
247
+ }
248
+ : {})
249
+ };
250
+ });
251
+ const query = options
252
+ ? Object.keys(options)
253
+ .map((key) => `${key}=${options[key]}`)
254
+ .join('&')
255
+ : '';
256
+ return this.#backend.post(`/dms/objects?${query}}`, { objects: mappedObjects }, ApiBase.core);
257
+ }
258
+ /**
259
+ * Get a bunch of dms objects.
260
+ * @param ids List of IDs of objects to be retrieved
261
+ */
262
+ getDmsObjects(ids, silent = false) {
263
+ return this.batchGet(ids)
264
+ .pipe(map((_res) => _res.map((res, i) => (res?._error ? { ...res, id: ids[i] } : this.#searchResultToDmsObject(this.#searchService.toSearchResult(res).items[0])))))
265
+ .pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_LOADED, undefined, silent));
266
+ }
267
+ /**
268
+ * Delete a bunch of dms objects.
269
+ * @param ids List of IDs of objects to be deleted
270
+ * @param options Options for the delete operation
271
+ * @returns Array of delete results.
272
+ */
273
+ deleteDmsObjects(objects, options) {
274
+ const queryParams = options
275
+ ? `?${Object.keys(options)
276
+ .filter((k) => ['waitForSearchConsistency', 'greedy'].includes(k))
277
+ .map((k) => `${k}=${options[k]}`)
278
+ .join('&')}`
279
+ : '';
280
+ return this.#backend
281
+ .delete(`/dms/objects${queryParams}`, ApiBase.core, {
282
+ body: {
283
+ objects: objects.map((o) => ({
284
+ properties: typeof o === 'string'
285
+ ? {
286
+ 'system:objectId': {
287
+ value: o
288
+ }
289
+ }
290
+ : {
291
+ 'system:objectId': { value: o.id },
292
+ subject: { value: o.subject }
293
+ }
294
+ }))
295
+ }
296
+ })
297
+ .pipe(map((res) => res?.objects?.map((r) => {
298
+ const v = r.options?.[SystemResult.DELETE];
299
+ return {
300
+ id: r.properties?.[BaseObjectTypeField.OBJECT_ID]?.value,
301
+ properties: r.properties,
302
+ ...(v?.httpStatusCode >= 400 ? { _error: { status: v.httpStatusCode, message: v.message } } : {})
303
+ };
304
+ })))
305
+ .pipe(this.#triggerEvents(YuvEventType.DMS_OBJECT_DELETED, undefined, options?.silent));
306
+ }
307
+ /**
308
+ * Fetch a dms object versions.
309
+ * @param id ID of the object to be retrieved
310
+ */
311
+ getDmsObjectVersions(id) {
312
+ return this.#backend.get('/dms/objects/' + id + '/versions').pipe(map((res) => {
313
+ const items = this.#searchService.toSearchResult(res).items || [];
314
+ return items.map((item) => this.#searchResultToDmsObject(item));
315
+ }), map((res) => res.sort(Utils.sortValues('version', Sort.DESC))));
316
+ }
317
+ getDmsObjectVersion(id, version) {
318
+ return this.#backend
319
+ .get(`/dms/objects/${id}/versions/${version}`)
320
+ .pipe(map((res) => this.#searchResultToDmsObject(this.#searchService.toSearchResult(res).items[0])));
321
+ }
322
+ coreApiResponseToDmsObject(res) {
323
+ return this.#searchResultToDmsObject({
324
+ objectTypeId: res.properties[BaseObjectTypeField.OBJECT_TYPE_ID].value,
325
+ fields: new Map(Object.entries(res.properties)),
326
+ content: res.contentStreams?.[0]
327
+ });
328
+ }
329
+ #searchResultToDmsObject(resItem) {
330
+ return new DmsObject(resItem);
331
+ }
332
+ batchUpdateTag(ids, tag, value) {
333
+ return this.#backend.batch(ids.map((id) => ({
334
+ method: 'POST',
335
+ uri: `/dms/objects/tags/${tag}/state/${value}?query=SELECT * FROM system:object WHERE system:objectId='${id}'`,
336
+ base: ApiBase.core,
337
+ body: {}
338
+ })));
339
+ }
340
+ batchDeleteTag(ids, tag) {
341
+ return this.#backend.batch(ids.map((id) => ({
342
+ method: 'DELETE',
343
+ uri: `/dms/objects/${id}/tags/${tag}`,
344
+ base: ApiBase.core
345
+ })));
346
+ }
347
+ batchDelete(ids) {
348
+ return this.#backend.batch(ids.map((id) => ({ method: 'DELETE', uri: `/dms/objects/${id}` })));
349
+ }
350
+ batchGet(ids) {
351
+ return this.#backend.batch(ids.map((id) => ({ method: 'GET', uri: `/dms/objects/${id}` })));
352
+ }
353
+ /**
354
+ * Map search result from the backend to applications SearchResult object
355
+ * @param searchResponse The backend response
356
+ */
357
+ toSearchResult(searchResponse) {
358
+ const resultListItems = [];
359
+ const objectTypes = [];
360
+ searchResponse.objects.forEach((o) => {
361
+ const fields = new Map();
362
+ // process properties section of result
363
+ Object.keys(o.properties).forEach((key) => {
364
+ let value = o.properties[key].value;
365
+ if (o.properties[key].clvalue) {
366
+ // table fields will have a clientValue too ...
367
+ value = o.properties[key].clvalue;
368
+ // ... and also may contain values that need to be resolved
369
+ if (o.properties[key].resolvedValues) {
370
+ value.forEach((v) => {
371
+ Object.keys(v).forEach((k) => {
372
+ const resValue = Array.isArray(v[k]) ? v[k].map((i) => o.properties[key].resolvedValues[i]) : o.properties[key].resolvedValues[v[k]];
373
+ if (resValue) {
374
+ v[`${k}_title`] = resValue;
375
+ }
376
+ });
377
+ });
378
+ }
379
+ }
380
+ fields.set(key, value);
381
+ if (o.properties[key].title) {
382
+ fields.set(key + '_title', o.properties[key].title);
383
+ }
384
+ });
385
+ // process contentStreams section of result if available.
386
+ // Objects that don't have files attached won't have this section
387
+ let content;
388
+ if (o.contentStreams && o.contentStreams.length > 0) {
389
+ // we assume that each result object only has ONE file attached, altough
390
+ // this is an array and there may be more
391
+ const contentStream = o.contentStreams[0];
392
+ // also add contentstream related fields to the result fields
393
+ fields.set(ContentStreamField.LENGTH, contentStream.length);
394
+ fields.set(ContentStreamField.MIME_TYPE, contentStream.mimeType);
395
+ fields.set(ContentStreamField.FILENAME, contentStream.fileName);
396
+ fields.set(ContentStreamField.ID, contentStream.contentStreamId);
397
+ fields.set(ContentStreamField.RANGE, contentStream.contentStreamRange);
398
+ fields.set(ContentStreamField.REPOSITORY_ID, contentStream.repositoryId);
399
+ fields.set(ContentStreamField.DIGEST, contentStream.digest);
400
+ fields.set(ContentStreamField.ARCHIVE_PATH, contentStream.archivePath);
401
+ content = {
402
+ contentStreamId: contentStream.contentStreamId,
403
+ repositoryId: contentStream.repositoryId,
404
+ range: contentStream.range,
405
+ digest: contentStream.digest,
406
+ archivePath: contentStream.archivePath,
407
+ fileName: contentStream.fileName,
408
+ mimeType: contentStream.mimeType,
409
+ size: contentStream.length
410
+ };
411
+ }
412
+ const objectTypeId = o.properties[BaseObjectTypeField.OBJECT_TYPE_ID] ? o.properties[BaseObjectTypeField.OBJECT_TYPE_ID].value : null;
413
+ if (objectTypes.indexOf(objectTypeId) === -1) {
414
+ objectTypes.push(objectTypeId);
415
+ }
416
+ resultListItems.push({
417
+ objectTypeId,
418
+ content,
419
+ fields,
420
+ permissions: o.permissions
421
+ });
422
+ });
423
+ const result = {
424
+ hasMoreItems: searchResponse.hasMoreItems,
425
+ totalNumItems: searchResponse.totalNumItems,
426
+ items: resultListItems,
427
+ objectTypes
428
+ };
429
+ return result;
430
+ }
431
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
432
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, providedIn: 'root' }); }
433
+ }
434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DmsService, decorators: [{
435
+ type: Injectable,
436
+ args: [{
437
+ providedIn: 'root'
438
+ }]
439
+ }] });
440
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG1zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3l1dXZpcy9jbGllbnQtY29yZS9zcmMvbGliL3NlcnZpY2UvZG1zL2Rtcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFjLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFOUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBVXpELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7QUFDcEQ7O0dBRUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUNyQixjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFD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QUssRUFBRSxlQUFlO1lBQ3RCLFdBQVc7U0FDWixDQUFDO1FBQ0YsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzsrR0F0ZlUsVUFBVTttSEFBVixVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBkZWxheSwgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERtc09iamVjdCB9IGZyb20gJy4uLy4uL21vZGVsL2Rtcy1vYmplY3QubW9kZWwnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3V0aWxzJztcbmltcG9ydCB7IEFwaUJhc2UgfSBmcm9tICcuLi9iYWNrZW5kL2FwaS5lbnVtJztcbmltcG9ydCB7IEh0dHBPcHRpb25zIH0gZnJvbSAnLi4vYmFja2VuZC9iYWNrZW5kLmludGVyZmFjZSc7XG5pbXBvcnQgeyBCYWNrZW5kU2VydmljZSB9IGZyb20gJy4uL2JhY2tlbmQvYmFja2VuZC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50U2VydmljZSB9IGZyb20gJy4uL2V2ZW50L2V2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgWXV2RXZlbnRUeXBlIH0gZnJvbSAnLi4vZXZlbnQvZXZlbnRzJztcbmltcG9ydCB7IFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VhcmNoUmVzcG9uc2UsIFNlYXJjaFJlc3VsdCwgU2VhcmNoUmVzdWx0Q29udGVudCwgU2VhcmNoUmVzdWx0SXRlbSB9IGZyb20gJy4uL3NlYXJjaC9zZWFyY2guc2VydmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQmFzZU9iamVjdFR5cGVGaWVsZCwgQ29udGVudFN0cmVhbUZpZWxkLCBTeXN0ZW1SZXN1bHQgfSBmcm9tICcuLi9zeXN0ZW0vc3lzdGVtLmVudW0nO1xuaW1wb3J0IHsgU3lzdGVtU2VydmljZSB9IGZyb20gJy4uL3N5c3RlbS9zeXN0ZW0uc2VydmljZSc7XG5pbXBvcnQgeyBVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vdXBsb2FkL3VwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIENvcmVBcGlPYmplY3QsXG4gIENvcmVBcGlPYmplY3RQcm9wZXJ0eSxcbiAgQ29yZUFwaVJlc3BvbnNlLFxuICBPYmplY3RDb3B5T3B0aW9ucyxcbiAgT2JqZWN0RGVsZXRlT3B0aW9ucyxcbiAgT2JqZWN0RGVsZXRlUmVzdWx0LFxuICBPYmplY3RNb3ZlT3B0aW9uc1xufSBmcm9tICcuL2Rtcy5zZXJ2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTb3J0IH0gZnJvbSAnLi4vLi4vdXRpbC91dGlscy5oZWxwZXIuZW51bSc7XG4vKipcbiAqIFNlcnZpY2UgZm9yIHdvcmtpbmcgd2l0aCBkbXMgb2JqZWN0czogY3JlYXRlIHRoZW0sIGRlbGV0ZSwgZXRjLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEbXNTZXJ2aWNlIHtcbiAgI3NlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gICNiYWNrZW5kID0gaW5qZWN0KEJhY2tlbmRTZXJ2aWNlKTtcbiAgI2V2ZW50U2VydmljZSA9IGluamVjdChFdmVudFNlcnZpY2UpO1xuICAjdXBsb2FkU2VydmljZSA9IGluamVjdChVcGxvYWRTZXJ2aWNlKTtcblxuICAvLyBnZW5lcmFsIHRyaWdnZXIgb3BlcmF0b3IgdG8gaGFuZGxlIGFsbCBkbXMgZXZlbnRzXG4gIHByaXZhdGUgdHJpZ2dlckV2ZW50KGV2ZW50OiBZdXZFdmVudFR5cGUsIGlkPzogc3RyaW5nLCBzaWxlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiAoc3RyZWFtOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgIHN0cmVhbS5waXBlKFxuICAgICAgICAvLyB1cGRhdGUgZG9lcyBub3QgcmV0dXJuIHBlcm1pc3Npb25zLCBzbyB3ZSBuZWVkIHRvIHJlLWxvYWQgdGhlIHdob2xlIGRtcyBvYmplY3RcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgcGVybWlzc2lvbnMgYXJlIHByb3ZpZGVkXG4gICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiAoIWlkID8gb2YocmVzKSA6IHRoaXMuZ2V0RG1zT2JqZWN0KGlkKSkpLFxuICAgICAgICAvLyBUT0RPOiBlbmFibGUgb25jZSBwZXJtaXNzaW9ucyBhcmUgcHJvdmlkZWRcbiAgICAgICAgLy8gbWFwKChyZXMpID0+IHRoaXMuc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy5zZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSxcbiAgICAgICAgdGFwKChyZXM6IGFueSkgPT4gIXNpbGVudCAmJiB0aGlzLiNldmVudFNlcnZpY2UudHJpZ2dlcihldmVudCwgcmVzKSlcbiAgICAgICk7XG4gIH1cblxuICAvLyBnZW5lcmFsIHRyaWdnZXIgb3BlcmF0b3IgdG8gaGFuZGxlIGFsbCBkbXMgZXZlbnRzXG4gICN0cmlnZ2VyRXZlbnRzKGV2ZW50OiBZdXZFdmVudFR5cGUsIGlkcz86IHN0cmluZ1tdLCBzaWxlbnQgPSBmYWxzZSkge1xuICAgIHJldHVybiAoc3RyZWFtOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4gPT5cbiAgICAgIHN0cmVhbS5waXBlKFxuICAgICAgICAvLyB1cGRhdGUgZG9lcyBub3QgcmV0dXJuIHBlcm1pc3Npb25zLCBzbyB3ZSBuZWVkIHRvIHJlLWxvYWQgdGhlIHdob2xlIGRtcyBvYmplY3RcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIG9uY2UgcGVybWlzc2lvbnMgYXJlIHByb3ZpZGVkXG4gICAgICAgIHN3aXRjaE1hcCgocmVzKSA9PiAoIWlkcyA/IG9mKHJlcykgOiB0aGlzLmdldERtc09iamVjdHMoaWRzKSkpLFxuICAgICAgICAvLyBUT0RPOiBlbmFibGUgb25jZSBwZXJtaXNzaW9ucyBhcmUgcHJvdmlkZWRcbiAgICAgICAgLy8gbWFwKChfcmVzOiBhbnlbXSkgPT4gX3Jlcy5tYXAoKHJlcywgaSkgPT4gcmVzPy5fZXJyb3IgPyB7IC4uLnJlcywgaWQ6IGlkcz9baV0gfSA6IHRoaXMuc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy5zZWFyY2hTZXJ2aWNlLnRvU2VhcmNoUmVzdWx0KHJlcykuaXRlbXNbMF0pKSksXG4gICAgICAgIG1hcCgoX3JlczogYW55W10pID0+IF9yZXMubWFwKChyZXMsIGkpID0+IChyZXM/Ll9lcnJvciAmJiBpZHMgPyB7IC4uLnJlcywgaWQ6IGlkc1tpXSB9IDogcmVzKSkpLFxuICAgICAgICB0YXAoKHJlczogYW55KSA9PiAhc2lsZW50ICYmIHJlcy5mb3JFYWNoKChvOiBhbnkpID0+IG8gJiYgdGhpcy4jZXZlbnRTZXJ2aWNlLnRyaWdnZXIoZXZlbnQsIG8pKSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG5ldyBkbXMgb2JqZWN0KHMpLiBQcm92aWRpbmcgYW4gYXJyYXkgb2YgZmlsZXMgaGVyZSBpbnN0ZWFkIG9mIG9uZSB3aWxsIGNyZWF0ZVxuICAgKiBhIG5ldyBkbXMgb2JqZWN0IGZvciBldmVyeSBmaWxlLiBJbiB0aGlzIGNhc2UgaW5kZXhkYXRhIHdpbGwgc2hhcmVkIGFjcm9zcyBhbGwgZmlsZXMuXG4gICAqIEBwYXJhbSBvYmplY3RUeXBlSWQgVGhlIElEIG9mIHRoZSBvYmplY3QgdHlwZSB0byBiZSBjcmVhdGVkXG4gICAqIEBwYXJhbSBpbmRleGRhdGEgSW5kZXhkYXRhIGZvciB0aGUgbmV3IG9iamVjdChzKVxuICAgKiBAcGFyYW0gZmlsZXMgRmlsZShzKSB0byBjcmVhdGUgZG1zIG9iamVjdHMgY29udGVudChzKSB3aXRoXG4gICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHRoYXQgd2lsbCBzaG93IHVwIGluIHRoZSB1cGxvYWQgb3ZlcmxheSBkaWFsb2cgd2hpbGUgdXBsb2FkaW5nXG4gICAqXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIElEcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkXG4gICAqL1xuICBjcmVhdGVEbXNPYmplY3Qob2JqZWN0VHlwZUlkOiBzdHJpbmcsIGluZGV4ZGF0YTogYW55LCBmaWxlczogRmlsZVtdLCBsYWJlbD86IHN0cmluZywgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy4jYmFja2VuZC5nZXRBcGlCYXNlKEFwaUJhc2UuYXBpV2ViKX0vZG1zL29iamVjdHNgO1xuICAgIGNvbnN0IGRhdGEgPSBpbmRleGRhdGE7XG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXSA9IG9iamVjdFR5cGVJZDtcblxuICAgIGNvbnN0IHVwbG9hZCA9IGZpbGVzLmxlbmd0aCA/IHRoaXMuI3VwbG9hZFNlcnZpY2UudXBsb2FkTXVsdGlwYXJ0KHVybCwgZmlsZXMsIGRhdGEsIGxhYmVsLCBzaWxlbnQpIDogdGhpcy4jdXBsb2FkU2VydmljZS5jcmVhdGVEb2N1bWVudCh1cmwsIGRhdGEpO1xuXG4gICAgcmV0dXJuIHVwbG9hZFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiByZXMubWFwKChyOiBhbnkpID0+IHIucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9JRF0udmFsdWUpKSxcbiAgICAgICAgLy8gVE9ETzogUmVwbGFjZSBieSBwcm9wZXIgc29sdXRpb25cbiAgICAgICAgLy8gUmlnaHQgbm93IHRoZXJlIGlzIGEgZ2FwIGJldHdlZW4gd2hlbiB0aGUgb2JqZWN0IHdhc1xuICAgICAgICAvLyBjcmVhdGVkIGFuZCB3aGVuIGl0IGlzIGluZGV4ZWQuIFNvIGRlbGF5aW5nIGhlcmUgd2lsbFxuICAgICAgICAvLyBnaXZlIGJhY2tlbmQgdGltZSB0byBnZXQgaXRzIHN0dWZmIHRvZ2V0aGVyLlxuICAgICAgICBkZWxheSgxMDAwKVxuICAgICAgKVxuICAgICAgLnBpcGUodGhpcy50cmlnZ2VyRXZlbnQoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfQ1JFQVRFRCwgJycsIHNpbGVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIGRlbGV0ZURtc09iamVjdChpZDogc3RyaW5nLCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgdXJsID0gYC9kbXMvb2JqZWN0cy8ke2lkfWA7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5kZWxldGUodXJsLCBBcGlCYXNlLmFwaVdlYilcbiAgICAgIC5waXBlKG1hcCgoKSA9PiAoeyBpZCB9KSkpXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9ERUxFVEVELCAnJywgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBvbGRlciB2ZXJzaW9uIG9mIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIElEIG9mIHRoZSBvYmplY3QgdG8gYmUgcmVzdG9yZWRcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBvZiB0aGUgb2JqZWN0IHRvIGJlIHJlc3RvcmVkXG4gICAqL1xuICByZXN0b3JlRG1zT2JqZWN0KGlkOiBzdHJpbmcsIHZlcnNpb246IG51bWJlciwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHVybCA9IGAvZG1zL29iamVjdHMvJHtpZH0vdmVyc2lvbnMvJHt2ZXJzaW9ufS9hY3Rpb25zL3Jlc3RvcmU/d2FpdEZvclNlYXJjaENvbnNpc3RlbmN5PXRydWUmcmVzdG9yZVBhcmVudElkPWZhbHNlYDtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5wb3N0KHVybCwge30sIEFwaUJhc2UuYXBpV2ViKS5waXBlKHRoaXMudHJpZ2dlckV2ZW50KFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX1VQREFURUQsIGlkLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgKGFkZC9yZXBsYWNlKSBjb250ZW50IHRvIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIG9iamVjdElkIElEIG9mIHRoZSBkbXMgb2JqZWN0IHRvIHVwbG9hZCB0aGUgZmlsZSB0b1xuICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgdXBsb2FkQ29udGVudChvYmplY3RJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jdXBsb2FkU2VydmljZS51cGxvYWQodGhpcy5nZXRDb250ZW50UGF0aChvYmplY3RJZCksIGZpbGUpLnBpcGUodGhpcy50cmlnZ2VyRXZlbnQoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCwgb2JqZWN0SWQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRoIG9mIGRtcyBvYmplY3QgY29udGVudCBmaWxlLlxuICAgKiBAcGFyYW0gb2JqZWN0SWQgSUQgb2YgdGhlIGRtcyBvYmplY3RcbiAgICogQHBhcmFtIHZlcnNpb24gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRtcyBvYmplY3RcbiAgICovXG4gIGdldENvbnRlbnRQYXRoKG9iamVjdElkOiBzdHJpbmcsIHZlcnNpb24/OiBudW1iZXIpIHtcbiAgICByZXR1cm4gYCR7dGhpcy4jYmFja2VuZC5nZXRBcGlCYXNlKEFwaUJhc2UuYXBpV2ViKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0vY29udGVudHMvZmlsZSR7dmVyc2lvbiA/ICc/dmVyc2lvbj0nICsgdmVyc2lvbiA6ICcnfWA7XG4gIH1cblxuICAvKipcbiAgICogT3JpZ2luYWwgQVBJIFBhdGggb2YgZG1zIG9iamVjdCBjb250ZW50IGZpbGUuXG4gICAqIEBwYXJhbSBvYmplY3RJZCBJRCBvZiB0aGUgZG1zIG9iamVjdFxuICAgKiBAcGFyYW0gdmVyc2lvbiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZG1zIG9iamVjdFxuICAgKiBAcGFyYW0gcmVuZGl0aW9uIHNob3VsZCByZXR1cm4gcmVuZGl0aW9uIHBhdGggb2YgdGhlIGRtcyBvYmplY3RcbiAgICovXG4gIGdldEZ1bGxDb250ZW50UGF0aChvYmplY3RJZDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyLCByZW5kaXRpb24gPSBmYWxzZSkge1xuICAgIHJldHVybiBgJHt0aGlzLiNiYWNrZW5kLmdldEFwaUJhc2UoQXBpQmFzZS5jb3JlLCB0cnVlKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0ke3ZlcnNpb24gPyAnL3ZlcnNpb25zLycgKyB2ZXJzaW9uIDogJyd9L2NvbnRlbnRzLyR7XG4gICAgICByZW5kaXRpb24gPyAncmVuZGl0aW9ucy9wZGYnIDogJ2ZpbGUnXG4gICAgfWA7XG4gIH1cblxuICBnZXRTbGlkZVVSSShvYmplY3RJZDogc3RyaW5nLCBtaW1lVHlwZT86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkTWltZVR5cGVzID0gWycqLyonXTtcbiAgICBsZXQgc3VwcG9ydGVkID0gZmFsc2U7XG4gICAgaWYgKG1pbWVUeXBlKSB7XG4gICAgICAvLyBjaGVjayBpZiBtaW1lIHR5cGUgc3VwcG9ydHMgc2xpZGVzXG4gICAgICBzdXBwb3J0ZWRNaW1lVHlwZXMuZm9yRWFjaCgocCkgPT4gKHN1cHBvcnRlZCA9IHN1cHBvcnRlZCB8fCBVdGlscy5wYXR0ZXJuVG9SZWdFeHAocCkudGVzdChtaW1lVHlwZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuICFtaW1lVHlwZSB8fCBzdXBwb3J0ZWQgPyBgJHt0aGlzLiNiYWNrZW5kLmdldEFwaUJhc2UoQXBpQmFzZS5jb3JlLCB0cnVlKX0vZG1zL29iamVjdHMvJHtvYmplY3RJZH0vY29udGVudHMvcmVuZGl0aW9ucy9zbGlkZWAgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRG93bmxvYWRzIHRoZSBjb250ZW50IG9mIGRtcyBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gRG1zT2JqZWN0W10gZG1zT2JqZWN0cyBBcnJheSBvZiBkbXMgb2JqZWN0cyB0byBiZSBkb3dubG9hZGVkXG4gICAqIEBwYXJhbSB3aXRoVmVyc2lvbiBzaG91bGQgZG93bmxvYWQgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUgb2JqZWN0XG4gICAqL1xuICBkb3dubG9hZENvbnRlbnQob2JqZWN0czogRG1zT2JqZWN0W10sIHdpdGhWZXJzaW9uPzogYm9vbGVhbikge1xuICAgIG9iamVjdHMuZm9yRWFjaCgob2JqZWN0LCBpKSA9PlxuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVyaSA9IGAke3RoaXMuZ2V0Q29udGVudFBhdGgob2JqZWN0Py5pZCwgd2l0aFZlcnNpb24gPyBvYmplY3Q/LnZlcnNpb24gOiB1bmRlZmluZWQpfWA7XG4gICAgICAgICAgdGhpcy4jYmFja2VuZC5kb3dubG9hZCh1cmkpO1xuICAgICAgICB9LFxuICAgICAgICBVdGlscy5pc1NhZmFyaSgpID8gaSAqIDEwMDAgOiAwIC8vIFNhZmFyaSBkb2VzIG5vdCBhbGxvdyBtdWx0aSBkb3dubG9hZFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBkbXMgb2JqZWN0LlxuICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIG9iamVjdCB0byBiZSByZXRyaWV2ZWRcbiAgICogQHBhcmFtIHZlcnNpb24gRGVzaXJlZCB2ZXJzaW9uIG9mIHRoZSBvYmplY3RcbiAgICovXG4gIGdldERtc09iamVjdChpZDogc3RyaW5nLCB2ZXJzaW9uPzogbnVtYmVyLCBzaWxlbnQgPSBmYWxzZSwgcmVxdWVzdE9wdGlvbnM/OiBIdHRwT3B0aW9ucyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8RG1zT2JqZWN0PiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5nZXQoYC9kbXMvb2JqZWN0cy8ke2lkfSR7dmVyc2lvbiA/ICcvdmVyc2lvbnMvJyArIHZlcnNpb24gOiAnJ31gLCB1bmRlZmluZWQsIHJlcXVlc3RPcHRpb25zKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXRlbTogU2VhcmNoUmVzdWx0SXRlbSA9IHRoaXMuI3NlYXJjaFNlcnZpY2UudG9TZWFyY2hSZXN1bHQocmVzKS5pdGVtc1swXTtcbiAgICAgICAgICByZXR1cm4gdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QoaXRlbSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9MT0FERUQsICcnLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgdGFnIG9uIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSB1cGRhdGVkXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdGFncyBuZXcgdmFsdWVcbiAgICovXG4gIHNldERtc09iamVjdFRhZyhpZDogc3RyaW5nLCB0YWc6IHN0cmluZywgdmFsdWU6IGFueSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kXG4gICAgICAucG9zdChgL2Rtcy9vYmplY3RzL3RhZ3MvJHt0YWd9L3N0YXRlLyR7dmFsdWV9P3F1ZXJ5PVNFTEVDVCAqIEZST00gc3lzdGVtOm9iamVjdCBXSEVSRSBzeXN0ZW06b2JqZWN0SWQ9JyR7aWR9J2AsIHt9LCBBcGlCYXNlLmNvcmUpXG4gICAgICAucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVELCBpZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHRhZyBmcm9tIGEgZG1zIG9iamVjdC5cbiAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgb2JqZWN0XG4gICAqIEBwYXJhbSB0YWcgVGhlIHRhZyB0byBiZSBkZWxldGVkXG4gICAqL1xuICBkZWxldGVEbXNPYmplY3RUYWcoaWQ6IHN0cmluZywgdGFnOiBzdHJpbmcsIHNpbGVudCA9IGZhbHNlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZC5kZWxldGUoYC9kbXMvb2JqZWN0cy8ke2lkfS90YWdzLyR7dGFnfWAsIEFwaUJhc2UuY29yZSkucGlwZSh0aGlzLnRyaWdnZXJFdmVudChZdXZFdmVudFR5cGUuRE1TX09CSkVDVF9VUERBVEVELCBpZCwgc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGluZGV4ZGF0YSBvZiBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZCBJRCBvZiB0aGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBkYXRhIHRvXG4gICAqIEBwYXJhbSBkYXRhIEluZGV4ZGF0YSB0byBiZSBhcHBsaWVkXG4gICAqIEBwYXJhbSBzaWxlbnQgZmxhZyB0byB0cmlnZ2VyIERNU19PQkpFQ1RfVVBEQVRFRCBldmVudFxuICAgKi9cbiAgdXBkYXRlRG1zT2JqZWN0KGlkOiBzdHJpbmcsIGRhdGE6IGFueSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBhdGNoKGAvZG1zL29iamVjdHMvJHtpZH1gLCBkYXRhKS5waXBlKHRoaXMudHJpZ2dlckV2ZW50KFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX1VQREFURUQsIGlkLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGdpdmVuIG9iamVjdHMuXG4gICAqIEBwYXJhbSBvYmplY3RzIHRoZSBvYmplY3RzIHRvIHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZURtc09iamVjdHMob2JqZWN0czogeyBpZDogc3RyaW5nOyBkYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH1bXSwgc2lsZW50ID0gZmFsc2UpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmRcbiAgICAgIC5wYXRjaChgL2Rtcy9vYmplY3RzYCwge1xuICAgICAgICBwYXRjaGVzOiBvYmplY3RzLm1hcCgobykgPT4gKHtcbiAgICAgICAgICBpZDogby5pZCxcbiAgICAgICAgICBkYXRhOiBvLmRhdGFcbiAgICAgICAgfSkpXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRoaXMuI3RyaWdnZXJFdmVudHMoXG4gICAgICAgICAgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCxcbiAgICAgICAgICBvYmplY3RzLm1hcCgobykgPT4gby5pZCksXG4gICAgICAgICAgc2lsZW50XG4gICAgICAgIClcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyBhIHRhZyBvbiBhIGRtcyBvYmplY3QuXG4gICAqIEBwYXJhbSBpZHMgTGlzdCBvZiBJRHMgb2Ygb2JqZWN0c1xuICAgKiBAcGFyYW0gdGFnIFRoZSB0YWcgdG8gYmUgdXBkYXRlZFxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHRhZ3MgbmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGVEbXNPYmplY3RzVGFnKGlkczogc3RyaW5nW10sIHRhZzogc3RyaW5nLCB2YWx1ZTogYW55LCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hVcGRhdGVUYWcoaWRzLCB0YWcsIHZhbHVlKS5waXBlKHRoaXMuI3RyaWdnZXJFdmVudHMoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCwgaWRzLCBzaWxlbnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyBnaXZlbiBvYmplY3RzIHRvIGEgZGlmZmVyZW50IGZvbGRlci5cbiAgICogQHBhcmFtIGZvbGRlcklkIHRoZSBpZCBvZiB0aGUgbmV3IHBhcmVudCBmb2xkZXJcbiAgICogQHBhcmFtIG9iamVjdHMgb2JqZWN0cyB0byBiZSBtb3ZlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgbW92ZSBvcGVyYXRpb25cbiAgICovXG4gIG1vdmVEbXNPYmplY3RzKHRhcmdldEZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvYmplY3RzOiBEbXNPYmplY3RbXSwgb3B0aW9ucz86IE9iamVjdE1vdmVPcHRpb25zKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVEbXNPYmplY3RzKG9iamVjdHMubWFwKChvKSA9PiAoeyBpZDogby5pZCwgZGF0YTogeyBbQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfSURdOiB0YXJnZXRGb2xkZXJJZCB9IH0pLCB0cnVlKSkucGlwZShcbiAgICAgIHRhcCgocmVzKSA9PiAhb3B0aW9ucz8uc2lsZW50ICYmIHRoaXMuI2V2ZW50U2VydmljZS50cmlnZ2VyKFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUU19NT1ZFRCwgcmVzKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgZ2l2ZW4gb2JqZWN0cyB0byBhIGRpZmZlcmVudCBmb2xkZXIuIFRoZSBvYmplY3RzIHdpbGwgYmUgY29waWVkIHdpdGggdGhlaXIgaW5kZXhkYXRhIHJlZmVyZW5jaW5nXG4gICAqIHRoZSBleGlzdGluZyBjb250ZW50IG9mIHRoZSBzb3VyY2Ugb2JqZWN0LlxuICAgKiBAcGFyYW0gdGFyZ2V0Rm9sZGVySWQgVGhlIElEIG9mIHRoZSB0YXJnZXQgZm9sZGVyXG4gICAqIEBwYXJhbSBvYmplY3RzIFRoZSBvYmplY3RzIHRvIGJlIGNvcGllZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIGZvciB0aGUgY29weSBvcGVyYXRpb25cbiAgICovXG4gIGNvcHlEbXNPYmplY3RzKHRhcmdldEZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvYmplY3RzOiBEbXNPYmplY3RbXSwgb3B0aW9ucz86IE9iamVjdENvcHlPcHRpb25zKTogT2JzZXJ2YWJsZTxDb3JlQXBpUmVzcG9uc2U+IHtcbiAgICBjb25zdCBleGNsdWRlUHJvcGVydGllcyA9IFtcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX0lELFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVEVEX0JZLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5DUkVBVElPTl9EQVRFLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5NT0RJRklFRF9CWSxcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuTU9ESUZJQ0FUSU9OX0RBVEUsXG4gICAgICBCYXNlT2JqZWN0VHlwZUZpZWxkLlZFUlNJT05fTlVNQkVSLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5UUkFDRV9JRCxcbiAgICAgIEJhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX09CSkVDVF9UWVBFX0lELFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5QQVJFTlRfVkVSU0lPTl9OVU1CRVJcbiAgICBdO1xuXG4gICAgY29uc3QgbWFwcGVkT2JqZWN0czogQ29yZUFwaU9iamVjdFtdID0gb2JqZWN0cy5tYXAoKG8pID0+IHtcbiAgICAgIG8uZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRF0gPSB0YXJnZXRGb2xkZXJJZDtcblxuICAgICAgLy8gUmVtb3ZlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgY29waWVkLlxuICAgICAgLy8gVGhpcyBhbHNvIGluY2x1ZGVzIGNvbnRlbnQgc3RyZWFtIGZpZWxkcyBidW5kbGVkIGludG8gdGhlIG9iamVjdHMgZGF0YSBmaWVsZC5cbiAgICAgIC8vIFByb3BlcnRpZXMgZW5kaW5nIHdpdGggJ190aXRsZScgYXJlIGFsc28gZXhjbHVkZWQgYXMgdGhleSBhcmUgZW5yaWNobWVudCB2YWx1ZXNcbiAgICAgIC8vIHByb3ZpZGVkIGJ5IEFQSS1XZWIuXG4gICAgICBPYmplY3Qua2V5cyhvLmRhdGEpXG4gICAgICAgIC5maWx0ZXIoKGtleSkgPT4ga2V5LmVuZHNXaXRoKCdfdGl0bGUnKSB8fCBleGNsdWRlUHJvcGVydGllcy5pbmNsdWRlcyhrZXkpIHx8IE9iamVjdC52YWx1ZXMoQ29udGVudFN0cmVhbUZpZWxkKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KG8uZGF0YSwga2V5KSk7XG5cbiAgICAgIC8vIG1hcCBmaWx0ZXJlZCBkYXRhIGZpZWxkIHRvIGRhdGEgZm9ybWF0IHJlcXVpcmVkIGJ5IHRoZSBDb3JlLUFQSVxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5rZXlzKG8uZGF0YSkucmVkdWNlKFxuICAgICAgICAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgICBhY2Nba2V5XSA9IHsgdmFsdWU6IG8uZGF0YVtrZXldIH07XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAge30gYXMgUmVjb3JkPHN0cmluZywgQ29yZUFwaU9iamVjdFByb3BlcnR5PlxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgICAgb2JqZWN0VHlwZUlkOiBvLm9iamVjdFR5cGVJZCxcbiAgICAgICAgLi4uKG8uY29udGVudFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb250ZW50U3RyZWFtczogW28uY29udGVudF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KVxuICAgICAgfSBhcyBDb3JlQXBpT2JqZWN0O1xuICAgIH0pO1xuXG4gICAgY29uc3QgcXVlcnkgPSBvcHRpb25zXG4gICAgICA/IE9iamVjdC5rZXlzKG9wdGlvbnMpXG4gICAgICAgICAgLm1hcCgoa2V5OiBzdHJpbmcpID0+IGAke2tleX09JHsob3B0aW9ucyBhcyBhbnkpW2tleV19YClcbiAgICAgICAgICAuam9pbignJicpXG4gICAgICA6ICcnO1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBvc3QoYC9kbXMvb2JqZWN0cz8ke3F1ZXJ5fX1gLCB7IG9iamVjdHM6IG1hcHBlZE9iamVjdHMgfSwgQXBpQmFzZS5jb3JlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBidW5jaCBvZiBkbXMgb2JqZWN0cy5cbiAgICogQHBhcmFtIGlkcyBMaXN0IG9mIElEcyBvZiBvYmplY3RzIHRvIGJlIHJldHJpZXZlZFxuICAgKi9cbiAgZ2V0RG1zT2JqZWN0cyhpZHM6IHN0cmluZ1tdLCBzaWxlbnQgPSBmYWxzZSk6IE9ic2VydmFibGU8RG1zT2JqZWN0W10+IHtcbiAgICByZXR1cm4gdGhpcy5iYXRjaEdldChpZHMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChfcmVzOiBhbnlbXSkgPT5cbiAgICAgICAgICBfcmVzLm1hcCgocmVzLCBpKSA9PiAocmVzPy5fZXJyb3IgPyB7IC4uLnJlcywgaWQ6IGlkc1tpXSB9IDogdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QodGhpcy4jc2VhcmNoU2VydmljZS50b1NlYXJjaFJlc3VsdChyZXMpLml0ZW1zWzBdKSkpXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5waXBlKHRoaXMuI3RyaWdnZXJFdmVudHMoWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfTE9BREVELCB1bmRlZmluZWQsIHNpbGVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhIGJ1bmNoIG9mIGRtcyBvYmplY3RzLlxuICAgKiBAcGFyYW0gaWRzIExpc3Qgb2YgSURzIG9mIG9iamVjdHMgdG8gYmUgZGVsZXRlZFxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgZGVsZXRlIG9wZXJhdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWxldGUgcmVzdWx0cy5cbiAgICovXG4gIGRlbGV0ZURtc09iamVjdHMoXG4gICAgb2JqZWN0czogc3RyaW5nW10gfCB7IGlkOiBzdHJpbmc7IHN1YmplY3Q6IHN0cmluZyB9W10sXG5cbiAgICBvcHRpb25zPzogT2JqZWN0RGVsZXRlT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPE9iamVjdERlbGV0ZVJlc3VsdFtdPiB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBvcHRpb25zXG4gICAgICA/IGA/JHtPYmplY3Qua2V5cyhvcHRpb25zKVxuICAgICAgICAgIC5maWx0ZXIoKGspID0+IFsnd2FpdEZvclNlYXJjaENvbnNpc3RlbmN5JywgJ2dyZWVkeSddLmluY2x1ZGVzKGspKVxuICAgICAgICAgIC5tYXAoKGspID0+IGAke2t9PSR7KG9wdGlvbnMgYXMgYW55KVtrXX1gKVxuICAgICAgICAgIC5qb2luKCcmJyl9YFxuICAgICAgOiAnJztcblxuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kXG4gICAgICAuZGVsZXRlKGAvZG1zL29iamVjdHMke3F1ZXJ5UGFyYW1zfWAsIEFwaUJhc2UuY29yZSwge1xuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgb2JqZWN0czogb2JqZWN0cy5tYXAoKG8pID0+ICh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOlxuICAgICAgICAgICAgICB0eXBlb2YgbyA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbTpvYmplY3RJZCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICdzeXN0ZW06b2JqZWN0SWQnOiB7IHZhbHVlOiBvLmlkIH0sXG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3Q6IHsgdmFsdWU6IG8uc3ViamVjdCB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXMpID0+XG4gICAgICAgICAgcmVzPy5vYmplY3RzPy5tYXAoKHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdiA9IHIub3B0aW9ucz8uW1N5c3RlbVJlc3VsdC5ERUxFVEVdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IHIucHJvcGVydGllcz8uW0Jhc2VPYmplY3RUeXBlRmllbGQuT0JKRUNUX0lEXT8udmFsdWUsXG4gICAgICAgICAgICAgIHByb3BlcnRpZXM6IHIucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgLi4uKHY/Lmh0dHBTdGF0dXNDb2RlID49IDQwMCA/IHsgX2Vycm9yOiB7IHN0YXR1czogdi5odHRwU3RhdHVzQ29kZSwgbWVzc2FnZTogdi5tZXNzYWdlIH0gfSA6IHt9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgICAucGlwZSh0aGlzLiN0cmlnZ2VyRXZlbnRzKFl1dkV2ZW50VHlwZS5ETVNfT0JKRUNUX0RFTEVURUQsIHVuZGVmaW5lZCwgb3B0aW9ucz8uc2lsZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBkbXMgb2JqZWN0IHZlcnNpb25zLlxuICAgKiBAcGFyYW0gaWQgSUQgb2YgdGhlIG9iamVjdCB0byBiZSByZXRyaWV2ZWRcbiAgICovXG4gIGdldERtc09iamVjdFZlcnNpb25zKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuZ2V0KCcvZG1zL29iamVjdHMvJyArIGlkICsgJy92ZXJzaW9ucycpLnBpcGUoXG4gICAgICBtYXAoKHJlcykgPT4ge1xuICAgICAgICBjb25zdCBpdGVtczogU2VhcmNoUmVzdWx0SXRlbVtdID0gdGhpcy4jc2VhcmNoU2VydmljZS50b1NlYXJjaFJlc3VsdChyZXMpLml0ZW1zIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtKSA9PiB0aGlzLiNzZWFyY2hSZXN1bHRUb0Rtc09iamVjdChpdGVtKSk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgocmVzKSA9PiByZXMuc29ydChVdGlscy5zb3J0VmFsdWVzKCd2ZXJzaW9uJywgU29ydC5ERVNDKSkpXG4gICAgKTtcbiAgfVxuXG4gIGdldERtc09iamVjdFZlcnNpb24oaWQ6IHN0cmluZywgdmVyc2lvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTxEbXNPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy4jYmFja2VuZFxuICAgICAgLmdldChgL2Rtcy9vYmplY3RzLyR7aWR9L3ZlcnNpb25zLyR7dmVyc2lvbn1gKVxuICAgICAgLnBpcGUobWFwKChyZXMpID0+IHRoaXMuI3NlYXJjaFJlc3VsdFRvRG1zT2JqZWN0KHRoaXMuI3NlYXJjaFNlcnZpY2UudG9TZWFyY2hSZXN1bHQocmVzKS5pdGVtc1swXSkpKTtcbiAgfVxuXG4gIGNvcmVBcGlSZXNwb25zZVRvRG1zT2JqZWN0KHJlczogQ29yZUFwaVJlc3BvbnNlKTogRG1zT2JqZWN0IHtcbiAgICByZXR1cm4gdGhpcy4jc2VhcmNoUmVzdWx0VG9EbXNPYmplY3Qoe1xuICAgICAgb2JqZWN0VHlwZUlkOiByZXMucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXS52YWx1ZSBhcyBzdHJpbmcsXG4gICAgICBmaWVsZHM6IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMocmVzLnByb3BlcnRpZXMpKSxcbiAgICAgIGNvbnRlbnQ6IHJlcy5jb250ZW50U3RyZWFtcz8uWzBdXG4gICAgfSk7XG4gIH1cblxuICAjc2VhcmNoUmVzdWx0VG9EbXNPYmplY3QocmVzSXRlbTogU2VhcmNoUmVzdWx0SXRlbSk6IERtc09iamVjdCB7XG4gICAgcmV0dXJuIG5ldyBEbXNPYmplY3QocmVzSXRlbSk7XG4gIH1cblxuICBiYXRjaFVwZGF0ZVRhZyhpZHM6IHN0cmluZ1tdLCB0YWc6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLmJhdGNoKFxuICAgICAgaWRzLm1hcCgoaWQpID0+ICh7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICB1cmk6IGAvZG1zL29iamVjdHMvdGFncy8ke3RhZ30vc3RhdGUvJHt2YWx1ZX0/cXVlcnk9U0VMRUNUICogRlJPTSBzeXN0ZW06b2JqZWN0IFdIRVJFIHN5c3RlbTpvYmplY3RJZD0nJHtpZH0nYCxcbiAgICAgICAgYmFzZTogQXBpQmFzZS5jb3JlLFxuICAgICAgICBib2R5OiB7fVxuICAgICAgfSkpXG4gICAgKTtcbiAgfVxuXG4gIGJhdGNoRGVsZXRlVGFnKGlkczogc3RyaW5nW10sIHRhZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuYmF0Y2goXG4gICAgICBpZHMubWFwKChpZCkgPT4gKHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgdXJpOiBgL2Rtcy9vYmplY3RzLyR7aWR9L3RhZ3MvJHt0YWd9YCxcbiAgICAgICAgYmFzZTogQXBpQmFzZS5jb3JlXG4gICAgICB9KSlcbiAgICApO1xuICB9XG5cbiAgYmF0Y2hEZWxldGUoaWRzOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLmJhdGNoKGlkcy5tYXAoKGlkKSA9PiAoeyBtZXRob2Q6ICdERUxFVEUnLCB1cmk6IGAvZG1zL29iamVjdHMvJHtpZH1gIH0pKSk7XG4gIH1cblxuICBiYXRjaEdldChpZHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIHRoaXMuI2JhY2tlbmQuYmF0Y2goaWRzLm1hcCgoaWQpID0+ICh7IG1ldGhvZDogJ0dFVCcsIHVyaTogYC9kbXMvb2JqZWN0cy8ke2lkfWAgfSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgc2VhcmNoIHJlc3VsdCBmcm9tIHRoZSBiYWNrZW5kIHRvIGFwcGxpY2F0aW9ucyBTZWFyY2hSZXN1bHQgb2JqZWN0XG4gICAqIEBwYXJhbSBzZWFyY2hSZXNwb25zZSBUaGUgYmFja2VuZCByZXNwb25zZVxuICAgKi9cbiAgdG9TZWFyY2hSZXN1bHQoc2VhcmNoUmVzcG9uc2U6IFNlYXJjaFJlc3BvbnNlKTogU2VhcmNoUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHRMaXN0SXRlbXM6IFNlYXJjaFJlc3VsdEl0ZW1bXSA9IFtdO1xuICAgIGNvbnN0IG9iamVjdFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgc2VhcmNoUmVzcG9uc2Uub2JqZWN0cy5mb3JFYWNoKChvOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IG5ldyBNYXAoKTtcbiAgICAgIC8vIHByb2Nlc3MgcHJvcGVydGllcyBzZWN0aW9uIG9mIHJlc3VsdFxuICAgICAgT2JqZWN0LmtleXMoby5wcm9wZXJ0aWVzKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICBsZXQgdmFsdWUgPSBvLnByb3BlcnRpZXNba2V5XS52YWx1ZTtcbiAgICAgICAgaWYgKG8ucHJvcGVydGllc1trZXldLmNsdmFsdWUpIHtcbiAgICAgICAgICAvLyB0YWJsZSBmaWVsZHMgd2lsbCBoYXZlIGEgY2xpZW50VmFsdWUgdG9vIC4uLlxuICAgICAgICAgIHZhbHVlID0gby5wcm9wZXJ0aWVzW2tleV0uY2x2YWx1ZTtcbiAgICAgICAgICAvLyAuLi4gYW5kIGFsc28gbWF5IGNvbnRhaW4gdmFsdWVzIHRoYXQgbmVlZCB0byBiZSByZXNvbHZlZFxuICAgICAgICAgIGlmIChvLnByb3BlcnRpZXNba2V5XS5yZXNvbHZlZFZhbHVlcykge1xuICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgodjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIE9iamVjdC5rZXlzKHYpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNWYWx1ZSA9IEFycmF5LmlzQXJyYXkodltrXSkgPyB2W2tdLm1hcCgoaTogYW55KSA9PiBvLnByb3BlcnRpZXNba2V5XS5yZXNvbHZlZFZhbHVlc1tpXSkgOiBvLnByb3BlcnRpZXNba2V5XS5yZXNvbHZlZFZhbHVlc1t2W2tdXTtcbiAgICAgICAgICAgICAgICBpZiAocmVzVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHZbYCR7a31fdGl0bGVgXSA9IHJlc1ZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmaWVsZHMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAoby5wcm9wZXJ0aWVzW2tleV0udGl0bGUpIHtcbiAgICAgICAgICBmaWVsZHMuc2V0KGtleSArICdfdGl0bGUnLCBvLnByb3BlcnRpZXNba2V5XS50aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBwcm9jZXNzIGNvbnRlbnRTdHJlYW1zIHNlY3Rpb24gb2YgcmVzdWx0IGlmIGF2YWlsYWJsZS5cbiAgICAgIC8vIE9iamVjdHMgdGhhdCBkb24ndCBoYXZlIGZpbGVzIGF0dGFjaGVkIHdvbid0IGhhdmUgdGhpcyBzZWN0aW9uXG4gICAgICBsZXQgY29udGVudDogU2VhcmNoUmVzdWx0Q29udGVudCB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChvLmNvbnRlbnRTdHJlYW1zICYmIG8uY29udGVudFN0cmVhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyB3ZSBhc3N1bWUgdGhhdCBlYWNoIHJlc3VsdCBvYmplY3Qgb25seSBoYXMgT05FIGZpbGUgYXR0YWNoZWQsIGFsdG91Z2hcbiAgICAgICAgLy8gdGhpcyBpcyBhbiBhcnJheSBhbmQgdGhlcmUgbWF5IGJlIG1vcmVcbiAgICAgICAgY29uc3QgY29udGVudFN0cmVhbSA9IG8uY29udGVudFN0cmVhbXNbMF07XG4gICAgICAgIC8vIGFsc28gYWRkIGNvbnRlbnRzdHJlYW0gcmVsYXRlZCBmaWVsZHMgdG8gdGhlIHJlc3VsdCBmaWVsZHNcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuTEVOR1RILCBjb250ZW50U3RyZWFtLmxlbmd0aCk7XG4gICAgICAgIGZpZWxkcy5zZXQoQ29udGVudFN0cmVhbUZpZWxkLk1JTUVfVFlQRSwgY29udGVudFN0cmVhbS5taW1lVHlwZSk7XG4gICAgICAgIGZpZWxkcy5zZXQoQ29udGVudFN0cmVhbUZpZWxkLkZJTEVOQU1FLCBjb250ZW50U3RyZWFtLmZpbGVOYW1lKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuSUQsIGNvbnRlbnRTdHJlYW0uY29udGVudFN0cmVhbUlkKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuUkFOR0UsIGNvbnRlbnRTdHJlYW0uY29udGVudFN0cmVhbVJhbmdlKTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuUkVQT1NJVE9SWV9JRCwgY29udGVudFN0cmVhbS5yZXBvc2l0b3J5SWQpO1xuICAgICAgICBmaWVsZHMuc2V0KENvbnRlbnRTdHJlYW1GaWVsZC5ESUdFU1QsIGNvbnRlbnRTdHJlYW0uZGlnZXN0KTtcbiAgICAgICAgZmllbGRzLnNldChDb250ZW50U3RyZWFtRmllbGQuQVJDSElWRV9QQVRILCBjb250ZW50U3RyZWFtLmFyY2hpdmVQYXRoKTtcblxuICAgICAgICBjb250ZW50ID0ge1xuICAgICAgICAgIGNvbnRlbnRTdHJlYW1JZDogY29udGVudFN0cmVhbS5jb250ZW50U3RyZWFtSWQsXG4gICAgICAgICAgcmVwb3NpdG9yeUlkOiBjb250ZW50U3RyZWFtLnJlcG9zaXRvcnlJZCxcbiAgICAgICAgICByYW5nZTogY29udGVudFN0cmVhbS5yYW5nZSxcbiAgICAgICAgICBkaWdlc3Q6IGNvbnRlbnRTdHJlYW0uZGlnZXN0LFxuICAgICAgICAgIGFyY2hpdmVQYXRoOiBjb250ZW50U3RyZWFtLmFyY2hpdmVQYXRoLFxuICAgICAgICAgIGZpbGVOYW1lOiBjb250ZW50U3RyZWFtLmZpbGVOYW1lLFxuICAgICAgICAgIG1pbWVUeXBlOiBjb250ZW50U3RyZWFtLm1pbWVUeXBlLFxuICAgICAgICAgIHNpemU6IGNvbnRlbnRTdHJlYW0ubGVuZ3RoXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iamVjdFR5cGVJZCA9IG8ucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXSA/IG8ucHJvcGVydGllc1tCYXNlT2JqZWN0VHlwZUZpZWxkLk9CSkVDVF9UWVBFX0lEXS52YWx1ZSA6IG51bGw7XG4gICAgICBpZiAob2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlSWQpID09PSAtMSkge1xuICAgICAgICBvYmplY3RUeXBlcy5wdXNoKG9iamVjdFR5cGVJZCk7XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdExpc3RJdGVtcy5wdXNoKHtcbiAgICAgICAgb2JqZWN0VHlwZUlkLFxuICAgICAgICBjb250ZW50LFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHBlcm1pc3Npb25zOiBvLnBlcm1pc3Npb25zXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdDogU2VhcmNoUmVzdWx0ID0ge1xuICAgICAgaGFzTW9yZUl0ZW1zOiBzZWFyY2hSZXNwb25zZS5oYXNNb3JlSXRlbXMsXG4gICAgICB0b3RhbE51bUl0ZW1zOiBzZWFyY2hSZXNwb25zZS50b3RhbE51bUl0ZW1zLFxuICAgICAgaXRlbXM6IHJlc3VsdExpc3RJdGVtcyxcbiAgICAgIG9iamVjdFR5cGVzXG4gICAgfTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2V2ZW50L2V2ZW50LmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUcmlnZ2VyYWJsZSBhbmQgU3Vic2NyaWJhYmxlIGV2ZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFl1dkV2ZW50IHtcbiAgICAvKipcbiAgICAgKiB0eXBlXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGRhdGEgdG8gYmUgcGFzc2VkIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gICAgICovXG4gICAgZGF0YT86IGFueTtcbiAgfSJdfQ==
@@ -0,0 +1,38 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import { filter } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Service for providing triggered events
7
+ */
8
+ export class EventService {
9
+ constructor() {
10
+ this.#eventSource = new Subject();
11
+ this.event$ = this.#eventSource.asObservable();
12
+ }
13
+ #eventSource;
14
+ /**
15
+ * Trigger an global event
16
+ * @param type Type/key of the event
17
+ * @param data Data to be send along with the event
18
+ */
19
+ trigger(type, data) {
20
+ this.#eventSource.next({ type, data });
21
+ }
22
+ /**
23
+ * Listen on a triggered event
24
+ * @param types Type/key of the event
25
+ */
26
+ on(...types) {
27
+ return this.event$.pipe(filter((event) => event && !!types.find((t) => t === event.type)));
28
+ }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
30
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, providedIn: 'root' }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EventService, decorators: [{
33
+ type: Injectable,
34
+ args: [{
35
+ providedIn: 'root'
36
+ }]
37
+ }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS9ldmVudC9ldmVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBRXhDOztHQUVHO0FBSUgsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJRSxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFDdkMsV0FBTSxHQUF5QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO0tBa0JqRTtJQW5CQyxZQUFZLENBQTJCO0lBR3ZDOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsSUFBWSxFQUFFLElBQVU7UUFDOUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsRUFBRSxDQUFDLEdBQUcsS0FBZTtRQUNuQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDOytHQW5CVSxZQUFZO21IQUFaLFlBQVksY0FGWCxNQUFNOzs0RkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFl1dkV2ZW50IH0gZnJvbSAnLi9ldmVudC5pbnRlcmZhY2UnO1xuLyoqXG4gKiBTZXJ2aWNlIGZvciBwcm92aWRpbmcgdHJpZ2dlcmVkIGV2ZW50c1xuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBFdmVudFNlcnZpY2Uge1xuICAjZXZlbnRTb3VyY2UgPSBuZXcgU3ViamVjdDxZdXZFdmVudD4oKTtcbiAgZXZlbnQkOiBPYnNlcnZhYmxlPFl1dkV2ZW50PiA9IHRoaXMuI2V2ZW50U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGdsb2JhbCBldmVudFxuICAgKiBAcGFyYW0gdHlwZSBUeXBlL2tleSBvZiB0aGUgZXZlbnRcbiAgICogQHBhcmFtIGRhdGEgRGF0YSB0byBiZSBzZW5kIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gICAqL1xuICB0cmlnZ2VyKHR5cGU6IHN0cmluZywgZGF0YT86IGFueSkge1xuICAgIHRoaXMuI2V2ZW50U291cmNlLm5leHQoeyB0eXBlLCBkYXRhIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBvbiBhIHRyaWdnZXJlZCBldmVudFxuICAgKiBAcGFyYW0gdHlwZXMgVHlwZS9rZXkgb2YgdGhlIGV2ZW50XG4gICAqL1xuICBvbiguLi50eXBlczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFl1dkV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnQkLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgJiYgISF0eXBlcy5maW5kKCh0KSA9PiB0ID09PSBldmVudC50eXBlKSkpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Events emitted by parts of the application
3
+ */
4
+ export var YuvEventType;
5
+ (function (YuvEventType) {
6
+ YuvEventType["LOGOUT"] = "yuv.user.logout";
7
+ YuvEventType["CLIENT_LOCALE_CHANGED"] = "yuv.user.locale.client.changed";
8
+ YuvEventType["DMS_OBJECT_LOADED"] = "yuv.dms.object.loaded";
9
+ YuvEventType["DMS_OBJECT_CREATED"] = "yuv.dms.object.created";
10
+ YuvEventType["DMS_OBJECT_DELETED"] = "yuv.dms.object.deleted";
11
+ YuvEventType["DMS_OBJECT_UPDATED"] = "yuv.dms.object.updated";
12
+ YuvEventType["DMS_OBJECTS_MOVED"] = "yuv.dms.objects.moved";
13
+ })(YuvEventType || (YuvEventType = {}));
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy95dXV2aXMvY2xpZW50LWNvcmUvc3JjL2xpYi9zZXJ2aWNlL2V2ZW50L2V2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLFlBUVg7QUFSRCxXQUFZLFlBQVk7SUFDdEIsMENBQTBCLENBQUE7SUFDMUIsd0VBQXdELENBQUE7SUFDeEQsMkRBQTJDLENBQUE7SUFDM0MsNkRBQTZDLENBQUE7SUFDN0MsNkRBQTZDLENBQUE7SUFDN0MsNkRBQTZDLENBQUE7SUFDN0MsMkRBQTJDLENBQUE7QUFDN0MsQ0FBQyxFQVJXLFlBQVksS0FBWixZQUFZLFFBUXZCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdmVudHMgZW1pdHRlZCBieSBwYXJ0cyBvZiB0aGUgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGVudW0gWXV2RXZlbnRUeXBlIHtcbiAgTE9HT1VUID0gJ3l1di51c2VyLmxvZ291dCcsXG4gIENMSUVOVF9MT0NBTEVfQ0hBTkdFRCA9ICd5dXYudXNlci5sb2NhbGUuY2xpZW50LmNoYW5nZWQnLFxuICBETVNfT0JKRUNUX0xPQURFRCA9ICd5dXYuZG1zLm9iamVjdC5sb2FkZWQnLFxuICBETVNfT0JKRUNUX0NSRUFURUQgPSAneXV2LmRtcy5vYmplY3QuY3JlYXRlZCcsXG4gIERNU19PQkpFQ1RfREVMRVRFRCA9ICd5dXYuZG1zLm9iamVjdC5kZWxldGVkJyxcbiAgRE1TX09CSkVDVF9VUERBVEVEID0gJ3l1di5kbXMub2JqZWN0LnVwZGF0ZWQnLFxuICBETVNfT0JKRUNUU19NT1ZFRCA9ICd5dXYuZG1zLm9iamVjdHMubW92ZWQnXG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRtLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMveXV1dmlzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZS9pZG0vaWRtLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBPcmdhbml6YXRpb25TZXRFbnRyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHR5cGU6ICd1c2VyJyB8ICdyb2xlJztcbn1cbiJdfQ==