@mediusinc/mng-commons-audit 3.0.0-rc.0 → 3.0.0-rc.1

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 (44) hide show
  1. package/README.md +32 -4
  2. package/assets/i18n/en.json +23 -21
  3. package/assets/i18n/sl.json +25 -14
  4. package/esm2022/lib/api/models/guiPropertyModel.mjs +6 -1
  5. package/esm2022/lib/api/models/index.mjs +1 -4
  6. package/esm2022/lib/api/services/audit-revisions-api.service.mjs +38 -21
  7. package/esm2022/lib/api/services/audit.service.mjs +45 -0
  8. package/esm2022/lib/audit.routes.mjs +33 -10
  9. package/esm2022/lib/components/entity-changes-field/entity-changes-field.component.mjs +49 -35
  10. package/esm2022/lib/components/pages/audit/audit-page.component.mjs +12 -0
  11. package/esm2022/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.mjs +90 -32
  12. package/esm2022/lib/components/pages/revisions/audit-revisions-page.component.mjs +41 -45
  13. package/esm2022/lib/models/config.model.mjs +2 -0
  14. package/esm2022/lib/models/new-filter-match-type.model.mjs +19 -0
  15. package/esm2022/lib/models/revEntityWithId.model.mjs +9 -0
  16. package/esm2022/lib/service/module-config.token.mjs +3 -0
  17. package/esm2022/lib/utils/audit.util.mjs +300 -0
  18. package/fesm2022/mediusinc-mng-commons-audit.mjs +615 -306
  19. package/fesm2022/mediusinc-mng-commons-audit.mjs.map +1 -1
  20. package/lib/api/models/guiPropertyModel.d.ts +1 -0
  21. package/lib/api/models/index.d.ts +0 -3
  22. package/lib/api/services/audit-revisions-api.service.d.ts +16 -10
  23. package/lib/api/services/audit.service.d.ts +20 -0
  24. package/lib/audit.routes.d.ts +3 -2
  25. package/lib/components/entity-changes-field/entity-changes-field.component.d.ts +9 -6
  26. package/lib/components/pages/audit/audit-page.component.d.ts +5 -0
  27. package/lib/components/pages/entity-revisions/audit-entity-revisions-page.component.d.ts +21 -12
  28. package/lib/components/pages/revisions/audit-revisions-page.component.d.ts +8 -5
  29. package/lib/models/config.model.d.ts +4 -0
  30. package/lib/models/new-filter-match-type.model.d.ts +17 -0
  31. package/lib/models/revEntityWithId.model.d.ts +4 -0
  32. package/lib/service/module-config.token.d.ts +3 -0
  33. package/lib/utils/audit.util.d.ts +9 -0
  34. package/package.json +2 -3
  35. package/esm2022/lib/api/models/revEntityChangeDto.mjs +0 -52
  36. package/esm2022/lib/api/models/revEntityDto.mjs +0 -42
  37. package/esm2022/lib/api/models/revisionTypeEnumDto.mjs +0 -20
  38. package/esm2022/lib/api/services/audit-entity-revisions-api.service.mjs +0 -47
  39. package/esm2022/lib/components/pages/entity-revisions/entity-dropdown-page.component.mjs +0 -32
  40. package/lib/api/models/revEntityChangeDto.d.ts +0 -25
  41. package/lib/api/models/revEntityDto.d.ts +0 -20
  42. package/lib/api/models/revisionTypeEnumDto.d.ts +0 -5
  43. package/lib/api/services/audit-entity-revisions-api.service.d.ts +0 -14
  44. package/lib/components/pages/entity-revisions/entity-dropdown-page.component.d.ts +0 -12
