@arsedizioni/ars-utils 18.2.365 → 18.2.371

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 (118) hide show
  1. package/clipper.common/common/services/clipper.service.d.ts +1 -1
  2. package/clipper.ui/ui/document-menu/document-menu.component.d.ts +1 -1
  3. package/esm2022/clipper.common/common/common.module.mjs +4 -4
  4. package/esm2022/clipper.common/common/definitions.mjs +11 -11
  5. package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +3 -3
  6. package/esm2022/clipper.common/common/services/clipper.service.mjs +24 -18
  7. package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +5 -5
  8. package/esm2022/clipper.ui/ui/document/document.component.mjs +3 -3
  9. package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +3 -3
  10. package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +3 -3
  11. package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +3 -3
  12. package/esm2022/clipper.ui/ui/references/references.component.mjs +5 -5
  13. package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +3 -3
  14. package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +5 -5
  15. package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +3 -3
  16. package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +3 -3
  17. package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +3 -3
  18. package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +4 -4
  19. package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +3 -3
  20. package/esm2022/core/core.module.mjs +8 -8
  21. package/esm2022/core/dateFnsAdapter.mjs +3 -3
  22. package/esm2022/core/directives/autoFocusDirective.mjs +3 -3
  23. package/esm2022/core/directives/changeDateIntervalDirective.mjs +3 -3
  24. package/esm2022/core/directives/copyClipboardDirective.mjs +4 -4
  25. package/esm2022/core/directives/validators.mjs +33 -33
  26. package/esm2022/core/pipes/format.pipe.mjs +4 -4
  27. package/esm2022/core/pipes/replace.pipe.mjs +4 -4
  28. package/esm2022/core/pipes/safe-html.pipe.mjs +4 -4
  29. package/esm2022/core/pipes/safe-url.pipe.mjs +4 -4
  30. package/esm2022/core/pipes/search-callback.pipe.mjs +3 -3
  31. package/esm2022/core/pipes/search-filter.pipe.mjs +4 -4
  32. package/esm2022/core/services/broadcast.service.mjs +3 -3
  33. package/esm2022/core/services/environment.service.mjs +3 -3
  34. package/esm2022/core/services/screen.service.mjs +3 -3
  35. package/esm2022/core/services/theme.service.mjs +3 -3
  36. package/esm2022/evolution.common/arsedizioni-ars-utils-evolution.common.mjs +5 -0
  37. package/esm2022/evolution.common/common/common.module.mjs +16 -0
  38. package/esm2022/evolution.common/common/definitions.mjs +358 -0
  39. package/esm2022/evolution.common/common/interceptors/auth.interceptor.mjs +83 -0
  40. package/esm2022/evolution.common/common/messages.mjs +8 -0
  41. package/esm2022/evolution.common/common/services/evolution.service.mjs +357 -0
  42. package/esm2022/evolution.common/public_api.mjs +5 -0
  43. package/esm2022/help/components/help-viewer/help-viewer.component.mjs +7 -7
  44. package/esm2022/help/help.module.mjs +4 -4
  45. package/esm2022/help/services/help.service.mjs +3 -3
  46. package/esm2022/public_api.mjs +2 -1
  47. package/esm2022/support.common/common/common.module.mjs +4 -4
  48. package/esm2022/support.common/common/interceptors/auth.interceptor.mjs +41 -35
  49. package/esm2022/support.common/common/messages.mjs +2 -1
  50. package/esm2022/support.common/common/services/support.service.mjs +37 -70
  51. package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +3 -3
  52. package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +4 -4
  53. package/esm2022/tinymce/full-screen-editor/full-screen-editor.component.mjs +3 -3
  54. package/esm2022/tinymce/tinymce.module.mjs +4 -4
  55. package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +3 -3
  56. package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +4 -4
  57. package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +4 -4
  58. package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +3 -3
  59. package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +3 -3
  60. package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +3 -3
  61. package/esm2022/ui/ui/dialogs/toast/toast.component.mjs +3 -3
  62. package/esm2022/ui/ui/paginatorIntl.mjs +3 -3
  63. package/esm2022/ui/ui/services/dialog.service.mjs +3 -3
  64. package/esm2022/ui/ui/services/ui.service.mjs +3 -3
  65. package/esm2022/ui/ui/ui.module.mjs +4 -4
  66. package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +3 -3
  67. package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +3 -3
  68. package/esm2022/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +3 -3
  69. package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +3 -3
  70. package/esm2022/ui.application/ui/components/file-input/file-input.component.mjs +3 -3
  71. package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +3 -3
  72. package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +3 -3
  73. package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +4 -4
  74. package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +4 -4
  75. package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +3 -3
  76. package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +4 -4
  77. package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +4 -4
  78. package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +4 -4
  79. package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +7 -7
  80. package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +4 -4
  81. package/esm2022/ui.application/ui/directives/resize-table-column.directive.mjs +3 -3
  82. package/esm2022/ui.application/ui/services/applicationDialog.service.mjs +3 -3
  83. package/esm2022/ui.application/ui/ui.module.mjs +4 -4
  84. package/esm2022/ui.oauth/ui/components/login/login-oauth.component.mjs +3 -3
  85. package/esm2022/ui.oauth/ui/ui.module.mjs +4 -4
  86. package/evolution.common/common/common.module.d.ts +10 -0
  87. package/evolution.common/common/definitions.d.ts +166 -0
  88. package/evolution.common/common/interceptors/auth.interceptor.d.ts +24 -0
  89. package/evolution.common/common/messages.d.ts +6 -0
  90. package/evolution.common/common/services/evolution.service.d.ts +123 -0
  91. package/evolution.common/index.d.ts +5 -0
  92. package/evolution.common/public_api.d.ts +1 -0
  93. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +40 -34
  94. package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
  95. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +42 -42
  96. package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
  97. package/fesm2022/arsedizioni-ars-utils-core.mjs +89 -89
  98. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +817 -0
  99. package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -0
  100. package/fesm2022/arsedizioni-ars-utils-help.mjs +13 -13
  101. package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
  102. package/fesm2022/arsedizioni-ars-utils-support.common.mjs +78 -107
  103. package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
  104. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +6 -6
  105. package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
  106. package/fesm2022/arsedizioni-ars-utils-tinymce.mjs +7 -7
  107. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +58 -58
  108. package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
  109. package/fesm2022/arsedizioni-ars-utils-ui.mjs +34 -34
  110. package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
  111. package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +7 -7
  112. package/fesm2022/arsedizioni-ars-utils.mjs +1 -0
  113. package/fesm2022/arsedizioni-ars-utils.mjs.map +1 -1
  114. package/package.json +18 -12
  115. package/public_api.d.ts +1 -0
  116. package/support.common/common/interceptors/auth.interceptor.d.ts +8 -0
  117. package/support.common/common/messages.d.ts +1 -0
  118. package/support.common/common/services/support.service.d.ts +15 -26
