@projectcor/maia-components 2.48.1-1 → 2.49.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.
- package/README.md +2 -0
- package/lib/App.js +19 -44
- package/lib/components/atoms/ApprovalBox/ApprovalBox.helpers.js +37 -0
- package/lib/components/atoms/ApprovalBox/ApprovalBox.js +3 -37
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.js +53 -1
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.js +28 -52
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.js +37 -1
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.js +33 -66
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.js +227 -1
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.js +53 -177
- package/lib/components/atoms/ClientSelector/ClientSelector.helpers.js +26 -0
- package/lib/components/atoms/ClientSelector/ClientSelector.js +12 -21
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.js +29 -1
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.js +12 -28
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.js +1 -3
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.styles.js +7 -19
- package/lib/components/atoms/MAIAInput/MAIAInput.attachments.helpers.js +74 -0
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.js +173 -1
- package/lib/components/atoms/MAIAInput/MAIAInput.js +126 -171
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.js +47 -1
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.js +40 -61
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.js +2 -7
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.styles.js +24 -41
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.js +10 -25
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.js +43 -78
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.js +11 -9
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.js +15 -37
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.helpers.js +101 -0
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.js +21 -77
- package/lib/components/atoms/TextArea/TextArea.helpers.js +23 -0
- package/lib/components/atoms/TextArea/TextArea.js +11 -20
- package/lib/components/index.js +1 -2
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.js +30 -1
- package/lib/components/molecules/AbmSection/AbmGeneralSection.js +13 -18
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.js +48 -1
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.js +17 -26
- package/lib/components/molecules/ChatAIContent/ChatAIContent.js +3 -7
- package/lib/components/molecules/ChatAIHome/ChatAIHome.helpers.js +370 -0
- package/lib/components/molecules/ChatAIHome/ChatAIHome.js +266 -321
- package/lib/components/molecules/ChatAIHome/styles.js +78 -85
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.js +345 -1
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +201 -200
- package/lib/components/molecules/ChatAIMessages/newStyles.js +35 -32
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.js +373 -5
- package/lib/components/molecules/ChatAIModal/ChatAIModal.js +199 -271
- package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +2 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +153 -15
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.styles.js +26 -2
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.js +20 -1
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +87 -74
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.helpers.js +39 -0
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.js +30 -33
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.helpers.js +41 -0
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.js +9 -35
- package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -10
- package/lib/components/molecules/Sidebar/Sidebar.helpers.js +43 -0
- package/lib/components/molecules/Sidebar/Sidebar.js +46 -61
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.js +314 -1
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +261 -480
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.helpers.js +37 -0
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.js +13 -25
- package/lib/constants/permissions/index.js +2 -2
- package/lib/constants/permissions/utils.js +1 -4
- package/lib/dev/DevReasoningTimeline.js +37 -68
- package/lib/dev/Providers.js +3 -5
- package/lib/hooks/useAgentModel/useCreateAgent.helpers.js +144 -0
- package/lib/hooks/useAgentModel/useCreateAgent.js +38 -102
- package/lib/hooks/useChatManager/useChatManager.helpers.js +550 -1
- package/lib/hooks/useChatManager/useChatManager.js +245 -429
- package/lib/hooks/useChatMessages/useChatMessages.helpers.js +257 -1
- package/lib/hooks/useChatMessages/useChatMessages.js +50 -206
- package/lib/hooks/useContextMentions.helpers.js +61 -1
- package/lib/hooks/useContextMentions.js +5 -62
- package/lib/hooks/useEntitySearch.helpers.js +49 -1
- package/lib/hooks/useEntitySearch.js +22 -53
- package/lib/hooks/useFrequentlyUsedActions.js +22 -60
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.helpers.js +86 -0
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +8 -82
- package/lib/index.js +2 -5
- package/lib/lang/br/index.js +1 -26
- package/lib/lang/en/index.js +1 -26
- package/lib/lang/es/index.js +1 -26
- package/lib/lang/fr/index.js +1 -26
- package/lib/services/maia/Actions/getFrequentlyUsedActions.js +1 -1
- package/lib/services/maia/Agents/getAgents.helpers.js +61 -1
- package/lib/services/maia/Agents/getAgents.js +31 -59
- package/lib/services/utils/mapChatMessages.helpers.js +223 -0
- package/lib/services/utils/mapChatMessages.js +25 -249
- package/lib/store/sessions/sessionStreamManager.helpers.js +134 -0
- package/lib/store/sessions/sessionStreamManager.js +213 -273
- package/lib/styles/cascade.js +3 -29
- package/lib/styles/transitions.js +1 -3
- package/lib/types/global.d.js +1 -1
- package/lib/utils/hoursPlannerQuickActionType.js +1 -74
- package/lib/utils/renderContextMentions.helpers.js +110 -0
- package/lib/utils/renderContextMentions.js +4 -110
- package/lib/utils/streamActivityMessages.helpers.js +222 -0
- package/lib/utils/streamActivityMessages.js +21 -251
- package/package.json +1 -1
- package/lib/components/atoms/ActionableButton.spec.js +0 -111
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.spec.js +0 -52
- package/lib/components/atoms/AgentActivityIndicator/AgentActivityIndicator.utils.spec.js +0 -11
- package/lib/components/atoms/ApprovalBox/ApprovalBox.spec.js +0 -135
- package/lib/components/atoms/AttachmentCard/AttachmentCard.spec.js +0 -123
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.helpers.spec.js +0 -66
- package/lib/components/atoms/AttachmentCard/AttachmentCardAudio.spec.js +0 -211
- package/lib/components/atoms/AttachmentCard/AttachmentCardImage.spec.js +0 -78
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.helpers.spec.js +0 -41
- package/lib/components/atoms/AttachmentPreviewModal/AttachmentPreviewModal.spec.js +0 -253
- package/lib/components/atoms/AttachmentPreviewModal/ExcelPreview.spec.js +0 -80
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.helpers.spec.js +0 -33
- package/lib/components/atoms/AttachmentPreviewModal/PptPreview.spec.js +0 -25
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.helpers.spec.js +0 -11
- package/lib/components/atoms/AttachmentPreviewModal/WordPreview.spec.js +0 -77
- package/lib/components/atoms/Backdrop/Backdrop.spec.js +0 -28
- package/lib/components/atoms/CardMenu/CardMenu.spec.js +0 -56
- package/lib/components/atoms/ChatClientSelector/ChatClientSelector.spec.js +0 -67
- package/lib/components/atoms/Checkbox/Checkbox.spec.js +0 -27
- package/lib/components/atoms/Chip/Chip.spec.js +0 -82
- package/lib/components/atoms/ChipLlm/ChipLlm.spec.js +0 -26
- package/lib/components/atoms/ClientSelector/ClientSelector.spec.js +0 -88
- package/lib/components/atoms/ContextMentionChip/ContextMentionChip.spec.js +0 -29
- package/lib/components/atoms/ContextMentionChip/MentionOverflowLabel.spec.js +0 -46
- package/lib/components/atoms/ContextMentionChip/buildChipElement.helpers.spec.js +0 -77
- package/lib/components/atoms/ContextMentionChip/buildChipElement.spec.js +0 -81
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.helpers.spec.js +0 -48
- package/lib/components/atoms/ContextMentionEditor/ContextMentionEditor.spec.js +0 -231
- package/lib/components/atoms/ContextMentionItem/ContextMentionItem.spec.js +0 -107
- package/lib/components/atoms/ContextMentionPopover/ContextMentionPopover.spec.js +0 -136
- package/lib/components/atoms/CopyToClipboard.spec.js +0 -74
- package/lib/components/atoms/EditableLabel/EditableLabel.spec.js +0 -76
- package/lib/components/atoms/EntitySelector/EntitySelector.spec.js +0 -86
- package/lib/components/atoms/Expand/Expand.spec.js +0 -57
- package/lib/components/atoms/Fade/Fade.spec.js +0 -31
- package/lib/components/atoms/FeedbackButton/FeedbackButton.spec.js +0 -75
- package/lib/components/atoms/FrequentlyAskedQuestions/FrequentlyAskedQuestions.spec.js +0 -104
- package/lib/components/atoms/FrequentlyUsedActions/FrequentlyUsedActions.spec.js +0 -91
- package/lib/components/atoms/HelpButton.spec.js +0 -87
- package/lib/components/atoms/ImagePreview/ImagePreview.spec.js +0 -96
- package/lib/components/atoms/ListMenuOption/ListMenuOption.spec.js +0 -54
- package/lib/components/atoms/LoadingFaqs/LoadingFaqs.spec.js +0 -21
- package/lib/components/atoms/LoadingSearchClients/LoadingSearchClients.spec.js +0 -20
- package/lib/components/atoms/LoadingSearchProjects/LoadingSearchProjects.spec.js +0 -26
- package/lib/components/atoms/LoadingText/LoadingText.spec.js +0 -25
- package/lib/components/atoms/MAIAButton/MAIAButton.spec.js +0 -42
- package/lib/components/atoms/MAIAError/MAIAError.spec.js +0 -27
- package/lib/components/atoms/MAIAInput/MAIAInput.helpers.spec.js +0 -26
- package/lib/components/atoms/MAIAInput/MAIAInput.spec.js +0 -444
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.helpers.spec.js +0 -20
- package/lib/components/atoms/MAIAInput/MAIAInputEditor.spec.js +0 -53
- package/lib/components/atoms/MAIAInput/maiaInputLayout.spec.js +0 -22
- package/lib/components/atoms/MaiaStreamdown/MaiaStreamdown.spec.js +0 -64
- package/lib/components/atoms/MaiaWrapper/MaiaWrapper.spec.js +0 -43
- package/lib/components/atoms/MaiaWrapper/MaiaWrapperBase.spec.js +0 -114
- package/lib/components/atoms/MaiaWrapper/ModernMaiaWrapper.spec.js +0 -51
- package/lib/components/atoms/ModalClientAccess/ModalClientAccess.spec.js +0 -48
- package/lib/components/atoms/ModalProject/ModalProject.spec.js +0 -66
- package/lib/components/atoms/NextPageLoader.spec.js +0 -37
- package/lib/components/atoms/OnboardingModalButton/OnboardingModal.spec.js +0 -20
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.helpers.spec.js +0 -35
- package/lib/components/atoms/OnboardingModalButton/OnboardingModalButton.spec.js +0 -47
- package/lib/components/atoms/OptionAccessibility/OptionAccessibility.spec.js +0 -86
- package/lib/components/atoms/PrimaryButton.spec.js +0 -42
- package/lib/components/atoms/ProjectSelector/ProjectSelector.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningBlock.spec.js +0 -69
- package/lib/components/atoms/ReasoningBlock/ReasoningSteps.spec.js +0 -59
- package/lib/components/atoms/ReasoningBlock/ReasoningTimeline.spec.js +0 -170
- package/lib/components/atoms/ReasoningBlock/groupParallelSteps.spec.js +0 -199
- package/lib/components/atoms/ReasoningBlock/reasoningLeading.spec.js +0 -70
- package/lib/components/atoms/ReasoningBlock/reasoningLiveNarration.spec.js +0 -120
- package/lib/components/atoms/ReasoningBlock/reasoningMotion.js +0 -8
- package/lib/components/atoms/ReasoningBlock/reasoningTimeline.helpers.spec.js +0 -31
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.js +0 -52
- package/lib/components/atoms/ReasoningBlock/useCollapsibleHeight.spec.js +0 -90
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.js +0 -29
- package/lib/components/atoms/ReasoningBlock/useReasoningMarkerHandoff.spec.js +0 -38
- package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.spec.js +0 -16
- package/lib/components/atoms/SkillsDropdown/SkillsDropdown.spec.js +0 -107
- package/lib/components/atoms/SlashCommandChip/SlashCommandChip.spec.js +0 -24
- package/lib/components/atoms/SlashCommandDropdown/SlashCommandDropdown.spec.js +0 -85
- package/lib/components/atoms/Switch/Switch.spec.js +0 -41
- package/lib/components/atoms/TextArea/CustomTextArea.spec.js +0 -52
- package/lib/components/atoms/TextArea/TextArea.spec.js +0 -68
- package/lib/components/atoms/ThirdButton.spec.js +0 -29
- package/lib/components/atoms/VideoModal/VideoModal.spec.js +0 -68
- package/lib/components/atoms/WithAppCfg.spec.js +0 -60
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.helpers.spec.js +0 -53
- package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.spec.js +0 -495
- package/lib/components/molecules/AbmSection/AbmGeneralSection.helpers.spec.js +0 -57
- package/lib/components/molecules/AbmSection/AbmGeneralSection.spec.js +0 -227
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.helpers.spec.js +0 -108
- package/lib/components/molecules/AbmSection/AbmKnowledgeSection.spec.js +0 -254
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.helpers.spec.js +0 -50
- package/lib/components/molecules/AbmSection/AbmLoaderFiles.spec.js +0 -94
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.js +0 -83
- package/lib/components/molecules/AgentInputBlock/AgentInputBlockMessage.styles.js +0 -30
- package/lib/components/molecules/AgentInputBlock/index.js +0 -5
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.js +0 -52
- package/lib/components/molecules/AgentInputBlock/resolveAgentInputBlock.spec.js +0 -76
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.js +0 -20
- package/lib/components/molecules/AgentInputBlock/resolveLegacyContextSession.spec.js +0 -34
- package/lib/components/molecules/AgentInputBlock/useAgentChangeModelAction.js +0 -36
- package/lib/components/molecules/ChatAIClientSelector/ChatAIClientSelector.spec.js +0 -66
- package/lib/components/molecules/ChatAIContent/ChatAIContent.spec.js +0 -145
- package/lib/components/molecules/ChatAIHistory/ChatAIHistory.spec.js +0 -204
- package/lib/components/molecules/ChatAIHome/ChatAIHome.spec.js +0 -246
- package/lib/components/molecules/ChatAIHome/ChatAIHomeMaiaker.spec.js +0 -86
- package/lib/components/molecules/ChatAIMessages/ChatAICreateAgentActions.spec.js +0 -104
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.helpers.spec.js +0 -77
- package/lib/components/molecules/ChatAIMessages/ChatAIMessages.spec.js +0 -445
- package/lib/components/molecules/ChatAIMessages/ChatAISuggestions.spec.js +0 -46
- package/lib/components/molecules/ChatAIModal/ChatAIModal.helpers.spec.js +0 -471
- package/lib/components/molecules/ChatAIModal/ChatAIModal.spec.js +0 -659
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.helpers.spec.js +0 -33
- package/lib/components/molecules/ChatAIModal/components/ChatAiAgentOptions/ChatAiAgentOptions.spec.js +0 -116
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.spec.js +0 -134
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.helpers.spec.js +0 -95
- package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.spec.js +0 -241
- package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.spec.js +0 -37
- package/lib/components/molecules/ChatAIModal/constants.spec.js +0 -16
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/FloatingPanelMotion.spec.js +0 -22
- package/lib/components/molecules/ChatAIModal/floatingPanelMotion/useFloatingPanelDragTilt.spec.js +0 -67
- package/lib/components/molecules/ChatAIModal/layout.spec.js +0 -72
- package/lib/components/molecules/ChatAIMyAgents/ChatAIMyAgents.spec.js +0 -172
- package/lib/components/molecules/ChatAIMySkills/ChatAIMySkills.spec.js +0 -128
- package/lib/components/molecules/ChatAIProjectSelector/ChatAIProjectSelector.spec.js +0 -66
- package/lib/components/molecules/ChatFooter/ChatFooter.spec.js +0 -369
- package/lib/components/molecules/ChatFooter/ChatFooterCorAccess.spec.js +0 -10
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.helpers.spec.js +0 -82
- package/lib/components/molecules/ChatFooter/ChatFooterFaqs.spec.js +0 -139
- package/lib/components/molecules/ContextMentionInput/ContextMentionInput.spec.js +0 -84
- package/lib/components/molecules/MessageFeedback/MessageFeedback.spec.js +0 -116
- package/lib/components/molecules/ProjectSummaryChat/ProjectSummaryChat.spec.js +0 -126
- package/lib/components/molecules/ProjectSummaryConfig/ProjectSummaryConfig.spec.js +0 -115
- package/lib/components/molecules/ProjectSummaryContent/ProjectSummaryContent.spec.js +0 -79
- package/lib/components/molecules/ProjectSummaryModal/ProjectSummaryModal.spec.js +0 -37
- package/lib/components/molecules/Sidebar/Sidebar.spec.js +0 -453
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.helpers.spec.js +0 -391
- package/lib/components/organisms/AbmAgentModal/AbmAgentModal.spec.js +0 -1204
- package/lib/components/organisms/AbmSkillGenerateModal/AbmSkillGenerateModal.spec.js +0 -112
- package/lib/components/organisms/AbmSkillModal/AbmSkillModal.spec.js +0 -405
- package/lib/components/organisms/ChatAI/ChatAI.spec.js +0 -174
- package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -525
- package/lib/components/organisms/ChatAIPage/ChatAIPage.spec.js +0 -246
- package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.js +0 -253
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.spec.js +0 -139
- package/lib/components/organisms/ChatAIPage/ChatAIPageHeader.styles.js +0 -13
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.spec.js +0 -275
- package/lib/components/organisms/ChatAIPage/ChatAIPageHome.styles.js +0 -195
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.js +0 -94
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCardSlot.spec.js +0 -69
- package/lib/components/organisms/ChatAIPage/ChatAIPageHomeActionCards.skeleton.js +0 -38
- package/lib/components/organisms/ChatAIPage/getDaypart.js +0 -9
- package/lib/components/organisms/ChatAIPage/getDaypart.spec.js +0 -19
- package/lib/components/organisms/ChatAIPage/index.js +0 -3
- package/lib/components/organisms/ClientAIButton/ClientAIButton.spec.js +0 -53
- package/lib/components/organisms/DeleteAgentModal/DeleteAgentModal.spec.js +0 -59
- package/lib/components/organisms/DeleteQuestionModal/DeleteQuestionModal.spec.js +0 -79
- package/lib/components/organisms/EditQuestionModal/EditQuestionModal.spec.js +0 -86
- package/lib/components/organisms/ModalFileExceeds/ModalFileExceeds.spec.js +0 -49
- package/lib/components/organisms/ProjectAIButton/ProjectAIButton.spec.js +0 -67
- package/lib/components/organisms/ProjectSummary/ProjectSummary.spec.js +0 -117
- package/lib/components/organisms/SnackBar/Snackbar.spec.js +0 -66
- package/lib/components/organisms/SourcesInformation/SourceItem.spec.js +0 -19
- package/lib/components/organisms/SourcesInformation/SourcesInformationModal.spec.js +0 -52
- package/lib/constants/maiaExternalConnectorsAccess.spec.js +0 -29
- package/lib/constants/maiaFeatureAccess.spec.js +0 -30
- package/lib/constants/maiaHourAgentAccess.spec.js +0 -30
- package/lib/constants/maiaTaskPanelAccess.spec.js +0 -30
- package/lib/constants/permissions/clientRoleAccess.spec.js +0 -31
- package/lib/constants/permissions/utils.spec.js +0 -128
- package/lib/dev/DevMaiaPage.js +0 -30
- package/lib/hooks/frequentlyUsedActionsCache.js +0 -17
- package/lib/hooks/frequentlyUsedActionsCache.spec.js +0 -25
- package/lib/hooks/useAccessClient/useAccessClient.spec.js +0 -149
- package/lib/hooks/useAgentModel/useAgentModel.spec.js +0 -83
- package/lib/hooks/useAgentModel/useCreateAgent.spec.js +0 -231
- package/lib/hooks/useAgentModel/useDeleteAgent.spec.js +0 -183
- package/lib/hooks/useAgentModel/useUpdateAgent.spec.js +0 -313
- package/lib/hooks/useAgentSuggestions.spec.js +0 -89
- package/lib/hooks/useCaretPosition.spec.js +0 -58
- package/lib/hooks/useChatManager/useChatManager.helpers.spec.js +0 -506
- package/lib/hooks/useChatManager/useChatManager.spec.js +0 -1261
- package/lib/hooks/useChatMessages/useChatMessages.helpers.spec.js +0 -176
- package/lib/hooks/useChatMessages/useChatMessages.spec.js +0 -379
- package/lib/hooks/useChats/useChats.spec.js +0 -208
- package/lib/hooks/useClientSearch.helpers.spec.js +0 -52
- package/lib/hooks/useClientSearch.spec.js +0 -86
- package/lib/hooks/useContextMentions.helpers.spec.js +0 -143
- package/lib/hooks/useContextMentions.spec.js +0 -239
- package/lib/hooks/useContextPinPopover.helpers.spec.js +0 -115
- package/lib/hooks/useContextPinPopover.spec.js +0 -159
- package/lib/hooks/useContinueLegacyContextInNewChat/index.js +0 -2
- package/lib/hooks/useContinueLegacyContextInNewChat/useContinueLegacyContextInNewChat.js +0 -93
- package/lib/hooks/useDebounce.spec.js +0 -42
- package/lib/hooks/useEntitySearch.helpers.spec.js +0 -321
- package/lib/hooks/useEntitySearch.spec.js +0 -443
- package/lib/hooks/useEvent.spec.js +0 -45
- package/lib/hooks/useFrequentlyAskedQuestions.spec.js +0 -222
- package/lib/hooks/useFrequentlyUsedActions.spec.js +0 -135
- package/lib/hooks/useIsMaiaPageRoute.js +0 -26
- package/lib/hooks/useIsMaiaPageRoute.spec.js +0 -26
- package/lib/hooks/useKnowledge/deleteKnowledge.spec.js +0 -122
- package/lib/hooks/useKnowledge/downloadKnowledge.spec.js +0 -148
- package/lib/hooks/useKnowledge/saveKnowledge.spec.js +0 -104
- package/lib/hooks/useKnowledge/useKnowledgeOperations.spec.js +0 -178
- package/lib/hooks/useMaiaChatSessionMeta/index.js +0 -2
- package/lib/hooks/useMaiaChatSessionMeta/useMaiaChatSessionMeta.js +0 -24
- package/lib/hooks/useMentionAllowedTypes.spec.js +0 -89
- package/lib/hooks/useMentionPopover.helpers.spec.js +0 -71
- package/lib/hooks/useMentionPopover.spec.js +0 -215
- package/lib/hooks/useMinimizedPillBottomOffset.helpers.spec.js +0 -132
- package/lib/hooks/useMinimizedPillBottomOffset.spec.js +0 -89
- package/lib/hooks/useMinimizedPillNoveltyDot/useMinimizedPillNoveltyDot.spec.js +0 -67
- package/lib/hooks/useModal/useModal.spec.js +0 -73
- package/lib/hooks/useOrchestratorStream/useOrchestratorStream.spec.js +0 -192
- package/lib/hooks/useProjectSearch.helpers.spec.js +0 -70
- package/lib/hooks/useProjectSearch.spec.js +0 -91
- package/lib/hooks/useProjectSummary.spec.js +0 -193
- package/lib/hooks/useProjectSummaryConfig.helpers.spec.js +0 -92
- package/lib/hooks/useProjectSummaryConfig.spec.js +0 -133
- package/lib/hooks/useReasoningTrace/reasoningStore.spec.js +0 -112
- package/lib/hooks/useRecentClientsSearch.helpers.spec.js +0 -33
- package/lib/hooks/useRecentClientsSearch.spec.js +0 -85
- package/lib/hooks/useRecentContexts.spec.js +0 -139
- package/lib/hooks/useResize.spec.js +0 -37
- package/lib/hooks/useSkillsCatalog.spec.js +0 -88
- package/lib/hooks/useSlashCommands.spec.js +0 -139
- package/lib/hooks/useSmoothStreamText/useSmoothStreamText.spec.js +0 -101
- package/lib/hooks/useSnackBarManager/useSnackBarManager.spec.js +0 -33
- package/lib/hooks/useStreamResponse.spec.js +0 -199
- package/lib/hooks/useT.spec.js +0 -20
- package/lib/hooks/useToggle.spec.js +0 -33
- package/lib/hooks/useToggleFavorite/useToggleFavorite.spec.js +0 -171
- package/lib/services/maia/Access/updateAccess.spec.js +0 -137
- package/lib/services/maia/Actions/getFrequentlyUsedActions.spec.js +0 -56
- package/lib/services/maia/Actions/getSlashCommands.spec.js +0 -91
- package/lib/services/maia/Agents/connectors.spec.js +0 -359
- package/lib/services/maia/Agents/createAgent.spec.js +0 -55
- package/lib/services/maia/Agents/deleteAgent.spec.js +0 -57
- package/lib/services/maia/Agents/fetchAgentDetail.spec.js +0 -108
- package/lib/services/maia/Agents/getAgentById.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentModels.spec.js +0 -190
- package/lib/services/maia/Agents/getAgentSuggestions.spec.js +0 -89
- package/lib/services/maia/Agents/getAgents.helpers.spec.js +0 -211
- package/lib/services/maia/Agents/getAgents.spec.js +0 -697
- package/lib/services/maia/Agents/setAgentToolGroups.spec.js +0 -45
- package/lib/services/maia/Agents/toggleFavorite.spec.js +0 -59
- package/lib/services/maia/Agents/updateAgent.spec.js +0 -48
- package/lib/services/maia/Chats/deleteChat.spec.js +0 -31
- package/lib/services/maia/Chats/getChatMessages.spec.js +0 -150
- package/lib/services/maia/Chats/getChatsByUserId.spec.js +0 -149
- package/lib/services/maia/Chats/markSessionAsRead.spec.js +0 -30
- package/lib/services/maia/Chats/patchChat.spec.js +0 -41
- package/lib/services/maia/Chats/wasHelpfulChat.spec.js +0 -28
- package/lib/services/maia/Faqs/getFrequentlyAskedQuestions.spec.js +0 -58
- package/lib/services/maia/Knowledge/delete.spec.js +0 -45
- package/lib/services/maia/Knowledge/download.spec.js +0 -78
- package/lib/services/maia/Knowledge/save.spec.js +0 -58
- package/lib/services/maia/Orchestrator/orchestrator.helpers.spec.js +0 -153
- package/lib/services/maia/Orchestrator/orchestrator.spec.js +0 -181
- package/lib/services/maia/RecentClients/getRecentClients.spec.js +0 -52
- package/lib/services/maia/RecentContexts/getRecentContexts.spec.js +0 -103
- package/lib/services/maia/RecentProjects/getRecentProjects.spec.js +0 -82
- package/lib/services/maia/RecentTasks/getRecentTasks.spec.js +0 -63
- package/lib/services/maia/RecentUsers/getRecentUsers.spec.js +0 -82
- package/lib/services/maia/Skills/createSkill.spec.js +0 -68
- package/lib/services/maia/Skills/deleteSkill.spec.js +0 -42
- package/lib/services/maia/Skills/generateSkill.spec.js +0 -48
- package/lib/services/maia/Skills/getSkills.spec.js +0 -152
- package/lib/services/maia/Skills/updateSkill.spec.js +0 -62
- package/lib/services/maia/client.spec.js +0 -56
- package/lib/services/utils/fetchCOR.spec.js +0 -211
- package/lib/services/utils/getCookie.spec.js +0 -20
- package/lib/services/utils/mapChatMessages.spec.js +0 -254
- package/lib/store/chatsSidebarOptimistic.spec.js +0 -112
- package/lib/store/maiaLastChatPersistence.spec.js +0 -22
- package/lib/store/maiaPanelSessionPersistence.spec.js +0 -62
- package/lib/store/sessions/sessionNotificationSound.spec.js +0 -145
- package/lib/store/sessions/sessionNotifications.helpers.spec.js +0 -63
- package/lib/store/sessions/sessionNotifications.spec.js +0 -106
- package/lib/store/sessions/sessionStreamManager.spec.js +0 -503
- package/lib/store/sessions/sessions.types.spec.js +0 -16
- package/lib/store/sessions/useSessionsStore.spec.js +0 -135
- package/lib/store/useChatsStore.spec.js +0 -619
- package/lib/store/useFaqsStore.spec.js +0 -57
- package/lib/utils/actionCategoryMap.spec.js +0 -18
- package/lib/utils/agentDisplayName.spec.js +0 -44
- package/lib/utils/autoApproveStorage.spec.js +0 -25
- package/lib/utils/chatInputFiles.spec.js +0 -39
- package/lib/utils/contextMentionIcons.spec.js +0 -41
- package/lib/utils/contextMentionLabel.spec.js +0 -13
- package/lib/utils/contextMentionTriggers.spec.js +0 -38
- package/lib/utils/contextMentionTypeLabel.spec.js +0 -14
- package/lib/utils/corConnectorMentionTypes.spec.js +0 -23
- package/lib/utils/entityLinkRender.spec.js +0 -72
- package/lib/utils/fileDownloadHelper.spec.js +0 -67
- package/lib/utils/formatQuickActionMessage.spec.js +0 -27
- package/lib/utils/formatUnreadCount.spec.js +0 -12
- package/lib/utils/getUnitFileSize.spec.js +0 -18
- package/lib/utils/hitlAnalytics.spec.js +0 -100
- package/lib/utils/hoursPlannerQuickActionType.spec.js +0 -64
- package/lib/utils/imagePreprocessor.helpers.spec.js +0 -28
- package/lib/utils/imagePreprocessor.spec.js +0 -112
- package/lib/utils/maiaPageRoute.js +0 -24
- package/lib/utils/maiaPageRoute.spec.js +0 -23
- package/lib/utils/mapBackendLang.spec.js +0 -19
- package/lib/utils/navigateContextEntity.spec.js +0 -50
- package/lib/utils/normalizeAgentConnectors.spec.js +0 -98
- package/lib/utils/orchestratorSubagents.spec.js +0 -32
- package/lib/utils/reasoningMappers.spec.js +0 -103
- package/lib/utils/recentContextsHomeLimit.spec.js +0 -32
- package/lib/utils/renderContextMentions.spec.js +0 -158
- package/lib/utils/retryCompletion.spec.js +0 -99
- package/lib/utils/skillContentSize.spec.js +0 -13
- package/lib/utils/slashCommandMarker.spec.js +0 -43
- package/lib/utils/sortManagerHoursHomeFuas.spec.js +0 -51
- package/lib/utils/sseStreamContent.spec.js +0 -31
- package/lib/utils/streamActivityMessages.spec.js +0 -253
- package/lib/utils/validateTrimmedFields.spec.js +0 -26
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
2
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
|
|
3
3
|
import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
|
|
4
4
|
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
5
5
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
@@ -13,11 +13,9 @@ import { useGlobalContext } from '../../context/global-context';
|
|
|
13
13
|
import { useT } from '../useT';
|
|
14
14
|
import { useUser } from '../../context/cor-user';
|
|
15
15
|
import { useTabTaskDefault } from '../useTabTaskDefault';
|
|
16
|
-
import { TASK_URL_REGEX_PATTERN } from '../../constants/taskUrls';
|
|
17
16
|
import { mapCORLang } from '../../lang/utils';
|
|
18
17
|
import { useSessionsStore } from '../../store/sessions/useSessionsStore';
|
|
19
|
-
import {
|
|
20
|
-
import { buildInitialMessagePlaceholder, conversationProjectToGlobalProject, hasClientConversationMetadata, hasMeaningfulUserInitialMessage, markOpenedSessionAsReadIfVisible, resolveProjectContextFromFetch, resolveTaskFromConversationMetadata, rewriteTaskUrlsInContent, shouldApplyMultiAgentProjectContext } from './useChatMessages.helpers';
|
|
18
|
+
import { buildInitialMessagePlaceholder, conversationProjectToGlobalProject, hasClientConversationMetadata, hasMeaningfulUserInitialMessage, markOpenedSessionAsReadIfVisible, resolveProjectContextFromFetch, resolveTaskFromConversationMetadata, buildSessionConversationMeta, buildSessionMetaEventDetail, resolveFinalMessagesWithActiveStreamingTail, resolveSessionAgentFromChatLoad, rewriteMessagesForProjectTaskUrls, rewriteTaskUrlsInContent, shouldAbortStaleMessageLoad, shouldApplyMultiAgentProjectContext, shouldLoadMoreMessagesOnScroll, messagesNeedTabRewrite, upsertChatMessage } from './useChatMessages.helpers';
|
|
21
19
|
export var useChatMessages = function useChatMessages(_ref) {
|
|
22
20
|
var _user$permissions;
|
|
23
21
|
var onError = _ref.onError,
|
|
@@ -168,7 +166,7 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
168
166
|
}(), [selectAgent, setConversationContextFromMetadata]);
|
|
169
167
|
var loadMessages = useCallback(/*#__PURE__*/function () {
|
|
170
168
|
var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(options) {
|
|
171
|
-
var seq, targetChatId, agentSnapshot,
|
|
169
|
+
var seq, targetChatId, agentSnapshot, _yield$maia$Chats$get, items, nextItem, agentDeleted, agentNoPermission, hasAgentAccess, hasAgentPermission, agentTypeFromSession, agentEntityFromSession, projectIdMessage, projectNameFromSession, projectDeleted, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, sessionAgent, itemsToSet, sessionMeta, finalMessages, conversationMeta, sessionMetaEvent, paginationKey, _t;
|
|
172
170
|
return _regeneratorRuntime.wrap(function (_context3) {
|
|
173
171
|
while (1) switch (_context3.prev = _context3.next) {
|
|
174
172
|
case 0:
|
|
@@ -188,10 +186,6 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
188
186
|
setLoadingMessages(true);
|
|
189
187
|
initialLoadDone.current = false;
|
|
190
188
|
agentSnapshot = null;
|
|
191
|
-
selectAgentForSession = function selectAgentForSession(next) {
|
|
192
|
-
selectAgent(next);
|
|
193
|
-
agentSnapshot = next;
|
|
194
|
-
};
|
|
195
189
|
_context3.next = 4;
|
|
196
190
|
return maia.Chats.getChatMessages({
|
|
197
191
|
chatId: targetChatId,
|
|
@@ -217,113 +211,24 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
217
211
|
clientNameFromSession = _yield$maia$Chats$get.clientName;
|
|
218
212
|
taskIdFromSession = _yield$maia$Chats$get.taskId;
|
|
219
213
|
taskNameFromSession = _yield$maia$Chats$get.taskName;
|
|
220
|
-
if (!(seq
|
|
214
|
+
if (!shouldAbortStaleMessageLoad(seq, loadSeqRef.current, targetChatId, chatId)) {
|
|
221
215
|
_context3.next = 5;
|
|
222
216
|
break;
|
|
223
217
|
}
|
|
224
218
|
return _context3.abrupt("return");
|
|
225
219
|
case 5:
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
// Si el agente no está en la lista pero tiene permisos, acceso y no está eliminado, setearlo normalmente
|
|
240
|
-
// Excluir agentes no-custom para usuarios con roles deshabilitados
|
|
241
|
-
if (agentNoPermission && !agentDeleted && userPermissions !== null && userPermissions !== void 0 && userPermissions.view && hasAgentAccess && hasAgentPermission && !agents.find(function (agent) {
|
|
242
|
-
return agent.id === agentNoPermission.id;
|
|
243
|
-
})) {
|
|
244
|
-
selectAgentForSession(_objectSpread(_objectSpread({
|
|
245
|
-
id: agentNoPermission.id,
|
|
246
|
-
name: agentNoPermission.name,
|
|
247
|
-
emoji: agentNoPermission.emoji,
|
|
248
|
-
type: agentNoPermission.type,
|
|
249
|
-
is_from_conversation: true
|
|
250
|
-
}, agentNoPermission.connectors ? {
|
|
251
|
-
connectors: agentNoPermission.connectors
|
|
252
|
-
} : {}), projectDeleted ? {
|
|
253
|
-
project_deleted: {
|
|
254
|
-
name: projectDeleted.name
|
|
255
|
-
}
|
|
256
|
-
} : {}));
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Si el agente está en la lista y tiene acceso/permisos, actualizar project_deleted (o limpiarlo al cambiar de chat)
|
|
260
|
-
if (agentNoPermission && !agentDeleted && hasAgentAccess && hasAgentPermission && agents.find(function (a) {
|
|
261
|
-
return a.id === agentNoPermission.id;
|
|
262
|
-
})) {
|
|
263
|
-
agentInList = agents.find(function (a) {
|
|
264
|
-
return a.id === agentNoPermission.id;
|
|
265
|
-
});
|
|
266
|
-
if (agentInList) {
|
|
267
|
-
selectAgentForSession(_objectSpread(_objectSpread(_objectSpread({}, agentInList), agentNoPermission.connectors ? {
|
|
268
|
-
connectors: agentNoPermission.connectors
|
|
269
|
-
} : {}), projectDeleted ? {
|
|
270
|
-
project_deleted: {
|
|
271
|
-
name: projectDeleted.name
|
|
272
|
-
}
|
|
273
|
-
} : {
|
|
274
|
-
project_deleted: undefined
|
|
275
|
-
}));
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// Si el agente no tiene acceso o permisos según la respuesta de sessions, seleccionarlo con el flag correspondiente
|
|
280
|
-
// La validación ahora se basa en las propiedades has_agent_access y has_agent_permission de la respuesta
|
|
281
|
-
if (agentNoPermission && !agentDeleted) {
|
|
282
|
-
if (!hasAgentAccess) {
|
|
283
|
-
// Caso 1: No tiene acceso al agente
|
|
284
|
-
selectAgentForSession(_objectSpread(_objectSpread({
|
|
285
|
-
id: agentNoPermission.id,
|
|
286
|
-
name: agentNoPermission.name,
|
|
287
|
-
emoji: agentNoPermission.emoji,
|
|
288
|
-
type: agentNoPermission.type,
|
|
289
|
-
has_not_access: true
|
|
290
|
-
}, agentNoPermission.connectors ? {
|
|
291
|
-
connectors: agentNoPermission.connectors
|
|
292
|
-
} : {}), projectDeleted ? {
|
|
293
|
-
project_deleted: {
|
|
294
|
-
name: projectDeleted.name
|
|
295
|
-
}
|
|
296
|
-
} : {}));
|
|
297
|
-
} else if (!hasAgentPermission) {
|
|
298
|
-
// Caso 2: No tiene permisos para visualizar/interactuar con el agente
|
|
299
|
-
selectAgentForSession(_objectSpread(_objectSpread({
|
|
300
|
-
id: agentNoPermission.id,
|
|
301
|
-
name: agentNoPermission.name,
|
|
302
|
-
emoji: agentNoPermission.emoji,
|
|
303
|
-
type: agentNoPermission.type,
|
|
304
|
-
has_not_permissions: true
|
|
305
|
-
}, agentNoPermission.connectors ? {
|
|
306
|
-
connectors: agentNoPermission.connectors
|
|
307
|
-
} : {}), projectDeleted ? {
|
|
308
|
-
project_deleted: {
|
|
309
|
-
name: projectDeleted.name
|
|
310
|
-
}
|
|
311
|
-
} : {}));
|
|
312
|
-
} else if (projectDeleted) {
|
|
313
|
-
// Caso 3: El proyecto de la conversación fue eliminado
|
|
314
|
-
selectAgentForSession(_objectSpread(_objectSpread({
|
|
315
|
-
id: agentNoPermission.id,
|
|
316
|
-
name: agentNoPermission.name,
|
|
317
|
-
emoji: agentNoPermission.emoji,
|
|
318
|
-
type: agentNoPermission.type
|
|
319
|
-
}, agentNoPermission.connectors ? {
|
|
320
|
-
connectors: agentNoPermission.connectors
|
|
321
|
-
} : {}), {}, {
|
|
322
|
-
project_deleted: {
|
|
323
|
-
name: projectDeleted.name
|
|
324
|
-
}
|
|
325
|
-
}));
|
|
326
|
-
}
|
|
220
|
+
sessionAgent = resolveSessionAgentFromChatLoad({
|
|
221
|
+
agentDeleted: agentDeleted,
|
|
222
|
+
agentNoPermission: agentNoPermission,
|
|
223
|
+
agents: agents,
|
|
224
|
+
userCanViewAgents: Boolean(userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view),
|
|
225
|
+
hasAgentAccess: Boolean(hasAgentAccess),
|
|
226
|
+
hasAgentPermission: Boolean(hasAgentPermission),
|
|
227
|
+
projectDeleted: projectDeleted
|
|
228
|
+
});
|
|
229
|
+
if (sessionAgent) {
|
|
230
|
+
selectAgent(sessionAgent);
|
|
231
|
+
agentSnapshot = sessionAgent;
|
|
327
232
|
}
|
|
328
233
|
_context3.next = 6;
|
|
329
234
|
return setConversationContextFromMetadata({
|
|
@@ -338,8 +243,7 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
338
243
|
// Metadata de la session (agent_type / agent_entity + contexto) para el cartel de
|
|
339
244
|
// "continuar en un chat nuevo" del footer cuando se abre una conversación de un clone legacy.
|
|
340
245
|
document.dispatchEvent(new CustomEvent('maia-chat-session-meta', {
|
|
341
|
-
detail: {
|
|
342
|
-
chatId: chatId,
|
|
246
|
+
detail: buildSessionMetaEventDetail(chatId, {
|
|
343
247
|
agentType: agentTypeFromSession,
|
|
344
248
|
agentEntity: agentEntityFromSession,
|
|
345
249
|
projectId: projectIdMessage,
|
|
@@ -348,54 +252,23 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
348
252
|
clientName: clientNameFromSession,
|
|
349
253
|
taskId: taskIdFromSession,
|
|
350
254
|
taskName: taskNameFromSession
|
|
351
|
-
}
|
|
255
|
+
})
|
|
352
256
|
}));
|
|
353
|
-
|
|
354
|
-
// Si hay proyecto en la conversación, reescribir URLs de tareas con el tab del usuario (me)
|
|
355
|
-
contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
|
|
356
|
-
itemsToSet = items;
|
|
357
|
-
if (!contextProjectId) {
|
|
358
|
-
_context3.next = 8;
|
|
359
|
-
break;
|
|
360
|
-
}
|
|
361
257
|
_context3.next = 7;
|
|
362
|
-
return getTabTaskDefault
|
|
258
|
+
return rewriteMessagesForProjectTaskUrls(items, projectIdMessage, getTabTaskDefault);
|
|
363
259
|
case 7:
|
|
364
|
-
|
|
365
|
-
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
366
|
-
itemsToSet = items.map(function (item) {
|
|
367
|
-
return _objectSpread(_objectSpread({}, item), {}, {
|
|
368
|
-
message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
|
|
369
|
-
});
|
|
370
|
-
});
|
|
371
|
-
case 8:
|
|
372
|
-
// Si la sesión sigue generando (stream en background), reconstruimos el
|
|
373
|
-
// tail en vuelo (pregunta + placeholder) que aún no está persistido en el
|
|
374
|
-
// backend, mergeándolo al historial cargado sin duplicar por id.
|
|
260
|
+
itemsToSet = _context3.sent;
|
|
375
261
|
sessionMeta = useSessionsStore.getState().getMeta(chatId);
|
|
376
|
-
finalMessages = itemsToSet;
|
|
377
|
-
|
|
378
|
-
tail = useSessionsStore.getState().getMessages(chatId);
|
|
379
|
-
existingIds = new Set(itemsToSet.map(function (item) {
|
|
380
|
-
return item.id;
|
|
381
|
-
}));
|
|
382
|
-
extra = tail.filter(function (item) {
|
|
383
|
-
return !existingIds.has(item.id);
|
|
384
|
-
});
|
|
385
|
-
if (extra.length) {
|
|
386
|
-
finalMessages = [].concat(_toConsumableArray(itemsToSet), _toConsumableArray(extra));
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
conversationMeta = {
|
|
262
|
+
finalMessages = resolveFinalMessagesWithActiveStreamingTail(itemsToSet, useSessionsStore.getState().getMessages(chatId), sessionMeta === null || sessionMeta === void 0 ? void 0 : sessionMeta.status);
|
|
263
|
+
conversationMeta = buildSessionConversationMeta({
|
|
390
264
|
projectIdMessage: projectIdMessage,
|
|
391
265
|
projectNameFromSession: projectNameFromSession,
|
|
392
266
|
clientIdFromSession: clientIdFromSession,
|
|
393
267
|
clientNameFromSession: clientNameFromSession,
|
|
394
268
|
taskIdFromSession: taskIdFromSession,
|
|
395
269
|
taskNameFromSession: taskNameFromSession
|
|
396
|
-
};
|
|
397
|
-
sessionMetaEvent = {
|
|
398
|
-
chatId: chatId,
|
|
270
|
+
});
|
|
271
|
+
sessionMetaEvent = buildSessionMetaEventDetail(chatId, {
|
|
399
272
|
agentType: agentTypeFromSession,
|
|
400
273
|
agentEntity: agentEntityFromSession,
|
|
401
274
|
projectId: projectIdMessage,
|
|
@@ -404,7 +277,7 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
404
277
|
clientName: clientNameFromSession,
|
|
405
278
|
taskId: taskIdFromSession,
|
|
406
279
|
taskName: taskNameFromSession
|
|
407
|
-
};
|
|
280
|
+
});
|
|
408
281
|
setMessages(finalMessages);
|
|
409
282
|
paginationKey = Number(nextItem);
|
|
410
283
|
setLastEvaluatedKey(paginationKey);
|
|
@@ -418,25 +291,25 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
418
291
|
agentSnapshot: agentSnapshot
|
|
419
292
|
});
|
|
420
293
|
markOpenedSessionAsReadIfVisible(targetChatId);
|
|
421
|
-
_context3.next =
|
|
294
|
+
_context3.next = 9;
|
|
422
295
|
break;
|
|
423
|
-
case
|
|
424
|
-
_context3.prev =
|
|
296
|
+
case 8:
|
|
297
|
+
_context3.prev = 8;
|
|
425
298
|
_t = _context3["catch"](3);
|
|
426
|
-
if (seq
|
|
299
|
+
if (!shouldAbortStaleMessageLoad(seq, loadSeqRef.current, targetChatId, chatId)) {
|
|
427
300
|
onError === null || onError === void 0 || onError();
|
|
428
301
|
}
|
|
429
|
-
case
|
|
430
|
-
_context3.prev =
|
|
431
|
-
if (seq
|
|
302
|
+
case 9:
|
|
303
|
+
_context3.prev = 9;
|
|
304
|
+
if (!shouldAbortStaleMessageLoad(seq, loadSeqRef.current, targetChatId, chatId)) {
|
|
432
305
|
setLoadingMessages(false);
|
|
433
306
|
}
|
|
434
|
-
return _context3.finish(
|
|
435
|
-
case
|
|
307
|
+
return _context3.finish(9);
|
|
308
|
+
case 10:
|
|
436
309
|
case "end":
|
|
437
310
|
return _context3.stop();
|
|
438
311
|
}
|
|
439
|
-
}, _callee3, null, [[3, 9, 10
|
|
312
|
+
}, _callee3, null, [[3, 8, 9, 10]]);
|
|
440
313
|
}));
|
|
441
314
|
return function (_x3) {
|
|
442
315
|
return _ref5.apply(this, arguments);
|
|
@@ -444,7 +317,7 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
444
317
|
}(), [chatId, currentUser, setConversationContextFromMetadata, onError, getTabTaskDefault, restoreSessionFromStore, selectAgent, agents, t, i18n.language, userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.view]);
|
|
445
318
|
var loadMoreMessages = useCallback(/*#__PURE__*/function () {
|
|
446
319
|
var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4(container) {
|
|
447
|
-
var oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession,
|
|
320
|
+
var oldScrollTop, _yield$maia$Chats$get2, items, nextItem, projectIdMessage, projectNameFromSession, clientIdFromSession, clientNameFromSession, taskIdFromSession, taskNameFromSession, itemsToMerge, newMessages, paginationKey, _t2;
|
|
448
321
|
return _regeneratorRuntime.wrap(function (_context4) {
|
|
449
322
|
while (1) switch (_context4.prev = _context4.next) {
|
|
450
323
|
case 0:
|
|
@@ -485,24 +358,10 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
485
358
|
taskNameFromSession: taskNameFromSession
|
|
486
359
|
});
|
|
487
360
|
case 3:
|
|
488
|
-
// Si hay proyecto en la conversación, reescribir URLs de tareas en los mensajes cargados
|
|
489
|
-
contextProjectId = projectIdMessage ? parseInt(String(projectIdMessage), 10) : null;
|
|
490
|
-
itemsToMerge = items;
|
|
491
|
-
if (!contextProjectId) {
|
|
492
|
-
_context4.next = 5;
|
|
493
|
-
break;
|
|
494
|
-
}
|
|
495
361
|
_context4.next = 4;
|
|
496
|
-
return getTabTaskDefault
|
|
362
|
+
return rewriteMessagesForProjectTaskUrls(items, projectIdMessage, getTabTaskDefault);
|
|
497
363
|
case 4:
|
|
498
|
-
|
|
499
|
-
tabSegment = tab ? "/".concat(tab) : '/detail';
|
|
500
|
-
itemsToMerge = items.map(function (item) {
|
|
501
|
-
return _objectSpread(_objectSpread({}, item), {}, {
|
|
502
|
-
message: rewriteTaskUrlsInContent(item.message || '', tabSegment)
|
|
503
|
-
});
|
|
504
|
-
});
|
|
505
|
-
case 5:
|
|
364
|
+
itemsToMerge = _context4.sent;
|
|
506
365
|
// The API paginates oldest-first: subsequent pages belong after the
|
|
507
366
|
// loaded conversation, never between its first question and answer.
|
|
508
367
|
newMessages = [].concat(_toConsumableArray(messages), _toConsumableArray(itemsToMerge));
|
|
@@ -518,22 +377,22 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
518
377
|
}
|
|
519
378
|
});
|
|
520
379
|
});
|
|
521
|
-
_context4.next =
|
|
380
|
+
_context4.next = 6;
|
|
522
381
|
break;
|
|
523
|
-
case
|
|
524
|
-
_context4.prev =
|
|
382
|
+
case 5:
|
|
383
|
+
_context4.prev = 5;
|
|
525
384
|
_t2 = _context4["catch"](1);
|
|
526
385
|
onError === null || onError === void 0 || onError();
|
|
527
|
-
case
|
|
528
|
-
_context4.prev =
|
|
386
|
+
case 6:
|
|
387
|
+
_context4.prev = 6;
|
|
529
388
|
setIsLoadingMoreMessages(false);
|
|
530
389
|
isLoadingRef.current = false;
|
|
531
|
-
return _context4.finish(
|
|
532
|
-
case
|
|
390
|
+
return _context4.finish(6);
|
|
391
|
+
case 7:
|
|
533
392
|
case "end":
|
|
534
393
|
return _context4.stop();
|
|
535
394
|
}
|
|
536
|
-
}, _callee4, null, [[1, 6, 7
|
|
395
|
+
}, _callee4, null, [[1, 5, 6, 7]]);
|
|
537
396
|
}));
|
|
538
397
|
return function (_x4) {
|
|
539
398
|
return _ref6.apply(this, arguments);
|
|
@@ -544,8 +403,7 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
544
403
|
var scrollTop = container.scrollTop,
|
|
545
404
|
scrollHeight = container.scrollHeight,
|
|
546
405
|
clientHeight = container.clientHeight;
|
|
547
|
-
|
|
548
|
-
if (scrollPercentage > 90) {
|
|
406
|
+
if (shouldLoadMoreMessagesOnScroll(scrollTop, scrollHeight, clientHeight)) {
|
|
549
407
|
loadMoreMessages(container);
|
|
550
408
|
}
|
|
551
409
|
}, [loadMoreMessages]);
|
|
@@ -582,16 +440,8 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
582
440
|
var didRewriteRef = useRef(false);
|
|
583
441
|
useEffect(function () {
|
|
584
442
|
if (!tabTaskDefault || !(project !== null && project !== void 0 && project.id) || messages.length === 0) return;
|
|
585
|
-
var taskUrlRegex = new RegExp(TASK_URL_REGEX_PATTERN, 'g');
|
|
586
443
|
var tabSegment = "/".concat(tabTaskDefault);
|
|
587
|
-
var needsRewrite = messages
|
|
588
|
-
var content = msg.message || '';
|
|
589
|
-
var matches = content.match(taskUrlRegex);
|
|
590
|
-
if (!(matches !== null && matches !== void 0 && matches.length)) return false;
|
|
591
|
-
return matches.some(function (url) {
|
|
592
|
-
return !url.endsWith("/".concat(tabTaskDefault)) && !url.includes("/".concat(tabTaskDefault, "?"));
|
|
593
|
-
});
|
|
594
|
-
});
|
|
444
|
+
var needsRewrite = messagesNeedTabRewrite(messages, tabTaskDefault);
|
|
595
445
|
if (!needsRewrite) {
|
|
596
446
|
didRewriteRef.current = false;
|
|
597
447
|
return;
|
|
@@ -621,13 +471,7 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
621
471
|
syncMessagesToStore(chatId, nextMessages);
|
|
622
472
|
}, [chatId, syncMessagesToStore]);
|
|
623
473
|
var addMessage = useCallback(function (message) {
|
|
624
|
-
|
|
625
|
-
var existingMessageIndex = prev.findIndex(function (msg) {
|
|
626
|
-
return msg.id === message.id;
|
|
627
|
-
});
|
|
628
|
-
applyMessages(existingMessageIndex >= 0 ? prev.map(function (msg, index) {
|
|
629
|
-
return index === existingMessageIndex ? message : msg;
|
|
630
|
-
}) : [].concat(_toConsumableArray(prev), [message]));
|
|
474
|
+
applyMessages(upsertChatMessage(messagesRef.current, message));
|
|
631
475
|
}, [applyMessages]);
|
|
632
476
|
var removeMessage = useCallback(function (messageId) {
|
|
633
477
|
applyMessages(messagesRef.current.filter(function (msg) {
|
|
@@ -649,4 +493,4 @@ export var useChatMessages = function useChatMessages(_ref) {
|
|
|
649
493
|
handleScroll: handleScroll
|
|
650
494
|
};
|
|
651
495
|
};
|
|
652
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJtYWlhIiwidXNlR2xvYmFsQ29udGV4dCIsInVzZVQiLCJ1c2VVc2VyIiwidXNlVGFiVGFza0RlZmF1bHQiLCJUQVNLX1VSTF9SRUdFWF9QQVRURVJOIiwibWFwQ09STGFuZyIsInVzZVNlc3Npb25zU3RvcmUiLCJpc0FjdGl2ZVNlc3Npb25TdGF0dXMiLCJidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIiLCJjb252ZXJzYXRpb25Qcm9qZWN0VG9HbG9iYWxQcm9qZWN0IiwiaGFzQ2xpZW50Q29udmVyc2F0aW9uTWV0YWRhdGEiLCJoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlIiwibWFya09wZW5lZFNlc3Npb25Bc1JlYWRJZlZpc2libGUiLCJyZXNvbHZlUHJvamVjdENvbnRleHRGcm9tRmV0Y2giLCJyZXNvbHZlVGFza0Zyb21Db252ZXJzYXRpb25NZXRhZGF0YSIsInJld3JpdGVUYXNrVXJsc0luQ29udGVudCIsInNob3VsZEFwcGx5TXVsdGlBZ2VudFByb2plY3RDb250ZXh0IiwidXNlQ2hhdE1lc3NhZ2VzIiwiX3JlZiIsIl91c2VyJHBlcm1pc3Npb25zIiwib25FcnJvciIsImNoYXRJZCIsImN1cnJlbnRVc2VyIiwidXNlckluaXRpYWxNZXNzYWdlIiwiX3JlZiRhZ2VudHMiLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJpMThuIiwidXNlciIsInVzZXJQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwiYWlfYWdlbnRzIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5IiwibG9hZGluZ01lc3NhZ2VzIiwic2V0TG9hZGluZ01lc3NhZ2VzIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJtZXNzYWdlcyIsInNldE1lc3NhZ2VzIiwiX3VzZVByb2plY3RzIiwiZmV0Y2hQcm9qZWN0cyIsIl91c2VHbG9iYWxDb250ZXh0Iiwic2VsZWN0QWdlbnQiLCJzZXRDaGlwc1Byb2plY3QiLCJzZXRQcm9qZWN0Iiwic2V0Q2xpZW50Iiwic2V0VGFzayIsInByb2plY3QiLCJfdXNlVGFiVGFza0RlZmF1bHQiLCJnZXRUYWJUYXNrRGVmYXVsdCIsInRhYlRhc2tEZWZhdWx0IiwicmVmZXRjaFRhYlRhc2tEZWZhdWx0IiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImxhc3RFdmFsdWF0ZWRLZXkiLCJzZXRMYXN0RXZhbHVhdGVkS2V5IiwiaXNMb2FkaW5nUmVmIiwiaW5pdGlhbExvYWREb25lIiwicHJldmlvdXNDaGF0SWQiLCJsb2FkU2VxUmVmIiwic3luY01lc3NhZ2VzVG9TdG9yZSIsInRhcmdldENoYXRJZCIsIm5leHRNZXNzYWdlcyIsImxhc3RFdmFsdWF0ZWRLZXlWYWx1ZSIsImdldFN0YXRlIiwidW5kZWZpbmVkIiwicGF0Y2hWaWV3Q2FjaGUiLCJzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhIiwiX3JlZjMiLCJfYXN5bmNUb0dlbmVyYXRvciIsIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJtYXJrIiwiX2NhbGxlZSIsIl9yZWYyIiwicHJvamVjdElkTWVzc2FnZSIsInByb2plY3ROYW1lRnJvbVNlc3Npb24iLCJjbGllbnRJZEZyb21TZXNzaW9uIiwiY2xpZW50TmFtZUZyb21TZXNzaW9uIiwidGFza0lkRnJvbVNlc3Npb24iLCJ0YXNrTmFtZUZyb21TZXNzaW9uIiwidGFzayIsInByb2plY3RzIiwiaGFzTXVsdGlBZ2VudHNBY2Nlc3MiLCJfcmVzb2x2ZVByb2plY3RDb250ZXgiLCJjaGlwc1Byb2plY3QiLCJyZXNvbHZlZFByb2plY3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImlkIiwiTnVtYmVyIiwibmFtZSIsImFicnVwdCIsInNlbnQiLCJ3aW5kb3ciLCJNQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTIiwic3RvcCIsIl94IiwiYXBwbHkiLCJhcmd1bWVudHMiLCJyZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSIsIl9yZWY0IiwiX2NhbGxlZTIiLCJfY2FjaGUkbGFzdEV2YWx1YXRlZEsiLCJzZXNzaW9uc1N0b3JlIiwiY2FjaGVkTWVzc2FnZXMiLCJjYWNoZSIsIl9jb250ZXh0MiIsImdldE1lc3NhZ2VzIiwiZ2V0Vmlld0NhY2hlIiwiY3VycmVudCIsImFnZW50U25hcHNob3QiLCJjb252ZXJzYXRpb25NZXRhIiwic2Vzc2lvbk1ldGFFdmVudCIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiX3gyIiwibG9hZE1lc3NhZ2VzIiwiX3JlZjUiLCJfY2FsbGVlMyIsIm9wdGlvbnMiLCJzZXEiLCJzZWxlY3RBZ2VudEZvclNlc3Npb24iLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQiLCJpdGVtcyIsIm5leHRJdGVtIiwiYWdlbnREZWxldGVkIiwiYWdlbnROb1Blcm1pc3Npb24iLCJoYXNBZ2VudEFjY2VzcyIsImhhc0FnZW50UGVybWlzc2lvbiIsImFnZW50VHlwZUZyb21TZXNzaW9uIiwiYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbiIsInByb2plY3REZWxldGVkIiwiYWdlbnRJbkxpc3QiLCJjb250ZXh0UHJvamVjdElkIiwiaXRlbXNUb1NldCIsInRhYiIsInRhYlNlZ21lbnQiLCJzZXNzaW9uTWV0YSIsImZpbmFsTWVzc2FnZXMiLCJ0YWlsIiwiZXhpc3RpbmdJZHMiLCJleHRyYSIsInBhZ2luYXRpb25LZXkiLCJfdCIsIl9jb250ZXh0MyIsImZvcmNlIiwiY2FuUmVzdG9yZVNlc3Npb24iLCJDaGF0cyIsImdldENoYXRNZXNzYWdlcyIsIm9mZnNldCIsImNhbmNlbGxlZFRleHQiLCJsYW5nIiwibGFuZ3VhZ2UiLCJhZ2VudFR5cGUiLCJhZ2VudEVudGl0eSIsInByb2plY3RJZCIsInByb2plY3ROYW1lIiwiY2xpZW50SWQiLCJjbGllbnROYW1lIiwidGFza0lkIiwidGFza05hbWUiLCJfb2JqZWN0U3ByZWFkIiwiZW1vamkiLCJ0eXBlIiwiaXNfZGVsZXRlZCIsImRlbGV0ZWRfYXQiLCJkZWxldGVkQXQiLCJjb25uZWN0b3JzIiwidmlldyIsImZpbmQiLCJhZ2VudCIsImlzX2Zyb21fY29udmVyc2F0aW9uIiwicHJvamVjdF9kZWxldGVkIiwiYSIsImhhc19ub3RfYWNjZXNzIiwiaGFzX25vdF9wZXJtaXNzaW9ucyIsInBhcnNlSW50IiwiU3RyaW5nIiwiY29uY2F0IiwibWFwIiwiaXRlbSIsIm1lc3NhZ2UiLCJnZXRNZXRhIiwic3RhdHVzIiwiU2V0IiwiZmlsdGVyIiwiaGFzIiwibGVuZ3RoIiwiX3RvQ29uc3VtYWJsZUFycmF5Iiwic2V0Vmlld0NhY2hlIiwiaHlkcmF0ZWRGcm9tQXBpIiwiZmluaXNoIiwiX3gzIiwibG9hZE1vcmVNZXNzYWdlcyIsIl9yZWY2IiwiX2NhbGxlZTQiLCJjb250YWluZXIiLCJvbGRTY3JvbGxUb3AiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQyIiwiaXRlbXNUb01lcmdlIiwibmV3TWVzc2FnZXMiLCJfdDIiLCJfY29udGV4dDQiLCJzY3JvbGxUb3AiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjb250YWluZXJSZWYiLCJfeDQiLCJoYW5kbGVTY3JvbGwiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJzY3JvbGxQZXJjZW50YWdlIiwiY2FuUmVzdG9yZSIsInBlbmRpbmdJbml0aWFsTWVzc2FnZSIsImVycm9yIiwiY29uc29sZSIsImRpZFJld3JpdGVSZWYiLCJ0YXNrVXJsUmVnZXgiLCJSZWdFeHAiLCJuZWVkc1Jld3JpdGUiLCJzb21lIiwibXNnIiwiY29udGVudCIsIm1hdGNoZXMiLCJtYXRjaCIsInVybCIsImVuZHNXaXRoIiwiaW5jbHVkZXMiLCJyZXdyaXR0ZW4iLCJtZXNzYWdlc1JlZiIsImFwcGx5TWVzc2FnZXMiLCJhZGRNZXNzYWdlIiwiZXhpc3RpbmdNZXNzYWdlSW5kZXgiLCJmaW5kSW5kZXgiLCJpbmRleCIsInJlbW92ZU1lc3NhZ2UiLCJtZXNzYWdlSWQiLCJoYXNNb3JlTWVzc2FnZXMiLCJyZXBsYWNlTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaG9va3MvdXNlQ2hhdE1lc3NhZ2VzL3VzZUNoYXRNZXNzYWdlcy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvaW5kZW50ICovXG5pbXBvcnQgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VQcm9qZWN0cyB9IGZyb20gJy4uL3VzZVByb2plY3RzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UgfSBmcm9tICcuLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IG1haWEgZnJvbSAnLi4vLi4vc2VydmljZXMvbWFpYSdcbmltcG9ydCB7IFVzZUNoYXRNZXNzYWdlc1Byb3BzIH0gZnJvbSAnLi91c2VDaGF0TWVzc2FnZXMuaW50ZXJmYWNlJ1xuaW1wb3J0IHsgdXNlR2xvYmFsQ29udGV4dCB9IGZyb20gJy4uLy4uL2NvbnRleHQvZ2xvYmFsLWNvbnRleHQnXG5pbXBvcnQgeyB1c2VUIH0gZnJvbSAnLi4vdXNlVCdcbmltcG9ydCB7IHVzZVVzZXIgfSBmcm9tICcuLi8uLi9jb250ZXh0L2Nvci11c2VyJ1xuaW1wb3J0IHsgdXNlVGFiVGFza0RlZmF1bHQgfSBmcm9tICcuLi91c2VUYWJUYXNrRGVmYXVsdCdcbmltcG9ydCB7IFRBU0tfVVJMX1JFR0VYX1BBVFRFUk4gfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdGFza1VybHMnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHsgaXNBY3RpdmVTZXNzaW9uU3RhdHVzIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5pbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgdHlwZSB7IFNlc3Npb25Db252ZXJzYXRpb25NZXRhLCBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsIH0gZnJvbSAnLi4vLi4vc3RvcmUvc2Vzc2lvbnMvc2Vzc2lvbnMudHlwZXMnXG5pbXBvcnQge1xuICBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIsXG4gIGNvbnZlcnNhdGlvblByb2plY3RUb0dsb2JhbFByb2plY3QsXG4gIGhhc0NsaWVudENvbnZlcnNhdGlvbk1ldGFkYXRhLFxuICBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlLFxuICBtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSxcbiAgcmVzb2x2ZVByb2plY3RDb250ZXh0RnJvbUZldGNoLFxuICByZXNvbHZlVGFza0Zyb21Db252ZXJzYXRpb25NZXRhZGF0YSxcbiAgcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50LFxuICBzaG91bGRBcHBseU11bHRpQWdlbnRQcm9qZWN0Q29udGV4dCxcbn0gZnJvbSAnLi91c2VDaGF0TWVzc2FnZXMuaGVscGVycydcblxudHlwZSBMb2FkTWVzc2FnZXNPcHRpb25zID0ge1xuICAvKiogSWdub3JhIGNhY2hlIGVuIG1lbW9yaWEgeSB2dWVsdmUgYSBwZWRpciBnZXRDaGF0TWVzc2FnZXMuICovXG4gIGZvcmNlPzogYm9vbGVhblxufVxuXG5leHBvcnQgY29uc3QgdXNlQ2hhdE1lc3NhZ2VzID0gKHtcbiAgb25FcnJvcixcbiAgY2hhdElkLFxuICBjdXJyZW50VXNlcixcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBhZ2VudHMgPSBbXSxcbn06IFVzZUNoYXRNZXNzYWdlc1Byb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCwgaTE4biB9ID0gdXNlVCgpXG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyKClcbiAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gdXNlcj8ucGVybWlzc2lvbnM/LmFpX2FnZW50c1xuICBjb25zdCBbbG9hZGluZ01lc3NhZ2VzLCBzZXRMb2FkaW5nTWVzc2FnZXNdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFttZXNzYWdlcywgc2V0TWVzc2FnZXNdID0gdXNlU3RhdGU8Q2hhdE1lc3NhZ2VbXT4oKCkgPT5cbiAgICBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZSkgJiYgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICA/IGJ1aWxkSW5pdGlhbE1lc3NhZ2VQbGFjZWhvbGRlcih1c2VySW5pdGlhbE1lc3NhZ2UsIGN1cnJlbnRVc2VyKVxuICAgICAgOiBbXVxuICApXG4gIGNvbnN0IHsgZmV0Y2hQcm9qZWN0cyB9ID0gdXNlUHJvamVjdHMoKVxuICBjb25zdCB7IHNlbGVjdEFnZW50LCBzZXRDaGlwc1Byb2plY3QsIHNldFByb2plY3QsIHNldENsaWVudCwgc2V0VGFzaywgcHJvamVjdCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IHsgZ2V0VGFiVGFza0RlZmF1bHQsIHRhYlRhc2tEZWZhdWx0LCByZWZldGNoVGFiVGFza0RlZmF1bHQgfSA9IHVzZVRhYlRhc2tEZWZhdWx0KClcbiAgY29uc3QgW2lzTG9hZGluZ01vcmVNZXNzYWdlcywgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbGFzdEV2YWx1YXRlZEtleSwgc2V0TGFzdEV2YWx1YXRlZEtleV0gPSB1c2VTdGF0ZTxudW1iZXIgfCB1bmRlZmluZWQ+KDApXG4gIGNvbnN0IGlzTG9hZGluZ1JlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgaW5pdGlhbExvYWREb25lID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBwcmV2aW91c0NoYXRJZCA9IHVzZVJlZihjaGF0SWQpXG4gIGNvbnN0IGxvYWRTZXFSZWYgPSB1c2VSZWYoMClcblxuICBjb25zdCBzeW5jTWVzc2FnZXNUb1N0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgKHRhcmdldENoYXRJZDogc3RyaW5nLCBuZXh0TWVzc2FnZXM6IENoYXRNZXNzYWdlW10sIGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZT86IG51bWJlcikgPT4ge1xuICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldE1lc3NhZ2VzKHRhcmdldENoYXRJZCwgbmV4dE1lc3NhZ2VzKVxuICAgICAgaWYgKGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5wYXRjaFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQsIHsgbGFzdEV2YWx1YXRlZEtleTogbGFzdEV2YWx1YXRlZEtleVZhbHVlIH0pXG4gICAgICB9XG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3Qgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh7XG4gICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgfToge1xuICAgICAgcHJvamVjdElkTWVzc2FnZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgICB0YXNrSWRGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IHRhc2sgPSByZXNvbHZlVGFza0Zyb21Db252ZXJzYXRpb25NZXRhZGF0YSh0YXNrSWRGcm9tU2Vzc2lvbiwgdGFza05hbWVGcm9tU2Vzc2lvbilcbiAgICAgIHNldFRhc2sodGFzaylcblxuICAgICAgaWYgKGhhc0NsaWVudENvbnZlcnNhdGlvbk1ldGFkYXRhKGNsaWVudElkRnJvbVNlc3Npb24sIGNsaWVudE5hbWVGcm9tU2Vzc2lvbikpIHtcbiAgICAgICAgc2V0Q2xpZW50KHsgaWQ6IE51bWJlcihjbGllbnRJZEZyb21TZXNzaW9uKSwgbmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uIGFzIHN0cmluZyB9KVxuICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBmZXRjaFByb2plY3RzKHByb2plY3RJZE1lc3NhZ2UpXG4gICAgICBjb25zdCBoYXNNdWx0aUFnZW50c0FjY2VzcyA9ICEhd2luZG93Lk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFNcblxuICAgICAgaWYgKHNob3VsZEFwcGx5TXVsdGlBZ2VudFByb2plY3RDb250ZXh0KHByb2plY3RJZE1lc3NhZ2UsIGhhc011bHRpQWdlbnRzQWNjZXNzKSkge1xuICAgICAgICBjb25zdCB7IGNoaXBzUHJvamVjdCwgcHJvamVjdDogcmVzb2x2ZWRQcm9qZWN0IH0gPSByZXNvbHZlUHJvamVjdENvbnRleHRGcm9tRmV0Y2goXG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSBhcyBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgICAgcHJvamVjdHMgfHwgW10sXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvblxuICAgICAgICApXG5cbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KGNoaXBzUHJvamVjdClcbiAgICAgICAgc2V0UHJvamVjdChjb252ZXJzYXRpb25Qcm9qZWN0VG9HbG9iYWxQcm9qZWN0KHJlc29sdmVkUHJvamVjdCkpXG4gICAgICAgIHNldENsaWVudD8uKG51bGwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDaGlwc1Byb2plY3QobnVsbClcbiAgICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2ZldGNoUHJvamVjdHMsIHNldENsaWVudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRUYXNrXVxuICApXG5cbiAgY29uc3QgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAodGFyZ2V0Q2hhdElkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHNlc3Npb25zU3RvcmUgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKClcbiAgICAgIGNvbnN0IGNhY2hlZE1lc3NhZ2VzID0gc2Vzc2lvbnNTdG9yZS5nZXRNZXNzYWdlcyh0YXJnZXRDaGF0SWQpXG4gICAgICBjb25zdCBjYWNoZSA9IHNlc3Npb25zU3RvcmUuZ2V0Vmlld0NhY2hlKHRhcmdldENoYXRJZClcblxuICAgICAgc2V0TWVzc2FnZXMoY2FjaGVkTWVzc2FnZXMpXG4gICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KGNhY2hlPy5sYXN0RXZhbHVhdGVkS2V5ID8/IDApXG4gICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IHRydWVcblxuICAgICAgaWYgKGNhY2hlPy5hZ2VudFNuYXBzaG90KSB7XG4gICAgICAgIHNlbGVjdEFnZW50KGNhY2hlLmFnZW50U25hcHNob3QpXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZT8uY29udmVyc2F0aW9uTWV0YSkge1xuICAgICAgICBhd2FpdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhKHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5wcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEuY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEuY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEudGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKGNhY2hlPy5zZXNzaW9uTWV0YUV2ZW50KSB7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywge1xuICAgICAgICAgICAgZGV0YWlsOiBjYWNoZS5zZXNzaW9uTWV0YUV2ZW50LFxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH1cblxuICAgICAgbWFya09wZW5lZFNlc3Npb25Bc1JlYWRJZlZpc2libGUodGFyZ2V0Q2hhdElkKVxuICAgIH0sXG4gICAgW3NlbGVjdEFnZW50LCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhXVxuICApXG5cbiAgY29uc3QgbG9hZE1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKG9wdGlvbnM/OiBMb2FkTWVzc2FnZXNPcHRpb25zKSA9PiB7XG4gICAgICBpZiAoIW9wdGlvbnM/LmZvcmNlICYmIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5jYW5SZXN0b3JlU2Vzc2lvbihjaGF0SWQpKSB7XG4gICAgICAgIGF3YWl0IHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlKGNoYXRJZClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxvYWRTZXFSZWYuY3VycmVudCArPSAxXG4gICAgICBjb25zdCBzZXEgPSBsb2FkU2VxUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IHRhcmdldENoYXRJZCA9IGNoYXRJZFxuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nTWVzc2FnZXModHJ1ZSlcbiAgICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgICBsZXQgYWdlbnRTbmFwc2hvdDogQWdlbnQgfCBudWxsID0gbnVsbFxuICAgICAgICBjb25zdCBzZWxlY3RBZ2VudEZvclNlc3Npb24gPSAobmV4dDogQWdlbnQpID0+IHtcbiAgICAgICAgICBzZWxlY3RBZ2VudChuZXh0KVxuICAgICAgICAgIGFnZW50U25hcHNob3QgPSBuZXh0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG5leHRJdGVtLFxuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyxcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkOiB0YXJnZXRDaGF0SWQsXG4gICAgICAgICAgY3VycmVudFVzZXIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoc2VxICE9PSBsb2FkU2VxUmVmLmN1cnJlbnQgfHwgdGFyZ2V0Q2hhdElkICE9PSBjaGF0SWQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhZ2VudERlbGV0ZWQpIHtcbiAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgaWQ6IGFnZW50RGVsZXRlZC5pZCxcbiAgICAgICAgICAgIG5hbWU6IGFnZW50RGVsZXRlZC5uYW1lLFxuICAgICAgICAgICAgZW1vamk6IGFnZW50RGVsZXRlZC5lbW9qaSxcbiAgICAgICAgICAgIHR5cGU6ICdjdXN0b20nLFxuICAgICAgICAgICAgaXNfZGVsZXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlbGV0ZWRfYXQ6IGFnZW50RGVsZXRlZC5kZWxldGVkQXQsXG4gICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24/LmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgZWwgYWdlbnRlIG5vIGVzdMOhIGVuIGxhIGxpc3RhIHBlcm8gdGllbmUgcGVybWlzb3MsIGFjY2VzbyB5IG5vIGVzdMOhIGVsaW1pbmFkbywgc2V0ZWFybG8gbm9ybWFsbWVudGVcbiAgICAgICAgLy8gRXhjbHVpciBhZ2VudGVzIG5vLWN1c3RvbSBwYXJhIHVzdWFyaW9zIGNvbiByb2xlcyBkZXNoYWJpbGl0YWRvc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgYWdlbnROb1Blcm1pc3Npb24gJiZcbiAgICAgICAgICAhYWdlbnREZWxldGVkICYmXG4gICAgICAgICAgdXNlclBlcm1pc3Npb25zPy52aWV3ICYmXG4gICAgICAgICAgaGFzQWdlbnRBY2Nlc3MgJiZcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24gJiZcbiAgICAgICAgICAhYWdlbnRzLmZpbmQoYWdlbnQgPT4gYWdlbnQuaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgaWQ6IGFnZW50Tm9QZXJtaXNzaW9uLmlkLFxuICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgIGVtb2ppOiBhZ2VudE5vUGVybWlzc2lvbi5lbW9qaSxcbiAgICAgICAgICAgIHR5cGU6IGFnZW50Tm9QZXJtaXNzaW9uLnR5cGUgYXMgJ3BtJyB8ICdjdXN0b20nIHwgJ2Nsb25lJyB8ICdvcmNoZXN0cmF0b3InLFxuICAgICAgICAgICAgaXNfZnJvbV9jb252ZXJzYXRpb246IHRydWUsXG4gICAgICAgICAgICAuLi4oYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyA/IHsgY29ubmVjdG9yczogYWdlbnROb1Blcm1pc3Npb24uY29ubmVjdG9ycyB9IDoge30pLFxuICAgICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpIGVsIGFnZW50ZSBlc3TDoSBlbiBsYSBsaXN0YSB5IHRpZW5lIGFjY2Vzby9wZXJtaXNvcywgYWN0dWFsaXphciBwcm9qZWN0X2RlbGV0ZWQgKG8gbGltcGlhcmxvIGFsIGNhbWJpYXIgZGUgY2hhdClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFnZW50Tm9QZXJtaXNzaW9uICYmXG4gICAgICAgICAgIWFnZW50RGVsZXRlZCAmJlxuICAgICAgICAgIGhhc0FnZW50QWNjZXNzICYmXG4gICAgICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uICYmXG4gICAgICAgICAgYWdlbnRzLmZpbmQoYSA9PiBhLmlkID09PSBhZ2VudE5vUGVybWlzc2lvbi5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgYWdlbnRJbkxpc3QgPSBhZ2VudHMuZmluZChhID0+IGEuaWQgPT09IGFnZW50Tm9QZXJtaXNzaW9uLmlkKVxuICAgICAgICAgIGlmIChhZ2VudEluTGlzdCkge1xuICAgICAgICAgICAgc2VsZWN0QWdlbnRGb3JTZXNzaW9uKHtcbiAgICAgICAgICAgICAgLi4uYWdlbnRJbkxpc3QsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDogeyBwcm9qZWN0X2RlbGV0ZWQ6IHVuZGVmaW5lZCB9KSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2kgZWwgYWdlbnRlIG5vIHRpZW5lIGFjY2VzbyBvIHBlcm1pc29zIHNlZ8O6biBsYSByZXNwdWVzdGEgZGUgc2Vzc2lvbnMsIHNlbGVjY2lvbmFybG8gY29uIGVsIGZsYWcgY29ycmVzcG9uZGllbnRlXG4gICAgICAgIC8vIExhIHZhbGlkYWNpw7NuIGFob3JhIHNlIGJhc2EgZW4gbGFzIHByb3BpZWRhZGVzIGhhc19hZ2VudF9hY2Nlc3MgeSBoYXNfYWdlbnRfcGVybWlzc2lvbiBkZSBsYSByZXNwdWVzdGFcbiAgICAgICAgaWYgKGFnZW50Tm9QZXJtaXNzaW9uICYmICFhZ2VudERlbGV0ZWQpIHtcbiAgICAgICAgICBpZiAoIWhhc0FnZW50QWNjZXNzKSB7XG4gICAgICAgICAgICAvLyBDYXNvIDE6IE5vIHRpZW5lIGFjY2VzbyBhbCBhZ2VudGVcbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgICAgaGFzX25vdF9hY2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIC4uLihwcm9qZWN0RGVsZXRlZCA/IHsgcHJvamVjdF9kZWxldGVkOiB7IG5hbWU6IHByb2plY3REZWxldGVkLm5hbWUgfSB9IDoge30pLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNBZ2VudFBlcm1pc3Npb24pIHtcbiAgICAgICAgICAgIC8vIENhc28gMjogTm8gdGllbmUgcGVybWlzb3MgcGFyYSB2aXN1YWxpemFyL2ludGVyYWN0dWFyIGNvbiBlbCBhZ2VudGVcbiAgICAgICAgICAgIHNlbGVjdEFnZW50Rm9yU2Vzc2lvbih7XG4gICAgICAgICAgICAgIGlkOiBhZ2VudE5vUGVybWlzc2lvbi5pZCxcbiAgICAgICAgICAgICAgbmFtZTogYWdlbnROb1Blcm1pc3Npb24ubmFtZSxcbiAgICAgICAgICAgICAgZW1vamk6IGFnZW50Tm9QZXJtaXNzaW9uLmVtb2ppLFxuICAgICAgICAgICAgICB0eXBlOiBhZ2VudE5vUGVybWlzc2lvbi50eXBlIGFzICdwbScgfCAnY3VzdG9tJyB8ICdjbG9uZScgfCAnb3JjaGVzdHJhdG9yJyxcbiAgICAgICAgICAgICAgaGFzX25vdF9wZXJtaXNzaW9uczogdHJ1ZSxcbiAgICAgICAgICAgICAgLi4uKGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgPyB7IGNvbm5lY3RvcnM6IGFnZW50Tm9QZXJtaXNzaW9uLmNvbm5lY3RvcnMgfSA6IHt9KSxcbiAgICAgICAgICAgICAgLi4uKHByb2plY3REZWxldGVkID8geyBwcm9qZWN0X2RlbGV0ZWQ6IHsgbmFtZTogcHJvamVjdERlbGV0ZWQubmFtZSB9IH0gOiB7fSksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSBpZiAocHJvamVjdERlbGV0ZWQpIHtcbiAgICAgICAgICAgIC8vIENhc28gMzogRWwgcHJveWVjdG8gZGUgbGEgY29udmVyc2FjacOzbiBmdWUgZWxpbWluYWRvXG4gICAgICAgICAgICBzZWxlY3RBZ2VudEZvclNlc3Npb24oe1xuICAgICAgICAgICAgICBpZDogYWdlbnROb1Blcm1pc3Npb24uaWQsXG4gICAgICAgICAgICAgIG5hbWU6IGFnZW50Tm9QZXJtaXNzaW9uLm5hbWUsXG4gICAgICAgICAgICAgIGVtb2ppOiBhZ2VudE5vUGVybWlzc2lvbi5lbW9qaSxcbiAgICAgICAgICAgICAgdHlwZTogYWdlbnROb1Blcm1pc3Npb24udHlwZSBhcyAncG0nIHwgJ2N1c3RvbScgfCAnY2xvbmUnIHwgJ29yY2hlc3RyYXRvcicsXG4gICAgICAgICAgICAgIC4uLihhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzID8geyBjb25uZWN0b3JzOiBhZ2VudE5vUGVybWlzc2lvbi5jb25uZWN0b3JzIH0gOiB7fSksXG4gICAgICAgICAgICAgIHByb2plY3RfZGVsZXRlZDogeyBuYW1lOiBwcm9qZWN0RGVsZXRlZC5uYW1lIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIE1ldGFkYXRhIGRlIGxhIHNlc3Npb24gKGFnZW50X3R5cGUgLyBhZ2VudF9lbnRpdHkgKyBjb250ZXh0bykgcGFyYSBlbCBjYXJ0ZWwgZGVcbiAgICAgICAgLy8gXCJjb250aW51YXIgZW4gdW4gY2hhdCBudWV2b1wiIGRlbCBmb290ZXIgY3VhbmRvIHNlIGFicmUgdW5hIGNvbnZlcnNhY2nDs24gZGUgdW4gY2xvbmUgbGVnYWN5LlxuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIHtcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuXG4gICAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGNvbiBlbCB0YWIgZGVsIHVzdWFyaW8gKG1lKVxuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gcHJvamVjdElkTWVzc2FnZSA/IHBhcnNlSW50KFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSwgMTApIDogbnVsbFxuICAgICAgICBsZXQgaXRlbXNUb1NldCA9IGl0ZW1zXG4gICAgICAgIGlmIChjb250ZXh0UHJvamVjdElkKSB7XG4gICAgICAgICAgY29uc3QgdGFiID0gYXdhaXQgZ2V0VGFiVGFza0RlZmF1bHQoMSlcbiAgICAgICAgICBjb25zdCB0YWJTZWdtZW50ID0gdGFiID8gYC8ke3RhYn1gIDogJy9kZXRhaWwnXG4gICAgICAgICAgaXRlbXNUb1NldCA9IGl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KGl0ZW0ubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgICAgICAgfSkpXG4gICAgICAgIH1cbiAgICAgICAgLy8gU2kgbGEgc2VzacOzbiBzaWd1ZSBnZW5lcmFuZG8gKHN0cmVhbSBlbiBiYWNrZ3JvdW5kKSwgcmVjb25zdHJ1aW1vcyBlbFxuICAgICAgICAvLyB0YWlsIGVuIHZ1ZWxvIChwcmVndW50YSArIHBsYWNlaG9sZGVyKSBxdWUgYcO6biBubyBlc3TDoSBwZXJzaXN0aWRvIGVuIGVsXG4gICAgICAgIC8vIGJhY2tlbmQsIG1lcmdlw6FuZG9sbyBhbCBoaXN0b3JpYWwgY2FyZ2FkbyBzaW4gZHVwbGljYXIgcG9yIGlkLlxuICAgICAgICBjb25zdCBzZXNzaW9uTWV0YSA9IHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5nZXRNZXRhKGNoYXRJZClcbiAgICAgICAgbGV0IGZpbmFsTWVzc2FnZXMgPSBpdGVtc1RvU2V0XG4gICAgICAgIGlmIChzZXNzaW9uTWV0YSAmJiBpc0FjdGl2ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbk1ldGEuc3RhdHVzKSkge1xuICAgICAgICAgIGNvbnN0IHRhaWwgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWVzc2FnZXMoY2hhdElkKVxuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldChpdGVtc1RvU2V0Lm1hcChpdGVtID0+IGl0ZW0uaWQpKVxuICAgICAgICAgIGNvbnN0IGV4dHJhID0gdGFpbC5maWx0ZXIoaXRlbSA9PiAhZXhpc3RpbmdJZHMuaGFzKGl0ZW0uaWQpKVxuICAgICAgICAgIGlmIChleHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZXMgPSBbLi4uaXRlbXNUb1NldCwgLi4uZXh0cmFdXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uTWV0YTogU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEgPSB7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXNzaW9uTWV0YUV2ZW50OiBTZXNzaW9uTWV0YUV2ZW50RGV0YWlsID0ge1xuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBhZ2VudFR5cGU6IGFnZW50VHlwZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgIHByb2plY3RJZDogcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZTogcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lOiBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkOiB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE1lc3NhZ2VzKGZpbmFsTWVzc2FnZXMpXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25LZXkgPSBOdW1iZXIobmV4dEl0ZW0pXG4gICAgICAgIHNldExhc3RFdmFsdWF0ZWRLZXkocGFnaW5hdGlvbktleSlcbiAgICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG5cbiAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldE1lc3NhZ2VzKHRhcmdldENoYXRJZCwgZmluYWxNZXNzYWdlcylcbiAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLnNldFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQsIHtcbiAgICAgICAgICBoeWRyYXRlZEZyb21BcGk6IHRydWUsXG4gICAgICAgICAgbGFzdEV2YWx1YXRlZEtleTogcGFnaW5hdGlvbktleSxcbiAgICAgICAgICBjb252ZXJzYXRpb25NZXRhLFxuICAgICAgICAgIHNlc3Npb25NZXRhRXZlbnQsXG4gICAgICAgICAgYWdlbnRTbmFwc2hvdCxcbiAgICAgICAgfSlcblxuICAgICAgICBtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSh0YXJnZXRDaGF0SWQpXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoc2VxID09PSBsb2FkU2VxUmVmLmN1cnJlbnQgJiYgdGFyZ2V0Q2hhdElkID09PSBjaGF0SWQpIHtcbiAgICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoc2VxID09PSBsb2FkU2VxUmVmLmN1cnJlbnQgJiYgdGFyZ2V0Q2hhdElkID09PSBjaGF0SWQpIHtcbiAgICAgICAgICBzZXRMb2FkaW5nTWVzc2FnZXMoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGNoYXRJZCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBnZXRUYWJUYXNrRGVmYXVsdCxcbiAgICAgIHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlLFxuICAgICAgc2VsZWN0QWdlbnQsXG4gICAgICBhZ2VudHMsXG4gICAgICB0LFxuICAgICAgaTE4bi5sYW5ndWFnZSxcbiAgICAgIHVzZXJQZXJtaXNzaW9ucz8udmlldyxcbiAgICBdXG4gIClcblxuICBjb25zdCBsb2FkTW9yZU1lc3NhZ2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWxhc3RFdmFsdWF0ZWRLZXkgfHwgIWNvbnRhaW5lcikgcmV0dXJuXG4gICAgICB0cnkge1xuICAgICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IHRydWVcbiAgICAgICAgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzKHRydWUpXG5cbiAgICAgICAgY29uc3Qgb2xkU2Nyb2xsVG9wID0gY29udGFpbmVyLnNjcm9sbFRvcFxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBpdGVtcyxcbiAgICAgICAgICBuZXh0SXRlbSxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkLFxuICAgICAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgICAgIG9mZnNldDogbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgICAgICBsYW5nOiBtYXBDT1JMYW5nKGkxOG4ubGFuZ3VhZ2UpLFxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIC8vIFNpIGhheSBwcm95ZWN0byBlbiBsYSBjb252ZXJzYWNpw7NuLCByZWVzY3JpYmlyIFVSTHMgZGUgdGFyZWFzIGVuIGxvcyBtZW5zYWplcyBjYXJnYWRvc1xuICAgICAgICBjb25zdCBjb250ZXh0UHJvamVjdElkID0gcHJvamVjdElkTWVzc2FnZSA/IHBhcnNlSW50KFN0cmluZyhwcm9qZWN0SWRNZXNzYWdlKSwgMTApIDogbnVsbFxuICAgICAgICBsZXQgaXRlbXNUb01lcmdlID0gaXRlbXNcbiAgICAgICAgaWYgKGNvbnRleHRQcm9qZWN0SWQpIHtcbiAgICAgICAgICBjb25zdCB0YWIgPSBhd2FpdCBnZXRUYWJUYXNrRGVmYXVsdCgxKVxuICAgICAgICAgIGNvbnN0IHRhYlNlZ21lbnQgPSB0YWIgPyBgLyR7dGFifWAgOiAnL2RldGFpbCdcbiAgICAgICAgICBpdGVtc1RvTWVyZ2UgPSBpdGVtcy5tYXAoaXRlbSA9PiAoe1xuICAgICAgICAgICAgLi4uaXRlbSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChpdGVtLm1lc3NhZ2UgfHwgJycsIHRhYlNlZ21lbnQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBBUEkgcGFnaW5hdGVzIG9sZGVzdC1maXJzdDogc3Vic2VxdWVudCBwYWdlcyBiZWxvbmcgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIGxvYWRlZCBjb252ZXJzYXRpb24sIG5ldmVyIGJldHdlZW4gaXRzIGZpcnN0IHF1ZXN0aW9uIGFuZCBhbnN3ZXIuXG4gICAgICAgIGNvbnN0IG5ld01lc3NhZ2VzID0gWy4uLm1lc3NhZ2VzLCAuLi5pdGVtc1RvTWVyZ2VdXG4gICAgICAgIHNldE1lc3NhZ2VzKG5ld01lc3NhZ2VzKVxuICAgICAgICBjb25zdCBwYWdpbmF0aW9uS2V5ID0gTnVtYmVyKG5leHRJdGVtKVxuICAgICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KHBhZ2luYXRpb25LZXkpXG4gICAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCBuZXdNZXNzYWdlcywgcGFnaW5hdGlvbktleSlcblxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJSZWYgPSBjb250YWluZXJcbiAgICAgICAgICAgIGlmIChjb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgICAgY29udGFpbmVyUmVmLnNjcm9sbFRvcCA9IG9sZFNjcm9sbFRvcFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0SXNMb2FkaW5nTW9yZU1lc3NhZ2VzKGZhbHNlKVxuICAgICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBjaGF0SWQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICBvbkVycm9yLFxuICAgICAgbWVzc2FnZXMsXG4gICAgICBnZXRUYWJUYXNrRGVmYXVsdCxcbiAgICAgIHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEsXG4gICAgICBzeW5jTWVzc2FnZXNUb1N0b3JlLFxuICAgIF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbCA9IHVzZUNhbGxiYWNrKFxuICAgIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKCFjb250YWluZXIgfHwgaXNMb2FkaW5nUmVmLmN1cnJlbnQgfHwgIWluaXRpYWxMb2FkRG9uZS5jdXJyZW50KSByZXR1cm5cblxuICAgICAgY29uc3QgeyBzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0IH0gPSBjb250YWluZXJcbiAgICAgIGNvbnN0IHNjcm9sbFBlcmNlbnRhZ2UgPSBzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQgPiAwID8gKHNjcm9sbFRvcCAvIChzY3JvbGxIZWlnaHQgLSBjbGllbnRIZWlnaHQpKSAqIDEwMCA6IDEwMFxuXG4gICAgICBpZiAoc2Nyb2xsUGVyY2VudGFnZSA+IDkwKSB7XG4gICAgICAgIGxvYWRNb3JlTWVzc2FnZXMoY29udGFpbmVyKVxuICAgICAgfVxuICAgIH0sXG4gICAgW2xvYWRNb3JlTWVzc2FnZXNdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChjaGF0SWQgIT09IHByZXZpb3VzQ2hhdElkLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGNhblJlc3RvcmUgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuY2FuUmVzdG9yZVNlc3Npb24oY2hhdElkKVxuXG4gICAgICBpc0xvYWRpbmdSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IGZhbHNlXG4gICAgICBwcmV2aW91c0NoYXRJZC5jdXJyZW50ID0gY2hhdElkXG4gICAgICBzZXRMYXN0RXZhbHVhdGVkS2V5KDApXG4gICAgICBsb2FkU2VxUmVmLmN1cnJlbnQgKz0gMVxuXG4gICAgICByZWZldGNoVGFiVGFza0RlZmF1bHQoKVxuXG4gICAgICBjb25zdCBwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgPSBoYXNNZWFuaW5nZnVsVXNlckluaXRpYWxNZXNzYWdlKHVzZXJJbml0aWFsTWVzc2FnZSlcblxuICAgICAgaWYgKCFwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgJiYgY2FuUmVzdG9yZSkge1xuICAgICAgICByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZShjaGF0SWQpLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlQ2hhdE1lc3NhZ2VzXSByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSBmYWlsZWQnLCBlcnJvcilcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHNldE1lc3NhZ2VzKFxuICAgICAgICBwZW5kaW5nSW5pdGlhbE1lc3NhZ2UgJiYgdXNlckluaXRpYWxNZXNzYWdlXG4gICAgICAgICAgPyBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIodXNlckluaXRpYWxNZXNzYWdlLCBjdXJyZW50VXNlcilcbiAgICAgICAgICA6IFtdXG4gICAgICApXG5cbiAgICAgIC8vIExpbXBpYXIgZWwgZXN0YWRvIGRlbCBwcm95ZWN0byB5IGxhIHRhcmVhIGN1YW5kbyBjYW1iaWEgZGUgY29udmVyc2FjacOzblxuICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICBzZXRQcm9qZWN0KG51bGwpXG4gICAgICBzZXRUYXNrKG51bGwpXG5cbiAgICAgIGlmICghcGVuZGluZ0luaXRpYWxNZXNzYWdlKSB7XG4gICAgICAgIGxvYWRNZXNzYWdlcygpXG4gICAgICB9XG4gICAgfVxuICB9LCBbXG4gICAgY2hhdElkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBjdXJyZW50VXNlcixcbiAgICBsb2FkTWVzc2FnZXMsXG4gICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUsXG4gICAgc2V0Q2hpcHNQcm9qZWN0LFxuICAgIHNldFByb2plY3QsXG4gICAgc2V0VGFzayxcbiAgICByZWZldGNoVGFiVGFza0RlZmF1bHQsXG4gIF0pXG5cbiAgLy8gQ3VhbmRvIHRhYlRhc2tEZWZhdWx0IHBhc2EgYSBlc3RhciBkaXNwb25pYmxlIGRlc3B1w6lzIGRlIGNhcmdhciwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgeWEgY2FyZ2Fkb3MuXG4gIC8vIFJlZiBwYXJhIGV2aXRhciBidWNsZTogc2V0TWVzc2FnZXMocmV3cml0dGVuKSBjYW1iaWEgbWVzc2FnZXMgeSByZS1lamVjdXRhIGVsIGVmZWN0bzsgc29sbyByZWVzY3JpYmltb3MgdW5hIHZleiBwb3IgbG90ZS5cbiAgY29uc3QgZGlkUmV3cml0ZVJlZiA9IHVzZVJlZihmYWxzZSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRhYlRhc2tEZWZhdWx0IHx8ICFwcm9qZWN0Py5pZCB8fCBtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIGNvbnN0IHRhc2tVcmxSZWdleCA9IG5ldyBSZWdFeHAoVEFTS19VUkxfUkVHRVhfUEFUVEVSTiwgJ2cnKVxuICAgIGNvbnN0IHRhYlNlZ21lbnQgPSBgLyR7dGFiVGFza0RlZmF1bHR9YFxuICAgIGNvbnN0IG5lZWRzUmV3cml0ZSA9IG1lc3NhZ2VzLnNvbWUobXNnID0+IHtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBtc2cubWVzc2FnZSB8fCAnJ1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2godGFza1VybFJlZ2V4KVxuICAgICAgaWYgKCFtYXRjaGVzPy5sZW5ndGgpIHJldHVybiBmYWxzZVxuICAgICAgcmV0dXJuIG1hdGNoZXMuc29tZSh1cmwgPT4gIXVybC5lbmRzV2l0aChgLyR7dGFiVGFza0RlZmF1bHR9YCkgJiYgIXVybC5pbmNsdWRlcyhgLyR7dGFiVGFza0RlZmF1bHR9P2ApKVxuICAgIH0pXG4gICAgaWYgKCFuZWVkc1Jld3JpdGUpIHtcbiAgICAgIGRpZFJld3JpdGVSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRpZFJld3JpdGVSZWYuY3VycmVudCkgcmV0dXJuXG4gICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgIGNvbnN0IHJld3JpdHRlbiA9IG1lc3NhZ2VzLm1hcChtc2cgPT4gKHtcbiAgICAgIC4uLm1zZyxcbiAgICAgIG1lc3NhZ2U6IHJld3JpdGVUYXNrVXJsc0luQ29udGVudChtc2cubWVzc2FnZSB8fCAnJywgdGFiU2VnbWVudCksXG4gICAgfSkpXG4gICAgc2V0TWVzc2FnZXMocmV3cml0dGVuKVxuICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCByZXdyaXR0ZW4pXG4gIH0sIFt0YWJUYXNrRGVmYXVsdCwgcHJvamVjdD8uaWQsIG1lc3NhZ2VzLCBjaGF0SWQsIHN5bmNNZXNzYWdlc1RvU3RvcmVdKVxuXG4gIC8vIEVsIHVwZGF0ZXIgZGUgYHVzZVN0YXRlYCB0aWVuZSBxdWUgc2VyIHB1cm86IFJlYWN0IGxvIGVqZWN1dGEgZW4gZmFzZSBkZVxuICAvLyByZW5kZXIgeSBgc3luY01lc3NhZ2VzVG9TdG9yZWAgZXNjcmliZSBlbiB1biBzdG9yZSBleHRlcm5vLCBsbyBxdWUgZGlzcGFyYVxuICAvLyBcIkNhbm5vdCB1cGRhdGUgYSBjb21wb25lbnQgd2hpbGUgcmVuZGVyaW5nIGEgZGlmZmVyZW50IGNvbXBvbmVudFwiLiBTZVxuICAvLyBjb21wdXRhIGNvbnRyYSBlc3RlIGVzcGVqbyBwYXJhIHBvZGVyIGVuY2FkZW5hciB2YXJpYXMgbXV0YWNpb25lcyBlbiBlbFxuICAvLyBtaXNtbyB0aWNrIChwLiBlai4gcmVtb3ZlICsgYWRkIGRlbCBzd2FwIGRlIGZpbiBkZSBzdHJlYW0pIHNpbiBkZXBlbmRlciBkZVxuICAvLyBxdWUgUmVhY3QgeWEgaGF5YSByZS1yZW5kZXJpemFkby5cbiAgY29uc3QgbWVzc2FnZXNSZWYgPSB1c2VSZWYobWVzc2FnZXMpXG4gIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1xuXG4gIGNvbnN0IGFwcGx5TWVzc2FnZXMgPSB1c2VDYWxsYmFjayhcbiAgICAobmV4dE1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdKSA9PiB7XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50ID0gbmV4dE1lc3NhZ2VzXG4gICAgICBzZXRNZXNzYWdlcyhuZXh0TWVzc2FnZXMpXG4gICAgICBzeW5jTWVzc2FnZXNUb1N0b3JlKGNoYXRJZCwgbmV4dE1lc3NhZ2VzKVxuICAgIH0sXG4gICAgW2NoYXRJZCwgc3luY01lc3NhZ2VzVG9TdG9yZV1cbiAgKVxuXG4gIGNvbnN0IGFkZE1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcbiAgICAgIGNvbnN0IHByZXYgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBjb25zdCBleGlzdGluZ01lc3NhZ2VJbmRleCA9IHByZXYuZmluZEluZGV4KG1zZyA9PiBtc2cuaWQgPT09IG1lc3NhZ2UuaWQpXG4gICAgICBhcHBseU1lc3NhZ2VzKFxuICAgICAgICBleGlzdGluZ01lc3NhZ2VJbmRleCA+PSAwXG4gICAgICAgICAgPyBwcmV2Lm1hcCgobXNnLCBpbmRleCkgPT4gKGluZGV4ID09PSBleGlzdGluZ01lc3NhZ2VJbmRleCA/IG1lc3NhZ2UgOiBtc2cpKVxuICAgICAgICAgIDogWy4uLnByZXYsIG1lc3NhZ2VdXG4gICAgICApXG4gICAgfSxcbiAgICBbYXBwbHlNZXNzYWdlc11cbiAgKVxuXG4gIGNvbnN0IHJlbW92ZU1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAobWVzc2FnZUlkOiBzdHJpbmcpID0+IHtcbiAgICAgIGFwcGx5TWVzc2FnZXMobWVzc2FnZXNSZWYuY3VycmVudC5maWx0ZXIobXNnID0+IG1zZy5pZCAhPT0gbWVzc2FnZUlkKSlcbiAgICB9LFxuICAgIFthcHBseU1lc3NhZ2VzXVxuICApXG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgbWVzc2FnZXMsXG4gICAgaGFzTW9yZU1lc3NhZ2VzOiAhIWxhc3RFdmFsdWF0ZWRLZXksXG4gICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgIGxvYWRNZXNzYWdlcyxcbiAgICBsb2FkTW9yZU1lc3NhZ2VzLFxuICAgIGFkZE1lc3NhZ2UsXG4gICAgcmVtb3ZlTWVzc2FnZSxcbiAgICAvLyBgcmVwbGFjZU1lc3NhZ2VzYCBkZSBtYXN0ZXIgaGFjw61hIGxvIG1pc21vIHF1ZSBgYXBwbHlNZXNzYWdlc2AgcGVybyBzaW5cbiAgICAvLyBzaW5jcm9uaXphciBgbWVzc2FnZXNSZWZgLCB5IGVzYSByZWYgZXMgbGEgcXVlIGV2aXRhIGxvcyB1cGRhdGVycyBpbXB1cm9zLlxuICAgIHJlcGxhY2VNZXNzYWdlczogYXBwbHlNZXNzYWdlcyxcbiAgICBoYW5kbGVTY3JvbGwsXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBO0FBQ0EsU0FBU0EsV0FBVyxFQUFFQyxRQUFRLEVBQUVDLE1BQU0sRUFBRUMsU0FBUyxRQUFRLE9BQU87QUFDaEUsU0FBU0MsV0FBVyxRQUFRLGdCQUFnQjtBQUU1QyxPQUFPQyxJQUFJLE1BQU0scUJBQXFCO0FBRXRDLFNBQVNDLGdCQUFnQixRQUFRLDhCQUE4QjtBQUMvRCxTQUFTQyxJQUFJLFFBQVEsU0FBUztBQUM5QixTQUFTQyxPQUFPLFFBQVEsd0JBQXdCO0FBQ2hELFNBQVNDLGlCQUFpQixRQUFRLHNCQUFzQjtBQUN4RCxTQUFTQyxzQkFBc0IsUUFBUSwwQkFBMEI7QUFDakUsU0FBU0MsVUFBVSxRQUFRLGtCQUFrQjtBQUM3QyxTQUFTQyxnQkFBZ0IsUUFBUSx1Q0FBdUM7QUFDeEUsU0FBU0MscUJBQXFCLFFBQVEscUNBQXFDO0FBRzNFLFNBQ0VDLDhCQUE4QixFQUM5QkMsa0NBQWtDLEVBQ2xDQyw2QkFBNkIsRUFDN0JDLCtCQUErQixFQUMvQkMsZ0NBQWdDLEVBQ2hDQyw4QkFBOEIsRUFDOUJDLG1DQUFtQyxFQUNuQ0Msd0JBQXdCLEVBQ3hCQyxtQ0FBbUMsUUFDOUIsMkJBQTJCO0FBT2xDLE9BQU8sSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFBQyxJQUFBLEVBTUE7RUFBQSxJQUFBQyxpQkFBQTtFQUFBLElBTDFCQyxPQUFP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
|
|
496
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ1c2VDYWxsYmFjayIsInVzZVN0YXRlIiwidXNlUmVmIiwidXNlRWZmZWN0IiwidXNlUHJvamVjdHMiLCJtYWlhIiwidXNlR2xvYmFsQ29udGV4dCIsInVzZVQiLCJ1c2VVc2VyIiwidXNlVGFiVGFza0RlZmF1bHQiLCJtYXBDT1JMYW5nIiwidXNlU2Vzc2lvbnNTdG9yZSIsImJ1aWxkSW5pdGlhbE1lc3NhZ2VQbGFjZWhvbGRlciIsImNvbnZlcnNhdGlvblByb2plY3RUb0dsb2JhbFByb2plY3QiLCJoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YSIsImhhc01lYW5pbmdmdWxVc2VySW5pdGlhbE1lc3NhZ2UiLCJtYXJrT3BlbmVkU2Vzc2lvbkFzUmVhZElmVmlzaWJsZSIsInJlc29sdmVQcm9qZWN0Q29udGV4dEZyb21GZXRjaCIsInJlc29sdmVUYXNrRnJvbUNvbnZlcnNhdGlvbk1ldGFkYXRhIiwiYnVpbGRTZXNzaW9uQ29udmVyc2F0aW9uTWV0YSIsImJ1aWxkU2Vzc2lvbk1ldGFFdmVudERldGFpbCIsInJlc29sdmVGaW5hbE1lc3NhZ2VzV2l0aEFjdGl2ZVN0cmVhbWluZ1RhaWwiLCJyZXNvbHZlU2Vzc2lvbkFnZW50RnJvbUNoYXRMb2FkIiwicmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzIiwicmV3cml0ZVRhc2tVcmxzSW5Db250ZW50Iiwic2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkIiwic2hvdWxkQXBwbHlNdWx0aUFnZW50UHJvamVjdENvbnRleHQiLCJzaG91bGRMb2FkTW9yZU1lc3NhZ2VzT25TY3JvbGwiLCJtZXNzYWdlc05lZWRUYWJSZXdyaXRlIiwidXBzZXJ0Q2hhdE1lc3NhZ2UiLCJ1c2VDaGF0TWVzc2FnZXMiLCJfcmVmIiwiX3VzZXIkcGVybWlzc2lvbnMiLCJvbkVycm9yIiwiY2hhdElkIiwiY3VycmVudFVzZXIiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJfcmVmJGFnZW50cyIsImFnZW50cyIsIl91c2VUIiwidCIsImkxOG4iLCJ1c2VyIiwidXNlclBlcm1pc3Npb25zIiwicGVybWlzc2lvbnMiLCJhaV9hZ2VudHMiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJsb2FkaW5nTWVzc2FnZXMiLCJzZXRMb2FkaW5nTWVzc2FnZXMiLCJfdXNlU3RhdGUzIiwiX3VzZVN0YXRlNCIsIm1lc3NhZ2VzIiwic2V0TWVzc2FnZXMiLCJfdXNlUHJvamVjdHMiLCJmZXRjaFByb2plY3RzIiwiX3VzZUdsb2JhbENvbnRleHQiLCJzZWxlY3RBZ2VudCIsInNldENoaXBzUHJvamVjdCIsInNldFByb2plY3QiLCJzZXRDbGllbnQiLCJzZXRUYXNrIiwicHJvamVjdCIsIl91c2VUYWJUYXNrRGVmYXVsdCIsImdldFRhYlRhc2tEZWZhdWx0IiwidGFiVGFza0RlZmF1bHQiLCJyZWZldGNoVGFiVGFza0RlZmF1bHQiLCJfdXNlU3RhdGU1IiwiX3VzZVN0YXRlNiIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsInNldElzTG9hZGluZ01vcmVNZXNzYWdlcyIsIl91c2VTdGF0ZTciLCJfdXNlU3RhdGU4IiwibGFzdEV2YWx1YXRlZEtleSIsInNldExhc3RFdmFsdWF0ZWRLZXkiLCJpc0xvYWRpbmdSZWYiLCJpbml0aWFsTG9hZERvbmUiLCJwcmV2aW91c0NoYXRJZCIsImxvYWRTZXFSZWYiLCJzeW5jTWVzc2FnZXNUb1N0b3JlIiwidGFyZ2V0Q2hhdElkIiwibmV4dE1lc3NhZ2VzIiwibGFzdEV2YWx1YXRlZEtleVZhbHVlIiwiZ2V0U3RhdGUiLCJ1bmRlZmluZWQiLCJwYXRjaFZpZXdDYWNoZSIsInNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEiLCJfcmVmMyIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX3JlZjIiLCJwcm9qZWN0SWRNZXNzYWdlIiwicHJvamVjdE5hbWVGcm9tU2Vzc2lvbiIsImNsaWVudElkRnJvbVNlc3Npb24iLCJjbGllbnROYW1lRnJvbVNlc3Npb24iLCJ0YXNrSWRGcm9tU2Vzc2lvbiIsInRhc2tOYW1lRnJvbVNlc3Npb24iLCJ0YXNrIiwicHJvamVjdHMiLCJoYXNNdWx0aUFnZW50c0FjY2VzcyIsIl9yZXNvbHZlUHJvamVjdENvbnRleCIsImNoaXBzUHJvamVjdCIsInJlc29sdmVkUHJvamVjdCIsIndyYXAiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiaWQiLCJOdW1iZXIiLCJuYW1lIiwiYWJydXB0Iiwic2VudCIsIndpbmRvdyIsIk1BSUFfQ0hBVF9BSV9GRUFUVVJFX0FDQ0VTU19NVUxUSV9BR0VOVFMiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsInJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlIiwiX3JlZjQiLCJfY2FsbGVlMiIsIl9jYWNoZSRsYXN0RXZhbHVhdGVkSyIsInNlc3Npb25zU3RvcmUiLCJjYWNoZWRNZXNzYWdlcyIsImNhY2hlIiwiX2NvbnRleHQyIiwiZ2V0TWVzc2FnZXMiLCJnZXRWaWV3Q2FjaGUiLCJjdXJyZW50IiwiYWdlbnRTbmFwc2hvdCIsImNvbnZlcnNhdGlvbk1ldGEiLCJzZXNzaW9uTWV0YUV2ZW50IiwiZG9jdW1lbnQiLCJkaXNwYXRjaEV2ZW50IiwiQ3VzdG9tRXZlbnQiLCJkZXRhaWwiLCJfeDIiLCJsb2FkTWVzc2FnZXMiLCJfcmVmNSIsIl9jYWxsZWUzIiwib3B0aW9ucyIsInNlcSIsIl95aWVsZCRtYWlhJENoYXRzJGdldCIsIml0ZW1zIiwibmV4dEl0ZW0iLCJhZ2VudERlbGV0ZWQiLCJhZ2VudE5vUGVybWlzc2lvbiIsImhhc0FnZW50QWNjZXNzIiwiaGFzQWdlbnRQZXJtaXNzaW9uIiwiYWdlbnRUeXBlRnJvbVNlc3Npb24iLCJhZ2VudEVudGl0eUZyb21TZXNzaW9uIiwicHJvamVjdERlbGV0ZWQiLCJzZXNzaW9uQWdlbnQiLCJpdGVtc1RvU2V0Iiwic2Vzc2lvbk1ldGEiLCJmaW5hbE1lc3NhZ2VzIiwicGFnaW5hdGlvbktleSIsIl90IiwiX2NvbnRleHQzIiwiZm9yY2UiLCJjYW5SZXN0b3JlU2Vzc2lvbiIsIkNoYXRzIiwiZ2V0Q2hhdE1lc3NhZ2VzIiwib2Zmc2V0IiwiY2FuY2VsbGVkVGV4dCIsImxhbmciLCJsYW5ndWFnZSIsImFnZW50VHlwZSIsImFnZW50RW50aXR5IiwicHJvamVjdElkIiwicHJvamVjdE5hbWUiLCJjbGllbnRJZCIsImNsaWVudE5hbWUiLCJ0YXNrSWQiLCJ0YXNrTmFtZSIsInVzZXJDYW5WaWV3QWdlbnRzIiwiQm9vbGVhbiIsInZpZXciLCJnZXRNZXRhIiwic3RhdHVzIiwic2V0Vmlld0NhY2hlIiwiaHlkcmF0ZWRGcm9tQXBpIiwiZmluaXNoIiwiX3gzIiwibG9hZE1vcmVNZXNzYWdlcyIsIl9yZWY2IiwiX2NhbGxlZTQiLCJjb250YWluZXIiLCJvbGRTY3JvbGxUb3AiLCJfeWllbGQkbWFpYSRDaGF0cyRnZXQyIiwiaXRlbXNUb01lcmdlIiwibmV3TWVzc2FnZXMiLCJfdDIiLCJfY29udGV4dDQiLCJzY3JvbGxUb3AiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjb250YWluZXJSZWYiLCJfeDQiLCJoYW5kbGVTY3JvbGwiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJjYW5SZXN0b3JlIiwicGVuZGluZ0luaXRpYWxNZXNzYWdlIiwiZXJyb3IiLCJjb25zb2xlIiwiZGlkUmV3cml0ZVJlZiIsImxlbmd0aCIsInRhYlNlZ21lbnQiLCJuZWVkc1Jld3JpdGUiLCJyZXdyaXR0ZW4iLCJtYXAiLCJtc2ciLCJfb2JqZWN0U3ByZWFkIiwibWVzc2FnZSIsIm1lc3NhZ2VzUmVmIiwiYXBwbHlNZXNzYWdlcyIsImFkZE1lc3NhZ2UiLCJyZW1vdmVNZXNzYWdlIiwibWVzc2FnZUlkIiwiZmlsdGVyIiwiaGFzTW9yZU1lc3NhZ2VzIiwicmVwbGFjZU1lc3NhZ2VzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hvb2tzL3VzZUNoYXRNZXNzYWdlcy91c2VDaGF0TWVzc2FnZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlLCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlUHJvamVjdHMgfSBmcm9tICcuLi91c2VQcm9qZWN0cydcbmltcG9ydCB7IENoYXRNZXNzYWdlIH0gZnJvbSAnLi4vLi4vdHlwZXMvQ2hhdCdcbmltcG9ydCBtYWlhIGZyb20gJy4uLy4uL3NlcnZpY2VzL21haWEnXG5pbXBvcnQgeyBVc2VDaGF0TWVzc2FnZXNQcm9wcyB9IGZyb20gJy4vdXNlQ2hhdE1lc3NhZ2VzLmludGVyZmFjZSdcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uL3VzZVQnXG5pbXBvcnQgeyB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb3ItdXNlcidcbmltcG9ydCB7IHVzZVRhYlRhc2tEZWZhdWx0IH0gZnJvbSAnLi4vdXNlVGFiVGFza0RlZmF1bHQnXG5pbXBvcnQgeyBtYXBDT1JMYW5nIH0gZnJvbSAnLi4vLi4vbGFuZy91dGlscydcbmltcG9ydCB7IHVzZVNlc3Npb25zU3RvcmUgfSBmcm9tICcuLi8uLi9zdG9yZS9zZXNzaW9ucy91c2VTZXNzaW9uc1N0b3JlJ1xuaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gJy4uLy4uL3R5cGVzL2FnZW50J1xuaW1wb3J0IHtcbiAgYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyLFxuICBjb252ZXJzYXRpb25Qcm9qZWN0VG9HbG9iYWxQcm9qZWN0LFxuICBoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YSxcbiAgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSxcbiAgbWFya09wZW5lZFNlc3Npb25Bc1JlYWRJZlZpc2libGUsXG4gIHJlc29sdmVQcm9qZWN0Q29udGV4dEZyb21GZXRjaCxcbiAgcmVzb2x2ZVRhc2tGcm9tQ29udmVyc2F0aW9uTWV0YWRhdGEsXG4gIGJ1aWxkU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEsXG4gIGJ1aWxkU2Vzc2lvbk1ldGFFdmVudERldGFpbCxcbiAgcmVzb2x2ZUZpbmFsTWVzc2FnZXNXaXRoQWN0aXZlU3RyZWFtaW5nVGFpbCxcbiAgcmVzb2x2ZVNlc3Npb25BZ2VudEZyb21DaGF0TG9hZCxcbiAgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzLFxuICByZXdyaXRlVGFza1VybHNJbkNvbnRlbnQsXG4gIHNob3VsZEFib3J0U3RhbGVNZXNzYWdlTG9hZCxcbiAgc2hvdWxkQXBwbHlNdWx0aUFnZW50UHJvamVjdENvbnRleHQsXG4gIHNob3VsZExvYWRNb3JlTWVzc2FnZXNPblNjcm9sbCxcbiAgbWVzc2FnZXNOZWVkVGFiUmV3cml0ZSxcbiAgdXBzZXJ0Q2hhdE1lc3NhZ2UsXG59IGZyb20gJy4vdXNlQ2hhdE1lc3NhZ2VzLmhlbHBlcnMnXG5cbnR5cGUgTG9hZE1lc3NhZ2VzT3B0aW9ucyA9IHtcbiAgLyoqIElnbm9yYSBjYWNoZSBlbiBtZW1vcmlhIHkgdnVlbHZlIGEgcGVkaXIgZ2V0Q2hhdE1lc3NhZ2VzLiAqL1xuICBmb3JjZT86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGNvbnN0IHVzZUNoYXRNZXNzYWdlcyA9ICh7XG4gIG9uRXJyb3IsXG4gIGNoYXRJZCxcbiAgY3VycmVudFVzZXIsXG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgYWdlbnRzID0gW10sXG59OiBVc2VDaGF0TWVzc2FnZXNQcm9wcykgPT4ge1xuICBjb25zdCB7IHQsIGkxOG4gfSA9IHVzZVQoKVxuICBjb25zdCB1c2VyID0gdXNlVXNlcigpXG4gIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IHVzZXI/LnBlcm1pc3Npb25zPy5haV9hZ2VudHNcbiAgY29uc3QgW2xvYWRpbmdNZXNzYWdlcywgc2V0TG9hZGluZ01lc3NhZ2VzXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbbWVzc2FnZXMsIHNldE1lc3NhZ2VzXSA9IHVzZVN0YXRlPENoYXRNZXNzYWdlW10+KCgpID0+XG4gICAgaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UpICYmIHVzZXJJbml0aWFsTWVzc2FnZVxuICAgICAgPyBidWlsZEluaXRpYWxNZXNzYWdlUGxhY2Vob2xkZXIodXNlckluaXRpYWxNZXNzYWdlLCBjdXJyZW50VXNlcilcbiAgICAgIDogW11cbiAgKVxuICBjb25zdCB7IGZldGNoUHJvamVjdHMgfSA9IHVzZVByb2plY3RzKClcbiAgY29uc3QgeyBzZWxlY3RBZ2VudCwgc2V0Q2hpcHNQcm9qZWN0LCBzZXRQcm9qZWN0LCBzZXRDbGllbnQsIHNldFRhc2ssIHByb2plY3QgfSA9IHVzZUdsb2JhbENvbnRleHQoKVxuICBjb25zdCB7IGdldFRhYlRhc2tEZWZhdWx0LCB0YWJUYXNrRGVmYXVsdCwgcmVmZXRjaFRhYlRhc2tEZWZhdWx0IH0gPSB1c2VUYWJUYXNrRGVmYXVsdCgpXG4gIGNvbnN0IFtpc0xvYWRpbmdNb3JlTWVzc2FnZXMsIHNldElzTG9hZGluZ01vcmVNZXNzYWdlc10gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2xhc3RFdmFsdWF0ZWRLZXksIHNldExhc3RFdmFsdWF0ZWRLZXldID0gdXNlU3RhdGU8bnVtYmVyIHwgdW5kZWZpbmVkPigwKVxuICBjb25zdCBpc0xvYWRpbmdSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IGluaXRpYWxMb2FkRG9uZSA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3QgcHJldmlvdXNDaGF0SWQgPSB1c2VSZWYoY2hhdElkKVxuICBjb25zdCBsb2FkU2VxUmVmID0gdXNlUmVmKDApXG5cbiAgY29uc3Qgc3luY01lc3NhZ2VzVG9TdG9yZSA9IHVzZUNhbGxiYWNrKFxuICAgICh0YXJnZXRDaGF0SWQ6IHN0cmluZywgbmV4dE1lc3NhZ2VzOiBDaGF0TWVzc2FnZVtdLCBsYXN0RXZhbHVhdGVkS2V5VmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgIHVzZVNlc3Npb25zU3RvcmUuZ2V0U3RhdGUoKS5zZXRNZXNzYWdlcyh0YXJnZXRDaGF0SWQsIG5leHRNZXNzYWdlcylcbiAgICAgIGlmIChsYXN0RXZhbHVhdGVkS2V5VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkucGF0Y2hWaWV3Q2FjaGUodGFyZ2V0Q2hhdElkLCB7IGxhc3RFdmFsdWF0ZWRLZXk6IGxhc3RFdmFsdWF0ZWRLZXlWYWx1ZSB9KVxuICAgICAgfVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEgPSB1c2VDYWxsYmFjayhcbiAgICBhc3luYyAoe1xuICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgIH06IHtcbiAgICAgIHByb2plY3RJZE1lc3NhZ2U6IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIGNsaWVudElkRnJvbVNlc3Npb246IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZFxuICAgICAgdGFza0lkRnJvbVNlc3Npb246IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWRcbiAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb246IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWRcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCB0YXNrID0gcmVzb2x2ZVRhc2tGcm9tQ29udmVyc2F0aW9uTWV0YWRhdGEodGFza0lkRnJvbVNlc3Npb24sIHRhc2tOYW1lRnJvbVNlc3Npb24pXG4gICAgICBzZXRUYXNrKHRhc2spXG5cbiAgICAgIGlmIChoYXNDbGllbnRDb252ZXJzYXRpb25NZXRhZGF0YShjbGllbnRJZEZyb21TZXNzaW9uLCBjbGllbnROYW1lRnJvbVNlc3Npb24pKSB7XG4gICAgICAgIHNldENsaWVudCh7IGlkOiBOdW1iZXIoY2xpZW50SWRGcm9tU2Vzc2lvbiksIG5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbiBhcyBzdHJpbmcgfSlcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb2plY3RzID0gYXdhaXQgZmV0Y2hQcm9qZWN0cyhwcm9qZWN0SWRNZXNzYWdlKVxuICAgICAgY29uc3QgaGFzTXVsdGlBZ2VudHNBY2Nlc3MgPSAhIXdpbmRvdy5NQUlBX0NIQVRfQUlfRkVBVFVSRV9BQ0NFU1NfTVVMVElfQUdFTlRTXG5cbiAgICAgIGlmIChzaG91bGRBcHBseU11bHRpQWdlbnRQcm9qZWN0Q29udGV4dChwcm9qZWN0SWRNZXNzYWdlLCBoYXNNdWx0aUFnZW50c0FjY2VzcykpIHtcbiAgICAgICAgY29uc3QgeyBjaGlwc1Byb2plY3QsIHByb2plY3Q6IHJlc29sdmVkUHJvamVjdCB9ID0gcmVzb2x2ZVByb2plY3RDb250ZXh0RnJvbUZldGNoKFxuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UgYXMgc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgIHByb2plY3RzIHx8IFtdLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb25cbiAgICAgICAgKVxuXG4gICAgICAgIHNldENoaXBzUHJvamVjdChjaGlwc1Byb2plY3QpXG4gICAgICAgIHNldFByb2plY3QoY29udmVyc2F0aW9uUHJvamVjdFRvR2xvYmFsUHJvamVjdChyZXNvbHZlZFByb2plY3QpKVxuICAgICAgICBzZXRDbGllbnQ/LihudWxsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q2hpcHNQcm9qZWN0KG51bGwpXG4gICAgICAgIHNldFByb2plY3QobnVsbClcbiAgICAgICAgc2V0Q2xpZW50Py4obnVsbClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtmZXRjaFByb2plY3RzLCBzZXRDbGllbnQsIHNldENoaXBzUHJvamVjdCwgc2V0UHJvamVjdCwgc2V0VGFza11cbiAgKVxuXG4gIGNvbnN0IHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHRhcmdldENoYXRJZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uc1N0b3JlID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpXG4gICAgICBjb25zdCBjYWNoZWRNZXNzYWdlcyA9IHNlc3Npb25zU3RvcmUuZ2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkKVxuICAgICAgY29uc3QgY2FjaGUgPSBzZXNzaW9uc1N0b3JlLmdldFZpZXdDYWNoZSh0YXJnZXRDaGF0SWQpXG5cbiAgICAgIHNldE1lc3NhZ2VzKGNhY2hlZE1lc3NhZ2VzKVxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShjYWNoZT8ubGFzdEV2YWx1YXRlZEtleSA/PyAwKVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSB0cnVlXG5cbiAgICAgIGlmIChjYWNoZT8uYWdlbnRTbmFwc2hvdCkge1xuICAgICAgICBzZWxlY3RBZ2VudChjYWNoZS5hZ2VudFNuYXBzaG90KVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGU/LmNvbnZlcnNhdGlvbk1ldGEpIHtcbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZTogY2FjaGUuY29udmVyc2F0aW9uTWV0YS5wcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb246IGNhY2hlLmNvbnZlcnNhdGlvbk1ldGEucHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLmNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLmNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbjogY2FjaGUuY29udmVyc2F0aW9uTWV0YS50YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uOiBjYWNoZS5jb252ZXJzYXRpb25NZXRhLnRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGlmIChjYWNoZT8uc2Vzc2lvbk1ldGFFdmVudCkge1xuICAgICAgICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgICAgICAgIG5ldyBDdXN0b21FdmVudCgnbWFpYS1jaGF0LXNlc3Npb24tbWV0YScsIHtcbiAgICAgICAgICAgIGRldGFpbDogY2FjaGUuc2Vzc2lvbk1ldGFFdmVudCxcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlKHRhcmdldENoYXRJZClcbiAgICB9LFxuICAgIFtzZWxlY3RBZ2VudCwgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YV1cbiAgKVxuXG4gIGNvbnN0IGxvYWRNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChvcHRpb25zPzogTG9hZE1lc3NhZ2VzT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKCFvcHRpb25zPy5mb3JjZSAmJiB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuY2FuUmVzdG9yZVNlc3Npb24oY2hhdElkKSkge1xuICAgICAgICBhd2FpdCByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZShjaGF0SWQpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBsb2FkU2VxUmVmLmN1cnJlbnQgKz0gMVxuICAgICAgY29uc3Qgc2VxID0gbG9hZFNlcVJlZi5jdXJyZW50XG4gICAgICBjb25zdCB0YXJnZXRDaGF0SWQgPSBjaGF0SWRcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZ01lc3NhZ2VzKHRydWUpXG4gICAgICAgIGluaXRpYWxMb2FkRG9uZS5jdXJyZW50ID0gZmFsc2VcbiAgICAgICAgbGV0IGFnZW50U25hcHNob3Q6IEFnZW50IHwgbnVsbCA9IG51bGxcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIG5leHRJdGVtLFxuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzcyxcbiAgICAgICAgICBoYXNBZ2VudFBlcm1pc3Npb24sXG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0gPSBhd2FpdCBtYWlhLkNoYXRzLmdldENoYXRNZXNzYWdlcyh7XG4gICAgICAgICAgY2hhdElkOiB0YXJnZXRDaGF0SWQsXG4gICAgICAgICAgY3VycmVudFVzZXIsXG4gICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgIGNhbmNlbGxlZFRleHQ6IHQoJ2NoYXQuY2FuY2VsbGVkJyksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBpZiAoc2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkKHNlcSwgbG9hZFNlcVJlZi5jdXJyZW50LCB0YXJnZXRDaGF0SWQsIGNoYXRJZCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25BZ2VudCA9IHJlc29sdmVTZXNzaW9uQWdlbnRGcm9tQ2hhdExvYWQoe1xuICAgICAgICAgIGFnZW50RGVsZXRlZCxcbiAgICAgICAgICBhZ2VudE5vUGVybWlzc2lvbixcbiAgICAgICAgICBhZ2VudHMsXG4gICAgICAgICAgdXNlckNhblZpZXdBZ2VudHM6IEJvb2xlYW4odXNlclBlcm1pc3Npb25zPy52aWV3KSxcbiAgICAgICAgICBoYXNBZ2VudEFjY2VzczogQm9vbGVhbihoYXNBZ2VudEFjY2VzcyksXG4gICAgICAgICAgaGFzQWdlbnRQZXJtaXNzaW9uOiBCb29sZWFuKGhhc0FnZW50UGVybWlzc2lvbiksXG4gICAgICAgICAgcHJvamVjdERlbGV0ZWQsXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChzZXNzaW9uQWdlbnQpIHtcbiAgICAgICAgICBzZWxlY3RBZ2VudChzZXNzaW9uQWdlbnQpXG4gICAgICAgICAgYWdlbnRTbmFwc2hvdCA9IHNlc3Npb25BZ2VudFxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSh7XG4gICAgICAgICAgcHJvamVjdElkTWVzc2FnZSxcbiAgICAgICAgICBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gTWV0YWRhdGEgZGUgbGEgc2Vzc2lvbiAoYWdlbnRfdHlwZSAvIGFnZW50X2VudGl0eSArIGNvbnRleHRvKSBwYXJhIGVsIGNhcnRlbCBkZVxuICAgICAgICAvLyBcImNvbnRpbnVhciBlbiB1biBjaGF0IG51ZXZvXCIgZGVsIGZvb3RlciBjdWFuZG8gc2UgYWJyZSB1bmEgY29udmVyc2FjacOzbiBkZSB1biBjbG9uZSBsZWdhY3kuXG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoXG4gICAgICAgICAgbmV3IEN1c3RvbUV2ZW50KCdtYWlhLWNoYXQtc2Vzc2lvbi1tZXRhJywge1xuICAgICAgICAgICAgZGV0YWlsOiBidWlsZFNlc3Npb25NZXRhRXZlbnREZXRhaWwoY2hhdElkLCB7XG4gICAgICAgICAgICAgIGFnZW50VHlwZTogYWdlbnRUeXBlRnJvbVNlc3Npb24sXG4gICAgICAgICAgICAgIGFnZW50RW50aXR5OiBhZ2VudEVudGl0eUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICBjbGllbnRJZDogY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgICAgICB0YXNrTmFtZTogdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBpdGVtc1RvU2V0ID0gYXdhaXQgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzKGl0ZW1zLCBwcm9qZWN0SWRNZXNzYWdlLCBnZXRUYWJUYXNrRGVmYXVsdClcbiAgICAgICAgY29uc3Qgc2Vzc2lvbk1ldGEgPSB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuZ2V0TWV0YShjaGF0SWQpXG4gICAgICAgIGNvbnN0IGZpbmFsTWVzc2FnZXMgPSByZXNvbHZlRmluYWxNZXNzYWdlc1dpdGhBY3RpdmVTdHJlYW1pbmdUYWlsKFxuICAgICAgICAgIGl0ZW1zVG9TZXQsXG4gICAgICAgICAgdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmdldE1lc3NhZ2VzKGNoYXRJZCksXG4gICAgICAgICAgc2Vzc2lvbk1ldGE/LnN0YXR1c1xuICAgICAgICApXG5cbiAgICAgICAgY29uc3QgY29udmVyc2F0aW9uTWV0YSA9IGJ1aWxkU2Vzc2lvbkNvbnZlcnNhdGlvbk1ldGEoe1xuICAgICAgICAgIHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9KVxuXG4gICAgICAgIGNvbnN0IHNlc3Npb25NZXRhRXZlbnQgPSBidWlsZFNlc3Npb25NZXRhRXZlbnREZXRhaWwoY2hhdElkLCB7XG4gICAgICAgICAgYWdlbnRUeXBlOiBhZ2VudFR5cGVGcm9tU2Vzc2lvbixcbiAgICAgICAgICBhZ2VudEVudGl0eTogYWdlbnRFbnRpdHlGcm9tU2Vzc2lvbixcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3RJZE1lc3NhZ2UsXG4gICAgICAgICAgcHJvamVjdE5hbWU6IHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWQ6IGNsaWVudElkRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50TmFtZTogY2xpZW50TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tJZDogdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWU6IHRhc2tOYW1lRnJvbVNlc3Npb24sXG4gICAgICAgIH0pXG5cbiAgICAgICAgc2V0TWVzc2FnZXMoZmluYWxNZXNzYWdlcylcbiAgICAgICAgY29uc3QgcGFnaW5hdGlvbktleSA9IE51bWJlcihuZXh0SXRlbSlcbiAgICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleShwYWdpbmF0aW9uS2V5KVxuICAgICAgICBpbml0aWFsTG9hZERvbmUuY3VycmVudCA9IHRydWVcblxuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0TWVzc2FnZXModGFyZ2V0Q2hhdElkLCBmaW5hbE1lc3NhZ2VzKVxuICAgICAgICB1c2VTZXNzaW9uc1N0b3JlLmdldFN0YXRlKCkuc2V0Vmlld0NhY2hlKHRhcmdldENoYXRJZCwge1xuICAgICAgICAgIGh5ZHJhdGVkRnJvbUFwaTogdHJ1ZSxcbiAgICAgICAgICBsYXN0RXZhbHVhdGVkS2V5OiBwYWdpbmF0aW9uS2V5LFxuICAgICAgICAgIGNvbnZlcnNhdGlvbk1ldGEsXG4gICAgICAgICAgc2Vzc2lvbk1ldGFFdmVudCxcbiAgICAgICAgICBhZ2VudFNuYXBzaG90LFxuICAgICAgICB9KVxuXG4gICAgICAgIG1hcmtPcGVuZWRTZXNzaW9uQXNSZWFkSWZWaXNpYmxlKHRhcmdldENoYXRJZClcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICghc2hvdWxkQWJvcnRTdGFsZU1lc3NhZ2VMb2FkKHNlcSwgbG9hZFNlcVJlZi5jdXJyZW50LCB0YXJnZXRDaGF0SWQsIGNoYXRJZCkpIHtcbiAgICAgICAgICBvbkVycm9yPy4oKVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIXNob3VsZEFib3J0U3RhbGVNZXNzYWdlTG9hZChzZXEsIGxvYWRTZXFSZWYuY3VycmVudCwgdGFyZ2V0Q2hhdElkLCBjaGF0SWQpKSB7XG4gICAgICAgICAgc2V0TG9hZGluZ01lc3NhZ2VzKGZhbHNlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBbXG4gICAgICBjaGF0SWQsXG4gICAgICBjdXJyZW50VXNlcixcbiAgICAgIHNldENvbnZlcnNhdGlvbkNvbnRleHRGcm9tTWV0YWRhdGEsXG4gICAgICBvbkVycm9yLFxuICAgICAgZ2V0VGFiVGFza0RlZmF1bHQsXG4gICAgICByZXN0b3JlU2Vzc2lvbkZyb21TdG9yZSxcbiAgICAgIHNlbGVjdEFnZW50LFxuICAgICAgYWdlbnRzLFxuICAgICAgdCxcbiAgICAgIGkxOG4ubGFuZ3VhZ2UsXG4gICAgICB1c2VyUGVybWlzc2lvbnM/LnZpZXcsXG4gICAgXVxuICApXG5cbiAgY29uc3QgbG9hZE1vcmVNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChjb250YWluZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCkgPT4ge1xuICAgICAgaWYgKGlzTG9hZGluZ1JlZi5jdXJyZW50IHx8ICFsYXN0RXZhbHVhdGVkS2V5IHx8ICFjb250YWluZXIpIHJldHVyblxuICAgICAgdHJ5IHtcbiAgICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgICAgIHNldElzTG9hZGluZ01vcmVNZXNzYWdlcyh0cnVlKVxuXG4gICAgICAgIGNvbnN0IG9sZFNjcm9sbFRvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3BcblxuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgbmV4dEl0ZW0sXG4gICAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lOiBwcm9qZWN0TmFtZUZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudElkOiBjbGllbnRJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIGNsaWVudE5hbWU6IGNsaWVudE5hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgICB0YXNrSWQ6IHRhc2tJZEZyb21TZXNzaW9uLFxuICAgICAgICAgIHRhc2tOYW1lOiB0YXNrTmFtZUZyb21TZXNzaW9uLFxuICAgICAgICB9ID0gYXdhaXQgbWFpYS5DaGF0cy5nZXRDaGF0TWVzc2FnZXMoe1xuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICBjdXJyZW50VXNlcixcbiAgICAgICAgICBvZmZzZXQ6IGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICAgICAgbGFuZzogbWFwQ09STGFuZyhpMThuLmxhbmd1YWdlKSxcbiAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCBzZXRDb252ZXJzYXRpb25Db250ZXh0RnJvbU1ldGFkYXRhKHtcbiAgICAgICAgICBwcm9qZWN0SWRNZXNzYWdlLFxuICAgICAgICAgIHByb2plY3ROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgY2xpZW50SWRGcm9tU2Vzc2lvbixcbiAgICAgICAgICBjbGllbnROYW1lRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza0lkRnJvbVNlc3Npb24sXG4gICAgICAgICAgdGFza05hbWVGcm9tU2Vzc2lvbixcbiAgICAgICAgfSlcblxuICAgICAgICAvLyBTaSBoYXkgcHJveWVjdG8gZW4gbGEgY29udmVyc2FjacOzbiwgcmVlc2NyaWJpciBVUkxzIGRlIHRhcmVhcyBlbiBsb3MgbWVuc2FqZXMgY2FyZ2Fkb3NcbiAgICAgICAgY29uc3QgaXRlbXNUb01lcmdlID0gYXdhaXQgcmV3cml0ZU1lc3NhZ2VzRm9yUHJvamVjdFRhc2tVcmxzKGl0ZW1zLCBwcm9qZWN0SWRNZXNzYWdlLCBnZXRUYWJUYXNrRGVmYXVsdClcbiAgICAgICAgLy8gVGhlIEFQSSBwYWdpbmF0ZXMgb2xkZXN0LWZpcnN0OiBzdWJzZXF1ZW50IHBhZ2VzIGJlbG9uZyBhZnRlciB0aGVcbiAgICAgICAgLy8gbG9hZGVkIGNvbnZlcnNhdGlvbiwgbmV2ZXIgYmV0d2VlbiBpdHMgZmlyc3QgcXVlc3Rpb24gYW5kIGFuc3dlci5cbiAgICAgICAgY29uc3QgbmV3TWVzc2FnZXMgPSBbLi4ubWVzc2FnZXMsIC4uLml0ZW1zVG9NZXJnZV1cbiAgICAgICAgc2V0TWVzc2FnZXMobmV3TWVzc2FnZXMpXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25LZXkgPSBOdW1iZXIobmV4dEl0ZW0pXG4gICAgICAgIHNldExhc3RFdmFsdWF0ZWRLZXkocGFnaW5hdGlvbktleSlcbiAgICAgICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIG5ld01lc3NhZ2VzLCBwYWdpbmF0aW9uS2V5KVxuXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lclxuICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgICBjb250YWluZXJSZWYuc2Nyb2xsVG9wID0gb2xkU2Nyb2xsVG9wXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG9uRXJyb3I/LigpXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc0xvYWRpbmdNb3JlTWVzc2FnZXMoZmFsc2UpXG4gICAgICAgIGlzTG9hZGluZ1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGNoYXRJZCxcbiAgICAgIGN1cnJlbnRVc2VyLFxuICAgICAgbGFzdEV2YWx1YXRlZEtleSxcbiAgICAgIG9uRXJyb3IsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIGdldFRhYlRhc2tEZWZhdWx0LFxuICAgICAgc2V0Q29udmVyc2F0aW9uQ29udGV4dEZyb21NZXRhZGF0YSxcbiAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUsXG4gICAgXVxuICApXG5cbiAgY29uc3QgaGFuZGxlU2Nyb2xsID0gdXNlQ2FsbGJhY2soXG4gICAgKGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoIWNvbnRhaW5lciB8fCBpc0xvYWRpbmdSZWYuY3VycmVudCB8fCAhaW5pdGlhbExvYWREb25lLmN1cnJlbnQpIHJldHVyblxuXG4gICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuICAgICAgaWYgKHNob3VsZExvYWRNb3JlTWVzc2FnZXNPblNjcm9sbChzY3JvbGxUb3AsIHNjcm9sbEhlaWdodCwgY2xpZW50SGVpZ2h0KSkge1xuICAgICAgICBsb2FkTW9yZU1lc3NhZ2VzKGNvbnRhaW5lcilcbiAgICAgIH1cbiAgICB9LFxuICAgIFtsb2FkTW9yZU1lc3NhZ2VzXVxuICApXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoY2hhdElkICE9PSBwcmV2aW91c0NoYXRJZC5jdXJyZW50KSB7XG4gICAgICBjb25zdCBjYW5SZXN0b3JlID0gdXNlU2Vzc2lvbnNTdG9yZS5nZXRTdGF0ZSgpLmNhblJlc3RvcmVTZXNzaW9uKGNoYXRJZClcblxuICAgICAgaXNMb2FkaW5nUmVmLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgaW5pdGlhbExvYWREb25lLmN1cnJlbnQgPSBmYWxzZVxuICAgICAgcHJldmlvdXNDaGF0SWQuY3VycmVudCA9IGNoYXRJZFxuICAgICAgc2V0TGFzdEV2YWx1YXRlZEtleSgwKVxuICAgICAgbG9hZFNlcVJlZi5jdXJyZW50ICs9IDFcblxuICAgICAgcmVmZXRjaFRhYlRhc2tEZWZhdWx0KClcblxuICAgICAgY29uc3QgcGVuZGluZ0luaXRpYWxNZXNzYWdlID0gaGFzTWVhbmluZ2Z1bFVzZXJJbml0aWFsTWVzc2FnZSh1c2VySW5pdGlhbE1lc3NhZ2UpXG5cbiAgICAgIGlmICghcGVuZGluZ0luaXRpYWxNZXNzYWdlICYmIGNhblJlc3RvcmUpIHtcbiAgICAgICAgcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUoY2hhdElkKS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3VzZUNoYXRNZXNzYWdlc10gcmVzdG9yZVNlc3Npb25Gcm9tU3RvcmUgZmFpbGVkJywgZXJyb3IpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBzZXRNZXNzYWdlcyhcbiAgICAgICAgcGVuZGluZ0luaXRpYWxNZXNzYWdlICYmIHVzZXJJbml0aWFsTWVzc2FnZVxuICAgICAgICAgID8gYnVpbGRJbml0aWFsTWVzc2FnZVBsYWNlaG9sZGVyKHVzZXJJbml0aWFsTWVzc2FnZSwgY3VycmVudFVzZXIpXG4gICAgICAgICAgOiBbXVxuICAgICAgKVxuXG4gICAgICAvLyBMaW1waWFyIGVsIGVzdGFkbyBkZWwgcHJveWVjdG8geSBsYSB0YXJlYSBjdWFuZG8gY2FtYmlhIGRlIGNvbnZlcnNhY2nDs25cbiAgICAgIHNldENoaXBzUHJvamVjdChudWxsKVxuICAgICAgc2V0UHJvamVjdChudWxsKVxuICAgICAgc2V0VGFzayhudWxsKVxuXG4gICAgICBpZiAoIXBlbmRpbmdJbml0aWFsTWVzc2FnZSkge1xuICAgICAgICBsb2FkTWVzc2FnZXMoKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW1xuICAgIGNoYXRJZCxcbiAgICB1c2VySW5pdGlhbE1lc3NhZ2UsXG4gICAgY3VycmVudFVzZXIsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIHJlc3RvcmVTZXNzaW9uRnJvbVN0b3JlLFxuICAgIHNldENoaXBzUHJvamVjdCxcbiAgICBzZXRQcm9qZWN0LFxuICAgIHNldFRhc2ssXG4gICAgcmVmZXRjaFRhYlRhc2tEZWZhdWx0LFxuICBdKVxuXG4gIC8vIEN1YW5kbyB0YWJUYXNrRGVmYXVsdCBwYXNhIGEgZXN0YXIgZGlzcG9uaWJsZSBkZXNwdcOpcyBkZSBjYXJnYXIsIHJlZXNjcmliaXIgVVJMcyBkZSB0YXJlYXMgZW4gbG9zIG1lbnNhamVzIHlhIGNhcmdhZG9zLlxuICAvLyBSZWYgcGFyYSBldml0YXIgYnVjbGU6IHNldE1lc3NhZ2VzKHJld3JpdHRlbikgY2FtYmlhIG1lc3NhZ2VzIHkgcmUtZWplY3V0YSBlbCBlZmVjdG87IHNvbG8gcmVlc2NyaWJpbW9zIHVuYSB2ZXogcG9yIGxvdGUuXG4gIGNvbnN0IGRpZFJld3JpdGVSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCF0YWJUYXNrRGVmYXVsdCB8fCAhcHJvamVjdD8uaWQgfHwgbWVzc2FnZXMubGVuZ3RoID09PSAwKSByZXR1cm5cbiAgICBjb25zdCB0YWJTZWdtZW50ID0gYC8ke3RhYlRhc2tEZWZhdWx0fWBcbiAgICBjb25zdCBuZWVkc1Jld3JpdGUgPSBtZXNzYWdlc05lZWRUYWJSZXdyaXRlKG1lc3NhZ2VzLCB0YWJUYXNrRGVmYXVsdClcbiAgICBpZiAoIW5lZWRzUmV3cml0ZSkge1xuICAgICAgZGlkUmV3cml0ZVJlZi5jdXJyZW50ID0gZmFsc2VcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGlkUmV3cml0ZVJlZi5jdXJyZW50KSByZXR1cm5cbiAgICBkaWRSZXdyaXRlUmVmLmN1cnJlbnQgPSB0cnVlXG4gICAgY29uc3QgcmV3cml0dGVuID0gbWVzc2FnZXMubWFwKG1zZyA9PiAoe1xuICAgICAgLi4ubXNnLFxuICAgICAgbWVzc2FnZTogcmV3cml0ZVRhc2tVcmxzSW5Db250ZW50KG1zZy5tZXNzYWdlIHx8ICcnLCB0YWJTZWdtZW50KSxcbiAgICB9KSlcbiAgICBzZXRNZXNzYWdlcyhyZXdyaXR0ZW4pXG4gICAgc3luY01lc3NhZ2VzVG9TdG9yZShjaGF0SWQsIHJld3JpdHRlbilcbiAgfSwgW3RhYlRhc2tEZWZhdWx0LCBwcm9qZWN0Py5pZCwgbWVzc2FnZXMsIGNoYXRJZCwgc3luY01lc3NhZ2VzVG9TdG9yZV0pXG5cbiAgLy8gRWwgdXBkYXRlciBkZSBgdXNlU3RhdGVgIHRpZW5lIHF1ZSBzZXIgcHVybzogUmVhY3QgbG8gZWplY3V0YSBlbiBmYXNlIGRlXG4gIC8vIHJlbmRlciB5IGBzeW5jTWVzc2FnZXNUb1N0b3JlYCBlc2NyaWJlIGVuIHVuIHN0b3JlIGV4dGVybm8sIGxvIHF1ZSBkaXNwYXJhXG4gIC8vIFwiQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCB3aGlsZSByZW5kZXJpbmcgYSBkaWZmZXJlbnQgY29tcG9uZW50XCIuIFNlXG4gIC8vIGNvbXB1dGEgY29udHJhIGVzdGUgZXNwZWpvIHBhcmEgcG9kZXIgZW5jYWRlbmFyIHZhcmlhcyBtdXRhY2lvbmVzIGVuIGVsXG4gIC8vIG1pc21vIHRpY2sgKHAuIGVqLiByZW1vdmUgKyBhZGQgZGVsIHN3YXAgZGUgZmluIGRlIHN0cmVhbSkgc2luIGRlcGVuZGVyIGRlXG4gIC8vIHF1ZSBSZWFjdCB5YSBoYXlhIHJlLXJlbmRlcml6YWRvLlxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZihtZXNzYWdlcylcbiAgbWVzc2FnZXNSZWYuY3VycmVudCA9IG1lc3NhZ2VzXG5cbiAgY29uc3QgYXBwbHlNZXNzYWdlcyA9IHVzZUNhbGxiYWNrKFxuICAgIChuZXh0TWVzc2FnZXM6IENoYXRNZXNzYWdlW10pID0+IHtcbiAgICAgIG1lc3NhZ2VzUmVmLmN1cnJlbnQgPSBuZXh0TWVzc2FnZXNcbiAgICAgIHNldE1lc3NhZ2VzKG5leHRNZXNzYWdlcylcbiAgICAgIHN5bmNNZXNzYWdlc1RvU3RvcmUoY2hhdElkLCBuZXh0TWVzc2FnZXMpXG4gICAgfSxcbiAgICBbY2hhdElkLCBzeW5jTWVzc2FnZXNUb1N0b3JlXVxuICApXG5cbiAgY29uc3QgYWRkTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xuICAgICAgYXBwbHlNZXNzYWdlcyh1cHNlcnRDaGF0TWVzc2FnZShtZXNzYWdlc1JlZi5jdXJyZW50LCBtZXNzYWdlKSlcbiAgICB9LFxuICAgIFthcHBseU1lc3NhZ2VzXVxuICApXG5cbiAgY29uc3QgcmVtb3ZlTWVzc2FnZSA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlSWQ6IHN0cmluZykgPT4ge1xuICAgICAgYXBwbHlNZXNzYWdlcyhtZXNzYWdlc1JlZi5jdXJyZW50LmZpbHRlcihtc2cgPT4gbXNnLmlkICE9PSBtZXNzYWdlSWQpKVxuICAgIH0sXG4gICAgW2FwcGx5TWVzc2FnZXNdXG4gIClcblxuICByZXR1cm4ge1xuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBtZXNzYWdlcyxcbiAgICBoYXNNb3JlTWVzc2FnZXM6ICEhbGFzdEV2YWx1YXRlZEtleSxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgbG9hZE1lc3NhZ2VzLFxuICAgIGxvYWRNb3JlTWVzc2FnZXMsXG4gICAgYWRkTWVzc2FnZSxcbiAgICByZW1vdmVNZXNzYWdlLFxuICAgIC8vIGByZXBsYWNlTWVzc2FnZXNgIGRlIG1hc3RlciBoYWPDrWEgbG8gbWlzbW8gcXVlIGBhcHBseU1lc3NhZ2VzYCBwZXJvIHNpblxuICAgIC8vIHNpbmNyb25pemFyIGBtZXNzYWdlc1JlZmAsIHkgZXNhIHJlZiBlcyBsYSBxdWUgZXZpdGEgbG9zIHVwZGF0ZXJzIGltcHVyb3MuXG4gICAgcmVwbGFjZU1lc3NhZ2VzOiBhcHBseU1lc3NhZ2VzLFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQSxTQUFTQSxXQUFXLEVBQUVDLFFBQVEsRUFBRUMsTUFBTSxFQUFFQyxTQUFTLFFBQVEsT0FBTztBQUNoRSxTQUFTQyxXQUFXLFFBQVEsZ0JBQWdCO0FBRTVDLE9BQU9DLElBQUks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
|