@projectcor/maia-components 2.48.1-0 → 2.49.0-beta.1

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 (446) hide show
  1. package/README.md +2 -0
  2. package/lib/App.js +19 -44
  3. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +51 -5
  4. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +76 -18
  5. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +31 -3
  6. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +4 -2
  7. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.js +53 -0
  8. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.styles.js +8 -0
  9. package/lib/components/atoms/ContextCompactedNotice/index.js +2 -0
  10. package/lib/components/atoms/ContextMentionChip/buildChipElement.js +255 -15
  11. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +34 -5
  12. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
  13. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
  14. package/lib/components/atoms/MAIAInput/MAIAInput.js +12 -8
  15. package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +60 -8
  16. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.js +15 -3
  17. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
  18. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
  19. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +13 -27
  20. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +52 -79
  21. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
  22. package/lib/components/atoms/ReasoningBlock/reasoningLeading.js +1 -6
  23. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -36
  24. package/lib/components/index.js +1 -2
  25. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +29 -6
  26. package/lib/components/molecules/AbmSection/AbmGeneralSection.js +40 -6
  27. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +90 -18
  28. package/lib/components/molecules/AbmSection/AbmLoaderFiles.js +15 -5
  29. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
  30. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +73 -92
  31. package/lib/components/molecules/ChatAIHome/styles.js +78 -85
  32. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +78 -51
  33. package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
  34. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +4 -147
  35. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +108 -64
  36. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  37. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.js +2 -3
  38. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
  39. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
  40. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +86 -76
  41. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
  42. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +44 -9
  43. package/lib/components/molecules/Sidebar/Sidebar.js +23 -41
  44. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +171 -56
  45. package/lib/constants/formatExtensions.js +8 -7
  46. package/lib/constants/permissions/index.js +2 -2
  47. package/lib/constants/permissions/utils.js +1 -4
  48. package/lib/dev/DevReasoningTimeline.js +86 -75
  49. package/lib/dev/Providers.js +3 -5
  50. package/lib/hooks/useChatManager/useChatManager.js +372 -82
  51. package/lib/hooks/useChatMessages/useChatMessages.js +82 -12
  52. package/lib/hooks/useClientSearch.js +32 -4
  53. package/lib/hooks/useContextMentions.js +163 -2
  54. package/lib/hooks/useContextPinPopover.js +75 -16
  55. package/lib/hooks/useEntitySearch.js +391 -38
  56. package/lib/hooks/useFrequentlyUsedActions.js +22 -60
  57. package/lib/hooks/useMentionPopover.js +35 -9
  58. package/lib/hooks/useMinimizedPillBottomOffset.js +45 -15
  59. package/lib/hooks/useProjectSearch.js +58 -4
  60. package/lib/hooks/useProjectSummaryConfig.js +52 -14
  61. package/lib/hooks/useReasoningTrace/reasoningStore.js +39 -8
  62. package/lib/hooks/useRecentClientsSearch.js +32 -4
  63. package/lib/index.js +2 -5
  64. package/lib/lang/br/index.js +7 -26
  65. package/lib/lang/en/index.js +7 -26
  66. package/lib/lang/es/index.js +7 -26
  67. package/lib/lang/fr/index.js +7 -26
  68. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  69. package/lib/services/maia/Agents/getAgents.js +242 -78
  70. package/lib/services/maia/Orchestrator/orchestrator.js +121 -38
  71. package/lib/services/utils/mapChatMessages.js +12 -7
  72. package/lib/store/sessions/sessionNotifications.js +41 -35
  73. package/lib/store/sessions/sessionStreamManager.js +98 -94
  74. package/lib/styles/cascade.js +3 -29
  75. package/lib/styles/transitions.js +1 -3
  76. package/lib/types/Chat.js +1 -1
  77. package/lib/types/agentModal.js +1 -1
  78. package/lib/types/contextCompaction.js +48 -0
  79. package/lib/types/global.d.js +1 -1
  80. package/lib/types/jest-dom.d.js +2 -0
  81. package/lib/types/reasoning.js +1 -1
  82. package/lib/utils/hoursPlannerQuickActionType.js +1 -74
  83. package/lib/utils/imagePreprocessor.js +37 -12
  84. package/lib/utils/streamActivityMessages.js +19 -32
  85. package/package.json +2 -2
  86. package/lib/components/atoms/ActionableButton.spec.js +0 -111
  87. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
  88. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
  89. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
  90. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
  91. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +0 -65
  92. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -66
  93. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -211
  94. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
  95. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +0 -55
  96. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -41
  97. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -253
  98. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
  99. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +0 -31
  100. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -33
  101. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -25
  102. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.js +0 -4
  103. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
  104. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
  105. package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
  106. package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
  107. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
  108. package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
  109. package/lib/components/atoms/Chip/Chip.spec.js +0 -82
  110. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
  111. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -88
  112. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
  113. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
  114. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.js +0 -227
  115. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -77
  116. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
  117. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +0 -31
  118. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -48
  119. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -231
  120. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
  121. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
  122. package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
  123. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
  124. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
  125. package/lib/components/atoms/Expand/Expand.spec.js +0 -57
  126. package/lib/components/atoms/Fade/Fade.spec.js +0 -31
  127. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
  128. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
  129. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
  130. package/lib/components/atoms/HelpButton.spec.js +0 -87
  131. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
  132. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
  133. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
  134. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
  135. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
  136. package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
  137. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
  138. package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
  139. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +0 -12
  140. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -26
  141. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -444
  142. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +0 -50
  143. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -20
  144. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -53
  145. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -22
  146. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
  147. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
  148. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
  149. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
  150. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
  151. package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
  152. package/lib/components/atoms/NextPageLoader.spec.js +0 -37
  153. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
  154. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.js +0 -17
  155. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
  156. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
  157. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -86
  158. package/lib/components/atoms/PrimaryButton.spec.js +0 -42
  159. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
  160. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
  161. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
  162. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
  163. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
  164. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
  165. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
  166. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
  167. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.js +0 -10
  168. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
  169. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
  170. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
  171. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
  172. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
  173. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
  174. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
  175. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
  176. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
  177. package/lib/components/atoms/Switch/Switch.spec.js +0 -41
  178. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
  179. package/lib/components/atoms/TextArea/TextArea.spec.js +0 -68
  180. package/lib/components/atoms/ThirdButton.spec.js +0 -29
  181. package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
  182. package/lib/components/atoms/WithAppCfg.spec.js +0 -60
  183. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.js +0 -37
  184. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
  185. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -495
  186. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +0 -39
  187. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -57
  188. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -227
  189. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +0 -86
  190. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -108
  191. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -254
  192. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.js +0 -17
  193. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
  194. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
  195. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
  196. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
  197. package/lib/components/molecules/AgentInputBlock/index.js +0 -5
  198. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
  199. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
  200. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
  201. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
  202. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
  203. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
  204. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
  205. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
  206. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
  207. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
  208. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
  209. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +0 -54
  210. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -77
  211. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -445
  212. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
  213. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -471
  214. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -659
  215. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.js +0 -5
  216. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
  217. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
  218. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
  219. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +0 -30
  220. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -95
  221. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
  222. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
  223. package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
  224. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
  225. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
  226. package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
  227. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -172
  228. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
  229. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
  230. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
  231. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
  232. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.js +0 -48
  233. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -82
  234. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
  235. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
  236. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
  237. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
  238. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
  239. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
  240. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
  241. package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -453
  242. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +0 -199
  243. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -391
  244. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1204
  245. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
  246. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
  247. package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
  248. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -526
  249. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
  250. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  251. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
  252. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
  253. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
  254. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -275
  255. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -275
  256. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -195
  257. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
  258. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
  259. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
  260. package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
  261. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
  262. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  263. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
  264. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
  265. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
  266. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
  267. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
  268. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
  269. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
  270. package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
  271. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
  272. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
  273. package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
  274. package/lib/constants/maiaFeatureAccess.spec.js +0 -30
  275. package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
  276. package/lib/constants/maiaTaskPanelAccess.spec.js +0 -30
  277. package/lib/constants/permissions/clientRoleAccess.spec.js +0 -31
  278. package/lib/constants/permissions/utils.spec.js +0 -128
  279. package/lib/dev/DevMaiaPage.js +0 -30
  280. package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
  281. package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
  282. package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
  283. package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
  284. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -231
  285. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
  286. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -313
  287. package/lib/hooks/useAgentSuggestions.spec.js +0 -89
  288. package/lib/hooks/useCaretPosition.spec.js +0 -58
  289. package/lib/hooks/useChatManager/useChatManager.helpers.js +0 -353
  290. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -506
  291. package/lib/hooks/useChatManager/useChatManager.spec.js +0 -1261
  292. package/lib/hooks/useChatMessages/useChatMessages.helpers.js +0 -109
  293. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -176
  294. package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -379
  295. package/lib/hooks/useChats/useChats.spec.js +0 -208
  296. package/lib/hooks/useClientSearch.helpers.js +0 -36
  297. package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
  298. package/lib/hooks/useClientSearch.spec.js +0 -86
  299. package/lib/hooks/useContextMentions.helpers.js +0 -152
  300. package/lib/hooks/useContextMentions.helpers.spec.js +0 -143
  301. package/lib/hooks/useContextMentions.spec.js +0 -239
  302. package/lib/hooks/useContextMentions.types.js +0 -2
  303. package/lib/hooks/useContextPinPopover.helpers.js +0 -95
  304. package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -115
  305. package/lib/hooks/useContextPinPopover.spec.js +0 -159
  306. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
  307. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
  308. package/lib/hooks/useDebounce.spec.js +0 -42
  309. package/lib/hooks/useEntitySearch.helpers.js +0 -359
  310. package/lib/hooks/useEntitySearch.helpers.spec.js +0 -321
  311. package/lib/hooks/useEntitySearch.spec.js +0 -443
  312. package/lib/hooks/useEvent.spec.js +0 -45
  313. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
  314. package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
  315. package/lib/hooks/useIsMaiaPageRoute.js +0 -26
  316. package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
  317. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
  318. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
  319. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
  320. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
  321. package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
  322. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
  323. package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
  324. package/lib/hooks/useMentionPopover.helpers.js +0 -41
  325. package/lib/hooks/useMentionPopover.helpers.spec.js +0 -71
  326. package/lib/hooks/useMentionPopover.spec.js +0 -215
  327. package/lib/hooks/useMinimizedPillBottomOffset.helpers.js +0 -47
  328. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -132
  329. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
  330. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
  331. package/lib/hooks/useModal/useModal.spec.js +0 -73
  332. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -192
  333. package/lib/hooks/useProjectSearch.helpers.js +0 -61
  334. package/lib/hooks/useProjectSearch.helpers.spec.js +0 -70
  335. package/lib/hooks/useProjectSearch.spec.js +0 -91
  336. package/lib/hooks/useProjectSummary.spec.js +0 -193
  337. package/lib/hooks/useProjectSummaryConfig.helpers.js +0 -62
  338. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -92
  339. package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
  340. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
  341. package/lib/hooks/useRecentClientsSearch.helpers.js +0 -33
  342. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
  343. package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
  344. package/lib/hooks/useRecentContexts.spec.js +0 -139
  345. package/lib/hooks/useResize.spec.js +0 -37
  346. package/lib/hooks/useSkillsCatalog.spec.js +0 -88
  347. package/lib/hooks/useSlashCommands.spec.js +0 -139
  348. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
  349. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
  350. package/lib/hooks/useStreamResponse.spec.js +0 -199
  351. package/lib/hooks/useT.spec.js +0 -20
  352. package/lib/hooks/useToggle.spec.js +0 -33
  353. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
  354. package/lib/services/maia/Access/updateAccess.spec.js +0 -137
  355. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
  356. package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
  357. package/lib/services/maia/Agents/connectors.spec.js +0 -359
  358. package/lib/services/maia/Agents/createAgent.spec.js +0 -55
  359. package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
  360. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
  361. package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
  362. package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
  363. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
  364. package/lib/services/maia/Agents/getAgents.helpers.js +0 -181
  365. package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -211
  366. package/lib/services/maia/Agents/getAgents.spec.js +0 -697
  367. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
  368. package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
  369. package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
  370. package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
  371. package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
  372. package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
  373. package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
  374. package/lib/services/maia/Chats/patchChat.spec.js +0 -41
  375. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
  376. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
  377. package/lib/services/maia/Knowledge/delete.spec.js +0 -45
  378. package/lib/services/maia/Knowledge/download.spec.js +0 -78
  379. package/lib/services/maia/Knowledge/save.spec.js +0 -58
  380. package/lib/services/maia/Orchestrator/orchestrator.helpers.js +0 -130
  381. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -153
  382. package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
  383. package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
  384. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
  385. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
  386. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
  387. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
  388. package/lib/services/maia/Skills/createSkill.spec.js +0 -68
  389. package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
  390. package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
  391. package/lib/services/maia/Skills/getSkills.spec.js +0 -152
  392. package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
  393. package/lib/services/maia/client.spec.js +0 -56
  394. package/lib/services/utils/fetchCOR.spec.js +0 -211
  395. package/lib/services/utils/getCookie.spec.js +0 -20
  396. package/lib/services/utils/mapChatMessages.spec.js +0 -254
  397. package/lib/store/chatsSidebarOptimistic.spec.js +0 -112
  398. package/lib/store/maiaLastChatPersistence.spec.js +0 -22
  399. package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
  400. package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
  401. package/lib/store/sessions/sessionNotifications.helpers.js +0 -45
  402. package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
  403. package/lib/store/sessions/sessionNotifications.spec.js +0 -106
  404. package/lib/store/sessions/sessionStreamManager.spec.js +0 -503
  405. package/lib/store/sessions/sessions.types.spec.js +0 -16
  406. package/lib/store/sessions/useSessionsStore.spec.js +0 -135
  407. package/lib/store/useChatsStore.spec.js +0 -619
  408. package/lib/store/useFaqsStore.spec.js +0 -57
  409. package/lib/test/mockSseStream.js +0 -121
  410. package/lib/test/streamdownCodeMock.js +0 -6
  411. package/lib/test/streamdownMock.js +0 -12
  412. package/lib/utils/actionCategoryMap.spec.js +0 -18
  413. package/lib/utils/agentDisplayName.spec.js +0 -44
  414. package/lib/utils/autoApproveStorage.spec.js +0 -25
  415. package/lib/utils/chatInputFiles.spec.js +0 -39
  416. package/lib/utils/contextMentionIcons.spec.js +0 -41
  417. package/lib/utils/contextMentionLabel.spec.js +0 -13
  418. package/lib/utils/contextMentionTriggers.spec.js +0 -38
  419. package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
  420. package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
  421. package/lib/utils/entityLinkRender.spec.js +0 -72
  422. package/lib/utils/fileDownloadHelper.spec.js +0 -67
  423. package/lib/utils/formatQuickActionMessage.spec.js +0 -27
  424. package/lib/utils/formatUnreadCount.spec.js +0 -12
  425. package/lib/utils/getUnitFileSize.spec.js +0 -18
  426. package/lib/utils/hitlAnalytics.spec.js +0 -100
  427. package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
  428. package/lib/utils/imagePreprocessor.helpers.js +0 -28
  429. package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
  430. package/lib/utils/imagePreprocessor.spec.js +0 -112
  431. package/lib/utils/maiaPageRoute.js +0 -24
  432. package/lib/utils/maiaPageRoute.spec.js +0 -23
  433. package/lib/utils/mapBackendLang.spec.js +0 -19
  434. package/lib/utils/navigateContextEntity.spec.js +0 -50
  435. package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
  436. package/lib/utils/orchestratorSubagents.spec.js +0 -32
  437. package/lib/utils/reasoningMappers.spec.js +0 -103
  438. package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
  439. package/lib/utils/renderContextMentions.spec.js +0 -158
  440. package/lib/utils/retryCompletion.spec.js +0 -99
  441. package/lib/utils/skillContentSize.spec.js +0 -13
  442. package/lib/utils/slashCommandMarker.spec.js +0 -43
  443. package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
  444. package/lib/utils/sseStreamContent.spec.js +0 -31
  445. package/lib/utils/streamActivityMessages.spec.js +0 -253
  446. package/lib/utils/validateTrimmedFields.spec.js +0 -26
