@yuuvis/app-drive 0.7.3

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 (107) hide show
  1. package/README.md +47 -0
  2. package/esm2022/extensions/index.mjs +2 -0
  3. package/esm2022/extensions/lib/extensions.module.mjs +35 -0
  4. package/esm2022/extensions/lib/extensions.service.mjs +44 -0
  5. package/esm2022/extensions/lib/object-config.defaults.mjs +19 -0
  6. package/esm2022/extensions/yuuvis-app-drive-extensions.mjs +5 -0
  7. package/esm2022/index.mjs +5 -0
  8. package/esm2022/lib/actions/copy-link/copy-link.action.mjs +40 -0
  9. package/esm2022/lib/actions/index.mjs +7 -0
  10. package/esm2022/lib/actions/manage-versions/manage-versions.action.mjs +33 -0
  11. package/esm2022/lib/actions/manage-versions/manage-versions.component.mjs +105 -0
  12. package/esm2022/lib/actions/paste/paste.action.mjs +41 -0
  13. package/esm2022/lib/actions/rename/rename.action.mjs +31 -0
  14. package/esm2022/lib/actions/rename/rename.component.mjs +42 -0
  15. package/esm2022/lib/actions/rename/rename.validator.mjs +23 -0
  16. package/esm2022/lib/actions/updateContent/update.content.action.mjs +52 -0
  17. package/esm2022/lib/components/add-button/add-button-overlay/add-button-overlay.component.mjs +109 -0
  18. package/esm2022/lib/components/add-button/add-button.component.mjs +39 -0
  19. package/esm2022/lib/components/breadcrumb/breadcrumb.component.mjs +74 -0
  20. package/esm2022/lib/components/folder-tree/folder-tree.component.mjs +89 -0
  21. package/esm2022/lib/components/index.mjs +10 -0
  22. package/esm2022/lib/components/object-name/object-name.component.mjs +60 -0
  23. package/esm2022/lib/components/overlay/create-folder/create-folder.component.mjs +48 -0
  24. package/esm2022/lib/components/paste-from-clipboard/paste-from-clipboard.component.mjs +28 -0
  25. package/esm2022/lib/components/ribbon/ribbon.component.mjs +102 -0
  26. package/esm2022/lib/components/search-filter/date-range-picker/date-range-picker.component.mjs +38 -0
  27. package/esm2022/lib/components/search-filter/search-filter.component.mjs +429 -0
  28. package/esm2022/lib/components/sort/sort.component.mjs +156 -0
  29. package/esm2022/lib/components/versions-list/tile/tile.component.mjs +60 -0
  30. package/esm2022/lib/components/versions-list/versions-list.component.mjs +94 -0
  31. package/esm2022/lib/container/drive/drive.component.mjs +116 -0
  32. package/esm2022/lib/drive.icons.mjs +16 -0
  33. package/esm2022/lib/drive.schema.mjs +49 -0
  34. package/esm2022/lib/lib.routes.mjs +17 -0
  35. package/esm2022/lib/pages/files/files.component.mjs +377 -0
  36. package/esm2022/lib/pages/object/object.component.mjs +200 -0
  37. package/esm2022/lib/services/drive/drive.interface.mjs +14 -0
  38. package/esm2022/lib/services/drive/drive.service.mjs +437 -0
  39. package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.mjs +158 -0
  40. package/esm2022/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.mjs +2 -0
  41. package/esm2022/lib/services/drive/versions/versions.mapping.mjs +42 -0
  42. package/esm2022/lib/services/index.mjs +5 -0
  43. package/esm2022/lib/services/providers/drive.providers.mjs +10 -0
  44. package/esm2022/lib/services/resolver/files.resolver.mjs +12 -0
  45. package/esm2022/lib/services/resolver/index.mjs +3 -0
  46. package/esm2022/lib/services/resolver/versions.route.resolver.mjs +10 -0
  47. package/esm2022/lib/services/stored-query/stored-query.data.mjs +25 -0
  48. package/esm2022/lib/services/stored-query/stored-query.interface.mjs +2 -0
  49. package/esm2022/lib/services/stored-query/stored-query.service.mjs +41 -0
  50. package/esm2022/lib/services/tokens/breadcrumb-max-depth.token.mjs +3 -0
  51. package/esm2022/lib/services/tokens/index.mjs +2 -0
  52. package/esm2022/yuuvis-app-drive.mjs +5 -0
  53. package/extensions/README.md +3 -0
  54. package/extensions/index.d.ts +1 -0
  55. package/extensions/lib/extensions.module.d.ts +6 -0
  56. package/extensions/lib/extensions.service.d.ts +7 -0
  57. package/extensions/lib/object-config.defaults.d.ts +2 -0
  58. package/fesm2022/yuuvis-app-drive-extensions.mjs +99 -0
  59. package/fesm2022/yuuvis-app-drive-extensions.mjs.map +1 -0
  60. package/fesm2022/yuuvis-app-drive.mjs +2945 -0
  61. package/fesm2022/yuuvis-app-drive.mjs.map +1 -0
  62. package/index.d.ts +4 -0
  63. package/lib/actions/copy-link/copy-link.action.d.ts +18 -0
  64. package/lib/actions/index.d.ts +6 -0
  65. package/lib/actions/manage-versions/manage-versions.action.d.ts +17 -0
  66. package/lib/actions/manage-versions/manage-versions.component.d.ts +32 -0
  67. package/lib/actions/paste/paste.action.d.ts +17 -0
  68. package/lib/actions/rename/rename.action.d.ts +17 -0
  69. package/lib/actions/rename/rename.component.d.ts +12 -0
  70. package/lib/actions/rename/rename.validator.d.ts +5 -0
  71. package/lib/actions/updateContent/update.content.action.d.ts +18 -0
  72. package/lib/components/add-button/add-button-overlay/add-button-overlay.component.d.ts +26 -0
  73. package/lib/components/add-button/add-button.component.d.ts +12 -0
  74. package/lib/components/breadcrumb/breadcrumb.component.d.ts +25 -0
  75. package/lib/components/folder-tree/folder-tree.component.d.ts +13 -0
  76. package/lib/components/index.d.ts +8 -0
  77. package/lib/components/object-name/object-name.component.d.ts +21 -0
  78. package/lib/components/overlay/create-folder/create-folder.component.d.ts +12 -0
  79. package/lib/components/paste-from-clipboard/paste-from-clipboard.component.d.ts +13 -0
  80. package/lib/components/ribbon/ribbon.component.d.ts +24 -0
  81. package/lib/components/search-filter/date-range-picker/date-range-picker.component.d.ts +13 -0
  82. package/lib/components/search-filter/search-filter.component.d.ts +23 -0
  83. package/lib/components/sort/sort.component.d.ts +31 -0
  84. package/lib/components/versions-list/tile/tile.component.d.ts +14 -0
  85. package/lib/components/versions-list/versions-list.component.d.ts +17 -0
  86. package/lib/container/drive/drive.component.d.ts +36 -0
  87. package/lib/drive.icons.d.ts +15 -0
  88. package/lib/drive.schema.d.ts +23 -0
  89. package/lib/lib.routes.d.ts +2 -0
  90. package/lib/pages/files/files.component.d.ts +101 -0
  91. package/lib/pages/object/object.component.d.ts +35 -0
  92. package/lib/services/drive/drive.interface.d.ts +62 -0
  93. package/lib/services/drive/drive.service.d.ts +64 -0
  94. package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.component.d.ts +31 -0
  95. package/lib/services/drive/resolve-name-conflicts/resolve-name-conflicts.interface.d.ts +8 -0
  96. package/lib/services/drive/versions/versions.mapping.d.ts +2 -0
  97. package/lib/services/index.d.ts +4 -0
  98. package/lib/services/providers/drive.providers.d.ts +7 -0
  99. package/lib/services/resolver/files.resolver.d.ts +2 -0
  100. package/lib/services/resolver/index.d.ts +2 -0
  101. package/lib/services/resolver/versions.route.resolver.d.ts +2 -0
  102. package/lib/services/stored-query/stored-query.data.d.ts +5 -0
  103. package/lib/services/stored-query/stored-query.interface.d.ts +5 -0
  104. package/lib/services/stored-query/stored-query.service.d.ts +10 -0
  105. package/lib/services/tokens/breadcrumb-max-depth.token.d.ts +2 -0
  106. package/lib/services/tokens/index.d.ts +1 -0
  107. package/package.json +41 -0
