@aakash58/chatbot 1.1.22 → 1.1.25

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 (168) hide show
  1. package/fesm2022/aakash58-chatbot.mjs +684 -654
  2. package/fesm2022/aakash58-chatbot.mjs.map +1 -1
  3. package/index.d.ts +374 -3
  4. package/package.json +2 -4
  5. package/esm2022/aakash58-chatbot.mjs +0 -5
  6. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +0 -170
  7. package/esm2022/lib/app/chat/chat.service.mjs +0 -445
  8. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +0 -50
  9. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +0 -12
  10. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +0 -66
  11. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +0 -186
  12. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +0 -312
  13. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +0 -36
  14. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +0 -115
  15. package/esm2022/lib/app/chat/model/chat-history.model.mjs +0 -2
  16. package/esm2022/lib/app/chat/model/chat-request.model.mjs +0 -2
  17. package/esm2022/lib/app/chat/model/chat-response.model.mjs +0 -2
  18. package/esm2022/lib/app/chat/model/chat-session.model.mjs +0 -2
  19. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +0 -2
  20. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +0 -2
  21. package/esm2022/lib/app/chat/services/chat-api.service.mjs +0 -61
  22. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +0 -50
  23. package/esm2022/lib/app/chat/services/chat-history.service.mjs +0 -252
  24. package/esm2022/lib/app/login/login-form.component.mjs +0 -46
  25. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +0 -194
  26. package/esm2022/lib/app/personalization/personalization.service.mjs +0 -149
  27. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +0 -122
  28. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +0 -86
  29. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +0 -115
  30. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +0 -29
  31. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +0 -30
  32. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +0 -12
  33. package/esm2022/lib/constant/doohbot-constant.mjs +0 -28
  34. package/esm2022/lib/constant/html-entities.mjs +0 -9
  35. package/esm2022/lib/constant/utf8.mjs +0 -10
  36. package/esm2022/lib/core/app-const.mjs +0 -61
  37. package/esm2022/lib/core/auth/account-api.service.mjs +0 -40
  38. package/esm2022/lib/core/auth/auth.service.mjs +0 -391
  39. package/esm2022/lib/core/auth/models/auth-result.model.mjs +0 -3
  40. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +0 -6
  41. package/esm2022/lib/core/auth/models/login-request.model.mjs +0 -6
  42. package/esm2022/lib/core/auth/storage.service.mjs +0 -110
  43. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +0 -112
  44. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +0 -55
  45. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +0 -179
  46. package/esm2022/lib/core/environments/environment.mjs +0 -15
  47. package/esm2022/lib/core/environments/environment.prod.mjs +0 -15
  48. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +0 -52
  49. package/esm2022/lib/core/http/http-stream.service.mjs +0 -97
  50. package/esm2022/lib/core/http/http.service.mjs +0 -103
  51. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +0 -96
  52. package/esm2022/lib/core/interceptors/license.interceptor.mjs +0 -44
  53. package/esm2022/lib/core/models/api-config.model.mjs +0 -18
  54. package/esm2022/lib/core/models/api-request.model.mjs +0 -2
  55. package/esm2022/lib/core/models/api-response.model.mjs +0 -8
  56. package/esm2022/lib/core/models/doohbot-config.model.mjs +0 -18
  57. package/esm2022/lib/core/models/license.model.mjs +0 -2
  58. package/esm2022/lib/core/models/message.mjs +0 -2
  59. package/esm2022/lib/core/models/theme-config.model.mjs +0 -2
  60. package/esm2022/lib/core/services/core-config.service.mjs +0 -52
  61. package/esm2022/lib/core/services/license.service.mjs +0 -145
  62. package/esm2022/lib/core/services/markdown.service.mjs +0 -64
  63. package/esm2022/lib/core/services/theme.service.mjs +0 -248
  64. package/esm2022/lib/core/types/auth-mode.type.mjs +0 -2
  65. package/esm2022/lib/core/types/auth-status.type.mjs +0 -5
  66. package/esm2022/lib/core/types/chat-stream.type.mjs +0 -2
  67. package/esm2022/lib/core/types/message-role.type.mjs +0 -2
  68. package/esm2022/lib/core/types/prompt-mode.type.mjs +0 -5
  69. package/esm2022/lib/core/types/snackbar-error.type.mjs +0 -5
  70. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +0 -2
  71. package/esm2022/lib/core/utils/logger.service.mjs +0 -42
  72. package/esm2022/lib/doohbot-input.mjs +0 -20
  73. package/esm2022/lib/doohbot.component.mjs +0 -444
  74. package/esm2022/lib/predefined_messages.mjs +0 -15
  75. package/esm2022/lib/shared/chips/chips.component.mjs +0 -28
  76. package/esm2022/lib/shared/dialog/dialog.component.mjs +0 -36
  77. package/esm2022/lib/shared/dialog/dialog.service.mjs +0 -64
  78. package/esm2022/lib/shared/dialog/dialog.utils.mjs +0 -85
  79. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +0 -29
  80. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +0 -38
  81. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +0 -24
  82. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +0 -27
  83. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +0 -43
  84. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +0 -46
  85. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +0 -43
  86. package/esm2022/public-api.mjs +0 -37
  87. package/lib/app/chat/chat-ui-state.service.d.ts +0 -96
  88. package/lib/app/chat/chat.service.d.ts +0 -88
  89. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +0 -16
  90. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +0 -5
  91. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +0 -24
  92. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +0 -49
  93. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +0 -107
  94. package/lib/app/chat/components/message-input/message-input.component.d.ts +0 -12
  95. package/lib/app/chat/components/message-list/message-list.component.d.ts +0 -40
  96. package/lib/app/chat/model/chat-history.model.d.ts +0 -51
  97. package/lib/app/chat/model/chat-request.model.d.ts +0 -10
  98. package/lib/app/chat/model/chat-response.model.d.ts +0 -9
  99. package/lib/app/chat/model/chat-session.model.d.ts +0 -12
  100. package/lib/app/chat/model/chat-stream-message.model.d.ts +0 -5
  101. package/lib/app/chat/model/chat-stream-response.model.d.ts +0 -10
  102. package/lib/app/chat/services/chat-api.service.d.ts +0 -30
  103. package/lib/app/chat/services/chat-audio.service.d.ts +0 -19
  104. package/lib/app/chat/services/chat-history.service.d.ts +0 -53
  105. package/lib/app/login/login-form.component.d.ts +0 -20
  106. package/lib/app/personalization/personalization-dialog.component.d.ts +0 -53
  107. package/lib/app/personalization/personalization.service.d.ts +0 -66
  108. package/lib/app/personalization/sections/account/account-section.component.d.ts +0 -30
  109. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +0 -17
  110. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +0 -27
  111. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +0 -17
  112. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +0 -10
  113. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +0 -5
  114. package/lib/constant/doohbot-constant.d.ts +0 -12
  115. package/lib/constant/html-entities.d.ts +0 -8
  116. package/lib/constant/utf8.d.ts +0 -9
  117. package/lib/core/app-const.d.ts +0 -11
  118. package/lib/core/auth/account-api.service.d.ts +0 -20
  119. package/lib/core/auth/auth.service.d.ts +0 -90
  120. package/lib/core/auth/models/auth-result.model.d.ts +0 -4
  121. package/lib/core/auth/models/federated-login-request.model.d.ts +0 -5
  122. package/lib/core/auth/models/login-request.model.d.ts +0 -6
  123. package/lib/core/auth/storage.service.d.ts +0 -21
  124. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +0 -23
  125. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +0 -14
  126. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +0 -30
  127. package/lib/core/environments/environment.d.ts +0 -7
  128. package/lib/core/environments/environment.prod.d.ts +0 -7
  129. package/lib/core/helpers/crypto-helper.service.d.ts +0 -12
  130. package/lib/core/http/http-stream.service.d.ts +0 -18
  131. package/lib/core/http/http.service.d.ts +0 -20
  132. package/lib/core/interceptors/auth.interceptor.d.ts +0 -18
  133. package/lib/core/interceptors/license.interceptor.d.ts +0 -11
  134. package/lib/core/models/api-config.model.d.ts +0 -58
  135. package/lib/core/models/api-request.model.d.ts +0 -77
  136. package/lib/core/models/api-response.model.d.ts +0 -6
  137. package/lib/core/models/doohbot-config.model.d.ts +0 -81
  138. package/lib/core/models/license.model.d.ts +0 -23
  139. package/lib/core/models/message.d.ts +0 -16
  140. package/lib/core/models/theme-config.model.d.ts +0 -28
  141. package/lib/core/services/core-config.service.d.ts +0 -23
  142. package/lib/core/services/license.service.d.ts +0 -33
  143. package/lib/core/services/markdown.service.d.ts +0 -8
  144. package/lib/core/services/theme.service.d.ts +0 -40
  145. package/lib/core/types/auth-mode.type.d.ts +0 -4
  146. package/lib/core/types/auth-status.type.d.ts +0 -4
  147. package/lib/core/types/chat-stream.type.d.ts +0 -4
  148. package/lib/core/types/message-role.type.d.ts +0 -4
  149. package/lib/core/types/prompt-mode.type.d.ts +0 -4
  150. package/lib/core/types/snackbar-error.type.d.ts +0 -4
  151. package/lib/core/types/tenant-resolution-strategy.type.d.ts +0 -4
  152. package/lib/core/utils/logger.service.d.ts +0 -11
  153. package/lib/doohbot-input.d.ts +0 -19
  154. package/lib/doohbot.component.d.ts +0 -108
  155. package/lib/predefined_messages.d.ts +0 -2
  156. package/lib/shared/chips/chips.component.d.ts +0 -10
  157. package/lib/shared/dialog/dialog.component.d.ts +0 -19
  158. package/lib/shared/dialog/dialog.service.d.ts +0 -29
  159. package/lib/shared/dialog/dialog.utils.d.ts +0 -41
  160. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +0 -11
  161. package/lib/shared/input-dialog/input-dialog.component.d.ts +0 -20
  162. package/lib/shared/menu-item/menu-item.component.d.ts +0 -9
  163. package/lib/shared/pipes/simple-markdown.pipe.d.ts +0 -10
  164. package/lib/shared/snackbar/snackbar.component.d.ts +0 -14
  165. package/lib/shared/snackbar/snackbar.service.d.ts +0 -19
  166. package/lib/shared/snackbar/snackbar.utils.d.ts +0 -33
  167. package/public-api.d.ts +0 -11
  168. package/src/assets/bot.mp3 +0 -0