@@ -0,0 +1,300 @@
1
+ import { MediusFilterMatchType, ObjectSerializer } from '@mediusinc/mng-commons';
2
+ import { GuiPropertyType, RevisionType } from '../api/models';
3
+ import { NewMediusFilterMatchType } from '../models/new-filter-match-type.model';
4
+ export class AuditUtil {
5
+ static addColumnsFromModel(descriptor, propertyList) {
6
+ for (const property of propertyList) {
7
+ if (property.propertyType === GuiPropertyType.Enum) {
8
+ // TODO is there a nicer way than appending "Dto" at the end of the simple name to match
9
+ descriptor
10
+ .addColumn(property.resolvedPropertyName)
11
+ .withSort()
12
+ .asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
13
+ .withFilterLookupEnum(property.possibleEnumValues);
14
+ }
15
+ else if (property.propertyType === GuiPropertyType.Number) {
16
+ descriptor.addColumn(property.resolvedPropertyName).withSort().asNumber().withFilter();
17
+ }
18
+ else if (property.propertyType === GuiPropertyType.Boolean) {
19
+ descriptor.addColumn(property.resolvedPropertyName).withSort().asBoolean().withFilter();
20
+ }
21
+ else if (property.propertyType === GuiPropertyType.LocalDate) {
22
+ descriptor.addColumn(property.resolvedPropertyName).withSort().asDate('dd. MMM yyyy').withFilter();
23
+ }
24
+ else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
25
+ descriptor.addColumn(property.resolvedPropertyName).withSort().asDate('dd. MMM yyyy HH:mm').withFilter();
26
+ }
27
+ else {
28
+ // string / wildcard
29
+ descriptor.addColumn(property.resolvedPropertyName).withSort().withFilter();
30
+ }
31
+ }
32
+ return descriptor;
33
+ }
34
+ static addFieldsFromModel(descriptor, revModel) {
35
+ for (const property of revModel.properties) {
36
+ if (property.propertyType === GuiPropertyType.Enum) {
37
+ descriptor
38
+ .addFieldLookupEnum('revEntity.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName), property.possibleEnumValues)
39
+ .withLabel(property.resolvedPropertyName)
40
+ .withDisabled();
41
+ }
42
+ else if (property.propertyType === GuiPropertyType.Number) {
43
+ descriptor
44
+ .addField('revEntity.' + property.resolvedPropertyName)
45
+ .withLabel(property.resolvedPropertyName)
46
+ .asNumber()
47
+ .withDisabled();
48
+ }
49
+ else if (property.propertyType === GuiPropertyType.Boolean) {
50
+ descriptor
51
+ .addField('revEntity.' + property.resolvedPropertyName)
52
+ .withLabel(property.resolvedPropertyName)
53
+ .withDisabled();
54
+ }
55
+ else if (property.propertyType === GuiPropertyType.LocalDate) {
56
+ descriptor
57
+ .addField('revEntity.' + property.resolvedPropertyName)
58
+ .withLabel(property.resolvedPropertyName)
59
+ .asDatePicker('dd. MMM yyyy')
60
+ .withDisabled();
61
+ }
62
+ else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
63
+ descriptor
64
+ .addField('revEntity.' + property.resolvedPropertyName)
65
+ .withLabel(property.resolvedPropertyName)
66
+ .asDatePicker('dd. MM yy', undefined, undefined, true, false)
67
+ .withDisabled();
68
+ }
69
+ else {
70
+ // string / wildcard
71
+ descriptor
72
+ .addField('revEntity.' + property.resolvedPropertyName)
73
+ .withLabel(property.resolvedPropertyName)
74
+ .withDisabled();
75
+ }
76
+ }
77
+ return descriptor;
78
+ }
79
+ static buildDescriptorForEntityRevision(descriptor, revModel, entityModel) {
80
+ descriptor
81
+ .addColumn('revType')
82
+ .withTitle('revType')
83
+ .asEnum(ObjectSerializer.get().findEnum('RevisionType'))
84
+ .withFilterLookupEnum([RevisionType.Add, RevisionType.Mod, RevisionType.Del]);
85
+ descriptor.addFieldLookupEnum('revType', ObjectSerializer.get().findEnum('RevisionType'), [RevisionType.Add, RevisionType.Mod, RevisionType.Del]).withLabel('revType');
86
+ for (const property of revModel.properties) {
87
+ if (property.propertyType === GuiPropertyType.Enum) {
88
+ // TODO is there a nicer way than appending "Dto" at the end of the simple name to match
89
+ descriptor
90
+ .addColumn('revEntity.' + property.resolvedPropertyName)
91
+ .withTitle(property.resolvedPropertyName)
92
+ .asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
93
+ .withSort()
94
+ .withFilterLookupEnum(property.possibleEnumValues);
95
+ descriptor
96
+ .addFieldLookupEnum('revEntity.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'), property.possibleEnumValues)
97
+ .withLabel(property.resolvedPropertyName);
98
+ }
99
+ else if (property.propertyType === GuiPropertyType.Number) {
100
+ descriptor
101
+ .addColumn('revEntity.' + property.resolvedPropertyName)
102
+ .withTitle(property.resolvedPropertyName)
103
+ .asNumber()
104
+ .withSort()
105
+ .withFilter();
106
+ descriptor
107
+ .addField('revEntity.' + property.resolvedPropertyName)
108
+ .withLabel(property.resolvedPropertyName)
109
+ .asNumber();
110
+ }
111
+ else if (property.propertyType === GuiPropertyType.Boolean) {
112
+ descriptor
113
+ .addColumn('revEntity.' + property.resolvedPropertyName)
114
+ .withTitle(property.resolvedPropertyName)
115
+ .asBoolean()
116
+ .withSort()
117
+ .withFilter();
118
+ descriptor.addField('revEntity.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
119
+ }
120
+ else if (property.propertyType === GuiPropertyType.LocalDate) {
121
+ descriptor
122
+ .addColumn('revEntity.' + property.resolvedPropertyName)
123
+ .withTitle(property.resolvedPropertyName)
124
+ .asDate('dd. MMM yyyy')
125
+ .withSort()
126
+ .withFilter();
127
+ descriptor
128
+ .addField('revEntity.' + property.resolvedPropertyName)
129
+ .withLabel(property.resolvedPropertyName)
130
+ .asDatePicker('dd. MMM yyyy');
131
+ }
132
+ else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
133
+ descriptor
134
+ .addColumn('revEntity.' + property.resolvedPropertyName)
135
+ .withTitle(property.resolvedPropertyName)
136
+ .asDate('dd. MMM yyyy HH:mm')
137
+ .withSort()
138
+ .withFilter();
139
+ descriptor
140
+ .addField('revEntity.' + property.resolvedPropertyName)
141
+ .withLabel(property.resolvedPropertyName)
142
+ .asDatePicker('dd. MM yy', undefined, undefined, true, false);
143
+ }
144
+ else {
145
+ // string / wildcard
146
+ descriptor
147
+ .addColumn('revEntity.' + property.resolvedPropertyName)
148
+ .withTitle(property.resolvedPropertyName)
149
+ .withSort()
150
+ .withFilter();
151
+ descriptor.addField('revEntity.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
152
+ }
153
+ }
154
+ for (const property of entityModel.properties) {
155
+ if (property.propertyType === GuiPropertyType.Enum) {
156
+ // TODO is there a nicer way than appending "Dto" at the end of the simple name to match
157
+ descriptor
158
+ .addColumn('entityState.' + property.resolvedPropertyName)
159
+ .withTitle(property.resolvedPropertyName)
160
+ .asEnum(ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'))
161
+ .withSort()
162
+ .withFilterLookupEnum(property.possibleEnumValues);
163
+ descriptor
164
+ .addFieldLookupEnum('entityState.' + property.resolvedPropertyName, ObjectSerializer.get().findEnum(property.enumClassSimpleName + 'Dto'), property.possibleEnumValues)
165
+ .withLabel(property.resolvedPropertyName);
166
+ }
167
+ else if (property.propertyType === GuiPropertyType.Number) {
168
+ descriptor
169
+ .addColumn('entityState.' + property.resolvedPropertyName)
170
+ .withTitle(property.resolvedPropertyName)
171
+ .asNumber()
172
+ .withSort()
173
+ .withFilter();
174
+ descriptor
175
+ .addField('entityState.' + property.resolvedPropertyName)
176
+ .withLabel(property.resolvedPropertyName)
177
+ .asNumber();
178
+ }
179
+ else if (property.propertyType === GuiPropertyType.Boolean) {
180
+ descriptor
181
+ .addColumn('entityState.' + property.resolvedPropertyName)
182
+ .withTitle(property.resolvedPropertyName)
183
+ .asBoolean()
184
+ .withSort()
185
+ .withFilter();
186
+ descriptor.addField('entityState.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
187
+ }
188
+ else if (property.propertyType === GuiPropertyType.LocalDate) {
189
+ descriptor
190
+ .addColumn('entityState.' + property.resolvedPropertyName)
191
+ .withTitle(property.resolvedPropertyName)
192
+ .asDate('dd. MMM yyyy')
193
+ .withSort()
194
+ .withFilter();
195
+ descriptor
196
+ .addField('entityState.' + property.resolvedPropertyName)
197
+ .withLabel(property.resolvedPropertyName)
198
+ .asDatePicker('dd. MMM yyyy');
199
+ }
200
+ else if (property.propertyType === GuiPropertyType.OffsetDateTime) {
201
+ descriptor
202
+ .addColumn('entityState.' + property.resolvedPropertyName)
203
+ .withTitle(property.resolvedPropertyName)
204
+ .asDate('dd. MMM yyyy HH:mm')
205
+ .withSort()
206
+ .withFilter();
207
+ descriptor
208
+ .addField('entityState.' + property.resolvedPropertyName)
209
+ .withLabel(property.resolvedPropertyName)
210
+ .asDatePicker('dd. MM yy', undefined, undefined, true, false);
211
+ }
212
+ else {
213
+ // string / wildcard
214
+ descriptor
215
+ .addColumn('entityState.' + property.resolvedPropertyName)
216
+ .withTitle(property.resolvedPropertyName)
217
+ .withSort()
218
+ .withFilter();
219
+ descriptor.addField('entityState.' + property.resolvedPropertyName).withLabel(property.resolvedPropertyName);
220
+ }
221
+ }
222
+ return descriptor;
223
+ }
224
+ static extractPropertyName(fullPropertyName) {
225
+ if (fullPropertyName?.includes('entityState.')) {
226
+ return fullPropertyName.replace('entityState.', '');
227
+ }
228
+ else if (fullPropertyName?.includes('revEntity.')) {
229
+ return fullPropertyName?.replace('revEntity.', '');
230
+ }
231
+ return fullPropertyName;
232
+ }
233
+ static appendMediusQueryParamsToUrl(queryParams) {
234
+ let url = `?firstResult=${queryParams.itemsOffset}&maxResults=${queryParams.itemsPerPage}`;
235
+ if (queryParams.sortProperty && queryParams.sortProperty.length > 0) {
236
+ url += '&sorts=';
237
+ const sortingQPs = [];
238
+ for (let i = 0; i < queryParams.sortProperty.length; i++) {
239
+ if (queryParams.sortAsc[i]) {
240
+ sortingQPs.push(`asc:${this.extractPropertyName(queryParams.sortProperty[i])}`);
241
+ }
242
+ else {
243
+ sortingQPs.push(`desc:${this.extractPropertyName(queryParams.sortProperty[i])}`);
244
+ }
245
+ }
246
+ url += sortingQPs.join(',');
247
+ }
248
+ if (queryParams.filterParams && queryParams.filterParams.length > 0) {
249
+ const filterQPs = [];
250
+ for (const mfp of queryParams.filterParams) {
251
+ switch (mfp.filterMatchType) {
252
+ case MediusFilterMatchType.Equals: {
253
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Equals}:${mfp.filterValue}`);
254
+ break;
255
+ }
256
+ case MediusFilterMatchType.NotEquals: {
257
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.NotEquals}:${mfp.filterValue}`);
258
+ break;
259
+ }
260
+ case MediusFilterMatchType.FromTo: {
261
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Between}:${mfp.filterValue},${mfp.filterValueTo}`);
262
+ break;
263
+ }
264
+ case MediusFilterMatchType.Contains: {
265
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.Contains}:${mfp.filterValue}`);
266
+ break;
267
+ }
268
+ case MediusFilterMatchType.StartsWith: {
269
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.StartsWith}:${mfp.filterValue}`);
270
+ break;
271
+ }
272
+ case MediusFilterMatchType.EndsWith: {
273
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.EndsWith}:${mfp.filterValue}`);
274
+ break;
275
+ }
276
+ case MediusFilterMatchType.In: {
277
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.In}:${mfp.filterValue}`);
278
+ break;
279
+ }
280
+ case MediusFilterMatchType.NotIn: {
281
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.NotIn}:${mfp.filterValue}`);
282
+ break;
283
+ }
284
+ case MediusFilterMatchType.SmallerThan: {
285
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.LessThan}:${mfp.filterValue}`);
286
+ break;
287
+ }
288
+ case MediusFilterMatchType.GreaterThan: {
289
+ filterQPs.push(`${this.extractPropertyName(mfp.property)}=${NewMediusFilterMatchType.GreaterThan}:${mfp.filterValue}`);
290
+ break;
291
+ }
292
+ }
293
+ }
294
+ url += '&';
295
+ url += filterQPs.join('&');
296
+ }
297
+ return url;
298
+ }
299
+ }
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdXRpbHMvYXVkaXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1CLHFCQUFxQixFQUFvQixnQkFBZ0IsRUFBdUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV6SixPQUFPLEVBQW1DLGVBQWUsRUFBeUIsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVDQUF1QyxDQUFDO0FBRS9FLE1BQU0sT0FBTyxTQUFTO0lBQ1gsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQWdDLEVBQUUsWUFBZ0M7UUFDaEcsS0FBSyxNQUFNLFFBQVEsSUFBSSxZQUFZLEVBQUU7WUFDakMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2hELHdGQUF3RjtnQkFDeEYsVUFBVTtxQkFDTCxTQUFTLENBQUMsUUFBUSxDQUFDLG9CQUFxQixDQUFDO3FCQUN6QyxRQUFRLEVBQUU7cUJBQ1YsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDLENBQUM7cUJBQzdFLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQzFEO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUN6RCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBcUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQzNGO2lCQUFNLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxlQUFlLENBQUMsT0FBTyxFQUFFO2dCQUMxRCxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEs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SjtZQUNELEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDWCxHQUFHLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUM5QjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yLCBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUsIE1lZGl1c1F1ZXJ5UGFyYW0sIE9iamVjdFNlcmlhbGl6ZXIsIFRhYmxlRGVzY3JpcHRvciwgVGFibGV2aWV3RGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucyc7XG5cbmltcG9ydCB7R3VpRW50aXR5TW9kZWwsIEd1aVByb3BlcnR5TW9kZWwsIEd1aVByb3BlcnR5VHlwZSwgUmV2RW50aXR5V2l0aFN0YXRlRHRvLCBSZXZpc2lvblR5cGV9IGZyb20gJy4uL2FwaS9tb2RlbHMnO1xuaW1wb3J0IHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGV9IGZyb20gJy4uL21vZGVscy9uZXctZmlsdGVyLW1hdGNoLXR5cGUubW9kZWwnO1xuXG5leHBvcnQgY2xhc3MgQXVkaXRVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGFkZENvbHVtbnNGcm9tTW9kZWwoZGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9yPGFueT4sIHByb3BlcnR5TGlzdDogR3VpUHJvcGVydHlNb2RlbFtdKTogVGFibGVEZXNjcmlwdG9yPGFueT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnR5TGlzdCkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmljZXIgd2F5IHRoYW4gYXBwZW5kaW5nIFwiRHRvXCIgYXQgdGhlIGVuZCBvZiB0aGUgc2ltcGxlIG5hbWUgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4ocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSArICdEdG8nKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc051bWJlcigpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuQm9vbGVhbikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc0Jvb2xlYW4oKS53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkQ29sdW1uKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aFNvcnQoKS5hc0RhdGUoJ2RkLiBNTU0geXl5eScpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZENvbHVtbihwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpLndpdGhTb3J0KCkuYXNEYXRlKCdkZC4gTU1NIHl5eXkgSEg6bW0nKS53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHN0cmluZyAvIHdpbGRjYXJkXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRDb2x1bW4ocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoU29ydCgpLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFkZEZpZWxkc0Zyb21Nb2RlbDxUPihkZXNjcmlwdG9yOiBFZGl0b3JEZXNjcmlwdG9yPFQ+LCByZXZNb2RlbDogR3VpRW50aXR5TW9kZWwpOiBFZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiByZXZNb2RlbC5wcm9wZXJ0aWVzISkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZExvb2t1cEVudW0oJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhLCBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUhKSwgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhEaXNhYmxlZCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5OdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkxvY2FsRGF0ZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTU0geXl5eScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuT2Zmc2V0RGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU0geXknLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRGlzYWJsZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aERpc2FibGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBidWlsZERlc2NyaXB0b3JGb3JFbnRpdHlSZXZpc2lvbihcbiAgICAgICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvcjxSZXZFbnRpdHlXaXRoU3RhdGVEdG8+LFxuICAgICAgICByZXZNb2RlbDogR3VpRW50aXR5TW9kZWwsXG4gICAgICAgIGVudGl0eU1vZGVsOiBHdWlFbnRpdHlNb2RlbFxuICAgICk6IFRhYmxldmlld0Rlc2NyaXB0b3I8UmV2RW50aXR5V2l0aFN0YXRlRHRvPiB7XG4gICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgIC5hZGRDb2x1bW4oJ3JldlR5cGUnKVxuICAgICAgICAgICAgLndpdGhUaXRsZSgncmV2VHlwZScpXG4gICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0oJ1JldmlzaW9uVHlwZScpKVxuICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKFtSZXZpc2lvblR5cGUuQWRkLCBSZXZpc2lvblR5cGUuTW9kLCBSZXZpc2lvblR5cGUuRGVsXSk7XG4gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtKCdyZXZUeXBlJywgT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bSgnUmV2aXNpb25UeXBlJyksIFtSZXZpc2lvblR5cGUuQWRkLCBSZXZpc2lvblR5cGUuTW9kLCBSZXZpc2lvblR5cGUuRGVsXSkud2l0aExhYmVsKCdyZXZUeXBlJyk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcmV2TW9kZWwucHJvcGVydGllcyEpIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5FbnVtKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyBpcyB0aGVyZSBhIG5pY2VyIHdheSB0aGFuIGFwcGVuZGluZyBcIkR0b1wiIGF0IHRoZSBlbmQgb2YgdGhlIHNpbXBsZSBuYW1lIHRvIG1hdGNoXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0VudW0oT2JqZWN0U2VyaWFsaXplci5nZXQoKS5maW5kRW51bShwcm9wZXJ0eS5lbnVtQ2xhc3NTaW1wbGVOYW1lICsgJ0R0bycpKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlckxvb2t1cEVudW0ocHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzKTtcblxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkTG9va3VwRW51bShcbiAgICAgICAgICAgICAgICAgICAgICAgICdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSEgKyAnRHRvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5wb3NzaWJsZUVudW1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk51bWJlcikge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigncmV2RW50aXR5LicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc051bWJlcigpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5Cb29sZWFuKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0Jvb2xlYW4oKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuTG9jYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcignZGQuIE1NTSB5eXl5Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLk9mZnNldERhdGVUaW1lKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eSBISDptbScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZVBpY2tlcignZGQuIE1NIHl5JywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyaW5nIC8gd2lsZGNhcmRcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ3JldkVudGl0eS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRpdGxlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKCdyZXZFbnRpdHkuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBlbnRpdHlNb2RlbC5wcm9wZXJ0aWVzISkge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkVudW0pIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoZXJlIGEgbmljZXIgd2F5IHRoYW4gYXBwZW5kaW5nIFwiRHRvXCIgYXQgdGhlIGVuZCBvZiB0aGUgc2ltcGxlIG5hbWUgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNFbnVtKE9iamVjdFNlcmlhbGl6ZXIuZ2V0KCkuZmluZEVudW0ocHJvcGVydHkuZW51bUNsYXNzU2ltcGxlTmFtZSArICdEdG8nKSlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXJMb29rdXBFbnVtKHByb3BlcnR5LnBvc3NpYmxlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGRMb29rdXBFbnVtKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEsXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKHByb3BlcnR5LmVudW1DbGFzc1NpbXBsZU5hbWUhICsgJ0R0bycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkucG9zc2libGVFbnVtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5OdW1iZXIpIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNOdW1iZXIoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFNvcnQoKVxuICAgICAgICAgICAgICAgICAgICAud2l0aEZpbHRlcigpO1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZEZpZWxkKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzTnVtYmVyKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LnByb3BlcnR5VHlwZSA9PT0gR3VpUHJvcGVydHlUeXBlLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoVGl0bGUocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNCb29sZWFuKClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKS53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkucHJvcGVydHlUeXBlID09PSBHdWlQcm9wZXJ0eVR5cGUuTG9jYWxEYXRlKSB7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCdlbnRpdHlTdGF0ZS4nICsgcHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAud2l0aFRpdGxlKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLmFzRGF0ZSgnZGQuIE1NTSB5eXl5JylcbiAgICAgICAgICAgICAgICAgICAgLndpdGhTb3J0KClcbiAgICAgICAgICAgICAgICAgICAgLndpdGhGaWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXG4gICAgICAgICAgICAgICAgICAgIC5hZGRGaWVsZCgnZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhMYWJlbChwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGVQaWNrZXIoJ2RkLiBNTU0geXl5eScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5wcm9wZXJ0eVR5cGUgPT09IEd1aVByb3BlcnR5VHlwZS5PZmZzZXREYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbignZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC5hc0RhdGUoJ2RkLiBNTU0geXl5eSBISDptbScpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvclxuICAgICAgICAgICAgICAgICAgICAuYWRkRmllbGQoJ2VudGl0eVN0YXRlLicgKyBwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoTGFiZWwocHJvcGVydHkucmVzb2x2ZWRQcm9wZXJ0eU5hbWUhKVxuICAgICAgICAgICAgICAgICAgICAuYXNEYXRlUGlja2VyKCdkZC4gTU0geXknLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmcgLyB3aWxkY2FyZFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JcbiAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbignZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISlcbiAgICAgICAgICAgICAgICAgICAgLndpdGhUaXRsZShwcm9wZXJ0eS5yZXNvbHZlZFByb3BlcnR5TmFtZSEpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoU29ydCgpXG4gICAgICAgICAgICAgICAgICAgIC53aXRoRmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRGaWVsZCgnZW50aXR5U3RhdGUuJyArIHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISkud2l0aExhYmVsKHByb3BlcnR5LnJlc29sdmVkUHJvcGVydHlOYW1lISk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZXh0cmFjdFByb3BlcnR5TmFtZShmdWxsUHJvcGVydHlOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoZnVsbFByb3BlcnR5TmFtZT8uaW5jbHVkZXMoJ2VudGl0eVN0YXRlLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbFByb3BlcnR5TmFtZS5yZXBsYWNlKCdlbnRpdHlTdGF0ZS4nLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnVsbFByb3BlcnR5TmFtZT8uaW5jbHVkZXMoJ3JldkVudGl0eS4nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWU/LnJlcGxhY2UoJ3JldkVudGl0eS4nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGxQcm9wZXJ0eU5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBhcHBlbmRNZWRpdXNRdWVyeVBhcmFtc1RvVXJsKHF1ZXJ5UGFyYW1zOiBNZWRpdXNRdWVyeVBhcmFtKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVybCA9IGA/Zmlyc3RSZXN1bHQ9JHtxdWVyeVBhcmFtcy5pdGVtc09mZnNldH0mbWF4UmVzdWx0cz0ke3F1ZXJ5UGFyYW1zLml0ZW1zUGVyUGFnZX1gO1xuICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5ICYmIHF1ZXJ5UGFyYW1zLnNvcnRQcm9wZXJ0eS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB1cmwgKz0gJyZzb3J0cz0nO1xuICAgICAgICAgICAgY29uc3Qgc29ydGluZ1FQcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWVyeVBhcmFtcy5zb3J0UHJvcGVydHkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocXVlcnlQYXJhbXMuc29ydEFzYyFbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc29ydGluZ1FQcy5wdXNoKGBhc2M6JHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldKX1gKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzb3J0aW5nUVBzLnB1c2goYGRlc2M6JHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUocXVlcnlQYXJhbXMuc29ydFByb3BlcnR5W2ldKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgKz0gc29ydGluZ1FQcy5qb2luKCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLmZpbHRlclBhcmFtcyAmJiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlsdGVyUVBzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1mcCBvZiBxdWVyeVBhcmFtcy5maWx0ZXJQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1mcC5maWx0ZXJNYXRjaFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRXF1YWxzfToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEVxdWFsc306JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Gcm9tVG86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5CZXR3ZWVufToke21mcC5maWx0ZXJWYWx1ZX0sJHttZnAuZmlsdGVyVmFsdWVUb31gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkNvbnRhaW5zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuQ29udGFpbnN9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU3RhcnRzV2l0aDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLlN0YXJ0c1dpdGh9OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuRW5kc1dpdGg6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5FbmRzV2l0aH06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5Jbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLklufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaXVzRmlsdGVyTWF0Y2hUeXBlLk5vdEluOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRUHMucHVzaChgJHt0aGlzLmV4dHJhY3RQcm9wZXJ0eU5hbWUobWZwLnByb3BlcnR5KX09JHtOZXdNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuTm90SW59OiR7bWZwLmZpbHRlclZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpdXNGaWx0ZXJNYXRjaFR5cGUuU21hbGxlclRoYW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlclFQcy5wdXNoKGAke3RoaXMuZXh0cmFjdFByb3BlcnR5TmFtZShtZnAucHJvcGVydHkpfT0ke05ld01lZGl1c0ZpbHRlck1hdGNoVHlwZS5MZXNzVGhhbn06JHttZnAuZmlsdGVyVmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGl1c0ZpbHRlck1hdGNoVHlwZS5HcmVhdGVyVGhhbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUVBzLnB1c2goYCR7dGhpcy5leHRyYWN0UHJvcGVydHlOYW1lKG1mcC5wcm9wZXJ0eSl9PSR7TmV3TWVkaXVzRmlsdGVyTWF0Y2hUeXBlLkdyZWF0ZXJUaGFufToke21mcC5maWx0ZXJWYWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXJsICs9ICcmJztcbiAgICAgICAgICAgIHVybCArPSBmaWx0ZXJRUHMuam9pbignJicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxufVxuIl19