@projectcor/maia-components 2.28.0 → 2.30.0

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 (658) hide show
  1. package/lib/App.js +55 -0
  2. package/lib/components/atoms/ActionableButton.js +60 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.js +89 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.styles.js +21 -0
  5. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.js +9 -0
  6. package/lib/components/atoms/AgentActivityIndicator/index.js +2 -0
  7. package/lib/components/atoms/ApprovalBox/ApprovalBox.js +209 -0
  8. package/lib/components/atoms/ApprovalBox/ApprovalBox.styles.js +93 -0
  9. package/lib/components/atoms/ApprovalBox/index.js +2 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCard.js +218 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCard.styles.js +52 -0
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +448 -0
  13. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.styles.js +58 -0
  14. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +55 -0
  15. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.styles.js +14 -0
  16. package/lib/components/atoms/AttachmentCard/index.js +4 -0
  17. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +442 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.styles.js +119 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +222 -0
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +313 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +128 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/index.js +2 -0
  23. package/lib/components/atoms/Backdrop/Backdrop.js +17 -0
  24. package/lib/components/atoms/Backdrop/Backdrop.styles.js +9 -0
  25. package/lib/components/atoms/Backdrop/index.js +2 -0
  26. package/lib/components/atoms/CardItem.js +7 -0
  27. package/lib/components/atoms/CardMenu/CardMenu.js +131 -0
  28. package/lib/components/atoms/CardMenu/index.js +2 -0
  29. package/lib/components/atoms/CardMenu/styles.js +21 -0
  30. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.js +77 -0
  31. package/lib/components/atoms/ChatClientSelector/index.js +2 -0
  32. package/lib/components/atoms/ChatDisclaimerMessage/ChatDisclaimerMessage.js +9 -0
  33. package/lib/components/atoms/ChatDisclaimerMessage/index.js +2 -0
  34. package/lib/components/atoms/ChatDisclaimerMessage/styles.js +6 -0
  35. package/lib/components/atoms/Checkbox/Checkbox.js +34 -0
  36. package/lib/components/atoms/Checkbox/index.js +2 -0
  37. package/lib/components/atoms/Checkbox/styles.js +39 -0
  38. package/lib/components/atoms/Chip/Chip.js +150 -0
  39. package/lib/components/atoms/Chip/index.js +2 -0
  40. package/lib/components/atoms/Chip/styles.js +43 -0
  41. package/lib/components/atoms/ChipLlm/ChipLlm.js +45 -0
  42. package/lib/components/atoms/ChipLlm/ChipLlm.style.js +21 -0
  43. package/lib/components/atoms/ChipLlm/index.js +2 -0
  44. package/lib/components/atoms/ChipStatus/ChipStatus.interface.js +2 -0
  45. package/lib/components/atoms/ChipStatus/ChipStatus.js +14 -0
  46. package/lib/components/atoms/ChipStatus/ChipStatus.styles.js +27 -0
  47. package/lib/components/atoms/ChipStatus/index.js +2 -0
  48. package/lib/components/atoms/ClearButton.js +6 -0
  49. package/lib/components/atoms/ClientSelector/ClientSelector.js +146 -0
  50. package/lib/components/atoms/ClientSelector/ClientSelector.styles.js +15 -0
  51. package/lib/components/atoms/ClientSelector/index.js +2 -0
  52. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.js +38 -0
  53. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.styles.js +188 -0
  54. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.js +39 -0
  55. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +434 -0
  56. package/lib/components/atoms/ContextMentionChip/index.js +4 -0
  57. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +411 -0
  58. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.styles.js +10 -0
  59. package/lib/components/atoms/ContextMentionEditor/index.js +2 -0
  60. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.js +309 -0
  61. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.styles.js +157 -0
  62. package/lib/components/atoms/ContextMentionItem/index.js +2 -0
  63. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.js +307 -0
  64. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.styles.js +108 -0
  65. package/lib/components/atoms/ContextMentionPopover/index.js +3 -0
  66. package/lib/components/atoms/CopyToClipboard.js +70 -0
  67. package/lib/components/atoms/EditableLabel/EditableLabel.js +110 -0
  68. package/lib/components/atoms/EditableLabel/index.js +2 -0
  69. package/lib/components/atoms/EditableLabel/styles.js +7 -0
  70. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.js +22 -0
  71. package/lib/components/atoms/EmptySearchClients/EmptySearchClients.styles.js +18 -0
  72. package/lib/components/atoms/EmptySearchClients/index.js +2 -0
  73. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.js +19 -0
  74. package/lib/components/atoms/EmptySearchProjects/EmptySearchProjects.styles.js +15 -0
  75. package/lib/components/atoms/EmptySearchProjects/index.js +2 -0
  76. package/lib/components/atoms/EntitySelector/EntitySelector.js +247 -0
  77. package/lib/components/atoms/EntitySelector/EntitySelector.skeleton.js +38 -0
  78. package/lib/components/atoms/EntitySelector/EntitySelector.styles.js +67 -0
  79. package/lib/components/atoms/EntitySelector/index.js +2 -0
  80. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.js +14 -0
  81. package/lib/components/atoms/ErrorSearchClients/ErrorSearchClients.styles.js +15 -0
  82. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.js +14 -0
  83. package/lib/components/atoms/ErrorSearchFaqs/ErrorSearchFaqs.style.js +15 -0
  84. package/lib/components/atoms/ErrorSearchFaqs/index.js +2 -0
  85. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.js +18 -0
  86. package/lib/components/atoms/ErrorSearchProjects/ErrorSearchProjects.style.js +15 -0
  87. package/lib/components/atoms/ErrorSearchProjects/index.js +2 -0
  88. package/lib/components/atoms/Expand/Expand.js +32 -0
  89. package/lib/components/atoms/Expand/index.js +2 -0
  90. package/lib/components/atoms/Fade/Fade.js +56 -0
  91. package/lib/components/atoms/Fade/index.js +2 -0
  92. package/lib/components/atoms/FeedbackButton/FeedbackButton.js +59 -0
  93. package/lib/components/atoms/FeedbackButton/FeedbackButton.styles.js +14 -0
  94. package/lib/components/atoms/FeedbackButton/index.js +2 -0
  95. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.js +138 -0
  96. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.skeleton.js +44 -0
  97. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.styles.js +43 -0
  98. package/lib/components/atoms/FrequentlyAskedQuestions/index.js +2 -0
  99. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +122 -0
  100. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.skeleton.js +43 -0
  101. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +62 -0
  102. package/lib/components/atoms/FrequentlyUsedActions/index.js +2 -0
  103. package/lib/components/atoms/GoBackButton.js +24 -0
  104. package/lib/components/atoms/HelpButton.js +44 -0
  105. package/lib/components/atoms/IconButton.js +56 -0
  106. package/lib/components/atoms/ImagePreview/ImagePreview.js +96 -0
  107. package/lib/components/atoms/ImagePreview/ImagePreview.styles.js +70 -0
  108. package/lib/components/atoms/Input/CustomInput.interface.js +2 -0
  109. package/lib/components/atoms/Input/CustomInput.js +91 -0
  110. package/lib/components/atoms/Input/CustomInput.styles.js +39 -0
  111. package/lib/components/atoms/Input/index.js +2 -0
  112. package/lib/components/atoms/ListMenuOption/ListMenuOption.js +41 -0
  113. package/lib/components/atoms/ListMenuOption/index.js +2 -0
  114. package/lib/components/atoms/ListMenuOption/styles.js +9 -0
  115. package/lib/components/atoms/Loader.js +41 -0
  116. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.js +11 -0
  117. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.style.js +6 -0
  118. package/lib/components/atoms/LoadingFaqs/index.js +2 -0
  119. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.js +11 -0
  120. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.styles.js +6 -0
  121. package/lib/components/atoms/LoadingSearchClients/index.js +2 -0
  122. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.js +14 -0
  123. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.style.js +10 -0
  124. package/lib/components/atoms/LoadingSearchProjects/index.js +2 -0
  125. package/lib/components/atoms/LoadingText/LoadingText.js +18 -0
  126. package/lib/components/atoms/LoadingText/index.js +2 -0
  127. package/lib/components/atoms/LoadingText/styles.js +7 -0
  128. package/lib/components/atoms/MAIAButton/MAIAButton.js +33 -0
  129. package/lib/components/atoms/MAIAButton/index.js +2 -0
  130. package/lib/components/atoms/MAIAError/MAIAError.js +15 -0
  131. package/lib/components/atoms/MAIAError/index.js +2 -0
  132. package/lib/components/atoms/MAIAInput/MAIAInput.js +1058 -0
  133. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +266 -0
  134. package/lib/components/atoms/MAIAInput/index.js +2 -0
  135. package/lib/components/atoms/MAIAInput/maiaInputLayout.js +25 -0
  136. package/lib/components/atoms/MAIAInput/styles.js +182 -0
  137. package/lib/components/atoms/MAIAMessage/MAIAMessage.interfaces.js +2 -0
  138. package/lib/components/atoms/MAIAMessage/MAIAMessage.js +22 -0
  139. package/lib/components/atoms/MAIAMessage/index.js +2 -0
  140. package/lib/components/atoms/MAIAMessage/styles.js +7 -0
  141. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.config.js +23 -0
  142. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.interfaces.js +2 -0
  143. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.js +51 -0
  144. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.styles.js +26 -0
  145. package/lib/components/atoms/MaiaStreamdown/index.js +2 -0
  146. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.js +18 -0
  147. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +84 -0
  148. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.js +15 -0
  149. package/lib/components/atoms/MaiaWrapper/index.js +3 -0
  150. package/lib/components/atoms/MaiaWrapper/styles.js +21 -0
  151. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.interface.js +2 -0
  152. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.js +84 -0
  153. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.styles.js +53 -0
  154. package/lib/components/atoms/ModalClientAccess/index.js +2 -0
  155. package/lib/components/atoms/ModalInfo/ModalInfo.js +52 -0
  156. package/lib/components/atoms/ModalInfo/ModalInfoContent.js +7 -0
  157. package/lib/components/atoms/ModalInfo/index.js +3 -0
  158. package/lib/components/atoms/ModalInfo/styles.js +7 -0
  159. package/lib/components/atoms/ModalProject/ModalProject.interface.js +2 -0
  160. package/lib/components/atoms/ModalProject/ModalProject.js +112 -0
  161. package/lib/components/atoms/ModalProject/ModalProject.style.js +59 -0
  162. package/lib/components/atoms/ModalProject/index.js +2 -0
  163. package/lib/components/atoms/NextPageLoader.js +33 -0
  164. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.js +28 -0
  165. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +180 -0
  166. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.styles.js +34 -0
  167. package/lib/components/atoms/OnboardingModalButton/index.js +3 -0
  168. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +131 -0
  169. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.styles.js +59 -0
  170. package/lib/components/atoms/OptionAccessibility/index.js +2 -0
  171. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.js +27 -0
  172. package/lib/components/atoms/OptionCorPermission/OptionCorPermission.styles.js +18 -0
  173. package/lib/components/atoms/OptionCorPermission/index.js +2 -0
  174. package/lib/components/atoms/PrimaryButton.js +31 -0
  175. package/lib/components/atoms/ProjectSelector/ProjectSelector.js +77 -0
  176. package/lib/components/atoms/ProjectSelector/ProjectSelector.styles.js +61 -0
  177. package/lib/components/atoms/ProjectSelector/index.js +2 -0
  178. package/lib/components/atoms/SecondaryButton.js +20 -0
  179. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  180. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  181. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  182. package/lib/components/atoms/Skeleton/Skeleton.js +36 -0
  183. package/lib/components/atoms/Skeleton/index.js +2 -0
  184. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.js +16 -0
  185. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.styles.js +24 -0
  186. package/lib/components/atoms/SlashCommandChip/buildSlashChipElement.js +18 -0
  187. package/lib/components/atoms/SlashCommandChip/index.js +4 -0
  188. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +210 -0
  189. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.styles.js +53 -0
  190. package/lib/components/atoms/SlashCommandDropdown/index.js +2 -0
  191. package/lib/components/atoms/Switch/Switch.js +27 -0
  192. package/lib/components/atoms/Switch/Switch.styles.js +22 -0
  193. package/lib/components/atoms/Switch/index.js +2 -0
  194. package/lib/components/atoms/TextArea/CustomTextArea.interface.js +2 -0
  195. package/lib/components/atoms/TextArea/CustomTextArea.js +93 -0
  196. package/lib/components/atoms/TextArea/CustomTextArea.styles.js +25 -0
  197. package/lib/components/atoms/TextArea/TextArea.interfaces.js +2 -0
  198. package/lib/components/atoms/TextArea/TextArea.js +172 -0
  199. package/lib/components/atoms/TextArea/TextArea.styles.js +16 -0
  200. package/lib/components/atoms/TextArea/index.js +2 -0
  201. package/lib/components/atoms/ThirdButton.js +19 -0
  202. package/lib/components/atoms/VideoModal/VideoModal.js +76 -0
  203. package/lib/components/atoms/VideoModal/index.js +2 -0
  204. package/lib/components/atoms/WithAppCfg.js +26 -0
  205. package/lib/components/atoms/WithFeatureValidation.js +23 -0
  206. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.js +9 -0
  207. package/lib/components/atoms/WrapperCenterIcon/WrapperCenterIcon.styles.js +6 -0
  208. package/lib/components/atoms/WrapperCenterIcon/index.js +2 -0
  209. package/lib/components/atoms/icons/AIIcon.js +23 -0
  210. package/lib/components/atoms/icons/AacFile.js +39 -0
  211. package/lib/components/atoms/icons/AccessibilityIcon.js +42 -0
  212. package/lib/components/atoms/icons/ActionAssignIcon.js +111 -0
  213. package/lib/components/atoms/icons/ActionCalendarIcon.js +112 -0
  214. package/lib/components/atoms/icons/ActionChargeHoursIcon.js +111 -0
  215. package/lib/components/atoms/icons/ActionChatIcon.js +71 -0
  216. package/lib/components/atoms/icons/ActionCreateIcon.js +91 -0
  217. package/lib/components/atoms/icons/ActionCreateReworkIcon.js +39 -0
  218. package/lib/components/atoms/icons/ActionCreateSubtaskIcon.js +37 -0
  219. package/lib/components/atoms/icons/ActionEditIcon.js +39 -0
  220. package/lib/components/atoms/icons/ActionSummaryMessagesIcon.js +88 -0
  221. package/lib/components/atoms/icons/ActionSummaryTaskIcon.js +37 -0
  222. package/lib/components/atoms/icons/ActionTimeBackIcon.js +112 -0
  223. package/lib/components/atoms/icons/AgentMaiaIcon.js +31 -0
  224. package/lib/components/atoms/icons/Brain.js +77 -0
  225. package/lib/components/atoms/icons/CorAccessIcon.js +41 -0
  226. package/lib/components/atoms/icons/CorLogo.js +76 -0
  227. package/lib/components/atoms/icons/CsvFile.js +41 -0
  228. package/lib/components/atoms/icons/DocFile.js +41 -0
  229. package/lib/components/atoms/icons/DocxFile.js +41 -0
  230. package/lib/components/atoms/icons/EmptyClientIllustration.js +67 -0
  231. package/lib/components/atoms/icons/EmptyHistory.js +46 -0
  232. package/lib/components/atoms/icons/EmptySearchIllustration.js +37 -0
  233. package/lib/components/atoms/icons/EmptyState.js +84 -0
  234. package/lib/components/atoms/icons/EmptyStateAgents.js +58 -0
  235. package/lib/components/atoms/icons/ErrorIcon.js +14 -0
  236. package/lib/components/atoms/icons/ErrorSearchIllustration.js +52 -0
  237. package/lib/components/atoms/icons/ErrorState.js +51 -0
  238. package/lib/components/atoms/icons/FaqChevronIcon.js +39 -0
  239. package/lib/components/atoms/icons/FaqsIcon.js +51 -0
  240. package/lib/components/atoms/icons/FlacIcon.js +39 -0
  241. package/lib/components/atoms/icons/FolderIcon.js +29 -0
  242. package/lib/components/atoms/icons/HomeIcon.js +30 -0
  243. package/lib/components/atoms/icons/ImageFile.js +46 -0
  244. package/lib/components/atoms/icons/M4aFile.js +39 -0
  245. package/lib/components/atoms/icons/MAIAIcon.js +20 -0
  246. package/lib/components/atoms/icons/MAIAIsologo.js +65 -0
  247. package/lib/components/atoms/icons/MDFile.js +41 -0
  248. package/lib/components/atoms/icons/MaiaChatLayoutFloatingIcon.js +41 -0
  249. package/lib/components/atoms/icons/MaiaChatLayoutFullscreenIcon.js +41 -0
  250. package/lib/components/atoms/icons/MaiaChatLayoutMenuIcon.js +33 -0
  251. package/lib/components/atoms/icons/MaiaChatLayoutSidebarIcon.js +41 -0
  252. package/lib/components/atoms/icons/MaiaInputAddIcon.js +42 -0
  253. package/lib/components/atoms/icons/MaiaInputAttachIcon.js +29 -0
  254. package/lib/components/atoms/icons/MaiaInputAttachmentImageIcon.js +33 -0
  255. package/lib/components/atoms/icons/MaiaInputDeepSearchIcon.js +35 -0
  256. package/lib/components/atoms/icons/MaiaInputMentionIcon.js +44 -0
  257. package/lib/components/atoms/icons/MaiaInputRobotIcon.js +29 -0
  258. package/lib/components/atoms/icons/MaiaInputSendIcon.js +29 -0
  259. package/lib/components/atoms/icons/MaiaInputSlashIcon.js +29 -0
  260. package/lib/components/atoms/icons/MaiaInputWebSearchIcon.js +35 -0
  261. package/lib/components/atoms/icons/MaiaSettingsProject.js +111 -0
  262. package/lib/components/atoms/icons/MaiaSettingsProjectV2.js +193 -0
  263. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  264. package/lib/components/atoms/icons/MaiaStoreIcon.js +31 -0
  265. package/lib/components/atoms/icons/Mp3File.js +39 -0
  266. package/lib/components/atoms/icons/Mp4File.js +39 -0
  267. package/lib/components/atoms/icons/MyAgentsNavIcon.js +51 -0
  268. package/lib/components/atoms/icons/NewChat.js +29 -0
  269. package/lib/components/atoms/icons/NotionIcon.js +36 -0
  270. package/lib/components/atoms/icons/OgaFile.js +39 -0
  271. package/lib/components/atoms/icons/OggFile.js +39 -0
  272. package/lib/components/atoms/icons/PdfFile.js +39 -0
  273. package/lib/components/atoms/icons/PptFile.js +47 -0
  274. package/lib/components/atoms/icons/PptxFile.js +49 -0
  275. package/lib/components/atoms/icons/RetryIcon.js +34 -0
  276. package/lib/components/atoms/icons/SkillIcon.js +30 -0
  277. package/lib/components/atoms/icons/SkillsNavIcon.js +27 -0
  278. package/lib/components/atoms/icons/SubtaskIcon.js +36 -0
  279. package/lib/components/atoms/icons/TaskLinkIcon.js +27 -0
  280. package/lib/components/atoms/icons/TelescopeIcon.js +60 -0
  281. package/lib/components/atoms/icons/TemplateGradientIcon.js +42 -0
  282. package/lib/components/atoms/icons/TextFile.js +41 -0
  283. package/lib/components/atoms/icons/WavFile.js +39 -0
  284. package/lib/components/atoms/icons/WebmFile.js +50 -0
  285. package/lib/components/atoms/icons/XlsFile.js +42 -0
  286. package/lib/components/atoms/icons/XlsxFile.js +42 -0
  287. package/lib/components/atoms/icons/index.js +50 -0
  288. package/lib/components/atoms/index.js +42 -0
  289. package/lib/components/index.js +11 -0
  290. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.interface.js +2 -0
  291. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +149 -0
  292. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.styles.js +53 -0
  293. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +415 -0
  294. package/lib/components/molecules/AbmSection/AbmGeneralSection.styles.js +152 -0
  295. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +374 -0
  296. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.styles.js +106 -0
  297. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +92 -0
  298. package/lib/components/molecules/AbmSection/AbmLoaderFiles.styles.js +57 -0
  299. package/lib/components/molecules/AbmSection/index.js +4 -0
  300. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.js +52 -0
  301. package/lib/components/molecules/ChatAIClientSelector/index.js +2 -0
  302. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +117 -0
  303. package/lib/components/molecules/ChatAIContent/ChatAIContent.skeleton.js +187 -0
  304. package/lib/components/molecules/ChatAIContent/ChatAIContent.styles.js +6 -0
  305. package/lib/components/molecules/ChatAIContent/index.js +2 -0
  306. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.js +241 -0
  307. package/lib/components/molecules/ChatAIHistory/index.js +2 -0
  308. package/lib/components/molecules/ChatAIHistory/styles.js +22 -0
  309. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +649 -0
  310. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.js +115 -0
  311. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.styles.js +95 -0
  312. package/lib/components/molecules/ChatAIHome/index.js +2 -0
  313. package/lib/components/molecules/ChatAIHome/styles.js +335 -0
  314. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.js +137 -0
  315. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +853 -0
  316. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.js +47 -0
  317. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.styles.js +37 -0
  318. package/lib/components/molecules/ChatAIMessages/README.md +101 -0
  319. package/lib/components/molecules/ChatAIMessages/index.js +2 -0
  320. package/lib/components/molecules/ChatAIMessages/newStyles.js +131 -0
  321. package/lib/components/molecules/ChatAIMessages/styles.js +94 -0
  322. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +1217 -0
  323. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +58 -0
  324. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +127 -0
  325. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.styles.js +34 -0
  326. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/index.js +2 -0
  327. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +189 -0
  328. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -0
  329. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/index.js +2 -0
  330. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +448 -0
  331. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +108 -0
  332. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/index.js +2 -0
  333. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +48 -0
  334. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +38 -0
  335. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  336. package/lib/components/molecules/ChatAIModal/constants.js +40 -0
  337. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.js +16 -0
  338. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.styles.js +12 -0
  339. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/constants.js +13 -0
  340. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/index.js +3 -0
  341. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.js +57 -0
  342. package/lib/components/molecules/ChatAIModal/index.js +2 -0
  343. package/lib/components/molecules/ChatAIModal/layout.js +74 -0
  344. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +457 -0
  345. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.styles.js +218 -0
  346. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +357 -0
  347. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.styles.js +145 -0
  348. package/lib/components/molecules/ChatAIMySkills/index.js +2 -0
  349. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.js +48 -0
  350. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.styles.js +49 -0
  351. package/lib/components/molecules/ChatAIProjectSelector/index.js +2 -0
  352. package/lib/components/molecules/ChatFooter/ChatFooter.js +337 -0
  353. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.js +32 -0
  354. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.styles.js +14 -0
  355. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +201 -0
  356. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.styles.js +51 -0
  357. package/lib/components/molecules/ChatFooter/index.js +2 -0
  358. package/lib/components/molecules/ChatFooter/styles.js +23 -0
  359. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.js +62 -0
  360. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.styles.js +6 -0
  361. package/lib/components/molecules/ContextMentionInput/index.js +2 -0
  362. package/lib/components/molecules/MessageFeedback/MessageFeedback.js +118 -0
  363. package/lib/components/molecules/MessageFeedback/index.js +2 -0
  364. package/lib/components/molecules/MessageFeedback/styles.js +14 -0
  365. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.js +127 -0
  366. package/lib/components/molecules/ProjectSummaryChat/index.js +2 -0
  367. package/lib/components/molecules/ProjectSummaryChat/styles.js +8 -0
  368. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.js +152 -0
  369. package/lib/components/molecules/ProjectSummaryConfig/index.js +2 -0
  370. package/lib/components/molecules/ProjectSummaryConfig/styles.js +86 -0
  371. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.js +49 -0
  372. package/lib/components/molecules/ProjectSummaryContent/index.js +2 -0
  373. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.js +19 -0
  374. package/lib/components/molecules/ProjectSummaryModal/index.js +2 -0
  375. package/lib/components/molecules/ProjectSummaryModal/styles.js +2 -0
  376. package/lib/components/molecules/Sidebar/Sidebar.js +715 -0
  377. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +157 -0
  378. package/lib/components/molecules/Sidebar/Sidebar.skeleton.js +48 -0
  379. package/lib/components/molecules/Sidebar/Sidebar.styles.js +75 -0
  380. package/lib/components/molecules/Sidebar/index.js +2 -0
  381. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +1420 -0
  382. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.styles.js +93 -0
  383. package/lib/components/organisms/AbmAgentModal/index.js +2 -0
  384. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.js +175 -0
  385. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.styles.js +34 -0
  386. package/lib/components/organisms/AbmSkillGenerateModal/index.js +2 -0
  387. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +432 -0
  388. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.styles.js +98 -0
  389. package/lib/components/organisms/AbmSkillModal/index.js +2 -0
  390. package/lib/components/organisms/ChatAI/ChatAI.js +167 -0
  391. package/lib/components/organisms/ChatAI/index.js +2 -0
  392. package/lib/components/organisms/ChatAI/styles.js +7 -0
  393. package/lib/components/organisms/ClientAIButton/ClientAIButton.js +23 -0
  394. package/lib/components/organisms/ClientAIButton/index.js +2 -0
  395. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.js +86 -0
  396. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.styles.js +39 -0
  397. package/lib/components/organisms/DeleteAgentModal/index.js +2 -0
  398. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.js +122 -0
  399. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.styles.js +47 -0
  400. package/lib/components/organisms/DeleteQuestionModal/index.js +2 -0
  401. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.js +138 -0
  402. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.styles.js +69 -0
  403. package/lib/components/organisms/EditQuestionModal/index.js +2 -0
  404. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.js +113 -0
  405. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.styles.js +54 -0
  406. package/lib/components/organisms/ModalFileExceeds/index.js +2 -0
  407. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.js +26 -0
  408. package/lib/components/organisms/ProjectAIButton/index.js +2 -0
  409. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +60 -0
  410. package/lib/components/organisms/ProjectSummary/index.js +2 -0
  411. package/lib/components/organisms/ProjectSummary/styles.js +7 -0
  412. package/lib/components/organisms/SnackBar/Snackbar.interface.js +2 -0
  413. package/lib/components/organisms/SnackBar/Snackbar.js +73 -0
  414. package/lib/components/organisms/SnackBar/Snackbar.styles.js +9 -0
  415. package/lib/components/organisms/SnackBar/index.js +2 -0
  416. package/lib/components/organisms/SourcesInformation/SourceItem.js +18 -0
  417. package/lib/components/organisms/SourcesInformation/SourceItem.styles.js +14 -0
  418. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +66 -0
  419. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.styles.js +27 -0
  420. package/lib/components/organisms/SourcesInformation/index.js +2 -0
  421. package/lib/constants/config.js +13 -0
  422. package/lib/constants/formatExtensions.js +55 -0
  423. package/lib/constants/gqlClient.js +4 -0
  424. package/lib/constants/maiaHourAgentAccess.js +15 -0
  425. package/lib/constants/maiaTaskPanelAccess.js +24 -0
  426. package/lib/constants/maiaTaskPanelOutsideClick.js +9 -0
  427. package/lib/constants/maiaTaskPanelZIndex.js +19 -0
  428. package/lib/constants/permissions/config.js +72 -0
  429. package/lib/constants/permissions/index.js +3 -0
  430. package/lib/constants/permissions/types.js +2 -0
  431. package/lib/constants/permissions/utils.js +18 -0
  432. package/lib/constants/plannerSyncEvents.js +15 -0
  433. package/lib/constants/taskLinkIcon.js +15 -0
  434. package/lib/constants/taskUrls.js +11 -0
  435. package/lib/context/cor-user.js +31 -0
  436. package/lib/context/global-context.js +39 -0
  437. package/lib/dev/DevChatAI.js +101 -0
  438. package/lib/dev/DevContextMentionInput.js +67 -0
  439. package/lib/dev/ProjectSummary.js +9 -0
  440. package/lib/dev/Providers.js +27 -0
  441. package/lib/exports.js +2 -0
  442. package/lib/hooks/README.md +192 -0
  443. package/lib/hooks/index.js +30 -0
  444. package/lib/hooks/useAccessClient/index.js +2 -0
  445. package/lib/hooks/useAccessClient/useAccessClient.js +81 -0
  446. package/lib/hooks/useAgentModel/index.js +2 -0
  447. package/lib/hooks/useAgentModel/useAgentModel.js +62 -0
  448. package/lib/hooks/useAgentModel/useCreateAgent.js +128 -0
  449. package/lib/hooks/useAgentModel/useDeleteAgent.js +88 -0
  450. package/lib/hooks/useAgentModel/useUpdateAgent.js +129 -0
  451. package/lib/hooks/useAgentSuggestions.js +60 -0
  452. package/lib/hooks/useCaretPosition.js +65 -0
  453. package/lib/hooks/useChatManager/index.js +2 -0
  454. package/lib/hooks/useChatManager/useChatManager.interface.js +2 -0
  455. package/lib/hooks/useChatManager/useChatManager.js +1782 -0
  456. package/lib/hooks/useChatMessages/index.js +2 -0
  457. package/lib/hooks/useChatMessages/useChatMessages.interface.js +2 -0
  458. package/lib/hooks/useChatMessages/useChatMessages.js +722 -0
  459. package/lib/hooks/useChats/index.js +2 -0
  460. package/lib/hooks/useChats/useChats.interfaces.js +2 -0
  461. package/lib/hooks/useChats/useChats.js +187 -0
  462. package/lib/hooks/useClientSearch.js +163 -0
  463. package/lib/hooks/useContextMentions.js +463 -0
  464. package/lib/hooks/useContextPinPopover.js +228 -0
  465. package/lib/hooks/useDebounce.js +18 -0
  466. package/lib/hooks/useEntitySearch.js +1239 -0
  467. package/lib/hooks/useEvent.js +93 -0
  468. package/lib/hooks/useFrequentlyAskedQuestions.js +150 -0
  469. package/lib/hooks/useFrequentlyUsedActions.js +94 -0
  470. package/lib/hooks/useKnowledge/deleteKnowledge.js +69 -0
  471. package/lib/hooks/useKnowledge/downloadKnowledge.js +81 -0
  472. package/lib/hooks/useKnowledge/index.js +4 -0
  473. package/lib/hooks/useKnowledge/saveKnowledge.js +107 -0
  474. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +156 -0
  475. package/lib/hooks/useMaiaTaskPanelZIndex.js +17 -0
  476. package/lib/hooks/useMentionAllowedTypes.js +136 -0
  477. package/lib/hooks/useMentionPopover.js +366 -0
  478. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
  479. package/lib/hooks/useModal/index.js +2 -0
  480. package/lib/hooks/useModal/useModal.interfaces.js +2 -0
  481. package/lib/hooks/useModal/useModal.js +47 -0
  482. package/lib/hooks/useOnboardingNavigation.js +20 -0
  483. package/lib/hooks/useOrchestratorStream/index.js +2 -0
  484. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +2 -0
  485. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +269 -0
  486. package/lib/hooks/useProjectSearch.js +183 -0
  487. package/lib/hooks/useProjectSummary.js +101 -0
  488. package/lib/hooks/useProjectSummaryConfig.js +211 -0
  489. package/lib/hooks/useProjects.js +46 -0
  490. package/lib/hooks/useRecentClientsSearch.js +150 -0
  491. package/lib/hooks/useRecentContexts.js +86 -0
  492. package/lib/hooks/useResize.js +29 -0
  493. package/lib/hooks/useSlashCommands.js +84 -0
  494. package/lib/hooks/useSmoothStreamText/index.js +2 -0
  495. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.js +197 -0
  496. package/lib/hooks/useSnackBarManager/useSnackBarManager.js +41 -0
  497. package/lib/hooks/useStreamResponse.js +112 -0
  498. package/lib/hooks/useStreamdownStyles.js +13 -0
  499. package/lib/hooks/useStreamingMessage/index.js +2 -0
  500. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +18 -0
  501. package/lib/hooks/useT.js +17 -0
  502. package/lib/hooks/useTabTaskDefault.js +33 -0
  503. package/lib/hooks/useTaskPanel.js +22 -0
  504. package/lib/hooks/useTextOverflowEllipsisTooltip.js +34 -0
  505. package/lib/hooks/useToggle.js +19 -0
  506. package/lib/hooks/useToggleFavorite/index.js +2 -0
  507. package/lib/hooks/useToggleFavorite/useToggleFavorite.js +83 -0
  508. package/lib/index.css +76 -0
  509. package/lib/index.js +30 -0
  510. package/lib/lang/br/index.js +761 -0
  511. package/lib/lang/en/index.js +761 -0
  512. package/lib/lang/es/index.js +762 -0
  513. package/lib/lang/fr/index.js +582 -0
  514. package/lib/lang/index.js +24 -0
  515. package/lib/lang/utils.js +33 -0
  516. package/lib/mocks/mockChats.js +395 -0
  517. package/lib/mocks/mockOrchestrator.js +5 -0
  518. package/lib/mocks/mockProject.js +11 -0
  519. package/lib/mocks/mockProjectSummary.js +6 -0
  520. package/lib/mocks/mockedUser.js +169 -0
  521. package/lib/services/apolloClient.js +3 -0
  522. package/lib/services/appcues.js +19 -0
  523. package/lib/services/corpilot/ProjectSummary/getProjectSummary.js +31 -0
  524. package/lib/services/corpilot/ProjectSummary/index.js +5 -0
  525. package/lib/services/corpilot/client.js +27 -0
  526. package/lib/services/corpilot/index.js +5 -0
  527. package/lib/services/maia/Access/updateAccess.js +59 -0
  528. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +46 -0
  529. package/lib/services/maia/Actions/getSlashCommands.js +39 -0
  530. package/lib/services/maia/Actions/index.js +7 -0
  531. package/lib/services/maia/Agents/createAgent.js +39 -0
  532. package/lib/services/maia/Agents/deleteAgent.js +38 -0
  533. package/lib/services/maia/Agents/fetchAgentDetail.js +122 -0
  534. package/lib/services/maia/Agents/getAgentById.js +162 -0
  535. package/lib/services/maia/Agents/getAgentModels.js +112 -0
  536. package/lib/services/maia/Agents/getAgentSuggestions.js +44 -0
  537. package/lib/services/maia/Agents/getAgents.js +718 -0
  538. package/lib/services/maia/Agents/setAgentToolGroups.js +42 -0
  539. package/lib/services/maia/Agents/toggleFavorite.js +34 -0
  540. package/lib/services/maia/Agents/updateAgent.js +39 -0
  541. package/lib/services/maia/Chats/deleteChat.js +32 -0
  542. package/lib/services/maia/Chats/getChatMessages.js +144 -0
  543. package/lib/services/maia/Chats/getChatsByUserId.js +82 -0
  544. package/lib/services/maia/Chats/index.js +15 -0
  545. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  546. package/lib/services/maia/Chats/patchChat.js +43 -0
  547. package/lib/services/maia/Chats/wasHelpfulChat.js +31 -0
  548. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.js +55 -0
  549. package/lib/services/maia/Faqs/index.js +5 -0
  550. package/lib/services/maia/Knowledge/delete.js +41 -0
  551. package/lib/services/maia/Knowledge/download.js +48 -0
  552. package/lib/services/maia/Knowledge/index.js +3 -0
  553. package/lib/services/maia/Knowledge/save.js +43 -0
  554. package/lib/services/maia/Orchestrator/index.js +7 -0
  555. package/lib/services/maia/Orchestrator/orchestrator.js +246 -0
  556. package/lib/services/maia/RecentClients/getRecentClients.js +43 -0
  557. package/lib/services/maia/RecentClients/index.js +6 -0
  558. package/lib/services/maia/RecentContexts/getRecentContexts.js +54 -0
  559. package/lib/services/maia/RecentContexts/index.js +6 -0
  560. package/lib/services/maia/RecentProjects/getRecentProjects.js +55 -0
  561. package/lib/services/maia/RecentProjects/index.js +6 -0
  562. package/lib/services/maia/RecentTasks/getRecentTasks.js +54 -0
  563. package/lib/services/maia/RecentTasks/index.js +6 -0
  564. package/lib/services/maia/RecentUsers/getRecentUsers.js +59 -0
  565. package/lib/services/maia/RecentUsers/index.js +6 -0
  566. package/lib/services/maia/Skills/createSkill.js +39 -0
  567. package/lib/services/maia/Skills/deleteSkill.js +38 -0
  568. package/lib/services/maia/Skills/generateSkill.js +41 -0
  569. package/lib/services/maia/Skills/getSkills.js +90 -0
  570. package/lib/services/maia/Skills/updateSkill.js +39 -0
  571. package/lib/services/maia/client.js +27 -0
  572. package/lib/services/maia/index.js +17 -0
  573. package/lib/services/query/ClientSearchQuery.js +5 -0
  574. package/lib/services/query/entitySearchQuery.js +18 -0
  575. package/lib/services/query/index.js +2 -0
  576. package/lib/services/query/projectSearchByValueQuery.js +5 -0
  577. package/lib/services/query/taskUserTabQuery.js +8 -0
  578. package/lib/services/query/usersDirectoryQuery.js +19 -0
  579. package/lib/services/types.js +6 -0
  580. package/lib/services/utils/fetchCOR.js +117 -0
  581. package/lib/services/utils/getCookie.js +10 -0
  582. package/lib/services/utils/index.js +3 -0
  583. package/lib/services/utils/mapChatMessages.js +287 -0
  584. package/lib/services/utils/validateIsMaia.js +4 -0
  585. package/lib/store/chatsSidebarOptimistic.js +92 -0
  586. package/lib/store/chatsStore.types.js +2 -0
  587. package/lib/store/chatsStoreLifecycle.js +8 -0
  588. package/lib/store/faqsStore.types.js +2 -0
  589. package/lib/store/index.js +4 -0
  590. package/lib/store/maiaLastChatPersistence.js +35 -0
  591. package/lib/store/sessions/activeView.js +22 -0
  592. package/lib/store/sessions/index.js +9 -0
  593. package/lib/store/sessions/sessionHitlContext.js +15 -0
  594. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  595. package/lib/store/sessions/sessionNotifications.js +110 -0
  596. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  597. package/lib/store/sessions/sessionStreamManager.js +715 -0
  598. package/lib/store/sessions/sessionStreamingText.js +80 -0
  599. package/lib/store/sessions/sessions.types.js +35 -0
  600. package/lib/store/sessions/useSessionMeta.js +39 -0
  601. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  602. package/lib/store/sessions/useSessionsStore.js +197 -0
  603. package/lib/store/useChatsStore.js +387 -0
  604. package/lib/store/useFaqsStore.js +27 -0
  605. package/lib/streamdownStyles.js +9 -0
  606. package/lib/styles/StyledCleanContainer.js +7 -0
  607. package/lib/styles/cascade.js +14 -0
  608. package/lib/styles/config.js +47 -0
  609. package/lib/styles/shared/scrollable.js +3 -0
  610. package/lib/styles/transitions.js +21 -0
  611. package/lib/types/Action.js +2 -0
  612. package/lib/types/AgentSuggestion.js +2 -0
  613. package/lib/types/Chat.js +10 -0
  614. package/lib/types/Client.js +2 -0
  615. package/lib/types/FrequentlyAskedQuestion.js +2 -0
  616. package/lib/types/Project.js +2 -0
  617. package/lib/types/ProjectSummaryConfigKeys.js +9 -0
  618. package/lib/types/Task.js +2 -0
  619. package/lib/types/agent.js +2 -0
  620. package/lib/types/agentModal.js +2 -0
  621. package/lib/types/contextMention.js +37 -0
  622. package/lib/types/global.d.js +2 -0
  623. package/lib/types/skill.js +2 -0
  624. package/lib/types/streamActivity.js +2 -0
  625. package/lib/types/userType.d.js +2 -0
  626. package/lib/utils/actionCategoryMap.js +37 -0
  627. package/lib/utils/actionIconMap.js +61 -0
  628. package/lib/utils/agentDisplayName.js +42 -0
  629. package/lib/utils/chatInputFiles.js +52 -0
  630. package/lib/utils/contextMentionIcons.js +134 -0
  631. package/lib/utils/contextMentionLabel.js +4 -0
  632. package/lib/utils/contextMentionTriggers.js +54 -0
  633. package/lib/utils/contextMentionTypeLabel.js +17 -0
  634. package/lib/utils/corConnectorMentionTypes.js +41 -0
  635. package/lib/utils/ensureStreamdownStyles.js +21 -0
  636. package/lib/utils/entityLinkRender.js +135 -0
  637. package/lib/utils/fileDownloadHelper.js +40 -0
  638. package/lib/utils/formatQuickActionMessage.js +16 -0
  639. package/lib/utils/formatUnreadCount.js +6 -0
  640. package/lib/utils/getUnitFileSize.js +13 -0
  641. package/lib/utils/hitlAnalytics.js +65 -0
  642. package/lib/utils/hoursPlannerQuickActionType.js +64 -0
  643. package/lib/utils/imagePreprocessor.js +108 -0
  644. package/lib/utils/index.js +3 -0
  645. package/lib/utils/maiaHostOpen.js +19 -0
  646. package/lib/utils/maiaStreamdownRehypePlugins.js +27 -0
  647. package/lib/utils/mapBackendLang.js +8 -0
  648. package/lib/utils/normalizeAgentConnectors.js +70 -0
  649. package/lib/utils/openTaskInCorPanel.js +22 -0
  650. package/lib/utils/orchestratorSubagents.js +11 -0
  651. package/lib/utils/renderContextMentions.js +399 -0
  652. package/lib/utils/retryCompletion.js +85 -0
  653. package/lib/utils/slashCommandMarker.js +30 -0
  654. package/lib/utils/sortManagerHoursHomeFuas.js +14 -0
  655. package/lib/utils/sseStreamContent.js +17 -0
  656. package/lib/utils/streamActivityMessages.js +359 -0
  657. package/lib/utils/validateTrimmedFields.js +8 -0
  658. package/package.json +1 -1
