@aakash58/chatbot 1.1.19 → 1.1.21

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 (351) hide show
  1. package/.editorconfig +17 -0
  2. package/.vscode/extensions.json +4 -0
  3. package/.vscode/launch.json +41 -0
  4. package/.vscode/settings.json +14 -0
  5. package/.vscode/tasks.json +60 -0
  6. package/README.md +298 -22
  7. package/angular.json +132 -0
  8. package/docs/PUBLISHING_GUIDE.md +104 -0
  9. package/package.json +75 -29
  10. package/projects/app-doohbot/public/assets/const/app-const.json +15 -0
  11. package/projects/app-doohbot/public/assets/const/doohclick_license.json +6 -0
  12. package/projects/app-doohbot/public/favicon.ico +0 -0
  13. package/projects/app-doohbot/src/app/app.config.ts +13 -0
  14. package/projects/app-doohbot/src/app/app.html +31 -0
  15. package/projects/app-doohbot/src/app/app.routes.ts +3 -0
  16. package/projects/app-doohbot/src/app/app.scss +279 -0
  17. package/projects/app-doohbot/src/app/app.spec.ts +23 -0
  18. package/projects/app-doohbot/src/app/app.ts +72 -0
  19. package/projects/app-doohbot/src/index.html +15 -0
  20. package/projects/app-doohbot/src/main.ts +6 -0
  21. package/projects/app-doohbot/src/styles.scss +15 -0
  22. package/projects/app-doohbot/tsconfig.app.json +15 -0
  23. package/projects/app-doohbot/tsconfig.spec.json +14 -0
  24. package/projects/doohbot/README.md +64 -0
  25. package/projects/doohbot/docs/README.md +140 -0
  26. package/projects/doohbot/ng-package.json +10 -0
  27. package/projects/doohbot/package.json +16 -0
  28. package/projects/doohbot/src/lib/app/chat/chat-ui-state.service.ts +194 -0
  29. package/projects/doohbot/src/lib/app/chat/chat.service.ts +547 -0
  30. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.html +27 -0
  31. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.scss +115 -0
  32. package/projects/doohbot/src/lib/app/chat/components/chat-button/chat-button.component.ts +35 -0
  33. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.html +3 -0
  34. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.scss +20 -0
  35. package/projects/doohbot/src/lib/app/chat/components/chat-footer/chat-footer.component.ts +12 -0
  36. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.html +34 -0
  37. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.scss +78 -0
  38. package/projects/doohbot/src/lib/app/chat/components/chat-header/chat-header.component.ts +52 -0
  39. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.html +77 -0
  40. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.scss +346 -0
  41. package/projects/doohbot/src/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.ts +188 -0
  42. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.html +146 -0
  43. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.scss +187 -0
  44. package/projects/doohbot/src/lib/app/chat/components/chat-window/chat-window.component.ts +256 -0
  45. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.html +17 -0
  46. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.scss +59 -0
  47. package/projects/doohbot/src/lib/app/chat/components/message-input/message-input.component.ts +28 -0
  48. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.html +138 -0
  49. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.scss +436 -0
  50. package/projects/doohbot/src/lib/app/chat/components/message-list/message-list.component.ts +106 -0
  51. package/projects/doohbot/src/lib/app/chat/model/chat-history.model.ts +57 -0
  52. package/projects/doohbot/src/lib/app/chat/model/chat-request.model.ts +17 -0
  53. package/projects/doohbot/src/lib/app/chat/model/chat-response.model.ts +9 -0
  54. package/projects/doohbot/src/lib/app/chat/model/chat-session.model.ts +14 -0
  55. package/{lib/app/chat/model/chat-stream-message.model.d.ts → projects/doohbot/src/lib/app/chat/model/chat-stream-message.model.ts} +6 -5
  56. package/projects/doohbot/src/lib/app/chat/model/chat-stream-response.model.ts +12 -0
  57. package/projects/doohbot/src/lib/app/chat/services/chat-api.service.ts +82 -0
  58. package/projects/doohbot/src/lib/app/chat/services/chat-audio.service.ts +44 -0
  59. package/projects/doohbot/src/lib/app/chat/services/chat-history.service.ts +303 -0
  60. package/projects/doohbot/src/lib/app/login/login-form.component.html +80 -0
  61. package/projects/doohbot/src/lib/app/login/login-form.component.scss +189 -0
  62. package/projects/doohbot/src/lib/app/login/login-form.component.ts +45 -0
  63. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.html +81 -0
  64. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.scss +179 -0
  65. package/projects/doohbot/src/lib/app/personalization/personalization-dialog.component.ts +217 -0
  66. package/projects/doohbot/src/lib/app/personalization/personalization.service.ts +197 -0
  67. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.html +111 -0
  68. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.scss +218 -0
  69. package/projects/doohbot/src/lib/app/personalization/sections/account/account-section.component.ts +121 -0
  70. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.html +46 -0
  71. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.scss +138 -0
  72. package/projects/doohbot/src/lib/app/personalization/sections/instructions/instructions-section.component.ts +28 -0
  73. package/projects/doohbot/src/lib/app/personalization/sections/preferences/color-picker-dialog.component.ts +92 -0
  74. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.html +198 -0
  75. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.scss +107 -0
  76. package/projects/doohbot/src/lib/app/personalization/sections/preferences/preferences-section.component.ts +103 -0
  77. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.html +46 -0
  78. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.scss +131 -0
  79. package/projects/doohbot/src/lib/app/personalization/sections/profile/profile-section.component.ts +23 -0
  80. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.html +33 -0
  81. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.scss +61 -0
  82. package/projects/doohbot/src/lib/app/personalization/sections/settings/setting-section.component.ts +20 -0
  83. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.html +30 -0
  84. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.scss +59 -0
  85. package/projects/doohbot/src/lib/app/personalization/sections/terms/terms-section.component.ts +12 -0
  86. package/projects/doohbot/src/lib/constant/doohbot-constant.ts +40 -0
  87. package/projects/doohbot/src/lib/constant/html-entities.ts +8 -0
  88. package/projects/doohbot/src/lib/constant/utf8.ts +9 -0
  89. package/projects/doohbot/src/lib/core/app-const.ts +63 -0
  90. package/projects/doohbot/src/lib/core/auth/account-api.service.ts +53 -0
  91. package/projects/doohbot/src/lib/core/auth/auth.service.ts +478 -0
  92. package/projects/doohbot/src/lib/core/auth/models/auth-result.model.ts +4 -0
  93. package/projects/doohbot/src/lib/core/auth/models/federated-login-request.model.ts +5 -0
  94. package/projects/doohbot/src/lib/core/auth/models/login-request.model.ts +6 -0
  95. package/projects/doohbot/src/lib/core/auth/storage.service.ts +113 -0
  96. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.directive.ts +123 -0
  97. package/projects/doohbot/src/lib/core/directives/draggable/draggable-dialog.module.ts +9 -0
  98. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.directive.ts +58 -0
  99. package/projects/doohbot/src/lib/core/directives/fullscreen/fullscreen.module.ts +9 -0
  100. package/projects/doohbot/src/lib/core/directives/popout/popout.directive.ts +169 -0
  101. package/projects/doohbot/src/lib/core/directives/popout/popout.module.ts +9 -0
  102. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.directive.ts +197 -0
  103. package/projects/doohbot/src/lib/core/directives/resizable/resizable-dialog.module.ts +9 -0
  104. package/projects/doohbot/src/lib/core/enums/api-request-state.enum.ts +9 -0
  105. package/projects/doohbot/src/lib/core/environments/environment.prod.ts +14 -0
  106. package/projects/doohbot/src/lib/core/environments/environment.ts +14 -0
  107. package/projects/doohbot/src/lib/core/helpers/crypto-helper.service.ts +72 -0
  108. package/projects/doohbot/src/lib/core/http/http-stream.service.ts +105 -0
  109. package/projects/doohbot/src/lib/core/http/http.service.ts +148 -0
  110. package/projects/doohbot/src/lib/core/interceptors/auth.interceptor.ts +118 -0
  111. package/projects/doohbot/src/lib/core/interceptors/license.interceptor.ts +50 -0
  112. package/projects/doohbot/src/lib/core/models/api-config.model.ts +82 -0
  113. package/projects/doohbot/src/lib/core/models/api-request.model.ts +92 -0
  114. package/projects/doohbot/src/lib/core/models/api-response.model.ts +13 -0
  115. package/projects/doohbot/src/lib/core/models/doohbot-config.model.ts +109 -0
  116. package/{lib/core/models/license.model.d.ts → projects/doohbot/src/lib/core/models/license.model.ts} +27 -23
  117. package/projects/doohbot/src/lib/core/models/message.ts +18 -0
  118. package/projects/doohbot/src/lib/core/models/theme-config.model.ts +48 -0
  119. package/projects/doohbot/src/lib/core/services/core-config.service.ts +53 -0
  120. package/projects/doohbot/src/lib/core/services/doohbot-api.service.ts +207 -0
  121. package/projects/doohbot/src/lib/core/services/license.service.ts +171 -0
  122. package/projects/doohbot/src/lib/core/services/markdown.service.ts +73 -0
  123. package/projects/doohbot/src/lib/core/services/theme.service.ts +305 -0
  124. package/{lib/core/types/auth-mode.type.d.ts → projects/doohbot/src/lib/core/types/auth-mode.type.ts} +4 -4
  125. package/{lib/core/types/auth-status.type.d.ts → projects/doohbot/src/lib/core/types/auth-status.type.ts} +5 -4
  126. package/{lib/core/types/chat-stream.type.d.ts → projects/doohbot/src/lib/core/types/chat-stream.type.ts} +4 -4
  127. package/{lib/core/types/message-role.type.d.ts → projects/doohbot/src/lib/core/types/message-role.type.ts} +4 -4
  128. package/{lib/core/types/prompt-mode.type.d.ts → projects/doohbot/src/lib/core/types/prompt-mode.type.ts} +5 -4
  129. package/{lib/core/types/snackbar-error.type.d.ts → projects/doohbot/src/lib/core/types/snackbar-error.type.ts} +5 -4
  130. package/{lib/core/types/tenant-resolution-strategy.type.d.ts → projects/doohbot/src/lib/core/types/tenant-resolution-strategy.type.ts} +4 -4
  131. package/projects/doohbot/src/lib/core/utils/error-handler.util.ts +31 -0
  132. package/projects/doohbot/src/lib/core/utils/logger.service.ts +45 -0
  133. package/projects/doohbot/src/lib/doohbot-input.ts +19 -0
  134. package/projects/doohbot/src/lib/doohbot.component.html +34 -0
  135. package/projects/doohbot/src/lib/doohbot.component.scss +17 -0
  136. package/projects/doohbot/src/lib/doohbot.component.spec.ts +31 -0
  137. package/projects/doohbot/src/lib/doohbot.component.ts +545 -0
  138. package/projects/doohbot/src/lib/elements.ts +25 -0
  139. package/projects/doohbot/src/lib/predefined_messages.ts +14 -0
  140. package/projects/doohbot/src/lib/shared/chips/chips.component.html +9 -0
  141. package/projects/doohbot/src/lib/shared/chips/chips.component.scss +29 -0
  142. package/projects/doohbot/src/lib/shared/chips/chips.component.spec.ts +22 -0
  143. package/projects/doohbot/src/lib/shared/chips/chips.component.ts +20 -0
  144. package/projects/doohbot/src/lib/shared/dialog/dialog.component.html +29 -0
  145. package/projects/doohbot/src/lib/shared/dialog/dialog.component.scss +100 -0
  146. package/projects/doohbot/src/lib/shared/dialog/dialog.component.ts +42 -0
  147. package/projects/doohbot/src/lib/shared/dialog/dialog.service.ts +62 -0
  148. package/projects/doohbot/src/lib/shared/dialog/dialog.utils.ts +102 -0
  149. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.html +30 -0
  150. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.scss +53 -0
  151. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.spec.ts +22 -0
  152. package/projects/doohbot/src/lib/shared/dropdown-menu/dropdown-menu.component.ts +35 -0
  153. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.html +16 -0
  154. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.scss +45 -0
  155. package/projects/doohbot/src/lib/shared/input-dialog/input-dialog.component.ts +46 -0
  156. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.html +5 -0
  157. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.scss +0 -0
  158. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.spec.ts +22 -0
  159. package/projects/doohbot/src/lib/shared/menu-item/menu-item.component.ts +20 -0
  160. package/projects/doohbot/src/lib/shared/pipes/simple-markdown.pipe.ts +19 -0
  161. package/projects/doohbot/src/lib/shared/popout/popout.html +1 -0
  162. package/projects/doohbot/src/lib/shared/popout/popout.scss +0 -0
  163. package/projects/doohbot/src/lib/shared/popout/popout.spec.ts +23 -0
  164. package/projects/doohbot/src/lib/shared/popout/popout.ts +11 -0
  165. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.html +7 -0
  166. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.scss +125 -0
  167. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.spec.ts +21 -0
  168. package/projects/doohbot/src/lib/shared/snackbar/snackbar.component.ts +44 -0
  169. package/projects/doohbot/src/lib/shared/snackbar/snackbar.service.ts +54 -0
  170. package/{lib/shared/snackbar/snackbar.utils.d.ts → projects/doohbot/src/lib/shared/snackbar/snackbar.utils.ts} +49 -33
  171. package/projects/doohbot/src/lib/styles/_theme.scss +132 -0
  172. package/projects/doohbot/src/lib/styles/material-override.scss +302 -0
  173. package/projects/doohbot/src/lib/styles/utility.scss +588 -0
  174. package/projects/doohbot/src/public-api.ts +42 -0
  175. package/projects/doohbot/tsconfig.lib.json +15 -0
  176. package/projects/doohbot/tsconfig.lib.prod.json +11 -0
  177. package/projects/doohbot/tsconfig.spec.json +10 -0
  178. package/proxy.conf.json +8 -0
  179. package/publish.config.js +25 -0
  180. package/scripts/publishing/index.ts +67 -0
  181. package/scripts/publishing/pipeline/01-clean.ts +11 -0
  182. package/scripts/publishing/pipeline/02-validate-pre.ts +8 -0
  183. package/scripts/publishing/pipeline/03-build.ts +7 -0
  184. package/scripts/publishing/pipeline/04-validate-post.ts +8 -0
  185. package/scripts/publishing/pipeline/05-prepare-package.ts +29 -0
  186. package/scripts/publishing/pipeline/06-version.ts +23 -0
  187. package/scripts/publishing/pipeline/07-publish.ts +14 -0
  188. package/scripts/publishing/pipeline/08-cleanup.ts +5 -0
  189. package/scripts/publishing/types.ts +36 -0
  190. package/scripts/publishing/utils/command.ts +15 -0
  191. package/scripts/publishing/utils/config.ts +17 -0
  192. package/scripts/validate.ts +166 -0
  193. package/tsconfig.json +45 -0
  194. package/tsconfig.scripts.json +15 -0
  195. package/esm2022/aakash58-chatbot.mjs +0 -5
  196. package/esm2022/lib/app/chat/chat-ui-state.service.mjs +0 -170
  197. package/esm2022/lib/app/chat/chat.service.mjs +0 -445
  198. package/esm2022/lib/app/chat/components/chat-button/chat-button.component.mjs +0 -50
  199. package/esm2022/lib/app/chat/components/chat-footer/chat-footer.component.mjs +0 -12
  200. package/esm2022/lib/app/chat/components/chat-header/chat-header.component.mjs +0 -66
  201. package/esm2022/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.mjs +0 -186
  202. package/esm2022/lib/app/chat/components/chat-window/chat-window.component.mjs +0 -312
  203. package/esm2022/lib/app/chat/components/message-input/message-input.component.mjs +0 -36
  204. package/esm2022/lib/app/chat/components/message-list/message-list.component.mjs +0 -115
  205. package/esm2022/lib/app/chat/model/chat-history.model.mjs +0 -2
  206. package/esm2022/lib/app/chat/model/chat-request.model.mjs +0 -2
  207. package/esm2022/lib/app/chat/model/chat-response.model.mjs +0 -2
  208. package/esm2022/lib/app/chat/model/chat-session.model.mjs +0 -2
  209. package/esm2022/lib/app/chat/model/chat-stream-message.model.mjs +0 -2
  210. package/esm2022/lib/app/chat/model/chat-stream-response.model.mjs +0 -2
  211. package/esm2022/lib/app/chat/services/chat-api.service.mjs +0 -61
  212. package/esm2022/lib/app/chat/services/chat-audio.service.mjs +0 -50
  213. package/esm2022/lib/app/chat/services/chat-history.service.mjs +0 -252
  214. package/esm2022/lib/app/login/login-form.component.mjs +0 -46
  215. package/esm2022/lib/app/personalization/personalization-dialog.component.mjs +0 -194
  216. package/esm2022/lib/app/personalization/personalization.service.mjs +0 -149
  217. package/esm2022/lib/app/personalization/sections/account/account-section.component.mjs +0 -122
  218. package/esm2022/lib/app/personalization/sections/preferences/color-picker-dialog.component.mjs +0 -86
  219. package/esm2022/lib/app/personalization/sections/preferences/preferences-section.component.mjs +0 -115
  220. package/esm2022/lib/app/personalization/sections/profile/profile-section.component.mjs +0 -29
  221. package/esm2022/lib/app/personalization/sections/settings/setting-section.component.mjs +0 -30
  222. package/esm2022/lib/app/personalization/sections/terms/terms-section.component.mjs +0 -12
  223. package/esm2022/lib/constant/doohbot-constant.mjs +0 -28
  224. package/esm2022/lib/constant/html-entities.mjs +0 -9
  225. package/esm2022/lib/constant/utf8.mjs +0 -10
  226. package/esm2022/lib/core/app-const.mjs +0 -61
  227. package/esm2022/lib/core/auth/account-api.service.mjs +0 -40
  228. package/esm2022/lib/core/auth/auth.service.mjs +0 -391
  229. package/esm2022/lib/core/auth/models/auth-result.model.mjs +0 -3
  230. package/esm2022/lib/core/auth/models/federated-login-request.model.mjs +0 -6
  231. package/esm2022/lib/core/auth/models/login-request.model.mjs +0 -6
  232. package/esm2022/lib/core/auth/storage.service.mjs +0 -110
  233. package/esm2022/lib/core/directives/draggable/draggable-dialog.directive.mjs +0 -112
  234. package/esm2022/lib/core/directives/fullscreen/fullscreen.directive.mjs +0 -55
  235. package/esm2022/lib/core/directives/resizable/resizable-dialog.directive.mjs +0 -179
  236. package/esm2022/lib/core/environments/environment.mjs +0 -15
  237. package/esm2022/lib/core/environments/environment.prod.mjs +0 -15
  238. package/esm2022/lib/core/helpers/crypto-helper.service.mjs +0 -52
  239. package/esm2022/lib/core/http/http-stream.service.mjs +0 -97
  240. package/esm2022/lib/core/http/http.service.mjs +0 -103
  241. package/esm2022/lib/core/interceptors/auth.interceptor.mjs +0 -96
  242. package/esm2022/lib/core/interceptors/license.interceptor.mjs +0 -44
  243. package/esm2022/lib/core/models/api-config.model.mjs +0 -18
  244. package/esm2022/lib/core/models/api-request.model.mjs +0 -2
  245. package/esm2022/lib/core/models/api-response.model.mjs +0 -8
  246. package/esm2022/lib/core/models/doohbot-config.model.mjs +0 -18
  247. package/esm2022/lib/core/models/license.model.mjs +0 -2
  248. package/esm2022/lib/core/models/message.mjs +0 -2
  249. package/esm2022/lib/core/models/theme-config.model.mjs +0 -2
  250. package/esm2022/lib/core/services/core-config.service.mjs +0 -52
  251. package/esm2022/lib/core/services/license.service.mjs +0 -145
  252. package/esm2022/lib/core/services/markdown.service.mjs +0 -64
  253. package/esm2022/lib/core/services/theme.service.mjs +0 -248
  254. package/esm2022/lib/core/types/auth-mode.type.mjs +0 -2
  255. package/esm2022/lib/core/types/auth-status.type.mjs +0 -5
  256. package/esm2022/lib/core/types/chat-stream.type.mjs +0 -2
  257. package/esm2022/lib/core/types/message-role.type.mjs +0 -2
  258. package/esm2022/lib/core/types/prompt-mode.type.mjs +0 -5
  259. package/esm2022/lib/core/types/snackbar-error.type.mjs +0 -5
  260. package/esm2022/lib/core/types/tenant-resolution-strategy.type.mjs +0 -2
  261. package/esm2022/lib/core/utils/logger.service.mjs +0 -42
  262. package/esm2022/lib/doohbot-input.mjs +0 -20
  263. package/esm2022/lib/doohbot.component.mjs +0 -444
  264. package/esm2022/lib/predefined_messages.mjs +0 -15
  265. package/esm2022/lib/shared/chips/chips.component.mjs +0 -28
  266. package/esm2022/lib/shared/dialog/dialog.component.mjs +0 -36
  267. package/esm2022/lib/shared/dialog/dialog.service.mjs +0 -64
  268. package/esm2022/lib/shared/dialog/dialog.utils.mjs +0 -85
  269. package/esm2022/lib/shared/dropdown-menu/dropdown-menu.component.mjs +0 -29
  270. package/esm2022/lib/shared/input-dialog/input-dialog.component.mjs +0 -38
  271. package/esm2022/lib/shared/menu-item/menu-item.component.mjs +0 -24
  272. package/esm2022/lib/shared/pipes/simple-markdown.pipe.mjs +0 -27
  273. package/esm2022/lib/shared/snackbar/snackbar.component.mjs +0 -43
  274. package/esm2022/lib/shared/snackbar/snackbar.service.mjs +0 -46
  275. package/esm2022/lib/shared/snackbar/snackbar.utils.mjs +0 -43
  276. package/esm2022/public-api.mjs +0 -37
  277. package/fesm2022/aakash58-chatbot.mjs +0 -5193
  278. package/fesm2022/aakash58-chatbot.mjs.map +0 -1
  279. package/index.d.ts +0 -5
  280. package/lib/app/chat/chat-ui-state.service.d.ts +0 -96
  281. package/lib/app/chat/chat.service.d.ts +0 -88
  282. package/lib/app/chat/components/chat-button/chat-button.component.d.ts +0 -16
  283. package/lib/app/chat/components/chat-footer/chat-footer.component.d.ts +0 -5
  284. package/lib/app/chat/components/chat-header/chat-header.component.d.ts +0 -24
  285. package/lib/app/chat/components/chat-history-sidebar/chat-history-sidebar.component.d.ts +0 -49
  286. package/lib/app/chat/components/chat-window/chat-window.component.d.ts +0 -107
  287. package/lib/app/chat/components/message-input/message-input.component.d.ts +0 -12
  288. package/lib/app/chat/components/message-list/message-list.component.d.ts +0 -40
  289. package/lib/app/chat/model/chat-history.model.d.ts +0 -51
  290. package/lib/app/chat/model/chat-request.model.d.ts +0 -10
  291. package/lib/app/chat/model/chat-response.model.d.ts +0 -9
  292. package/lib/app/chat/model/chat-session.model.d.ts +0 -12
  293. package/lib/app/chat/model/chat-stream-response.model.d.ts +0 -10
  294. package/lib/app/chat/services/chat-api.service.d.ts +0 -30
  295. package/lib/app/chat/services/chat-audio.service.d.ts +0 -19
  296. package/lib/app/chat/services/chat-history.service.d.ts +0 -53
  297. package/lib/app/login/login-form.component.d.ts +0 -20
  298. package/lib/app/personalization/personalization-dialog.component.d.ts +0 -53
  299. package/lib/app/personalization/personalization.service.d.ts +0 -66
  300. package/lib/app/personalization/sections/account/account-section.component.d.ts +0 -30
  301. package/lib/app/personalization/sections/preferences/color-picker-dialog.component.d.ts +0 -17
  302. package/lib/app/personalization/sections/preferences/preferences-section.component.d.ts +0 -27
  303. package/lib/app/personalization/sections/profile/profile-section.component.d.ts +0 -17
  304. package/lib/app/personalization/sections/settings/setting-section.component.d.ts +0 -10
  305. package/lib/app/personalization/sections/terms/terms-section.component.d.ts +0 -5
  306. package/lib/constant/doohbot-constant.d.ts +0 -12
  307. package/lib/constant/html-entities.d.ts +0 -8
  308. package/lib/constant/utf8.d.ts +0 -9
  309. package/lib/core/app-const.d.ts +0 -11
  310. package/lib/core/auth/account-api.service.d.ts +0 -20
  311. package/lib/core/auth/auth.service.d.ts +0 -90
  312. package/lib/core/auth/models/auth-result.model.d.ts +0 -4
  313. package/lib/core/auth/models/federated-login-request.model.d.ts +0 -5
  314. package/lib/core/auth/models/login-request.model.d.ts +0 -6
  315. package/lib/core/auth/storage.service.d.ts +0 -21
  316. package/lib/core/directives/draggable/draggable-dialog.directive.d.ts +0 -23
  317. package/lib/core/directives/fullscreen/fullscreen.directive.d.ts +0 -14
  318. package/lib/core/directives/resizable/resizable-dialog.directive.d.ts +0 -30
  319. package/lib/core/environments/environment.d.ts +0 -7
  320. package/lib/core/environments/environment.prod.d.ts +0 -7
  321. package/lib/core/helpers/crypto-helper.service.d.ts +0 -12
  322. package/lib/core/http/http-stream.service.d.ts +0 -18
  323. package/lib/core/http/http.service.d.ts +0 -20
  324. package/lib/core/interceptors/auth.interceptor.d.ts +0 -18
  325. package/lib/core/interceptors/license.interceptor.d.ts +0 -11
  326. package/lib/core/models/api-config.model.d.ts +0 -58
  327. package/lib/core/models/api-request.model.d.ts +0 -77
  328. package/lib/core/models/api-response.model.d.ts +0 -6
  329. package/lib/core/models/doohbot-config.model.d.ts +0 -81
  330. package/lib/core/models/message.d.ts +0 -16
  331. package/lib/core/models/theme-config.model.d.ts +0 -28
  332. package/lib/core/services/core-config.service.d.ts +0 -23
  333. package/lib/core/services/license.service.d.ts +0 -33
  334. package/lib/core/services/markdown.service.d.ts +0 -8
  335. package/lib/core/services/theme.service.d.ts +0 -40
  336. package/lib/core/utils/logger.service.d.ts +0 -11
  337. package/lib/doohbot-input.d.ts +0 -19
  338. package/lib/doohbot.component.d.ts +0 -108
  339. package/lib/predefined_messages.d.ts +0 -2
  340. package/lib/shared/chips/chips.component.d.ts +0 -10
  341. package/lib/shared/dialog/dialog.component.d.ts +0 -19
  342. package/lib/shared/dialog/dialog.service.d.ts +0 -29
  343. package/lib/shared/dialog/dialog.utils.d.ts +0 -41
  344. package/lib/shared/dropdown-menu/dropdown-menu.component.d.ts +0 -11
  345. package/lib/shared/input-dialog/input-dialog.component.d.ts +0 -20
  346. package/lib/shared/menu-item/menu-item.component.d.ts +0 -9
  347. package/lib/shared/pipes/simple-markdown.pipe.d.ts +0 -10
  348. package/lib/shared/snackbar/snackbar.component.d.ts +0 -14
  349. package/lib/shared/snackbar/snackbar.service.d.ts +0 -19
  350. package/public-api.d.ts +0 -11
  351. /package/{src → projects/doohbot/src}/assets/bot.mp3 +0 -0
