@projectcor/maia-components 2.52.0 → 2.52.1-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 (430) hide show
  1. package/lib/App.js +44 -19
  2. package/lib/components/atoms/ActionableButton.spec.js +111 -0
  3. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +52 -0
  4. package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +11 -0
  5. package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.spec.js +63 -0
  6. package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +183 -0
  7. package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +123 -0
  8. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +3 -1
  9. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +139 -0
  10. package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +385 -0
  11. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.js +3 -1
  12. package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +78 -0
  13. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +94 -0
  14. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +24 -14
  15. package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +396 -0
  16. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.js +28 -10
  17. package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +80 -0
  18. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +526 -0
  19. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +19 -15
  20. package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +169 -0
  21. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +11 -0
  22. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.js +8 -4
  23. package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +77 -0
  24. package/lib/components/atoms/Backdrop/Backdrop.spec.js +28 -0
  25. package/lib/components/atoms/CardMenu/CardMenu.spec.js +56 -0
  26. package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +67 -0
  27. package/lib/components/atoms/Checkbox/Checkbox.spec.js +27 -0
  28. package/lib/components/atoms/Chip/Chip.spec.js +82 -0
  29. package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +26 -0
  30. package/lib/components/atoms/ClientSelector/ClientSelector.helpers.spec.js +45 -0
  31. package/lib/components/atoms/ClientSelector/ClientSelector.js +15 -13
  32. package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +133 -0
  33. package/lib/components/atoms/ContextCompactedNotice/ContextCompactedNotice.spec.js +107 -0
  34. package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +29 -0
  35. package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +46 -0
  36. package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +109 -0
  37. package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +81 -0
  38. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +92 -0
  39. package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +319 -0
  40. package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +107 -0
  41. package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +136 -0
  42. package/lib/components/atoms/CopyToClipboard.spec.js +74 -0
  43. package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +76 -0
  44. package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +86 -0
  45. package/lib/components/atoms/Expand/Expand.spec.js +57 -0
  46. package/lib/components/atoms/Fade/Fade.js +10 -6
  47. package/lib/components/atoms/Fade/Fade.spec.js +66 -0
  48. package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +75 -0
  49. package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +104 -0
  50. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +3 -1
  51. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +91 -0
  52. package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +19 -7
  53. package/lib/components/atoms/HelpButton.spec.js +87 -0
  54. package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +96 -0
  55. package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +54 -0
  56. package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +21 -0
  57. package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +20 -0
  58. package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +26 -0
  59. package/lib/components/atoms/LoadingText/LoadingText.spec.js +25 -0
  60. package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +42 -0
  61. package/lib/components/atoms/MAIAError/MAIAError.spec.js +27 -0
  62. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +3 -2
  63. package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.spec.js +113 -0
  64. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +3 -2
  65. package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +381 -0
  66. package/lib/components/atoms/MAIAInput/MAIAInput.js +123 -99
  67. package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +719 -0
  68. package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +92 -0
  69. package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +193 -0
  70. package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +32 -0
  71. package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +64 -0
  72. package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +43 -0
  73. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.js +9 -4
  74. package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +114 -0
  75. package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +51 -0
  76. package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +48 -0
  77. package/lib/components/atoms/ModalProject/ModalProject.spec.js +66 -0
  78. package/lib/components/atoms/NextPageLoader.spec.js +37 -0
  79. package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +20 -0
  80. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +35 -0
  81. package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +47 -0
  82. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.js +4 -5
  83. package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +146 -0
  84. package/lib/components/atoms/PrimaryButton.spec.js +42 -0
  85. package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +69 -0
  86. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +7 -2
  87. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +69 -0
  88. package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +41 -24
  89. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +25 -10
  90. package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +59 -0
  91. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +78 -43
  92. package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +170 -0
  93. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +9 -11
  94. package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +199 -0
  95. package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +70 -0
  96. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +37 -15
  97. package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +120 -0
  98. package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +8 -0
  99. package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +31 -0
  100. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +52 -0
  101. package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +90 -0
  102. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +29 -0
  103. package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +38 -0
  104. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +16 -0
  105. package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +107 -0
  106. package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +24 -0
  107. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.spec.js +71 -0
  108. package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +120 -0
  109. package/lib/components/atoms/Switch/Switch.spec.js +41 -0
  110. package/lib/components/atoms/TextArea/CustomTextArea.spec.js +52 -0
  111. package/lib/components/atoms/TextArea/TextArea.helpers.spec.js +25 -0
  112. package/lib/components/atoms/TextArea/TextArea.spec.js +126 -0
  113. package/lib/components/atoms/ThirdButton.spec.js +29 -0
  114. package/lib/components/atoms/VideoModal/VideoModal.spec.js +68 -0
  115. package/lib/components/atoms/WithAppCfg.spec.js +82 -0
  116. package/lib/components/index.js +2 -1
  117. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +53 -0
  118. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +3 -2
  119. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +780 -0
  120. package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +107 -0
  121. package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +256 -0
  122. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +6 -4
  123. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +175 -0
  124. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +25 -16
  125. package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +318 -0
  126. package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +50 -0
  127. package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +94 -0
  128. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +83 -0
  129. package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +30 -0
  130. package/lib/components/molecules/AgentInputBlock/index.js +5 -0
  131. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +52 -0
  132. package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +76 -0
  133. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +20 -0
  134. package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +34 -0
  135. package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +36 -0
  136. package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +66 -0
  137. package/lib/components/molecules/ChatAIContent/ChatAIContent.js +7 -3
  138. package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +145 -0
  139. package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +204 -0
  140. package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.spec.js +622 -0
  141. package/lib/components/molecules/ChatAIHome/ChatAIHome.js +93 -72
  142. package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +264 -0
  143. package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +86 -0
  144. package/lib/components/molecules/ChatAIHome/styles.js +85 -78
  145. package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +104 -0
  146. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +967 -0
  147. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +30 -14
  148. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +646 -0
  149. package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +46 -0
  150. package/lib/components/molecules/ChatAIMessages/newStyles.js +32 -35
  151. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +8 -1
  152. package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +1395 -0
  153. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +23 -8
  154. package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +1434 -0
  155. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
  156. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +33 -0
  157. package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +116 -0
  158. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +15 -153
  159. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +134 -0
  160. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +2 -26
  161. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +142 -0
  162. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +63 -367
  163. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +241 -0
  164. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.js +69 -0
  165. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.utils.spec.js +144 -0
  166. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentDropdown.js +95 -0
  167. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderAgentSelector.js +174 -0
  168. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.js +99 -0
  169. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeaderLayoutMenu.spec.js +65 -0
  170. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +37 -0
  171. package/lib/components/molecules/ChatAIModal/constants.spec.js +16 -0
  172. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +22 -0
  173. package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +67 -0
  174. package/lib/components/molecules/ChatAIModal/layout.spec.js +72 -0
  175. package/lib/components/molecules/ChatAIMultipleChoice/ChatAIMultipleChoice.spec.js +102 -0
  176. package/lib/components/molecules/ChatAIMultipleChoice/ChatAIMultipleChoiceAnswer.spec.js +49 -0
  177. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.spec.js +93 -0
  178. package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +297 -0
  179. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.spec.js +62 -0
  180. package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +221 -0
  181. package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +66 -0
  182. package/lib/components/molecules/ChatFooter/ChatFooter.js +10 -4
  183. package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +548 -0
  184. package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +10 -0
  185. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +104 -0
  186. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.js +5 -2
  187. package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +139 -0
  188. package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +84 -0
  189. package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +116 -0
  190. package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +126 -0
  191. package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +115 -0
  192. package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +79 -0
  193. package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +37 -0
  194. package/lib/components/molecules/Sidebar/Sidebar.helpers.spec.js +119 -0
  195. package/lib/components/molecules/Sidebar/Sidebar.js +41 -23
  196. package/lib/components/molecules/Sidebar/Sidebar.spec.js +526 -0
  197. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +1067 -0
  198. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +2 -2
  199. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +1236 -0
  200. package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +112 -0
  201. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.spec.js +77 -0
  202. package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +503 -0
  203. package/lib/components/organisms/ChatAI/ChatAI.spec.js +217 -0
  204. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +525 -0
  205. package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +246 -0
  206. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +16 -0
  207. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +253 -0
  208. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +291 -0
  209. package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +13 -0
  210. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +284 -0
  211. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +343 -0
  212. package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +197 -0
  213. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +94 -0
  214. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +69 -0
  215. package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +38 -0
  216. package/lib/components/organisms/ChatAIPage/getDaypart.js +9 -0
  217. package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +19 -0
  218. package/lib/components/organisms/ChatAIPage/index.js +3 -0
  219. package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +53 -0
  220. package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +59 -0
  221. package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +79 -0
  222. package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +86 -0
  223. package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +49 -0
  224. package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +67 -0
  225. package/lib/components/organisms/ProjectSummary/ProjectSummary.js +11 -7
  226. package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +117 -0
  227. package/lib/components/organisms/SnackBar/Snackbar.spec.js +66 -0
  228. package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +19 -0
  229. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.js +4 -1
  230. package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +52 -0
  231. package/lib/constants/formatExtensions.spec.js +15 -0
  232. package/lib/constants/maiaExternalConnectorsAccess.spec.js +29 -0
  233. package/lib/constants/maiaFeatureAccess.spec.js +30 -0
  234. package/lib/constants/maiaHourAgentAccess.spec.js +30 -0
  235. package/lib/constants/maiaTaskPanelAccess.spec.js +41 -0
  236. package/lib/constants/permissions/clientRoleAccess.spec.js +65 -0
  237. package/lib/constants/permissions/index.js +2 -2
  238. package/lib/constants/permissions/utils.js +4 -1
  239. package/lib/constants/permissions/utils.spec.js +128 -0
  240. package/lib/constants/plannerSyncEvents.spec.js +31 -0
  241. package/lib/constants/taskUrls.spec.js +9 -0
  242. package/lib/dev/DevMaiaPage.js +30 -0
  243. package/lib/dev/DevReasoningTimeline.js +68 -37
  244. package/lib/dev/Providers.js +5 -3
  245. package/lib/hooks/frequentlyUsedActionsCache.js +17 -0
  246. package/lib/hooks/frequentlyUsedActionsCache.spec.js +25 -0
  247. package/lib/hooks/useAccessClient/useAccessClient.spec.js +149 -0
  248. package/lib/hooks/useAgentModel/useAgentModel.spec.js +83 -0
  249. package/lib/hooks/useAgentModel/useCreateAgent.helpers.spec.js +268 -0
  250. package/lib/hooks/useAgentModel/useCreateAgent.spec.js +314 -0
  251. package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +183 -0
  252. package/lib/hooks/useAgentModel/useUpdateAgent.js +7 -6
  253. package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +374 -0
  254. package/lib/hooks/useAgentSuggestions.spec.js +89 -0
  255. package/lib/hooks/useCaretPosition.spec.js +58 -0
  256. package/lib/hooks/useChatManager/useChatManager.helpers.js +3 -3
  257. package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +2027 -0
  258. package/lib/hooks/useChatManager/useChatManager.js +8 -7
  259. package/lib/hooks/useChatManager/useChatManager.spec.js +2467 -0
  260. package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +491 -0
  261. package/lib/hooks/useChatMessages/useChatMessages.spec.js +729 -0
  262. package/lib/hooks/useChats/useChats.spec.js +208 -0
  263. package/lib/hooks/useClientSearch.helpers.spec.js +52 -0
  264. package/lib/hooks/useClientSearch.spec.js +86 -0
  265. package/lib/hooks/useContextMentions.helpers.spec.js +267 -0
  266. package/lib/hooks/useContextMentions.spec.js +338 -0
  267. package/lib/hooks/useContextPinPopover.helpers.spec.js +183 -0
  268. package/lib/hooks/useContextPinPopover.spec.js +159 -0
  269. package/lib/hooks/useContinueLegacyContextInNewChat/index.js +2 -0
  270. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +93 -0
  271. package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.spec.js +257 -0
  272. package/lib/hooks/useDebounce.spec.js +42 -0
  273. package/lib/hooks/useEntitySearch.helpers.spec.js +723 -0
  274. package/lib/hooks/useEntitySearch.js +3 -1
  275. package/lib/hooks/useEntitySearch.spec.js +718 -0
  276. package/lib/hooks/useEvent.spec.js +45 -0
  277. package/lib/hooks/useFrequentlyAskedQuestions.spec.js +222 -0
  278. package/lib/hooks/useFrequentlyUsedActions.js +61 -22
  279. package/lib/hooks/useFrequentlyUsedActions.spec.js +293 -0
  280. package/lib/hooks/useIsMaiaPageRoute.spec.js +26 -0
  281. package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +122 -0
  282. package/lib/hooks/useKnowledge/downloadKnowledge.js +4 -4
  283. package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +148 -0
  284. package/lib/hooks/useKnowledge/saveKnowledge.spec.js +104 -0
  285. package/lib/hooks/useKnowledge/useKnowledgeOperations.js +16 -15
  286. package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +178 -0
  287. package/lib/hooks/useLatestRef.spec.js +50 -0
  288. package/lib/hooks/useMaiaChatSessionMeta/index.js +2 -0
  289. package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +24 -0
  290. package/lib/hooks/useMentionAllowedTypes.spec.js +89 -0
  291. package/lib/hooks/useMentionPopover.helpers.spec.js +100 -0
  292. package/lib/hooks/useMentionPopover.spec.js +392 -0
  293. package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +176 -0
  294. package/lib/hooks/useMinimizedPillBottomOffset.spec.js +89 -0
  295. package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +67 -0
  296. package/lib/hooks/useModal/useModal.spec.js +73 -0
  297. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.spec.js +138 -0
  298. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +485 -0
  299. package/lib/hooks/useProjectSearch.helpers.spec.js +89 -0
  300. package/lib/hooks/useProjectSearch.spec.js +91 -0
  301. package/lib/hooks/useProjectSummary.spec.js +193 -0
  302. package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +151 -0
  303. package/lib/hooks/useProjectSummaryConfig.js +10 -5
  304. package/lib/hooks/useProjectSummaryConfig.spec.js +133 -0
  305. package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +112 -0
  306. package/lib/hooks/useRecentClientsSearch.helpers.spec.js +33 -0
  307. package/lib/hooks/useRecentClientsSearch.spec.js +85 -0
  308. package/lib/hooks/useRecentContexts.spec.js +139 -0
  309. package/lib/hooks/useResize.spec.js +37 -0
  310. package/lib/hooks/useSkillsCatalog.spec.js +88 -0
  311. package/lib/hooks/useSlashCommands.spec.js +139 -0
  312. package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +101 -0
  313. package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +33 -0
  314. package/lib/hooks/useStreamResponse.spec.js +199 -0
  315. package/lib/hooks/useT.spec.js +20 -0
  316. package/lib/hooks/useToggle.spec.js +33 -0
  317. package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +171 -0
  318. package/lib/index.js +5 -2
  319. package/lib/lang/br/index.js +26 -1
  320. package/lib/lang/en/index.js +26 -1
  321. package/lib/lang/es/index.js +26 -1
  322. package/lib/lang/fr/index.js +26 -1
  323. package/lib/services/appcues.spec.js +37 -0
  324. package/lib/services/maia/Access/updateAccess.spec.js +137 -0
  325. package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
  326. package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +121 -0
  327. package/lib/services/maia/Actions/getSlashCommands.spec.js +91 -0
  328. package/lib/services/maia/Agents/connectors.js +3 -1
  329. package/lib/services/maia/Agents/connectors.spec.js +496 -0
  330. package/lib/services/maia/Agents/createAgent.spec.js +55 -0
  331. package/lib/services/maia/Agents/deleteAgent.spec.js +57 -0
  332. package/lib/services/maia/Agents/fetchAgentDetail.spec.js +108 -0
  333. package/lib/services/maia/Agents/getAgentById.spec.js +190 -0
  334. package/lib/services/maia/Agents/getAgentModels.spec.js +190 -0
  335. package/lib/services/maia/Agents/getAgentSuggestions.spec.js +89 -0
  336. package/lib/services/maia/Agents/getAgents.helpers.spec.js +325 -0
  337. package/lib/services/maia/Agents/getAgents.spec.js +1135 -0
  338. package/lib/services/maia/Agents/setAgentToolGroups.spec.js +45 -0
  339. package/lib/services/maia/Agents/toggleFavorite.spec.js +59 -0
  340. package/lib/services/maia/Agents/updateAgent.spec.js +48 -0
  341. package/lib/services/maia/Chats/deleteChat.spec.js +31 -0
  342. package/lib/services/maia/Chats/getChatMessages.spec.js +150 -0
  343. package/lib/services/maia/Chats/getChatsByUserId.spec.js +181 -0
  344. package/lib/services/maia/Chats/markSessionAsRead.spec.js +30 -0
  345. package/lib/services/maia/Chats/patchChat.spec.js +41 -0
  346. package/lib/services/maia/Chats/wasHelpfulChat.spec.js +28 -0
  347. package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +58 -0
  348. package/lib/services/maia/Knowledge/delete.spec.js +45 -0
  349. package/lib/services/maia/Knowledge/download.spec.js +78 -0
  350. package/lib/services/maia/Knowledge/save.spec.js +58 -0
  351. package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +261 -0
  352. package/lib/services/maia/Orchestrator/orchestrator.spec.js +181 -0
  353. package/lib/services/maia/RecentClients/getRecentClients.spec.js +52 -0
  354. package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +103 -0
  355. package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +82 -0
  356. package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +63 -0
  357. package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +82 -0
  358. package/lib/services/maia/Skills/createSkill.spec.js +68 -0
  359. package/lib/services/maia/Skills/deleteSkill.spec.js +42 -0
  360. package/lib/services/maia/Skills/generateSkill.spec.js +48 -0
  361. package/lib/services/maia/Skills/getSkills.spec.js +152 -0
  362. package/lib/services/maia/Skills/updateSkill.spec.js +62 -0
  363. package/lib/services/maia/client.spec.js +56 -0
  364. package/lib/services/utils/fetchCOR.spec.js +211 -0
  365. package/lib/services/utils/getCookie.spec.js +20 -0
  366. package/lib/services/utils/mapChatMessages.helpers.spec.js +336 -0
  367. package/lib/services/utils/mapChatMessages.multipleChoice.spec.js +87 -0
  368. package/lib/services/utils/mapChatMessages.spec.js +254 -0
  369. package/lib/store/chatsSidebarOptimistic.spec.js +145 -0
  370. package/lib/store/maiaLastChatPersistence.spec.js +22 -0
  371. package/lib/store/maiaPanelSessionPersistence.spec.js +62 -0
  372. package/lib/store/sessions/sessionNotificationSound.spec.js +145 -0
  373. package/lib/store/sessions/sessionNotifications.helpers.spec.js +63 -0
  374. package/lib/store/sessions/sessionNotifications.spec.js +106 -0
  375. package/lib/store/sessions/sessionStreamManager.helpers.spec.js +177 -0
  376. package/lib/store/sessions/sessionStreamManager.js +51 -55
  377. package/lib/store/sessions/sessionStreamManager.spec.js +939 -0
  378. package/lib/store/sessions/sessions.types.spec.js +16 -0
  379. package/lib/store/sessions/useSessionsStore.spec.js +135 -0
  380. package/lib/store/useChatsStore.js +4 -3
  381. package/lib/store/useChatsStore.spec.js +690 -0
  382. package/lib/store/useFaqsStore.spec.js +57 -0
  383. package/lib/store/useMultipleChoiceStore.spec.js +44 -0
  384. package/lib/styles/cascade.js +29 -3
  385. package/lib/styles/transitions.js +3 -1
  386. package/lib/types/global.d.js +1 -1
  387. package/lib/utils/actionCategoryMap.spec.js +18 -0
  388. package/lib/utils/agentDisplayName.spec.js +48 -0
  389. package/lib/utils/autoApproveStorage.spec.js +25 -0
  390. package/lib/utils/chatInputFiles.spec.js +39 -0
  391. package/lib/utils/contextMentionIcons.spec.js +41 -0
  392. package/lib/utils/contextMentionLabel.spec.js +13 -0
  393. package/lib/utils/contextMentionTriggers.spec.js +44 -0
  394. package/lib/utils/contextMentionTypeLabel.spec.js +14 -0
  395. package/lib/utils/corConnectorMentionTypes.spec.js +23 -0
  396. package/lib/utils/entityLinkRender.spec.js +72 -0
  397. package/lib/utils/fileDownloadHelper.spec.js +67 -0
  398. package/lib/utils/formatQuickActionMessage.spec.js +27 -0
  399. package/lib/utils/formatUnreadCount.spec.js +12 -0
  400. package/lib/utils/getUnitFileSize.spec.js +18 -0
  401. package/lib/utils/hitlAnalytics.spec.js +136 -0
  402. package/lib/utils/hoursPlannerQuickActionType.js +116 -1
  403. package/lib/utils/hoursPlannerQuickActionType.spec.js +124 -0
  404. package/lib/utils/imagePreprocessor.helpers.spec.js +28 -0
  405. package/lib/utils/imagePreprocessor.js +14 -3
  406. package/lib/utils/imagePreprocessor.spec.js +112 -0
  407. package/lib/utils/maiaPageRoute.spec.js +23 -0
  408. package/lib/utils/mapBackendLang.spec.js +19 -0
  409. package/lib/utils/navigateContextEntity.js +2 -2
  410. package/lib/utils/navigateContextEntity.spec.js +50 -0
  411. package/lib/utils/normalizeAgentConnectors.spec.js +98 -0
  412. package/lib/utils/openTaskInCorPanel.js +2 -2
  413. package/lib/utils/openTaskInCorPanel.spec.js +43 -0
  414. package/lib/utils/orchestratorSubagents.spec.js +32 -0
  415. package/lib/utils/reasoningMappers.spec.js +103 -0
  416. package/lib/utils/recentContextsHomeLimit.spec.js +32 -0
  417. package/lib/utils/renderContextMentions.helpers.spec.js +87 -0
  418. package/lib/utils/renderContextMentions.spec.js +268 -0
  419. package/lib/utils/retryCompletion.spec.js +181 -0
  420. package/lib/utils/skillContentSize.spec.js +13 -0
  421. package/lib/utils/slashCommandMarker.spec.js +43 -0
  422. package/lib/utils/sortManagerHoursHomeFuas.spec.js +51 -0
  423. package/lib/utils/sseStreamContent.spec.js +31 -0
  424. package/lib/utils/streamActivityMessages.helpers.js +5 -4
  425. package/lib/utils/streamActivityMessages.helpers.spec.js +84 -0
  426. package/lib/utils/streamActivityMessages.js +32 -20
  427. package/lib/utils/streamActivityMessages.spec.js +336 -0
  428. package/lib/utils/validateTrimmedFields.spec.js +26 -0
  429. package/package.json +1 -1
  430. package/README.md +0 -2