@@ -1,391 +0,0 @@
1
- import { inject, Injectable, signal } from '@angular/core';
2
- import { BehaviorSubject, map, catchError, of, tap, retry, throwError, firstValueFrom, } from 'rxjs';
3
- import { JwtHelperService } from '@auth0/angular-jwt';
4
- import logger from '../utils/logger.service';
5
- import { SnackbarUtils } from './../../shared/snackbar/snackbar.utils';
6
- import { DoohbotConst } from '../../constant/doohbot-constant';
7
- import { DOOHBOT_ADVANCED_CONFIG } from '../models/doohbot-config.model';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./account-api.service";
10
- import * as i2 from "../helpers/crypto-helper.service";
11
- import * as i3 from "./storage.service";
12
- import * as i4 from "@angular/router";
13
- import * as i5 from "../services/core-config.service";
14
- export class AuthService {
15
- get apiUrl() {
16
- return this.coreConfig.apiUrl;
17
- }
18
- get storageKey() {
19
- return this.coreConfig.storageKey;
20
- }
21
- get secretKey() {
22
- return this.coreConfig.secretKey;
23
- }
24
- get companyCode() {
25
- return this.coreConfig.companyCode;
26
- }
27
- constructor(accountService, cryptoHelper, tokenStorage, router, coreConfig) {
28
- this.accountService = accountService;
29
- this.cryptoHelper = cryptoHelper;
30
- this.tokenStorage = tokenStorage;
31
- this.router = router;
32
- this.coreConfig = coreConfig;
33
- this.jwtHelper = new JwtHelperService();
34
- this.advancedConfig = inject(DOOHBOT_ADVANCED_CONFIG, { optional: true });
35
- // Reactive Authentication State
36
- this.authStatusSubject = new BehaviorSubject('unauthenticated');
37
- this.authStatus$ = this.authStatusSubject.asObservable();
38
- // UI State Signals (Merged from ChatAuthService)
39
- this.isLoggingIn = signal(false);
40
- this.authError = signal(null);
41
- this.authSuccess = signal(null);
42
- // Properties are now derived from coreConfig
43
- }
44
- /**
45
- * Updates the service configuration from the component input
46
- */
47
- updateConfig(config) {
48
- this.coreConfig.updateConfig(config);
49
- if (config.secretKey) {
50
- this.cryptoHelper.setSecretKey(config.secretKey);
51
- }
52
- }
53
- getLoggedInUserName() {
54
- const username = this.tokenStorage.get('username');
55
- return username || '';
56
- }
57
- getLoggedInUserImageUrl() {
58
- return DoohbotConst.userAvatar;
59
- }
60
- getLoggedInUserRole() {
61
- const roles = this.tokenStorage.get('roles');
62
- // If roles is an array, return the first role, otherwise return the string
63
- if (Array.isArray(roles) && roles.length > 0) {
64
- return roles[0];
65
- }
66
- return roles || 'User';
67
- }
68
- // Add getters for backward compatibility if needed, but preferably use authStatus$
69
- get authStatus() {
70
- return this.authStatusSubject.value;
71
- }
72
- /**
73
- * Resolves a federated token from browser storage
74
- */
75
- resolveSilentToken() {
76
- const config = this.coreConfig.config$();
77
- const commonKeys = ['access_token', 'id_token', 'token', 'authToken'];
78
- // 1. Try explicit authToken from config (Highest Priority)
79
- if (config.authToken) {
80
- logger.info(`[Auth] Using explicit authToken from input`);
81
- return config.authToken;
82
- }
83
- // 2. Try configured storage key from advanced config
84
- if (this.advancedConfig?.autoConfigFromStorage) {
85
- const key = this.advancedConfig.autoConfigFromStorage;
86
- const token = localStorage.getItem(key) || sessionStorage.getItem(key);
87
- if (token) {
88
- logger.debug(`[Auth] Resolved token from configured key: ${key}`);
89
- return token;
90
- }
91
- }
92
- // 3. Try common fallback keys
93
- for (const key of commonKeys) {
94
- const token = localStorage.getItem(key) || sessionStorage.getItem(key);
95
- if (token) {
96
- logger.debug(`[Auth] Resolved token from fallback key: ${key}`);
97
- return token;
98
- }
99
- }
100
- return null;
101
- }
102
- /**
103
- * Authenticate user with federated credentials
104
- */
105
- async federatedLogin(credentials, silent = true) {
106
- logger.log('>>>>>>>Attempting federated login...');
107
- // Resolve token if not provided
108
- if (!credentials.accessToken) {
109
- credentials.accessToken = this.resolveSilentToken() || '';
110
- }
111
- // If still no token, exit gracefully
112
- if (!credentials.accessToken) {
113
- logger.log('[Auth] No federated token found in storage.');
114
- return false;
115
- }
116
- this.isLoggingIn.set(true);
117
- if (!silent) {
118
- this.authError.set(null);
119
- this.authSuccess.set(null);
120
- }
121
- try {
122
- const response = await firstValueFrom(this.accountService.federateLogin(credentials));
123
- logger.log('>>>>>>>>>>>Federated Login response<<<<<<<<<<:', response);
124
- if (response && response.success && response.data) {
125
- // Map federated result to something AuthService can handle
126
- // Federated result: { access_token: string, remember_me: boolean }
127
- const authResult = {
128
- access_token: response.data.access_token,
129
- refresh_token: credentials.rememberMe ? response.data.refresh_token : '',
130
- };
131
- this.setSession(authResult, credentials.rememberMe || false);
132
- logger.log('Federated login successful, authenticated state set to true');
133
- if (!silent) {
134
- SnackbarUtils.success('Login successful!');
135
- this.authSuccess.set('Login successful!');
136
- }
137
- this.isLoggingIn.set(false);
138
- return true;
139
- }
140
- else {
141
- if (!silent) {
142
- this.authError.set('Federated login failed.');
143
- }
144
- this.isLoggingIn.set(false);
145
- return false;
146
- }
147
- }
148
- catch (error) {
149
- logger.error('Federated login failed:', error);
150
- if (!silent) {
151
- this.authError.set('An error occurred during federated login.');
152
- }
153
- this.isLoggingIn.set(false);
154
- return false;
155
- }
156
- }
157
- /**
158
- * Authenticate user with credentials
159
- */
160
- async login(credentials, silent = false) {
161
- this.isLoggingIn.set(true);
162
- if (!silent) {
163
- this.authError.set(null); //TODO
164
- this.authSuccess.set(null);
165
- }
166
- try {
167
- const response = await firstValueFrom(this.accountService.login(credentials));
168
- logger.log('>>>>>>>>>>>Login response<<<<<<<<<<:', response);
169
- if (response && response.success && response.data) {
170
- this.setSession(response.data, credentials.rememberMe);
171
- logger.log('Login successful, authenticated state set to true');
172
- if (!silent) {
173
- this.authSuccess.set('Login successful!');
174
- }
175
- this.isLoggingIn.set(false);
176
- return true;
177
- }
178
- else {
179
- if (!silent) {
180
- SnackbarUtils.error('Login failed. Please check your credentials.');
181
- this.authError.set('Login failed. Please check your credentials.');
182
- }
183
- this.isLoggingIn.set(false);
184
- return false;
185
- }
186
- }
187
- catch (error) {
188
- logger.error('Login failed:', error);
189
- if (!silent) {
190
- this.authError.set('An error occurred during login.');
191
- }
192
- this.isLoggingIn.set(false);
193
- return false;
194
- }
195
- }
196
- /*
197
- * Logout logic enhanced with UI signals
198
- */
199
- async logout(refreshToken) {
200
- const token = refreshToken || this.getRefreshToken() || '';
201
- try {
202
- // If no token, just clear local state
203
- if (!token) {
204
- this.clearAuth();
205
- this.authSuccess.set('Logged out successfully!');
206
- setTimeout(() => this.authSuccess.set(null), 3000);
207
- return true;
208
- }
209
- const response = await firstValueFrom(this.accountService.logout(token));
210
- if (response && response.success) {
211
- this.clearAuth();
212
- this.authSuccess.set('Logged out successfully!');
213
- setTimeout(() => this.authSuccess.set(null), 3000);
214
- return true;
215
- }
216
- else {
217
- this.clearAuth();
218
- return false;
219
- }
220
- }
221
- catch (error) {
222
- logger.error('Logout failed:', error);
223
- SnackbarUtils.error('An error occurred during logout.');
224
- // Force clear auth on error to ensure user isn't stuck
225
- this.clearAuth();
226
- return false;
227
- }
228
- }
229
- // Utility
230
- setSession(session, rememberMe = true) {
231
- const user = this.jwtHelper.decodeToken(session.access_token);
232
- // Set storage type based on rememberMe preference
233
- this.tokenStorage.setRememberMe(rememberMe);
234
- this.tokenStorage.set('access_token', session.access_token);
235
- this.tokenStorage.set('refresh_token', session.refresh_token);
236
- this.tokenStorage.set('user_id', user?.user_id);
237
- this.tokenStorage.set('username', user?.username);
238
- this.tokenStorage.set('roles', user?.roles);
239
- this.tokenStorage.set('permissions', user?.permissions);
240
- this.tokenStorage.set('organization_id', user?.organization_id);
241
- this.tokenStorage.set('company_id', user?.company_id);
242
- this.tokenStorage.set('office_id', user?.office_id);
243
- // Notify subscribers
244
- this.authStatusSubject.next('authenticated');
245
- }
246
- getOrganizationId() {
247
- logger.debug('>>>>>>>>>>getOrganizationId<<<<<<<:', this.tokenStorage.get('organization_id'));
248
- return this.tokenStorage.get('organization_id');
249
- }
250
- getRefreshToken() {
251
- logger.debug('>>>>>>>>>>getRefreshToken<<<<<<<:', this.tokenStorage.get('refresh_token'));
252
- return this.tokenStorage.get('refresh_token');
253
- }
254
- refreshToken() {
255
- const refreshToken = this.getRefreshToken();
256
- if (!refreshToken) {
257
- return throwError(() => new Error('No refresh token available'));
258
- }
259
- return this.accountService.refreshLogin({ refresh_token: refreshToken }).pipe(retry(3), // Retry 3 times on failure
260
- tap((response) => {
261
- if (response && response.success && response.data) {
262
- this.setSession(response.data);
263
- }
264
- }), map((response) => {
265
- if (response && response.success && response.data) {
266
- return response.data;
267
- }
268
- else {
269
- throw new Error('Token refresh failed');
270
- }
271
- }), catchError((err) => {
272
- logger.error('[Auth] Token refresh failed after retries:', err);
273
- this.clearAuth();
274
- SnackbarUtils.error('Session Expired. Please login.');
275
- return throwError(() => err);
276
- }));
277
- }
278
- isAuthenticated() {
279
- const token = this.tokenStorage.get('access_token');
280
- return !!token && !this.isTokenExpired();
281
- }
282
- isTokenExpired() {
283
- let token = (this.tokenStorage.get('access_token') ?? '');
284
- if (token) {
285
- return this.jwtHelper.isTokenExpired(token);
286
- }
287
- else {
288
- return true;
289
- }
290
- }
291
- /**
292
- * Validate stored token on app startup
293
- */
294
- validateStoredToken() {
295
- const accessToken = this.tokenStorage.get('access_token');
296
- //! No access token
297
- if (!accessToken) {
298
- //TODO: FORCE AUTHENTICATED FOR DEV
299
- // this.authStatusSubject.next('authenticated');
300
- // return of('authenticated');
301
- //! For production ( Backend Validation )
302
- this.authStatusSubject.next('unauthenticated');
303
- return of('unauthenticated');
304
- }
305
- // Access token valid
306
- if (!this.isTokenExpired()) {
307
- this.authStatusSubject.next('authenticated');
308
- return of('authenticated');
309
- }
310
- // Access Token expired -> try refresh
311
- const refreshToken = this.getRefreshToken();
312
- if (!refreshToken) {
313
- this.clearAuth();
314
- this.authStatusSubject.next('unauthenticated');
315
- return of('unauthenticated');
316
- }
317
- //! Access expired but refresh token exists → attempt refresh
318
- this.authStatusSubject.next('expired');
319
- return this.refreshToken().pipe(map(() => {
320
- this.authStatusSubject.next('authenticated');
321
- return 'authenticated';
322
- }), catchError((err) => {
323
- logger.error('[Auth] Token refresh failed:', err);
324
- this.clearAuth();
325
- this.authStatusSubject.next('unauthenticated');
326
- return of('unauthenticated');
327
- }));
328
- }
329
- getUserId() {
330
- return this.tokenStorage.get('user_id') || '';
331
- }
332
- getLicensingContext() {
333
- const roles = this.tokenStorage.get('roles');
334
- // Prefer company_id (specific tenant) over organization_id (system group)
335
- const tenantId = this.tokenStorage.get('company_id') || this.getOrganizationId() || '';
336
- return {
337
- tenantId: tenantId,
338
- principalId: this.getUserId() || '',
339
- roles: Array.isArray(roles) ? roles : roles ? [roles] : [],
340
- };
341
- }
342
- get licenseKey() {
343
- return this.tokenStorage.get('license_key') || this.coreConfig.licenseKey || '';
344
- }
345
- get isFederated() {
346
- return this.licenseKey.startsWith('doohbot_lic_');
347
- }
348
- setLicenseKey(key) {
349
- this.tokenStorage.set('license_key', key);
350
- }
351
- //! clear local storage
352
- /**
353
- * Clear all authentication related data from local storage, session storage, cache, and tokens.
354
- * This method is called when the user logs out.
355
- */
356
- clearAuth() {
357
- const userId = this.getUserId();
358
- logger.log('[Auth] Clearing auth:', { userId });
359
- this.clearSession();
360
- this.clearStorage();
361
- this.clearCache();
362
- this.clearLocalStorage();
363
- // ENSURE authStatus$ emits unauthenticated
364
- this.authStatusSubject.next('unauthenticated');
365
- logger.log('[Auth] Auth cleared successfully');
366
- }
367
- clearSession() {
368
- sessionStorage.clear();
369
- }
370
- clearTabInfo() {
371
- localStorage.removeItem('tabs');
372
- }
373
- clearStorage() {
374
- this.tokenStorage.clear();
375
- }
376
- clearLocalStorage() {
377
- localStorage.clear();
378
- }
379
- clearCache() {
380
- // this.cacheService.clear();
381
- }
382
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [{ token: i1.AccountService }, { token: i2.CryptoHelperService }, { token: i3.StorageService }, { token: i4.Router }, { token: i5.CoreConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
383
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
384
- }
385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
386
- type: Injectable,
387
- args: [{
388
- providedIn: 'root',
389
- }]
390
- }], ctorParameters: () => [{ type: i1.AccountService }, { type: i2.CryptoHelperService }, { type: i3.StorageService }, { type: i4.Router }, { type: i5.CoreConfigService }] });
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2NvcmUvYXV0aC9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNELE9BQU8sRUFDTCxlQUFlLEVBQ2YsR0FBRyxFQUVILFVBQVUsRUFDVixFQUFFLEVBQ0YsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEVBQ1YsY0FBYyxHQUNmLE1BQU0sTUFBTSxDQUFDO0FBSWQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHdEQsT0FBTyxNQUFNLE1BQU0seUJBQXlCLENBQUM7QUFHN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUcvRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7OztBQWdCekUsTUFBTSxPQUFPLFdBQVc7SUFDdEIsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztJQUNyQyxDQUFDO0lBY0QsWUFDVSxjQUE4QixFQUM5QixZQUFpQyxFQUNqQyxZQUE0QixFQUM1QixNQUFjLEVBQ2QsVUFBNkI7UUFKN0Is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Q0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUNELGlCQUFpQjtRQUNmLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsVUFBVTtRQUNSLDZCQUE2QjtJQUMvQixDQUFDOytHQWpiVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvcmVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29yZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IERvb2hib3RJbnB1dCB9IGZyb20gJy4uLy4uL2Rvb2hib3QtaW5wdXQnO1xyXG5pbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBtYXAsXHJcbiAgT2JzZXJ2YWJsZSxcclxuICBjYXRjaEVycm9yLFxyXG4gIG9mLFxyXG4gIHRhcCxcclxuICByZXRyeSxcclxuICB0aHJvd0Vycm9yLFxyXG4gIGZpcnN0VmFsdWVGcm9tLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBBdXRoUmVzdWx0IH0gZnJvbSAnLi9tb2RlbHMvYXV0aC1yZXN1bHQubW9kZWwnO1xyXG5pbXBvcnQgeyBGZWRlcmF0ZWRMb2dpblJlcXVlc3QgfSBmcm9tICcuL21vZGVscy9mZWRlcmF0ZWQtbG9naW4tcmVxdWVzdC5tb2RlbCc7XHJcbmltcG9ydCB7IExvZ2luUmVxdWVzdCB9IGZyb20gJy4vbW9kZWxzL2xvZ2luLXJlcXVlc3QubW9kZWwnO1xyXG5pbXBvcnQgeyBKd3RIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnQGF1dGgwL2FuZ3VsYXItand0JztcclxuaW1wb3J0IHsgQ3J5cHRvSGVscGVyU2VydmljZSB9IGZyb20gJy4uL2hlbHBlcnMvY3J5cHRvLWhlbHBlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBdXRoU3RhdHVzIH0gZnJvbSAnLi4vdHlwZXMvYXV0aC1zdGF0dXMudHlwZSc7XHJcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi9hY2NvdW50LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU25hY2tiYXJVdGlscyB9IGZyb20gJy4vLi4vLi4vc2hhcmVkL3NuYWNrYmFyL3NuYWNrYmFyLnV0aWxzJztcclxuaW1wb3J0IHsgRG9vaGJvdENvbnN0IH0gZnJvbSAnLi4vLi4vY29uc3RhbnQvZG9vaGJvdC1jb25zdGFudCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IExpY2Vuc2luZ0NvbnRleHQgfSBmcm9tICcuLi9tb2RlbHMvbGljZW5zZS5tb2RlbCc7XHJcbmltcG9ydCB7IERPT0hCT1RfQURWQU5DRURfQ09ORklHIH0gZnJvbSAnLi4vbW9kZWxzL2Rvb2hib3QtY29uZmlnLm1vZGVsJztcclxuXHJcbi8vISBpbmhlcml0IFdpbmRvdyBzdG9yYWdlRXZlbnRBZGRlZCBmb3IgZHVwbGljYXRlIHRhYiBkZXRlY3Rpb25cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgc3RvcmFnZUV2ZW50QWRkZWQ/OiBib29sZWFuO1xyXG4gICAgdGFiQ0xvc2VFdmVudEFkZGVkPzogYm9vbGVhbjtcclxuICAgIGFicD86IGFueTtcclxuICAgIEFwcFByZUJvb3RzdHJhcD86IGFueTtcclxuICAgIEFwcENvbnN0cz86IGFueTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XHJcbiAgZ2V0IGFwaVVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5hcGlVcmw7XHJcbiAgfVxyXG5cclxuICBnZXQgc3RvcmFnZUtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zdG9yYWdlS2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlY3JldEtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zZWNyZXRLZXk7XHJcbiAgfVxyXG5cclxuICBnZXQgY29tcGFueUNvZGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvcmVDb25maWcuY29tcGFueUNvZGU7XHJcbiAgfVxyXG5cclxuICBqd3RIZWxwZXI6IEp3dEhlbHBlclNlcnZpY2UgPSBuZXcgSnd0SGVscGVyU2VydmljZSgpO1xyXG4gIHByaXZhdGUgYWR2YW5jZWRDb25maWcgPSBpbmplY3QoRE9PSEJPVF9BRFZBTkNFRF9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcblxyXG4gIC8vIFJlYWN0aXZlIEF1dGhlbnRpY2F0aW9uIFN0YXRlXHJcbiAgcHJpdmF0ZSBhdXRoU3RhdHVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFN0YXR1cz4oJ3VuYXV0aGVudGljYXRlZCcpO1xyXG4gIHB1YmxpYyBhdXRoU3RhdHVzJCA9IHRoaXMuYXV0aFN0YXR1c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIC8vIFVJIFN0YXRlIFNpZ25hbHMgKE1lcmdlZCBmcm9tIENoYXRBdXRoU2VydmljZSlcclxuICBwdWJsaWMgaXNMb2dnaW5nSW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHB1YmxpYyBhdXRoRXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgcHVibGljIGF1dGhTdWNjZXNzID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjcnlwdG9IZWxwZXI6IENyeXB0b0hlbHBlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRva2VuU3RvcmFnZTogU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBjb3JlQ29uZmlnOiBDb3JlQ29uZmlnU2VydmljZSxcclxuICApIHtcclxuICAgIC8vIFByb3BlcnRpZXMgYXJlIG5vdyBkZXJpdmVkIGZyb20gY29yZUNvbmZpZ1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlcyB0aGUgc2VydmljZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGNvbXBvbmVudCBpbnB1dFxyXG4gICAqL1xyXG4gIHB1YmxpYyB1cGRhdGVDb25maWcoY29uZmlnOiBEb29oYm90SW5wdXQpOiB2b2lkIHtcclxuICAgIHRoaXMuY29yZUNvbmZpZy51cGRhdGVDb25maWcoY29uZmlnKTtcclxuICAgIGlmIChjb25maWcuc2VjcmV0S2V5KSB7XHJcbiAgICAgIHRoaXMuY3J5cHRvSGVscGVyLnNldFNlY3JldEtleShjb25maWcuc2VjcmV0S2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldExvZ2dlZEluVXNlck5hbWUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCd1c2VybmFtZScpO1xyXG4gICAgcmV0dXJuIHVzZXJuYW1lIHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0TG9nZ2VkSW5Vc2VySW1hZ2VVcmwoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gRG9vaGJvdENvbnN0LnVzZXJBdmF0YXI7XHJcbiAgfVxyXG5cclxuICBnZXRMb2dnZWRJblVzZXJSb2xlKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCByb2xlcyA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgncm9sZXMnKTtcclxuICAgIC8vIElmIHJvbGVzIGlzIGFuIGFycmF5LCByZXR1cm4gdGhlIGZpcnN0IHJvbGUsIG90aGVyd2lzZSByZXR1cm4gdGhlIHN0cmluZ1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocm9sZXMpICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHJvbGVzWzBdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvbGVzIHx8ICdVc2VyJztcclxuICB9XHJcblxyXG4gIC8vIEFkZCBnZXR0ZXJzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGlmIG5lZWRlZCwgYnV0IHByZWZlcmFibHkgdXNlIGF1dGhTdGF0dXMkXHJcbiAgcHVibGljIGdldCBhdXRoU3RhdHVzKCk6IEF1dGhTdGF0dXMge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aFN0YXR1c1N1YmplY3QudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyBhIGZlZGVyYXRlZCB0b2tlbiBmcm9tIGJyb3dzZXIgc3RvcmFnZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVzb2x2ZVNpbGVudFRva2VuKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb3JlQ29uZmlnLmNvbmZpZyQoKTtcclxuICAgIGNvbnN0IGNvbW1vbktleXMgPSBbJ2FjY2Vzc190b2tlbicsICdpZF90b2tlbicsICd0b2tlbicsICdhdXRoVG9rZW4nXTtcclxuXHJcbiAgICAvLyAxLiBUcnkgZXhwbGljaXQgYXV0aFRva2VuIGZyb20gY29uZmlnIChIaWdoZXN0IFByaW9yaXR5KVxyXG4gICAgaWYgKGNvbmZpZy5hdXRoVG9rZW4pIHtcclxuICAgICAgbG9nZ2VyLmluZm8oYFtBdXRoXSBVc2luZyBleHBsaWNpdCBhdXRoVG9rZW4gZnJvbSBpbnB1dGApO1xyXG4gICAgICByZXR1cm4gY29uZmlnLmF1dGhUb2tlbjtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyLiBUcnkgY29uZmlndXJlZCBzdG9yYWdlIGtleSBmcm9tIGFkdmFuY2VkIGNvbmZpZ1xyXG4gICAgaWYgKHRoaXMuYWR2YW5jZWRDb25maWc/LmF1dG9Db25maWdGcm9tU3RvcmFnZSkge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmFkdmFuY2VkQ29uZmlnLmF1dG9Db25maWdGcm9tU3RvcmFnZTtcclxuICAgICAgY29uc3QgdG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIHx8IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcclxuICAgICAgaWYgKHRva2VuKSB7XHJcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGBbQXV0aF0gUmVzb2x2ZWQgdG9rZW4gZnJvbSBjb25maWd1cmVkIGtleTogJHtrZXl9YCk7XHJcbiAgICAgICAgcmV0dXJuIHRva2VuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMy4gVHJ5IGNvbW1vbiBmYWxsYmFjayBrZXlzXHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBjb21tb25LZXlzKSB7XHJcbiAgICAgIGNvbnN0IHRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oa2V5KSB8fCBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGtleSk7XHJcbiAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgIGxvZ2dlci5kZWJ1ZyhgW0F1dGhdIFJlc29sdmVkIHRva2VuIGZyb20gZmFsbGJhY2sga2V5OiAke2tleX1gKTtcclxuICAgICAgICByZXR1cm4gdG9rZW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEF1dGhlbnRpY2F0ZSB1c2VyIHdpdGggZmVkZXJhdGVkIGNyZWRlbnRpYWxzXHJcbiAgICovXHJcbiAgYXN5bmMgZmVkZXJhdGVkTG9naW4oXHJcbiAgICBjcmVkZW50aWFsczogUGFydGlhbDxGZWRlcmF0ZWRMb2dpblJlcXVlc3Q+LFxyXG4gICAgc2lsZW50OiBib29sZWFuID0gdHJ1ZSxcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGxvZ2dlci5sb2coJz4+Pj4+Pj5BdHRlbXB0aW5nIGZlZGVyYXRlZCBsb2dpbi4uLicpO1xyXG5cclxuICAgIC8vIFJlc29sdmUgdG9rZW4gaWYgbm90IHByb3ZpZGVkXHJcbiAgICBpZiAoIWNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgIGNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuID0gdGhpcy5yZXNvbHZlU2lsZW50VG9rZW4oKSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiBzdGlsbCBubyB0b2tlbiwgZXhpdCBncmFjZWZ1bGx5XHJcbiAgICBpZiAoIWNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuKSB7XHJcbiAgICAgIGxvZ2dlci5sb2coJ1tBdXRoXSBObyBmZWRlcmF0ZWQgdG9rZW4gZm91bmQgaW4gc3RvcmFnZS4nKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KHRydWUpO1xyXG4gICAgaWYgKCFzaWxlbnQpIHtcclxuICAgICAgdGhpcy5hdXRoRXJyb3Iuc2V0KG51bGwpO1xyXG4gICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UuZmVkZXJhdGVMb2dpbihjcmVkZW50aWFscyBhcyBGZWRlcmF0ZWRMb2dpblJlcXVlc3QpLFxyXG4gICAgICApO1xyXG4gICAgICBsb2dnZXIubG9nKCc+Pj4+Pj4+Pj4+PkZlZGVyYXRlZCBMb2dpbiByZXNwb25zZTw8PDw8PDw8PDw6JywgcmVzcG9uc2UpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XHJcbiAgICAgICAgLy8gTWFwIGZlZGVyYXRlZCByZXN1bHQgdG8gc29tZXRoaW5nIEF1dGhTZXJ2aWNlIGNhbiBoYW5kbGVcclxuICAgICAgICAvLyBGZWRlcmF0ZWQgcmVzdWx0OiB7IGFjY2Vzc190b2tlbjogc3RyaW5nLCByZW1lbWJlcl9tZTogYm9vbGVhbiB9XHJcbiAgICAgICAgY29uc3QgYXV0aFJlc3VsdCA9IHtcclxuICAgICAgICAgIGFjY2Vzc190b2tlbjogcmVzcG9uc2UuZGF0YS5hY2Nlc3NfdG9rZW4sXHJcbiAgICAgICAgICByZWZyZXNoX3Rva2VuOiBjcmVkZW50aWFscy5yZW1lbWJlck1lID8gcmVzcG9uc2UuZGF0YS5yZWZyZXNoX3Rva2VuIDogJycsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5zZXRTZXNzaW9uKGF1dGhSZXN1bHQsIGNyZWRlbnRpYWxzLnJlbWVtYmVyTWUgfHwgZmFsc2UpO1xyXG5cclxuICAgICAgICBsb2dnZXIubG9nKCdGZWRlcmF0ZWQgbG9naW4gc3VjY2Vzc2Z1bCwgYXV0aGVudGljYXRlZCBzdGF0ZSBzZXQgdG8gdHJ1ZScpO1xyXG4gICAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgICBTbmFja2JhclV0aWxzLnN1Y2Nlc3MoJ0xvZ2luIHN1Y2Nlc3NmdWwhJyk7XHJcbiAgICAgICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldCgnTG9naW4gc3VjY2Vzc2Z1bCEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvZ2dpbmdJbi5zZXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmF1dGhFcnJvci5zZXQoJ0ZlZGVyYXRlZCBsb2dpbiBmYWlsZWQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGxvZ2dlci5lcnJvcignRmVkZXJhdGVkIGxvZ2luIGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgICAgdGhpcy5hdXRoRXJyb3Iuc2V0KCdBbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgZmVkZXJhdGVkIGxvZ2luLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQXV0aGVudGljYXRlIHVzZXIgd2l0aCBjcmVkZW50aWFsc1xyXG4gICAqL1xyXG4gIGFzeW5jIGxvZ2luKGNyZWRlbnRpYWxzOiBMb2dpblJlcXVlc3QsIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLmlzTG9nZ2luZ0luLnNldCh0cnVlKTtcclxuICAgIGlmICghc2lsZW50KSB7XHJcbiAgICAgIHRoaXMuYXV0aEVycm9yLnNldChudWxsKTsgLy9UT0RPXHJcbiAgICAgIHRoaXMuYXV0aFN1Y2Nlc3Muc2V0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hY2NvdW50U2VydmljZS5sb2dpbihjcmVkZW50aWFscykpO1xyXG4gICAgICBsb2dnZXIubG9nKCc+Pj4+Pj4+Pj4+PkxvZ2luIHJlc3BvbnNlPDw8PDw8PDw8PDonLCByZXNwb25zZSk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICB0aGlzLnNldFNlc3Npb24ocmVzcG9uc2UuZGF0YSwgY3JlZGVudGlhbHMucmVtZW1iZXJNZSk7XHJcblxyXG4gICAgICAgIGxvZ2dlci5sb2coJ0xvZ2luIHN1Y2Nlc3NmdWwsIGF1dGhlbnRpY2F0ZWQgc3RhdGUgc2V0IHRvIHRydWUnKTtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgdGhpcy5hdXRoU3VjY2Vzcy5zZXQoJ0xvZ2luIHN1Y2Nlc3NmdWwhJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgICAgU25hY2tiYXJVdGlscy5lcnJvcignTG9naW4gZmFpbGVkLiBQbGVhc2UgY2hlY2sgeW91ciBjcmVkZW50aWFscy4nKTtcclxuICAgICAgICAgIHRoaXMuYXV0aEVycm9yLnNldCgnTG9naW4gZmFpbGVkLiBQbGVhc2UgY2hlY2sgeW91ciBjcmVkZW50aWFscy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0xvZ2dpbmdJbi5zZXQoZmFsc2UpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgbG9nZ2VyLmVycm9yKCdMb2dpbiBmYWlsZWQ6JywgZXJyb3IpO1xyXG4gICAgICBpZiAoIXNpbGVudCkge1xyXG4gICAgICAgIHRoaXMuYXV0aEVycm9yLnNldCgnQW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGxvZ2luLicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuaXNMb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBMb2dvdXQgbG9naWMgZW5oYW5jZWQgd2l0aCBVSSBzaWduYWxzXHJcbiAgICovXHJcbiAgYXN5bmMgbG9nb3V0KHJlZnJlc2hUb2tlbj86IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgdG9rZW4gPSByZWZyZXNoVG9rZW4gfHwgdGhpcy5nZXRSZWZyZXNoVG9rZW4oKSB8fCAnJztcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBJZiBubyB0b2tlbiwganVzdCBjbGVhciBsb2NhbCBzdGF0ZVxyXG4gICAgICBpZiAoIXRva2VuKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldCgnTG9nZ2VkIG91dCBzdWNjZXNzZnVsbHkhJyk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dGhTdWNjZXNzLnNldChudWxsKSwgMzAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5hY2NvdW50U2VydmljZS5sb2dvdXQodG9rZW4pKTtcclxuXHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICB0aGlzLmF1dGhTdWNjZXNzLnNldCgnTG9nZ2VkIG91dCBzdWNjZXNzZnVsbHkhJyk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmF1dGhTdWNjZXNzLnNldChudWxsKSwgMzAwMCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGxvZ2dlci5lcnJvcignTG9nb3V0IGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICAgIFNuYWNrYmFyVXRpbHMuZXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIGR1cmluZyBsb2dvdXQuJyk7XHJcbiAgICAgIC8vIEZvcmNlIGNsZWFyIGF1dGggb24gZXJyb3IgdG8gZW5zdXJlIHVzZXIgaXNuJ3Qgc3R1Y2tcclxuICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVXRpbGl0eVxyXG4gIHNldFNlc3Npb24oc2Vzc2lvbjogQXV0aFJlc3VsdCwgcmVtZW1iZXJNZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmp3dEhlbHBlci5kZWNvZGVUb2tlbihzZXNzaW9uLmFjY2Vzc190b2tlbik7XHJcblxyXG4gICAgLy8gU2V0IHN0b3JhZ2UgdHlwZSBiYXNlZCBvbiByZW1lbWJlck1lIHByZWZlcmVuY2VcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldFJlbWVtYmVyTWUocmVtZW1iZXJNZSk7XHJcblxyXG4gICAgdGhpcy50b2tlblN0b3JhZ2Uuc2V0KCdhY2Nlc3NfdG9rZW4nLCBzZXNzaW9uLmFjY2Vzc190b2tlbik7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ3JlZnJlc2hfdG9rZW4nLCBzZXNzaW9uLnJlZnJlc2hfdG9rZW4pO1xyXG4gICAgdGhpcy50b2tlblN0b3JhZ2Uuc2V0KCd1c2VyX2lkJywgdXNlcj8udXNlcl9pZCk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ3VzZXJuYW1lJywgdXNlcj8udXNlcm5hbWUpO1xyXG4gICAgdGhpcy50b2tlblN0b3JhZ2Uuc2V0KCdyb2xlcycsIHVzZXI/LnJvbGVzKTtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldCgncGVybWlzc2lvbnMnLCB1c2VyPy5wZXJtaXNzaW9ucyk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ29yZ2FuaXphdGlvbl9pZCcsIHVzZXI/Lm9yZ2FuaXphdGlvbl9pZCk7XHJcbiAgICB0aGlzLnRva2VuU3RvcmFnZS5zZXQoJ2NvbXBhbnlfaWQnLCB1c2VyPy5jb21wYW55X2lkKTtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldCgnb2ZmaWNlX2lkJywgdXNlcj8ub2ZmaWNlX2lkKTtcclxuXHJcbiAgICAvLyBOb3RpZnkgc3Vic2NyaWJlcnNcclxuICAgIHRoaXMuYXV0aFN0YXR1c1N1YmplY3QubmV4dCgnYXV0aGVudGljYXRlZCcpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JnYW5pemF0aW9uSWQoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBsb2dnZXIuZGVidWcoJz4+Pj4+Pj4+Pj5nZXRPcmdhbml6YXRpb25JZDw8PDw8PDw6JywgdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdvcmdhbml6YXRpb25faWQnKSk7XHJcbiAgICByZXR1cm4gdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdvcmdhbml6YXRpb25faWQnKTtcclxuICB9XHJcblxyXG4gIGdldFJlZnJlc2hUb2tlbigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGxvZ2dlci5kZWJ1ZygnPj4+Pj4+Pj4+PmdldFJlZnJlc2hUb2tlbjw8PDw8PDw6JywgdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdyZWZyZXNoX3Rva2VuJykpO1xyXG4gICAgcmV0dXJuIHRoaXMudG9rZW5TdG9yYWdlLmdldCgncmVmcmVzaF90b2tlbicpO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFRva2VuKCk6IE9ic2VydmFibGU8QXV0aFJlc3VsdD4ge1xyXG4gICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5nZXRSZWZyZXNoVG9rZW4oKTtcclxuICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBhdmFpbGFibGUnKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudFNlcnZpY2UucmVmcmVzaExvZ2luKHsgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuIH0pLnBpcGUoXHJcbiAgICAgIHJldHJ5KDMpLCAvLyBSZXRyeSAzIHRpbWVzIG9uIGZhaWx1cmVcclxuICAgICAgdGFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgICAgdGhpcy5zZXRTZXNzaW9uKHJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgIHJldHVybiByZXNwb25zZS5kYXRhIGFzIEF1dGhSZXN1bHQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gcmVmcmVzaCBmYWlsZWQnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tBdXRoXSBUb2tlbiByZWZyZXNoIGZhaWxlZCBhZnRlciByZXRyaWVzOicsIGVycik7XHJcbiAgICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgICBTbmFja2JhclV0aWxzLmVycm9yKCdTZXNzaW9uIEV4cGlyZWQuIFBsZWFzZSBsb2dpbi4nKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgnYWNjZXNzX3Rva2VuJyk7XHJcbiAgICByZXR1cm4gISF0b2tlbiAmJiAhdGhpcy5pc1Rva2VuRXhwaXJlZCgpO1xyXG4gIH1cclxuXHJcbiAgaXNUb2tlbkV4cGlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgdG9rZW4gPSAodGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdhY2Nlc3NfdG9rZW4nKSA/PyAnJykgYXMgc3RyaW5nO1xyXG4gICAgaWYgKHRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmp3dEhlbHBlci5pc1Rva2VuRXhwaXJlZCh0b2tlbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIHN0b3JlZCB0b2tlbiBvbiBhcHAgc3RhcnR1cFxyXG4gICAqL1xyXG4gIHZhbGlkYXRlU3RvcmVkVG9rZW4oKTogT2JzZXJ2YWJsZTxBdXRoU3RhdHVzPiB7XHJcbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgnYWNjZXNzX3Rva2VuJyk7XHJcblxyXG4gICAgLy8hIE5vIGFjY2VzcyB0b2tlblxyXG4gICAgaWYgKCFhY2Nlc3NUb2tlbikge1xyXG4gICAgICAvL1RPRE86IEZPUkNFIEFVVEhFTlRJQ0FURUQgRk9SIERFVlxyXG4gICAgICAvLyB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ2F1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgLy8gcmV0dXJuIG9mKCdhdXRoZW50aWNhdGVkJyk7XHJcblxyXG4gICAgICAvLyEgRm9yIHByb2R1Y3Rpb24gKCBCYWNrZW5kIFZhbGlkYXRpb24gKVxyXG4gICAgICB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ3VuYXV0aGVudGljYXRlZCcpO1xyXG4gICAgICByZXR1cm4gb2YoJ3VuYXV0aGVudGljYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFjY2VzcyB0b2tlbiB2YWxpZFxyXG4gICAgaWYgKCF0aGlzLmlzVG9rZW5FeHBpcmVkKCkpIHtcclxuICAgICAgdGhpcy5hdXRoU3RhdHVzU3ViamVjdC5uZXh0KCdhdXRoZW50aWNhdGVkJyk7XHJcbiAgICAgIHJldHVybiBvZignYXV0aGVudGljYXRlZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFjY2VzcyBUb2tlbiBleHBpcmVkIC0+IHRyeSByZWZyZXNoXHJcbiAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLmdldFJlZnJlc2hUb2tlbigpO1xyXG4gICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcclxuICAgICAgdGhpcy5jbGVhckF1dGgoKTtcclxuICAgICAgdGhpcy5hdXRoU3RhdHVzU3ViamVjdC5uZXh0KCd1bmF1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgcmV0dXJuIG9mKCd1bmF1dGhlbnRpY2F0ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyEgQWNjZXNzIGV4cGlyZWQgYnV0IHJlZnJlc2ggdG9rZW4gZXhpc3RzIOKGkiBhdHRlbXB0IHJlZnJlc2hcclxuICAgIHRoaXMuYXV0aFN0YXR1c1N1YmplY3QubmV4dCgnZXhwaXJlZCcpO1xyXG4gICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuKCkucGlwZShcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ2F1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgICByZXR1cm4gJ2F1dGhlbnRpY2F0ZWQnIGFzIEF1dGhTdGF0dXM7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tBdXRoXSBUb2tlbiByZWZyZXNoIGZhaWxlZDonLCBlcnIpO1xyXG4gICAgICAgIHRoaXMuY2xlYXJBdXRoKCk7XHJcbiAgICAgICAgdGhpcy5hdXRoU3RhdHVzU3ViamVjdC5uZXh0KCd1bmF1dGhlbnRpY2F0ZWQnKTtcclxuICAgICAgICByZXR1cm4gb2YoJ3VuYXV0aGVudGljYXRlZCcgYXMgQXV0aFN0YXR1cyk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnRva2VuU3RvcmFnZS5nZXQoJ3VzZXJfaWQnKSB8fCAnJztcclxuICB9XHJcblxyXG4gIGdldExpY2Vuc2luZ0NvbnRleHQoKTogTGljZW5zaW5nQ29udGV4dCB7XHJcbiAgICBjb25zdCByb2xlcyA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgncm9sZXMnKTtcclxuICAgIC8vIFByZWZlciBjb21wYW55X2lkIChzcGVjaWZpYyB0ZW5hbnQpIG92ZXIgb3JnYW5pemF0aW9uX2lkIChzeXN0ZW0gZ3JvdXApXHJcbiAgICBjb25zdCB0ZW5hbnRJZCA9IHRoaXMudG9rZW5TdG9yYWdlLmdldCgnY29tcGFueV9pZCcpIHx8IHRoaXMuZ2V0T3JnYW5pemF0aW9uSWQoKSB8fCAnJztcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0ZW5hbnRJZDogdGVuYW50SWQsXHJcbiAgICAgIHByaW5jaXBhbElkOiB0aGlzLmdldFVzZXJJZCgpIHx8ICcnLFxyXG4gICAgICByb2xlczogQXJyYXkuaXNBcnJheShyb2xlcykgPyByb2xlcyA6IHJvbGVzID8gW3JvbGVzXSA6IFtdLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGdldCBsaWNlbnNlS2V5KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50b2tlblN0b3JhZ2UuZ2V0KCdsaWNlbnNlX2tleScpIHx8IHRoaXMuY29yZUNvbmZpZy5saWNlbnNlS2V5IHx8ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzRmVkZXJhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubGljZW5zZUtleS5zdGFydHNXaXRoKCdkb29oYm90X2xpY18nKTtcclxuICB9XHJcblxyXG4gIHNldExpY2Vuc2VLZXkoa2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLnNldCgnbGljZW5zZV9rZXknLCBrZXkpO1xyXG4gIH1cclxuXHJcbiAgLy8hIGNsZWFyIGxvY2FsIHN0b3JhZ2VcclxuICAvKipcclxuICAgKiBDbGVhciBhbGwgYXV0aGVudGljYXRpb24gcmVsYXRlZCBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZSwgc2Vzc2lvbiBzdG9yYWdlLCBjYWNoZSwgYW5kIHRva2Vucy5cclxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBsb2dzIG91dC5cclxuICAgKi9cclxuICBjbGVhckF1dGgoKSB7XHJcbiAgICBjb25zdCB1c2VySWQgPSB0aGlzLmdldFVzZXJJZCgpO1xyXG4gICAgbG9nZ2VyLmxvZygnW0F1dGhdIENsZWFyaW5nIGF1dGg6JywgeyB1c2VySWQgfSk7XHJcblxyXG4gICAgdGhpcy5jbGVhclNlc3Npb24oKTtcclxuICAgIHRoaXMuY2xlYXJTdG9yYWdlKCk7XHJcbiAgICB0aGlzLmNsZWFyQ2FjaGUoKTtcclxuICAgIHRoaXMuY2xlYXJMb2NhbFN0b3JhZ2UoKTtcclxuXHJcbiAgICAvLyBFTlNVUkUgYXV0aFN0YXR1cyQgZW1pdHMgdW5hdXRoZW50aWNhdGVkXHJcbiAgICB0aGlzLmF1dGhTdGF0dXNTdWJqZWN0Lm5leHQoJ3VuYXV0aGVudGljYXRlZCcpO1xyXG5cclxuICAgIGxvZ2dlci5sb2coJ1tBdXRoXSBBdXRoIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5Jyk7XHJcbiAgfVxyXG5cclxuICBjbGVhclNlc3Npb24oKSB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXJUYWJJbmZvKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3RhYnMnKTtcclxuICB9XHJcblxyXG4gIGNsZWFyU3RvcmFnZSgpIHtcclxuICAgIHRoaXMudG9rZW5TdG9yYWdlLmNsZWFyKCk7XHJcbiAgfVxyXG4gIGNsZWFyTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckNhY2hlKCkge1xyXG4gICAgLy8gdGhpcy5jYWNoZVNlcnZpY2UuY2xlYXIoKTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,3 +0,0 @@
1
- export class AuthResult {
2
- }
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1yZXN1bHQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9hdXRoL21vZGVscy9hdXRoLXJlc3VsdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sVUFBVTtDQUd0QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBdXRoUmVzdWx0IHtcclxuICBhY2Nlc3NfdG9rZW4hOiBzdHJpbmc7XHJcbiAgcmVmcmVzaF90b2tlbiE6IHN0cmluZztcclxufVxyXG4iXX0=
@@ -1,6 +0,0 @@
1
- export class FederatedLoginRequest {
2
- constructor() {
3
- this.rememberMe = false;
4
- }
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVkZXJhdGVkLWxvZ2luLXJlcXVlc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9hdXRoL21vZGVscy9mZWRlcmF0ZWQtbG9naW4tcmVxdWVzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8scUJBQXFCO0lBQWxDO1FBRUUsZUFBVSxHQUFhLEtBQUssQ0FBQztJQUUvQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9naW5SZXF1ZXN0IHtcclxuICBhY2Nlc3NUb2tlbiE6IHN0cmluZztcclxuICByZW1lbWJlck1lPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxpY2Vuc2U/OiBzdHJpbmc7XHJcbn1cclxuIl19
@@ -1,6 +0,0 @@
1
- export class LoginRequest {
2
- constructor() {
3
- this.rememberMe = false;
4
- }
5
- }
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVxdWVzdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9jb3JlL2F1dGgvbW9kZWxzL2xvZ2luLXJlcXVlc3QubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFHRSxlQUFVLEdBQWEsS0FBSyxDQUFDO0lBRS9CLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMb2dpblJlcXVlc3Qge1xyXG4gIHVzZXJuYW1lITogc3RyaW5nO1xyXG4gIHBhc3N3b3JkITogc3RyaW5nO1xyXG4gIHJlbWVtYmVyTWU/OiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGljZW5zZT86IHN0cmluZztcclxufVxyXG4iXX0=
@@ -1,110 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import * as CryptoJS from 'crypto-js';
3
- import Logger from '../utils/logger.service';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../services/core-config.service";
6
- export class StorageService {
7
- get storageKey() {
8
- return this.coreConfig.storageKey;
9
- }
10
- get secretKey() {
11
- return this.coreConfig.secretKey;
12
- }
13
- constructor(coreConfig) {
14
- this.coreConfig = coreConfig;
15
- // Determine initial storage
16
- // If session storage has data, use it (implies remember me was false)
17
- // Otherwise default/fallback to local storage
18
- if (sessionStorage.getItem(this.storageKey)) {
19
- this.storage = sessionStorage;
20
- }
21
- else {
22
- this.storage = localStorage;
23
- }
24
- }
25
- setRememberMe(rememberMe) {
26
- const currentData = this.storage.getItem(this.storageKey);
27
- const targetStorage = rememberMe ? localStorage : sessionStorage;
28
- // If storage type is changing, move data
29
- if (this.storage !== targetStorage) {
30
- if (currentData) {
31
- targetStorage.setItem(this.storageKey, currentData);
32
- this.storage.removeItem(this.storageKey);
33
- }
34
- this.storage = targetStorage;
35
- }
36
- }
37
- set(key, value) {
38
- const data = this.storage.getItem(this.storageKey);
39
- let dataJson = {};
40
- if (data) {
41
- const dataDec = this.decrypt(data);
42
- if (dataDec) {
43
- dataJson = JSON.parse(dataDec);
44
- }
45
- }
46
- dataJson = Object.assign(dataJson, { [key]: value });
47
- this.storage.setItem(this.storageKey, this.encrypt(JSON.stringify(dataJson)));
48
- }
49
- get(key) {
50
- const data = this.storage.getItem(this.storageKey);
51
- if (data) {
52
- const dataDec = this.decrypt(data);
53
- if (dataDec) {
54
- try {
55
- const dataJson = JSON.parse(dataDec);
56
- return dataJson[key] || null;
57
- }
58
- catch (e) {
59
- Logger.error('[TokenStorage] Failed to parse decrypted data, clearing corrupt storage:', e);
60
- this.clear();
61
- return null;
62
- }
63
- }
64
- else {
65
- // Decrypt failed, auto-clear corrupt storage
66
- Logger.error('[TokenStorage] Decrypt failed, clearing corrupt storage');
67
- this.clear();
68
- }
69
- }
70
- return null;
71
- }
72
- /**
73
- * Check if storage is valid (can be decrypted) without side effects
74
- */
75
- isValid() {
76
- const data = this.storage.getItem(this.storageKey);
77
- if (!data)
78
- return false;
79
- const decrypted = this.decrypt(data);
80
- return decrypted !== null && decrypted !== '';
81
- }
82
- clear() {
83
- // Clear both to be safe
84
- localStorage.removeItem(this.storageKey);
85
- sessionStorage.removeItem(this.storageKey);
86
- }
87
- encrypt(value) {
88
- return CryptoJS.AES.encrypt(value, this.secretKey).toString();
89
- }
90
- decrypt(value) {
91
- try {
92
- const bytes = CryptoJS.AES.decrypt(value, this.secretKey);
93
- const decrypted = bytes.toString(CryptoJS.enc.Utf8);
94
- return decrypted || null;
95
- }
96
- catch (e) {
97
- Logger.error('[TokenStorage] Decryption error:', e);
98
- return null;
99
- }
100
- }
101
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StorageService, deps: [{ token: i1.CoreConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
102
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StorageService, providedIn: 'root' }); }
103
- }
104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: StorageService, decorators: [{
105
- type: Injectable,
106
- args: [{
107
- providedIn: 'root',
108
- }]
109
- }], ctorParameters: () => [{ type: i1.CoreConfigService }] });
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2NvcmUvYXV0aC9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLE1BQU0sTUFBTSx5QkFBeUIsQ0FBQzs7O0FBSzdDLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7SUFDbkMsQ0FBQztJQUlELFlBQW9CLFVBQTZCO1FBQTdCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQy9DLDRCQUE0QjtRQUM1QixzRUFBc0U7UUFDdEUsOENBQThDO1FBQzlDLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUM7U0FDL0I7YUFBTTtZQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFtQjtRQUMvQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztRQUVqRSx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGFBQWEsRUFBRTtZQUNsQyxJQUFJ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RSxDQUFDO0lBRU8sT0FBTyxDQUFDLEtBQWE7UUFDM0IsSUFBSTtZQUNGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE9BQU8sU0FBUyxJQUFJLElBQUksQ0FBQztTQUMxQjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwRCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQzsrR0F2R1UsY0FBYzttSEFBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIENyeXB0b0pTIGZyb20gJ2NyeXB0by1qcyc7XHJcbmltcG9ydCB7IENvcmVDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29yZS1jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VTZXJ2aWNlIHtcclxuICBnZXQgc3RvcmFnZUtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zdG9yYWdlS2V5O1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNlY3JldEtleSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29yZUNvbmZpZy5zZWNyZXRLZXk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29yZUNvbmZpZzogQ29yZUNvbmZpZ1NlcnZpY2UpIHtcclxuICAgIC8vIERldGVybWluZSBpbml0aWFsIHN0b3JhZ2VcclxuICAgIC8vIElmIHNlc3Npb24gc3RvcmFnZSBoYXMgZGF0YSwgdXNlIGl0IChpbXBsaWVzIHJlbWVtYmVyIG1lIHdhcyBmYWxzZSlcclxuICAgIC8vIE90aGVyd2lzZSBkZWZhdWx0L2ZhbGxiYWNrIHRvIGxvY2FsIHN0b3JhZ2VcclxuICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSkpIHtcclxuICAgICAgdGhpcy5zdG9yYWdlID0gc2Vzc2lvblN0b3JhZ2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXRSZW1lbWJlck1lKHJlbWVtYmVyTWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IGN1cnJlbnREYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcclxuICAgIGNvbnN0IHRhcmdldFN0b3JhZ2UgPSByZW1lbWJlck1lID8gbG9jYWxTdG9yYWdlIDogc2Vzc2lvblN0b3JhZ2U7XHJcblxyXG4gICAgLy8gSWYgc3RvcmFnZSB0eXBlIGlzIGNoYW5naW5nLCBtb3ZlIGRhdGFcclxuICAgIGlmICh0aGlzLnN0b3JhZ2UgIT09IHRhcmdldFN0b3JhZ2UpIHtcclxuICAgICAgaWYgKGN1cnJlbnREYXRhKSB7XHJcbiAgICAgICAgdGFyZ2V0U3RvcmFnZS5zZXRJdGVtKHRoaXMuc3RvcmFnZUtleSwgY3VycmVudERhdGEpO1xyXG4gICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zdG9yYWdlID0gdGFyZ2V0U3RvcmFnZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgICBsZXQgZGF0YUpzb246IGFueSA9IHt9O1xyXG4gICAgaWYgKGRhdGEpIHtcclxuICAgICAgY29uc3QgZGF0YURlYyA9IHRoaXMuZGVjcnlwdChkYXRhKTtcclxuICAgICAgaWYgKGRhdGFEZWMpIHtcclxuICAgICAgICBkYXRhSnNvbiA9IEpTT04ucGFyc2UoZGF0YURlYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGRhdGFKc29uID0gT2JqZWN0LmFzc2lnbihkYXRhSnNvbiwgeyBba2V5XTogdmFsdWUgfSk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXksIHRoaXMuZW5jcnlwdChKU09OLnN0cmluZ2lmeShkYXRhSnNvbikpKTtcclxuICB9XHJcblxyXG4gIGdldChrZXk6IHN0cmluZyk6IGFueSB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcclxuICAgIGlmIChkYXRhKSB7XHJcbiAgICAgIGNvbnN0IGRhdGFEZWMgPSB0aGlzLmRlY3J5cHQoZGF0YSk7XHJcbiAgICAgIGlmIChkYXRhRGVjKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGRhdGFKc29uID0gSlNPTi5wYXJzZShkYXRhRGVjKTtcclxuICAgICAgICAgIHJldHVybiBkYXRhSnNvbiFba2V5XSB8fCBudWxsO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIExvZ2dlci5lcnJvcihcclxuICAgICAgICAgICAgJ1tUb2tlblN0b3JhZ2VdIEZhaWxlZCB0byBwYXJzZSBkZWNyeXB0ZWQgZGF0YSwgY2xlYXJpbmcgY29ycnVwdCBzdG9yYWdlOicsXHJcbiAgICAgICAgICAgIGUsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIERlY3J5cHQgZmFpbGVkLCBhdXRvLWNsZWFyIGNvcnJ1cHQgc3RvcmFnZVxyXG4gICAgICAgIExvZ2dlci5lcnJvcignW1Rva2VuU3RvcmFnZV0gRGVjcnlwdCBmYWlsZWQsIGNsZWFyaW5nIGNvcnJ1cHQgc3RvcmFnZScpO1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBzdG9yYWdlIGlzIHZhbGlkIChjYW4gYmUgZGVjcnlwdGVkKSB3aXRob3V0IHNpZGUgZWZmZWN0c1xyXG4gICAqL1xyXG4gIGlzVmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlS2V5KTtcclxuICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgZGVjcnlwdGVkID0gdGhpcy5kZWNyeXB0KGRhdGEpO1xyXG4gICAgcmV0dXJuIGRlY3J5cHRlZCAhPT0gbnVsbCAmJiBkZWNyeXB0ZWQgIT09ICcnO1xyXG4gIH1cclxuXHJcbiAgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAvLyBDbGVhciBib3RoIHRvIGJlIHNhZmVcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuc3RvcmFnZUtleSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVuY3J5cHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gQ3J5cHRvSlMuQUVTLmVuY3J5cHQodmFsdWUsIHRoaXMuc2VjcmV0S2V5KS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWNyeXB0KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGJ5dGVzID0gQ3J5cHRvSlMuQUVTLmRlY3J5cHQodmFsdWUsIHRoaXMuc2VjcmV0S2V5KTtcclxuICAgICAgY29uc3QgZGVjcnlwdGVkID0gYnl0ZXMudG9TdHJpbmcoQ3J5cHRvSlMuZW5jLlV0ZjgpO1xyXG4gICAgICByZXR1cm4gZGVjcnlwdGVkIHx8IG51bGw7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIExvZ2dlci5lcnJvcignW1Rva2VuU3RvcmFnZV0gRGVjcnlwdGlvbiBlcnJvcjonLCBlKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==