@@ -0,0 +1,437 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { NavigationStart, Router } from '@angular/router';
4
+ import { patchState, signalState } from '@ngrx/signals';
5
+ import { BackendService, BaseObjectTypeField, ClipboardService, ContentStreamField, DmsService, EventService, SearchService, SystemType, YuvEventType } from '@yuuvis/client-core';
6
+ import { ActionsService, BASE_ACTION } from '@yuuvis/client-framework/actions';
7
+ import { YvcOverlayService } from '@yuuvis/components/overlay';
8
+ import { Subject, catchError, filter, forkJoin, map, of, switchMap, tap } from 'rxjs';
9
+ import { ACTION_CONTEXT, APP_ID, APP_SCHEMA, FS_PROPERTIES, FS_SOTS } from '../../drive.schema';
10
+ import { DRIVE_APP_BREADCRUMB_MAX_DEPTH } from '../tokens';
11
+ import { DRIVE_ACTION_MODE, DRIVE_EVENT, DRIVE_ROOT_FOLDER_ID } from './drive.interface';
12
+ import { ResolveNameConflictsComponent } from './resolve-name-conflicts/resolve-name-conflicts.component';
13
+ import { mapSearchResult } from './versions/versions.mapping';
14
+ import * as i0 from "@angular/core";
15
+ export class DriveService {
16
+ #actionsService;
17
+ #eventService;
18
+ #router;
19
+ #dmsService;
20
+ #searchService;
21
+ #overlay;
22
+ #backend;
23
+ #clipboardService;
24
+ #eventSource;
25
+ #defaultSort;
26
+ constructor() {
27
+ this.#actionsService = inject(ActionsService);
28
+ this.#eventService = inject(EventService);
29
+ this.#router = inject(Router);
30
+ this.#dmsService = inject(DmsService);
31
+ this.#searchService = inject(SearchService);
32
+ this.#overlay = inject(YvcOverlayService);
33
+ this.#backend = inject(BackendService);
34
+ this.#clipboardService = inject(ClipboardService);
35
+ this.MAX_DEPTH = inject(DRIVE_APP_BREADCRUMB_MAX_DEPTH);
36
+ this.breadcrumbCache = new Map();
37
+ this.#eventSource = new Subject();
38
+ this.events$ = this.#eventSource.asObservable();
39
+ this.#defaultSort = {
40
+ property: FS_PROPERTIES.name,
41
+ order: 'asc'
42
+ };
43
+ this.initialState = {
44
+ currentFolder: null,
45
+ query: null,
46
+ queryTitle: null,
47
+ selection: [],
48
+ actions: [],
49
+ busy: false,
50
+ sort: this.#defaultSort,
51
+ breadcrumb: {
52
+ loading: false,
53
+ partial: false,
54
+ items: [],
55
+ folder: null
56
+ },
57
+ versions: {
58
+ versionsList: [],
59
+ selectedVersion: null
60
+ },
61
+ selectedDmsObject: null
62
+ };
63
+ this.state$ = signalState(this.initialState);
64
+ this.breadcrumbFolderPreview = this.state$.breadcrumb.folder;
65
+ this._busyTaskCount = 0;
66
+ this._defaultRibbonActions = [];
67
+ this.#router.events
68
+ .pipe(takeUntilDestroyed(), filter((e) => this.state$.selection().length > 0 && e instanceof NavigationStart))
69
+ // clear selection on route chnages
70
+ .subscribe({ next: () => this.setSelection([]) });
71
+ this.#eventService.on(YuvEventType.DMS_OBJECT_UPDATED).subscribe((e) => {
72
+ // check if current selection contains the updated object
73
+ const dmsObject = e.data;
74
+ const selection = this.state$.selection();
75
+ const matchIdx = selection.findIndex((o) => o.id === dmsObject.id);
76
+ if (matchIdx !== -1) {
77
+ // update the object in the selection
78
+ selection[matchIdx] = dmsObject;
79
+ patchState(this.state$, { selection: [...selection] });
80
+ }
81
+ });
82
+ this.#eventService
83
+ .on(YuvEventType.DMS_OBJECT_DELETED, YuvEventType.DMS_OBJECT_CREATED, YuvEventType.DMS_OBJECTS_MOVED)
84
+ .subscribe(() => this.emitEvent(DRIVE_EVENT.refresh));
85
+ }
86
+ #mapedCurrentFolder() {
87
+ return this.state$.currentFolder() === DRIVE_ROOT_FOLDER_ID ? null : this.state$.currentFolder();
88
+ }
89
+ emitEvent(evt) {
90
+ this.#eventSource.next(evt);
91
+ }
92
+ setBusy(busy) {
93
+ if (busy)
94
+ this._busyTaskCount++;
95
+ else if (this._busyTaskCount > 0)
96
+ this._busyTaskCount--;
97
+ patchState(this.state$, { busy: this._busyTaskCount !== 0 });
98
+ }
99
+ setSelection(o) {
100
+ patchState(this.state$, { selection: o });
101
+ this._getActions();
102
+ }
103
+ updateQuery(query, queryTitle = null) {
104
+ patchState(this.state$, {
105
+ query: this.applyFolderListSearchConditions(query),
106
+ queryTitle: queryTitle
107
+ });
108
+ }
109
+ setSort(property, order) {
110
+ const stateQuery = this.state$.query();
111
+ if (stateQuery) {
112
+ const clonedQueryState = structuredClone(stateQuery);
113
+ // TODO: remove if folders should stay on top
114
+ clonedQueryState.sort = [];
115
+ const sort = property ? { property, order } : { ...this.#defaultSort, order };
116
+ patchState(this.state$, { query: clonedQueryState, sort });
117
+ this.applyFolderListSearchConditions(clonedQueryState, !property);
118
+ }
119
+ }
120
+ updateCurrentFolder(currentFolderID) {
121
+ patchState(this.state$, { currentFolder: currentFolderID || null });
122
+ }
123
+ #copyToFolder(objects, folderId, options, validateNames = true) {
124
+ return validateNames
125
+ ? this.validateNames(objects.filter((o) => o.sots.includes(FS_SOTS.object)).map((f) => f.data[FS_PROPERTIES.name]), folderId).pipe(switchMap((res) => {
126
+ if (res.existingFileNames?.length || res.invalidFileNames?.length) {
127
+ this.#resolveNameConflicts({
128
+ existingFileNames: res.existingFileNames,
129
+ invalidFileNames: res.invalidFileNames,
130
+ mode: 'copy',
131
+ items: objects
132
+ });
133
+ return of([]);
134
+ }
135
+ else
136
+ return this.#dmsService.copyDmsObjects(folderId, objects, options);
137
+ }))
138
+ : this.#dmsService.copyDmsObjects(folderId, objects, options);
139
+ }
140
+ #moveToFolder(objects, folderId, options, validateNames = true) {
141
+ return validateNames
142
+ ? this.validateNames(objects.filter((o) => o.sots.includes(FS_SOTS.object)).map((f) => f.data[FS_PROPERTIES.name]), folderId).pipe(switchMap((res) => {
143
+ if (res.existingFileNames?.length || res.invalidFileNames?.length) {
144
+ console.log('VALIDATION: ', { res });
145
+ this.#resolveNameConflicts({
146
+ existingFileNames: res.existingFileNames,
147
+ invalidFileNames: res.invalidFileNames,
148
+ mode: 'move',
149
+ items: objects
150
+ });
151
+ return of([]);
152
+ }
153
+ else
154
+ return this.#dmsService.moveDmsObjects(folderId, objects, options);
155
+ }))
156
+ : this.#dmsService.moveDmsObjects(folderId, objects, options);
157
+ }
158
+ copyToCurrentFolder(objects, validateNames = true) {
159
+ const options = { waitForSearchConsistency: true };
160
+ return this.#copyToFolder(objects, this.#mapedCurrentFolder(), options, validateNames);
161
+ }
162
+ moveToCurrentFolder(objects, validateNames = true) {
163
+ const options = { waitForSearchConsistency: true };
164
+ return this.#moveToFolder(objects, this.#mapedCurrentFolder(), options, validateNames);
165
+ }
166
+ #resolveNameConflicts(payload) {
167
+ this.#overlay.open(ResolveNameConflictsComponent, payload, {
168
+ maxWidth: '400px'
169
+ });
170
+ }
171
+ pasteFromClipboard(destinationObject) {
172
+ const cd = this.#clipboardService.getClipboardData(APP_ID);
173
+ const destination = destinationObject?.isFolder ? destinationObject.id : this.#mapedCurrentFolder();
174
+ return (cd && cd.objects && cd.objects.length > 0
175
+ ? cd?.mode === DRIVE_ACTION_MODE.CUT
176
+ ? this.#moveToFolder(cd.objects || [], destination, { waitForSearchConsistency: true }, true)
177
+ : cd?.mode === DRIVE_ACTION_MODE.COPY
178
+ ? this.#copyToFolder(cd.objects || [], destination, { waitForSearchConsistency: true }, true)
179
+ : of(null)
180
+ : of(null)).pipe(tap((res) => {
181
+ res && this.emitEvent(DRIVE_EVENT.refresh);
182
+ this.#clipboardService.clear();
183
+ }));
184
+ }
185
+ checkNamesAndUpload(files, data) {
186
+ return this.validateNames(files.map((f) => f.name), this.#mapedCurrentFolder()).pipe(switchMap((res) => {
187
+ if (res.existingFileNames?.length || res.invalidFileNames?.length) {
188
+ const resPayload = {
189
+ existingFileNames: res.existingFileNames,
190
+ invalidFileNames: res.invalidFileNames,
191
+ mode: 'upload',
192
+ items: files,
193
+ data
194
+ };
195
+ this.#overlay.open(ResolveNameConflictsComponent, resPayload);
196
+ return of([]);
197
+ }
198
+ else
199
+ return this.upload(files, data);
200
+ }));
201
+ }
202
+ uploadContent(objectId, file) {
203
+ return this.#dmsService.uploadContent(objectId, file);
204
+ }
205
+ /**
206
+ * Uploads files to the current folder
207
+ * @param files files to be uploaded
208
+ * @param data additional data to be applied to the object
209
+ */
210
+ upload(files, data) {
211
+ return forkJoin(files.map((file) => {
212
+ const uploadData = data || {};
213
+ // apply filesystem SOT
214
+ const sots = uploadData[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] || [];
215
+ uploadData[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [...sots, FS_SOTS.object];
216
+ // setup the name to be the filename
217
+ uploadData[FS_PROPERTIES.name] = file.name;
218
+ const cf = this.#mapedCurrentFolder();
219
+ if (cf && cf !== DRIVE_ROOT_FOLDER_ID)
220
+ uploadData[BaseObjectTypeField.PARENT_ID] = cf;
221
+ return this.#dmsService.createDmsObject(SystemType.DOCUMENT, uploadData, [file], file.name).pipe(map((res) => ({ id: res[0] })), catchError((e) => of({ error: this.#mapCreateError(e) })));
222
+ }));
223
+ }
224
+ createFolder(name) {
225
+ const parentID = this.#mapedCurrentFolder();
226
+ const data = {};
227
+ data[FS_PROPERTIES.name] = name;
228
+ // apply filesystem SOT
229
+ data[BaseObjectTypeField.SECONDARY_OBJECT_TYPE_IDS] = [FS_SOTS.object];
230
+ if (parentID && parentID !== DRIVE_ROOT_FOLDER_ID)
231
+ data[BaseObjectTypeField.PARENT_ID] = parentID;
232
+ return this.#dmsService.createDmsObject(APP_SCHEMA.types.folder.objectType || '', data, []).pipe(map((res) => ({ id: res[0] })), catchError((e) => of({ error: this.#mapCreateError(e) })));
233
+ }
234
+ #mapCreateError(e) {
235
+ let error = 'default';
236
+ const ec = e.error.serviceErrorCode;
237
+ if (ec === 99999) {
238
+ const iec = e.error.innerError?.serviceErrorCode;
239
+ if (iec === 11000)
240
+ error = 'nameExists';
241
+ }
242
+ return error;
243
+ }
244
+ /**
245
+ * Checks for existing names and invalid characters
246
+ * @param name The name to be checked
247
+ * @param parentId The parent folder (will be 'root' if not provided)
248
+ * @returns already existing names
249
+ */
250
+ validateNames(names, parentId) {
251
+ console.log({ names, parentId });
252
+ if (parentId === DRIVE_ROOT_FOLDER_ID)
253
+ parentId = undefined;
254
+ const dvp = {
255
+ app: 'osdrive',
256
+ fileNames: names,
257
+ targetFolderId: parentId || undefined
258
+ };
259
+ return this.#backend.post('/dms/objects/validate', dvp).pipe(catchError((res) => of(res.error)));
260
+ }
261
+ getDefaultRibbonActions() {
262
+ if (!this._defaultRibbonActions.length) {
263
+ //[BASE_ACTION.download, BASE_ACTION.delete, 'app.drive.action.rename', BASE_ACTION.copy, BASE_ACTION.cut]
264
+ Object.values({ ...BASE_ACTION, rename: 'app.drive.action.rename' }).forEach((id) => {
265
+ const a = this.#actionsService.getActionById(id, ACTION_CONTEXT);
266
+ if (a)
267
+ this._defaultRibbonActions.push(a);
268
+ });
269
+ }
270
+ return this._defaultRibbonActions;
271
+ }
272
+ _getActions() {
273
+ this.setBusy(true);
274
+ this.#actionsService
275
+ .getActions(this.state$.selection(), {
276
+ context: ACTION_CONTEXT
277
+ })
278
+ .subscribe((actions) => {
279
+ patchState(this.state$, { actions });
280
+ })
281
+ .add(() => this.setBusy(false));
282
+ }
283
+ /**
284
+ * Apply search conditions regarding folder listings
285
+ * @param q
286
+ */
287
+ applyFolderListSearchConditions(q, addBaseTypeId = true) {
288
+ // folders first
289
+ if (!q.sort)
290
+ q.sort = [];
291
+ addBaseTypeId &&
292
+ q.sort.push({
293
+ field: BaseObjectTypeField.BASE_TYPE_ID,
294
+ order: 'desc'
295
+ });
296
+ q = this.applyBasicSearchConditions(q);
297
+ return q;
298
+ }
299
+ applyBasicSearchConditions(q) {
300
+ q.fields = [
301
+ BaseObjectTypeField.OBJECT_ID,
302
+ BaseObjectTypeField.MODIFICATION_DATE,
303
+ BaseObjectTypeField.MODIFIED_BY,
304
+ ContentStreamField.FILENAME,
305
+ ContentStreamField.MIME_TYPE,
306
+ ContentStreamField.ID,
307
+ ContentStreamField.LENGTH
308
+ ];
309
+ if (!q.types || !q.types.includes(FS_SOTS.object))
310
+ q.types = [...(q.types || []), FS_SOTS.object];
311
+ // q.sortOptions.push(new SortOption(BaseObjectTypeField.BASE_TYPE_ID, 'desc'));
312
+ const sort = this.state$.sort() || this.#defaultSort;
313
+ if (!q.sort)
314
+ q.sort = [];
315
+ q.sort.push({
316
+ field: sort.property,
317
+ order: sort.order
318
+ });
319
+ q.includePermissions = true;
320
+ // new SortOption(sort.property, sort.order));
321
+ return q;
322
+ }
323
+ resolveFilesState(id) {
324
+ return this.getFolderHierarchy(id);
325
+ }
326
+ getFolderHierarchy(folderId) {
327
+ patchState(this.state$, {
328
+ breadcrumb: {
329
+ ...this.initialState.breadcrumb,
330
+ loading: true
331
+ }
332
+ });
333
+ return folderId === DRIVE_ROOT_FOLDER_ID
334
+ ? of([])
335
+ : this.#fetchFolder(folderId, 0, this.MAX_DEPTH).pipe(tap((res) => {
336
+ let items = [];
337
+ if (res.items.length > 0) {
338
+ items = [...items, ...res.items];
339
+ }
340
+ patchState(this.state$, {
341
+ breadcrumb: {
342
+ ...this.initialState.breadcrumb,
343
+ partial: res.partial,
344
+ loading: false,
345
+ items
346
+ }
347
+ });
348
+ }), map((res) => res.items));
349
+ }
350
+ #fetchFolder(folderId, depth, maxDepth) {
351
+ if (depth >= maxDepth)
352
+ return of({ partial: true, items: [] });
353
+ const cachedFolder = this.breadcrumbCache.get(folderId);
354
+ if (cachedFolder) {
355
+ return cachedFolder.parentId
356
+ ? this.#fetchFolder(cachedFolder.parentId, depth + 1, maxDepth).pipe(map((parentFolders) => ({
357
+ partial: parentFolders.partial,
358
+ items: [...parentFolders.items, { name: cachedFolder.name, id: cachedFolder.id }]
359
+ })))
360
+ : of({
361
+ partial: false,
362
+ items: [{ name: cachedFolder.name, id: cachedFolder.id }]
363
+ });
364
+ }
365
+ return this.#dmsService.getDmsObject(folderId).pipe(map((folder) => {
366
+ const currentFolder = {
367
+ name: folder.data[FS_PROPERTIES.name],
368
+ id: folder.data[BaseObjectTypeField.OBJECT_ID],
369
+ parentId: folder.parentId
370
+ };
371
+ // this.breadcrumbCache.set(folder.id, currentFolder);
372
+ return currentFolder;
373
+ }), switchMap((folder) => {
374
+ if (!folder.parentId) {
375
+ return of({
376
+ partial: false,
377
+ items: [{ name: folder.name, id: folder.id }]
378
+ });
379
+ }
380
+ return this.#fetchFolder(folder.parentId, depth + 1, maxDepth).pipe(map((parentFolders) => ({
381
+ partial: parentFolders.partial,
382
+ items: [...parentFolders.items, { name: folder.name, id: folder.id }]
383
+ })));
384
+ }));
385
+ }
386
+ getVersions(id) {
387
+ patchState(this.state$, { busy: true });
388
+ return this.#dmsService.getDmsObjectVersions(id).pipe(tap((versions) => {
389
+ patchState(this.state$, {
390
+ busy: false,
391
+ versions: {
392
+ versionsList: mapSearchResult(versions),
393
+ selectedVersion: this.state$.versions().selectedVersion
394
+ }
395
+ });
396
+ }));
397
+ }
398
+ getSelectedDmsObject(id) {
399
+ return this.#dmsService.getDmsObject(id).pipe(tap((dmsObject) => patchState(this.state$, {
400
+ selectedDmsObject: dmsObject,
401
+ versions: {
402
+ versionsList: this.state$.versions.versionsList(),
403
+ selectedVersion: [dmsObject]
404
+ }
405
+ })));
406
+ }
407
+ setSelectedVersion(version) {
408
+ this.setBusy(true);
409
+ return this.#dmsService.getDmsObjectVersion(version.dmsObject.id, version.dmsObject.version).pipe(tap((res) => patchState(this.state$, {
410
+ versions: {
411
+ versionsList: this.state$.versions.versionsList(),
412
+ selectedVersion: [res]
413
+ }
414
+ })), tap(() => this.setBusy(false)));
415
+ }
416
+ setNewVersion(version) {
417
+ patchState(this.state$, { busy: true });
418
+ const selectedVersion = this.state$.versions.selectedVersion();
419
+ if (selectedVersion) {
420
+ const versionNumber = version ?? selectedVersion[0].version;
421
+ return this.#dmsService.restoreDmsObject(selectedVersion[0].id, versionNumber).pipe(switchMap((object) => this.getVersions(object.id)));
422
+ }
423
+ return of(null);
424
+ }
425
+ clearVersions() {
426
+ patchState(this.state$, { versions: this.initialState.versions });
427
+ }
428
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DriveService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
429
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DriveService, providedIn: 'root' }); }
430
+ }
431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DriveService, decorators: [{
432
+ type: Injectable,
433
+ args: [{
434
+ providedIn: 'root'
435
+ }]
436
+ }], ctorParameters: () => [] });
437
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpdmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBwcy9kcml2ZS9zcmMvbGliL3NlcnZpY2VzL2RyaXZlL2RyaXZlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBRWxCLFVBQVUsRUFDVixZQUFZLEVBRVosYUFBYSxFQUNiLFVBQVUsRUFFVixZQUFZLEVBQ2IsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQVUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNELE9BQU8sRUFJTCxpQkFBaUIsRUFDakIsV0FBVyxFQUNYLG9CQUFvQixFQUlyQixNQUFNLG1CQUFt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Q3BFLENBQUM7K0dBOWVVLFlBQVk7bUhBQVosWUFBWSxjQUZYLE1BQU07OzRGQUVQLFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGFydCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IHBhdGNoU3RhdGUsIHNpZ25hbFN0YXRlIH0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5pbXBvcnQge1xuICBCYWNrZW5kU2VydmljZSxcbiAgQmFzZU9iamVjdFR5cGVGaWVsZCxcbiAgQ2xpcGJvYXJkU2VydmljZSxcbiAgQ29udGVudFN0cmVhbUZpZWxkLFxuICBEbXNPYmplY3QsXG4gIERtc1NlcnZpY2UsXG4gIEV2ZW50U2VydmljZSxcbiAgU2VhcmNoUXVlcnksXG4gIFNlYXJjaFNlcnZpY2UsXG4gIFN5c3RlbVR5cGUsXG4gIFl1dkV2ZW50LFxuICBZdXZFdmVudFR5cGVcbn0gZnJvbSAnQHl1dXZpcy9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBBY3Rpb24sIEFjdGlvbnNTZXJ2aWNlLCBCQVNFX0FDVElPTiB9IGZyb20gJ0B5dXV2aXMvY2xpZW50LWZyYW1ld29yay9hY3Rpb25zJztcbmltcG9ydCB7IFl2Y092ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnQHl1dXZpcy9jb21wb25lbnRzL292ZXJsYXknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgY2F0Y2hFcnJvciwgZmlsdGVyLCBmb3JrSm9pbiwgbWFwLCBvZiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFDVElPTl9DT05URVhULCBBUFBfSUQsIEFQUF9TQ0hFTUEsIEZTX1BST1BFUlRJRVMsIEZTX1NPVFMgfSBmcm9tICcuLi8uLi9kcml2ZS5zY2hlbWEnO1xuaW1wb3J0IHsgRFJJVkVfQVBQX0JSRUFEQ1JVTUJfTUFYX0RFUFRIIH0gZnJvbSAnLi4vdG9rZW5zJztcbmltcG9ydCB7XG4gIEJyZWFkQ3J1bWIsXG4gIENyZWF0ZUVycm9yLFxuICBDcmVhdGVSZXN1bHQsXG4gIERSSVZFX0FDVElPTl9NT0RFLFxuICBEUklWRV9FVkVOVCxcbiAgRFJJVkVfUk9PVF9GT0xERVJfSUQsXG4gIERyaXZlU3RhdGUsXG4gIERyaXZlVmFsaWRhdGVQYXlsb2FkLFxuICBEcml2ZVZhbGlkYXRlUmVzcG9uc2Vcbn0gZnJvbSAnLi9kcml2ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVzb2x2ZU5hbWVDb25mbGljdHNDb21wb25lbnQgfSBmcm9tICcuL3Jlc29sdmUtbmFtZS1jb25mbGljdHMvcmVzb2x2ZS1uYW1lLWNvbmZsaWN0cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgUmVzb2x2ZU5hbWVDb25mbGljdHNQYXlsb2FkIH0gZnJvbSAnLi9yZXNvbHZlLW5hbWUtY29uZmxpY3RzL3Jlc29sdmUtbmFtZS1jb25mbGljdHMuaW50ZXJmYWNlJztcbmltcG9ydCB7IG1hcFNlYXJjaFJlc3VsdCB9IGZyb20gJy4vdmVyc2lvbnMvdmVyc2lvbnMubWFwcGluZyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERyaXZlU2VydmljZSB7XG4gIHJlYWRvbmx5ICNhY3Rpb25zU2VydmljZSA9IGluamVjdChBY3Rpb25zU2VydmljZSk7XG4gIHJlYWRvbmx5ICNldmVudFNlcnZpY2UgPSBpbmplY3QoRXZlbnRTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3JvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICByZWFkb25seSAjZG1zU2VydmljZSA9IGluamVjdChEbXNTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI3NlYXJjaFNlcnZpY2UgPSBpbmplY3QoU2VhcmNoU2VydmljZSk7XG4gIHJlYWRvbmx5ICNvdmVybGF5ID0gaW5qZWN0KFl2Y092ZXJsYXlTZXJ2aWNlKTtcbiAgcmVhZG9ubHkgI2JhY2tlbmQgPSBpbmplY3QoQmFja2VuZFNlcnZpY2UpO1xuICByZWFkb25seSAjY2xpcGJvYXJkU2VydmljZSA9IGluamVjdChDbGlwYm9hcmRTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9ERVBUSDogbnVtYmVyID0gaW5qZWN0KERSSVZFX0FQUF9CUkVBRENSVU1CX01BWF9ERVBUSCk7XG4gIHByaXZhdGUgYnJlYWRjcnVtYkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nOyBwYXJlbnRJZDogc3RyaW5nIHwgbnVsbCB9PigpO1xuXG4gICNldmVudFNvdXJjZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZXZlbnRzJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy4jZXZlbnRTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XG5cbiAgcmVhZG9ubHkgI2RlZmF1bHRTb3J0OiB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcmRlcjogJ2FzYycgfCAnZGVzYyc7XG4gIH0gPSB7XG4gICAgcHJvcGVydHk6IEZTX1BST1BFUlRJRVMubmFtZSxcbiAgICBvcmRlcjogJ2FzYydcbiAgfTtcblxuICByZWFkb25seSBpbml0aWFsU3RhdGU6IERyaXZlU3RhdGUgPSB7XG4gICAgY3VycmVudEZvbGRlcjogbnVsbCxcbiAgICBxdWVyeTogbnVsbCxcbiAgICBxdWVyeVRpdGxlOiBudWxsLFxuICAgIHNlbGVjdGlvbjogW10sXG4gICAgYWN0aW9uczogW10sXG4gICAgYnVzeTogZmFsc2UsXG4gICAgc29ydDogdGhpcy4jZGVmYXVsdFNvcnQsXG4gICAgYnJlYWRjcnVtYjoge1xuICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICBwYXJ0aWFsOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBbXSxcbiAgICAgIGZvbGRlcjogbnVsbFxuICAgIH0sXG4gICAgdmVyc2lvbnM6IHtcbiAgICAgIHZlcnNpb25zTGlzdDogW10sXG4gICAgICBzZWxlY3RlZFZlcnNpb246IG51bGxcbiAgICB9LFxuICAgIHNlbGVjdGVkRG1zT2JqZWN0OiBudWxsXG4gIH07XG5cbiAgcmVhZG9ubHkgc3RhdGUkID0gc2lnbmFsU3RhdGU8RHJpdmVTdGF0ZT4odGhpcy5pbml0aWFsU3RhdGUpO1xuICByZWFkb25seSBicmVhZGNydW1iRm9sZGVyUHJldmlldyA9IHRoaXMuc3RhdGUkLmJyZWFkY3J1bWIuZm9sZGVyO1xuICBwcml2YXRlIF9idXN5VGFza0NvdW50ID0gMDtcbiAgcHJpdmF0ZSBfZGVmYXVsdFJpYmJvbkFjdGlvbnM6IEFjdGlvbltdID0gW107XG4gIGxhc3RSb3V0ZVVSTD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiNyb3V0ZXIuZXZlbnRzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIGZpbHRlcigoZSkgPT4gdGhpcy5zdGF0ZSQuc2VsZWN0aW9uKCkubGVuZ3RoID4gMCAmJiBlIGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KVxuICAgICAgKVxuICAgICAgLy8gY2xlYXIgc2VsZWN0aW9uIG9uIHJvdXRlIGNobmFnZXNcbiAgICAgIC5zdWJzY3JpYmUoeyBuZXh0OiAoKSA9PiB0aGlzLnNldFNlbGVjdGlvbihbXSkgfSk7XG5cbiAgICB0aGlzLiNldmVudFNlcnZpY2Uub24oWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfVVBEQVRFRCkuc3Vic2NyaWJlKChlOiBZdXZFdmVudCkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgY3VycmVudCBzZWxlY3Rpb24gY29udGFpbnMgdGhlIHVwZGF0ZWQgb2JqZWN0XG4gICAgICBjb25zdCBkbXNPYmplY3QgPSBlLmRhdGEgYXMgRG1zT2JqZWN0O1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zdGF0ZSQuc2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCBtYXRjaElkeCA9IHNlbGVjdGlvbi5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGRtc09iamVjdC5pZCk7XG4gICAgICBpZiAobWF0Y2hJZHggIT09IC0xKSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgb2JqZWN0IGluIHRoZSBzZWxlY3Rpb25cbiAgICAgICAgc2VsZWN0aW9uW21hdGNoSWR4XSA9IGRtc09iamVjdDtcbiAgICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBzZWxlY3Rpb246IFsuLi5zZWxlY3Rpb25dIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy4jZXZlbnRTZXJ2aWNlXG4gICAgICAub24oWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfREVMRVRFRCwgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RfQ1JFQVRFRCwgWXV2RXZlbnRUeXBlLkRNU19PQkpFQ1RTX01PVkVEKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmVtaXRFdmVudChEUklWRV9FVkVOVC5yZWZyZXNoKSk7XG4gIH1cblxuICAjbWFwZWRDdXJyZW50Rm9sZGVyKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlJC5jdXJyZW50Rm9sZGVyKCkgPT09IERSSVZFX1JPT1RfRk9MREVSX0lEID8gbnVsbCA6IHRoaXMuc3RhdGUkLmN1cnJlbnRGb2xkZXIoKTtcbiAgfVxuXG4gIGVtaXRFdmVudChldnQ6IHN0cmluZykge1xuICAgIHRoaXMuI2V2ZW50U291cmNlLm5leHQoZXZ0KTtcbiAgfVxuXG4gIHNldEJ1c3koYnVzeTogYm9vbGVhbikge1xuICAgIGlmIChidXN5KSB0aGlzLl9idXN5VGFza0NvdW50Kys7XG4gICAgZWxzZSBpZiAodGhpcy5fYnVzeVRhc2tDb3VudCA+IDApIHRoaXMuX2J1c3lUYXNrQ291bnQtLTtcbiAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7IGJ1c3k6IHRoaXMuX2J1c3lUYXNrQ291bnQgIT09IDAgfSk7XG4gIH1cblxuICBzZXRTZWxlY3Rpb24obzogRG1zT2JqZWN0W10pIHtcbiAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7IHNlbGVjdGlvbjogbyB9KTtcbiAgICB0aGlzLl9nZXRBY3Rpb25zKCk7XG4gIH1cblxuICB1cGRhdGVRdWVyeShxdWVyeTogU2VhcmNoUXVlcnksIHF1ZXJ5VGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwge1xuICAgICAgcXVlcnk6IHRoaXMuYXBwbHlGb2xkZXJMaXN0U2VhcmNoQ29uZGl0aW9ucyhxdWVyeSksXG4gICAgICBxdWVyeVRpdGxlOiBxdWVyeVRpdGxlXG4gICAgfSk7XG4gIH1cblxuICBzZXRTb3J0KHByb3BlcnR5OiBzdHJpbmcsIG9yZGVyOiAnYXNjJyB8ICdkZXNjJykge1xuICAgIGNvbnN0IHN0YXRlUXVlcnkgPSB0aGlzLnN0YXRlJC5xdWVyeSgpO1xuICAgIGlmIChzdGF0ZVF1ZXJ5KSB7XG4gICAgICBjb25zdCBjbG9uZWRRdWVyeVN0YXRlID0gc3RydWN0dXJlZENsb25lKHN0YXRlUXVlcnkpO1xuXG4gICAgICAvLyBUT0RPOiByZW1vdmUgaWYgZm9sZGVycyBzaG91bGQgc3RheSBvbiB0b3BcbiAgICAgIGNsb25lZFF1ZXJ5U3RhdGUuc29ydCA9IFtdO1xuXG4gICAgICBjb25zdCBzb3J0ID0gcHJvcGVydHkgPyB7IHByb3BlcnR5LCBvcmRlciB9IDogeyAuLi50aGlzLiNkZWZhdWx0U29ydCwgb3JkZXIgfTtcblxuICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBxdWVyeTogY2xvbmVkUXVlcnlTdGF0ZSwgc29ydCB9KTtcbiAgICAgIHRoaXMuYXBwbHlGb2xkZXJMaXN0U2VhcmNoQ29uZGl0aW9ucyhjbG9uZWRRdWVyeVN0YXRlLCAhcHJvcGVydHkpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUN1cnJlbnRGb2xkZXIoY3VycmVudEZvbGRlcklEOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBjdXJyZW50Rm9sZGVyOiBjdXJyZW50Rm9sZGVySUQgfHwgbnVsbCB9KTtcbiAgfVxuXG4gICNjb3B5VG9Gb2xkZXIob2JqZWN0czogRG1zT2JqZWN0W10sIGZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zOiB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogYm9vbGVhbiB9LCB2YWxpZGF0ZU5hbWVzID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlTmFtZXNcbiAgICAgID8gdGhpcy52YWxpZGF0ZU5hbWVzKFxuICAgICAgICAgIG9iamVjdHMuZmlsdGVyKChvKSA9PiBvLnNvdHMuaW5jbHVkZXMoRlNfU09UUy5vYmplY3QpKS5tYXAoKGYpID0+IGYuZGF0YVtGU19QUk9QRVJUSUVTLm5hbWVdIGFzIHN0cmluZyksXG4gICAgICAgICAgZm9sZGVySWRcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzOiBEcml2ZVZhbGlkYXRlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuZXhpc3RpbmdGaWxlTmFtZXM/Lmxlbmd0aCB8fCByZXMuaW52YWxpZEZpbGVOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuI3Jlc29sdmVOYW1lQ29uZmxpY3RzKHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ0ZpbGVOYW1lczogcmVzLmV4aXN0aW5nRmlsZU5hbWVzLFxuICAgICAgICAgICAgICAgIGludmFsaWRGaWxlTmFtZXM6IHJlcy5pbnZhbGlkRmlsZU5hbWVzLFxuICAgICAgICAgICAgICAgIG1vZGU6ICdjb3B5JyxcbiAgICAgICAgICAgICAgICBpdGVtczogb2JqZWN0c1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgIH0gZWxzZSByZXR1cm4gdGhpcy4jZG1zU2VydmljZS5jb3B5RG1zT2JqZWN0cyhmb2xkZXJJZCwgb2JqZWN0cywgb3B0aW9ucyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgOiB0aGlzLiNkbXNTZXJ2aWNlLmNvcHlEbXNPYmplY3RzKGZvbGRlcklkLCBvYmplY3RzLCBvcHRpb25zKTtcbiAgfVxuXG4gICNtb3ZlVG9Gb2xkZXIob2JqZWN0czogRG1zT2JqZWN0W10sIGZvbGRlcklkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zOiB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogYm9vbGVhbiB9LCB2YWxpZGF0ZU5hbWVzID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHZhbGlkYXRlTmFtZXNcbiAgICAgID8gdGhpcy52YWxpZGF0ZU5hbWVzKFxuICAgICAgICAgIG9iamVjdHMuZmlsdGVyKChvKSA9PiBvLnNvdHMuaW5jbHVkZXMoRlNfU09UUy5vYmplY3QpKS5tYXAoKGYpID0+IGYuZGF0YVtGU19QUk9QRVJUSUVTLm5hbWVdIGFzIHN0cmluZyksXG4gICAgICAgICAgZm9sZGVySWRcbiAgICAgICAgKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcCgocmVzOiBEcml2ZVZhbGlkYXRlUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXMuZXhpc3RpbmdGaWxlTmFtZXM/Lmxlbmd0aCB8fCByZXMuaW52YWxpZEZpbGVOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWQUxJREFUSU9OOiAnLCB7IHJlcyB9KTtcbiAgICAgICAgICAgICAgdGhpcy4jcmVzb2x2ZU5hbWVDb25mbGljdHMoe1xuICAgICAgICAgICAgICAgIGV4aXN0aW5nRmlsZU5hbWVzOiByZXMuZXhpc3RpbmdGaWxlTmFtZXMsXG4gICAgICAgICAgICAgICAgaW52YWxpZEZpbGVOYW1lczogcmVzLmludmFsaWRGaWxlTmFtZXMsXG4gICAgICAgICAgICAgICAgbW9kZTogJ21vdmUnLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBvYmplY3RzXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgfSBlbHNlIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLm1vdmVEbXNPYmplY3RzKGZvbGRlcklkLCBvYmplY3RzLCBvcHRpb25zKTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICA6IHRoaXMuI2Rtc1NlcnZpY2UubW92ZURtc09iamVjdHMoZm9sZGVySWQsIG9iamVjdHMsIG9wdGlvbnMpO1xuICB9XG5cbiAgY29weVRvQ3VycmVudEZvbGRlcihvYmplY3RzOiBEbXNPYmplY3RbXSwgdmFsaWRhdGVOYW1lcyA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9O1xuICAgIHJldHVybiB0aGlzLiNjb3B5VG9Gb2xkZXIob2JqZWN0cywgdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKCksIG9wdGlvbnMsIHZhbGlkYXRlTmFtZXMpO1xuICB9XG5cbiAgbW92ZVRvQ3VycmVudEZvbGRlcihvYmplY3RzOiBEbXNPYmplY3RbXSwgdmFsaWRhdGVOYW1lcyA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9O1xuICAgIHJldHVybiB0aGlzLiNtb3ZlVG9Gb2xkZXIob2JqZWN0cywgdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKCksIG9wdGlvbnMsIHZhbGlkYXRlTmFtZXMpO1xuICB9XG5cbiAgI3Jlc29sdmVOYW1lQ29uZmxpY3RzKHBheWxvYWQ6IFJlc29sdmVOYW1lQ29uZmxpY3RzUGF5bG9hZCkge1xuICAgIHRoaXMuI292ZXJsYXkub3BlbihSZXNvbHZlTmFtZUNvbmZsaWN0c0NvbXBvbmVudCwgcGF5bG9hZCwge1xuICAgICAgbWF4V2lkdGg6ICc0MDBweCdcbiAgICB9KTtcbiAgfVxuXG4gIHBhc3RlRnJvbUNsaXBib2FyZChkZXN0aW5hdGlvbk9iamVjdD86IERtc09iamVjdCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgY2QgPSB0aGlzLiNjbGlwYm9hcmRTZXJ2aWNlLmdldENsaXBib2FyZERhdGEoQVBQX0lEKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uT2JqZWN0Py5pc0ZvbGRlciA/IGRlc3RpbmF0aW9uT2JqZWN0LmlkIDogdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKCk7XG4gICAgcmV0dXJuIChcbiAgICAgIGNkICYmIGNkLm9iamVjdHMgJiYgY2Qub2JqZWN0cy5sZW5ndGggPiAwXG4gICAgICAgID8gY2Q/Lm1vZGUgPT09IERSSVZFX0FDVElPTl9NT0RFLkNVVFxuICAgICAgICAgID8gdGhpcy4jbW92ZVRvRm9sZGVyKGNkLm9iamVjdHMgfHwgW10sIGRlc3RpbmF0aW9uLCB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9LCB0cnVlKVxuICAgICAgICAgIDogY2Q/Lm1vZGUgPT09IERSSVZFX0FDVElPTl9NT0RFLkNPUFlcbiAgICAgICAgICAgID8gdGhpcy4jY29weVRvRm9sZGVyKGNkLm9iamVjdHMgfHwgW10sIGRlc3RpbmF0aW9uLCB7IHdhaXRGb3JTZWFyY2hDb25zaXN0ZW5jeTogdHJ1ZSB9LCB0cnVlKVxuICAgICAgICAgICAgOiBvZihudWxsKVxuICAgICAgICA6IG9mKG51bGwpXG4gICAgKS5waXBlKFxuICAgICAgdGFwKChyZXMpID0+IHtcbiAgICAgICAgcmVzICYmIHRoaXMuZW1pdEV2ZW50KERSSVZFX0VWRU5ULnJlZnJlc2gpO1xuICAgICAgICB0aGlzLiNjbGlwYm9hcmRTZXJ2aWNlLmNsZWFyKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjaGVja05hbWVzQW5kVXBsb2FkKGZpbGVzOiBGaWxlW10sIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IE9ic2VydmFibGU8Q3JlYXRlUmVzdWx0W10+IHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZU5hbWVzKFxuICAgICAgZmlsZXMubWFwKChmKSA9PiBmLm5hbWUpLFxuICAgICAgdGhpcy4jbWFwZWRDdXJyZW50Rm9sZGVyKClcbiAgICApLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlczogRHJpdmVWYWxpZGF0ZVJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGlmIChyZXMuZXhpc3RpbmdGaWxlTmFtZXM/Lmxlbmd0aCB8fCByZXMuaW52YWxpZEZpbGVOYW1lcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgcmVzUGF5bG9hZDogUmVzb2x2ZU5hbWVDb25mbGljdHNQYXlsb2FkID0ge1xuICAgICAgICAgICAgZXhpc3RpbmdGaWxlTmFtZXM6IHJlcy5leGlzdGluZ0ZpbGVOYW1lcyxcbiAgICAgICAgICAgIGludmFsaWRGaWxlTmFtZXM6IHJlcy5pbnZhbGlkRmlsZU5hbWVzLFxuICAgICAgICAgICAgbW9kZTogJ3VwbG9hZCcsXG4gICAgICAgICAgICBpdGVtczogZmlsZXMsXG4gICAgICAgICAgICBkYXRhXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLiNvdmVybGF5Lm9wZW4oUmVzb2x2ZU5hbWVDb25mbGljdHNDb21wb25lbnQsIHJlc1BheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgIH0gZWxzZSByZXR1cm4gdGhpcy51cGxvYWQoZmlsZXMsIGRhdGEpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgdXBsb2FkQ29udGVudChvYmplY3RJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxDcmVhdGVSZXN1bHRbXT4ge1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLnVwbG9hZENvbnRlbnQob2JqZWN0SWQsIGZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgZmlsZXMgdG8gdGhlIGN1cnJlbnQgZm9sZGVyXG4gICAqIEBwYXJhbSBmaWxlcyBmaWxlcyB0byBiZSB1cGxvYWRlZFxuICAgKiBAcGFyYW0gZGF0YSBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgYXBwbGllZCB0byB0aGUgb2JqZWN0XG4gICAqL1xuICB1cGxvYWQoZmlsZXM6IEZpbGVbXSwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogT2JzZXJ2YWJsZTxDcmVhdGVSZXN1bHRbXT4ge1xuICAgIHJldHVybiBmb3JrSm9pbihcbiAgICAgIGZpbGVzLm1hcCgoZmlsZTogRmlsZSkgPT4ge1xuICAgICAgICBjb25zdCB1cGxvYWREYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZGF0YSB8fCB7fTtcbiAgICAgICAgLy8gYXBwbHkgZmlsZXN5c3RlbSBTT1RcbiAgICAgICAgY29uc3Qgc290cyA9IHVwbG9hZERhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5TRUNPTkRBUllfT0JKRUNUX1RZUEVfSURTXSB8fCBbXTtcbiAgICAgICAgdXBsb2FkRGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdID0gWy4uLnNvdHMsIEZTX1NPVFMub2JqZWN0XTtcbiAgICAgICAgLy8gc2V0dXAgdGhlIG5hbWUgdG8gYmUgdGhlIGZpbGVuYW1lXG4gICAgICAgIHVwbG9hZERhdGFbRlNfUFJPUEVSVElFUy5uYW1lXSA9IGZpbGUubmFtZTtcbiAgICAgICAgY29uc3QgY2YgPSB0aGlzLiNtYXBlZEN1cnJlbnRGb2xkZXIoKTtcbiAgICAgICAgaWYgKGNmICYmIGNmICE9PSBEUklWRV9ST09UX0ZPTERFUl9JRCkgdXBsb2FkRGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlBBUkVOVF9JRF0gPSBjZjtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UuY3JlYXRlRG1zT2JqZWN0KFN5c3RlbVR5cGUuRE9DVU1FTlQsIHVwbG9hZERhdGEsIFtmaWxlXSwgZmlsZS5uYW1lKS5waXBlKFxuICAgICAgICAgIG1hcCgocmVzKSA9PiAoeyBpZDogcmVzWzBdIH0pKSxcbiAgICAgICAgICBjYXRjaEVycm9yKChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gb2YoeyBlcnJvcjogdGhpcy4jbWFwQ3JlYXRlRXJyb3IoZSkgfSkpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjcmVhdGVGb2xkZXIobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxDcmVhdGVSZXN1bHQ+IHtcbiAgICBjb25zdCBwYXJlbnRJRCA9IHRoaXMuI21hcGVkQ3VycmVudEZvbGRlcigpO1xuICAgIGNvbnN0IGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBkYXRhW0ZTX1BST1BFUlRJRVMubmFtZV0gPSBuYW1lO1xuICAgIC8vIGFwcGx5IGZpbGVzeXN0ZW0gU09UXG4gICAgZGF0YVtCYXNlT2JqZWN0VHlwZUZpZWxkLlNFQ09OREFSWV9PQkpFQ1RfVFlQRV9JRFNdID0gW0ZTX1NPVFMub2JqZWN0XTtcbiAgICBpZiAocGFyZW50SUQgJiYgcGFyZW50SUQgIT09IERSSVZFX1JPT1RfRk9MREVSX0lEKSBkYXRhW0Jhc2VPYmplY3RUeXBlRmllbGQuUEFSRU5UX0lEXSA9IHBhcmVudElEO1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLmNyZWF0ZURtc09iamVjdChBUFBfU0NIRU1BLnR5cGVzLmZvbGRlci5vYmplY3RUeXBlIHx8ICcnLCBkYXRhLCBbXSkucGlwZShcbiAgICAgIG1hcCgocmVzKSA9PiAoeyBpZDogcmVzWzBdIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiBvZih7IGVycm9yOiB0aGlzLiNtYXBDcmVhdGVFcnJvcihlKSB9KSlcbiAgICApO1xuICB9XG5cbiAgI21hcENyZWF0ZUVycm9yKGU6IEh0dHBFcnJvclJlc3BvbnNlKTogQ3JlYXRlRXJyb3Ige1xuICAgIGxldCBlcnJvcjogQ3JlYXRlRXJyb3IgPSAnZGVmYXVsdCc7XG4gICAgY29uc3QgZWMgPSBlLmVycm9yLnNlcnZpY2VFcnJvckNvZGU7XG4gICAgaWYgKGVjID09PSA5OTk5OSkge1xuICAgICAgY29uc3QgaWVjID0gZS5lcnJvci5pbm5lckVycm9yPy5zZXJ2aWNlRXJyb3JDb2RlO1xuICAgICAgaWYgKGllYyA9PT0gMTEwMDApIGVycm9yID0gJ25hbWVFeGlzdHMnO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGZvciBleGlzdGluZyBuYW1lcyBhbmQgaW52YWxpZCBjaGFyYWN0ZXJzXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIGJlIGNoZWNrZWRcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBwYXJlbnQgZm9sZGVyICh3aWxsIGJlICdyb290JyBpZiBub3QgcHJvdmlkZWQpXG4gICAqIEByZXR1cm5zIGFscmVhZHkgZXhpc3RpbmcgbmFtZXNcbiAgICovXG4gIHZhbGlkYXRlTmFtZXMobmFtZXM6IHN0cmluZ1tdLCBwYXJlbnRJZD86IHN0cmluZyB8IG51bGwpOiBPYnNlcnZhYmxlPERyaXZlVmFsaWRhdGVSZXNwb25zZT4ge1xuICAgIGNvbnNvbGUubG9nKHsgbmFtZXMsIHBhcmVudElkIH0pO1xuXG4gICAgaWYgKHBhcmVudElkID09PSBEUklWRV9ST09UX0ZPTERFUl9JRCkgcGFyZW50SWQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZHZwOiBEcml2ZVZhbGlkYXRlUGF5bG9hZCA9IHtcbiAgICAgIGFwcDogJ29zZHJpdmUnLFxuICAgICAgZmlsZU5hbWVzOiBuYW1lcyxcbiAgICAgIHRhcmdldEZvbGRlcklkOiBwYXJlbnRJZCB8fCB1bmRlZmluZWRcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLiNiYWNrZW5kLnBvc3QoJy9kbXMvb2JqZWN0cy92YWxpZGF0ZScsIGR2cCkucGlwZShjYXRjaEVycm9yKChyZXM6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiBvZihyZXMuZXJyb3IpKSk7XG4gIH1cblxuICBnZXREZWZhdWx0UmliYm9uQWN0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX2RlZmF1bHRSaWJib25BY3Rpb25zLmxlbmd0aCkge1xuICAgICAgLy9bQkFTRV9BQ1RJT04uZG93bmxvYWQsIEJBU0VfQUNUSU9OLmRlbGV0ZSwgJ2FwcC5kcml2ZS5hY3Rpb24ucmVuYW1lJywgQkFTRV9BQ1RJT04uY29weSwgQkFTRV9BQ1RJT04uY3V0XVxuICAgICAgT2JqZWN0LnZhbHVlcyh7IC4uLkJBU0VfQUNUSU9OLCByZW5hbWU6ICdhcHAuZHJpdmUuYWN0aW9uLnJlbmFtZScgfSkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuI2FjdGlvbnNTZXJ2aWNlLmdldEFjdGlvbkJ5SWQoaWQsIEFDVElPTl9DT05URVhUKTtcbiAgICAgICAgaWYgKGEpIHRoaXMuX2RlZmF1bHRSaWJib25BY3Rpb25zLnB1c2goYSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRSaWJib25BY3Rpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QWN0aW9ucygpIHtcbiAgICB0aGlzLnNldEJ1c3kodHJ1ZSk7XG4gICAgdGhpcy4jYWN0aW9uc1NlcnZpY2VcbiAgICAgIC5nZXRBY3Rpb25zKHRoaXMuc3RhdGUkLnNlbGVjdGlvbigpLCB7XG4gICAgICAgIGNvbnRleHQ6IEFDVElPTl9DT05URVhUXG4gICAgICB9KVxuICAgICAgLnN1YnNjcmliZSgoYWN0aW9uczogQWN0aW9uW10pID0+IHtcbiAgICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyBhY3Rpb25zIH0pO1xuICAgICAgfSlcbiAgICAgIC5hZGQoKCkgPT4gdGhpcy5zZXRCdXN5KGZhbHNlKSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgc2VhcmNoIGNvbmRpdGlvbnMgcmVnYXJkaW5nIGZvbGRlciBsaXN0aW5nc1xuICAgKiBAcGFyYW0gcVxuICAgKi9cbiAgYXBwbHlGb2xkZXJMaXN0U2VhcmNoQ29uZGl0aW9ucyhxOiBTZWFyY2hRdWVyeSwgYWRkQmFzZVR5cGVJZCA9IHRydWUpOiBTZWFyY2hRdWVyeSB7XG4gICAgLy8gZm9sZGVycyBmaXJzdFxuICAgIGlmICghcS5zb3J0KSBxLnNvcnQgPSBbXTtcbiAgICBhZGRCYXNlVHlwZUlkICYmXG4gICAgICBxLnNvcnQucHVzaCh7XG4gICAgICAgIGZpZWxkOiBCYXNlT2JqZWN0VHlwZUZpZWxkLkJBU0VfVFlQRV9JRCxcbiAgICAgICAgb3JkZXI6ICdkZXNjJ1xuICAgICAgfSk7XG4gICAgcSA9IHRoaXMuYXBwbHlCYXNpY1NlYXJjaENvbmRpdGlvbnMocSk7XG5cbiAgICByZXR1cm4gcTtcbiAgfVxuXG4gIGFwcGx5QmFzaWNTZWFyY2hDb25kaXRpb25zKHE6IFNlYXJjaFF1ZXJ5KTogU2VhcmNoUXVlcnkge1xuICAgIHEuZmllbGRzID0gW1xuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSUQsXG4gICAgICBCYXNlT2JqZWN0VHlwZUZpZWxkLk1PRElGSUNBVElPTl9EQVRFLFxuICAgICAgQmFzZU9iamVjdFR5cGVGaWVsZC5NT0RJRklFRF9CWSxcbiAgICAgIENvbnRlbnRTdHJlYW1GaWVsZC5GSUxFTkFNRSxcbiAgICAgIENvbnRlbnRTdHJlYW1GaWVsZC5NSU1FX1RZUEUsXG4gICAgICBDb250ZW50U3RyZWFtRmllbGQuSUQsXG4gICAgICBDb250ZW50U3RyZWFtRmllbGQuTEVOR1RIXG4gICAgXTtcbiAgICBpZiAoIXEudHlwZXMgfHwgIXEudHlwZXMuaW5jbHVkZXMoRlNfU09UUy5vYmplY3QpKSBxLnR5cGVzID0gWy4uLihxLnR5cGVzIHx8IFtdKSwgRlNfU09UUy5vYmplY3RdO1xuICAgIC8vIHEuc29ydE9wdGlvbnMucHVzaChuZXcgU29ydE9wdGlvbihCYXNlT2JqZWN0VHlwZUZpZWxkLkJBU0VfVFlQRV9JRCwgJ2Rlc2MnKSk7XG4gICAgY29uc3Qgc29ydCA9IHRoaXMuc3RhdGUkLnNvcnQoKSB8fCB0aGlzLiNkZWZhdWx0U29ydDtcbiAgICBpZiAoIXEuc29ydCkgcS5zb3J0ID0gW107XG4gICAgcS5zb3J0LnB1c2goe1xuICAgICAgZmllbGQ6IHNvcnQucHJvcGVydHksXG4gICAgICBvcmRlcjogc29ydC5vcmRlclxuICAgIH0pO1xuICAgIHEuaW5jbHVkZVBlcm1pc3Npb25zID0gdHJ1ZTtcbiAgICAvLyBuZXcgU29ydE9wdGlvbihzb3J0LnByb3BlcnR5LCBzb3J0Lm9yZGVyKSk7XG4gICAgcmV0dXJuIHE7XG4gIH1cblxuICByZXNvbHZlRmlsZXNTdGF0ZShpZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Rm9sZGVySGllcmFyY2h5KGlkKTtcbiAgfVxuXG4gIGdldEZvbGRlckhpZXJhcmNoeShmb2xkZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxCcmVhZENydW1iW10+IHtcbiAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7XG4gICAgICBicmVhZGNydW1iOiB7XG4gICAgICAgIC4uLnRoaXMuaW5pdGlhbFN0YXRlLmJyZWFkY3J1bWIsXG4gICAgICAgIGxvYWRpbmc6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmb2xkZXJJZCA9PT0gRFJJVkVfUk9PVF9GT0xERVJfSURcbiAgICAgID8gb2YoW10pXG4gICAgICA6IHRoaXMuI2ZldGNoRm9sZGVyKGZvbGRlcklkLCAwLCB0aGlzLk1BWF9ERVBUSCkucGlwZShcbiAgICAgICAgICB0YXAoKHJlczogeyBwYXJ0aWFsOiBib29sZWFuOyBpdGVtczogQnJlYWRDcnVtYltdIH0pID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtczogQnJlYWRDcnVtYltdID0gW107XG4gICAgICAgICAgICBpZiAocmVzLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaXRlbXMgPSBbLi4uaXRlbXMsIC4uLnJlcy5pdGVtc107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhdGNoU3RhdGUodGhpcy5zdGF0ZSQsIHtcbiAgICAgICAgICAgICAgYnJlYWRjcnVtYjoge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuaW5pdGlhbFN0YXRlLmJyZWFkY3J1bWIsXG4gICAgICAgICAgICAgICAgcGFydGlhbDogcmVzLnBhcnRpYWwsXG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKChyZXMpID0+IHJlcy5pdGVtcylcbiAgICAgICAgKTtcbiAgfVxuXG4gICNmZXRjaEZvbGRlcihcbiAgICBmb2xkZXJJZDogc3RyaW5nLFxuICAgIGRlcHRoOiBudW1iZXIsXG4gICAgbWF4RGVwdGg6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPHtcbiAgICBwYXJ0aWFsOiBib29sZWFuO1xuICAgIGl0ZW1zOiBCcmVhZENydW1iW107XG4gIH0+IHtcbiAgICBpZiAoZGVwdGggPj0gbWF4RGVwdGgpIHJldHVybiBvZih7IHBhcnRpYWw6IHRydWUsIGl0ZW1zOiBbXSB9KTtcbiAgICBjb25zdCBjYWNoZWRGb2xkZXIgPSB0aGlzLmJyZWFkY3J1bWJDYWNoZS5nZXQoZm9sZGVySWQpO1xuICAgIGlmIChjYWNoZWRGb2xkZXIpIHtcbiAgICAgIHJldHVybiBjYWNoZWRGb2xkZXIucGFyZW50SWRcbiAgICAgICAgPyB0aGlzLiNmZXRjaEZvbGRlcihjYWNoZWRGb2xkZXIucGFyZW50SWQsIGRlcHRoICsgMSwgbWF4RGVwdGgpLnBpcGUoXG4gICAgICAgICAgICBtYXAoKHBhcmVudEZvbGRlcnMpID0+ICh7XG4gICAgICAgICAgICAgIHBhcnRpYWw6IHBhcmVudEZvbGRlcnMucGFydGlhbCxcbiAgICAgICAgICAgICAgaXRlbXM6IFsuLi5wYXJlbnRGb2xkZXJzLml0ZW1zLCB7IG5hbWU6IGNhY2hlZEZvbGRlci5uYW1lLCBpZDogY2FjaGVkRm9sZGVyLmlkIH1dXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApXG4gICAgICAgIDogb2Yoe1xuICAgICAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgICAgICBpdGVtczogW3sgbmFtZTogY2FjaGVkRm9sZGVyLm5hbWUsIGlkOiBjYWNoZWRGb2xkZXIuaWQgfV1cbiAgICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UuZ2V0RG1zT2JqZWN0KGZvbGRlcklkKS5waXBlKFxuICAgICAgbWFwKChmb2xkZXIpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudEZvbGRlciA9IHtcbiAgICAgICAgICBuYW1lOiBmb2xkZXIuZGF0YVtGU19QUk9QRVJUSUVTLm5hbWVdIGFzIHN0cmluZyxcbiAgICAgICAgICBpZDogZm9sZGVyLmRhdGFbQmFzZU9iamVjdFR5cGVGaWVsZC5PQkpFQ1RfSURdIGFzIHN0cmluZyxcbiAgICAgICAgICBwYXJlbnRJZDogZm9sZGVyLnBhcmVudElkXG4gICAgICAgIH07XG4gICAgICAgIC8vIHRoaXMuYnJlYWRjcnVtYkNhY2hlLnNldChmb2xkZXIuaWQsIGN1cnJlbnRGb2xkZXIpO1xuICAgICAgICByZXR1cm4gY3VycmVudEZvbGRlcjtcbiAgICAgIH0pLFxuICAgICAgc3dpdGNoTWFwKChmb2xkZXIpID0+IHtcbiAgICAgICAgaWYgKCFmb2xkZXIucGFyZW50SWQpIHtcbiAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgcGFydGlhbDogZmFsc2UsXG4gICAgICAgICAgICBpdGVtczogW3sgbmFtZTogZm9sZGVyLm5hbWUsIGlkOiBmb2xkZXIuaWQgfV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLiNmZXRjaEZvbGRlcihmb2xkZXIucGFyZW50SWQsIGRlcHRoICsgMSwgbWF4RGVwdGgpLnBpcGUoXG4gICAgICAgICAgbWFwKChwYXJlbnRGb2xkZXJzKSA9PiAoe1xuICAgICAgICAgICAgcGFydGlhbDogcGFyZW50Rm9sZGVycy5wYXJ0aWFsLFxuICAgICAgICAgICAgaXRlbXM6IFsuLi5wYXJlbnRGb2xkZXJzLml0ZW1zLCB7IG5hbWU6IGZvbGRlci5uYW1lLCBpZDogZm9sZGVyLmlkIH1dXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBnZXRWZXJzaW9ucyhpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxEbXNPYmplY3RbXT4ge1xuICAgIHBhdGNoU3RhdGUodGhpcy5zdGF0ZSQsIHsgYnVzeTogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdGhpcy4jZG1zU2VydmljZS5nZXREbXNPYmplY3RWZXJzaW9ucyhpZCkucGlwZShcbiAgICAgIHRhcCgodmVyc2lvbnMpID0+IHtcbiAgICAgICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwge1xuICAgICAgICAgIGJ1c3k6IGZhbHNlLFxuICAgICAgICAgIHZlcnNpb25zOiB7XG4gICAgICAgICAgICB2ZXJzaW9uc0xpc3Q6IG1hcFNlYXJjaFJlc3VsdCh2ZXJzaW9ucyksXG4gICAgICAgICAgICBzZWxlY3RlZFZlcnNpb246IHRoaXMuc3RhdGUkLnZlcnNpb25zKCkuc2VsZWN0ZWRWZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGdldFNlbGVjdGVkRG1zT2JqZWN0KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERtc09iamVjdD4ge1xuICAgIHJldHVybiB0aGlzLiNkbXNTZXJ2aWNlLmdldERtc09iamVjdChpZCkucGlwZShcbiAgICAgIHRhcCgoZG1zT2JqZWN0KSA9PlxuICAgICAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7XG4gICAgICAgICAgc2VsZWN0ZWREbXNPYmplY3Q6IGRtc09iamVjdCxcbiAgICAgICAgICB2ZXJzaW9uczoge1xuICAgICAgICAgICAgdmVyc2lvbnNMaXN0OiB0aGlzLnN0YXRlJC52ZXJzaW9ucy52ZXJzaW9uc0xpc3QoKSxcbiAgICAgICAgICAgIHNlbGVjdGVkVmVyc2lvbjogW2Rtc09iamVjdF1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkVmVyc2lvbih2ZXJzaW9uOiBhbnkpIHtcbiAgICB0aGlzLnNldEJ1c3kodHJ1ZSk7XG4gICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UuZ2V0RG1zT2JqZWN0VmVyc2lvbih2ZXJzaW9uLmRtc09iamVjdC5pZCwgdmVyc2lvbi5kbXNPYmplY3QudmVyc2lvbikucGlwZShcbiAgICAgIHRhcCgocmVzKSA9PlxuICAgICAgICBwYXRjaFN0YXRlKHRoaXMuc3RhdGUkLCB7XG4gICAgICAgICAgdmVyc2lvbnM6IHtcbiAgICAgICAgICAgIHZlcnNpb25zTGlzdDogdGhpcy5zdGF0ZSQudmVyc2lvbnMudmVyc2lvbnNMaXN0KCksXG4gICAgICAgICAgICBzZWxlY3RlZFZlcnNpb246IFtyZXNdXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLnNldEJ1c3koZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBzZXROZXdWZXJzaW9uKHZlcnNpb24/OiBudW1iZXIpOiBPYnNlcnZhYmxlPERtc09iamVjdFtdIHwgbnVsbD4ge1xuICAgIHBhdGNoU3RhdGUodGhpcy5zdGF0ZSQsIHsgYnVzeTogdHJ1ZSB9KTtcbiAgICBjb25zdCBzZWxlY3RlZFZlcnNpb24gPSB0aGlzLnN0YXRlJC52ZXJzaW9ucy5zZWxlY3RlZFZlcnNpb24oKTtcbiAgICBpZiAoc2VsZWN0ZWRWZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uTnVtYmVyOiBudW1iZXIgPSB2ZXJzaW9uID8/IHNlbGVjdGVkVmVyc2lvblswXS52ZXJzaW9uO1xuICAgICAgcmV0dXJuIHRoaXMuI2Rtc1NlcnZpY2UucmVzdG9yZURtc09iamVjdChzZWxlY3RlZFZlcnNpb25bMF0uaWQsIHZlcnNpb25OdW1iZXIpLnBpcGUoc3dpdGNoTWFwKChvYmplY3Q6IERtc09iamVjdCkgPT4gdGhpcy5nZXRWZXJzaW9ucyhvYmplY3QuaWQpKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIGNsZWFyVmVyc2lvbnMoKSB7XG4gICAgcGF0Y2hTdGF0ZSh0aGlzLnN0YXRlJCwgeyB2ZXJzaW9uczogdGhpcy5pbml0aWFsU3RhdGUudmVyc2lvbnMgfSk7XG4gIH1cbn1cbiJdfQ==