@@ -0,0 +1,967 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
2
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
3
+ var _excluded = ["multipleChoiceAnswer"];
4
+ 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; }
5
+ 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; }
6
+ import { Feedback } from '../MessageFeedback/MessageFeedback';
7
+ import { ChatHistoryRole } from '../../../types/Chat';
8
+ import { canOpenAttachmentPreview, canRetryAssistantMessage, computeDistanceFromBottom, computeRemovableTurnSpace, computeReservedTurnSpace, computeSyncedTurnSpacerHeight, computeTurnScrollDurationMs, computeTurnScrollTargetTop, countUserMessageAttachments, easeOutExpoScrollProgress, extractFeedbackSessionId, findLastQuestionId, hasInitialUserMessageInList, hasMessageLevelStreamIndicator, isActiveStreamingState, isAnswerOrQuestionChatMessageId, isApprovalChatMessage, isAssistantChatMessage, isAudioAttachment, isContainerAtScrollBottom, isCurrentUserMessage, isNearScrollBottom, isNewChatMessageEvent, isRetrySuggestionSelection, isScrollingUpward, resolveAttachmentDownloadBlobStrategy, resolveAttachmentDownloadFileName, resolveAttachmentDownloadUrl, resolveChatListItemStreamingFlags, resolveDisableFeedbackFromWasHelpful, resolveMessageAttachments, resolveRetryAttachmentsFromUserMessage, resolveScrollNearBottomThreshold, shouldAutoScrollOnMessagesChange, shouldDrainTurnSpaceOnScroll, shouldHideAssistantSuggestions, shouldHideEmptyStreamingBody, extractMultipleChoiceQuestion, isSamePendingMultipleChoice, resolvePendingMultipleChoice, resolveAnsweredMultipleChoices, resolveTurnAnchorId, shouldIgnoreSuggestionClick, shouldOpenMessageOption, shouldPersistMaiaPanelScroll, shouldReleaseTurnSpace, shouldRenderAssistantFeedback, shouldRenderAssistantSuggestions, shouldRenderChangeProjectMessage, shouldRenderCreateAgentActions, shouldRenderMessageTextBody, shouldRunStreamTurnSyncEffect, shouldShowApprovalActions, shouldShowBottomScrollGradient, shouldShowGlobalStreamLoadingIndicator, shouldShowMessageAttachmentsRow, shouldShowScrollToBottom, shouldShowStreamActivityIndicator, shouldShowStreamingMessageBody, shouldShowTopScrollGradient, shouldSkipEmptyChatListMessage, shouldSkipTurnScrollAnimation, shouldSkipTurnSpaceReservation, shouldUpdateSpacerHeight, turnAnchorOffset, buildSmoothStreamTextOptions, computeMeasureTurnLayout, detectJustFinishedLoadingMessages, processChatMessagesScrollFrame, readSmoothStreamWindowFlags, resolveContainerAtBottom, resolveStreamingMessageHookId, resolveCreateAgentActionsAgentId, resolveLastUserMessageForAttachments, resolveFeedbackPropsForCancelled, resolveReserveTurnSpacePlan, resolveScrollToBottomTargetTop, resolveMessageListItemKey, resolvePendingScrollTopFromSession, resolveReasoningTraceHookId, resolveScrollOnParentMode, resolveStreamingRawText, resolveStreamingTextHookId, resolveSuggestionAnalyticsAgentType, shouldApplyPendingScrollRestore, shouldClearLastReservedQuestion, shouldClearScrollRestoreWithoutChat, shouldInitializeChat, shouldRenderMentionInlineNodes, shouldRestoreScrollOnExpandedChange, shouldRunSessionCacheScrollToBottom, shouldScheduleTurnSpaceReservation, shouldScrollToBottomAfterLoad, shouldSkipMessagesScrollEffect, shouldUpdateScrollAffordancesOnLoadEnd } from './ChatAIMessages.helpers';
9
+ describe('ChatAIMessages.helpers', function () {
10
+ describe('turnAnchorOffset', function () {
11
+ it('caps the offset at 200px', function () {
12
+ expect(turnAnchorOffset(500)).toBe(90);
13
+ expect(turnAnchorOffset(2000)).toBe(200);
14
+ });
15
+ });
16
+ describe('computeTurnScrollDurationMs', function () {
17
+ it('scales duration with scroll distance', function () {
18
+ expect(computeTurnScrollDurationMs(0)).toBe(600);
19
+ expect(computeTurnScrollDurationMs(1200)).toBe(800);
20
+ });
21
+ });
22
+ describe('scroll affordances', function () {
23
+ it('computes distance from bottom excluding spacer height', function () {
24
+ expect(computeDistanceFromBottom(1000, 200, 300, 400)).toBe(100);
25
+ });
26
+ it('shows the scroll button only when far enough from the bottom', function () {
27
+ expect(shouldShowScrollToBottom(60)).toBe(true);
28
+ expect(shouldShowScrollToBottom(20)).toBe(false);
29
+ });
30
+ it('toggles top and bottom scroll gradients past the threshold', function () {
31
+ expect(shouldShowTopScrollGradient(0)).toBe(false);
32
+ expect(shouldShowTopScrollGradient(2)).toBe(true);
33
+ expect(shouldShowBottomScrollGradient(0)).toBe(false);
34
+ expect(shouldShowBottomScrollGradient(5)).toBe(true);
35
+ });
36
+ it('detects upward scroll and near-bottom with adaptive threshold', function () {
37
+ expect(isScrollingUpward(10, 20)).toBe(true);
38
+ expect(isNearScrollBottom(500, 400, 100, 50)).toBe(true);
39
+ expect(resolveScrollNearBottomThreshold(39, true, false)).toBe(15);
40
+ expect(resolveScrollNearBottomThreshold(15, false, true)).toBe(39);
41
+ expect(resolveScrollNearBottomThreshold(25, false, false)).toBe(25);
42
+ });
43
+ it('skips tiny turn scroll animations and eases progress', function () {
44
+ expect(shouldSkipTurnScrollAnimation(0.5)).toBe(true);
45
+ expect(shouldSkipTurnScrollAnimation(10)).toBe(false);
46
+ expect(easeOutExpoScrollProgress(1)).toBe(1);
47
+ expect(easeOutExpoScrollProgress(0)).toBe(0);
48
+ });
49
+ it('computes turn scroll targets and reservation skips', function () {
50
+ expect(computeTurnScrollTargetTop(300, 500)).toBe(210);
51
+ expect(shouldSkipTurnSpaceReservation(100, 50)).toBe(true);
52
+ expect(shouldSkipTurnSpaceReservation(50, 100)).toBe(false);
53
+ });
54
+ it('updates spacer height only when the delta is meaningful', function () {
55
+ expect(shouldUpdateSpacerHeight(100, 100.5)).toBe(false);
56
+ expect(shouldUpdateSpacerHeight(100, 102)).toBe(true);
57
+ });
58
+ it('syncs turn spacer height without growing reserved space', function () {
59
+ expect(computeSyncedTurnSpacerHeight(800, 600, 200)).toBe(56);
60
+ expect(computeSyncedTurnSpacerHeight(800, 600, 40)).toBe(40);
61
+ });
62
+ it('drains or releases turn space based on anchor state', function () {
63
+ expect(shouldDrainTurnSpaceOnScroll(null)).toBe(true);
64
+ expect(shouldDrainTurnSpaceOnScroll('question-1')).toBe(false);
65
+ expect(shouldReleaseTurnSpace(null, 0)).toBe(false);
66
+ expect(shouldReleaseTurnSpace('question-1', 0)).toBe(true);
67
+ expect(shouldReleaseTurnSpace(null, 50)).toBe(true);
68
+ });
69
+ it('persists panel scroll only for active sessions scrolled away from top', function () {
70
+ expect(shouldPersistMaiaPanelScroll('chat-1', 10)).toBe(true);
71
+ expect(shouldPersistMaiaPanelScroll('chat-1', 0)).toBe(false);
72
+ expect(shouldPersistMaiaPanelScroll(null, 10)).toBe(false);
73
+ });
74
+ it('detects bottom alignment with tolerance', function () {
75
+ expect(isContainerAtScrollBottom(1000, 900, 100)).toBe(true);
76
+ expect(isContainerAtScrollBottom(1000, 700, 100)).toBe(false);
77
+ });
78
+ });
79
+ describe('message list scroll decisions', function () {
80
+ it('detects new message events', function () {
81
+ expect(isNewChatMessageEvent('a', 'a', 3, 3)).toBe(false);
82
+ expect(isNewChatMessageEvent('b', 'a', 3, 3)).toBe(true);
83
+ expect(isNewChatMessageEvent('a', 'a', 4, 3)).toBe(true);
84
+ });
85
+ it('classifies approval and answer/question ids', function () {
86
+ expect(isApprovalChatMessage({
87
+ id: 'approval-1'
88
+ })).toBe(true);
89
+ expect(isApprovalChatMessage({
90
+ id: 'answer-1',
91
+ approval: {}
92
+ })).toBe(true);
93
+ expect(isApprovalChatMessage({
94
+ id: 'answer-1'
95
+ })).toBe(false);
96
+ expect(isAnswerOrQuestionChatMessageId('question-9')).toBe(true);
97
+ expect(isAnswerOrQuestionChatMessageId('other')).toBe(false);
98
+ });
99
+ it('finds the initial user message marker', function () {
100
+ expect(hasInitialUserMessageInList([{
101
+ id: 'user-initial-message'
102
+ }])).toBe(true);
103
+ expect(hasInitialUserMessageInList([{
104
+ id: 'question-1'
105
+ }])).toBe(false);
106
+ });
107
+ it('returns scroll, sync-turn or affordances-only', function () {
108
+ expect(shouldAutoScrollOnMessagesChange({
109
+ isNewMessage: false,
110
+ anchoredTurnId: null,
111
+ waitingResponse: false,
112
+ isWriting: false,
113
+ isAtBottom: true,
114
+ isAnswerOrQuestion: true,
115
+ isApproval: false,
116
+ hasInitialMessage: false,
117
+ messagesLength: 2,
118
+ prevMessagesLength: 2
119
+ })).toBe('affordances-only');
120
+ expect(shouldAutoScrollOnMessagesChange({
121
+ isNewMessage: true,
122
+ anchoredTurnId: 'question-1',
123
+ waitingResponse: false,
124
+ isWriting: false,
125
+ isAtBottom: false,
126
+ isAnswerOrQuestion: false,
127
+ isApproval: false,
128
+ hasInitialMessage: false,
129
+ messagesLength: 3,
130
+ prevMessagesLength: 2
131
+ })).toBe('sync-turn');
132
+ expect(shouldAutoScrollOnMessagesChange({
133
+ isNewMessage: true,
134
+ anchoredTurnId: null,
135
+ waitingResponse: true,
136
+ isWriting: false,
137
+ isAtBottom: true,
138
+ isAnswerOrQuestion: true,
139
+ isApproval: false,
140
+ hasInitialMessage: false,
141
+ messagesLength: 3,
142
+ prevMessagesLength: 2
143
+ })).toBe('affordances-only');
144
+ expect(shouldAutoScrollOnMessagesChange({
145
+ isNewMessage: true,
146
+ anchoredTurnId: null,
147
+ waitingResponse: false,
148
+ isWriting: false,
149
+ isAtBottom: true,
150
+ isAnswerOrQuestion: true,
151
+ isApproval: false,
152
+ hasInitialMessage: false,
153
+ messagesLength: 3,
154
+ prevMessagesLength: 2
155
+ })).toBe('scroll');
156
+ expect(shouldAutoScrollOnMessagesChange({
157
+ isNewMessage: true,
158
+ anchoredTurnId: null,
159
+ waitingResponse: false,
160
+ isWriting: false,
161
+ isAtBottom: false,
162
+ isAnswerOrQuestion: false,
163
+ isApproval: false,
164
+ hasInitialMessage: false,
165
+ messagesLength: 4,
166
+ prevMessagesLength: 3
167
+ })).toBe('scroll');
168
+ });
169
+ it('controls stream sync and global loading indicators', function () {
170
+ expect(shouldRunStreamTurnSyncEffect(false, false)).toBe(false);
171
+ expect(shouldRunStreamTurnSyncEffect(true, false)).toBe(true);
172
+ expect(hasMessageLevelStreamIndicator('answer-turn-1-streaming', true, false)).toBe(true);
173
+ expect(hasMessageLevelStreamIndicator('answer-1', true, false)).toBe(false);
174
+ expect(shouldShowGlobalStreamLoadingIndicator(false, {
175
+ type: 'writing'
176
+ })).toBe(true);
177
+ expect(shouldShowGlobalStreamLoadingIndicator(true, {
178
+ type: 'writing'
179
+ })).toBe(false);
180
+ });
181
+ });
182
+ describe('message item rendering guards', function () {
183
+ it('resolves user and assistant roles', function () {
184
+ expect(isCurrentUserMessage(ChatHistoryRole.USER, '9', '9')).toBe(true);
185
+ expect(isCurrentUserMessage(ChatHistoryRole.ASSISTANT, '1', '1')).toBe(true);
186
+ expect(isAssistantChatMessage(ChatHistoryRole.ASSISTANT, 'assistant')).toBe(true);
187
+ expect(isAssistantChatMessage(ChatHistoryRole.USER, 'assistant')).toBe(true);
188
+ });
189
+ it('derives streaming body and activity indicator flags', function () {
190
+ expect(isActiveStreamingState(false, true)).toBe(true);
191
+ expect(shouldShowStreamingMessageBody(true, true, false)).toBe(true);
192
+ expect(shouldShowStreamingMessageBody(true, true, true)).toBe(false);
193
+ expect(shouldShowStreamActivityIndicator(true, true, {
194
+ type: 'writing'
195
+ })).toBe(true);
196
+ expect(shouldShowStreamActivityIndicator(false, true, {
197
+ type: 'writing'
198
+ })).toBe(false);
199
+ });
200
+ it('guards change-project, attachments, text body and approval UI', function () {
201
+ expect(shouldRenderChangeProjectMessage(true, [{
202
+ id: 1
203
+ }])).toBe(true);
204
+ expect(shouldRenderChangeProjectMessage(true, null)).toBe(false);
205
+ expect(shouldShowMessageAttachmentsRow(0)).toBe(false);
206
+ expect(shouldShowMessageAttachmentsRow(2)).toBe(true);
207
+ expect(shouldRenderMessageTextBody({
208
+ messageText: '',
209
+ showStreamingBody: true,
210
+ isAssistant: true,
211
+ attachmentCount: 1
212
+ })).toBe(false);
213
+ expect(shouldRenderMessageTextBody({
214
+ messageText: 'hola',
215
+ showStreamingBody: false,
216
+ isAssistant: false,
217
+ attachmentCount: 0
218
+ })).toBe(true);
219
+ expect(shouldShowApprovalActions({
220
+ pending_actions: []
221
+ })).toBe(true);
222
+ expect(shouldShowApprovalActions({})).toBe(false);
223
+ });
224
+ it('hides empty streaming bodies and controls assistant chrome', function () {
225
+ expect(shouldHideEmptyStreamingBody('', false)).toBe(true);
226
+ expect(shouldHideEmptyStreamingBody('', true)).toBe(false);
227
+ expect(shouldRenderAssistantFeedback({
228
+ isAssistant: true,
229
+ isError: false,
230
+ isStreaming: false,
231
+ isFrontendCancelled: true,
232
+ onRetry: function onRetry() {
233
+ return undefined;
234
+ }
235
+ })).toBe(true);
236
+ expect(shouldRenderAssistantFeedback({
237
+ isAssistant: true,
238
+ isError: true,
239
+ isStreaming: false
240
+ })).toBe(false);
241
+ expect(shouldRenderAssistantSuggestions({
242
+ isAssistant: true,
243
+ isError: true,
244
+ suggestionsLength: 2
245
+ })).toBe(true);
246
+ expect(shouldRenderAssistantSuggestions({
247
+ isAssistant: true,
248
+ isError: true,
249
+ suggestionsLength: 0
250
+ })).toBe(false);
251
+ expect(shouldHideAssistantSuggestions(true, true, false)).toBe(true);
252
+ expect(shouldHideAssistantSuggestions(false, false, false)).toBe(true);
253
+ expect(shouldRenderCreateAgentActions({
254
+ isAssistant: true,
255
+ agentId: 'agent-1'
256
+ })).toBe(true);
257
+ });
258
+ it('keeps a blocking choice and optional suggestions mutually exclusive', function () {
259
+ var multipleChoice = {
260
+ options: [{
261
+ key: 'A',
262
+ text: 'Sitio web'
263
+ }]
264
+ };
265
+ var assistant = {
266
+ isAssistant: true,
267
+ suggestionsLength: 2
268
+ };
269
+ expect(shouldRenderAssistantSuggestions(assistant)).toBe(true);
270
+ expect(shouldRenderAssistantSuggestions(_objectSpread(_objectSpread({}, assistant), {}, {
271
+ multipleChoice: multipleChoice
272
+ }))).toBe(false);
273
+ expect(shouldRenderAssistantSuggestions(_objectSpread(_objectSpread({}, assistant), {}, {
274
+ multipleChoice: null
275
+ }))).toBe(true);
276
+ });
277
+ it('extracts the last question line of the assistant prose', function () {
278
+ expect(extractMultipleChoiceQuestion('Encontré 3 proyectos.\n\n**¿En cuál la creo?**')).toBe('¿En cuál la creo?');
279
+ expect(extractMultipleChoiceQuestion('¿Primero?\nTexto\n- ¿Segundo?')).toBe('¿Segundo?');
280
+ expect(extractMultipleChoiceQuestion('Elegí una opción.')).toBeNull();
281
+ expect(extractMultipleChoiceQuestion(undefined)).toBeNull();
282
+ });
283
+ describe('resolvePendingMultipleChoice', function () {
284
+ var options = [{
285
+ key: 'A',
286
+ text: 'Proyecto Alfa'
287
+ }, {
288
+ key: 'B',
289
+ text: 'Proyecto Beta'
290
+ }];
291
+ var assistant = {
292
+ id: 'assistant-1',
293
+ message: 'Hay dos.\n¿En qué proyecto la creo?',
294
+ role: ChatHistoryRole.ASSISTANT,
295
+ user: {
296
+ id: 'assistant'
297
+ },
298
+ multipleChoice: {
299
+ options: options
300
+ }
301
+ };
302
+ var user = {
303
+ id: 'user-1',
304
+ message: 'Alfa',
305
+ role: ChatHistoryRole.USER,
306
+ user: {
307
+ id: '42'
308
+ }
309
+ };
310
+ var resolve = function resolve() {
311
+ var overrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
312
+ return resolvePendingMultipleChoice(_objectSpread({
313
+ messages: [assistant],
314
+ isStreaming: false,
315
+ dismissedMessageIds: {}
316
+ }, overrides));
317
+ };
318
+ it('returns the choice of the last assistant message', function () {
319
+ expect(resolve()).toEqual({
320
+ messageId: 'assistant-1',
321
+ question: '¿En qué proyecto la creo?',
322
+ options: options
323
+ });
324
+ });
325
+ it('returns null once the conversation moved on, while streaming or when dismissed', function () {
326
+ expect(resolve({
327
+ messages: [assistant, user]
328
+ })).toBeNull();
329
+ expect(resolve({
330
+ isStreaming: true
331
+ })).toBeNull();
332
+ expect(resolve({
333
+ dismissedMessageIds: {
334
+ 'assistant-1': true
335
+ }
336
+ })).toBeNull();
337
+ });
338
+ it('returns null for errored, cancelled, approval or single-option messages', function () {
339
+ expect(resolve({
340
+ messages: [_objectSpread(_objectSpread({}, assistant), {}, {
341
+ isError: true
342
+ })]
343
+ })).toBeNull();
344
+ expect(resolve({
345
+ messages: [_objectSpread(_objectSpread({}, assistant), {}, {
346
+ isFrontendCancelled: true
347
+ })]
348
+ })).toBeNull();
349
+ expect(resolve({
350
+ messages: [_objectSpread(_objectSpread({}, assistant), {}, {
351
+ approval: {}
352
+ })]
353
+ })).toBeNull();
354
+ expect(resolve({
355
+ messages: [_objectSpread(_objectSpread({}, assistant), {}, {
356
+ multipleChoice: {
357
+ options: [options[0]]
358
+ }
359
+ })]
360
+ })).toBeNull();
361
+ expect(resolve({
362
+ messages: [_objectSpread(_objectSpread({}, assistant), {}, {
363
+ multipleChoice: null
364
+ })]
365
+ })).toBeNull();
366
+ });
367
+ it('compares pending choices by message, question and options identity', function () {
368
+ var pending = resolve();
369
+ expect(isSamePendingMultipleChoice(pending, resolve())).toBe(true);
370
+ expect(isSamePendingMultipleChoice(pending, null)).toBe(false);
371
+ expect(isSamePendingMultipleChoice(null, null)).toBe(true);
372
+ });
373
+ });
374
+ describe('resolveAnsweredMultipleChoices', function () {
375
+ var assistant = {
376
+ id: 'assistant-1',
377
+ message: '¿En qué proyecto la creo?',
378
+ role: ChatHistoryRole.ASSISTANT,
379
+ user: {
380
+ id: 'assistant'
381
+ },
382
+ multipleChoice: {
383
+ options: [{
384
+ key: 'A',
385
+ text: 'Proyecto Alfa',
386
+ description: 'Equipo de producto'
387
+ }, {
388
+ key: 'B',
389
+ text: 'Proyecto Beta'
390
+ }]
391
+ }
392
+ };
393
+ var reply = function reply(message, key) {
394
+ return {
395
+ id: 'user-1',
396
+ message: message,
397
+ role: ChatHistoryRole.USER,
398
+ user: {
399
+ id: '42'
400
+ },
401
+ multipleChoiceAnswer: {
402
+ key: key
403
+ }
404
+ };
405
+ };
406
+ it('resolves a chosen option with its number and description and hides the user bubble', function () {
407
+ expect(resolveAnsweredMultipleChoices([assistant, reply('Proyecto Alfa', 'A')])).toEqual({
408
+ answers: {
409
+ 'assistant-1': {
410
+ number: 1,
411
+ text: 'Proyecto Alfa',
412
+ description: 'Equipo de producto'
413
+ }
414
+ },
415
+ hiddenMessageIds: {
416
+ 'user-1': true
417
+ }
418
+ });
419
+ });
420
+ it('resolves a typed answer, or an unknown key, with the text the user sent', function () {
421
+ expect(resolveAnsweredMultipleChoices([assistant, reply(' Otro proyecto ', null)]).answers).toEqual({
422
+ 'assistant-1': {
423
+ number: null,
424
+ text: 'Otro proyecto'
425
+ }
426
+ });
427
+ expect(resolveAnsweredMultipleChoices([assistant, reply('Gamma', 'Z')]).answers['assistant-1'].number).toBeNull();
428
+ });
429
+ it('resolves a skipped question without the text sent to the agent', function () {
430
+ var skipped = _objectSpread(_objectSpread({}, reply('Omito esta pregunta.', null)), {}, {
431
+ multipleChoiceAnswer: {
432
+ key: null,
433
+ skipped: true
434
+ }
435
+ });
436
+ expect(resolveAnsweredMultipleChoices([assistant, skipped])).toEqual({
437
+ answers: {
438
+ 'assistant-1': {
439
+ number: null,
440
+ text: '',
441
+ skipped: true
442
+ }
443
+ },
444
+ hiddenMessageIds: {
445
+ 'user-1': true
446
+ }
447
+ });
448
+ });
449
+ it('leaves replies that did not come from the card untouched', function () {
450
+ var _reply = reply('Alfa', 'A'),
451
+ multipleChoiceAnswer = _reply.multipleChoiceAnswer,
452
+ plain = _objectWithoutProperties(_reply, _excluded);
453
+ expect(multipleChoiceAnswer).toBeDefined();
454
+ expect(resolveAnsweredMultipleChoices([assistant, plain])).toEqual({
455
+ answers: {},
456
+ hiddenMessageIds: {}
457
+ });
458
+ expect(resolveAnsweredMultipleChoices([assistant])).toEqual({
459
+ answers: {},
460
+ hiddenMessageIds: {}
461
+ });
462
+ });
463
+ it('anchors the turn on the resolved card when the question bubble is hidden', function () {
464
+ var messages = [{
465
+ id: 'assistant-1'
466
+ }, {
467
+ id: 'user-1'
468
+ }];
469
+ expect(resolveTurnAnchorId(messages, 'user-1', {
470
+ 'user-1': true
471
+ })).toBe('assistant-1');
472
+ expect(resolveTurnAnchorId(messages, 'user-1', {})).toBe('user-1');
473
+ expect(resolveTurnAnchorId(messages, null, {
474
+ 'user-1': true
475
+ })).toBeNull();
476
+ });
477
+ });
478
+ it('resolves list streaming flags for the last assistant placeholder only', function () {
479
+ expect(resolveChatListItemStreamingFlags({
480
+ role: ChatHistoryRole.ASSISTANT,
481
+ userId: 'assistant',
482
+ messageId: 'answer-turn-1-streaming',
483
+ isLastMessage: true,
484
+ waitingResponse: true,
485
+ isWriting: false
486
+ })).toEqual({
487
+ isStreamingPlaceholder: true,
488
+ isStreaming: true
489
+ });
490
+ expect(resolveChatListItemStreamingFlags({
491
+ role: ChatHistoryRole.ASSISTANT,
492
+ userId: 'assistant',
493
+ messageId: 'answer-turn-1-streaming',
494
+ isLastMessage: false,
495
+ waitingResponse: true,
496
+ isWriting: false
497
+ })).toEqual({
498
+ isStreamingPlaceholder: false,
499
+ isStreaming: false
500
+ });
501
+ expect(resolveChatListItemStreamingFlags({
502
+ role: ChatHistoryRole.ASSISTANT,
503
+ userId: 'assistant',
504
+ messageId: 'answer-turn-1-streaming',
505
+ isLastMessage: true,
506
+ waitingResponse: false,
507
+ isWriting: true
508
+ }).isStreaming).toBe(true);
509
+ });
510
+ });
511
+ describe('suggestions and attachments', function () {
512
+ it('ignores empty or already-selected suggestions', function () {
513
+ expect(shouldIgnoreSuggestionClick(' ', false)).toBe(true);
514
+ expect(shouldIgnoreSuggestionClick('retry', true)).toBe(true);
515
+ expect(shouldIgnoreSuggestionClick('go', false)).toBe(false);
516
+ });
517
+ it('detects retry suggestion selection', function () {
518
+ expect(isRetrySuggestionSelection(true, 'Reintentar', 'Reintentar')).toBe(true);
519
+ expect(isRetrySuggestionSelection(false, 'Reintentar', 'Reintentar')).toBe(false);
520
+ });
521
+ it('resolves retry attachments from user message sources', function () {
522
+ var attachments = [{
523
+ id: '1',
524
+ name: 'a.pdf',
525
+ size: 1,
526
+ type: 'pdf'
527
+ }];
528
+ expect(resolveRetryAttachmentsFromUserMessage({
529
+ attachments: attachments
530
+ })).toEqual(attachments);
531
+ expect(resolveRetryAttachmentsFromUserMessage({
532
+ sources: attachments
533
+ })).toEqual(attachments);
534
+ expect(resolveRetryAttachmentsFromUserMessage({})).toEqual([]);
535
+ });
536
+ it('counts attachments from attachments or sources', function () {
537
+ expect(countUserMessageAttachments({
538
+ attachments: [{
539
+ id: '1',
540
+ name: 'a',
541
+ size: 1,
542
+ type: 'pdf'
543
+ }]
544
+ })).toBe(1);
545
+ expect(countUserMessageAttachments({
546
+ sources: [{
547
+ id: '2'
548
+ }]
549
+ })).toBe(1);
550
+ expect(countUserMessageAttachments(null)).toBe(0);
551
+ });
552
+ it('picks attachment download strategy', function () {
553
+ expect(resolveAttachmentDownloadBlobStrategy('https://a.test', null)).toBe('remote-url');
554
+ expect(resolveAttachmentDownloadBlobStrategy(undefined, new File(['x'], 'a.txt'))).toBe('local-file');
555
+ expect(resolveAttachmentDownloadBlobStrategy(undefined, null)).toBeNull();
556
+ });
557
+ it('blocks selecting another project option after one is chosen', function () {
558
+ expect(shouldOpenMessageOption(null)).toBe(true);
559
+ expect(shouldOpenMessageOption({
560
+ id: 1
561
+ })).toBe(false);
562
+ });
563
+ });
564
+ describe('extractFeedbackSessionId', function () {
565
+ it('removes answer segments from the message id', function () {
566
+ expect(extractFeedbackSessionId('question-1-answer-stream-2')).toBe('question-1-stream-2');
567
+ });
568
+ });
569
+ describe('attachments', function () {
570
+ it('detects audio attachments by mime type, extension or name', function () {
571
+ expect(isAudioAttachment({
572
+ type: 'audio/mpeg',
573
+ name: 'voice.mp3'
574
+ })).toBe(true);
575
+ expect(isAudioAttachment({
576
+ type: 'mp3',
577
+ name: 'voice.mp3'
578
+ })).toBe(true);
579
+ expect(isAudioAttachment({
580
+ type: 'text/plain',
581
+ name: 'notes.txt'
582
+ })).toBe(false);
583
+ });
584
+ it('allows preview for local files and remote urls', function () {
585
+ expect(canOpenAttachmentPreview({
586
+ id: '1',
587
+ name: 'a.pdf',
588
+ size: 1,
589
+ type: 'application/pdf',
590
+ file: new File(['x'], 'a.pdf')
591
+ })).toBe(true);
592
+ expect(canOpenAttachmentPreview({
593
+ id: '2',
594
+ name: 'b.pdf',
595
+ size: 1,
596
+ type: 'application/pdf',
597
+ url_original: 'https://example.com/b.pdf'
598
+ })).toBe(true);
599
+ });
600
+ });
601
+ describe('list message visibility', function () {
602
+ it('skips empty messages unless streaming or rich content is present', function () {
603
+ expect(shouldSkipEmptyChatListMessage({
604
+ isStreamingPlaceholder: false,
605
+ isStreaming: false,
606
+ attachmentCount: 0,
607
+ sourceCount: 0,
608
+ messageText: '',
609
+ hasApproval: false
610
+ })).toBe(true);
611
+ expect(shouldSkipEmptyChatListMessage({
612
+ isStreamingPlaceholder: true,
613
+ isStreaming: false,
614
+ attachmentCount: 0,
615
+ sourceCount: 0,
616
+ messageText: '',
617
+ hasApproval: false
618
+ })).toBe(false);
619
+ expect(shouldSkipEmptyChatListMessage({
620
+ isStreamingPlaceholder: false,
621
+ isStreaming: true,
622
+ attachmentCount: 0,
623
+ sourceCount: 0,
624
+ messageText: '',
625
+ hasApproval: false
626
+ })).toBe(false);
627
+ expect(shouldSkipEmptyChatListMessage({
628
+ isStreamingPlaceholder: false,
629
+ isStreaming: false,
630
+ attachmentCount: 0,
631
+ sourceCount: 1,
632
+ messageText: '',
633
+ hasApproval: false
634
+ })).toBe(false);
635
+ expect(shouldSkipEmptyChatListMessage({
636
+ isStreamingPlaceholder: false,
637
+ isStreaming: false,
638
+ attachmentCount: 0,
639
+ sourceCount: 0,
640
+ messageText: 'hola',
641
+ hasApproval: false
642
+ })).toBe(false);
643
+ expect(shouldSkipEmptyChatListMessage({
644
+ isStreamingPlaceholder: false,
645
+ isStreaming: false,
646
+ attachmentCount: 0,
647
+ sourceCount: 0,
648
+ messageText: '',
649
+ projectName: 'Proyecto',
650
+ hasApproval: false
651
+ })).toBe(false);
652
+ expect(shouldSkipEmptyChatListMessage({
653
+ isStreamingPlaceholder: false,
654
+ isStreaming: false,
655
+ attachmentCount: 1,
656
+ sourceCount: 0,
657
+ messageText: '',
658
+ hasApproval: false
659
+ })).toBe(false);
660
+ expect(shouldSkipEmptyChatListMessage({
661
+ isStreamingPlaceholder: false,
662
+ isStreaming: false,
663
+ attachmentCount: 0,
664
+ sourceCount: 0,
665
+ messageText: '',
666
+ hasApproval: true
667
+ })).toBe(false);
668
+ });
669
+ });
670
+ describe('retry and feedback helpers', function () {
671
+ it('maps wasHelpful to feedback enum', function () {
672
+ expect(resolveDisableFeedbackFromWasHelpful(undefined)).toBeNull();
673
+ expect(resolveDisableFeedbackFromWasHelpful(true)).toBe(Feedback.THUMBS_UP);
674
+ expect(resolveDisableFeedbackFromWasHelpful(false)).toBe(Feedback.THUMBS_DOWN);
675
+ });
676
+ it('allows retry for frontend-cancelled turns with a user message', function () {
677
+ expect(canRetryAssistantMessage({
678
+ hasUserMessageForRetry: true,
679
+ isStreaming: false,
680
+ isError: false,
681
+ hasApproval: false,
682
+ isFrontendCancelled: true,
683
+ turnId: null
684
+ })).toBe(true);
685
+ });
686
+ it('blocks retry when streaming, error, approval or missing user message', function () {
687
+ expect(canRetryAssistantMessage({
688
+ hasUserMessageForRetry: false,
689
+ isStreaming: false,
690
+ isError: false,
691
+ hasApproval: false,
692
+ turnId: 'turn-1'
693
+ })).toBe(false);
694
+ expect(canRetryAssistantMessage({
695
+ hasUserMessageForRetry: true,
696
+ isStreaming: true,
697
+ isError: false,
698
+ hasApproval: false,
699
+ turnId: 'turn-1'
700
+ })).toBe(false);
701
+ expect(canRetryAssistantMessage({
702
+ hasUserMessageForRetry: true,
703
+ isStreaming: false,
704
+ isError: true,
705
+ hasApproval: false,
706
+ turnId: 'turn-1'
707
+ })).toBe(false);
708
+ expect(canRetryAssistantMessage({
709
+ hasUserMessageForRetry: true,
710
+ isStreaming: false,
711
+ isError: false,
712
+ hasApproval: true,
713
+ turnId: 'turn-1'
714
+ })).toBe(false);
715
+ expect(canRetryAssistantMessage({
716
+ hasUserMessageForRetry: true,
717
+ isStreaming: false,
718
+ isError: false,
719
+ hasApproval: false,
720
+ isCancelled: true,
721
+ turnId: null
722
+ })).toBe(false);
723
+ expect(canRetryAssistantMessage({
724
+ hasUserMessageForRetry: true,
725
+ isStreaming: false,
726
+ isError: false,
727
+ hasApproval: false,
728
+ isCancelled: false,
729
+ turnId: 'turn-1'
730
+ })).toBe(true);
731
+ });
732
+ });
733
+ describe('attachment download helpers', function () {
734
+ it('builds file names and picks the first available url', function () {
735
+ expect(resolveAttachmentDownloadFileName({
736
+ name: 'brief.pdf',
737
+ type: 'pdf'
738
+ })).toBe('brief.pdf');
739
+ expect(resolveAttachmentDownloadFileName({
740
+ name: 'brief',
741
+ type: 'pdf'
742
+ })).toBe('brief.pdf');
743
+ expect(resolveAttachmentDownloadUrl({
744
+ url_original: 'https://a.test/o',
745
+ url_file: 'https://a.test/f'
746
+ })).toBe('https://a.test/o');
747
+ });
748
+ it('falls back to user sources when attachments are missing', function () {
749
+ var sources = [{
750
+ id: 's1',
751
+ name: 'a.pdf',
752
+ size: 1,
753
+ type: 'pdf'
754
+ }];
755
+ expect(resolveMessageAttachments(undefined, false, sources)).toEqual(sources);
756
+ expect(resolveMessageAttachments([], true, sources)).toEqual([]);
757
+ });
758
+ });
759
+ describe('turn space helpers', function () {
760
+ it('finds the latest question id', function () {
761
+ expect(findLastQuestionId([{
762
+ id: 'answer-1'
763
+ }, {
764
+ id: 'question-9'
765
+ }, {
766
+ id: 'question-10'
767
+ }])).toBe('question-10');
768
+ });
769
+ it('computes reserved and removable spacer heights', function () {
770
+ expect(computeReservedTurnSpace(800, 600, 800)).toBe(56);
771
+ expect(computeRemovableTurnSpace(1200, 800, 200, 300)).toBe(100);
772
+ expect(computeRemovableTurnSpace(1200, 800, 200, 0)).toBe(0);
773
+ });
774
+ });
775
+ describe('branch coverage gaps', function () {
776
+ it('hasMessageLevelStreamIndicator requires placeholder id and active stream', function () {
777
+ expect(hasMessageLevelStreamIndicator(undefined, true, true)).toBe(false);
778
+ expect(hasMessageLevelStreamIndicator('answer-turn-1-streaming', false, false)).toBe(false);
779
+ });
780
+ it('shouldHideAssistantSuggestions respects disabled chips on the last message', function () {
781
+ expect(shouldHideAssistantSuggestions(false, true, true)).toBe(true);
782
+ });
783
+ it('resolveChatListItemStreamingFlags only streams the last assistant placeholder', function () {
784
+ expect(resolveChatListItemStreamingFlags({
785
+ role: ChatHistoryRole.ASSISTANT,
786
+ userId: 'assistant',
787
+ messageId: 'answer-turn-1-streaming',
788
+ isLastMessage: false,
789
+ waitingResponse: true,
790
+ isWriting: false
791
+ })).toMatchObject({
792
+ isStreamingPlaceholder: false,
793
+ isStreaming: false
794
+ });
795
+ });
796
+ it('isAudioAttachment detects extension-only files', function () {
797
+ expect(isAudioAttachment({
798
+ type: '',
799
+ name: 'voice.wav'
800
+ })).toBe(true);
801
+ expect(isAudioAttachment({
802
+ type: 'audio/webm',
803
+ name: 'clip'
804
+ })).toBe(true);
805
+ });
806
+ it('canOpenAttachmentPreview accepts originalFile and url_file', function () {
807
+ expect(canOpenAttachmentPreview({
808
+ id: '1',
809
+ name: 'a.pdf',
810
+ type: 'pdf',
811
+ size: 1,
812
+ file: undefined,
813
+ originalFile: new File([], 'a.pdf')
814
+ })).toBe(true);
815
+ expect(canOpenAttachmentPreview({
816
+ id: '2',
817
+ name: 'b.pdf',
818
+ type: 'pdf',
819
+ size: 1,
820
+ file: undefined,
821
+ url_file: 'https://cdn/file'
822
+ })).toBe(true);
823
+ });
824
+ it('resolveMessageAttachments ignores empty attachment arrays for assistants', function () {
825
+ expect(resolveMessageAttachments([], true, [{
826
+ id: 's1'
827
+ }])).toEqual([]);
828
+ });
829
+ it('resolveAttachmentDownloadUrl falls back to url_file and thumbnail', function () {
830
+ expect(resolveAttachmentDownloadUrl({
831
+ url_file: 'https://cdn/file'
832
+ })).toBe('https://cdn/file');
833
+ expect(resolveAttachmentDownloadUrl({
834
+ url_thumbnail: 'https://cdn/thumb'
835
+ })).toBe('https://cdn/thumb');
836
+ });
837
+ });
838
+ describe('streaming and scroll lifecycle helpers', function () {
839
+ it('builds smooth stream options from window flags', function () {
840
+ expect(buildSmoothStreamTextOptions({
841
+ streamLagMs: 100
842
+ }, true)).toMatchObject({
843
+ enabled: true,
844
+ targetLagMs: 100
845
+ });
846
+ expect(buildSmoothStreamTextOptions({
847
+ streamLagMs: 100,
848
+ streamAdapt: true,
849
+ streamBufferMs: 200,
850
+ streamMinBuffer: 10,
851
+ streamWarmupMs: 50
852
+ }, true)).toMatchObject({
853
+ adaptToBackendRate: true,
854
+ targetBufferMs: 200,
855
+ minBufferChars: 10,
856
+ warmupMs: 50
857
+ });
858
+ expect(buildSmoothStreamTextOptions({}, false).enabled).toBe(false);
859
+ });
860
+ it('readSmoothStreamWindowFlags returns empty when window is unavailable', function () {
861
+ var originalWindow = global.window;
862
+ // @ts-expect-error simulating non-browser runtime
863
+ delete global.window;
864
+ expect(readSmoothStreamWindowFlags()).toEqual({});
865
+ global.window = originalWindow;
866
+ });
867
+ it('resolves streaming raw text and hook ids', function () {
868
+ expect(resolveStreamingRawText(true, 'live', 'final')).toBe('live');
869
+ expect(resolveStreamingMessageHookId(false, 'id-1')).toBeNull();
870
+ expect(resolveStreamingTextHookId(true, false, 'id-1')).toBe('id-1');
871
+ expect(resolveReasoningTraceHookId(true, true, 'id-1')).toBe('id-1');
872
+ });
873
+ it('guards chat init, turn reservation and scroll effects', function () {
874
+ expect(shouldInitializeChat(false)).toBe(true);
875
+ expect(shouldClearLastReservedQuestion(true)).toBe(true);
876
+ expect(shouldScheduleTurnSpaceReservation(false, false, 'question-1', null)).toBe(true);
877
+ expect(shouldSkipMessagesScrollEffect(false, false, false, false)).toBe(true);
878
+ expect(shouldRunSessionCacheScrollToBottom(false, 'chat-1', 2, null)).toBe(true);
879
+ expect(detectJustFinishedLoadingMessages(true, false)).toBe(true);
880
+ expect(shouldScrollToBottomAfterLoad(true, 0)).toBe(false);
881
+ expect(shouldUpdateScrollAffordancesOnLoadEnd(false)).toBe(true);
882
+ });
883
+ it('restores scroll position from session snapshot', function () {
884
+ expect(resolvePendingScrollTopFromSession(null, 'chat-1')).toBeNull();
885
+ expect(resolvePendingScrollTopFromSession({
886
+ scrollSessionId: 'chat-1',
887
+ scrollTop: 120
888
+ }, 'chat-1')).toBe(120);
889
+ expect(shouldApplyPendingScrollRestore(false, 50, true)).toBe(true);
890
+ expect(shouldClearScrollRestoreWithoutChat(null)).toBe(true);
891
+ expect(shouldRestoreScrollOnExpandedChange(false, true, true)).toBe(true);
892
+ });
893
+ it('resolves list keys, analytics and cancelled feedback props', function () {
894
+ expect(resolveMessageListItemKey(undefined, 3)).toBe('msg-3');
895
+ expect(resolveSuggestionAnalyticsAgentType(true, 'clone')).toBe('marketplace');
896
+ expect(resolveFeedbackPropsForCancelled(true, [{
897
+ id: 1
898
+ }], function () {
899
+ return undefined;
900
+ }).sources).toBeUndefined();
901
+ expect(shouldRenderMentionInlineNodes(true, ['node'])).toBe(true);
902
+ expect(resolveScrollOnParentMode(true)).toBe(true);
903
+ });
904
+ it('processes scroll frames and turn reservation plans', function () {
905
+ var _resolveLastUserMessa;
906
+ var frame = processChatMessagesScrollFrame({
907
+ scrollTop: 200,
908
+ scrollHeight: 1000,
909
+ clientHeight: 400,
910
+ lastScrollTop: 250,
911
+ scrollThreshold: 39,
912
+ anchoredTurnId: null,
913
+ initialChatId: 'chat-1'
914
+ });
915
+ expect(frame.shouldDrainTurnSpace).toBe(true);
916
+ expect(frame.shouldScheduleScrollPersist).toBe(true);
917
+ expect(computeMeasureTurnLayout({
918
+ containerTop: 10,
919
+ questionTop: 50,
920
+ contentBottom: 250,
921
+ scrollTop: 100
922
+ })).toMatchObject({
923
+ questionTop: 140,
924
+ turnHeight: 200
925
+ });
926
+ expect(resolveReserveTurnSpacePlan({
927
+ currentScrollTop: 500,
928
+ targetScrollTop: 200,
929
+ clientHeight: 400,
930
+ turnHeight: 120
931
+ }).kind).toBe('skip-reservation');
932
+ expect(resolveReserveTurnSpacePlan({
933
+ currentScrollTop: 50,
934
+ targetScrollTop: 200,
935
+ clientHeight: 400,
936
+ turnHeight: 120
937
+ }).kind).toBe('reserve');
938
+ expect(resolveScrollToBottomTargetTop(900, 300)).toBe(600);
939
+ expect(resolveContainerAtBottom({
940
+ scrollHeight: 100,
941
+ scrollTop: 0,
942
+ clientHeight: 100
943
+ })).toBe(true);
944
+ expect(resolveContainerAtBottom(null)).toBe(false);
945
+ expect(resolveStreamingMessageHookId(true, 'id-1')).toBe('id-1');
946
+ expect(isAudioAttachment({
947
+ type: undefined,
948
+ name: undefined
949
+ })).toBe(false);
950
+ expect(resolveCreateAgentActionsAgentId({
951
+ agentId: 'a1'
952
+ })).toBe('a1');
953
+ expect((_resolveLastUserMessa = resolveLastUserMessageForAttachments([{
954
+ role: ChatHistoryRole.ASSISTANT,
955
+ user: {
956
+ id: 'assistant'
957
+ }
958
+ }, {
959
+ role: ChatHistoryRole.USER,
960
+ user: {
961
+ id: '7'
962
+ }
963
+ }], '7')) === null || _resolveLastUserMessa === void 0 ? void 0 : _resolveLastUserMessa.user.id).toBe('7');
964
+ });
965
+ });
966
+ });
967
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGZWVkYmFjayIsIkNoYXRIaXN0b3J5Um9sZSIsImNhbk9wZW5BdHRhY2htZW50UHJldmlldyIsImNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSIsImNvbXB1dGVEaXN0YW5jZUZyb21Cb3R0b20iLCJjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlIiwiY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlIiwiY29tcHV0ZVN5bmNlZFR1cm5TcGFjZXJIZWlnaHQiLCJjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMiLCJjb21wdXRlVHVyblNjcm9sbFRhcmdldFRvcCIsImNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyIsImVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MiLCJleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQiLCJmaW5kTGFzdFF1ZXN0aW9uSWQiLCJoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QiLCJoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IiLCJpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlIiwiaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCIsImlzQXBwcm92YWxDaGF0TWVzc2FnZSIsImlzQXNzaXN0YW50Q2hhdE1lc3NhZ2UiLCJpc0F1ZGlvQXR0YWNobWVudCIsImlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20iLCJpc0N1cnJlbnRVc2VyTWVzc2FnZSIsImlzTmVhclNjcm9sbEJvdHRvbSIsImlzTmV3Q2hhdE1lc3NhZ2VFdmVudCIsImlzUmV0cnlTdWdnZXN0aW9uU2VsZWN0aW9uIiwiaXNTY3JvbGxpbmdVcHdhcmQiLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkQmxvYlN0cmF0ZWd5IiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lIiwicmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCIsInJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyIsInJlc29sdmVEaXNhYmxlRmVlZGJhY2tGcm9tV2FzSGVscGZ1bCIsInJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMiLCJyZXNvbHZlUmV0cnlBdHRhY2htZW50c0Zyb21Vc2VyTWVzc2FnZSIsInJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkIiwic2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UiLCJzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsIiwic2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zIiwic2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSIsImV4dHJhY3RNdWx0aXBsZUNob2ljZVF1ZXN0aW9uIiwiaXNTYW1lUGVuZGluZ011bHRpcGxlQ2hvaWNlIiwicmVzb2x2ZVBlbmRpbmdNdWx0aXBsZUNob2ljZSIsInJlc29sdmVBbnN3ZXJlZE11bHRpcGxlQ2hvaWNlcyIsInJlc29sdmVUdXJuQW5jaG9ySWQiLCJzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2siLCJzaG91bGRPcGVuTWVzc2FnZU9wdGlvbiIsInNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwiLCJzaG91bGRSZWxlYXNlVHVyblNwYWNlIiwic2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2siLCJzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyIsInNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlIiwic2hvdWxkUmVuZGVyQ3JlYXRlQWdlbnRBY3Rpb25zIiwic2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5Iiwic2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QiLCJzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zIiwic2hvdWxkU2hvd0JvdHRvbVNjcm9sbEdyYWRpZW50Iiwic2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IiLCJzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93Iiwic2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tIiwic2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yIiwic2hvdWxkU2hvd1N0cmVhbWluZ01lc3NhZ2VCb2R5Iiwic2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50Iiwic2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlIiwic2hvdWxkU2tpcFR1cm5TY3JvbGxBbmltYXRpb24iLCJzaG91bGRTa2lwVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQiLCJ0dXJuQW5jaG9yT2Zmc2V0IiwiYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyIsImNvbXB1dGVNZWFzdXJlVHVybkxheW91dCIsImRldGVjdEp1c3RGaW5pc2hlZExvYWRpbmdNZXNzYWdlcyIsInByb2Nlc3NDaGF0TWVzc2FnZXNTY3JvbGxGcmFtZSIsInJlYWRTbW9vdGhTdHJlYW1XaW5kb3dGbGFncyIsInJlc29sdmVDb250YWluZXJBdEJvdHRvbSIsInJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkIiwicmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQiLCJyZXNvbHZlTGFzdFVzZXJNZXNzYWdlRm9yQXR0YWNobWVudHMiLCJyZXNvbHZlRmVlZGJhY2tQcm9wc0ZvckNhbmNlbGxlZCIsInJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbiIsInJlc29sdmVTY3JvbGxUb0JvdHRvbVRhcmdldFRvcCIsInJlc29sdmVNZXNzYWdlTGlzdEl0ZW1LZXkiLCJyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uIiwicmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkIiwicmVzb2x2ZVNjcm9sbE9uUGFyZW50TW9kZSIsInJlc29sdmVTdHJlYW1pbmdSYXdUZXh0IiwicmVzb2x2ZVN0cmVhbWluZ1RleHRIb29rSWQiLCJyZXNvbHZlU3VnZ2VzdGlvbkFuYWx5dGljc0FnZW50VHlwZSIsInNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUiLCJzaG91bGRDbGVhckxhc3RSZXNlcnZlZFF1ZXN0aW9uIiwic2hvdWxkQ2xlYXJTY3JvbGxSZXN0b3JlV2l0aG91dENoYXQiLCJzaG91bGRJbml0aWFsaXplQ2hhdCIsInNob3VsZFJlbmRlck1lbnRpb25JbmxpbmVOb2RlcyIsInNob3VsZFJlc3RvcmVTY3JvbGxPbkV4cGFuZGVkQ2hhbmdlIiwic2hvdWxkUnVuU2Vzc2lvbkNhY2hlU2Nyb2xsVG9Cb3R0b20iLCJzaG91bGRTY2hlZHVsZVR1cm5TcGFjZVJlc2VydmF0aW9uIiwic2hvdWxkU2Nyb2xsVG9Cb3R0b21BZnRlckxvYWQiLCJzaG91bGRTa2lwTWVzc2FnZXNTY3JvbGxFZmZlY3QiLCJzaG91bGRVcGRhdGVTY3JvbGxBZmZvcmRhbmNlc09uTG9hZEVuZCIsImRlc2NyaWJlIiwiaXQiLCJleHBlY3QiLCJ0b0JlIiwiaWQiLCJhcHByb3ZhbCIsImlzTmV3TWVzc2FnZSIsImFuY2hvcmVkVHVybklkIiwid2FpdGluZ1Jlc3BvbnNlIiwiaXNXcml0aW5nIiwiaXNBdEJvdHRvbSIsImlzQW5zd2VyT3JRdWVzdGlvbiIsImlzQXBwcm92YWwiLCJoYXNJbml0aWFsTWVzc2FnZSIsIm1lc3NhZ2VzTGVuZ3RoIiwicHJldk1lc3NhZ2VzTGVuZ3RoIiwidHlwZSIsIlVTRVIiLCJBU1NJU1RBTlQiLCJtZXNzYWdlVGV4dCIsInNob3dTdHJlYW1pbmdCb2R5IiwiaXNBc3Npc3RhbnQiLCJhdHRhY2htZW50Q291bnQiLCJwZW5kaW5nX2FjdGlvbnMiLCJpc0Vycm9yIiwiaXNTdHJlYW1pbmciLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwib25SZXRyeSIsInVuZGVmaW5lZCIsInN1Z2dlc3Rpb25zTGVuZ3RoIiwiYWdlbnRJZCIsIm11bHRpcGxlQ2hvaWNlIiwib3B0aW9ucyIsImtleSIsInRleHQiLCJhc3Npc3RhbnQiLCJfb2JqZWN0U3ByZWFkIiwidG9CZU51bGwiLCJtZXNzYWdlIiwicm9sZSIsInVzZXIiLCJyZXNvbHZlIiwib3ZlcnJpZGVzIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwibWVzc2FnZXMiLCJkaXNtaXNzZWRNZXNzYWdlSWRzIiwidG9FcXVhbCIsIm1lc3NhZ2VJZCIsInF1ZXN0aW9uIiwicGVuZGluZyIsImRlc2NyaXB0aW9uIiwicmVwbHkiLCJtdWx0aXBsZUNob2ljZUFuc3dlciIsImFuc3dlcnMiLCJudW1iZXIiLCJoaWRkZW5NZXNzYWdlSWRzIiwic2tpcHBlZCIsIl9yZXBseSIsInBsYWluIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwidG9CZURlZmluZWQiLCJ1c2VySWQiLCJpc0xhc3RNZXNzYWdlIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImF0dGFjaG1lbnRzIiwibmFtZSIsInNpemUiLCJzb3VyY2VzIiwiRmlsZSIsImZpbGUiLCJ1cmxfb3JpZ2luYWwiLCJzb3VyY2VDb3VudCIsImhhc0FwcHJvdmFsIiwicHJvamVjdE5hbWUiLCJUSFVNQlNfVVAiLCJUSFVNQlNfRE9XTiIsImhhc1VzZXJNZXNzYWdlRm9yUmV0cnkiLCJ0dXJuSWQiLCJpc0NhbmNlbGxlZCIsInVybF9maWxlIiwidG9NYXRjaE9iamVjdCIsIm9yaWdpbmFsRmlsZSIsInVybF90aHVtYm5haWwiLCJzdHJlYW1MYWdNcyIsImVuYWJsZWQiLCJ0YXJnZXRMYWdNcyIsInN0cmVhbUFkYXB0Iiwic3RyZWFtQnVmZmVyTXMiLCJzdHJlYW1NaW5CdWZmZXIiLCJzdHJlYW1XYXJtdXBNcyIsImFkYXB0VG9CYWNrZW5kUmF0ZSIsInRhcmdldEJ1ZmZlck1zIiwibWluQnVmZmVyQ2hhcnMiLCJ3YXJtdXBNcyIsIm9yaWdpbmFsV2luZG93IiwiZ2xvYmFsIiwid2luZG93Iiwic2Nyb2xsU2Vzc2lvbklkIiwic2Nyb2xsVG9wIiwidG9CZVVuZGVmaW5lZCIsIl9yZXNvbHZlTGFzdFVzZXJNZXNzYSIsImZyYW1lIiwic2Nyb2xsSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwibGFzdFNjcm9sbFRvcCIsInNjcm9sbFRocmVzaG9sZCIsImluaXRpYWxDaGF0SWQiLCJzaG91bGREcmFpblR1cm5TcGFjZSIsInNob3VsZFNjaGVkdWxlU2Nyb2xsUGVyc2lzdCIsImNvbnRhaW5lclRvcCIsInF1ZXN0aW9uVG9wIiwiY29udGVudEJvdHRvbSIsInR1cm5IZWlnaHQiLCJjdXJyZW50U2Nyb2xsVG9wIiwidGFyZ2V0U2Nyb2xsVG9wIiwia2luZCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL21vbGVjdWxlcy9DaGF0QUlNZXNzYWdlcy9DaGF0QUlNZXNzYWdlcy5oZWxwZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2svTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHsgQ2hhdEhpc3RvcnlSb2xlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCB7XG4gIGNhbk9wZW5BdHRhY2htZW50UHJldmlldyxcbiAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlLFxuICBjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tLFxuICBjb21wdXRlUmVtb3ZhYmxlVHVyblNwYWNlLFxuICBjb21wdXRlUmVzZXJ2ZWRUdXJuU3BhY2UsXG4gIGNvbXB1dGVTeW5jZWRUdXJuU3BhY2VySGVpZ2h0LFxuICBjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMsXG4gIGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wLFxuICBjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMsXG4gIGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MsXG4gIGV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCxcbiAgZmluZExhc3RRdWVzdGlvbklkLFxuICBoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QsXG4gIGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcixcbiAgaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZSxcbiAgaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCxcbiAgaXNBcHByb3ZhbENoYXRNZXNzYWdlLFxuICBpc0Fzc2lzdGFudENoYXRNZXNzYWdlLFxuICBpc0F1ZGlvQXR0YWNobWVudCxcbiAgaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSxcbiAgaXNDdXJyZW50VXNlck1lc3NhZ2UsXG4gIGlzTmVhclNjcm9sbEJvdHRvbSxcbiAgaXNOZXdDaGF0TWVzc2FnZUV2ZW50LFxuICBpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbixcbiAgaXNTY3JvbGxpbmdVcHdhcmQsXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3ksXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRGaWxlTmFtZSxcbiAgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCxcbiAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzLFxuICByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwsXG4gIHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMsXG4gIHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlLFxuICByZXNvbHZlU2Nyb2xsTmVhckJvdHRvbVRocmVzaG9sZCxcbiAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UsXG4gIHNob3VsZERyYWluVHVyblNwYWNlT25TY3JvbGwsXG4gIHNob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyxcbiAgc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSxcbiAgZXh0cmFjdE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24sXG4gIGlzU2FtZVBlbmRpbmdNdWx0aXBsZUNob2ljZSxcbiAgcmVzb2x2ZVBlbmRpbmdNdWx0aXBsZUNob2ljZSxcbiAgcmVzb2x2ZUFuc3dlcmVkTXVsdGlwbGVDaG9pY2VzLFxuICByZXNvbHZlVHVybkFuY2hvcklkLFxuICBzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2ssXG4gIHNob3VsZE9wZW5NZXNzYWdlT3B0aW9uLFxuICBzaG91bGRQZXJzaXN0TWFpYVBhbmVsU2Nyb2xsLFxuICBzaG91bGRSZWxlYXNlVHVyblNwYWNlLFxuICBzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayxcbiAgc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMsXG4gIHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlLFxuICBzaG91bGRSZW5kZXJDcmVhdGVBZ2VudEFjdGlvbnMsXG4gIHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSxcbiAgc2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QsXG4gIHNob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMsXG4gIHNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCxcbiAgc2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IsXG4gIHNob3VsZFNob3dNZXNzYWdlQXR0YWNobWVudHNSb3csXG4gIHNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSxcbiAgc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yLFxuICBzaG91bGRTaG93U3RyZWFtaW5nTWVzc2FnZUJvZHksXG4gIHNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCxcbiAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlLFxuICBzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbixcbiAgc2hvdWxkU2tpcFR1cm5TcGFjZVJlc2VydmF0aW9uLFxuICBzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQsXG4gIHR1cm5BbmNob3JPZmZzZXQsXG4gIGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMsXG4gIGNvbXB1dGVNZWFzdXJlVHVybkxheW91dCxcbiAgZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzLFxuICBwcm9jZXNzQ2hhdE1lc3NhZ2VzU2Nyb2xsRnJhbWUsXG4gIHJlYWRTbW9vdGhTdHJlYW1XaW5kb3dGbGFncyxcbiAgcmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tLFxuICByZXNvbHZlU3RyZWFtaW5nTWVzc2FnZUhvb2tJZCxcbiAgcmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQsXG4gIHJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyxcbiAgcmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQsXG4gIHJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbixcbiAgcmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wLFxuICByZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5LFxuICByZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uLFxuICByZXNvbHZlUmVhc29uaW5nVHJhY2VIb29rSWQsXG4gIHJlc29sdmVTY3JvbGxPblBhcmVudE1vZGUsXG4gIHJlc29sdmVTdHJlYW1pbmdSYXdUZXh0LFxuICByZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCxcbiAgcmVzb2x2ZVN1Z2dlc3Rpb25BbmFseXRpY3NBZ2VudFR5cGUsXG4gIHNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUsXG4gIHNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24sXG4gIHNob3VsZENsZWFyU2Nyb2xsUmVzdG9yZVdpdGhvdXRDaGF0LFxuICBzaG91bGRJbml0aWFsaXplQ2hhdCxcbiAgc2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzLFxuICBzaG91bGRSZXN0b3JlU2Nyb2xsT25FeHBhbmRlZENoYW5nZSxcbiAgc2hvdWxkUnVuU2Vzc2lvbkNhY2hlU2Nyb2xsVG9Cb3R0b20sXG4gIHNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24sXG4gIHNob3VsZFNjcm9sbFRvQm90dG9tQWZ0ZXJMb2FkLFxuICBzaG91bGRTa2lwTWVzc2FnZXNTY3JvbGxFZmZlY3QsXG4gIHNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kLFxufSBmcm9tICcuL0NoYXRBSU1lc3NhZ2VzLmhlbHBlcnMnXG5cbmRlc2NyaWJlKCdDaGF0QUlNZXNzYWdlcy5oZWxwZXJzJywgKCkgPT4ge1xuICBkZXNjcmliZSgndHVybkFuY2hvck9mZnNldCcsICgpID0+IHtcbiAgICBpdCgnY2FwcyB0aGUgb2Zmc2V0IGF0IDIwMHB4JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHR1cm5BbmNob3JPZmZzZXQoNTAwKSkudG9CZSg5MClcbiAgICAgIGV4cGVjdCh0dXJuQW5jaG9yT2Zmc2V0KDIwMDApKS50b0JlKDIwMClcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMnLCAoKSA9PiB7XG4gICAgaXQoJ3NjYWxlcyBkdXJhdGlvbiB3aXRoIHNjcm9sbCBkaXN0YW5jZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMoMCkpLnRvQmUoNjAwKVxuICAgICAgZXhwZWN0KGNvbXB1dGVUdXJuU2Nyb2xsRHVyYXRpb25NcygxMjAwKSkudG9CZSg4MDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnc2Nyb2xsIGFmZm9yZGFuY2VzJywgKCkgPT4ge1xuICAgIGl0KCdjb21wdXRlcyBkaXN0YW5jZSBmcm9tIGJvdHRvbSBleGNsdWRpbmcgc3BhY2VyIGhlaWdodCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tKDEwMDAsIDIwMCwgMzAwLCA0MDApKS50b0JlKDEwMClcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3dzIHRoZSBzY3JvbGwgYnV0dG9uIG9ubHkgd2hlbiBmYXIgZW5vdWdoIGZyb20gdGhlIGJvdHRvbScsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRTaG93U2Nyb2xsVG9Cb3R0b20oNjApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tKDIwKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3RvZ2dsZXMgdG9wIGFuZCBib3R0b20gc2Nyb2xsIGdyYWRpZW50cyBwYXN0IHRoZSB0aHJlc2hvbGQnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50KDApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCgyKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCgwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93Qm90dG9tU2Nyb2xsR3JhZGllbnQoNSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2RldGVjdHMgdXB3YXJkIHNjcm9sbCBhbmQgbmVhci1ib3R0b20gd2l0aCBhZGFwdGl2ZSB0aHJlc2hvbGQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNTY3JvbGxpbmdVcHdhcmQoMTAsIDIwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzTmVhclNjcm9sbEJvdHRvbSg1MDAsIDQwMCwgMTAwLCA1MCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChyZXNvbHZlU2Nyb2xsTmVhckJvdHRvbVRocmVzaG9sZCgzOSwgdHJ1ZSwgZmFsc2UpKS50b0JlKDE1KVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxOZWFyQm90dG9tVGhyZXNob2xkKDE1LCBmYWxzZSwgdHJ1ZSkpLnRvQmUoMzkpXG4gICAgICBleHBlY3QocmVzb2x2ZVNjcm9sbE5lYXJCb3R0b21UaHJlc2hvbGQoMjUsIGZhbHNlLCBmYWxzZSkpLnRvQmUoMjUpXG4gICAgfSlcblxuICAgIGl0KCdza2lwcyB0aW55IHR1cm4gc2Nyb2xsIGFuaW1hdGlvbnMgYW5kIGVhc2VzIHByb2dyZXNzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFNraXBUdXJuU2Nyb2xsQW5pbWF0aW9uKDAuNSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTa2lwVHVyblNjcm9sbEFuaW1hdGlvbigxMCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoZWFzZU91dEV4cG9TY3JvbGxQcm9ncmVzcygxKSkudG9CZSgxKVxuICAgICAgZXhwZWN0KGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MoMCkpLnRvQmUoMClcbiAgICB9KVxuXG4gICAgaXQoJ2NvbXB1dGVzIHR1cm4gc2Nyb2xsIHRhcmdldHMgYW5kIHJlc2VydmF0aW9uIHNraXBzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wKDMwMCwgNTAwKSkudG9CZSgyMTApXG4gICAgICBleHBlY3Qoc2hvdWxkU2tpcFR1cm5TcGFjZVJlc2VydmF0aW9uKDEwMCwgNTApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2tpcFR1cm5TcGFjZVJlc2VydmF0aW9uKDUwLCAxMDApKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgndXBkYXRlcyBzcGFjZXIgaGVpZ2h0IG9ubHkgd2hlbiB0aGUgZGVsdGEgaXMgbWVhbmluZ2Z1bCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQoMTAwLCAxMDAuNSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0KDEwMCwgMTAyKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnc3luY3MgdHVybiBzcGFjZXIgaGVpZ2h0IHdpdGhvdXQgZ3Jvd2luZyByZXNlcnZlZCBzcGFjZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCg4MDAsIDYwMCwgMjAwKSkudG9CZSg1NilcbiAgICAgIGV4cGVjdChjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCg4MDAsIDYwMCwgNDApKS50b0JlKDQwKVxuICAgIH0pXG5cbiAgICBpdCgnZHJhaW5zIG9yIHJlbGVhc2VzIHR1cm4gc3BhY2UgYmFzZWQgb24gYW5jaG9yIHN0YXRlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZERyYWluVHVyblNwYWNlT25TY3JvbGwobnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGREcmFpblR1cm5TcGFjZU9uU2Nyb2xsKCdxdWVzdGlvbi0xJykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVsZWFzZVR1cm5TcGFjZShudWxsLCAwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZWxlYXNlVHVyblNwYWNlKCdxdWVzdGlvbi0xJywgMCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSZWxlYXNlVHVyblNwYWNlKG51bGwsIDUwKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncGVyc2lzdHMgcGFuZWwgc2Nyb2xsIG9ubHkgZm9yIGFjdGl2ZSBzZXNzaW9ucyBzY3JvbGxlZCBhd2F5IGZyb20gdG9wJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwoJ2NoYXQtMScsIDEwKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwoJ2NoYXQtMScsIDApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFBlcnNpc3RNYWlhUGFuZWxTY3JvbGwobnVsbCwgMTApKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyBib3R0b20gYWxpZ25tZW50IHdpdGggdG9sZXJhbmNlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQ29udGFpbmVyQXRTY3JvbGxCb3R0b20oMTAwMCwgOTAwLCAxMDApKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNDb250YWluZXJBdFNjcm9sbEJvdHRvbSgxMDAwLCA3MDAsIDEwMCkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnbWVzc2FnZSBsaXN0IHNjcm9sbCBkZWNpc2lvbnMnLCAoKSA9PiB7XG4gICAgaXQoJ2RldGVjdHMgbmV3IG1lc3NhZ2UgZXZlbnRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCgnYScsICdhJywgMywgMykpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoaXNOZXdDaGF0TWVzc2FnZUV2ZW50KCdiJywgJ2EnLCAzLCAzKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCgnYScsICdhJywgNCwgMykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2NsYXNzaWZpZXMgYXBwcm92YWwgYW5kIGFuc3dlci9xdWVzdGlvbiBpZHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNBcHByb3ZhbENoYXRNZXNzYWdlKHsgaWQ6ICdhcHByb3ZhbC0xJyB9KSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGlzQXBwcm92YWxDaGF0TWVzc2FnZSh7IGlkOiAnYW5zd2VyLTEnLCBhcHByb3ZhbDoge30gfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0FwcHJvdmFsQ2hhdE1lc3NhZ2UoeyBpZDogJ2Fuc3dlci0xJyB9KSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChpc0Fuc3dlck9yUXVlc3Rpb25DaGF0TWVzc2FnZUlkKCdxdWVzdGlvbi05JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0Fuc3dlck9yUXVlc3Rpb25DaGF0TWVzc2FnZUlkKCdvdGhlcicpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZmluZHMgdGhlIGluaXRpYWwgdXNlciBtZXNzYWdlIG1hcmtlcicsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QoW3sgaWQ6ICd1c2VyLWluaXRpYWwtbWVzc2FnZScgfV0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaGFzSW5pdGlhbFVzZXJNZXNzYWdlSW5MaXN0KFt7IGlkOiAncXVlc3Rpb24tMScgfV0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmV0dXJucyBzY3JvbGwsIHN5bmMtdHVybiBvciBhZmZvcmRhbmNlcy1vbmx5JywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRBdXRvU2Nyb2xsT25NZXNzYWdlc0NoYW5nZSh7XG4gICAgICAgICAgaXNOZXdNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdEJvdHRvbTogdHJ1ZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IHRydWUsXG4gICAgICAgICAgaXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaGFzSW5pdGlhbE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogMixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnYWZmb3JkYW5jZXMtb25seScpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgICAgIGlzTmV3TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogJ3F1ZXN0aW9uLTEnLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiBmYWxzZSxcbiAgICAgICAgICBpc0Fuc3dlck9yUXVlc3Rpb246IGZhbHNlLFxuICAgICAgICAgIGlzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIGhhc0luaXRpYWxNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICBtZXNzYWdlc0xlbmd0aDogMyxcbiAgICAgICAgICBwcmV2TWVzc2FnZXNMZW5ndGg6IDIsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoJ3N5bmMtdHVybicpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgICAgIGlzTmV3TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiB0cnVlLFxuICAgICAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBoYXNJbml0aWFsTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZXNMZW5ndGg6IDMsXG4gICAgICAgICAgcHJldk1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKCdhZmZvcmRhbmNlcy1vbmx5JylcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRBdXRvU2Nyb2xsT25NZXNzYWdlc0NoYW5nZSh7XG4gICAgICAgICAgaXNOZXdNZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIGFuY2hvcmVkVHVybklkOiBudWxsLFxuICAgICAgICAgIHdhaXRpbmdSZXNwb25zZTogZmFsc2UsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F0Qm90dG9tOiB0cnVlLFxuICAgICAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBoYXNJbml0aWFsTWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgbWVzc2FnZXNMZW5ndGg6IDMsXG4gICAgICAgICAgcHJldk1lc3NhZ2VzTGVuZ3RoOiAyLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKCdzY3JvbGwnKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZEF1dG9TY3JvbGxPbk1lc3NhZ2VzQ2hhbmdlKHtcbiAgICAgICAgICBpc05ld01lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgYW5jaG9yZWRUdXJuSWQ6IG51bGwsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiBmYWxzZSxcbiAgICAgICAgICBpc1dyaXRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQXRCb3R0b206IGZhbHNlLFxuICAgICAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogZmFsc2UsXG4gICAgICAgICAgaXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaGFzSW5pdGlhbE1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgIG1lc3NhZ2VzTGVuZ3RoOiA0LFxuICAgICAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogMyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSgnc2Nyb2xsJylcbiAgICB9KVxuXG4gICAgaXQoJ2NvbnRyb2xzIHN0cmVhbSBzeW5jIGFuZCBnbG9iYWwgbG9hZGluZyBpbmRpY2F0b3JzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZFJ1blN0cmVhbVR1cm5TeW5jRWZmZWN0KGZhbHNlLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QodHJ1ZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaGFzTWVzc2FnZUxldmVsU3RyZWFtSW5kaWNhdG9yKCdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsIHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcignYW5zd2VyLTEnLCB0cnVlLCBmYWxzZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IoZmFsc2UsIHsgdHlwZTogJ3dyaXRpbmcnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0dsb2JhbFN0cmVhbUxvYWRpbmdJbmRpY2F0b3IodHJ1ZSwgeyB0eXBlOiAnd3JpdGluZycgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnbWVzc2FnZSBpdGVtIHJlbmRlcmluZyBndWFyZHMnLCAoKSA9PiB7XG4gICAgaXQoJ3Jlc29sdmVzIHVzZXIgYW5kIGFzc2lzdGFudCByb2xlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0N1cnJlbnRVc2VyTWVzc2FnZShDaGF0SGlzdG9yeVJvbGUuVVNFUiwgJzknLCAnOScpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNDdXJyZW50VXNlck1lc3NhZ2UoQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCwgJzEnLCAnMScpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBc3Npc3RhbnRDaGF0TWVzc2FnZShDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULCAnYXNzaXN0YW50JykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0Fzc2lzdGFudENoYXRNZXNzYWdlKENoYXRIaXN0b3J5Um9sZS5VU0VSLCAnYXNzaXN0YW50JykpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2Rlcml2ZXMgc3RyZWFtaW5nIGJvZHkgYW5kIGFjdGl2aXR5IGluZGljYXRvciBmbGFncycsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlKGZhbHNlLCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNob3dTdHJlYW1pbmdNZXNzYWdlQm9keSh0cnVlLCB0cnVlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93U3RyZWFtaW5nTWVzc2FnZUJvZHkodHJ1ZSwgdHJ1ZSwgdHJ1ZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yKHRydWUsIHRydWUsIHsgdHlwZTogJ3dyaXRpbmcnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yKGZhbHNlLCB0cnVlLCB7IHR5cGU6ICd3cml0aW5nJyB9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2d1YXJkcyBjaGFuZ2UtcHJvamVjdCwgYXR0YWNobWVudHMsIHRleHQgYm9keSBhbmQgYXBwcm92YWwgVUknLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyQ2hhbmdlUHJvamVjdE1lc3NhZ2UodHJ1ZSwgW3sgaWQ6IDEgfV0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyQ2hhbmdlUHJvamVjdE1lc3NhZ2UodHJ1ZSwgbnVsbCkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd01lc3NhZ2VBdHRhY2htZW50c1JvdygwKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93TWVzc2FnZUF0dGFjaG1lbnRzUm93KDIpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSh7XG4gICAgICAgICAgbWVzc2FnZVRleHQ6ICcnLFxuICAgICAgICAgIHNob3dTdHJlYW1pbmdCb2R5OiB0cnVlLFxuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5KHtcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJ2hvbGEnLFxuICAgICAgICAgIHNob3dTdHJlYW1pbmdCb2R5OiBmYWxzZSxcbiAgICAgICAgICBpc0Fzc2lzdGFudDogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkU2hvd0FwcHJvdmFsQWN0aW9ucyh7IHBlbmRpbmdfYWN0aW9uczogW10gfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTaG93QXBwcm92YWxBY3Rpb25zKHt9KSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ2hpZGVzIGVtcHR5IHN0cmVhbWluZyBib2RpZXMgYW5kIGNvbnRyb2xzIGFzc2lzdGFudCBjaHJvbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSgnJywgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUVtcHR5U3RyZWFtaW5nQm9keSgnJywgdHJ1ZSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlckFzc2lzdGFudEZlZWRiYWNrKHtcbiAgICAgICAgICBpc0Fzc2lzdGFudDogdHJ1ZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICBvblJldHJ5OiAoKSA9PiB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2soe1xuICAgICAgICAgIGlzQXNzaXN0YW50OiB0cnVlLFxuICAgICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgICBzdWdnZXN0aW9uc0xlbmd0aDogMixcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgICAgICBzdWdnZXN0aW9uc0xlbmd0aDogMCxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnModHJ1ZSwgdHJ1ZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zKGZhbHNlLCBmYWxzZSwgZmFsc2UpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFJlbmRlckNyZWF0ZUFnZW50QWN0aW9ucyh7XG4gICAgICAgICAgaXNBc3Npc3RhbnQ6IHRydWUsXG4gICAgICAgICAgYWdlbnRJZDogJ2FnZW50LTEnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdrZWVwcyBhIGJsb2NraW5nIGNob2ljZSBhbmQgb3B0aW9uYWwgc3VnZ2VzdGlvbnMgbXV0dWFsbHkgZXhjbHVzaXZlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbXVsdGlwbGVDaG9pY2UgPSB7IG9wdGlvbnM6IFt7IGtleTogJ0EnLCB0ZXh0OiAnU2l0aW8gd2ViJyB9XSB9XG4gICAgICBjb25zdCBhc3Npc3RhbnQgPSB7IGlzQXNzaXN0YW50OiB0cnVlLCBzdWdnZXN0aW9uc0xlbmd0aDogMiB9XG5cbiAgICAgIGV4cGVjdChzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyhhc3Npc3RhbnQpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMoeyAuLi5hc3Npc3RhbnQsIG11bHRpcGxlQ2hvaWNlIH0pKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zKHsgLi4uYXNzaXN0YW50LCBtdWx0aXBsZUNob2ljZTogbnVsbCB9KSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnZXh0cmFjdHMgdGhlIGxhc3QgcXVlc3Rpb24gbGluZSBvZiB0aGUgYXNzaXN0YW50IHByb3NlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGV4dHJhY3RNdWx0aXBsZUNob2ljZVF1ZXN0aW9uKCdFbmNvbnRyw6kgMyBwcm95ZWN0b3MuXFxuXFxuKirCv0VuIGN1w6FsIGxhIGNyZW8/KionKSkudG9CZSgnwr9FbiBjdcOhbCBsYSBjcmVvPycpXG4gICAgICBleHBlY3QoZXh0cmFjdE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24oJ8K/UHJpbWVybz9cXG5UZXh0b1xcbi0gwr9TZWd1bmRvPycpKS50b0JlKCfCv1NlZ3VuZG8/JylcbiAgICAgIGV4cGVjdChleHRyYWN0TXVsdGlwbGVDaG9pY2VRdWVzdGlvbignRWxlZ8OtIHVuYSBvcGNpw7NuLicpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QoZXh0cmFjdE11bHRpcGxlQ2hvaWNlUXVlc3Rpb24odW5kZWZpbmVkKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBkZXNjcmliZSgncmVzb2x2ZVBlbmRpbmdNdWx0aXBsZUNob2ljZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBbXG4gICAgICAgIHsga2V5OiAnQScsIHRleHQ6ICdQcm95ZWN0byBBbGZhJyB9LFxuICAgICAgICB7IGtleTogJ0InLCB0ZXh0OiAnUHJveWVjdG8gQmV0YScgfSxcbiAgICAgIF1cbiAgICAgIGNvbnN0IGFzc2lzdGFudCA9IHtcbiAgICAgICAgaWQ6ICdhc3Npc3RhbnQtMScsXG4gICAgICAgIG1lc3NhZ2U6ICdIYXkgZG9zLlxcbsK/RW4gcXXDqSBwcm95ZWN0byBsYSBjcmVvPycsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnIH0sXG4gICAgICAgIG11bHRpcGxlQ2hvaWNlOiB7IG9wdGlvbnMgfSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHVzZXIgPSB7IGlkOiAndXNlci0xJywgbWVzc2FnZTogJ0FsZmEnLCByb2xlOiBDaGF0SGlzdG9yeVJvbGUuVVNFUiwgdXNlcjogeyBpZDogJzQyJyB9IH1cbiAgICAgIGNvbnN0IHJlc29sdmUgPSAob3ZlcnJpZGVzOiBQYXJ0aWFsPFBhcmFtZXRlcnM8dHlwZW9mIHJlc29sdmVQZW5kaW5nTXVsdGlwbGVDaG9pY2U+WzBdPiA9IHt9KSA9PlxuICAgICAgICByZXNvbHZlUGVuZGluZ011bHRpcGxlQ2hvaWNlKHtcbiAgICAgICAgICBtZXNzYWdlczogW2Fzc2lzdGFudF0sXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGRpc21pc3NlZE1lc3NhZ2VJZHM6IHt9LFxuICAgICAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICAgICAgfSlcblxuICAgICAgaXQoJ3JldHVybnMgdGhlIGNob2ljZSBvZiB0aGUgbGFzdCBhc3Npc3RhbnQgbWVzc2FnZScsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc29sdmUoKSkudG9FcXVhbCh7IG1lc3NhZ2VJZDogJ2Fzc2lzdGFudC0xJywgcXVlc3Rpb246ICfCv0VuIHF1w6kgcHJveWVjdG8gbGEgY3Jlbz8nLCBvcHRpb25zIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgncmV0dXJucyBudWxsIG9uY2UgdGhlIGNvbnZlcnNhdGlvbiBtb3ZlZCBvbiwgd2hpbGUgc3RyZWFtaW5nIG9yIHdoZW4gZGlzbWlzc2VkJywgKCkgPT4ge1xuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IG1lc3NhZ2VzOiBbYXNzaXN0YW50LCB1c2VyXSB9KSkudG9CZU51bGwoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IGlzU3RyZWFtaW5nOiB0cnVlIH0pKS50b0JlTnVsbCgpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlKHsgZGlzbWlzc2VkTWVzc2FnZUlkczogeyAnYXNzaXN0YW50LTEnOiB0cnVlIH0gfSkpLnRvQmVOdWxsKClcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdyZXR1cm5zIG51bGwgZm9yIGVycm9yZWQsIGNhbmNlbGxlZCwgYXBwcm92YWwgb3Igc2luZ2xlLW9wdGlvbiBtZXNzYWdlcycsICgpID0+IHtcbiAgICAgICAgZXhwZWN0KHJlc29sdmUoeyBtZXNzYWdlczogW3sgLi4uYXNzaXN0YW50LCBpc0Vycm9yOiB0cnVlIH1dIH0pKS50b0JlTnVsbCgpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlKHsgbWVzc2FnZXM6IFt7IC4uLmFzc2lzdGFudCwgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSB9XSB9KSkudG9CZU51bGwoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IG1lc3NhZ2VzOiBbeyAuLi5hc3Npc3RhbnQsIGFwcHJvdmFsOiB7fSB9XSB9KSkudG9CZU51bGwoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZSh7IG1lc3NhZ2VzOiBbeyAuLi5hc3Npc3RhbnQsIG11bHRpcGxlQ2hvaWNlOiB7IG9wdGlvbnM6IFtvcHRpb25zWzBdXSB9IH1dIH0pKS50b0JlTnVsbCgpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlKHsgbWVzc2FnZXM6IFt7IC4uLmFzc2lzdGFudCwgbXVsdGlwbGVDaG9pY2U6IG51bGwgfV0gfSkpLnRvQmVOdWxsKClcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdjb21wYXJlcyBwZW5kaW5nIGNob2ljZXMgYnkgbWVzc2FnZSwgcXVlc3Rpb24gYW5kIG9wdGlvbnMgaWRlbnRpdHknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlbmRpbmcgPSByZXNvbHZlKClcbiAgICAgICAgZXhwZWN0KGlzU2FtZVBlbmRpbmdNdWx0aXBsZUNob2ljZShwZW5kaW5nLCByZXNvbHZlKCkpKS50b0JlKHRydWUpXG4gICAgICAgIGV4cGVjdChpc1NhbWVQZW5kaW5nTXVsdGlwbGVDaG9pY2UocGVuZGluZywgbnVsbCkpLnRvQmUoZmFsc2UpXG4gICAgICAgIGV4cGVjdChpc1NhbWVQZW5kaW5nTXVsdGlwbGVDaG9pY2UobnVsbCwgbnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIGRlc2NyaWJlKCdyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBhc3Npc3RhbnQgPSB7XG4gICAgICAgIGlkOiAnYXNzaXN0YW50LTEnLFxuICAgICAgICBtZXNzYWdlOiAnwr9FbiBxdcOpIHByb3llY3RvIGxhIGNyZW8/JyxcbiAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgdXNlcjogeyBpZDogJ2Fzc2lzdGFudCcgfSxcbiAgICAgICAgbXVsdGlwbGVDaG9pY2U6IHtcbiAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICB7IGtleTogJ0EnLCB0ZXh0OiAnUHJveWVjdG8gQWxmYScsIGRlc2NyaXB0aW9uOiAnRXF1aXBvIGRlIHByb2R1Y3RvJyB9LFxuICAgICAgICAgICAgeyBrZXk6ICdCJywgdGV4dDogJ1Byb3llY3RvIEJldGEnIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcGx5ID0gKG1lc3NhZ2U6IHN0cmluZywga2V5OiBzdHJpbmcgfCBudWxsKSA9PiAoe1xuICAgICAgICBpZDogJ3VzZXItMScsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5VU0VSLFxuICAgICAgICB1c2VyOiB7IGlkOiAnNDInIH0sXG4gICAgICAgIG11bHRpcGxlQ2hvaWNlQW5zd2VyOiB7IGtleSB9LFxuICAgICAgfSlcblxuICAgICAgaXQoJ3Jlc29sdmVzIGEgY2hvc2VuIG9wdGlvbiB3aXRoIGl0cyBudW1iZXIgYW5kIGRlc2NyaXB0aW9uIGFuZCBoaWRlcyB0aGUgdXNlciBidWJibGUnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMoW2Fzc2lzdGFudCwgcmVwbHkoJ1Byb3llY3RvIEFsZmEnLCAnQScpXSkpLnRvRXF1YWwoe1xuICAgICAgICAgIGFuc3dlcnM6IHsgJ2Fzc2lzdGFudC0xJzogeyBudW1iZXI6IDEsIHRleHQ6ICdQcm95ZWN0byBBbGZhJywgZGVzY3JpcHRpb246ICdFcXVpcG8gZGUgcHJvZHVjdG8nIH0gfSxcbiAgICAgICAgICBoaWRkZW5NZXNzYWdlSWRzOiB7ICd1c2VyLTEnOiB0cnVlIH0sXG4gICAgICAgIH0pXG4gICAgICB9KVxuXG4gICAgICBpdCgncmVzb2x2ZXMgYSB0eXBlZCBhbnN3ZXIsIG9yIGFuIHVua25vd24ga2V5LCB3aXRoIHRoZSB0ZXh0IHRoZSB1c2VyIHNlbnQnLCAoKSA9PiB7XG4gICAgICAgIGV4cGVjdChyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMoW2Fzc2lzdGFudCwgcmVwbHkoJyAgT3RybyBwcm95ZWN0byAnLCBudWxsKV0pLmFuc3dlcnMpLnRvRXF1YWwoe1xuICAgICAgICAgICdhc3Npc3RhbnQtMSc6IHsgbnVtYmVyOiBudWxsLCB0ZXh0OiAnT3RybyBwcm95ZWN0bycgfSxcbiAgICAgICAgfSlcbiAgICAgICAgZXhwZWN0KFxuICAgICAgICAgIHJlc29sdmVBbnN3ZXJlZE11bHRpcGxlQ2hvaWNlcyhbYXNzaXN0YW50LCByZXBseSgnR2FtbWEnLCAnWicpXSkuYW5zd2Vyc1snYXNzaXN0YW50LTEnXS5udW1iZXJcbiAgICAgICAgKS50b0JlTnVsbCgpXG4gICAgICB9KVxuXG4gICAgICBpdCgncmVzb2x2ZXMgYSBza2lwcGVkIHF1ZXN0aW9uIHdpdGhvdXQgdGhlIHRleHQgc2VudCB0byB0aGUgYWdlbnQnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraXBwZWQgPSB7IC4uLnJlcGx5KCdPbWl0byBlc3RhIHByZWd1bnRhLicsIG51bGwpLCBtdWx0aXBsZUNob2ljZUFuc3dlcjogeyBrZXk6IG51bGwsIHNraXBwZWQ6IHRydWUgfSB9XG4gICAgICAgIGV4cGVjdChyZXNvbHZlQW5zd2VyZWRNdWx0aXBsZUNob2ljZXMoW2Fzc2lzdGFudCwgc2tpcHBlZF0pKS50b0VxdWFsKHtcbiAgICAgICAgICBhbnN3ZXJzOiB7ICdhc3Npc3RhbnQtMSc6IHsgbnVtYmVyOiBudWxsLCB0ZXh0OiAnJywgc2tpcHBlZDogdHJ1ZSB9IH0sXG4gICAgICAgICAgaGlkZGVuTWVzc2FnZUlkczogeyAndXNlci0xJzogdHJ1ZSB9LFxuICAgICAgICB9KVxuICAgICAgfSlcblxuICAgICAgaXQoJ2xlYXZlcyByZXBsaWVzIHRoYXQgZGlkIG5vdCBjb21lIGZyb20gdGhlIGNhcmQgdW50b3VjaGVkJywgKCkgPT4ge1xuICAgICAgICBjb25zdCB7IG11bHRpcGxlQ2hvaWNlQW5zd2VyLCAuLi5wbGFpbiB9ID0gcmVwbHkoJ0FsZmEnLCAnQScpXG4gICAgICAgIGV4cGVjdChtdWx0aXBsZUNob2ljZUFuc3dlcikudG9CZURlZmluZWQoKVxuICAgICAgICBleHBlY3QocmVzb2x2ZUFuc3dlcmVkTXVsdGlwbGVDaG9pY2VzKFthc3Npc3RhbnQsIHBsYWluXSkpLnRvRXF1YWwoeyBhbnN3ZXJzOiB7fSwgaGlkZGVuTWVzc2FnZUlkczoge30gfSlcbiAgICAgICAgZXhwZWN0KHJlc29sdmVBbnN3ZXJlZE11bHRpcGxlQ2hvaWNlcyhbYXNzaXN0YW50XSkpLnRvRXF1YWwoeyBhbnN3ZXJzOiB7fSwgaGlkZGVuTWVzc2FnZUlkczoge30gfSlcbiAgICAgIH0pXG5cbiAgICAgIGl0KCdhbmNob3JzIHRoZSB0dXJuIG9uIHRoZSByZXNvbHZlZCBjYXJkIHdoZW4gdGhlIHF1ZXN0aW9uIGJ1YmJsZSBpcyBoaWRkZW4nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gW3sgaWQ6ICdhc3Npc3RhbnQtMScgfSwgeyBpZDogJ3VzZXItMScgfV1cbiAgICAgICAgZXhwZWN0KHJlc29sdmVUdXJuQW5jaG9ySWQobWVzc2FnZXMsICd1c2VyLTEnLCB7ICd1c2VyLTEnOiB0cnVlIH0pKS50b0JlKCdhc3Npc3RhbnQtMScpXG4gICAgICAgIGV4cGVjdChyZXNvbHZlVHVybkFuY2hvcklkKG1lc3NhZ2VzLCAndXNlci0xJywge30pKS50b0JlKCd1c2VyLTEnKVxuICAgICAgICBleHBlY3QocmVzb2x2ZVR1cm5BbmNob3JJZChtZXNzYWdlcywgbnVsbCwgeyAndXNlci0xJzogdHJ1ZSB9KSkudG9CZU51bGwoKVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVzIGxpc3Qgc3RyZWFtaW5nIGZsYWdzIGZvciB0aGUgbGFzdCBhc3Npc3RhbnQgcGxhY2Vob2xkZXIgb25seScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzKHtcbiAgICAgICAgICByb2xlOiBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5ULFxuICAgICAgICAgIHVzZXJJZDogJ2Fzc2lzdGFudCcsXG4gICAgICAgICAgbWVzc2FnZUlkOiAnYW5zd2VyLXR1cm4tMS1zdHJlYW1pbmcnLFxuICAgICAgICAgIGlzTGFzdE1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvRXF1YWwoeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiB0cnVlLCBpc1N0cmVhbWluZzogdHJ1ZSB9KVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyh7XG4gICAgICAgICAgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCxcbiAgICAgICAgICB1c2VySWQ6ICdhc3Npc3RhbnQnLFxuICAgICAgICAgIG1lc3NhZ2VJZDogJ2Fuc3dlci10dXJuLTEtc3RyZWFtaW5nJyxcbiAgICAgICAgICBpc0xhc3RNZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IHRydWUsXG4gICAgICAgICAgaXNXcml0aW5nOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICkudG9FcXVhbCh7IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IGZhbHNlLCBpc1N0cmVhbWluZzogZmFsc2UgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3Moe1xuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgdXNlcklkOiAnYXNzaXN0YW50JyxcbiAgICAgICAgICBtZXNzYWdlSWQ6ICdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsXG4gICAgICAgICAgaXNMYXN0TWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICB3YWl0aW5nUmVzcG9uc2U6IGZhbHNlLFxuICAgICAgICAgIGlzV3JpdGluZzogdHJ1ZSxcbiAgICAgICAgfSkuaXNTdHJlYW1pbmdcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3N1Z2dlc3Rpb25zIGFuZCBhdHRhY2htZW50cycsICgpID0+IHtcbiAgICBpdCgnaWdub3JlcyBlbXB0eSBvciBhbHJlYWR5LXNlbGVjdGVkIHN1Z2dlc3Rpb25zJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZElnbm9yZVN1Z2dlc3Rpb25DbGljaygnICAnLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2soJ3JldHJ5JywgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2soJ2dvJywgZmFsc2UpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgnZGV0ZWN0cyByZXRyeSBzdWdnZXN0aW9uIHNlbGVjdGlvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbih0cnVlLCAnUmVpbnRlbnRhcicsICdSZWludGVudGFyJykpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbihmYWxzZSwgJ1JlaW50ZW50YXInLCAnUmVpbnRlbnRhcicpKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZXMgcmV0cnkgYXR0YWNobWVudHMgZnJvbSB1c2VyIG1lc3NhZ2Ugc291cmNlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gW3sgaWQ6ICcxJywgbmFtZTogJ2EucGRmJywgc2l6ZTogMSwgdHlwZTogJ3BkZicgfV1cbiAgICAgIGV4cGVjdChyZXNvbHZlUmV0cnlBdHRhY2htZW50c0Zyb21Vc2VyTWVzc2FnZSh7IGF0dGFjaG1lbnRzIH0pKS50b0VxdWFsKGF0dGFjaG1lbnRzKVxuICAgICAgZXhwZWN0KHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlKHsgc291cmNlczogYXR0YWNobWVudHMgfSkpLnRvRXF1YWwoYXR0YWNobWVudHMpXG4gICAgICBleHBlY3QocmVzb2x2ZVJldHJ5QXR0YWNobWVudHNGcm9tVXNlck1lc3NhZ2Uoe30pKS50b0VxdWFsKFtdKVxuICAgIH0pXG5cbiAgICBpdCgnY291bnRzIGF0dGFjaG1lbnRzIGZyb20gYXR0YWNobWVudHMgb3Igc291cmNlcycsICgpID0+IHtcbiAgICAgIGV4cGVjdChjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMoeyBhdHRhY2htZW50czogW3sgaWQ6ICcxJywgbmFtZTogJ2EnLCBzaXplOiAxLCB0eXBlOiAncGRmJyB9XSB9KSkudG9CZSgxKVxuICAgICAgZXhwZWN0KGNvdW50VXNlck1lc3NhZ2VBdHRhY2htZW50cyh7IHNvdXJjZXM6IFt7IGlkOiAnMicgfV0gfSkpLnRvQmUoMSlcbiAgICAgIGV4cGVjdChjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMobnVsbCkpLnRvQmUoMClcbiAgICB9KVxuXG4gICAgaXQoJ3BpY2tzIGF0dGFjaG1lbnQgZG93bmxvYWQgc3RyYXRlZ3knLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSgnaHR0cHM6Ly9hLnRlc3QnLCBudWxsKSkudG9CZSgncmVtb3RlLXVybCcpXG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneSh1bmRlZmluZWQsIG5ldyBGaWxlKFsneCddLCAnYS50eHQnKSkpLnRvQmUoJ2xvY2FsLWZpbGUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3kodW5kZWZpbmVkLCBudWxsKSkudG9CZU51bGwoKVxuICAgIH0pXG5cbiAgICBpdCgnYmxvY2tzIHNlbGVjdGluZyBhbm90aGVyIHByb2plY3Qgb3B0aW9uIGFmdGVyIG9uZSBpcyBjaG9zZW4nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2hvdWxkT3Blbk1lc3NhZ2VPcHRpb24obnVsbCkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRPcGVuTWVzc2FnZU9wdGlvbih7IGlkOiAxIH0pKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2V4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCcsICgpID0+IHtcbiAgICBpdCgncmVtb3ZlcyBhbnN3ZXIgc2VnbWVudHMgZnJvbSB0aGUgbWVzc2FnZSBpZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQoJ3F1ZXN0aW9uLTEtYW5zd2VyLXN0cmVhbS0yJykpLnRvQmUoJ3F1ZXN0aW9uLTEtc3RyZWFtLTInKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ2F0dGFjaG1lbnRzJywgKCkgPT4ge1xuICAgIGl0KCdkZXRlY3RzIGF1ZGlvIGF0dGFjaG1lbnRzIGJ5IG1pbWUgdHlwZSwgZXh0ZW5zaW9uIG9yIG5hbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnYXVkaW8vbXBlZycsIG5hbWU6ICd2b2ljZS5tcDMnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnbXAzJywgbmFtZTogJ3ZvaWNlLm1wMycgfSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChpc0F1ZGlvQXR0YWNobWVudCh7IHR5cGU6ICd0ZXh0L3BsYWluJywgbmFtZTogJ25vdGVzLnR4dCcgfSkpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGl0KCdhbGxvd3MgcHJldmlldyBmb3IgbG9jYWwgZmlsZXMgYW5kIHJlbW90ZSB1cmxzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5PcGVuQXR0YWNobWVudFByZXZpZXcoe1xuICAgICAgICAgIGlkOiAnMScsXG4gICAgICAgICAgbmFtZTogJ2EucGRmJyxcbiAgICAgICAgICBzaXplOiAxLFxuICAgICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgICAgICAgIGZpbGU6IG5ldyBGaWxlKFsneCddLCAnYS5wZGYnKSxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhbk9wZW5BdHRhY2htZW50UHJldmlldyh7XG4gICAgICAgICAgaWQ6ICcyJyxcbiAgICAgICAgICBuYW1lOiAnYi5wZGYnLFxuICAgICAgICAgIHNpemU6IDEsXG4gICAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAgICAgICAgdXJsX29yaWdpbmFsOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9iLnBkZicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdsaXN0IG1lc3NhZ2UgdmlzaWJpbGl0eScsICgpID0+IHtcbiAgICBpdCgnc2tpcHMgZW1wdHkgbWVzc2FnZXMgdW5sZXNzIHN0cmVhbWluZyBvciByaWNoIGNvbnRlbnQgaXMgcHJlc2VudCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2Uoe1xuICAgICAgICAgIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAxLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnJyxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgc2hvdWxkU2tpcEVtcHR5Q2hhdExpc3RNZXNzYWdlKHtcbiAgICAgICAgICBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgYXR0YWNobWVudENvdW50OiAwLFxuICAgICAgICAgIHNvdXJjZUNvdW50OiAwLFxuICAgICAgICAgIG1lc3NhZ2VUZXh0OiAnaG9sYScsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgcHJvamVjdE5hbWU6ICdQcm95ZWN0bycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMSxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgaXNTdHJlYW1pbmdQbGFjZWhvbGRlcjogZmFsc2UsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogMCxcbiAgICAgICAgICBzb3VyY2VDb3VudDogMCxcbiAgICAgICAgICBtZXNzYWdlVGV4dDogJycsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgncmV0cnkgYW5kIGZlZWRiYWNrIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ21hcHMgd2FzSGVscGZ1bCB0byBmZWVkYmFjayBlbnVtJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVEaXNhYmxlRmVlZGJhY2tGcm9tV2FzSGVscGZ1bCh1bmRlZmluZWQpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZURpc2FibGVGZWVkYmFja0Zyb21XYXNIZWxwZnVsKHRydWUpKS50b0JlKEZlZWRiYWNrLlRIVU1CU19VUClcbiAgICAgIGV4cGVjdChyZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwoZmFsc2UpKS50b0JlKEZlZWRiYWNrLlRIVU1CU19ET1dOKVxuICAgIH0pXG5cbiAgICBpdCgnYWxsb3dzIHJldHJ5IGZvciBmcm9udGVuZC1jYW5jZWxsZWQgdHVybnMgd2l0aCBhIHVzZXIgbWVzc2FnZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICB0dXJuSWQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ2Jsb2NrcyByZXRyeSB3aGVuIHN0cmVhbWluZywgZXJyb3IsIGFwcHJvdmFsIG9yIG1pc3NpbmcgdXNlciBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IGZhbHNlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgdHVybklkOiAndHVybi0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IHRydWUsXG4gICAgICAgICAgaXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IGZhbHNlLFxuICAgICAgICAgIHR1cm5JZDogJ3R1cm4tMScsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICB0dXJuSWQ6ICd0dXJuLTEnLFxuICAgICAgICB9KVxuICAgICAgKS50b0JlKGZhbHNlKVxuXG4gICAgICBleHBlY3QoXG4gICAgICAgIGNhblJldHJ5QXNzaXN0YW50TWVzc2FnZSh7XG4gICAgICAgICAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogdHJ1ZSxcbiAgICAgICAgICBpc1N0cmVhbWluZzogZmFsc2UsXG4gICAgICAgICAgaXNFcnJvcjogZmFsc2UsXG4gICAgICAgICAgaGFzQXBwcm92YWw6IHRydWUsXG4gICAgICAgICAgdHVybklkOiAndHVybi0xJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZShmYWxzZSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgIGhhc1VzZXJNZXNzYWdlRm9yUmV0cnk6IHRydWUsXG4gICAgICAgICAgaXNTdHJlYW1pbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRXJyb3I6IGZhbHNlLFxuICAgICAgICAgIGhhc0FwcHJvdmFsOiBmYWxzZSxcbiAgICAgICAgICBpc0NhbmNlbGxlZDogdHJ1ZSxcbiAgICAgICAgICB0dXJuSWQ6IG51bGwsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoZmFsc2UpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlKHtcbiAgICAgICAgICBoYXNVc2VyTWVzc2FnZUZvclJldHJ5OiB0cnVlLFxuICAgICAgICAgIGlzU3RyZWFtaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Vycm9yOiBmYWxzZSxcbiAgICAgICAgICBoYXNBcHByb3ZhbDogZmFsc2UsXG4gICAgICAgICAgaXNDYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgIHR1cm5JZDogJ3R1cm4tMScsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICB9KVxuICB9KVxuXG4gIGRlc2NyaWJlKCdhdHRhY2htZW50IGRvd25sb2FkIGhlbHBlcnMnLCAoKSA9PiB7XG4gICAgaXQoJ2J1aWxkcyBmaWxlIG5hbWVzIGFuZCBwaWNrcyB0aGUgZmlyc3QgYXZhaWxhYmxlIHVybCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkRmlsZU5hbWUoeyBuYW1lOiAnYnJpZWYucGRmJywgdHlwZTogJ3BkZicgfSkpLnRvQmUoJ2JyaWVmLnBkZicpXG4gICAgICBleHBlY3QocmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEZpbGVOYW1lKHsgbmFtZTogJ2JyaWVmJywgdHlwZTogJ3BkZicgfSkpLnRvQmUoJ2JyaWVmLnBkZicpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwoe1xuICAgICAgICAgIHVybF9vcmlnaW5hbDogJ2h0dHBzOi8vYS50ZXN0L28nLFxuICAgICAgICAgIHVybF9maWxlOiAnaHR0cHM6Ly9hLnRlc3QvZicsXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUoJ2h0dHBzOi8vYS50ZXN0L28nKVxuICAgIH0pXG5cbiAgICBpdCgnZmFsbHMgYmFjayB0byB1c2VyIHNvdXJjZXMgd2hlbiBhdHRhY2htZW50cyBhcmUgbWlzc2luZycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZXMgPSBbeyBpZDogJ3MxJywgbmFtZTogJ2EucGRmJywgc2l6ZTogMSwgdHlwZTogJ3BkZicgfV1cbiAgICAgIGV4cGVjdChyZXNvbHZlTWVzc2FnZUF0dGFjaG1lbnRzKHVuZGVmaW5lZCwgZmFsc2UsIHNvdXJjZXMpKS50b0VxdWFsKHNvdXJjZXMpXG4gICAgICBleHBlY3QocmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyhbXSwgdHJ1ZSwgc291cmNlcykpLnRvRXF1YWwoW10pXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgndHVybiBzcGFjZSBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdmaW5kcyB0aGUgbGF0ZXN0IHF1ZXN0aW9uIGlkJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGZpbmRMYXN0UXVlc3Rpb25JZChbeyBpZDogJ2Fuc3dlci0xJyB9LCB7IGlkOiAncXVlc3Rpb24tOScgfSwgeyBpZDogJ3F1ZXN0aW9uLTEwJyB9XSkpLnRvQmUoJ3F1ZXN0aW9uLTEwJylcbiAgICB9KVxuXG4gICAgaXQoJ2NvbXB1dGVzIHJlc2VydmVkIGFuZCByZW1vdmFibGUgc3BhY2VyIGhlaWdodHMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoY29tcHV0ZVJlc2VydmVkVHVyblNwYWNlKDgwMCwgNjAwLCA4MDApKS50b0JlKDU2KVxuICAgICAgZXhwZWN0KGNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UoMTIwMCwgODAwLCAyMDAsIDMwMCkpLnRvQmUoMTAwKVxuICAgICAgZXhwZWN0KGNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UoMTIwMCwgODAwLCAyMDAsIDApKS50b0JlKDApXG4gICAgfSlcbiAgfSlcblxuICBkZXNjcmliZSgnYnJhbmNoIGNvdmVyYWdlIGdhcHMnLCAoKSA9PiB7XG4gICAgaXQoJ2hhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvciByZXF1aXJlcyBwbGFjZWhvbGRlciBpZCBhbmQgYWN0aXZlIHN0cmVhbScsICgpID0+IHtcbiAgICAgIGV4cGVjdChoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IodW5kZWZpbmVkLCB0cnVlLCB0cnVlKSkudG9CZShmYWxzZSlcbiAgICAgIGV4cGVjdChoYXNNZXNzYWdlTGV2ZWxTdHJlYW1JbmRpY2F0b3IoJ2Fuc3dlci10dXJuLTEtc3RyZWFtaW5nJywgZmFsc2UsIGZhbHNlKSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Nob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyByZXNwZWN0cyBkaXNhYmxlZCBjaGlwcyBvbiB0aGUgbGFzdCBtZXNzYWdlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEhpZGVBc3Npc3RhbnRTdWdnZXN0aW9ucyhmYWxzZSwgdHJ1ZSwgdHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVDaGF0TGlzdEl0ZW1TdHJlYW1pbmdGbGFncyBvbmx5IHN0cmVhbXMgdGhlIGxhc3QgYXNzaXN0YW50IHBsYWNlaG9sZGVyJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQ2hhdExpc3RJdGVtU3RyZWFtaW5nRmxhZ3Moe1xuICAgICAgICAgIHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsXG4gICAgICAgICAgdXNlcklkOiAnYXNzaXN0YW50JyxcbiAgICAgICAgICBtZXNzYWdlSWQ6ICdhbnN3ZXItdHVybi0xLXN0cmVhbWluZycsXG4gICAgICAgICAgaXNMYXN0TWVzc2FnZTogZmFsc2UsXG4gICAgICAgICAgd2FpdGluZ1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgICAgIGlzV3JpdGluZzogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyOiBmYWxzZSwgaXNTdHJlYW1pbmc6IGZhbHNlIH0pXG4gICAgfSlcblxuICAgIGl0KCdpc0F1ZGlvQXR0YWNobWVudCBkZXRlY3RzIGV4dGVuc2lvbi1vbmx5IGZpbGVzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGlzQXVkaW9BdHRhY2htZW50KHsgdHlwZTogJycsIG5hbWU6ICd2b2ljZS53YXYnIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoaXNBdWRpb0F0dGFjaG1lbnQoeyB0eXBlOiAnYXVkaW8vd2VibScsIG5hbWU6ICdjbGlwJyB9KSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgnY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3IGFjY2VwdHMgb3JpZ2luYWxGaWxlIGFuZCB1cmxfZmlsZScsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3KHtcbiAgICAgICAgICBpZDogJzEnLFxuICAgICAgICAgIG5hbWU6ICdhLnBkZicsXG4gICAgICAgICAgdHlwZTogJ3BkZicsXG4gICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICBmaWxlOiB1bmRlZmluZWQgYXMgbmV2ZXIsXG4gICAgICAgICAgb3JpZ2luYWxGaWxlOiBuZXcgRmlsZShbXSwgJ2EucGRmJyksXG4gICAgICAgIH0pXG4gICAgICApLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChcbiAgICAgICAgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3KHtcbiAgICAgICAgICBpZDogJzInLFxuICAgICAgICAgIG5hbWU6ICdiLnBkZicsXG4gICAgICAgICAgdHlwZTogJ3BkZicsXG4gICAgICAgICAgc2l6ZTogMSxcbiAgICAgICAgICBmaWxlOiB1bmRlZmluZWQgYXMgbmV2ZXIsXG4gICAgICAgICAgdXJsX2ZpbGU6ICdodHRwczovL2Nkbi9maWxlJyxcbiAgICAgICAgfSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyBpZ25vcmVzIGVtcHR5IGF0dGFjaG1lbnQgYXJyYXlzIGZvciBhc3Npc3RhbnRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMoW10sIHRydWUsIFt7IGlkOiAnczEnIH1dKSkudG9FcXVhbChbXSlcbiAgICB9KVxuXG4gICAgaXQoJ3Jlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwgZmFsbHMgYmFjayB0byB1cmxfZmlsZSBhbmQgdGh1bWJuYWlsJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRVcmwoeyB1cmxfZmlsZTogJ2h0dHBzOi8vY2RuL2ZpbGUnIH0pKS50b0JlKCdodHRwczovL2Nkbi9maWxlJylcbiAgICAgIGV4cGVjdChyZXNvbHZlQXR0YWNobWVudERvd25sb2FkVXJsKHsgdXJsX3RodW1ibmFpbDogJ2h0dHBzOi8vY2RuL3RodW1iJyB9KSkudG9CZSgnaHR0cHM6Ly9jZG4vdGh1bWInKVxuICAgIH0pXG4gIH0pXG5cbiAgZGVzY3JpYmUoJ3N0cmVhbWluZyBhbmQgc2Nyb2xsIGxpZmVjeWNsZSBoZWxwZXJzJywgKCkgPT4ge1xuICAgIGl0KCdidWlsZHMgc21vb3RoIHN0cmVhbSBvcHRpb25zIGZyb20gd2luZG93IGZsYWdzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMoeyBzdHJlYW1MYWdNczogMTAwIH0sIHRydWUpKS50b01hdGNoT2JqZWN0KHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgdGFyZ2V0TGFnTXM6IDEwMCxcbiAgICAgIH0pXG4gICAgICBleHBlY3QoXG4gICAgICAgIGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RyZWFtTGFnTXM6IDEwMCxcbiAgICAgICAgICAgIHN0cmVhbUFkYXB0OiB0cnVlLFxuICAgICAgICAgICAgc3RyZWFtQnVmZmVyTXM6IDIwMCxcbiAgICAgICAgICAgIHN0cmVhbU1pbkJ1ZmZlcjogMTAsXG4gICAgICAgICAgICBzdHJlYW1XYXJtdXBNczogNTAsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlXG4gICAgICAgIClcbiAgICAgICkudG9NYXRjaE9iamVjdCh7XG4gICAgICAgIGFkYXB0VG9CYWNrZW5kUmF0ZTogdHJ1ZSxcbiAgICAgICAgdGFyZ2V0QnVmZmVyTXM6IDIwMCxcbiAgICAgICAgbWluQnVmZmVyQ2hhcnM6IDEwLFxuICAgICAgICB3YXJtdXBNczogNTAsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGJ1aWxkU21vb3RoU3RyZWFtVGV4dE9wdGlvbnMoe30sIGZhbHNlKS5lbmFibGVkKS50b0JlKGZhbHNlKVxuICAgIH0pXG5cbiAgICBpdCgncmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzIHJldHVybnMgZW1wdHkgd2hlbiB3aW5kb3cgaXMgdW5hdmFpbGFibGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbFdpbmRvdyA9IGdsb2JhbC53aW5kb3dcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3Igc2ltdWxhdGluZyBub24tYnJvd3NlciBydW50aW1lXG4gICAgICBkZWxldGUgZ2xvYmFsLndpbmRvd1xuICAgICAgZXhwZWN0KHJlYWRTbW9vdGhTdHJlYW1XaW5kb3dGbGFncygpKS50b0VxdWFsKHt9KVxuICAgICAgZ2xvYmFsLndpbmRvdyA9IG9yaWdpbmFsV2luZG93XG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBzdHJlYW1pbmcgcmF3IHRleHQgYW5kIGhvb2sgaWRzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVTdHJlYW1pbmdSYXdUZXh0KHRydWUsICdsaXZlJywgJ2ZpbmFsJykpLnRvQmUoJ2xpdmUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkKGZhbHNlLCAnaWQtMScpKS50b0JlTnVsbCgpXG4gICAgICBleHBlY3QocmVzb2x2ZVN0cmVhbWluZ1RleHRIb29rSWQodHJ1ZSwgZmFsc2UsICdpZC0xJykpLnRvQmUoJ2lkLTEnKVxuICAgICAgZXhwZWN0KHJlc29sdmVSZWFzb25pbmdUcmFjZUhvb2tJZCh0cnVlLCB0cnVlLCAnaWQtMScpKS50b0JlKCdpZC0xJylcbiAgICB9KVxuXG4gICAgaXQoJ2d1YXJkcyBjaGF0IGluaXQsIHR1cm4gcmVzZXJ2YXRpb24gYW5kIHNjcm9sbCBlZmZlY3RzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNob3VsZEluaXRpYWxpemVDaGF0KGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24odHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRTY2hlZHVsZVR1cm5TcGFjZVJlc2VydmF0aW9uKGZhbHNlLCBmYWxzZSwgJ3F1ZXN0aW9uLTEnLCBudWxsKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNraXBNZXNzYWdlc1Njcm9sbEVmZmVjdChmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpLnRvQmUodHJ1ZSlcbiAgICAgIGV4cGVjdChzaG91bGRSdW5TZXNzaW9uQ2FjaGVTY3JvbGxUb0JvdHRvbShmYWxzZSwgJ2NoYXQtMScsIDIsIG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzKHRydWUsIGZhbHNlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZFNjcm9sbFRvQm90dG9tQWZ0ZXJMb2FkKHRydWUsIDApKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kKGZhbHNlKSkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBpdCgncmVzdG9yZXMgc2Nyb2xsIHBvc2l0aW9uIGZyb20gc2Vzc2lvbiBzbmFwc2hvdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uKG51bGwsICdjaGF0LTEnKSkudG9CZU51bGwoKVxuICAgICAgZXhwZWN0KHJlc29sdmVQZW5kaW5nU2Nyb2xsVG9wRnJvbVNlc3Npb24oeyBzY3JvbGxTZXNzaW9uSWQ6ICdjaGF0LTEnLCBzY3JvbGxUb3A6IDEyMCB9LCAnY2hhdC0xJykpLnRvQmUoMTIwKVxuICAgICAgZXhwZWN0KHNob3VsZEFwcGx5UGVuZGluZ1Njcm9sbFJlc3RvcmUoZmFsc2UsIDUwLCB0cnVlKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHNob3VsZENsZWFyU2Nyb2xsUmVzdG9yZVdpdGhvdXRDaGF0KG51bGwpKS50b0JlKHRydWUpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UoZmFsc2UsIHRydWUsIHRydWUpKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIGl0KCdyZXNvbHZlcyBsaXN0IGtleXMsIGFuYWx5dGljcyBhbmQgY2FuY2VsbGVkIGZlZWRiYWNrIHByb3BzJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVNZXNzYWdlTGlzdEl0ZW1LZXkodW5kZWZpbmVkLCAzKSkudG9CZSgnbXNnLTMnKVxuICAgICAgZXhwZWN0KHJlc29sdmVTdWdnZXN0aW9uQW5hbHl0aWNzQWdlbnRUeXBlKHRydWUsICdjbG9uZScpKS50b0JlKCdtYXJrZXRwbGFjZScpXG4gICAgICBleHBlY3QocmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQodHJ1ZSwgW3sgaWQ6IDEgfV0sICgpID0+IHVuZGVmaW5lZCkuc291cmNlcykudG9CZVVuZGVmaW5lZCgpXG4gICAgICBleHBlY3Qoc2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzKHRydWUsIFsnbm9kZSddKSkudG9CZSh0cnVlKVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxPblBhcmVudE1vZGUodHJ1ZSkpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgaXQoJ3Byb2Nlc3NlcyBzY3JvbGwgZnJhbWVzIGFuZCB0dXJuIHJlc2VydmF0aW9uIHBsYW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgZnJhbWUgPSBwcm9jZXNzQ2hhdE1lc3NhZ2VzU2Nyb2xsRnJhbWUoe1xuICAgICAgICBzY3JvbGxUb3A6IDIwMCxcbiAgICAgICAgc2Nyb2xsSGVpZ2h0OiAxMDAwLFxuICAgICAgICBjbGllbnRIZWlnaHQ6IDQwMCxcbiAgICAgICAgbGFzdFNjcm9sbFRvcDogMjUwLFxuICAgICAgICBzY3JvbGxUaHJlc2hvbGQ6IDM5LFxuICAgICAgICBhbmNob3JlZFR1cm5JZDogbnVsbCxcbiAgICAgICAgaW5pdGlhbENoYXRJZDogJ2NoYXQtMScsXG4gICAgICB9KVxuICAgICAgZXhwZWN0KGZyYW1lLnNob3VsZERyYWluVHVyblNwYWNlKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QoZnJhbWUuc2hvdWxkU2NoZWR1bGVTY3JvbGxQZXJzaXN0KS50b0JlKHRydWUpXG5cbiAgICAgIGV4cGVjdChcbiAgICAgICAgY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0KHsgY29udGFpbmVyVG9wOiAxMCwgcXVlc3Rpb25Ub3A6IDUwLCBjb250ZW50Qm90dG9tOiAyNTAsIHNjcm9sbFRvcDogMTAwIH0pXG4gICAgICApLnRvTWF0Y2hPYmplY3QoeyBxdWVzdGlvblRvcDogMTQwLCB0dXJuSGVpZ2h0OiAyMDAgfSlcblxuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlUmVzZXJ2ZVR1cm5TcGFjZVBsYW4oe1xuICAgICAgICAgIGN1cnJlbnRTY3JvbGxUb3A6IDUwMCxcbiAgICAgICAgICB0YXJnZXRTY3JvbGxUb3A6IDIwMCxcbiAgICAgICAgICBjbGllbnRIZWlnaHQ6IDQwMCxcbiAgICAgICAgICB0dXJuSGVpZ2h0OiAxMjAsXG4gICAgICAgIH0pLmtpbmRcbiAgICAgICkudG9CZSgnc2tpcC1yZXNlcnZhdGlvbicpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbih7XG4gICAgICAgICAgY3VycmVudFNjcm9sbFRvcDogNTAsXG4gICAgICAgICAgdGFyZ2V0U2Nyb2xsVG9wOiAyMDAsXG4gICAgICAgICAgY2xpZW50SGVpZ2h0OiA0MDAsXG4gICAgICAgICAgdHVybkhlaWdodDogMTIwLFxuICAgICAgICB9KS5raW5kXG4gICAgICApLnRvQmUoJ3Jlc2VydmUnKVxuICAgICAgZXhwZWN0KHJlc29sdmVTY3JvbGxUb0JvdHRvbVRhcmdldFRvcCg5MDAsIDMwMCkpLnRvQmUoNjAwKVxuICAgICAgZXhwZWN0KHJlc29sdmVDb250YWluZXJBdEJvdHRvbSh7IHNjcm9sbEhlaWdodDogMTAwLCBzY3JvbGxUb3A6IDAsIGNsaWVudEhlaWdodDogMTAwIH0pKS50b0JlKHRydWUpXG4gICAgICBleHBlY3QocmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tKG51bGwpKS50b0JlKGZhbHNlKVxuICAgICAgZXhwZWN0KHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkKHRydWUsICdpZC0xJykpLnRvQmUoJ2lkLTEnKVxuICAgICAgZXhwZWN0KGlzQXVkaW9BdHRhY2htZW50KHsgdHlwZTogdW5kZWZpbmVkIGFzIG5ldmVyLCBuYW1lOiB1bmRlZmluZWQgYXMgbmV2ZXIgfSkpLnRvQmUoZmFsc2UpXG4gICAgICBleHBlY3QocmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQoeyBhZ2VudElkOiAnYTEnIH0pKS50b0JlKCdhMScpXG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyhcbiAgICAgICAgICBbXG4gICAgICAgICAgICB7IHJvbGU6IENoYXRIaXN0b3J5Um9sZS5BU1NJU1RBTlQsIHVzZXI6IHsgaWQ6ICdhc3Npc3RhbnQnIH0gfSxcbiAgICAgICAgICAgIHsgcm9sZTogQ2hhdEhpc3RvcnlSb2xlLlVTRVIsIHVzZXI6IHsgaWQ6ICc3JyB9IH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICAnNydcbiAgICAgICAgKT8udXNlci5pZFxuICAgICAgKS50b0JlKCc3JylcbiAgICB9KVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxTQUFTQSxRQUFRLFFBQVEsb0NBQW9DO0FBQzdELFNBQVNDLGVBQWUsUUFBUSxxQkFB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