@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
|
@@ -47,14 +47,13 @@ import { patchMaiaPanelSession, readMaiaPanelSession } from '../../../store/maia
|
|
|
47
47
|
import { MessageFromUser, MessageFromOther, MessageContentFromUser, MessageContentFromOther } from './styles';
|
|
48
48
|
import { MessageFeedback } from '../MessageFeedback';
|
|
49
49
|
import { SCCAIMessageWrapper, ScrollToBottomButton, SCScrollIconSwap, SCWritingDots, SCMessagesOuter, SCMessagesScroll, SCMessagesInner, SCTurnSpacer, SCOptionsList, SCOptionItem, SCMessageItemWrapper, SCMessageItemInner, SCAttachmentsRow, SCApprovalActionsColumn, SCLoadingMessagesColumn, SCMessagesGradientTop, SCMessagesGradientBottom } from './newStyles';
|
|
50
|
-
import { Feedback } from '../MessageFeedback/MessageFeedback';
|
|
51
50
|
import { useGlobalContext } from '../../../context/global-context';
|
|
52
51
|
import { EntityLinkCustomLink, getEntityLinkWrapperClassName } from '../../../utils/entityLinkRender';
|
|
53
52
|
import { ChatAISuggestions } from './ChatAISuggestions';
|
|
54
53
|
import { ChatAICreateAgentActions } from './ChatAICreateAgentActions';
|
|
55
54
|
import { EVENTS, useEvent } from '../../../hooks/useEvent';
|
|
56
55
|
import { downloadFileFromUrl } from '../../../utils/fileDownloadHelper';
|
|
57
|
-
import { canOpenAttachmentPreview, computeDistanceFromBottom, computeRemovableTurnSpace,
|
|
56
|
+
import { canOpenAttachmentPreview, canRetryAssistantMessage, computeDistanceFromBottom, computeRemovableTurnSpace, computeSyncedTurnSpacerHeight, computeTurnScrollDurationMs, computeTurnScrollTargetTop, countUserMessageAttachments, easeOutExpoScrollProgress, extractFeedbackSessionId, findLastQuestionId, hasInitialUserMessageInList, hasMessageLevelStreamIndicator, isActiveStreamingState, isAnswerOrQuestionChatMessageId, isApprovalChatMessage, isAssistantChatMessage, isAudioAttachment, isCurrentUserMessage, isNewChatMessageEvent, isRetrySuggestionSelection, resolveAttachmentDownloadBlobStrategy, resolveAttachmentDownloadFileName, resolveAttachmentDownloadUrl, resolveChatListItemStreamingFlags, resolveDisableFeedbackFromWasHelpful, resolveMessageAttachments, resolveRetryAttachmentsFromUserMessage, shouldAutoScrollOnMessagesChange, shouldHideAssistantSuggestions, shouldHideEmptyStreamingBody, shouldIgnoreSuggestionClick, shouldOpenMessageOption, shouldReleaseTurnSpace, shouldRenderAssistantFeedback, shouldRenderAssistantSuggestions, shouldRenderChangeProjectMessage, shouldRenderCreateAgentActions, shouldRenderMessageTextBody, shouldShowApprovalActions, shouldShowBottomScrollGradient, shouldShowGlobalStreamLoadingIndicator, shouldShowMessageAttachmentsRow, shouldShowScrollToBottom, shouldShowStreamActivityIndicator, shouldShowStreamingMessageBody, shouldShowTopScrollGradient, shouldSkipEmptyChatListMessage, shouldSkipTurnScrollAnimation, shouldRunStreamTurnSyncEffect, shouldUpdateSpacerHeight, buildSmoothStreamTextOptions, computeMeasureTurnLayout, detectJustFinishedLoadingMessages, processChatMessagesScrollFrame, readSmoothStreamWindowFlags, resolveReserveTurnSpacePlan, resolveScrollToBottomTargetTop, resolveContainerAtBottom, resolveCreateAgentActionsAgentId, resolveFeedbackPropsForCancelled, resolveLastUserMessageForAttachments, resolveMessageListItemKey, resolvePendingScrollTopFromSession, resolveReasoningTraceHookId, resolveScrollOnParentMode, resolveStreamingMessageHookId, resolveStreamingRawText, resolveStreamingTextHookId, resolveSuggestionAnalyticsAgentType, shouldApplyPendingScrollRestore, shouldClearLastReservedQuestion, shouldClearScrollRestoreWithoutChat, shouldInitializeChat, shouldRenderMentionInlineNodes, shouldRestoreScrollOnExpandedChange, shouldRunSessionCacheScrollToBottom, shouldScheduleTurnSpaceReservation, shouldScrollToBottomAfterLoad, shouldSkipMessagesScrollEffect, shouldUpdateScrollAffordancesOnLoadEnd } from './ChatAIMessages.helpers';
|
|
58
57
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
59
58
|
var MessageWrapper = function MessageWrapper(_ref) {
|
|
60
59
|
var isCurrentUser = _ref.isCurrentUser,
|
|
@@ -79,7 +78,7 @@ function MessageOptions(_ref3) {
|
|
|
79
78
|
selectedOption = _useState2[0],
|
|
80
79
|
setSelectedOption = _useState2[1];
|
|
81
80
|
var handleSelect = function handleSelect(option) {
|
|
82
|
-
if (selectedOption) return;
|
|
81
|
+
if (!shouldOpenMessageOption(selectedOption)) return;
|
|
83
82
|
setSelectedOption(option);
|
|
84
83
|
handleSelectOption(option);
|
|
85
84
|
};
|
|
@@ -99,12 +98,12 @@ function MessageOptions(_ref3) {
|
|
|
99
98
|
|
|
100
99
|
/** Solo este componente re-renderiza cuando cambia el texto en streaming (lee del context). */
|
|
101
100
|
var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
|
|
102
|
-
var _props$
|
|
101
|
+
var _props$suggestions$le, _props$suggestions;
|
|
103
102
|
// Texto del stream: solo se lee del store cuando este mensaje es el
|
|
104
103
|
// que está en streaming. useSyncExternalStore aísla el re-render a
|
|
105
104
|
// este componente, sin tocar el resto del árbol.
|
|
106
|
-
var streamingText = useStreamingMessage(props.isStreaming
|
|
107
|
-
var rawText = props.isStreaming
|
|
105
|
+
var streamingText = useStreamingMessage(resolveStreamingMessageHookId(props.isStreaming, props.messageId));
|
|
106
|
+
var rawText = resolveStreamingRawText(props.isStreaming, streamingText, props.message);
|
|
108
107
|
// Smooth streaming: desacopla la cadencia del backend del render.
|
|
109
108
|
// Durante el streaming libera chars a ritmo constante vía rAF; cuando
|
|
110
109
|
// termina, muestra el texto final al instante (sin animación residual).
|
|
@@ -116,24 +115,10 @@ var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
|
|
|
116
115
|
// window.streamLagMs = 450 // lag máximo base (ms)
|
|
117
116
|
// window.streamMinBuffer = 70 // piso del colchón en chars
|
|
118
117
|
// window.streamWarmupMs = 400 // warmup inicial (ms)
|
|
119
|
-
var winFlags =
|
|
120
|
-
var displayText = useSmoothStreamText(rawText,
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
snapToWordBoundary: true
|
|
124
|
-
}, winFlags.streamLagMs != null && {
|
|
125
|
-
targetLagMs: winFlags.streamLagMs
|
|
126
|
-
}), winFlags.streamAdapt != null && {
|
|
127
|
-
adaptToBackendRate: winFlags.streamAdapt
|
|
128
|
-
}), winFlags.streamBufferMs != null && {
|
|
129
|
-
targetBufferMs: winFlags.streamBufferMs
|
|
130
|
-
}), winFlags.streamMinBuffer != null && {
|
|
131
|
-
minBufferChars: winFlags.streamMinBuffer
|
|
132
|
-
}), winFlags.streamWarmupMs != null && {
|
|
133
|
-
warmupMs: winFlags.streamWarmupMs
|
|
134
|
-
}));
|
|
135
|
-
var createAgentActionsAgentId = (_props$createAgentFol = props.createAgentFollowUp) === null || _props$createAgentFol === void 0 ? void 0 : _props$createAgentFol.agentId;
|
|
136
|
-
if (!displayText && !props.isStreaming) return null;
|
|
118
|
+
var winFlags = readSmoothStreamWindowFlags();
|
|
119
|
+
var displayText = useSmoothStreamText(rawText, buildSmoothStreamTextOptions(winFlags, props.isStreaming));
|
|
120
|
+
var createAgentActionsAgentId = resolveCreateAgentActionsAgentId(props.createAgentFollowUp);
|
|
121
|
+
if (shouldHideEmptyStreamingBody(displayText, props.isStreaming)) return null;
|
|
137
122
|
var hasMentions = hasInlineMarkers(displayText);
|
|
138
123
|
var mentionNodes = hasMentions ? renderTextWithMentions(displayText) : null;
|
|
139
124
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
@@ -141,7 +126,7 @@ var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
|
|
|
141
126
|
isCurrentUser: props.isCurrentUser,
|
|
142
127
|
isFrontendCancelled: props.isFrontendCancelled,
|
|
143
128
|
className: getEntityLinkWrapperClassName(displayText),
|
|
144
|
-
children: hasMentions
|
|
129
|
+
children: shouldRenderMentionInlineNodes(hasMentions, mentionNodes) ?
|
|
145
130
|
/*#__PURE__*/
|
|
146
131
|
// Si hay mentions, renderizar directamente (sin markdown en el mismo párrafo)
|
|
147
132
|
_jsx("span", {
|
|
@@ -162,23 +147,41 @@ var StreamingMessageBody = /*#__PURE__*/memo(function (props) {
|
|
|
162
147
|
isAnimating: !!props.isStreaming,
|
|
163
148
|
children: displayText
|
|
164
149
|
})
|
|
165
|
-
}),
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
150
|
+
}), shouldRenderAssistantFeedback({
|
|
151
|
+
isAssistant: props.isAssistant,
|
|
152
|
+
isError: props.isError,
|
|
153
|
+
approval: props.approval,
|
|
154
|
+
isStreaming: props.isStreaming,
|
|
155
|
+
isFrontendCancelled: props.isFrontendCancelled,
|
|
156
|
+
onRetry: props.onRetry
|
|
157
|
+
}) && /*#__PURE__*/_jsx(MessageFeedback, _objectSpread(_objectSpread({
|
|
158
|
+
content: displayText
|
|
159
|
+
}, resolveFeedbackPropsForCancelled(props.isFrontendCancelled, props.sources, props.handleFeedbackClick)), {}, {
|
|
169
160
|
disableFeedback: props.disableFeedback,
|
|
170
161
|
onRetry: props.onRetry
|
|
171
|
-
}),
|
|
162
|
+
})), shouldRenderAssistantSuggestions({
|
|
163
|
+
isAssistant: props.isAssistant,
|
|
164
|
+
isFrontendCancelled: props.isFrontendCancelled,
|
|
165
|
+
approval: props.approval,
|
|
166
|
+
isError: props.isError,
|
|
167
|
+
suggestionsLength: (_props$suggestions$le = (_props$suggestions = props.suggestions) === null || _props$suggestions === void 0 ? void 0 : _props$suggestions.length) !== null && _props$suggestions$le !== void 0 ? _props$suggestions$le : 0
|
|
168
|
+
}) && /*#__PURE__*/_jsx(ChatAISuggestions, {
|
|
172
169
|
suggestions: props.suggestions || [],
|
|
173
170
|
onSelectSuggestion: function onSelectSuggestion(suggestion) {
|
|
174
171
|
return props.handleSuggestionClick(props.messageId, suggestion);
|
|
175
172
|
},
|
|
176
173
|
disabled: props.suggestionsDisabled,
|
|
177
|
-
hidden:
|
|
178
|
-
}),
|
|
174
|
+
hidden: shouldHideAssistantSuggestions(props.isStreaming, props.isLastMessage, props.suggestionsDisabled)
|
|
175
|
+
}), shouldRenderCreateAgentActions({
|
|
176
|
+
isAssistant: props.isAssistant,
|
|
177
|
+
isError: props.isError,
|
|
178
|
+
isFrontendCancelled: props.isFrontendCancelled,
|
|
179
|
+
approval: props.approval,
|
|
180
|
+
agentId: createAgentActionsAgentId
|
|
181
|
+
}) && /*#__PURE__*/_jsx(ChatAICreateAgentActions, {
|
|
179
182
|
agentId: createAgentActionsAgentId,
|
|
180
183
|
disabled: props.suggestionsDisabled,
|
|
181
|
-
hidden:
|
|
184
|
+
hidden: shouldHideAssistantSuggestions(props.isStreaming, props.isLastMessage, props.suggestionsDisabled)
|
|
182
185
|
})]
|
|
183
186
|
});
|
|
184
187
|
});
|
|
@@ -212,19 +215,17 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
212
215
|
_useState4 = _slicedToArray(_useState3, 2),
|
|
213
216
|
previewAttachment = _useState4[0],
|
|
214
217
|
setPreviewAttachment = _useState4[1];
|
|
215
|
-
var isCurrentUser = role
|
|
216
|
-
var isAssistant = role
|
|
218
|
+
var isCurrentUser = isCurrentUserMessage(role, user.id, authUser.id.toString());
|
|
219
|
+
var isAssistant = isAssistantChatMessage(role, user.id);
|
|
217
220
|
var isStreamingPlaceholder = isStreamingPlaceholderMessageId(id);
|
|
218
|
-
var streamingText = useStreamingMessage(isStreaming
|
|
219
|
-
var isActiveStreaming =
|
|
221
|
+
var streamingText = useStreamingMessage(resolveStreamingTextHookId(Boolean(isStreaming), isStreamingPlaceholder, id));
|
|
222
|
+
var isActiveStreaming = isActiveStreamingState(isStreaming, isStreamingPlaceholder);
|
|
220
223
|
var hasStreamText = Boolean(streamingText);
|
|
221
|
-
var reasoningTrace = useReasoningTrace(isAssistant
|
|
222
|
-
var streamNarrationInTimeline = isAssistant && shouldStreamNarrationInTimeline(reasoningTrace.steps, streamActivity, streamingText,
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
var
|
|
226
|
-
var showActivityIndicator = isAssistant && isActiveStreaming && !!streamActivity;
|
|
227
|
-
var messageAttachments = attachments && attachments.length > 0 ? attachments : !isAssistant && Array.isArray(sources) ? sources : [];
|
|
224
|
+
var reasoningTrace = useReasoningTrace(resolveReasoningTraceHookId(isAssistant, isActiveStreaming, id));
|
|
225
|
+
var streamNarrationInTimeline = isAssistant && shouldStreamNarrationInTimeline(reasoningTrace.steps, streamActivity, streamingText, id);
|
|
226
|
+
var showStreamingBody = shouldShowStreamingMessageBody(isActiveStreaming, hasStreamText, streamNarrationInTimeline);
|
|
227
|
+
var showActivityIndicator = shouldShowStreamActivityIndicator(isAssistant, isActiveStreaming, streamActivity);
|
|
228
|
+
var messageAttachments = resolveMessageAttachments(attachments, isAssistant, sources);
|
|
228
229
|
var handleAttachmentClick = function handleAttachmentClick(attachment) {
|
|
229
230
|
// Permitir previsualización si tiene archivo local o URLs del backend
|
|
230
231
|
if (canOpenAttachmentPreview(attachment)) {
|
|
@@ -236,16 +237,16 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
236
237
|
};
|
|
237
238
|
var handleAttachmentDownload = /*#__PURE__*/function () {
|
|
238
239
|
var _ref4 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(attachment) {
|
|
239
|
-
var
|
|
240
|
+
var fileName, fileUrl, blobUrl, downloadStrategy, downloadedFile, link, _t;
|
|
240
241
|
return _regeneratorRuntime.wrap(function (_context) {
|
|
241
242
|
while (1) switch (_context.prev = _context.next) {
|
|
242
243
|
case 0:
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
fileUrl = attachment.url_original || attachment.url_file || attachment.url_thumbnail;
|
|
244
|
+
fileName = resolveAttachmentDownloadFileName(attachment);
|
|
245
|
+
fileUrl = resolveAttachmentDownloadUrl(attachment);
|
|
246
246
|
_context.prev = 1;
|
|
247
247
|
blobUrl = null;
|
|
248
|
-
|
|
248
|
+
downloadStrategy = resolveAttachmentDownloadBlobStrategy(fileUrl, attachment.file);
|
|
249
|
+
if (!(downloadStrategy === 'remote-url' && fileUrl)) {
|
|
249
250
|
_context.next = 3;
|
|
250
251
|
break;
|
|
251
252
|
}
|
|
@@ -257,7 +258,7 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
257
258
|
_context.next = 4;
|
|
258
259
|
break;
|
|
259
260
|
case 3:
|
|
260
|
-
if (attachment.file instanceof File) {
|
|
261
|
+
if (downloadStrategy === 'local-file' && attachment.file instanceof File) {
|
|
261
262
|
blobUrl = URL.createObjectURL(attachment.file);
|
|
262
263
|
}
|
|
263
264
|
case 4:
|
|
@@ -293,7 +294,7 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
293
294
|
return _ref4.apply(this, arguments);
|
|
294
295
|
};
|
|
295
296
|
}();
|
|
296
|
-
if (isChangeProject
|
|
297
|
+
if (shouldRenderChangeProjectMessage(isChangeProject, options)) {
|
|
297
298
|
return /*#__PURE__*/_jsx(MessageWrapper, {
|
|
298
299
|
isCurrentUser: isCurrentUser,
|
|
299
300
|
"data-message-id": id,
|
|
@@ -327,7 +328,7 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
327
328
|
}) : /*#__PURE__*/_jsx(ReasoningBlock, {
|
|
328
329
|
messageId: id,
|
|
329
330
|
trace: (_props$reasoning = props.reasoning) !== null && _props$reasoning !== void 0 ? _props$reasoning : null
|
|
330
|
-
})),
|
|
331
|
+
})), shouldShowMessageAttachmentsRow(messageAttachments.length) && /*#__PURE__*/_jsx(SCAttachmentsRow, {
|
|
331
332
|
$isAssistant: isAssistant,
|
|
332
333
|
children: messageAttachments.map(function (attachment, index) {
|
|
333
334
|
// Detectar si es un archivo de audio
|
|
@@ -347,7 +348,12 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
347
348
|
}
|
|
348
349
|
}, "".concat(attachment.id, "-").concat(attachment.name));
|
|
349
350
|
})
|
|
350
|
-
}), (
|
|
351
|
+
}), shouldRenderMessageTextBody({
|
|
352
|
+
messageText: message,
|
|
353
|
+
showStreamingBody: showStreamingBody,
|
|
354
|
+
isAssistant: isAssistant,
|
|
355
|
+
attachmentCount: messageAttachments.length
|
|
356
|
+
}) && /*#__PURE__*/_jsx(StreamingMessageBody, {
|
|
351
357
|
message: message !== null && message !== void 0 ? message : '',
|
|
352
358
|
isStreaming: showStreamingBody,
|
|
353
359
|
isCurrentUser: isCurrentUser,
|
|
@@ -365,12 +371,12 @@ var MessageItem = /*#__PURE__*/memo(function (props) {
|
|
|
365
371
|
suggestionsDisabled: isActiveStreaming || !!hasSelectedSuggestion,
|
|
366
372
|
messageId: id,
|
|
367
373
|
isLastMessage: isLastMessage
|
|
368
|
-
}), showActivityIndicator && /*#__PURE__*/_jsx(SCTimelineIndicator, {
|
|
374
|
+
}), showActivityIndicator && streamActivity ? /*#__PURE__*/_jsx(SCTimelineIndicator, {
|
|
369
375
|
children: /*#__PURE__*/_jsx(AgentActivityIndicator, {
|
|
370
376
|
activity: streamActivity,
|
|
371
377
|
compact: true
|
|
372
378
|
})
|
|
373
|
-
}), approval && approval
|
|
379
|
+
}) : null, shouldShowApprovalActions(approval) && approval && /*#__PURE__*/_jsx(SCApprovalActionsColumn, {
|
|
374
380
|
children: /*#__PURE__*/_jsx(ApprovalBox, {
|
|
375
381
|
actions: approval.pending_actions,
|
|
376
382
|
status: approvalStatus,
|
|
@@ -402,9 +408,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
402
408
|
onScrollToBottom = _ref5.onScrollToBottom,
|
|
403
409
|
attachments = _ref5.attachments,
|
|
404
410
|
agents = _ref5.agents,
|
|
405
|
-
expanded = _ref5.expanded
|
|
406
|
-
_ref5$skipEnterAnimat = _ref5.skipEnterAnimation,
|
|
407
|
-
skipEnterAnimation = _ref5$skipEnterAnimat === void 0 ? false : _ref5$skipEnterAnimat;
|
|
411
|
+
expanded = _ref5.expanded;
|
|
408
412
|
var _useT = useT(),
|
|
409
413
|
t = _useT.t;
|
|
410
414
|
var _useGlobalContext = useGlobalContext(),
|
|
@@ -497,12 +501,12 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
497
501
|
showScrollToBottomRef.current = shouldShow;
|
|
498
502
|
setShowScrollToBottom(shouldShow);
|
|
499
503
|
}
|
|
500
|
-
var nextTopGradient = scrollTop
|
|
504
|
+
var nextTopGradient = shouldShowTopScrollGradient(scrollTop);
|
|
501
505
|
if (showTopGradientRef.current !== nextTopGradient) {
|
|
502
506
|
showTopGradientRef.current = nextTopGradient;
|
|
503
507
|
setShowTopGradient(nextTopGradient);
|
|
504
508
|
}
|
|
505
|
-
var nextBottomGradient = distanceFromBottom
|
|
509
|
+
var nextBottomGradient = shouldShowBottomScrollGradient(distanceFromBottom);
|
|
506
510
|
if (showBottomGradientRef.current !== nextBottomGradient) {
|
|
507
511
|
showBottomGradientRef.current = nextBottomGradient;
|
|
508
512
|
setShowBottomGradient(nextBottomGradient);
|
|
@@ -544,14 +548,12 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
544
548
|
if (!el) return;
|
|
545
549
|
var from = el.scrollTop;
|
|
546
550
|
var distance = top - from;
|
|
547
|
-
if (
|
|
551
|
+
if (shouldSkipTurnScrollAnimation(distance)) return;
|
|
548
552
|
var duration = computeTurnScrollDurationMs(distance);
|
|
549
553
|
var startedAt = performance.now();
|
|
550
554
|
var _step = function step(now) {
|
|
551
555
|
var progress = Math.min(1, (now - startedAt) / duration);
|
|
552
|
-
|
|
553
|
-
// antes que el quint y aterriza sin corte perceptible.
|
|
554
|
-
var eased = progress === 1 ? 1 : 1 - Math.pow(2, -12 * progress);
|
|
556
|
+
var eased = easeOutExpoScrollProgress(progress);
|
|
555
557
|
el.scrollTop = from + distance * eased;
|
|
556
558
|
updateScrollAffordances();
|
|
557
559
|
turnScrollRafRef.current = progress < 1 ? requestAnimationFrame(_step) : null;
|
|
@@ -562,7 +564,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
562
564
|
return cancelTurnScroll;
|
|
563
565
|
}, [cancelTurnScroll]);
|
|
564
566
|
var setSpacerHeight = useCallback(function (next) {
|
|
565
|
-
if (
|
|
567
|
+
if (!shouldUpdateSpacerHeight(spacerHeightRef.current, next)) return;
|
|
566
568
|
spacerHeightRef.current = next;
|
|
567
569
|
if (spacerElRef.current) {
|
|
568
570
|
spacerElRef.current.style.height = "".concat(next, "px");
|
|
@@ -590,7 +592,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
590
592
|
* handler de scroll sigue drenando hasta que llega al fondo y no queda hueco.
|
|
591
593
|
*/
|
|
592
594
|
var releaseTurnSpace = useCallback(function () {
|
|
593
|
-
if (!anchoredTurnIdRef.current
|
|
595
|
+
if (!shouldReleaseTurnSpace(anchoredTurnIdRef.current, spacerHeightRef.current)) return;
|
|
594
596
|
anchoredTurnIdRef.current = null;
|
|
595
597
|
drainTurnSpace();
|
|
596
598
|
}, [drainTurnSpace]);
|
|
@@ -598,25 +600,6 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
598
600
|
cancelTurnScroll();
|
|
599
601
|
releaseTurnSpace();
|
|
600
602
|
}, [cancelTurnScroll, releaseTurnSpace]);
|
|
601
|
-
|
|
602
|
-
/** En fullscreen el wheel en márgenes/overlay cae fuera de SCMessagesScroll; reenviamos al scroller del hilo. */
|
|
603
|
-
var handleMessagesOuterWheel = useCallback(function (event) {
|
|
604
|
-
handleUserScrollIntent();
|
|
605
|
-
var scroller = messagesRef.current;
|
|
606
|
-
if (!scroller) return;
|
|
607
|
-
var target = event.target;
|
|
608
|
-
if (target !== event.currentTarget && (target === scroller || scroller.contains(target))) {
|
|
609
|
-
return;
|
|
610
|
-
}
|
|
611
|
-
var deltaY = event.deltaY;
|
|
612
|
-
if (deltaY === 0) return;
|
|
613
|
-
var maxScroll = scroller.scrollHeight - scroller.clientHeight;
|
|
614
|
-
if (maxScroll <= 0) return;
|
|
615
|
-
var nextScrollTop = Math.min(maxScroll, Math.max(0, scroller.scrollTop + deltaY));
|
|
616
|
-
if (nextScrollTop === scroller.scrollTop) return;
|
|
617
|
-
scroller.scrollTop = nextScrollTop;
|
|
618
|
-
event.preventDefault();
|
|
619
|
-
}, [handleUserScrollIntent]);
|
|
620
603
|
var measureTurn = useCallback(function (questionId) {
|
|
621
604
|
var el = messagesRef.current;
|
|
622
605
|
var spacerEl = spacerElRef.current;
|
|
@@ -624,12 +607,18 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
624
607
|
var questionEl = el.querySelector("[data-message-id=\"".concat(questionId, "\"]"));
|
|
625
608
|
if (!questionEl) return null;
|
|
626
609
|
var containerTop = el.getBoundingClientRect().top;
|
|
627
|
-
var
|
|
628
|
-
|
|
610
|
+
var _computeMeasureTurnLa = computeMeasureTurnLayout({
|
|
611
|
+
containerTop: containerTop,
|
|
612
|
+
questionTop: questionEl.getBoundingClientRect().top,
|
|
613
|
+
contentBottom: spacerEl.getBoundingClientRect().top,
|
|
614
|
+
scrollTop: el.scrollTop
|
|
615
|
+
}),
|
|
616
|
+
questionTop = _computeMeasureTurnLa.questionTop,
|
|
617
|
+
turnHeight = _computeMeasureTurnLa.turnHeight;
|
|
629
618
|
return {
|
|
630
619
|
el: el,
|
|
631
620
|
questionTop: questionTop,
|
|
632
|
-
turnHeight:
|
|
621
|
+
turnHeight: turnHeight
|
|
633
622
|
};
|
|
634
623
|
}, []);
|
|
635
624
|
var reserveTurnSpace = useCallback(function (questionId) {
|
|
@@ -642,21 +631,20 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
642
631
|
// Anclamos siempre, incluso cuando no haga falta reservar: durante el
|
|
643
632
|
// turno el scroll no se mueve solo en ningún caso.
|
|
644
633
|
anchoredTurnIdRef.current = questionId;
|
|
645
|
-
var
|
|
646
|
-
var
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
634
|
+
var targetScrollTop = computeTurnScrollTargetTop(questionTop, el.clientHeight);
|
|
635
|
+
var plan = resolveReserveTurnSpacePlan({
|
|
636
|
+
currentScrollTop: el.scrollTop,
|
|
637
|
+
targetScrollTop: targetScrollTop,
|
|
638
|
+
clientHeight: el.clientHeight,
|
|
639
|
+
turnHeight: turnHeight
|
|
640
|
+
});
|
|
641
|
+
if (plan.kind === 'skip-reservation') {
|
|
650
642
|
setSpacerHeight(0);
|
|
651
643
|
updateScrollAffordances();
|
|
652
644
|
return;
|
|
653
645
|
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
// spacer se inserta de una (es alto reservado, no contenido visible);
|
|
657
|
-
// lo único que se percibe es el desplazamiento animado.
|
|
658
|
-
setSpacerHeight(computeReservedTurnSpace(el.clientHeight, turnHeight, el.clientHeight));
|
|
659
|
-
animateScrollTo(targetScrollTop);
|
|
646
|
+
setSpacerHeight(plan.spacerHeight);
|
|
647
|
+
animateScrollTo(plan.targetScrollTop);
|
|
660
648
|
}, [measureTurn, setSpacerHeight, updateScrollAffordances, animateScrollTo]);
|
|
661
649
|
|
|
662
650
|
/**
|
|
@@ -670,9 +658,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
670
658
|
if (spacerHeightRef.current > 0) {
|
|
671
659
|
var measured = measureTurn(anchoredTurnIdRef.current);
|
|
672
660
|
if (measured) {
|
|
673
|
-
|
|
674
|
-
var reserved = Math.max(0, measured.el.clientHeight - measured.turnHeight - offset);
|
|
675
|
-
setSpacerHeight(Math.min(spacerHeightRef.current, reserved));
|
|
661
|
+
setSpacerHeight(computeSyncedTurnSpacerHeight(measured.el.clientHeight, measured.turnHeight, spacerHeightRef.current));
|
|
676
662
|
}
|
|
677
663
|
}
|
|
678
664
|
return true;
|
|
@@ -682,7 +668,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
682
668
|
if (!el) return;
|
|
683
669
|
clearTurnSpace();
|
|
684
670
|
// Misma curva y duración que el anclaje del turno: el `smooth` nativo frena seco.
|
|
685
|
-
animateScrollTo(el.scrollHeight
|
|
671
|
+
animateScrollTo(resolveScrollToBottomTargetTop(el.scrollHeight, el.clientHeight));
|
|
686
672
|
}, [clearTurnSpace, animateScrollTo]);
|
|
687
673
|
var handleScrollToBottom = useCallback(function (e) {
|
|
688
674
|
var container = e.currentTarget;
|
|
@@ -694,22 +680,20 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
694
680
|
var scrollTop = container.scrollTop,
|
|
695
681
|
scrollHeight = container.scrollHeight,
|
|
696
682
|
clientHeight = container.clientHeight;
|
|
697
|
-
var
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
// quede hueco debajo.
|
|
710
|
-
if (!anchoredTurnIdRef.current) drainTurnSpace();
|
|
683
|
+
var scrollFrame = processChatMessagesScrollFrame({
|
|
684
|
+
scrollTop: scrollTop,
|
|
685
|
+
scrollHeight: scrollHeight,
|
|
686
|
+
clientHeight: clientHeight,
|
|
687
|
+
lastScrollTop: lastScrollTopRef.current,
|
|
688
|
+
scrollThreshold: scrollThresholdRef.current,
|
|
689
|
+
anchoredTurnId: anchoredTurnIdRef.current,
|
|
690
|
+
initialChatId: initialChatId
|
|
691
|
+
});
|
|
692
|
+
scrollThresholdRef.current = scrollFrame.nextScrollThreshold;
|
|
693
|
+
lastScrollTopRef.current = scrollFrame.lastScrollTop;
|
|
694
|
+
if (scrollFrame.shouldDrainTurnSpace) drainTurnSpace();
|
|
711
695
|
updateScrollAffordances();
|
|
712
|
-
if (
|
|
696
|
+
if (scrollFrame.shouldScheduleScrollPersist) {
|
|
713
697
|
if (scrollPersistTimerRef.current != null) {
|
|
714
698
|
window.clearTimeout(scrollPersistTimerRef.current);
|
|
715
699
|
}
|
|
@@ -720,7 +704,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
720
704
|
});
|
|
721
705
|
}, 150);
|
|
722
706
|
}
|
|
723
|
-
if (
|
|
707
|
+
if (scrollFrame.shouldNotifyScrollToBottom && onScrollToBottom) {
|
|
724
708
|
onScrollToBottom();
|
|
725
709
|
}
|
|
726
710
|
handleScroll(container);
|
|
@@ -755,12 +739,11 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
755
739
|
var selectedSuggestionMessageIdsRef = useRef(selectedSuggestionMessageIds);
|
|
756
740
|
selectedSuggestionMessageIdsRef.current = selectedSuggestionMessageIds;
|
|
757
741
|
var handleSuggestionClick = useCallback(function (messageId, suggestion) {
|
|
758
|
-
if (
|
|
759
|
-
if (selectedSuggestionMessageIdsRef.current[messageId]) return;
|
|
742
|
+
if (shouldIgnoreSuggestionClick(suggestion, selectedSuggestionMessageIdsRef.current[messageId])) return;
|
|
760
743
|
var currentMessages = messagesDataRef.current;
|
|
761
744
|
var isMarketplaceGlobalAgent = isMaiakerAgent(agent);
|
|
762
745
|
event(EVENTS.aiChatSuggestedAnswer, {
|
|
763
|
-
agent_type: isMarketplaceGlobalAgent
|
|
746
|
+
agent_type: resolveSuggestionAnalyticsAgentType(isMarketplaceGlobalAgent, agent === null || agent === void 0 ? void 0 : agent.type)
|
|
764
747
|
});
|
|
765
748
|
setSelectedSuggestionMessageIds(function (prev) {
|
|
766
749
|
return _objectSpread(_objectSpread({}, prev), {}, _defineProperty({}, messageId, true));
|
|
@@ -768,14 +751,12 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
768
751
|
var targetMessage = currentMessages.find(function (msg) {
|
|
769
752
|
return msg.id === messageId;
|
|
770
753
|
});
|
|
771
|
-
|
|
772
|
-
if (isRetrySuggestion) {
|
|
754
|
+
if (isRetrySuggestionSelection(targetMessage === null || targetMessage === void 0 ? void 0 : targetMessage.isError, suggestion, t('chat.retry'))) {
|
|
773
755
|
var _lastUserMessage = currentMessages.filter(function (msg) {
|
|
774
756
|
return msg.role === ChatHistoryRole.USER || msg.user.id === authUser.id.toString();
|
|
775
757
|
}).at(-1);
|
|
776
758
|
if (_lastUserMessage !== null && _lastUserMessage !== void 0 && _lastUserMessage.message) {
|
|
777
|
-
|
|
778
|
-
sendMessageRef.current(_lastUserMessage.message, retryAttachments);
|
|
759
|
+
sendMessageRef.current(_lastUserMessage.message, resolveRetryAttachmentsFromUserMessage(_lastUserMessage));
|
|
779
760
|
return;
|
|
780
761
|
}
|
|
781
762
|
}
|
|
@@ -790,7 +771,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
790
771
|
isLoadingMoreRef.current = isLoadingMoreMessages;
|
|
791
772
|
}, [isLoadingMoreMessages]);
|
|
792
773
|
useEffect(function () {
|
|
793
|
-
if (
|
|
774
|
+
if (shouldInitializeChat(chatInitializedRef.current)) {
|
|
794
775
|
chatInitializedRef.current = true;
|
|
795
776
|
initializeChat();
|
|
796
777
|
}
|
|
@@ -799,7 +780,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
799
780
|
// Mientras el stream crece: encoger el spacer del turno anclado y
|
|
800
781
|
// actualizar flecha/gradientes. El scroll no se mueve solo.
|
|
801
782
|
useEffect(function () {
|
|
802
|
-
if (!waitingResponse
|
|
783
|
+
if (!shouldRunStreamTurnSyncEffect(waitingResponse, isWriting)) return undefined;
|
|
803
784
|
if (!messagesRef.current) return undefined;
|
|
804
785
|
var rafId = null;
|
|
805
786
|
var _tick = function tick() {
|
|
@@ -821,16 +802,18 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
821
802
|
|
|
822
803
|
// Cambio de chat: el ancla y el spacer del turno anterior dejan de aplicar.
|
|
823
804
|
useEffect(function () {
|
|
824
|
-
if (!loadingMessages) return;
|
|
805
|
+
if (!shouldClearLastReservedQuestion(loadingMessages)) return;
|
|
825
806
|
lastReservedQuestionRef.current = null;
|
|
826
807
|
clearTurnSpace();
|
|
827
808
|
}, [loadingMessages, clearTurnSpace]);
|
|
828
809
|
|
|
829
810
|
// Al enviar un mensaje: anclamos el turno y hacemos el único scroll del ciclo.
|
|
830
811
|
useEffect(function () {
|
|
831
|
-
if (loadingMessages || isLoadingMoreMessages) return;
|
|
832
812
|
var questionId = findLastQuestionId(messages);
|
|
833
|
-
if (!
|
|
813
|
+
if (!shouldScheduleTurnSpaceReservation(loadingMessages, isLoadingMoreMessages, questionId, lastReservedQuestionRef.current)) {
|
|
814
|
+
return;
|
|
815
|
+
}
|
|
816
|
+
if (!questionId) return;
|
|
834
817
|
lastReservedQuestionRef.current = questionId;
|
|
835
818
|
requestAnimationFrame(function () {
|
|
836
819
|
return reserveTurnSpace(questionId);
|
|
@@ -856,8 +839,9 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
856
839
|
// Restauración desde cache (sin Loader): bajar al fondo al reabrir sesión visitada.
|
|
857
840
|
useLayoutEffect(function () {
|
|
858
841
|
var _messages$id, _messages;
|
|
859
|
-
if (loadingMessages
|
|
860
|
-
|
|
842
|
+
if (!shouldRunSessionCacheScrollToBottom(loadingMessages, initialChatId, messages.length, lastScrolledSessionRef.current)) {
|
|
843
|
+
return;
|
|
844
|
+
}
|
|
861
845
|
lastScrolledSessionRef.current = initialChatId;
|
|
862
846
|
scrollThresholdRef.current = 39;
|
|
863
847
|
lastMessageIdRef.current = (_messages$id = (_messages = messages[messages.length - 1]) === null || _messages === void 0 ? void 0 : _messages.id) !== null && _messages$id !== void 0 ? _messages$id : null;
|
|
@@ -869,7 +853,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
869
853
|
}, [initialChatId, loadingMessages, messages.length, messages, scrollToBottomRaf]);
|
|
870
854
|
useEffect(function () {
|
|
871
855
|
var _lastMessage$id;
|
|
872
|
-
if (
|
|
856
|
+
if (shouldSkipMessagesScrollEffect(Boolean(messagesRef.current), loadingMessages, isLoadingMoreMessages, isLoadingMoreRef.current)) {
|
|
873
857
|
return;
|
|
874
858
|
}
|
|
875
859
|
var lastMessage = messages[messages.length - 1];
|
|
@@ -878,55 +862,38 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
878
862
|
var prevLen = lastMessagesLengthRef.current;
|
|
879
863
|
lastMessageIdRef.current = lastId;
|
|
880
864
|
lastMessagesLengthRef.current = messages.length;
|
|
881
|
-
var isNewMessage = lastId
|
|
882
|
-
if (!isNewMessage) {
|
|
883
|
-
updateScrollAffordances();
|
|
884
|
-
return;
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
// Turno anclado: ni el reemplazo del placeholder por el mensaje final, ni la
|
|
888
|
-
// aparición del ApprovalBox mueven el scroll. Solo se ajusta el spacer.
|
|
889
|
-
if (anchoredTurnIdRef.current) {
|
|
890
|
-
requestAnimationFrame(syncTurnSpace);
|
|
891
|
-
return;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
// Mientras el agente responde no empujamos el scroll: el usuario se queda
|
|
895
|
-
// donde está y usa el botón si quiere ir al fondo.
|
|
896
|
-
if (waitingResponse || isWriting) {
|
|
897
|
-
updateScrollAffordances();
|
|
898
|
-
return;
|
|
899
|
-
}
|
|
865
|
+
var isNewMessage = isNewChatMessageEvent(lastId, prevId, messages.length, prevLen);
|
|
900
866
|
var container = messagesRef.current;
|
|
901
|
-
var
|
|
902
|
-
|
|
903
|
-
|
|
867
|
+
var scrollDecision = shouldAutoScrollOnMessagesChange({
|
|
868
|
+
isNewMessage: isNewMessage,
|
|
869
|
+
anchoredTurnId: anchoredTurnIdRef.current,
|
|
870
|
+
waitingResponse: waitingResponse,
|
|
871
|
+
isWriting: isWriting,
|
|
872
|
+
isAtBottom: resolveContainerAtBottom(container),
|
|
873
|
+
isAnswerOrQuestion: isAnswerOrQuestionChatMessageId(lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.id),
|
|
874
|
+
isApproval: isApprovalChatMessage(lastMessage),
|
|
875
|
+
hasInitialMessage: hasInitialUserMessageInList(messages),
|
|
876
|
+
messagesLength: messages.length,
|
|
877
|
+
prevMessagesLength: prevLen
|
|
904
878
|
});
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
// Nuevos answer/question: scroll si el usuario ya estaba al fondo.
|
|
909
|
-
if (isAnswerOrQuestion && isAtBottom) {
|
|
910
|
-
scrollToBottomRaf();
|
|
879
|
+
if (scrollDecision === 'affordances-only') {
|
|
880
|
+
updateScrollAffordances();
|
|
911
881
|
return;
|
|
912
882
|
}
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
// pero sí un mensaje nuevo (no el "user-initial-message"). Scrollea.
|
|
916
|
-
if (!isAnswerOrQuestion && !isApproval && !hasInitialMessage && messages.length > prevLen) {
|
|
917
|
-
scrollToBottomRaf();
|
|
883
|
+
if (scrollDecision === 'sync-turn') {
|
|
884
|
+
requestAnimationFrame(syncTurnSpace);
|
|
918
885
|
return;
|
|
919
886
|
}
|
|
920
|
-
|
|
887
|
+
scrollToBottomRaf();
|
|
921
888
|
}, [messages, loadingMessages, isLoadingMoreMessages, waitingResponse, isWriting, scrollToBottomRaf, syncTurnSpace, updateScrollAffordances]);
|
|
922
889
|
|
|
923
890
|
// Al abrir/cargar una conversación el contenedor se remonta (Loader → lista) con
|
|
924
891
|
// scrollTop=0. Forzamos ir al fondo al terminar loadMessages, sin afectar paginación hacia arriba.
|
|
925
892
|
useLayoutEffect(function () {
|
|
926
893
|
var _messages$id2, _messages2;
|
|
927
|
-
var justFinishedLoading = wasLoadingMessagesRef.current
|
|
894
|
+
var justFinishedLoading = detectJustFinishedLoadingMessages(wasLoadingMessagesRef.current, loadingMessages);
|
|
928
895
|
wasLoadingMessagesRef.current = loadingMessages;
|
|
929
|
-
if (!justFinishedLoading
|
|
896
|
+
if (!shouldScrollToBottomAfterLoad(justFinishedLoading, messages.length)) return;
|
|
930
897
|
scrollThresholdRef.current = 39;
|
|
931
898
|
lastMessageIdRef.current = (_messages$id2 = (_messages2 = messages[messages.length - 1]) === null || _messages2 === void 0 ? void 0 : _messages2.id) !== null && _messages$id2 !== void 0 ? _messages$id2 : null;
|
|
932
899
|
lastMessagesLengthRef.current = messages.length;
|
|
@@ -938,16 +905,14 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
938
905
|
|
|
939
906
|
// Estado inicial del botón scroll-to-bottom al terminar loadingMessages.
|
|
940
907
|
useEffect(function () {
|
|
941
|
-
if (
|
|
908
|
+
if (shouldUpdateScrollAffordancesOnLoadEnd(loadingMessages)) {
|
|
942
909
|
updateScrollAffordances();
|
|
943
910
|
}
|
|
944
911
|
}, [loadingMessages, messages.length, updateScrollAffordances]);
|
|
945
912
|
|
|
946
913
|
// Obtener el último mensaje del usuario para verificar si tiene attachments
|
|
947
|
-
var lastUserMessage = messages.
|
|
948
|
-
|
|
949
|
-
}).at(-1);
|
|
950
|
-
var attachmentsCount = (Array.isArray(lastUserMessage === null || lastUserMessage === void 0 ? void 0 : lastUserMessage.attachments) ? lastUserMessage.attachments.length : 0) || (Array.isArray(lastUserMessage === null || lastUserMessage === void 0 ? void 0 : lastUserMessage.sources) ? lastUserMessage.sources.length : 0);
|
|
914
|
+
var lastUserMessage = resolveLastUserMessageForAttachments(messages, authUser.id.toString());
|
|
915
|
+
var attachmentsCount = countUserMessageAttachments(lastUserMessage);
|
|
951
916
|
var streamLoadingDisplay = resolveStreamLoadingDisplay({
|
|
952
917
|
streamActivity: streamActivity,
|
|
953
918
|
loadingMessage: loadingMessage,
|
|
@@ -959,20 +924,27 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
959
924
|
attachmentsCount: attachmentsCount,
|
|
960
925
|
t: t
|
|
961
926
|
});
|
|
927
|
+
var isScrollOnParent = resolveScrollOnParentMode(expanded);
|
|
962
928
|
useEffect(function () {
|
|
963
|
-
|
|
929
|
+
var _session$scrollSessio, _session$scrollTop;
|
|
930
|
+
if (shouldClearScrollRestoreWithoutChat(initialChatId)) {
|
|
964
931
|
pendingScrollRestoreRef.current = null;
|
|
965
932
|
return;
|
|
966
933
|
}
|
|
967
934
|
var session = readMaiaPanelSession(authUser.id);
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
935
|
+
pendingScrollRestoreRef.current = resolvePendingScrollTopFromSession(session ? {
|
|
936
|
+
scrollSessionId: (_session$scrollSessio = session.scrollSessionId) !== null && _session$scrollSessio !== void 0 ? _session$scrollSessio : undefined,
|
|
937
|
+
scrollTop: (_session$scrollTop = session.scrollTop) !== null && _session$scrollTop !== void 0 ? _session$scrollTop : undefined
|
|
938
|
+
} : null, initialChatId);
|
|
971
939
|
}, [authUser.id, initialChatId]);
|
|
972
940
|
useLayoutEffect(function () {
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
941
|
+
var container = messagesRef.current;
|
|
942
|
+
var pendingScrollTop = pendingScrollRestoreRef.current;
|
|
943
|
+
if (!container || !shouldApplyPendingScrollRestore(loadingMessages, pendingScrollTop, true) || pendingScrollTop == null) {
|
|
944
|
+
return;
|
|
945
|
+
}
|
|
946
|
+
container.scrollTop = pendingScrollTop;
|
|
947
|
+
lastScrollTopRef.current = pendingScrollTop;
|
|
976
948
|
pendingScrollRestoreRef.current = null;
|
|
977
949
|
}, [loadingMessages, messages.length]);
|
|
978
950
|
|
|
@@ -980,13 +952,11 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
980
952
|
// Restaurar la posición de scroll antes del paint para evitar que la conversación salte arriba.
|
|
981
953
|
var expandedRef = useRef(expanded);
|
|
982
954
|
useLayoutEffect(function () {
|
|
983
|
-
if (expandedRef.current
|
|
955
|
+
if (shouldRestoreScrollOnExpandedChange(Boolean(expandedRef.current), Boolean(expanded), Boolean(messagesRef.current))) {
|
|
984
956
|
var savedScrollTop = lastScrollTopRef.current;
|
|
985
957
|
messagesRef.current.scrollTop = savedScrollTop;
|
|
986
|
-
expandedRef.current = expanded;
|
|
987
|
-
} else {
|
|
988
|
-
expandedRef.current = expanded;
|
|
989
958
|
}
|
|
959
|
+
expandedRef.current = expanded;
|
|
990
960
|
}, [expanded]);
|
|
991
961
|
if (loadingMessages) {
|
|
992
962
|
return /*#__PURE__*/_jsx(Fade, {
|
|
@@ -995,28 +965,53 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
995
965
|
});
|
|
996
966
|
}
|
|
997
967
|
var lastMessage = messages[messages.length - 1];
|
|
998
|
-
var hasMessageLevelIndicator =
|
|
968
|
+
var hasMessageLevelIndicator = hasMessageLevelStreamIndicator(lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.id, waitingResponse, isWriting);
|
|
999
969
|
var messagesContent = /*#__PURE__*/_jsxs(_Fragment, {
|
|
1000
970
|
children: [isLoadingMoreMessages && /*#__PURE__*/_jsx(LoadingText, {
|
|
1001
971
|
text: t('chat.loadingMore')
|
|
1002
972
|
}), /*#__PURE__*/_jsx(_Fragment, {
|
|
1003
973
|
children: messages.map(function (message, index) {
|
|
1004
|
-
var _message$attachments, _message$sources, _message$
|
|
1005
|
-
var isAssistantMessage = message.role === ChatHistoryRole.ASSISTANT || message.user.id === 'assistant';
|
|
974
|
+
var _message$attachments$, _message$attachments, _message$sources$leng, _message$sources, _message$message, _message$project;
|
|
1006
975
|
var isLastMessage = index === messages.length - 1;
|
|
1007
|
-
var
|
|
1008
|
-
|
|
976
|
+
var _resolveChatListItemS = resolveChatListItemStreamingFlags({
|
|
977
|
+
role: message.role,
|
|
978
|
+
userId: message.user.id,
|
|
979
|
+
messageId: message.id,
|
|
980
|
+
isLastMessage: isLastMessage,
|
|
981
|
+
waitingResponse: waitingResponse,
|
|
982
|
+
isWriting: isWriting
|
|
983
|
+
}),
|
|
984
|
+
isStreamingPlaceholder = _resolveChatListItemS.isStreamingPlaceholder,
|
|
985
|
+
isStreaming = _resolveChatListItemS.isStreaming;
|
|
1009
986
|
|
|
1010
987
|
// No filtrar el placeholder del mensaje en streaming: su texto vive
|
|
1011
988
|
// en el streamingStore y `message.message` es '' hasta el complete.
|
|
1012
|
-
if (
|
|
1013
|
-
|
|
989
|
+
if (shouldSkipEmptyChatListMessage({
|
|
990
|
+
isStreamingPlaceholder: isStreamingPlaceholder,
|
|
991
|
+
isStreaming: isStreaming,
|
|
992
|
+
attachmentCount: (_message$attachments$ = (_message$attachments = message.attachments) === null || _message$attachments === void 0 ? void 0 : _message$attachments.length) !== null && _message$attachments$ !== void 0 ? _message$attachments$ : 0,
|
|
993
|
+
sourceCount: (_message$sources$leng = (_message$sources = message.sources) === null || _message$sources === void 0 ? void 0 : _message$sources.length) !== null && _message$sources$leng !== void 0 ? _message$sources$leng : 0,
|
|
994
|
+
messageText: (_message$message = message.message) !== null && _message$message !== void 0 ? _message$message : '',
|
|
995
|
+
projectName: (_message$project = message.project) === null || _message$project === void 0 ? void 0 : _message$project.name,
|
|
996
|
+
hasApproval: Boolean(message.approval)
|
|
997
|
+
})) {
|
|
998
|
+
return null;
|
|
999
|
+
}
|
|
1000
|
+
var messageFeedback = resolveDisableFeedbackFromWasHelpful(message === null || message === void 0 ? void 0 : message.wasHelpful);
|
|
1014
1001
|
|
|
1015
1002
|
// Key estable: solo message.id para evitar remount durante streaming (message.date puede cambiar)
|
|
1016
|
-
var messageKey = (
|
|
1003
|
+
var messageKey = resolveMessageListItemKey(message.id, index);
|
|
1017
1004
|
var turnId = resolveRetryTurnId(message);
|
|
1018
1005
|
var userMessageForRetry = findUserMessageForRetry(messages, message);
|
|
1019
|
-
var canRetry =
|
|
1006
|
+
var canRetry = canRetryAssistantMessage({
|
|
1007
|
+
hasUserMessageForRetry: Boolean(userMessageForRetry),
|
|
1008
|
+
isStreaming: isStreaming,
|
|
1009
|
+
isError: Boolean(message.isError),
|
|
1010
|
+
hasApproval: Boolean(message.approval),
|
|
1011
|
+
isFrontendCancelled: message.isFrontendCancelled,
|
|
1012
|
+
isCancelled: message.is_cancelled,
|
|
1013
|
+
turnId: turnId
|
|
1014
|
+
});
|
|
1020
1015
|
return /*#__PURE__*/_createElement(MessageItem, _objectSpread(_objectSpread({}, message), {}, {
|
|
1021
1016
|
key: messageKey,
|
|
1022
1017
|
authUser: authUser,
|
|
@@ -1035,7 +1030,7 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
1035
1030
|
streamActivity: isStreaming ? streamLoadingDisplay : null
|
|
1036
1031
|
}));
|
|
1037
1032
|
})
|
|
1038
|
-
}),
|
|
1033
|
+
}), streamLoadingDisplay && shouldShowGlobalStreamLoadingIndicator(hasMessageLevelIndicator, streamLoadingDisplay) && /*#__PURE__*/_jsx(SCLoadingMessagesColumn, {
|
|
1039
1034
|
children: /*#__PURE__*/_jsx(AgentActivityIndicator, {
|
|
1040
1035
|
activity: streamLoadingDisplay
|
|
1041
1036
|
})
|
|
@@ -1049,18 +1044,24 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
1049
1044
|
// Si el usuario mueve el scroll abortamos la animación y soltamos el turno:
|
|
1050
1045
|
// no le peleamos el control del contenedor.
|
|
1051
1046
|
_jsxs(SCMessagesOuter, {
|
|
1052
|
-
|
|
1047
|
+
$scrollOnParent: isScrollOnParent,
|
|
1048
|
+
onWheel: handleUserScrollIntent,
|
|
1053
1049
|
onTouchStart: handleUserScrollIntent,
|
|
1054
1050
|
children: [/*#__PURE__*/_jsx(SCMessagesGradientTop, {
|
|
1055
1051
|
$show: showTopGradient,
|
|
1056
1052
|
"aria-hidden": "true"
|
|
1057
|
-
}), /*#__PURE__*/_jsx(SCMessagesScroll, {
|
|
1053
|
+
}), isScrollOnParent ? /*#__PURE__*/_jsx(SCMessagesScroll, {
|
|
1058
1054
|
ref: messagesRef,
|
|
1059
1055
|
onScroll: handleScrollToBottom,
|
|
1060
1056
|
children: /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
1061
|
-
$
|
|
1057
|
+
$scrollOnParent: isScrollOnParent,
|
|
1062
1058
|
children: messagesContent
|
|
1063
1059
|
})
|
|
1060
|
+
}) : /*#__PURE__*/_jsx(SCMessagesInner, {
|
|
1061
|
+
ref: messagesRef,
|
|
1062
|
+
onScroll: handleScrollToBottom,
|
|
1063
|
+
$scrollOnParent: false,
|
|
1064
|
+
children: messagesContent
|
|
1064
1065
|
}), /*#__PURE__*/_jsx(SCMessagesGradientBottom, {
|
|
1065
1066
|
$show: showBottomGradient,
|
|
1066
1067
|
"aria-hidden": "true"
|
|
@@ -1095,4 +1096,4 @@ var ChatAIMessagesInner = function ChatAIMessagesInner(_ref5) {
|
|
|
1095
1096
|
);
|
|
1096
1097
|
};
|
|
1097
1098
|
export var ChatAIMessages = /*#__PURE__*/React.memo(ChatAIMessagesInner);
|
|
1098
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiQXR0YWNobWVudENhcmQiLCJBcHByb3ZhbEJveCIsIkF0dGFjaG1lbnRQcmV2aWV3TW9kYWwiLCJBdHRhY2htZW50Q2FyZEF1ZGlvIiwiTWFpYVN0cmVhbWRvd24iLCJDaGF0SGlzdG9yeVJvbGUiLCJyZW5kZXJUZXh0V2l0aE1lbnRpb25zIiwiaGFzSW5saW5lTWFya2VycyIsImlzTWFpYWtlckFnZW50IiwidXNlVXNlciIsInVzZVQiLCJ1c2VDaGF0TWFuYWdlciIsInVzZVNtb290aFN0cmVhbVRleHQiLCJ1c2VTdHJlYW1pbmdNZXNzYWdlIiwiTG9hZGluZ1RleHQiLCJBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIiwiUmVhc29uaW5nQmxvY2siLCJzaG91bGRTdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lIiwiUmVhc29uaW5nVGltZWxpbmUiLCJTQ1RpbWVsaW5lSW5kaWNhdG9yIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsInJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSIsInJlc29sdmVSZXRyeVR1cm5JZCIsImZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IiwidXNlUmVhc29uaW5nVHJhY2UiLCJMb2FkZXIiLCJGYWRlIiwicGF0Y2hNYWlhUGFuZWxTZXNzaW9uIiwicmVhZE1haWFQYW5lbFNlc3Npb24iLCJNZXNzYWdlRnJvbVVzZXIiLCJNZXNzYWdlRnJvbU90aGVyIiwiTWVzc2FnZUNvbnRlbnRGcm9tVXNlciIsIk1lc3NhZ2VDb250ZW50RnJvbU90aGVyIiwiTWVzc2FnZUZlZWRiYWNrIiwiU0NDQUlNZXNzYWdlV3JhcHBlciIsIlNjcm9sbFRvQm90dG9tQnV0dG9uIiwiU0NTY3JvbGxJY29uU3dhcCIsIlNDV3JpdGluZ0RvdHMiLCJTQ01lc3NhZ2VzT3V0ZXIiLCJTQ01lc3NhZ2VzU2Nyb2xsIiwiU0NNZXNzYWdlc0lubmVyIiwiU0NUdXJuU3BhY2VyIiwiU0NPcHRpb25zTGlzdCIsIlNDT3B0aW9uSXRlbSIsIlNDTWVzc2FnZUl0ZW1XcmFwcGVyIiwiU0NNZXNzYWdlSXRlbUlubmVyIiwiU0NBdHRhY2htZW50c1JvdyIsIlNDQXBwcm92YWxBY3Rpb25zQ29sdW1uIiwiU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4iLCJTQ01lc3NhZ2VzR3JhZGllbnRUb3AiLCJTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20iLCJGZWVkYmFjayIsInVzZUdsb2JhbENvbnRleHQiLCJFbnRpdHlMaW5rQ3VzdG9tTGluayIsImdldEVudGl0eUxpbmtXcmFwcGVyQ2xhc3NOYW1lIiwiQ2hhdEFJU3VnZ2VzdGlvbnMiLCJDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnMiLCJFVkVOVFMiLCJ1c2VFdmVudCIsImRvd25sb2FkRmlsZUZyb21VcmwiLCJjYW5PcGVuQXR0YWNobWVudFByZXZpZXciLCJjb21wdXRlRGlzdGFuY2VGcm9tQm90dG9tIiwiY29tcHV0ZVJlbW92YWJsZVR1cm5TcGFjZSIsImNvbXB1dGVSZXNlcnZlZFR1cm5TcGFjZSIsImNvbXB1dGVUdXJuU2Nyb2xsRHVyYXRpb25NcyIsImV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCIsImZpbmRMYXN0UXVlc3Rpb25JZCIsImlzQXVkaW9BdHRhY2htZW50Iiwic2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tIiwidHVybkFuY2hvck9mZnNldCIsImpzeCIsIl9qc3giLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImpzeHMiLCJfanN4cyIsIk1lc3NhZ2VXcmFwcGVyIiwiX3JlZiIsImlzQ3VycmVudFVzZXIiLCJjaGlsZHJlbiIsInByb3BzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiTWVzc2FnZUNvbXBvbmVudCIsIl9vYmplY3RTcHJlYWQiLCJNZXNzYWdlQ29udGVudFdyYXBwZXIiLCJfcmVmMiIsIl9leGNsdWRlZDIiLCJNZXNzYWdlQ29udGVudENvbXBvbmVudCIsIk1lc3NhZ2VPcHRpb25zIiwiX3JlZjMiLCJvcHRpb25zIiwiaGFuZGxlU2VsZWN0T3B0aW9uIiwiX3VzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5Iiwic2VsZWN0ZWRPcHRpb24iLCJzZXRTZWxlY3RlZE9wdGlvbiIsImhhbmRsZVNlbGVjdCIsIm9wdGlvbiIsIm1hcCIsIiRoYXNTZWxlY3Rpb24iLCIkZGltbWVkIiwiaWQiLCJvbkNsaWNrIiwibmFtZSIsIlN0cmVhbWluZ01lc3NhZ2VCb2R5IiwiX3Byb3BzJGNyZWF0ZUFnZW50Rm9sIiwiX3Byb3BzJHN1Z2dlc3Rpb25zIiwic3RyZWFtaW5nVGV4dCIsImlzU3RyZWFtaW5nIiwibWVzc2FnZUlkIiwicmF3VGV4dCIsIm1lc3NhZ2UiLCJ3aW5GbGFncyIsIndpbmRvdyIsImRpc3BsYXlUZXh0IiwiZW5hYmxlZCIsIm1heENoYXJzUGVyRnJhbWUiLCJzbmFwVG9Xb3JkQm91bmRhcnkiLCJzdHJlYW1MYWdNcyIsInRhcmdldExhZ01zIiwic3RyZWFtQWRhcHQiLCJhZGFwdFRvQmFja2VuZFJhdGUiLCJzdHJlYW1CdWZmZXJNcyIsInRhcmdldEJ1ZmZlck1zIiwic3RyZWFtTWluQnVmZmVyIiwibWluQnVmZmVyQ2hhcnMiLCJzdHJlYW1XYXJtdXBNcyIsIndhcm11cE1zIiwiY3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCIsImNyZWF0ZUFnZW50Rm9sbG93VXAiLCJhZ2VudElkIiwiaGFzTWVudGlvbnMiLCJtZW50aW9uTm9kZXMiLCJpc0Zyb250ZW5kQ2FuY2VsbGVkIiwiY2xhc3NOYW1lIiwic3R5bGUiLCJkaXNwbGF5IiwidmFyaWFudCIsImNvbXBvbmVudHMiLCJhIiwiaXNBbmltYXRpbmciLCJpc0Fzc2lzdGFudCIsImlzRXJyb3IiLCJhcHByb3ZhbCIsIm9uUmV0cnkiLCJjb250ZW50Iiwic291cmNlcyIsInVuZGVmaW5lZCIsImhhbmRsZUZlZWRiYWNrIiwiaGFuZGxlRmVlZGJhY2tDbGljayIsImRpc2FibGVGZWVkYmFjayIsInN1Z2dlc3Rpb25zIiwibGVuZ3RoIiwib25TZWxlY3RTdWdnZXN0aW9uIiwic3VnZ2VzdGlvbiIsImhhbmRsZVN1Z2dlc3Rpb25DbGljayIsImRpc2FibGVkIiwic3VnZ2VzdGlvbnNEaXNhYmxlZCIsImhpZGRlbiIsImlzTGFzdE1lc3NhZ2UiLCJNZXNzYWdlSXRlbSIsIl9wcm9wcyRyZWFzb25pbmciLCJfcHJvcHMkcHJvamVjdE1ldGFkYXQiLCJ1c2VyIiwiYXV0aFVzZXIiLCJpc0NoYW5nZVByb2plY3QiLCJoYW5kbGVBcHByb3ZhbERlY2lzaW9uIiwiaGFuZGxlUmV0cnkiLCJyb2xlIiwiYXR0YWNobWVudHMiLCJhcHByb3ZhbFN0YXR1cyIsImhhc1NlbGVjdGVkU3VnZ2VzdGlvbiIsInN0cmVhbUFjdGl2aXR5IiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJwcmV2aWV3QXR0YWNobWVudCIsInNldFByZXZpZXdBdHRhY2htZW50IiwiVVNFUiIsInRvU3RyaW5nIiwiQVNTSVNUQU5UIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsImlzQWN0aXZlU3RyZWFtaW5nIiwiaGFzU3RyZWFtVGV4dCIsIkJvb2xlYW4iLCJyZWFzb25pbmdUcmFjZSIsInN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUiLCJzdGVwcyIsInNob3dTdHJlYW1pbmdCb2R5Iiwic2hvd0FjdGl2aXR5SW5kaWNhdG9yIiwibWVzc2FnZUF0dGFjaG1lbnRzIiwiQXJyYXkiLCJpc0FycmF5IiwiaGFuZGxlQXR0YWNobWVudENsaWNrIiwiYXR0YWNobWVudCIsImhhbmRsZUNsb3NlUHJldmlldyIsImhhbmRsZUF0dGFjaG1lbnREb3dubG9hZCIsIl9yZWY0IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJleHRlbnNpb24iLCJmaWxlTmFtZSIsImZpbGVVcmwiLCJibG9iVXJsIiwiZG93bmxvYWRlZEZpbGUiLCJsaW5rIiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsImluY2x1ZGVzIiwiY29uY2F0IiwidHlwZSIsInVybF9vcmlnaW5hbCIsInVybF9maWxlIiwidXJsX3RodW1ibmFpbCIsInNlbnQiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJmaWxlIiwiRmlsZSIsImFicnVwdCIsImRvY3VtZW50IiwiaHJlZiIsImRvd25sb2FkIiwiYm9keSIsImFwcGVuZENoaWxkIiwiY2xpY2siLCJzZXRUaW1lb3V0IiwicmVtb3ZlQ2hpbGQiLCJyZXZva2VPYmplY3RVUkwiLCJjb25zb2xlIiwiZXJyb3IiLCJzdG9wIiwiX3giLCJhcHBseSIsImFyZ3VtZW50cyIsImhhc0ZlZWRiYWNrIiwiJGlzQXNzaXN0YW50IiwibWVzc2FnZUV4dHJhQ29udGVudCIsImZlZWRiYWNrIiwidHJhY2UiLCJyZWFzb25pbmciLCJpbmRleCIsInBvc2l0aW9uSW5kZXgiLCJvbkRvd25sb2FkIiwiYWN0aXZpdHkiLCJjb21wYWN0IiwicGVuZGluZ19hY3Rpb25zIiwiYWN0aW9ucyIsInN0YXR1cyIsIm9uQXBwcm92ZSIsInRocmVhZElkcyIsIm1ldGFkYXRhIiwib25SZWplY3QiLCJpc1Byb2plY3REZWxldGVkIiwicHJvamVjdE1ldGFkYXRhIiwiaXNfZGVsZXRlZCIsImlzRXhwYW5kZWQiLCJleHBhbmRlZCIsImhpdGxJbnN0YW5jZUlkIiwib3JpZ2luYWxfdGhyZWFkX2lkIiwid2FybmluZ01lc3NhZ2UiLCJ3YXJuaW5nX21lc3NhZ2UiLCJtYW51YWxBcHByb3ZhbERldGVjdGVkIiwibWFudWFsX2FwcHJvdmFsX2RldGVjdGVkIiwiaXNPcGVuIiwib25DbG9zZSIsIkNoYXRBSU1lc3NhZ2VzSW5uZXIiLCJfcmVmNSIsInVzZXJJbml0aWFsTWVzc2FnZSIsImluaXRpYWxDaGF0SWQiLCJvbkVycm9yIiwib25TZW5kTWVzc2FnZVJlYWR5Iiwib25TY3JvbGxUb0JvdHRvbSIsImFnZW50cyIsIl9yZWY1JHNraXBFbnRlckFuaW1hdCIsInNraXBFbnRlckFuaW1hdGlvbiIsIl91c2VUIiwidCIsIl91c2VHbG9iYWxDb250ZXh0IiwiaXNXZWJTZWFyY2hBY3RpdmUiLCJpc0RlZXBTZWFyY2hBY3RpdmUiLCJhZ2VudCIsImV2ZW50IiwibWVzc2FnZXNSZWYiLCJjaGF0SW5pdGlhbGl6ZWRSZWYiLCJpc0xvYWRpbmdNb3JlUmVmIiwic2Nyb2xsVGhyZXNob2xkUmVmIiwibGFzdFNjcm9sbFRvcFJlZiIsInNob3dTY3JvbGxUb0JvdHRvbVJlZiIsInNob3dUb3BHcmFkaWVudFJlZiIsInNob3dCb3R0b21HcmFkaWVudFJlZiIsInNjcm9sbFJhZlJlZiIsImFuY2hvcmVkVHVybklkUmVmIiwic3BhY2VyRWxSZWYiLCJzcGFjZXJIZWlnaHRSZWYiLCJ0dXJuU2Nyb2xsUmFmUmVmIiwid2FzTG9hZGluZ01lc3NhZ2VzUmVmIiwibGFzdFNjcm9sbGVkU2Vzc2lvblJlZiIsInBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmIiwic2Nyb2xsUGVyc2lzdFRpbWVyUmVmIiwiX3VzZVN0YXRlNSIsIl91c2VTdGF0ZTYiLCJzaG93U2Nyb2xsVG9Cb3R0b20iLCJzZXRTaG93U2Nyb2xsVG9Cb3R0b20iLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsInNob3dUb3BHcmFkaWVudCIsInNldFNob3dUb3BHcmFkaWVudCIsIl91c2VTdGF0ZTkiLCJfdXNlU3RhdGUwIiwic2hvd0JvdHRvbUdyYWRpZW50Iiwic2V0U2hvd0JvdHRvbUdyYWRpZW50IiwiX3VzZVN0YXRlMSIsIl91c2VTdGF0ZTEwIiwic2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyIsInNldFNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMiLCJfdXNlQ2hhdE1hbmFnZXIiLCJjaGF0SWQiLCJtZXNzYWdlcyIsImxvYWRpbmdNZXNzYWdlcyIsImlzTG9hZGluZ01vcmVNZXNzYWdlcyIsIndhaXRpbmdSZXNwb25zZSIsImlzV3JpdGluZyIsImxvYWRpbmdNZXNzYWdlIiwiYWN0aXZlTG9hZGluZ3MiLCJzZW5kTWVzc2FnZSIsInJldHJ5TWVzc2FnZSIsImNoYW5nZVByb2plY3QiLCJpbml0aWFsaXplQ2hhdCIsImhhbmRsZVNjcm9sbCIsInN0b3BHZW5lcmF0aW9uIiwidXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMiLCJlbCIsImN1cnJlbnQiLCJzY3JvbGxUb3AiLCJzY3JvbGxIZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJkaXN0YW5jZUZyb21Cb3R0b20iLCJzaG91bGRTaG93IiwibmV4dFRvcEdyYWRpZW50IiwibmV4dEJvdHRvbUdyYWRpZW50Iiwic2Nyb2xsVG9Cb3R0b21SYWYiLCJvcHRzIiwiX29wdHMkZGVsYXlNcyIsImRlbGF5TXMiLCJydW4iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYW5jZWxUdXJuU2Nyb2xsIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJhbmltYXRlU2Nyb2xsVG8iLCJ0b3AiLCJmcm9tIiwiZGlzdGFuY2UiLCJNYXRoIiwiYWJzIiwiZHVyYXRpb24iLCJzdGFydGVkQXQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInN0ZXAiLCJwcm9ncmVzcyIsIm1pbiIsImVhc2VkIiwicG93Iiwic2V0U3BhY2VySGVpZ2h0IiwiaGVpZ2h0IiwiY2xlYXJUdXJuU3BhY2UiLCJkcmFpblR1cm5TcGFjZSIsInJlbGVhc2VUdXJuU3BhY2UiLCJoYW5kbGVVc2VyU2Nyb2xsSW50ZW50IiwiaGFuZGxlTWVzc2FnZXNPdXRlcldoZWVsIiwic2Nyb2xsZXIiLCJ0YXJnZXQiLCJjdXJyZW50VGFyZ2V0IiwiY29udGFpbnMiLCJkZWx0YVkiLCJtYXhTY3JvbGwiLCJuZXh0U2Nyb2xsVG9wIiwibWF4IiwicHJldmVudERlZmF1bHQiLCJtZWFzdXJlVHVybiIsInF1ZXN0aW9uSWQiLCJzcGFjZXJFbCIsInF1ZXN0aW9uRWwiLCJxdWVyeVNlbGVjdG9yIiwiY29udGFpbmVyVG9wIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwicXVlc3Rpb25Ub3AiLCJjb250ZW50Qm90dG9tIiwidHVybkhlaWdodCIsInJlc2VydmVUdXJuU3BhY2UiLCJtZWFzdXJlZCIsIm9mZnNldCIsInRhcmdldFNjcm9sbFRvcCIsInN5bmNUdXJuU3BhY2UiLCJyZXNlcnZlZCIsImhhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b20iLCJoYW5kbGVTY3JvbGxUb0JvdHRvbSIsImUiLCJjb250YWluZXIiLCJpc1Njcm9sbGluZ1VwIiwiaXNOZWFyQm90dG9tIiwiY2xlYXJUaW1lb3V0Iiwic2Nyb2xsU2Vzc2lvbklkIiwic2VuZE1lc3NhZ2VSZWYiLCJzdG9wR2VuZXJhdGlvblJlZiIsIm9uU2VuZE1lc3NhZ2VSZWFkeVJlZiIsInNlbmRNZXNzYWdlUHJveHlSZWYiLCJmYXFJZCIsImFnZW50U3VnZ2VzdGlvbklkIiwibWVudGlvbnMiLCJmdWFJZCIsInNjSWQiLCJzdG9wR2VuZXJhdGlvblByb3h5UmVmIiwibWVzc2FnZXNEYXRhUmVmIiwic2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZiIsInRyaW0iLCJjdXJyZW50TWVzc2FnZXMiLCJpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQiLCJhaUNoYXRTdWdnZXN0ZWRBbnN3ZXIiLCJhZ2VudF90eXBlIiwiX2RlZmluZVByb3BlcnR5IiwidGFyZ2V0TWVzc2FnZSIsImZpbmQiLCJtc2ciLCJpc1JldHJ5U3VnZ2VzdGlvbiIsImxhc3RVc2VyTWVzc2FnZSIsImZpbHRlciIsImF0IiwicmV0cnlBdHRhY2htZW50cyIsInJhZklkIiwidGljayIsImxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmIiwibGFzdE1lc3NhZ2VJZFJlZiIsImxhc3RNZXNzYWdlc0xlbmd0aFJlZiIsIl9tZXNzYWdlcyRpZCIsIl9tZXNzYWdlcyIsIl9sYXN0TWVzc2FnZSRpZCIsImxhc3RNZXNzYWdlIiwibGFzdElkIiwicHJldklkIiwicHJldkxlbiIsImlzTmV3TWVzc2FnZSIsImlzQXRCb3R0b20iLCJoYXNJbml0aWFsTWVzc2FnZSIsInNvbWUiLCJpc0FwcHJvdmFsIiwic3RhcnRzV2l0aCIsImlzQW5zd2VyT3JRdWVzdGlvbiIsIl9tZXNzYWdlcyRpZDIiLCJfbWVzc2FnZXMyIiwianVzdEZpbmlzaGVkTG9hZGluZyIsImF0dGFjaG1lbnRzQ291bnQiLCJzdHJlYW1Mb2FkaW5nRGlzcGxheSIsImhhc0F0dGFjaG1lbnRzIiwic2Vzc2lvbiIsImV4cGFuZGVkUmVmIiwic2F2ZWRTY3JvbGxUb3AiLCJmaWxsIiwiaGFzTWVzc2FnZUxldmVsSW5kaWNhdG9yIiwibWVzc2FnZXNDb250ZW50IiwidGV4dCIsIl9tZXNzYWdlJGF0dGFjaG1lbnRzIiwiX21lc3NhZ2Ukc291cmNlcyIsIl9tZXNzYWdlJHByb2plY3QiLCJfbWVzc2FnZSRpZCIsImlzQXNzaXN0YW50TWVzc2FnZSIsInByb2plY3QiLCJtZXNzYWdlRmVlZGJhY2siLCJ3YXNIZWxwZnVsIiwiVEhVTUJTX1VQIiwiVEhVTUJTX0RPV04iLCJtZXNzYWdlS2V5IiwidHVybklkIiwidXNlck1lc3NhZ2VGb3JSZXRyeSIsImNhblJldHJ5IiwiaXNfY2FuY2VsbGVkIiwia2V5IiwicmVmIiwib25XaGVlbCIsIm9uVG91Y2hTdGFydCIsIiRzaG93Iiwib25TY3JvbGwiLCIkc2tpcEVudGVyIiwiJHZpc2libGUiLCJ4bWxucyIsIndpZHRoIiwic3Ryb2tlIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwiQ2hhdEFJTWVzc2FnZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9tb2xlY3VsZXMvQ2hhdEFJTWVzc2FnZXMvQ2hhdEFJTWVzc2FnZXMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2luZGVudCAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tdW5zdGFibGUtbmVzdGVkLWNvbXBvbmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3cgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLW5lc3RlZC10ZXJuYXJ5ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgcmVhY3QvZnVuY3Rpb24tY29tcG9uZW50LWRlZmluaXRpb24gKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L3JlcXVpcmUtZGVmYXVsdC1wcm9wcyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvY2xpY2stZXZlbnRzLWhhdmUta2V5LWV2ZW50cyAqL1xuLyogZXNsaW50LWRpc2FibGUganN4LWExMXkvbm8tc3RhdGljLWVsZW1lbnQtaW50ZXJhY3Rpb25zICovXG5pbXBvcnQgUmVhY3QsIHsgRkMsIG1lbW8sIFJlYWN0Tm9kZSwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7IEF0dGFjaG1lbnRDYXJkIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmQnXG5pbXBvcnQgeyBBcHByb3ZhbEJveCB9IGZyb20gJy4uLy4uL2F0b21zL0FwcHJvdmFsQm94L0FwcHJvdmFsQm94J1xuaW1wb3J0IHsgQXR0YWNobWVudFByZXZpZXdNb2RhbCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRQcmV2aWV3TW9kYWwnXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZEF1ZGlvIH0gZnJvbSAnLi4vLi4vYXRvbXMvQXR0YWNobWVudENhcmQvQXR0YWNobWVudENhcmRBdWRpbydcbmltcG9ydCB7IE1haWFTdHJlYW1kb3duIH0gZnJvbSAnLi4vLi4vYXRvbXMvTWFpYVN0cmVhbWRvd24nXG5pbXBvcnQgdHlwZSB7IE1haWFTdHJlYW1kb3duUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NYWlhU3RyZWFtZG93bidcbmltcG9ydCB7IE1BSUFNZXNzYWdlUHJvcHMgfSBmcm9tICcuLi8uLi9hdG9tcy9NQUlBTWVzc2FnZS9NQUlBTWVzc2FnZS5pbnRlcmZhY2VzJ1xuaW1wb3J0IHsgQ2hhdE1lc3NhZ2UsIENoYXRIaXN0b3J5Um9sZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL0NoYXQnXG5pbXBvcnQgeyByZW5kZXJUZXh0V2l0aE1lbnRpb25zLCBoYXNJbmxpbmVNYXJrZXJzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcmVuZGVyQ29udGV4dE1lbnRpb25zJ1xuXG5pbXBvcnQgeyBpc01haWFrZXJBZ2VudCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2FnZW50RGlzcGxheU5hbWUnXG5pbXBvcnQgeyBDT1JVc2VyLCB1c2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9jb3ItdXNlcidcblxuaW1wb3J0IHsgdXNlVCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVQnXG5pbXBvcnQgeyB1c2VDaGF0TWFuYWdlciB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZUNoYXRNYW5hZ2VyL3VzZUNoYXRNYW5hZ2VyJ1xuaW1wb3J0IHsgdXNlU21vb3RoU3RyZWFtVGV4dCB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVNtb290aFN0cmVhbVRleHQnXG5pbXBvcnQgeyB1c2VTdHJlYW1pbmdNZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlU3RyZWFtaW5nTWVzc2FnZSdcblxuaW1wb3J0IHsgTG9hZGluZ1RleHQgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkaW5nVGV4dCdcbmltcG9ydCB7IEFnZW50QWN0aXZpdHlJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9BZ2VudEFjdGl2aXR5SW5kaWNhdG9yJ1xuaW1wb3J0IHsgUmVhc29uaW5nQmxvY2sgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdCbG9jaydcbmltcG9ydCB7IHNob3VsZFN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9yZWFzb25pbmdMaXZlTmFycmF0aW9uJ1xuaW1wb3J0IHsgUmVhc29uaW5nVGltZWxpbmUgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdUaW1lbGluZSdcbmltcG9ydCB7IFNDVGltZWxpbmVJbmRpY2F0b3IgfSBmcm9tICcuLi8uLi9hdG9tcy9SZWFzb25pbmdCbG9jay9SZWFzb25pbmdCbG9jay5zdHlsZXMnXG5pbXBvcnQgdHlwZSB7IFN0cmVhbUFjdGl2aXR5IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvc3RyZWFtQWN0aXZpdHknXG5pbXBvcnQgeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkLCByZXNvbHZlU3RyZWFtTG9hZGluZ0Rpc3BsYXkgfSBmcm9tICcuLi8uLi8uLi91dGlscy9zdHJlYW1BY3Rpdml0eU1lc3NhZ2VzJ1xuaW1wb3J0IHsgcmVzb2x2ZVJldHJ5VHVybklkLCBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3JldHJ5Q29tcGxldGlvbidcbmltcG9ydCB7IHVzZVJlYXNvbmluZ1RyYWNlIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlUmVhc29uaW5nVHJhY2UnXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tICcuLi8uLi9hdG9tcy9Mb2FkZXInXG5pbXBvcnQgeyBGYWRlIH0gZnJvbSAnLi4vLi4vYXRvbXMvRmFkZSdcbmltcG9ydCB7IHBhdGNoTWFpYVBhbmVsU2Vzc2lvbiwgcmVhZE1haWFQYW5lbFNlc3Npb24gfSBmcm9tICcuLi8uLi8uLi9zdG9yZS9tYWlhUGFuZWxTZXNzaW9uUGVyc2lzdGVuY2UnXG5cbmltcG9ydCB7IFByb2plY3QgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9Qcm9qZWN0J1xuXG5pbXBvcnQgeyBNZXNzYWdlRnJvbVVzZXIsIE1lc3NhZ2VGcm9tT3RoZXIsIE1lc3NhZ2VDb250ZW50RnJvbVVzZXIsIE1lc3NhZ2VDb250ZW50RnJvbU90aGVyIH0gZnJvbSAnLi9zdHlsZXMnXG5pbXBvcnQgeyBNZXNzYWdlRmVlZGJhY2sgfSBmcm9tICcuLi9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQge1xuICBTQ0NBSU1lc3NhZ2VXcmFwcGVyLFxuICBTY3JvbGxUb0JvdHRvbUJ1dHRvbixcbiAgU0NTY3JvbGxJY29uU3dhcCxcbiAgU0NXcml0aW5nRG90cyxcbiAgU0NNZXNzYWdlc091dGVyLFxuICBTQ01lc3NhZ2VzU2Nyb2xsLFxuICBTQ01lc3NhZ2VzSW5uZXIsXG4gIFNDVHVyblNwYWNlcixcbiAgU0NPcHRpb25zTGlzdCxcbiAgU0NPcHRpb25JdGVtLFxuICBTQ01lc3NhZ2VJdGVtV3JhcHBlcixcbiAgU0NNZXNzYWdlSXRlbUlubmVyLFxuICBTQ0F0dGFjaG1lbnRzUm93LFxuICBTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbixcbiAgU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4sXG4gIFNDTWVzc2FnZXNHcmFkaWVudFRvcCxcbiAgU0NNZXNzYWdlc0dyYWRpZW50Qm90dG9tLFxufSBmcm9tICcuL25ld1N0eWxlcydcbmltcG9ydCB7IEZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrL01lc3NhZ2VGZWVkYmFjaydcbmltcG9ydCB7IHVzZUdsb2JhbENvbnRleHQgfSBmcm9tICcuLi8uLi8uLi9jb250ZXh0L2dsb2JhbC1jb250ZXh0J1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9hZ2VudCdcbmltcG9ydCB7IEF0dGFjaG1lbnRGaWxlIH0gZnJvbSAnLi4vQ2hhdEZvb3Rlci9DaGF0Rm9vdGVyJ1xuaW1wb3J0IHsgQ29udGV4dE1lbnRpb24gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9jb250ZXh0TWVudGlvbidcbmltcG9ydCB7IEVudGl0eUxpbmtDdXN0b21MaW5rLCBnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2VudGl0eUxpbmtSZW5kZXInXG5pbXBvcnQgeyBDaGF0QUlTdWdnZXN0aW9ucyB9IGZyb20gJy4vQ2hhdEFJU3VnZ2VzdGlvbnMnXG5pbXBvcnQgeyBDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnMgfSBmcm9tICcuL0NoYXRBSUNyZWF0ZUFnZW50QWN0aW9ucydcbmltcG9ydCB7IEVWRU5UUywgdXNlRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VFdmVudCdcbmltcG9ydCB7IGRvd25sb2FkRmlsZUZyb21VcmwgfSBmcm9tICcuLi8uLi8uLi91dGlscy9maWxlRG93bmxvYWRIZWxwZXInXG5pbXBvcnQge1xuICBjYW5PcGVuQXR0YWNobWVudFByZXZpZXcsXG4gIGNvbXB1dGVEaXN0YW5jZUZyb21Cb3R0b20sXG4gIGNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UsXG4gIGNvbXB1dGVSZXNlcnZlZFR1cm5TcGFjZSxcbiAgY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zLFxuICBleHRyYWN0RmVlZGJhY2tTZXNzaW9uSWQsXG4gIGZpbmRMYXN0UXVlc3Rpb25JZCxcbiAgaXNBdWRpb0F0dGFjaG1lbnQsXG4gIHNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSxcbiAgdHVybkFuY2hvck9mZnNldCxcbn0gZnJvbSAnLi9DaGF0QUlNZXNzYWdlcy5oZWxwZXJzJ1xuXG50eXBlIENoYXRBSU1lc3NhZ2VzUHJvcHMgPSB7XG4gIHVzZXJJbml0aWFsTWVzc2FnZToge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXVxuICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgc2NJZD86IHN0cmluZ1xuICAgIGNvbnRleHREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgfVxuICBpbml0aWFsQ2hhdElkOiBzdHJpbmcgfCBudWxsXG4gIG9uRXJyb3I6ICgpID0+IHZvaWRcbiAgb25TZW5kTWVzc2FnZVJlYWR5PzogKFxuICAgIHNlbmRNZXNzYWdlOiAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nLFxuICAgICAgY29udGV4dERhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICkgPT4gdm9pZCxcbiAgICBzdG9wR2VuZXJhdGlvbjogKCkgPT4gdm9pZCxcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhbixcbiAgICBpc1dyaXRpbmc6IGJvb2xlYW5cbiAgKSA9PiB2b2lkXG4gIGlzRGlzYWJsZWQ/OiBib29sZWFuXG4gIG9uU2Nyb2xsVG9Cb3R0b20/OiAoKSA9PiB2b2lkXG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBhZ2VudHM/OiBBZ2VudFtdXG4gIGV4cGFuZGVkPzogYm9vbGVhblxuICBza2lwRW50ZXJBbmltYXRpb24/OiBib29sZWFuXG59XG5cbnR5cGUgTWVzc2FnZUl0ZW1Qcm9wcyA9IENoYXRNZXNzYWdlICYge1xuICBhdXRoVXNlcjogQ09SVXNlclxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbiAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiAobWVzc2FnZUlkOiBzdHJpbmcsIHN1Z2dlc3Rpb246IHN0cmluZykgPT4gdm9pZFxuICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb24/OiBib29sZWFuXG4gIGhhbmRsZUZlZWRiYWNrOiAoZmVlZGJhY2s6IEZlZWRiYWNrLCBjaGF0TWVzc2FnZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbjogKFxuICAgIHRocmVhZElkczogc3RyaW5nW10sXG4gICAgZGVjaXNpb246ICdhcHByb3ZlJyB8ICdyZWplY3QnLFxuICAgIGVkaXRlZEFjdGlvbnM/OiBBcnJheTx7IHRvb2xfbmFtZTogc3RyaW5nOyBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PixcbiAgICBtZXRhZGF0YT86IHsgdG9vbF9ncm91cF9zbHVnczogc3RyaW5nW10gfVxuICApID0+IHZvaWRcbiAgaGFuZGxlUmV0cnk/OiAoKSA9PiB2b2lkXG4gIGRpc2FibGVGZWVkYmFjaz86IEZlZWRiYWNrIHwgbnVsbFxuICBzb3VyY2VzPzogYW55XG4gIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXVxuICBpc1N0cmVhbWluZz86IGJvb2xlYW5cbiAgaXNMYXN0TWVzc2FnZT86IGJvb2xlYW5cbiAgZXhwYW5kZWQ/OiBib29sZWFuXG4gIHN0cmVhbUFjdGl2aXR5PzogU3RyZWFtQWN0aXZpdHkgfCBudWxsXG59XG5cbmludGVyZmFjZSBNZXNzYWdlV3JhcHBlclByb3BzIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBjaGlsZHJlbjogUmVhY3ROb2RlXG4gICdkYXRhLW1lc3NhZ2UtaWQnPzogc3RyaW5nXG4gIGhhc0ZlZWRiYWNrPzogYm9vbGVhblxufVxuXG50eXBlIE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzID0gTUFJQU1lc3NhZ2VQcm9wcyAmIHtcbiAgaXNDdXJyZW50VXNlcjogYm9vbGVhblxuICBpc0Vycm9yPzogYm9vbGVhblxuICBpc0NoYW5nZVByb2plY3Q/OiBib29sZWFuXG59XG5cbmNvbnN0IE1lc3NhZ2VXcmFwcGVyOiBGQzxNZXNzYWdlV3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIGNoaWxkcmVuLCAuLi5wcm9wcyB9KSA9PiB7XG4gIGNvbnN0IE1lc3NhZ2VDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUZyb21Vc2VyIDogTWVzc2FnZUZyb21PdGhlclxuICByZXR1cm4gPE1lc3NhZ2VDb21wb25lbnQgey4uLnByb3BzfT57Y2hpbGRyZW59PC9NZXNzYWdlQ29tcG9uZW50PlxufVxuXG5jb25zdCBNZXNzYWdlQ29udGVudFdyYXBwZXI6IEZDPE1lc3NhZ2VDb250ZW50V3JhcHBlclByb3BzPiA9ICh7IGlzQ3VycmVudFVzZXIsIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbnRlbnRDb21wb25lbnQgPSBpc0N1cnJlbnRVc2VyID8gTWVzc2FnZUNvbnRlbnRGcm9tVXNlciA6IE1lc3NhZ2VDb250ZW50RnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbnRlbnRDb21wb25lbnQgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBNZXNzYWdlT3B0aW9ucyh7XG4gIG9wdGlvbnMsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbixcbn06IHtcbiAgb3B0aW9uczogUHJvamVjdFtdIHwgbnVsbFxuICBoYW5kbGVTZWxlY3RPcHRpb246IChvcHRpb246IFByb2plY3QpID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgW3NlbGVjdGVkT3B0aW9uLCBzZXRTZWxlY3RlZE9wdGlvbl0gPSB1c2VTdGF0ZTxQcm9qZWN0IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBoYW5kbGVTZWxlY3QgPSAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkT3B0aW9uKSByZXR1cm5cbiAgICBzZXRTZWxlY3RlZE9wdGlvbihvcHRpb24pXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uKG9wdGlvbilcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDT3B0aW9uc0xpc3Q+XG4gICAgICB7KG9wdGlvbnMgfHwgW10pLm1hcChvcHRpb24gPT4gKFxuICAgICAgICA8U0NPcHRpb25JdGVtXG4gICAgICAgICAgJGhhc1NlbGVjdGlvbj17ISFzZWxlY3RlZE9wdGlvbn1cbiAgICAgICAgICAkZGltbWVkPXshIXNlbGVjdGVkT3B0aW9uICYmIHNlbGVjdGVkT3B0aW9uPy5pZCAhPT0gb3B0aW9uLmlkfVxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVNlbGVjdChvcHRpb24pfVxuICAgICAgICAgIGtleT17b3B0aW9uLmlkfVxuICAgICAgICA+XG4gICAgICAgICAge29wdGlvbi5uYW1lfVxuICAgICAgICA8L1NDT3B0aW9uSXRlbT5cbiAgICAgICkpfVxuICAgIDwvU0NPcHRpb25zTGlzdD5cbiAgKVxufVxuXG4vKiogU29sbyBlc3RlIGNvbXBvbmVudGUgcmUtcmVuZGVyaXphIGN1YW5kbyBjYW1iaWEgZWwgdGV4dG8gZW4gc3RyZWFtaW5nIChsZWUgZGVsIGNvbnRleHQpLiAqL1xuY29uc3QgU3RyZWFtaW5nTWVzc2FnZUJvZHkgPSBtZW1vKFxuICAocHJvcHM6IHtcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgICBpc1N0cmVhbWluZzogYm9vbGVhblxuICAgIGlzQ3VycmVudFVzZXI6IGJvb2xlYW5cbiAgICBpc0Fzc2lzdGFudDogYm9vbGVhblxuICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ/OiBib29sZWFuXG4gICAgYXBwcm92YWw/OiBNZXNzYWdlSXRlbVByb3BzWydhcHByb3ZhbCddXG4gICAgaXNFcnJvcj86IGJvb2xlYW5cbiAgICBzb3VyY2VzPzogTWVzc2FnZUl0ZW1Qcm9wc1snc291cmNlcyddXG4gICAgc3VnZ2VzdGlvbnM/OiBzdHJpbmdbXSB8IG51bGxcbiAgICBjcmVhdGVBZ2VudEZvbGxvd1VwPzogeyBhZ2VudElkOiBzdHJpbmcgfSB8IG51bGxcbiAgICBoYW5kbGVGZWVkYmFja0NsaWNrOiAoZjogRmVlZGJhY2spID0+IHZvaWRcbiAgICBkaXNhYmxlRmVlZGJhY2s6IEZlZWRiYWNrIHwgbnVsbFxuICAgIG9uUmV0cnk/OiAoKSA9PiB2b2lkXG4gICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrOiAobWVzc2FnZUlkOiBzdHJpbmcsIHN1Z2dlc3Rpb246IHN0cmluZykgPT4gdm9pZFxuICAgIHN1Z2dlc3Rpb25zRGlzYWJsZWQ/OiBib29sZWFuXG4gICAgbWVzc2FnZUlkOiBzdHJpbmdcbiAgICBpc0xhc3RNZXNzYWdlPzogYm9vbGVhblxuICB9KSA9PiB7XG4gICAgLy8gVGV4dG8gZGVsIHN0cmVhbTogc29sbyBzZSBsZWUgZGVsIHN0b3JlIGN1YW5kbyBlc3RlIG1lbnNhamUgZXMgZWxcbiAgICAvLyBxdWUgZXN0w6EgZW4gc3RyZWFtaW5nLiB1c2VTeW5jRXh0ZXJuYWxTdG9yZSBhw61zbGEgZWwgcmUtcmVuZGVyIGFcbiAgICAvLyBlc3RlIGNvbXBvbmVudGUsIHNpbiB0b2NhciBlbCByZXN0byBkZWwgw6FyYm9sLlxuICAgIGNvbnN0IHN0cmVhbWluZ1RleHQgPSB1c2VTdHJlYW1pbmdNZXNzYWdlKHByb3BzLmlzU3RyZWFtaW5nID8gcHJvcHMubWVzc2FnZUlkIDogbnVsbClcbiAgICBjb25zdCByYXdUZXh0ID0gcHJvcHMuaXNTdHJlYW1pbmcgPyBzdHJlYW1pbmdUZXh0IDogcHJvcHMubWVzc2FnZVxuICAgIC8vIFNtb290aCBzdHJlYW1pbmc6IGRlc2Fjb3BsYSBsYSBjYWRlbmNpYSBkZWwgYmFja2VuZCBkZWwgcmVuZGVyLlxuICAgIC8vIER1cmFudGUgZWwgc3RyZWFtaW5nIGxpYmVyYSBjaGFycyBhIHJpdG1vIGNvbnN0YW50ZSB2w61hIHJBRjsgY3VhbmRvXG4gICAgLy8gdGVybWluYSwgbXVlc3RyYSBlbCB0ZXh0byBmaW5hbCBhbCBpbnN0YW50ZSAoc2luIGFuaW1hY2nDs24gcmVzaWR1YWwpLlxuICAgIC8vIExvcyBkZWZhdWx0cyBkZWwgaG9vayBzZSBhanVzdGFyb24gZW1ww61yaWNhbWVudGUgZW4gc3RhZ2luZzsgYXVuIGFzw61cbiAgICAvLyBzZSBleHBvbmVuIGZsYWdzIGRlIHJ1bnRpbWUgKHdpbmRvdy4qKSBwYXJhIHBvZGVyIHR1bmVhciBzaW4gcmVjb21waWxhclxuICAgIC8vIHNpIGFsZ8O6biBiYWNrZW5kIHByZXNlbnRhIHVuYSBjYWRlbmNpYSBtdXkgZGlzdGludGEgZW4gcHJvZHVjY2nDs24uXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtQWRhcHQgPSBmYWxzZSAgICAgIC8vIGRlc2FjdGl2YSBhZGFwdGFjacOzbiBhbCBiYWNrZW5kXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtQnVmZmVyTXMgPSA2MDAgICAgIC8vIGNvbGNow7NuIG9iamV0aXZvIChtcylcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1MYWdNcyA9IDQ1MCAgICAgICAgLy8gbGFnIG3DoXhpbW8gYmFzZSAobXMpXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtTWluQnVmZmVyID0gNzAgICAgIC8vIHBpc28gZGVsIGNvbGNow7NuIGVuIGNoYXJzXG4gICAgLy8gICB3aW5kb3cuc3RyZWFtV2FybXVwTXMgPSA0MDAgICAgIC8vIHdhcm11cCBpbmljaWFsIChtcylcbiAgICBjb25zdCB3aW5GbGFncyA9XG4gICAgICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/ICh3aW5kb3cgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBzdHJlYW1BZGFwdD86IGJvb2xlYW5cbiAgICAgICAgICAgIHN0cmVhbUJ1ZmZlck1zPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1MYWdNcz86IG51bWJlclxuICAgICAgICAgICAgc3RyZWFtTWluQnVmZmVyPzogbnVtYmVyXG4gICAgICAgICAgICBzdHJlYW1XYXJtdXBNcz86IG51bWJlclxuICAgICAgICAgIH0pXG4gICAgICAgIDoge31cbiAgICBjb25zdCBkaXNwbGF5VGV4dCA9IHVzZVNtb290aFN0cmVhbVRleHQocmF3VGV4dCwge1xuICAgICAgZW5hYmxlZDogISFwcm9wcy5pc1N0cmVhbWluZyxcbiAgICAgIG1heENoYXJzUGVyRnJhbWU6IDI0LFxuICAgICAgc25hcFRvV29yZEJvdW5kYXJ5OiB0cnVlLFxuICAgICAgLi4uKHdpbkZsYWdzLnN0cmVhbUxhZ01zICE9IG51bGwgJiYgeyB0YXJnZXRMYWdNczogd2luRmxhZ3Muc3RyZWFtTGFnTXMgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtQWRhcHQgIT0gbnVsbCAmJiB7IGFkYXB0VG9CYWNrZW5kUmF0ZTogd2luRmxhZ3Muc3RyZWFtQWRhcHQgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtQnVmZmVyTXMgIT0gbnVsbCAmJiB7IHRhcmdldEJ1ZmZlck1zOiB3aW5GbGFncy5zdHJlYW1CdWZmZXJNcyB9KSxcbiAgICAgIC4uLih3aW5GbGFncy5zdHJlYW1NaW5CdWZmZXIgIT0gbnVsbCAmJiB7IG1pbkJ1ZmZlckNoYXJzOiB3aW5GbGFncy5zdHJlYW1NaW5CdWZmZXIgfSksXG4gICAgICAuLi4od2luRmxhZ3Muc3RyZWFtV2FybXVwTXMgIT0gbnVsbCAmJiB7IHdhcm11cE1zOiB3aW5GbGFncy5zdHJlYW1XYXJtdXBNcyB9KSxcbiAgICB9KVxuICAgIGNvbnN0IGNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgPSBwcm9wcy5jcmVhdGVBZ2VudEZvbGxvd1VwPy5hZ2VudElkXG5cbiAgICBpZiAoIWRpc3BsYXlUZXh0ICYmICFwcm9wcy5pc1N0cmVhbWluZykgcmV0dXJuIG51bGxcbiAgICBjb25zdCBoYXNNZW50aW9ucyA9IGhhc0lubGluZU1hcmtlcnMoZGlzcGxheVRleHQpXG4gICAgY29uc3QgbWVudGlvbk5vZGVzID0gaGFzTWVudGlvbnMgPyByZW5kZXJUZXh0V2l0aE1lbnRpb25zKGRpc3BsYXlUZXh0KSA6IG51bGxcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPFNDQ0FJTWVzc2FnZVdyYXBwZXJcbiAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtwcm9wcy5pc0N1cnJlbnRVc2VyfVxuICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZShkaXNwbGF5VGV4dCl9XG4gICAgICAgID5cbiAgICAgICAgICB7aGFzTWVudGlvbnMgJiYgbWVudGlvbk5vZGVzID8gKFxuICAgICAgICAgICAgLy8gU2kgaGF5IG1lbnRpb25zLCByZW5kZXJpemFyIGRpcmVjdGFtZW50ZSAoc2luIG1hcmtkb3duIGVuIGVsIG1pc21vIHDDoXJyYWZvKVxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZScgfX0+e21lbnRpb25Ob2Rlc308L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8vIFNpbiBtZW50aW9ucywgcGFzYXIgYSBTdHJlYW1kb3duIHBhcmEgbWFya2Rvd24gc3VwcG9ydFxuICAgICAgICAgICAgPE1haWFTdHJlYW1kb3duXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJjaGF0XCJcbiAgICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17cHJvcHMuaXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICAgICAgY29tcG9uZW50cz17eyBhOiBFbnRpdHlMaW5rQ3VzdG9tTGluayB9IGFzIE1haWFTdHJlYW1kb3duUHJvcHNbJ2NvbXBvbmVudHMnXX1cbiAgICAgICAgICAgICAgaXNBbmltYXRpbmc9eyEhcHJvcHMuaXNTdHJlYW1pbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgIDwvTWFpYVN0cmVhbWRvd24+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9TQ0NBSU1lc3NhZ2VXcmFwcGVyPlxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNFcnJvciAmJlxuICAgICAgICAgICFwcm9wcy5hcHByb3ZhbCAmJlxuICAgICAgICAgICFwcm9wcy5pc1N0cmVhbWluZyAmJlxuICAgICAgICAgICghcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCB8fCAhIXByb3BzLm9uUmV0cnkpICYmIChcbiAgICAgICAgICAgIDxNZXNzYWdlRmVlZGJhY2tcbiAgICAgICAgICAgICAgY29udGVudD17ZGlzcGxheVRleHR9XG4gICAgICAgICAgICAgIHNvdXJjZXM9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWQgPyB1bmRlZmluZWQgOiBwcm9wcy5zb3VyY2VzfVxuICAgICAgICAgICAgICBoYW5kbGVGZWVkYmFjaz17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCA/IHVuZGVmaW5lZCA6IHByb3BzLmhhbmRsZUZlZWRiYWNrQ2xpY2t9XG4gICAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17cHJvcHMuZGlzYWJsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBvblJldHJ5PXtwcm9wcy5vblJldHJ5fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCAmJlxuICAgICAgICAgICFwcm9wcy5hcHByb3ZhbCAmJlxuICAgICAgICAgICghcHJvcHMuaXNFcnJvciB8fCBwcm9wcy5zdWdnZXN0aW9ucz8ubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgICA8Q2hhdEFJU3VnZ2VzdGlvbnNcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM9e3Byb3BzLnN1Z2dlc3Rpb25zIHx8IFtdfVxuICAgICAgICAgICAgICBvblNlbGVjdFN1Z2dlc3Rpb249e3N1Z2dlc3Rpb24gPT4gcHJvcHMuaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKHByb3BzLm1lc3NhZ2VJZCwgc3VnZ2VzdGlvbil9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkfVxuICAgICAgICAgICAgICBoaWRkZW49eyEhcHJvcHMuaXNTdHJlYW1pbmcgfHwgIXByb3BzLmlzTGFzdE1lc3NhZ2UgfHwgISFwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApfVxuICAgICAgICB7cHJvcHMuaXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAhcHJvcHMuaXNFcnJvciAmJlxuICAgICAgICAgICFwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkICYmXG4gICAgICAgICAgIXByb3BzLmFwcHJvdmFsICYmXG4gICAgICAgICAgISFjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkICYmIChcbiAgICAgICAgICAgIDxDaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnNcbiAgICAgICAgICAgICAgYWdlbnRJZD17Y3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZH1cbiAgICAgICAgICAgICAgZGlzYWJsZWQ9e3Byb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAgIGhpZGRlbj17ISFwcm9wcy5pc1N0cmVhbWluZyB8fCAhcHJvcHMuaXNMYXN0TWVzc2FnZSB8fCAhIXByb3BzLnN1Z2dlc3Rpb25zRGlzYWJsZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICl9XG4gICAgICA8Lz5cbiAgICApXG4gIH1cbilcblxuY29uc3QgTWVzc2FnZUl0ZW0gPSBtZW1vKChwcm9wczogTWVzc2FnZUl0ZW1Qcm9wcykgPT4ge1xuICBjb25zdCB7XG4gICAgaWQsXG4gICAgdXNlcixcbiAgICBtZXNzYWdlLFxuICAgIGlzU3RyZWFtaW5nLFxuICAgIGlzRXJyb3IsXG4gICAgYXV0aFVzZXIsXG4gICAgb3B0aW9ucyxcbiAgICBpc0NoYW5nZVByb2plY3QsXG4gICAgaGFuZGxlU2VsZWN0T3B0aW9uLFxuICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljayxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGRpc2FibGVGZWVkYmFjayxcbiAgICBoYW5kbGVSZXRyeSxcbiAgICByb2xlLFxuICAgIHNvdXJjZXMsXG4gICAgYXR0YWNobWVudHMsXG4gICAgYXBwcm92YWwsXG4gICAgYXBwcm92YWxTdGF0dXMsXG4gICAgc3VnZ2VzdGlvbnMsXG4gICAgY3JlYXRlQWdlbnRGb2xsb3dVcCxcbiAgICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb24sXG4gICAgaXNMYXN0TWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgW3ByZXZpZXdBdHRhY2htZW50LCBzZXRQcmV2aWV3QXR0YWNobWVudF0gPSB1c2VTdGF0ZTxBdHRhY2htZW50RmlsZSB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGlzQ3VycmVudFVzZXIgPSByb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuVVNFUiB8fCB1c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpXG4gIGNvbnN0IGlzQXNzaXN0YW50ID0gcm9sZSA9PT0gQ2hhdEhpc3RvcnlSb2xlLkFTU0lTVEFOVCB8fCB1c2VyLmlkID09PSAnYXNzaXN0YW50J1xuICBjb25zdCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID0gaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZChpZClcbiAgY29uc3Qgc3RyZWFtaW5nVGV4dCA9IHVzZVN0cmVhbWluZ01lc3NhZ2UoaXNTdHJlYW1pbmcgfHwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlciA/IGlkIDogbnVsbClcbiAgY29uc3QgaXNBY3RpdmVTdHJlYW1pbmcgPSAhIWlzU3RyZWFtaW5nIHx8IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJcbiAgY29uc3QgaGFzU3RyZWFtVGV4dCA9IEJvb2xlYW4oc3RyZWFtaW5nVGV4dClcbiAgY29uc3QgcmVhc29uaW5nVHJhY2UgPSB1c2VSZWFzb25pbmdUcmFjZShpc0Fzc2lzdGFudCAmJiBpc0FjdGl2ZVN0cmVhbWluZyA/IGlkIDogJycpXG4gIGNvbnN0IHN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUgPVxuICAgIGlzQXNzaXN0YW50ICYmXG4gICAgc2hvdWxkU3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZShyZWFzb25pbmdUcmFjZS5zdGVwcywgc3RyZWFtQWN0aXZpdHksIHN0cmVhbWluZ1RleHQsIHsgbWVzc2FnZUlkOiBpZCB9KVxuICBjb25zdCBzaG93U3RyZWFtaW5nQm9keSA9IGlzQWN0aXZlU3RyZWFtaW5nICYmIGhhc1N0cmVhbVRleHQgJiYgIXN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmVcbiAgY29uc3Qgc2hvd0FjdGl2aXR5SW5kaWNhdG9yID0gaXNBc3Npc3RhbnQgJiYgaXNBY3RpdmVTdHJlYW1pbmcgJiYgISFzdHJlYW1BY3Rpdml0eVxuXG4gIGNvbnN0IG1lc3NhZ2VBdHRhY2htZW50cyA9XG4gICAgYXR0YWNobWVudHMgJiYgYXR0YWNobWVudHMubGVuZ3RoID4gMFxuICAgICAgPyBhdHRhY2htZW50c1xuICAgICAgOiAhaXNBc3Npc3RhbnQgJiYgQXJyYXkuaXNBcnJheShzb3VyY2VzKVxuICAgICAgICA/IChzb3VyY2VzIGFzIEF0dGFjaG1lbnRGaWxlW10pXG4gICAgICAgIDogW11cblxuICBjb25zdCBoYW5kbGVBdHRhY2htZW50Q2xpY2sgPSAoYXR0YWNobWVudDogQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICAvLyBQZXJtaXRpciBwcmV2aXN1YWxpemFjacOzbiBzaSB0aWVuZSBhcmNoaXZvIGxvY2FsIG8gVVJMcyBkZWwgYmFja2VuZFxuICAgIGlmIChjYW5PcGVuQXR0YWNobWVudFByZXZpZXcoYXR0YWNobWVudCkpIHtcbiAgICAgIHNldFByZXZpZXdBdHRhY2htZW50KGF0dGFjaG1lbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQ2xvc2VQcmV2aWV3ID0gKCkgPT4ge1xuICAgIHNldFByZXZpZXdBdHRhY2htZW50KG51bGwpXG4gIH1cblxuICBjb25zdCBoYW5kbGVBdHRhY2htZW50RG93bmxvYWQgPSBhc3luYyAoYXR0YWNobWVudDogQXR0YWNobWVudEZpbGUpID0+IHtcbiAgICBjb25zdCBleHRlbnNpb24gPSBhdHRhY2htZW50Lm5hbWUuaW5jbHVkZXMoJy4nKSA/ICcnIDogYC4ke2F0dGFjaG1lbnQudHlwZX1gXG4gICAgY29uc3QgZmlsZU5hbWUgPSBgJHthdHRhY2htZW50Lm5hbWV9JHtleHRlbnNpb259YFxuICAgIGNvbnN0IGZpbGVVcmwgPSBhdHRhY2htZW50LnVybF9vcmlnaW5hbCB8fCBhdHRhY2htZW50LnVybF9maWxlIHx8IGF0dGFjaG1lbnQudXJsX3RodW1ibmFpbFxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBibG9iVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gICAgICBpZiAoZmlsZVVybCkge1xuICAgICAgICBjb25zdCBkb3dubG9hZGVkRmlsZSA9IGF3YWl0IGRvd25sb2FkRmlsZUZyb21VcmwoZmlsZVVybCwgZmlsZU5hbWUsIGF0dGFjaG1lbnQudHlwZSlcbiAgICAgICAgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZG93bmxvYWRlZEZpbGUpXG4gICAgICB9IGVsc2UgaWYgKGF0dGFjaG1lbnQuZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgYmxvYlVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYXR0YWNobWVudC5maWxlKVxuICAgICAgfVxuXG4gICAgICBpZiAoIWJsb2JVcmwpIHJldHVyblxuXG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpXG4gICAgICBsaW5rLmhyZWYgPSBibG9iVXJsXG4gICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWVcbiAgICAgIGxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJ1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKVxuICAgICAgbGluay5jbGljaygpXG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspXG4gICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwoYmxvYlVybClcbiAgICAgIH0sIDEwMClcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGRvd25sb2FkIGF0dGFjaG1lbnQnLCBlcnJvcilcbiAgICB9XG4gIH1cblxuICBpZiAoaXNDaGFuZ2VQcm9qZWN0ICYmIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPE1lc3NhZ2VXcmFwcGVyIGtleT17aWR9IGlzQ3VycmVudFVzZXI9e2lzQ3VycmVudFVzZXJ9IGRhdGEtbWVzc2FnZS1pZD17aWR9IGhhc0ZlZWRiYWNrPXtmYWxzZX0+XG4gICAgICAgIDxTQ01lc3NhZ2VJdGVtV3JhcHBlciAkaXNBc3Npc3RhbnQ9e2lzQXNzaXN0YW50fT5cbiAgICAgICAgICA8TWVzc2FnZUNvbnRlbnRXcmFwcGVyXG4gICAgICAgICAgICBpc0NoYW5nZVByb2plY3Q9e2lzQ2hhbmdlUHJvamVjdH1cbiAgICAgICAgICAgIG1lc3NhZ2U9e21lc3NhZ2V9XG4gICAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfVxuICAgICAgICAgICAgaXNFcnJvcj17aXNFcnJvcn1cbiAgICAgICAgICAgIG1lc3NhZ2VFeHRyYUNvbnRlbnQ9ezxNZXNzYWdlT3B0aW9ucyBvcHRpb25zPXtvcHRpb25zIGFzIGFueX0gaGFuZGxlU2VsZWN0T3B0aW9uPXtoYW5kbGVTZWxlY3RPcHRpb259IC8+fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvU0NNZXNzYWdlSXRlbVdyYXBwZXI+XG4gICAgICA8L01lc3NhZ2VXcmFwcGVyPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUZlZWRiYWNrQ2xpY2sgPSAoZmVlZGJhY2s6IEZlZWRiYWNrKSA9PiB7XG4gICAgaGFuZGxlRmVlZGJhY2s/LihmZWVkYmFjaywgZXh0cmFjdEZlZWRiYWNrU2Vzc2lvbklkKGlkKSlcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNDTWVzc2FnZUl0ZW1XcmFwcGVyICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9IGRhdGEtbWVzc2FnZS1pZD17aWR9PlxuICAgICAgPFNDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgICAgey8qIE1pc21vIHNsb3QgcGFyYSBsYSB0cmF6YSBlbiB2aXZvIHkgbGEgeWEgcGxlZ2FkYTogbWllbnRyYXMgZWwgdHVybm9cbiAgICAgICAgICAgIGNvcnJlLCBsb3MgcGFzb3Mgc2UgYXBpbGFuIGFjw6EgKHRpbWVsYXBzZSk7IGFsIGNvbXBsZXRhciwgZWxcbiAgICAgICAgICAgIFJlYXNvbmluZ0Jsb2NrIG9jdXBhIGVsIGx1Z2FyIHkgY29sYXBzYSBzb2xvLlxuICAgICAgICAgICAgVmEgQVJSSUJBIGRlbCBjdWVycG8gcG9ycXVlIGxhIG5hcnJhY2nDs24gZGUgY2FkYSB0dXJubyB0ZXJtaW5hIGNvbW9cbiAgICAgICAgICAgIGZpbGEgZGUgbGEgdHJhemE6IHNpIGVzdHV2aWVyYSBhYmFqbywgZWwgdGV4dG8gdmllam8gcXVlZGFyw61hIHBvclxuICAgICAgICAgICAgZGViYWpvIGRlbCB0ZXh0byBudWV2by4gKi99XG4gICAgICAgIHtpc0Fzc2lzdGFudCAmJlxuICAgICAgICAgIChpc0FjdGl2ZVN0cmVhbWluZyA/IChcbiAgICAgICAgICAgIDxSZWFzb25pbmdUaW1lbGluZSBtZXNzYWdlSWQ9e2lkfSBzdHJlYW1BY3Rpdml0eT17c3RyZWFtQWN0aXZpdHl9IHN0cmVhbWluZ1RleHQ9e3N0cmVhbWluZ1RleHR9IC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxSZWFzb25pbmdCbG9jayBtZXNzYWdlSWQ9e2lkfSB0cmFjZT17cHJvcHMucmVhc29uaW5nID8/IG51bGx9IC8+XG4gICAgICAgICAgKSl9XG4gICAgICAgIHshIW1lc3NhZ2VBdHRhY2htZW50cy5sZW5ndGggJiYgKFxuICAgICAgICAgIDxTQ0F0dGFjaG1lbnRzUm93ICRpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9PlxuICAgICAgICAgICAge21lc3NhZ2VBdHRhY2htZW50cy5tYXAoKGF0dGFjaG1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIC8vIERldGVjdGFyIHNpIGVzIHVuIGFyY2hpdm8gZGUgYXVkaW9cbiAgICAgICAgICAgICAgaWYgKGlzQXVkaW9BdHRhY2htZW50KGF0dGFjaG1lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxBdHRhY2htZW50Q2FyZEF1ZGlvIGtleT17YCR7YXR0YWNobWVudC5pZH0tJHthdHRhY2htZW50Lm5hbWV9YH0gYXR0YWNobWVudD17YXR0YWNobWVudH0gLz5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPEF0dGFjaG1lbnRDYXJkXG4gICAgICAgICAgICAgICAgICBrZXk9e2Ake2F0dGFjaG1lbnQuaWR9LSR7YXR0YWNobWVudC5uYW1lfWB9XG4gICAgICAgICAgICAgICAgICBhdHRhY2htZW50PXthdHRhY2htZW50fVxuICAgICAgICAgICAgICAgICAgcG9zaXRpb25JbmRleD17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBvbkRvd25sb2FkPXsoKSA9PiBoYW5kbGVBdHRhY2htZW50RG93bmxvYWQoYXR0YWNobWVudCl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVBdHRhY2htZW50Q2xpY2soYXR0YWNobWVudCl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgICAgPC9TQ0F0dGFjaG1lbnRzUm93PlxuICAgICAgICApfVxuICAgICAgICB7KCEhbWVzc2FnZSB8fCBzaG93U3RyZWFtaW5nQm9keSkgJiYgIShpc0Fzc2lzdGFudCAmJiAhIW1lc3NhZ2VBdHRhY2htZW50cy5sZW5ndGgpICYmIChcbiAgICAgICAgICA8U3RyZWFtaW5nTWVzc2FnZUJvZHlcbiAgICAgICAgICAgIG1lc3NhZ2U9e21lc3NhZ2UgPz8gJyd9XG4gICAgICAgICAgICBpc1N0cmVhbWluZz17c2hvd1N0cmVhbWluZ0JvZHl9XG4gICAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfVxuICAgICAgICAgICAgaXNBc3Npc3RhbnQ9e2lzQXNzaXN0YW50fVxuICAgICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICAgIGFwcHJvdmFsPXthcHByb3ZhbH1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBzb3VyY2VzPXtzb3VyY2VzfVxuICAgICAgICAgICAgc3VnZ2VzdGlvbnM9e3N1Z2dlc3Rpb25zfVxuICAgICAgICAgICAgY3JlYXRlQWdlbnRGb2xsb3dVcD17Y3JlYXRlQWdlbnRGb2xsb3dVcH1cbiAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrQ2xpY2s9e2hhbmRsZUZlZWRiYWNrQ2xpY2t9XG4gICAgICAgICAgICBkaXNhYmxlRmVlZGJhY2s9e2Rpc2FibGVGZWVkYmFjayA/PyBudWxsfVxuICAgICAgICAgICAgb25SZXRyeT17aGFuZGxlUmV0cnl9XG4gICAgICAgICAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s9e2hhbmRsZVN1Z2dlc3Rpb25DbGlja31cbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zRGlzYWJsZWQ9e2lzQWN0aXZlU3RyZWFtaW5nIHx8ICEhaGFzU2VsZWN0ZWRTdWdnZXN0aW9ufVxuICAgICAgICAgICAgbWVzc2FnZUlkPXtpZH1cbiAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2U9e2lzTGFzdE1lc3NhZ2V9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgey8qIFNwaW5uZXIgZGUgYWN0aXZpZGFkOiB2aXNpYmxlIHRhbWJpw6luIGVuIHdyaXRpbmcgKG5hcnJhY2nDs24gZW4gdHJhemEgbyByZXNwdWVzdGEgZmluYWwpLiAqL31cbiAgICAgICAge3Nob3dBY3Rpdml0eUluZGljYXRvciAmJiAoXG4gICAgICAgICAgPFNDVGltZWxpbmVJbmRpY2F0b3I+XG4gICAgICAgICAgICA8QWdlbnRBY3Rpdml0eUluZGljYXRvciBhY3Rpdml0eT17c3RyZWFtQWN0aXZpdHl9IGNvbXBhY3QgLz5cbiAgICAgICAgICA8L1NDVGltZWxpbmVJbmRpY2F0b3I+XG4gICAgICAgICl9XG4gICAgICAgIHthcHByb3ZhbCAmJiBhcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnMgJiYgKFxuICAgICAgICAgIDxTQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgICAgIDxBcHByb3ZhbEJveFxuICAgICAgICAgICAgICBhY3Rpb25zPXthcHByb3ZhbC5wZW5kaW5nX2FjdGlvbnN9XG4gICAgICAgICAgICAgIHN0YXR1cz17YXBwcm92YWxTdGF0dXN9XG4gICAgICAgICAgICAgIG9uQXBwcm92ZT17KHRocmVhZElkcywgbWV0YWRhdGEpID0+IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24odGhyZWFkSWRzLCAnYXBwcm92ZScsIHVuZGVmaW5lZCwgbWV0YWRhdGEpfVxuICAgICAgICAgICAgICBvblJlamVjdD17dGhyZWFkSWRzID0+IGhhbmRsZUFwcHJvdmFsRGVjaXNpb24odGhyZWFkSWRzLCAncmVqZWN0Jyl9XG4gICAgICAgICAgICAgIGlzUHJvamVjdERlbGV0ZWQ9e3Byb3BzLnByb2plY3RNZXRhZGF0YT8uaXNfZGVsZXRlZCA9PT0gdHJ1ZX1cbiAgICAgICAgICAgICAgaXNFeHBhbmRlZD17cHJvcHMuZXhwYW5kZWR9XG4gICAgICAgICAgICAgIGhpdGxJbnN0YW5jZUlkPXthcHByb3ZhbC5vcmlnaW5hbF90aHJlYWRfaWR9XG4gICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlPXthcHByb3ZhbC53YXJuaW5nX21lc3NhZ2V9XG4gICAgICAgICAgICAgIG1hbnVhbEFwcHJvdmFsRGV0ZWN0ZWQ9e2FwcHJvdmFsLm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9TQ0FwcHJvdmFsQWN0aW9uc0NvbHVtbj5cbiAgICAgICAgKX1cbiAgICAgIDwvU0NNZXNzYWdlSXRlbUlubmVyPlxuICAgICAgPEF0dGFjaG1lbnRQcmV2aWV3TW9kYWxcbiAgICAgICAgaXNPcGVuPXshIXByZXZpZXdBdHRhY2htZW50fVxuICAgICAgICBvbkNsb3NlPXtoYW5kbGVDbG9zZVByZXZpZXd9XG4gICAgICAgIGF0dGFjaG1lbnQ9e3ByZXZpZXdBdHRhY2htZW50fVxuICAgICAgLz5cbiAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICApXG59KVxuXG5jb25zdCBDaGF0QUlNZXNzYWdlc0lubmVyID0gKHtcbiAgdXNlckluaXRpYWxNZXNzYWdlLFxuICBpbml0aWFsQ2hhdElkLFxuICBvbkVycm9yLFxuICBvblNlbmRNZXNzYWdlUmVhZHksXG4gIG9uU2Nyb2xsVG9Cb3R0b20sXG4gIGF0dGFjaG1lbnRzLFxuICBhZ2VudHMsXG4gIGV4cGFuZGVkLFxuICBza2lwRW50ZXJBbmltYXRpb24gPSBmYWxzZSxcbn06IENoYXRBSU1lc3NhZ2VzUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgeyBpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlLCBhZ2VudCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IGV2ZW50ID0gdXNlRXZlbnQoKVxuICBjb25zdCBhdXRoVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgY2hhdEluaXRpYWxpemVkUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBpc0xvYWRpbmdNb3JlUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBzY3JvbGxUaHJlc2hvbGRSZWYgPSB1c2VSZWYoMzkpXG4gIGNvbnN0IGxhc3RTY3JvbGxUb3BSZWYgPSB1c2VSZWYoMClcbiAgY29uc3Qgc2hvd1Njcm9sbFRvQm90dG9tUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBzaG93VG9wR3JhZGllbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNob3dCb3R0b21HcmFkaWVudFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsUmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIC8qKlxuICAgKiBUdXJubyBjb24gZWwgc2Nyb2xsIGJham8gY29udHJvbCBkZWwgdXN1YXJpbzogZGVzZGUgcXVlIGVudsOtYSBlbCBtZW5zYWplIHlcbiAgICogaGFzdGEgZWwgcHLDs3hpbW8gZW52w61vIG5vIG1vdmVtb3MgZWwgc2Nyb2xsIHBvciBuaW5nw7puIG1vdGl2by4gRXNcbiAgICogaW5kZXBlbmRpZW50ZSBkZSBsYSBhbHR1cmEgZGVsIHNwYWNlciwgcXVlIHB1ZWRlIGxsZWdhciBhIDAgc2luIGRlc2FuY2xhci5cbiAgICovXG4gIGNvbnN0IGFuY2hvcmVkVHVybklkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNwYWNlckVsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3Qgc3BhY2VySGVpZ2h0UmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHR1cm5TY3JvbGxSYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbClcbiAgY29uc3Qgd2FzTG9hZGluZ01lc3NhZ2VzUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNjcm9sbFBlcnNpc3RUaW1lclJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2hvd1Njcm9sbFRvQm90dG9tLCBzZXRTaG93U2Nyb2xsVG9Cb3R0b21dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93VG9wR3JhZGllbnQsIHNldFNob3dUb3BHcmFkaWVudF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Nob3dCb3R0b21HcmFkaWVudCwgc2V0U2hvd0JvdHRvbUdyYWRpZW50XSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcywgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pXG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICByZXRyeU1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBzdG9wR2VuZXJhdGlvbixcbiAgfSA9IHVzZUNoYXRNYW5hZ2VyKHtcbiAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBvbkVycm9yLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFnZW50cyxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3RPcHRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBjaGFuZ2VQcm9qZWN0KG9wdGlvbilcbiAgICB9LFxuICAgIFtjaGFuZ2VQcm9qZWN0XVxuICApXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYSBlbCBib3TDs24gXCJzY3JvbGwgdG8gYm90dG9tXCIgeSBsb3MgZ3JhZGllbnRlcyBkZSBib3JkZSBhIHBhcnRpciBkZVxuICAgKiBsYSBwb3NpY2nDs24gZGVsIHNjcm9sbC4gTG9zIHJlZnMgZXZpdGFuIGBzZXRTdGF0ZWAgY3VhbmRvIGVsIHZhbG9yIG5vIGNhbWJpYTpcbiAgICogZXN0byBjb3JyZSBlbiBjYWRhIGZyYW1lIGRlbCBzdHJlYW0uXG4gICAqL1xuICBjb25zdCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGVsXG4gICAgLy8gRWwgc3BhY2VyIGRlbCB0dXJubyBlcyBhbHRvIHJlc2VydmFkbywgbm8gY29udGVuaWRvOiBzaSBubyBsbyBkZXNjb250YW1vc1xuICAgIC8vIGxhIGZsZWNoYSB5IGVsIGdyYWRpZW50ZSBkZSBhYmFqbyBxdWVkYW4gZW5jZW5kaWRvcyBkdXJhbnRlIHRvZG8gZWwgdHVybm8uXG4gICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gY29tcHV0ZURpc3RhbmNlRnJvbUJvdHRvbShzY3JvbGxIZWlnaHQsIHNwYWNlckhlaWdodFJlZi5jdXJyZW50LCBzY3JvbGxUb3AsIGNsaWVudEhlaWdodClcblxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBzaG91bGRTaG93U2Nyb2xsVG9Cb3R0b20oZGlzdGFuY2VGcm9tQm90dG9tKVxuICAgIGlmIChzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCAhPT0gc2hvdWxkU2hvdykge1xuICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VG9wR3JhZGllbnQgPSBzY3JvbGxUb3AgPiAxXG4gICAgaWYgKHNob3dUb3BHcmFkaWVudFJlZi5jdXJyZW50ICE9PSBuZXh0VG9wR3JhZGllbnQpIHtcbiAgICAgIHNob3dUb3BHcmFkaWVudFJlZi5jdXJyZW50ID0gbmV4dFRvcEdyYWRpZW50XG4gICAgICBzZXRTaG93VG9wR3JhZGllbnQobmV4dFRvcEdyYWRpZW50KVxuICAgIH1cblxuICAgIGNvbnN0IG5leHRCb3R0b21HcmFkaWVudCA9IGRpc3RhbmNlRnJvbUJvdHRvbSA+IDFcbiAgICBpZiAoc2hvd0JvdHRvbUdyYWRpZW50UmVmLmN1cnJlbnQgIT09IG5leHRCb3R0b21HcmFkaWVudCkge1xuICAgICAgc2hvd0JvdHRvbUdyYWRpZW50UmVmLmN1cnJlbnQgPSBuZXh0Qm90dG9tR3JhZGllbnRcbiAgICAgIHNldFNob3dCb3R0b21HcmFkaWVudChuZXh0Qm90dG9tR3JhZGllbnQpXG4gICAgfVxuICB9LCBbXSlcblxuICAvKipcbiAgICogU2Nyb2xsIGlubWVkaWF0byBhbCBmb25kbyAoZGVudHJvIGRlIHJBRiBwYXJhIGNvb3JkaW5hciBjb24gZWwgcGFpbnQpXG4gICAqIHkgYWN0dWFsaXphIGxhIHZpc2liaWxpZGFkIGRlbCBib3TDs24uIFNvbG8gc2UgdXNhIGFsIGFicmlyL2NhcmdhciB1biBjaGF0XG4gICAqIG8gY3VhbmRvIGVsIHVzdWFyaW8gcGlkZSBpciBhbCBmb25kbzogbnVuY2EgZHVyYW50ZSBlbCBzdHJlYW0uXG4gICAqL1xuICBjb25zdCBzY3JvbGxUb0JvdHRvbVJhZiA9IHVzZUNhbGxiYWNrKFxuICAgIChvcHRzOiB7IGRlbGF5TXM/OiBudW1iZXIgfSA9IHt9KSA9PiB7XG4gICAgICBjb25zdCB7IGRlbGF5TXMgPSAwIH0gPSBvcHRzXG4gICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICAgICAgaWYgKCFlbCkgcmV0dXJuXG4gICAgICAgICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgaWYgKGRlbGF5TXMgPiAwKSBzZXRUaW1lb3V0KHJ1biwgZGVsYXlNcylcbiAgICAgIGVsc2UgcnVuKClcbiAgICB9LFxuICAgIFt1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc11cbiAgKVxuXG4gIGNvbnN0IGNhbmNlbFR1cm5TY3JvbGwgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKHR1cm5TY3JvbGxSYWZSZWYuY3VycmVudCA9PT0gbnVsbCkgcmV0dXJuXG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodHVyblNjcm9sbFJhZlJlZi5jdXJyZW50KVxuICAgIHR1cm5TY3JvbGxSYWZSZWYuY3VycmVudCA9IG51bGxcbiAgfSwgW10pXG5cbiAgLyoqXG4gICAqIFNjcm9sbCBhbmltYWRvIGNvbiBlYXNpbmcgcHJvcGlvOiBgYmVoYXZpb3I6ICdzbW9vdGgnYCBubyBwZXJtaXRlIHJlZ3VsYXIgbGFcbiAgICogZHVyYWNpw7NuIHkgZWwgc2FsdG8gYWwgYW5jbGFyIGVsIHR1cm5vIHF1ZWRhIGRlbWFzaWFkbyBzZWNvLlxuICAgKi9cbiAgY29uc3QgYW5pbWF0ZVNjcm9sbFRvID0gdXNlQ2FsbGJhY2soXG4gICAgKHRvcDogbnVtYmVyKSA9PiB7XG4gICAgICBjYW5jZWxUdXJuU2Nyb2xsKClcbiAgICAgIGNvbnN0IGVsID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgICAgaWYgKCFlbCkgcmV0dXJuXG4gICAgICBjb25zdCBmcm9tID0gZWwuc2Nyb2xsVG9wXG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHRvcCAtIGZyb21cbiAgICAgIGlmIChNYXRoLmFicyhkaXN0YW5jZSkgPCAxKSByZXR1cm5cblxuICAgICAgY29uc3QgZHVyYXRpb24gPSBjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMoZGlzdGFuY2UpXG5cbiAgICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IHBlcmZvcm1hbmNlLm5vdygpXG4gICAgICBjb25zdCBzdGVwID0gKG5vdzogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzID0gTWF0aC5taW4oMSwgKG5vdyAtIHN0YXJ0ZWRBdCkgLyBkdXJhdGlvbilcbiAgICAgICAgLy8gZWFzZU91dEV4cG8gKH5jdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKSk6IGVtcGllemEgYSBmcmVuYXIgbXVjaG9cbiAgICAgICAgLy8gYW50ZXMgcXVlIGVsIHF1aW50IHkgYXRlcnJpemEgc2luIGNvcnRlIHBlcmNlcHRpYmxlLlxuICAgICAgICBjb25zdCBlYXNlZCA9IHByb2dyZXNzID09PSAxID8gMSA6IDEgLSAyICoqICgtMTIgKiBwcm9ncmVzcylcbiAgICAgICAgZWwuc2Nyb2xsVG9wID0gZnJvbSArIGRpc3RhbmNlICogZWFzZWRcbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgICB0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSBwcm9ncmVzcyA8IDEgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCkgOiBudWxsXG4gICAgICB9XG4gICAgICB0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcClcbiAgICB9LFxuICAgIFtjYW5jZWxUdXJuU2Nyb2xsLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc11cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiBjYW5jZWxUdXJuU2Nyb2xsLCBbY2FuY2VsVHVyblNjcm9sbF0pXG5cbiAgY29uc3Qgc2V0U3BhY2VySGVpZ2h0ID0gdXNlQ2FsbGJhY2soKG5leHQ6IG51bWJlcikgPT4ge1xuICAgIGlmIChNYXRoLmFicyhzcGFjZXJIZWlnaHRSZWYuY3VycmVudCAtIG5leHQpIDwgMSkgcmV0dXJuXG4gICAgc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgPSBuZXh0XG4gICAgaWYgKHNwYWNlckVsUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNwYWNlckVsUmVmLmN1cnJlbnQuc3R5bGUuaGVpZ2h0ID0gYCR7bmV4dH1weGBcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGNsZWFyVHVyblNwYWNlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgc2V0U3BhY2VySGVpZ2h0KDApXG4gIH0sIFtzZXRTcGFjZXJIZWlnaHRdKVxuXG4gIC8qKlxuICAgKiBEZXZ1ZWx2ZSBlbCBhbHRvIHJlc2VydmFkbyBxdWUgc2UgcHVlZGUgc2FjYXIgc2luIG1vdmVyIGxhIHZpc3RhOiB0b2RvIGxvXG4gICAqIHF1ZSBxdWVkZSBwb3IgZGViYWpvIGRlbCBzY3JvbGwgYWN0dWFsLiBTaSBlbCB1c3VhcmlvIGVzdMOhIGVuIGVsIGZvbmRvLCBzZVxuICAgKiBzYWNhIGVudGVybzsgc2kgZXN0w6EgYSBtaXRhZCBkZSBjYW1pbm8sIHNlIHZhIGRyZW5hbmRvIGEgbWVkaWRhIHF1ZSBiYWphLlxuICAgKi9cbiAgY29uc3QgZHJhaW5UdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgaWYgKCFlbCB8fCBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA8PSAwKSByZXR1cm5cbiAgICBzZXRTcGFjZXJIZWlnaHQoY29tcHV0ZVJlbW92YWJsZVR1cm5TcGFjZShlbC5zY3JvbGxIZWlnaHQsIGVsLmNsaWVudEhlaWdodCwgZWwuc2Nyb2xsVG9wLCBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCkpXG4gIH0sIFtzZXRTcGFjZXJIZWlnaHRdKVxuXG4gIC8qKlxuICAgKiBFbCB1c3VhcmlvIHRvbcOzIGVsIGNvbnRyb2wgZGVsIHNjcm9sbDogZWwgdHVybm8gZGVqYSBkZSBlc3RhciBhbmNsYWRvIHkgZWxcbiAgICogZXNwYWNpbyByZXNlcnZhZG8gZW1waWV6YSBhIGRldm9sdmVyc2UuIFNpbiBhbmNsYSB5IGNvbiBzcGFjZXIgPiAwLCBlbFxuICAgKiBoYW5kbGVyIGRlIHNjcm9sbCBzaWd1ZSBkcmVuYW5kbyBoYXN0YSBxdWUgbGxlZ2EgYWwgZm9uZG8geSBubyBxdWVkYSBodWVjby5cbiAgICovXG4gIGNvbnN0IHJlbGVhc2VUdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50ICYmIHNwYWNlckhlaWdodFJlZi5jdXJyZW50IDw9IDApIHJldHVyblxuICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgZHJhaW5UdXJuU3BhY2UoKVxuICB9LCBbZHJhaW5UdXJuU3BhY2VdKVxuXG4gIGNvbnN0IGhhbmRsZVVzZXJTY3JvbGxJbnRlbnQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY2FuY2VsVHVyblNjcm9sbCgpXG4gICAgcmVsZWFzZVR1cm5TcGFjZSgpXG4gIH0sIFtjYW5jZWxUdXJuU2Nyb2xsLCByZWxlYXNlVHVyblNwYWNlXSlcblxuICAvKiogRW4gZnVsbHNjcmVlbiBlbCB3aGVlbCBlbiBtw6FyZ2VuZXMvb3ZlcmxheSBjYWUgZnVlcmEgZGUgU0NNZXNzYWdlc1Njcm9sbDsgcmVlbnZpYW1vcyBhbCBzY3JvbGxlciBkZWwgaGlsby4gKi9cbiAgY29uc3QgaGFuZGxlTWVzc2FnZXNPdXRlcldoZWVsID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBSZWFjdC5XaGVlbEV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgICAgaGFuZGxlVXNlclNjcm9sbEludGVudCgpXG4gICAgICBjb25zdCBzY3JvbGxlciA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICghc2Nyb2xsZXIpIHJldHVyblxuXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgTm9kZVxuICAgICAgaWYgKHRhcmdldCAhPT0gZXZlbnQuY3VycmVudFRhcmdldCAmJiAodGFyZ2V0ID09PSBzY3JvbGxlciB8fCBzY3JvbGxlci5jb250YWlucyh0YXJnZXQpKSkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgeyBkZWx0YVkgfSA9IGV2ZW50XG4gICAgICBpZiAoZGVsdGFZID09PSAwKSByZXR1cm5cblxuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsZXIuY2xpZW50SGVpZ2h0XG4gICAgICBpZiAobWF4U2Nyb2xsIDw9IDApIHJldHVyblxuXG4gICAgICBjb25zdCBuZXh0U2Nyb2xsVG9wID0gTWF0aC5taW4obWF4U2Nyb2xsLCBNYXRoLm1heCgwLCBzY3JvbGxlci5zY3JvbGxUb3AgKyBkZWx0YVkpKVxuICAgICAgaWYgKG5leHRTY3JvbGxUb3AgPT09IHNjcm9sbGVyLnNjcm9sbFRvcCkgcmV0dXJuXG5cbiAgICAgIHNjcm9sbGVyLnNjcm9sbFRvcCA9IG5leHRTY3JvbGxUb3BcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9LFxuICAgIFtoYW5kbGVVc2VyU2Nyb2xsSW50ZW50XVxuICApXG5cbiAgY29uc3QgbWVhc3VyZVR1cm4gPSB1c2VDYWxsYmFjaygocXVlc3Rpb25JZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgY29uc3Qgc3BhY2VyRWwgPSBzcGFjZXJFbFJlZi5jdXJyZW50XG4gICAgaWYgKCFlbCB8fCAhc3BhY2VyRWwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBxdWVzdGlvbkVsID0gZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYFtkYXRhLW1lc3NhZ2UtaWQ9XCIke3F1ZXN0aW9uSWR9XCJdYClcbiAgICBpZiAoIXF1ZXN0aW9uRWwpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBjb250YWluZXJUb3AgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3BcbiAgICBjb25zdCBxdWVzdGlvblRvcCA9IHF1ZXN0aW9uRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gY29udGFpbmVyVG9wICsgZWwuc2Nyb2xsVG9wXG4gICAgY29uc3QgY29udGVudEJvdHRvbSA9IHNwYWNlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIGNvbnRhaW5lclRvcCArIGVsLnNjcm9sbFRvcFxuICAgIHJldHVybiB7IGVsLCBxdWVzdGlvblRvcCwgdHVybkhlaWdodDogY29udGVudEJvdHRvbSAtIHF1ZXN0aW9uVG9wIH1cbiAgfSwgW10pXG5cbiAgY29uc3QgcmVzZXJ2ZVR1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKFxuICAgIChxdWVzdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVR1cm4ocXVlc3Rpb25JZClcbiAgICAgIGlmICghbWVhc3VyZWQpIHJldHVyblxuICAgICAgY29uc3QgeyBlbCwgcXVlc3Rpb25Ub3AsIHR1cm5IZWlnaHQgfSA9IG1lYXN1cmVkXG5cbiAgICAgIC8vIEFuY2xhbW9zIHNpZW1wcmUsIGluY2x1c28gY3VhbmRvIG5vIGhhZ2EgZmFsdGEgcmVzZXJ2YXI6IGR1cmFudGUgZWxcbiAgICAgIC8vIHR1cm5vIGVsIHNjcm9sbCBubyBzZSBtdWV2ZSBzb2xvIGVuIG5pbmfDum4gY2Fzby5cbiAgICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBxdWVzdGlvbklkXG5cbiAgICAgIGNvbnN0IG9mZnNldCA9IHR1cm5BbmNob3JPZmZzZXQoZWwuY2xpZW50SGVpZ2h0KVxuICAgICAgY29uc3QgdGFyZ2V0U2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgcXVlc3Rpb25Ub3AgLSBvZmZzZXQpXG4gICAgICAvLyBDaGF0IHJlY2nDqW4gaW5pY2lhZG8gbyBjb252ZXJzYWNpw7NuIHF1ZSBhw7puIGVudHJhIGVuIHBhbnRhbGxhOiBsYVxuICAgICAgLy8gcHJlZ3VudGEgeWEgZXN0w6EgYXJyaWJhLCBubyBoYXkgbmFkYSBxdWUgc3ViaXIgbmkgcXVlIHJlc2VydmFyLlxuICAgICAgaWYgKHRhcmdldFNjcm9sbFRvcCA8PSBlbC5zY3JvbGxUb3ApIHtcbiAgICAgICAgc2V0U3BhY2VySGVpZ2h0KDApXG4gICAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIFJlc2VydmFtb3MgbG8gbcOtbmltbyBwYXJhIHF1ZSBgdGFyZ2V0U2Nyb2xsVG9wYCBzZWEgYWxjYW56YWJsZS4gRWxcbiAgICAgIC8vIHNwYWNlciBzZSBpbnNlcnRhIGRlIHVuYSAoZXMgYWx0byByZXNlcnZhZG8sIG5vIGNvbnRlbmlkbyB2aXNpYmxlKTtcbiAgICAgIC8vIGxvIMO6bmljbyBxdWUgc2UgcGVyY2liZSBlcyBlbCBkZXNwbGF6YW1pZW50byBhbmltYWRvLlxuICAgICAgc2V0U3BhY2VySGVpZ2h0KGNvbXB1dGVSZXNlcnZlZFR1cm5TcGFjZShlbC5jbGllbnRIZWlnaHQsIHR1cm5IZWlnaHQsIGVsLmNsaWVudEhlaWdodCkpXG4gICAgICBhbmltYXRlU2Nyb2xsVG8odGFyZ2V0U2Nyb2xsVG9wKVxuICAgIH0sXG4gICAgW21lYXN1cmVUdXJuLCBzZXRTcGFjZXJIZWlnaHQsIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzLCBhbmltYXRlU2Nyb2xsVG9dXG4gIClcblxuICAvKipcbiAgICogRW5jb2dlIGVsIHNwYWNlciBhIG1lZGlkYSBxdWUgY3JlY2UgbGEgcmVzcHVlc3RhOiBlbCBhbHRvIHRvdGFsIGRlbCBzY3JvbGxcbiAgICogcXVlZGEgY29uc3RhbnRlIHkgbGEgdmlzdGEgbm8gc2UgbXVldmUgc29sYS4gU29sbyBhY2hpY2EsIG51bmNhIGFncmFuZGEsXG4gICAqIHBhcmEgbm8gaW55ZWN0YXIgZXNwYWNpbyBlbiB0dXJub3MgcXVlIGFycmFuY2Fyb24gc2luIHJlc2VydmEuXG4gICAqIERldnVlbHZlIHNpIGVsIHR1cm5vIHNpZ3VlIGFuY2xhZG8gKGF1bnF1ZSBlbCBzcGFjZXIgeWEgc2VhIDApLlxuICAgKi9cbiAgY29uc3Qgc3luY1R1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKCgpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQpIHJldHVybiBmYWxzZVxuICAgIGlmIChzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA+IDApIHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVR1cm4oYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudClcbiAgICAgIGlmIChtZWFzdXJlZCkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0dXJuQW5jaG9yT2Zmc2V0KG1lYXN1cmVkLmVsLmNsaWVudEhlaWdodClcbiAgICAgICAgY29uc3QgcmVzZXJ2ZWQgPSBNYXRoLm1heCgwLCBtZWFzdXJlZC5lbC5jbGllbnRIZWlnaHQgLSBtZWFzdXJlZC50dXJuSGVpZ2h0IC0gb2Zmc2V0KVxuICAgICAgICBzZXRTcGFjZXJIZWlnaHQoTWF0aC5taW4oc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQsIHJlc2VydmVkKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfSwgW21lYXN1cmVUdXJuLCBzZXRTcGFjZXJIZWlnaHRdKVxuXG4gIGNvbnN0IGhhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b20gPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgaWYgKCFlbCkgcmV0dXJuXG4gICAgY2xlYXJUdXJuU3BhY2UoKVxuICAgIC8vIE1pc21hIGN1cnZhIHkgZHVyYWNpw7NuIHF1ZSBlbCBhbmNsYWplIGRlbCB0dXJubzogZWwgYHNtb290aGAgbmF0aXZvIGZyZW5hIHNlY28uXG4gICAgYW5pbWF0ZVNjcm9sbFRvKGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodClcbiAgfSwgW2NsZWFyVHVyblNwYWNlLCBhbmltYXRlU2Nyb2xsVG9dKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlVJRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBlLmN1cnJlbnRUYXJnZXRcblxuICAgICAgaWYgKHNjcm9sbFJhZlJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjcm9sbFJhZlJlZi5jdXJyZW50KVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuXG4gICAgICAgIGNvbnN0IGlzU2Nyb2xsaW5nVXAgPSBzY3JvbGxUb3AgPCBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnRcblxuICAgICAgICBpZiAoaXNTY3JvbGxpbmdVcCkge1xuICAgICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMTVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTmVhckJvdHRvbSA9IHNjcm9sbEhlaWdodCAtIHNjcm9sbFRvcCAtIGNsaWVudEhlaWdodCA8IHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50XG5cbiAgICAgICAgaWYgKGlzTmVhckJvdHRvbSkge1xuICAgICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICAgICAgfVxuXG4gICAgICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IHNjcm9sbFRvcFxuXG4gICAgICAgIC8vIFR1cm5vIHlhIGxpYmVyYWRvIHBvciBlbCB1c3VhcmlvOiBzZWd1aW1vcyBkZXZvbHZpZW5kbyBlbCBhbHRvXG4gICAgICAgIC8vIHJlc2VydmFkbyBtaWVudHJhcyBiYWphLCBwYXJhIHF1ZSBhbCBsbGVnYXIgYWwgw7psdGltbyBtZW5zYWplIG5vXG4gICAgICAgIC8vIHF1ZWRlIGh1ZWNvIGRlYmFqby5cbiAgICAgICAgaWYgKCFhbmNob3JlZFR1cm5JZFJlZi5jdXJyZW50KSBkcmFpblR1cm5TcGFjZSgpXG5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuXG4gICAgICAgIGlmIChpbml0aWFsQ2hhdElkICYmIHNjcm9sbFRvcCA+IDApIHtcbiAgICAgICAgICBpZiAoc2Nyb2xsUGVyc2lzdFRpbWVyUmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzY3JvbGxQZXJzaXN0VGltZXJSZWYuY3VycmVudClcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsUGVyc2lzdFRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24oYXV0aFVzZXIuaWQsIHtcbiAgICAgICAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICAgICAgICBzY3JvbGxTZXNzaW9uSWQ6IGluaXRpYWxDaGF0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sIDE1MClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc05lYXJCb3R0b20gJiYgb25TY3JvbGxUb0JvdHRvbSkge1xuICAgICAgICAgIG9uU2Nyb2xsVG9Cb3R0b20oKVxuICAgICAgICB9XG5cbiAgICAgICAgaGFuZGxlU2Nyb2xsKGNvbnRhaW5lcilcbiAgICAgIH0pXG4gICAgfSxcbiAgICBbYXV0aFVzZXIuaWQsIGRyYWluVHVyblNwYWNlLCBoYW5kbGVTY3JvbGwsIGluaXRpYWxDaGF0SWQsIG9uU2Nyb2xsVG9Cb3R0b20sIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXVxuICApXG5cbiAgLy8gcmVmcyB0byBzdGFiaWxpemUgZnVuY3Rpb25zIGFuZCBhdm9pZCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gIGNvbnN0IHNlbmRNZXNzYWdlUmVmID0gdXNlUmVmKHNlbmRNZXNzYWdlKVxuICBjb25zdCBzdG9wR2VuZXJhdGlvblJlZiA9IHVzZVJlZihzdG9wR2VuZXJhdGlvbilcbiAgY29uc3Qgb25TZW5kTWVzc2FnZVJlYWR5UmVmID0gdXNlUmVmKG9uU2VuZE1lc3NhZ2VSZWFkeSlcbiAgY29uc3Qgc2VuZE1lc3NhZ2VQcm94eVJlZiA9IHVzZVJlZihcbiAgICAoXG4gICAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW10sXG4gICAgICBmYXFJZD86IHN0cmluZyxcbiAgICAgIGFnZW50U3VnZ2VzdGlvbklkPzogc3RyaW5nLFxuICAgICAgbWVudGlvbnM/OiBDb250ZXh0TWVudGlvbltdLFxuICAgICAgZnVhSWQ/OiBzdHJpbmcsXG4gICAgICBzY0lkPzogc3RyaW5nXG4gICAgKSA9PiBzZW5kTWVzc2FnZVJlZi5jdXJyZW50KG1lc3NhZ2UsIGF0dGFjaG1lbnRzLCBmYXFJZCwgYWdlbnRTdWdnZXN0aW9uSWQsIG1lbnRpb25zLCBmdWFJZCwgc2NJZClcbiAgKVxuICBjb25zdCBzdG9wR2VuZXJhdGlvblByb3h5UmVmID0gdXNlUmVmKCgpID0+IHN0b3BHZW5lcmF0aW9uUmVmLmN1cnJlbnQoKSlcblxuICAvLyB1cGRhdGUgcmVmcyB3aGVuIGZ1bmN0aW9ucyBjaGFuZ2VcbiAgc2VuZE1lc3NhZ2VSZWYuY3VycmVudCA9IHNlbmRNZXNzYWdlXG4gIHN0b3BHZW5lcmF0aW9uUmVmLmN1cnJlbnQgPSBzdG9wR2VuZXJhdGlvblxuICBvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudCA9IG9uU2VuZE1lc3NhZ2VSZWFkeVxuXG4gIC8qKlxuICAgKiBgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrYCBzZSBwYXNhIGEgVE9ET1MgbG9zIE1lc3NhZ2VJdGVtLCBhc8OtIHF1ZSBzdSBpZGVudGlkYWRcbiAgICogZGVjaWRlIHNpIGVsIGBtZW1vYCBkZSBsYSBsaXN0YSBzb3N0aWVuZS4gTGVlbW9zIHBvciByZWYgbG8gcXVlIGNhbWJpYSBlbiBjYWRhXG4gICAqIHVwZGF0ZSAoYG1lc3NhZ2VzYCwgYHNlbmRNZXNzYWdlYCwgbGFzIHN1Z2VyZW5jaWFzIHlhIGVsZWdpZGFzKSBwYXJhIHF1ZSBlbFxuICAgKiBjYWxsYmFjayBzZWEgZXN0YWJsZTogc2kgbm8sIGFsIHRlcm1pbmFyIGVsIHN0cmVhbSBzZSByZXBpbnRhIGVsIGNoYXQgZW50ZXJvXG4gICAqIHkgY2FkYSBNYWlhU3RyZWFtZG93biB2dWVsdmUgYSBwYXJzZWFyIHN1IG1hcmtkb3duLlxuICAgKi9cbiAgY29uc3QgbWVzc2FnZXNEYXRhUmVmID0gdXNlUmVmKG1lc3NhZ2VzKVxuICBtZXNzYWdlc0RhdGFSZWYuY3VycmVudCA9IG1lc3NhZ2VzXG4gIGNvbnN0IHNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNSZWYgPSB1c2VSZWYoc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcylcbiAgc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZi5jdXJyZW50ID0gc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1xuXG4gIGNvbnN0IGhhbmRsZVN1Z2dlc3Rpb25DbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIChtZXNzYWdlSWQ6IHN0cmluZywgc3VnZ2VzdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIXN1Z2dlc3Rpb24/LnRyaW0oKSkgcmV0dXJuXG4gICAgICBpZiAoc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZi5jdXJyZW50W21lc3NhZ2VJZF0pIHJldHVyblxuICAgICAgY29uc3QgY3VycmVudE1lc3NhZ2VzID0gbWVzc2FnZXNEYXRhUmVmLmN1cnJlbnRcbiAgICAgIGNvbnN0IGlzTWFya2V0cGxhY2VHbG9iYWxBZ2VudCA9IGlzTWFpYWtlckFnZW50KGFnZW50KVxuICAgICAgZXZlbnQoRVZFTlRTLmFpQ2hhdFN1Z2dlc3RlZEFuc3dlciwge1xuICAgICAgICBhZ2VudF90eXBlOiBpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQgPyAnbWFya2V0cGxhY2UnIDogYWdlbnQ/LnR5cGUsXG4gICAgICB9KVxuICAgICAgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyhwcmV2ID0+ICh7IC4uLnByZXYsIFttZXNzYWdlSWRdOiB0cnVlIH0pKVxuXG4gICAgICBjb25zdCB0YXJnZXRNZXNzYWdlID0gY3VycmVudE1lc3NhZ2VzLmZpbmQobXNnID0+IG1zZy5pZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgY29uc3QgaXNSZXRyeVN1Z2dlc3Rpb24gPSAhIXRhcmdldE1lc3NhZ2U/LmlzRXJyb3IgJiYgc3VnZ2VzdGlvbiA9PT0gdCgnY2hhdC5yZXRyeScpXG4gICAgICBpZiAoaXNSZXRyeVN1Z2dlc3Rpb24pIHtcbiAgICAgICAgY29uc3QgbGFzdFVzZXJNZXNzYWdlID0gY3VycmVudE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcihtc2cgPT4gbXNnLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IG1zZy51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpKVxuICAgICAgICAgIC5hdCgtMSlcbiAgICAgICAgaWYgKGxhc3RVc2VyTWVzc2FnZT8ubWVzc2FnZSkge1xuICAgICAgICAgIGNvbnN0IHJldHJ5QXR0YWNobWVudHMgPSBBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZS5hdHRhY2htZW50cylcbiAgICAgICAgICAgID8gbGFzdFVzZXJNZXNzYWdlLmF0dGFjaG1lbnRzXG4gICAgICAgICAgICA6IEFycmF5LmlzQXJyYXkobGFzdFVzZXJNZXNzYWdlLnNvdXJjZXMpXG4gICAgICAgICAgICAgID8gbGFzdFVzZXJNZXNzYWdlLnNvdXJjZXNcbiAgICAgICAgICAgICAgOiBbXVxuICAgICAgICAgIHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQobGFzdFVzZXJNZXNzYWdlLm1lc3NhZ2UsIHJldHJ5QXR0YWNobWVudHMpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VuZE1lc3NhZ2VSZWYuY3VycmVudChzdWdnZXN0aW9uKVxuICAgIH0sXG4gICAgW2V2ZW50LCBhZ2VudCwgdCwgYXV0aFVzZXIuaWRdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudCkge1xuICAgICAgb25TZW5kTWVzc2FnZVJlYWR5UmVmLmN1cnJlbnQoXG4gICAgICAgIHNlbmRNZXNzYWdlUHJveHlSZWYuY3VycmVudCxcbiAgICAgICAgc3RvcEdlbmVyYXRpb25Qcm94eVJlZi5jdXJyZW50LFxuICAgICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICAgIGlzV3JpdGluZ1xuICAgICAgKVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTG9hZGluZ01vcmVSZWYuY3VycmVudCA9IGlzTG9hZGluZ01vcmVNZXNzYWdlc1xuICB9LCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2hhdEluaXRpYWxpemVkUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNoYXRJbml0aWFsaXplZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgaW5pdGlhbGl6ZUNoYXQoKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gTWllbnRyYXMgZWwgc3RyZWFtIGNyZWNlOiBlbmNvZ2VyIGVsIHNwYWNlciBkZWwgdHVybm8gYW5jbGFkbyB5XG4gIC8vIGFjdHVhbGl6YXIgZmxlY2hhL2dyYWRpZW50ZXMuIEVsIHNjcm9sbCBubyBzZSBtdWV2ZSBzb2xvLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghd2FpdGluZ1Jlc3BvbnNlICYmICFpc1dyaXRpbmcpIHJldHVybiB1bmRlZmluZWRcbiAgICBpZiAoIW1lc3NhZ2VzUmVmLmN1cnJlbnQpIHJldHVybiB1bmRlZmluZWRcblxuICAgIGxldCByYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGxcblxuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgIGlmICghZWwpIHtcbiAgICAgICAgcmFmSWQgPSBudWxsXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgc3luY1R1cm5TcGFjZSgpXG4gICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgIH1cblxuICAgIHJhZklkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGlmIChyYWZJZCAhPSBudWxsKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZJZClcbiAgICB9XG4gIH0sIFt3YWl0aW5nUmVzcG9uc2UsIGlzV3JpdGluZywgc3luY1R1cm5TcGFjZSwgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNdKVxuXG4gIGNvbnN0IGxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG5cbiAgLy8gQ2FtYmlvIGRlIGNoYXQ6IGVsIGFuY2xhIHkgZWwgc3BhY2VyIGRlbCB0dXJubyBhbnRlcmlvciBkZWphbiBkZSBhcGxpY2FyLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghbG9hZGluZ01lc3NhZ2VzKSByZXR1cm5cbiAgICBsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGNsZWFyVHVyblNwYWNlKClcbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgY2xlYXJUdXJuU3BhY2VdKVxuXG4gIC8vIEFsIGVudmlhciB1biBtZW5zYWplOiBhbmNsYW1vcyBlbCB0dXJubyB5IGhhY2Vtb3MgZWwgw7puaWNvIHNjcm9sbCBkZWwgY2ljbG8uXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGxvYWRpbmdNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMpIHJldHVyblxuXG4gICAgY29uc3QgcXVlc3Rpb25JZCA9IGZpbmRMYXN0UXVlc3Rpb25JZChtZXNzYWdlcylcbiAgICBpZiAoIXF1ZXN0aW9uSWQgfHwgcXVlc3Rpb25JZCA9PT0gbGFzdFJlc2VydmVkUXVlc3Rpb25SZWYuY3VycmVudCkgcmV0dXJuXG5cbiAgICBsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZi5jdXJyZW50ID0gcXVlc3Rpb25JZFxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNlcnZlVHVyblNwYWNlKHF1ZXN0aW9uSWQpKVxuICB9LCBbbWVzc2FnZXMsIGxvYWRpbmdNZXNzYWdlcywgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLCByZXNlcnZlVHVyblNwYWNlXSlcblxuICAvLyBTY3JvbGwgY3VhbmRvIGNhbWJpYW4gbG9zIG1lbnNhamVzOiBkaXN0aW5ndWUgXCJudWV2byBtZW5zYWplXCIgKGFncmVnYWRvKVxuICAvLyBkZSBcInJlZW1wbGF6b1wiIChtaXNtbyBpZC9sZW5ndGgsIGVqLiBmZWVkYmFjayBvIGFwcHJvdmFsU3RhdHVzKS4gRW5cbiAgLy8gcmVlbXBsYXpvcyBzb2xvIHNlIHJlY2FsY3VsYSBsYSB2aXNpYmlsaWRhZCBkZWwgYm90w7NuIHNpbiBmb3J6YXIgc2Nyb2xsLlxuICBjb25zdCBsYXN0TWVzc2FnZUlkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IGxhc3RNZXNzYWdlc0xlbmd0aFJlZiA9IHVzZVJlZjxudW1iZXI+KDApXG5cbiAgLy8gQWwgY2FtYmlhciBkZSBzZXNpw7NuLCByZXNldGVhciBlc3RhZG8gZGUgc2Nyb2xsIG1hbnVhbCBwYXJhIG5vIGhlcmVkYXIgZWwgY2hhdCBhbnRlcmlvci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGZhbHNlXG4gICAgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID0gbnVsbFxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSAwXG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gMFxuICB9LCBbaW5pdGlhbENoYXRJZF0pXG5cbiAgLy8gUmVzdGF1cmFjacOzbiBkZXNkZSBjYWNoZSAoc2luIExvYWRlcik6IGJhamFyIGFsIGZvbmRvIGFsIHJlYWJyaXIgc2VzacOzbiB2aXNpdGFkYS5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAobG9hZGluZ01lc3NhZ2VzIHx8ICFpbml0aWFsQ2hhdElkIHx8IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG4gICAgaWYgKGxhc3RTY3JvbGxlZFNlc3Npb25SZWYuY3VycmVudCA9PT0gaW5pdGlhbENoYXRJZCkgcmV0dXJuXG4gICAgbGFzdFNjcm9sbGVkU2Vzc2lvblJlZi5jdXJyZW50ID0gaW5pdGlhbENoYXRJZFxuXG4gICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIGxhc3RNZXNzYWdlSWRSZWYuY3VycmVudCA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdPy5pZCA/PyBudWxsXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSBtZXNzYWdlcy5sZW5ndGhcblxuICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICBzY3JvbGxUb0JvdHRvbVJhZih7IGRlbGF5TXM6IDEwMCB9KVxuICB9LCBbaW5pdGlhbENoYXRJZCwgbG9hZGluZ01lc3NhZ2VzLCBtZXNzYWdlcy5sZW5ndGgsIG1lc3NhZ2VzLCBzY3JvbGxUb0JvdHRvbVJhZl0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIW1lc3NhZ2VzUmVmLmN1cnJlbnQgfHwgbG9hZGluZ01lc3NhZ2VzIHx8IGlzTG9hZGluZ01vcmVNZXNzYWdlcyB8fCBpc0xvYWRpbmdNb3JlUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV1cbiAgICBjb25zdCBsYXN0SWQgPSBsYXN0TWVzc2FnZT8uaWQgPz8gbnVsbFxuICAgIGNvbnN0IHByZXZJZCA9IGxhc3RNZXNzYWdlSWRSZWYuY3VycmVudFxuICAgIGNvbnN0IHByZXZMZW4gPSBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudFxuICAgIGxhc3RNZXNzYWdlSWRSZWYuY3VycmVudCA9IGxhc3RJZFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBjb25zdCBpc05ld01lc3NhZ2UgPSBsYXN0SWQgIT09IHByZXZJZCB8fCBtZXNzYWdlcy5sZW5ndGggIT09IHByZXZMZW5cbiAgICBpZiAoIWlzTmV3TWVzc2FnZSkge1xuICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVHVybm8gYW5jbGFkbzogbmkgZWwgcmVlbXBsYXpvIGRlbCBwbGFjZWhvbGRlciBwb3IgZWwgbWVuc2FqZSBmaW5hbCwgbmkgbGFcbiAgICAvLyBhcGFyaWNpw7NuIGRlbCBBcHByb3ZhbEJveCBtdWV2ZW4gZWwgc2Nyb2xsLiBTb2xvIHNlIGFqdXN0YSBlbCBzcGFjZXIuXG4gICAgaWYgKGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzeW5jVHVyblNwYWNlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gTWllbnRyYXMgZWwgYWdlbnRlIHJlc3BvbmRlIG5vIGVtcHVqYW1vcyBlbCBzY3JvbGw6IGVsIHVzdWFyaW8gc2UgcXVlZGFcbiAgICAvLyBkb25kZSBlc3TDoSB5IHVzYSBlbCBib3TDs24gc2kgcXVpZXJlIGlyIGFsIGZvbmRvLlxuICAgIGlmICh3YWl0aW5nUmVzcG9uc2UgfHwgaXNXcml0aW5nKSB7XG4gICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXIgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgY29uc3QgaXNBdEJvdHRvbSA9IGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgLSBjb250YWluZXIuc2Nyb2xsVG9wIDw9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQgKyAxMDBcbiAgICBjb25zdCBoYXNJbml0aWFsTWVzc2FnZSA9IG1lc3NhZ2VzLnNvbWUobXNnID0+IG1zZy5pZCA9PT0gJ3VzZXItaW5pdGlhbC1tZXNzYWdlJylcbiAgICBjb25zdCBpc0FwcHJvdmFsID0gISFsYXN0TWVzc2FnZSAmJiAobGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgnYXBwcm92YWwtJykgfHwgISFsYXN0TWVzc2FnZS5hcHByb3ZhbClcbiAgICBjb25zdCBpc0Fuc3dlck9yUXVlc3Rpb24gPVxuICAgICAgISFsYXN0TWVzc2FnZSAmJiAobGFzdE1lc3NhZ2UuaWQuc3RhcnRzV2l0aCgnYW5zd2VyLScpIHx8IGxhc3RNZXNzYWdlLmlkLnN0YXJ0c1dpdGgoJ3F1ZXN0aW9uLScpKVxuXG4gICAgLy8gTnVldm9zIGFuc3dlci9xdWVzdGlvbjogc2Nyb2xsIHNpIGVsIHVzdWFyaW8geWEgZXN0YWJhIGFsIGZvbmRvLlxuICAgIGlmIChpc0Fuc3dlck9yUXVlc3Rpb24gJiYgaXNBdEJvdHRvbSkge1xuICAgICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2FzbyBib3JkZTogY2FtYmlvcyBkZSBtZW5zYWplcyBzaW4gc2VyIG51ZXZvIGFuc3dlci91c2VyL2FwcHJvdmFsXG4gICAgLy8gcGVybyBzw60gdW4gbWVuc2FqZSBudWV2byAobm8gZWwgXCJ1c2VyLWluaXRpYWwtbWVzc2FnZVwiKS4gU2Nyb2xsZWEuXG4gICAgaWYgKCFpc0Fuc3dlck9yUXVlc3Rpb24gJiYgIWlzQXBwcm92YWwgJiYgIWhhc0luaXRpYWxNZXNzYWdlICYmIG1lc3NhZ2VzLmxlbmd0aCA+IHByZXZMZW4pIHtcbiAgICAgIHNjcm9sbFRvQm90dG9tUmFmKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgfSwgW1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBzY3JvbGxUb0JvdHRvbVJhZixcbiAgICBzeW5jVHVyblNwYWNlLFxuICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzLFxuICBdKVxuXG4gIC8vIEFsIGFicmlyL2NhcmdhciB1bmEgY29udmVyc2FjacOzbiBlbCBjb250ZW5lZG9yIHNlIHJlbW9udGEgKExvYWRlciDihpIgbGlzdGEpIGNvblxuICAvLyBzY3JvbGxUb3A9MC4gRm9yemFtb3MgaXIgYWwgZm9uZG8gYWwgdGVybWluYXIgbG9hZE1lc3NhZ2VzLCBzaW4gYWZlY3RhciBwYWdpbmFjacOzbiBoYWNpYSBhcnJpYmEuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QganVzdEZpbmlzaGVkTG9hZGluZyA9IHdhc0xvYWRpbmdNZXNzYWdlc1JlZi5jdXJyZW50ICYmICFsb2FkaW5nTWVzc2FnZXNcbiAgICB3YXNMb2FkaW5nTWVzc2FnZXNSZWYuY3VycmVudCA9IGxvYWRpbmdNZXNzYWdlc1xuXG4gICAgaWYgKCFqdXN0RmluaXNoZWRMb2FkaW5nIHx8IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkID8/IG51bGxcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgIHNjcm9sbFRvQm90dG9tUmFmKHsgZGVsYXlNczogMTAwIH0pXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aCwgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIC8vIEVzdGFkbyBpbmljaWFsIGRlbCBib3TDs24gc2Nyb2xsLXRvLWJvdHRvbSBhbCB0ZXJtaW5hciBsb2FkaW5nTWVzc2FnZXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFsb2FkaW5nTWVzc2FnZXMpIHtcbiAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICB9XG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aCwgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNdKVxuXG4gIC8vIE9idGVuZXIgZWwgw7psdGltbyBtZW5zYWplIGRlbCB1c3VhcmlvIHBhcmEgdmVyaWZpY2FyIHNpIHRpZW5lIGF0dGFjaG1lbnRzXG4gIGNvbnN0IGxhc3RVc2VyTWVzc2FnZSA9IG1lc3NhZ2VzXG4gICAgLmZpbHRlcihtc2cgPT4gbXNnLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IG1zZy51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpKVxuICAgIC5hdCgtMSlcblxuICBjb25zdCBhdHRhY2htZW50c0NvdW50ID1cbiAgICAoQXJyYXkuaXNBcnJheShsYXN0VXNlck1lc3NhZ2U/LmF0dGFjaG1lbnRzKSA/IGxhc3RVc2VyTWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGggOiAwKSB8fFxuICAgIChBcnJheS5pc0FycmF5KGxhc3RVc2VyTWVzc2FnZT8uc291cmNlcykgPyBsYXN0VXNlck1lc3NhZ2Uuc291cmNlcy5sZW5ndGggOiAwKVxuXG4gIGNvbnN0IHN0cmVhbUxvYWRpbmdEaXNwbGF5ID0gcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5KHtcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBhY3RpdmVMb2FkaW5nczogYWN0aXZlTG9hZGluZ3MgfHwge30sXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV2ViU2VhcmNoQWN0aXZlLFxuICAgIGlzRGVlcFNlYXJjaEFjdGl2ZSxcbiAgICBoYXNBdHRhY2htZW50czogQm9vbGVhbihhdHRhY2htZW50c0NvdW50KSxcbiAgICBhdHRhY2htZW50c0NvdW50LFxuICAgIHQsXG4gIH0pXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWluaXRpYWxDaGF0SWQpIHtcbiAgICAgIHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHJlYWRNYWlhUGFuZWxTZXNzaW9uKGF1dGhVc2VyLmlkKVxuICAgIGlmIChzZXNzaW9uPy5zY3JvbGxTZXNzaW9uSWQgPT09IGluaXRpYWxDaGF0SWQgJiYgdHlwZW9mIHNlc3Npb24uc2Nyb2xsVG9wID09PSAnbnVtYmVyJyAmJiBzZXNzaW9uLnNjcm9sbFRvcCA+IDApIHtcbiAgICAgIHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnQgPSBzZXNzaW9uLnNjcm9sbFRvcFxuICAgIH1cbiAgfSwgW2F1dGhVc2VyLmlkLCBpbml0aWFsQ2hhdElkXSlcblxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2FkaW5nTWVzc2FnZXMgfHwgcGVuZGluZ1Njcm9sbFJlc3RvcmVSZWYuY3VycmVudCA9PSBudWxsIHx8ICFtZXNzYWdlc1JlZi5jdXJyZW50KSByZXR1cm5cbiAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnRcbiAgICBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZi5jdXJyZW50XG4gICAgcGVuZGluZ1Njcm9sbFJlc3RvcmVSZWYuY3VycmVudCA9IG51bGxcbiAgfSwgW2xvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoXSlcblxuICAvLyBBbCBleHBhbmRpci9jb250cmFlciBlbCBtb2RhbCBlbCByZWYgcGFzYSBhIG90cm8gY29udGVuZWRvciAoc2Nyb2xsVG9wIHNlIHJlc2V0ZWEgYSAwKS5cbiAgLy8gUmVzdGF1cmFyIGxhIHBvc2ljacOzbiBkZSBzY3JvbGwgYW50ZXMgZGVsIHBhaW50IHBhcmEgZXZpdGFyIHF1ZSBsYSBjb252ZXJzYWNpw7NuIHNhbHRlIGFycmliYS5cbiAgY29uc3QgZXhwYW5kZWRSZWYgPSB1c2VSZWYoZXhwYW5kZWQpXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGV4cGFuZGVkUmVmLmN1cnJlbnQgIT09IGV4cGFuZGVkICYmIG1lc3NhZ2VzUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHNhdmVkU2Nyb2xsVG9wID0gbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50LnNjcm9sbFRvcCA9IHNhdmVkU2Nyb2xsVG9wXG4gICAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwYW5kZWRSZWYuY3VycmVudCA9IGV4cGFuZGVkXG4gICAgfVxuICB9LCBbZXhwYW5kZWRdKVxuXG4gIGlmIChsb2FkaW5nTWVzc2FnZXMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPEZhZGUgZmlsbD5cbiAgICAgICAgPExvYWRlciAvPlxuICAgICAgPC9GYWRlPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IGxhc3RNZXNzYWdlID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV1cbiAgY29uc3QgaGFzTWVzc2FnZUxldmVsSW5kaWNhdG9yID1cbiAgICAhIWxhc3RNZXNzYWdlICYmIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQobGFzdE1lc3NhZ2UuaWQpICYmICh3YWl0aW5nUmVzcG9uc2UgfHwgaXNXcml0aW5nKVxuXG4gIGNvbnN0IG1lc3NhZ2VzQ29udGVudCA9IChcbiAgICA8PlxuICAgICAge2lzTG9hZGluZ01vcmVNZXNzYWdlcyAmJiA8TG9hZGluZ1RleHQgdGV4dD17dCgnY2hhdC5sb2FkaW5nTW9yZScpfSAvPn1cbiAgICAgIDw+XG4gICAgICAgIHttZXNzYWdlcy5tYXAoKG1lc3NhZ2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBc3Npc3RhbnRNZXNzYWdlID0gbWVzc2FnZS5yb2xlID09PSBDaGF0SGlzdG9yeVJvbGUuQVNTSVNUQU5UIHx8IG1lc3NhZ2UudXNlci5pZCA9PT0gJ2Fzc2lzdGFudCdcbiAgICAgICAgICBjb25zdCBpc0xhc3RNZXNzYWdlID0gaW5kZXggPT09IG1lc3NhZ2VzLmxlbmd0aCAtIDFcbiAgICAgICAgICBjb25zdCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyID1cbiAgICAgICAgICAgIGlzQXNzaXN0YW50TWVzc2FnZSAmJiBpc0xhc3RNZXNzYWdlICYmIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXJNZXNzYWdlSWQobWVzc2FnZS5pZClcbiAgICAgICAgICBjb25zdCBpc1N0cmVhbWluZyA9IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgJiYgKHdhaXRpbmdSZXNwb25zZSB8fCBpc1dyaXRpbmcpXG5cbiAgICAgICAgICAvLyBObyBmaWx0cmFyIGVsIHBsYWNlaG9sZGVyIGRlbCBtZW5zYWplIGVuIHN0cmVhbWluZzogc3UgdGV4dG8gdml2ZVxuICAgICAgICAgIC8vIGVuIGVsIHN0cmVhbWluZ1N0b3JlIHkgYG1lc3NhZ2UubWVzc2FnZWAgZXMgJycgaGFzdGEgZWwgY29tcGxldGUuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgJiZcbiAgICAgICAgICAgICFpc1N0cmVhbWluZyAmJlxuICAgICAgICAgICAgIShtZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggfHwgbWVzc2FnZS5zb3VyY2VzPy5sZW5ndGgpICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5tZXNzYWdlICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5wcm9qZWN0Py5uYW1lICYmXG4gICAgICAgICAgICAhbWVzc2FnZS5hcHByb3ZhbFxuICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBudWxsXG5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlRmVlZGJhY2sgPVxuICAgICAgICAgICAgbWVzc2FnZT8ud2FzSGVscGZ1bCA9PT0gdW5kZWZpbmVkIHx8IG1lc3NhZ2Uud2FzSGVscGZ1bCA9PT0gbnVsbFxuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLndhc0hlbHBmdWxcbiAgICAgICAgICAgICAgICA/IEZlZWRiYWNrLlRIVU1CU19VUFxuICAgICAgICAgICAgICAgIDogRmVlZGJhY2suVEhVTUJTX0RPV05cblxuICAgICAgICAgIC8vIEtleSBlc3RhYmxlOiBzb2xvIG1lc3NhZ2UuaWQgcGFyYSBldml0YXIgcmVtb3VudCBkdXJhbnRlIHN0cmVhbWluZyAobWVzc2FnZS5kYXRlIHB1ZWRlIGNhbWJpYXIpXG4gICAgICAgICAgY29uc3QgbWVzc2FnZUtleSA9IG1lc3NhZ2UuaWQgPz8gYG1zZy0ke2luZGV4fWBcblxuICAgICAgICAgIGNvbnN0IHR1cm5JZCA9IHJlc29sdmVSZXRyeVR1cm5JZChtZXNzYWdlKVxuICAgICAgICAgIGNvbnN0IHVzZXJNZXNzYWdlRm9yUmV0cnkgPSBmaW5kVXNlck1lc3NhZ2VGb3JSZXRyeShtZXNzYWdlcywgbWVzc2FnZSlcbiAgICAgICAgICBjb25zdCBjYW5SZXRyeSA9XG4gICAgICAgICAgICAhIXVzZXJNZXNzYWdlRm9yUmV0cnkgJiZcbiAgICAgICAgICAgICFpc1N0cmVhbWluZyAmJlxuICAgICAgICAgICAgIW1lc3NhZ2UuaXNFcnJvciAmJlxuICAgICAgICAgICAgIW1lc3NhZ2UuYXBwcm92YWwgJiZcbiAgICAgICAgICAgIChtZXNzYWdlLmlzRnJvbnRlbmRDYW5jZWxsZWQgfHwgKCFtZXNzYWdlLmlzX2NhbmNlbGxlZCAmJiAhIXR1cm5JZCkpXG5cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPE1lc3NhZ2VJdGVtXG4gICAgICAgICAgICAgIHsuLi5tZXNzYWdlfVxuICAgICAgICAgICAgICBrZXk9e21lc3NhZ2VLZXl9XG4gICAgICAgICAgICAgIGF1dGhVc2VyPXthdXRoVXNlcn1cbiAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0T3B0aW9uPXtoYW5kbGVTZWxlY3RPcHRpb259XG4gICAgICAgICAgICAgIGhhbmRsZUZlZWRiYWNrPXtoYW5kbGVGZWVkYmFja31cbiAgICAgICAgICAgICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbj17aGFuZGxlQXBwcm92YWxEZWNpc2lvbn1cbiAgICAgICAgICAgICAgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrPXtoYW5kbGVTdWdnZXN0aW9uQ2xpY2t9XG4gICAgICAgICAgICAgIGhhbmRsZVJldHJ5PXtjYW5SZXRyeSA/ICgpID0+IHJldHJ5TWVzc2FnZShtZXNzYWdlKSA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgaGFzU2VsZWN0ZWRTdWdnZXN0aW9uPXshIXNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNbbWVzc2FnZS5pZF19XG4gICAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17bWVzc2FnZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBpc1N0cmVhbWluZz17aXNTdHJlYW1pbmd9XG4gICAgICAgICAgICAgIGlzTGFzdE1lc3NhZ2U9e2lzTGFzdE1lc3NhZ2V9XG4gICAgICAgICAgICAgIGV4cGFuZGVkPXtleHBhbmRlZH1cbiAgICAgICAgICAgICAgc3RyZWFtQWN0aXZpdHk9e2lzU3RyZWFtaW5nID8gc3RyZWFtTG9hZGluZ0Rpc3BsYXkgOiBudWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApXG4gICAgICAgIH0pfVxuICAgICAgPC8+XG4gICAgICB7IWhhc01lc3NhZ2VMZXZlbEluZGljYXRvciAmJiBzdHJlYW1Mb2FkaW5nRGlzcGxheSAmJiAoXG4gICAgICAgIDxTQ0xvYWRpbmdNZXNzYWdlc0NvbHVtbj5cbiAgICAgICAgICA8QWdlbnRBY3Rpdml0eUluZGljYXRvciBhY3Rpdml0eT17c3RyZWFtTG9hZGluZ0Rpc3BsYXl9IC8+XG4gICAgICAgIDwvU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4+XG4gICAgICApfVxuICAgICAgey8qIEVzcGFjaW8gcXVlIGxlIHBlcm1pdGUgYSBsYSBwcmVndW50YSBzdWJpciBhbCB0b3BlLiBBbHR1cmEgbWFuZWphZGFcbiAgICAgICAgICBpbXBlcmF0aXZhbWVudGUgZGVzZGUgYHNldFNwYWNlckhlaWdodGA7IGFycmFuY2EgZW4gMC4gKi99XG4gICAgICA8U0NUdXJuU3BhY2VyIHJlZj17c3BhY2VyRWxSZWZ9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgPC8+XG4gIClcblxuICByZXR1cm4gKFxuICAgIC8vIFNpIGVsIHVzdWFyaW8gbXVldmUgZWwgc2Nyb2xsIGFib3J0YW1vcyBsYSBhbmltYWNpw7NuIHkgc29sdGFtb3MgZWwgdHVybm86XG4gICAgLy8gbm8gbGUgcGVsZWFtb3MgZWwgY29udHJvbCBkZWwgY29udGVuZWRvci5cbiAgICA8U0NNZXNzYWdlc091dGVyIG9uV2hlZWw9e2hhbmRsZU1lc3NhZ2VzT3V0ZXJXaGVlbH0gb25Ub3VjaFN0YXJ0PXtoYW5kbGVVc2VyU2Nyb2xsSW50ZW50fT5cbiAgICAgIDxTQ01lc3NhZ2VzR3JhZGllbnRUb3AgJHNob3c9e3Nob3dUb3BHcmFkaWVudH0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgIDxTQ01lc3NhZ2VzU2Nyb2xsIHJlZj17bWVzc2FnZXNSZWZ9IG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgJHNraXBFbnRlcj17c2tpcEVudGVyQW5pbWF0aW9ufT57bWVzc2FnZXNDb250ZW50fTwvU0NNZXNzYWdlc0lubmVyPlxuICAgICAgPC9TQ01lc3NhZ2VzU2Nyb2xsPlxuXG4gICAgICA8U0NNZXNzYWdlc0dyYWRpZW50Qm90dG9tICRzaG93PXtzaG93Qm90dG9tR3JhZGllbnR9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG5cbiAgICAgIHtzaG93U2Nyb2xsVG9Cb3R0b20gJiYgKFxuICAgICAgICA8U2Nyb2xsVG9Cb3R0b21CdXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9e2hhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b219PlxuICAgICAgICAgIDxTQ1Njcm9sbEljb25Td2FwICR2aXNpYmxlPXtpc1dyaXRpbmd9IGFyaWEtaGlkZGVuPlxuICAgICAgICAgICAgPFNDV3JpdGluZ0RvdHM+XG4gICAgICAgICAgICAgIDxzcGFuIC8+XG4gICAgICAgICAgICAgIDxzcGFuIC8+XG4gICAgICAgICAgICAgIDxzcGFuIC8+XG4gICAgICAgICAgICA8L1NDV3JpdGluZ0RvdHM+XG4gICAgICAgICAgPC9TQ1Njcm9sbEljb25Td2FwPlxuICAgICAgICAgIDxTQ1Njcm9sbEljb25Td2FwICR2aXNpYmxlPXshaXNXcml0aW5nfSBhcmlhLWhpZGRlbj5cbiAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPXsxMn0gaGVpZ2h0PXsxMn0gZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjMjAyMDIwXCJcbiAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoPXsxLjV9XG4gICAgICAgICAgICAgICAgZD1cIk02IC43NXYxMC41TS43NSA2IDYgMTEuMjUgMTEuMjUgNlwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8L1NDU2Nyb2xsSWNvblN3YXA+XG4gICAgICAgIDwvU2Nyb2xsVG9Cb3R0b21CdXR0b24+XG4gICAgICApfVxuICAgIDwvU0NNZXNzYWdlc091dGVyPlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBDaGF0QUlNZXNzYWdlcyA9IFJlYWN0Lm1lbW8oQ2hhdEFJTWVzc2FnZXNJbm5lcilcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU9BLEtBQUssSUFBUUMsSUFBSSxFQUFhQyxXQUFXLEVBQUVDLFNBQVMsRUFBRUMsZUFBZSxFQUFFQyxNQUFNLEVBQUVDLFFBQVEsRUFBQUMsYUFBQSxJQUFBQyxjQUFBLFFBQVEsT0FBTztBQUU3RyxTQUFTQyxjQUFjLFFBQVEsMkNBQTJDO0FBQzFFLFNBQVNDLFdBQVcsUUFBUSxxQ0FBcUM7QUFDakUsU0FBU0Msc0JBQXNCLFFBQVEsb0NBQW9DO0FBQzNFLFNBQVNDLG1CQUFtQixRQUFRLGdEQUFnRDtBQUNwRixTQUFTQyxjQUFjLFFBQVEsNEJBQTRCO0FBRzNELFNBQXNCQyxlQUFlLFFBQVEscUJBQXFCO0FBQ2xFLFNBQVNDLHNCQUFzQixFQUFFQyxnQkFBZ0IsUUFBUSxzQ0FBc0M7QUFFL0YsU0FBU0MsY0FBYyxRQUFRLGlDQUFpQztBQUNoRSxTQUFrQkMsT0FBTyxRQUFRLDJCQUEyQjtBQUU1RCxTQUFTQyxJQUFJLFFBQVEscUJBQXFCO0FBQzFDLFNBQVNDLGNBQWMsUUFBUSw4Q0FBOEM7QUFDN0UsU0FBU0MsbUJBQW1CLFFBQVEsb0NBQW9DO0FBQ3hFLFNBQVNDLG1CQUFt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
|
|
1099
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIm1lbW8iLCJ1c2VDYWxsYmFjayIsInVzZUVmZmVjdCIsInVzZUxheW91dEVmZmVjdCIsInVzZVJlZiIsInVzZVN0YXRlIiwiY3JlYXRlRWxlbWVudCIsIl9jcmVhdGVFbGVtZW50IiwiQXR0YWNobWVudENhcmQiLCJBcHByb3ZhbEJveCIsIkF0dGFjaG1lbnRQcmV2aWV3TW9kYWwiLCJBdHRhY2htZW50Q2FyZEF1ZGlvIiwiTWFpYVN0cmVhbWRvd24iLCJDaGF0SGlzdG9yeVJvbGUiLCJyZW5kZXJUZXh0V2l0aE1lbnRpb25zIiwiaGFzSW5saW5lTWFya2VycyIsImlzTWFpYWtlckFnZW50IiwidXNlVXNlciIsInVzZVQiLCJ1c2VDaGF0TWFuYWdlciIsInVzZVNtb290aFN0cmVhbVRleHQiLCJ1c2VTdHJlYW1pbmdNZXNzYWdlIiwiTG9hZGluZ1RleHQiLCJBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIiwiUmVhc29uaW5nQmxvY2siLCJzaG91bGRTdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lIiwiUmVhc29uaW5nVGltZWxpbmUiLCJTQ1RpbWVsaW5lSW5kaWNhdG9yIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCIsInJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSIsInJlc29sdmVSZXRyeVR1cm5JZCIsImZpbmRVc2VyTWVzc2FnZUZvclJldHJ5IiwidXNlUmVhc29uaW5nVHJhY2UiLCJMb2FkZXIiLCJGYWRlIiwicGF0Y2hNYWlhUGFuZWxTZXNzaW9uIiwicmVhZE1haWFQYW5lbFNlc3Npb24iLCJNZXNzYWdlRnJvbVVzZXIiLCJNZXNzYWdlRnJvbU90aGVyIiwiTWVzc2FnZUNvbnRlbnRGcm9tVXNlciIsIk1lc3NhZ2VDb250ZW50RnJvbU90aGVyIiwiTWVzc2FnZUZlZWRiYWNrIiwiU0NDQUlNZXNzYWdlV3JhcHBlciIsIlNjcm9sbFRvQm90dG9tQnV0dG9uIiwiU0NTY3JvbGxJY29uU3dhcCIsIlNDV3JpdGluZ0RvdHMiLCJTQ01lc3NhZ2VzT3V0ZXIiLCJTQ01lc3NhZ2VzU2Nyb2xsIiwiU0NNZXNzYWdlc0lubmVyIiwiU0NUdXJuU3BhY2VyIiwiU0NPcHRpb25zTGlzdCIsIlNDT3B0aW9uSXRlbSIsIlNDTWVzc2FnZUl0ZW1XcmFwcGVyIiwiU0NNZXNzYWdlSXRlbUlubmVyIiwiU0NBdHRhY2htZW50c1JvdyIsIlNDQXBwcm92YWxBY3Rpb25zQ29sdW1uIiwiU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4iLCJTQ01lc3NhZ2VzR3JhZGllbnRUb3AiLCJTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20iLCJ1c2VHbG9iYWxDb250ZXh0IiwiRW50aXR5TGlua0N1c3RvbUxpbmsiLCJnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZSIsIkNoYXRBSVN1Z2dlc3Rpb25zIiwiQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zIiwiRVZFTlRTIiwidXNlRXZlbnQiLCJkb3dubG9hZEZpbGVGcm9tVXJsIiwiY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3IiwiY2FuUmV0cnlBc3Npc3RhbnRNZXNzYWdlIiwiY29tcHV0ZURpc3RhbmNlRnJvbUJvdHRvbSIsImNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UiLCJjb21wdXRlU3luY2VkVHVyblNwYWNlckhlaWdodCIsImNvbXB1dGVUdXJuU2Nyb2xsRHVyYXRpb25NcyIsImNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wIiwiY291bnRVc2VyTWVzc2FnZUF0dGFjaG1lbnRzIiwiZWFzZU91dEV4cG9TY3JvbGxQcm9ncmVzcyIsImV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCIsImZpbmRMYXN0UXVlc3Rpb25JZCIsImhhc0luaXRpYWxVc2VyTWVzc2FnZUluTGlzdCIsImhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvciIsImlzQWN0aXZlU3RyZWFtaW5nU3RhdGUiLCJpc0Fuc3dlck9yUXVlc3Rpb25DaGF0TWVzc2FnZUlkIiwiaXNBcHByb3ZhbENoYXRNZXNzYWdlIiwiaXNBc3Npc3RhbnRDaGF0TWVzc2FnZSIsImlzQXVkaW9BdHRhY2htZW50IiwiaXNDdXJyZW50VXNlck1lc3NhZ2UiLCJpc05ld0NoYXRNZXNzYWdlRXZlbnQiLCJpc1JldHJ5U3VnZ2VzdGlvblNlbGVjdGlvbiIsInJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3kiLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkRmlsZU5hbWUiLCJyZXNvbHZlQXR0YWNobWVudERvd25sb2FkVXJsIiwicmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzIiwicmVzb2x2ZURpc2FibGVGZWVkYmFja0Zyb21XYXNIZWxwZnVsIiwicmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyIsInJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlIiwic2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2UiLCJzaG91bGRIaWRlQXNzaXN0YW50U3VnZ2VzdGlvbnMiLCJzaG91bGRIaWRlRW1wdHlTdHJlYW1pbmdCb2R5Iiwic2hvdWxkSWdub3JlU3VnZ2VzdGlvbkNsaWNrIiwic2hvdWxkT3Blbk1lc3NhZ2VPcHRpb24iLCJzaG91bGRSZWxlYXNlVHVyblNwYWNlIiwic2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2siLCJzaG91bGRSZW5kZXJBc3Npc3RhbnRTdWdnZXN0aW9ucyIsInNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlIiwic2hvdWxkUmVuZGVyQ3JlYXRlQWdlbnRBY3Rpb25zIiwic2hvdWxkUmVuZGVyTWVzc2FnZVRleHRCb2R5Iiwic2hvdWxkU2hvd0FwcHJvdmFsQWN0aW9ucyIsInNob3VsZFNob3dCb3R0b21TY3JvbGxHcmFkaWVudCIsInNob3VsZFNob3dHbG9iYWxTdHJlYW1Mb2FkaW5nSW5kaWNhdG9yIiwic2hvdWxkU2hvd01lc3NhZ2VBdHRhY2htZW50c1JvdyIsInNob3VsZFNob3dTY3JvbGxUb0JvdHRvbSIsInNob3VsZFNob3dTdHJlYW1BY3Rpdml0eUluZGljYXRvciIsInNob3VsZFNob3dTdHJlYW1pbmdNZXNzYWdlQm9keSIsInNob3VsZFNob3dUb3BTY3JvbGxHcmFkaWVudCIsInNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSIsInNob3VsZFNraXBUdXJuU2Nyb2xsQW5pbWF0aW9uIiwic2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3QiLCJzaG91bGRVcGRhdGVTcGFjZXJIZWlnaHQiLCJidWlsZFNtb290aFN0cmVhbVRleHRPcHRpb25zIiwiY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0IiwiZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzIiwicHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lIiwicmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzIiwicmVzb2x2ZVJlc2VydmVUdXJuU3BhY2VQbGFuIiwicmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wIiwicmVzb2x2ZUNvbnRhaW5lckF0Qm90dG9tIiwicmVzb2x2ZUNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQiLCJyZXNvbHZlRmVlZGJhY2tQcm9wc0ZvckNhbmNlbGxlZCIsInJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyIsInJlc29sdmVNZXNzYWdlTGlzdEl0ZW1LZXkiLCJyZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uIiwicmVzb2x2ZVJlYXNvbmluZ1RyYWNlSG9va0lkIiwicmVzb2x2ZVNjcm9sbE9uUGFyZW50TW9kZSIsInJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkIiwicmVzb2x2ZVN0cmVhbWluZ1Jhd1RleHQiLCJyZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZCIsInJlc29sdmVTdWdnZXN0aW9uQW5hbHl0aWNzQWdlbnRUeXBlIiwic2hvdWxkQXBwbHlQZW5kaW5nU2Nyb2xsUmVzdG9yZSIsInNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24iLCJzaG91bGRDbGVhclNjcm9sbFJlc3RvcmVXaXRob3V0Q2hhdCIsInNob3VsZEluaXRpYWxpemVDaGF0Iiwic2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzIiwic2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UiLCJzaG91bGRSdW5TZXNzaW9uQ2FjaGVTY3JvbGxUb0JvdHRvbSIsInNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24iLCJzaG91bGRTY3JvbGxUb0JvdHRvbUFmdGVyTG9hZCIsInNob3VsZFNraXBNZXNzYWdlc1Njcm9sbEVmZmVjdCIsInNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kIiwianN4IiwiX2pzeCIsIkZyYWdtZW50IiwiX0ZyYWdtZW50IiwianN4cyIsIl9qc3hzIiwiTWVzc2FnZVdyYXBwZXIiLCJfcmVmIiwiaXNDdXJyZW50VXNlciIsImNoaWxkcmVuIiwicHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMiLCJfZXhjbHVkZWQiLCJNZXNzYWdlQ29tcG9uZW50IiwiX29iamVjdFNwcmVhZCIsIk1lc3NhZ2VDb250ZW50V3JhcHBlciIsIl9yZWYyIiwiX2V4Y2x1ZGVkMiIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiTWVzc2FnZU9wdGlvbnMiLCJfcmVmMyIsIm9wdGlvbnMiLCJoYW5kbGVTZWxlY3RPcHRpb24iLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwiX3NsaWNlZFRvQXJyYXkiLCJzZWxlY3RlZE9wdGlvbiIsInNldFNlbGVjdGVkT3B0aW9uIiwiaGFuZGxlU2VsZWN0Iiwib3B0aW9uIiwibWFwIiwiJGhhc1NlbGVjdGlvbiIsIiRkaW1tZWQiLCJpZCIsIm9uQ2xpY2siLCJuYW1lIiwiU3RyZWFtaW5nTWVzc2FnZUJvZHkiLCJfcHJvcHMkc3VnZ2VzdGlvbnMkbGUiLCJfcHJvcHMkc3VnZ2VzdGlvbnMiLCJzdHJlYW1pbmdUZXh0IiwiaXNTdHJlYW1pbmciLCJtZXNzYWdlSWQiLCJyYXdUZXh0IiwibWVzc2FnZSIsIndpbkZsYWdzIiwiZGlzcGxheVRleHQiLCJjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkIiwiY3JlYXRlQWdlbnRGb2xsb3dVcCIsImhhc01lbnRpb25zIiwibWVudGlvbk5vZGVzIiwiaXNGcm9udGVuZENhbmNlbGxlZCIsImNsYXNzTmFtZSIsInN0eWxlIiwiZGlzcGxheSIsInZhcmlhbnQiLCJjb21wb25lbnRzIiwiYSIsImlzQW5pbWF0aW5nIiwiaXNBc3Npc3RhbnQiLCJpc0Vycm9yIiwiYXBwcm92YWwiLCJvblJldHJ5IiwiY29udGVudCIsInNvdXJjZXMiLCJoYW5kbGVGZWVkYmFja0NsaWNrIiwiZGlzYWJsZUZlZWRiYWNrIiwic3VnZ2VzdGlvbnNMZW5ndGgiLCJzdWdnZXN0aW9ucyIsImxlbmd0aCIsIm9uU2VsZWN0U3VnZ2VzdGlvbiIsInN1Z2dlc3Rpb24iLCJoYW5kbGVTdWdnZXN0aW9uQ2xpY2siLCJkaXNhYmxlZCIsInN1Z2dlc3Rpb25zRGlzYWJsZWQiLCJoaWRkZW4iLCJpc0xhc3RNZXNzYWdlIiwiYWdlbnRJZCIsIk1lc3NhZ2VJdGVtIiwiX3Byb3BzJHJlYXNvbmluZyIsIl9wcm9wcyRwcm9qZWN0TWV0YWRhdCIsInVzZXIiLCJhdXRoVXNlciIsImlzQ2hhbmdlUHJvamVjdCIsImhhbmRsZUZlZWRiYWNrIiwiaGFuZGxlQXBwcm92YWxEZWNpc2lvbiIsImhhbmRsZVJldHJ5Iiwicm9sZSIsImF0dGFjaG1lbnRzIiwiYXBwcm92YWxTdGF0dXMiLCJoYXNTZWxlY3RlZFN1Z2dlc3Rpb24iLCJzdHJlYW1BY3Rpdml0eSIsIl91c2VTdGF0ZTMiLCJfdXNlU3RhdGU0IiwicHJldmlld0F0dGFjaG1lbnQiLCJzZXRQcmV2aWV3QXR0YWNobWVudCIsInRvU3RyaW5nIiwiaXNTdHJlYW1pbmdQbGFjZWhvbGRlciIsIkJvb2xlYW4iLCJpc0FjdGl2ZVN0cmVhbWluZyIsImhhc1N0cmVhbVRleHQiLCJyZWFzb25pbmdUcmFjZSIsInN0cmVhbU5hcnJhdGlvbkluVGltZWxpbmUiLCJzdGVwcyIsInNob3dTdHJlYW1pbmdCb2R5Iiwic2hvd0FjdGl2aXR5SW5kaWNhdG9yIiwibWVzc2FnZUF0dGFjaG1lbnRzIiwiaGFuZGxlQXR0YWNobWVudENsaWNrIiwiYXR0YWNobWVudCIsImhhbmRsZUNsb3NlUHJldmlldyIsImhhbmRsZUF0dGFjaG1lbnREb3dubG9hZCIsIl9yZWY0IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJmaWxlTmFtZSIsImZpbGVVcmwiLCJibG9iVXJsIiwiZG93bmxvYWRTdHJhdGVneSIsImRvd25sb2FkZWRGaWxlIiwibGluayIsIl90Iiwid3JhcCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJmaWxlIiwidHlwZSIsInNlbnQiLCJVUkwiLCJjcmVhdGVPYmplY3RVUkwiLCJGaWxlIiwiYWJydXB0IiwiZG9jdW1lbnQiLCJocmVmIiwiZG93bmxvYWQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjbGljayIsInNldFRpbWVvdXQiLCJyZW1vdmVDaGlsZCIsInJldm9rZU9iamVjdFVSTCIsImNvbnNvbGUiLCJlcnJvciIsInN0b3AiLCJfeCIsImFwcGx5IiwiYXJndW1lbnRzIiwiaGFzRmVlZGJhY2siLCIkaXNBc3Npc3RhbnQiLCJtZXNzYWdlRXh0cmFDb250ZW50IiwiZmVlZGJhY2siLCJ0cmFjZSIsInJlYXNvbmluZyIsImluZGV4IiwiY29uY2F0IiwicG9zaXRpb25JbmRleCIsIm9uRG93bmxvYWQiLCJtZXNzYWdlVGV4dCIsImF0dGFjaG1lbnRDb3VudCIsImFjdGl2aXR5IiwiY29tcGFjdCIsImFjdGlvbnMiLCJwZW5kaW5nX2FjdGlvbnMiLCJzdGF0dXMiLCJvbkFwcHJvdmUiLCJ0aHJlYWRJZHMiLCJtZXRhZGF0YSIsInVuZGVmaW5lZCIsIm9uUmVqZWN0IiwiaXNQcm9qZWN0RGVsZXRlZCIsInByb2plY3RNZXRhZGF0YSIsImlzX2RlbGV0ZWQiLCJpc0V4cGFuZGVkIiwiZXhwYW5kZWQiLCJoaXRsSW5zdGFuY2VJZCIsIm9yaWdpbmFsX3RocmVhZF9pZCIsIndhcm5pbmdNZXNzYWdlIiwid2FybmluZ19tZXNzYWdlIiwibWFudWFsQXBwcm92YWxEZXRlY3RlZCIsIm1hbnVhbF9hcHByb3ZhbF9kZXRlY3RlZCIsImlzT3BlbiIsIm9uQ2xvc2UiLCJDaGF0QUlNZXNzYWdlc0lubmVyIiwiX3JlZjUiLCJ1c2VySW5pdGlhbE1lc3NhZ2UiLCJpbml0aWFsQ2hhdElkIiwib25FcnJvciIsIm9uU2VuZE1lc3NhZ2VSZWFkeSIsIm9uU2Nyb2xsVG9Cb3R0b20iLCJhZ2VudHMiLCJfdXNlVCIsInQiLCJfdXNlR2xvYmFsQ29udGV4dCIsImlzV2ViU2VhcmNoQWN0aXZlIiwiaXNEZWVwU2VhcmNoQWN0aXZlIiwiYWdlbnQiLCJldmVudCIsIm1lc3NhZ2VzUmVmIiwiY2hhdEluaXRpYWxpemVkUmVmIiwiaXNMb2FkaW5nTW9yZVJlZiIsInNjcm9sbFRocmVzaG9sZFJlZiIsImxhc3RTY3JvbGxUb3BSZWYiLCJzaG93U2Nyb2xsVG9Cb3R0b21SZWYiLCJzaG93VG9wR3JhZGllbnRSZWYiLCJzaG93Qm90dG9tR3JhZGllbnRSZWYiLCJzY3JvbGxSYWZSZWYiLCJhbmNob3JlZFR1cm5JZFJlZiIsInNwYWNlckVsUmVmIiwic3BhY2VySGVpZ2h0UmVmIiwidHVyblNjcm9sbFJhZlJlZiIsIndhc0xvYWRpbmdNZXNzYWdlc1JlZiIsImxhc3RTY3JvbGxlZFNlc3Npb25SZWYiLCJwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZiIsInNjcm9sbFBlcnNpc3RUaW1lclJlZiIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2Iiwic2hvd1Njcm9sbFRvQm90dG9tIiwic2V0U2hvd1Njcm9sbFRvQm90dG9tIiwiX3VzZVN0YXRlNyIsIl91c2VTdGF0ZTgiLCJzaG93VG9wR3JhZGllbnQiLCJzZXRTaG93VG9wR3JhZGllbnQiLCJfdXNlU3RhdGU5IiwiX3VzZVN0YXRlMCIsInNob3dCb3R0b21HcmFkaWVudCIsInNldFNob3dCb3R0b21HcmFkaWVudCIsIl91c2VTdGF0ZTEiLCJfdXNlU3RhdGUxMCIsInNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHMiLCJzZXRTZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzIiwiX3VzZUNoYXRNYW5hZ2VyIiwiY2hhdElkIiwibWVzc2FnZXMiLCJsb2FkaW5nTWVzc2FnZXMiLCJpc0xvYWRpbmdNb3JlTWVzc2FnZXMiLCJ3YWl0aW5nUmVzcG9uc2UiLCJpc1dyaXRpbmciLCJsb2FkaW5nTWVzc2FnZSIsImFjdGl2ZUxvYWRpbmdzIiwic2VuZE1lc3NhZ2UiLCJyZXRyeU1lc3NhZ2UiLCJjaGFuZ2VQcm9qZWN0IiwiaW5pdGlhbGl6ZUNoYXQiLCJoYW5kbGVTY3JvbGwiLCJzdG9wR2VuZXJhdGlvbiIsInVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzIiwiZWwiLCJjdXJyZW50Iiwic2Nyb2xsVG9wIiwic2Nyb2xsSGVpZ2h0IiwiY2xpZW50SGVpZ2h0IiwiZGlzdGFuY2VGcm9tQm90dG9tIiwic2hvdWxkU2hvdyIsIm5leHRUb3BHcmFkaWVudCIsIm5leHRCb3R0b21HcmFkaWVudCIsInNjcm9sbFRvQm90dG9tUmFmIiwib3B0cyIsIl9vcHRzJGRlbGF5TXMiLCJkZWxheU1zIiwicnVuIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiY2FuY2VsVHVyblNjcm9sbCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0ZVNjcm9sbFRvIiwidG9wIiwiZnJvbSIsImRpc3RhbmNlIiwiZHVyYXRpb24iLCJzdGFydGVkQXQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInN0ZXAiLCJwcm9ncmVzcyIsIk1hdGgiLCJtaW4iLCJlYXNlZCIsInNldFNwYWNlckhlaWdodCIsImhlaWdodCIsImNsZWFyVHVyblNwYWNlIiwiZHJhaW5UdXJuU3BhY2UiLCJyZWxlYXNlVHVyblNwYWNlIiwiaGFuZGxlVXNlclNjcm9sbEludGVudCIsIm1lYXN1cmVUdXJuIiwicXVlc3Rpb25JZCIsInNwYWNlckVsIiwicXVlc3Rpb25FbCIsInF1ZXJ5U2VsZWN0b3IiLCJjb250YWluZXJUb3AiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJfY29tcHV0ZU1lYXN1cmVUdXJuTGEiLCJxdWVzdGlvblRvcCIsImNvbnRlbnRCb3R0b20iLCJ0dXJuSGVpZ2h0IiwicmVzZXJ2ZVR1cm5TcGFjZSIsIm1lYXN1cmVkIiwidGFyZ2V0U2Nyb2xsVG9wIiwicGxhbiIsImN1cnJlbnRTY3JvbGxUb3AiLCJraW5kIiwic3BhY2VySGVpZ2h0Iiwic3luY1R1cm5TcGFjZSIsImhhbmRsZUNsaWNrU2Nyb2xsVG9Cb3R0b20iLCJoYW5kbGVTY3JvbGxUb0JvdHRvbSIsImUiLCJjb250YWluZXIiLCJjdXJyZW50VGFyZ2V0Iiwic2Nyb2xsRnJhbWUiLCJsYXN0U2Nyb2xsVG9wIiwic2Nyb2xsVGhyZXNob2xkIiwiYW5jaG9yZWRUdXJuSWQiLCJuZXh0U2Nyb2xsVGhyZXNob2xkIiwic2hvdWxkRHJhaW5UdXJuU3BhY2UiLCJzaG91bGRTY2hlZHVsZVNjcm9sbFBlcnNpc3QiLCJ3aW5kb3ciLCJjbGVhclRpbWVvdXQiLCJzY3JvbGxTZXNzaW9uSWQiLCJzaG91bGROb3RpZnlTY3JvbGxUb0JvdHRvbSIsInNlbmRNZXNzYWdlUmVmIiwic3RvcEdlbmVyYXRpb25SZWYiLCJvblNlbmRNZXNzYWdlUmVhZHlSZWYiLCJzZW5kTWVzc2FnZVByb3h5UmVmIiwiZmFxSWQiLCJhZ2VudFN1Z2dlc3Rpb25JZCIsIm1lbnRpb25zIiwiZnVhSWQiLCJzY0lkIiwic3RvcEdlbmVyYXRpb25Qcm94eVJlZiIsIm1lc3NhZ2VzRGF0YVJlZiIsInNlbGVjdGVkU3VnZ2VzdGlvbk1lc3NhZ2VJZHNSZWYiLCJjdXJyZW50TWVzc2FnZXMiLCJpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQiLCJhaUNoYXRTdWdnZXN0ZWRBbnN3ZXIiLCJhZ2VudF90eXBlIiwiX2RlZmluZVByb3BlcnR5IiwidGFyZ2V0TWVzc2FnZSIsImZpbmQiLCJtc2ciLCJsYXN0VXNlck1lc3NhZ2UiLCJmaWx0ZXIiLCJVU0VSIiwiYXQiLCJyYWZJZCIsInRpY2siLCJsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZiIsImxhc3RNZXNzYWdlSWRSZWYiLCJsYXN0TWVzc2FnZXNMZW5ndGhSZWYiLCJfbWVzc2FnZXMkaWQiLCJfbWVzc2FnZXMiLCJfbGFzdE1lc3NhZ2UkaWQiLCJsYXN0TWVzc2FnZSIsImxhc3RJZCIsInByZXZJZCIsInByZXZMZW4iLCJpc05ld01lc3NhZ2UiLCJzY3JvbGxEZWNpc2lvbiIsImlzQXRCb3R0b20iLCJpc0Fuc3dlck9yUXVlc3Rpb24iLCJpc0FwcHJvdmFsIiwiaGFzSW5pdGlhbE1lc3NhZ2UiLCJtZXNzYWdlc0xlbmd0aCIsInByZXZNZXNzYWdlc0xlbmd0aCIsIl9tZXNzYWdlcyRpZDIiLCJfbWVzc2FnZXMyIiwianVzdEZpbmlzaGVkTG9hZGluZyIsImF0dGFjaG1lbnRzQ291bnQiLCJzdHJlYW1Mb2FkaW5nRGlzcGxheSIsImhhc0F0dGFjaG1lbnRzIiwiaXNTY3JvbGxPblBhcmVudCIsIl9zZXNzaW9uJHNjcm9sbFNlc3NpbyIsIl9zZXNzaW9uJHNjcm9sbFRvcCIsInNlc3Npb24iLCJwZW5kaW5nU2Nyb2xsVG9wIiwiZXhwYW5kZWRSZWYiLCJzYXZlZFNjcm9sbFRvcCIsImZpbGwiLCJoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3IiLCJtZXNzYWdlc0NvbnRlbnQiLCJ0ZXh0IiwiX21lc3NhZ2UkYXR0YWNobWVudHMkIiwiX21lc3NhZ2UkYXR0YWNobWVudHMiLCJfbWVzc2FnZSRzb3VyY2VzJGxlbmciLCJfbWVzc2FnZSRzb3VyY2VzIiwiX21lc3NhZ2UkbWVzc2FnZSIsIl9tZXNzYWdlJHByb2plY3QiLCJfcmVzb2x2ZUNoYXRMaXN0SXRlbVMiLCJ1c2VySWQiLCJzb3VyY2VDb3VudCIsInByb2plY3ROYW1lIiwicHJvamVjdCIsImhhc0FwcHJvdmFsIiwibWVzc2FnZUZlZWRiYWNrIiwid2FzSGVscGZ1bCIsIm1lc3NhZ2VLZXkiLCJ0dXJuSWQiLCJ1c2VyTWVzc2FnZUZvclJldHJ5IiwiY2FuUmV0cnkiLCJoYXNVc2VyTWVzc2FnZUZvclJldHJ5IiwiaXNDYW5jZWxsZWQiLCJpc19jYW5jZWxsZWQiLCJrZXkiLCJyZWYiLCIkc2Nyb2xsT25QYXJlbnQiLCJvbldoZWVsIiwib25Ub3VjaFN0YXJ0IiwiJHNob3ciLCJvblNjcm9sbCIsIiR2aXNpYmxlIiwieG1sbnMiLCJ3aWR0aCIsInN0cm9rZSIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsInN0cm9rZVdpZHRoIiwiZCIsIkNoYXRBSU1lc3NhZ2VzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbW9sZWN1bGVzL0NoYXRBSU1lc3NhZ2VzL0NoYXRBSU1lc3NhZ2VzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9pbmRlbnQgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L25vLXVuc3RhYmxlLW5lc3RlZC1jb21wb25lbnRzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tc2hhZG93ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXN0ZWQtdGVybmFyeSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZWYgKi9cbi8qIGVzbGludC1kaXNhYmxlIHJlYWN0L2Z1bmN0aW9uLWNvbXBvbmVudC1kZWZpbml0aW9uICovXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9yZXF1aXJlLWRlZmF1bHQtcHJvcHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L2NsaWNrLWV2ZW50cy1oYXZlLWtleS1ldmVudHMgKi9cbi8qIGVzbGludC1kaXNhYmxlIGpzeC1hMTF5L25vLXN0YXRpYy1lbGVtZW50LWludGVyYWN0aW9ucyAqL1xuaW1wb3J0IFJlYWN0LCB7IEZDLCBtZW1vLCBSZWFjdE5vZGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZUxheW91dEVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBBdHRhY2htZW50Q2FyZCB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRDYXJkL0F0dGFjaG1lbnRDYXJkJ1xuaW1wb3J0IHsgQXBwcm92YWxCb3ggfSBmcm9tICcuLi8uLi9hdG9tcy9BcHByb3ZhbEJveC9BcHByb3ZhbEJveCdcbmltcG9ydCB7IEF0dGFjaG1lbnRQcmV2aWV3TW9kYWwgfSBmcm9tICcuLi8uLi9hdG9tcy9BdHRhY2htZW50UHJldmlld01vZGFsJ1xuaW1wb3J0IHsgQXR0YWNobWVudENhcmRBdWRpbyB9IGZyb20gJy4uLy4uL2F0b21zL0F0dGFjaG1lbnRDYXJkL0F0dGFjaG1lbnRDYXJkQXVkaW8nXG5pbXBvcnQgeyBNYWlhU3RyZWFtZG93biB9IGZyb20gJy4uLy4uL2F0b21zL01haWFTdHJlYW1kb3duJ1xuaW1wb3J0IHR5cGUgeyBNYWlhU3RyZWFtZG93blByb3BzIH0gZnJvbSAnLi4vLi4vYXRvbXMvTWFpYVN0cmVhbWRvd24nXG5pbXBvcnQgeyBNQUlBTWVzc2FnZVByb3BzIH0gZnJvbSAnLi4vLi4vYXRvbXMvTUFJQU1lc3NhZ2UvTUFJQU1lc3NhZ2UuaW50ZXJmYWNlcydcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0SGlzdG9yeVJvbGUgfSBmcm9tICcuLi8uLi8uLi90eXBlcy9DaGF0J1xuaW1wb3J0IHsgcmVuZGVyVGV4dFdpdGhNZW50aW9ucywgaGFzSW5saW5lTWFya2VycyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3JlbmRlckNvbnRleHRNZW50aW9ucydcblxuaW1wb3J0IHsgaXNNYWlha2VyQWdlbnQgfSBmcm9tICcuLi8uLi8uLi91dGlscy9hZ2VudERpc3BsYXlOYW1lJ1xuaW1wb3J0IHsgQ09SVXNlciwgdXNlVXNlciB9IGZyb20gJy4uLy4uLy4uL2NvbnRleHQvY29yLXVzZXInXG5cbmltcG9ydCB7IHVzZVQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VUJ1xuaW1wb3J0IHsgdXNlQ2hhdE1hbmFnZXIgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VDaGF0TWFuYWdlci91c2VDaGF0TWFuYWdlcidcbmltcG9ydCB7IHVzZVNtb290aFN0cmVhbVRleHQgfSBmcm9tICcuLi8uLi8uLi9ob29rcy91c2VTbW9vdGhTdHJlYW1UZXh0J1xuaW1wb3J0IHsgdXNlU3RyZWFtaW5nTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVN0cmVhbWluZ01lc3NhZ2UnXG5cbmltcG9ydCB7IExvYWRpbmdUZXh0IH0gZnJvbSAnLi4vLi4vYXRvbXMvTG9hZGluZ1RleHQnXG5pbXBvcnQgeyBBZ2VudEFjdGl2aXR5SW5kaWNhdG9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvQWdlbnRBY3Rpdml0eUluZGljYXRvcidcbmltcG9ydCB7IFJlYXNvbmluZ0Jsb2NrIH0gZnJvbSAnLi4vLi4vYXRvbXMvUmVhc29uaW5nQmxvY2svUmVhc29uaW5nQmxvY2snXG5pbXBvcnQgeyBzaG91bGRTdHJlYW1OYXJyYXRpb25JblRpbWVsaW5lIH0gZnJvbSAnLi4vLi4vYXRvbXMvUmVhc29uaW5nQmxvY2svcmVhc29uaW5nTGl2ZU5hcnJhdGlvbidcbmltcG9ydCB7IFJlYXNvbmluZ1RpbWVsaW5lIH0gZnJvbSAnLi4vLi4vYXRvbXMvUmVhc29uaW5nQmxvY2svUmVhc29uaW5nVGltZWxpbmUnXG5pbXBvcnQgeyBTQ1RpbWVsaW5lSW5kaWNhdG9yIH0gZnJvbSAnLi4vLi4vYXRvbXMvUmVhc29uaW5nQmxvY2svUmVhc29uaW5nQmxvY2suc3R5bGVzJ1xuaW1wb3J0IHR5cGUgeyBTdHJlYW1BY3Rpdml0eSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL3N0cmVhbUFjdGl2aXR5J1xuaW1wb3J0IHsgaXNTdHJlYW1pbmdQbGFjZWhvbGRlck1lc3NhZ2VJZCwgcmVzb2x2ZVN0cmVhbUxvYWRpbmdEaXNwbGF5IH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvc3RyZWFtQWN0aXZpdHlNZXNzYWdlcydcbmltcG9ydCB7IHJlc29sdmVSZXRyeVR1cm5JZCwgZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkgfSBmcm9tICcuLi8uLi8uLi91dGlscy9yZXRyeUNvbXBsZXRpb24nXG5pbXBvcnQgeyB1c2VSZWFzb25pbmdUcmFjZSB9IGZyb20gJy4uLy4uLy4uL2hvb2tzL3VzZVJlYXNvbmluZ1RyYWNlJ1xuaW1wb3J0IHsgTG9hZGVyIH0gZnJvbSAnLi4vLi4vYXRvbXMvTG9hZGVyJ1xuaW1wb3J0IHsgRmFkZSB9IGZyb20gJy4uLy4uL2F0b21zL0ZhZGUnXG5pbXBvcnQgeyBwYXRjaE1haWFQYW5lbFNlc3Npb24sIHJlYWRNYWlhUGFuZWxTZXNzaW9uIH0gZnJvbSAnLi4vLi4vLi4vc3RvcmUvbWFpYVBhbmVsU2Vzc2lvblBlcnNpc3RlbmNlJ1xuXG5pbXBvcnQgeyBQcm9qZWN0IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvUHJvamVjdCdcblxuaW1wb3J0IHsgTWVzc2FnZUZyb21Vc2VyLCBNZXNzYWdlRnJvbU90aGVyLCBNZXNzYWdlQ29udGVudEZyb21Vc2VyLCBNZXNzYWdlQ29udGVudEZyb21PdGhlciB9IGZyb20gJy4vc3R5bGVzJ1xuaW1wb3J0IHsgTWVzc2FnZUZlZWRiYWNrIH0gZnJvbSAnLi4vTWVzc2FnZUZlZWRiYWNrJ1xuaW1wb3J0IHtcbiAgU0NDQUlNZXNzYWdlV3JhcHBlcixcbiAgU2Nyb2xsVG9Cb3R0b21CdXR0b24sXG4gIFNDU2Nyb2xsSWNvblN3YXAsXG4gIFNDV3JpdGluZ0RvdHMsXG4gIFNDTWVzc2FnZXNPdXRlcixcbiAgU0NNZXNzYWdlc1Njcm9sbCxcbiAgU0NNZXNzYWdlc0lubmVyLFxuICBTQ1R1cm5TcGFjZXIsXG4gIFNDT3B0aW9uc0xpc3QsXG4gIFNDT3B0aW9uSXRlbSxcbiAgU0NNZXNzYWdlSXRlbVdyYXBwZXIsXG4gIFNDTWVzc2FnZUl0ZW1Jbm5lcixcbiAgU0NBdHRhY2htZW50c1JvdyxcbiAgU0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4sXG4gIFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uLFxuICBTQ01lc3NhZ2VzR3JhZGllbnRUb3AsXG4gIFNDTWVzc2FnZXNHcmFkaWVudEJvdHRvbSxcbn0gZnJvbSAnLi9uZXdTdHlsZXMnXG5pbXBvcnQgeyBGZWVkYmFjayB9IGZyb20gJy4uL01lc3NhZ2VGZWVkYmFjay9NZXNzYWdlRmVlZGJhY2snXG5pbXBvcnQgeyB1c2VHbG9iYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vY29udGV4dC9nbG9iYWwtY29udGV4dCdcbmltcG9ydCB7IEFnZW50IH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvYWdlbnQnXG5pbXBvcnQgeyBBdHRhY2htZW50RmlsZSB9IGZyb20gJy4uL0NoYXRGb290ZXIvQ2hhdEZvb3RlcidcbmltcG9ydCB7IENvbnRleHRNZW50aW9uIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMvY29udGV4dE1lbnRpb24nXG5pbXBvcnQgeyBFbnRpdHlMaW5rQ3VzdG9tTGluaywgZ2V0RW50aXR5TGlua1dyYXBwZXJDbGFzc05hbWUgfSBmcm9tICcuLi8uLi8uLi91dGlscy9lbnRpdHlMaW5rUmVuZGVyJ1xuaW1wb3J0IHsgQ2hhdEFJU3VnZ2VzdGlvbnMgfSBmcm9tICcuL0NoYXRBSVN1Z2dlc3Rpb25zJ1xuaW1wb3J0IHsgQ2hhdEFJQ3JlYXRlQWdlbnRBY3Rpb25zIH0gZnJvbSAnLi9DaGF0QUlDcmVhdGVBZ2VudEFjdGlvbnMnXG5pbXBvcnQgeyBFVkVOVFMsIHVzZUV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlRXZlbnQnXG5pbXBvcnQgeyBkb3dubG9hZEZpbGVGcm9tVXJsIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZmlsZURvd25sb2FkSGVscGVyJ1xuaW1wb3J0IHtcbiAgY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3LFxuICBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2UsXG4gIGNvbXB1dGVEaXN0YW5jZUZyb21Cb3R0b20sXG4gIGNvbXB1dGVSZW1vdmFibGVUdXJuU3BhY2UsXG4gIGNvbXB1dGVTeW5jZWRUdXJuU3BhY2VySGVpZ2h0LFxuICBjb21wdXRlVHVyblNjcm9sbER1cmF0aW9uTXMsXG4gIGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wLFxuICBjb3VudFVzZXJNZXNzYWdlQXR0YWNobWVudHMsXG4gIGVhc2VPdXRFeHBvU2Nyb2xsUHJvZ3Jlc3MsXG4gIGV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZCxcbiAgZmluZExhc3RRdWVzdGlvbklkLFxuICBoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QsXG4gIGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcixcbiAgaXNBY3RpdmVTdHJlYW1pbmdTdGF0ZSxcbiAgaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZCxcbiAgaXNBcHByb3ZhbENoYXRNZXNzYWdlLFxuICBpc0Fzc2lzdGFudENoYXRNZXNzYWdlLFxuICBpc0F1ZGlvQXR0YWNobWVudCxcbiAgaXNDdXJyZW50VXNlck1lc3NhZ2UsXG4gIGlzTmV3Q2hhdE1lc3NhZ2VFdmVudCxcbiAgaXNSZXRyeVN1Z2dlc3Rpb25TZWxlY3Rpb24sXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRCbG9iU3RyYXRlZ3ksXG4gIHJlc29sdmVBdHRhY2htZW50RG93bmxvYWRGaWxlTmFtZSxcbiAgcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybCxcbiAgcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzLFxuICByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwsXG4gIHJlc29sdmVNZXNzYWdlQXR0YWNobWVudHMsXG4gIHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlLFxuICBzaG91bGRBdXRvU2Nyb2xsT25NZXNzYWdlc0NoYW5nZSxcbiAgc2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zLFxuICBzaG91bGRIaWRlRW1wdHlTdHJlYW1pbmdCb2R5LFxuICBzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2ssXG4gIHNob3VsZE9wZW5NZXNzYWdlT3B0aW9uLFxuICBzaG91bGRSZWxlYXNlVHVyblNwYWNlLFxuICBzaG91bGRSZW5kZXJBc3Npc3RhbnRGZWVkYmFjayxcbiAgc2hvdWxkUmVuZGVyQXNzaXN0YW50U3VnZ2VzdGlvbnMsXG4gIHNob3VsZFJlbmRlckNoYW5nZVByb2plY3RNZXNzYWdlLFxuICBzaG91bGRSZW5kZXJDcmVhdGVBZ2VudEFjdGlvbnMsXG4gIHNob3VsZFJlbmRlck1lc3NhZ2VUZXh0Qm9keSxcbiAgc2hvdWxkU2hvd0FwcHJvdmFsQWN0aW9ucyxcbiAgc2hvdWxkU2hvd0JvdHRvbVNjcm9sbEdyYWRpZW50LFxuICBzaG91bGRTaG93R2xvYmFsU3RyZWFtTG9hZGluZ0luZGljYXRvcixcbiAgc2hvdWxkU2hvd01lc3NhZ2VBdHRhY2htZW50c1JvdyxcbiAgc2hvdWxkU2hvd1Njcm9sbFRvQm90dG9tLFxuICBzaG91bGRTaG93U3RyZWFtQWN0aXZpdHlJbmRpY2F0b3IsXG4gIHNob3VsZFNob3dTdHJlYW1pbmdNZXNzYWdlQm9keSxcbiAgc2hvdWxkU2hvd1RvcFNjcm9sbEdyYWRpZW50LFxuICBzaG91bGRTa2lwRW1wdHlDaGF0TGlzdE1lc3NhZ2UsXG4gIHNob3VsZFNraXBUdXJuU2Nyb2xsQW5pbWF0aW9uLFxuICBzaG91bGRSdW5TdHJlYW1UdXJuU3luY0VmZmVjdCxcbiAgc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0LFxuICBidWlsZFNtb290aFN0cmVhbVRleHRPcHRpb25zLFxuICBjb21wdXRlTWVhc3VyZVR1cm5MYXlvdXQsXG4gIGRldGVjdEp1c3RGaW5pc2hlZExvYWRpbmdNZXNzYWdlcyxcbiAgcHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lLFxuICByZWFkU21vb3RoU3RyZWFtV2luZG93RmxhZ3MsXG4gIHJlc29sdmVSZXNlcnZlVHVyblNwYWNlUGxhbixcbiAgcmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wLFxuICByZXNvbHZlQ29udGFpbmVyQXRCb3R0b20sXG4gIHJlc29sdmVDcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkLFxuICByZXNvbHZlRmVlZGJhY2tQcm9wc0ZvckNhbmNlbGxlZCxcbiAgcmVzb2x2ZUxhc3RVc2VyTWVzc2FnZUZvckF0dGFjaG1lbnRzLFxuICByZXNvbHZlTWVzc2FnZUxpc3RJdGVtS2V5LFxuICByZXNvbHZlUGVuZGluZ1Njcm9sbFRvcEZyb21TZXNzaW9uLFxuICByZXNvbHZlUmVhc29uaW5nVHJhY2VIb29rSWQsXG4gIHJlc29sdmVTY3JvbGxPblBhcmVudE1vZGUsXG4gIHJlc29sdmVTdHJlYW1pbmdNZXNzYWdlSG9va0lkLFxuICByZXNvbHZlU3RyZWFtaW5nUmF3VGV4dCxcbiAgcmVzb2x2ZVN0cmVhbWluZ1RleHRIb29rSWQsXG4gIHJlc29sdmVTdWdnZXN0aW9uQW5hbHl0aWNzQWdlbnRUeXBlLFxuICBzaG91bGRBcHBseVBlbmRpbmdTY3JvbGxSZXN0b3JlLFxuICBzaG91bGRDbGVhckxhc3RSZXNlcnZlZFF1ZXN0aW9uLFxuICBzaG91bGRDbGVhclNjcm9sbFJlc3RvcmVXaXRob3V0Q2hhdCxcbiAgc2hvdWxkSW5pdGlhbGl6ZUNoYXQsXG4gIHNob3VsZFJlbmRlck1lbnRpb25JbmxpbmVOb2RlcyxcbiAgc2hvdWxkUmVzdG9yZVNjcm9sbE9uRXhwYW5kZWRDaGFuZ2UsXG4gIHNob3VsZFJ1blNlc3Npb25DYWNoZVNjcm9sbFRvQm90dG9tLFxuICBzaG91bGRTY2hlZHVsZVR1cm5TcGFjZVJlc2VydmF0aW9uLFxuICBzaG91bGRTY3JvbGxUb0JvdHRvbUFmdGVyTG9hZCxcbiAgc2hvdWxkU2tpcE1lc3NhZ2VzU2Nyb2xsRWZmZWN0LFxuICBzaG91bGRVcGRhdGVTY3JvbGxBZmZvcmRhbmNlc09uTG9hZEVuZCxcbn0gZnJvbSAnLi9DaGF0QUlNZXNzYWdlcy5oZWxwZXJzJ1xuXG50eXBlIENoYXRBSU1lc3NhZ2VzUHJvcHMgPSB7XG4gIHVzZXJJbml0aWFsTWVzc2FnZToge1xuICAgIG1lc3NhZ2U6IHN0cmluZ1xuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50RmlsZVtdXG4gICAgZmFxSWQ/OiBzdHJpbmdcbiAgICBhZ2VudFN1Z2dlc3Rpb25JZD86IHN0cmluZ1xuICAgIG1lbnRpb25zPzogQ29udGV4dE1lbnRpb25bXVxuICAgIGZ1YUlkPzogc3RyaW5nXG4gICAgc2NJZD86IHN0cmluZ1xuICB9XG4gIGluaXRpYWxDaGF0SWQ6IHN0cmluZyB8IG51bGxcbiAgb25FcnJvcjogKCkgPT4gdm9pZFxuICBvblNlbmRNZXNzYWdlUmVhZHk/OiAoXG4gICAgc2VuZE1lc3NhZ2U6IChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHZvaWQsXG4gICAgc3RvcEdlbmVyYXRpb246ICgpID0+IHZvaWQsXG4gICAgaXNTdHJlYW1pbmc6IGJvb2xlYW4sXG4gICAgaXNXcml0aW5nOiBib29sZWFuXG4gICkgPT4gdm9pZFxuICBpc0Rpc2FibGVkPzogYm9vbGVhblxuICBvblNjcm9sbFRvQm90dG9tPzogKCkgPT4gdm9pZFxuICBhdHRhY2htZW50cz86IEF0dGFjaG1lbnRGaWxlW11cbiAgYWdlbnRzPzogQWdlbnRbXVxuICBleHBhbmRlZD86IGJvb2xlYW5cbn1cblxudHlwZSBNZXNzYWdlSXRlbVByb3BzID0gQ2hhdE1lc3NhZ2UgJiB7XG4gIGF1dGhVc2VyOiBDT1JVc2VyXG4gIGhhbmRsZVNlbGVjdE9wdGlvbjogKG9wdGlvbjogUHJvamVjdCkgPT4gdm9pZFxuICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s6IChtZXNzYWdlSWQ6IHN0cmluZywgc3VnZ2VzdGlvbjogc3RyaW5nKSA9PiB2b2lkXG4gIGhhc1NlbGVjdGVkU3VnZ2VzdGlvbj86IGJvb2xlYW5cbiAgaGFuZGxlRmVlZGJhY2s6IChmZWVkYmFjazogRmVlZGJhY2ssIGNoYXRNZXNzYWdlSWQ6IHN0cmluZykgPT4gdm9pZFxuICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uOiAoXG4gICAgdGhyZWFkSWRzOiBzdHJpbmdbXSxcbiAgICBkZWNpc2lvbjogJ2FwcHJvdmUnIHwgJ3JlamVjdCcsXG4gICAgZWRpdGVkQWN0aW9ucz86IEFycmF5PHsgdG9vbF9uYW1lOiBzdHJpbmc7IGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICAgIG1ldGFkYXRhPzogeyB0b29sX2dyb3VwX3NsdWdzOiBzdHJpbmdbXSB9XG4gICkgPT4gdm9pZFxuICBoYW5kbGVSZXRyeT86ICgpID0+IHZvaWRcbiAgZGlzYWJsZUZlZWRiYWNrPzogRmVlZGJhY2sgfCBudWxsXG4gIHNvdXJjZXM/OiBhbnlcbiAgYXR0YWNobWVudHM/OiBBdHRhY2htZW50RmlsZVtdXG4gIGlzU3RyZWFtaW5nPzogYm9vbGVhblxuICBpc0xhc3RNZXNzYWdlPzogYm9vbGVhblxuICBleHBhbmRlZD86IGJvb2xlYW5cbiAgc3RyZWFtQWN0aXZpdHk/OiBTdHJlYW1BY3Rpdml0eSB8IG51bGxcbn1cblxuaW50ZXJmYWNlIE1lc3NhZ2VXcmFwcGVyUHJvcHMge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgJ2RhdGEtbWVzc2FnZS1pZCc/OiBzdHJpbmdcbiAgaGFzRmVlZGJhY2s/OiBib29sZWFuXG59XG5cbnR5cGUgTWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHMgPSBNQUlBTWVzc2FnZVByb3BzICYge1xuICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gIGlzRXJyb3I/OiBib29sZWFuXG4gIGlzQ2hhbmdlUHJvamVjdD86IGJvb2xlYW5cbn1cblxuY29uc3QgTWVzc2FnZVdyYXBwZXI6IEZDPE1lc3NhZ2VXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgY2hpbGRyZW4sIC4uLnByb3BzIH0pID0+IHtcbiAgY29uc3QgTWVzc2FnZUNvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlRnJvbVVzZXIgOiBNZXNzYWdlRnJvbU90aGVyXG4gIHJldHVybiA8TWVzc2FnZUNvbXBvbmVudCB7Li4ucHJvcHN9PntjaGlsZHJlbn08L01lc3NhZ2VDb21wb25lbnQ+XG59XG5cbmNvbnN0IE1lc3NhZ2VDb250ZW50V3JhcHBlcjogRkM8TWVzc2FnZUNvbnRlbnRXcmFwcGVyUHJvcHM+ID0gKHsgaXNDdXJyZW50VXNlciwgLi4ucHJvcHMgfSkgPT4ge1xuICBjb25zdCBNZXNzYWdlQ29udGVudENvbXBvbmVudCA9IGlzQ3VycmVudFVzZXIgPyBNZXNzYWdlQ29udGVudEZyb21Vc2VyIDogTWVzc2FnZUNvbnRlbnRGcm9tT3RoZXJcbiAgcmV0dXJuIDxNZXNzYWdlQ29udGVudENvbXBvbmVudCB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIE1lc3NhZ2VPcHRpb25zKHtcbiAgb3B0aW9ucyxcbiAgaGFuZGxlU2VsZWN0T3B0aW9uLFxufToge1xuICBvcHRpb25zOiBQcm9qZWN0W10gfCBudWxsXG4gIGhhbmRsZVNlbGVjdE9wdGlvbjogKG9wdGlvbjogUHJvamVjdCkgPT4gdm9pZFxufSkge1xuICBjb25zdCBbc2VsZWN0ZWRPcHRpb24sIHNldFNlbGVjdGVkT3B0aW9uXSA9IHVzZVN0YXRlPFByb2plY3QgfCBudWxsPihudWxsKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IChvcHRpb246IFByb2plY3QpID0+IHtcbiAgICBpZiAoIXNob3VsZE9wZW5NZXNzYWdlT3B0aW9uKHNlbGVjdGVkT3B0aW9uKSkgcmV0dXJuXG4gICAgc2V0U2VsZWN0ZWRPcHRpb24ob3B0aW9uKVxuICAgIGhhbmRsZVNlbGVjdE9wdGlvbihvcHRpb24pXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTQ09wdGlvbnNMaXN0PlxuICAgICAgeyhvcHRpb25zIHx8IFtdKS5tYXAob3B0aW9uID0+IChcbiAgICAgICAgPFNDT3B0aW9uSXRlbVxuICAgICAgICAgICRoYXNTZWxlY3Rpb249eyEhc2VsZWN0ZWRPcHRpb259XG4gICAgICAgICAgJGRpbW1lZD17ISFzZWxlY3RlZE9wdGlvbiAmJiBzZWxlY3RlZE9wdGlvbj8uaWQgIT09IG9wdGlvbi5pZH1cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVTZWxlY3Qob3B0aW9uKX1cbiAgICAgICAgICBrZXk9e29wdGlvbi5pZH1cbiAgICAgICAgPlxuICAgICAgICAgIHtvcHRpb24ubmFtZX1cbiAgICAgICAgPC9TQ09wdGlvbkl0ZW0+XG4gICAgICApKX1cbiAgICA8L1NDT3B0aW9uc0xpc3Q+XG4gIClcbn1cblxuLyoqIFNvbG8gZXN0ZSBjb21wb25lbnRlIHJlLXJlbmRlcml6YSBjdWFuZG8gY2FtYmlhIGVsIHRleHRvIGVuIHN0cmVhbWluZyAobGVlIGRlbCBjb250ZXh0KS4gKi9cbmNvbnN0IFN0cmVhbWluZ01lc3NhZ2VCb2R5ID0gbWVtbyhcbiAgKHByb3BzOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nXG4gICAgaXNTdHJlYW1pbmc6IGJvb2xlYW5cbiAgICBpc0N1cnJlbnRVc2VyOiBib29sZWFuXG4gICAgaXNBc3Npc3RhbnQ6IGJvb2xlYW5cbiAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkPzogYm9vbGVhblxuICAgIGFwcHJvdmFsPzogTWVzc2FnZUl0ZW1Qcm9wc1snYXBwcm92YWwnXVxuICAgIGlzRXJyb3I/OiBib29sZWFuXG4gICAgc291cmNlcz86IE1lc3NhZ2VJdGVtUHJvcHNbJ3NvdXJjZXMnXVxuICAgIHN1Z2dlc3Rpb25zPzogc3RyaW5nW10gfCBudWxsXG4gICAgY3JlYXRlQWdlbnRGb2xsb3dVcD86IHsgYWdlbnRJZDogc3RyaW5nIH0gfCBudWxsXG4gICAgaGFuZGxlRmVlZGJhY2tDbGljazogKGY6IEZlZWRiYWNrKSA9PiB2b2lkXG4gICAgZGlzYWJsZUZlZWRiYWNrOiBGZWVkYmFjayB8IG51bGxcbiAgICBvblJldHJ5PzogKCkgPT4gdm9pZFxuICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljazogKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHZvaWRcbiAgICBzdWdnZXN0aW9uc0Rpc2FibGVkPzogYm9vbGVhblxuICAgIG1lc3NhZ2VJZDogc3RyaW5nXG4gICAgaXNMYXN0TWVzc2FnZT86IGJvb2xlYW5cbiAgfSkgPT4ge1xuICAgIC8vIFRleHRvIGRlbCBzdHJlYW06IHNvbG8gc2UgbGVlIGRlbCBzdG9yZSBjdWFuZG8gZXN0ZSBtZW5zYWplIGVzIGVsXG4gICAgLy8gcXVlIGVzdMOhIGVuIHN0cmVhbWluZy4gdXNlU3luY0V4dGVybmFsU3RvcmUgYcOtc2xhIGVsIHJlLXJlbmRlciBhXG4gICAgLy8gZXN0ZSBjb21wb25lbnRlLCBzaW4gdG9jYXIgZWwgcmVzdG8gZGVsIMOhcmJvbC5cbiAgICBjb25zdCBzdHJlYW1pbmdUZXh0ID0gdXNlU3RyZWFtaW5nTWVzc2FnZShyZXNvbHZlU3RyZWFtaW5nTWVzc2FnZUhvb2tJZChwcm9wcy5pc1N0cmVhbWluZywgcHJvcHMubWVzc2FnZUlkKSlcbiAgICBjb25zdCByYXdUZXh0ID0gcmVzb2x2ZVN0cmVhbWluZ1Jhd1RleHQocHJvcHMuaXNTdHJlYW1pbmcsIHN0cmVhbWluZ1RleHQsIHByb3BzLm1lc3NhZ2UpXG4gICAgLy8gU21vb3RoIHN0cmVhbWluZzogZGVzYWNvcGxhIGxhIGNhZGVuY2lhIGRlbCBiYWNrZW5kIGRlbCByZW5kZXIuXG4gICAgLy8gRHVyYW50ZSBlbCBzdHJlYW1pbmcgbGliZXJhIGNoYXJzIGEgcml0bW8gY29uc3RhbnRlIHbDrWEgckFGOyBjdWFuZG9cbiAgICAvLyB0ZXJtaW5hLCBtdWVzdHJhIGVsIHRleHRvIGZpbmFsIGFsIGluc3RhbnRlIChzaW4gYW5pbWFjacOzbiByZXNpZHVhbCkuXG4gICAgLy8gTG9zIGRlZmF1bHRzIGRlbCBob29rIHNlIGFqdXN0YXJvbiBlbXDDrXJpY2FtZW50ZSBlbiBzdGFnaW5nOyBhdW4gYXPDrVxuICAgIC8vIHNlIGV4cG9uZW4gZmxhZ3MgZGUgcnVudGltZSAod2luZG93LiopIHBhcmEgcG9kZXIgdHVuZWFyIHNpbiByZWNvbXBpbGFyXG4gICAgLy8gc2kgYWxnw7puIGJhY2tlbmQgcHJlc2VudGEgdW5hIGNhZGVuY2lhIG11eSBkaXN0aW50YSBlbiBwcm9kdWNjacOzbi5cbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1BZGFwdCA9IGZhbHNlICAgICAgLy8gZGVzYWN0aXZhIGFkYXB0YWNpw7NuIGFsIGJhY2tlbmRcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1CdWZmZXJNcyA9IDYwMCAgICAgLy8gY29sY2jDs24gb2JqZXRpdm8gKG1zKVxuICAgIC8vICAgd2luZG93LnN0cmVhbUxhZ01zID0gNDUwICAgICAgICAvLyBsYWcgbcOheGltbyBiYXNlIChtcylcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1NaW5CdWZmZXIgPSA3MCAgICAgLy8gcGlzbyBkZWwgY29sY2jDs24gZW4gY2hhcnNcbiAgICAvLyAgIHdpbmRvdy5zdHJlYW1XYXJtdXBNcyA9IDQwMCAgICAgLy8gd2FybXVwIGluaWNpYWwgKG1zKVxuICAgIGNvbnN0IHdpbkZsYWdzID0gcmVhZFNtb290aFN0cmVhbVdpbmRvd0ZsYWdzKClcbiAgICBjb25zdCBkaXNwbGF5VGV4dCA9IHVzZVNtb290aFN0cmVhbVRleHQocmF3VGV4dCwgYnVpbGRTbW9vdGhTdHJlYW1UZXh0T3B0aW9ucyh3aW5GbGFncywgcHJvcHMuaXNTdHJlYW1pbmcpKVxuICAgIGNvbnN0IGNyZWF0ZUFnZW50QWN0aW9uc0FnZW50SWQgPSByZXNvbHZlQ3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZChwcm9wcy5jcmVhdGVBZ2VudEZvbGxvd1VwKVxuXG4gICAgaWYgKHNob3VsZEhpZGVFbXB0eVN0cmVhbWluZ0JvZHkoZGlzcGxheVRleHQsIHByb3BzLmlzU3RyZWFtaW5nKSkgcmV0dXJuIG51bGxcbiAgICBjb25zdCBoYXNNZW50aW9ucyA9IGhhc0lubGluZU1hcmtlcnMoZGlzcGxheVRleHQpXG4gICAgY29uc3QgbWVudGlvbk5vZGVzID0gaGFzTWVudGlvbnMgPyByZW5kZXJUZXh0V2l0aE1lbnRpb25zKGRpc3BsYXlUZXh0KSA6IG51bGxcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPFNDQ0FJTWVzc2FnZVdyYXBwZXJcbiAgICAgICAgICBpc0N1cnJlbnRVc2VyPXtwcm9wcy5pc0N1cnJlbnRVc2VyfVxuICAgICAgICAgIGlzRnJvbnRlbmRDYW5jZWxsZWQ9e3Byb3BzLmlzRnJvbnRlbmRDYW5jZWxsZWR9XG4gICAgICAgICAgY2xhc3NOYW1lPXtnZXRFbnRpdHlMaW5rV3JhcHBlckNsYXNzTmFtZShkaXNwbGF5VGV4dCl9XG4gICAgICAgID5cbiAgICAgICAgICB7c2hvdWxkUmVuZGVyTWVudGlvbklubGluZU5vZGVzKGhhc01lbnRpb25zLCBtZW50aW9uTm9kZXMpID8gKFxuICAgICAgICAgICAgLy8gU2kgaGF5IG1lbnRpb25zLCByZW5kZXJpemFyIGRpcmVjdGFtZW50ZSAoc2luIG1hcmtkb3duIGVuIGVsIG1pc21vIHDDoXJyYWZvKVxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZScgfX0+e21lbnRpb25Ob2Rlc308L3NwYW4+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8vIFNpbiBtZW50aW9ucywgcGFzYXIgYSBTdHJlYW1kb3duIHBhcmEgbWFya2Rvd24gc3VwcG9ydFxuICAgICAgICAgICAgPE1haWFTdHJlYW1kb3duXG4gICAgICAgICAgICAgIHZhcmlhbnQ9XCJjaGF0XCJcbiAgICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17cHJvcHMuaXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZD17cHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZH1cbiAgICAgICAgICAgICAgY29tcG9uZW50cz17eyBhOiBFbnRpdHlMaW5rQ3VzdG9tTGluayB9IGFzIE1haWFTdHJlYW1kb3duUHJvcHNbJ2NvbXBvbmVudHMnXX1cbiAgICAgICAgICAgICAgaXNBbmltYXRpbmc9eyEhcHJvcHMuaXNTdHJlYW1pbmd9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkaXNwbGF5VGV4dH1cbiAgICAgICAgICAgIDwvTWFpYVN0cmVhbWRvd24+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9TQ0NBSU1lc3NhZ2VXcmFwcGVyPlxuICAgICAgICB7c2hvdWxkUmVuZGVyQXNzaXN0YW50RmVlZGJhY2soe1xuICAgICAgICAgIGlzQXNzaXN0YW50OiBwcm9wcy5pc0Fzc2lzdGFudCxcbiAgICAgICAgICBpc0Vycm9yOiBwcm9wcy5pc0Vycm9yLFxuICAgICAgICAgIGFwcHJvdmFsOiBwcm9wcy5hcHByb3ZhbCxcbiAgICAgICAgICBpc1N0cmVhbWluZzogcHJvcHMuaXNTdHJlYW1pbmcsXG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCxcbiAgICAgICAgICBvblJldHJ5OiBwcm9wcy5vblJldHJ5LFxuICAgICAgICB9KSAmJiAoXG4gICAgICAgICAgPE1lc3NhZ2VGZWVkYmFja1xuICAgICAgICAgICAgY29udGVudD17ZGlzcGxheVRleHR9XG4gICAgICAgICAgICB7Li4ucmVzb2x2ZUZlZWRiYWNrUHJvcHNGb3JDYW5jZWxsZWQocHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCwgcHJvcHMuc291cmNlcywgcHJvcHMuaGFuZGxlRmVlZGJhY2tDbGljayl9XG4gICAgICAgICAgICBkaXNhYmxlRmVlZGJhY2s9e3Byb3BzLmRpc2FibGVGZWVkYmFja31cbiAgICAgICAgICAgIG9uUmV0cnk9e3Byb3BzLm9uUmV0cnl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAge3Nob3VsZFJlbmRlckFzc2lzdGFudFN1Z2dlc3Rpb25zKHtcbiAgICAgICAgICBpc0Fzc2lzdGFudDogcHJvcHMuaXNBc3Npc3RhbnQsXG4gICAgICAgICAgaXNGcm9udGVuZENhbmNlbGxlZDogcHJvcHMuaXNGcm9udGVuZENhbmNlbGxlZCxcbiAgICAgICAgICBhcHByb3ZhbDogcHJvcHMuYXBwcm92YWwsXG4gICAgICAgICAgaXNFcnJvcjogcHJvcHMuaXNFcnJvcixcbiAgICAgICAgICBzdWdnZXN0aW9uc0xlbmd0aDogcHJvcHMuc3VnZ2VzdGlvbnM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICB9KSAmJiAoXG4gICAgICAgICAgPENoYXRBSVN1Z2dlc3Rpb25zXG4gICAgICAgICAgICBzdWdnZXN0aW9ucz17cHJvcHMuc3VnZ2VzdGlvbnMgfHwgW119XG4gICAgICAgICAgICBvblNlbGVjdFN1Z2dlc3Rpb249e3N1Z2dlc3Rpb24gPT4gcHJvcHMuaGFuZGxlU3VnZ2VzdGlvbkNsaWNrKHByb3BzLm1lc3NhZ2VJZCwgc3VnZ2VzdGlvbil9XG4gICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuc3VnZ2VzdGlvbnNEaXNhYmxlZH1cbiAgICAgICAgICAgIGhpZGRlbj17c2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zKHByb3BzLmlzU3RyZWFtaW5nLCBwcm9wcy5pc0xhc3RNZXNzYWdlLCBwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkKX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7c2hvdWxkUmVuZGVyQ3JlYXRlQWdlbnRBY3Rpb25zKHtcbiAgICAgICAgICBpc0Fzc2lzdGFudDogcHJvcHMuaXNBc3Npc3RhbnQsXG4gICAgICAgICAgaXNFcnJvcjogcHJvcHMuaXNFcnJvcixcbiAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkOiBwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkLFxuICAgICAgICAgIGFwcHJvdmFsOiBwcm9wcy5hcHByb3ZhbCxcbiAgICAgICAgICBhZ2VudElkOiBjcmVhdGVBZ2VudEFjdGlvbnNBZ2VudElkLFxuICAgICAgICB9KSAmJiAoXG4gICAgICAgICAgPENoYXRBSUNyZWF0ZUFnZW50QWN0aW9uc1xuICAgICAgICAgICAgYWdlbnRJZD17Y3JlYXRlQWdlbnRBY3Rpb25zQWdlbnRJZCF9XG4gICAgICAgICAgICBkaXNhYmxlZD17cHJvcHMuc3VnZ2VzdGlvbnNEaXNhYmxlZH1cbiAgICAgICAgICAgIGhpZGRlbj17c2hvdWxkSGlkZUFzc2lzdGFudFN1Z2dlc3Rpb25zKHByb3BzLmlzU3RyZWFtaW5nLCBwcm9wcy5pc0xhc3RNZXNzYWdlLCBwcm9wcy5zdWdnZXN0aW9uc0Rpc2FibGVkKX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgPC8+XG4gICAgKVxuICB9XG4pXG5cbmNvbnN0IE1lc3NhZ2VJdGVtID0gbWVtbygocHJvcHM6IE1lc3NhZ2VJdGVtUHJvcHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGlkLFxuICAgIHVzZXIsXG4gICAgbWVzc2FnZSxcbiAgICBpc1N0cmVhbWluZyxcbiAgICBpc0Vycm9yLFxuICAgIGF1dGhVc2VyLFxuICAgIG9wdGlvbnMsXG4gICAgaXNDaGFuZ2VQcm9qZWN0LFxuICAgIGhhbmRsZVNlbGVjdE9wdGlvbixcbiAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2ssXG4gICAgaGFuZGxlRmVlZGJhY2ssXG4gICAgaGFuZGxlQXBwcm92YWxEZWNpc2lvbixcbiAgICBkaXNhYmxlRmVlZGJhY2ssXG4gICAgaGFuZGxlUmV0cnksXG4gICAgcm9sZSxcbiAgICBzb3VyY2VzLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFwcHJvdmFsLFxuICAgIGFwcHJvdmFsU3RhdHVzLFxuICAgIHN1Z2dlc3Rpb25zLFxuICAgIGNyZWF0ZUFnZW50Rm9sbG93VXAsXG4gICAgaGFzU2VsZWN0ZWRTdWdnZXN0aW9uLFxuICAgIGlzTGFzdE1lc3NhZ2UsXG4gICAgc3RyZWFtQWN0aXZpdHksXG4gIH0gPSBwcm9wc1xuXG4gIGNvbnN0IFtwcmV2aWV3QXR0YWNobWVudCwgc2V0UHJldmlld0F0dGFjaG1lbnRdID0gdXNlU3RhdGU8QXR0YWNobWVudEZpbGUgfCBudWxsPihudWxsKVxuICBjb25zdCBpc0N1cnJlbnRVc2VyID0gaXNDdXJyZW50VXNlck1lc3NhZ2Uocm9sZSwgdXNlci5pZCwgYXV0aFVzZXIuaWQudG9TdHJpbmcoKSlcbiAgY29uc3QgaXNBc3Npc3RhbnQgPSBpc0Fzc2lzdGFudENoYXRNZXNzYWdlKHJvbGUsIHVzZXIuaWQpXG4gIGNvbnN0IGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIgPSBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyTWVzc2FnZUlkKGlkKVxuICBjb25zdCBzdHJlYW1pbmdUZXh0ID0gdXNlU3RyZWFtaW5nTWVzc2FnZShcbiAgICByZXNvbHZlU3RyZWFtaW5nVGV4dEhvb2tJZChCb29sZWFuKGlzU3RyZWFtaW5nKSwgaXNTdHJlYW1pbmdQbGFjZWhvbGRlciwgaWQpXG4gIClcbiAgY29uc3QgaXNBY3RpdmVTdHJlYW1pbmcgPSBpc0FjdGl2ZVN0cmVhbWluZ1N0YXRlKGlzU3RyZWFtaW5nLCBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyKVxuICBjb25zdCBoYXNTdHJlYW1UZXh0ID0gQm9vbGVhbihzdHJlYW1pbmdUZXh0KVxuICBjb25zdCByZWFzb25pbmdUcmFjZSA9IHVzZVJlYXNvbmluZ1RyYWNlKHJlc29sdmVSZWFzb25pbmdUcmFjZUhvb2tJZChpc0Fzc2lzdGFudCwgaXNBY3RpdmVTdHJlYW1pbmcsIGlkKSlcbiAgY29uc3Qgc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZSA9XG4gICAgaXNBc3Npc3RhbnQgJiYgc2hvdWxkU3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZShyZWFzb25pbmdUcmFjZS5zdGVwcywgc3RyZWFtQWN0aXZpdHksIHN0cmVhbWluZ1RleHQsIGlkKVxuICBjb25zdCBzaG93U3RyZWFtaW5nQm9keSA9IHNob3VsZFNob3dTdHJlYW1pbmdNZXNzYWdlQm9keShpc0FjdGl2ZVN0cmVhbWluZywgaGFzU3RyZWFtVGV4dCwgc3RyZWFtTmFycmF0aW9uSW5UaW1lbGluZSlcbiAgY29uc3Qgc2hvd0FjdGl2aXR5SW5kaWNhdG9yID0gc2hvdWxkU2hvd1N0cmVhbUFjdGl2aXR5SW5kaWNhdG9yKGlzQXNzaXN0YW50LCBpc0FjdGl2ZVN0cmVhbWluZywgc3RyZWFtQWN0aXZpdHkpXG5cbiAgY29uc3QgbWVzc2FnZUF0dGFjaG1lbnRzID0gcmVzb2x2ZU1lc3NhZ2VBdHRhY2htZW50cyhhdHRhY2htZW50cywgaXNBc3Npc3RhbnQsIHNvdXJjZXMpXG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudENsaWNrID0gKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgLy8gUGVybWl0aXIgcHJldmlzdWFsaXphY2nDs24gc2kgdGllbmUgYXJjaGl2byBsb2NhbCBvIFVSTHMgZGVsIGJhY2tlbmRcbiAgICBpZiAoY2FuT3BlbkF0dGFjaG1lbnRQcmV2aWV3KGF0dGFjaG1lbnQpKSB7XG4gICAgICBzZXRQcmV2aWV3QXR0YWNobWVudChhdHRhY2htZW50KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGhhbmRsZUNsb3NlUHJldmlldyA9ICgpID0+IHtcbiAgICBzZXRQcmV2aWV3QXR0YWNobWVudChudWxsKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlQXR0YWNobWVudERvd25sb2FkID0gYXN5bmMgKGF0dGFjaG1lbnQ6IEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSByZXNvbHZlQXR0YWNobWVudERvd25sb2FkRmlsZU5hbWUoYXR0YWNobWVudClcbiAgICBjb25zdCBmaWxlVXJsID0gcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZFVybChhdHRhY2htZW50KVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBibG9iVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuXG4gICAgICBjb25zdCBkb3dubG9hZFN0cmF0ZWd5ID0gcmVzb2x2ZUF0dGFjaG1lbnREb3dubG9hZEJsb2JTdHJhdGVneShmaWxlVXJsLCBhdHRhY2htZW50LmZpbGUpXG4gICAgICBpZiAoZG93bmxvYWRTdHJhdGVneSA9PT0gJ3JlbW90ZS11cmwnICYmIGZpbGVVcmwpIHtcbiAgICAgICAgY29uc3QgZG93bmxvYWRlZEZpbGUgPSBhd2FpdCBkb3dubG9hZEZpbGVGcm9tVXJsKGZpbGVVcmwsIGZpbGVOYW1lLCBhdHRhY2htZW50LnR5cGUpXG4gICAgICAgIGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGRvd25sb2FkZWRGaWxlKVxuICAgICAgfSBlbHNlIGlmIChkb3dubG9hZFN0cmF0ZWd5ID09PSAnbG9jYWwtZmlsZScgJiYgYXR0YWNobWVudC5maWxlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBibG9iVXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChhdHRhY2htZW50LmZpbGUpXG4gICAgICB9XG5cbiAgICAgIGlmICghYmxvYlVybCkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJylcbiAgICAgIGxpbmsuaHJlZiA9IGJsb2JVcmxcbiAgICAgIGxpbmsuZG93bmxvYWQgPSBmaWxlTmFtZVxuICAgICAgbGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspXG4gICAgICBsaW5rLmNsaWNrKClcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGluaylcbiAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTChibG9iVXJsKVxuICAgICAgfSwgMTAwKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZG93bmxvYWQgYXR0YWNobWVudCcsIGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGlmIChzaG91bGRSZW5kZXJDaGFuZ2VQcm9qZWN0TWVzc2FnZShpc0NoYW5nZVByb2plY3QsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxNZXNzYWdlV3JhcHBlciBrZXk9e2lkfSBpc0N1cnJlbnRVc2VyPXtpc0N1cnJlbnRVc2VyfSBkYXRhLW1lc3NhZ2UtaWQ9e2lkfSBoYXNGZWVkYmFjaz17ZmFsc2V9PlxuICAgICAgICA8U0NNZXNzYWdlSXRlbVdyYXBwZXIgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgPE1lc3NhZ2VDb250ZW50V3JhcHBlclxuICAgICAgICAgICAgaXNDaGFuZ2VQcm9qZWN0PXtpc0NoYW5nZVByb2plY3R9XG4gICAgICAgICAgICBtZXNzYWdlPXttZXNzYWdlfVxuICAgICAgICAgICAgaXNDdXJyZW50VXNlcj17aXNDdXJyZW50VXNlcn1cbiAgICAgICAgICAgIGlzRXJyb3I9e2lzRXJyb3J9XG4gICAgICAgICAgICBtZXNzYWdlRXh0cmFDb250ZW50PXs8TWVzc2FnZU9wdGlvbnMgb3B0aW9ucz17b3B0aW9ucyBhcyBhbnl9IGhhbmRsZVNlbGVjdE9wdGlvbj17aGFuZGxlU2VsZWN0T3B0aW9ufSAvPn1cbiAgICAgICAgICAvPlxuICAgICAgICA8L1NDTWVzc2FnZUl0ZW1XcmFwcGVyPlxuICAgICAgPC9NZXNzYWdlV3JhcHBlcj5cbiAgICApXG4gIH1cblxuICBjb25zdCBoYW5kbGVGZWVkYmFja0NsaWNrID0gKGZlZWRiYWNrOiBGZWVkYmFjaykgPT4ge1xuICAgIGhhbmRsZUZlZWRiYWNrPy4oZmVlZGJhY2ssIGV4dHJhY3RGZWVkYmFja1Nlc3Npb25JZChpZCkpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTQ01lc3NhZ2VJdGVtV3JhcHBlciAkaXNBc3Npc3RhbnQ9e2lzQXNzaXN0YW50fSBkYXRhLW1lc3NhZ2UtaWQ9e2lkfT5cbiAgICAgIDxTQ01lc3NhZ2VJdGVtSW5uZXI+XG4gICAgICAgIHsvKiBNaXNtbyBzbG90IHBhcmEgbGEgdHJhemEgZW4gdml2byB5IGxhIHlhIHBsZWdhZGE6IG1pZW50cmFzIGVsIHR1cm5vXG4gICAgICAgICAgICBjb3JyZSwgbG9zIHBhc29zIHNlIGFwaWxhbiBhY8OhICh0aW1lbGFwc2UpOyBhbCBjb21wbGV0YXIsIGVsXG4gICAgICAgICAgICBSZWFzb25pbmdCbG9jayBvY3VwYSBlbCBsdWdhciB5IGNvbGFwc2Egc29sby5cbiAgICAgICAgICAgIFZhIEFSUklCQSBkZWwgY3VlcnBvIHBvcnF1ZSBsYSBuYXJyYWNpw7NuIGRlIGNhZGEgdHVybm8gdGVybWluYSBjb21vXG4gICAgICAgICAgICBmaWxhIGRlIGxhIHRyYXphOiBzaSBlc3R1dmllcmEgYWJham8sIGVsIHRleHRvIHZpZWpvIHF1ZWRhcsOtYSBwb3JcbiAgICAgICAgICAgIGRlYmFqbyBkZWwgdGV4dG8gbnVldm8uICovfVxuICAgICAgICB7aXNBc3Npc3RhbnQgJiZcbiAgICAgICAgICAoaXNBY3RpdmVTdHJlYW1pbmcgPyAoXG4gICAgICAgICAgICA8UmVhc29uaW5nVGltZWxpbmUgbWVzc2FnZUlkPXtpZH0gc3RyZWFtQWN0aXZpdHk9e3N0cmVhbUFjdGl2aXR5fSBzdHJlYW1pbmdUZXh0PXtzdHJlYW1pbmdUZXh0fSAvPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8UmVhc29uaW5nQmxvY2sgbWVzc2FnZUlkPXtpZH0gdHJhY2U9e3Byb3BzLnJlYXNvbmluZyA/PyBudWxsfSAvPlxuICAgICAgICAgICkpfVxuICAgICAgICB7c2hvdWxkU2hvd01lc3NhZ2VBdHRhY2htZW50c1JvdyhtZXNzYWdlQXR0YWNobWVudHMubGVuZ3RoKSAmJiAoXG4gICAgICAgICAgPFNDQXR0YWNobWVudHNSb3cgJGlzQXNzaXN0YW50PXtpc0Fzc2lzdGFudH0+XG4gICAgICAgICAgICB7bWVzc2FnZUF0dGFjaG1lbnRzLm1hcCgoYXR0YWNobWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRGV0ZWN0YXIgc2kgZXMgdW4gYXJjaGl2byBkZSBhdWRpb1xuICAgICAgICAgICAgICBpZiAoaXNBdWRpb0F0dGFjaG1lbnQoYXR0YWNobWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPEF0dGFjaG1lbnRDYXJkQXVkaW8ga2V5PXtgJHthdHRhY2htZW50LmlkfS0ke2F0dGFjaG1lbnQubmFtZX1gfSBhdHRhY2htZW50PXthdHRhY2htZW50fSAvPlxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8QXR0YWNobWVudENhcmRcbiAgICAgICAgICAgICAgICAgIGtleT17YCR7YXR0YWNobWVudC5pZH0tJHthdHRhY2htZW50Lm5hbWV9YH1cbiAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQ9e2F0dGFjaG1lbnR9XG4gICAgICAgICAgICAgICAgICBwb3NpdGlvbkluZGV4PXtpbmRleH1cbiAgICAgICAgICAgICAgICAgIG9uRG93bmxvYWQ9eygpID0+IGhhbmRsZUF0dGFjaG1lbnREb3dubG9hZChhdHRhY2htZW50KX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZUF0dGFjaG1lbnRDbGljayhhdHRhY2htZW50KX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L1NDQXR0YWNobWVudHNSb3c+XG4gICAgICAgICl9XG4gICAgICAgIHtzaG91bGRSZW5kZXJNZXNzYWdlVGV4dEJvZHkoe1xuICAgICAgICAgIG1lc3NhZ2VUZXh0OiBtZXNzYWdlLFxuICAgICAgICAgIHNob3dTdHJlYW1pbmdCb2R5LFxuICAgICAgICAgIGlzQXNzaXN0YW50LFxuICAgICAgICAgIGF0dGFjaG1lbnRDb3VudDogbWVzc2FnZUF0dGFjaG1lbnRzLmxlbmd0aCxcbiAgICAgICAgfSkgJiYgKFxuICAgICAgICAgIDxTdHJlYW1pbmdNZXNzYWdlQm9keVxuICAgICAgICAgICAgbWVzc2FnZT17bWVzc2FnZSA/PyAnJ31cbiAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtzaG93U3RyZWFtaW5nQm9keX1cbiAgICAgICAgICAgIGlzQ3VycmVudFVzZXI9e2lzQ3VycmVudFVzZXJ9XG4gICAgICAgICAgICBpc0Fzc2lzdGFudD17aXNBc3Npc3RhbnR9XG4gICAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkPXtwcm9wcy5pc0Zyb250ZW5kQ2FuY2VsbGVkfVxuICAgICAgICAgICAgYXBwcm92YWw9e2FwcHJvdmFsfVxuICAgICAgICAgICAgaXNFcnJvcj17aXNFcnJvcn1cbiAgICAgICAgICAgIHNvdXJjZXM9e3NvdXJjZXN9XG4gICAgICAgICAgICBzdWdnZXN0aW9ucz17c3VnZ2VzdGlvbnN9XG4gICAgICAgICAgICBjcmVhdGVBZ2VudEZvbGxvd1VwPXtjcmVhdGVBZ2VudEZvbGxvd1VwfVxuICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2tDbGljaz17aGFuZGxlRmVlZGJhY2tDbGlja31cbiAgICAgICAgICAgIGRpc2FibGVGZWVkYmFjaz17ZGlzYWJsZUZlZWRiYWNrID8/IG51bGx9XG4gICAgICAgICAgICBvblJldHJ5PXtoYW5kbGVSZXRyeX1cbiAgICAgICAgICAgIGhhbmRsZVN1Z2dlc3Rpb25DbGljaz17aGFuZGxlU3VnZ2VzdGlvbkNsaWNrfVxuICAgICAgICAgICAgc3VnZ2VzdGlvbnNEaXNhYmxlZD17aXNBY3RpdmVTdHJlYW1pbmcgfHwgISFoYXNTZWxlY3RlZFN1Z2dlc3Rpb259XG4gICAgICAgICAgICBtZXNzYWdlSWQ9e2lkfVxuICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aXNMYXN0TWVzc2FnZX1cbiAgICAgICAgICAvPlxuICAgICAgICApfVxuICAgICAgICB7LyogU3Bpbm5lciBkZSBhY3RpdmlkYWQ6IHZpc2libGUgdGFtYmnDqW4gZW4gd3JpdGluZyAobmFycmFjacOzbiBlbiB0cmF6YSBvIHJlc3B1ZXN0YSBmaW5hbCkuICovfVxuICAgICAgICB7c2hvd0FjdGl2aXR5SW5kaWNhdG9yICYmIHN0cmVhbUFjdGl2aXR5ID8gKFxuICAgICAgICAgIDxTQ1RpbWVsaW5lSW5kaWNhdG9yPlxuICAgICAgICAgICAgPEFnZW50QWN0aXZpdHlJbmRpY2F0b3IgYWN0aXZpdHk9e3N0cmVhbUFjdGl2aXR5fSBjb21wYWN0IC8+XG4gICAgICAgICAgPC9TQ1RpbWVsaW5lSW5kaWNhdG9yPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAge3Nob3VsZFNob3dBcHByb3ZhbEFjdGlvbnMoYXBwcm92YWwpICYmIGFwcHJvdmFsICYmIChcbiAgICAgICAgICA8U0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4+XG4gICAgICAgICAgICA8QXBwcm92YWxCb3hcbiAgICAgICAgICAgICAgYWN0aW9ucz17YXBwcm92YWwucGVuZGluZ19hY3Rpb25zfVxuICAgICAgICAgICAgICBzdGF0dXM9e2FwcHJvdmFsU3RhdHVzfVxuICAgICAgICAgICAgICBvbkFwcHJvdmU9eyh0aHJlYWRJZHMsIG1ldGFkYXRhKSA9PiBoYW5kbGVBcHByb3ZhbERlY2lzaW9uKHRocmVhZElkcywgJ2FwcHJvdmUnLCB1bmRlZmluZWQsIG1ldGFkYXRhKX1cbiAgICAgICAgICAgICAgb25SZWplY3Q9e3RocmVhZElkcyA9PiBoYW5kbGVBcHByb3ZhbERlY2lzaW9uKHRocmVhZElkcywgJ3JlamVjdCcpfVxuICAgICAgICAgICAgICBpc1Byb2plY3REZWxldGVkPXtwcm9wcy5wcm9qZWN0TWV0YWRhdGE/LmlzX2RlbGV0ZWQgPT09IHRydWV9XG4gICAgICAgICAgICAgIGlzRXhwYW5kZWQ9e3Byb3BzLmV4cGFuZGVkfVxuICAgICAgICAgICAgICBoaXRsSW5zdGFuY2VJZD17YXBwcm92YWwub3JpZ2luYWxfdGhyZWFkX2lkfVxuICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZT17YXBwcm92YWwud2FybmluZ19tZXNzYWdlfVxuICAgICAgICAgICAgICBtYW51YWxBcHByb3ZhbERldGVjdGVkPXthcHByb3ZhbC5tYW51YWxfYXBwcm92YWxfZGV0ZWN0ZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvU0NBcHByb3ZhbEFjdGlvbnNDb2x1bW4+XG4gICAgICAgICl9XG4gICAgICA8L1NDTWVzc2FnZUl0ZW1Jbm5lcj5cbiAgICAgIDxBdHRhY2htZW50UHJldmlld01vZGFsXG4gICAgICAgIGlzT3Blbj17ISFwcmV2aWV3QXR0YWNobWVudH1cbiAgICAgICAgb25DbG9zZT17aGFuZGxlQ2xvc2VQcmV2aWV3fVxuICAgICAgICBhdHRhY2htZW50PXtwcmV2aWV3QXR0YWNobWVudH1cbiAgICAgIC8+XG4gICAgPC9TQ01lc3NhZ2VJdGVtV3JhcHBlcj5cbiAgKVxufSlcblxuY29uc3QgQ2hhdEFJTWVzc2FnZXNJbm5lciA9ICh7XG4gIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgaW5pdGlhbENoYXRJZCxcbiAgb25FcnJvcixcbiAgb25TZW5kTWVzc2FnZVJlYWR5LFxuICBvblNjcm9sbFRvQm90dG9tLFxuICBhdHRhY2htZW50cyxcbiAgYWdlbnRzLFxuICBleHBhbmRlZCxcbn06IENoYXRBSU1lc3NhZ2VzUHJvcHMpID0+IHtcbiAgY29uc3QgeyB0IH0gPSB1c2VUKClcbiAgY29uc3QgeyBpc1dlYlNlYXJjaEFjdGl2ZSwgaXNEZWVwU2VhcmNoQWN0aXZlLCBhZ2VudCB9ID0gdXNlR2xvYmFsQ29udGV4dCgpXG4gIGNvbnN0IGV2ZW50ID0gdXNlRXZlbnQoKVxuICBjb25zdCBhdXRoVXNlciA9IHVzZVVzZXIoKVxuICBjb25zdCBtZXNzYWdlc1JlZiA9IHVzZVJlZjxIVE1MRGl2RWxlbWVudD4obnVsbClcbiAgY29uc3QgY2hhdEluaXRpYWxpemVkUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBpc0xvYWRpbmdNb3JlUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBzY3JvbGxUaHJlc2hvbGRSZWYgPSB1c2VSZWYoMzkpXG4gIGNvbnN0IGxhc3RTY3JvbGxUb3BSZWYgPSB1c2VSZWYoMClcbiAgY29uc3Qgc2hvd1Njcm9sbFRvQm90dG9tUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBzaG93VG9wR3JhZGllbnRSZWYgPSB1c2VSZWYoZmFsc2UpXG4gIGNvbnN0IHNob3dCb3R0b21HcmFkaWVudFJlZiA9IHVzZVJlZihmYWxzZSlcbiAgY29uc3Qgc2Nyb2xsUmFmUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIC8qKlxuICAgKiBUdXJubyBjb24gZWwgc2Nyb2xsIGJham8gY29udHJvbCBkZWwgdXN1YXJpbzogZGVzZGUgcXVlIGVudsOtYSBlbCBtZW5zYWplIHlcbiAgICogaGFzdGEgZWwgcHLDs3hpbW8gZW52w61vIG5vIG1vdmVtb3MgZWwgc2Nyb2xsIHBvciBuaW5nw7puIG1vdGl2by4gRXNcbiAgICogaW5kZXBlbmRpZW50ZSBkZSBsYSBhbHR1cmEgZGVsIHNwYWNlciwgcXVlIHB1ZWRlIGxsZWdhciBhIDAgc2luIGRlc2FuY2xhci5cbiAgICovXG4gIGNvbnN0IGFuY2hvcmVkVHVybklkUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNwYWNlckVsUmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50IHwgbnVsbD4obnVsbClcbiAgY29uc3Qgc3BhY2VySGVpZ2h0UmVmID0gdXNlUmVmKDApXG4gIGNvbnN0IHR1cm5TY3JvbGxSYWZSZWYgPSB1c2VSZWY8bnVtYmVyIHwgbnVsbD4obnVsbClcbiAgY29uc3Qgd2FzTG9hZGluZ01lc3NhZ2VzUmVmID0gdXNlUmVmKGZhbHNlKVxuICBjb25zdCBsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmID0gdXNlUmVmPHN0cmluZyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmID0gdXNlUmVmPG51bWJlciB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHNjcm9sbFBlcnNpc3RUaW1lclJlZiA9IHVzZVJlZjxudW1iZXIgfCBudWxsPihudWxsKVxuICBjb25zdCBbc2hvd1Njcm9sbFRvQm90dG9tLCBzZXRTaG93U2Nyb2xsVG9Cb3R0b21dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzaG93VG9wR3JhZGllbnQsIHNldFNob3dUb3BHcmFkaWVudF0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3Nob3dCb3R0b21HcmFkaWVudCwgc2V0U2hvd0JvdHRvbUdyYWRpZW50XSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcywgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc10gPSB1c2VTdGF0ZTxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oe30pXG5cbiAgY29uc3Qge1xuICAgIG1lc3NhZ2VzLFxuICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsXG4gICAgd2FpdGluZ1Jlc3BvbnNlLFxuICAgIGlzV3JpdGluZyxcbiAgICBsb2FkaW5nTWVzc2FnZSxcbiAgICBzdHJlYW1BY3Rpdml0eSxcbiAgICBhY3RpdmVMb2FkaW5ncyxcbiAgICBzZW5kTWVzc2FnZSxcbiAgICByZXRyeU1lc3NhZ2UsXG4gICAgY2hhbmdlUHJvamVjdCxcbiAgICBoYW5kbGVGZWVkYmFjayxcbiAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uLFxuICAgIGluaXRpYWxpemVDaGF0LFxuICAgIGhhbmRsZVNjcm9sbCxcbiAgICBzdG9wR2VuZXJhdGlvbixcbiAgfSA9IHVzZUNoYXRNYW5hZ2VyKHtcbiAgICBjaGF0SWQ6IGluaXRpYWxDaGF0SWQgfHwgdW5kZWZpbmVkLFxuICAgIHVzZXJJbml0aWFsTWVzc2FnZSxcbiAgICBvbkVycm9yLFxuICAgIGF0dGFjaG1lbnRzLFxuICAgIGFnZW50cyxcbiAgfSlcblxuICBjb25zdCBoYW5kbGVTZWxlY3RPcHRpb24gPSB1c2VDYWxsYmFjayhcbiAgICAob3B0aW9uOiBQcm9qZWN0KSA9PiB7XG4gICAgICBjaGFuZ2VQcm9qZWN0KG9wdGlvbilcbiAgICB9LFxuICAgIFtjaGFuZ2VQcm9qZWN0XVxuICApXG5cbiAgLyoqXG4gICAqIFJlY2FsY3VsYSBlbCBib3TDs24gXCJzY3JvbGwgdG8gYm90dG9tXCIgeSBsb3MgZ3JhZGllbnRlcyBkZSBib3JkZSBhIHBhcnRpciBkZVxuICAgKiBsYSBwb3NpY2nDs24gZGVsIHNjcm9sbC4gTG9zIHJlZnMgZXZpdGFuIGBzZXRTdGF0ZWAgY3VhbmRvIGVsIHZhbG9yIG5vIGNhbWJpYTpcbiAgICogZXN0byBjb3JyZSBlbiBjYWRhIGZyYW1lIGRlbCBzdHJlYW0uXG4gICAqL1xuICBjb25zdCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcyA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cbiAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGVsXG4gICAgLy8gRWwgc3BhY2VyIGRlbCB0dXJubyBlcyBhbHRvIHJlc2VydmFkbywgbm8gY29udGVuaWRvOiBzaSBubyBsbyBkZXNjb250YW1vc1xuICAgIC8vIGxhIGZsZWNoYSB5IGVsIGdyYWRpZW50ZSBkZSBhYmFqbyBxdWVkYW4gZW5jZW5kaWRvcyBkdXJhbnRlIHRvZG8gZWwgdHVybm8uXG4gICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gY29tcHV0ZURpc3RhbmNlRnJvbUJvdHRvbShzY3JvbGxIZWlnaHQsIHNwYWNlckhlaWdodFJlZi5jdXJyZW50LCBzY3JvbGxUb3AsIGNsaWVudEhlaWdodClcblxuICAgIGNvbnN0IHNob3VsZFNob3cgPSBzaG91bGRTaG93U2Nyb2xsVG9Cb3R0b20oZGlzdGFuY2VGcm9tQm90dG9tKVxuICAgIGlmIChzaG93U2Nyb2xsVG9Cb3R0b21SZWYuY3VycmVudCAhPT0gc2hvdWxkU2hvdykge1xuICAgICAgc2hvd1Njcm9sbFRvQm90dG9tUmVmLmN1cnJlbnQgPSBzaG91bGRTaG93XG4gICAgICBzZXRTaG93U2Nyb2xsVG9Cb3R0b20oc2hvdWxkU2hvdylcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0VG9wR3JhZGllbnQgPSBzaG91bGRTaG93VG9wU2Nyb2xsR3JhZGllbnQoc2Nyb2xsVG9wKVxuICAgIGlmIChzaG93VG9wR3JhZGllbnRSZWYuY3VycmVudCAhPT0gbmV4dFRvcEdyYWRpZW50KSB7XG4gICAgICBzaG93VG9wR3JhZGllbnRSZWYuY3VycmVudCA9IG5leHRUb3BHcmFkaWVudFxuICAgICAgc2V0U2hvd1RvcEdyYWRpZW50KG5leHRUb3BHcmFkaWVudClcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0Qm90dG9tR3JhZGllbnQgPSBzaG91bGRTaG93Qm90dG9tU2Nyb2xsR3JhZGllbnQoZGlzdGFuY2VGcm9tQm90dG9tKVxuICAgIGlmIChzaG93Qm90dG9tR3JhZGllbnRSZWYuY3VycmVudCAhPT0gbmV4dEJvdHRvbUdyYWRpZW50KSB7XG4gICAgICBzaG93Qm90dG9tR3JhZGllbnRSZWYuY3VycmVudCA9IG5leHRCb3R0b21HcmFkaWVudFxuICAgICAgc2V0U2hvd0JvdHRvbUdyYWRpZW50KG5leHRCb3R0b21HcmFkaWVudClcbiAgICB9XG4gIH0sIFtdKVxuXG4gIC8qKlxuICAgKiBTY3JvbGwgaW5tZWRpYXRvIGFsIGZvbmRvIChkZW50cm8gZGUgckFGIHBhcmEgY29vcmRpbmFyIGNvbiBlbCBwYWludClcbiAgICogeSBhY3R1YWxpemEgbGEgdmlzaWJpbGlkYWQgZGVsIGJvdMOzbi4gU29sbyBzZSB1c2EgYWwgYWJyaXIvY2FyZ2FyIHVuIGNoYXRcbiAgICogbyBjdWFuZG8gZWwgdXN1YXJpbyBwaWRlIGlyIGFsIGZvbmRvOiBudW5jYSBkdXJhbnRlIGVsIHN0cmVhbS5cbiAgICovXG4gIGNvbnN0IHNjcm9sbFRvQm90dG9tUmFmID0gdXNlQ2FsbGJhY2soXG4gICAgKG9wdHM6IHsgZGVsYXlNcz86IG51bWJlciB9ID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHsgZGVsYXlNcyA9IDAgfSA9IG9wdHNcbiAgICAgIGNvbnN0IHJ1biA9ICgpID0+IHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICAgICAgICBpZiAoIWVsKSByZXR1cm5cbiAgICAgICAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHRcbiAgICAgICAgICB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlcygpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoZGVsYXlNcyA+IDApIHNldFRpbWVvdXQocnVuLCBkZWxheU1zKVxuICAgICAgZWxzZSBydW4oKVxuICAgIH0sXG4gICAgW3VwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXVxuICApXG5cbiAgY29uc3QgY2FuY2VsVHVyblNjcm9sbCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBpZiAodHVyblNjcm9sbFJhZlJlZi5jdXJyZW50ID09PSBudWxsKSByZXR1cm5cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQpXG4gICAgdHVyblNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbXSlcblxuICAvKipcbiAgICogU2Nyb2xsIGFuaW1hZG8gY29uIGVhc2luZyBwcm9waW86IGBiZWhhdmlvcjogJ3Ntb290aCdgIG5vIHBlcm1pdGUgcmVndWxhciBsYVxuICAgKiBkdXJhY2nDs24geSBlbCBzYWx0byBhbCBhbmNsYXIgZWwgdHVybm8gcXVlZGEgZGVtYXNpYWRvIHNlY28uXG4gICAqL1xuICBjb25zdCBhbmltYXRlU2Nyb2xsVG8gPSB1c2VDYWxsYmFjayhcbiAgICAodG9wOiBudW1iZXIpID0+IHtcbiAgICAgIGNhbmNlbFR1cm5TY3JvbGwoKVxuICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBpZiAoIWVsKSByZXR1cm5cbiAgICAgIGNvbnN0IGZyb20gPSBlbC5zY3JvbGxUb3BcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gdG9wIC0gZnJvbVxuICAgICAgaWYgKHNob3VsZFNraXBUdXJuU2Nyb2xsQW5pbWF0aW9uKGRpc3RhbmNlKSkgcmV0dXJuXG5cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gY29tcHV0ZVR1cm5TY3JvbGxEdXJhdGlvbk1zKGRpc3RhbmNlKVxuXG4gICAgICBjb25zdCBzdGFydGVkQXQgPSBwZXJmb3JtYW5jZS5ub3coKVxuICAgICAgY29uc3Qgc3RlcCA9IChub3c6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBwcm9ncmVzcyA9IE1hdGgubWluKDEsIChub3cgLSBzdGFydGVkQXQpIC8gZHVyYXRpb24pXG4gICAgICAgIGNvbnN0IGVhc2VkID0gZWFzZU91dEV4cG9TY3JvbGxQcm9ncmVzcyhwcm9ncmVzcylcbiAgICAgICAgZWwuc2Nyb2xsVG9wID0gZnJvbSArIGRpc3RhbmNlICogZWFzZWRcbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgICB0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSBwcm9ncmVzcyA8IDEgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcCkgOiBudWxsXG4gICAgICB9XG4gICAgICB0dXJuU2Nyb2xsUmFmUmVmLmN1cnJlbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RlcClcbiAgICB9LFxuICAgIFtjYW5jZWxUdXJuU2Nyb2xsLCB1cGRhdGVTY3JvbGxBZmZvcmRhbmNlc11cbiAgKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiBjYW5jZWxUdXJuU2Nyb2xsLCBbY2FuY2VsVHVyblNjcm9sbF0pXG5cbiAgY29uc3Qgc2V0U3BhY2VySGVpZ2h0ID0gdXNlQ2FsbGJhY2soKG5leHQ6IG51bWJlcikgPT4ge1xuICAgIGlmICghc2hvdWxkVXBkYXRlU3BhY2VySGVpZ2h0KHNwYWNlckhlaWdodFJlZi5jdXJyZW50LCBuZXh0KSkgcmV0dXJuXG4gICAgc3BhY2VySGVpZ2h0UmVmLmN1cnJlbnQgPSBuZXh0XG4gICAgaWYgKHNwYWNlckVsUmVmLmN1cnJlbnQpIHtcbiAgICAgIHNwYWNlckVsUmVmLmN1cnJlbnQuc3R5bGUuaGVpZ2h0ID0gYCR7bmV4dH1weGBcbiAgICB9XG4gIH0sIFtdKVxuXG4gIGNvbnN0IGNsZWFyVHVyblNwYWNlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgc2V0U3BhY2VySGVpZ2h0KDApXG4gIH0sIFtzZXRTcGFjZXJIZWlnaHRdKVxuXG4gIC8qKlxuICAgKiBEZXZ1ZWx2ZSBlbCBhbHRvIHJlc2VydmFkbyBxdWUgc2UgcHVlZGUgc2FjYXIgc2luIG1vdmVyIGxhIHZpc3RhOiB0b2RvIGxvXG4gICAqIHF1ZSBxdWVkZSBwb3IgZGViYWpvIGRlbCBzY3JvbGwgYWN0dWFsLiBTaSBlbCB1c3VhcmlvIGVzdMOhIGVuIGVsIGZvbmRvLCBzZVxuICAgKiBzYWNhIGVudGVybzsgc2kgZXN0w6EgYSBtaXRhZCBkZSBjYW1pbm8sIHNlIHZhIGRyZW5hbmRvIGEgbWVkaWRhIHF1ZSBiYWphLlxuICAgKi9cbiAgY29uc3QgZHJhaW5UdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgaWYgKCFlbCB8fCBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA8PSAwKSByZXR1cm5cbiAgICBzZXRTcGFjZXJIZWlnaHQoY29tcHV0ZVJlbW92YWJsZVR1cm5TcGFjZShlbC5zY3JvbGxIZWlnaHQsIGVsLmNsaWVudEhlaWdodCwgZWwuc2Nyb2xsVG9wLCBzcGFjZXJIZWlnaHRSZWYuY3VycmVudCkpXG4gIH0sIFtzZXRTcGFjZXJIZWlnaHRdKVxuXG4gIC8qKlxuICAgKiBFbCB1c3VhcmlvIHRvbcOzIGVsIGNvbnRyb2wgZGVsIHNjcm9sbDogZWwgdHVybm8gZGVqYSBkZSBlc3RhciBhbmNsYWRvIHkgZWxcbiAgICogZXNwYWNpbyByZXNlcnZhZG8gZW1waWV6YSBhIGRldm9sdmVyc2UuIFNpbiBhbmNsYSB5IGNvbiBzcGFjZXIgPiAwLCBlbFxuICAgKiBoYW5kbGVyIGRlIHNjcm9sbCBzaWd1ZSBkcmVuYW5kbyBoYXN0YSBxdWUgbGxlZ2EgYWwgZm9uZG8geSBubyBxdWVkYSBodWVjby5cbiAgICovXG4gIGNvbnN0IHJlbGVhc2VUdXJuU3BhY2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgaWYgKCFzaG91bGRSZWxlYXNlVHVyblNwYWNlKGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQsIHNwYWNlckhlaWdodFJlZi5jdXJyZW50KSkgcmV0dXJuXG4gICAgYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudCA9IG51bGxcbiAgICBkcmFpblR1cm5TcGFjZSgpXG4gIH0sIFtkcmFpblR1cm5TcGFjZV0pXG5cbiAgY29uc3QgaGFuZGxlVXNlclNjcm9sbEludGVudCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjYW5jZWxUdXJuU2Nyb2xsKClcbiAgICByZWxlYXNlVHVyblNwYWNlKClcbiAgfSwgW2NhbmNlbFR1cm5TY3JvbGwsIHJlbGVhc2VUdXJuU3BhY2VdKVxuXG4gIGNvbnN0IG1lYXN1cmVUdXJuID0gdXNlQ2FsbGJhY2soKHF1ZXN0aW9uSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGVsID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGNvbnN0IHNwYWNlckVsID0gc3BhY2VyRWxSZWYuY3VycmVudFxuICAgIGlmICghZWwgfHwgIXNwYWNlckVsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgcXVlc3Rpb25FbCA9IGVsLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS1tZXNzYWdlLWlkPVwiJHtxdWVzdGlvbklkfVwiXWApXG4gICAgaWYgKCFxdWVzdGlvbkVsKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgY29udGFpbmVyVG9wID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wXG4gICAgY29uc3QgeyBxdWVzdGlvblRvcCwgdHVybkhlaWdodCB9ID0gY29tcHV0ZU1lYXN1cmVUdXJuTGF5b3V0KHtcbiAgICAgIGNvbnRhaW5lclRvcCxcbiAgICAgIHF1ZXN0aW9uVG9wOiBxdWVzdGlvbkVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCxcbiAgICAgIGNvbnRlbnRCb3R0b206IHNwYWNlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCxcbiAgICAgIHNjcm9sbFRvcDogZWwuc2Nyb2xsVG9wLFxuICAgIH0pXG4gICAgcmV0dXJuIHsgZWwsIHF1ZXN0aW9uVG9wLCB0dXJuSGVpZ2h0IH1cbiAgfSwgW10pXG5cbiAgY29uc3QgcmVzZXJ2ZVR1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKFxuICAgIChxdWVzdGlvbklkOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVR1cm4ocXVlc3Rpb25JZClcbiAgICAgIGlmICghbWVhc3VyZWQpIHJldHVyblxuICAgICAgY29uc3QgeyBlbCwgcXVlc3Rpb25Ub3AsIHR1cm5IZWlnaHQgfSA9IG1lYXN1cmVkXG5cbiAgICAgIC8vIEFuY2xhbW9zIHNpZW1wcmUsIGluY2x1c28gY3VhbmRvIG5vIGhhZ2EgZmFsdGEgcmVzZXJ2YXI6IGR1cmFudGUgZWxcbiAgICAgIC8vIHR1cm5vIGVsIHNjcm9sbCBubyBzZSBtdWV2ZSBzb2xvIGVuIG5pbmfDum4gY2Fzby5cbiAgICAgIGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQgPSBxdWVzdGlvbklkXG5cbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFRvcCA9IGNvbXB1dGVUdXJuU2Nyb2xsVGFyZ2V0VG9wKHF1ZXN0aW9uVG9wLCBlbC5jbGllbnRIZWlnaHQpXG4gICAgICBjb25zdCBwbGFuID0gcmVzb2x2ZVJlc2VydmVUdXJuU3BhY2VQbGFuKHtcbiAgICAgICAgY3VycmVudFNjcm9sbFRvcDogZWwuc2Nyb2xsVG9wLFxuICAgICAgICB0YXJnZXRTY3JvbGxUb3AsXG4gICAgICAgIGNsaWVudEhlaWdodDogZWwuY2xpZW50SGVpZ2h0LFxuICAgICAgICB0dXJuSGVpZ2h0LFxuICAgICAgfSlcbiAgICAgIGlmIChwbGFuLmtpbmQgPT09ICdza2lwLXJlc2VydmF0aW9uJykge1xuICAgICAgICBzZXRTcGFjZXJIZWlnaHQoMClcbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc2V0U3BhY2VySGVpZ2h0KHBsYW4uc3BhY2VySGVpZ2h0KVxuICAgICAgYW5pbWF0ZVNjcm9sbFRvKHBsYW4udGFyZ2V0U2Nyb2xsVG9wKVxuICAgIH0sXG4gICAgW21lYXN1cmVUdXJuLCBzZXRTcGFjZXJIZWlnaHQsIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzLCBhbmltYXRlU2Nyb2xsVG9dXG4gIClcblxuICAvKipcbiAgICogRW5jb2dlIGVsIHNwYWNlciBhIG1lZGlkYSBxdWUgY3JlY2UgbGEgcmVzcHVlc3RhOiBlbCBhbHRvIHRvdGFsIGRlbCBzY3JvbGxcbiAgICogcXVlZGEgY29uc3RhbnRlIHkgbGEgdmlzdGEgbm8gc2UgbXVldmUgc29sYS4gU29sbyBhY2hpY2EsIG51bmNhIGFncmFuZGEsXG4gICAqIHBhcmEgbm8gaW55ZWN0YXIgZXNwYWNpbyBlbiB0dXJub3MgcXVlIGFycmFuY2Fyb24gc2luIHJlc2VydmEuXG4gICAqIERldnVlbHZlIHNpIGVsIHR1cm5vIHNpZ3VlIGFuY2xhZG8gKGF1bnF1ZSBlbCBzcGFjZXIgeWEgc2VhIDApLlxuICAgKi9cbiAgY29uc3Qgc3luY1R1cm5TcGFjZSA9IHVzZUNhbGxiYWNrKCgpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIWFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQpIHJldHVybiBmYWxzZVxuICAgIGlmIChzcGFjZXJIZWlnaHRSZWYuY3VycmVudCA+IDApIHtcbiAgICAgIGNvbnN0IG1lYXN1cmVkID0gbWVhc3VyZVR1cm4oYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudClcbiAgICAgIGlmIChtZWFzdXJlZCkge1xuICAgICAgICBzZXRTcGFjZXJIZWlnaHQoXG4gICAgICAgICAgY29tcHV0ZVN5bmNlZFR1cm5TcGFjZXJIZWlnaHQobWVhc3VyZWQuZWwuY2xpZW50SGVpZ2h0LCBtZWFzdXJlZC50dXJuSGVpZ2h0LCBzcGFjZXJIZWlnaHRSZWYuY3VycmVudClcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9LCBbbWVhc3VyZVR1cm4sIHNldFNwYWNlckhlaWdodF0pXG5cbiAgY29uc3QgaGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBjb25zdCBlbCA9IG1lc3NhZ2VzUmVmLmN1cnJlbnRcbiAgICBpZiAoIWVsKSByZXR1cm5cbiAgICBjbGVhclR1cm5TcGFjZSgpXG4gICAgLy8gTWlzbWEgY3VydmEgeSBkdXJhY2nDs24gcXVlIGVsIGFuY2xhamUgZGVsIHR1cm5vOiBlbCBgc21vb3RoYCBuYXRpdm8gZnJlbmEgc2Vjby5cbiAgICBhbmltYXRlU2Nyb2xsVG8ocmVzb2x2ZVNjcm9sbFRvQm90dG9tVGFyZ2V0VG9wKGVsLnNjcm9sbEhlaWdodCwgZWwuY2xpZW50SGVpZ2h0KSlcbiAgfSwgW2NsZWFyVHVyblNwYWNlLCBhbmltYXRlU2Nyb2xsVG9dKVxuXG4gIGNvbnN0IGhhbmRsZVNjcm9sbFRvQm90dG9tID0gdXNlQ2FsbGJhY2soXG4gICAgKGU6IFJlYWN0LlVJRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBlLmN1cnJlbnRUYXJnZXRcblxuICAgICAgaWYgKHNjcm9sbFJhZlJlZi5jdXJyZW50ICE9PSBudWxsKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHNjcm9sbFJhZlJlZi5jdXJyZW50KVxuICAgICAgfVxuXG4gICAgICBzY3JvbGxSYWZSZWYuY3VycmVudCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHNjcm9sbFJhZlJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgICBjb25zdCB7IHNjcm9sbFRvcCwgc2Nyb2xsSGVpZ2h0LCBjbGllbnRIZWlnaHQgfSA9IGNvbnRhaW5lclxuXG4gICAgICAgIGNvbnN0IHNjcm9sbEZyYW1lID0gcHJvY2Vzc0NoYXRNZXNzYWdlc1Njcm9sbEZyYW1lKHtcbiAgICAgICAgICBzY3JvbGxUb3AsXG4gICAgICAgICAgc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgIGNsaWVudEhlaWdodCxcbiAgICAgICAgICBsYXN0U2Nyb2xsVG9wOiBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnQsXG4gICAgICAgICAgc2Nyb2xsVGhyZXNob2xkOiBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCxcbiAgICAgICAgICBhbmNob3JlZFR1cm5JZDogYW5jaG9yZWRUdXJuSWRSZWYuY3VycmVudCxcbiAgICAgICAgICBpbml0aWFsQ2hhdElkLFxuICAgICAgICB9KVxuXG4gICAgICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gc2Nyb2xsRnJhbWUubmV4dFNjcm9sbFRocmVzaG9sZFxuICAgICAgICBsYXN0U2Nyb2xsVG9wUmVmLmN1cnJlbnQgPSBzY3JvbGxGcmFtZS5sYXN0U2Nyb2xsVG9wXG5cbiAgICAgICAgaWYgKHNjcm9sbEZyYW1lLnNob3VsZERyYWluVHVyblNwYWNlKSBkcmFpblR1cm5TcGFjZSgpXG5cbiAgICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuXG4gICAgICAgIGlmIChzY3JvbGxGcmFtZS5zaG91bGRTY2hlZHVsZVNjcm9sbFBlcnNpc3QpIHtcbiAgICAgICAgICBpZiAoc2Nyb2xsUGVyc2lzdFRpbWVyUmVmLmN1cnJlbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzY3JvbGxQZXJzaXN0VGltZXJSZWYuY3VycmVudClcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsUGVyc2lzdFRpbWVyUmVmLmN1cnJlbnQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwYXRjaE1haWFQYW5lbFNlc3Npb24oYXV0aFVzZXIuaWQsIHtcbiAgICAgICAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICAgICAgICBzY3JvbGxTZXNzaW9uSWQ6IGluaXRpYWxDaGF0SWQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0sIDE1MClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzY3JvbGxGcmFtZS5zaG91bGROb3RpZnlTY3JvbGxUb0JvdHRvbSAmJiBvblNjcm9sbFRvQm90dG9tKSB7XG4gICAgICAgICAgb25TY3JvbGxUb0JvdHRvbSgpXG4gICAgICAgIH1cblxuICAgICAgICBoYW5kbGVTY3JvbGwoY29udGFpbmVyKVxuICAgICAgfSlcbiAgICB9LFxuICAgIFthdXRoVXNlci5pZCwgZHJhaW5UdXJuU3BhY2UsIGhhbmRsZVNjcm9sbCwgaW5pdGlhbENoYXRJZCwgb25TY3JvbGxUb0JvdHRvbSwgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNdXG4gIClcblxuICAvLyByZWZzIHRvIHN0YWJpbGl6ZSBmdW5jdGlvbnMgYW5kIGF2b2lkIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnNcbiAgY29uc3Qgc2VuZE1lc3NhZ2VSZWYgPSB1c2VSZWYoc2VuZE1lc3NhZ2UpXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUmVmID0gdXNlUmVmKHN0b3BHZW5lcmF0aW9uKVxuICBjb25zdCBvblNlbmRNZXNzYWdlUmVhZHlSZWYgPSB1c2VSZWYob25TZW5kTWVzc2FnZVJlYWR5KVxuICBjb25zdCBzZW5kTWVzc2FnZVByb3h5UmVmID0gdXNlUmVmKFxuICAgIChcbiAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgIGF0dGFjaG1lbnRzPzogQXR0YWNobWVudEZpbGVbXSxcbiAgICAgIGZhcUlkPzogc3RyaW5nLFxuICAgICAgYWdlbnRTdWdnZXN0aW9uSWQ/OiBzdHJpbmcsXG4gICAgICBtZW50aW9ucz86IENvbnRleHRNZW50aW9uW10sXG4gICAgICBmdWFJZD86IHN0cmluZyxcbiAgICAgIHNjSWQ/OiBzdHJpbmdcbiAgICApID0+IHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQobWVzc2FnZSwgYXR0YWNobWVudHMsIGZhcUlkLCBhZ2VudFN1Z2dlc3Rpb25JZCwgbWVudGlvbnMsIGZ1YUlkLCBzY0lkKVxuICApXG4gIGNvbnN0IHN0b3BHZW5lcmF0aW9uUHJveHlSZWYgPSB1c2VSZWYoKCkgPT4gc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCgpKVxuXG4gIC8vIHVwZGF0ZSByZWZzIHdoZW4gZnVuY3Rpb25zIGNoYW5nZVxuICBzZW5kTWVzc2FnZVJlZi5jdXJyZW50ID0gc2VuZE1lc3NhZ2VcbiAgc3RvcEdlbmVyYXRpb25SZWYuY3VycmVudCA9IHN0b3BHZW5lcmF0aW9uXG4gIG9uU2VuZE1lc3NhZ2VSZWFkeVJlZi5jdXJyZW50ID0gb25TZW5kTWVzc2FnZVJlYWR5XG5cbiAgLyoqXG4gICAqIGBoYW5kbGVTdWdnZXN0aW9uQ2xpY2tgIHNlIHBhc2EgYSBUT0RPUyBsb3MgTWVzc2FnZUl0ZW0sIGFzw60gcXVlIHN1IGlkZW50aWRhZFxuICAgKiBkZWNpZGUgc2kgZWwgYG1lbW9gIGRlIGxhIGxpc3RhIHNvc3RpZW5lLiBMZWVtb3MgcG9yIHJlZiBsbyBxdWUgY2FtYmlhIGVuIGNhZGFcbiAgICogdXBkYXRlIChgbWVzc2FnZXNgLCBgc2VuZE1lc3NhZ2VgLCBsYXMgc3VnZXJlbmNpYXMgeWEgZWxlZ2lkYXMpIHBhcmEgcXVlIGVsXG4gICAqIGNhbGxiYWNrIHNlYSBlc3RhYmxlOiBzaSBubywgYWwgdGVybWluYXIgZWwgc3RyZWFtIHNlIHJlcGludGEgZWwgY2hhdCBlbnRlcm9cbiAgICogeSBjYWRhIE1haWFTdHJlYW1kb3duIHZ1ZWx2ZSBhIHBhcnNlYXIgc3UgbWFya2Rvd24uXG4gICAqL1xuICBjb25zdCBtZXNzYWdlc0RhdGFSZWYgPSB1c2VSZWYobWVzc2FnZXMpXG4gIG1lc3NhZ2VzRGF0YVJlZi5jdXJyZW50ID0gbWVzc2FnZXNcbiAgY29uc3Qgc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZiA9IHVzZVJlZihzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzKVxuICBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzUmVmLmN1cnJlbnQgPSBzZWxlY3RlZFN1Z2dlc3Rpb25NZXNzYWdlSWRzXG5cbiAgY29uc3QgaGFuZGxlU3VnZ2VzdGlvbkNsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKG1lc3NhZ2VJZDogc3RyaW5nLCBzdWdnZXN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmIChzaG91bGRJZ25vcmVTdWdnZXN0aW9uQ2xpY2soc3VnZ2VzdGlvbiwgc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1JlZi5jdXJyZW50W21lc3NhZ2VJZF0pKSByZXR1cm5cbiAgICAgIGNvbnN0IGN1cnJlbnRNZXNzYWdlcyA9IG1lc3NhZ2VzRGF0YVJlZi5jdXJyZW50XG4gICAgICBjb25zdCBpc01hcmtldHBsYWNlR2xvYmFsQWdlbnQgPSBpc01haWFrZXJBZ2VudChhZ2VudClcbiAgICAgIGV2ZW50KEVWRU5UUy5haUNoYXRTdWdnZXN0ZWRBbnN3ZXIsIHtcbiAgICAgICAgYWdlbnRfdHlwZTogcmVzb2x2ZVN1Z2dlc3Rpb25BbmFseXRpY3NBZ2VudFR5cGUoaXNNYXJrZXRwbGFjZUdsb2JhbEFnZW50LCBhZ2VudD8udHlwZSksXG4gICAgICB9KVxuICAgICAgc2V0U2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkcyhwcmV2ID0+ICh7IC4uLnByZXYsIFttZXNzYWdlSWRdOiB0cnVlIH0pKVxuXG4gICAgICBjb25zdCB0YXJnZXRNZXNzYWdlID0gY3VycmVudE1lc3NhZ2VzLmZpbmQobXNnID0+IG1zZy5pZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgaWYgKGlzUmV0cnlTdWdnZXN0aW9uU2VsZWN0aW9uKHRhcmdldE1lc3NhZ2U/LmlzRXJyb3IsIHN1Z2dlc3Rpb24sIHQoJ2NoYXQucmV0cnknKSkpIHtcbiAgICAgICAgY29uc3QgbGFzdFVzZXJNZXNzYWdlID0gY3VycmVudE1lc3NhZ2VzXG4gICAgICAgICAgLmZpbHRlcihtc2cgPT4gbXNnLnJvbGUgPT09IENoYXRIaXN0b3J5Um9sZS5VU0VSIHx8IG1zZy51c2VyLmlkID09PSBhdXRoVXNlci5pZC50b1N0cmluZygpKVxuICAgICAgICAgIC5hdCgtMSlcbiAgICAgICAgaWYgKGxhc3RVc2VyTWVzc2FnZT8ubWVzc2FnZSkge1xuICAgICAgICAgIHNlbmRNZXNzYWdlUmVmLmN1cnJlbnQobGFzdFVzZXJNZXNzYWdlLm1lc3NhZ2UsIHJlc29sdmVSZXRyeUF0dGFjaG1lbnRzRnJvbVVzZXJNZXNzYWdlKGxhc3RVc2VyTWVzc2FnZSkpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2VuZE1lc3NhZ2VSZWYuY3VycmVudChzdWdnZXN0aW9uKVxuICAgIH0sXG4gICAgW2V2ZW50LCBhZ2VudCwgdCwgYXV0aFVzZXIuaWRdXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvblNlbmRNZXNzYWdlUmVhZHlSZWYuY3VycmVudCkge1xuICAgICAgb25TZW5kTWVzc2FnZVJlYWR5UmVmLmN1cnJlbnQoXG4gICAgICAgIHNlbmRNZXNzYWdlUHJveHlSZWYuY3VycmVudCxcbiAgICAgICAgc3RvcEdlbmVyYXRpb25Qcm94eVJlZi5jdXJyZW50LFxuICAgICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICAgIGlzV3JpdGluZ1xuICAgICAgKVxuICAgIH1cbiAgfSwgW3dhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlzTG9hZGluZ01vcmVSZWYuY3VycmVudCA9IGlzTG9hZGluZ01vcmVNZXNzYWdlc1xuICB9LCBbaXNMb2FkaW5nTW9yZU1lc3NhZ2VzXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChzaG91bGRJbml0aWFsaXplQ2hhdChjaGF0SW5pdGlhbGl6ZWRSZWYuY3VycmVudCkpIHtcbiAgICAgIGNoYXRJbml0aWFsaXplZFJlZi5jdXJyZW50ID0gdHJ1ZVxuICAgICAgaW5pdGlhbGl6ZUNoYXQoKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgLy8gTWllbnRyYXMgZWwgc3RyZWFtIGNyZWNlOiBlbmNvZ2VyIGVsIHNwYWNlciBkZWwgdHVybm8gYW5jbGFkbyB5XG4gIC8vIGFjdHVhbGl6YXIgZmxlY2hhL2dyYWRpZW50ZXMuIEVsIHNjcm9sbCBubyBzZSBtdWV2ZSBzb2xvLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2hvdWxkUnVuU3RyZWFtVHVyblN5bmNFZmZlY3Qod2FpdGluZ1Jlc3BvbnNlLCBpc1dyaXRpbmcpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgaWYgKCFtZXNzYWdlc1JlZi5jdXJyZW50KSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBsZXQgcmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsXG5cbiAgICBjb25zdCB0aWNrID0gKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgICBpZiAoIWVsKSB7XG4gICAgICAgIHJhZklkID0gbnVsbFxuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHN5bmNUdXJuU3BhY2UoKVxuICAgICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMoKVxuICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljaylcbiAgICB9XG5cbiAgICByYWZJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKVxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAocmFmSWQgIT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmSWQpXG4gICAgfVxuICB9LCBbd2FpdGluZ1Jlc3BvbnNlLCBpc1dyaXRpbmcsIHN5bmNUdXJuU3BhY2UsIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzXSlcblxuICBjb25zdCBsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZiA9IHVzZVJlZjxzdHJpbmcgfCBudWxsPihudWxsKVxuXG4gIC8vIENhbWJpbyBkZSBjaGF0OiBlbCBhbmNsYSB5IGVsIHNwYWNlciBkZWwgdHVybm8gYW50ZXJpb3IgZGVqYW4gZGUgYXBsaWNhci5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNob3VsZENsZWFyTGFzdFJlc2VydmVkUXVlc3Rpb24obG9hZGluZ01lc3NhZ2VzKSkgcmV0dXJuXG4gICAgbGFzdFJlc2VydmVkUXVlc3Rpb25SZWYuY3VycmVudCA9IG51bGxcbiAgICBjbGVhclR1cm5TcGFjZSgpXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIGNsZWFyVHVyblNwYWNlXSlcblxuICAvLyBBbCBlbnZpYXIgdW4gbWVuc2FqZTogYW5jbGFtb3MgZWwgdHVybm8geSBoYWNlbW9zIGVsIMO6bmljbyBzY3JvbGwgZGVsIGNpY2xvLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHF1ZXN0aW9uSWQgPSBmaW5kTGFzdFF1ZXN0aW9uSWQobWVzc2FnZXMpXG4gICAgaWYgKFxuICAgICAgIXNob3VsZFNjaGVkdWxlVHVyblNwYWNlUmVzZXJ2YXRpb24oXG4gICAgICAgIGxvYWRpbmdNZXNzYWdlcyxcbiAgICAgICAgaXNMb2FkaW5nTW9yZU1lc3NhZ2VzLFxuICAgICAgICBxdWVzdGlvbklkLFxuICAgICAgICBsYXN0UmVzZXJ2ZWRRdWVzdGlvblJlZi5jdXJyZW50XG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoIXF1ZXN0aW9uSWQpIHJldHVyblxuICAgIGxhc3RSZXNlcnZlZFF1ZXN0aW9uUmVmLmN1cnJlbnQgPSBxdWVzdGlvbklkXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlc2VydmVUdXJuU3BhY2UocXVlc3Rpb25JZCkpXG4gIH0sIFttZXNzYWdlcywgbG9hZGluZ01lc3NhZ2VzLCBpc0xvYWRpbmdNb3JlTWVzc2FnZXMsIHJlc2VydmVUdXJuU3BhY2VdKVxuXG4gIC8vIFNjcm9sbCBjdWFuZG8gY2FtYmlhbiBsb3MgbWVuc2FqZXM6IGRpc3Rpbmd1ZSBcIm51ZXZvIG1lbnNhamVcIiAoYWdyZWdhZG8pXG4gIC8vIGRlIFwicmVlbXBsYXpvXCIgKG1pc21vIGlkL2xlbmd0aCwgZWouIGZlZWRiYWNrIG8gYXBwcm92YWxTdGF0dXMpLiBFblxuICAvLyByZWVtcGxhem9zIHNvbG8gc2UgcmVjYWxjdWxhIGxhIHZpc2liaWxpZGFkIGRlbCBib3TDs24gc2luIGZvcnphciBzY3JvbGwuXG4gIGNvbnN0IGxhc3RNZXNzYWdlSWRSZWYgPSB1c2VSZWY8c3RyaW5nIHwgbnVsbD4obnVsbClcbiAgY29uc3QgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmID0gdXNlUmVmPG51bWJlcj4oMClcblxuICAvLyBBbCBjYW1iaWFyIGRlIHNlc2nDs24sIHJlc2V0ZWFyIGVzdGFkbyBkZSBzY3JvbGwgbWFudWFsIHBhcmEgbm8gaGVyZWRhciBlbCBjaGF0IGFudGVyaW9yLlxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdhc0xvYWRpbmdNZXNzYWdlc1JlZi5jdXJyZW50ID0gZmFsc2VcbiAgICBsYXN0U2Nyb2xsZWRTZXNzaW9uUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgc2Nyb2xsVGhyZXNob2xkUmVmLmN1cnJlbnQgPSAzOVxuICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IDBcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBudWxsXG4gICAgbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnQgPSAwXG4gIH0sIFtpbml0aWFsQ2hhdElkXSlcblxuICAvLyBSZXN0YXVyYWNpw7NuIGRlc2RlIGNhY2hlIChzaW4gTG9hZGVyKTogYmFqYXIgYWwgZm9uZG8gYWwgcmVhYnJpciBzZXNpw7NuIHZpc2l0YWRhLlxuICB1c2VMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChcbiAgICAgICFzaG91bGRSdW5TZXNzaW9uQ2FjaGVTY3JvbGxUb0JvdHRvbShcbiAgICAgICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgICAgICBpbml0aWFsQ2hhdElkLFxuICAgICAgICBtZXNzYWdlcy5sZW5ndGgsXG4gICAgICAgIGxhc3RTY3JvbGxlZFNlc3Npb25SZWYuY3VycmVudFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGxhc3RTY3JvbGxlZFNlc3Npb25SZWYuY3VycmVudCA9IGluaXRpYWxDaGF0SWRcblxuICAgIHNjcm9sbFRocmVzaG9sZFJlZi5jdXJyZW50ID0gMzlcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXT8uaWQgPz8gbnVsbFxuICAgIGxhc3RNZXNzYWdlc0xlbmd0aFJlZi5jdXJyZW50ID0gbWVzc2FnZXMubGVuZ3RoXG5cbiAgICBzY3JvbGxUb0JvdHRvbVJhZigpXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoeyBkZWxheU1zOiAxMDAgfSlcbiAgfSwgW2luaXRpYWxDaGF0SWQsIGxvYWRpbmdNZXNzYWdlcywgbWVzc2FnZXMubGVuZ3RoLCBtZXNzYWdlcywgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKFxuICAgICAgc2hvdWxkU2tpcE1lc3NhZ2VzU2Nyb2xsRWZmZWN0KFxuICAgICAgICBCb29sZWFuKG1lc3NhZ2VzUmVmLmN1cnJlbnQpLFxuICAgICAgICBsb2FkaW5nTWVzc2FnZXMsXG4gICAgICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICAgICAgaXNMb2FkaW5nTW9yZVJlZi5jdXJyZW50XG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gICAgY29uc3QgbGFzdElkID0gbGFzdE1lc3NhZ2U/LmlkID8/IG51bGxcbiAgICBjb25zdCBwcmV2SWQgPSBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnRcbiAgICBjb25zdCBwcmV2TGVuID0gbGFzdE1lc3NhZ2VzTGVuZ3RoUmVmLmN1cnJlbnRcbiAgICBsYXN0TWVzc2FnZUlkUmVmLmN1cnJlbnQgPSBsYXN0SWRcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgY29uc3QgaXNOZXdNZXNzYWdlID0gaXNOZXdDaGF0TWVzc2FnZUV2ZW50KGxhc3RJZCwgcHJldklkLCBtZXNzYWdlcy5sZW5ndGgsIHByZXZMZW4pXG4gICAgY29uc3QgY29udGFpbmVyID0gbWVzc2FnZXNSZWYuY3VycmVudFxuICAgIGNvbnN0IHNjcm9sbERlY2lzaW9uID0gc2hvdWxkQXV0b1Njcm9sbE9uTWVzc2FnZXNDaGFuZ2Uoe1xuICAgICAgaXNOZXdNZXNzYWdlLFxuICAgICAgYW5jaG9yZWRUdXJuSWQ6IGFuY2hvcmVkVHVybklkUmVmLmN1cnJlbnQsXG4gICAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgICBpc1dyaXRpbmcsXG4gICAgICBpc0F0Qm90dG9tOiByZXNvbHZlQ29udGFpbmVyQXRCb3R0b20oY29udGFpbmVyKSxcbiAgICAgIGlzQW5zd2VyT3JRdWVzdGlvbjogaXNBbnN3ZXJPclF1ZXN0aW9uQ2hhdE1lc3NhZ2VJZChsYXN0TWVzc2FnZT8uaWQpLFxuICAgICAgaXNBcHByb3ZhbDogaXNBcHByb3ZhbENoYXRNZXNzYWdlKGxhc3RNZXNzYWdlKSxcbiAgICAgIGhhc0luaXRpYWxNZXNzYWdlOiBoYXNJbml0aWFsVXNlck1lc3NhZ2VJbkxpc3QobWVzc2FnZXMpLFxuICAgICAgbWVzc2FnZXNMZW5ndGg6IG1lc3NhZ2VzLmxlbmd0aCxcbiAgICAgIHByZXZNZXNzYWdlc0xlbmd0aDogcHJldkxlbixcbiAgICB9KVxuXG4gICAgaWYgKHNjcm9sbERlY2lzaW9uID09PSAnYWZmb3JkYW5jZXMtb25seScpIHtcbiAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzY3JvbGxEZWNpc2lvbiA9PT0gJ3N5bmMtdHVybicpIHtcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzeW5jVHVyblNwYWNlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICB9LCBbXG4gICAgbWVzc2FnZXMsXG4gICAgbG9hZGluZ01lc3NhZ2VzLFxuICAgIGlzTG9hZGluZ01vcmVNZXNzYWdlcyxcbiAgICB3YWl0aW5nUmVzcG9uc2UsXG4gICAgaXNXcml0aW5nLFxuICAgIHNjcm9sbFRvQm90dG9tUmFmLFxuICAgIHN5bmNUdXJuU3BhY2UsXG4gICAgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXMsXG4gIF0pXG5cbiAgLy8gQWwgYWJyaXIvY2FyZ2FyIHVuYSBjb252ZXJzYWNpw7NuIGVsIGNvbnRlbmVkb3Igc2UgcmVtb250YSAoTG9hZGVyIOKGkiBsaXN0YSkgY29uXG4gIC8vIHNjcm9sbFRvcD0wLiBGb3J6YW1vcyBpciBhbCBmb25kbyBhbCB0ZXJtaW5hciBsb2FkTWVzc2FnZXMsIHNpbiBhZmVjdGFyIHBhZ2luYWNpw7NuIGhhY2lhIGFycmliYS5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBqdXN0RmluaXNoZWRMb2FkaW5nID0gZGV0ZWN0SnVzdEZpbmlzaGVkTG9hZGluZ01lc3NhZ2VzKHdhc0xvYWRpbmdNZXNzYWdlc1JlZi5jdXJyZW50LCBsb2FkaW5nTWVzc2FnZXMpXG4gICAgd2FzTG9hZGluZ01lc3NhZ2VzUmVmLmN1cnJlbnQgPSBsb2FkaW5nTWVzc2FnZXNcblxuICAgIGlmICghc2hvdWxkU2Nyb2xsVG9Cb3R0b21BZnRlckxvYWQoanVzdEZpbmlzaGVkTG9hZGluZywgbWVzc2FnZXMubGVuZ3RoKSkgcmV0dXJuXG5cbiAgICBzY3JvbGxUaHJlc2hvbGRSZWYuY3VycmVudCA9IDM5XG4gICAgbGFzdE1lc3NhZ2VJZFJlZi5jdXJyZW50ID0gbWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0/LmlkID8/IG51bGxcbiAgICBsYXN0TWVzc2FnZXNMZW5ndGhSZWYuY3VycmVudCA9IG1lc3NhZ2VzLmxlbmd0aFxuXG4gICAgc2Nyb2xsVG9Cb3R0b21SYWYoKVxuICAgIHNjcm9sbFRvQm90dG9tUmFmKHsgZGVsYXlNczogMTAwIH0pXG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aCwgc2Nyb2xsVG9Cb3R0b21SYWZdKVxuXG4gIC8vIEVzdGFkbyBpbmljaWFsIGRlbCBib3TDs24gc2Nyb2xsLXRvLWJvdHRvbSBhbCB0ZXJtaW5hciBsb2FkaW5nTWVzc2FnZXMuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3VsZFVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzT25Mb2FkRW5kKGxvYWRpbmdNZXNzYWdlcykpIHtcbiAgICAgIHVwZGF0ZVNjcm9sbEFmZm9yZGFuY2VzKClcbiAgICB9XG4gIH0sIFtsb2FkaW5nTWVzc2FnZXMsIG1lc3NhZ2VzLmxlbmd0aCwgdXBkYXRlU2Nyb2xsQWZmb3JkYW5jZXNdKVxuXG4gIC8vIE9idGVuZXIgZWwgw7psdGltbyBtZW5zYWplIGRlbCB1c3VhcmlvIHBhcmEgdmVyaWZpY2FyIHNpIHRpZW5lIGF0dGFjaG1lbnRzXG4gIGNvbnN0IGxhc3RVc2VyTWVzc2FnZSA9IHJlc29sdmVMYXN0VXNlck1lc3NhZ2VGb3JBdHRhY2htZW50cyhtZXNzYWdlcywgYXV0aFVzZXIuaWQudG9TdHJpbmcoKSlcblxuICBjb25zdCBhdHRhY2htZW50c0NvdW50ID0gY291bnRVc2VyTWVzc2FnZUF0dGFjaG1lbnRzKGxhc3RVc2VyTWVzc2FnZSlcblxuICBjb25zdCBzdHJlYW1Mb2FkaW5nRGlzcGxheSA9IHJlc29sdmVTdHJlYW1Mb2FkaW5nRGlzcGxheSh7XG4gICAgc3RyZWFtQWN0aXZpdHksXG4gICAgbG9hZGluZ01lc3NhZ2UsXG4gICAgYWN0aXZlTG9hZGluZ3M6IGFjdGl2ZUxvYWRpbmdzIHx8IHt9LFxuICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICBpc1dlYlNlYXJjaEFjdGl2ZSxcbiAgICBpc0RlZXBTZWFyY2hBY3RpdmUsXG4gICAgaGFzQXR0YWNobWVudHM6IEJvb2xlYW4oYXR0YWNobWVudHNDb3VudCksXG4gICAgYXR0YWNobWVudHNDb3VudCxcbiAgICB0LFxuICB9KVxuXG4gIGNvbnN0IGlzU2Nyb2xsT25QYXJlbnQgPSByZXNvbHZlU2Nyb2xsT25QYXJlbnRNb2RlKGV4cGFuZGVkKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHNob3VsZENsZWFyU2Nyb2xsUmVzdG9yZVdpdGhvdXRDaGF0KGluaXRpYWxDaGF0SWQpKSB7XG4gICAgICBwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZi5jdXJyZW50ID0gbnVsbFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IHNlc3Npb24gPSByZWFkTWFpYVBhbmVsU2Vzc2lvbihhdXRoVXNlci5pZClcbiAgICBwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZi5jdXJyZW50ID0gcmVzb2x2ZVBlbmRpbmdTY3JvbGxUb3BGcm9tU2Vzc2lvbihcbiAgICAgIHNlc3Npb25cbiAgICAgICAgPyB7IHNjcm9sbFNlc3Npb25JZDogc2Vzc2lvbi5zY3JvbGxTZXNzaW9uSWQgPz8gdW5kZWZpbmVkLCBzY3JvbGxUb3A6IHNlc3Npb24uc2Nyb2xsVG9wID8/IHVuZGVmaW5lZCB9XG4gICAgICAgIDogbnVsbCxcbiAgICAgIGluaXRpYWxDaGF0SWRcbiAgICApXG4gIH0sIFthdXRoVXNlci5pZCwgaW5pdGlhbENoYXRJZF0pXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb250YWluZXIgPSBtZXNzYWdlc1JlZi5jdXJyZW50XG4gICAgY29uc3QgcGVuZGluZ1Njcm9sbFRvcCA9IHBlbmRpbmdTY3JvbGxSZXN0b3JlUmVmLmN1cnJlbnRcbiAgICBpZiAoXG4gICAgICAhY29udGFpbmVyIHx8XG4gICAgICAhc2hvdWxkQXBwbHlQZW5kaW5nU2Nyb2xsUmVzdG9yZShsb2FkaW5nTWVzc2FnZXMsIHBlbmRpbmdTY3JvbGxUb3AsIHRydWUpIHx8XG4gICAgICBwZW5kaW5nU2Nyb2xsVG9wID09IG51bGxcbiAgICApIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb250YWluZXIuc2Nyb2xsVG9wID0gcGVuZGluZ1Njcm9sbFRvcFxuICAgIGxhc3RTY3JvbGxUb3BSZWYuY3VycmVudCA9IHBlbmRpbmdTY3JvbGxUb3BcbiAgICBwZW5kaW5nU2Nyb2xsUmVzdG9yZVJlZi5jdXJyZW50ID0gbnVsbFxuICB9LCBbbG9hZGluZ01lc3NhZ2VzLCBtZXNzYWdlcy5sZW5ndGhdKVxuXG4gIC8vIEFsIGV4cGFuZGlyL2NvbnRyYWVyIGVsIG1vZGFsIGVsIHJlZiBwYXNhIGEgb3RybyBjb250ZW5lZG9yIChzY3JvbGxUb3Agc2UgcmVzZXRlYSBhIDApLlxuICAvLyBSZXN0YXVyYXIgbGEgcG9zaWNpw7NuIGRlIHNjcm9sbCBhbnRlcyBkZWwgcGFpbnQgcGFyYSBldml0YXIgcXVlIGxhIGNvbnZlcnNhY2nDs24gc2FsdGUgYXJyaWJhLlxuICBjb25zdCBleHBhbmRlZFJlZiA9IHVzZVJlZihleHBhbmRlZClcbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoXG4gICAgICBzaG91bGRSZXN0b3JlU2Nyb2xsT25FeHBhbmRlZENoYW5nZShCb29sZWFuKGV4cGFuZGVkUmVmLmN1cnJlbnQpLCBCb29sZWFuKGV4cGFuZGVkKSwgQm9vbGVhbihtZXNzYWdlc1JlZi5jdXJyZW50KSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHNhdmVkU2Nyb2xsVG9wID0gbGFzdFNjcm9sbFRvcFJlZi5jdXJyZW50XG4gICAgICBtZXNzYWdlc1JlZi5jdXJyZW50IS5zY3JvbGxUb3AgPSBzYXZlZFNjcm9sbFRvcFxuICAgIH1cbiAgICBleHBhbmRlZFJlZi5jdXJyZW50ID0gZXhwYW5kZWRcbiAgfSwgW2V4cGFuZGVkXSlcblxuICBpZiAobG9hZGluZ01lc3NhZ2VzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxGYWRlIGZpbGw+XG4gICAgICAgIDxMb2FkZXIgLz5cbiAgICAgIDwvRmFkZT5cbiAgICApXG4gIH1cblxuICBjb25zdCBsYXN0TWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IGhhc01lc3NhZ2VMZXZlbEluZGljYXRvciA9IGhhc01lc3NhZ2VMZXZlbFN0cmVhbUluZGljYXRvcihsYXN0TWVzc2FnZT8uaWQsIHdhaXRpbmdSZXNwb25zZSwgaXNXcml0aW5nKVxuXG4gIGNvbnN0IG1lc3NhZ2VzQ29udGVudCA9IChcbiAgICA8PlxuICAgICAge2lzTG9hZGluZ01vcmVNZXNzYWdlcyAmJiA8TG9hZGluZ1RleHQgdGV4dD17dCgnY2hhdC5sb2FkaW5nTW9yZScpfSAvPn1cbiAgICAgIDw+XG4gICAgICAgIHttZXNzYWdlcy5tYXAoKG1lc3NhZ2UsIGluZGV4KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNMYXN0TWVzc2FnZSA9IGluZGV4ID09PSBtZXNzYWdlcy5sZW5ndGggLSAxXG4gICAgICAgICAgY29uc3QgeyBpc1N0cmVhbWluZ1BsYWNlaG9sZGVyLCBpc1N0cmVhbWluZyB9ID0gcmVzb2x2ZUNoYXRMaXN0SXRlbVN0cmVhbWluZ0ZsYWdzKHtcbiAgICAgICAgICAgIHJvbGU6IG1lc3NhZ2Uucm9sZSxcbiAgICAgICAgICAgIHVzZXJJZDogbWVzc2FnZS51c2VyLmlkLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiBtZXNzYWdlLmlkLFxuICAgICAgICAgICAgaXNMYXN0TWVzc2FnZSxcbiAgICAgICAgICAgIHdhaXRpbmdSZXNwb25zZSxcbiAgICAgICAgICAgIGlzV3JpdGluZyxcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgLy8gTm8gZmlsdHJhciBlbCBwbGFjZWhvbGRlciBkZWwgbWVuc2FqZSBlbiBzdHJlYW1pbmc6IHN1IHRleHRvIHZpdmVcbiAgICAgICAgICAvLyBlbiBlbCBzdHJlYW1pbmdTdG9yZSB5IGBtZXNzYWdlLm1lc3NhZ2VgIGVzICcnIGhhc3RhIGVsIGNvbXBsZXRlLlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNob3VsZFNraXBFbXB0eUNoYXRMaXN0TWVzc2FnZSh7XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nUGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nLFxuICAgICAgICAgICAgICBhdHRhY2htZW50Q291bnQ6IG1lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICAgICAgICBzb3VyY2VDb3VudDogbWVzc2FnZS5zb3VyY2VzPy5sZW5ndGggPz8gMCxcbiAgICAgICAgICAgICAgbWVzc2FnZVRleHQ6IG1lc3NhZ2UubWVzc2FnZSA/PyAnJyxcbiAgICAgICAgICAgICAgcHJvamVjdE5hbWU6IG1lc3NhZ2UucHJvamVjdD8ubmFtZSxcbiAgICAgICAgICAgICAgaGFzQXBwcm92YWw6IEJvb2xlYW4obWVzc2FnZS5hcHByb3ZhbCksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBtZXNzYWdlRmVlZGJhY2sgPSByZXNvbHZlRGlzYWJsZUZlZWRiYWNrRnJvbVdhc0hlbHBmdWwobWVzc2FnZT8ud2FzSGVscGZ1bClcblxuICAgICAgICAgIC8vIEtleSBlc3RhYmxlOiBzb2xvIG1lc3NhZ2UuaWQgcGFyYSBldml0YXIgcmVtb3VudCBkdXJhbnRlIHN0cmVhbWluZyAobWVzc2FnZS5kYXRlIHB1ZWRlIGNhbWJpYXIpXG4gICAgICAgICAgY29uc3QgbWVzc2FnZUtleSA9IHJlc29sdmVNZXNzYWdlTGlzdEl0ZW1LZXkobWVzc2FnZS5pZCwgaW5kZXgpXG5cbiAgICAgICAgICBjb25zdCB0dXJuSWQgPSByZXNvbHZlUmV0cnlUdXJuSWQobWVzc2FnZSlcbiAgICAgICAgICBjb25zdCB1c2VyTWVzc2FnZUZvclJldHJ5ID0gZmluZFVzZXJNZXNzYWdlRm9yUmV0cnkobWVzc2FnZXMsIG1lc3NhZ2UpXG4gICAgICAgICAgY29uc3QgY2FuUmV0cnkgPSBjYW5SZXRyeUFzc2lzdGFudE1lc3NhZ2Uoe1xuICAgICAgICAgICAgaGFzVXNlck1lc3NhZ2VGb3JSZXRyeTogQm9vbGVhbih1c2VyTWVzc2FnZUZvclJldHJ5KSxcbiAgICAgICAgICAgIGlzU3RyZWFtaW5nLFxuICAgICAgICAgICAgaXNFcnJvcjogQm9vbGVhbihtZXNzYWdlLmlzRXJyb3IpLFxuICAgICAgICAgICAgaGFzQXBwcm92YWw6IEJvb2xlYW4obWVzc2FnZS5hcHByb3ZhbCksXG4gICAgICAgICAgICBpc0Zyb250ZW5kQ2FuY2VsbGVkOiBtZXNzYWdlLmlzRnJvbnRlbmRDYW5jZWxsZWQsXG4gICAgICAgICAgICBpc0NhbmNlbGxlZDogbWVzc2FnZS5pc19jYW5jZWxsZWQsXG4gICAgICAgICAgICB0dXJuSWQsXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8TWVzc2FnZUl0ZW1cbiAgICAgICAgICAgICAgey4uLm1lc3NhZ2V9XG4gICAgICAgICAgICAgIGtleT17bWVzc2FnZUtleX1cbiAgICAgICAgICAgICAgYXV0aFVzZXI9e2F1dGhVc2VyfVxuICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RPcHRpb249e2hhbmRsZVNlbGVjdE9wdGlvbn1cbiAgICAgICAgICAgICAgaGFuZGxlRmVlZGJhY2s9e2hhbmRsZUZlZWRiYWNrfVxuICAgICAgICAgICAgICBoYW5kbGVBcHByb3ZhbERlY2lzaW9uPXtoYW5kbGVBcHByb3ZhbERlY2lzaW9ufVxuICAgICAgICAgICAgICBoYW5kbGVTdWdnZXN0aW9uQ2xpY2s9e2hhbmRsZVN1Z2dlc3Rpb25DbGlja31cbiAgICAgICAgICAgICAgaGFuZGxlUmV0cnk9e2NhblJldHJ5ID8gKCkgPT4gcmV0cnlNZXNzYWdlKG1lc3NhZ2UpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBoYXNTZWxlY3RlZFN1Z2dlc3Rpb249eyEhc2VsZWN0ZWRTdWdnZXN0aW9uTWVzc2FnZUlkc1ttZXNzYWdlLmlkXX1cbiAgICAgICAgICAgICAgZGlzYWJsZUZlZWRiYWNrPXttZXNzYWdlRmVlZGJhY2t9XG4gICAgICAgICAgICAgIGlzU3RyZWFtaW5nPXtpc1N0cmVhbWluZ31cbiAgICAgICAgICAgICAgaXNMYXN0TWVzc2FnZT17aXNMYXN0TWVzc2FnZX1cbiAgICAgICAgICAgICAgZXhwYW5kZWQ9e2V4cGFuZGVkfVxuICAgICAgICAgICAgICBzdHJlYW1BY3Rpdml0eT17aXNTdHJlYW1pbmcgPyBzdHJlYW1Mb2FkaW5nRGlzcGxheSA6IG51bGx9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIClcbiAgICAgICAgfSl9XG4gICAgICA8Lz5cbiAgICAgIHtzdHJlYW1Mb2FkaW5nRGlzcGxheSAmJlxuICAgICAgICBzaG91bGRTaG93R2xvYmFsU3RyZWFtTG9hZGluZ0luZGljYXRvcihoYXNNZXNzYWdlTGV2ZWxJbmRpY2F0b3IsIHN0cmVhbUxvYWRpbmdEaXNwbGF5KSAmJiAoXG4gICAgICAgICAgPFNDTG9hZGluZ01lc3NhZ2VzQ29sdW1uPlxuICAgICAgICAgICAgPEFnZW50QWN0aXZpdHlJbmRpY2F0b3IgYWN0aXZpdHk9e3N0cmVhbUxvYWRpbmdEaXNwbGF5fSAvPlxuICAgICAgICAgIDwvU0NMb2FkaW5nTWVzc2FnZXNDb2x1bW4+XG4gICAgICAgICl9XG4gICAgICB7LyogRXNwYWNpbyBxdWUgbGUgcGVybWl0ZSBhIGxhIHByZWd1bnRhIHN1YmlyIGFsIHRvcGUuIEFsdHVyYSBtYW5lamFkYVxuICAgICAgICAgIGltcGVyYXRpdmFtZW50ZSBkZXNkZSBgc2V0U3BhY2VySGVpZ2h0YDsgYXJyYW5jYSBlbiAwLiAqL31cbiAgICAgIDxTQ1R1cm5TcGFjZXIgcmVmPXtzcGFjZXJFbFJlZn0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICA8Lz5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgLy8gU2kgZWwgdXN1YXJpbyBtdWV2ZSBlbCBzY3JvbGwgYWJvcnRhbW9zIGxhIGFuaW1hY2nDs24geSBzb2x0YW1vcyBlbCB0dXJubzpcbiAgICAvLyBubyBsZSBwZWxlYW1vcyBlbCBjb250cm9sIGRlbCBjb250ZW5lZG9yLlxuICAgIDxTQ01lc3NhZ2VzT3V0ZXJcbiAgICAgICRzY3JvbGxPblBhcmVudD17aXNTY3JvbGxPblBhcmVudH1cbiAgICAgIG9uV2hlZWw9e2hhbmRsZVVzZXJTY3JvbGxJbnRlbnR9XG4gICAgICBvblRvdWNoU3RhcnQ9e2hhbmRsZVVzZXJTY3JvbGxJbnRlbnR9XG4gICAgPlxuICAgICAgPFNDTWVzc2FnZXNHcmFkaWVudFRvcCAkc2hvdz17c2hvd1RvcEdyYWRpZW50fSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAge2lzU2Nyb2xsT25QYXJlbnQgPyAoXG4gICAgICAgIDxTQ01lc3NhZ2VzU2Nyb2xsIHJlZj17bWVzc2FnZXNSZWZ9IG9uU2Nyb2xsPXtoYW5kbGVTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDTWVzc2FnZXNJbm5lciAkc2Nyb2xsT25QYXJlbnQ9e2lzU2Nyb2xsT25QYXJlbnR9PnttZXNzYWdlc0NvbnRlbnR9PC9TQ01lc3NhZ2VzSW5uZXI+XG4gICAgICAgIDwvU0NNZXNzYWdlc1Njcm9sbD5cbiAgICAgICkgOiAoXG4gICAgICAgIDxTQ01lc3NhZ2VzSW5uZXIgcmVmPXttZXNzYWdlc1JlZn0gb25TY3JvbGw9e2hhbmRsZVNjcm9sbFRvQm90dG9tfSAkc2Nyb2xsT25QYXJlbnQ9e2ZhbHNlfT5cbiAgICAgICAgICB7bWVzc2FnZXNDb250ZW50fVxuICAgICAgICA8L1NDTWVzc2FnZXNJbm5lcj5cbiAgICAgICl9XG5cbiAgICAgIDxTQ01lc3NhZ2VzR3JhZGllbnRCb3R0b20gJHNob3c9e3Nob3dCb3R0b21HcmFkaWVudH0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cblxuICAgICAge3Nob3dTY3JvbGxUb0JvdHRvbSAmJiAoXG4gICAgICAgIDxTY3JvbGxUb0JvdHRvbUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17aGFuZGxlQ2xpY2tTY3JvbGxUb0JvdHRvbX0+XG4gICAgICAgICAgPFNDU2Nyb2xsSWNvblN3YXAgJHZpc2libGU9e2lzV3JpdGluZ30gYXJpYS1oaWRkZW4+XG4gICAgICAgICAgICA8U0NXcml0aW5nRG90cz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgICAgPHNwYW4gLz5cbiAgICAgICAgICAgIDwvU0NXcml0aW5nRG90cz5cbiAgICAgICAgICA8L1NDU2Nyb2xsSWNvblN3YXA+XG4gICAgICAgICAgPFNDU2Nyb2xsSWNvblN3YXAgJHZpc2libGU9eyFpc1dyaXRpbmd9IGFyaWEtaGlkZGVuPlxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9ezEyfSBoZWlnaHQ9ezEyfSBmaWxsPVwibm9uZVwiPlxuICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgIHN0cm9rZT1cIiMyMDIwMjBcIlxuICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezEuNX1cbiAgICAgICAgICAgICAgICBkPVwiTTYgLjc1djEwLjVNLjc1IDYgNiAxMS4yNSAxMS4yNSA2XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvU0NTY3JvbGxJY29uU3dhcD5cbiAgICAgICAgPC9TY3JvbGxUb0JvdHRvbUJ1dHRvbj5cbiAgICAgICl9XG4gICAgPC9TQ01lc3NhZ2VzT3V0ZXI+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IENoYXRBSU1lc3NhZ2VzID0gUmVhY3QubWVtbyhDaGF0QUlNZXNzYWdlc0lubmVyKVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7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
|