@@ -0,0 +1,715 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
2
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
+ /* eslint-disable camelcase */
8
+ /* eslint-disable no-undef */
9
+ /* eslint-disable no-param-reassign */
10
+ /* eslint-disable @typescript-eslint/no-shadow */
11
+ /* eslint-disable @typescript-eslint/no-explicit-any */
12
+ /* eslint-disable no-nested-ternary */
13
+ /* eslint-disable jsx-a11y/click-events-have-key-events */
14
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
15
+ import { useEffect, useMemo, useRef, useState } from 'react';
16
+ import { ChevronDoubleLeft } from '@projectcor/icons/lib/components/ChevronDoubleLeft';
17
+ import { History } from '@projectcor/icons/lib/components/History';
18
+ import { CUButton } from '@projectcor/button/lib/components/CUButton';
19
+ import { MenuDots } from '@projectcor/icons/lib/components/MenuDots';
20
+ import { Pencil } from '@projectcor/icons/lib/components/Pencil';
21
+ import { Trash } from '@projectcor/icons/lib/components/Trash';
22
+ import { Tooltip } from '@projectcor/tooltipv2/lib/components/Tooltip';
23
+ import { EmptyHistoryIcon } from '../../atoms/icons/EmptyHistory';
24
+ import { useResizeListener } from '../../../hooks/useResize';
25
+ import { useChats } from '../../../hooks/useChats';
26
+ import { SidebarChatsSkeleton } from './Sidebar.skeleton';
27
+ import { ErrorState, MAIAIcon, MaiaStoreIcon, MyAgentsNavIcon, SkillsNavIcon, NewChat } from '../../atoms/icons';
28
+ import { EVENTS, useEvent } from '../../../hooks/useEvent';
29
+ import { useT } from '../../../hooks/useT';
30
+ import { OptionItem } from '../../atoms/CardMenu/CardMenu';
31
+ import { EditQuestionModal } from '../../organisms/EditQuestionModal';
32
+ import { DeleteQuestionModal } from '../../organisms/DeleteQuestionModal';
33
+ import { ErrorIcon } from '../../atoms/icons/ErrorIcon';
34
+ import { useUser } from '../../../context/cor-user';
35
+ import { FeedbackButton } from '../../atoms/FeedbackButton';
36
+ import { useGlobalContext } from '../../../context/global-context';
37
+ import { fetchMaia } from '../../../services/maia/client';
38
+ import { canAccessToSkills } from '../../../constants/permissions';
39
+ import { mapCORLang } from '../../../lang/utils';
40
+ import { formatChatListTitleMentions } from '../../../utils/renderContextMentions';
41
+ import { getAgentDisplayName, isMarketplaceGlobalCloneAgent } from '../../../utils/agentDisplayName';
42
+ import { APPCUES_EVENTS, APPCUES_SELECTORS, trackAppcuesEvent } from '../../../services/appcues';
43
+ import { formatUnreadCount } from '../../../utils/formatUnreadCount';
44
+ import { SessionGeneratingDot } from '../../atoms/SessionGeneratingDot';
45
+ import { useIsSessionGenerating, useSessionMeta } from '../../../store/sessions/useSessionMeta';
46
+ import { useMaiaTaskPanelZIndex } from '../../../hooks/useMaiaTaskPanelZIndex';
47
+ import { SCLHCWrapper, SCLHCWrapperAgent, SCLHCWrapperAgentText, SCLHCWrapperButtonActions, SCLHCWrapperContent, SCLHCWrapperTitle, SCLHCWrapperTitleRow, SCSWrapperCollapsedButton, SCSWrapperNewChatIcon, SCSWrapperAgentsNavIcon } from './Sidebar.styles';
48
+ import { SCSSidebarRoot, SCSSidebarToolbar, SCSSidebarBody, SCSSidebarOpenPanel, SCSSidebarAgentsBlock, SCSSidebarAgentsActions, SCSSidebarMaiakerNavButton, SCSSidebarMaiakerNavLabel, SCSSidebarConversationsHeading, SCSSidebarConversationsHeadingRow, SCSSidebarUnreadAnchor, SCSSidebarUnreadCount, SCSSidebarChatsScroll, SCSSidebarErrorStateColumn, SCSSidebarErrorStateTop, SCSSidebarErrorBanner, SCSSidebarErrorBannerIconWrap, SCSSidebarErrorBannerMessage, SCSSidebarLoadingArea, SCSSidebarLoadMoreRow, SCSSidebarEmptyChats, SCSSidebarEmptyChatsText, SCSSidebarChatsFooter, SCSSidebarFooterActions, SCSSidebarCollapsedDivider } from './Sidebar.layout.styles';
49
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
50
+ var actions = {
51
+ edit: function edit(props) {
52
+ return /*#__PURE__*/_jsx(EditQuestionModal, _objectSpread({}, props));
53
+ },
54
+ "delete": function _delete(props) {
55
+ return /*#__PURE__*/_jsx(DeleteQuestionModal, _objectSpread({}, props));
56
+ }
57
+ };
58
+
59
+ /** Abrevia "especialista"/"especialist" → "Esp." (ES/PT) y "specialist" → "Spec." (EN) en el nombre del agente. */
60
+ function abbreviateSpecialistInAgentName(agentName) {
61
+ if (!agentName || typeof agentName !== 'string') return agentName;
62
+ return agentName.replace(/\b(especialista|especialist)\b/gi, 'Esp.').replace(/\bspecialist\b/gi, 'Spec.');
63
+ }
64
+ var ListHistoryChat = function ListHistoryChat(_ref) {
65
+ var chat = _ref.chat,
66
+ _onClick = _ref.onClick,
67
+ isModalOpen = _ref.isModalOpen,
68
+ onOpenModal = _ref.onOpenModal,
69
+ onCloseModal = _ref.onCloseModal,
70
+ handlers = _ref.handlers,
71
+ isSelected = _ref.isSelected,
72
+ index = _ref.index,
73
+ tooltipZIndex = _ref.tooltipZIndex;
74
+ var textRef = useRef(null);
75
+ var agentRef = useRef(null);
76
+ var displayTitle = useMemo(function () {
77
+ return formatChatListTitleMentions(chat.title);
78
+ }, [chat.title]);
79
+ var displayAgent = getAgentDisplayName(chat.agentType, chat.agent);
80
+ var contextName = chat.projectName || chat.clientName;
81
+ var _useResizeListener = useResizeListener(textRef, [displayTitle]),
82
+ showTooltip = _useResizeListener.showTooltip;
83
+ var _useResizeListener2 = useResizeListener(agentRef, [chat.agent]),
84
+ showTooltipAgent = _useResizeListener2.showTooltip;
85
+ var _useT = useT(),
86
+ t = _useT.t;
87
+ var _useState = useState(null),
88
+ _useState2 = _slicedToArray(_useState, 2),
89
+ action = _useState2[0],
90
+ setAction = _useState2[1];
91
+ var isGenerating = useIsSessionGenerating(chat.sessionExternalId);
92
+ var sessionMeta = useSessionMeta(chat.sessionExternalId);
93
+ var isUnread = chat.isRead === false && !isGenerating;
94
+ var menuItems = [{
95
+ label: t('history.menu.rename'),
96
+ onClickItem: function onClickItem(chatId) {
97
+ setAction('edit');
98
+ onOpenModal(chatId);
99
+ },
100
+ Icon: Pencil,
101
+ eventKey: EVENTS.pmAiMenuEdit
102
+ }, {
103
+ label: t('history.menu.delete'),
104
+ onClickItem: function onClickItem(chatId) {
105
+ setAction('delete');
106
+ onOpenModal(chatId);
107
+ },
108
+ Icon: Trash,
109
+ eventKey: EVENTS.pmAiMenuDelete
110
+ }];
111
+ var handleConfirmAction = function handleConfirmAction(chatData) {
112
+ if (action === 'edit') {
113
+ handlers.handleUpdateChat(chatData);
114
+ } else {
115
+ handlers.handleDeleteChat(chatData);
116
+ }
117
+ setAction(null);
118
+ onCloseModal();
119
+ };
120
+ return /*#__PURE__*/_jsxs(_Fragment, {
121
+ children: [/*#__PURE__*/_jsxs(SCLHCWrapperContent, {
122
+ onClick: function onClick(e) {
123
+ e.stopPropagation();
124
+ _onClick(chat);
125
+ },
126
+ isModalOpen: isModalOpen,
127
+ isSelected: isSelected,
128
+ $index: index,
129
+ children: [/*#__PURE__*/_jsxs(SCLHCWrapper, {
130
+ children: [/*#__PURE__*/_jsxs(SCLHCWrapperTitleRow, {
131
+ children: [isGenerating || isUnread ? /*#__PURE__*/_jsx(SessionGeneratingDot, {
132
+ ariaLabel: isGenerating ? t('conversations.generating') : t('conversations.unreadLabel'),
133
+ isWriting: isGenerating && (sessionMeta === null || sessionMeta === void 0 ? void 0 : sessionMeta.isWriting),
134
+ animated: isGenerating
135
+ }) : null, /*#__PURE__*/_jsx(Tooltip, {
136
+ title: showTooltip ? displayTitle : '',
137
+ zIndex: tooltipZIndex,
138
+ children: /*#__PURE__*/_jsx(SCLHCWrapperTitle, {
139
+ ref: textRef,
140
+ $unread: isUnread,
141
+ children: displayTitle || t('conversations.emptyLabel')
142
+ })
143
+ })]
144
+ }), /*#__PURE__*/_jsx(Tooltip, {
145
+ title: showTooltipAgent ? displayAgent + (contextName ? " - ".concat(contextName) : '') : '',
146
+ zIndex: tooltipZIndex,
147
+ children: /*#__PURE__*/_jsxs(SCLHCWrapperAgent, {
148
+ children: [chat.agentType === 'clone' || chat.agentType === 'orchestrator' ? /*#__PURE__*/_jsx(MAIAIcon, {
149
+ width: 14,
150
+ height: 14
151
+ }) : /*#__PURE__*/_jsx("span", {
152
+ style: {
153
+ fontSize: '14px'
154
+ },
155
+ children: chat.emoji
156
+ }), /*#__PURE__*/_jsxs(SCLHCWrapperAgentText, {
157
+ ref: agentRef,
158
+ children: [chat.agentType === 'clone' || chat.agentType === 'orchestrator' ? abbreviateSpecialistInAgentName(chat.agent) : chat.agent, chat.projectName && " - ".concat(chat.projectName)]
159
+ })]
160
+ })
161
+ })]
162
+ }), /*#__PURE__*/_jsxs(SCLHCWrapperButtonActions, {
163
+ children: [/*#__PURE__*/_jsx(CUButton, {
164
+ iconOnly: true,
165
+ size: "small",
166
+ variant: "text",
167
+ onClick: function onClick(event) {
168
+ event.stopPropagation();
169
+ onOpenModal(chat.id);
170
+ },
171
+ children: /*#__PURE__*/_jsx(MenuDots, {
172
+ width: 20,
173
+ height: 20
174
+ })
175
+ }), isModalOpen && !action && /*#__PURE__*/_jsx("div", {
176
+ "data-modal-container": true,
177
+ style: {
178
+ position: 'absolute',
179
+ top: '32px',
180
+ right: '16px',
181
+ backgroundColor: 'white',
182
+ zIndex: 1000,
183
+ display: 'flex',
184
+ flexDirection: 'column',
185
+ borderRadius: '4px',
186
+ border: '1px solid rgba(224, 224, 224, 1)',
187
+ minWidth: '124px'
188
+ },
189
+ children: menuItems.map(function (_ref2) {
190
+ var label = _ref2.label,
191
+ onClickItem = _ref2.onClickItem,
192
+ Icon = _ref2.Icon,
193
+ eventKey = _ref2.eventKey;
194
+ return /*#__PURE__*/_jsx(OptionItem, {
195
+ label: label,
196
+ onClick: function onClick() {
197
+ return onClickItem(chat.id);
198
+ },
199
+ Icon: Icon,
200
+ eventKey: eventKey
201
+ }, label);
202
+ })
203
+ })]
204
+ })]
205
+ }, "conversation-".concat(chat.sessionExternalId)), !!action && actions[action]({
206
+ onClose: function onClose() {
207
+ onCloseModal();
208
+ setAction(null);
209
+ },
210
+ chat: chat,
211
+ handlers: {
212
+ handleConfirmAction: handleConfirmAction,
213
+ handleSetIsOpenModal: onCloseModal
214
+ }
215
+ })]
216
+ });
217
+ };
218
+ export var Sidebar = function Sidebar(_ref3) {
219
+ var _user$permissions;
220
+ var onGoToChat = _ref3.onGoToChat,
221
+ _ref3$onError = _ref3.onError,
222
+ onError = _ref3$onError === void 0 ? function () {
223
+ return null;
224
+ } : _ref3$onError,
225
+ handleGoToHome = _ref3.handleGoToHome,
226
+ handleStartNewChat = _ref3.handleStartNewChat,
227
+ handleOpenMarketplace = _ref3.handleOpenMarketplace,
228
+ handleOpenSkills = _ref3.handleOpenSkills,
229
+ showNewChat = _ref3.showNewChat,
230
+ refetchChats = _ref3.refetchChats,
231
+ handleSetRefetchChats = _ref3.handleSetRefetchChats,
232
+ hasError = _ref3.hasError,
233
+ resetSelectedChatRef = _ref3.resetSelectedChatRef,
234
+ _ref3$agentsNavActive = _ref3.agentsNavActive,
235
+ agentsNavActive = _ref3$agentsNavActive === void 0 ? null : _ref3$agentsNavActive,
236
+ _ref3$isLegacyContext = _ref3.isLegacyContextSession,
237
+ isLegacyContextSession = _ref3$isLegacyContext === void 0 ? false : _ref3$isLegacyContext;
238
+ var _useT2 = useT(),
239
+ t = _useT2.t,
240
+ i18n = _useT2.i18n;
241
+ var tooltipZIndex = useMaiaTaskPanelZIndex(1500, 'overlay');
242
+ var _useState3 = useState(false),
243
+ _useState4 = _slicedToArray(_useState3, 2),
244
+ isOpen = _useState4[0],
245
+ setIsOpen = _useState4[1];
246
+ var _useState5 = useState(null),
247
+ _useState6 = _slicedToArray(_useState5, 2),
248
+ isOpenModal = _useState6[0],
249
+ setIsOpenModal = _useState6[1];
250
+ var _useState7 = useState(null),
251
+ _useState8 = _slicedToArray(_useState7, 2),
252
+ selectedChat = _useState8[0],
253
+ setSelectedChat = _useState8[1];
254
+ var chatsFetchedRef = useRef(false);
255
+ var chatsContainerRef = useRef(null);
256
+ var user = useUser();
257
+ var eventAmplitude = useEvent();
258
+ var _useGlobalContext = useGlobalContext(),
259
+ selectedAgent = _useGlobalContext.agent,
260
+ selectAgent = _useGlobalContext.selectAgent,
261
+ setProject = _useGlobalContext.setProject,
262
+ setClient = _useGlobalContext.setClient,
263
+ setTask = _useGlobalContext.setTask;
264
+ var _useChats = useChats({
265
+ onError: onError
266
+ }),
267
+ loadingChats = _useChats.loadingChats,
268
+ chats = _useChats.chats,
269
+ deleteChat = _useChats.deleteChat,
270
+ updateChat = _useChats.updateChat,
271
+ fetchChats = _useChats.fetchChats,
272
+ limit = _useChats.limit,
273
+ offset = _useChats.offset,
274
+ hasMoreChats = _useChats.hasMoreChats,
275
+ loadMoreChats = _useChats.loadMoreChats,
276
+ isLoadingMoreChats = _useChats.isLoadingMoreChats,
277
+ unreadCount = _useChats.unreadCount,
278
+ setUnreadCount = _useChats.setUnreadCount,
279
+ setChatReadState = _useChats.setChatReadState;
280
+ var unreadSubscribedRef = useRef(false);
281
+ useEffect(function () {
282
+ if (!(user !== null && user !== void 0 && user.id) || typeof $_sc === 'undefined' || !$_sc) return undefined;
283
+ var channel = "sessions.unread:".concat(user.id);
284
+ var handleUnreadEvent = function handleUnreadEvent(_ref4) {
285
+ var modelData = _ref4.model_data;
286
+ if (typeof (modelData === null || modelData === void 0 ? void 0 : modelData.unread_count) === 'number') {
287
+ setUnreadCount(modelData.unread_count);
288
+ }
289
+ if (modelData !== null && modelData !== void 0 && modelData.session_id && typeof (modelData === null || modelData === void 0 ? void 0 : modelData.is_read) === 'boolean') {
290
+ setChatReadState(modelData.session_id, modelData.is_read);
291
+ }
292
+ };
293
+ $_sc.subscribeHandler(channel, handleUnreadEvent);
294
+ if (!unreadSubscribedRef.current) {
295
+ var _$_sc$actionType, _$_sc$channelType;
296
+ $_sc.updateConnectionModel({
297
+ model_hash: channel,
298
+ action: (_$_sc$actionType = $_sc.actionType) === null || _$_sc$actionType === void 0 ? void 0 : _$_sc$actionType.SUBSCRIBE
299
+ }, channel, user, user, (_$_sc$channelType = $_sc.channelType) === null || _$_sc$channelType === void 0 ? void 0 : _$_sc$channelType.MODEL_CHANNEL);
300
+ unreadSubscribedRef.current = true;
301
+ }
302
+ return undefined;
303
+ }, [user, setUnreadCount, setChatReadState]);
304
+ var userPermissions = user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 ? void 0 : _user$permissions.ai_agents;
305
+ var canCreateAgents = !!(userPermissions !== null && userPermissions !== void 0 && userPermissions.create);
306
+ var hasMultiAgentsFeatureAccess = !!window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
307
+ var canViewAgents = !!(userPermissions !== null && userPermissions !== void 0 && userPermissions.view) && hasMultiAgentsFeatureAccess;
308
+ // Temporal: skills en sidebar solo para company 2336
309
+ var canViewSkills = canViewAgents && canAccessToSkills() && (user === null || user === void 0 ? void 0 : user.company_id) === 2336;
310
+ var showMarketplaceSidebarButton = !!canCreateAgents && hasMultiAgentsFeatureAccess;
311
+ var agentNavButtonCount = (showMarketplaceSidebarButton ? 1 : 0) + (canViewAgents ? 1 : 0) + (canViewSkills ? 1 : 0);
312
+ var showAgentsNavBlock = showMarketplaceSidebarButton || canViewAgents || canViewSkills;
313
+ var myAgentsSidebarTrackedRef = useRef(false);
314
+ useEffect(function () {
315
+ if (!canViewAgents || myAgentsSidebarTrackedRef.current) return;
316
+ myAgentsSidebarTrackedRef.current = true;
317
+ trackAppcuesEvent(APPCUES_EVENTS.maiaSidebarMyAgents);
318
+ }, [canViewAgents]);
319
+ useEffect(function () {
320
+ if (resetSelectedChatRef) {
321
+ resetSelectedChatRef.current = function () {
322
+ return setSelectedChat(null);
323
+ };
324
+ }
325
+ return function () {
326
+ if (resetSelectedChatRef) {
327
+ resetSelectedChatRef.current = null;
328
+ }
329
+ };
330
+ }, [resetSelectedChatRef]);
331
+ useEffect(function () {
332
+ var handleSelectSession = function handleSelectSession(evt) {
333
+ var _detail;
334
+ var _ref5 = (_detail = evt.detail) !== null && _detail !== void 0 ? _detail : {},
335
+ sessionId = _ref5.sessionId;
336
+ if (sessionId) {
337
+ setSelectedChat(sessionId);
338
+ }
339
+ };
340
+ document.addEventListener('sidebar-select-session', handleSelectSession);
341
+ return function () {
342
+ document.removeEventListener('sidebar-select-session', handleSelectSession);
343
+ };
344
+ }, []);
345
+ var handleDeleteChat = /*#__PURE__*/function () {
346
+ var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(chat) {
347
+ return _regeneratorRuntime.wrap(function (_context) {
348
+ while (1) switch (_context.prev = _context.next) {
349
+ case 0:
350
+ deleteChat(chat.sessionExternalId);
351
+ setIsOpenModal(null);
352
+ handleGoToHome();
353
+ case 1:
354
+ case "end":
355
+ return _context.stop();
356
+ }
357
+ }, _callee);
358
+ }));
359
+ return function handleDeleteChat(_x) {
360
+ return _ref6.apply(this, arguments);
361
+ };
362
+ }();
363
+ var handleUpdateChat = function handleUpdateChat(chat) {
364
+ updateChat(chat);
365
+ setIsOpenModal(null);
366
+ };
367
+ var handleOpenModal = function handleOpenModal(chatId) {
368
+ if (isOpenModal && isOpenModal !== chatId) {
369
+ setIsOpenModal(null);
370
+ } else {
371
+ setIsOpenModal(chatId);
372
+ }
373
+ };
374
+ var handleCloseModal = function handleCloseModal() {
375
+ setIsOpenModal(null);
376
+ };
377
+ useEffect(function () {
378
+ var handleClickOutside = function handleClickOutside(event) {
379
+ if (isOpenModal && !event.target.closest('[data-modal-container]')) {
380
+ setIsOpenModal(null);
381
+ }
382
+ };
383
+ if (isOpenModal) {
384
+ document.addEventListener('mousedown', handleClickOutside);
385
+ }
386
+ return function () {
387
+ document.removeEventListener('mousedown', handleClickOutside);
388
+ };
389
+ }, [isOpenModal]);
390
+ var handleToggleSidebar = function handleToggleSidebar() {
391
+ if (isOpenModal) {
392
+ setIsOpenModal(null);
393
+ }
394
+ eventAmplitude(EVENTS.aiChatSidebar, {
395
+ action: isOpen ? 'close' : 'open'
396
+ });
397
+ setIsOpen(function (prev) {
398
+ return !prev;
399
+ });
400
+ };
401
+ var handleOpenCreateAgent = /*#__PURE__*/function () {
402
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
403
+ var response, data, maiakerAgent, _t;
404
+ return _regeneratorRuntime.wrap(function (_context2) {
405
+ while (1) switch (_context2.prev = _context2.next) {
406
+ case 0:
407
+ _context2.prev = 0;
408
+ _context2.next = 1;
409
+ return fetchMaia({
410
+ path: "agents?agent_type=clone&entity=global&lang=".concat(mapCORLang(i18n.language)),
411
+ method: 'GET'
412
+ });
413
+ case 1:
414
+ response = _context2.sent;
415
+ _context2.next = 2;
416
+ return response.json();
417
+ case 2:
418
+ data = _context2.sent;
419
+ maiakerAgent = (data.data || []).find(function (agentItem) {
420
+ return isMarketplaceGlobalCloneAgent(agentItem);
421
+ });
422
+ if (maiakerAgent) {
423
+ _context2.next = 3;
424
+ break;
425
+ }
426
+ return _context2.abrupt("return");
427
+ case 3:
428
+ setProject(null);
429
+ setClient === null || setClient === void 0 || setClient(null);
430
+ setTask(null);
431
+ // handleGoToHome puede reseleccionar agents.data[0] si el agente global aun esta en null
432
+ // (closure stale de la seccion "Mis agentes"), por eso selectAgent(maiakerAgent) va despues.
433
+ handleGoToHome();
434
+ selectAgent(maiakerAgent);
435
+ _context2.next = 5;
436
+ break;
437
+ case 4:
438
+ _context2.prev = 4;
439
+ _t = _context2["catch"](0);
440
+ onError();
441
+ case 5:
442
+ case "end":
443
+ return _context2.stop();
444
+ }
445
+ }, _callee2, null, [[0, 4]]);
446
+ }));
447
+ return function handleOpenCreateAgent() {
448
+ return _ref7.apply(this, arguments);
449
+ };
450
+ }();
451
+ useEffect(function () {
452
+ if (!chatsFetchedRef.current) {
453
+ chatsFetchedRef.current = true;
454
+ fetchChats({
455
+ limit: limit,
456
+ offset: offset
457
+ });
458
+ return;
459
+ }
460
+ // Refetch solicitado por prop: se ejecuta aunque el sidebar esté colapsado.
461
+ if (refetchChats) {
462
+ fetchChats({
463
+ limit: limit,
464
+ offset: offset
465
+ });
466
+ handleSetRefetchChats(false);
467
+ }
468
+ }, [refetchChats, handleSetRefetchChats, fetchChats, limit, offset]);
469
+ useEffect(function () {
470
+ var handleScroll = function handleScroll() {
471
+ if (!chatsContainerRef.current || !hasMoreChats || isLoadingMoreChats || hasError) {
472
+ return;
473
+ }
474
+ var _chatsContainerRef$cu = chatsContainerRef.current,
475
+ scrollTop = _chatsContainerRef$cu.scrollTop,
476
+ scrollHeight = _chatsContainerRef$cu.scrollHeight,
477
+ clientHeight = _chatsContainerRef$cu.clientHeight;
478
+ var isAtBottom = scrollTop + clientHeight >= scrollHeight - 10;
479
+ if (isAtBottom) {
480
+ loadMoreChats();
481
+ }
482
+ };
483
+ var container = chatsContainerRef.current;
484
+ if (container) {
485
+ container.addEventListener('scroll', handleScroll);
486
+ }
487
+ return function () {
488
+ if (container) {
489
+ container.removeEventListener('scroll', handleScroll);
490
+ }
491
+ };
492
+ }, [hasMoreChats, isLoadingMoreChats, loadMoreChats, hasError]);
493
+ var handleNewChat = function handleNewChat() {
494
+ eventAmplitude(EVENTS.aiSidebarNewChat);
495
+ if (isOpenModal) {
496
+ setIsOpenModal(null);
497
+ }
498
+ setSelectedChat(null);
499
+ if (handleStartNewChat) {
500
+ handleStartNewChat();
501
+ return;
502
+ }
503
+ handleGoToHome();
504
+ };
505
+ useEffect(function () {
506
+ // Al crear/actualizar una conversación refrescamos la lista aunque el sidebar esté colapsado.
507
+ var handleRefetchSession = function handleRefetchSession() {
508
+ chatsFetchedRef.current = true;
509
+ fetchChats({
510
+ limit: 20,
511
+ offset: 0,
512
+ background: true
513
+ });
514
+ };
515
+ document.addEventListener('refetch-session', handleRefetchSession);
516
+ return function () {
517
+ document.removeEventListener('refetch-session', handleRefetchSession);
518
+ };
519
+ }, [fetchChats]);
520
+ var isAgentsHubSection = showNewChat && (agentsNavActive === 'myAgents' || agentsNavActive === 'maiaker');
521
+ var showNewChatButton = isAgentsHubSection || !showNewChat && !hasError && !loadingChats && !isLegacyContextSession && ((userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view) && !(selectedAgent !== null && selectedAgent !== void 0 && selectedAgent.is_deleted) && !(selectedAgent !== null && selectedAgent !== void 0 && selectedAgent.has_not_permissions) && !(selectedAgent !== null && selectedAgent !== void 0 && selectedAgent.has_not_access) || !(userPermissions !== null && userPermissions !== void 0 && userPermissions.view) && !(selectedAgent !== null && selectedAgent !== void 0 && selectedAgent.is_deleted) && !(selectedAgent !== null && selectedAgent !== void 0 && selectedAgent.has_not_permissions) && !(selectedAgent !== null && selectedAgent !== void 0 && selectedAgent.has_not_access));
522
+ return /*#__PURE__*/_jsxs(SCSSidebarRoot, {
523
+ $isOpen: isOpen,
524
+ children: [/*#__PURE__*/_jsxs(SCSSidebarToolbar, {
525
+ $isOpen: isOpen,
526
+ children: [/*#__PURE__*/_jsx(Tooltip, {
527
+ title: isOpen ? t('conversations.collapse') : t('history.tooltip'),
528
+ zIndex: tooltipZIndex,
529
+ children: /*#__PURE__*/_jsx(SCSWrapperCollapsedButton, {
530
+ onClick: handleToggleSidebar,
531
+ isOpen: isOpen,
532
+ children: isOpen ? /*#__PURE__*/_jsx(ChevronDoubleLeft, {
533
+ color: "rgba(102, 102, 102, 1)",
534
+ width: 16,
535
+ height: 16
536
+ }) : /*#__PURE__*/_jsxs(SCSSidebarUnreadAnchor, {
537
+ children: [/*#__PURE__*/_jsx(History, {
538
+ color: "rgba(13, 13, 13, 1)",
539
+ width: 20,
540
+ height: 20
541
+ }), unreadCount > 0 ? /*#__PURE__*/_jsx(SCSSidebarUnreadCount, {
542
+ $floating: true,
543
+ "aria-label": t('conversations.unreadLabel'),
544
+ children: formatUnreadCount(unreadCount)
545
+ }) : null]
546
+ })
547
+ })
548
+ }), showNewChatButton ? /*#__PURE__*/_jsx(Tooltip, {
549
+ title: t('conversations.newChat'),
550
+ zIndex: tooltipZIndex,
551
+ children: /*#__PURE__*/_jsx(SCSWrapperNewChatIcon, {
552
+ onClick: handleNewChat,
553
+ children: /*#__PURE__*/_jsx(NewChat, {
554
+ width: 16,
555
+ height: 16
556
+ })
557
+ })
558
+ }) : null, !isOpen && showAgentsNavBlock ? /*#__PURE__*/_jsxs(_Fragment, {
559
+ children: [/*#__PURE__*/_jsx(SCSSidebarCollapsedDivider, {}), showMarketplaceSidebarButton ? /*#__PURE__*/_jsx(Tooltip, {
560
+ title: t('conversations.maiakerNav'),
561
+ zIndex: tooltipZIndex,
562
+ children: /*#__PURE__*/_jsx(SCSWrapperAgentsNavIcon, {
563
+ $active: agentsNavActive === 'maiaker',
564
+ onClick: function onClick() {
565
+ eventAmplitude(EVENTS.aiChatMpOpen);
566
+ handleOpenCreateAgent();
567
+ },
568
+ children: /*#__PURE__*/_jsx(MaiaStoreIcon, {
569
+ size: 16
570
+ })
571
+ })
572
+ }) : null, canViewAgents ? /*#__PURE__*/_jsx(Tooltip, {
573
+ title: t('conversations.myAgentsNav'),
574
+ zIndex: tooltipZIndex,
575
+ children: /*#__PURE__*/_jsx(SCSWrapperAgentsNavIcon, {
576
+ $active: agentsNavActive === 'myAgents',
577
+ "data-appcues": APPCUES_SELECTORS.maiaSidebarMyAgents,
578
+ onClick: function onClick() {
579
+ eventAmplitude(EVENTS.aiSidebarMyAgents);
580
+ handleOpenMarketplace();
581
+ },
582
+ children: /*#__PURE__*/_jsx(MyAgentsNavIcon, {
583
+ size: 16
584
+ })
585
+ })
586
+ }) : null, canViewSkills ? /*#__PURE__*/_jsx(Tooltip, {
587
+ title: t('conversations.mySkillsNav'),
588
+ zIndex: tooltipZIndex,
589
+ children: /*#__PURE__*/_jsx(SCSWrapperAgentsNavIcon, {
590
+ $active: agentsNavActive === 'mySkills',
591
+ onClick: handleOpenSkills,
592
+ children: /*#__PURE__*/_jsx(SkillsNavIcon, {
593
+ size: 16
594
+ })
595
+ })
596
+ }) : null]
597
+ }) : null]
598
+ }), /*#__PURE__*/_jsxs(SCSSidebarBody, {
599
+ $isOpen: isOpen,
600
+ children: [isOpen ? /*#__PURE__*/_jsxs(SCSSidebarOpenPanel, {
601
+ children: [/*#__PURE__*/_jsxs(SCSSidebarAgentsBlock, {
602
+ children: [showAgentsNavBlock ? /*#__PURE__*/_jsxs(SCSSidebarAgentsActions, {
603
+ children: [showMarketplaceSidebarButton ? /*#__PURE__*/_jsxs(SCSSidebarMaiakerNavButton, {
604
+ type: "button",
605
+ onClick: function onClick() {
606
+ eventAmplitude(EVENTS.aiChatMpOpen);
607
+ handleOpenCreateAgent();
608
+ },
609
+ $active: agentsNavActive === 'maiaker',
610
+ children: [/*#__PURE__*/_jsx(MaiaStoreIcon, {
611
+ size: 16
612
+ }), /*#__PURE__*/_jsx(SCSSidebarMaiakerNavLabel, {
613
+ children: t('conversations.maiakerNav')
614
+ })]
615
+ }) : null, canViewAgents ? /*#__PURE__*/_jsxs(SCSSidebarMaiakerNavButton, {
616
+ type: "button",
617
+ "data-appcues": APPCUES_SELECTORS.maiaSidebarMyAgents,
618
+ onClick: function onClick() {
619
+ eventAmplitude(EVENTS.aiSidebarMyAgents);
620
+ handleOpenMarketplace();
621
+ },
622
+ $active: agentsNavActive === 'myAgents',
623
+ children: [/*#__PURE__*/_jsx(MyAgentsNavIcon, {
624
+ size: 16
625
+ }), /*#__PURE__*/_jsx(SCSSidebarMaiakerNavLabel, {
626
+ children: t('conversations.myAgentsNav')
627
+ })]
628
+ }) : null, canViewSkills ? /*#__PURE__*/_jsxs(SCSSidebarMaiakerNavButton, {
629
+ type: "button",
630
+ onClick: handleOpenSkills,
631
+ $active: agentsNavActive === 'mySkills',
632
+ children: [/*#__PURE__*/_jsx(SkillsNavIcon, {
633
+ size: 16
634
+ }), /*#__PURE__*/_jsx(SCSSidebarMaiakerNavLabel, {
635
+ children: t('conversations.mySkillsNav')
636
+ })]
637
+ }) : null]
638
+ }) : null, /*#__PURE__*/_jsxs(SCSSidebarConversationsHeadingRow, {
639
+ children: [/*#__PURE__*/_jsx(SCSSidebarConversationsHeading, {
640
+ children: t('conversations.title')
641
+ }), unreadCount > 0 ? /*#__PURE__*/_jsx(SCSSidebarUnreadCount, {
642
+ "aria-label": t('conversations.unreadLabel'),
643
+ children: formatUnreadCount(unreadCount)
644
+ }) : null]
645
+ })]
646
+ }), /*#__PURE__*/_jsx(SCSSidebarChatsScroll, {
647
+ ref: chatsContainerRef,
648
+ $hasChats: chats.length > 0,
649
+ $offsetVariant: hasError ? 'error' : 'default',
650
+ $agentNavButtonCount: agentNavButtonCount,
651
+ children: hasError && !chats.length ? /*#__PURE__*/_jsxs(SCSSidebarErrorStateColumn, {
652
+ children: [/*#__PURE__*/_jsx(SCSSidebarErrorStateTop, {
653
+ children: /*#__PURE__*/_jsx(ErrorState, {})
654
+ }), /*#__PURE__*/_jsxs(SCSSidebarErrorBanner, {
655
+ children: [/*#__PURE__*/_jsx(SCSSidebarErrorBannerIconWrap, {
656
+ children: /*#__PURE__*/_jsx(ErrorIcon, {})
657
+ }), /*#__PURE__*/_jsx(SCSSidebarErrorBannerMessage, {
658
+ children: t('conversations.error')
659
+ })]
660
+ })]
661
+ }) : loadingChats ? /*#__PURE__*/_jsx(SCSSidebarLoadingArea, {
662
+ children: /*#__PURE__*/_jsx(SidebarChatsSkeleton, {})
663
+ }) : chats.length ? /*#__PURE__*/_jsxs(_Fragment, {
664
+ children: [chats.map(function (chat, index) {
665
+ return /*#__PURE__*/_jsx(ListHistoryChat, {
666
+ index: index,
667
+ chat: chat,
668
+ onClick: function onClick(chatData) {
669
+ if (isOpenModal) {
670
+ setIsOpenModal(null);
671
+ }
672
+ setSelectedChat(chatData.sessionExternalId);
673
+ onGoToChat(chatData);
674
+ },
675
+ isModalOpen: isOpenModal === chat.id,
676
+ onOpenModal: handleOpenModal,
677
+ onCloseModal: handleCloseModal,
678
+ handlers: {
679
+ handleDeleteChat: handleDeleteChat,
680
+ handleUpdateChat: handleUpdateChat
681
+ },
682
+ isSelected: selectedChat === chat.sessionExternalId,
683
+ tooltipZIndex: tooltipZIndex
684
+ }, chat.id);
685
+ }), isLoadingMoreChats && /*#__PURE__*/_jsx(SCSSidebarLoadMoreRow, {
686
+ children: /*#__PURE__*/_jsx(SidebarChatsSkeleton, {
687
+ count: 2
688
+ })
689
+ })]
690
+ }) : /*#__PURE__*/_jsxs(SCSSidebarEmptyChats, {
691
+ children: [/*#__PURE__*/_jsx(EmptyHistoryIcon, {}), /*#__PURE__*/_jsx(SCSSidebarEmptyChatsText, {
692
+ children: t('conversations.empty')
693
+ })]
694
+ })
695
+ }), /*#__PURE__*/_jsx(SCSSidebarChatsFooter, {
696
+ children: hasError && chats.length ? /*#__PURE__*/_jsxs(SCSSidebarErrorBanner, {
697
+ children: [/*#__PURE__*/_jsx(SCSSidebarErrorBannerIconWrap, {
698
+ children: /*#__PURE__*/_jsx(ErrorIcon, {})
699
+ }), /*#__PURE__*/_jsx(SCSSidebarErrorBannerMessage, {
700
+ children: t('conversations.error')
701
+ })]
702
+ }) : null
703
+ })]
704
+ }) : null, /*#__PURE__*/_jsx(SCSSidebarFooterActions, {
705
+ $isOpen: isOpen,
706
+ $justifyBetween: !!selectedAgent,
707
+ children: selectedAgent ? /*#__PURE__*/_jsx(FeedbackButton, {
708
+ selectedAgent: selectedAgent,
709
+ isOpen: isOpen
710
+ }) : null
711
+ })]
712
+ })]
713
+ });
714
+ };
715
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlUmVmIiwidXNlU3RhdGUiLCJDaGV2cm9uRG91YmxlTGVmdCIsIkhpc3RvcnkiLCJDVUJ1dHRvbiIsIk1lbnVEb3RzIiwiUGVuY2lsIiwiVHJhc2giLCJUb29sdGlwIiwiRW1wdHlIaXN0b3J5SWNvbiIsInVzZVJlc2l6ZUxpc3RlbmVyIiwidXNlQ2hhdHMiLCJTaWRlYmFyQ2hhdHNTa2VsZXRvbiIsIkVycm9yU3RhdGUiLCJNQUlBSWNvbiIsIk1haWFTdG9yZUljb24iLCJNeUFnZW50c05hdkljb24iLCJTa2lsbHNOYXZJY29uIiwiTmV3Q2hhdCIsIkVWRU5UUyIsInVzZUV2ZW50IiwidXNlVCIsIk9wdGlvbkl0ZW0iLCJFZGl0UXVlc3Rpb25Nb2RhbCIsIkRlbGV0ZVF1ZXN0aW9uTW9kYWwiLCJFcnJvckljb24iLCJ1c2VVc2VyIiwiRmVlZGJhY2tCdXR0b24iLCJ1c2VHbG9iYWxDb250ZXh0IiwiZmV0Y2hNYWlhIiwiY2FuQWNjZXNzVG9Ta2lsbHMiLCJtYXBDT1JMYW5nIiwiZm9ybWF0Q2hhdExpc3RUaXRsZU1lbnRpb25zIiwiZ2V0QWdlbnREaXNwbGF5TmFtZSIsImlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IiwiQVBQQ1VFU19FVkVOVFMiLCJBUFBDVUVTX1NFTEVDVE9SUyIsInRyYWNrQXBwY3Vlc0V2ZW50IiwiZm9ybWF0VW5yZWFkQ291bnQiLCJTZXNzaW9uR2VuZXJhdGluZ0RvdCIsInVzZUlzU2Vzc2lvbkdlbmVyYXRpbmciLCJ1c2VTZXNzaW9uTWV0YSIsInVzZU1haWFUYXNrUGFuZWxaSW5kZXgiLCJTQ0xIQ1dyYXBwZXIiLCJTQ0xIQ1dyYXBwZXJBZ2VudCIsIlNDTEhDV3JhcHBlckFnZW50VGV4dCIsIlNDTEhDV3JhcHBlckJ1dHRvbkFjdGlvbnMiLCJTQ0xIQ1dyYXBwZXJDb250ZW50IiwiU0NMSENXcmFwcGVyVGl0bGUiLCJTQ0xIQ1dyYXBwZXJUaXRsZVJvdyIsIlNDU1dyYXBwZXJDb2xsYXBzZWRCdXR0b24iLCJTQ1NXcmFwcGVyTmV3Q2hhdEljb24iLCJTQ1NXcmFwcGVyQWdlbnRzTmF2SWNvbiIsIlNDU1NpZGViYXJSb290IiwiU0NTU2lkZWJhclRvb2xiYXIiLCJTQ1NTaWRlYmFyQm9keSIsIlNDU1NpZGViYXJPcGVuUGFuZWwiLCJTQ1NTaWRlYmFyQWdlbnRzQmxvY2siLCJTQ1NTaWRlYmFyQWdlbnRzQWN0aW9ucyIsIlNDU1NpZGViYXJNYWlha2VyTmF2QnV0dG9uIiwiU0NTU2lkZWJhck1haWFrZXJOYXZMYWJlbCIsIlNDU1NpZGViYXJDb252ZXJzYXRpb25zSGVhZGluZyIsIlNDU1NpZGViYXJDb252ZXJzYXRpb25zSGVhZGluZ1JvdyIsIlNDU1NpZGViYXJVbnJlYWRBbmNob3IiLCJTQ1NTaWRlYmFyVW5yZWFkQ291bnQiLCJTQ1NTaWRlYmFyQ2hhdHNTY3JvbGwiLCJTQ1NTaWRlYmFyRXJyb3JTdGF0ZUNvbHVtbiIsIlNDU1NpZGViYXJFcnJvclN0YXRlVG9wIiwiU0NTU2lkZWJhckVycm9yQmFubmVyIiwiU0NTU2lkZWJhckVycm9yQmFubmVySWNvbldyYXAiLCJTQ1NTaWRlYmFyRXJyb3JCYW5uZXJNZXNzYWdlIiwiU0NTU2lkZWJhckxvYWRpbmdBcmVhIiwiU0NTU2lkZWJhckxvYWRNb3JlUm93IiwiU0NTU2lkZWJhckVtcHR5Q2hhdHMiLCJTQ1NTaWRlYmFyRW1wdHlDaGF0c1RleHQiLCJTQ1NTaWRlYmFyQ2hhdHNGb290ZXIiLCJTQ1NTaWRlYmFyRm9vdGVyQWN0aW9ucyIsIlNDU1NpZGViYXJDb2xsYXBzZWREaXZpZGVyIiwianN4IiwiX2pzeCIsImpzeHMiLCJfanN4cyIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwiYWN0aW9ucyIsImVkaXQiLCJwcm9wcyIsIl9vYmplY3RTcHJlYWQiLCJkZWxldGUiLCJhYmJyZXZpYXRlU3BlY2lhbGlzdEluQWdlbnROYW1lIiwiYWdlbnROYW1lIiwicmVwbGFjZSIsIkxpc3RIaXN0b3J5Q2hhdCIsIl9yZWYiLCJjaGF0Iiwib25DbGljayIsImlzTW9kYWxPcGVuIiwib25PcGVuTW9kYWwiLCJvbkNsb3NlTW9kYWwiLCJoYW5kbGVycyIsImlzU2VsZWN0ZWQiLCJpbmRleCIsInRvb2x0aXBaSW5kZXgiLCJ0ZXh0UmVmIiwiYWdlbnRSZWYiLCJkaXNwbGF5VGl0bGUiLCJ0aXRsZSIsImRpc3BsYXlBZ2VudCIsImFnZW50VHlwZSIsImFnZW50IiwiY29udGV4dE5hbWUiLCJwcm9qZWN0TmFtZSIsImNsaWVudE5hbWUiLCJfdXNlUmVzaXplTGlzdGVuZXIiLCJzaG93VG9vbHRpcCIsIl91c2VSZXNpemVMaXN0ZW5lcjIiLCJzaG93VG9vbHRpcEFnZW50IiwiX3VzZVQiLCJ0IiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwiYWN0aW9uIiwic2V0QWN0aW9uIiwiaXNHZW5lcmF0aW5nIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZXNzaW9uTWV0YSIsImlzVW5yZWFkIiwiaXNSZWFkIiwibWVudUl0ZW1zIiwibGFiZWwiLCJvbkNsaWNrSXRlbSIsImNoYXRJZCIsIkljb24iLCJldmVudEtleSIsInBtQWlNZW51RWRpdCIsInBtQWlNZW51RGVsZXRlIiwiaGFuZGxlQ29uZmlybUFjdGlvbiIsImNoYXREYXRhIiwiaGFuZGxlVXBkYXRlQ2hhdCIsImhhbmRsZURlbGV0ZUNoYXQiLCJjaGlsZHJlbiIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCIkaW5kZXgiLCJhcmlhTGFiZWwiLCJpc1dyaXRpbmciLCJhbmltYXRlZCIsInpJbmRleCIsInJlZiIsIiR1bnJlYWQiLCJjb25jYXQiLCJ3aWR0aCIsImhlaWdodCIsInN0eWxlIiwiZm9udFNpemUiLCJlbW9qaSIsImljb25Pbmx5Iiwic2l6ZSIsInZhcmlhbnQiLCJldmVudCIsImlkIiwicG9zaXRpb24iLCJ0b3AiLCJyaWdodCIsImJhY2tncm91bmRDb2xvciIsImRpc3BsYXkiLCJmbGV4RGlyZWN0aW9uIiwiYm9yZGVyUmFkaXVzIiwiYm9yZGVyIiwibWluV2lkdGgiLCJtYXAiLCJfcmVmMiIsIm9uQ2xvc2UiLCJoYW5kbGVTZXRJc09wZW5Nb2RhbCIsIlNpZGViYXIiLCJfcmVmMyIsIl91c2VyJHBlcm1pc3Npb25zIiwib25Hb1RvQ2hhdCIsIl9yZWYzJG9uRXJyb3IiLCJvbkVycm9yIiwiaGFuZGxlR29Ub0hvbWUiLCJoYW5kbGVTdGFydE5ld0NoYXQiLCJoYW5kbGVPcGVuTWFya2V0cGxhY2UiLCJoYW5kbGVPcGVuU2tpbGxzIiwic2hvd05ld0NoYXQiLCJyZWZldGNoQ2hhdHMiLCJoYW5kbGVTZXRSZWZldGNoQ2hhdHMiLCJoYXNFcnJvciIsInJlc2V0U2VsZWN0ZWRDaGF0UmVmIiwiX3JlZjMkYWdlbnRzTmF2QWN0aXZlIiwiYWdlbnRzTmF2QWN0aXZlIiwiX3JlZjMkaXNMZWdhY3lDb250ZXh0IiwiaXNMZWdhY3lDb250ZXh0U2Vzc2lvbiIsIl91c2VUMiIsImkxOG4iLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsImlzT3BlbiIsInNldElzT3BlbiIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwiaXNPcGVuTW9kYWwiLCJzZXRJc09wZW5Nb2RhbCIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4Iiwic2VsZWN0ZWRDaGF0Iiwic2V0U2VsZWN0ZWRDaGF0IiwiY2hhdHNGZXRjaGVkUmVmIiwiY2hhdHNDb250YWluZXJSZWYiLCJ1c2VyIiwiZXZlbnRBbXBsaXR1ZGUiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdGVkQWdlbnQiLCJzZWxlY3RBZ2VudCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJzZXRUYXNrIiwiX3VzZUNoYXRzIiwibG9hZGluZ0NoYXRzIiwiY2hhdHMiLCJkZWxldGVDaGF0IiwidXBkYXRlQ2hhdCIsImZldGNoQ2hhdHMiLCJsaW1pdCIsIm9mZnNldCIsImhhc01vcmVDaGF0cyIsImxvYWRNb3JlQ2hhdHMiLCJpc0xvYWRpbmdNb3JlQ2hhdHMiLCJ1bnJlYWRDb3VudCIsInNldFVucmVhZENvdW50Iiwic2V0Q2hhdFJlYWRTdGF0ZSIsInVucmVhZFN1YnNjcmliZWRSZWYiLCIkX3NjIiwidW5kZWZpbmVkIiwiY2hhbm5lbCIsImhhbmRsZVVucmVhZEV2ZW50IiwiX3JlZjQiLCJtb2RlbERhdGEiLCJtb2RlbF9kYXRhIiwidW5yZWFkX2NvdW50Iiwic2Vzc2lvbl9pZCIsImlzX3JlYWQiLCJzdWJzY3JpYmVIYW5kbGVyIiwiY3VycmVudCIsIl8kX3NjJGFjdGlvblR5cGUiLCJfJF9zYyRjaGFubmVsVHlwZSIsInVwZGF0ZUNvbm5lY3Rpb25Nb2RlbCIsIm1vZGVsX2hhc2giLCJhY3Rpb25UeXBlIiwiU1VCU0NSSUJFIiwiY2hhbm5lbFR5cGUiLCJNT0RFTF9DSEFOTkVMIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJjYW5DcmVhdGVBZ2VudHMiLCJjcmVhdGUiLCJoYXNNdWx0aUFnZW50c0ZlYXR1cmVBY2Nlc3MiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiY2FuVmlld0FnZW50cyIsInZpZXciLCJjYW5WaWV3U2tpbGxzIiwiY29tcGFueV9pZCIsInNob3dNYXJrZXRwbGFjZVNpZGViYXJCdXR0b24iLCJhZ2VudE5hdkJ1dHRvbkNvdW50Iiwic2hvd0FnZW50c05hdkJsb2NrIiwibXlBZ2VudHNTaWRlYmFyVHJhY2tlZFJlZiIsIm1haWFTaWRlYmFyTXlBZ2VudHMiLCJoYW5kbGVTZWxlY3RTZXNzaW9uIiwiZXZ0IiwiX2RldGFpbCIsIl9yZWY1IiwiZGV0YWlsIiwic2Vzc2lvbklkIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIl9yZWY2IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInN0b3AiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFuZGxlT3Blbk1vZGFsIiwiaGFuZGxlQ2xvc2VNb2RhbCIsImhhbmRsZUNsaWNrT3V0c2lkZSIsInRhcmdldCIsImNsb3Nlc3QiLCJoYW5kbGVUb2dnbGVTaWRlYmFyIiwiYWlDaGF0U2lkZWJhciIsImhhbmRsZU9wZW5DcmVhdGVBZ2VudCIsIl9yZWY3IiwiX2NhbGxlZTIiLCJyZXNwb25zZSIsImRhdGEiLCJtYWlha2VyQWdlbnQiLCJfdCIsIl9jb250ZXh0MiIsInBhdGgiLCJsYW5ndWFnZSIsIm1ldGhvZCIsInNlbnQiLCJqc29uIiwiZmluZCIsImFnZW50SXRlbSIsImFicnVwdCIsImhhbmRsZVNjcm9sbCIsIl9jaGF0c0NvbnRhaW5lclJlZiRjdSIsInNjcm9sbFRvcCIsInNjcm9sbEhlaWdodCIsImNsaWVudEhlaWdodCIsImlzQXRCb3R0b20iLCJjb250YWluZXIiLCJoYW5kbGVOZXdDaGF0IiwiYWlTaWRlYmFyTmV3Q2hhdCIsImhhbmRsZVJlZmV0Y2hTZXNzaW9uIiwiYmFja2dyb3VuZCIsImlzQWdlbnRzSHViU2VjdGlvbiIsInNob3dOZXdDaGF0QnV0dG9uIiwiaXNfZGVsZXRlZCIsImhhc19ub3RfcGVybWlzc2lvbnMiLCJoYXNfbm90X2FjY2VzcyIsIiRpc09wZW4iLCJjb2xvciIsIiRmbG9hdGluZyIsIiRhY3RpdmUiLCJhaUNoYXRNcE9wZW4iLCJhaVNpZGViYXJNeUFnZW50cyIsInR5cGUiLCIkaGFzQ2hhdHMiLCJsZW5ndGgiLCIkb2Zmc2V0VmFyaWFudCIsIiRhZ2VudE5hdkJ1dHRvbkNvdW50IiwiY291bnQiLCIkanVzdGlmeUJldHdlZW4iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvU2lkZWJhci9TaWRlYmFyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvdyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuaW1wb3J0IHsgTXV0YWJsZVJlZk9iamVjdCwgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDaGV2cm9uRG91YmxlTGVmdCB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0NoZXZyb25Eb3VibGVMZWZ0J1xuaW1wb3J0IHsgSGlzdG9yeSB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL0hpc3RvcnknXG5pbXBvcnQgeyBDVUJ1dHRvbiB9IGZyb20gJ0Bwcm9qZWN0Y29yL2J1dHRvbi9saWIvY29tcG9uZW50cy9DVUJ1dHRvbidcbmltcG9ydCB7IE1lbnVEb3RzIH0gZnJvbSAnQHByb2plY3Rjb3IvaWNvbnMvbGliL2NvbXBvbmVudHMvTWVudURvdHMnXG5pbXBvcnQgeyBQZW5jaWwgfSBmcm9tICdAcHJvamVjdGNvci9pY29ucy9saWIvY29tcG9uZW50cy9QZW5jaWwnXG5pbXBvcnQgeyBUcmFzaCB9IGZyb20gJ0Bwcm9qZWN0Y29yL2ljb25zL2xpYi9jb21wb25lbnRzL1RyYXNoJ1xuXG5pbXBvcnQgeyBUb29sdGlwIH0gZnJvbSAnQHByb2plY3Rjb3IvdG9vbHRpcHYyL2xpYi9jb21wb25lbnRzL1Rvb2x0aXAnXG5cbmltcG9ydCB7IEVtcHR5SGlzdG9yeUljb24gfSBmcm9tICcuLi8uLi9hdG9tcy9pY29ucy9FbXB0eUhpc3RvcnknXG5pbXBvcnQgeyB1c2VSZXNpemVMaXN0ZW5lciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVJlc2l6ZSdcbmltcG9ydCB7IHVzZUNoYXRzIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQ2hhdHMnXG5pbXBvcnQgeyBTaWRlYmFyQ2hhdHNTa2VsZXRvbiB9IGZyb20gJy4vU2lkZWJhci5za2VsZXRvbidcbmltcG9ydCB7IEVycm9yU3RhdGUsIE1BSUFJY29uLCBNYWlhU3RvcmVJY29uLCBNeUFnZW50c05hdkljb24sIFNraWxsc05hdkljb24sIE5ld0NoYXQgfSBmcm9tICcuLi8uLi9hdG9tcy9pY29ucydcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VUJ1xuaW1wb3J0IHsgT3B0aW9uSXRlbSB9IGZyb20gJy4uLy4uL2F0b21zL0NhcmRNZW51L0NhcmRNZW51J1xuaW1wb3J0IHsgRWRpdFF1ZXN0aW9uTW9kYWwgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvRWRpdFF1ZXN0aW9uTW9kYWwnXG5pbXBvcnQgeyBEZWxldGVRdWVzdGlvbk1vZGFsIH0gZnJvbSAnLi4vLi4vb3JnYW5pc21zL0RlbGV0ZVF1ZXN0aW9uTW9kYWwnXG5pbXBvcnQgeyBFcnJvckljb24gfSBmcm9tICcuLi8uLi9hdG9tcy9pY29ucy9FcnJvckljb24nXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IEZlZWRiYWNrQnV0dG9uIH0gZnJvbSAnLi4vLi4vYXRvbXMvRmVlZGJhY2tCdXR0b24nXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL21haWEvY2xpZW50J1xuaW1wb3J0IHsgY2FuQWNjZXNzVG9Ta2lsbHMgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvcGVybWlzc2lvbnMnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IGZvcm1hdENoYXRMaXN0VGl0bGVNZW50aW9ucyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucydcbmltcG9ydCB7IGdldEFnZW50RGlzcGxheU5hbWUsIGlzTWFya2V0cGxhY2VHbG9iYWxDbG9uZUFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvYWdlbnREaXNwbGF5TmFtZSdcbmltcG9ydCB7IEFQUENVRVNfRVZFTlRTLCBBUFBDVUVTX1NFTEVDVE9SUywgdHJhY2tBcHBjdWVzRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hcHBjdWVzJ1xuaW1wb3J0IHsgZm9ybWF0VW5yZWFkQ291bnQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9mb3JtYXRVbnJlYWRDb3VudCdcbmltcG9ydCB7IFNlc3Npb25HZW5lcmF0aW5nRG90IH0gZnJvbSAnLi4vLi4vYXRvbXMvU2Vzc2lvbkdlbmVyYXRpbmdEb3QnXG5pbXBvcnQgeyB1c2VJc1Nlc3Npb25HZW5lcmF0aW5nLCB1c2VTZXNzaW9uTWV0YSB9IGZyb20gJy4uLy4uLy4uL3N0b3JlL3Nlc3Npb25zL3VzZVNlc3Npb25NZXRhJ1xuaW1wb3J0IHsgdXNlTWFpYVRhc2tQYW5lbFpJbmRleCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZU1haWFUYXNrUGFuZWxaSW5kZXgnXG5pbXBvcnQge1xuICBTQ0xIQ1dyYXBwZXIsXG4gIFNDTEhDV3JhcHBlckFnZW50LFxuICBTQ0xIQ1dyYXBwZXJBZ2VudFRleHQsXG4gIFNDTEhDV3JhcHBlckJ1dHRvbkFjdGlvbnMsXG4gIFNDTEhDV3JhcHBlckNvbnRlbnQsXG4gIFNDTEhDV3JhcHBlclRpdGxlLFxuICBTQ0xIQ1dyYXBwZXJUaXRsZVJvdyxcbiAgU0NTV3JhcHBlckNvbGxhcHNlZEJ1dHRvbixcbiAgU0NTV3JhcHBlck5ld0NoYXRJY29uLFxuICBTQ1NXcmFwcGVyQWdlbnRzTmF2SWNvbixcbn0gZnJvbSAnLi9TaWRlYmFyLnN0eWxlcydcbmltcG9ydCB7XG4gIFNDU1NpZGViYXJSb290LFxuICBTQ1NTaWRlYmFyVG9vbGJhcixcbiAgU0NTU2lkZWJhckJvZHksXG4gIFNDU1NpZGViYXJPcGVuUGFuZWwsXG4gIFNDU1NpZGViYXJBZ2VudHNCbG9jayxcbiAgU0NTU2lkZWJhckFnZW50c0FjdGlvbnMsXG4gIFNDU1NpZGViYXJNYWlha2VyTmF2QnV0dG9uLFxuICBTQ1NTaWRlYmFyTWFpYWtlck5hdkxhYmVsLFxuICBTQ1NTaWRlYmFyQ29udmVyc2F0aW9uc0hlYWRpbmcsXG4gIFNDU1NpZGViYXJDb252ZXJzYXRpb25zSGVhZGluZ1JvdyxcbiAgU0NTU2lkZWJhclVucmVhZEFuY2hvcixcbiAgU0NTU2lkZWJhclVucmVhZENvdW50LFxuICBTQ1NTaWRlYmFyQ2hhdHNTY3JvbGwsXG4gIFNDU1NpZGViYXJFcnJvclN0YXRlQ29sdW1uLFxuICBTQ1NTaWRlYmFyRXJyb3JTdGF0ZVRvcCxcbiAgU0NTU2lkZWJhckVycm9yQmFubmVyLFxuICBTQ1NTaWRlYmFyRXJyb3JCYW5uZXJJY29uV3JhcCxcbiAgU0NTU2lkZWJhckVycm9yQmFubmVyTWVzc2FnZSxcbiAgU0NTU2lkZWJhckxvYWRpbmdBcmVhLFxuICBTQ1NTaWRlYmFyTG9hZE1vcmVSb3csXG4gIFNDU1NpZGViYXJFbXB0eUNoYXRzLFxuICBTQ1NTaWRlYmFyRW1wdHlDaGF0c1RleHQsXG4gIFNDU1NpZGViYXJDaGF0c0Zvb3RlcixcbiAgU0NTU2lkZWJhckZvb3RlckFjdGlvbnMsXG4gIFNDU1NpZGViYXJDb2xsYXBzZWREaXZpZGVyLFxufSBmcm9tICcuL1NpZGViYXIubGF5b3V0LnN0eWxlcydcblxuY29uc3QgYWN0aW9ucyA9IHtcbiAgZWRpdDogKHByb3BzOiBhbnkpID0+IDxFZGl0UXVlc3Rpb25Nb2RhbCB7Li4ucHJvcHN9IC8+LFxuICBkZWxldGU6IChwcm9wczogYW55KSA9PiA8RGVsZXRlUXVlc3Rpb25Nb2RhbCB7Li4ucHJvcHN9IC8+LFxufVxuXG4vKiogQWJyZXZpYSBcImVzcGVjaWFsaXN0YVwiL1wiZXNwZWNpYWxpc3RcIiDihpIgXCJFc3AuXCIgKEVTL1BUKSB5IFwic3BlY2lhbGlzdFwiIOKGkiBcIlNwZWMuXCIgKEVOKSBlbiBlbCBub21icmUgZGVsIGFnZW50ZS4gKi9cbmZ1bmN0aW9uIGFiYnJldmlhdGVTcGVjaWFsaXN0SW5BZ2VudE5hbWUoYWdlbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWFnZW50TmFtZSB8fCB0eXBlb2YgYWdlbnROYW1lICE9PSAnc3RyaW5nJykgcmV0dXJuIGFnZW50TmFtZVxuICByZXR1cm4gYWdlbnROYW1lLnJlcGxhY2UoL1xcYihlc3BlY2lhbGlzdGF8ZXNwZWNpYWxpc3QpXFxiL2dpLCAnRXNwLicpLnJlcGxhY2UoL1xcYnNwZWNpYWxpc3RcXGIvZ2ksICdTcGVjLicpXG59XG5cbmNvbnN0IExpc3RIaXN0b3J5Q2hhdCA9ICh7XG4gIGNoYXQsXG4gIG9uQ2xpY2ssXG4gIGlzTW9kYWxPcGVuLFxuICBvbk9wZW5Nb2RhbCxcbiAgb25DbG9zZU1vZGFsLFxuICBoYW5kbGVycyxcbiAgaXNTZWxlY3RlZCxcbiAgaW5kZXgsXG4gIHRvb2x0aXBaSW5kZXgsXG59OiB7XG4gIGNoYXQ6IGFueVxuICBvbkNsaWNrOiAoY2hhdDogYW55KSA9PiB2b2lkXG4gIGlzTW9kYWxPcGVuOiBib29sZWFuXG4gIG9uT3Blbk1vZGFsOiAoY2hhdElkOiBzdHJpbmcpID0+IHZvaWRcbiAgb25DbG9zZU1vZGFsOiAoKSA9PiB2b2lkXG4gIGhhbmRsZXJzOiB7XG4gICAgaGFuZGxlRGVsZXRlQ2hhdDogKGNoYXQ6IGFueSkgPT4gdm9pZFxuICAgIGhhbmRsZVVwZGF0ZUNoYXQ6IChjaGF0OiBhbnkpID0+IHZvaWRcbiAgfVxuICBpc1NlbGVjdGVkOiBib29sZWFuXG4gIGluZGV4OiBudW1iZXJcbiAgdG9vbHRpcFpJbmRleDogbnVtYmVyXG59KSA9PiB7XG4gIGNvbnN0IHRleHRSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IGFnZW50UmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuICBjb25zdCBkaXNwbGF5VGl0bGUgPSB1c2VNZW1vKCgpID0+IGZvcm1hdENoYXRMaXN0VGl0bGVNZW50aW9ucyhjaGF0LnRpdGxlKSwgW2NoYXQudGl0bGVdKVxuICBjb25zdCBkaXNwbGF5QWdlbnQgPSBnZXRBZ2VudERpc3BsYXlOYW1lKGNoYXQuYWdlbnRUeXBlLCBjaGF0LmFnZW50KVxuICBjb25zdCBjb250ZXh0TmFtZSA9IGNoYXQucHJvamVjdE5hbWUgfHwgY2hhdC5jbGllbnROYW1lXG4gIGNvbnN0IHsgc2hvd1Rvb2x0aXAgfSA9IHVzZVJlc2l6ZUxpc3RlbmVyKHRleHRSZWYsIFtkaXNwbGF5VGl0bGVdKVxuICBjb25zdCB7IHNob3dUb29sdGlwOiBzaG93VG9vbHRpcEFnZW50IH0gPSB1c2VSZXNpemVMaXN0ZW5lcihhZ2VudFJlZiwgW2NoYXQuYWdlbnRdKVxuICBjb25zdCB7IHQgfSA9IHVzZVQoKVxuICBjb25zdCBbYWN0aW9uLCBzZXRBY3Rpb25dID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgaXNHZW5lcmF0aW5nID0gdXNlSXNTZXNzaW9uR2VuZXJhdGluZyhjaGF0LnNlc3Npb25FeHRlcm5hbElkKVxuICBjb25zdCBzZXNzaW9uTWV0YSA9IHVzZVNlc3Npb25NZXRhKGNoYXQuc2Vzc2lvbkV4dGVybmFsSWQpXG4gIGNvbnN0IGlzVW5yZWFkID0gY2hhdC5pc1JlYWQgPT09IGZhbHNlICYmICFpc0dlbmVyYXRpbmdcblxuICBjb25zdCBtZW51SXRlbXMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IHQoJ2hpc3RvcnkubWVudS5yZW5hbWUnKSxcbiAgICAgIG9uQ2xpY2tJdGVtOiAoY2hhdElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc2V0QWN0aW9uKCdlZGl0JylcbiAgICAgICAgb25PcGVuTW9kYWwoY2hhdElkKVxuICAgICAgfSxcbiAgICAgIEljb246IFBlbmNpbCxcbiAgICAgIGV2ZW50S2V5OiBFVkVOVFMucG1BaU1lbnVFZGl0LFxuICAgIH0sXG4gICAge1xuICAgICAgbGFiZWw6IHQoJ2hpc3RvcnkubWVudS5kZWxldGUnKSxcbiAgICAgIG9uQ2xpY2tJdGVtOiAoY2hhdElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgc2V0QWN0aW9uKCdkZWxldGUnKVxuICAgICAgICBvbk9wZW5Nb2RhbChjaGF0SWQpXG4gICAgICB9LFxuICAgICAgSWNvbjogVHJhc2gsXG4gICAgICBldmVudEtleTogRVZFTlRTLnBtQWlNZW51RGVsZXRlLFxuICAgIH0sXG4gIF1cblxuICBjb25zdCBoYW5kbGVDb25maXJtQWN0aW9uID0gKGNoYXREYXRhOiBhbnkpID0+IHtcbiAgICBpZiAoYWN0aW9uID09PSAnZWRpdCcpIHtcbiAgICAgIGhhbmRsZXJzLmhhbmRsZVVwZGF0ZUNoYXQoY2hhdERhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZXJzLmhhbmRsZURlbGV0ZUNoYXQoY2hhdERhdGEpXG4gICAgfVxuICAgIHNldEFjdGlvbihudWxsKVxuICAgIG9uQ2xvc2VNb2RhbCgpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8U0NMSENXcmFwcGVyQ29udGVudFxuICAgICAgICBvbkNsaWNrPXtlID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgb25DbGljayhjaGF0KVxuICAgICAgICB9fVxuICAgICAgICBrZXk9e2Bjb252ZXJzYXRpb24tJHtjaGF0LnNlc3Npb25FeHRlcm5hbElkfWB9XG4gICAgICAgIGlzTW9kYWxPcGVuPXtpc01vZGFsT3Blbn1cbiAgICAgICAgaXNTZWxlY3RlZD17aXNTZWxlY3RlZH1cbiAgICAgICAgJGluZGV4PXtpbmRleH1cbiAgICAgID5cbiAgICAgICAgPFNDTEhDV3JhcHBlcj5cbiAgICAgICAgICA8U0NMSENXcmFwcGVyVGl0bGVSb3c+XG4gICAgICAgICAgICB7aXNHZW5lcmF0aW5nIHx8IGlzVW5yZWFkID8gKFxuICAgICAgICAgICAgICA8U2Vzc2lvbkdlbmVyYXRpbmdEb3RcbiAgICAgICAgICAgICAgICBhcmlhTGFiZWw9e2lzR2VuZXJhdGluZyA/IHQoJ2NvbnZlcnNhdGlvbnMuZ2VuZXJhdGluZycpIDogdCgnY29udmVyc2F0aW9ucy51bnJlYWRMYWJlbCcpfVxuICAgICAgICAgICAgICAgIGlzV3JpdGluZz17aXNHZW5lcmF0aW5nICYmIHNlc3Npb25NZXRhPy5pc1dyaXRpbmd9XG4gICAgICAgICAgICAgICAgYW5pbWF0ZWQ9e2lzR2VuZXJhdGluZ31cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3Nob3dUb29sdGlwID8gZGlzcGxheVRpdGxlIDogJyd9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICAgIDxTQ0xIQ1dyYXBwZXJUaXRsZSByZWY9e3RleHRSZWZ9ICR1bnJlYWQ9e2lzVW5yZWFkfT5cbiAgICAgICAgICAgICAgICB7ZGlzcGxheVRpdGxlIHx8IHQoJ2NvbnZlcnNhdGlvbnMuZW1wdHlMYWJlbCcpfVxuICAgICAgICAgICAgICA8L1NDTEhDV3JhcHBlclRpdGxlPlxuICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgIDwvU0NMSENXcmFwcGVyVGl0bGVSb3c+XG4gICAgICAgICAgPFRvb2x0aXBcbiAgICAgICAgICAgIHRpdGxlPXtzaG93VG9vbHRpcEFnZW50ID8gZGlzcGxheUFnZW50ICsgKGNvbnRleHROYW1lID8gYCAtICR7Y29udGV4dE5hbWV9YCA6ICcnKSA6ICcnfVxuICAgICAgICAgICAgekluZGV4PXt0b29sdGlwWkluZGV4fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxTQ0xIQ1dyYXBwZXJBZ2VudD5cbiAgICAgICAgICAgICAge2NoYXQuYWdlbnRUeXBlID09PSAnY2xvbmUnIHx8IGNoYXQuYWdlbnRUeXBlID09PSAnb3JjaGVzdHJhdG9yJyA/IChcbiAgICAgICAgICAgICAgICA8TUFJQUljb24gd2lkdGg9ezE0fSBoZWlnaHQ9ezE0fSAvPlxuICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGZvbnRTaXplOiAnMTRweCcgfX0+e2NoYXQuZW1vaml9PC9zcGFuPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDxTQ0xIQ1dyYXBwZXJBZ2VudFRleHQgcmVmPXthZ2VudFJlZn0+XG4gICAgICAgICAgICAgICAge2NoYXQuYWdlbnRUeXBlID09PSAnY2xvbmUnIHx8IGNoYXQuYWdlbnRUeXBlID09PSAnb3JjaGVzdHJhdG9yJ1xuICAgICAgICAgICAgICAgICAgPyBhYmJyZXZpYXRlU3BlY2lhbGlzdEluQWdlbnROYW1lKGNoYXQuYWdlbnQpXG4gICAgICAgICAgICAgICAgICA6IGNoYXQuYWdlbnR9XG4gICAgICAgICAgICAgICAge2NoYXQucHJvamVjdE5hbWUgJiYgYCAtICR7Y2hhdC5wcm9qZWN0TmFtZX1gfVxuICAgICAgICAgICAgICA8L1NDTEhDV3JhcHBlckFnZW50VGV4dD5cbiAgICAgICAgICAgIDwvU0NMSENXcmFwcGVyQWdlbnQ+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICA8L1NDTEhDV3JhcHBlcj5cbiAgICAgICAgPFNDTEhDV3JhcHBlckJ1dHRvbkFjdGlvbnM+XG4gICAgICAgICAgPENVQnV0dG9uXG4gICAgICAgICAgICBpY29uT25seVxuICAgICAgICAgICAgc2l6ZT1cInNtYWxsXCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJ0ZXh0XCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e2V2ZW50ID0+IHtcbiAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgb25PcGVuTW9kYWwoY2hhdC5pZClcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPE1lbnVEb3RzIHdpZHRoPXsyMH0gaGVpZ2h0PXsyMH0gLz5cbiAgICAgICAgICA8L0NVQnV0dG9uPlxuICAgICAgICAgIHtpc01vZGFsT3BlbiAmJiAhYWN0aW9uICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgZGF0YS1tb2RhbC1jb250YWluZXJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICB0b3A6ICczMnB4JyxcbiAgICAgICAgICAgICAgICByaWdodDogJzE2cHgnLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6IDEwMDAsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHJnYmEoMjI0LCAyMjQsIDIyNCwgMSknLFxuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnMTI0cHgnLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7bWVudUl0ZW1zLm1hcCgoeyBsYWJlbCwgb25DbGlja0l0ZW0sIEljb24sIGV2ZW50S2V5IH0pID0+IChcbiAgICAgICAgICAgICAgICA8T3B0aW9uSXRlbVxuICAgICAgICAgICAgICAgICAga2V5PXtsYWJlbH1cbiAgICAgICAgICAgICAgICAgIGxhYmVsPXtsYWJlbH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9uQ2xpY2tJdGVtKGNoYXQuaWQpfVxuICAgICAgICAgICAgICAgICAgSWNvbj17SWNvbn1cbiAgICAgICAgICAgICAgICAgIGV2ZW50S2V5PXtldmVudEtleX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvU0NMSENXcmFwcGVyQnV0dG9uQWN0aW9ucz5cbiAgICAgIDwvU0NMSENXcmFwcGVyQ29udGVudD5cbiAgICAgIHshIWFjdGlvbiAmJlxuICAgICAgICBhY3Rpb25zW2FjdGlvbl0oe1xuICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgIG9uQ2xvc2VNb2RhbCgpXG4gICAgICAgICAgICBzZXRBY3Rpb24obnVsbClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoYXQsXG4gICAgICAgICAgaGFuZGxlcnM6IHtcbiAgICAgICAgICAgIGhhbmRsZUNvbmZpcm1BY3Rpb24sXG4gICAgICAgICAgICBoYW5kbGVTZXRJc09wZW5Nb2RhbDogb25DbG9zZU1vZGFsLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBTaWRlYmFyID0gKHtcbiAgb25Hb1RvQ2hhdCxcbiAgb25FcnJvciA9ICgpID0+IG51bGwsXG4gIGhhbmRsZUdvVG9Ib21lLFxuICBoYW5kbGVTdGFydE5ld0NoYXQsXG4gIGhhbmRsZU9wZW5NYXJrZXRwbGFjZSxcbiAgaGFuZGxlT3BlblNraWxscyxcbiAgc2hvd05ld0NoYXQsXG4gIHJlZmV0Y2hDaGF0cyxcbiAgaGFuZGxlU2V0UmVmZXRjaENoYXRzLFxuICBoYXNFcnJvcixcbiAgcmVzZXRTZWxlY3RlZENoYXRSZWYsXG4gIGFnZW50c05hdkFjdGl2ZSA9IG51bGwsXG4gIGlzTGVnYWN5Q29udGV4dFNlc3Npb24gPSBmYWxzZSxcbn06IHtcbiAgb25Hb1RvQ2hhdDogKGNoYXRJZDogc3RyaW5nKSA9PiB2b2lkXG4gIG9uRXJyb3I6ICgpID0+IHZvaWRcbiAgaGFuZGxlR29Ub0hvbWU6ICgpID0+IHZvaWRcbiAgLyoqIEluaWNpYSB1biBjaGF0IG51ZXZvOyBlbiBNaXMgYWdlbnRlcyAvIENyZWFkb3IgZGUgYWdlbnRlcyB1c2EgZWwgcHJpbWVyIGFnZW50ZSBkZSBsYSBsaXN0YS4gKi9cbiAgaGFuZGxlU3RhcnROZXdDaGF0PzogKCkgPT4gdm9pZFxuICBoYW5kbGVPcGVuTWFya2V0cGxhY2U6ICgpID0+IHZvaWRcbiAgaGFuZGxlT3BlblNraWxsczogKCkgPT4gdm9pZFxuICBzaG93TmV3Q2hhdDogYm9vbGVhblxuICByZWZldGNoQ2hhdHM6IGJvb2xlYW5cbiAgaGFuZGxlU2V0UmVmZXRjaENoYXRzOiAocmVmZXRjaDogYm9vbGVhbikgPT4gdm9pZFxuICBoYXNFcnJvcjogYm9vbGVhblxuICByZXNldFNlbGVjdGVkQ2hhdFJlZj86IE11dGFibGVSZWZPYmplY3Q8KCgpID0+IHZvaWQpIHwgbnVsbD5cbiAgLyoqIFJlc2FsdGEgTWFpYWtlciwgTWlzIGFnZW50ZXMgbyBNaXMgc2tpbGxzICovXG4gIGFnZW50c05hdkFjdGl2ZT86ICdtYWlha2VyJyB8ICdteUFnZW50cycgfCAnbXlTa2lsbHMnIHwgbnVsbFxuICAvKiogQ29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3kgKGFnZW50X3R5cGUgY2xvbmUgKyBlbnRpdHkgcHJvamVjdC9jbGllbnQvdGFzayk6IG9jdWx0YSBcIm51ZXZvIGNoYXRcIi4gKi9cbiAgaXNMZWdhY3lDb250ZXh0U2Vzc2lvbj86IGJvb2xlYW5cbn0pID0+IHtcbiAgY29uc3QgeyB0LCBpMThuIH0gPSB1c2VUKClcbiAgY29uc3QgdG9vbHRpcFpJbmRleCA9IHVzZU1haWFUYXNrUGFuZWxaSW5kZXgoMTUwMCwgJ292ZXJsYXknKVxuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtpc09wZW5Nb2RhbCwgc2V0SXNPcGVuTW9kYWxdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3NlbGVjdGVkQ2hhdCwgc2V0U2VsZWN0ZWRDaGF0XSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGNoYXRzRmV0Y2hlZFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgY2hhdHNDb250YWluZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpXG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgZXZlbnRBbXBsaXR1ZGUgPSB1c2VFdmVudCgpXG4gIGNvbnN0IHsgYWdlbnQ6IHNlbGVjdGVkQWdlbnQsIHNlbGVjdEFnZW50LCBzZXRQcm9qZWN0LCBzZXRDbGllbnQsIHNldFRhc2sgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCB7XG4gICAgbG9hZGluZ0NoYXRzLFxuICAgIGNoYXRzLFxuICAgIGRlbGV0ZUNoYXQsXG4gICAgdXBkYXRlQ2hhdCxcbiAgICBmZXRjaENoYXRzLFxuICAgIGxpbWl0LFxuICAgIG9mZnNldCxcbiAgICBoYXNNb3JlQ2hhdHMsXG4gICAgbG9hZE1vcmVDaGF0cyxcbiAgICBpc0xvYWRpbmdNb3JlQ2hhdHMsXG4gICAgdW5yZWFkQ291bnQsXG4gICAgc2V0VW5yZWFkQ291bnQsXG4gICAgc2V0Q2hhdFJlYWRTdGF0ZSxcbiAgfSA9IHVzZUNoYXRzKHtcbiAgICBvbkVycm9yLFxuICB9KVxuXG4gIGNvbnN0IHVucmVhZFN1YnNjcmliZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXVzZXI/LmlkIHx8IHR5cGVvZiAkX3NjID09PSAndW5kZWZpbmVkJyB8fCAhJF9zYykgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgY2hhbm5lbCA9IGBzZXNzaW9ucy51bnJlYWQ6JHt1c2VyLmlkfWBcbiAgICBjb25zdCBoYW5kbGVVbnJlYWRFdmVudCA9ICh7XG4gICAgICBtb2RlbF9kYXRhOiBtb2RlbERhdGEsXG4gICAgfToge1xuICAgICAgbW9kZWxfZGF0YT86IHsgdW5yZWFkX2NvdW50PzogbnVtYmVyOyBzZXNzaW9uX2lkPzogc3RyaW5nOyBpc19yZWFkPzogYm9vbGVhbiB9XG4gICAgfSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBtb2RlbERhdGE/LnVucmVhZF9jb3VudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2V0VW5yZWFkQ291bnQobW9kZWxEYXRhLnVucmVhZF9jb3VudClcbiAgICAgIH1cbiAgICAgIGlmIChtb2RlbERhdGE/LnNlc3Npb25faWQgJiYgdHlwZW9mIG1vZGVsRGF0YT8uaXNfcmVhZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHNldENoYXRSZWFkU3RhdGUobW9kZWxEYXRhLnNlc3Npb25faWQsIG1vZGVsRGF0YS5pc19yZWFkKVxuICAgICAgfVxuICAgIH1cblxuICAgICRfc2Muc3Vic2NyaWJlSGFuZGxlcihjaGFubmVsLCBoYW5kbGVVbnJlYWRFdmVudClcblxuICAgIGlmICghdW5yZWFkU3Vic2NyaWJlZFJlZi5jdXJyZW50KSB7XG4gICAgICAkX3NjLnVwZGF0ZUNvbm5lY3Rpb25Nb2RlbChcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsX2hhc2g6IGNoYW5uZWwsXG4gICAgICAgICAgYWN0aW9uOiAkX3NjLmFjdGlvblR5cGU/LlNVQlNDUklCRSxcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdXNlcixcbiAgICAgICAgdXNlcixcbiAgICAgICAgJF9zYy5jaGFubmVsVHlwZT8uTU9ERUxfQ0hBTk5FTFxuICAgICAgKVxuICAgICAgdW5yZWFkU3Vic2NyaWJlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfSwgW3VzZXIsIHNldFVucmVhZENvdW50LCBzZXRDaGF0UmVhZFN0YXRlXSlcblxuICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSB1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzXG4gIGNvbnN0IGNhbkNyZWF0ZUFnZW50cyA9ICEhdXNlclBlcm1pc3Npb25zPy5jcmVhdGVcbiAgY29uc3QgaGFzTXVsdGlBZ2VudHNGZWF0dXJlQWNjZXNzID0gISF3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuICBjb25zdCBjYW5WaWV3QWdlbnRzID0gISF1c2VyUGVybWlzc2lvbnM/LnZpZXcgJiYgaGFzTXVsdGlBZ2VudHNGZWF0dXJlQWNjZXNzXG4gIC8vIFRlbXBvcmFsOiBza2lsbHMgZW4gc2lkZWJhciBzb2xvIHBhcmEgY29tcGFueSAyMzM2XG4gIGNvbnN0IGNhblZpZXdTa2lsbHMgPSBjYW5WaWV3QWdlbnRzICYmIGNhbkFjY2Vzc1RvU2tpbGxzKCkgJiYgdXNlcj8uY29tcGFueV9pZCA9PT0gMjMzNlxuICBjb25zdCBzaG93TWFya2V0cGxhY2VTaWRlYmFyQnV0dG9uID0gISFjYW5DcmVhdGVBZ2VudHMgJiYgaGFzTXVsdGlBZ2VudHNGZWF0dXJlQWNjZXNzXG4gIGNvbnN0IGFnZW50TmF2QnV0dG9uQ291bnQgPSAoKHNob3dNYXJrZXRwbGFjZVNpZGViYXJCdXR0b24gPyAxIDogMCkgK1xuICAgIChjYW5WaWV3QWdlbnRzID8gMSA6IDApICtcbiAgICAoY2FuVmlld1NraWxscyA/IDEgOiAwKSkgYXMgMCB8IDEgfCAyIHwgM1xuICBjb25zdCBzaG93QWdlbnRzTmF2QmxvY2sgPSBzaG93TWFya2V0cGxhY2VTaWRlYmFyQnV0dG9uIHx8IGNhblZpZXdBZ2VudHMgfHwgY2FuVmlld1NraWxsc1xuICBjb25zdCBteUFnZW50c1NpZGViYXJUcmFja2VkUmVmID0gdXNlUmVmKGZhbHNlKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYW5WaWV3QWdlbnRzIHx8IG15QWdlbnRzU2lkZWJhclRyYWNrZWRSZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBteUFnZW50c1NpZGViYXJUcmFja2VkUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgdHJhY2tBcHBjdWVzRXZlbnQoQVBQQ1VFU19FVkVOVFMubWFpYVNpZGViYXJNeUFnZW50cylcbiAgfSwgW2NhblZpZXdBZ2VudHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmKSB7XG4gICAgICByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50ID0gKCkgPT4gc2V0U2VsZWN0ZWRDaGF0KG51bGwpXG4gICAgfVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmVzZXRTZWxlY3RlZENoYXRSZWYpIHtcbiAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWYuY3VycmVudCA9IG51bGxcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtyZXNldFNlbGVjdGVkQ2hhdFJlZl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVTZWxlY3RTZXNzaW9uID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbklkIH0gPSAoZXZ0IGFzIEN1c3RvbUV2ZW50PHsgc2Vzc2lvbklkPzogc3RyaW5nIH0+KS5kZXRhaWwgPz8ge31cbiAgICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgICAgc2V0U2VsZWN0ZWRDaGF0KHNlc3Npb25JZClcbiAgICAgIH1cbiAgICB9XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2lkZWJhci1zZWxlY3Qtc2Vzc2lvbicsIGhhbmRsZVNlbGVjdFNlc3Npb24pXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3NpZGViYXItc2VsZWN0LXNlc3Npb24nLCBoYW5kbGVTZWxlY3RTZXNzaW9uKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlQ2hhdCA9IGFzeW5jIChjaGF0OiBhbnkpID0+IHtcbiAgICBkZWxldGVDaGF0KGNoYXQuc2Vzc2lvbkV4dGVybmFsSWQpXG4gICAgc2V0SXNPcGVuTW9kYWwobnVsbClcbiAgICBoYW5kbGVHb1RvSG9tZSgpXG4gIH1cblxuICBjb25zdCBoYW5kbGVVcGRhdGVDaGF0ID0gKGNoYXQ6IGFueSkgPT4ge1xuICAgIHVwZGF0ZUNoYXQoY2hhdClcbiAgICBzZXRJc09wZW5Nb2RhbChudWxsKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlT3Blbk1vZGFsID0gKGNoYXRJZDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGlzT3Blbk1vZGFsICYmIGlzT3Blbk1vZGFsICE9PSBjaGF0SWQpIHtcbiAgICAgIHNldElzT3Blbk1vZGFsKG51bGwpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldElzT3Blbk1vZGFsKGNoYXRJZClcbiAgICB9XG4gIH1cblxuICBjb25zdCBoYW5kbGVDbG9zZU1vZGFsID0gKCkgPT4ge1xuICAgIHNldElzT3Blbk1vZGFsKG51bGwpXG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZUNsaWNrT3V0c2lkZSA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKGlzT3Blbk1vZGFsICYmICEoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLmNsb3Nlc3QoJ1tkYXRhLW1vZGFsLWNvbnRhaW5lcl0nKSkge1xuICAgICAgICBzZXRJc09wZW5Nb2RhbChudWxsKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc09wZW5Nb2RhbCkge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgaGFuZGxlQ2xpY2tPdXRzaWRlKVxuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBoYW5kbGVDbGlja091dHNpZGUpXG4gICAgfVxuICB9LCBbaXNPcGVuTW9kYWxdKVxuXG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVNpZGViYXIgPSAoKSA9PiB7XG4gICAgaWYgKGlzT3Blbk1vZGFsKSB7XG4gICAgICBzZXRJc09wZW5Nb2RhbChudWxsKVxuICAgIH1cbiAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0U2lkZWJhciwgeyBhY3Rpb246IGlzT3BlbiA/ICdjbG9zZScgOiAnb3BlbicgfSlcbiAgICBzZXRJc09wZW4ocHJldiA9PiAhcHJldilcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9wZW5DcmVhdGVBZ2VudCA9IGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgICAgICBwYXRoOiBgYWdlbnRzP2FnZW50X3R5cGU9Y2xvbmUmZW50aXR5PWdsb2JhbCZsYW5nPSR7bWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKX1gLFxuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgfSlcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKClcbiAgICAgIGNvbnN0IG1haWFrZXJBZ2VudCA9IChkYXRhLmRhdGEgfHwgW10pLmZpbmQoKGFnZW50SXRlbTogeyB0eXBlPzogc3RyaW5nOyBlbnRpdHk/OiBzdHJpbmc7IG5hbWU/OiBzdHJpbmcgfSkgPT5cbiAgICAgICAgaXNNYXJrZXRwbGFjZUdsb2JhbENsb25lQWdlbnQoYWdlbnRJdGVtKVxuICAgICAgKVxuXG4gICAgICBpZiAoIW1haWFrZXJBZ2VudCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIHNldFRhc2sobnVsbClcbiAgICAgIC8vIGhhbmRsZUdvVG9Ib21lIHB1ZWRlIHJlc2VsZWNjaW9uYXIgYWdlbnRzLmRhdGFbMF0gc2kgZWwgYWdlbnRlIGdsb2JhbCBhdW4gZXN0YSBlbiBudWxsXG4gICAgICAvLyAoY2xvc3VyZSBzdGFsZSBkZSBsYSBzZWNjaW9uIFwiTWlzIGFnZW50ZXNcIiksIHBvciBlc28gc2VsZWN0QWdlbnQobWFpYWtlckFnZW50KSB2YSBkZXNwdWVzLlxuICAgICAgaGFuZGxlR29Ub0hvbWUoKVxuICAgICAgc2VsZWN0QWdlbnQobWFpYWtlckFnZW50KVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBvbkVycm9yKClcbiAgICB9XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2hhdHNGZXRjaGVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRzRmV0Y2hlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgZmV0Y2hDaGF0cyh7IGxpbWl0LCBvZmZzZXQgfSlcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICAvLyBSZWZldGNoIHNvbGljaXRhZG8gcG9yIHByb3A6IHNlIGVqZWN1dGEgYXVucXVlIGVsIHNpZGViYXIgZXN0w6kgY29sYXBzYWRvLlxuICAgIGlmIChyZWZldGNoQ2hhdHMpIHtcbiAgICAgIGZldGNoQ2hhdHMoeyBsaW1pdCwgb2Zmc2V0IH0pXG4gICAgICBoYW5kbGVTZXRSZWZldGNoQ2hhdHMoZmFsc2UpXG4gICAgfVxuICB9LCBbcmVmZXRjaENoYXRzLCBoYW5kbGVTZXRSZWZldGNoQ2hhdHMsIGZldGNoQ2hhdHMsIGxpbWl0LCBvZmZzZXRdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlU2Nyb2xsID0gKCkgPT4ge1xuICAgICAgaWYgKCFjaGF0c0NvbnRhaW5lclJlZi5jdXJyZW50IHx8ICFoYXNNb3JlQ2hhdHMgfHwgaXNMb2FkaW5nTW9yZUNoYXRzIHx8IGhhc0Vycm9yKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNoYXRzQ29udGFpbmVyUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IGlzQXRCb3R0b20gPSBzY3JvbGxUb3AgKyBjbGllbnRIZWlnaHQgPj0gc2Nyb2xsSGVpZ2h0IC0gMTBcblxuICAgICAgaWYgKGlzQXRCb3R0b20pIHtcbiAgICAgICAgbG9hZE1vcmVDaGF0cygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gY2hhdHNDb250YWluZXJSZWYuY3VycmVudFxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGhhbmRsZVNjcm9sbClcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtoYXNNb3JlQ2hhdHMsIGlzTG9hZGluZ01vcmVDaGF0cywgbG9hZE1vcmVDaGF0cywgaGFzRXJyb3JdKVxuXG4gIGNvbnN0IGhhbmRsZU5ld0NoYXQgPSAoKSA9PiB7XG4gICAgZXZlbnRBbXBsaXR1ZGUoRVZFTlRTLmFpU2lkZWJhck5ld0NoYXQpXG4gICAgaWYgKGlzT3Blbk1vZGFsKSB7XG4gICAgICBzZXRJc09wZW5Nb2RhbChudWxsKVxuICAgIH1cbiAgICBzZXRTZWxlY3RlZENoYXQobnVsbClcbiAgICBpZiAoaGFuZGxlU3RhcnROZXdDaGF0KSB7XG4gICAgICBoYW5kbGVTdGFydE5ld0NoYXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGhhbmRsZUdvVG9Ib21lKClcbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gQWwgY3JlYXIvYWN0dWFsaXphciB1bmEgY29udmVyc2FjacOzbiByZWZyZXNjYW1vcyBsYSBsaXN0YSBhdW5xdWUgZWwgc2lkZWJhciBlc3TDqSBjb2xhcHNhZG8uXG4gICAgY29uc3QgaGFuZGxlUmVmZXRjaFNlc3Npb24gPSAoKSA9PiB7XG4gICAgICBjaGF0c0ZldGNoZWRSZWYuY3VycmVudCA9IHRydWVcbiAgICAgIGZldGNoQ2hhdHMoeyBsaW1pdDogMjAsIG9mZnNldDogMCwgYmFja2dyb3VuZDogdHJ1ZSB9KVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWZldGNoLXNlc3Npb24nLCBoYW5kbGVSZWZldGNoU2Vzc2lvbilcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVmZXRjaC1zZXNzaW9uJywgaGFuZGxlUmVmZXRjaFNlc3Npb24pXG4gICAgfVxuICB9LCBbZmV0Y2hDaGF0c10pXG5cbiAgY29uc3QgaXNBZ2VudHNIdWJTZWN0aW9uID0gc2hvd05ld0NoYXQgJiYgKGFnZW50c05hdkFjdGl2ZSA9PT0gJ215QWdlbnRzJyB8fCBhZ2VudHNOYXZBY3RpdmUgPT09ICdtYWlha2VyJylcblxuICBjb25zdCBzaG93TmV3Q2hhdEJ1dHRvbiA9XG4gICAgaXNBZ2VudHNIdWJTZWN0aW9uIHx8XG4gICAgKCFzaG93TmV3Q2hhdCAmJlxuICAgICAgIWhhc0Vycm9yICYmXG4gICAgICAhbG9hZGluZ0NoYXRzICYmXG4gICAgICAhaXNMZWdhY3lDb250ZXh0U2Vzc2lvbiAmJlxuICAgICAgKCh1c2VyUGVybWlzc2lvbnM/LnZpZXcgJiZcbiAgICAgICAgIXNlbGVjdGVkQWdlbnQ/LmlzX2RlbGV0ZWQgJiZcbiAgICAgICAgIXNlbGVjdGVkQWdlbnQ/Lmhhc19ub3RfcGVybWlzc2lvbnMgJiZcbiAgICAgICAgIXNlbGVjdGVkQWdlbnQ/Lmhhc19ub3RfYWNjZXNzKSB8fFxuICAgICAgICAoIXVzZXJQZXJtaXNzaW9ucz8udmlldyAmJlxuICAgICAgICAgICFzZWxlY3RlZEFnZW50Py5pc19kZWxldGVkICYmXG4gICAgICAgICAgIXNlbGVjdGVkQWdlbnQ/Lmhhc19ub3RfcGVybWlzc2lvbnMgJiZcbiAgICAgICAgICAhc2VsZWN0ZWRBZ2VudD8uaGFzX25vdF9hY2Nlc3MpKSlcblxuICByZXR1cm4gKFxuICAgIDxTQ1NTaWRlYmFyUm9vdCAkaXNPcGVuPXtpc09wZW59PlxuICAgICAgPFNDU1NpZGViYXJUb29sYmFyICRpc09wZW49e2lzT3Blbn0+XG4gICAgICAgIDxUb29sdGlwIHRpdGxlPXtpc09wZW4gPyB0KCdjb252ZXJzYXRpb25zLmNvbGxhcHNlJykgOiB0KCdoaXN0b3J5LnRvb2x0aXAnKX0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICA8U0NTV3JhcHBlckNvbGxhcHNlZEJ1dHRvbiBvbkNsaWNrPXtoYW5kbGVUb2dnbGVTaWRlYmFyfSBpc09wZW49e2lzT3Blbn0+XG4gICAgICAgICAgICB7aXNPcGVuID8gKFxuICAgICAgICAgICAgICA8Q2hldnJvbkRvdWJsZUxlZnQgY29sb3I9XCJyZ2JhKDEwMiwgMTAyLCAxMDIsIDEpXCIgd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSAvPlxuICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgPFNDU1NpZGViYXJVbnJlYWRBbmNob3I+XG4gICAgICAgICAgICAgICAgPEhpc3RvcnkgY29sb3I9XCJyZ2JhKDEzLCAxMywgMTMsIDEpXCIgd2lkdGg9ezIwfSBoZWlnaHQ9ezIwfSAvPlxuICAgICAgICAgICAgICAgIHt1bnJlYWRDb3VudCA+IDAgPyAoXG4gICAgICAgICAgICAgICAgICA8U0NTU2lkZWJhclVucmVhZENvdW50ICRmbG9hdGluZyBhcmlhLWxhYmVsPXt0KCdjb252ZXJzYXRpb25zLnVucmVhZExhYmVsJyl9PlxuICAgICAgICAgICAgICAgICAgICB7Zm9ybWF0VW5yZWFkQ291bnQodW5yZWFkQ291bnQpfVxuICAgICAgICAgICAgICAgICAgPC9TQ1NTaWRlYmFyVW5yZWFkQ291bnQ+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvU0NTU2lkZWJhclVucmVhZEFuY2hvcj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9TQ1NXcmFwcGVyQ29sbGFwc2VkQnV0dG9uPlxuICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIHtzaG93TmV3Q2hhdEJ1dHRvbiA/IChcbiAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnY29udmVyc2F0aW9ucy5uZXdDaGF0Jyl9IHpJbmRleD17dG9vbHRpcFpJbmRleH0+XG4gICAgICAgICAgICA8U0NTV3JhcHBlck5ld0NoYXRJY29uIG9uQ2xpY2s9e2hhbmRsZU5ld0NoYXR9PlxuICAgICAgICAgICAgICA8TmV3Q2hhdCB3aWR0aD17MTZ9IGhlaWdodD17MTZ9IC8+XG4gICAgICAgICAgICA8L1NDU1dyYXBwZXJOZXdDaGF0SWNvbj5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICkgOiBudWxsfVxuICAgICAgICB7IWlzT3BlbiAmJiBzaG93QWdlbnRzTmF2QmxvY2sgPyAoXG4gICAgICAgICAgPD5cbiAgICAgICAgICAgIDxTQ1NTaWRlYmFyQ29sbGFwc2VkRGl2aWRlciAvPlxuICAgICAgICAgICAge3Nob3dNYXJrZXRwbGFjZVNpZGViYXJCdXR0b24gPyAoXG4gICAgICAgICAgICAgIDxUb29sdGlwIHRpdGxlPXt0KCdjb252ZXJzYXRpb25zLm1haWFrZXJOYXYnKX0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICAgICAgICA8U0NTV3JhcHBlckFnZW50c05hdkljb25cbiAgICAgICAgICAgICAgICAgICRhY3RpdmU9e2FnZW50c05hdkFjdGl2ZSA9PT0gJ21haWFrZXInfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlDaGF0TXBPcGVuKVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVPcGVuQ3JlYXRlQWdlbnQoKVxuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8TWFpYVN0b3JlSWNvbiBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgICA8L1NDU1dyYXBwZXJBZ2VudHNOYXZJY29uPlxuICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIHtjYW5WaWV3QWdlbnRzID8gKFxuICAgICAgICAgICAgICA8VG9vbHRpcCB0aXRsZT17dCgnY29udmVyc2F0aW9ucy5teUFnZW50c05hdicpfSB6SW5kZXg9e3Rvb2x0aXBaSW5kZXh9PlxuICAgICAgICAgICAgICAgIDxTQ1NXcmFwcGVyQWdlbnRzTmF2SWNvblxuICAgICAgICAgICAgICAgICAgJGFjdGl2ZT17YWdlbnRzTmF2QWN0aXZlID09PSAnbXlBZ2VudHMnfVxuICAgICAgICAgICAgICAgICAgZGF0YS1hcHBjdWVzPXtBUFBDVUVTX1NFTEVDVE9SUy5tYWlhU2lkZWJhck15QWdlbnRzfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudEFtcGxpdHVkZShFVkVOVFMuYWlTaWRlYmFyTXlBZ2VudHMpXG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZSgpXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxNeUFnZW50c05hdkljb24gc2l6ZT17MTZ9IC8+XG4gICAgICAgICAgICAgICAgPC9TQ1NXcmFwcGVyQWdlbnRzTmF2SWNvbj5cbiAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICB7Y2FuVmlld1NraWxscyA/IChcbiAgICAgICAgICAgICAgPFRvb2x0aXAgdGl0bGU9e3QoJ2NvbnZlcnNhdGlvbnMubXlTa2lsbHNOYXYnKX0gekluZGV4PXt0b29sdGlwWkluZGV4fT5cbiAgICAgICAgICAgICAgICA8U0NTV3JhcHBlckFnZW50c05hdkljb24gJGFjdGl2ZT17YWdlbnRzTmF2QWN0aXZlID09PSAnbXlTa2lsbHMnfSBvbkNsaWNrPXtoYW5kbGVPcGVuU2tpbGxzfT5cbiAgICAgICAgICAgICAgICAgIDxTa2lsbHNOYXZJY29uIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICAgIDwvU0NTV3JhcHBlckFnZW50c05hdkljb24+XG4gICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgIDwvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvU0NTU2lkZWJhclRvb2xiYXI+XG4gICAgICA8U0NTU2lkZWJhckJvZHkgJGlzT3Blbj17aXNPcGVufT5cbiAgICAgICAge2lzT3BlbiA/IChcbiAgICAgICAgICA8U0NTU2lkZWJhck9wZW5QYW5lbD5cbiAgICAgICAgICAgIDxTQ1NTaWRlYmFyQWdlbnRzQmxvY2s+XG4gICAgICAgICAgICAgIHtzaG93QWdlbnRzTmF2QmxvY2sgPyAoXG4gICAgICAgICAgICAgICAgPFNDU1NpZGViYXJBZ2VudHNBY3Rpb25zPlxuICAgICAgICAgICAgICAgICAge3Nob3dNYXJrZXRwbGFjZVNpZGViYXJCdXR0b24gPyAoXG4gICAgICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyTWFpYWtlck5hdkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haUNoYXRNcE9wZW4pXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPcGVuQ3JlYXRlQWdlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgJGFjdGl2ZT17YWdlbnRzTmF2QWN0aXZlID09PSAnbWFpYWtlcid9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8TWFpYVN0b3JlSWNvbiBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NTU2lkZWJhck1haWFrZXJOYXZMYWJlbD57dCgnY29udmVyc2F0aW9ucy5tYWlha2VyTmF2Jyl9PC9TQ1NTaWRlYmFyTWFpYWtlck5hdkxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L1NDU1NpZGViYXJNYWlha2VyTmF2QnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7Y2FuVmlld0FnZW50cyA/IChcbiAgICAgICAgICAgICAgICAgICAgPFNDU1NpZGViYXJNYWlha2VyTmF2QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0YS1hcHBjdWVzPXtBUFBDVUVTX1NFTEVDVE9SUy5tYWlhU2lkZWJhck15QWdlbnRzfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50QW1wbGl0dWRlKEVWRU5UUy5haVNpZGViYXJNeUFnZW50cylcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU9wZW5NYXJrZXRwbGFjZSgpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAkYWN0aXZlPXthZ2VudHNOYXZBY3RpdmUgPT09ICdteUFnZW50cyd9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8TXlBZ2VudHNOYXZJY29uIHNpemU9ezE2fSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyTWFpYWtlck5hdkxhYmVsPnt0KCdjb252ZXJzYXRpb25zLm15QWdlbnRzTmF2Jyl9PC9TQ1NTaWRlYmFyTWFpYWtlck5hdkxhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8L1NDU1NpZGViYXJNYWlha2VyTmF2QnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgICAgICB7Y2FuVmlld1NraWxscyA/IChcbiAgICAgICAgICAgICAgICAgICAgPFNDU1NpZGViYXJNYWlha2VyTmF2QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlT3BlblNraWxsc31cbiAgICAgICAgICAgICAgICAgICAgICAkYWN0aXZlPXthZ2VudHNOYXZBY3RpdmUgPT09ICdteVNraWxscyd9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8U2tpbGxzTmF2SWNvbiBzaXplPXsxNn0gLz5cbiAgICAgICAgICAgICAgICAgICAgICA8U0NTU2lkZWJhck1haWFrZXJOYXZMYWJlbD57dCgnY29udmVyc2F0aW9ucy5teVNraWxsc05hdicpfTwvU0NTU2lkZWJhck1haWFrZXJOYXZMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC9TQ1NTaWRlYmFyTWFpYWtlck5hdkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckFnZW50c0FjdGlvbnM+XG4gICAgICAgICAgICAgICkgOiBudWxsfVxuICAgICAgICAgICAgICA8U0NTU2lkZWJhckNvbnZlcnNhdGlvbnNIZWFkaW5nUm93PlxuICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyQ29udmVyc2F0aW9uc0hlYWRpbmc+e3QoJ2NvbnZlcnNhdGlvbnMudGl0bGUnKX08L1NDU1NpZGViYXJDb252ZXJzYXRpb25zSGVhZGluZz5cbiAgICAgICAgICAgICAgICB7dW5yZWFkQ291bnQgPiAwID8gKFxuICAgICAgICAgICAgICAgICAgPFNDU1NpZGViYXJVbnJlYWRDb3VudCBhcmlhLWxhYmVsPXt0KCdjb252ZXJzYXRpb25zLnVucmVhZExhYmVsJyl9PlxuICAgICAgICAgICAgICAgICAgICB7Zm9ybWF0VW5yZWFkQ291bnQodW5yZWFkQ291bnQpfVxuICAgICAgICAgICAgICAgICAgPC9TQ1NTaWRlYmFyVW5yZWFkQ291bnQ+XG4gICAgICAgICAgICAgICAgKSA6IG51bGx9XG4gICAgICAgICAgICAgIDwvU0NTU2lkZWJhckNvbnZlcnNhdGlvbnNIZWFkaW5nUm93PlxuICAgICAgICAgICAgPC9TQ1NTaWRlYmFyQWdlbnRzQmxvY2s+XG4gICAgICAgICAgICA8U0NTU2lkZWJhckNoYXRzU2Nyb2xsXG4gICAgICAgICAgICAgIHJlZj17Y2hhdHNDb250YWluZXJSZWZ9XG4gICAgICAgICAgICAgICRoYXNDaGF0cz17Y2hhdHMubGVuZ3RoID4gMH1cbiAgICAgICAgICAgICAgJG9mZnNldFZhcmlhbnQ9e2hhc0Vycm9yID8gJ2Vycm9yJyA6ICdkZWZhdWx0J31cbiAgICAgICAgICAgICAgJGFnZW50TmF2QnV0dG9uQ291bnQ9e2FnZW50TmF2QnV0dG9uQ291bnR9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtoYXNFcnJvciAmJiAhY2hhdHMubGVuZ3RoID8gKFxuICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyRXJyb3JTdGF0ZUNvbHVtbj5cbiAgICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyRXJyb3JTdGF0ZVRvcD5cbiAgICAgICAgICAgICAgICAgICAgPEVycm9yU3RhdGUgLz5cbiAgICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckVycm9yU3RhdGVUb3A+XG4gICAgICAgICAgICAgICAgICA8U0NTU2lkZWJhckVycm9yQmFubmVyPlxuICAgICAgICAgICAgICAgICAgICA8U0NTU2lkZWJhckVycm9yQmFubmVySWNvbldyYXA+XG4gICAgICAgICAgICAgICAgICAgICAgPEVycm9ySWNvbiAvPlxuICAgICAgICAgICAgICAgICAgICA8L1NDU1NpZGViYXJFcnJvckJhbm5lckljb25XcmFwPlxuICAgICAgICAgICAgICAgICAgICA8U0NTU2lkZWJhckVycm9yQmFubmVyTWVzc2FnZT57dCgnY29udmVyc2F0aW9ucy5lcnJvcicpfTwvU0NTU2lkZWJhckVycm9yQmFubmVyTWVzc2FnZT5cbiAgICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckVycm9yQmFubmVyPlxuICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckVycm9yU3RhdGVDb2x1bW4+XG4gICAgICAgICAgICAgICkgOiBsb2FkaW5nQ2hhdHMgPyAoXG4gICAgICAgICAgICAgICAgPFNDU1NpZGViYXJMb2FkaW5nQXJlYT5cbiAgICAgICAgICAgICAgICAgIDxTaWRlYmFyQ2hhdHNTa2VsZXRvbiAvPlxuICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckxvYWRpbmdBcmVhPlxuICAgICAgICAgICAgICApIDogY2hhdHMubGVuZ3RoID8gKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICB7Y2hhdHMubWFwKChjaGF0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxMaXN0SGlzdG9yeUNoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2hhdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXQ9e2NoYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXtjaGF0RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc09wZW5Nb2RhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElzT3Blbk1vZGFsKG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRDaGF0KGNoYXREYXRhLnNlc3Npb25FeHRlcm5hbElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkdvVG9DaGF0KGNoYXREYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTW9kYWxPcGVuPXtpc09wZW5Nb2RhbCA9PT0gY2hhdC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uT3Blbk1vZGFsPXtoYW5kbGVPcGVuTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsb3NlTW9kYWw9e2hhbmRsZUNsb3NlTW9kYWx9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVycz17e1xuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVEZWxldGVDaGF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVVcGRhdGVDaGF0LFxuICAgICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWQ9e3NlbGVjdGVkQ2hhdCA9PT0gY2hhdC5zZXNzaW9uRXh0ZXJuYWxJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXBaSW5kZXg9e3Rvb2x0aXBaSW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICB7aXNMb2FkaW5nTW9yZUNoYXRzICYmIChcbiAgICAgICAgICAgICAgICAgICAgPFNDU1NpZGViYXJMb2FkTW9yZVJvdz5cbiAgICAgICAgICAgICAgICAgICAgICA8U2lkZWJhckNoYXRzU2tlbGV0b24gY291bnQ9ezJ9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckxvYWRNb3JlUm93PlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8U0NTU2lkZWJhckVtcHR5Q2hhdHM+XG4gICAgICAgICAgICAgICAgICA8RW1wdHlIaXN0b3J5SWNvbiAvPlxuICAgICAgICAgICAgICAgICAgPFNDU1NpZGViYXJFbXB0eUNoYXRzVGV4dD57dCgnY29udmVyc2F0aW9ucy5lbXB0eScpfTwvU0NTU2lkZWJhckVtcHR5Q2hhdHNUZXh0PlxuICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckVtcHR5Q2hhdHM+XG4gICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1NDU1NpZGViYXJDaGF0c1Njcm9sbD5cbiAgICAgICAgICAgIDxTQ1NTaWRlYmFyQ2hhdHNGb290ZXI+XG4gICAgICAgICAgICAgIHtoYXNFcnJvciAmJiBjaGF0cy5sZW5ndGggPyAoXG4gICAgICAgICAgICAgICAgPFNDU1NpZGViYXJFcnJvckJhbm5lcj5cbiAgICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyRXJyb3JCYW5uZXJJY29uV3JhcD5cbiAgICAgICAgICAgICAgICAgICAgPEVycm9ySWNvbiAvPlxuICAgICAgICAgICAgICAgICAgPC9TQ1NTaWRlYmFyRXJyb3JCYW5uZXJJY29uV3JhcD5cbiAgICAgICAgICAgICAgICAgIDxTQ1NTaWRlYmFyRXJyb3JCYW5uZXJNZXNzYWdlPnt0KCdjb252ZXJzYXRpb25zLmVycm9yJyl9PC9TQ1NTaWRlYmFyRXJyb3JCYW5uZXJNZXNzYWdlPlxuICAgICAgICAgICAgICAgIDwvU0NTU2lkZWJhckVycm9yQmFubmVyPlxuICAgICAgICAgICAgICApIDogbnVsbH1cbiAgICAgICAgICAgIDwvU0NTU2lkZWJhckNoYXRzRm9vdGVyPlxuICAgICAgICAgIDwvU0NTU2lkZWJhck9wZW5QYW5lbD5cbiAgICAgICAgKSA6IG51bGx9XG4gICAgICAgIDxTQ1NTaWRlYmFyRm9vdGVyQWN0aW9ucyAkaXNPcGVuPXtpc09wZW59ICRqdXN0aWZ5QmV0d2Vlbj17ISFzZWxlY3RlZEFnZW50fT5cbiAgICAgICAgICB7c2VsZWN0ZWRBZ2VudCA/IDxGZWVkYmFja0J1dHRvbiBzZWxlY3RlZEFnZW50PXtzZWxlY3RlZEFnZW50fSBpc09wZW49e2lzT3Blbn0gLz4gOiBudWxsfVxuICAgICAgICA8L1NDU1NpZGViYXJGb290ZXJBY3Rpb25zPlxuICAgICAgPC9TQ1NTaWRlYmFyQm9k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V0FBVyxFQUFFbU0sZUFBZ0I7Z0JBQzdCbE0sWUFBWSxFQUFFbU0sZ0JBQWlCO2dCQUMvQmxNLFFBQVEsRUFBRTtrQkFDUnlDLGdCQUFnQixFQUFoQkEsZ0JBQWdCO2tCQUNoQkQsZ0JBQWdCLEVBQWhCQTtnQkFDRixDQUFFO2dCQUNGdkMsVUFBVSxFQUFFMEcsWUFBWSxLQUFLaEgsSUFBSSxDQUFDK0IsaUJBQWtCO2dCQUNwRHZCLGFBQWEsRUFBRUE7Y0FBYyxHQWxCeEJSLElBQUksQ0FBQ21FLEVBbUJYLENBQUM7WUFFTixDQUFDLENBQUMsRUFDRG1FLGtCQUFrQixpQkFDakJySixJQUFBLENBQUNQLHFCQUFxQjtjQUFBcUUsUUFBQSxlQUNwQjlELElBQUEsQ0FBQ25FLG9CQUFvQjtnQkFBQzBVLEtBQUssRUFBRTtjQUFFLENBQUU7WUFBQyxDQUNiLENBQ3hCO1VBQUEsQ0FDRCxDQUFDLGdCQUVIclEsS0FBQSxDQUFDUixvQkFBb0I7WUFBQW9FLFFBQUEsZ0JBQ25COUQsSUFBQSxDQUFDdEUsZ0JBQWdCLElBQUUsQ0FBQyxlQUNwQnNFLElBQUEsQ0FBQ0wsd0JBQXdCO2NBQUFtRSxRQUFBLEVBQUV2QixDQUFDLENBQUMscUJBQXFCO1lBQUMsQ0FBMkIsQ0FBQztVQUFBLENBQzNEO1FBQ3ZCLENBQ29CLENBQUMsZUFDeEJ2QyxJQUFBLENBQUNKLHFCQUFxQjtVQUFBa0UsUUFBQSxFQUNuQitDLFFBQVEsSUFBSWdDLEtBQUssQ0FBQ3VILE1BQU0sZ0JBQ3ZCbFEsS0FBQSxDQUFDYixxQkFBcUI7WUFBQXlFLFFBQUEsZ0JBQ3BCOUQsSUFBQSxDQUFDViw2QkFBNkI7Y0FBQXdFLFFBQUEsZUFDNUI5RCxJQUFBLENBQUN0RCxTQUFTLElBQUU7WUFBQyxDQUNnQixDQUFDLGVBQ2hDc0QsSUFBQSxDQUFDVCw0QkFBNEI7Y0FBQXVFLFFBQUEsRUFBRXZCLENBQUMsQ0FBQyxxQkFBcUI7WUFBQyxDQUErQixDQUFDO1VBQUEsQ0FDbEUsQ0FBQyxHQUN0QjtRQUFJLENBQ2EsQ0FBQztNQUFBLENBQ0wsQ0FBQyxHQUNwQixJQUFJLGVBQ1J2QyxJQUFBLENBQUNILHVCQUF1QjtRQUFDK1AsT0FBTyxFQUFFckksTUFBTztRQUFDaUosZUFBZSxFQUFFLENBQUMsQ0FBQ2xJLGFBQWM7UUFBQXhFLFFBQUEsRUFDeEV3RSxhQUFhLGdCQUFHdEksSUFBQSxDQUFDcEQsY0FBYztVQUFDMEwsYUFBYSxFQUFFQSxhQUFjO1VBQUNmLE1BQU0sRUFBRUE7UUFBTyxDQUFFLENBQUMsR0FBRztNQUFJLENBQ2pFLENBQUM7SUFBQSxDQUNaLENBQUM7RUFBQSxDQUNILENBQUM7QUFFckIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==