@@ -0,0 +1,357 @@
1
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
2
+ import { inject, Injectable, signal } from '@angular/core';
3
+ import { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';
4
+ import { DialogService } from '@arsedizioni/ars-utils/ui';
5
+ import { of, throwError } from 'rxjs';
6
+ import { catchError, map } from 'rxjs/operators';
7
+ import { EvolutionMessages } from '../messages';
8
+ import * as i0 from "@angular/core";
9
+ export class EvolutionService {
10
+ constructor() {
11
+ this.httpClient = inject(HttpClient);
12
+ this.broadcastService = inject(BroadcastService);
13
+ this.broadcastServiceSubscription = null;
14
+ this.dialogService = inject(DialogService);
15
+ this._serviceUri = null;
16
+ this._loginInfo = null;
17
+ this.loggedIn = signal(false);
18
+ this.loggingIn = signal(false);
19
+ }
20
+ get serviceUri() {
21
+ return this._serviceUri;
22
+ }
23
+ get loginInfo() {
24
+ if (!this._loginInfo) {
25
+ const loginInfo = localStorage.getItem('clipper_login_evolution');
26
+ if (loginInfo) {
27
+ try {
28
+ this._loginInfo = JSON.parse(loginInfo);
29
+ }
30
+ catch { }
31
+ }
32
+ }
33
+ return this._loginInfo;
34
+ }
35
+ ngOnDestroy() {
36
+ if (this.broadcastServiceSubscription) {
37
+ this.broadcastServiceSubscription.unsubscribe();
38
+ }
39
+ }
40
+ /**
41
+ * Initialize service
42
+ * @param serviceUri : the service uri
43
+ */
44
+ initialize(serviceUri) {
45
+ // Create unique client id
46
+ if (!localStorage.getItem('evolution_client_id')) {
47
+ localStorage.setItem('evolution_client_id', SystemUtils.generateUUID());
48
+ }
49
+ // Initialize
50
+ this._serviceUri = serviceUri;
51
+ // React to message broadcasting
52
+ if (!this.broadcastServiceSubscription) {
53
+ this.broadcastServiceSubscription = this.broadcastService.getMessage().subscribe((message) => {
54
+ if (message.id === EvolutionMessages.LOGIN_CHANGED) {
55
+ setTimeout(() => {
56
+ this.login(message.data.email, message.data.password, true, message.data.oauth, message.data.oauthAccessToken).subscribe((r) => {
57
+ if (!r.success)
58
+ this.dialogService.error(r.message, null, "Errore di Evolution");
59
+ else {
60
+ this.dialogService.toast('Connesso a Evolution', 1500, 'power');
61
+ }
62
+ });
63
+ }, 500);
64
+ }
65
+ else if (message.id === EvolutionMessages.LOGOUT_COMPLETED) {
66
+ if (this.loggedIn()) {
67
+ this.logout().subscribe((r) => {
68
+ if (!r.success) {
69
+ this.dialogService.error("<p>" + r.message + "</p><br><br><hr><p class='small'><i>Per eliminare la configurazione di Evolution accedere a:<br><b>menu > personalizza > collegamenti</b></i></p>", null, "Errore di Evolution");
70
+ }
71
+ else {
72
+ this.dialogService.toast('Disconnesso da Evolution', 1500, 'power_off');
73
+ }
74
+ });
75
+ }
76
+ }
77
+ });
78
+ }
79
+ // Eveluate current session storage in case of page refresh (F5)
80
+ if (!this.loggedIn() && this.getToken()) {
81
+ // Auto login
82
+ this.loggedIn.set(true);
83
+ // Notify
84
+ this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
85
+ }
86
+ }
87
+ /**
88
+ * Set JWT token
89
+ * @param value : the login result
90
+ */
91
+ setToken(value) {
92
+ sessionStorage.setItem('evolution_jwt', value.token);
93
+ sessionStorage.setItem('evolution_jwt_refresh', value.refreshToken ?? '');
94
+ }
95
+ /**
96
+ * Return current JWT token
97
+ * @param refresh: true to get the refresh token. Default is false.
98
+ */
99
+ getToken(refresh = false) {
100
+ let token = sessionStorage.getItem(refresh ? 'evolution_jwt_refresh' : 'evolution_jwt');
101
+ if (token && token[0] === '"') {
102
+ return token.substring(1, token.length - 1);
103
+ }
104
+ return token ?? '';
105
+ }
106
+ /**
107
+ * Perform login
108
+ * @param email: the optioanl email if using OAuth2
109
+ * @parma password: the optional password if using OAuth2
110
+ * @param remember: remember credentials
111
+ * @param oauth: the optional open authentication supported
112
+ * @param oauthAccessToken: the optional OAuth2 access token
113
+ * @returns: the login result
114
+ */
115
+ login(email = null, password = null, remember = false, oauth = null, oauthAccessToken = null) {
116
+ this.clear();
117
+ this.loggingIn.set(true);
118
+ return this.httpClient
119
+ .post(this._serviceUri + '/login2', {
120
+ user: oauth ? null : email,
121
+ password: oauth ? null : password,
122
+ clientId: localStorage.getItem("evolution_client_id"),
123
+ OAUTH: oauth
124
+ }, {
125
+ headers: !oauth
126
+ ? new HttpHeaders()
127
+ : new HttpHeaders()
128
+ .set("Authorization", oauthAccessToken ?? '')
129
+ })
130
+ .pipe(catchError(err => {
131
+ this.handleLoginError();
132
+ return throwError(() => err);
133
+ }), map((r) => {
134
+ this.loggingIn.set(false);
135
+ if (r.success) {
136
+ // Store access token
137
+ this.setToken(r.value);
138
+ const loginInfo = {
139
+ context: r.value.context,
140
+ OAUTH: oauth
141
+ };
142
+ if (!oauth) {
143
+ loginInfo.userCredentials =
144
+ SystemUtils.cipher(JSON.stringify({
145
+ email: email,
146
+ password: password,
147
+ remember: remember,
148
+ }), loginInfo.context.userId.toString());
149
+ }
150
+ // Update info
151
+ localStorage.setItem('evolution_login', JSON.stringify(loginInfo));
152
+ this._loginInfo = loginInfo;
153
+ this.loggedIn.set(true);
154
+ // Notify
155
+ this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
156
+ }
157
+ return r;
158
+ }));
159
+ }
160
+ /**
161
+ * Perform logout
162
+ */
163
+ logout() {
164
+ return this.httpClient.post(this._serviceUri + '/logout', {}).pipe(map(r => {
165
+ this.clear();
166
+ return r;
167
+ }), catchError((_e) => {
168
+ this.clear();
169
+ return of([]);
170
+ }));
171
+ }
172
+ /**
173
+ * Switch the current login to a new one with the same credentials except role possibly (context change)
174
+ * @param id : new user id
175
+ */
176
+ loginSwitch(id) {
177
+ return this.httpClient
178
+ .post(this._serviceUri + '/login-switch/', {
179
+ userId: id,
180
+ clientId: localStorage.getItem("evolution_client_id")
181
+ })
182
+ .pipe(catchError((err) => {
183
+ this.handleLoginError();
184
+ return throwError(() => err);
185
+ }), map((r) => {
186
+ this.loggingIn.set(false);
187
+ if (r.success) {
188
+ // Store access token
189
+ this.setToken(r.value);
190
+ this._loginInfo = r.value.context;
191
+ this.loggedIn.set(true);
192
+ // Notify
193
+ this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
194
+ }
195
+ return r;
196
+ }));
197
+ }
198
+ /**
199
+ * Handle login error
200
+ */
201
+ handleLoginError() {
202
+ this.loggingIn.set(false);
203
+ localStorage.removeItem('evolution_login');
204
+ }
205
+ /**
206
+ * Reset login refresh timer and login state
207
+ */
208
+ reset() {
209
+ // Clear login info
210
+ this._loginInfo = null;
211
+ // Logged out
212
+ this.loggedIn.set(false);
213
+ // Notify
214
+ this.broadcastService.sendMessage(EvolutionMessages.LOGOUT_COMPLETED);
215
+ }
216
+ /**
217
+ * Clear login data
218
+ */
219
+ clear() {
220
+ // Clear local storage
221
+ sessionStorage.removeItem('evolution_jwt');
222
+ sessionStorage.removeItem('evolution_jwt_refresh');
223
+ sessionStorage.removeItem('evolution_oauth');
224
+ localStorage.removeItem('evolution_login');
225
+ // Reset login
226
+ this.reset();
227
+ }
228
+ /**
229
+ * Perform token refresh
230
+ */
231
+ refresh() {
232
+ return this.httpClient.get(this._serviceUri + '/refresh2/?token=' + this.getToken(true)).pipe(map((r) => {
233
+ // Update token
234
+ this.setToken(r.value);
235
+ }));
236
+ }
237
+ /**
238
+ * Convert folders in a tree of Node object.
239
+ * @param folders : the subfolders group or null to root
240
+ */
241
+ toNodes(folders) {
242
+ return this._toNodes(folders, null);
243
+ }
244
+ /**
245
+ * Convert folders in a tree of Node object.
246
+ * @param folders : the children group or null to root
247
+ */
248
+ _toNodes(folders, parent) {
249
+ let nodes = [];
250
+ folders.forEach((n) => {
251
+ let node = {
252
+ id: n.id,
253
+ name: n.name,
254
+ count: n.count,
255
+ parent: parent,
256
+ children: null,
257
+ bag: n,
258
+ };
259
+ node.children =
260
+ n.children && n.children.length > 0
261
+ ? this._toNodes(n.children, node)
262
+ : [];
263
+ nodes.push(node);
264
+ });
265
+ return nodes;
266
+ }
267
+ /**
268
+ * Retrieve the taxonomy
269
+ */
270
+ getTaxonomy() {
271
+ return this.httpClient.get(this._serviceUri + '/taxonomy');
272
+ }
273
+ /**
274
+ * Retrieve authorities
275
+ */
276
+ getAuthorities() {
277
+ return this.httpClient.get(this._serviceUri + '/compliance/authorities');
278
+ }
279
+ ////
280
+ // CONTEXT
281
+ ////
282
+ /**
283
+ * Change context
284
+ */
285
+ changeContext(params) {
286
+ return this.httpClient.post(this._serviceUri + '/compliance/context', params);
287
+ }
288
+ ////
289
+ // REGISTERS
290
+ ////
291
+ /**
292
+ * Retrieve a register
293
+ * @param id the register id
294
+ */
295
+ getRegister(id) {
296
+ return this.httpClient.get(this._serviceUri +
297
+ '/compliance/registers/' + id);
298
+ }
299
+ /**
300
+ * Collect register profiles
301
+ * @param params parameters
302
+ */
303
+ collectRegisterProfiles(params) {
304
+ return this.httpClient.post(this._serviceUri +
305
+ '/compliance/registers/profiles/collect', params);
306
+ }
307
+ ////
308
+ // LAWS
309
+ ////
310
+ /**
311
+ * Add one or more laws
312
+ * @param params parameters
313
+ */
314
+ addLaws(params) {
315
+ return this.httpClient.post(this._serviceUri + '/compliance/laws/add', params);
316
+ }
317
+ ////
318
+ // ACTIVITIES
319
+ ////
320
+ /**
321
+ * Retrieve activity groups
322
+ * @param group the group number
323
+ * @param site the site id
324
+ */
325
+ getGroups(group = 1, site = null) {
326
+ return this.httpClient.get(this._serviceUri +
327
+ (site
328
+ ? '/compliance/groups/?group=' +
329
+ group +
330
+ '&site=' +
331
+ site
332
+ : '/compliance/groups/?group=' + group));
333
+ }
334
+ /**
335
+ * Add one or more activities
336
+ * @param params parameters
337
+ */
338
+ addActivities(params) {
339
+ return this.httpClient.post(this._serviceUri + '/compliance/activities/add', params);
340
+ }
341
+ /**
342
+ * Export laws
343
+ * @param params parameters
344
+ */
345
+ exportLaws(params) {
346
+ return this.httpClient.post(this._serviceUri + '/compliance/laws/export', params, { responseType: 'blob' });
347
+ }
348
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: EvolutionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
349
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: EvolutionService, providedIn: 'root' }); }
350
+ }
351
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: EvolutionService, decorators: [{
352
+ type: Injectable,
353
+ args: [{
354
+ providedIn: 'root',
355
+ }]
356
+ }] });
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvbHV0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvZXZvbHV0aW9uLmNvbW1vbi9jb21tb24vc2VydmljZXMvZXZvbHV0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFtQyxnQkFBZ0IsRUFBUyxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEVBQUUsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQVVoRCxNQUFNLE9BQU8sZ0JBQWdCO0lBSDdCO1FBTVUsZUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxpQ0FBNEIsR0FBeUIsSUFBSSxDQUFDO1FBQzFELGtCQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRDLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUlsQyxlQUFVLEdBQThCLElBQUksQ0FBQztRQVlyQyxhQUFRLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLGNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7S0EyWnBEO0lBM2FDLElBQUksVUFBVTtRQUNaLE9B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LEdBQUcsNEJBQTRCLEVBQy9DLE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7S0FHQztJQUNELFVBQVUsQ0FBQyxNQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcseUJBQXlCLEVBQzVDLE1BQU0sRUFDTixFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FDekIsQ0FBQztJQUNKLENBQUM7OEdBbGJVLGdCQUFnQjtrSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTs7MkZBRVAsZ0JBQWdCO2tCQUg1QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFwaVJlc3VsdCwgQnJvYWRjYXN0TWVzc2FnZUluZm8sIEJyb2FkY2FzdFNlcnZpY2UsIElOb2RlLCBTeXN0ZW1VdGlscyB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvY29yZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL3VpJztcclxuaW1wb3J0IHsgb2YsIFN1YnNjcmlwdGlvbiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEV2b2x1dGlvbkxvZ2luSW5mbywgRXZvbHV0aW9uTG9naW5SZXN1bHQgfSBmcm9tICcuLi9kZWZpbml0aW9ucyc7XHJcbmltcG9ydCB7IEV2b2x1dGlvbk1lc3NhZ2VzIH0gZnJvbSAnLi4vbWVzc2FnZXMnO1xyXG5pbXBvcnQgeyBMb2dpbk9BdXRoVHlwZSB9IGZyb20gJ0BhcnNlZGl6aW9uaS9hcnMtdXRpbHMvdWkub2F1dGgnO1xyXG5cclxuXHJcblxyXG5cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFdm9sdXRpb25TZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuXHJcblxyXG4gIHByaXZhdGUgaHR0cENsaWVudCA9IGluamVjdChIdHRwQ2xpZW50KTtcclxuICBwcml2YXRlIGJyb2FkY2FzdFNlcnZpY2UgPSBpbmplY3QoQnJvYWRjYXN0U2VydmljZSk7XHJcbiAgcHJpdmF0ZSBicm9hZGNhc3RTZXJ2aWNlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlID0gaW5qZWN0KERpYWxvZ1NlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9zZXJ2aWNlVXJpOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBnZXQgc2VydmljZVVyaSgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlVXJpO1xyXG4gIH1cclxuICBwcml2YXRlIF9sb2dpbkluZm86IEV2b2x1dGlvbkxvZ2luSW5mbyB8IG51bGwgPSBudWxsO1xyXG4gIGdldCBsb2dpbkluZm8oKTogRXZvbHV0aW9uTG9naW5JbmZvIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMuX2xvZ2luSW5mbykge1xyXG4gICAgICBjb25zdCBsb2dpbkluZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2xpcHBlcl9sb2dpbl9ldm9sdXRpb24nKTtcclxuICAgICAgaWYgKGxvZ2luSW5mbykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLl9sb2dpbkluZm8gPSBKU09OLnBhcnNlKGxvZ2luSW5mbykgYXMgRXZvbHV0aW9uTG9naW5JbmZvO1xyXG4gICAgICAgIH0gY2F0Y2ggeyB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9sb2dpbkluZm87XHJcbiAgfVxyXG4gIHB1YmxpYyByZWFkb25seSBsb2dnZWRJbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHVibGljIHJlYWRvbmx5IGxvZ2dpbmdJbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcblxyXG5cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5icm9hZGNhc3RTZXJ2aWNlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlcnZpY2VVcmkgOiB0aGUgc2VydmljZSB1cmlcclxuICAgKi9cclxuICBpbml0aWFsaXplKFxyXG4gICAgc2VydmljZVVyaTogc3RyaW5nKSB7XHJcbiAgICAvLyBDcmVhdGUgdW5pcXVlIGNsaWVudCBpZFxyXG4gICAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXZvbHV0aW9uX2NsaWVudF9pZCcpKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdldm9sdXRpb25fY2xpZW50X2lkJywgU3lzdGVtVXRpbHMuZ2VuZXJhdGVVVUlEKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEluaXRpYWxpemVcclxuICAgIHRoaXMuX3NlcnZpY2VVcmkgPSBzZXJ2aWNlVXJpO1xyXG5cclxuICAgIC8vIFJlYWN0IHRvIG1lc3NhZ2UgYnJvYWRjYXN0aW5nXHJcbiAgICBpZiAoIXRoaXMuYnJvYWRjYXN0U2VydmljZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2VTdWJzY3JpcHRpb24gPSB0aGlzLmJyb2FkY2FzdFNlcnZpY2UuZ2V0TWVzc2FnZSgpLnN1YnNjcmliZSgobWVzc2FnZTogQnJvYWRjYXN0TWVzc2FnZUluZm8pID0+IHtcclxuICAgICAgICBpZiAobWVzc2FnZS5pZCA9PT0gRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ0hBTkdFRCkge1xyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9naW4oXHJcbiAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLmVtYWlsLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5wYXNzd29yZCxcclxuICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5vYXV0aCxcclxuICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEub2F1dGhBY2Nlc3NUb2tlbikuc3Vic2NyaWJlKChyOiBBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXIuc3VjY2VzcylcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKHIubWVzc2FnZSwgbnVsbCwgXCJFcnJvcmUgZGkgRXZvbHV0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS50b2FzdCgnQ29ubmVzc28gYSBFdm9sdXRpb24nLCAxNTAwLCAncG93ZXInKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLmlkID09PSBFdm9sdXRpb25NZXNzYWdlcy5MT0dPVVRfQ09NUExFVEVEKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZWRJbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KCkuc3Vic2NyaWJlKChyOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIXIuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKFwiPHA+XCIgKyByLm1lc3NhZ2UgKyBcIjwvcD48YnI+PGJyPjxocj48cCBjbGFzcz0nc21hbGwnPjxpPlBlciBlbGltaW5hcmUgbGEgY29uZmlndXJhemlvbmUgZGkgRXZvbHV0aW9uIGFjY2VkZXJlIGE6PGJyPjxiPm1lbnUgPiBwZXJzb25hbGl6emEgPiBjb2xsZWdhbWVudGk8L2I+PC9pPjwvcD5cIiwgbnVsbCwgXCJFcnJvcmUgZGkgRXZvbHV0aW9uXCIpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2UudG9hc3QoJ0Rpc2Nvbm5lc3NvIGRhIEV2b2x1dGlvbicsIDE1MDAsICdwb3dlcl9vZmYnKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXZlbHVhdGUgY3VycmVudCBzZXNzaW9uIHN0b3JhZ2UgaW4gY2FzZSBvZiBwYWdlIHJlZnJlc2ggKEY1KVxyXG4gICAgaWYgKCF0aGlzLmxvZ2dlZEluKCkgJiYgdGhpcy5nZXRUb2tlbigpKSB7XHJcbiAgICAgIC8vIEF1dG8gbG9naW5cclxuICAgICAgdGhpcy5sb2dnZWRJbi5zZXQodHJ1ZSk7XHJcbiAgICAgIC8vIE5vdGlmeVxyXG4gICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ09NUExFVEVEKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIC8qKlxyXG4qIFNldCBKV1QgdG9rZW5cclxuKiBAcGFyYW0gdmFsdWUgOiB0aGUgbG9naW4gcmVzdWx0XHJcbiovXHJcbiAgcHJpdmF0ZSBzZXRUb2tlbih2YWx1ZTogRXZvbHV0aW9uTG9naW5SZXN1bHQpIHtcclxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V2b2x1dGlvbl9qd3QnLCB2YWx1ZS50b2tlbik7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdldm9sdXRpb25fand0X3JlZnJlc2gnLCB2YWx1ZS5yZWZyZXNoVG9rZW4gPz8gJycpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBjdXJyZW50IEpXVCB0b2tlblxyXG4gICAqIEBwYXJhbSByZWZyZXNoOiB0cnVlIHRvIGdldCB0aGUgcmVmcmVzaCB0b2tlbi4gRGVmYXVsdCBpcyBmYWxzZS5cclxuICAgKi9cclxuICBnZXRUb2tlbihyZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShyZWZyZXNoID8gJ2V2b2x1dGlvbl9qd3RfcmVmcmVzaCcgOiAnZXZvbHV0aW9uX2p3dCcpO1xyXG4gICAgaWYgKHRva2VuICYmIHRva2VuWzBdID09PSAnXCInKSB7XHJcbiAgICAgIHJldHVybiB0b2tlbi5zdWJzdHJpbmcoMSwgdG9rZW4ubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9rZW4gPz8gJyc7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBsb2dpbiAgIFxyXG4gICAqIEBwYXJhbSBlbWFpbDogdGhlIG9wdGlvYW5sIGVtYWlsIGlmIHVzaW5nIE9BdXRoMlxyXG4gICAqIEBwYXJtYSBwYXNzd29yZDogdGhlIG9wdGlvbmFsIHBhc3N3b3JkIGlmIHVzaW5nIE9BdXRoMlxyXG4gICAqIEBwYXJhbSByZW1lbWJlcjogcmVtZW1iZXIgY3JlZGVudGlhbHMgXHJcbiAgICogQHBhcmFtIG9hdXRoOiB0aGUgb3B0aW9uYWwgb3BlbiBhdXRoZW50aWNhdGlvbiBzdXBwb3J0ZWRcclxuICAgKiBAcGFyYW0gb2F1dGhBY2Nlc3NUb2tlbjogdGhlIG9wdGlvbmFsIE9BdXRoMiBhY2Nlc3MgdG9rZW5cclxuICAgKiBAcmV0dXJuczogdGhlIGxvZ2luIHJlc3VsdFxyXG4gICAqL1xyXG4gIGxvZ2luKGVtYWlsOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcclxuICAgIHBhc3N3b3JkOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcclxuICAgIHJlbWVtYmVyOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCA9IGZhbHNlLFxyXG4gICAgb2F1dGg6IExvZ2luT0F1dGhUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICBvYXV0aEFjY2Vzc1Rva2VuOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCkge1xyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gICAgdGhpcy5sb2dnaW5nSW4uc2V0KHRydWUpO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudFxyXG4gICAgICAucG9zdDxBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+PihcclxuICAgICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9sb2dpbjInLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHVzZXI6IG9hdXRoID8gbnVsbCA6IGVtYWlsLFxyXG4gICAgICAgICAgcGFzc3dvcmQ6IG9hdXRoID8gbnVsbCA6IHBhc3N3b3JkLFxyXG4gICAgICAgICAgY2xpZW50SWQ6IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZXZvbHV0aW9uX2NsaWVudF9pZFwiKSxcclxuICAgICAgICAgIE9BVVRIOiBvYXV0aFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgaGVhZGVyczpcclxuICAgICAgICAgICAgIW9hdXRoXHJcbiAgICAgICAgICAgICAgPyBuZXcgSHR0cEhlYWRlcnMoKVxyXG4gICAgICAgICAgICAgIDogbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgICAgICAgICAgIC5zZXQoXCJBdXRob3JpemF0aW9uXCIsIG9hdXRoQWNjZXNzVG9rZW4gPz8gJycpXHJcbiAgICAgICAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2dpbkVycm9yKCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIG1hcCgocjogQXBpUmVzdWx0PEV2b2x1dGlvbkxvZ2luUmVzdWx0PikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgLy8gU3RvcmUgYWNjZXNzIHRva2VuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9rZW4oci52YWx1ZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxvZ2luSW5mbzogRXZvbHV0aW9uTG9naW5JbmZvID0ge1xyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IHIudmFsdWUuY29udGV4dCxcclxuICAgICAgICAgICAgICBPQVVUSDogb2F1dGhcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIW9hdXRoKSB7XHJcbiAgICAgICAgICAgICAgbG9naW5JbmZvLnVzZXJDcmVkZW50aWFscyA9XHJcbiAgICAgICAgICAgICAgICBTeXN0ZW1VdGlscy5jaXBoZXIoXHJcbiAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcclxuICAgICAgICAgICAgICAgICAgICBlbWFpbDogZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyOiByZW1lbWJlcixcclxuICAgICAgICAgICAgICAgICAgfSksIGxvZ2luSW5mby5jb250ZXh0LnVzZXJJZC50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBVcGRhdGUgaW5mb1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcclxuICAgICAgICAgICAgICAnZXZvbHV0aW9uX2xvZ2luJyxcclxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShsb2dpbkluZm8pXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2luSW5mbyA9IGxvZ2luSW5mbztcclxuICAgICAgICAgICAgdGhpcy5sb2dnZWRJbi5zZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIE5vdGlmeVxyXG4gICAgICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ09NUExFVEVEKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBsb2dvdXRcclxuICAgKi9cclxuICBsb2dvdXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8YW55Pih0aGlzLl9zZXJ2aWNlVXJpICsgJy9sb2dvdXQnLCB7fSkucGlwZShcclxuICAgICAgbWFwKHIgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICByZXR1cm4gclxyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoX2UpID0+IHtcclxuICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICogU3dpdGNoIHRoZSBjdXJyZW50IGxvZ2luIHRvIGEgbmV3IG9uZSB3aXRoIHRoZSBzYW1lIGNyZWRlbnRpYWxzIGV4Y2VwdCByb2xlIHBvc3NpYmx5IChjb250ZXh0IGNoYW5nZSlcclxuICAqIEBwYXJhbSBpZCA6IG5ldyB1c2VyIGlkXHJcbiAgKi9cclxuICBsb2dpblN3aXRjaChpZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50XHJcbiAgICAgIC5wb3N0PEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4+KFxyXG4gICAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL2xvZ2luLXN3aXRjaC8nLFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHVzZXJJZDogaWQsXHJcbiAgICAgICAgICBjbGllbnRJZDogbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJldm9sdXRpb25fY2xpZW50X2lkXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVMb2dpbkVycm9yKCk7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIG1hcCgocjogQXBpUmVzdWx0PEV2b2x1dGlvbkxvZ2luUmVzdWx0PikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5sb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICAgIGlmIChyLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgLy8gU3RvcmUgYWNjZXNzIHRva2VuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0VG9rZW4oci52YWx1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvZ2luSW5mbyA9IHIudmFsdWUuY29udGV4dDtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZWRJbi5zZXQodHJ1ZSk7XHJcbiAgICAgICAgICAgIC8vIE5vdGlmeVxyXG4gICAgICAgICAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoRXZvbHV0aW9uTWVzc2FnZXMuTE9HSU5fQ09NUExFVEVEKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiByO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogSGFuZGxlIGxvZ2luIGVycm9yXHJcbiAqL1xyXG4gIHByaXZhdGUgaGFuZGxlTG9naW5FcnJvcigpIHtcclxuICAgIHRoaXMubG9nZ2luZ0luLnNldChmYWxzZSk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZXZvbHV0aW9uX2xvZ2luJyk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJlc2V0IGxvZ2luIHJlZnJlc2ggdGltZXIgYW5kIGxvZ2luIHN0YXRlXHJcbiAgICovXHJcbiAgcmVzZXQoKSB7XHJcbiAgICAvLyBDbGVhciBsb2dpbiBpbmZvXHJcbiAgICB0aGlzLl9sb2dpbkluZm8gPSBudWxsO1xyXG4gICAgLy8gTG9nZ2VkIG91dFxyXG4gICAgdGhpcy5sb2dnZWRJbi5zZXQoZmFsc2UpO1xyXG4gICAgLy8gTm90aWZ5XHJcbiAgICB0aGlzLmJyb2FkY2FzdFNlcnZpY2Uuc2VuZE1lc3NhZ2UoRXZvbHV0aW9uTWVzc2FnZXMuTE9HT1VUX0NPTVBMRVRFRCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBsb2dpbiBkYXRhXHJcbiAgICovXHJcbiAgY2xlYXIoKSB7XHJcbiAgICAvLyBDbGVhciBsb2NhbCBzdG9yYWdlXHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdldm9sdXRpb25fand0Jyk7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdldm9sdXRpb25fand0X3JlZnJlc2gnKTtcclxuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2V2b2x1dGlvbl9vYXV0aCcpO1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2V2b2x1dGlvbl9sb2dpbicpO1xyXG4gICAgLy8gUmVzZXQgbG9naW5cclxuICAgIHRoaXMucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBQZXJmb3JtIHRva2VuIHJlZnJlc2hcclxuICovXHJcbiAgcmVmcmVzaCgpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9yZWZyZXNoMi8/dG9rZW49JyArIHRoaXMuZ2V0VG9rZW4odHJ1ZSlcclxuICAgICkucGlwZShtYXAoKHI6IEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4pID0+IHtcclxuICAgICAgLy8gVXBkYXRlIHRva2VuXHJcbiAgICAgIHRoaXMuc2V0VG9rZW4oci52YWx1ZSk7XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBmb2xkZXJzIGluIGEgdHJlZSBvZiBOb2RlIG9iamVjdC5cclxuICAgKiBAcGFyYW0gZm9sZGVycyA6IHRoZSBzdWJmb2xkZXJzIGdyb3VwIG9yIG51bGwgdG8gcm9vdFxyXG4gICAqL1xyXG4gIHRvTm9kZXMoZm9sZGVyczogSU5vZGVbXSk6IElOb2RlW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RvTm9kZXMoZm9sZGVycywgbnVsbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IGZvbGRlcnMgaW4gYSB0cmVlIG9mIE5vZGUgb2JqZWN0LlxyXG4gICAqIEBwYXJhbSBmb2xkZXJzIDogdGhlIGNoaWxkcmVuIGdyb3VwIG9yIG51bGwgdG8gcm9vdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3RvTm9kZXMoZm9sZGVyczogSU5vZGVbXSwgcGFyZW50OiBJTm9kZSk6IElOb2RlW10ge1xyXG4gICAgbGV0IG5vZGVzOiBJTm9kZVtdID0gW107XHJcbiAgICBmb2xkZXJzLmZvckVhY2goKG4pID0+IHtcclxuICAgICAgbGV0IG5vZGU6IElOb2RlID0ge1xyXG4gICAgICAgIGlkOiBuLmlkLFxyXG4gICAgICAgIG5hbWU6IG4ubmFtZSxcclxuICAgICAgICBjb3VudDogbi5jb3VudCxcclxuICAgICAgICBwYXJlbnQ6IHBhcmVudCxcclxuICAgICAgICBjaGlsZHJlbjogbnVsbCxcclxuICAgICAgICBiYWc6IG4sXHJcbiAgICAgIH07XHJcbiAgICAgIG5vZGUuY2hpbGRyZW4gPVxyXG4gICAgICAgIG4uY2hpbGRyZW4gJiYgbi5jaGlsZHJlbi5sZW5ndGggPiAwXHJcbiAgICAgICAgICA/IHRoaXMuX3RvTm9kZXMobi5jaGlsZHJlbiwgbm9kZSlcclxuICAgICAgICAgIDogW107XHJcbiAgICAgIG5vZGVzLnB1c2gobm9kZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBub2RlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIHRoZSB0YXhvbm9teVxyXG4gICAqL1xyXG4gIGdldFRheG9ub215KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzdWx0PGFueT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy90YXhvbm9teSdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBhdXRob3JpdGllc1xyXG4gICAqL1xyXG4gIGdldEF1dGhvcml0aWVzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzdWx0PGFueT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9jb21wbGlhbmNlL2F1dGhvcml0aWVzJ1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vLy9cclxuICAvLyBDT05URVhUXHJcbiAgLy8vL1xyXG4gIC8qKlxyXG4gICAqIENoYW5nZSBjb250ZXh0XHJcbiAgICovXHJcbiAgY2hhbmdlQ29udGV4dChwYXJhbXM6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3VsdDxhbnk+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvY29tcGxpYW5jZS9jb250ZXh0JyxcclxuICAgICAgcGFyYW1zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8vL1xyXG4gIC8vIFJFR0lTVEVSU1xyXG4gIC8vLy9cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHJpZXZlIGEgcmVnaXN0ZXJcclxuICAgKiBAcGFyYW0gaWQgdGhlIHJlZ2lzdGVyIGlkXHJcbiAgICovXHJcbiAgZ2V0UmVnaXN0ZXIoaWQ6IG51bWJlcikge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzdWx0PGFueT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICtcclxuICAgICAgJy9jb21wbGlhbmNlL3JlZ2lzdGVycy8nICsgaWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdCByZWdpc3RlciBwcm9maWxlc1xyXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIGNvbGxlY3RSZWdpc3RlclByb2ZpbGVzKHBhcmFtczogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzdWx0PGFueT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICtcclxuICAgICAgJy9jb21wbGlhbmNlL3JlZ2lzdGVycy9wcm9maWxlcy9jb2xsZWN0JyxcclxuICAgICAgcGFyYW1zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLy9cclxuICAvLyBMQVdTXHJcbiAgLy8vL1xyXG5cclxuICAvKipcclxuICAgKiBBZGQgb25lIG9yIG1vcmUgbGF3c1xyXG4gICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVyc1xyXG4gICAqL1xyXG4gIGFkZExhd3MocGFyYW1zOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8YW55Pj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL2NvbXBsaWFuY2UvbGF3cy9hZGQnLFxyXG4gICAgICBwYXJhbXNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLy8vXHJcbiAgLy8gQUNUSVZJVElFU1xyXG4gIC8vLy9cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgYWN0aXZpdHkgZ3JvdXBzXHJcbiAgICogQHBhcmFtIGdyb3VwIHRoZSBncm91cCBudW1iZXJcclxuICAgKiBAcGFyYW0gc2l0ZSB0aGUgc2l0ZSBpZFxyXG4gICAqL1xyXG4gIGdldEdyb3Vwcyhncm91cDogbnVtYmVyID0gMSwgc2l0ZTogbnVtYmVyID0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzdWx0PGFueT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICtcclxuICAgICAgKHNpdGVcclxuICAgICAgICA/ICcvY29tcGxpYW5jZS9ncm91cHMvP2dyb3VwPScgK1xyXG4gICAgICAgIGdyb3VwICtcclxuICAgICAgICAnJnNpdGU9JyArXHJcbiAgICAgICAgc2l0ZVxyXG4gICAgICAgIDogJy9jb21wbGlhbmNlL2dyb3Vwcy8/Z3JvdXA9JyArIGdyb3VwKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBvbmUgb3IgbW9yZSBhY3Rpdml0aWVzXHJcbiAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgYWRkQWN0aXZpdGllcyhwYXJhbXM6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3VsdDxhbnk+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvY29tcGxpYW5jZS9hY3Rpdml0aWVzL2FkZCcsXHJcbiAgICAgIHBhcmFtc1xyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBFeHBvcnQgbGF3c1xyXG4gKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnNcclxuICovXHJcbiAgZXhwb3J0TGF3cyhwYXJhbXM6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9jb21wbGlhbmNlL2xhd3MvZXhwb3J0JyxcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICB7IHJlc3BvbnNlVHlwZTogJ2Jsb2InIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
@@ -0,0 +1,5 @@
1
+ /*
2
+ * Public API Surface of ars-utils
3
+ */
4
+ export * from './common/common.module';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fycy11dGlscy9ldm9sdXRpb24uY29tbW9uL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFycy11dGlsc1xyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5cclxuIl19