@@ -1,526 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
- 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; }
4
- 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; }
5
- /* eslint-disable no-nested-ternary */
6
- /* eslint-disable react/function-component-definition */
7
- /* eslint-disable no-use-before-define */
8
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
- import moment from 'moment';
10
- import { useTranslation } from 'react-i18next';
11
- import { useUser } from '../../../context/cor-user';
12
- import { MAIAError } from '../../atoms/MAIAError';
13
- import { ChatAIContent } from '../../molecules/ChatAIContent';
14
- import { buildHandlers, options } from '../../molecules/ChatAIModal/constants';
15
- import { Sidebar } from '../../molecules/Sidebar';
16
- import { useGetAgents } from '../../../services/maia/Agents/getAgents';
17
- import { GlobalContext, useGlobalContext } from '../../../context/global-context';
18
- import { Snackbar } from '../SnackBar/Snackbar';
19
- import { ProjectSummaryContent } from '../../molecules/ProjectSummaryContent';
20
- import { AbmAgentModal } from '../AbmAgentModal/AbmAgentModal';
21
- import { ChatAiModalFooter } from '../../molecules/ChatAIModal/components/ChatAiModalFooter';
22
- import { ChatAIPageHeader } from './ChatAIPageHeader';
23
- import { ChatAIPageHome } from './ChatAIPageHome';
24
- import { SECTIONS } from '../../../constants/config';
25
- import { useStreamdownStyles } from '../../../hooks/useStreamdownStyles';
26
- import { useProjectSummaryConfig } from '../../../hooks/useProjectSummaryConfig';
27
- import { acquireChatsStore, releaseChatsStore } from '../../../store';
28
- import { withAppCfg } from '../../atoms/WithAppCfg';
29
- import { Features } from '../../atoms/WithFeatureValidation';
30
- import { setMaiaPagePresence } from '../../../utils/maiaPageRoute';
31
- import { SCPageMain, SCPageWrapper } from './ChatAIPage.styles';
32
- import { useMaiaChatSessionMeta } from '../../../hooks/useMaiaChatSessionMeta';
33
- import { resolveLegacyContextSession } from '../../molecules/AgentInputBlock/resolveLegacyContextSession';
34
- import { useContinueLegacyContextInNewChat } from '../../../hooks/useContinueLegacyContextInNewChat';
35
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
36
- var validateAccessByFeature = function validateAccessByFeature(section) {
37
- if (section === 'header' && (window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS || window.MAIA_CHAT_AI_FEATURE_ACCESS)) {
38
- return true;
39
- }
40
- if ((section === 'project' || section === 'client') && window.MAIA_CHAT_AI_FEATURE_ACCESS) {
41
- return true;
42
- }
43
- return false;
44
- };
45
- export var ChatAIPage = withAppCfg(function (_ref) {
46
- var _ref$entity = _ref.entity,
47
- entity = _ref$entity === void 0 ? {
48
- projectId: null,
49
- clientId: null
50
- } : _ref$entity,
51
- _ref$project = _ref.project,
52
- initialProject = _ref$project === void 0 ? null : _ref$project,
53
- _ref$client = _ref.client,
54
- initialClient = _ref$client === void 0 ? null : _ref$client,
55
- _ref$section = _ref.section,
56
- section = _ref$section === void 0 ? 'header' : _ref$section,
57
- _ref$hasMultiAgents = _ref.hasMultiAgents,
58
- hasMultiAgents = _ref$hasMultiAgents === void 0 ? false : _ref$hasMultiAgents,
59
- className = _ref.className;
60
- useStreamdownStyles();
61
- useEffect(function () {
62
- setMaiaPagePresence(true);
63
- return function () {
64
- setMaiaPagePresence(false);
65
- };
66
- }, []);
67
- var initialProjectValue = section === 'project' ? initialProject : null;
68
- var _useState = useState(initialProjectValue),
69
- _useState2 = _slicedToArray(_useState, 2),
70
- project = _useState2[0],
71
- setProject = _useState2[1];
72
- useEffect(function () {
73
- if (section === 'project' && initialProject != null) {
74
- setProject(initialProject);
75
- }
76
- }, [section, initialProject]);
77
- var _useProjectSummaryCon = useProjectSummaryConfig({
78
- section: section,
79
- entity: entity,
80
- project: project,
81
- setProject: setProject,
82
- client: section === 'client' ? initialClient !== null && initialClient !== void 0 ? initialClient : null : undefined,
83
- hasMultiAgents: hasMultiAgents
84
- }),
85
- context = _useProjectSummaryCon.context,
86
- restoreConfigureSettings = _useProjectSummaryCon.restoreConfigureSettings;
87
- var providerValue = useMemo(function () {
88
- return _objectSpread(_objectSpread({}, context), {}, {
89
- section: section
90
- });
91
- }, [context, section]);
92
- useEffect(function () {
93
- acquireChatsStore();
94
- return function () {
95
- releaseChatsStore();
96
- restoreConfigureSettings();
97
- };
98
- }, [restoreConfigureSettings]);
99
- return /*#__PURE__*/_jsx(GlobalContext.Provider, {
100
- value: providerValue,
101
- children: /*#__PURE__*/_jsx(ChatAIPageContent, {
102
- section: section,
103
- className: className
104
- })
105
- });
106
- }, Features.CHAT_AI);
107
- var ChatAIPageContent = function ChatAIPageContent(_ref2) {
108
- var _user$permissions, _user$permissions2, _user$permissions3;
109
- var section = _ref2.section,
110
- className = _ref2.className;
111
- var user = useUser();
112
- var _useTranslation = useTranslation([SECTIONS.abmAgent]),
113
- i18n = _useTranslation.i18n;
114
- var lang = i18n.language === 'br' ? 'pt-br' : i18n.language;
115
- moment.locale(lang);
116
- var _useState3 = useState({
117
- message: '',
118
- attachments: []
119
- }),
120
- _useState4 = _slicedToArray(_useState3, 2),
121
- userInitialMessage = _useState4[0],
122
- setUserInitialMessage = _useState4[1];
123
- var _useState5 = useState(null),
124
- _useState6 = _slicedToArray(_useState5, 2),
125
- initialChatId = _useState6[0],
126
- setInitialChatId = _useState6[1];
127
- var _useState7 = useState(0),
128
- _useState8 = _slicedToArray(_useState7, 2),
129
- newChatKey = _useState8[0],
130
- setNewChatKey = _useState8[1];
131
- var _useState9 = useState(null),
132
- _useState0 = _slicedToArray(_useState9, 2),
133
- sendMessageFunction = _useState0[0],
134
- setSendMessageFunction = _useState0[1];
135
- var _useState1 = useState(null),
136
- _useState10 = _slicedToArray(_useState1, 2),
137
- stopGenerationFunction = _useState10[0],
138
- setStopGenerationFunction = _useState10[1];
139
- var _useState11 = useState(false),
140
- _useState12 = _slicedToArray(_useState11, 2),
141
- isStreaming = _useState12[0],
142
- setIsStreaming = _useState12[1];
143
- var _useState13 = useState(false),
144
- _useState14 = _slicedToArray(_useState13, 2),
145
- isWriting = _useState14[0],
146
- setIsWriting = _useState14[1];
147
- var _useState15 = useState(false),
148
- _useState16 = _slicedToArray(_useState15, 2),
149
- refetchChats = _useState16[0],
150
- setRefetchChats = _useState16[1];
151
- var _useState17 = useState(options.home),
152
- _useState18 = _slicedToArray(_useState17, 2),
153
- currentOption = _useState18[0],
154
- setCurrentOption = _useState18[1];
155
- var _useState19 = useState(false),
156
- _useState20 = _slicedToArray(_useState19, 2),
157
- hasError = _useState20[0],
158
- setHasError = _useState20[1];
159
- var handlers = useMemo(function () {
160
- return buildHandlers(setCurrentOption, setHasError);
161
- }, []);
162
- var _useState21 = useState(false),
163
- _useState22 = _slicedToArray(_useState21, 2),
164
- sidebarHasError = _useState22[0],
165
- setSidebarHasError = _useState22[1];
166
- var resetSelectedChatRef = useRef(null);
167
- var _useState23 = useState('sidebar'),
168
- _useState24 = _slicedToArray(_useState23, 1),
169
- layoutMode = _useState24[0];
170
- /** US 2044983: al entrar a /maia el panel de conversaciones arranca abierto. */
171
- var _useState25 = useState(true),
172
- _useState26 = _slicedToArray(_useState25, 2),
173
- sidebarOpen = _useState26[0],
174
- setSidebarOpen = _useState26[1];
175
- var _useState27 = useState(false),
176
- _useState28 = _slicedToArray(_useState27, 2),
177
- homeLeaving = _useState28[0],
178
- setHomeLeaving = _useState28[1];
179
- var skipChatEnterRef = useRef(false);
180
- var expanded = layoutMode === 'fullscreen';
181
- var _useGlobalContext = useGlobalContext(),
182
- selectAgent = _useGlobalContext.selectAgent,
183
- agent = _useGlobalContext.agent,
184
- toggleWebSearch = _useGlobalContext.toggleWebSearch,
185
- isWebSearchActive = _useGlobalContext.isWebSearchActive,
186
- setChipsProject = _useGlobalContext.setChipsProject,
187
- setClient = _useGlobalContext.setClient,
188
- setProject = _useGlobalContext.setProject,
189
- setTask = _useGlobalContext.setTask;
190
- var _useGetAgents = useGetAgents({
191
- selectAgent: selectAgent,
192
- section: section,
193
- agent: agent,
194
- handleGoHome: handlers.home
195
- }),
196
- agents = _useGetAgents.agents,
197
- loading = _useGetAgents.loading,
198
- loadingMore = _useGetAgents.loadingMore,
199
- agentError = _useGetAgents.error,
200
- handleGetAgents = _useGetAgents.handleGetAgents,
201
- loadMoreAgents = _useGetAgents.loadMoreAgents,
202
- sortAgentsList = _useGetAgents.sortAgentsList,
203
- addAgent = _useGetAgents.addAgent,
204
- removeAgent = _useGetAgents.removeAgent,
205
- updateAgent = _useGetAgents.updateAgent,
206
- updateAgentFavorite = _useGetAgents.updateAgentFavorite,
207
- selectFirstAgent = _useGetAgents.selectFirstAgent;
208
- var userHasPermissions = ((user === null || user === void 0 || (_user$permissions = user.permissions) === null || _user$permissions === void 0 || (_user$permissions = _user$permissions.ai_agents) === null || _user$permissions === void 0 ? void 0 : _user$permissions.create) || (user === null || user === void 0 || (_user$permissions2 = user.permissions) === null || _user$permissions2 === void 0 || (_user$permissions2 = _user$permissions2.ai_agents) === null || _user$permissions2 === void 0 ? void 0 : _user$permissions2.edit) || (user === null || user === void 0 || (_user$permissions3 = user.permissions) === null || _user$permissions3 === void 0 || (_user$permissions3 = _user$permissions3.ai_agents) === null || _user$permissions3 === void 0 ? void 0 : _user$permissions3["delete"])) && window.MAIA_CHAT_AI_FEATURE_ACCESS_MULTI_AGENTS;
209
- var orchestrator = useMemo(function () {
210
- var _agents$data$find;
211
- return (_agents$data$find = agents.data.find(function (item) {
212
- return item.type === 'orchestrator';
213
- })) !== null && _agents$data$find !== void 0 ? _agents$data$find : null;
214
- }, [agents.data]);
215
- var computedCurrentOption = currentOption === options.chat ? options.chat : options.home;
216
- var isChatView = computedCurrentOption === options.chat;
217
- var sessionMeta = useMaiaChatSessionMeta(initialChatId);
218
- var legacyContextSession = useMemo(function () {
219
- return resolveLegacyContextSession(sessionMeta, isChatView);
220
- }, [isChatView, sessionMeta]);
221
- useEffect(function () {
222
- if (legacyContextSession && agent && !agent.is_legacy_context) {
223
- selectAgent(_objectSpread(_objectSpread({}, agent), {}, {
224
- is_legacy_context: true
225
- }));
226
- }
227
- }, [legacyContextSession, agent, selectAgent]);
228
- var handleContinueLegacyContextInNewChat = useContinueLegacyContextInNewChat({
229
- sessionMeta: sessionMeta,
230
- agents: agents.data,
231
- selectAgent: selectAgent,
232
- setClient: setClient,
233
- setProject: setProject,
234
- setTask: setTask,
235
- setChipsProject: setChipsProject,
236
- onResetChatSession: function onResetChatSession() {
237
- setInitialChatId(null);
238
- setNewChatKey(function (prev) {
239
- return prev + 1;
240
- });
241
- setUserInitialMessage({
242
- message: '',
243
- attachments: []
244
- });
245
- setHasError(false);
246
- },
247
- onGoToOrchestratorHome: function onGoToOrchestratorHome() {
248
- setHomeLeaving(false);
249
- skipChatEnterRef.current = false;
250
- setCurrentOption(options.home);
251
- }
252
- });
253
- var didInitAgentRef = useRef(false);
254
- useEffect(function () {
255
- if (didInitAgentRef.current || !orchestrator) return;
256
- didInitAgentRef.current = true;
257
- selectAgent(orchestrator);
258
- }, [orchestrator, selectAgent]);
259
- var agentsFetchedRef = useRef(false);
260
- useEffect(function () {
261
- if (!agentsFetchedRef.current) {
262
- agentsFetchedRef.current = true;
263
- handleGetAgents();
264
- }
265
- }, [handleGetAgents]);
266
- useEffect(function () {
267
- var onMergeCreatedAgent = function onMergeCreatedAgent(evt) {
268
- var _ref3 = evt.detail || {},
269
- nextAgent = _ref3.agent;
270
- if (nextAgent !== null && nextAgent !== void 0 && nextAgent.id) addAgent(nextAgent, {
271
- navigateHome: false
272
- });
273
- };
274
- document.addEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
275
- return function () {
276
- return document.removeEventListener('maia-merge-created-agent-into-list', onMergeCreatedAgent);
277
- };
278
- }, [addAgent]);
279
- useEffect(function () {
280
- var onSyncEditedAgent = function onSyncEditedAgent(evt) {
281
- var _ref4 = evt.detail || {},
282
- nextAgent = _ref4.agent;
283
- if (!(nextAgent !== null && nextAgent !== void 0 && nextAgent.id)) return;
284
- updateAgent(nextAgent);
285
- if ((agent === null || agent === void 0 ? void 0 : agent.id) === nextAgent.id) selectAgent(nextAgent);
286
- };
287
- document.addEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
288
- return function () {
289
- return document.removeEventListener('maia-sync-edited-agent-from-chat', onSyncEditedAgent);
290
- };
291
- }, [updateAgent, selectAgent, agent === null || agent === void 0 ? void 0 : agent.id]);
292
- useEffect(function () {
293
- var openChatView = function openChatView() {
294
- setHasError(false);
295
- setInitialChatId(null);
296
- setNewChatKey(function (prev) {
297
- return prev + 1;
298
- });
299
- setUserInitialMessage({
300
- message: '',
301
- attachments: []
302
- });
303
- setCurrentOption(options.chat);
304
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
305
- };
306
- document.addEventListener('maia-open-chat-view', openChatView);
307
- return function () {
308
- return document.removeEventListener('maia-open-chat-view', openChatView);
309
- };
310
- }, []);
311
- useEffect(function () {
312
- var openNewChatWithAgent = function openNewChatWithAgent(event) {
313
- var _detail;
314
- var nextAgent = (_detail = event.detail) === null || _detail === void 0 ? void 0 : _detail.agent;
315
- if (!nextAgent) return;
316
- setProject(null);
317
- setClient === null || setClient === void 0 || setClient(null);
318
- selectAgent(nextAgent);
319
- setHasError(false);
320
- setCurrentOption(options.home);
321
- };
322
- document.addEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
323
- return function () {
324
- return document.removeEventListener('maia-open-new-chat-with-agent', openNewChatWithAgent);
325
- };
326
- }, [selectAgent, setClient, setProject]);
327
- var startChat = useCallback(function (message, attachments, faqId, agentSuggestionId, _mentions, fuaId) {
328
- if (sidebarHasError) setSidebarHasError(false);
329
- setInitialChatId(null);
330
- setNewChatKey(function (prev) {
331
- return prev + 1;
332
- });
333
- setUserInitialMessage(_objectSpread(_objectSpread(_objectSpread({
334
- message: message || '',
335
- attachments: attachments || []
336
- }, faqId ? {
337
- faqId: faqId
338
- } : {}), agentSuggestionId ? {
339
- agentSuggestionId: agentSuggestionId
340
- } : {}), fuaId ? {
341
- fuaId: fuaId
342
- } : {}));
343
- handlers.chat();
344
- }, [handlers, sidebarHasError]);
345
-
346
- // Sidebar types this prop as (chatId: string) but passes the full chat object at runtime
347
- var goToChat = useCallback(function (chatArg) {
348
- var chat = chatArg;
349
- setUserInitialMessage({
350
- message: '',
351
- attachments: []
352
- });
353
- setInitialChatId(chat.sessionExternalId);
354
- var selectedAgent = agents.data.find(function (agentItem) {
355
- return agentItem.id === chat.agentId;
356
- });
357
- if (selectedAgent) selectAgent(selectedAgent);
358
- skipChatEnterRef.current = false;
359
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
360
- handlers.chat();
361
- }, [handlers, agents, selectAgent]);
362
- var handleSendMessageReady = useCallback(function (sendMessage, stopGeneration, streaming, writing) {
363
- setSendMessageFunction(function () {
364
- return sendMessage;
365
- });
366
- setStopGenerationFunction(function () {
367
- return stopGeneration;
368
- });
369
- setIsStreaming(streaming);
370
- setIsWriting(writing);
371
- }, []);
372
- var handleSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
373
- if (sidebarHasError) setSidebarHasError(false);
374
- if (sendMessageFunction && computedCurrentOption === options.chat) {
375
- sendMessageFunction(message, attachments, faqId, agentSuggestionId);
376
- } else {
377
- startChat(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
378
- }
379
- }, [sendMessageFunction, startChat, computedCurrentOption, sidebarHasError]);
380
- var handleHomeLeaveStart = useCallback(function () {
381
- skipChatEnterRef.current = true;
382
- setHomeLeaving(true);
383
- }, []);
384
- var handleHomeSendMessage = useCallback(function (message, attachments, faqId, agentSuggestionId, mentions, fuaId) {
385
- setHomeLeaving(false);
386
- handleSendMessage(message, attachments, faqId, agentSuggestionId, mentions, fuaId);
387
- }, [handleSendMessage]);
388
- var handleGoHome = useCallback(function () {
389
- setHomeLeaving(false);
390
- skipChatEnterRef.current = false;
391
- if (currentOption === options.chat) {
392
- setInitialChatId(null);
393
- setNewChatKey(function (prev) {
394
- return prev + 1;
395
- });
396
- if ((agent === null || agent === void 0 ? void 0 : agent.entity) !== 'client') setClient === null || setClient === void 0 || setClient(null);
397
- }
398
- if (orchestrator) {
399
- selectAgent(orchestrator);
400
- } else if ((!agent || agent !== null && agent !== void 0 && agent.is_deleted || agent !== null && agent !== void 0 && agent.has_not_permissions || agent !== null && agent !== void 0 && agent.has_not_access || agent !== null && agent !== void 0 && agent.project_deleted) && agents.data.length > 0) {
401
- selectAgent(agents.data[0]);
402
- }
403
- setCurrentOption(options.home);
404
- setChipsProject(null);
405
- setHasError(false);
406
- if (isWebSearchActive) toggleWebSearch();
407
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
408
- }, [currentOption, isWebSearchActive, toggleWebSearch, agent, agents, orchestrator, selectAgent, setClient, setChipsProject]);
409
- var handleResetChat = useCallback(function () {
410
- setHomeLeaving(false);
411
- skipChatEnterRef.current = false;
412
- setInitialChatId(null);
413
- setNewChatKey(function (prev) {
414
- return prev + 1;
415
- });
416
- setUserInitialMessage({
417
- message: '',
418
- attachments: []
419
- });
420
- setCurrentOption(options.home);
421
- setChipsProject(null);
422
- setHasError(false);
423
- if (isWebSearchActive) toggleWebSearch();
424
- if (resetSelectedChatRef.current) resetSelectedChatRef.current();
425
- document.dispatchEvent(new CustomEvent('chat-session-changed'));
426
- }, [isWebSearchActive, toggleWebSearch, setChipsProject]);
427
- var focusChatInput = useCallback(function () {
428
- window.setTimeout(function () {
429
- document.dispatchEvent(new CustomEvent('maia-input-refocus'));
430
- }, 100);
431
- }, []);
432
- var handleStartNewChat = useCallback(function () {
433
- if (currentOption === options.home) {
434
- focusChatInput();
435
- return;
436
- }
437
- if (orchestrator) selectAgent(orchestrator);
438
- handleGoHome();
439
- focusChatInput();
440
- }, [currentOption, focusChatInput, handleGoHome, orchestrator, selectAgent]);
441
- var noop = useCallback(function () {
442
- return undefined;
443
- }, []);
444
- var canAccessPage = validateAccessByFeature(section);
445
- var isHome = computedCurrentOption === options.home;
446
- var showChatFooter = computedCurrentOption === options.chat && !hasError && !loading && canAccessPage;
447
- return /*#__PURE__*/_jsxs(SCPageWrapper, {
448
- className: className,
449
- children: [canAccessPage ? /*#__PURE__*/_jsx(Sidebar, {
450
- conversationsOnly: true,
451
- open: sidebarOpen,
452
- onOpenChange: setSidebarOpen,
453
- onGoToChat: goToChat,
454
- onError: function onError() {
455
- return setSidebarHasError(true);
456
- },
457
- handleGoToHome: handleGoHome,
458
- handleStartNewChat: handleStartNewChat,
459
- handleOpenMarketplace: noop,
460
- handleOpenSkills: noop,
461
- showNewChat: false,
462
- refetchChats: refetchChats,
463
- handleSetRefetchChats: setRefetchChats,
464
- hasError: sidebarHasError,
465
- resetSelectedChatRef: resetSelectedChatRef,
466
- isLegacyContextSession: !!legacyContextSession
467
- }) : null, /*#__PURE__*/_jsxs(SCPageMain, {
468
- children: [/*#__PURE__*/_jsx(ChatAIPageHeader, {
469
- overlay: isHome && !homeLeaving,
470
- showBack: !isHome,
471
- agents: agents.data,
472
- loading: loading,
473
- loadingMore: loadingMore,
474
- hasMore: agents.has_more,
475
- loadMoreAgents: loadMoreAgents,
476
- sortAgentsList: sortAgentsList,
477
- handleResetChat: handleResetChat,
478
- onAgentUpdate: updateAgentFavorite
479
- }), hasError ? /*#__PURE__*/_jsx(MAIAError, {}) : canAccessPage ? isHome ? /*#__PURE__*/_jsx(ChatAIPageHome, {
480
- onSendMessage: handleHomeSendMessage,
481
- onLeaveStart: handleHomeLeaveStart
482
- }) : /*#__PURE__*/_jsx(ChatAIContent, {
483
- currentOption: options.chat,
484
- handlers: _objectSpread(_objectSpread({}, handlers), {}, {
485
- chat: startChat,
486
- home: handlers.home,
487
- handleGoHome: handleGoHome
488
- }),
489
- onError: function onError() {
490
- return setHasError(true);
491
- },
492
- refs: {
493
- userInitialMessage: userInitialMessage,
494
- initialChatId: initialChatId
495
- },
496
- onSendMessageReady: handleSendMessageReady,
497
- expanded: expanded,
498
- floating: false,
499
- agents: agents.data,
500
- loadingAgents: loading,
501
- agentError: agentError,
502
- skipEnterAnimation: skipChatEnterRef.current
503
- }) : /*#__PURE__*/_jsx(ProjectSummaryContent, {
504
- onRestartSummary: handlers.home
505
- }), showChatFooter ? /*#__PURE__*/_jsx(ChatAiModalFooter, {
506
- agent: agent,
507
- handleSendMessage: handleSendMessage,
508
- handleStopGeneration: stopGenerationFunction,
509
- isStreaming: isStreaming,
510
- isWriting: isWriting,
511
- chatId: initialChatId,
512
- newChatKey: newChatKey,
513
- layoutMode: layoutMode,
514
- legacyContextSession: legacyContextSession,
515
- onContinueInNewChat: handleContinueLegacyContextInNewChat
516
- }) : null]
517
- }), userHasPermissions && /*#__PURE__*/_jsx(AbmAgentModal, {
518
- addAgent: addAgent,
519
- updateAgent: updateAgent,
520
- removeAgent: removeAgent,
521
- updateAgentFavorite: updateAgentFavorite,
522
- selectFirstAgent: selectFirstAgent
523
- }), /*#__PURE__*/_jsx(Snackbar, {})]
524
- });
525
- };
526
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VSZWYiLCJ1c2VTdGF0ZSIsIm1vbWVudCIsInVzZVRyYW5zbGF0aW9uIiwidXNlVXNlciIsIk1BSUFFcnJvciIsIkNoYXRBSUNvbnRlbnQiLCJidWlsZEhhbmRsZXJzIiwib3B0aW9ucyIsIlNpZGViYXIiLCJ1c2VHZXRBZ2VudHMiLCJHbG9iYWxDb250ZXh0IiwidXNlR2xvYmFsQ29udGV4dCIsIlNuYWNrYmFyIiwiUHJvamVjdFN1bW1hcnlDb250ZW50IiwiQWJtQWdlbnRNb2RhbCIsIkNoYXRBaU1vZGFsRm9vdGVyIiwiQ2hhdEFJUGFnZUhlYWRlciIsIkNoYXRBSVBhZ2VIb21lIiwiU0VDVElPTlMiLCJ1c2VTdHJlYW1kb3duU3R5bGVzIiwidXNlUHJvamVjdFN1bW1hcnlDb25maWciLCJhY3F1aXJlQ2hhdHNTdG9yZSIsInJlbGVhc2VDaGF0c1N0b3JlIiwid2l0aEFwcENmZyIsIkZlYXR1cmVzIiwic2V0TWFpYVBhZ2VQcmVzZW5jZSIsIlNDUGFnZU1haW4iLCJTQ1BhZ2VXcmFwcGVyIiwidXNlTWFpYUNoYXRTZXNzaW9uTWV0YSIsInJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiIsInVzZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJ2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZSIsInNlY3Rpb24iLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwiTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTIiwiQ2hhdEFJUGFnZSIsIl9yZWYiLCJfcmVmJGVudGl0eSIsImVudGl0eSIsInByb2plY3RJZCIsImNsaWVudElkIiwiX3JlZiRwcm9qZWN0IiwicHJvamVjdCIsImluaXRpYWxQcm9qZWN0IiwiX3JlZiRjbGllbnQiLCJjbGllbnQiLCJpbml0aWFsQ2xpZW50IiwiX3JlZiRzZWN0aW9uIiwiX3JlZiRoYXNNdWx0aUFnZW50cyIsImhhc011bHRpQWdlbnRzIiwiY2xhc3NOYW1lIiwiaW5pdGlhbFByb2plY3RWYWx1ZSIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsInNldFByb2plY3QiLCJfdXNlUHJvamVjdFN1bW1hcnlDb24iLCJ1bmRlZmluZWQiLCJjb250ZXh0IiwicmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzIiwicHJvdmlkZXJWYWx1ZSIsIl9vYmplY3RTcHJlYWQiLCJQcm92aWRlciIsInZhbHVlIiwiY2hpbGRyZW4iLCJDaGF0QUlQYWdlQ29udGVudCIsIkNIQVRfQUkiLCJfcmVmMiIsIl91c2VyJHBlcm1pc3Npb25zIiwiX3VzZXIkcGVybWlzc2lvbnMyIiwiX3VzZXIkcGVybWlzc2lvbnMzIiwidXNlciIsIl91c2VUcmFuc2xhdGlvbiIsImFibUFnZW50IiwiaTE4biIsImxhbmciLCJsYW5ndWFnZSIsImxvY2FsZSIsIl91c2VTdGF0ZTMiLCJtZXNzYWdlIiwiYXR0YWNobWVudHMiLCJfdXNlU3RhdGU0IiwidXNlckluaXRpYWxNZXNzYWdlIiwic2V0VXNlckluaXRpYWxNZXNzYWdlIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpbml0aWFsQ2hhdElkIiwic2V0SW5pdGlhbENoYXRJZCIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibmV3Q2hhdEtleSIsInNldE5ld0NoYXRLZXkiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMCIsInNlbmRNZXNzYWdlRnVuY3Rpb24iLCJzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uIiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwic3RvcEdlbmVyYXRpb25GdW5jdGlvbiIsInNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb24iLCJfdXNlU3RhdGUxMSIsIl91c2VTdGF0ZTEyIiwiaXNTdHJlYW1pbmciLCJzZXRJc1N0cmVhbWluZyIsIl91c2VTdGF0ZTEzIiwiX3VzZVN0YXRlMTQiLCJpc1dyaXRpbmciLCJzZXRJc1dyaXRpbmciLCJfdXNlU3RhdGUxNSIsIl91c2VTdGF0ZTE2IiwicmVmZXRjaENoYXRzIiwic2V0UmVmZXRjaENoYXRzIiwiX3VzZVN0YXRlMTciLCJob21lIiwiX3VzZVN0YXRlMTgiLCJjdXJyZW50T3B0aW9uIiwic2V0Q3VycmVudE9wdGlvbiIsIl91c2VTdGF0ZTE5IiwiX3VzZVN0YXRlMjAiLCJoYXNFcnJvciIsInNldEhhc0Vycm9yIiwiaGFuZGxlcnMiLCJfdXNlU3RhdGUyMSIsIl91c2VTdGF0ZTIyIiwic2lkZWJhckhhc0Vycm9yIiwic2V0U2lkZWJhckhhc0Vycm9yIiwicmVzZXRTZWxlY3RlZENoYXRSZWYiLCJfdXNlU3RhdGUyMyIsIl91c2VTdGF0ZTI0IiwibGF5b3V0TW9kZSIsIl91c2VTdGF0ZTI1IiwiX3VzZVN0YXRlMjYiLCJzaWRlYmFyT3BlbiIsInNldFNpZGViYXJPcGVuIiwiX3VzZVN0YXRlMjciLCJfdXNlU3RhdGUyOCIsImhvbWVMZWF2aW5nIiwic2V0SG9tZUxlYXZpbmciLCJza2lwQ2hhdEVudGVyUmVmIiwiZXhwYW5kZWQiLCJfdXNlR2xvYmFsQ29udGV4dCIsInNlbGVjdEFnZW50IiwiYWdlbnQiLCJ0b2dnbGVXZWJTZWFyY2giLCJpc1dlYlNlYXJjaEFjdGl2ZSIsInNldENoaXBzUHJvamVjdCIsInNldENsaWVudCIsInNldFRhc2siLCJfdXNlR2V0QWdlbnRzIiwiaGFuZGxlR29Ib21lIiwiYWdlbnRzIiwibG9hZGluZyIsImxvYWRpbmdNb3JlIiwiYWdlbnRFcnJvciIsImVycm9yIiwiaGFuZGxlR2V0QWdlbnRzIiwibG9hZE1vcmVBZ2VudHMiLCJzb3J0QWdlbnRzTGlzdCIsImFkZEFnZW50IiwicmVtb3ZlQWdlbnQiLCJ1cGRhdGVBZ2VudCIsInVwZGF0ZUFnZW50RmF2b3JpdGUiLCJzZWxlY3RGaXJzdEFnZW50IiwidXNlckhhc1Blcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJjcmVhdGUiLCJlZGl0Iiwib3JjaGVzdHJhdG9yIiwiX2FnZW50cyRkYXRhJGZpbmQiLCJkYXRhIiwiZmluZCIsIml0ZW0iLCJ0eXBlIiwiY29tcHV0ZWRDdXJyZW50T3B0aW9uIiwiY2hhdCIsImlzQ2hhdFZpZXciLCJzZXNzaW9uTWV0YSIsImxlZ2FjeUNvbnRleHRTZXNzaW9uIiwiaXNfbGVnYWN5X2NvbnRleHQiLCJoYW5kbGVDb250aW51ZUxlZ2FjeUNvbnRleHRJbk5ld0NoYXQiLCJvblJlc2V0Q2hhdFNlc3Npb24iLCJwcmV2Iiwib25Hb1RvT3JjaGVzdHJhdG9ySG9tZSIsImN1cnJlbnQiLCJkaWRJbml0QWdlbnRSZWYiLCJhZ2VudHNGZXRjaGVkUmVmIiwib25NZXJnZUNyZWF0ZWRBZ2VudCIsImV2dCIsIl9yZWYzIiwiZGV0YWlsIiwibmV4dEFnZW50IiwiaWQiLCJuYXZpZ2F0ZUhvbWUiLCJkb2N1bWVudCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwib25TeW5jRWRpdGVkQWdlbnQiLCJfcmVmNCIsIm9wZW5DaGF0VmlldyIsImRpc3BhdGNoRXZlbnQiLCJDdXN0b21FdmVudCIsIm9wZW5OZXdDaGF0V2l0aEFnZW50IiwiZXZlbnQiLCJfZGV0YWlsIiwic3RhcnRDaGF0IiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIl9tZW50aW9ucyIsImZ1YUlkIiwiZ29Ub0NoYXQiLCJjaGF0QXJnIiwic2Vzc2lvbkV4dGVybmFsSWQiLCJzZWxlY3RlZEFnZW50IiwiYWdlbnRJdGVtIiwiYWdlbnRJZCIsImhhbmRsZVNlbmRNZXNzYWdlUmVhZHkiLCJzZW5kTWVzc2FnZSIsInN0b3BHZW5lcmF0aW9uIiwic3RyZWFtaW5nIiwid3JpdGluZyIsImhhbmRsZVNlbmRNZXNzYWdlIiwibWVudGlvbnMiLCJoYW5kbGVIb21lTGVhdmVTdGFydCIsImhhbmRsZUhvbWVTZW5kTWVzc2FnZSIsImlzX2RlbGV0ZWQiLCJoYXNfbm90X3Blcm1pc3Npb25zIiwiaGFzX25vdF9hY2Nlc3MiLCJwcm9qZWN0X2RlbGV0ZWQiLCJsZW5ndGgiLCJoYW5kbGVSZXNldENoYXQiLCJmb2N1c0NoYXRJbnB1dCIsInNldFRpbWVvdXQiLCJoYW5kbGVTdGFydE5ld0NoYXQiLCJub29wIiwiY2FuQWNjZXNzUGFnZSIsImlzSG9tZSIsInNob3dDaGF0Rm9vdGVyIiwiY29udmVyc2F0aW9uc09ubHkiLCJvcGVuIiwib25PcGVuQ2hhbmdlIiwib25Hb1RvQ2hhdCIsIm9uRXJyb3IiLCJoYW5kbGVHb1RvSG9tZSIsImhhbmRsZU9wZW5NYXJrZXRwbGFjZSIsImhhbmRsZU9wZW5Ta2lsbHMiLCJzaG93TmV3Q2hhdCIsImhhbmRsZVNldFJlZmV0Y2hDaGF0cyIsImlzTGVnYWN5Q29udGV4dFNlc3Npb24iLCJvdmVybGF5Iiwic2hvd0JhY2siLCJoYXNNb3JlIiwiaGFzX21vcmUiLCJvbkFnZW50VXBkYXRlIiwib25TZW5kTWVzc2FnZSIsIm9uTGVhdmVTdGFydCIsInJlZnMiLCJvblNlbmRNZXNzYWdlUmVhZHkiLCJmbG9hdGluZyIsImxvYWRpbmdBZ2VudHMiLCJza2lwRW50ZXJBbmltYXRpb24iLCJvblJlc3RhcnRTdW1tYXJ5IiwiaGFuZGxlU3RvcEdlbmVyYXRpb24iLCJjaGF0SWQiLCJvbkNvbnRpbnVlSW5OZXdDaGF0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvb3JnYW5pc21zL0NoYXRBSVBhZ2UvQ2hhdEFJUGFnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11c2UtYmVmb3JlLWRlZmluZSAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnXG5pbXBvcnQgeyB1c2VUcmFuc2xhdGlvbiB9IGZyb20gJ3JlYWN0LWkxOG5leHQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IE1BSUFFcnJvciB9IGZyb20gJy4uLy4uL2F0b21zL01BSUFFcnJvcidcbmltcG9ydCB7IENoYXRBSUNvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJQ29udGVudCdcbmltcG9ydCB7IGJ1aWxkSGFuZGxlcnMsIG9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvY29uc3RhbnRzJ1xuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9TaWRlYmFyJ1xuaW1wb3J0IHsgdXNlR2V0QWdlbnRzIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbWFpYS9BZ2VudHMvZ2V0QWdlbnRzJ1xuaW1wb3J0IHsgR2xvYmFsQ29udGV4dCwgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0Rm9vdGVyL0NoYXRGb290ZXInXG5pbXBvcnQgeyBTbmFja2JhciB9IGZyb20gJy4uL1NuYWNrQmFyL1NuYWNrYmFyJ1xuaW1wb3J0IHsgUHJvamVjdFN1bW1hcnlDb250ZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL1Byb2plY3RTdW1tYXJ5Q29udGVudCdcbmltcG9ydCB7IEFibUFnZW50TW9kYWwgfSBmcm9tICcuLi9BYm1BZ2VudE1vZGFsL0FibUFnZW50TW9kYWwnXG5pbXBvcnQgeyBDaGF0QWlNb2RhbEZvb3RlciB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9DaGF0QUlNb2RhbC9jb21wb25lbnRzL0NoYXRBaU1vZGFsRm9vdGVyJ1xuaW1wb3J0IHsgQ2hhdEFJUGFnZUhlYWRlciB9IGZyb20gJy4vQ2hhdEFJUGFnZUhlYWRlcidcbmltcG9ydCB7IENoYXRBSVBhZ2VIb21lIH0gZnJvbSAnLi9DaGF0QUlQYWdlSG9tZSdcbmltcG9ydCB7IFNFQ1RJT05TIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2NvbmZpZydcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyB1c2VTdHJlYW1kb3duU3R5bGVzIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtZG93blN0eWxlcydcbmltcG9ydCB7IHVzZVByb2plY3RTdW1tYXJ5Q29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUHJvamVjdFN1bW1hcnlDb25maWcnXG5pbXBvcnQgeyBhY3F1aXJlQ2hhdHNTdG9yZSwgcmVsZWFzZUNoYXRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9zdG9yZSdcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2xpZW50J1xuaW1wb3J0IHsgTWFpYUNoYXRNb2RhbExheW91dE1vZGUgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvQ2hhdEFJTW9kYWwvbGF5b3V0J1xuaW1wb3J0IHsgd2l0aEFwcENmZyB9IGZyb20gJy4uLy4uL2F0b21zL1dpdGhBcHBDZmcnXG5pbXBvcnQgeyBGZWF0dXJlcyB9IGZyb20gJy4uLy4uL2F0b21zL1dpdGhGZWF0dXJlVmFsaWRhdGlvbidcbmltcG9ydCB7IHNldE1haWFQYWdlUHJlc2VuY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9tYWlhUGFnZVJvdXRlJ1xuaW1wb3J0IHsgU0NQYWdlTWFpbiwgU0NQYWdlV3JhcHBlciB9IGZyb20gJy4vQ2hhdEFJUGFnZS5zdHlsZXMnXG5pbXBvcnQgeyB1c2VNYWlhQ2hhdFNlc3Npb25NZXRhIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlTWFpYUNoYXRTZXNzaW9uTWV0YSdcbmltcG9ydCB7IHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbiB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9BZ2VudElucHV0QmxvY2svcmVzb2x2ZUxlZ2FjeUNvbnRleHRTZXNzaW9uJ1xuaW1wb3J0IHsgdXNlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlQ29udGludWVMZWdhY3lDb250ZXh0SW5OZXdDaGF0J1xuXG5leHBvcnQgdHlwZSBDaGF0QUlQYWdlUHJvcHMgPSB7XG4gIGVudGl0eT86IHsgcHJvamVjdElkOiBzdHJpbmcgfCBudWxsOyBjbGllbnRJZDogc3RyaW5nIHwgbnVsbCB9XG4gIHByb2plY3Q/OiBQcm9qZWN0IHwgbnVsbFxuICBjbGllbnQ/OiBDbGllbnQgfCBudWxsXG4gIHNlY3Rpb24/OiAncHJvamVjdCcgfCAnaGVhZGVyJyB8ICdjbGllbnQnXG4gIGhhc011bHRpQWdlbnRzPzogYm9vbGVhblxuICBjbGFzc05hbWU/OiBzdHJpbmdcbn1cblxudHlwZSBTZWN0aW9uVHlwZSA9ICdwcm9qZWN0JyB8ICdoZWFkZXInIHwgJ2NsaWVudCdcblxudHlwZSBDaGF0TGlzdEl0ZW0gPSB7IHNlc3Npb25FeHRlcm5hbElkOiBzdHJpbmc7IGFnZW50SWQ6IHN0cmluZyB9XG5cbmNvbnN0IHZhbGlkYXRlQWNjZXNzQnlGZWF0dXJlID0gKHNlY3Rpb246IHN0cmluZykgPT4ge1xuICBpZiAoc2VjdGlvbiA9PT0gJ2hlYWRlcicgJiYgKHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIHx8IHdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1MpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuICBpZiAoKHNlY3Rpb24gPT09ICdwcm9qZWN0JyB8fCBzZWN0aW9uID09PSAnY2xpZW50JykgJiYgd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTUykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlQYWdlID0gd2l0aEFwcENmZyhcbiAgKHtcbiAgICBlbnRpdHkgPSB7IHByb2plY3RJZDogbnVsbCwgY2xpZW50SWQ6IG51bGwgfSxcbiAgICBwcm9qZWN0OiBpbml0aWFsUHJvamVjdCA9IG51bGwsXG4gICAgY2xpZW50OiBpbml0aWFsQ2xpZW50ID0gbnVsbCxcbiAgICBzZWN0aW9uID0gJ2hlYWRlcicsXG4gICAgaGFzTXVsdGlBZ2VudHMgPSBmYWxzZSxcbiAgICBjbGFzc05hbWUsXG4gIH06IENoYXRBSVBhZ2VQcm9wcykgPT4ge1xuICAgIHVzZVN0cmVhbWRvd25TdHlsZXMoKVxuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgIHNldE1haWFQYWdlUHJlc2VuY2UodHJ1ZSlcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIHNldE1haWFQYWdlUHJlc2VuY2UoZmFsc2UpXG4gICAgICB9XG4gICAgfSwgW10pXG5cbiAgICBjb25zdCBpbml0aWFsUHJvamVjdFZhbHVlID0gc2VjdGlvbiA9PT0gJ3Byb2plY3QnID8gaW5pdGlhbFByb2plY3QgOiBudWxsXG4gICAgY29uc3QgW3Byb2plY3QsIHNldFByb2plY3RdID0gdXNlU3RhdGU8UHJvamVjdCB8IG51bGw+KGluaXRpYWxQcm9qZWN0VmFsdWUpXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHNlY3Rpb24gPT09ICdwcm9qZWN0JyAmJiBpbml0aWFsUHJvamVjdCAhPSBudWxsKSB7XG4gICAgICAgIHNldFByb2plY3QoaW5pdGlhbFByb2plY3QpXG4gICAgICB9XG4gICAgfSwgW3NlY3Rpb24sIGluaXRpYWxQcm9qZWN0XSlcblxuICAgIGNvbnN0IHsgY29udGV4dCwgcmVzdG9yZUNvbmZpZ3VyZVNldHRpbmdzIH0gPSB1c2VQcm9qZWN0U3VtbWFyeUNvbmZpZyh7XG4gICAgICBzZWN0aW9uLFxuICAgICAgZW50aXR5LFxuICAgICAgcHJvamVjdCxcbiAgICAgIHNldFByb2plY3QsXG4gICAgICBjbGllbnQ6IHNlY3Rpb24gPT09ICdjbGllbnQnID8gKGluaXRpYWxDbGllbnQgPz8gbnVsbCkgOiB1bmRlZmluZWQsXG4gICAgICBoYXNNdWx0aUFnZW50cyxcbiAgICB9KVxuXG4gICAgY29uc3QgcHJvdmlkZXJWYWx1ZSA9IHVzZU1lbW8oXG4gICAgICAoKSA9PiAoeyAuLi5jb250ZXh0LCBzZWN0aW9uOiBzZWN0aW9uIGFzICdwcm9qZWN0JyB8ICdoZWFkZXInIHwgJ2NsaWVudCcgfSksXG4gICAgICBbY29udGV4dCwgc2VjdGlvbl1cbiAgICApXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgYWNxdWlyZUNoYXRzU3RvcmUoKVxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgcmVsZWFzZUNoYXRzU3RvcmUoKVxuICAgICAgICByZXN0b3JlQ29uZmlndXJlU2V0dGluZ3MoKVxuICAgICAgfVxuICAgIH0sIFtyZXN0b3JlQ29uZmlndXJlU2V0dGluZ3NdKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxHbG9iYWxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtwcm92aWRlclZhbHVlfT5cbiAgICAgICAgPENoYXRBSVBhZ2VDb250ZW50IHNlY3Rpb249e3NlY3Rpb24gYXMgU2VjdGlvblR5cGV9IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSAvPlxuICAgICAgPC9HbG9iYWxDb250ZXh0LlByb3ZpZGVyPlxuICAgIClcbiAgfSxcbiAgRmVhdHVyZXMuQ0hBVF9BSVxuKVxuXG5jb25zdCBDaGF0QUlQYWdlQ29udGVudCA9ICh7IHNlY3Rpb24sIGNsYXNzTmFtZSB9OiB7IHNlY3Rpb246IFNlY3Rpb25UeXBlOyBjbGFzc05hbWU/OiBzdHJpbmcgfSkgPT4ge1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHsgaTE4biB9ID0gdXNlVHJhbnNsYXRpb24oW1NFQ1RJT05TLmFibUFnZW50XSlcblxuICBjb25zdCBsYW5nID0gaTE4bi5sYW5ndWFnZSA9PT0gJ2JyJyA/ICdwdC1icicgOiBpMThuLmxhbmd1YWdlXG4gIG1vbWVudC5sb2NhbGUobGFuZylcblxuICBjb25zdCBbdXNlckluaXRpYWxNZXNzYWdlLCBzZXRVc2VySW5pdGlhbE1lc3NhZ2VdID0gdXNlU3RhdGU8e1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIGZ1YUlkPzogc3RyaW5nXG4gIH0+KHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICBjb25zdCBbaW5pdGlhbENoYXRJZCwgc2V0SW5pdGlhbENoYXRJZF0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKVxuICBjb25zdCBbbmV3Q2hhdEtleSwgc2V0TmV3Q2hhdEtleV0gPSB1c2VTdGF0ZSgwKVxuICB0eXBlIFBhZ2VTZW5kTWVzc2FnZUZuID0gKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmdcbiAgKSA9PiB2b2lkXG4gIGNvbnN0IFtzZW5kTWVzc2FnZUZ1bmN0aW9uLCBzZXRTZW5kTWVzc2FnZUZ1bmN0aW9uXSA9IHVzZVN0YXRlPFBhZ2VTZW5kTWVzc2FnZUZuIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW3N0b3BHZW5lcmF0aW9uRnVuY3Rpb24sIHNldFN0b3BHZW5lcmF0aW9uRnVuY3Rpb25dID0gdXNlU3RhdGU8KCgpID0+IHZvaWQpIHwgbnVsbD4obnVsbClcbiAgY29uc3QgW2lzU3RyZWFtaW5nLCBzZXRJc1N0cmVhbWluZ10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2lzV3JpdGluZywgc2V0SXNXcml0aW5nXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbcmVmZXRjaENoYXRzLCBzZXRSZWZldGNoQ2hhdHNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtjdXJyZW50T3B0aW9uLCBzZXRDdXJyZW50T3B0aW9uXSA9IHVzZVN0YXRlKG9wdGlvbnMuaG9tZSlcbiAgY29uc3QgW2hhc0Vycm9yLCBzZXRIYXNFcnJvcl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgaGFuZGxlcnMgPSB1c2VNZW1vKCgpID0+IGJ1aWxkSGFuZGxlcnMoc2V0Q3VycmVudE9wdGlvbiwgc2V0SGFzRXJyb3IpLCBbXSlcbiAgY29uc3QgW3NpZGViYXJIYXNFcnJvciwgc2V0U2lkZWJhckhhc0Vycm9yXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCByZXNldFNlbGVjdGVkQ2hhdFJlZiA9IHVzZVJlZjwoKCkgPT4gdm9pZCkgfCBudWxsPihudWxsKVxuICBjb25zdCBbbGF5b3V0TW9kZV0gPSB1c2VTdGF0ZTxNYWlhQ2hhdE1vZGFsTGF5b3V0TW9kZT4oJ3NpZGViYXInKVxuICAvKiogVVMgMjA0NDk4MzogYWwgZW50cmFyIGEgL21haWEgZWwgcGFuZWwgZGUgY29udmVyc2FjaW9uZXMgYXJyYW5jYSBhYmllcnRvLiAqL1xuICBjb25zdCBbc2lkZWJhck9wZW4sIHNldFNpZGViYXJPcGVuXSA9IHVzZVN0YXRlKHRydWUpXG4gIGNvbnN0IFtob21lTGVhdmluZywgc2V0SG9tZUxlYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHNraXBDaGF0RW50ZXJSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGV4cGFuZGVkID0gbGF5b3V0TW9kZSA9PT0gJ2Z1bGxzY3JlZW4nXG5cbiAgY29uc3QgeyBzZWxlY3RBZ2VudCwgYWdlbnQsIHRvZ2dsZVdlYlNlYXJjaCwgaXNXZWJTZWFyY2hBY3RpdmUsIHNldENoaXBzUHJvamVjdCwgc2V0Q2xpZW50LCBzZXRQcm9qZWN0LCBzZXRUYXNrIH0gPVxuICAgIHVzZUdsb2JhbENvbnRleHQoKVxuXG4gIGNvbnN0IHtcbiAgICBhZ2VudHMsXG4gICAgbG9hZGluZyxcbiAgICBsb2FkaW5nTW9yZSxcbiAgICBlcnJvcjogYWdlbnRFcnJvcixcbiAgICBoYW5kbGVHZXRBZ2VudHMsXG4gICAgbG9hZE1vcmVBZ2VudHMsXG4gICAgc29ydEFnZW50c0xpc3QsXG4gICAgYWRkQWdlbnQsXG4gICAgcmVtb3ZlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnQsXG4gICAgdXBkYXRlQWdlbnRGYXZvcml0ZSxcbiAgICBzZWxlY3RGaXJzdEFnZW50LFxuICB9ID0gdXNlR2V0QWdlbnRzKHsgc2VsZWN0QWdlbnQsIHNlY3Rpb24sIGFnZW50LCBoYW5kbGVHb0hvbWU6IGhhbmRsZXJzLmhvbWUgfSlcblxuICBjb25zdCB1c2VySGFzUGVybWlzc2lvbnMgPVxuICAgICh1c2VyPy5wZXJtaXNzaW9ucz8uYWlfYWdlbnRzPy5jcmVhdGUgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmVkaXQgfHxcbiAgICAgIHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHM/LmRlbGV0ZSkgJiZcbiAgICB3aW5kb3cuTUFJQV9DSEFUX0FJX0ZFQVRVUkVfQUNDRVNTX01VTFRJX0FHRU5UU1xuXG4gIGNvbnN0IG9yY2hlc3RyYXRvciA9IHVzZU1lbW8oKCkgPT4gYWdlbnRzLmRhdGEuZmluZChpdGVtID0+IGl0ZW0udHlwZSA9PT0gJ29yY2hlc3RyYXRvcicpID8/IG51bGwsIFthZ2VudHMuZGF0YV0pXG5cbiAgY29uc3QgY29tcHV0ZWRDdXJyZW50T3B0aW9uID0gY3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0ID8gb3B0aW9ucy5jaGF0IDogb3B0aW9ucy5ob21lXG4gIGNvbnN0IGlzQ2hhdFZpZXcgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdFxuICBjb25zdCBzZXNzaW9uTWV0YSA9IHVzZU1haWFDaGF0U2Vzc2lvbk1ldGEoaW5pdGlhbENoYXRJZClcbiAgY29uc3QgbGVnYWN5Q29udGV4dFNlc3Npb24gPSB1c2VNZW1vKFxuICAgICgpID0+IHJlc29sdmVMZWdhY3lDb250ZXh0U2Vzc2lvbihzZXNzaW9uTWV0YSwgaXNDaGF0VmlldyksXG4gICAgW2lzQ2hhdFZpZXcsIHNlc3Npb25NZXRhXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobGVnYWN5Q29udGV4dFNlc3Npb24gJiYgYWdlbnQgJiYgIWFnZW50LmlzX2xlZ2FjeV9jb250ZXh0KSB7XG4gICAgICBzZWxlY3RBZ2VudCh7IC4uLmFnZW50LCBpc19sZWdhY3lfY29udGV4dDogdHJ1ZSB9KVxuICAgIH1cbiAgfSwgW2xlZ2FjeUNvbnRleHRTZXNzaW9uLCBhZ2VudCwgc2VsZWN0QWdlbnRdKVxuXG4gIGNvbnN0IGhhbmRsZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCA9IHVzZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdCh7XG4gICAgc2Vzc2lvbk1ldGEsXG4gICAgYWdlbnRzOiBhZ2VudHMuZGF0YSxcbiAgICBzZWxlY3RBZ2VudCxcbiAgICBzZXRDbGllbnQsXG4gICAgc2V0UHJvamVjdCxcbiAgICBzZXRUYXNrLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBvblJlc2V0Q2hhdFNlc3Npb246ICgpID0+IHtcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEhhc0Vycm9yKGZhbHNlKVxuICAgIH0sXG4gICAgb25Hb1RvT3JjaGVzdHJhdG9ySG9tZTogKCkgPT4ge1xuICAgICAgc2V0SG9tZUxlYXZpbmcoZmFsc2UpXG4gICAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgfSxcbiAgfSlcblxuICBjb25zdCBkaWRJbml0QWdlbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRpZEluaXRBZ2VudFJlZi5jdXJyZW50IHx8ICFvcmNoZXN0cmF0b3IpIHJldHVyblxuICAgIGRpZEluaXRBZ2VudFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIHNlbGVjdEFnZW50KG9yY2hlc3RyYXRvcilcbiAgfSwgW29yY2hlc3RyYXRvciwgc2VsZWN0QWdlbnRdKVxuXG4gIGNvbnN0IGFnZW50c0ZldGNoZWRSZWYgPSB1c2VSZWYoZmFsc2UpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWFnZW50c0ZldGNoZWRSZWYuY3VycmVudCkge1xuICAgICAgYWdlbnRzRmV0Y2hlZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgaGFuZGxlR2V0QWdlbnRzKClcbiAgICB9XG4gIH0sIFtoYW5kbGVHZXRBZ2VudHNdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb25NZXJnZUNyZWF0ZWRBZ2VudCA9IChldnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCB7IGFnZW50OiBuZXh0QWdlbnQgfSA9IChldnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbCB8fCB7fVxuICAgICAgaWYgKG5leHRBZ2VudD8uaWQpIGFkZEFnZW50KG5leHRBZ2VudCwgeyBuYXZpZ2F0ZUhvbWU6IGZhbHNlIH0pXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtbWVyZ2UtY3JlYXRlZC1hZ2VudC1pbnRvLWxpc3QnLCBvbk1lcmdlQ3JlYXRlZEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW1lcmdlLWNyZWF0ZWQtYWdlbnQtaW50by1saXN0Jywgb25NZXJnZUNyZWF0ZWRBZ2VudClcbiAgfSwgW2FkZEFnZW50XSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9uU3luY0VkaXRlZEFnZW50ID0gKGV2dDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgYWdlbnQ6IG5leHRBZ2VudCB9ID0gKGV2dCBhcyBDdXN0b21FdmVudDx7IGFnZW50OiBBZ2VudCB9PikuZGV0YWlsIHx8IHt9XG4gICAgICBpZiAoIW5leHRBZ2VudD8uaWQpIHJldHVyblxuICAgICAgdXBkYXRlQWdlbnQobmV4dEFnZW50KVxuICAgICAgaWYgKGFnZW50Py5pZCA9PT0gbmV4dEFnZW50LmlkKSBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtc3luYy1lZGl0ZWQtYWdlbnQtZnJvbS1jaGF0Jywgb25TeW5jRWRpdGVkQWdlbnQpXG4gIH0sIFt1cGRhdGVBZ2VudCwgc2VsZWN0QWdlbnQsIGFnZW50Py5pZF0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBvcGVuQ2hhdFZpZXcgPSAoKSA9PiB7XG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5jaGF0KVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgfVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1jaGF0LXZpZXcnLCBvcGVuQ2hhdFZpZXcpXG4gICAgcmV0dXJuICgpID0+IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21haWEtb3Blbi1jaGF0LXZpZXcnLCBvcGVuQ2hhdFZpZXcpXG4gIH0sIFtdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgb3Blbk5ld0NoYXRXaXRoQWdlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBuZXh0QWdlbnQgPSAoZXZlbnQgYXMgQ3VzdG9tRXZlbnQ8eyBhZ2VudDogQWdlbnQgfT4pLmRldGFpbD8uYWdlbnRcbiAgICAgIGlmICghbmV4dEFnZW50KSByZXR1cm5cbiAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICBzZWxlY3RBZ2VudChuZXh0QWdlbnQpXG4gICAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEN1cnJlbnRPcHRpb24ob3B0aW9ucy5ob21lKVxuICAgIH1cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICAgIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYWlhLW9wZW4tbmV3LWNoYXQtd2l0aC1hZ2VudCcsIG9wZW5OZXdDaGF0V2l0aEFnZW50KVxuICB9LCBbc2VsZWN0QWdlbnQsIHNldENsaWVudCwgc2V0UHJvamVjdF0pXG5cbiAgY29uc3Qgc3RhcnRDaGF0ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgbWVzc2FnZT86IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBfbWVudGlvbnM/OiB1bmtub3duLFxuICAgICAgZnVhSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIHNldEluaXRpYWxDaGF0SWQobnVsbClcbiAgICAgIHNldE5ld0NoYXRLZXkocHJldiA9PiBwcmV2ICsgMSlcbiAgICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7XG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UgfHwgJycsXG4gICAgICAgIGF0dGFjaG1lbnRzOiBhdHRhY2htZW50cyB8fCBbXSxcbiAgICAgICAgLi4uKGZhcUlkID8geyBmYXFJZCB9IDoge30pLFxuICAgICAgICAuLi4oYWdlbnRTdWdnZXN0aW9uSWQgPyB7IGFnZW50U3VnZ2VzdGlvbklkIH0gOiB7fSksXG4gICAgICAgIC4uLihmdWFJZCA/IHsgZnVhSWQgfSA6IHt9KSxcbiAgICAgIH0pXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgc2lkZWJhckhhc0Vycm9yXVxuICApXG5cbiAgLy8gU2lkZWJhciB0eXBlcyB0aGlzIHByb3AgYXMgKGNoYXRJZDogc3RyaW5nKSBidXQgcGFzc2VzIHRoZSBmdWxsIGNoYXQgb2JqZWN0IGF0IHJ1bnRpbWVcbiAgY29uc3QgZ29Ub0NoYXQgPSB1c2VDYWxsYmFjayhcbiAgICAoY2hhdEFyZzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBjaGF0ID0gY2hhdEFyZyBhcyB1bmtub3duIGFzIENoYXRMaXN0SXRlbVxuICAgICAgc2V0VXNlckluaXRpYWxNZXNzYWdlKHsgbWVzc2FnZTogJycsIGF0dGFjaG1lbnRzOiBbXSB9KVxuICAgICAgc2V0SW5pdGlhbENoYXRJZChjaGF0LnNlc3Npb25FeHRlcm5hbElkKVxuICAgICAgY29uc3Qgc2VsZWN0ZWRBZ2VudCA9IGFnZW50cy5kYXRhLmZpbmQoYWdlbnRJdGVtID0+IGFnZW50SXRlbS5pZCA9PT0gY2hhdC5hZ2VudElkKVxuICAgICAgaWYgKHNlbGVjdGVkQWdlbnQpIHNlbGVjdEFnZW50KHNlbGVjdGVkQWdlbnQpXG4gICAgICBza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NoYXQtc2Vzc2lvbi1jaGFuZ2VkJykpXG4gICAgICBoYW5kbGVycy5jaGF0KClcbiAgICB9LFxuICAgIFtoYW5kbGVycywgYWdlbnRzLCBzZWxlY3RBZ2VudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbmRNZXNzYWdlUmVhZHkgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBzZW5kTWVzc2FnZTogKFxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgICAgZmFxSWQ/OiBzdHJpbmcsXG4gICAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nXG4gICAgICApID0+IHZvaWQsXG4gICAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICAgIHN0cmVhbWluZzogYm9vbGVhbixcbiAgICAgIHdyaXRpbmc6IGJvb2xlYW5cbiAgICApID0+IHtcbiAgICAgIHNldFNlbmRNZXNzYWdlRnVuY3Rpb24oKCkgPT4gc2VuZE1lc3NhZ2UpXG4gICAgICBzZXRTdG9wR2VuZXJhdGlvbkZ1bmN0aW9uKCgpID0+IHN0b3BHZW5lcmF0aW9uKVxuICAgICAgc2V0SXNTdHJlYW1pbmcoc3RyZWFtaW5nKVxuICAgICAgc2V0SXNXcml0aW5nKHdyaXRpbmcpXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiB1bmtub3duLFxuICAgICAgZnVhSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChzaWRlYmFySGFzRXJyb3IpIHNldFNpZGViYXJIYXNFcnJvcihmYWxzZSlcbiAgICAgIGlmIChzZW5kTWVzc2FnZUZ1bmN0aW9uICYmIGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0KSB7XG4gICAgICAgIHNlbmRNZXNzYWdlRnVuY3Rpb24obWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXJ0Q2hhdChtZXNzYWdlLCBhdHRhY2htZW50cywgZmFxSWQsIGFnZW50U3VnZ2VzdGlvbklkLCBtZW50aW9ucywgZnVhSWQpXG4gICAgICB9XG4gICAgfSxcbiAgICBbc2VuZE1lc3NhZ2VGdW5jdGlvbiwgc3RhcnRDaGF0LCBjb21wdXRlZEN1cnJlbnRPcHRpb24sIHNpZGViYXJIYXNFcnJvcl1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZUhvbWVMZWF2ZVN0YXJ0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNraXBDaGF0RW50ZXJSZWYuY3VycmVudCA9IHRydWVcbiAgICBzZXRIb21lTGVhdmluZyh0cnVlKVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVIb21lU2VuZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiB1bmtub3duLFxuICAgICAgZnVhSWQ/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIHNldEhvbWVMZWF2aW5nKGZhbHNlKVxuICAgICAgaGFuZGxlU2VuZE1lc3NhZ2UobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkKVxuICAgIH0sXG4gICAgW2hhbmRsZVNlbmRNZXNzYWdlXVxuICApXG5cbiAgY29uc3QgaGFuZGxlR29Ib21lID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhvbWVMZWF2aW5nKGZhbHNlKVxuICAgIHNraXBDaGF0RW50ZXJSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuY2hhdCkge1xuICAgICAgc2V0SW5pdGlhbENoYXRJZChudWxsKVxuICAgICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgICAgaWYgKGFnZW50Py5lbnRpdHkgIT09ICdjbGllbnQnKSBzZXRDbGllbnQ/LihudWxsKVxuICAgIH1cbiAgICBpZiAob3JjaGVzdHJhdG9yKSB7XG4gICAgICBzZWxlY3RBZ2VudChvcmNoZXN0cmF0b3IpXG4gICAgfSBlbHNlIGlmIChcbiAgICAgICghYWdlbnQgfHwgYWdlbnQ/LmlzX2RlbGV0ZWQgfHwgYWdlbnQ/Lmhhc19ub3RfcGVybWlzc2lvbnMgfHwgYWdlbnQ/Lmhhc19ub3RfYWNjZXNzIHx8IGFnZW50Py5wcm9qZWN0X2RlbGV0ZWQpICYmXG4gICAgICBhZ2VudHMuZGF0YS5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBzZWxlY3RBZ2VudChhZ2VudHMuZGF0YVswXSlcbiAgICB9XG4gICAgc2V0Q3VycmVudE9wdGlvbihvcHRpb25zLmhvbWUpXG4gICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgc2V0SGFzRXJyb3IoZmFsc2UpXG4gICAgaWYgKGlzV2ViU2VhcmNoQWN0aXZlKSB0b2dnbGVXZWJTZWFyY2goKVxuICAgIGlmIChyZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KSByZXNldFNlbGVjdGVkQ2hhdFJlZi5jdXJyZW50KClcbiAgfSwgW1xuICAgIGN1cnJlbnRPcHRpb24sXG4gICAgaXNXZWJTZWFyY2hBY3RpdmUsXG4gICAgdG9nZ2xlV2ViU2VhcmNoLFxuICAgIGFnZW50LFxuICAgIGFnZW50cyxcbiAgICBvcmNoZXN0cmF0b3IsXG4gICAgc2VsZWN0QWdlbnQsXG4gICAgc2V0Q2xpZW50LFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgXSlcblxuICBjb25zdCBoYW5kbGVSZXNldENoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0SG9tZUxlYXZpbmcoZmFsc2UpXG4gICAgc2tpcENoYXRFbnRlclJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBzZXRJbml0aWFsQ2hhdElkKG51bGwpXG4gICAgc2V0TmV3Q2hhdEtleShwcmV2ID0+IHByZXYgKyAxKVxuICAgIHNldFVzZXJJbml0aWFsTWVzc2FnZSh7IG1lc3NhZ2U6ICcnLCBhdHRhY2htZW50czogW10gfSlcbiAgICBzZXRDdXJyZW50T3B0aW9uKG9wdGlvbnMuaG9tZSlcbiAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICBzZXRIYXNFcnJvcihmYWxzZSlcbiAgICBpZiAoaXNXZWJTZWFyY2hBY3RpdmUpIHRvZ2dsZVdlYlNlYXJjaCgpXG4gICAgaWYgKHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQpIHJlc2V0U2VsZWN0ZWRDaGF0UmVmLmN1cnJlbnQoKVxuICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGF0LXNlc3Npb24tY2hhbmdlZCcpKVxuICB9LCBbaXNXZWJTZWFyY2hBY3RpdmUsIHRvZ2dsZVdlYlNlYXJjaCwgc2V0Q2hpcHNQcm9qZWN0XSlcblxuICBjb25zdCBmb2N1c0NoYXRJbnB1dCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnbWFpYS1pbnB1dC1yZWZvY3VzJykpXG4gICAgfSwgMTAwKVxuICB9LCBbXSlcblxuICBjb25zdCBoYW5kbGVTdGFydE5ld0NoYXQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZSkge1xuICAgICAgZm9jdXNDaGF0SW5wdXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChvcmNoZXN0cmF0b3IpIHNlbGVjdEFnZW50KG9yY2hlc3RyYXRvcilcbiAgICBoYW5kbGVHb0hvbWUoKVxuICAgIGZvY3VzQ2hhdElucHV0KClcbiAgfSwgW2N1cnJlbnRPcHRpb24sIGZvY3VzQ2hhdElucHV0LCBoYW5kbGVHb0hvbWUsIG9yY2hlc3RyYXRvciwgc2VsZWN0QWdlbnRdKVxuXG4gIGNvbnN0IG5vb3AgPSB1c2VDYWxsYmFjaygoKSA9PiB1bmRlZmluZWQsIFtdKVxuXG4gIGNvbnN0IGNhbkFjY2Vzc1BhZ2UgPSB2YWxpZGF0ZUFjY2Vzc0J5RmVhdHVyZShzZWN0aW9uKVxuICBjb25zdCBpc0hvbWUgPSBjb21wdXRlZEN1cnJlbnRPcHRpb24gPT09IG9wdGlvbnMuaG9tZVxuICBjb25zdCBzaG93Q2hhdEZvb3RlciA9IGNvbXB1dGVkQ3VycmVudE9wdGlvbiA9PT0gb3B0aW9ucy5jaGF0ICYmICFoYXNFcnJvciAmJiAhbG9hZGluZyAmJiBjYW5BY2Nlc3NQYWdlXG5cbiAgcmV0dXJuIChcbiAgICA8U0NQYWdlV3JhcHBlciBjbGFzc05hbWU9e2NsYXNzTmFtZX0+XG4gICAgICB7Y2FuQWNjZXNzUGFnZSA/IChcbiAgICAgICAgPFNpZGViYXJcbiAgICAgICAgICBjb252ZXJzYXRpb25zT25seVxuICAgICAgICAgIG9wZW49e3NpZGViYXJPcGVufVxuICAgICAgICAgIG9uT3BlbkNoYW5nZT17c2V0U2lkZWJhck9wZW59XG4gICAgICAgICAgb25Hb1RvQ2hhdD17Z29Ub0NoYXR9XG4gICAgICAgICAgb25FcnJvcj17KCkgPT4gc2V0U2lkZWJhckhhc0Vycm9yKHRydWUpfVxuICAgICAgICAgIGhhbmRsZUdvVG9Ib21lPXtoYW5kbGVHb0hvbWV9XG4gICAgICAgICAgaGFuZGxlU3RhcnROZXdDaGF0PXtoYW5kbGVTdGFydE5ld0NoYXR9XG4gICAgICAgICAgaGFuZGxlT3Blbk1hcmtldHBsYWNlPXtub29wfVxuICAgICAgICAgIGhhbmRsZU9wZW5Ta2lsbHM9e25vb3B9XG4gICAgICAgICAgc2hvd05ld0NoYXQ9e2ZhbHNlfVxuICAgICAgICAgIHJlZmV0Y2hDaGF0cz17cmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhbmRsZVNldFJlZmV0Y2hDaGF0cz17c2V0UmVmZXRjaENoYXRzfVxuICAgICAgICAgIGhhc0Vycm9yPXtzaWRlYmFySGFzRXJyb3J9XG4gICAgICAgICAgcmVzZXRTZWxlY3RlZENoYXRSZWY9e3Jlc2V0U2VsZWN0ZWRDaGF0UmVmfVxuICAgICAgICAgIGlzTGVnYWN5Q29udGV4dFNlc3Npb249eyEhbGVnYWN5Q29udGV4dFNlc3Npb259XG4gICAgICAgIC8+XG4gICAgICApIDogbnVsbH1cbiAgICAgIDxTQ1BhZ2VNYWluPlxuICAgICAgICA8Q2hhdEFJUGFnZUhlYWRlclxuICAgICAgICAgIG92ZXJsYXk9e2lzSG9tZSAmJiAhaG9tZUxlYXZpbmd9XG4gICAgICAgICAgc2hvd0JhY2s9eyFpc0hvbWV9XG4gICAgICAgICAgYWdlbnRzPXthZ2VudHMuZGF0YX1cbiAgICAgICAgICBsb2FkaW5nPXtsb2FkaW5nfVxuICAgICAgICAgIGxvYWRpbmdNb3JlPXtsb2FkaW5nTW9yZX1cbiAgICAgICAgICBoYXNNb3JlPXthZ2VudHMuaGFzX21vcmV9XG4gICAgICAgICAgbG9hZE1vcmVBZ2VudHM9e2xvYWRNb3JlQWdlbnRzfVxuICAgICAgICAgIHNvcnRBZ2VudHNMaXN0PXtzb3J0QWdlbnRzTGlzdH1cbiAgICAgICAgICBoYW5kbGVSZXNldENoYXQ9e2hhbmRsZVJlc2V0Q2hhdH1cbiAgICAgICAgICBvbkFnZW50VXBkYXRlPXt1cGRhdGVBZ2VudEZhdm9yaXRlfVxuICAgICAgICAvPlxuICAgICAgICB7aGFzRXJyb3IgPyAoXG4gICAgICAgICAgPE1BSUFFcnJvciAvPlxuICAgICAgICApIDogY2FuQWNjZXNzUGFnZSA/IChcbiAgICAgICAgICBpc0hvbWUgPyAoXG4gICAgICAgICAgICA8Q2hhdEFJUGFnZUhvbWUgb25TZW5kTWVzc2FnZT17aGFuZGxlSG9tZVNlbmRNZXNzYWdlfSBvbkxlYXZlU3RhcnQ9e2hhbmRsZUhvbWVMZWF2ZVN0YXJ0fSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8Q2hhdEFJQ29udGVudFxuICAgICAgICAgICAgICBjdXJyZW50T3B0aW9uPXtvcHRpb25zLmNoYXR9XG4gICAgICAgICAgICAgIGhhbmRsZXJzPXt7IC4uLmhhbmRsZXJzLCBjaGF0OiBzdGFydENoYXQsIGhvbWU6IGhhbmRsZXJzLmhvbWUsIGhhbmRsZUdvSG9tZSB9fVxuICAgICAgICAgICAgICBvbkVycm9yPXsoKSA9PiBzZXRIYXNFcnJvcih0cnVlKX1cbiAgICAgICAgICAgICAgcmVmcz17eyB1c2VySW5pdGlhbE1lc3NhZ2UsIGluaXRpYWxDaGF0SWQgfX1cbiAgICAgICAgICAgICAgb25TZW5kTWVzc2FnZVJlYWR5PXtoYW5kbGVTZW5kTWVzc2FnZVJlYWR5fVxuICAgICAgICAgICAgICBleHBhbmRlZD17ZXhwYW5kZWR9XG4gICAgICAgICAgICAgIGZsb2F0aW5nPXtmYWxzZX1cbiAgICAgICAgICAgICAgYWdlbnRzPXthZ2VudHMuZGF0YX1cbiAgICAgICAgICAgICAgbG9hZGluZ0FnZW50cz17bG9hZGluZ31cbiAgICAgICAgICAgICAgYWdlbnRFcnJvcj17YWdlbnRFcnJvcn1cbiAgICAgICAgICAgICAgc2tpcEVudGVyQW5pbWF0aW9uPXtza2lwQ2hhdEVudGVyUmVmLmN1cnJlbnR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8UHJvamVjdFN1bW1hcnlDb250ZW50IG9uUmVzdGFydFN1bW1hcnk9e2hhbmRsZXJzLmhvbWV9IC8+XG4gICAgICAgICl9XG4gICAgICAgIHtzaG93Q2hhdEZvb3RlciA/IChcbiAgICAgICAgICA8Q2hhdEFpTW9kYWxGb290ZXJcbiAgICAgICAgICAgIGFnZW50PXthZ2VudH1cbiAgICAgICAgICAgIGhhbmRsZVNlbmRNZXNzYWdlPXtoYW5kbGVTZW5kTWVzc2FnZX1cbiAgICAgICAgICAgIGhhbmRsZVN0b3BHZW5lcmF0aW9uPXtzdG9wR2VuZXJhdGlvbkZ1bmN0aW9ufVxuICAgICAgICAgICAgaXNTdHJlYW1pbmc9e2lzU3RyZWFtaW5nfVxuICAgICAgICAgICAgaXNXcml0aW5nPXtpc1dyaXRpbmd9XG4gICAgICAgICAgICBjaGF0SWQ9e2luaXRpYWxDaGF0SWR9XG4gICAgICAgICAgICBuZXdDaGF0S2V5PXtuZXdDaGF0S2V5fVxuICAgICAgICAgICAgbGF5b3V0TW9kZT17bGF5b3V0TW9kZX1cbiAgICAgICAgICAgIGxlZ2FjeUNvbnRleHRTZXNzaW9uPXtsZWdhY3lDb250ZXh0U2Vzc2lvbn1cbiAgICAgICAgICAgIG9uQ29udGludWVJbk5ld0NoYXQ9e2hhbmRsZUNvbnRpbnVlTGVnYWN5Q29udGV4dEluTmV3Q2hhdH1cbiAgICAgICAgICAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgIDwvU0NQYWdlTWFpbj5cbiAgICAgIHt1c2VySGFzUGVybWlzc2lvbnMgJiYgKFxuICAgICAgICA8QWJtQWdlbnRNb2RhbFxuICAgICAgICAgIGFkZEFnZW50PXthZGRBZ2VudH1cbiAgICAgICAgICB1cGRhdGVBZ2VudD17dXBkYXRlQWdlbnR9XG4gICAgICAgICAgcmVtb3ZlQWdlbnQ9e3JlbW92ZUFnZW50fVxuICAgICAgICAgIHVwZGF0ZUFnZW50RmF2b3JpdGU9e3VwZGF0ZUFnZW50RmF2b3JpdGV9XG4gICAgICAgICAgc2VsZWN0Rmlyc3RBZ2VudD17c2VsZWN0Rmlyc3RBZ2VudH1cbiAgICAgICAgLz5cbiAgICAgICl9XG4gICAgICA8U25hY2tiYXIgLz5cbiAgICA8L1NDUGFnZVdyYXBwZXI+XG4gIClcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNB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QUU1RixJQUFJLEVBQUVRLFFBQVEsQ0FBQ1IsSUFBSTtVQUFFb0MsWUFBWSxFQUFaQTtRQUFZLEVBQUc7UUFDOUU2RixPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBQTtVQUFBLE9BQVExSCxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQUEsQ0FBQztRQUNqQ3dJLElBQUksRUFBRTtVQUFFOUssa0JBQWtCLEVBQWxCQSxrQkFBa0I7VUFBRUksYUFBYSxFQUFiQTtRQUFjLENBQUU7UUFDNUMySyxrQkFBa0IsRUFBRXpDLHNCQUF1QjtRQUMzQzdFLFFBQVEsRUFBRUEsUUFBUztRQUNuQnVILFFBQVEsRUFBRSxLQUFNO1FBQ2hCNUcsTUFBTSxFQUFFQSxNQUFNLENBQUNvQixJQUFLO1FBQ3BCeUYsYUFBYSxFQUFFNUcsT0FBUTtRQUN2QkUsVUFBVSxFQUFFQSxVQUFXO1FBQ3ZCMkcsa0JBQWtCLEVBQUUxSCxnQkFBZ0IsQ0FBQzhDO01BQVEsQ0FDOUMsQ0FDRixnQkFFRDdKLElBQUEsQ0FBQ25CLHFCQUFxQjtRQUFDNlAsZ0JBQWdCLEVBQUU1SSxRQUFRLENBQUNSO01BQUssQ0FBRSxDQUMxRCxFQUNBNEgsY0FBYyxnQkFDYmxOLElBQUEsQ0FBQ2pCLGlCQUFpQjtRQUNoQm9JLEtBQUssRUFBRUEsS0FBTTtRQUNiK0UsaUJBQWlCLEVBQUVBLGlCQUFrQjtRQUNyQ3lDLG9CQUFvQixFQUFFcEssc0JBQXVCO1FBQzdDSSxXQUFXLEVBQUVBLFdBQVk7UUFDekJJLFNBQVMsRUFBRUEsU0FBVTtRQUNyQjZKLE1BQU0sRUFBRWpMLGFBQWM7UUFDdEJJLFVBQVUsRUFBRUEsVUFBVztRQUN2QnVDLFVBQVUsRUFBRUEsVUFBVztRQUN2QmlELG9CQUFvQixFQUFFQSxvQkFBcUI7UUFDM0NzRixtQkFBbUIsRUFBRXBGO01BQXFDLENBQzNELENBQUMsR0FDQSxJQUFJO0lBQUEsQ0FDRSxDQUFDLEVBQ1pqQixrQkFBa0IsaUJBQ2pCeEksSUFBQSxDQUFDbEIsYUFBYTtNQUNacUosUUFBUSxFQUFFQSxRQUFTO01BQ25CRSxXQUFXLEVBQUVBLFdBQVk7TUFDekJELFdBQVcsRUFBRUEsV0FBWTtNQUN6QkUsbUJBQW1CLEVBQUVBLG1CQUFvQjtNQUN6Q0MsZ0JBQWdCLEVBQUVBO0lBQWlCLENBQ3BDLENBQ0YsZUFDRHZJLElBQUEsQ0FBQ3BCLFFBQVEsSUFBRSxDQUFDO0VBQUEsQ0FDQyxDQUFDO0FBRXBCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=