@aakash58/chatbot 1.1.21 → 1.1.24
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.
- package/README.md +22 -298
- package/esm2022/aakash58-chatbot.mjs +5 -0
- package/esm2022/lib/app/chat/chat-ui-state.service.mjs +170 -0
- package/esm2022/lib/app/chat/chat.service.mjs +445 -0
- package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +50 -0
- package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +12 -0
- package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +66 -0
- package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +186 -0
- package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +312 -0
- package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +36 -0
- package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +115 -0
- package/esm2022/lib/app/chat/model/chat-history.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-request.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-response.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-session.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +2 -0
- package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +2 -0
- package/esm2022/lib/app/chat/services/chat-api.service.mjs +61 -0
- package/esm2022/lib/app/chat/services/chat-audio.service.mjs +50 -0
- package/esm2022/lib/app/chat/services/chat-history.service.mjs +252 -0
- package/esm2022/lib/app/login/login-form.component.mjs +46 -0
- package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +194 -0
- package/esm2022/lib/app/personalization/personalization.service.mjs +149 -0
- package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +122 -0
- package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +86 -0
- package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +115 -0
- package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +29 -0
- package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +30 -0
- package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +12 -0
- package/esm2022/lib/constant/doohbot-constant.mjs +28 -0
- package/esm2022/lib/constant/html-entities.mjs +9 -0
- package/esm2022/lib/constant/utf8.mjs +10 -0
- package/esm2022/lib/core/app-const.mjs +61 -0
- package/esm2022/lib/core/auth/account-api.service.mjs +40 -0
- package/esm2022/lib/core/auth/auth.service.mjs +391 -0
- package/esm2022/lib/core/auth/models/auth-result.model.mjs +3 -0
- package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +6 -0
- package/esm2022/lib/core/auth/models/login-request.model.mjs +6 -0
- package/esm2022/lib/core/auth/storage.service.mjs +110 -0
- package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +112 -0
- package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +55 -0
- package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +179 -0
- package/esm2022/lib/core/environments/environment.mjs +15 -0
- package/esm2022/lib/core/environments/environment.prod.mjs +15 -0
- package/esm2022/lib/core/helpers/crypto-helper.service.mjs +52 -0
- package/esm2022/lib/core/http/http-stream.service.mjs +97 -0
- package/esm2022/lib/core/http/http.service.mjs +103 -0
- package/esm2022/lib/core/interceptors/auth.interceptor.mjs +96 -0
- package/esm2022/lib/core/interceptors/license.interceptor.mjs +44 -0
- package/esm2022/lib/core/models/api-config.model.mjs +18 -0
- package/esm2022/lib/core/models/api-request.model.mjs +2 -0
- package/esm2022/lib/core/models/api-response.model.mjs +8 -0
- package/esm2022/lib/core/models/doohbot-config.model.mjs +18 -0
- package/esm2022/lib/core/models/license.model.mjs +2 -0
- package/esm2022/lib/core/models/message.mjs +2 -0
- package/esm2022/lib/core/models/theme-config.model.mjs +2 -0
- package/esm2022/lib/core/services/core-config.service.mjs +52 -0
- package/esm2022/lib/core/services/license.service.mjs +145 -0
- package/esm2022/lib/core/services/markdown.service.mjs +64 -0
- package/esm2022/lib/core/services/theme.service.mjs +248 -0
- package/esm2022/lib/core/types/auth-mode.type.mjs +2 -0
- package/esm2022/lib/core/types/auth-status.type.mjs +5 -0
- package/esm2022/lib/core/types/chat-stream.type.mjs +2 -0
- package/esm2022/lib/core/types/message-role.type.mjs +2 -0
- package/esm2022/lib/core/types/prompt-mode.type.mjs +5 -0
- package/esm2022/lib/core/types/snackbar-error.type.mjs +5 -0
- package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +2 -0
- package/esm2022/lib/core/utils/logger.service.mjs +42 -0
- package/esm2022/lib/doohbot-input.mjs +20 -0
- package/esm2022/lib/doohbot.component.mjs +444 -0
- package/esm2022/lib/predefined_messages.mjs +15 -0
- package/esm2022/lib/shared/chips/chips.component.mjs +28 -0
- package/esm2022/lib/shared/dialog/dialog.component.mjs +36 -0
- package/esm2022/lib/shared/dialog/dialog.service.mjs +64 -0
- package/esm2022/lib/shared/dialog/dialog.utils.mjs +85 -0
- package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +29 -0
- package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +38 -0
- package/esm2022/lib/shared/menu-item/menu-item.component.mjs +24 -0
- package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +27 -0
- package/esm2022/lib/shared/snackbar/snackbar.component.mjs +43 -0
- package/esm2022/lib/shared/snackbar/snackbar.service.mjs +46 -0
- package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +43 -0
- package/esm2022/public-api.mjs +37 -0
- package/fesm2022/aakash58-chatbot.mjs +5193 -0
- package/fesm2022/aakash58-chatbot.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/app/chat/chat-ui-state.service.d.ts +96 -0
- package/lib/app/chat/chat.service.d.ts +88 -0
- package/lib/app/chat/components/chat-button/chat-button.component.d.ts +16 -0
- package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +5 -0
- package/lib/app/chat/components/chat-header/chat-header.component.d.ts +24 -0
- package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +49 -0
- package/lib/app/chat/components/chat-window/chat-window.component.d.ts +107 -0
- package/lib/app/chat/components/message-input/message-input.component.d.ts +12 -0
- package/lib/app/chat/components/message-list/message-list.component.d.ts +40 -0
- package/lib/app/chat/model/chat-history.model.d.ts +51 -0
- package/lib/app/chat/model/chat-request.model.d.ts +10 -0
- package/lib/app/chat/model/chat-response.model.d.ts +9 -0
- package/lib/app/chat/model/chat-session.model.d.ts +12 -0
- package/{projects/doohbot/src/lib/app/chat/model/chat-stream-message.model.ts → lib/app/chat/model/chat-stream-message.model.d.ts} +5 -6
- package/lib/app/chat/model/chat-stream-response.model.d.ts +10 -0
- package/lib/app/chat/services/chat-api.service.d.ts +30 -0
- package/lib/app/chat/services/chat-audio.service.d.ts +19 -0
- package/lib/app/chat/services/chat-history.service.d.ts +53 -0
- package/lib/app/login/login-form.component.d.ts +20 -0
- package/lib/app/personalization/personalization-dialog.component.d.ts +53 -0
- package/lib/app/personalization/personalization.service.d.ts +66 -0
- package/lib/app/personalization/sections/account/account-section.component.d.ts +30 -0
- package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +17 -0
- package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +27 -0
- package/lib/app/personalization/sections/profile/profile-section.component.d.ts +17 -0
- package/lib/app/personalization/sections/settings/setting-section.component.d.ts +10 -0
- package/lib/app/personalization/sections/terms/terms-section.component.d.ts +5 -0
- package/lib/constant/doohbot-constant.d.ts +12 -0
- package/lib/constant/html-entities.d.ts +8 -0
- package/lib/constant/utf8.d.ts +9 -0
- package/lib/core/app-const.d.ts +11 -0
- package/lib/core/auth/account-api.service.d.ts +20 -0
- package/lib/core/auth/auth.service.d.ts +90 -0
- package/lib/core/auth/models/auth-result.model.d.ts +4 -0
- package/lib/core/auth/models/federated-login-request.model.d.ts +5 -0
- package/lib/core/auth/models/login-request.model.d.ts +6 -0
- package/lib/core/auth/storage.service.d.ts +21 -0
- package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +23 -0
- package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +14 -0
- package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +30 -0
- package/lib/core/environments/environment.d.ts +7 -0
- package/lib/core/environments/environment.prod.d.ts +7 -0
- package/lib/core/helpers/crypto-helper.service.d.ts +12 -0
- package/lib/core/http/http-stream.service.d.ts +18 -0
- package/lib/core/http/http.service.d.ts +20 -0
- package/lib/core/interceptors/auth.interceptor.d.ts +18 -0
- package/lib/core/interceptors/license.interceptor.d.ts +11 -0
- package/lib/core/models/api-config.model.d.ts +58 -0
- package/lib/core/models/api-request.model.d.ts +77 -0
- package/lib/core/models/api-response.model.d.ts +6 -0
- package/lib/core/models/doohbot-config.model.d.ts +81 -0
- package/{projects/doohbot/src/lib/core/models/license.model.ts → lib/core/models/license.model.d.ts} +23 -27
- package/lib/core/models/message.d.ts +16 -0
- package/lib/core/models/theme-config.model.d.ts +28 -0
- package/lib/core/services/core-config.service.d.ts +23 -0
- package/lib/core/services/license.service.d.ts +33 -0
- package/lib/core/services/markdown.service.d.ts +8 -0
- package/lib/core/services/theme.service.d.ts +40 -0
- package/{projects/doohbot/src/lib/core/types/auth-mode.type.ts → lib/core/types/auth-mode.type.d.ts} +4 -4
- package/{projects/doohbot/src/lib/core/types/auth-status.type.ts → lib/core/types/auth-status.type.d.ts} +4 -5
- package/{projects/doohbot/src/lib/core/types/chat-stream.type.ts → lib/core/types/chat-stream.type.d.ts} +4 -4
- package/{projects/doohbot/src/lib/core/types/message-role.type.ts → lib/core/types/message-role.type.d.ts} +4 -4
- package/{projects/doohbot/src/lib/core/types/prompt-mode.type.ts → lib/core/types/prompt-mode.type.d.ts} +4 -5
- package/{projects/doohbot/src/lib/core/types/snackbar-error.type.ts → lib/core/types/snackbar-error.type.d.ts} +4 -5
- package/{projects/doohbot/src/lib/core/types/tenant-resolution-strategy.type.ts → lib/core/types/tenant-resolution-strategy.type.d.ts} +4 -4
- package/lib/core/utils/logger.service.d.ts +11 -0
- package/lib/doohbot-input.d.ts +19 -0
- package/lib/doohbot.component.d.ts +108 -0
- package/lib/predefined_messages.d.ts +2 -0
- package/lib/shared/chips/chips.component.d.ts +10 -0
- package/lib/shared/dialog/dialog.component.d.ts +19 -0
- package/lib/shared/dialog/dialog.service.d.ts +29 -0
- package/lib/shared/dialog/dialog.utils.d.ts +41 -0
- package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +11 -0
- package/lib/shared/input-dialog/input-dialog.component.d.ts +20 -0
- package/lib/shared/menu-item/menu-item.component.d.ts +9 -0
- package/lib/shared/pipes/simple-markdown.pipe.d.ts +10 -0
- package/lib/shared/snackbar/snackbar.component.d.ts +14 -0
- package/lib/shared/snackbar/snackbar.service.d.ts +19 -0
- package/{projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts → lib/shared/snackbar/snackbar.utils.d.ts} +33 -49
- package/package.json +29 -75
- package/public-api.d.ts +11 -0
- package/.editorconfig +0 -17
- package/.vscode/extensions.json +0 -4
- package/.vscode/launch.json +0 -41
- package/.vscode/settings.json +0 -14
- package/.vscode/tasks.json +0 -60
- package/angular.json +0 -132
- package/docs/PUBLISHING_GUIDE.md +0 -104
- package/projects/app-doohbot/public/assets/const/app-const.json +0 -15
- package/projects/app-doohbot/public/assets/const/doohclick_license.json +0 -6
- package/projects/app-doohbot/public/favicon.ico +0 -0
- package/projects/app-doohbot/src/app/app.config.ts +0 -13
- package/projects/app-doohbot/src/app/app.html +0 -31
- package/projects/app-doohbot/src/app/app.routes.ts +0 -3
- package/projects/app-doohbot/src/app/app.scss +0 -279
- package/projects/app-doohbot/src/app/app.spec.ts +0 -23
- package/projects/app-doohbot/src/app/app.ts +0 -72
- package/projects/app-doohbot/src/index.html +0 -15
- package/projects/app-doohbot/src/main.ts +0 -6
- package/projects/app-doohbot/src/styles.scss +0 -15
- package/projects/app-doohbot/tsconfig.app.json +0 -15
- package/projects/app-doohbot/tsconfig.spec.json +0 -14
- package/projects/doohbot/README.md +0 -64
- package/projects/doohbot/docs/README.md +0 -140
- package/projects/doohbot/ng-package.json +0 -10
- package/projects/doohbot/package.json +0 -16
- package/projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts +0 -194
- package/projects/doohbot/src/lib/app/chat/chat.service.ts +0 -547
- package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html +0 -27
- package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.scss +0 -115
- package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts +0 -35
- package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html +0 -3
- package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.scss +0 -20
- package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts +0 -12
- package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html +0 -34
- package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.scss +0 -78
- package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts +0 -52
- package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html +0 -77
- package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.scss +0 -346
- package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts +0 -188
- package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html +0 -146
- package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.scss +0 -187
- package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts +0 -256
- package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html +0 -17
- package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.scss +0 -59
- package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts +0 -28
- package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html +0 -138
- package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.scss +0 -436
- package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts +0 -106
- package/projects/doohbot/src/lib/app/chat/model/chat-history.model.ts +0 -57
- package/projects/doohbot/src/lib/app/chat/model/chat-request.model.ts +0 -17
- package/projects/doohbot/src/lib/app/chat/model/chat-response.model.ts +0 -9
- package/projects/doohbot/src/lib/app/chat/model/chat-session.model.ts +0 -14
- package/projects/doohbot/src/lib/app/chat/model/chat-stream-response.model.ts +0 -12
- package/projects/doohbot/src/lib/app/chat/services/chat-api.service.ts +0 -82
- package/projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts +0 -44
- package/projects/doohbot/src/lib/app/chat/services/chat-history.service.ts +0 -303
- package/projects/doohbot/src/lib/app/login/login-form.component.html +0 -80
- package/projects/doohbot/src/lib/app/login/login-form.component.scss +0 -189
- package/projects/doohbot/src/lib/app/login/login-form.component.ts +0 -45
- package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html +0 -81
- package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.scss +0 -179
- package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts +0 -217
- package/projects/doohbot/src/lib/app/personalization/personalization.service.ts +0 -197
- package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html +0 -111
- package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.scss +0 -218
- package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts +0 -121
- package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.html +0 -46
- package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.scss +0 -138
- package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.ts +0 -28
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts +0 -92
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html +0 -198
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.scss +0 -107
- package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts +0 -103
- package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html +0 -46
- package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.scss +0 -131
- package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts +0 -23
- package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html +0 -33
- package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.scss +0 -61
- package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts +0 -20
- package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html +0 -30
- package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.scss +0 -59
- package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts +0 -12
- package/projects/doohbot/src/lib/constant/doohbot-constant.ts +0 -40
- package/projects/doohbot/src/lib/constant/html-entities.ts +0 -8
- package/projects/doohbot/src/lib/constant/utf8.ts +0 -9
- package/projects/doohbot/src/lib/core/app-const.ts +0 -63
- package/projects/doohbot/src/lib/core/auth/account-api.service.ts +0 -53
- package/projects/doohbot/src/lib/core/auth/auth.service.ts +0 -478
- package/projects/doohbot/src/lib/core/auth/models/auth-result.model.ts +0 -4
- package/projects/doohbot/src/lib/core/auth/models/federated-login-request.model.ts +0 -5
- package/projects/doohbot/src/lib/core/auth/models/login-request.model.ts +0 -6
- package/projects/doohbot/src/lib/core/auth/storage.service.ts +0 -113
- package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts +0 -123
- package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.module.ts +0 -9
- package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts +0 -58
- package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.module.ts +0 -9
- package/projects/doohbot/src/lib/core/directives/popout/popout.directive.ts +0 -169
- package/projects/doohbot/src/lib/core/directives/popout/popout.module.ts +0 -9
- package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts +0 -197
- package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.module.ts +0 -9
- package/projects/doohbot/src/lib/core/enums/api-request-state.enum.ts +0 -9
- package/projects/doohbot/src/lib/core/environments/environment.prod.ts +0 -14
- package/projects/doohbot/src/lib/core/environments/environment.ts +0 -14
- package/projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts +0 -72
- package/projects/doohbot/src/lib/core/http/http-stream.service.ts +0 -105
- package/projects/doohbot/src/lib/core/http/http.service.ts +0 -148
- package/projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts +0 -118
- package/projects/doohbot/src/lib/core/interceptors/license.interceptor.ts +0 -50
- package/projects/doohbot/src/lib/core/models/api-config.model.ts +0 -82
- package/projects/doohbot/src/lib/core/models/api-request.model.ts +0 -92
- package/projects/doohbot/src/lib/core/models/api-response.model.ts +0 -13
- package/projects/doohbot/src/lib/core/models/doohbot-config.model.ts +0 -109
- package/projects/doohbot/src/lib/core/models/message.ts +0 -18
- package/projects/doohbot/src/lib/core/models/theme-config.model.ts +0 -48
- package/projects/doohbot/src/lib/core/services/core-config.service.ts +0 -53
- package/projects/doohbot/src/lib/core/services/doohbot-api.service.ts +0 -207
- package/projects/doohbot/src/lib/core/services/license.service.ts +0 -171
- package/projects/doohbot/src/lib/core/services/markdown.service.ts +0 -73
- package/projects/doohbot/src/lib/core/services/theme.service.ts +0 -305
- package/projects/doohbot/src/lib/core/utils/error-handler.util.ts +0 -31
- package/projects/doohbot/src/lib/core/utils/logger.service.ts +0 -45
- package/projects/doohbot/src/lib/doohbot-input.ts +0 -19
- package/projects/doohbot/src/lib/doohbot.component.html +0 -34
- package/projects/doohbot/src/lib/doohbot.component.scss +0 -17
- package/projects/doohbot/src/lib/doohbot.component.spec.ts +0 -31
- package/projects/doohbot/src/lib/doohbot.component.ts +0 -545
- package/projects/doohbot/src/lib/elements.ts +0 -25
- package/projects/doohbot/src/lib/predefined_messages.ts +0 -14
- package/projects/doohbot/src/lib/shared/chips/chips.component.html +0 -9
- package/projects/doohbot/src/lib/shared/chips/chips.component.scss +0 -29
- package/projects/doohbot/src/lib/shared/chips/chips.component.spec.ts +0 -22
- package/projects/doohbot/src/lib/shared/chips/chips.component.ts +0 -20
- package/projects/doohbot/src/lib/shared/dialog/dialog.component.html +0 -29
- package/projects/doohbot/src/lib/shared/dialog/dialog.component.scss +0 -100
- package/projects/doohbot/src/lib/shared/dialog/dialog.component.ts +0 -42
- package/projects/doohbot/src/lib/shared/dialog/dialog.service.ts +0 -62
- package/projects/doohbot/src/lib/shared/dialog/dialog.utils.ts +0 -102
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html +0 -30
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.scss +0 -53
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.spec.ts +0 -22
- package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts +0 -35
- package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html +0 -16
- package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.scss +0 -45
- package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts +0 -46
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.html +0 -5
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.scss +0 -0
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.spec.ts +0 -22
- package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts +0 -20
- package/projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts +0 -19
- package/projects/doohbot/src/lib/shared/popout/popout.html +0 -1
- package/projects/doohbot/src/lib/shared/popout/popout.scss +0 -0
- package/projects/doohbot/src/lib/shared/popout/popout.spec.ts +0 -23
- package/projects/doohbot/src/lib/shared/popout/popout.ts +0 -11
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.html +0 -7
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.scss +0 -125
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.spec.ts +0 -21
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts +0 -44
- package/projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts +0 -54
- package/projects/doohbot/src/lib/styles/_theme.scss +0 -132
- package/projects/doohbot/src/lib/styles/material-override.scss +0 -302
- package/projects/doohbot/src/lib/styles/utility.scss +0 -588
- package/projects/doohbot/src/public-api.ts +0 -42
- package/projects/doohbot/tsconfig.lib.json +0 -15
- package/projects/doohbot/tsconfig.lib.prod.json +0 -11
- package/projects/doohbot/tsconfig.spec.json +0 -10
- package/proxy.conf.json +0 -8
- package/publish.config.js +0 -25
- package/scripts/publishing/index.ts +0 -67
- package/scripts/publishing/pipeline/01-clean.ts +0 -11
- package/scripts/publishing/pipeline/02-validate-pre.ts +0 -8
- package/scripts/publishing/pipeline/03-build.ts +0 -7
- package/scripts/publishing/pipeline/04-validate-post.ts +0 -8
- package/scripts/publishing/pipeline/05-prepare-package.ts +0 -29
- package/scripts/publishing/pipeline/06-version.ts +0 -23
- package/scripts/publishing/pipeline/07-publish.ts +0 -14
- package/scripts/publishing/pipeline/08-cleanup.ts +0 -5
- package/scripts/publishing/types.ts +0 -36
- package/scripts/publishing/utils/command.ts +0 -15
- package/scripts/publishing/utils/config.ts +0 -17
- package/scripts/validate.ts +0 -166
- package/tsconfig.json +0 -45
- package/tsconfig.scripts.json +0 -15
- /package/{projects/doohbot/src → src}/assets/bot.mp3 +0 -0
|
@@ -0,0 +1,391 @@
|
|
|
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
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export class AuthResult {
|
|
2
|
+
}
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1yZXN1bHQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9hdXRoL21vZGVscy9hdXRoLXJlc3VsdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sVUFBVTtDQUd0QiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBBdXRoUmVzdWx0IHtcclxuICBhY2Nlc3NfdG9rZW4hOiBzdHJpbmc7XHJcbiAgcmVmcmVzaF90b2tlbiE6IHN0cmluZztcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class FederatedLoginRequest {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.rememberMe = false;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmVkZXJhdGVkLWxvZ2luLXJlcXVlc3QubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvY29yZS9hdXRoL21vZGVscy9mZWRlcmF0ZWQtbG9naW4tcmVxdWVzdC5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8scUJBQXFCO0lBQWxDO1FBRUUsZUFBVSxHQUFhLEtBQUssQ0FBQztJQUUvQixDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgRmVkZXJhdGVkTG9naW5SZXF1ZXN0IHtcclxuICBhY2Nlc3NUb2tlbiE6IHN0cmluZztcclxuICByZW1lbWJlck1lPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGxpY2Vuc2U/OiBzdHJpbmc7XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export class LoginRequest {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.rememberMe = false;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tcmVxdWVzdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rvb2hib3Qvc3JjL2xpYi9jb3JlL2F1dGgvbW9kZWxzL2xvZ2luLXJlcXVlc3QubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFHRSxlQUFVLEdBQWEsS0FBSyxDQUFDO0lBRS9CLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBMb2dpblJlcXVlc3Qge1xyXG4gIHVzZXJuYW1lITogc3RyaW5nO1xyXG4gIHBhc3N3b3JkITogc3RyaW5nO1xyXG4gIHJlbWVtYmVyTWU/OiBib29sZWFuID0gZmFsc2U7XHJcbiAgbGljZW5zZT86IHN0cmluZztcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,110 @@
|
|
|
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==
|