@@ -1,252 +0,0 @@
1
- import { Injectable, inject, signal } from '@angular/core';
2
- import { of, catchError, map } from 'rxjs';
3
- import { ChatApiService } from './chat-api.service';
4
- import { SnackbarUtils } from '../../../shared/snackbar/snackbar.utils';
5
- import logger from '../../../core/utils/logger.service';
6
- import * as i0 from "@angular/core";
7
- export class ChatHistoryService {
8
- constructor() {
9
- this.chatApiService = inject(ChatApiService);
10
- // History State Signals
11
- this.sessions = signal([]);
12
- this.isLoading = signal(false);
13
- this.isLoadingMore = signal(false);
14
- this.hasMore = signal(true);
15
- this.historyOffset = signal(0);
16
- this.isCacheValid = signal(false);
17
- this.processingSessionId = signal(null);
18
- }
19
- /**
20
- * Map API session response to ChatSession model
21
- */
22
- mapSessionResponseToSession(sessionResponse, userId) {
23
- // Use last_message_at or created_at or current time
24
- const timestamp = sessionResponse.last_message_at
25
- ? new Date(sessionResponse.last_message_at)
26
- : sessionResponse.created_at
27
- ? new Date(sessionResponse.created_at)
28
- : new Date();
29
- logger.log('Mapping session response:', sessionResponse);
30
- // Map messages from the session if they exist
31
- let messages = [];
32
- if (sessionResponse.messages && Array.isArray(sessionResponse.messages)) {
33
- messages = sessionResponse.messages.map((msg) => ({
34
- id: msg.message_id || '',
35
- sender: msg.role,
36
- text: msg.content,
37
- completed: true,
38
- isHistory: true,
39
- timestamp: new Date(msg.created_at),
40
- }));
41
- }
42
- // Use response_id as primary ID, fallback to chat_session_id
43
- const sessionId = sessionResponse.response_id || sessionResponse.chat_session_id || '';
44
- return {
45
- id: sessionId,
46
- timestamp: timestamp,
47
- title: sessionResponse.title || 'Previous Conversation',
48
- userId: userId,
49
- messages: messages,
50
- };
51
- }
52
- /**
53
- * Load all chat sessions for a specific user
54
- */
55
- loadSessions(userId, forceRefresh = false) {
56
- logger.log('loadSessions called', { userId, forceRefresh });
57
- if (this.isCacheValid() && !forceRefresh && this.sessions().length > 0) {
58
- logger.log('Cache is valid and sessions already loaded. Skipping API call.');
59
- return;
60
- }
61
- this.isLoading.set(true);
62
- this.historyOffset.set(0);
63
- logger.log('Fetching chat history from API...');
64
- this.chatApiService
65
- .getChatHistory({ limit: 50, offset: 0 })
66
- .pipe(map((response) => {
67
- logger.log('Chat history response received', response);
68
- if (response && response.success && response.data && response.data.sessions) {
69
- const remoteSessions = response.data.sessions.map((session) => this.mapSessionResponseToSession(session, userId));
70
- const hasMore = response.data.offset + response.data.sessions.length < response.data.total;
71
- logger.log(`Mapped ${remoteSessions.length} sessions. Has more: ${hasMore}`);
72
- return { sessions: remoteSessions, hasMore };
73
- }
74
- logger.warn('No sessions found in response');
75
- return { sessions: [], hasMore: false };
76
- }), catchError((err) => {
77
- SnackbarUtils.error('Failed to load history');
78
- logger.error('ChatHistoryService: Failed to load history:', err);
79
- return of({ sessions: [], hasMore: false });
80
- }))
81
- .subscribe({
82
- next: (result) => {
83
- this.sessions.set(result.sessions);
84
- this.hasMore.set(result.hasMore);
85
- this.historyOffset.set(result.sessions.length);
86
- this.isCacheValid.set(true);
87
- this.isLoading.set(false);
88
- logger.log(`Loaded ${result.sessions.length} sessions. Cache valid: true`);
89
- },
90
- error: () => {
91
- this.isLoading.set(false);
92
- logger.error('loadSessions: Unexpected error in subscription');
93
- },
94
- });
95
- }
96
- /**
97
- * Load more sessions for infinite scroll
98
- */
99
- loadMoreSessions(userId) {
100
- if (!this.hasMore() || this.isLoadingMore())
101
- return;
102
- const currentOffset = this.historyOffset();
103
- this.isLoadingMore.set(true);
104
- this.chatApiService
105
- .getChatHistory({ limit: 50, offset: currentOffset })
106
- .pipe(map((response) => {
107
- if (response && response.success && response.data && response.data.sessions) {
108
- const remoteSessions = response.data.sessions.map((session) => this.mapSessionResponseToSession(session, userId));
109
- const hasMore = response.data.offset + response.data.sessions.length < response.data.total;
110
- return { sessions: remoteSessions, hasMore };
111
- }
112
- return { sessions: [], hasMore: false };
113
- }), catchError((err) => {
114
- SnackbarUtils.error('Failed to load more history');
115
- logger.error('ChatHistoryService: Failed to load more history:', err);
116
- return of({ sessions: [], hasMore: false });
117
- }))
118
- .subscribe({
119
- next: (result) => {
120
- const updatedSessions = [...this.sessions(), ...result.sessions];
121
- this.sessions.set(updatedSessions);
122
- this.hasMore.set(result.hasMore);
123
- this.historyOffset.set(currentOffset + result.sessions.length);
124
- this.isLoadingMore.set(false);
125
- },
126
- error: () => this.isLoadingMore.set(false),
127
- });
128
- }
129
- /**
130
- * Load messages for a specific session
131
- */
132
- loadSessionMessages(sessionId) {
133
- return this.chatApiService.getChatSession(sessionId).pipe(map((response) => {
134
- if (response.success && response.data) {
135
- // Sort messages by created_at timestamp to ensure chronological order (user, assistant, user, assistant...)
136
- function sortMessages(messages) {
137
- const users = messages.filter((m) => m.role === 'user');
138
- const assistants = messages.filter((m) => m.role === 'assistant');
139
- const result = [];
140
- const maxLength = Math.max(users.length, assistants.length);
141
- for (let i = 0; i < maxLength; i++) {
142
- if (users[i])
143
- result.push(users[i]);
144
- if (assistants[i])
145
- result.push(assistants[i]);
146
- }
147
- return result;
148
- }
149
- const sortedData = sortMessages(response.data);
150
- return sortedData.map((msg) => ({
151
- id: msg.message_id || '',
152
- sender: msg.role,
153
- text: msg.content,
154
- completed: true,
155
- isHistory: true,
156
- timestamp: new Date(msg.created_at),
157
- }));
158
- }
159
- return [];
160
- }), catchError((err) => {
161
- logger.error('ChatHistoryService: Failed to load messages:', err);
162
- SnackbarUtils.error('Failed to load messages');
163
- return of([]);
164
- }));
165
- }
166
- /**
167
- * Delete a specific session
168
- */
169
- deleteSession(sessionId, userId) {
170
- this.processingSessionId.set(sessionId);
171
- return this.chatApiService.deleteChatSession(sessionId).pipe(map((response) => {
172
- if (response && response.success) {
173
- this.sessions.update((prev) => prev.filter((s) => s.id !== sessionId));
174
- SnackbarUtils.success('Conversation deleted successfully');
175
- }
176
- }), catchError((err) => {
177
- SnackbarUtils.error('Failed to delete conversation');
178
- logger.error('ChatHistoryService: Failed to delete session', err);
179
- throw err;
180
- }), map(() => {
181
- this.processingSessionId.set(null);
182
- }));
183
- }
184
- /**
185
- * Delete all history
186
- */
187
- deleteAllHistory(userId) {
188
- this.isLoading.set(true);
189
- return this.chatApiService.clearChatHistory({ delete_all: true }).pipe(map((response) => {
190
- if (response && response.success) {
191
- this.sessions.set([]);
192
- this.isCacheValid.set(false);
193
- SnackbarUtils.success('Chat history cleared');
194
- }
195
- }), catchError((err) => {
196
- SnackbarUtils.error('Failed to clear history');
197
- logger.error('ChatHistoryService: Failed to clear history', err);
198
- throw err;
199
- }), map(() => {
200
- this.isLoading.set(false);
201
- }));
202
- }
203
- /**
204
- * Update session title
205
- */
206
- updateSessionTitle(sessionId, newTitle, userId) {
207
- this.processingSessionId.set(sessionId);
208
- return this.chatApiService.updateChatTitle(sessionId, newTitle).pipe(map((response) => {
209
- const success = !!(response && response.success);
210
- if (success) {
211
- this.sessions.update((prev) => prev.map((s) => (s.id === sessionId ? { ...s, title: newTitle } : s)));
212
- }
213
- this.processingSessionId.set(null);
214
- SnackbarUtils.success('Title updated successfully');
215
- return success;
216
- }), catchError((err) => {
217
- SnackbarUtils.error('Failed to update title');
218
- logger.error('ChatHistoryService: Failed to update title', err);
219
- this.processingSessionId.set(null);
220
- return of(false);
221
- }));
222
- }
223
- /**
224
- * Invalidate cache
225
- */
226
- invalidateCache() {
227
- this.isCacheValid.set(false);
228
- this.historyOffset.set(0);
229
- this.hasMore.set(true);
230
- }
231
- /**
232
- * Clear all history state
233
- */
234
- clearState() {
235
- this.sessions.set([]);
236
- this.isLoading.set(false);
237
- this.isLoadingMore.set(false);
238
- this.hasMore.set(true);
239
- this.historyOffset.set(0);
240
- this.isCacheValid.set(false);
241
- this.processingSessionId.set(null);
242
- }
243
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatHistoryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
244
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatHistoryService, providedIn: 'root' }); }
245
- }
246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChatHistoryService, decorators: [{
247
- type: Injectable,
248
- args: [{
249
- providedIn: 'root',
250
- }]
251
- }] });
252
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1oaXN0b3J5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL2NoYXQvc2VydmljZXMvY2hhdC1oaXN0b3J5LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sTUFBTSxNQUFNLG9DQUFvQyxDQUFDOztBQU14RCxNQUFNLE9BQU8sa0JBQWtCO0lBSC9CO1FBSVUsbUJBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFaEQsd0JBQXdCO1FBQ2pCLGFBQVEsR0FBRyxNQUFNLENBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLGNBQVMsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdkMsWUFBTyxHQUFHLE1BQU0sQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUNoQyxrQkFBYSxHQUFHLE1BQU0sQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUNsQyxpQkFBWSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN0Qyx3QkFBbUIsR0FBRyxNQUFNLENBQWdCLElBQUksQ0FBQyxDQUFDO0tBd1IxRDtJQXRSQzs7T0FFRztJQUNJLDJCQUEyQixDQUNoQyxlQUFvQyxFQUNwQyxNQUFjO1FBRWQsb0RBQW9EO1FBQ3BELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FB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WUFDaEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZTtRQUNiLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVU7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7K0dBalNVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRBcGlTZXJ2aWNlIH0gZnJvbSAnLi9jaGF0LWFwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ2hhdFNlc3Npb24gfSBmcm9tICcuLi9tb2RlbC9jaGF0LXNlc3Npb24ubW9kZWwnO1xyXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvbWVzc2FnZSc7XHJcbmltcG9ydCB7IFNuYWNrYmFyVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvc25hY2tiYXIvc25hY2tiYXIudXRpbHMnO1xyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uLy4uL2NvcmUvdXRpbHMvbG9nZ2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDaGF0U2Vzc2lvblJlc3BvbnNlLCBDaGF0TWVzc2FnZSB9IGZyb20gJy4uL21vZGVsL2NoYXQtaGlzdG9yeS5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hhdEhpc3RvcnlTZXJ2aWNlIHtcclxuICBwcml2YXRlIGNoYXRBcGlTZXJ2aWNlID0gaW5qZWN0KENoYXRBcGlTZXJ2aWNlKTtcclxuXHJcbiAgLy8gSGlzdG9yeSBTdGF0ZSBTaWduYWxzXHJcbiAgcHVibGljIHNlc3Npb25zID0gc2lnbmFsPENoYXRTZXNzaW9uW10+KFtdKTtcclxuICBwdWJsaWMgaXNMb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgaXNMb2FkaW5nTW9yZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XHJcbiAgcHVibGljIGhhc01vcmUgPSBzaWduYWw8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgcHVibGljIGhpc3RvcnlPZmZzZXQgPSBzaWduYWw8bnVtYmVyPigwKTtcclxuICBwdWJsaWMgaXNDYWNoZVZhbGlkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgcHJvY2Vzc2luZ1Nlc3Npb25JZCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTWFwIEFQSSBzZXNzaW9uIHJlc3BvbnNlIHRvIENoYXRTZXNzaW9uIG1vZGVsXHJcbiAgICovXHJcbiAgcHVibGljIG1hcFNlc3Npb25SZXNwb25zZVRvU2Vzc2lvbihcclxuICAgIHNlc3Npb25SZXNwb25zZTogQ2hhdFNlc3Npb25SZXNwb25zZSxcclxuICAgIHVzZXJJZDogc3RyaW5nLFxyXG4gICk6IENoYXRTZXNzaW9uIHtcclxuICAgIC8vIFVzZSBsYXN0X21lc3NhZ2VfYXQgb3IgY3JlYXRlZF9hdCBvciBjdXJyZW50IHRpbWVcclxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNlc3Npb25SZXNwb25zZS5sYXN0X21lc3NhZ2VfYXRcclxuICAgICAgPyBuZXcgRGF0ZShzZXNzaW9uUmVzcG9uc2UubGFzdF9tZXNzYWdlX2F0KVxyXG4gICAgICA6IHNlc3Npb25SZXNwb25zZS5jcmVhdGVkX2F0XHJcbiAgICAgICAgPyBuZXcgRGF0ZShzZXNzaW9uUmVzcG9uc2UuY3JlYXRlZF9hdClcclxuICAgICAgICA6IG5ldyBEYXRlKCk7XHJcblxyXG4gICAgbG9nZ2VyLmxvZygnTWFwcGluZyBzZXNzaW9uIHJlc3BvbnNlOicsIHNlc3Npb25SZXNwb25zZSk7XHJcblxyXG4gICAgLy8gTWFwIG1lc3NhZ2VzIGZyb20gdGhlIHNlc3Npb24gaWYgdGhleSBleGlzdFxyXG4gICAgbGV0IG1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcclxuICAgIGlmIChzZXNzaW9uUmVzcG9uc2UubWVzc2FnZXMgJiYgQXJyYXkuaXNBcnJheShzZXNzaW9uUmVzcG9uc2UubWVzc2FnZXMpKSB7XHJcbiAgICAgIG1lc3NhZ2VzID0gc2Vzc2lvblJlc3BvbnNlLm1lc3NhZ2VzLm1hcCgobXNnOiBDaGF0TWVzc2FnZSkgPT4gKHtcclxuICAgICAgICBpZDogbXNnLm1lc3NhZ2VfaWQgfHwgJycsXHJcbiAgICAgICAgc2VuZGVyOiBtc2cucm9sZSxcclxuICAgICAgICB0ZXh0OiBtc2cuY29udGVudCxcclxuICAgICAgICBjb21wbGV0ZWQ6IHRydWUsXHJcbiAgICAgICAgaXNIaXN0b3J5OiB0cnVlLFxyXG4gICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUobXNnLmNyZWF0ZWRfYXQpLFxyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gVXNlIHJlc3BvbnNlX2lkIGFzIHByaW1hcnkgSUQsIGZhbGxiYWNrIHRvIGNoYXRfc2Vzc2lvbl9pZFxyXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gc2Vzc2lvblJlc3BvbnNlLnJlc3BvbnNlX2lkIHx8IHNlc3Npb25SZXNwb25zZS5jaGF0X3Nlc3Npb25faWQgfHwgJyc7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IHNlc3Npb25JZCxcclxuICAgICAgdGltZXN0YW1wOiB0aW1lc3RhbXAsXHJcbiAgICAgIHRpdGxlOiBzZXNzaW9uUmVzcG9uc2UudGl0bGUgfHwgJ1ByZXZpb3VzIENvbnZlcnNhdGlvbicsXHJcbiAgICAgIHVzZXJJZDogdXNlcklkLFxyXG4gICAgICBtZXNzYWdlczogbWVzc2FnZXMsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBhbGwgY2hhdCBzZXNzaW9ucyBmb3IgYSBzcGVjaWZpYyB1c2VyXHJcbiAgICovXHJcbiAgbG9hZFNlc3Npb25zKHVzZXJJZDogc3RyaW5nLCBmb3JjZVJlZnJlc2g6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgbG9nZ2VyLmxvZygnbG9hZFNlc3Npb25zIGNhbGxlZCcsIHsgdXNlcklkLCBmb3JjZVJlZnJlc2ggfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNDYWNoZVZhbGlkKCkgJiYgIWZvcmNlUmVmcmVzaCAmJiB0aGlzLnNlc3Npb25zKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICBsb2dnZXIubG9nKCdDYWNoZSBpcyB2YWxpZCBhbmQgc2Vzc2lvbnMgYWxyZWFkeSBsb2FkZWQuIFNraXBwaW5nIEFQSSBjYWxsLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5oaXN0b3J5T2Zmc2V0LnNldCgwKTtcclxuICAgIGxvZ2dlci5sb2coJ0ZldGNoaW5nIGNoYXQgaGlzdG9yeSBmcm9tIEFQSS4uLicpO1xyXG5cclxuICAgIHRoaXMuY2hhdEFwaVNlcnZpY2VcclxuICAgICAgLmdldENoYXRIaXN0b3J5KHsgbGltaXQ6IDUwLCBvZmZzZXQ6IDAgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgbG9nZ2VyLmxvZygnQ2hhdCBoaXN0b3J5IHJlc3BvbnNlIHJlY2VpdmVkJywgcmVzcG9uc2UpO1xyXG5cclxuICAgICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEgJiYgcmVzcG9uc2UuZGF0YS5zZXNzaW9ucykge1xyXG4gICAgICAgICAgICBjb25zdCByZW1vdGVTZXNzaW9ucyA9IHJlc3BvbnNlLmRhdGEuc2Vzc2lvbnMubWFwKChzZXNzaW9uOiBDaGF0U2Vzc2lvblJlc3BvbnNlKSA9PlxyXG4gICAgICAgICAgICAgIHRoaXMubWFwU2Vzc2lvblJlc3BvbnNlVG9TZXNzaW9uKHNlc3Npb24sIHVzZXJJZCksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc01vcmUgPVxyXG4gICAgICAgICAgICAgIHJlc3BvbnNlLmRhdGEub2Zmc2V0ICsgcmVzcG9uc2UuZGF0YS5zZXNzaW9ucy5sZW5ndGggPCByZXNwb25zZS5kYXRhLnRvdGFsO1xyXG5cclxuICAgICAgICAgICAgbG9nZ2VyLmxvZyhgTWFwcGVkICR7cmVtb3RlU2Vzc2lvbnMubGVuZ3RofSBzZXNzaW9ucy4gSGFzIG1vcmU6ICR7aGFzTW9yZX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbnM6IHJlbW90ZVNlc3Npb25zLCBoYXNNb3JlIH07XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ05vIHNlc3Npb25zIGZvdW5kIGluIHJlc3BvbnNlJyk7XHJcbiAgICAgICAgICByZXR1cm4geyBzZXNzaW9uczogW10sIGhhc01vcmU6IGZhbHNlIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgICBTbmFja2JhclV0aWxzLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBoaXN0b3J5Jyk7XHJcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NoYXRIaXN0b3J5U2VydmljZTogRmFpbGVkIHRvIGxvYWQgaGlzdG9yeTonLCBlcnIpO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKHsgc2Vzc2lvbnM6IFtdLCBoYXNNb3JlOiBmYWxzZSB9KTtcclxuICAgICAgICB9KSxcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb25zLnNldChyZXN1bHQuc2Vzc2lvbnMpO1xyXG4gICAgICAgICAgdGhpcy5oYXNNb3JlLnNldChyZXN1bHQuaGFzTW9yZSk7XHJcbiAgICAgICAgICB0aGlzLmhpc3RvcnlPZmZzZXQuc2V0KHJlc3VsdC5zZXNzaW9ucy5sZW5ndGgpO1xyXG4gICAgICAgICAgdGhpcy5pc0NhY2hlVmFsaWQuc2V0KHRydWUpO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuXHJcbiAgICAgICAgICBsb2dnZXIubG9nKGBMb2FkZWQgJHtyZXN1bHQuc2Vzc2lvbnMubGVuZ3RofSBzZXNzaW9ucy4gQ2FjaGUgdmFsaWQ6IHRydWVgKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdsb2FkU2Vzc2lvbnM6IFVuZXhwZWN0ZWQgZXJyb3IgaW4gc3Vic2NyaXB0aW9uJyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkIG1vcmUgc2Vzc2lvbnMgZm9yIGluZmluaXRlIHNjcm9sbFxyXG4gICAqL1xyXG4gIGxvYWRNb3JlU2Vzc2lvbnModXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5oYXNNb3JlKCkgfHwgdGhpcy5pc0xvYWRpbmdNb3JlKCkpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gdGhpcy5oaXN0b3J5T2Zmc2V0KCk7XHJcbiAgICB0aGlzLmlzTG9hZGluZ01vcmUuc2V0KHRydWUpO1xyXG5cclxuICAgIHRoaXMuY2hhdEFwaVNlcnZpY2VcclxuICAgICAgLmdldENoYXRIaXN0b3J5KHsgbGltaXQ6IDUwLCBvZmZzZXQ6IGN1cnJlbnRPZmZzZXQgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSAmJiByZXNwb25zZS5kYXRhLnNlc3Npb25zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbW90ZVNlc3Npb25zID0gcmVzcG9uc2UuZGF0YS5zZXNzaW9ucy5tYXAoKHNlc3Npb246IENoYXRTZXNzaW9uUmVzcG9uc2UpID0+XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXBTZXNzaW9uUmVzcG9uc2VUb1Nlc3Npb24oc2Vzc2lvbiwgdXNlcklkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgaGFzTW9yZSA9XHJcbiAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5vZmZzZXQgKyByZXNwb25zZS5kYXRhLnNlc3Npb25zLmxlbmd0aCA8IHJlc3BvbnNlLmRhdGEudG90YWw7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHNlc3Npb25zOiByZW1vdGVTZXNzaW9ucywgaGFzTW9yZSB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHsgc2Vzc2lvbnM6IFtdLCBoYXNNb3JlOiBmYWxzZSB9O1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgICAgU25hY2tiYXJVdGlscy5lcnJvcignRmFpbGVkIHRvIGxvYWQgbW9yZSBoaXN0b3J5Jyk7XHJcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0NoYXRIaXN0b3J5U2VydmljZTogRmFpbGVkIHRvIGxvYWQgbW9yZSBoaXN0b3J5OicsIGVycik7XHJcbiAgICAgICAgICByZXR1cm4gb2YoeyBzZXNzaW9uczogW10sIGhhc01vcmU6IGZhbHNlIH0pO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRTZXNzaW9ucyA9IFsuLi50aGlzLnNlc3Npb25zKCksIC4uLnJlc3VsdC5zZXNzaW9uc107XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb25zLnNldCh1cGRhdGVkU2Vzc2lvbnMpO1xyXG4gICAgICAgICAgdGhpcy5oYXNNb3JlLnNldChyZXN1bHQuaGFzTW9yZSk7XHJcbiAgICAgICAgICB0aGlzLmhpc3RvcnlPZmZzZXQuc2V0KGN1cnJlbnRPZmZzZXQgKyByZXN1bHQuc2Vzc2lvbnMubGVuZ3RoKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZS5zZXQoZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMuaXNMb2FkaW5nTW9yZS5zZXQoZmFsc2UpLFxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgbWVzc2FnZXMgZm9yIGEgc3BlY2lmaWMgc2Vzc2lvblxyXG4gICAqL1xyXG4gIGxvYWRTZXNzaW9uTWVzc2FnZXMoc2Vzc2lvbklkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1lc3NhZ2VbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhdEFwaVNlcnZpY2UuZ2V0Q2hhdFNlc3Npb24oc2Vzc2lvbklkKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xyXG4gICAgICAgICAgLy8gU29ydCBtZXNzYWdlcyBieSBjcmVhdGVkX2F0IHRpbWVzdGFtcCB0byBlbnN1cmUgY2hyb25vbG9naWNhbCBvcmRlciAodXNlciwgYXNzaXN0YW50LCB1c2VyLCBhc3Npc3RhbnQuLi4pXHJcbiAgICAgICAgICBmdW5jdGlvbiBzb3J0TWVzc2FnZXMobWVzc2FnZXM6IGFueVtdKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJzID0gbWVzc2FnZXMuZmlsdGVyKChtKSA9PiBtLnJvbGUgPT09ICd1c2VyJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IGFzc2lzdGFudHMgPSBtZXNzYWdlcy5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gJ2Fzc2lzdGFudCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KHVzZXJzLmxlbmd0aCwgYXNzaXN0YW50cy5sZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhMZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGlmICh1c2Vyc1tpXSkgcmVzdWx0LnB1c2godXNlcnNbaV0pO1xyXG4gICAgICAgICAgICAgIGlmIChhc3Npc3RhbnRzW2ldKSByZXN1bHQucHVzaChhc3Npc3RhbnRzW2ldKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBzb3J0ZWREYXRhID0gc29ydE1lc3NhZ2VzKHJlc3BvbnNlLmRhdGEpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBzb3J0ZWREYXRhLm1hcCgobXNnOiBDaGF0TWVzc2FnZSkgPT4gKHtcclxuICAgICAgICAgICAgaWQ6IG1zZy5tZXNzYWdlX2lkIHx8ICcnLFxyXG4gICAgICAgICAgICBzZW5kZXI6IG1zZy5yb2xlLFxyXG4gICAgICAgICAgICB0ZXh0OiBtc2cuY29udGVudCxcclxuICAgICAgICAgICAgY29tcGxldGVkOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0hpc3Rvcnk6IHRydWUsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUobXNnLmNyZWF0ZWRfYXQpLFxyXG4gICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW107XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoJ0NoYXRIaXN0b3J5U2VydmljZTogRmFpbGVkIHRvIGxvYWQgbWVzc2FnZXM6JywgZXJyKTtcclxuICAgICAgICBTbmFja2JhclV0aWxzLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBtZXNzYWdlcycpO1xyXG4gICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZSBhIHNwZWNpZmljIHNlc3Npb25cclxuICAgKi9cclxuICBkZWxldGVTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgdGhpcy5wcm9jZXNzaW5nU2Vzc2lvbklkLnNldChzZXNzaW9uSWQpO1xyXG4gICAgcmV0dXJuIHRoaXMuY2hhdEFwaVNlcnZpY2UuZGVsZXRlQ2hhdFNlc3Npb24oc2Vzc2lvbklkKS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbnMudXBkYXRlKChwcmV2KSA9PiBwcmV2LmZpbHRlcigocykgPT4gcy5pZCAhPT0gc2Vzc2lvbklkKSk7XHJcbiAgICAgICAgICBTbmFja2JhclV0aWxzLnN1Y2Nlc3MoJ0NvbnZlcnNhdGlvbiBkZWxldGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xyXG4gICAgICAgIFNuYWNrYmFyVXRpbHMuZXJyb3IoJ0ZhaWxlZCB0byBkZWxldGUgY29udmVyc2F0aW9uJyk7XHJcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdDaGF0SGlzdG9yeVNlcnZpY2U6IEZhaWxlZCB0byBkZWxldGUgc2Vzc2lvbicsIGVycik7XHJcbiAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICB9KSxcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLnByb2Nlc3NpbmdTZXNzaW9uSWQuc2V0KG51bGwpO1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGUgYWxsIGhpc3RvcnlcclxuICAgKi9cclxuICBkZWxldGVBbGxIaXN0b3J5KHVzZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XHJcbiAgICByZXR1cm4gdGhpcy5jaGF0QXBpU2VydmljZS5jbGVhckNoYXRIaXN0b3J5KHsgZGVsZXRlX2FsbDogdHJ1ZSB9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbnMuc2V0KFtdKTtcclxuICAgICAgICAgIHRoaXMuaXNDYWNoZVZhbGlkLnNldChmYWxzZSk7XHJcbiAgICAgICAgICBTbmFja2JhclV0aWxzLnN1Y2Nlc3MoJ0NoYXQgaGlzdG9yeSBjbGVhcmVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgU25hY2tiYXJVdGlscy5lcnJvcignRmFpbGVkIHRvIGNsZWFyIGhpc3RvcnknKTtcclxuICAgICAgICBsb2dnZXIuZXJyb3IoJ0NoYXRIaXN0b3J5U2VydmljZTogRmFpbGVkIHRvIGNsZWFyIGhpc3RvcnknLCBlcnIpO1xyXG4gICAgICAgIHRocm93IGVycjtcclxuICAgICAgfSksXHJcbiAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcuc2V0KGZhbHNlKTtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHNlc3Npb24gdGl0bGVcclxuICAgKi9cclxuICB1cGRhdGVTZXNzaW9uVGl0bGUoc2Vzc2lvbklkOiBzdHJpbmcsIG5ld1RpdGxlOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICB0aGlzLnByb2Nlc3NpbmdTZXNzaW9uSWQuc2V0KHNlc3Npb25JZCk7XHJcbiAgICByZXR1cm4gdGhpcy5jaGF0QXBpU2VydmljZS51cGRhdGVDaGF0VGl0bGUoc2Vzc2lvbklkLCBuZXdUaXRsZSkucGlwZShcclxuICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSAhIShyZXNwb25zZSAmJiByZXNwb25zZS5zdWNjZXNzKTtcclxuICAgICAgICBpZiAoc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy5zZXNzaW9ucy51cGRhdGUoKHByZXYpID0+XHJcbiAgICAgICAgICAgIHByZXYubWFwKChzKSA9PiAocy5pZCA9PT0gc2Vzc2lvbklkID8geyAuLi5zLCB0aXRsZTogbmV3VGl0bGUgfSA6IHMpKSxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucHJvY2Vzc2luZ1Nlc3Npb25JZC5zZXQobnVsbCk7XHJcbiAgICAgICAgU25hY2tiYXJVdGlscy5zdWNjZXNzKCdUaXRsZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseScpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgU25hY2tiYXJVdGlscy5lcnJvcignRmFpbGVkIHRvIHVwZGF0ZSB0aXRsZScpO1xyXG4gICAgICAgIGxvZ2dlci5lcnJvcignQ2hhdEhpc3RvcnlTZXJ2aWNlOiBGYWlsZWQgdG8gdXBkYXRlIHRpdGxlJywgZXJyKTtcclxuICAgICAgICB0aGlzLnByb2Nlc3NpbmdTZXNzaW9uSWQuc2V0KG51bGwpO1xyXG4gICAgICAgIHJldHVybiBvZihmYWxzZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludmFsaWRhdGUgY2FjaGVcclxuICAgKi9cclxuICBpbnZhbGlkYXRlQ2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzQ2FjaGVWYWxpZC5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5oaXN0b3J5T2Zmc2V0LnNldCgwKTtcclxuICAgIHRoaXMuaGFzTW9yZS5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBhbGwgaGlzdG9yeSBzdGF0ZVxyXG4gICAqL1xyXG4gIGNsZWFyU3RhdGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlc3Npb25zLnNldChbXSk7XHJcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xyXG4gICAgdGhpcy5pc0xvYWRpbmdNb3JlLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLmhhc01vcmUuc2V0KHRydWUpO1xyXG4gICAgdGhpcy5oaXN0b3J5T2Zmc2V0LnNldCgwKTtcclxuICAgIHRoaXMuaXNDYWNoZVZhbGlkLnNldChmYWxzZSk7XHJcbiAgICB0aGlzLnByb2Nlc3NpbmdTZXNzaW9uSWQuc2V0KG51bGwpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,46 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { FormsModule } from '@angular/forms';
4
- import { MatIconModule } from '@angular/material/icon';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/forms";
7
- import * as i2 from "@angular/material/icon";
8
- export class LoginFormComponent {
9
- constructor() {
10
- this.isLoggingIn = false;
11
- this.loginSubmit = new EventEmitter();
12
- this.cancel = new EventEmitter();
13
- this.loginUsername = '';
14
- this.loginPassword = '';
15
- this.showPassword = false;
16
- this.rememberMe = false;
17
- }
18
- togglePasswordVisibility() {
19
- this.showPassword = !this.showPassword;
20
- }
21
- onLoginSubmit() {
22
- if (this.loginUsername && this.loginPassword) {
23
- this.loginSubmit.emit({
24
- username: this.loginUsername,
25
- password: this.loginPassword,
26
- rememberMe: this.rememberMe,
27
- });
28
- }
29
- }
30
- onCancel() {
31
- this.cancel.emit();
32
- }
33
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
34
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: LoginFormComponent, isStandalone: true, selector: "app-login-form", inputs: { isLoggingIn: "isLoggingIn" }, outputs: { loginSubmit: "loginSubmit", cancel: "cancel" }, ngImport: i0, template: "<form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n>\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button type=\"submit\" class=\"auth-btn primary\" [disabled]=\"loginForm.invalid || isLoggingIn\">\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".login-form-container{padding:30px;display:flex;flex-direction:column;gap:20px;height:100%;justify-content:center;align-items:center;margin:0 auto;box-sizing:border-box;max-width:400px;width:100%;animation:fadeIn .3s ease-in-out}.login-form-container .login-title{text-align:center;margin:0 0 10px;font-size:1.5em;color:var(--text-color);font-family:var(--font-family);font-weight:600}.login-form-container .login-fields{display:flex;flex-direction:column;gap:15px;width:100%}.login-form-container .login-fields .login-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border-color);font-size:.9em;background:var(--background-color);color:var(--text-color);width:100%;box-sizing:border-box}.login-form-container .login-fields .login-input:focus{outline:none;background-color:var(--background-color);border-color:var(--primary-color)}.login-form-container .login-fields .password-wrapper{position:relative;display:flex;align-items:center}.login-form-container .login-fields .password-wrapper .login-input{width:100%;padding-right:40px;box-sizing:border-box}.login-form-container .login-fields .password-wrapper .password-toggle-btn{position:absolute;right:8px;background:transparent;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;color:var(--text-color);opacity:.6;transition:opacity .2s}.login-form-container .login-fields .password-wrapper .password-toggle-btn:hover{opacity:1}.login-form-container .login-fields .password-wrapper .password-toggle-btn mat-icon{font-size:20px;width:20px;height:20px}.login-form-container .login-fields .remember-me-container{display:flex;align-items:center;margin-top:-5px;-webkit-user-select:none;user-select:none}.login-form-container .login-fields .remember-me-container .remember-me-label{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 0}.login-form-container .login-fields .remember-me-container .remember-me-checkbox{width:14px;height:14px;cursor:pointer;accent-color:var(--primary-color);margin:0}.login-form-container .login-fields .remember-me-container .remember-me-text{font-size:.8em;color:var(--text-color);font-family:var(--font-family);font-weight:300}.login-form-container .login-actions{display:flex;justify-content:center;gap:10px;margin-top:10px}.login-form-container .input-group{display:flex;flex-direction:column;gap:6px;text-align:left;width:100%}.login-form-container .input-label{font-size:.85em;color:var(--text-color);font-family:var(--font-family);font-weight:500;margin-left:2px}.login-form-container .error-text{font-size:.6em;color:var(--red);margin-top:2px;margin-left:2px;font-family:var(--font-family)}.auth-btn{padding:8px 18px;border-radius:20px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .2s ease}.auth-btn.primary{background:var(--primary-color);color:var(--white);border:1px solid var(--primary-color)}.auth-btn.primary:hover{opacity:.9}.auth-btn.primary:disabled{opacity:.5;cursor:not-allowed}.auth-btn.secondary{background:transparent;color:var(--text-alt-color);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
35
- }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LoginFormComponent, decorators: [{
37
- type: Component,
38
- args: [{ selector: 'app-login-form', standalone: true, imports: [CommonModule, FormsModule, MatIconModule], template: "<form\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n #loginForm=\"ngForm\"\r\n>\r\n <h3 class=\"login-title\">Login to Doohbot</h3>\r\n\r\n <div class=\"login-fields\">\r\n <!-- Username Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Username</label>\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n #username=\"ngModel\"\r\n placeholder=\"Enter your username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n @if (username.invalid && (username.dirty || username.touched)) {\r\n <span class=\"error-text\"> Username is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Password Field -->\r\n <div class=\"input-group\">\r\n <label class=\"input-label\">Password</label>\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n #password=\"ngModel\"\r\n placeholder=\"Enter your password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n @if (password.invalid && (password.dirty || password.touched)) {\r\n <span class=\"error-text\"> Password is required </span>\r\n }\r\n </div>\r\n\r\n <!-- Remember Me -->\r\n <div class=\"remember-me-container\">\r\n <label class=\"remember-me-label\">\r\n <input\r\n type=\"checkbox\"\r\n name=\"rememberMe\"\r\n [(ngModel)]=\"rememberMe\"\r\n class=\"remember-me-checkbox\"\r\n />\r\n <span class=\"remember-me-text\">Remember me</span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancel()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button type=\"submit\" class=\"auth-btn primary\" [disabled]=\"loginForm.invalid || isLoggingIn\">\r\n {{ isLoggingIn ? 'Logging in...' : 'Login' }}\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".login-form-container{padding:30px;display:flex;flex-direction:column;gap:20px;height:100%;justify-content:center;align-items:center;margin:0 auto;box-sizing:border-box;max-width:400px;width:100%;animation:fadeIn .3s ease-in-out}.login-form-container .login-title{text-align:center;margin:0 0 10px;font-size:1.5em;color:var(--text-color);font-family:var(--font-family);font-weight:600}.login-form-container .login-fields{display:flex;flex-direction:column;gap:15px;width:100%}.login-form-container .login-fields .login-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border-color);font-size:.9em;background:var(--background-color);color:var(--text-color);width:100%;box-sizing:border-box}.login-form-container .login-fields .login-input:focus{outline:none;background-color:var(--background-color);border-color:var(--primary-color)}.login-form-container .login-fields .password-wrapper{position:relative;display:flex;align-items:center}.login-form-container .login-fields .password-wrapper .login-input{width:100%;padding-right:40px;box-sizing:border-box}.login-form-container .login-fields .password-wrapper .password-toggle-btn{position:absolute;right:8px;background:transparent;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;color:var(--text-color);opacity:.6;transition:opacity .2s}.login-form-container .login-fields .password-wrapper .password-toggle-btn:hover{opacity:1}.login-form-container .login-fields .password-wrapper .password-toggle-btn mat-icon{font-size:20px;width:20px;height:20px}.login-form-container .login-fields .remember-me-container{display:flex;align-items:center;margin-top:-5px;-webkit-user-select:none;user-select:none}.login-form-container .login-fields .remember-me-container .remember-me-label{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 0}.login-form-container .login-fields .remember-me-container .remember-me-checkbox{width:14px;height:14px;cursor:pointer;accent-color:var(--primary-color);margin:0}.login-form-container .login-fields .remember-me-container .remember-me-text{font-size:.8em;color:var(--text-color);font-family:var(--font-family);font-weight:300}.login-form-container .login-actions{display:flex;justify-content:center;gap:10px;margin-top:10px}.login-form-container .input-group{display:flex;flex-direction:column;gap:6px;text-align:left;width:100%}.login-form-container .input-label{font-size:.85em;color:var(--text-color);font-family:var(--font-family);font-weight:500;margin-left:2px}.login-form-container .error-text{font-size:.6em;color:var(--red);margin-top:2px;margin-left:2px;font-family:var(--font-family)}.auth-btn{padding:8px 18px;border-radius:20px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .2s ease}.auth-btn.primary{background:var(--primary-color);color:var(--white);border:1px solid var(--primary-color)}.auth-btn.primary:hover{opacity:.9}.auth-btn.primary:disabled{opacity:.5;cursor:not-allowed}.auth-btn.secondary{background:transparent;color:var(--text-alt-color);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"] }]
39
- }], propDecorators: { isLoggingIn: [{
40
- type: Input
41
- }], loginSubmit: [{
42
- type: Output
43
- }], cancel: [{
44
- type: Output
45
- }] } });
46
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4tZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb29oYm90L3NyYy9saWIvYXBwL2xvZ2luL2xvZ2luLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9vaGJvdC9zcmMvbGliL2FwcC9sb2dpbi9sb2dpbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFTdkQsTUFBTSxPQUFPLGtCQUFrQjtJQVAvQjtRQVFXLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRTVCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBSXBDLENBQUM7UUFDSyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVyQyxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO0tBbUIzQjtJQWpCQyx3QkFBd0I7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQzVCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTthQUM1QixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDOytHQS9CVSxrQkFBa0I7bUdBQWxCLGtCQUFrQiw2S0NaL0Isa2pGQWdGQSxpcEdEeEVZLFlBQVksOEJBQUUsV0FBVyxxN0NBQUUsYUFBYTs7NEZBSXZDLGtCQUFrQjtrQkFQOUIsU0FBUzsrQkFDRSxnQkFBZ0IsY0FDZCxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQzs4QkFLMUMsV0FBVztzQkFBbkIsS0FBSztnQkFFSSxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FwcC1sb2dpbi1mb3JtJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbG9naW4tZm9ybS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbG9naW4tZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTG9naW5Gb3JtQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBpc0xvZ2dpbmdJbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgbG9naW5TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcclxuICAgIHVzZXJuYW1lOiBzdHJpbmc7XHJcbiAgICBwYXNzd29yZDogc3RyaW5nO1xyXG4gICAgcmVtZW1iZXJNZTogYm9vbGVhbjtcclxuICB9PigpO1xyXG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBsb2dpblVzZXJuYW1lID0gJyc7XHJcbiAgcHVibGljIGxvZ2luUGFzc3dvcmQgPSAnJztcclxuICBwdWJsaWMgc2hvd1Bhc3N3b3JkID0gZmFsc2U7XHJcbiAgcHVibGljIHJlbWVtYmVyTWUgPSBmYWxzZTtcclxuXHJcbiAgdG9nZ2xlUGFzc3dvcmRWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5zaG93UGFzc3dvcmQgPSAhdGhpcy5zaG93UGFzc3dvcmQ7XHJcbiAgfVxyXG5cclxuICBvbkxvZ2luU3VibWl0KCkge1xyXG4gICAgaWYgKHRoaXMubG9naW5Vc2VybmFtZSAmJiB0aGlzLmxvZ2luUGFzc3dvcmQpIHtcclxuICAgICAgdGhpcy5sb2dpblN1Ym1pdC5lbWl0KHtcclxuICAgICAgICB1c2VybmFtZTogdGhpcy5sb2dpblVzZXJuYW1lLFxyXG4gICAgICAgIHBhc3N3b3JkOiB0aGlzLmxvZ2luUGFzc3dvcmQsXHJcbiAgICAgICAgcmVtZW1iZXJNZTogdGhpcy5yZW1lbWJlck1lLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybVxyXG4gIGNsYXNzPVwibG9naW4tZm9ybS1jb250YWluZXJcIlxyXG4gIChuZ1N1Ym1pdCk9XCJvbkxvZ2luU3VibWl0KClcIlxyXG4gIGF1dG9jb21wbGV0ZT1cIm9uXCJcclxuICAjbG9naW5Gb3JtPVwibmdGb3JtXCJcclxuPlxyXG4gIDxoMyBjbGFzcz1cImxvZ2luLXRpdGxlXCI+TG9naW4gdG8gRG9vaGJvdDwvaDM+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJsb2dpbi1maWVsZHNcIj5cclxuICAgIDwhLS0gVXNlcm5hbWUgRmllbGQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiaW5wdXQtbGFiZWxcIj5Vc2VybmFtZTwvbGFiZWw+XHJcbiAgICAgIDxpbnB1dFxyXG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICBuYW1lPVwidXNlcm5hbWVcIlxyXG4gICAgICAgIFsobmdNb2RlbCldPVwibG9naW5Vc2VybmFtZVwiXHJcbiAgICAgICAgI3VzZXJuYW1lPVwibmdNb2RlbFwiXHJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIHVzZXJuYW1lXCJcclxuICAgICAgICBjbGFzcz1cImxvZ2luLWlucHV0XCJcclxuICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cInVzZXJuYW1lXCJcclxuICAgICAgLz5cclxuICAgICAgQGlmICh1c2VybmFtZS5pbnZhbGlkICYmICh1c2VybmFtZS5kaXJ0eSB8fCB1c2VybmFtZS50b3VjaGVkKSkge1xyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3ItdGV4dFwiPiBVc2VybmFtZSBpcyByZXF1aXJlZCA8L3NwYW4+XHJcbiAgICAgIH1cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0gUGFzc3dvcmQgRmllbGQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXBcIj5cclxuICAgICAgPGxhYmVsIGNsYXNzPVwiaW5wdXQtbGFiZWxcIj5QYXNzd29yZDwvbGFiZWw+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJwYXNzd29yZC13cmFwcGVyXCI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICBbdHlwZV09XCJzaG93UGFzc3dvcmQgPyAndGV4dCcgOiAncGFzc3dvcmQnXCJcclxuICAgICAgICAgIG5hbWU9XCJwYXNzd29yZFwiXHJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cImxvZ2luUGFzc3dvcmRcIlxyXG4gICAgICAgICAgI3Bhc3N3b3JkPVwibmdNb2RlbFwiXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgcGFzc3dvcmRcIlxyXG4gICAgICAgICAgY2xhc3M9XCJsb2dpbi1pbnB1dCBwYXNzd29yZC1pbnB1dFwiXHJcbiAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgYXV0b2NvbXBsZXRlPVwiY3VycmVudC1wYXNzd29yZFwiXHJcbiAgICAgICAgLz5cclxuXHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cInBhc3N3b3JkLXRvZ2dsZS1idG5cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eSgpXCJcclxuICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5cclxuICAgICAgICAgICAge3sgc2hvd1Bhc3N3b3JkID8gJ3Zpc2liaWxpdHknIDogJ3Zpc2liaWxpdHlfb2ZmJyB9fVxyXG4gICAgICAgICAgPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIEBpZiAocGFzc3dvcmQuaW52YWxpZCAmJiAocGFzc3dvcmQuZGlydHkgfHwgcGFzc3dvcmQudG91Y2hlZCkpIHtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImVycm9yLXRleHRcIj4gUGFzc3dvcmQgaXMgcmVxdWlyZWQgPC9zcGFuPlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tIFJlbWVtYmVyIE1lIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJlbWVtYmVyLW1lLWNvbnRhaW5lclwiPlxyXG4gICAgICA8bGFiZWwgY2xhc3M9XCJyZW1lbWJlci1tZS1sYWJlbFwiPlxyXG4gICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgIG5hbWU9XCJyZW1lbWJlck1lXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwicmVtZW1iZXJNZVwiXHJcbiAgICAgICAgICBjbGFzcz1cInJlbWVtYmVyLW1lLWNoZWNrYm94XCJcclxuICAgICAgICAvPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVtZW1iZXItbWUtdGV4dFwiPlJlbWVtYmVyIG1lPC9zcGFuPlxyXG4gICAgICA8L2xhYmVsPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJsb2dpbi1hY3Rpb25zXCI+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIGNsYXNzPVwiYXV0aC1idG4gc2Vjb25kYXJ5XCI+Q2FuY2VsPC9idXR0b24+XHJcblxyXG4gICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJhdXRoLWJ0biBwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImxvZ2luRm9ybS5pbnZhbGlkIHx8IGlzTG9nZ2luZ0luXCI+XHJcbiAgICAgIHt7IGlzTG9nZ2luZ0luID8gJ0xvZ2dpbmcgaW4uLi4nIDogJ0xvZ2luJyB9fVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19