{"version":3,"sources":["../node_modules/react-flags-select/flags sync /^/.*/.svg$","app/config/Setup.js","app/config/constants/MessageTypeEnum.js","app/config/localization/en.js","app/config/localization/Localization.js","app/config/localization/da.js","app/config/localization/de.js","app/util/localization.js","app/util/utilMethods.js","app/chat/chatField/speechBubble/message/textMessage/TextMessage.js","app/chat/chatField/speechBubble/message/imageMessage/ImageMessage.js","app/chat/chatField/speechBubble/message/linkMessage/LinkMessage.js","app/chat/chatField/speechBubble/message/videoMessage/VideoMessage.js","app/chat/chatField/speechBubble/message/cardMessage/CardMessage.js","app/chat/chatField/speechBubble/message/fileMessage/FileMessage.js","app/config/constants/LayoutTypeEnum.js","app/chat/chatField/speechBubble/message/Message.js","app/config/constants/ChatResponseFeedbackEnum.js","app/chat/chatField/speechBubble/chatFeedback/LikeIcon.js","app/chat/chatField/speechBubble/chatFeedback/ChatFeedback.js","app/config/constants/ChatQuestionTypeEnum.js","app/config/constants/LineBreakTypeEnum.js","app/config/constants/IntegrationTypeEnum.js","app/chat/chatField/speechBubble/SpeechBubble.js","app/chat/chatField/ChatBotChatField.js","app/chat/chatInput/chatAttachment/ChatAttachment.js","app/chat/chatInput/chatInputField/ChatInputField.js","app/chat/chatInput/chatInputMenu/ChatInputMenu.js","app/chat/chatInput/autocomplete/components/AdminAutocompleteMenuItem.js","app/chat/chatInput/autocomplete/components/UserAutocompleteMenuItem.js","app/chat/chatInput/autocomplete/Autocomplete.js","app/chat/chatInput/ChatInput.js","app/chat/infoPage/InfoPage.js","app/chat/topBar/languageSelector/LanguageSelector.js","app/chat/topBar/TopBar.js","app/chat/chatField/searchBotChatField/SearchBotChatField.js","app/chat/Chat.js","app/App.js","index.js"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","text","link","image","video","card","file","en","getLocalizationLanguageCode","languageCode","localization","includes","isLanguageSupported","getLocaleDateTimeString","dateTimeUtc","lowerCase","localizationCode","dateTime","Date","todayString","Localization","atString","result","toLocaleDateString","toLocaleTimeString","hour","minute","hour12","replace","toLowerCase","TextMessage","Component","render","React","createElement","className","dangerouslySetInnerHTML","__html","this","props","content","ImageMessage","SideBySideMagnifier","imageSrc","url","imageAlt","largeImageSrc","mouseActivation","MOUSE_ACTIVATION","DOUBLE_CLICK","touchActivation","TOUCH_ACTIVATION","DOUBLE_TAP","alwaysInPlace","LinkMessage","href","target","rel","isSuggestion","style","color","hover","chatConfig","suggestionFontHoverColor","suggestionFontColor","isUser","fontUserColor","fontBotColor","title","LinkIcon","VideoMessage","ReactPlayer","playing","autoPlay","loop","controls","showControls","width","height","volume","muted","CardMessage","classes","Card","CardContent","cardContent","CardMedia","cardmedia","maxHeight","src","imageUrl","alt","cardContenttxt","Typography","gutterBottom","variant","component","subtitle","CardActions","Button","size","linkUrl","linkButtonTitle","withStyles","styles","display","justifyContent","alignItems","fontSize","paddingBottom","FileMessage","onClick","downloadFile","backgroundColor","speechBubbleUserColor","speechBubbleBotColor","chatBot","searchBot","Message","layoutMode","LayoutTypeEnum","MessageType","message","filename","messageType","LikeIcon","xmlns","x","y","viewBox","d","fill","ChatFeedback","constructor","super","handleFeedbackButtonHover","chatResponseFeedbackType","ChatResponseFeedbackEnum","setState","likeButtonIsHovered","state","dislikeButtonIsHovered","handleButtonClick","chatResponseFeedback","spectatorMode","speechBubble","sendChatResponseFeedback","chatQuestionId","onMouseEnter","onMouseLeave","SpeechBubble","getMessageRowList","messageList","rowList","forEach","hidden","push","rowMessageList","i","length","lineBreak","suggestion","row","speechBubbleClicked","disabled","sendIntent","intentToTriggerId","ChatQuestionTypeEnum","speechBubbleToggleHover","axios","post","process","REACT_APP_TEST_BUILD","Setup","token","then","response","window","open","data","catch","error","handleCopyClick","copiedIndex","index","setTimeout","msg","join","textElement","document","innerHTML","textContent","innerText","tempElement","setAttribute","body","appendChild","range","createRange","selectNodeContents","selection","getSelection","removeAllRanges","addRange","execCommand","err","console","removeChild","language","showAvatar","withMemory","displayBackground","maxWidth","welcomePreviewEnabled","logoUrl","some","m","minWidth","lineBreakType","LineBreakTypeEnum","isGpt","avatarUrl","font","botWriting","avatarName","chatbotName","border","speechBubbleBorderColor","suggestionSpeechBubbleHoverColor","suggestionSpeechBubbleColor","borderColor","suggestionBorderColor","integrationType","position","right","top","IntegrationTypeEnum","PhoneIcon","SmsIcon","key","sendMessage","lastRow","chatResponseId","Fragment","fillRule","clipRule","stroke","strokeWidth","strokeLinecap","strokeLinejoin","ChatBotChatField","getIsWritingSpeechBubble","MessageTypeEnum","scrollToBottom","messagesEnd","scrollIntoView","behavior","chatFieldParentContainerDiv","scrollTo","scrollHeight","getChatFieldContentHeight","ua","navigator","userAgent","isIe","indexOf","chatFieldContentDiv","clientHeight","handleLoadMoreVisibilityChange","isVisible","loadMoreEnabled","lastChatFieldContentHeight","scrollToOldHeight","loadMoreSpeechBubble","componentDidMount","that","setInterval","chatFieldContentHeight","loadToEnd","scrollTop","getSpeechBubbleRowList","speechBubbleList","array","renderSpeechBubbleRow","speechBubbleRow","every","Slide","direction","in","componentDidUpdate","prevProps","fileUploadedList","speechBubbleRowList","ref","div","LinearProgress","loadMore","VizSensor","onChange","Carousel","useKeyboardArrows","centerMode","showArrows","showThumbs","showStatus","centerSlidePercentage","userWriting","float","clear","el","ChatAttachment","handleUploadHover","uploadIsHovered","openMenu","anchorEl","btnEl","closeMenu","chatMenuItem","intentId","displayName","handleCapture","_ref","files","Array","from","newPendingFiles","pendingFiles","setSnackbarErrorMessage","existingFile","name","fileReader","FileReader","progress","loading","onabort","log","onerror","onload","arrayBuffer","newFile","fileContent","Uint8Array","reduce","byte","String","fromCharCode","customerId","prevState","handleAddUploadedFiles","handleAddPendingFiles","readAsArrayBuffer","loadedFile","maxSize","fileUploadedListRemove","filter","_","handleFlushDeleteUploadedFile","accept","multiple","type","value","htmlFor","Icon","tabIndex","AttachmentICon","inputButtonsFocusedColor","cursor","ChatInputField","handleEmojiHover","emojiIsHovered","openEmojiPopover","closeEmojiPopover","handleInputKeyPress","preventDefault","handleInputOnClick","input","selectionStart","selectionEnd","reEnableMostAskedQuestions","isExpanded","setShowSearchBotChatField","handleClickOutside","event","wrapperRef","current","contains","element","querySelector","handleInputOnChange","isWriting","sendUserIsWriting","handleMessageChanges","addEmoji","emoji","emojiString","native","substr","textareaRef","createRef","paddingRight","cx","cy","r","x1","y1","x2","y2","TextareaAutosize","placeholder","fileUploadedText","chatAgentMode","chatInputText","maxLength","chatInputMax","autoComplete","autoFocus","onKeyDown","maxRows","isMobile","enableEmoji","MoodICon","Popover","Boolean","anchorOrigin","vertical","horizontal","transformOrigin","onClose","disableRestoreFocus","Picker","showPreview","showSkinTones","skin","onSelect","include","i18n","search","notfound","skintext","categories","recent","smileys","people","nature","foods","activity","places","objects","symbols","flags","custom","categorieslabel","skintones","1","2","3","4","5","6","emojiTooltip","set","showStopMessage","stopMessage","handleResetChatInput","fontWeight","textAlign","lineHeight","points","ChatInputMenu","handleMenuHover","menuIsHovered","chatMenuItemList","sort","a","b","isOpen","showAbove","MenuICon","Menu","keepMounted","getContentAnchorEl","MenuItem","AdminAutocompleteMenuItem","onEditIntent","onSendIntent","replacedString","ListItem","ListItemText","primary","overflow","flexWrap","Tooltip","aria-label","IconButton","EditIcon","SendIcon","UserAutocompleteMenuItem","onSendSuggestion","whiteSpace","minHeight","question","stopPropagation","disableRipple","Autocomplete","handleKeyPress","previousElementSibling","focus","onChangeFocusToInput","nextElementSibling","handleSendChatAgentIntent","onSendChatAgentIntent","handleEditChatAgentIntent","onEditChatAgentIntent","handleSendUserSuggestion","onSendUserSuggestion","clickAwayHandler","flushTrainingPhraseList","openPopover","searchString","formattedSearchString","charAt","substring","trim","filteredTrainingPhraseList","trainingPhraseList","slice","disableAutoFocus","disableEnforceFocus","paper","ClickAwayListener","onClickAway","innerRef","regex","RegExp","forwardRef","assign","ChatInput","_this","handleGetTrainingPhraseList","searchText","disableAutomComplete","arguments","undefined","handleRootClick","handleGetTrainingPhraseListDebounced","enableAutocomplete","handleChangeFocusToInput","inputRef","firstChild","clearSpeechBubble","handleGetChatResponse","chatResponseString","sbIndex","mIndex","strippedString","string","translate","match","entity","removeHtmlTagsFromString","sendChatAgentIntent","handleSendMessage","disableAutocomplete","updateStateOfPlaceholder","messageWasSent","handleInputUpKeyStroke","autoCompleteRef","lastChild","handleInputDownKeyStroke","callback","wait","timeout","initialCall","next","apply","clearTimeout","debounce","fileTypeIconMap","PDF","PictureAsPdf","DOCX","Description","JPG","Image","PNG","TXT","TextFields","default","disclaimer","gap","borderBottom","padding","fileExtension","split","pop","toUpperCase","fileIcon","borderRadius","boxShadow","marginRight","flex","textOverflow","handleDeleteUploadedFile","marginLeft","chatbot","openDownwards","showConnectionLostMsg","uploadFilesList","onInputUpKeyStroke","onInputDownKeyStroke","show","enableUpload","uploadFileComplete","handleResetUploadedFiles","item","flushPendingFiles","showMenuInInput","cmi","languageId","InfoPage","toggleShowInfoPage","pointerEvents","showInfoPage","gdprLink","Link","showPoweredBy","LanguageSelector","languageSelected","countryCode","refs","flagSelector","updateSelected","languageList","ReactFlagsSelect","countries","lang","defaultCountry","showSelectedLabel","showOptionLabel","selectedSize","TopBar","showInfo","avatar","clientDescription","enableMaximize","toggleMaxiChatbot","isMaximized","MinimizeIcon","FullIcon","HelpIcon","closeChatbot","CloseIcon","SearchBotChatField","scrollToTop","initializeChatMenuItems","reset","resizeChatContainer","handleMenuItemClick","async","onMenuItemClick","menuItem","resetChatMenuItems","lastMessageLength","bind","showSearchBotChatField","sourcesList","margin","background","menuList","flexDirection","marginBottom","List","button","onMouseOver","currentTarget","onMouseOut","primaryTypographyProps","sortedSpeechBubbleRowList","tempSpeechBubbleRowList","dropId","reverse","flat","topBackgroundColor","topFontColor","startButtonFillColor","startButtonBackgroundColor","overflowY","showSources","boxSizing","_this$props$chatConfi","_this$props$chatConfi2","_this$props$chatConfi3","_this$props$chatConfi4","_this$props$chatConfi5","_this$props$chatConfi6","showSourcesWithContent","borderTop","PublicIcon","flexShrink","fontFamily","textDecoration","WebkitLineClamp","WebkitBoxOrient","paddingLeft","Chat","invokeSignalRMessage","args","hubConnection","invoke","markText","md","MarkdownIt","linkify","html","use","markdownItCodeCopy","iconStyle","iconClass","buttonStyle","buttonClass","defaultRender","renderer","rules","link_open","tokens","idx","options","env","self","renderToken","aIndex","attrIndex","attrPush","attrs","relIndex","hrefIndex","renderedText","startsWith","endsWith","parent","postMessage","startLoad","sendMostAskedQuestions","questions","SignalR","withUrl","userId","clientKey","domain","configureLogging","Debug","build","startChatConnection","onclose","connected","on","DisableConnectionRetry","connection","baseUrl","languageParam","chatConfigLanguageList","find","languageCodeShort","head","getElementsByTagName","clientScript","clientScriptElement","clientCss","clientStyleElement","createTextNode","clientHeaderHtml","linkElement","soundOnMessageReceived","messageReceivedSound","preload","setSearchBot","setChatFieldPlacement","setChatBot","isChatAgent","chatResponse","chatbotOpenState","showNewMsgIconMobile","showNewMsgIconDesktop","handleChatResponse","uniqueTuples","chatResponseListResult","item2","startLoadCalc","loadMoreCalc","item1","totalCount","requestedWelcome","sendWelcome","speechBubbleIndex","findIndex","sb","isMailResponse","toggleChatbot","isChatMinimized","speechBubbleToDisplay","getMessageSpeechBubble","setBotIsWriting","appendSendMessage","chatInputMessage","fileName","handleDeletePendingFile","isStream","isArray","_ref2","streamId","streamIdStopped","speechBubbleBuffer","lastSpeechBubble","indexDiff","isLastStream","lastSpeechBubbleMsg","currentSpeechBubbleMsg","speechBubbleContent","contentSource","bufferItem","currentSpeechBubbleContent","botWritingStream","lastStreamId","delay","lastNonSuggestionSpeechBubbleIndex","lastIndexOf","chatResponseDropId","uuidv4","unshift","playReceivedMessageSound","getElementById","play","disableConnectionRetry","start","getFileMessageSpeechBubble","forceWelcomeMessage","sendFiles","uploadPromises","Promise","reject","params","all","fileUploading","messageToDisplay","urls","resizeContainerSend","searchBotFieldRef","pendingFileUrls","openChatContainer","chatQuestionType","hideSuggestions","chatMenuItemId","JSON","parse","stringify","ccl","trainingPhraseSuggestionList","getTrainingPhraseList","getChatResponse","entries","searchBotLayoutElem","setProperty","resizeSourceContainer","errorMessage","snackbarErrorMessage","disableMostAskedQuestions","hadFirstClick","chatAttachmentRef","searchParams","URLSearchParams","location","toString","get","parseInt","referrer","ancestorOrigins","languageData","decodeURIComponent","chatFieldPlacement","openDownWards","iframeListener","setchatbotOpenState","setWelcomePreviewEnabled","addEventListener","attachEvent","uniquePendingFileUrls","Set","uniqueFileUploadedList","Snackbar","autoHideDuration","MuiAlert","elevation","severity","showLogoTop","gptSetupType","opacity","CircularProgress","App","BrowserRouter","Switch","Route","exact","path","ReactDOM"],"mappings":"mHAAA,IAAIA,EAAM,CACT,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,aAAc,IACd,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,cAAe,IACf,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,IACZ,WAAY,KAIb,SAASC,EAAeC,GACvB,IAAIC,EAAKC,EAAsBF,GAC/B,OAAOG,EAAoBF,GAE5B,SAASC,EAAsBF,GAC9B,IAAIG,EAAoBC,EAAEN,EAAKE,GAAM,CACpC,IAAIK,EAAI,IAAIC,MAAM,uBAAyBN,EAAM,KAEjD,MADAK,EAAEE,KAAO,mBACHF,EAEP,OAAOP,EAAIE,GAEZD,EAAeS,KAAO,WACrB,OAAOC,OAAOD,KAAKV,IAEpBC,EAAeW,QAAUR,EACzBS,EAAOC,QAAUb,EACjBA,EAAeE,GAAK,K,8OCnPL,G,MAEM,oCAFN,EAGM,+BAHN,EAIqB,IAJrB,EAMO,GANP,EAOF,wFAPE,EAQU,SCLV,GACXY,KAAM,EACNC,KAAM,EACNC,MAAO,EACPC,MAAO,EACPC,KAAM,EACNC,KAAK,G,+DCTM,GACX,+BAAgC,wCAChC,yBAA0B,kBAC1B,2CAA4C,2CAC5C,yCAA0C,wDAC1C,yCAA0C,yDAC1C,yCAA0C,oDAC1C,8BAA+B,cAC/B,8BAA+B,cAC/B,sCAAuC,sBACvC,+CAAgD,4BAChD,oDAAqD,0DACrD,4CAA6C,+BAC7C,8BAAgC,QAChC,2BAA6B,KAC7B,iCAAkC,iBAClC,4BAA6B,OAC7B,wBAAyB,eACzB,oBAAqB,OACrB,oBAAqB,oBACrB,qBAAsB,cChBX,GACX,QCLW,CACX,+BAAgC,sCAChC,yBAA0B,8BAC1B,2CAA4C,6CAC5C,yCAA0C,2DAC1C,yCAA0C,kEAC1C,yCAA0C,oDAC1C,8BAA+B,eAC/B,8BAA+B,cAC/B,sCAAuC,2BACvC,+CAAgD,4BAChD,oDAAqD,wDACrD,4CAA6C,uCAC7C,8BAAgC,QAChC,2BAA6B,MAC7B,iCAAkC,qBAClC,4BAA6B,UAC7B,wBAAyB,cACzB,oBAAqB,OACrB,oBAAqB,qBACrB,qBAAsB,YDdtB,GAAMC,EACN,QAASA,EACT,QERW,CACX,+BAAgC,sCAChC,yBAA0B,uBAC1B,2CAA4C,oDAC5C,yCAA0C,mEAC1C,yCAA0C,uEAC1C,yCAA0C,8DAC1C,8BAA+B,qBAC/B,8BAA+B,oBAC/B,sCAAuC,qBACvC,+CAAgD,yCAChD,oDAAqD,mEACrD,4CAA6C,sCAC7C,8BAAgC,QAChC,2BAA6B,KAC7B,iCAAkC,2BAClC,4BAA6B,YAC7B,wBAAyB,mBACzB,oBAAqB,OACrB,oBAAqB,wBACrB,qBAAsB,qBFXtB,QAAWA,GGAR,SAASC,EAA4BC,GACxC,OARJ,SAA6BA,GACzB,OAAmB,MAAhBA,GAGIZ,OAAOD,KAAKc,GAAcC,SAASF,GAIvCG,CAAoBH,GACZA,EAEA,UC0BR,SAASI,EAAwBC,EAAaC,EAAWC,GAC5D,IAAKF,EACD,OAAO,KAGX,MAAMG,EAAW,IAAIC,KAAKJ,GACpBK,EAAcC,EAAaJ,GAAkB,+BAC7CK,EAAWD,EAAaJ,GAAkB,4BAEhD,IAAIM,EAAS,KAkBb,OAdIA,GADC,IAAIJ,MAAQK,uBAAyBN,EAASM,qBACtCJ,EAEAF,EAASM,qBAGtBD,EAASA,EAAS,IAAMD,EAAW,IAAMJ,EACpCO,mBAAmB,GAAI,CAACC,KAAM,UAAWC,OAAQ,UAAWC,QAAQ,IACpEC,QAAQ,KAAM,IACdA,QAAQ,KAAM,IAEfb,IACAO,EAASA,EAAOO,eAGbP,EC3DX,MAAMQ,UAAoBC,YACtBC,SACI,OACIC,IAAAC,cAAA,OAAKC,UAAW,0BACZF,IAAAC,cAAA,OAAKE,wBAAyB,CAACC,OAAQC,KAAKC,MAAMC,aAMnDV,Q,SCHf,MAAMW,UAAqBV,YACvBC,SACI,OACIC,IAAAC,cAAA,OAAKC,UAAW,qDACZF,IAAAC,cAACQ,sBAAmB,CAChBP,UAAW,sBACXQ,SAAUL,KAAKC,MAAMK,IACrBC,SAAUP,KAAKC,MAAMK,IACrBE,cAAeR,KAAKC,MAAMK,IAC1BG,gBAAiBC,mBAAiBC,aAClCC,gBAAiBC,mBAAiBC,WAClCC,eAAe,MAOpBZ,Q,iBCxBf,MAAMa,UAAoBvB,YACtBC,SACI,OACIC,IAAAC,cAAA,OAAKC,UAAW,0BACZF,IAAAC,cAAA,KAAGqB,KAAMjB,KAAKC,MAAMK,IAAKY,OAAQ,SAAUC,IAAK,uBAC5CxB,IAAAC,cAAA,OAAKC,UAAWG,KAAKC,MAAMmB,aAAe,4CAA8C,kCACpFzB,IAAAC,cAAA,QAAMyB,MAAO,CAACC,MAAOtB,KAAKC,MAAMmB,aAAiBpB,KAAKC,MAAMsB,MAAOvB,KAAKC,MAAMuB,WAAWC,yBAA2BzB,KAAKC,MAAMuB,WAAWE,oBAAwB1B,KAAKC,MAAM0B,OAAS3B,KAAKC,MAAMuB,WAAWI,cAAe5B,KAAKC,MAAMuB,WAAWK,eAAiB7B,KAAKC,MAAM6B,OAC7QnC,IAAAC,cAACmC,IAAQ,CAAClC,UAAW,kBAQ9BmB,Q,kBCbf,MAAMgB,UAAqBvC,YACvBC,SACI,OACIC,IAAAC,cAAA,OAAKC,UAAW,qDACZF,IAAAC,cAACqC,IAAW,CAAC3B,IAAKN,KAAKC,MAAMK,IAAK4B,SAAiC,IAAxBlC,KAAKC,MAAMkC,SACzCC,MAA0B,IAApBpC,KAAKC,MAAMmC,KAA+BC,UAAsC,IAA5BrC,KAAKC,MAAMqC,aACrEC,MAAO,OAAQC,OAAQ,OAAQC,OAAQ,GAAKC,OAAO,MAMjEV,Q,uECgBf,MAAMW,UAAoBlD,YACtBC,SACI,MAAM,QAAEkD,GAAY5C,KAAKC,MACzB,OACIN,IAAAC,cAACiD,IAAI,CAAChD,UAAW,0BACbF,IAAAC,cAACkD,IAAW,CAACjD,UAAW+C,EAAQG,aAC5BpD,IAAAC,cAACoD,IAAS,CACNnD,UAAW+C,EAAQK,UACnBnB,MAAO9B,KAAKC,MAAM6B,OAElBnC,IAAAC,cAAA,OAAKyB,MAAO,CAAC6B,UAAU,QAASX,MAAM,WAAaY,IAAKnD,KAAKC,MAAMmD,SAAUC,IAAK,WAEtF1D,IAAAC,cAACkD,IAAW,CAACjD,UAAW+C,EAAQU,gBAC5B3D,IAAAC,cAAC2D,IAAU,CAAC1D,UAAW+C,EAAQd,MAAO0B,cAAY,EAACC,QAAQ,KAAKC,UAAU,MACrE1D,KAAKC,MAAM6B,OAEhBnC,IAAAC,cAAC2D,IAAU,CAACE,QAAQ,QAAQnC,MAAM,gBAAgBoC,UAAU,KACvD1D,KAAKC,MAAM0D,WAGpBhE,IAAAC,cAAA,aAEJD,IAAAC,cAACgE,IAAW,KACRjE,IAAAC,cAACiE,IAAM,CAACC,KAAK,QAAQxC,MAAM,UAAUL,KAAMjB,KAAKC,MAAM8D,QAAS7C,OAAQ,UAClElB,KAAKC,MAAM+D,oBAQrBC,UA1DAC,KAAA,CACXjB,UAAW,CACPT,OAAQ,IACR2B,QAAS,OACTC,eAAgB,SAChBC,WAAY,YAEhBxG,MAAO,CACH2E,OAAQ,IACRD,MAAO,WAEXT,MAAO,CACHwC,SAAU,QAEdhB,eAAgB,CACZiB,cAAe,GAEnBxB,YAAa,CACTwB,cAAe,KAwCRN,CAAmBtB,GC9DlC,MAAM6B,UAAoB/E,YACtBC,SACI,OACIC,IAAAC,cAAA,OAAKC,UAAW,0BACZF,IAAAC,cAAA,KAAIuB,IAAK,sBAAuBsD,QAASA,IAAIzE,KAAKC,MAAMyE,aAAa1E,KAAKC,MAAMK,MAC5EX,IAAAC,cAAA,OAAKC,UAAW,iCACXwB,MAAO,CAACsD,gBAAiB3E,KAAKC,MAAM0B,OAAS3B,KAAKC,MAAMuB,WAAWoD,sBAAwB5E,KAAKC,MAAMuB,WAAWqD,uBAElHlF,IAAAC,cAAA,QAAMyB,MAAO,CAACC,MAAOtB,KAAKC,MAAM0B,OAAS3B,KAAKC,MAAMuB,WAAWI,cAAc5B,KAAKC,MAAMuB,WAAWK,eAAiB7B,KAAKC,MAAM6B,OAC/HnC,IAAAC,cAACmC,IAAQ,CAAClC,UAAW,kBAQ9B2E,QCzBA,GACXM,QAAS,EACTC,UAAW,GCcf,MAAMC,WAAgBvF,YAClBC,SACI,OACIC,IAAAC,cAAA,OAAKC,UAAWG,KAAKC,MAAMgF,aAAeC,EAAeH,UAAY,+BAAiC,qBAE9F,CACI,CAACI,EAAYxH,MAAOgC,IAAAC,cAACJ,EAAW,CAACU,QAASF,KAAKC,MAAMmF,QAAQlF,QAAS+E,WAAYjF,KAAKC,MAAMgF,aAC7F,CAACE,EAAYvH,MAAO+B,IAAAC,cAACoB,EAAW,CAACI,aAAcpB,KAAKC,MAAMmB,aAAeO,OAAQ3B,KAAKC,MAAM0B,OAAQJ,MAAOvB,KAAKC,MAAMsB,MAAOO,MAAO9B,KAAKC,MAAMmF,QAAQtD,MAAOxB,IAAKN,KAAKC,MAAMmF,QAAQ9E,IAAKkB,WAAYxB,KAAKC,MAAMuB,aAClN,CAAC2D,EAAYtH,OAAQ8B,IAAAC,cAACO,EAAY,CAACG,IAAKN,KAAKC,MAAMmF,QAAQ9E,MAC3D,CAAC6E,EAAYrH,OAAQ6B,IAAAC,cAACoC,EAAY,CAAC1B,IAAKN,KAAKC,MAAMmF,QAAQ9E,IAAK6B,SAAUnC,KAAKC,MAAMmF,QAAQjD,SAC1DC,KAAMpC,KAAKC,MAAMmF,QAAQhD,KAAME,aAActC,KAAKC,MAAMmF,QAAQ9C,eACnG,CAAC6C,EAAYpH,MAAO4B,IAAAC,cAAC+C,EAAW,CAACb,MAAO9B,KAAKC,MAAMmF,QAAQtD,MAAO6B,SAAU3D,KAAKC,MAAMmF,QAAQzB,SAC9DP,SAAUpD,KAAKC,MAAMmF,QAAQhC,SAAUW,QAAS/D,KAAKC,MAAMmF,QAAQrB,QACnEC,gBAAiBhE,KAAKC,MAAMmF,QAAQpB,kBACrE,CAACmB,EAAYnH,MAAO2B,IAAAC,cAAC4E,EAAW,CAAC7C,OAAQ3B,KAAKC,MAAM0B,OAAQ+C,aAAc1E,KAAKC,MAAMyE,aAAc5C,MAAO9B,KAAKC,MAAMmF,QAAQC,SAAU/E,IAAKN,KAAKC,MAAMmF,QAAQ9E,IAAKkB,WAAYxB,KAAKC,MAAMuB,cAC7LxB,KAAKC,MAAMmF,QAAQE,eAO1BN,UCnCA,GACH,EADG,GAEL,EAFK,GAGF,ECDb,MAAMO,WAAiB9F,YAEnBC,SACI,OACIC,IAAAC,cAAA,OAAK4F,MAAM,6BAA6BC,EAAE,MAAMC,EAAE,MAAMC,QAAQ,mBAC5DhG,IAAAC,cAAA,SACID,IAAAC,cAAA,QAAMgG,EAAE,+mDAeRvE,MAAO,CAACwE,KAAM7F,KAAKC,MAAMqB,YAO9BiE,UCxBf,MAAMO,WAAqBrG,YAEvBsG,YAAY9F,GACR+F,MAAM/F,GAAO,KAQjBgG,0BAA6BC,IACrBA,IAA6BC,GAC7BnG,KAAKoG,SAAS,CAACC,qBAAsBrG,KAAKsG,MAAMD,sBAGhDrG,KAAKoG,SAAS,CAACG,wBAAyBvG,KAAKsG,MAAMC,0BAE1D,KAEDC,kBAAqBC,IACbzG,KAAKC,MAAMyG,gBAIX1G,KAAKC,MAAM0G,aAAaF,uBAAyBA,IACjDA,EAAuBN,IAG3BnG,KAAKC,MAAM2G,yBAAyB5G,KAAKC,MAAM0G,aAAaE,eAAgBJ,KAxB5EzG,KAAKsG,MAAQ,CACTD,qBAAqB,EACrBE,wBAAwB,GAyBhC7G,SACI,OACIC,IAAAC,cAAA,OAAK7C,GAAI,2BACL4C,IAAAC,cAAA,OAAKC,UAAW,wBAA0BG,KAAKC,MAAM0G,aAAaF,uBAAyBN,GAAmC,wCAA0C,IACnKpJ,GAAI,sBAAuB0H,QAASA,IAAMzE,KAAKwG,kBAAkBL,IACjEW,aAAcA,IAAM9G,KAAKiG,0BAA0BE,IACnDY,aAAcA,IAAM/G,KAAKiG,0BAA0BE,KAEnDnG,KAAKC,MAAM0G,aAAaF,uBAAyBN,KAAiE,IAA7BnG,KAAKC,MAAMyG,cAC7F/G,IAAAC,cAAC2F,GAAQ,CAACjE,MAAOtB,KAAKC,MAAM0G,aAAaF,uBAAyBN,IAAoCnG,KAAKsG,MAAMC,uBAAyB,UAAY,OACxJ,MAGN5G,IAAAC,cAAA,OAAKC,UAAW,wBAA0BG,KAAKC,MAAM0G,aAAaF,uBAAyBN,GAAgC,qCAAuC,IAC7J1B,QAASA,IAAMzE,KAAKwG,kBAAkBL,IACtCW,aAAcA,IAAM9G,KAAKiG,0BAA0BE,IACnDY,aAAcA,IAAM/G,KAAKiG,0BAA0BE,KAEnDnG,KAAKC,MAAM0G,aAAaF,uBAAyBN,KAA8D,IAA7BnG,KAAKC,MAAMyG,cAC1F/G,IAAAC,cAAC2F,GAAQ,CAACjE,MAAOtB,KAAKC,MAAM0G,aAAaF,uBAAyBN,IAAiCnG,KAAKsG,MAAMD,oBAAsB,UAAY,OAC9I,QAOXP,UCjEA,GAGC,EAHD,GAID,EAJC,GAMG,ECNH,GACH,EADG,GAEF,EAFE,GAID,ECPC,GAGD,EAHC,GAIA,EAJA,GAKN,ECgBT,MAAMkB,WAAqBvH,YACvBsG,YAAY9F,GACR+F,MAAM/F,GAQV,KAGAgH,kBAAoB,KAChB,MAAM,aAACN,GAAgB3G,KAAKC,MAE5B,IAAK0G,EAAaO,YACd,MAAO,GAGX,IAAIC,EAAU,GACVD,EAAc,GAElBP,EAAaO,YAAYE,QAAQhC,IACxBA,EAAQiC,QACTH,EAAYI,KAAKlC,KAIzB,IAAImC,EAAiB,GACrB,IAAI,IAAIC,EAAI,EAAGA,EAAIN,EAAYO,OAAQD,IAAK,CACxC,IAAIE,EAAYR,EAAYM,GAAGlC,cAAgBH,EAAYwC,WAAaT,EAAYM,GAAGpC,QAAQsC,UAAYR,EAAYM,GAAGE,UAG1H,GAFAH,EAAeD,KAAKJ,EAAYM,KAEd,IAAdE,GAAuBF,IAAMN,EAAYO,OAAS,EAAG,CACrD,IAAIG,EAAM,CACNV,YAAaK,GAGjBJ,EAAQG,KAAKM,GACbL,EAAiB,IAIzB,OAAOJ,GACT,KAEFU,oBAAsB,KAClB,MAAM,aAAClB,GAAgB3G,KAAKC,MAE5B,IAAI0H,EAAahB,EAAagB,WAE1BA,IAAehB,EAAamB,UAC5B9H,KAAKC,MAAM8H,WAAWJ,EAAWK,kBAAmBC,GAAiC,KAAMtB,GAAc,IAE/G,KAEFuB,wBAA0B,KACtB,MAAM3G,GAASvB,KAAKsG,MAAM/E,MAC1BvB,KAAKoG,SAAS,CAAC7E,WACjB,KAEFmD,aAAgBpE,GACL6H,IACFC,MAAsEC,mHAAYC,qBAAuBC,EAAwBA,GAAwB,yCAA2CvI,KAAKC,MAAMuI,MAAQ,CAAClI,IAAIA,IAC5NmI,KAAKC,IACFC,OAAOC,KAAKF,EAASG,QAExBC,MAAMC,IACH,MAAMA,IAEhB,KACFC,gBAAmBrC,IAEf3G,KAAKoG,SAAS,CAAC6C,YAAatC,EAAauC,QAGzCC,WAAW,KACPnJ,KAAKoG,SAAS,CAAC6C,aAAc,KAC9B,KAEH,MAAM/I,EAAUyG,EAAaO,YAAYtK,IAAIwM,GAAOA,EAAIlJ,SAASmJ,KAAK,MAGhEC,EAAcC,SAAS3J,cAAc,OAG3C0J,EAAYE,UAAYtJ,EAGNoJ,EAAYG,aAAeH,EAAYI,UAAzD,MAGMC,EAAcJ,SAAS3J,cAAc,OAC3C+J,EAAYH,UAAYtJ,EAGxByJ,EAAYC,aAAa,kBAAmB,QAC5CL,SAASM,KAAKC,YAAYH,GAG1B,MAAMI,EAAQR,SAASS,cACvBD,EAAME,mBAAmBN,GAGzB,MAAMO,EAAYvB,OAAOwB,eACzBD,EAAUE,kBACVF,EAAUG,SAASN,GAEnB,IAEIR,SAASe,YAAY,QACvB,MAAOC,GACLC,QAAQzB,MAAM,yBAA0BwB,GAI5ChB,SAASM,KAAKY,YAAYd,IAjH1B3J,KAAKsG,MAAQ,CACT/E,OAAO,EACP0H,aAAa,GAoHrBvJ,SACI,MAAMhB,EAAmBR,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,OACxG,aAACwI,EAAY,WAAEnF,EAAU,WAAEmJ,EAAU,cAAEjE,EAAa,WAAEzB,GAAcjF,KAAKC,OACzE,WAAC2K,GAAcpJ,EACfqJ,KAAsB5F,IAAeC,EAAeJ,SAAWG,IAAeC,EAAeH,WAAa6F,IAAgBjE,EAAakE,kBAErI,OACFlL,IAAAC,cAAA,OAAKC,WAAYoF,IAAeC,EAAeH,UAAY,qCAAuC,4BAA8B4B,EAAahF,OAAS,gCAAkC,gCACnLN,MAAO,CAACyJ,SAAU9K,KAAKC,MAAM8K,sBAAwB,OAAS,OAC9DpE,EAAahF,QAAiC,OAAvBH,EAAWwJ,SAA+C,MAA3BrE,EAAagB,aACS,IAA3EhB,EAAaO,YAAY+D,KAAKC,GAAKA,EAAE5F,cAAgBH,EAAYpH,OAAoBkH,IAAeC,EAAeH,UAQrH,KANCpF,IAAAC,cAAA,OAAKC,UAAW,iCAAkCwB,MAAO,CAAE8J,SAAUxE,EAAayE,gBAAkBC,GAA6B,MAAM,OACzG,IAAvB1E,EAAauC,OAAqC,GAAtBvC,EAAa2E,QAAkC,IAAfX,GAAwBhE,EAAayE,gBAAkBC,GAEjH,KADF1L,IAAAC,cAAA,OAAK2C,MAAM,OAAOC,OAAO,OAAO3C,UAAW,uBAAwBsD,IAAKwD,EAAa4E,WAAmC,GAAtB5E,EAAa2E,MAAiB3E,EAAa4E,UAAY/J,EAAWwJ,QAAS3H,IAAK,YAK1L1D,IAAAC,cAAA,OACIC,UAAWoF,IAAeC,EAAeH,UAAY,2CAA6C,gCAClG1D,MACI,CACImK,KAAMhK,EAAaA,EAAWgK,KAAO,OAG5CvG,IAAeC,EAAeH,WAAoC,IAAvB4B,EAAauC,OAAgBvC,EAAa8E,YAAe9E,EAAagB,YAAgBhB,EAAahF,SAAU3B,KAAKC,MAAMyG,eAAkBC,EAAayE,gBAAkBC,GAKxM,KAJT1L,IAAAC,cAAA,OAAKC,UAAW,qCACT8G,EAAahF,SAAWgF,EAAa+E,aAAclK,EAAWmK,YAC4B,IAApFhF,EAAa+E,WAAa/E,EAAa+E,WAAalK,EAAWmK,aAAe,MAClFhF,EAAahF,OAASpD,EAAwBoI,EAAanI,aAAa,EAAOE,GAAoBH,EAAwBoI,EAAanI,aAAa,EAAME,KAIxKiB,IAAAC,cAAA,OACIC,WAAYoF,IAAeC,EAAeH,UAAY,6CAA+C,qCAAyE,IAAnC4B,EAAakE,kBAA8B,GAC7KlE,EAAahF,OAAUsD,IAAeC,EAAeH,UAAY,mDAAqD,wCAA6C8F,EAAoB,uCAA0C7K,KAAKC,MAAMyG,cAAgB,iDAAkD,KAClTC,EAAamB,SAAW,4CACrBnB,EAAagB,WAAa,8CAAgD,IAGlFtG,MAAQsF,EAAahF,QAAUH,IACL,IAAtBqJ,EACA,CACIlG,gBAAiBnD,EAAWoD,sBAC5BtD,MAAOE,EAAWI,cAClBgK,OAAQpK,EAAWqK,wBAA0B,aAAerK,EAAWqK,wBAA0B,MAEnGlF,EAAahF,SAAUH,GAAemF,EAAagB,aAC3B,IAAtBkD,EAOAlE,EAAagB,WACT,CACIhD,gBAAiB3E,KAAKsG,MAAM/E,MAAQC,EAAWsK,iCACvCtK,EAAWsK,iCAAmCtK,EAAWqD,qBAC7DrD,EAAWuK,4BAA8BvK,EAAWuK,4BAA8B,KACtFzK,MAAOtB,KAAKsG,MAAM/E,MAAQC,EAAWC,yBAC7BD,EAAWC,yBAA2BD,EAAWK,aACrDL,EAAWE,oBAAsBF,EAAWE,oBAAsB,KACtEsK,YAAaxK,EAAWyK,sBAAwBzK,EAAWyK,sBAAwBzK,EAAWqD,sBAC9F,KAfR,CACIF,gBAAiBnD,EAAWqD,qBAC5BvD,MAAOE,EAAWK,aAClB+J,OAAQpK,EAAWqK,wBAA0B,aAAerK,EAAWqK,wBAA0B,MAa7GpH,QAASzE,KAAK6H,oBAAqBf,aAAc9G,KAAKkI,wBACtDnB,aAAc/G,KAAKkI,yBAElBlI,KAAKC,MAAMyG,eAAiB1G,KAAKC,MAAM0G,aAAahF,QAAU3B,KAAKC,MAAM0G,aAAauF,gBAAkB,EACrGvM,IAAAC,cAAA,OAAKyB,MAAO,CAAC8K,SAAU,WAAY7K,MAAO,wBACtC3B,IAAAC,cAAA,OAAKyB,MAAO,CAAC8K,SAAU,WAAYC,MAAO,QAASC,IAAK,SAQnDrM,KAAKC,MAAM0G,aAAauF,kBAAoBI,GACzC3M,IAAAC,cAAC2M,IAAS,MAAK,KAElBvM,KAAKC,MAAM0G,aAAauF,kBAAoBI,GACzC3M,IAAAC,cAAC4M,IAAO,MAAK,OAGhB,KAEZxM,KAAKiH,oBAAoBrK,IAAI,CAACgL,EAAKsB,IAChCvJ,IAAAC,cAAA,OACIC,UAAWoF,IAAeC,EAAeH,UAAY,yBAA2B,cAChF0H,IAAKvD,GACJtB,EAAIV,YAAYtK,IAAI,CAACwI,EAAS8D,IAC3BvJ,IAAAC,cAACoF,GAAO,CAACC,WAAYA,EAAY1D,MAAOvB,KAAKsG,MAAM/E,MAC1CH,aAAyC,MAA3BuF,EAAagB,WAC3BjD,aAAepE,GAAQN,KAAK0E,aAAapE,GAAM8E,QAASA,EACxDzD,OAAQgF,EAAahF,OAAQ+K,YAAa1M,KAAKC,MAAMyM,YACrDlL,WAAYA,EAAYiL,IAAKvD,QAUhDvJ,IAAAC,cAAA,OAAKC,UAAW,uBAEdF,IAAAC,cAAA,OAAKC,UAAW,gCACW,QAAtB8G,EAAa2E,OAAoB3E,EAAaE,gBAAkB5B,IAAeC,EAAeJ,SAC3FnF,IAAAC,cAACkG,GAAY,CACTa,aAAcA,EACdnF,WAAYA,EACZoF,yBAA0B5G,KAAKC,MAAM2G,yBACrCF,cAAe1G,KAAKC,MAAMyG,cAC1BzB,WAAYA,IAGnBA,IAAeC,EAAeH,YAAoC,IAAvB/E,KAAKC,MAAM0M,SAAoBhG,EAAaiG,iBAAmBjG,EAAahF,QACpHhC,IAAAC,cAACiN,WAAQ,KAILlN,IAAAC,cAACkG,GAAY,CACTa,aAAcA,EACdnF,WAAYA,EACZoF,yBAA0B5G,KAAKC,MAAM2G,yBACrCF,cAAe1G,KAAKC,MAAMyG,cAC1BzB,WAAYA,MAM3BtF,IAAAC,cAAAD,IAAAkN,SAAA,KAAE,SAAO7M,KAAKC,MAAMgF,aAAeC,EAAeH,YAAc4B,EAAa8E,aAAe9E,EAAagB,cAAgBhB,EAAahF,QAAU3B,KAAKC,MAAMyG,gBAAkBC,EAAayE,gBAAkBC,IACxM1L,IAAAC,cAAA,OACIC,UAAU,YACV4E,QAASA,IAAMzE,KAAKgJ,gBAChBrC,IAGFA,EAAauC,OAASlJ,KAAKsG,MAAM2C,YAC/BtJ,IAAAC,cAAA,OAAK2C,MAAM,KAAKC,OAAO,KAAKmD,QAAQ,YAAYE,KAAK,OAAOL,MAAM,6BAA6B3F,UAAU,aACrGF,IAAAC,cAAA,QAAMkN,SAAS,UAAUC,SAAS,UAAUnH,EAAE,mBAAmBoH,OAAO,eAAeC,YAAY,IAAIC,cAAc,QAAQC,eAAe,WAGhJxN,IAAAC,cAAA,OAAK2C,MAAM,KAAKC,OAAO,KAAKmD,QAAQ,YAAYE,KAAK,OAAOL,MAAM,6BAA6B3F,UAAU,aACrGF,IAAAC,cAAA,QAAMkN,SAAS,UAAUC,SAAS,UAAUnH,EAAE,ibAAibC,KAAK,oBAKpfZ,IAAeC,EAAeH,YAAa/E,KAAKC,MAAM0M,SAAYhG,EAAa8E,YAAgB9E,EAAahF,SAAU3B,KAAKC,MAAMyG,eAAkBC,EAAayE,gBAAkBC,GAGtK,KAFT1L,IAAAC,cAAA,OAAKC,UAAW,+CACXtB,EAAwBoI,EAAanI,aAAa,EAAOE,QAW/DsI,U,yCC7RjC,MAAMoG,WAAyB3N,YAC3BsG,YAAY9F,GACR+F,MAAM/F,GASV,KAGAoN,yBAA4B1L,IAChB,CACJuF,YAAa,CACT,CACI5B,YAAagI,EAAgB3P,KAC7BuC,QAAS,mFAKjBgJ,MAAO,EACPvH,OAAQA,EACR8J,YAAY,IAIpB,KAGA8B,eAAiB,KACTvN,KAAKwN,cACNxN,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,UAEnD/E,KAAKwN,YAAYC,eAAe,CAACC,SAAU,WAG3C1N,KAAK2N,4BAA4BC,SAAS,CAAEvB,IAAKrM,KAAK2N,4BAA4BE,aAAcH,SAAU,aAKhH,KAEFI,0BAA2B,KAEvB,MAAMC,EAAKpF,OAAOqF,UAAUC,UACtBC,EAAOH,EAAGI,QAAQ,SAAW,GAAKJ,EAAGI,QAAQ,YAAc,EAEjE,OAAKnO,KAAKoO,oBAIHF,EAAOlO,KAAKoO,oBAAoBP,aAAe7N,KAAKoO,oBAAoBC,aAHpE,MAMf,KAGAC,+BAAkCC,IAC1BA,GAAavO,KAAKsG,MAAMkI,iBAExBxO,KAAKoG,SAAS,CAACqI,2BAA4BzO,KAAK8N,4BAA6BY,mBAAmB,GAAO,KACnG1O,KAAKC,MAAM0O,0BAavB,KAMAC,kBAAoB,KAChB,MAAMC,EAAO7O,KAEb8O,YAAY,KACR,GAAgC,MAA5BD,EAAKT,oBACL,OAGJ,MAAMW,EAAyB/O,KAAK8N,4BAEhCiB,GAA0BA,IAA2BF,EAAKvI,MAAMmI,8BAE7B,IAA/BI,EAAKvI,MAAMkI,iBACXrF,WAAW,KACPnJ,KAAKoG,SAAS,CAACoI,iBAAiB,KACjC,KAGHxO,KAAKC,MAAM+O,UACXH,EAAKtB,iBAEEvN,KAAKsG,MAAMoI,oBAClBG,EAAKlB,4BAA4BsB,UAAYF,EAAyBF,EAAKvI,MAAMmI,4BAGrFI,EAAKzI,SAAS,CAACqI,2BAA4BM,EAAwBL,mBAAmB,MAE3F,KAEHvF,WAAW,KACPnJ,KAAKoG,SAAS,CAACoI,iBAAiB,KACjC,MAKP,KAKAU,uBAAyB,KACrB,IAAKlP,KAAKC,MAAMkP,iBACZ,MAAO,GAGX,IAAIhI,EAAU,GACVS,EAAM,GAuBV,OAtBA5H,KAAKC,MAAMkP,iBAAiB/H,QAAQ,CAACT,EAAcuC,EAAOkG,KACjDzI,EAAaU,QACdO,EAAIN,KAAKX,IAWA,KARCuC,EAAQ,GAAKkG,EAAM3H,OAAS,GACP,MAA/Bd,EAAaiG,gBAA6D,MAAnCwC,EAAMlG,EAAQ,GAAG0D,gBACvDjG,EAAaiG,iBAAmBwC,EAAMlG,EAAQ,GAAG0D,iBACrB,MAA3BjG,EAAagB,YAAqD,MAA/ByH,EAAMlG,EAAQ,GAAGvB,YACjDhB,EAAayE,gBAAkBC,IAC5B1E,EAAayE,gBAAkBC,IAC/B1E,EAAayE,gBAAkBgE,EAAMlG,EAAQ,GAAGkC,kBAGpDxD,EAAIH,OAAS,GACbN,EAAQG,KAAKM,GAGjBA,EAAM,MAIPT,GACT,KAEFkI,sBAAyBC,GAEjBA,EAAgB1S,IAAI,CAAC+J,EAAcuC,IAC3BvC,EAAaU,QACRV,EAAaO,YAAYqI,MAAOnK,IACH,IAAnBA,EAAQiC,QAFD,KAId1H,IAAAC,cAAC4P,IAAK,CAAEC,UAAW9I,EAAahF,OAAS,OAAS,QAAS+N,IAAI,EAAMjD,IAAKvD,GACtEvJ,IAAAC,cAACoH,GAAY,CAACwB,MAAOxI,KAAKC,MAAMuI,MAAOmC,YAAY,EAAOhE,aAAcA,EAAcnF,WAAYxB,KAAKC,MAAMuB,WAC/FkL,YAAa1M,KAAKC,MAAMyM,YAAa3E,WAAY/H,KAAKC,MAAM8H,WAC5DnB,yBAA0B5G,KAAKC,MAAM2G,yBACrCF,cAAe1G,KAAKC,MAAMyG,cAAegE,SAAU1K,KAAKC,MAAMyK,SAC9DK,sBAAuB/K,KAAKC,MAAM8K,sBAClC9F,WAAYC,EAAeJ,YAvKjE9E,KAAKsG,MAAQ,CACTmI,2BAA4B,EAC5BC,mBAAmB,EACnBF,iBAAiB,GAgEzBmB,mBAAmBC,GACXA,EAAUC,iBAAqB7P,KAAKC,MAAM4P,iBA0GlDnQ,SAEI,MAAMoQ,EAAsB9P,KAAKkP,yBAEjC,OAEQvP,IAAAC,cAAA,OAAK7C,GAAI,8BAA+BgT,IAAMC,GAAQhQ,KAAK2N,4BAA8BqC,GACpFhQ,KAAKsG,MAAMoI,kBACR/O,IAAAC,cAAA,OAAK7C,GAAI,6BACL4C,IAAAC,cAACqQ,KAAc,OACV,KAEbtQ,IAAAC,cAAA,OAAK7C,GAAI,+BAAgCgT,IAAMC,GAAQhQ,KAAKoO,oBAAsB4B,GAC7EhQ,KAAKC,MAAMiQ,UAAYJ,EAAoBrI,OAAS,EACjD9H,IAAAC,cAACuQ,KAAS,CAACC,SAAUpQ,KAAKsO,gCACtB3O,IAAAC,cAAA,OAAKyB,MAAO,CAACkB,MAAO,OAAQC,OAAQ,UACzB,KAGlBsN,EAAoBlT,IAAI,CAAC0S,EAAiBpG,IACvCvJ,IAAAC,cAAA,OACIC,UAA4C,MAAjCyP,EAAgB,GAAG3H,WAAqB,8BAAgC,yCACnF8E,IAAKvD,GACJoG,EAAgB,GAAGlE,gBAAkBC,GAClC1L,IAAAC,cAACyQ,YAAQ,CAACC,mBAAiB,EAACC,YAAU,EAACpO,UAAQ,EAACqO,YAAY,EAClDC,YAAY,EAAOC,YAAY,EAAOC,sBAAuB,GAC7D9Q,UAAW,gCAChBG,KAAKqP,sBAAsBC,IAGhCtP,KAAKqP,sBAAsBC,KAKtCtP,KAAKC,MAAMwL,WAEJ9L,IAAAC,cAACoH,GAAY,CAACwB,MAAOxI,KAAKC,MAAMuI,MAClBmC,WAAoD,IAAvC3K,KAAKC,MAAMkP,iBAAiB1H,SAC+C,IAA/EzH,KAAKC,MAAMkP,iBAAiBnP,KAAKC,MAAMkP,iBAAiB1H,OAAS,GAAG9F,OAC1EgF,aAAc3G,KAAKqN,0BAAyB,GAC/C7L,WAAYxB,KAAKC,MAAMuB,WACvBkJ,SAAU1K,KAAKC,MAAMyK,SACrBzF,WAAYC,EAAeJ,UAG3C,KAEL9E,KAAKC,MAAM2Q,YACJjR,IAAAC,cAACoH,GAAY,CAACwB,MAAOxI,KAAKC,MAAMuI,MAClB7B,aAAc3G,KAAKqN,0BAAyB,GAC5C7L,WAAYxB,KAAKC,MAAMuB,WAAYkJ,SAAU1K,KAAKC,MAAMyK,SACxDzF,WAAYC,EAAeJ,UAE3C,KAENnF,IAAAC,cAAA,OAAKyB,MAAO,CAACwP,MAAO,OAAQC,MAAO,QAC9Bf,IAAMgB,IACF/Q,KAAKwN,YAAcuD,QAarC3D,U,oGCnQf,MAAM4D,WAAuBvR,YACzBsG,YAAY9F,GACR+F,MAAM/F,GAAO,KAejBgR,kBAAkB,KACdjR,KAAKoG,SAAS,CACV8K,iBAAkBlR,KAAKsG,MAAM4K,mBAEpC,KAEDC,SAAW,KACPnR,KAAKoG,SAAS,CAACgL,SAAUpR,KAAKqR,SACjC,KAEDC,UAAY,KACRtR,KAAKoG,SAAS,CAACgL,SAAU,QAC3B,KAEFrJ,WAAcwJ,IACVvR,KAAKC,MAAM8H,WAAWwJ,EAAaC,SAAUvJ,GACzCsJ,EAAaE,YAAa,KAAM,KAAMF,EAAaxU,IAEvDiD,KAAKsR,aACP,KAgBFI,cAAgBC,IAAiB,IAAhB,OAAEzQ,GAAQyQ,EACvB,MAAMjT,EAAmBR,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,MACxGyT,EAAQC,MAAMC,KAAK5Q,EAAO0Q,OAChC,IAAIG,EAAkB,IAAI/R,KAAKsG,MAAM0L,cAGjCD,EAAgBtK,OAASmK,EAAMnK,OAAS,EACxCzH,KAAKC,MAAMgS,wBAAwBnT,EAAaJ,GAAkB,2CAA6C,sCAInHkT,EAAMxK,QAAQpJ,IACV,GAAIA,EAAK8F,KAAOyE,EAEZ,YADAvI,KAAKC,MAAMgS,wBAAwBnT,EAAaJ,GAAkB,2CAItE,GAAIqT,EAAgB9G,KAAKiH,GAAgBA,EAAaC,OAASnU,EAAKmU,MAAQD,EAAapO,OAAS9F,EAAK8F,MAEnG,YADA9D,KAAKC,MAAMgS,wBAAwBnT,EAAaJ,GAAkB,2CAItE,MAAM0T,EAAa,IAAIC,WACvBrS,KAAKoG,SAAS,CAAEkM,SAAU,EAAGC,SAAS,IAEtCH,EAAWI,QAAU,IAAMhI,QAAQiI,IAAI,4BACvCL,EAAWM,QAAU,IAAMlI,QAAQiI,IAAI,2BAEvCL,EAAWO,OAAUxV,IACjB,MAAMyV,EAAczV,EAAE+D,OAAOlC,OAGvB6T,EAAU,CACZC,YAHc,IAAIC,WAAWH,GAAaI,OAAO,CAACnK,EAAMoK,IAASpK,EAAOqK,OAAOC,aAAaF,GAAO,IAInGd,KAAMnU,EAAKmU,KACXiB,WAAY,wCAIhBpT,KAAKoG,SAAUiN,IAAS,CACpBrB,aAAc,IAAIqB,EAAUrB,aAAca,GAC1CN,SAAS,KAGbvS,KAAKC,MAAMqT,uBAAuBtV,EAAKmU,MACvCnS,KAAKC,MAAMsT,sBAAsBV,IAGrCT,EAAWoB,kBAAkBxV,MAhGjCgC,KAAKsG,MAAQ,CACT8K,SAAU,KACVpT,KAAM,KACNyV,WAAY,KACZnB,SAAU,KACV/Q,OAAO,EACPmS,QAAS,UACTnB,SAAS,EACTrB,iBAAkB,EAClBc,aAAc,IAyBtBrC,mBAAmBC,GAEXA,EAAU+D,yBAA2B3T,KAAKC,MAAM0T,wBACV,OAAtC3T,KAAKC,MAAM0T,wBAEX3T,KAAKoG,SAASiN,IAAS,CACnBrB,aAAcqB,EAAUrB,aAAa4B,OAAO,CAACC,EAAGrM,IAAMA,IAAMxH,KAAKC,MAAM0T,0BACvE,KACJ3T,KAAKC,MAAM6T,kCA+EnBpU,SACI,OACIC,IAAAC,cAAA,OAAK7C,GAAI,mCACL4C,IAAAC,cAAA,SACImU,OAAO,MACPhX,GAAG,wBACHiX,UAAQ,EACRC,KAAK,OACL5S,MAAO,CAAE8C,QAAS,QAClBiM,SAAUpQ,KAAK0R,cACfjN,QAAUtH,IAA8B,IAAvB6C,KAAKsG,MAAMiM,QAAqBpV,EAAE+D,OAAOgT,MAAQ,KAAQ,KAC1EpM,SAAU9H,KAAKsG,MAAMiM,UAEzB5S,IAAAC,cAAA,SAAOuU,QAAQ,yBACXxU,IAAAC,cAACwU,KAAI,CACDC,SAAS,IACTtX,GAAI,sBACJ0H,QAASzE,KAAKmR,SACdpB,IAAMgB,IACF/Q,KAAKqR,MAAQN,IAGjBpR,IAAAC,cAAC0U,KAAc,CACXjT,MAAO,CACHwE,KACI7F,KAAKC,MAAMuB,aACoB,IAA/BxB,KAAKsG,MAAM4K,gBACLlR,KAAKC,MAAMuB,WAAW+S,yBACtB,UACVC,OAAQxU,KAAKsG,MAAMiM,QAAU,cAAgB,MAEjDzL,aAAc9G,KAAKiR,kBACnBlK,aAAc/G,KAAKiR,wBAWhCD,UCjKf,MAAMyD,WAAuBhV,YACzBsG,YAAY9F,GACR+F,MAAM/F,GAad,KAWIyU,iBAAiB,KACb1U,KAAKoG,SAAS,CACVuO,gBAAiB3U,KAAKsG,MAAMqO,kBAEnC,KAGDC,iBAAmB,KACf5U,KAAKoG,SAAS,CAACgL,SAAUpR,KAAKqR,SAEhC,KAEFwD,kBAAoB,KAChB7U,KAAKoG,SAAS,CAACgL,SAAU,QAI7B,KAGA0D,oBAAuB3X,IACnB,GAAc,UAAVA,EAAEsP,IAEF,OADAtP,EAAE4X,iBACK/U,KAAKC,MAAMyM,aAAY,IAWpC,KAGFsI,mBAAsB7X,IAElB,GAAyB,kBAAd6C,KAAKiV,OAAgC,OAAbjV,KAAKiV,MAAc,CAClD,MAAMC,EAAiBlV,KAAKiV,MAAMC,eAC5BC,EAAenV,KAAKiV,MAAME,aAChCnV,KAAKoG,SAAS,CACV8O,eAAgBA,EAChBC,aAAcA,IAGfnV,KAAKC,MAAMuB,WAAWyD,YAAcC,EAAeH,YAElB,GAA7B/E,KAAKC,MAAMmF,QAAQqC,QAA+C,MAA/BzH,KAAKC,MAAMkP,kBAAiE,GAAtCnP,KAAKC,MAAMkP,iBAAiB1H,QAEpGzH,KAAKC,MAAMmV,6BAEfpV,KAAKoG,SAAS,CAACiP,YAAY,IAC3BrV,KAAKC,MAAMqV,2BAA0B,MAGhD,KAEDC,mBAAsBC,IAElB,GAAIxV,KAAKyV,WAAWC,UAAY1V,KAAKyV,WAAWC,QAAQC,SAASH,EAAMtU,QAAS,CAE5EsJ,QAAQiI,IAAI,gCAEZ,MAAMmD,EAAUrM,SAASsM,cAAc,4CACnCD,IACAA,EAAQvU,MAAM8C,QAAU,UAKpC,KAGA2R,oBAAuB3Y,IAEnB,GAAuB,KAAnBA,EAAE+D,OAAOgT,OAAuC,KAAvBlU,KAAKC,MAAMmF,QAAgB,CACpD,MAAM2Q,EAAmC,KAAvB/V,KAAKC,MAAMmF,QAC7BpF,KAAKC,MAAM+V,kBAAkBD,GAGjC,GAAyB,kBAAd/V,KAAKiV,OAAgC,OAAbjV,KAAKiV,MAAc,CAClD,MAAMC,EAAiBlV,KAAKiV,MAAMC,eACL,kBAAlBA,GACPlV,KAAKoG,SAAS,CACZ8O,eAAeA,EACbC,aAAaD,IAKzBlV,KAAKC,MAAMgW,qBAAqB9Y,EAAE+D,OAAOgT,QAI7C,KAGAgC,SAAYC,IAER,MAAMC,GAAgBpW,KAAKC,MAAMmF,QAAU,IAAK,IAAM+Q,EAAME,OAEtDjR,EAAYpF,KAAKC,MAAMmF,QAAQkR,OAAO,EAAGtW,KAAKsG,MAAM4O,gBAAkBkB,EAAcpW,KAAKC,MAAMmF,QAAQkR,OAAOtW,KAAKsG,MAAM4O,gBAE/HlV,KAAKoG,SAAS,CAACgL,SAAU,OAEzBpR,KAAKC,MAAMgW,qBAAqB7Q,IAlIhCpF,KAAKuW,YAAc5W,IAAM6W,YACzBxW,KAAKyV,WAAa9V,IAAM6W,YACxBxW,KAAKsG,MAAQ,CACT8K,SAAU,KACV8D,eAAe,EACfC,aAAa,EACbR,gBAAiB,EACjBU,YAAY,GA8HpB3V,SAEI,MAAMhB,EAAmBR,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,MAE9G,OACIwB,IAAAC,cAACiN,WAAQ,KACTlN,IAAAC,cAAA,OAAK7C,GAAI,8BACPiD,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,UAClDpF,IAAAC,cAAA,OACIyB,MAAO,CACHiD,SAAU,OACVH,QAAS,OACTE,WAAY,SACZD,eAAgB,OAChBqS,aAAc,OACdnV,MAAM,aAGV3B,IAAAC,cAAA,OACI4F,MAAM,6BACNjD,MAAM,KACNC,OAAO,KACPmD,QAAQ,YACRE,KAAK,OACLmH,OAAO,eACPC,YAAY,IACZC,cAAc,QACdC,eAAe,SAEfxN,IAAAC,cAAA,UAAQ8W,GAAG,KAAKC,GAAG,KAAKC,EAAE,MAC1BjX,IAAAC,cAAA,QAAMiX,GAAG,KAAKC,GAAG,KAAKC,GAAG,QAAQC,GAAG,YAG5C,KACArX,IAAAC,cAACqX,KAAgB,CAAE5C,SAAS,IAAItX,GAAI,mBAAoBmX,MAAOlU,KAAKC,MAAMmF,QACtD8R,YACIlX,KAAKC,MAAMyK,SACT1K,KAAKC,MAAMkX,iBACTrY,EAAaJ,GAAkB,qDAC/BsB,KAAKC,MAAMmX,cACXtY,EAAaJ,GAAkB,gDAC/BsB,KAAKC,MAAMoX,eAA8C,KAA7BrX,KAAKC,MAAMoX,cACvCrX,KAAKC,MAAMoX,cACXvY,EAAaJ,GAAkB,uCACjC,GAEP4Y,UAAWtX,KAAKC,MAAMsX,aAAcvX,KAAKC,MAAMsX,aAAc,MAAOnH,SAAUpQ,KAAK8V,oBAAqBrR,QAASzE,KAAKgV,mBAAqBwC,aAAc,MAAOC,WAAS,EACzK1H,IAAKgB,GAAI/Q,KAAKiV,MAAMlE,EACpB2G,UAAW1X,KAAK8U,oBAChB6C,QAAU3X,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,UAAY,EAAI,IACvG1D,MAAO,CAACmK,KAAMxL,KAAKC,MAAMuB,WAAaxB,KAAKC,MAAMuB,WAAWgK,KAAO,SAGrFxL,KAAKC,MAAMuB,aAA2B,IAAboW,cAAuB5X,KAAKC,MAAMuB,WAAWqW,aAAe7X,KAAKC,MAAMmX,eAC7FzX,IAAAC,cAAA,OAAK7C,GAAI,8BAEL4C,IAAAC,cAACwU,KAAI,CAAEC,SAAS,IAAItX,GAAI,sBAAwB0H,QAASzE,KAAK4U,iBAAkB7E,IAAMgB,IAAQ/Q,KAAKqR,MAAQN,IACvGpR,IAAAC,cAACkY,KAAQ,CAACzW,MAAO,CAACwE,KAAM7F,KAAKC,MAAMuB,YAA2C,GAA7BxB,KAAKsG,MAAMqO,eAAyB3U,KAAKC,MAAMuB,WAAW+S,yBAA2B,WAAczN,aAAc9G,KAAK0U,iBAAkB3N,aAAc/G,KAAK0U,oBAEhN/U,IAAAC,cAACmY,KAAO,CACJhb,GAAG,qBACH6L,KAAMoP,QAAQhY,KAAKsG,MAAM8K,UACzBA,SAAUpR,KAAKsG,MAAM8K,SACrB6G,aAAc,CACVC,SAAU,SACVC,WAAY,QAEhBC,gBAAiB,CACbF,SAAU,MACVC,WAAY,QAEhBE,QAASrY,KAAK6U,kBACdyD,qBAAmB,GAEnB3Y,IAAAC,cAAC2Y,KAAM,CAACC,YAAY,QAASC,cAAc,QAAQA,cAAc,QAAQC,KAAM,EAAGC,SAAW3Y,KAAKkW,SAAU0C,QAAS,CAAC,UAAYC,KAAM,CAAEC,OAAQ,SAC9IhI,MAAO,QACPiI,SAAU,iBACVC,SAAU,gCACVC,WAAY,CACRH,OAAQ,iBACRI,OAAQ,kBACRC,QAAS,oBACTC,OAAQ,gBACRC,OAAQ,mBACRC,MAAO,eACPC,SAAU,WACVC,OAAQ,kBACRC,QAAS,UACTC,QAAS,UACTC,MAAO,QACPC,OAAQ,UAEZC,gBAAiB,mBACjBC,UAAW,CACPC,EAAG,oBACHC,EAAG,kBACHC,EAAG,yBACHC,EAAG,mBACHC,EAAG,wBACHC,EAAG,mBACDC,aAAa,QAAQC,IAAI,YAIlC,KAEZta,KAAKC,MAAMsa,gBACR5a,IAAAC,cAAA,OAAK7C,GAAI,kCAAmC0H,QAASzE,KAAKC,MAAMua,aAC5D7a,IAAAC,cAAA,OAAK4F,MAAM,6BAA6BhD,OAAQ,GAAID,MAAO,GAAIlB,MAAO,CAACwE,KAAM,YACxEF,QAAQ,eACThG,IAAAC,cAAA,QAAMgG,EAAE,kTAIR,KAGV5F,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,WAAa/E,KAAKC,MAAMmF,QAAYzF,IAAAC,cAACiE,IAAM,CAC7FY,QAASA,IAAMzE,KAAKC,MAAMwa,uBAC1BpZ,MAAO,CACHiD,SAAU,OACVoW,WAAY,SACZC,UAAW,SACXpY,MAAO,OACPC,OAAQ,OACRoY,WAAY,OACZhP,OAAQ,OACRjH,gBAAiB,cACjB6P,OAAQ,UACRrJ,SAAW,OACX7J,MAAM,aAEb,QAEW,KACoB,GAA/BtB,KAAKC,MAAMkX,kBAA6BnX,KAAKC,MAAMmF,QAChDzF,IAAAC,cAACiE,IAAM,CAAC/B,MAAOhD,EAAaZ,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,OAAO,yBAA0BkW,SAAS,IAAItX,GAAI,wCAAyC0H,QAASA,IAAIzE,KAAKC,MAAMyM,aAAY,IAC5O/M,IAAAC,cAAA,OAAK4F,MAAM,6BAA6BG,QAAQ,kBAAkBtE,MAAO,CAACwE,KAAM7F,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAW+S,2BAC3H5U,IAAAC,cAAA,SACID,IAAAC,cAAA,WACIib,OAAO,oEAGX,OAQjBpG,U,yCCvSf,MAAMqG,WAAsBrb,YACxBsG,YAAY9F,GACR+F,MAAM/F,GAAO,KASjB8a,gBAAgB,KACZ/a,KAAKoG,SAAS,CACV4U,eAAgBhb,KAAKsG,MAAM0U,iBAElC,KAED7J,SAAW,KACP,IAAI8J,EAAmB,GAEnBjb,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMyK,WACpCuQ,EAAmBjb,KAAKC,MAAMuB,WAAWyZ,iBAAiBrH,OAAQrC,GACvDA,EAAapT,eAAiB6B,KAAKC,MAAMyK,SAASvM,eAI7D8c,EAAiBxT,OAAS,IAC1BwT,EAAiBC,KAAK,CAACC,EAAGC,IAAMD,EAAEjS,MAAQkS,EAAElS,OAE5ClJ,KAAKoG,SAAS,CAAC6U,oBAAmB,KAC9Bjb,KAAKoG,SAAS,CAACiV,QAAQ,QAGjC,KAEF/J,UAAY,KACRtR,KAAKoG,SAAS,CAACiV,QAAQ,KACzB,KAEFtT,WAAcwJ,IACVvR,KAAKC,MAAM8H,WAAWwJ,EAAaC,SAAUvJ,GACzCsJ,EAAaE,YAAa,KAAM,KAAMF,EAAaxU,IAEvDiD,KAAKsR,aAvCLtR,KAAKsG,MAAQ,CAAC+U,QAAQ,EAClBJ,iBAAkB,GAClBD,eAAe,GAwCvBtb,SAEI,MAAMuY,EAAejY,KAAKC,MAAMqb,UAC5B,CACIpD,SAAU,MACVC,WAAY,SAGhB,CACID,SAAU,SACVC,WAAY,SAGdC,EAAkBpY,KAAKC,MAAMqb,UAC/B,CACIpD,SAAU,SACVC,WAAY,SAGhB,CACID,SAAU,MACVC,WAAY,SAGpB,OAEIxY,IAAAC,cAAA,OAAK7C,GAAI,6BAEL4C,IAAAC,cAACwU,KAAI,CAACC,SAAU,EAAGtX,GAAI,sBAAwB0H,QAASzE,KAAKmR,SAAUpB,IAAMgB,IAAQ/Q,KAAKqR,MAAQN,IAC9FpR,IAAAC,cAAC2b,KAAQ,CAACla,MAAO,CAACwE,KAAM7F,KAAKC,MAAMuB,YAA0C,GAA5BxB,KAAKsG,MAAM0U,cAAwBhb,KAAKC,MAAMuB,WAAW+S,yBAA2B,WAAezN,aAAc9G,KAAK+a,gBAAiBhU,aAAc/G,KAAK+a,mBAG/Mpb,IAAAC,cAAC4b,KAAI,CACDze,GAAG,kBACHqU,SAAUpR,KAAKC,MAAMmR,SACrBqK,aAAW,EACX7S,KAAM5I,KAAKsG,MAAM+U,OACjBhD,QAASrY,KAAKsR,UACd2G,aAAcA,EACdG,gBAAiBA,EACjBsD,mBAAoB,MAEnB1b,KAAKsG,MAAM2U,iBAAiBre,IAAI,CAAC2U,EAAcrI,IAC5CvJ,IAAAC,cAAC+b,KAAQ,CAAClX,QAASA,KAAOzE,KAAK+H,WAAWwJ,IAAiB9E,IAAKvD,EAAOrJ,UAAW,iBACxEwB,MAAOrB,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAWgK,KAClD,CAACA,KAAMxL,KAAKC,MAAMuB,WAAWgK,MAC7B,CAAClH,SAAU,WACpBiN,EAAaE,iBAU3BqJ,U,4FCnEAc,OAtCmBjK,IAAiF,IAAhF,WAAChK,EAAU,iBAAEjJ,EAAgB,aAAEmd,EAAY,aAAEC,EAAY,eAAEC,GAAepK,EACzG,OACIhS,IAAAC,cAACoc,KAAQ,CAACvP,IAAK9E,EAAW5K,GAAIsE,MAAO,CAAC+C,eAAgB,gBAAiBqS,aAAc,IACjF9W,IAAAC,cAACqc,KAAY,CAACC,QACVvc,IAAAC,cAAC2D,IAAU,CAAClC,MAAO,CAAE8a,SAAU,SAC3Bxc,IAAAC,cAAA,QAAME,wBAAyB,CAACC,OAAQgc,QAGhDpc,IAAAC,cAAA,OAAKyB,MAAO,CAAC8C,QAAS,OAAQiY,SAAU,WACpCzc,IAAAC,cAACyc,KAAO,CACJva,MAAOhD,EAAaJ,GAAkB,+BACtC4d,aAAW,OAEX3c,IAAAC,cAAC2c,KAAU,CAAC9X,QAAUtH,GAAM0e,EAAalU,EAAW6J,WAChD7R,IAAAC,cAAC4c,KAAQ,CAAClY,SAAS,YAG3B3E,IAAAC,cAACyc,KAAO,CACJva,MAAOhD,EAAaJ,GAAkB,+BACtC4d,aAAW,OAEX3c,IAAAC,cAAC2c,KAAU,CAAC9X,QAAUtH,GAAM2e,EAAanU,EAAW6J,WAChD7R,IAAAC,cAAC6c,KAAQ,CAACnY,SAAS,eCG5BoY,OA7BkB/K,IAAqD,IAApD,WAAChK,EAAU,iBAAEgV,EAAgB,eAAEZ,GAAepK,EAC5E,OACIhS,IAAAC,cAAC+b,KAAQ,CACLlP,IAAK9E,EAAW5K,GAChBsE,MAAO,CAAC+C,eAAgB,gBAAiBqS,aAAc,EAAGmG,WAAY,SAAUC,UAAW,QAC3FpY,QAASA,IAAMkY,EAAiBhV,EAAWmV,WAE3Cnd,IAAAC,cAAC2D,IAAU,CAAClC,MAAO,CAAE8a,SAAU,OAAS7X,SAAS,SAC7C3E,IAAAC,cAAA,QAAME,wBAAyB,CAACC,OAAQgc,MAE5Cpc,IAAAC,cAAA,OAAKyB,MAAO,CAAC8C,QAAS,OAAQiY,SAAU,WACpCzc,IAAAC,cAAC2c,KAAU,CAAC9X,QAAUtH,IACdA,EAAE4f,kBACFJ,EAAiBhV,EAAWmV,WAEhCE,eAAa,OCdjC,MAAMC,WAAqBxd,YAEvBsG,YAAY9F,GACR+F,MAAM/F,GAAO,KAOjBid,eAAkB/f,IACD,YAAVA,EAAEsP,MACDtP,EAAE4X,iBACC5X,EAAE+D,OAAOic,uBACRhgB,EAAE+D,OAAOic,uBAAuBC,QACzBpd,KAAKC,MAAMqb,WAClBtb,KAAKC,MAAMod,wBAGN,cAAVlgB,EAAEsP,MACDtP,EAAE4X,iBACC5X,EAAE+D,OAAOoc,mBACRngB,EAAE+D,OAAOoc,mBAAmBF,QACtBpd,KAAKC,MAAMqb,WACjBtb,KAAKC,MAAMod,yBAGtB,KAEDE,0BAA4B,CAACpgB,EAAGqU,KAC5BxR,KAAKC,MAAMud,sBAAsBrgB,EAAGqU,IACvC,KAEDiM,0BAA4B,CAACtgB,EAAGqU,KAC5BxR,KAAKC,MAAMyd,sBAAsBvgB,EAAGqU,IACvC,KAEDmM,yBAA4BvY,IACxBpF,KAAKC,MAAM2d,qBAAqBxY,IACnC,KAEDyY,iBAAmB,KAEf7d,KAAKC,MAAM6d,2BAtCX9d,KAAKsG,MAAQ,CACTyX,aAAa,GAwCrBre,SAEI,MAAM,SAAC0R,EAAQ,aAAE4M,GAAgBhe,KAAKC,MAChCvB,EAAmBR,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,MAGxG8f,EAAwBje,KAAKC,MAAMmX,cACP,MAA3B4G,EAAaE,OAAO,GAAaF,EAAaG,UAAU,GAAGC,OAAO7e,cAAgB,GACnFye,EAAaI,OAAO7e,cAG1B,IAAI8e,EAA6Bre,KAAKC,MAAMqe,mBACvC1K,OAAOjM,GAAcA,EAAWmV,SAC5Bvd,cACAlB,SAAS4f,IAElBI,EAA6BA,EAA2BE,MAAM,EAAG,GAEjE,MAAMlD,EAAS4C,EAAsBxW,OAAS,GAAK4W,EAA2B5W,OAAS,EAEjFwQ,EAAejY,KAAKC,MAAMqb,UAC5B,CACIpD,SAAU,MACVC,WAAY,QAGhB,CACID,SAAU,SACVC,WAAY,QAGdC,EAAkBpY,KAAKC,MAAMqb,UAC/B,CACIpD,SAAU,SACVC,WAAY,QAGhB,CACID,SAAU,MACVC,WAAY,QAGpB,OACIxY,IAAAC,cAACmY,KAAO,CACJ1W,MAAO,CAAC8J,SAAU,OAClBpO,GAAI,eACJqU,SAAUA,EACVxI,KAAMyS,EACNjD,gBAAiBA,EACjBH,aAAcA,EACdK,qBAAmB,EACnBkG,kBAAkB,EAClBC,qBAAqB,EACrB7b,QAAS,CACL8b,MAAO1e,KAAKC,MAAMqb,UAAW,wBAA0B,0BAI3D3b,IAAAC,cAAC+e,KAAiB,CAACC,YAAa5e,KAAK6d,kBACjCle,IAAAC,cAAA,OAAKyB,MAAO,CAACsD,gBAAiB,SAAUoL,IAAK/P,KAAKC,MAAM4e,SAAUnH,UAAYva,GAAM6C,KAAKkd,eAAe/f,IACnGkhB,EAA2BzhB,IAAI+K,IAC5B,MAAMmX,EAAQ,IAAIC,OAAO,GAAGd,EAAyB,MAC/ClC,EAAiBpU,EAAWmV,SAASxd,QAAQwf,EAAM,aAEzD,OAAG9e,KAAKC,MAAMmX,cAENzX,IAAAC,cAACgc,GAAyB,CACtBnP,IAAK9E,EAAW5K,GAChB+e,aAAc9b,KAAKud,0BACnBxB,eAAgBA,EAChBpU,WAAYA,EACZjJ,iBAAkBA,EAClBmd,aAAc7b,KAAKyd,4BAKvB9d,IAAAC,cAAC8c,GAAwB,CACrBjQ,IAAK9E,EAAW5K,GAChB4f,iBAAkB3c,KAAK2d,yBACvB5B,eAAgBA,EAChBpU,WAAYA,UAarChI,WAAMqf,WAAW,CAAC/e,EAAO8P,IAAQpQ,IAAAC,cAACqd,GAAY1f,OAAA0hB,OAAA,CAACJ,SAAU9O,GAAS9P,K,oFC7HjF,MAAMif,WAAkBzf,YAEpBsG,YAAY9F,GAAQ,IAADkf,EACfnZ,MAAM/F,GAAMkf,EAAAnf,KAAC,KAwBjBof,4BAA+BC,IAC3Brf,KAAKC,MAAMmf,4BAA4BC,IAC1C,KAEDpJ,qBAAuB,SAAC7Q,GAA2C,IAAlCka,EAAoBC,UAAA9X,OAAA,QAAA+X,IAAAD,UAAA,IAAAA,UAAA,GACjDJ,EAAKlf,MAAMwf,kBACXN,EAAK/Y,SAAS,CAAChB,QAASA,GAAU,KAC9B,GAAG+Z,EAAKlf,MAAMmX,eACV,GAAyB,MAAtBhS,EAAQ8Y,OAAO,IAAc9Y,EAAQqC,QAAU,EAAG,CACjD,MAAMwW,EAAwB7Y,EAAQ+Y,UAAU,GAAGC,OAAO7e,cAC1D4f,EAAKO,qCAAqCzB,SAE3C,GAAGkB,EAAKlf,MAAMuB,WAAWme,oBACzBva,EAAQqC,QAAU,IAA8B,IAAzB6X,EAAgC,CACtD,MAAMrB,EAAwB7Y,EAAQgZ,OAAO7e,cAC7C4f,EAAKO,qCAAqCzB,OAIxD,KAEF2B,yBAA2B,KAEpB5f,KAAK6f,SAASC,YAAc9f,KAAK6f,SAASC,WAAWA,YACpD9f,KAAK6f,SAASC,WAAWA,WAAW1C,SAE3C,KAEG3C,qBAAuB,KACvBza,KAAKoG,SAAS,CAAChB,QAAS,KACxBpF,KAAKC,MAAMmV,6BACXpV,KAAKC,MAAM8f,oBACX,MAAMnK,EAAUrM,SAASsM,cAAc,4CAGnCD,IACAA,EAAQvU,MAAM8C,QAAU,UAI/B,KAEDsZ,0BAA6BjM,IACzBxR,KAAKC,MAAM+f,sBAAsBxO,GAC5B/I,KAAMzJ,IACH,GAAa,MAAVA,GAA6C,MAA3BA,EAAOmQ,iBAAyB,CAClD,IAAI8Q,EAAqB,GACzBjhB,EAAOmQ,iBAAiB/H,QAAQ,CAACT,EAAcuZ,KACX,MAA5BvZ,EAAaO,aACZP,EAAaO,YAAYE,QAAQ,CAAChC,EAAS+a,KAMvC,GAJiB,IAAZD,GAA4B,IAAXC,GACbD,IAAalhB,EAAOmQ,iBAAiB1H,OAAO,GAAK0Y,IAAWxZ,EAAaO,cAC9E+Y,GAAsB,KAEJ,MAAnB7a,EAAQlF,QAAiB,CACxB,MAAMkgB,EvBnFnC,SAAkCC,GACrC,IAAID,EAAiBC,EAAO/gB,QAAQ,gBAAiB,IACrD,MACMghB,EAAY,CACd,KAAQ,GACR,IAAQ,IACR,KAAQ,IACR,GAAQ,IACR,GAAQ,KAKZ,OAHAF,EAAiBA,EAAe9gB,QARd,2BAQiC,CAACihB,EAAOC,IAChDF,EAAUE,IAEdJ,EuBsEgDK,CAAyBrb,EAAQlF,SACxD+f,GAAsBG,OACD,MAAfhb,EAAQ9E,MACd2f,GAAsB7a,EAAQ9E,SAK9CN,KAAKoG,SAAS,CAAChB,QAAS6a,IACxBjgB,KAAKC,MAAM6d,0BACX9d,KAAK4f,8BAEV9W,MAAO3L,IACNqN,QAAQiI,IAAItV,MAEvB,KAEDogB,0BAA6B/L,IACFxR,KAAKC,MAAMygB,oBAAoBlP,KAElDxR,KAAKoG,SAAS,CAAChB,QAAS,KACxBpF,KAAKC,MAAM6d,0BACX9d,KAAK4f,6BAEZ,KAEDe,kBAAoB,WAAkC,IAAjCC,EAAmBrB,UAAA9X,OAAA,QAAA+X,IAAAD,UAAA,IAAAA,UAAA,GAMpC,GAJwC,OAArCJ,EAAKlf,MAAMuB,WAAWyD,YAAuBka,EAAKlf,MAAMuB,WAAWyD,aAAeC,EAAeJ,SAChGqa,EAAKlf,MAAM4gB,2BAGgD,KAA3D1B,EAAK7Y,MAAMlB,QAAQ9F,QAAQ,gBAAiB,IAAI8e,OAAe,CAC/De,EAAKlf,MAAM+V,mBAAkB,GAC7B,IAAI8K,EAAiB3B,EAAKlf,MAAMyM,YAAYyS,EAAK7Y,MAAMlB,QAAS+Z,EAAK7Y,MAAMlB,SAIjD,GAAvBwb,IAECzB,EAAKlf,MAAM6d,0BACXqB,EAAKS,4BAGJkB,IAEG3B,EAAKlf,MAAMuB,WAAWyD,aAAeC,EAAeJ,SACnDqa,EAAKlf,MAAMuB,WAAWyD,aAAeC,EAAeH,WAAaoa,EAAKlf,MAAMuB,WAAWoJ,aAG5FuU,EAAKlJ,qBAAqB,GAAI2K,KAGxC,KAEFjD,yBAA4BvY,IACHpF,KAAKC,MAAMyM,YAAYtH,EAASA,MAE5CpF,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeJ,SACpD9E,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,WAAa/E,KAAKC,MAAMuB,WAAWoJ,cAExFxF,EAAS,IAGbpF,KAAKiW,qBAAqB7Q,GAAS,GACnCpF,KAAKC,MAAM6d,0BACX9d,KAAK4f,6BAEZ,KAEDmB,uBAAyB,KAClB/gB,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeJ,SAAW9E,KAAKghB,iBAAmBhhB,KAAKghB,gBAAgBC,WAC3GjhB,KAAKghB,gBAAgBC,UAAU7D,SAEtC,KAED8D,yBAA2B,KACpBlhB,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,WAAa/E,KAAKghB,iBAAmBhhB,KAAKghB,gBAAgBlB,YAC7G9f,KAAKghB,gBAAgBlB,WAAW1C,SA7JpCpd,KAAK6f,SAAW,KAChB7f,KAAKghB,gBAAkBxK,sBACvBxW,KAAK0f,qCvB3BN,SAAkByB,EAAUC,GAC/B,IAAIC,EAAU,KACVC,GAAc,EAElB,OAAO,WAEH,MAAMC,EAAOA,KACTJ,EAASK,MAAMxhB,KAAMuf,WACrB8B,EAAU,MAGXC,IACCA,GAAc,EACdC,KAGJE,aAAaJ,GACbA,EAAUlY,WAAWoY,EAAMH,IuBUiBM,CAAUrC,GAAerf,KAAKof,4BAA4BC,GAAa,KACnHrf,KAAKsG,MAAQ,CACTlB,QAAS,IAIjBuK,mBAAmBC,GAEf,GAAIA,EAAUxK,UAAYpF,KAAKC,MAAMmF,QAAS,CAC1CpF,KAAKoG,SAAS,CAAEhB,QAASpF,KAAKC,MAAMmF,UACpCpF,KAAKC,MAAMyM,YAAY1M,KAAKC,MAAMmF,QAASpF,KAAKC,MAAMmF,SACtD,IAAIA,EAAUpF,KAAKC,MAAMmF,QAEpBpF,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,WAAa/E,KAAKC,MAAMuB,WAAWoJ,aACxFxF,EAAU,IAGdpF,KAAKoG,SAAS,CAAChB,QAASA,KA8IhC1F,SACI,MAAMhB,EAAmBR,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,MACxGwjB,EAAkB,CACpBC,IAAKjiB,IAAAC,cAACiiB,KAAY,CAACxgB,MAAO,CAAEC,MAAO,UAAWgD,SAAU,UACxDwd,KAAMniB,IAAAC,cAACmiB,KAAW,CAAC1gB,MAAO,CAAEC,MAAO,UAAWgD,SAAU,UACxD0d,IAAKriB,IAAAC,cAACqiB,KAAK,CAAC5gB,MAAO,CAAEC,MAAO,UAAWgD,SAAU,UACjD4d,IAAKviB,IAAAC,cAACqiB,KAAK,CAAC5gB,MAAO,CAAEC,MAAO,UAAWgD,SAAU,UACjD6d,IAAKxiB,IAAAC,cAACwiB,KAAU,CAAC/gB,MAAO,CAAEC,MAAO,UAAWgD,SAAU,UACtD+d,QAAS1iB,IAAAC,cAACmiB,KAAW,CAAC1gB,MAAO,CAAEC,MAAO,UAAWgD,SAAU,WAE/D,OACI3E,IAAAC,cAAA,OAAK7C,GAAI,uBAAwB0H,QAASzE,KAAKyE,SAEvCzE,KAAKC,MAAMqiB,YAActiB,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,WAAcpF,IAAAC,cAAA,OAAK7C,GAAI,kBAAmB+C,wBAAyB,CAACC,OAAQC,KAAKC,MAAMqiB,cAGvKtiB,KAAKC,MAAM4P,kBAAoB7P,KAAKC,MAAM4P,iBAAiBpI,OAAS,GACjE9H,IAAAC,cAAA,OACIyB,MAAO,CACH8C,QAAS,OACTiY,SAAU,OACVmG,IAAK,OACL5d,gBAAiB,UACjB6d,aAAc,iBACdC,QAAS,SAGXziB,KAAKC,MAAMwL,YAAczL,KAAKC,MAAM4P,iBAAiBjT,IAAI,CAACoB,EAAMkL,KAC9D,MAAMwZ,EAAgB1kB,EAAK2kB,MAAM,KAAKC,MAAMC,cACtCC,EAAWnB,EAAgBe,IAAkBf,EAAgBU,QAEnE,OACI1iB,IAAAC,cAAA,OACI6M,IAAKvD,EACL7H,MAAO,CACH8C,QAAS,OACTE,WAAY,SACZoe,QAAS,WACT7W,OAAQ,iBACRmX,aAAc,MACdpe,gBAAiB,OACjBqe,UAAW,+BACXlY,SAAU,QACVqR,SAAU,SACVS,WAAY,WAGhBjd,IAAAC,cAAA,OACIyB,MAAO,CACHohB,QAAS,MACTQ,YAAa,MACb9e,QAAS,OACTE,WAAY,WAGfye,GAILnjB,IAAAC,cAAA,OACIyB,MAAO,CACH6hB,KAAM,IACN/G,SAAU,SACVgH,aAAc,WACd7e,SAAU,OACVH,QAAS,OACTE,WAAY,UAEhBvC,MAAO9D,GAENA,GAKL2B,IAAAC,cAAA,OACI6E,QAASA,IAAMzE,KAAKC,MAAMmjB,yBAAyBplB,GACnDqD,MAAO,CACHgiB,WAAY,OACZ/hB,MAAO,UACPkT,OAAQ,UACRlQ,SAAU,OACVH,QAAS,OACTE,WAAY,WAEnB,eAWnBrE,KAAKC,MAAMmX,eAAiBpX,KAAKC,MAAMuB,WAAWme,qBAAuB3f,KAAK6f,UAAY7f,KAAKC,MAAMyK,UACnG/K,IAAAC,cAACqd,GAAY,CACT7F,cAAepX,KAAKC,MAAMmX,cAC1BrH,IAAMgB,GAAO/Q,KAAKghB,gBAAkBjQ,EACpCK,SAAUpR,KAAK6f,SACf7B,aAAche,KAAKsG,MAAMlB,QACzBkZ,mBAAoBte,KAAKC,MAAMqe,mBAC/BR,wBAAyB9d,KAAKC,MAAM6d,wBACpCJ,sBAAuB1d,KAAKyd,0BAC5BD,sBAAuBxd,KAAKud,0BAC5BK,qBAAsB5d,KAAK2d,yBAC3BjT,SAAU1K,KAAKC,MAAMyK,SACrB2S,qBAAsBA,IAAMrd,KAAK4f,2BACjCtE,UAAYtb,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeoe,SAC3DtjB,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,YAAqD,IAAxC/E,KAAKC,MAAMuB,WAAW+hB,gBAGpG5jB,IAAAC,cAAA,OAAK7C,GAAI,4BAA6BsE,OAA4C,IAArCrB,KAAKC,MAAMujB,sBAAkC,CAACrf,QAAS,QAAU,MACzGrF,EAAaJ,GAAkB,gCAAgCiB,IAAAC,cAAA,WAC/Dd,EAAaJ,GAAkB,2BAEpCiB,IAAAC,cAAA,OAAK7C,GAAIiD,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,UAAY,kCAAoC,4BAA6BgL,IAAMC,GAAQhQ,KAAK6f,SAAW7P,EAAK3O,MAAO,CAAC8C,QAASnE,KAAKC,MAAMujB,sBAAwB,OAAS,KACvO7jB,IAAAC,cAAC6U,GAAc,CACX/J,SAAU1K,KAAKC,MAAMyK,SACrBlJ,WAAYxB,KAAKC,MAAMuB,WACvB4V,cAAepX,KAAKC,MAAMmX,cAC1BqM,gBAAiBzjB,KAAKC,MAAMwjB,gBAC5B/W,YAAc4S,GAAyBtf,KAAK2gB,kBAAkBrB,GAC9D9E,YAAaxa,KAAKC,MAAMua,YACxBD,gBAAmBva,KAAKC,MAAMsa,gBAC9BvE,kBAAmBhW,KAAKC,MAAM+V,kBAC9BC,qBAAsBA,CAAC/B,EAAOoL,IAAyBtf,KAAKiW,qBAAqB/B,EAAOoL,GACxFla,QAASpF,KAAKsG,MAAMlB,QACpBse,mBAAoB1jB,KAAK+gB,uBACzB4C,qBAAsB3jB,KAAKkhB,yBAC3B7J,cAAgBrX,KAAKC,MAAMoX,cAC3BE,aAAevX,KAAKC,MAAMsX,aAC1BkD,qBAAwBza,KAAKya,qBAC7BsF,kBAAmB/f,KAAKC,MAAM8f,kBAC9B3K,2BAA4BpV,KAAKC,MAAMmV,2BACvC+B,iBAAkBnX,KAAKC,MAAMkX,iBAC7B7B,0BAA4BsO,GAAS5jB,KAAKC,MAAMqV,0BAA0BsO,GAC1EzU,iBAAmBnP,KAAKC,MAAMkP,mBAG/BnP,KAAKsG,MAAMlB,QA8BK,KA7BdzF,IAAAC,cAACiN,WAAQ,KACJ7M,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMiM,kBAAoBI,KAAiCtM,KAAKC,MAAMuB,WAAWqiB,cAAgB7jB,KAAKC,MAAMmX,eACvIzX,IAAAC,cAACoR,GAAc,CACftE,YAAa1M,KAAKC,MAAMyM,YACxBlL,WAAYxB,KAAKC,MAAMuB,WACvBkJ,SAAU1K,KAAKC,MAAMyK,SACrBoZ,mBAAoB9jB,KAAKC,MAAM6jB,mBAC/B7R,wBAAyBjS,KAAKC,MAAMgS,wBACpCqB,uBAAyBnB,GAASnS,KAAKC,MAAMqT,uBAAuBnB,GACpE4R,yBAA0BA,IAAM/jB,KAAKC,MAAM8jB,2BAC3CpQ,uBAAwB3T,KAAKC,MAAM0T,uBACnCG,8BAA+B9T,KAAKC,MAAM6T,8BAC1CP,sBAAwByQ,GAAShkB,KAAKC,MAAMsT,sBAAsByQ,GAClEC,kBAAmBjkB,KAAKC,MAAMgkB,kBAC9BjS,aAAchS,KAAKC,MAAM+R,aACzBmF,iBAAkBnX,KAAKC,MAAMkX,mBAExB,KAGTnX,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMyK,UAAY1K,KAAKC,MAAMuB,WAAW0iB,iBAAmBlkB,KAAKC,MAAMuB,WAAWyZ,iBAAiBrH,OAAOuQ,GAAOA,EAAIC,aAAepkB,KAAKC,MAAMyK,SAAS3N,IAAI0K,OAAS,EAC9L9H,IAAAC,cAACkb,GAAa,CACVtZ,WAAYxB,KAAKC,MAAMuB,WACvBkJ,SAAU1K,KAAKC,MAAMyK,SACrB3C,WAAY/H,KAAKC,MAAM8H,WACvBuT,UAAYtb,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeoe,SAC3DtjB,KAAKC,MAAMuB,WAAWyD,aAAeC,EAAeH,YAAqD,IAAxC/E,KAAKC,MAAMuB,WAAW+hB,cAC5FnS,SAAUpR,KAAK6f,WACd,SAYtBX,U,UClWf,MAAMmF,WAAiB5kB,YACnBsG,YAAY9F,GACR+F,MAAM/F,GAAO,KAOjB8H,WAAcwJ,IACVvR,KAAKC,MAAM8H,WAAWwJ,EAAaC,SAAUvJ,GACzCsJ,EAAaE,YAAa,KAAM,KAAMF,EAAaxU,IAEvDiD,KAAKC,MAAMqkB,sBATXtkB,KAAKsG,MAAQ,CACT2U,iBAAkB,IAW1Bvb,SAEI,IAAIub,EAAmB,GACvB,MAAMvc,EAAmBR,EAA4B8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,MAY9G,OAVI6B,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMyK,WACpCuQ,EAAmBjb,KAAKC,MAAMuB,WAAWyZ,iBAAiBrH,OAAQrC,GACvDA,EAAapT,eAAiB6B,KAAKC,MAAMyK,SAASvM,eAI7D8c,EAAiBxT,OAAS,GAC1BwT,EAAiBC,KAAK,CAACC,EAAGC,IAAMD,EAAEjS,MAAQkS,EAAElS,OAI5CvJ,IAAAC,cAAA,OAAK7C,GAAI,sBACJsE,MAAO,CAACkjB,cAAevkB,KAAKC,MAAMukB,aAAe,MAAQ,SAE1D7kB,IAAAC,cAAC4P,IAAK,CAACC,UAAW,OAAQ4R,QAAS,IAAK3R,GAAI1P,KAAKC,MAAMukB,cACnD7kB,IAAAC,cAAA,OAAK7C,GAAI,4BACJsE,MAAO,CAACsD,gBAAiB3E,KAAKC,MAAM0E,gBAAkB3E,KAAKC,MAAM0E,gBAAkB,QAC/ErD,MAAOtB,KAAKC,MAAMqB,MAAQtB,KAAKC,MAAMqB,MAAQ,UAElD3B,IAAAC,cAAA,OAAK7C,GAAI,+BAEL4C,IAAAC,cAAA,OAAKyB,MAAO,CAACmB,OAAQ,MAAO6B,WAAY,YAAaxE,UAAW,yBAE3Dob,GAAoBA,EAAiBxT,OAAS,EAC3C9H,IAAAC,cAAA,OAAK7C,GAAI,4BACJke,EAAiBre,IAAI,CAAC2U,EAAcrI,IACjCvJ,IAAAC,cAAC+b,KAAQ,CAAClX,QAASA,KAAOzE,KAAK+H,WAAWwJ,IAAoB9E,IAAKvD,EACzD7H,MAAO,CACHmK,KAAMxL,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAWgK,KAAOxL,KAAKC,MAAMuB,WAAWgK,KAAO,KACzFlK,MAAOtB,KAAKC,MAAMqB,MAAQtB,KAAKC,MAAMqB,MAAQ,UAEtDiQ,EAAaE,eAGjB,MAIhBzR,KAAKC,MAAMwkB,SACR9kB,IAAAC,cAAA,OAAKyB,MAAO,CAACmB,OAAQ,OAAS3C,UAAW,yBACrCF,IAAAC,cAAC8kB,KAAI,CAACxjB,OAAQ,SAAUD,KAAMjB,KAAKC,MAAMwkB,SAAUpjB,MAAOrB,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAWgK,KACrG,CAACA,KAAMxL,KAAKC,MAAMuB,WAAWgK,KAAMlK,MAAOtB,KAAKC,MAAMqB,OAAU,MAC9DtB,KAAKC,MAAMyK,SACR5L,EAAaJ,GAAkB,kCAAoC,GAEvEiB,IAAAC,cAACmC,IAAQ,CAAClC,UAAW,qBAEpB,KAEbF,IAAAC,cAAA,OAAKyB,MAAO,CAACmB,OAAQ,OAAS3C,UAAW,yBACrCF,IAAAC,cAACiE,IAAM,CAACY,QAASzE,KAAKC,MAAMqkB,mBACpB7gB,QAAQ,YACRpC,MAAO,CACHC,MAAOtB,KAAKC,MAAMqB,MAAQtB,KAAKC,MAAMqB,MAAQ,QAC7CqD,gBAAiB,gBAGxB3E,KAAKC,MAAMyK,SACR5L,EAAaJ,GAAkB,6BAA+B,KAK1EiB,IAAAC,cAAA,OAAKyB,MAAO,CAACmB,OAAQ,OAAS3C,UAAW,yBACnCG,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAWmjB,eAC7ChlB,IAAAC,cAAA,KAAG7C,GAAI,qCAAsCmE,OAAO,SACjDD,KAAK,uBAChBtB,IAAAC,cAAA,QAAMyB,MAAOrB,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMuB,WAAWgK,KACxD,CAACA,KAAMxL,KAAKC,MAAMuB,WAAWgK,KAAMlK,MAAOtB,KAAKC,MAAMqB,OAAS,MAAM,0BAK5D3B,IAAAC,cAAA,OAAK7C,GAAI,2BAA4BoG,IAAKoF,EAAelF,IAAK,yBAcvFghB,U,+CCnHf,MAAMO,WAAyBnlB,YAAUsG,cAAA,SAAAwZ,WAAA,KAErCsF,iBAAoBC,KAGQ,IAFF9kB,KAAKC,MAAM4kB,iBAAiBC,IAG9C9kB,KAAK+kB,KAAKC,aAAaC,eAAejlB,KAAKC,MAAMyK,SAASoa,cAIlEplB,SACI,OACIC,IAAAC,cAAA,OAAK7C,GAAI,+BACJiD,KAAKC,MAAMyK,UAAY1K,KAAKC,MAAMilB,cAAgBllB,KAAKC,MAAMilB,aAAazd,OAAS,EACpF9H,IAAAC,cAACulB,KAAgB,CAACC,UAAWplB,KAAKC,MAAMilB,aAAatoB,IAAIyoB,GAAQA,EAAKP,aAClEQ,eAAgBtlB,KAAKC,MAAMyK,SAASoa,YACpCS,mBAAmB,EACnBC,iBAAiB,EACjBC,aAAc,GACd9M,SAAU3Y,KAAK6kB,iBACf9U,IAAK,iBAAoB,OAO9B6U,U,oFC6BAc,OAjDCzlB,GAERN,IAAAC,cAAA,OAAK7C,GAAI,eAAgBsE,MAAO,CAACsD,gBAAiB1E,EAAM0E,kBAAwB1E,EAAM0lB,UAAY/N,aAAa3X,EAAM0E,gBAAkB,cAAerD,MAAOrB,EAAMqB,MAAQrB,EAAMqB,MAAQ,UACjK,MAAlBrB,EAAMgF,YAAoBhF,EAAMgF,aAAeC,EAAeH,YAAe9E,EAAM2lB,OAgBxE,KAdTjmB,IAAAC,cAAA,OAAK7C,GAAI,eAAgBsE,MAAO,CAAG8C,QAA8B,GAApBlE,EAAM0lB,SAAqB,OAAO,OAC3EhmB,IAAAC,cAAA,OAAK7C,GAAI,uBACL4C,IAAAC,cAAA,OAAKuD,IAAKlD,EAAM2lB,OACXviB,IAAI,YACb1D,IAAAC,cAAA,OAAK7C,GAAI,qBACL4C,IAAAC,cAAA,OAAK7C,GAAI,oBAAqBsE,MAAO,CACjCmK,KAAMvL,EAAMuL,KACZkP,WAAY,SACZza,EAAMkS,MACVxS,IAAAC,cAAA,OAAK7C,GAAI,2BAA4BsE,MAAO,CACxCmK,KAAMvL,EAAMuL,OACZvL,EAAM4lB,qBActBlmB,IAAAC,cAACglB,GAAgB,CAACla,SAAUzK,EAAMyK,SAChBwa,aAAcjlB,EAAMilB,aACpBL,iBAAkB5kB,EAAM4kB,mBAC7B,GAAZjN,aAAqB3X,EAAM6lB,gBAAkBnmB,IAAAC,cAACiE,IAAM,CAAC9G,GAAI,sBAAuBsX,SAAS,IAAIvS,MAAOhD,EAAaZ,EAA4B+B,EAAMyK,SAAWzK,EAAMyK,SAASvM,aAAe,OAAO,qBAAsBsG,QAASA,IAAMxE,EAAM8lB,qBACrO9lB,EAAM+lB,YACJrmB,IAAAC,cAACqmB,KAAY,MACZtmB,IAAAC,cAACsmB,KAAQ,OAGtBvmB,IAAAC,cAACiE,IAAM,CAAC/B,MAAOhD,EAAaZ,EAA4B+B,EAAMyK,SAAWzK,EAAMyK,SAASvM,aAAe,OAAO,qBAAsBkW,SAAS,IAAItX,GAAI,0BAA2B0H,QAASA,IAAMxE,EAAMqkB,sBAC7L3kB,IAAAC,cAACumB,KAAQ,OAEjBxmB,IAAAC,cAACiE,IAAM,CAAC/B,MAAOhD,EAAaZ,EAA4B+B,EAAMyK,SAAWzK,EAAMyK,SAASvM,aAAe,OAAO,sBAAuBkW,SAAS,IAAItX,GAAI,uBAAwB0H,QAASA,IAAOxE,EAAMmmB,gBAC5LzmB,IAAAC,cAACymB,KAAS,Q,wCC9B9B,MAAMC,WAA2B7mB,YAC7BsG,YAAY9F,GACR+F,MAAM/F,GAYV,KAGAoN,yBAA4B1L,IAChB,CACJuF,YAAa,CACT,CACI5B,YAAagI,EAAgB3P,KAC7BuC,QAAS,mFAKjBgJ,MAAO,EACPvH,OAAQA,EACR8J,YAAY,IAIpB,KAGA8a,YAAc,KACNvmB,KAAKwN,aACLxN,KAAK2N,4BAA4BC,SAAS,CAAEvB,IAAKrM,KAAK2N,4BAA4BE,aAAcH,SAAU,YAEhH,KAEFsH,mBAAsB7X,IAKlB6C,KAAKwmB,yBAAwB,IAChC,KAID1Y,0BAA2B,KAEvB,MAAMC,EAAKpF,OAAOqF,UAAUC,UACtBC,EAAOH,EAAGI,QAAQ,SAAW,GAAKJ,EAAGI,QAAQ,YAAc,EAEjE,OAAKnO,KAAKoO,oBAIHF,EAAOlO,KAAKoO,oBAAoBP,aAAe7N,KAAKoO,oBAAoBC,aAHpE,MAMf,KAGAC,+BAAkCC,IAC1BA,GAAavO,KAAKsG,MAAMkI,iBAExBxO,KAAKoG,SAAS,CAACqI,2BAA4B,EAAGC,mBAAmB,GAAO,KACpE1O,KAAKC,MAAM0O,0BAGrB,KAmBFC,kBAAoB,KAEhB,MAAMC,EAAO7O,KAEb8O,YAAY,KACR,GAAgC,MAA5BD,EAAKT,oBACL,OAGJ,MAAMW,EAAyB/O,KAAK8N,4BAEhCiB,GAA0BA,IAA2BF,EAAKvI,MAAMmI,8BAE7B,IAA/BI,EAAKvI,MAAMkI,iBACXrF,WAAW,KACPnJ,KAAKoG,SAAS,CAACoI,iBAAiB,KACjC,KAGHxO,KAAKC,MAAM+O,UACXH,EAAK0X,cAEEvmB,KAAKsG,MAAMoI,oBAClBG,EAAKlB,4BAA4BsB,UAAYF,EAAyBF,EAAKvI,MAAMmI,4BAGrFI,EAAKzI,SAAS,CAACqI,2BAA4BM,EAAwBL,mBAAmB,MAE3F,KAEHvF,WAAW,KACPnJ,KAAKoG,SAAS,CAACoI,iBAAiB,KACjC,KAECxO,KAAKC,MAAMuB,WAAWoJ,YACtBzB,WAAW,IAAMnJ,KAAKumB,cAAe,MAG3C,KAGFC,wBAA2BC,IACvB,GAAGA,EACC,GAAIzmB,KAAKC,MAAMuB,YAAcxB,KAAKC,MAAMyK,SAAU,CACrBxM,EACrB8B,KAAKC,MAAMyK,SAAW1K,KAAKC,MAAMyK,SAASvM,aAAe,MAD7D,MAIM8c,EAAmBjb,KAAKC,MAAMuB,WAAWyZ,iBAAiBrH,OAAQrC,GAC7DA,EAAapT,eAAiB6B,KAAKC,MAAMyK,SAASvM,cAG7D6B,KAAKoG,SAAS,CAAE6U,oBAAoB,KAEhC9R,WAAW,KACPnJ,KAAKC,MAAMymB,oBAAoBzL,EAAiBxT,SACjD,UAGPzH,KAAKoG,SAAS,CAAE6U,iBAAkB,UAItCjb,KAAKoG,SAAS,CAAE6U,iBAAkB,MAExC,KAGF0L,oBAAsBC,gBACZ5mB,KAAKC,MAAM4mB,gBAAgBC,GAEjC9mB,KAAKoG,SAAS,CAAE6U,iBAAkB,MACpC,KAGF8L,mBAAqB,KACjB/mB,KAAKoG,SAAS,CAAE6U,iBAAkB,MAGtC,KAKA/L,uBAAyB,KACrB,IAAKlP,KAAKC,MAAMkP,iBACZ,MAAO,GAGX,IAAIhI,EAAU,GACVS,EAAM,GAuBV,OAtBA5H,KAAKC,MAAMkP,iBAAiB/H,QAAQ,CAACT,EAAcuC,EAAOkG,KACjDzI,EAAaU,QACdO,EAAIN,KAAKX,IAWA,KARCuC,EAAQ,GAAKkG,EAAM3H,OAAS,GACP,MAA/Bd,EAAaiG,gBAA6D,MAAnCwC,EAAMlG,EAAQ,GAAG0D,gBACvDjG,EAAaiG,iBAAmBwC,EAAMlG,EAAQ,GAAG0D,iBACrB,MAA3BjG,EAAagB,YAAqD,MAA/ByH,EAAMlG,EAAQ,GAAGvB,YACjDhB,EAAayE,gBAAkBC,IAC5B1E,EAAayE,gBAAkBC,IAC/B1E,EAAayE,gBAAkBgE,EAAMlG,EAAQ,GAAGkC,kBAGpDxD,EAAIH,OAAS,GACbN,EAAQG,KAAKM,GAGjBA,EAAM,MAIPT,GACT,KAEFkI,sBAAyBC,GAejBA,EAAgB1S,IAAI,CAAC+J,EAAcuC,IAC/BvC,EAAaU,QACRV,EAAaO,YAAYqI,MAAOnK,IAAgC,IAAnBA,EAAQiC,QADpC,KAEV1H,IAAAC,cAAC4P,IAAK,CAACC,UAAW9I,EAAahF,OAAS,OAAS,QAAS+N,IAAI,EAAMjD,IAAKvD,GACrEvJ,IAAAC,cAACoH,GAAY,CACTwB,MAAOxI,KAAKC,MAAMuI,MAClBmC,YAAY,EACZhE,aAAcA,EACdnF,WAAYxB,KAAKC,MAAMuB,WACvBkL,YAAa1M,KAAKC,MAAMyM,YACxB3E,WAAY/H,KAAKC,MAAM8H,WACvBnB,yBAA0B5G,KAAKC,MAAM2G,yBACrCF,cAAe1G,KAAKC,MAAMyG,cAC1BgE,SAAU1K,KAAKC,MAAMyK,SACrBK,sBAAuB/K,KAAKC,MAAM8K,sBAClC9F,WAAYC,EAAeH,UAC3B4H,QAAS2C,EAAgB3C,SAAW2C,EAAgB7H,OAAS,IAAMyB,MAMjG,KAIF6W,kBAAoB,OAtPhB/f,KAAKsG,MAAQ,CACTmI,2BAA4B,EAC5BC,mBAAmB,EACnBF,iBAAiB,EACjByM,iBAAkB,GAClB+L,kBAAmB,GAEvBhnB,KAAKsO,+BAAiCtO,KAAKsO,+BAA+B2Y,KAAKjnB,MAsEnF2P,mBAAmBC,GAEXA,EAAUpO,aAAexB,KAAKC,MAAMuB,aAAcoO,EAAUlF,SAAa1K,KAAKC,MAAMyK,WAKnFkF,EAAUpO,WAAWoJ,YAAc5K,KAAKC,MAAMuB,WAAWoJ,YAC1D5K,KAAKumB,cAqKb7mB,SAEI,IAAKM,KAAKC,MAAMinB,uBAEZ,OAAO,KAEX,MAAM,WAAE1lB,EAAU,YAAE2lB,GAAgBnnB,KAAKC,MACZ,OAAVuB,QAAU,IAAVA,KAAYoJ,WAC/B,IAAIqQ,EAAmBjb,KAAKsG,MAAM2U,iBAEdA,EAAiBsD,MAAM,EAAG,GAAG3hB,IAAI,CAACkqB,EAAU5d,IAC5DvJ,IAAAC,cAAA,UACI6M,IAAKvD,EACLzE,QAASA,IAAMzE,KAAK2mB,oBAAoBG,GACxCzlB,MAAO,CACH+lB,OAAQ,MACR3E,QAAS,OACTM,aAAc,MACdnX,OAAQ,iBACRyb,WAAY,UACZ7S,OAAQ,YAGXsS,EAASrV,aAAe,cAAavI,EAAQ,KAbtD,MAiBMoe,EACF3nB,IAAAC,cAAA,OAAKyB,MAAO,CACR8C,QAAS,OACTojB,cAAe,SACfhF,IAAK,OACLiF,aAAc,OACd/E,QAAS,MACT4E,WAAY,cACZ9kB,MAAO,OACPC,OAAQ,SAER7C,IAAAC,cAAC6nB,KAAI,CAAC/jB,UAAU,MAAMrC,MAAO,CACzBkB,MAAO,OACPwgB,aAAc,QAEb9H,EAAiBre,IAAI,CAACkqB,EAAU5d,IAC7BvJ,IAAAC,cAACoc,KAAQ,CACLvP,IAAKvD,EACLwe,QAAM,EACNjjB,QAASA,IAAMzE,KAAK2mB,oBAAoBG,GACxCzlB,MAAO,CACHohB,QAAS,OACTD,aAAc,iBACdhgB,OAAQ,QAIZmlB,YAAcnS,GAAUA,EAAMoS,cAAcvmB,MAAMgmB,WAAa,UAC/DQ,WAAarS,GAAUA,EAAMoS,cAAcvmB,MAAMgmB,WAAa,eAE9D1nB,IAAAC,cAACqc,KAAY,CACTC,QAAS4K,EAASrV,aAAe,cAAavI,EAAQ,GACtD4e,uBAAwB,CACpBzmB,MAAO,CACHC,MAAOtB,KAAKC,MAAMuB,WAAWE,oBAC7B4C,SAAS,eAYnCwL,EAAsB9P,KAAKkP,yBACjC,IAAI6Y,EAA4B,GAE5BC,EAA0B,GAC9B,IAAI,IAAIxgB,EAAI,EAAGA,EAAIsI,EAAoBrI,OAAQD,IAEX,MAA7BsI,EAAoBtI,GAAG,KACnBsI,EAAoBtI,GAAG,GAAG7F,QACtBqmB,EAAwBvgB,OAAS,IAChCugB,EAAwBA,EAAwBvgB,OAAS,GAAGkF,SAAU,EACtEob,EAA0BzgB,KAAK0gB,GAC/BA,EAA0B,IAE9BD,EAA0BzgB,KAAK,CAACwI,EAAoBtI,OACX,IAAnCwgB,EAAwBvgB,QAAgBqI,EAAoBtI,GAAG,GAAGygB,SAAWD,EAAwB,GAAG,GAAGC,SAGjHD,EAAwBA,EAAwBvgB,OAAS,GAAGkF,SAAU,EACtEob,EAA0BzgB,KAAK0gB,GAC/BA,EAA0B,IAJ1BA,EAAwB1gB,KAAKwI,EAAoBtI,MAkE7D,OAvDGwgB,EAAwBvgB,OAAS,IAChCugB,EAAwBA,EAAwBvgB,OAAS,GAAGkF,SAAU,EACtEob,EAA0BzgB,KAAK0gB,IAGnCD,EAA0BG,UAC1BH,EAA4BA,EAA0BI,OA0ClDJ,EAA0BtgB,OAAS,IAAOzH,KAAKC,MAAMuB,WAAWoJ,aAChEmd,EAA4B,CAACA,EAA0BA,EAA0BtgB,OAAS,KAE3FzH,KAAKC,MAAMuB,WAAWoJ,aACrBmd,EAA4BA,EAA0BG,WAItDvoB,IAAAC,cAAA,OACI7C,GAAI,yCACJgT,IAAMC,GAAShQ,KAAK2N,4BAA8BqC,EAClD3O,MAAO,CAAE8C,QAAS,OAAQojB,cAAe,SAAU/kB,OAAQ,SAG3D7C,IAAAC,cAAA,OAEAyB,MAAO,CAACsD,gBAAiB3E,KAAKC,MAAMuB,WAAW4mB,mBAAqBpoB,KAAKC,MAAMuB,WAAW4mB,mBAAoB,QAAU9mB,MAAOtB,KAAKC,MAAMuB,WAAW6mB,aAAcroB,KAAKC,MAAMuB,WAAW6mB,aAAe,QAAUlkB,QAAS,OACvNE,WAAY,SACZD,eAAgB,iBAEpBvE,UAAYG,KAAKC,MAAMuB,WAAWoJ,WAAa,mBAAqB,cAIhEjL,IAAAC,cAAA,OAAKyB,MAAO,CAAE6hB,KAAM,aACfljB,KAAKC,MAAMuB,WAAW+hB,cACnB5jB,IAAAC,cAAA,QAAMC,UAAU,mBACfG,KAAKC,MAAMuB,WAAW8gB,YAAc,IAErC,MAQR3iB,IAAAC,cAAA,OAAKyB,MAAO,CAAE6hB,KAAM,aAChBvjB,IAAAC,cAACiE,IAAM,CACHY,QAASA,IAAMzE,KAAKC,MAAMqV,2BAA0B,GACpDjU,MAAO,CACHiD,SAAU,OACV6G,SAAU,OACVsX,QAAS,UACT7H,WAAY,IACZtZ,MAAOtB,KAAKC,MAAMuB,WAAW8mB,qBAC7B3jB,gBAAiB3E,KAAKC,MAAMuB,WAAW+mB,2BAA6BvoB,KAAKC,MAAMuB,WAAW+mB,2BAA4B,eAE1HjM,aAAW,cACd,UASRtc,KAAKsG,MAAMoI,kBACR/O,IAAAC,cAAA,OAAK7C,GAAI,6BACL4C,IAAAC,cAACqQ,KAAc,OAEnB,KAEJtQ,IAAAC,cAAA,OACI7C,GAAI,0CACJgT,IAAMC,GAAShQ,KAAKoO,oBAAsB4B,EAC1C3O,MAAO,CAAE6hB,KAAM,EAAGsF,UAAW,SAE7B7oB,IAAAC,cAAA,OACIyB,MAAO,CAAEwP,MAAO,OAAQC,MAAO,QAC/Bf,IAAMgB,IACF/Q,KAAKwN,YAAcuD,KAS1B/Q,KAAKC,MAAMuB,WAAWoJ,WAAe5K,KAAKC,MAAMkP,kBAAoBnP,KAAKC,MAAMkP,iBAAiB1H,OAAO,GAKpG9H,IAAAC,cAACwN,GAAgB,CACb5E,MAAOxI,KAAKC,MAAMuI,MAClB2G,iBAAkBnP,KAAKC,MAAMkP,iBAC7B1D,WAAYzL,KAAKC,MAAMwL,WACvBmF,YAAa5Q,KAAKC,MAAM2Q,YACxBV,SAAUlQ,KAAKC,MAAMiQ,SACrBlB,UAAWhP,KAAKC,MAAM+O,UACtBL,qBAAsB3O,KAAKC,MAAM0O,qBACjCnN,WAAYxB,KAAKC,MAAMuB,WACvBkL,YAAa1M,KAAKC,MAAMyM,YACxB3E,WAAY/H,KAAKC,MAAM8H,WACvBnB,yBAA0B5G,KAAKC,MAAM2G,yBACrCF,cAAe1G,KAAKC,MAAMyG,cAC1BgE,SAAU1K,KAAKC,MAAMyK,SACrBK,sBAAuB/K,KAAKC,MAAM8K,yBAMpC/K,KAAKC,MAAMwL,YAAczL,KAAKC,MAAMkP,iBAAiB1H,OAAS,IAChE9H,IAAAC,cAAA,OAAKC,UAAU,+BAETG,KAAKC,MAAMwL,YAAcsc,EAA0BtgB,OAAS,EAC1D9H,IAAAC,cAAA,OAAKC,UAAU,0CA4DC,YAGhB,KAGHG,KAAKC,MAAMwL,WACR9L,IAAAC,cAAA,OAAK7C,GAAI,8BACL4C,IAAAC,cAACoH,GAAY,CACTwB,MAAOxI,KAAKC,MAAMuI,MAClBmC,YAAY,EACZhE,aAAc3G,KAAKqN,0BAAyB,GAC5C7L,WAAYxB,KAAKC,MAAMuB,WACvBkJ,SAAU1K,KAAKC,MAAMyK,SACrBzF,WAAYC,EAAeH,aAGnC,KAGH/E,KAAKC,MAAM2Q,YACRjR,IAAAC,cAAA,OAAK7C,GAAI,8BACL4C,IAAAC,cAACoH,GAAY,CACTwB,MAAOxI,KAAKC,MAAMuI,MAClB7B,aAAc3G,KAAKqN,0BAAyB,GAC5C7L,WAAYxB,KAAKC,MAAMuB,WACvBkJ,SAAU1K,KAAKC,MAAMyK,SACrBzF,WAAYC,EAAeH,aAGnC,KAGJpF,IAAAC,cAAA,OAAKyB,MAAO,CAAE8C,QAAS,OAAQojB,cAAe,WACzCQ,EAA0BnrB,IAAI,CAAC0S,EAAiBpG,IAC7CvJ,IAAAC,cAAA,OACIC,UACqC,MAAjCyP,EAAgB,GAAG3H,WACb,yCACA,oDAEV8E,IAAKvD,GAEJoG,EAAgB,GAAGlE,gBACpBC,GACI1L,IAAAC,cAACyQ,YAAQ,CACLC,mBAAiB,EACjBC,YAAU,EACVpO,UAAQ,EACRqO,YAAY,EACZC,YAAY,EACZC,YAAY,EACZC,sBAAuB,GACvB9Q,UAAW,gCAEVG,KAAKqP,sBAAsBC,IAGhCtP,KAAKqP,sBAAsBC,MAO1CtP,KAAKC,MAAMiQ,UAAYJ,EAAoBrI,OAAS,EACjD9H,IAAAC,cAACuQ,KAAS,CAACC,SAAUpQ,KAAKsO,gCACtB3O,IAAAC,cAAA,OAAKyB,MAAO,CAAEkB,MAAO,OAAQC,OAAQ,UAEzC,MAKXxC,KAAKsG,MAAM2U,iBAAiBxT,OAAS,EAClC9H,IAAAC,cAAA,OAAKyB,MAAO,CAAE+lB,OAAQ,EAAG3E,QAAS,IAAM6E,GACxC,KAEHH,GAAeA,EAAY1f,OAAS,GAAKjG,EAAWinB,YACjD9oB,IAAAC,cAAA,OAAKC,UAAU,YAAYwB,MAAO,CAAEkB,MAAO,OAAQmmB,UAAW,aAAcjG,QAAS,WAGjF9iB,IAAAC,cAAC6nB,KAAI,CAACpmB,MAAO,CAAEkB,MAAO,OAAQkgB,QAAS,EAAG2E,OAAQ,EAAGsB,UAAW,eAC3DvB,EAAYvqB,IAAI,CAAA+U,EAAwBzI,KAAK,IAAAyf,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,IAA3B9oB,EAAS4B,EAAOxB,GAAIqR,EAAA,OACnChS,IAAAC,cAACoc,KAAQ,CACLvP,IAAKvD,EACL7H,MAAO,CACHohB,QAAS,EACT7W,OAAQ,OACR8c,UAAW,aACXnmB,MAAO,OACP4B,QAAS,OACTojB,cAAe,SACfH,OAAQ5lB,EAAWynB,uBAAwB,SAAW,QACtDC,UAAqB,IAAVhgB,EAAc,OAAS,sBAGtCvJ,IAAAC,cAAA,OACIyB,MAAO,CACHkB,MAAO,OACPkgB,QAASjhB,EAAWynB,uBAAwB,qBAAuB,SACnEP,UAAW,aACXvkB,QAAS,OACTojB,cAAe,SACfhF,IAAK,MACL5d,gBAAiB,SAGnBrE,GACFX,IAAAC,cAAA,OAAKyB,MAAO,CAAE8C,QAAS,OAAQE,WAAY,SAAUke,IAAK,MAAOnG,SAAU,WAEvEzc,IAAAC,cAACupB,KAAU,CAAC9nB,MAAO,CAAEC,MAAO,OAAQ8nB,WAAY,KAChDzpB,IAAAC,cAAA,KACIqB,KAAMX,EACNY,OAAO,SACPC,IAAI,sBACJE,MAAO,CACHgoB,YAAiC,QAArBV,EAAA3oB,KAAKC,MAAMuB,kBAAU,IAAAmnB,OAAA,EAArBA,EAAuBnd,OAAQ,UAC3ClH,SAAU,SACVhD,OAA4B,QAArBsnB,EAAA5oB,KAAKC,MAAMuB,kBAAU,IAAAonB,OAAA,EAArBA,EAAuBhnB,gBAAiB,UAC/C0nB,eAAgB,OAChBnN,SAAU,SACVgH,aAAc,WACdvG,WAAY,SACZ9R,SAAU,OACVoY,KAAM,WACN/X,SAAU,KAEdrJ,MAAOxB,GAENA,IAKRkB,EAAWynB,wBACRtpB,IAAAC,cAAAD,IAAAkN,SAAA,KAEJlN,IAAAC,cAAA,OACIyB,MAAO,CACHgoB,YAAiC,QAArBR,EAAA7oB,KAAKC,MAAMuB,kBAAU,IAAAqnB,OAAA,EAArBA,EAAuBrd,OAAQ,UAC3ClH,SAAU,OACVoW,WAAY,IACZpZ,OAA4B,QAArBwnB,EAAA9oB,KAAKC,MAAMuB,kBAAU,IAAAsnB,OAAA,EAArBA,EAAuBlnB,gBAAiB,OAC/Cua,SAAU,SACVgH,aAAc,WACdvG,WAAY,SACZ9R,SAAU,SAIbhJ,GAILnC,IAAAC,cAAA,OACIyB,MAAO,CACHgoB,YAAiC,QAArBN,EAAA/oB,KAAKC,MAAMuB,kBAAU,IAAAunB,OAAA,EAArBA,EAAuBvd,OAAQ,UAC3ClH,SAAU,SACVsW,WAAY,IACZtZ,OAA4B,QAArB0nB,EAAAhpB,KAAKC,MAAMuB,kBAAU,IAAAwnB,OAAA,EAArBA,EAAuBpnB,gBAAiB,OAC/CuC,QAAS,cACTolB,gBAAiB,EACjBC,gBAAiB,WACjBrN,SAAU,SACVgH,aAAc,WACdrY,SAAU,SAIb5K,UAQzB,KAIJP,IAAAC,cAAA,OACIC,UAAU,4BACVwB,MAAO,CACH8C,QAAS,OACTC,eAAgB,gBAChBC,WAAY,WAIhB1E,IAAAC,cAAA,QAAMC,UAAU,kBAAkBwB,MAAO,CAAEooB,YAAa,UACpDzpB,KAAKC,MAAMuB,WAAW+hB,eAAkBvjB,KAAKC,MAAMuB,WAAW8gB,YAAc,IAG/EtiB,KAAKC,MAAMuB,WAAWmjB,eACvBhlB,IAAAC,cAAA,YAAM,8BASf0mB,U,0CCxwBf,MAAMoD,WAAajqB,YACjBsG,YAAY9F,GACV+F,MAAM/F,GA4FR,KAGA0pB,qBAAwBC,GACf5pB,KAAKsG,MAAMujB,cACbC,UAAUF,GACV9gB,MAAMyB,IACLC,QAAQzB,MAAM,+BAEdI,WAAW,KACTnJ,KAAKsG,MAAMujB,cACNC,UAAUF,GACV9gB,MAAMyB,IACLC,QAAQzB,MAAMwB,MAEnB,OAET,KAEFwf,SAAYpsB,IACV,IAAIqsB,EAAK,IAAIC,KAAW,CACtBC,SAAS,EACTC,MAAM,IACLC,IAAIC,KAAoB,CACzBC,UAAW,iCACXC,UAAW,mBACXC,YAAa,8EACbC,YAAa,KAGf,MAAMC,EAAgBV,EAAGW,SAASC,MAAMC,WAAa,SAAUC,EAAQC,EAAKC,EAASC,EAAKC,GACxF,OAAOA,EAAKC,YAAYL,EAAQC,EAAKC,IAIvChB,EAAGW,SAASC,MAAMC,UAAY,SAAUC,EAAQC,EAAKC,EAASC,EAAKC,GACjE,MAAME,EAASN,EAAOC,GAAKM,UAAU,UAEjCD,EAAS,EACXN,EAAOC,GAAKO,SAAS,CAAC,SAAU,WAEhCR,EAAOC,GAAKQ,MAAMH,GAAQ,GAAK,SAIjC,MAAMI,EAAWV,EAAOC,GAAKM,UAAU,OAEnCG,EAAW,EACbV,EAAOC,GAAKO,SAAS,CAAC,MAAO,wBAE7BR,EAAOC,GAAKQ,MAAMC,GAAU,GAAK,sBAGnC,MAAMC,EAAYX,EAAOC,GAAKM,UAAU,QAQxC,OANII,GAAa,IAEfX,EAAOC,GAAKQ,MAAME,GAAW,GAAKX,EAAOC,GAAKQ,MAAME,GAAW,GAAGnsB,QAAQ,SAAU,KAI/EorB,EAAcI,EAAQC,EAAKC,EAASC,EAAKC,IAGlD,IAAIQ,EAAe1B,EAAGtqB,OAAO/B,GAS7B,OAPI+tB,EAAaC,WAAW,SAC1BD,EAAeA,EAAavN,UAAU,IAEpCuN,EAAaE,SAAS,YACxBF,EAAeA,EAAavN,UAAU,EAAGuN,EAAajkB,OAAS,IAGzDikB,GACT,KAEDpW,0BAA6BsO,IAE3Bjb,OAAOkjB,OAAOC,YAAY,CAAC,uBAA0BlI,GAAO,KAE5D5jB,KAAKoG,SAAS,CAAC8gB,uBAAwBtD,KACxC,KAEDjV,qBAAuB,KACrB3O,KAAKoG,SAAS,CAAC4I,WAAY,IAC3BhP,KAAK2pB,qBAAqB,CAAC,kBAAmB3pB,KAAKsG,MAAMoE,SAAS3N,GAAIiD,KAAKsG,MAAMylB,UAAWxjB,KAC5F,KAEFyjB,uBAA0BC,IACxBjsB,KAAK2pB,qBAAqB,CAAC,yBAA0B3pB,KAAKsG,MAAMoE,SAAS3N,GAAIiD,KAAKsG,MAAMylB,UAAWxjB,EAAwB0jB,KA6B7H,KAGArd,kBAAoB,KAElB,MAAMib,GAAgB,IAAIqC,KACvBC,SAAyE9jB,mHAAYC,qBAAuBC,EAAwBA,GACjI,cAAgBvI,KAAKsG,MAAMkC,MAAQ,WAAaxI,KAAKsG,MAAM8lB,OAAS,kBAAoBpsB,KAAKsG,MAAM8Q,cACnG,cAAgBpX,KAAKsG,MAAM+lB,UAAY,WAAarsB,KAAKsG,MAAMgmB,QAClEC,iBAA2DlkB,mHAAYC,qBAAuB4jB,IAAiBM,MAAQN,IAAiB9uB,OACxIqvB,QAGDzsB,KAAKoG,SAAS,CAACyjB,iBAAgB,KAC7B7pB,KAAK0sB,sBAGP1sB,KAAKsG,MAAMujB,cAAc8C,QAAS5jB,IAChC/I,KAAKoG,SAAS,CAACwmB,WAAW,GAAQ,KAChCzjB,WAAW,KACTnJ,KAAK0sB,uBACJnkB,OAKPvI,KAAKsG,MAAMujB,cAAcgD,GAAG,yBAA0B,KACpD7sB,KAAKoG,SAAS,CAAC0mB,wBAAwB,IACvCnkB,OAAOkjB,OAAOC,YAAY,CAAC,aAAe,GAAO,OAInD9rB,KAAKsG,MAAMujB,cAAcgD,GAAG,aAAc,CAACrrB,EAAYgH,KAiBrD,GAhBAxI,KAAKoG,SAAS,CAACoC,UAEZhH,EAAWyD,aAAeC,EAAeH,UAE1C4D,OAAOkjB,OAAOC,YAAY,CAAC,kBAAqBtjB,GAAQ,KAGxDG,OAAOkjB,OAAOC,YAAY,CAAC,aAAgBtjB,GAAQ,KAKrDqhB,EAAckD,WAAWC,SAA4E3kB,mHAAYC,qBAAuBC,EAAwBA,GAC5J,cAAgBC,EAAO,WAAaxI,KAAKsG,MAAM8lB,OAAS,kBAAoBpsB,KAAKsG,MAAM8Q,cACvF,cAAgBpX,KAAKsG,MAAM+lB,UAAY,WAAarsB,KAAKsG,MAAMgmB,OAE/DtsB,KAAKsG,MAAM9E,WACb,OAGFxB,KAAKoG,SAAS,CAAC5E,eAEf,IAAIkJ,EAAW1K,KAAKsG,MAAMoE,SACtBuiB,EAAgBjtB,KAAKsG,MAAM2mB,eAG1BviB,GAAYuiB,IAEoB,SAAhCA,EAAc1tB,gBAEf0tB,EAAgB,MAElBviB,EAAWlJ,EAAW0rB,uBAAuBC,KAAM9H,GAC1CA,EAAK3a,SAASvM,aAAaoB,gBAAkB0tB,EAAc1tB,eAC9D8lB,EAAK3a,SAAS0iB,kBAAkB7tB,gBAAkB0tB,EAAc1tB,eAChE8lB,EAAK3a,SAASoa,YAAYvlB,gBAAkB0tB,EAAc1tB,eAC1D8lB,EAAK3a,SAASyH,KAAK5S,gBAAkB0tB,EAAc1tB,eACtDmL,UAIAA,IACHA,EAAWlJ,EAAW0rB,uBAAuB,GAAGxiB,UAGlD1K,KAAKoG,SAAS,CAACsE,YAAW,KACE,MAArB1K,KAAKsG,MAAM8lB,QAAuD,OAArCpsB,KAAKsG,MAAM9E,WAAWyD,YAAuBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,WACjI/E,KAAK2pB,qBAAqB,CAAC,kBAAmB3pB,KAAKsG,MAAMoE,SAAS3N,GAAIiD,KAAKsG,MAAMylB,UAAWxjB,MAKhG,MAAM8kB,EAAO9jB,SAAS+jB,qBAAqB,QAAQ,GAEnD,GAAI9rB,EAAW+rB,cAAqC,MAArBvtB,KAAKsG,MAAM8lB,OAAgB,CACxD,MAAMoB,EAAsBjkB,SAAS3J,cAAc,UACnD4tB,EAAoB7vB,KAAO6D,EAAW+rB,aAEtCF,EAAKvjB,YAAY0jB,GAGnB,GAAIhsB,EAAWisB,UAAW,CACxB,MAAMC,EAAqBnkB,SAAS3J,cAAc,SAClD8tB,EAAmB5jB,YAAYP,SAASokB,eAAensB,EAAWisB,YAElEJ,EAAKvjB,YAAY4jB,GAGnB,GAAIlsB,EAAWosB,iBAAkB,CAE/B,MAAMC,EAActkB,SAAS3J,cAAc,QAC3CiuB,EAAY5sB,KAAOO,EAAWosB,iBAC9BC,EAAY1sB,IAAM,aAElBksB,EAAKvjB,YAAY+jB,GAGnB,GAAGrsB,EAAWssB,uBAAwB,CACpC,IAAIroB,EAAI8D,SAAS3J,cAAc,SAC/B6F,EAAE1I,GAAK,wBACP0I,EAAEtC,IAAM,UAAY3B,EAAWusB,qBAC/BtoB,EAAEuoB,QAAU,OACZzkB,SAASM,KAAKC,YAAYrE,GAGxBzF,KAAKsG,MAAM9E,YACwB,OAArCxB,KAAKsG,MAAM9E,WAAWyD,YACtBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,WAClD/E,KAAKiuB,eACLjuB,KAAKkuB,yBAGPluB,KAAKmuB,eAMTnuB,KAAKsG,MAAMujB,cAAcgD,GAAG,oBAAqB,CAACuB,EAAarY,KACzDqY,EACFpuB,KAAKoG,SAAS,CAACqF,WAAYsK,IAE3B/V,KAAKoG,SAAS,CAACwK,YAAamF,MAKhC/V,KAAKsG,MAAMujB,cAAcgD,GAAG,OAASwB,IACnC,IAAoC,IAAhCruB,KAAKsG,MAAMgoB,iBAA4B,EAClB1W,YAAW5X,KAAKsG,MAAM9E,WAAW+sB,qBAAuBvuB,KAAKsG,MAAM9E,WAAWgtB,wBAGnG7lB,OAAOkjB,OAAOC,YAAY,CAAC,gBAAkB,GAAO,KAIxD9rB,KAAKoG,SAAS,CAAC4I,WAAW,IAC1BhP,KAAKyuB,mBAAmBJ,KAGxBruB,KAAKsG,MAAMujB,cAAcgD,GAAG,aAAewB,IAEzC,IAAIK,EAAe,IAAI1uB,KAAKsG,MAAM6gB,aAGA,MAA/BkH,EAAalf,kBAA0Bkf,EAAalf,iBAAiB1H,OAAQ,IAC9E4mB,EAAalf,iBAAiB/H,QAAST,IACrC,GAA2B,KAAvBA,EAAa7E,OAAqC,KAArB6E,EAAarG,IAAY,CACzCouB,EAAazjB,KACxB0G,IAAA,IAAE7P,EAAOxB,GAAIqR,EAAA,OAAK7P,IAAU6E,EAAa7E,OAASxB,IAAQqG,EAAarG,OAIzEouB,EAAapnB,KAAK,CAACX,EAAaO,YAC3BtK,IAAIwI,GAAWpF,KAAK+pB,SAAS3kB,EAAQlF,UACrCmJ,KAAK,MAAM1C,EAAa7E,MAAO6E,EAAarG,SAMvDN,KAAKoG,SAAS,CAAE+gB,YAAauH,OAQnC1uB,KAAKsG,MAAMujB,cAAcgD,GAAG,kBAAoB8B,IAC9C,IAAIxf,EAAmBnP,KAAKsG,MAAM6I,iBAEP,GAAxBnP,KAAKsG,MAAM0I,YACZ2f,EAAuBC,MAAOD,EAAuBC,MAAM1G,WAG7DyG,EAAuBC,MAAMxnB,QAASinB,IACT,GAAxBruB,KAAKsG,MAAM0I,YACZqf,EAAalf,iBAAmBkf,EAAalf,iBAAiB+Y,WAE7D/Y,EAAmBnP,KAAKyuB,mBAAmBJ,EAAclf,KAG9D,MAAM0f,EAAgB7uB,KAAKsG,MAAMylB,UAAY4C,EAAuBC,MAAMnnB,OACpEqnB,EAAeD,EAAgBF,EAAuBI,MAE5D/uB,KAAKoG,SAAS,CAAC4oB,WAAYL,EAAuBI,MAAMhD,UAAW8C,EAAe3e,SAAU4e,IAE5F9uB,KAAKoG,SAAS,CAAC+I,oBAAmB,MACI,IAAhCnP,KAAKsG,MAAM2oB,kBAAmD,MAArBjvB,KAAKsG,MAAM8lB,SAClDpsB,KAAKsG,MAAMkL,SACbxR,KAAK+H,WAAW/H,KAAKsG,MAAMkL,SAAUvJ,IAErCjI,KAAKkvB,cAGPlvB,KAAKoG,SAAS,CAAC6oB,kBAAkB,SAQvCjvB,KAAKsG,MAAMujB,cAAcgD,GAAG,2BAA4B,CAAChmB,EAAgBJ,KACvE,IAAI0I,EAAmBnP,KAAKsG,MAAM6I,iBAElC,MAAMggB,EAAoBhgB,EAAiBigB,UAAUC,GAAMA,EAAGxoB,iBAAmBA,IACtD,IAAvBsoB,IACFhgB,EAAiBggB,GAAmB1oB,qBAAuBA,EAE3DzG,KAAKoG,SAAS,CAAC+I,wBAKnBnP,KAAKsG,MAAMujB,cAAcgD,GAAG,YAAa,KACvC7sB,KAAKoG,SAAS,CAACqF,YAAY,IAE3B,IAAI0D,EAAmBnP,KAAKsG,MAAM6I,iBAElCA,EAAiB/H,QAAST,IACpBA,EAAa2oB,iBACf3oB,EAAaU,QAAS,KAI1BrH,KAAKoG,SAAS,CAAC+I,uBAGjBnP,KAAKsG,MAAMujB,cAAcgD,GAAG,yBAA2BvO,IACrDte,KAAKoG,SAAS,CAACkY,mBAAoBA,SAIvC,KAEFiR,cAAgB,KACdvvB,KAAKoG,SAAUiN,IAAS,CACtBmc,iBAAkBnc,EAAUmc,oBAE9B,KAEF7I,oBAAuBG,IAErB,MAAM2I,EAAwBzvB,KAAK0vB,uBAAuB5I,EAASrV,aAEnEzR,KAAK2vB,kBAEmC,OAArC3vB,KAAKsG,MAAM9E,WAAWyD,YAAuBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeJ,QAClG9E,KAAK4vB,kBAAkBH,GAEvBzvB,KAAKoG,SAAS,CAAEypB,iBAAkB/I,EAASrV,eAG7C,KAEFsS,yBAA2B,KACzB/jB,KAAKoG,SAAS,CAACyJ,iBAAiB,MACjC,KAEDyD,uBAA0BT,IACxB7S,KAAKoG,SAASiN,GAEOA,EAAUxD,iBAAiB5E,KAAKjN,GAAQA,IAAS6U,GAEzD,KAGJ,CACLhD,iBAAkB,IAAIwD,EAAUxD,iBAAkBgD,MAGvD,KAEDuQ,yBAA4B0M,IAC1B9vB,KAAKoG,SAAUiN,IAIN,CACLxD,iBAJ8BwD,EAAUxD,iBAAiB+D,OAAO5V,GAAQA,IAAS8xB,GAKjF9d,aAJ0BqB,EAAUrB,aAAa4B,OAAO5V,IAASA,EAAKmU,KAAK9T,SAASyxB,MAMrF,KACD9vB,KAAKoG,SAAUiN,IAAS,CACtB8D,iBAAkB9D,EAAUxD,iBAAiBpI,OAAS,QAG1D,KAGFqM,8BAAgC,KAC9B9T,KAAKoG,SAAS,CAACuN,uBAAwB,OACnC3T,KAAKsG,MAAMuJ,kBAAoB7P,KAAKsG,MAAMuJ,iBAAiBpI,OAAS,EACtEzH,KAAKoG,SAAS,CAAE+Q,kBAAkB,IAElCnX,KAAKoG,SAAS,CAAE+Q,kBAAkB,KAErC,KAED4Y,wBAA2BD,IACzB9vB,KAAKoG,SAASiN,IAAS,CACnBxD,iBAAkBwD,EAAUxD,iBAAiB+D,OAAO5V,GAAQA,IAAS8xB,GACrE9d,aAAcqB,EAAUrB,aAAa4B,OAAO5V,IAASA,EAAKmU,KAAK9T,SAASyxB,QAE5E,KAIFrB,mBAAqB,CAACJ,EAAclf,KAElC,GAA4B,GAAzBkf,EAAa2B,SAChB,CACE7gB,EAAmBnP,KAAKsG,MAAM6I,iBAC9B,IAAIuf,EAAe7c,MAAMoe,QAAQjwB,KAAKsG,MAAM6gB,aAAe,IAAInnB,KAAKsG,MAAM6gB,aAAe,GAGxF,GAAqB,MAAlBhY,GAA0BA,EAAiB1H,OAAQ,EAAI,CACzD0H,EAAiB/H,QAAST,IACxB,GAA2B,KAAvBA,EAAa7E,OAAqC,KAArB6E,EAAarG,IAAY,CACzCouB,EAAazjB,KAC1BilB,IAAA,IAAEpuB,EAAOxB,GAAI4vB,EAAA,OAAKpuB,IAAU6E,EAAa7E,OAASxB,IAAQqG,EAAarG,OAIvEouB,EAAapnB,KAAK,CAACX,EAAa7E,MAAO6E,EAAarG,SAM1DN,KAAKoG,SAAS,CAAE+gB,YAAauH,IAG7B,MAAMyB,EAAW9B,EAAalf,iBAAiB,GAAGghB,SAEjD,GAAGnwB,KAAKsG,MAAM8pB,gBAAgBnlB,KAAMxF,GAAMA,GAAM0qB,GAE9C,OAGF,GAAG9B,EAAalf,iBAAiB,GAAGjG,MAAQ,EAAG,CAE7C,IAAImnB,EAAqBrwB,KAAKsG,MAAM+pB,mBAEpCA,EAAmB/oB,KAAK+mB,EAAalf,iBAAiB,IAEtDkhB,EAAqBA,EAAmBnV,KAAK,CAACC,EAAGC,IAAMD,EAAEjS,MAAQkS,EAAElS,OAEnE,IAAIonB,EAAoBnhB,EAAiBA,EAAiB1H,OAAS,GAEnE4oB,EAAmBjpB,QAAQ,CAAC4c,EAAM9a,KAEjConB,EAAiBpnB,WAAmCsW,GAA1B8Q,EAAiBpnB,OAAgD,GAA1BonB,EAAiBpnB,MAAa,EAAIonB,EAAiBpnB,MAEnH,MAAMqnB,EAAYvM,EAAK9a,MAAQonB,EAAiBpnB,MAEhD,GAAIonB,SAAgD9Q,GAA3B8Q,EAAiB3uB,QAAkD,GAA3B2uB,EAAiB3uB,SAAoB2uB,EAAiBH,UAAYA,GAA0B,GAAbI,GAAwC,GAArBvM,EAAKwM,aAAuB,CAG7L,MAAMC,EAAsBH,EAAiBppB,YAAY,GACnDwpB,EAAyB1M,EAAK9c,YAAY,GAC1CypB,GAAuBF,EAAoBG,cAAgBH,EAAoBG,cAAgBH,EAAoBvwB,UAAYwwB,EAAuBE,cAAgBF,EAAuBE,cAAgBF,EAAuBxwB,SAC1OiP,EAAiBA,EAAiB1H,OAAS,GAAGP,YAAY,GAAG0pB,cAAgBD,EAC7ExhB,EAAiBA,EAAiB1H,OAAS,GAAGP,YAAY,GAAGhH,QAAUF,KAAK+pB,SAAS4G,GACrFxhB,EAAiBA,EAAiB1H,OAAS,GAAGyB,MAAQ8a,EAAK9a,MAC3DiG,EAAiBA,EAAiB1H,OAAS,GAAG+oB,aAAexM,EAAKwM,aAClEH,EAAqBA,EAAmBzc,OAAOid,GAAcA,EAAW3nB,QAAU8a,EAAK9a,UAM3F,IAAIqR,GAAkB,EAEtB,GAAG8T,EAAalf,iBAAiB,GAAGqhB,aACpC,CACE,MAAMM,EAA8BzC,EAAalf,iBAAiB,GAAGjI,YAAY,GAAGhH,QACpFiP,EAAiBA,EAAiB1H,OAAS,GAAGP,YAAY,GAAG0pB,cAAgBE,EAC7E3hB,EAAiBA,EAAiB1H,OAAS,GAAGP,YAAY,GAAGhH,QAAUF,KAAK+pB,SAAS+G,GACrF3hB,EAAiBA,EAAiB1H,OAAS,GAAG+oB,cAAe,EAE7D,IAAIJ,EAAkBpwB,KAAKsG,MAAM8pB,gBAEjCA,EAAgB9oB,KAAK+mB,EAAalf,iBAAiB,GAAGghB,UAEtD5V,GAAkB,EAElBva,KAAKoG,SAAS,CAACgqB,oBAGjB,IAAIW,GAAmB5hB,EAAiBA,EAAiB1H,OAAS,GAAG+oB,mBAAgGhR,GAA9ErQ,EAAiBA,EAAiB1H,OAAS,GAAGP,YAAY,GAAG0pB,cAUpJ,YARA5wB,KAAKoG,SAAS,CACZ+I,iBAAkBA,EAClBkhB,mBAAoBA,EACpBW,aAAcb,EACd5V,kBACA9O,WAAYzL,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,WAAmBgsB,MAW5F,IAAIE,EAAQ,EAEZ,MAAMC,EAAqC7C,EAAalf,iBAAiBvS,IAAK+J,GACrEA,EAAagB,YACnBwpB,YAAY,MAGTC,EAAqBC,cAwI3B,OAtIAhD,EAAalf,iBAAiB/H,QAAQ,CAACT,EAAca,EAAG4H,KAGtD,GAAIzI,EAAasqB,MAAO,CACtBA,GAAStqB,EAAasqB,MACtB,IAAIxlB,GAAa,EACjBzL,KAAKoG,SAAS,CAACqF,eAGW,GAAxBzL,KAAKsG,MAAM0I,WAERrI,EAAagB,aACfhB,EAAaU,QAAS,GAI3BV,EAAashB,OAASmJ,EACtBzqB,EAAaiG,eAAiByhB,EAAatxB,GAC3C4J,EAAauF,gBAAkBmiB,EAAaniB,gBAE5CvF,EAAauC,MAAQ1B,EAEfxH,KAAKsG,MAAM9E,YACsB,OAArCxB,KAAKsG,MAAM9E,WAAWyD,YACtBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,YAClD4B,EAAanI,YAAc6vB,EAAa7vB,aAKxC6vB,EAAaxnB,gBACbF,EAAauC,QAAUgoB,IACtBvqB,EAAahF,QACdgF,EAAayE,gBAAkBC,KAEjC1E,EAAaE,eAAiBwnB,EAAaxnB,eAC3CF,EAAaF,qBAAuB4nB,EAAa5nB,sBAG/CE,EAAauC,MAAQ,IACvBvC,EAAauC,OAASkG,EAAMnE,KAAKtE,GAAgBA,EAAahF,QAAU,EAAI,GAI1EgF,EAAagB,YAAc3H,KAAKsG,MAAM8lB,SACxCzlB,EAAamB,UAAW,GAIxBnB,EAAa2E,QACb3E,EAAaO,YAAcP,EAAaO,YAAYtK,IAAIwI,IAC/C,IAAKA,EAASlF,QAASF,KAAK+pB,SAAS3kB,EAAQlF,aAMpDiP,EACCnP,KAAKsG,MAAM0I,UACbG,EAAiB7H,KAAKX,QAGyD6Y,GAA5ErQ,EAAiBge,KAAK1nB,GAAGA,EAAEoB,gBAAiBF,EAAaE,iBAAgD,wCAAjBF,EAAa5J,IAA6E,MAA/B4J,EAAaE,gBACjKsI,EAAiBmiB,QAAQ3qB,IAK5BwC,WAAW,KAuBT,GAtBAgG,EAAmBnP,KAAKsG,MAAM6I,kBAG1BxI,EAAahF,QAAkC,GAAxB3B,KAAKsG,MAAM0I,YACpCG,EAAiB/H,QAASioB,IACpBA,EAAG1nB,aACL0nB,EAAGhoB,QAAS,KAKfrH,KAAKsG,MAAM0I,UACZG,EAAiB7H,KAAKX,QAGyD6Y,GAA5ErQ,EAAiBge,KAAK1nB,GAAGA,EAAEoB,gBAAiBF,EAAaE,iBAAgD,wCAAjBF,EAAa5J,IAA6E,MAA/B4J,EAAaE,gBACjKsI,EAAiBmiB,QAAQ3qB,GAI7B3G,KAAKoG,SAAS,CAAC+I,qBAEX3H,IAAM4H,EAAM3H,OAAS,EAAI,CAC1B,IAAIgE,GAAa,EAClBzL,KAAKoG,SAAS,CAACqF,iBAGhBwlB,GAEAjxB,KAAKsG,MAAM9E,WAAWssB,wBAA0BO,EAAalf,kBAAoBkf,EAAalf,iBAAiB,IAAMkf,EAAalf,iBAAiB,GAAGzD,YACvJvC,WAAW,KACTqB,QAAQiI,IAAI,8CAAgD9L,EAAasqB,MAAQ,KACjFjxB,KAAKuxB,4BACJ5qB,EAAasqB,QAIbjxB,KAAKsG,MAAM8lB,QAAUiC,GAA0C,OAA1BA,EAAa7c,UACrD7I,OAAOkjB,OAAOC,YAAY,CAAC,aAAe,GAAO,SAQlD9rB,KAAKsG,MAAM8lB,QAAUiC,GAAgBA,EAAajI,cACrDzd,OAAOkjB,OAAOC,YAAY,CAAC,cAAgB,GAAO,KAIhD9rB,KAAKsG,MAAM9E,YACwB,OAArCxB,KAAKsG,MAAM9E,WAAWyD,YACpBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,WAElDoK,GAAoBA,EAAiB1H,OAAS,IAE3CzH,KAAKsG,MAAM9E,WAAWoJ,aACzBuE,EAAmB,CAACA,EAAiBA,EAAiB1H,OAAS,KAGjEzH,KAAKoG,SAAS,CAAE+I,sBAIbA,GACP,KAEFoiB,yBAA2B,KACbhoB,SAASioB,eAAe,yBAC9BC,QACP,KAED/E,oBAAsB,KAChB1sB,KAAKsG,MAAMorB,wBAIf1xB,KAAKsG,MAAMujB,cAAc8H,QACtBlpB,KAAK,KACJzI,KAAKoG,SAAS,CAACwmB,WAAW,IAC1B5sB,KAAKoG,SAAS,CAACod,uBAAuB,MACrC1a,MAAM,KACPK,WAAW,KACTnJ,KAAK0sB,uBACJnkB,MAEP,KAGFmnB,uBAA0BtqB,IACjB,CACLzD,QAAQ,EACRuF,YAAa,CACX,CACE5B,YAAcH,EAAYxH,KAC1BuC,QAASkF,MAMjB,KACAyb,yBAAyB,KAC3B7gB,KAAKoG,SAAS,CAAC+Q,kBAAiB,KAC7B,KACDya,2BAA6B,CAACvsB,EAAU/E,KAC/B,CACLqB,QAAQ,EACRkJ,mBAAmB,EACnB3D,YAAa,CACX,CACE5B,YAAaH,EAAYnH,KACzBqH,SAASA,EACT/E,IAAKA,EACLoH,UAAW,MAIjB,KAEFwnB,YAAc,KACZlvB,KAAK2pB,qBAAqB,CAAC,cAAe3pB,KAAKsG,MAAMoE,SAASvM,aAAc6B,KAAKsG,MAAMurB,sBACvF7xB,KAAKoG,SAAS,CAACyrB,qBAAqB,KACpC,KAEF7b,kBAAqBD,IACnB/V,KAAK2pB,qBAAqB,CAAC,oBAAqB5T,KAChD,KAEF6Z,kBAAqBjpB,IAEnB3G,KAAKoG,SAAS,CAAC4I,WAAU,IAEzB,IAAIG,EAAmBnP,KAAKsG,MAAM6I,iBAElC,GAA4B,MAAzBnP,KAAKsG,MAAM0qB,aACd,CACE,IAAIZ,EAAkBpwB,KAAKsG,MAAM8pB,gBAEjCA,EAAgB9oB,KAAKtH,KAAKsG,MAAM0qB,cAEhChxB,KAAKoG,SAAS,CAACgqB,oBAIjBjhB,EAAiB/H,QAAST,IACpBA,EAAagB,aACfhB,EAAaU,QAAS,MAKtBV,GAAuD,OAArC3G,KAAKsG,MAAM9E,WAAWyD,YAAuBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,YAAkD,IAArC/E,KAAKsG,MAAM9E,WAAWoJ,aACxJjE,EAAayE,cAAgBC,IACI,IAA7BrL,KAAKsG,MAAM8Q,eACRjI,EAAiBlE,KAAK7B,GAAOA,EAAIlJ,UAAYyG,EAAazG,UAI/DiP,EAAiB7H,KAAKX,IAI1B3G,KAAKoG,SAAS,CAAC+I,sBACf,KAEFqL,YAAc,KAEZ,IAAI4V,EAAkBpwB,KAAKsG,MAAM8pB,gBAE5BA,EAAgB/xB,SAAS2B,KAAKsG,MAAM0qB,gBACvCZ,EAAgB9oB,KAAKtH,KAAKsG,MAAM0qB,cAChChxB,KAAKoG,SAAS,CAAEgqB,kBAAiB3kB,YAAY,KAG/CzL,KAAKoG,SAAS,CAAEmU,iBAAiB,KAElC,KAEDoV,gBAAkB,KAChB3vB,KAAKoG,SAAS,CAAEqF,YAAY,KAC7B,KAED8H,sBAAyBV,IACvB7S,KAAKoG,SAASiN,IAEL,CACLrB,aAAc,IAFYqB,EAAUrB,aAAa4B,OAAO5V,GAAQA,EAAKmU,OAASU,EAAQV,MAE/CU,OAG5C,KAGDoR,kBAAoB,KAClBjkB,KAAKoG,SAAS,CAAC4L,aAAc,MAC9B,KAED8f,UAAY,KACV,MAAM,aAAE9f,GAAiBhS,KAAKsG,MAIxByrB,EAAiB/f,EAAapV,IAAKoB,GAC9B,IAAIg0B,QAAQ,CAACx0B,EAASy0B,KACzBjyB,KAAK8jB,mBAAmB9lB,EAAMgC,KAAKC,MAAMsgB,MAAM2R,OAAO1pB,MAAQO,IACtDA,GACAyB,QAAQzB,MAAM,wBAAwB/K,EAAKmU,QAASpJ,GACpDkpB,EAAOlpB,IAEPvL,SAMhB,OAAOw0B,QAAQG,IAAIJ,GACdtpB,KAAK,KACFzI,KAAKoG,SAAS,CAAE4L,aAAc,GAAIogB,eAAe,IACjDpyB,KAAK+jB,6BAERjb,MAAOC,IACJyB,QAAQzB,MAAM,yBAA0BA,GACxC/I,KAAKoG,SAAS,CAAEgsB,eAAe,OAIzC,KAIE1lB,YAAcka,MAAOxhB,EAASitB,EAAkBC,KAC9C,IAA6B,IAAzBtyB,KAAKsG,MAAMsmB,UAGX,OAFA5sB,KAAKoG,SAAS,CAAEod,uBAAuB,IACvCxjB,KAAK8d,2BACE,EAGR9d,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,WACrD/E,KAAKuyB,oBAAoB,IAIvBvyB,KAAKwyB,kBAAkB9c,SACvB1V,KAAKwyB,kBAAkB9c,QAAQqR,qBAGnC,IAEG/mB,KAAK2vB,kBAGN,MAAMF,EAAwB6C,EACxBtyB,KAAK4xB,2BAA2BS,EAAkBC,GAClDtyB,KAAK0vB,uBAAuB2C,GAqBhC,OAnBCryB,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeJ,SAAW9E,KAAKsG,MAAM9E,WAAWoJ,aACtF5K,KAAK4vB,kBAAkBH,SAIjBzvB,KAAK8xB,YAGX9xB,KAAK2pB,qBAAqB,CACtB,OACAvkB,EACApF,KAAKsG,MAAMoE,SAASvM,aACpB6B,KAAKsG,MAAMmsB,gBACXzyB,KAAKsG,MAAM0qB,eAEfhxB,KAAK0yB,oBACL1yB,KAAKoG,SAAS,CAAE+gB,YAAa,KAC7BnnB,KAAKoG,SAAS,CAAEqsB,gBAAiB,MAE1B,EACT,MAAO1pB,GAEL,OADAyB,QAAQzB,MAAM,yBAA0BA,IACjC,IAEb,KAGFhB,WAAa,CAACyJ,EAAUmhB,EAAkBN,EAAkB1rB,EAAcisB,EAAiBC,KACzF,IAA6B,IAAzB7yB,KAAKsG,MAAMsmB,UAEb,YADA5sB,KAAKoG,SAAS,CAACod,uBAAuB,IAMxC,IAAIiM,EAFJzvB,KAAKoG,SAAS,CAAC4I,WAAW,IAKtBrI,GACF8oB,EAAwBqD,KAAKC,MAAMD,KAAKE,UAAUrsB,IAClD8oB,EAAsB9tB,QAAS,EAC/B8tB,EAAsBvmB,MAAQ,EAC9BumB,EAAsB7iB,eAAiB,KACvC6iB,EAAsB9nB,WAAa,MAC1B0qB,IACT5C,EAAwBzvB,KAAK0vB,uBAAuB2C,IAGtDryB,KAAK4vB,kBAAkBH,GAGvB,IAAIhjB,EAAM,KACNkmB,IAAqB1qB,GACvBwE,EAAM9F,EAAagB,WAAW5K,GACrB41B,IAAqB1qB,KAC9BwE,EAAMomB,GAGR7yB,KAAK2pB,qBAAqB,CAAC,aAAcnY,EAAUxR,KAAKsG,MAAMoE,SAASvM,aAAcw0B,EAAkBlmB,EAAKgjB,KAC5G,KAEF/O,oBAAuBlP,IACQ,IAAzBxR,KAAKsG,MAAMsmB,WACb5sB,KAAKoG,SAAS,CAACod,uBAAuB,KAC/B,IAETxjB,KAAK2pB,qBAAqB,CAAC,aAAcnY,EAAUxR,KAAKsG,MAAMoE,SAASvM,aAAc8J,GAAmC,KAAM,QACvH,GACP,KAEFrB,yBAA2B,CAACC,EAAgBJ,KAC1C,IAA6B,IAAzBzG,KAAKsG,MAAMsmB,UAEb,YADA5sB,KAAKoG,SAAS,CAACod,uBAAuB,IAIxC,IAAIrU,EAAmBnP,KAAKsG,MAAM6I,iBAC9BxI,EAAewI,EAAiBge,KAAMkC,GACjCA,EAAGxoB,iBAAmBA,GAG3BF,IACFA,EAAaF,qBAAuBA,IAAyBN,GAAkC,KAAOM,GAGxGzG,KAAKoG,SAAS,CAAC+I,oBAAmB,KAChCnP,KAAK2pB,qBAAqB,CAAC,2BAA4B9iB,EAAgBJ,OAEzE,KAEFoe,iBAAoBC,IAClB,IAA6B,IAAzB9kB,KAAKsG,MAAMsmB,UAEb,OADA5sB,KAAKoG,SAAS,CAACod,uBAAuB,KAC/B,EAGT,MAAM9Y,EAAW1K,KAAKsG,MAAM9E,WAAW0rB,uBAAuBtwB,IAAIq2B,GAAOA,EAAIvoB,UAAUyiB,KAAM9H,GACpFA,EAAKP,cAAgBA,GAS9B,OANAnc,OAAOkjB,OAAOC,YAAY,CAAC,iBAAoBphB,EAASvM,cAAe,KAEvE6B,KAAKoG,SAAS,CAACsE,WAAUukB,kBAAkB,EAAO4C,qBAAqB,EAAM1iB,iBAAkB,GAAI4c,UAAW,EAAGmH,6BAA8B,IAAK,KAClJlzB,KAAK2pB,qBAAqB,CAAC,kBAAmB3pB,KAAKsG,MAAMoE,SAAS3N,GAAKiD,KAAKsG,MAAMylB,UAAWxjB,OAGxF,GACP,KAEFwX,kBAAoB,KAElB/f,KAAKoG,SAAS,CAAC+I,iBAAkB,GAAIgY,YAAY,MAClD,KACDgM,sBAAyB9T,KACM,IAAzBrf,KAAKsG,MAAMsmB,UAIf5sB,KAAK2pB,qBAAqB,CAAC,wBAAyBtK,EAAYrf,KAAKsG,MAAMoE,SAASvM,eAHlF6B,KAAKoG,SAAS,CAACod,uBAAuB,KAIxC,KAEF4P,gBAAmB5hB,IACjB,IAA6B,IAAzBxR,KAAKsG,MAAMsmB,UAKf,OAAO5sB,KAAK2pB,qBAAqB,CAAC,kBAAmBnY,EAAUxR,KAAKsG,MAAMoE,SAASvM,eAJjF6B,KAAKoG,SAAS,CAACod,uBAAuB,KAKxC,KAyBFc,mBAAqB,KACnBtkB,KAAKoG,SAAS,CAACoe,cAAexkB,KAAKsG,MAAMke,gBACzC,KAEF4B,aAAe,KAEbpmB,KAAKoG,SAAS,CAAC4f,aAAa,IAC5Brd,OAAOkjB,OAAOC,YAAY,CAAC,cAAgB,GAAO,MAElD,KAEF4G,kBAAoB,KAClB/pB,OAAOkjB,OAAOC,YAAY,CAAC,mBAAqB,GAAO,MACvD,KAEFpF,oBAAuB2M,IACrB1qB,OAAOkjB,OAAOC,YAAY,CAAC,oBAAuBuH,GAAU,MAC7D,KAEDpF,aAAe,KACbtlB,OAAOkjB,OAAOC,YAAY,CAAC,cAAiB,GAAO,MACpD,KAEDoC,sBAAwB,KAEtB,GADAvlB,OAAOkjB,OAAOC,YAAY,CAAEoC,sBAAuBluB,KAAKsG,MAAM9E,WAAW+hB,eAAiB,KACtFvjB,KAAKsG,MAAM9E,WAAW+hB,cAAe,CACvC,MAAM+P,EAAsB/pB,SAASioB,eAAe,qBAChD8B,IAEFA,EAAoBjyB,MAAMkyB,YAAY,SAAU,OAAQ,aACxDD,EAAoBjyB,MAAMkyB,YAAY,MAAO,IAAK,gBAGtD,KAEFpF,WAAa,KACXxlB,OAAOkjB,OAAOC,YAAY,CAAC,YAAe,GAAO,MAClD,KAED/F,kBAAoB,KAClBpd,OAAOkjB,OAAOC,YAAY,CAAC,mBAAqB,GAAO,KAEvD9rB,KAAKoG,SAAS,CAAC4f,aAAchmB,KAAKsG,MAAM0f,eACxC,KAEFwN,sBAAyBH,IACvB,MAAM5rB,EAAS4rB,EAAQ5rB,OACvBkB,OAAOkjB,OAAOC,YAAY,CAAC,sBAAyBrkB,GAAS,MAC9D,KAED8qB,oBAAuBc,IACrB,MAAM5rB,EAAS4rB,EAAQ5rB,OACvBkB,OAAOkjB,OAAOC,YAAY,CAAC,oBAAuBrkB,GAAS,MAC5D,KAEAwK,wBAA2BwhB,IACzBzzB,KAAKoG,SAAS,CAACstB,qBAAsBD,KACrC,KAEFre,2BAA6B,KAC5BzM,OAAOkjB,OAAOC,YAAY,CAAC,sBAAwB,GAAO,KACtD9rB,KAAKwyB,mBAAqBxyB,KAAKwyB,kBAAkB9c,SACjD1V,KAAKwyB,kBAAkB9c,QAAQ8Q,yBAAwB,IAE3D,KAEFmN,0BAA4B,KAC1BhrB,OAAOkjB,OAAOC,YAAY,CAAC,sBAAwB,GAAQ,KACvD9rB,KAAKwyB,mBAAqBxyB,KAAKwyB,kBAAkB9c,SACnD1V,KAAKwyB,kBAAkB9c,QAAQ8Q,yBAAwB,IAEzD,KAED/G,gBAAkB,MACiB,IAA7Bzf,KAAKsG,MAAMstB,gBAET5zB,KAAKsG,MAAMyE,wBACbpC,OAAOkjB,OAAOC,YAAY,CAAC,uBAAyB,GAAO,KAC3D9rB,KAAKoG,SAAS,CAAC2E,uBAAuB,KAGxC/K,KAAKoG,SAAS,CAACwtB,eAAe,MAEhC,KAEF9V,wBAA0B,KACxB9d,KAAKoG,SAAS,CAACkY,mBAAoB,MArrCpCte,KAAKwyB,kBAAoBhc,sBACzBxW,KAAK6zB,kBAAoBrd,sBACzB,MAAMsd,EAAe,IAAIC,gBAAgB/zB,KAAKC,MAAM+zB,SAASlb,OAAOmb,YAC9D3F,EAAsD,SAAlCwF,EAAaI,IAAI,aACrC1iB,EAAWsiB,EAAaI,IAAI,YAC5BjH,EAAgB6G,EAAaI,IAAI,YAGjC1rB,EAAQxI,KAAKC,MAAMsgB,MAAM2R,OAAO1pB,MAChC4jB,EAASpsB,KAAKC,MAAMsgB,MAAM2R,OAAO9F,OACjChV,IAAgBpX,KAAKC,MAAMsgB,MAAM2R,OAAO9a,cACxClL,EAAkBlM,KAAKC,MAAMsgB,MAAM2R,OAAOhmB,gBAAkBioB,SAASn0B,KAAKC,MAAMsgB,MAAM2R,OAAOhmB,iBAAmB,KAChHogB,EAAU/iB,SAAS6qB,SACrB7qB,SAAS6qB,SAAS70B,cAAcojB,MAAM,KAAK,GAAGA,MAAM,KAAK,GAAGvE,OACzD7U,SAASyqB,SAASK,gBACjB9qB,SAASyqB,SAASK,gBAAgB,GAAG90B,cAAcojB,MAAM,KAAK,GAAGA,MAAM,KAAK,GAAGvE,OAAO,KACxFiO,EAAYrsB,KAAKC,MAAMsgB,MAAM2R,OAAO7F,UAE1CrsB,KAAKsG,MAAQ,CACXmF,YAAY,EACZmF,aAAa,EACbzB,iBAAkB,GAClB0a,cAAe,KACf+C,WAAW,EACXpJ,uBAAuB,EACvBhb,MAAOA,EACPykB,cAAeA,EACfviB,SAAU1K,KAAKC,MAAMsgB,MAAM2R,OAAOoC,aAAexB,KAAKC,MAAMwB,mBAAmBv0B,KAAKC,MAAMsgB,MAAM2R,OAAOoC,eAAiB,KACxH9iB,SAAUA,EACVhQ,WAAY,KACZytB,kBAAkB,EAClB7C,OAAQA,EACRhV,cAAeA,EACflL,gBAAiBA,EACjB2lB,qBAAqB,EACrB9F,UAAW,EACX7b,UAAU,EACVlB,WAAW,EACXwV,cAAc,EACdkP,qBAAsB,KACtBpF,iBAAkBA,EAClBsF,eAAe,EACf7oB,uBAAuB,EACvBshB,UAAWA,EACXC,OAAQA,EACRoF,wBAAwB,EACxBpT,mBAAoB,GACpB8R,gBAAiB,GACjBY,aAAc,KACdhL,aAAa,EACbqK,mBAAoB,GACpB9V,iBAAkB,EAElBiV,iBAAiB,EACjBK,iBAAkB,GAClB3I,wBAAwB,EACxBsN,mBAAoB,MACpBC,cAAe,KACfhC,gBAAiB,GACjBzgB,aAAc,GACdnC,iBAAkB,GAClB8D,uBAAwB,KACxBwD,kBAAiB,EACjBib,eAAc,GAIhB,MAAMsC,EAAkBv3B,IAEY,MAA9BA,EAAE0L,KAAK8rB,oBACT30B,KAAKoG,SAAS,CAACkoB,iBAAkBnxB,EAAE0L,KAAK8rB,sBAEI,MAAnCx3B,EAAE0L,KAAK+rB,0BAChB50B,KAAKoG,SAAS,CAAC2E,sBAAuB5N,EAAE0L,KAAK+rB,4BAIjD,IACM,qBAAsBjsB,OAExBA,OAAOksB,iBAAiB,UAAWH,GAE1B,gBAAiB/rB,QAE1BA,OAAOmsB,YAAY,UAAWJ,GAEhC,MAAOnqB,GACPC,QAAQiI,IAAIlI,IA+FhBoF,mBAAmBC,EAAWyD,GAC5B,GAAIA,EAAUof,kBAAoBzyB,KAAKsG,MAAMmsB,gBAAiB,CAC5D,MAAMsC,EAAwB,IAAI,IAAIC,IAAIh1B,KAAKsG,MAAMmsB,kBACjDsC,EAAsBttB,SAAWzH,KAAKsG,MAAMmsB,gBAAgBhrB,QAC9DzH,KAAKoG,SAAS,CAAEqsB,gBAAiBsC,IAIrC,GAAI1hB,EAAUxD,mBAAqB7P,KAAKsG,MAAMuJ,iBAAkB,CAC1D7P,KAAKsG,MAAMuJ,kBAAoB7P,KAAKsG,MAAMuJ,iBAAiBpI,OAAS,GACtEzH,KAAKoG,SAAS,CAAE+Q,kBAAkB,IACpC,MAAM8d,EAAyB,IAAI,IAAID,IAAIh1B,KAAKsG,MAAMuJ,mBAClDolB,EAAuBxtB,SAAWzH,KAAKsG,MAAMuJ,iBAAiBpI,QAChEzH,KAAKoG,SAAS,CAAEyJ,iBAAkBolB,IAIlC5hB,EAAU8T,cAAgBnnB,KAAKsG,MAAM6gB,aAAennB,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,WAC1G/E,KAAKwzB,sBAAsBxzB,KAAKsG,MAAM6gB,aAEnC9T,EAAU7R,aAAexB,KAAKsG,MAAM9E,YACvCxB,KAAKkuB,wBA63BRpK,mBAAmB9lB,EAAMwK,EAAO2Y,GAE5B,OAAOhZ,IACLC,MAAsEC,mHAAYC,qBAAuBC,EAAwBA,GAAyB,4BAA8BvI,KAAKsG,MAAM+lB,UAAY,CAACruB,SAChNyK,KAAKC,IACJ1I,KAAKgW,mBAAkB,GACvBhW,KAAKoG,SAASpG,KAAKsG,MAAM8Q,cAAgB,CAAC3L,YAAY,GAAS,CAACmF,aAAa,IAG7E5Q,KAAKoG,SAAUiN,IAAS,CACpBof,gBAAiB,IAAKpf,EAAUof,iBAAmB,GAAK/pB,EAASG,SAGrEsY,MAEDrY,MAAMC,IACL/I,KAAKiS,wBAAwBnT,EAAaZ,EAA4B8B,KAAKsG,MAAMoE,SAAW1K,KAAKsG,MAAMoE,SAASvM,aAAe,OAAO,6CACtI6B,KAAKgW,mBAAkB,GACvBhW,KAAKoG,SAASpG,KAAKsG,MAAM8Q,cAAgB,CAAC3L,YAAY,GAAS,CAACmF,aAAa,IAC7EuQ,MA6FRzhB,SAOE,OACEC,IAAAC,cAAA,OAAK7C,GAAI,iBAAkB0H,QAASzE,KAAKyf,iBAEtCzf,KAAKsG,MAAM9E,WACR7B,IAAAC,cAACiN,WAAQ,KACPlN,IAAAC,cAACs1B,KAAQ,CACLjd,aAAc,CAACC,SAAU,MAAOC,WAAY,SAC5C1L,IAAK,GAAG,CAACyL,SAAU,UAAU,CAACC,WAAY,WAC1CvP,KAAM5I,KAAKsG,MAAMotB,qBACjBrb,QAASA,KAAQrY,KAAKiS,wBAAwB,OAC9CkjB,iBAAkB,IAClB9zB,MAAO,CAACgL,IAAK,SAEf1M,IAAAC,cAACw1B,KAAQ,CAACC,UAAW,EAAG5xB,QAAQ,SAAS6xB,SAAS,QAAQjd,QAASA,KAAQrY,KAAKiS,wBAAwB,QACrGjS,KAAKsG,MAAMotB,uBAIhB/zB,IAAAC,cAACykB,GAAQ,CAAC3Z,SAAU1K,KAAKsG,MAAMoE,SACrB3C,WAAY/H,KAAK+H,WACjBvG,WAAYxB,KAAKsG,MAAM9E,WACvBgK,KAAMxL,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWgK,KACrDlK,MAAOtB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW6mB,aACtD1jB,gBAAiB3E,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW4mB,mBAChE3D,SAAUzkB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWijB,SACzDD,aAAcxkB,KAAKsG,MAAMke,aACzBF,mBAAoBtkB,KAAKskB,qBAGb,MAArBtkB,KAAKsG,MAAM8lB,QAAuD,OAArCpsB,KAAKsG,MAAM9E,WAAWyD,YAAuBjF,KAAKsG,MAAM9E,WAAWyD,aAAeC,EAAeH,UAC3HpF,IAAAC,cAAA,OAAK7C,GAAI,qBACL4C,IAAAC,cAAA,OAAK7C,GAAI,+BAAgCsE,MAAO,CAAC8C,QAASnE,KAAKC,MAAM8K,sBAAwB,OAAS,OACpGpL,IAAAC,cAAC8lB,GAAM,CAAEzgB,WAAYjF,KAAKsG,MAAM9E,WAAWyD,WAAYyF,SAAU1K,KAAKsG,MAAMoE,SAAUib,SAAW3lB,KAAKsG,MAAM9E,aAAexB,KAAKsG,MAAM9E,WAAW+zB,YACzI3P,OAAS5lB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWwJ,QAASmH,KAAMnS,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWmK,YACtHH,KAAMxL,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWgK,KACrDlK,MAAOtB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW6mB,aACtD1jB,gBAAiB3E,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW4mB,mBAChElD,aAAcllB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW0rB,uBACzDltB,KAAKsG,MAAM9E,WAAW0rB,uBAAuBtwB,IAAIq2B,GAAOA,EAAIvoB,UAAY,KAC5Ema,iBAAkB7kB,KAAK6kB,iBAAkBgB,kBAAoB7lB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWqkB,kBAC3GC,eAAgB9lB,KAAKsG,MAAM9E,WAAWskB,eAAiBE,YAAchmB,KAAKsG,MAAM0f,YAAcD,kBAAoB/lB,KAAK+lB,kBAAmBK,aAAepmB,KAAKomB,aAAe9B,mBAAoBtkB,KAAKskB,mBAAoBvZ,sBAAuB/K,KAAKsG,MAAMyE,yBAGvQ/K,KAAKsG,MAAM9E,WAAW+hB,cAiEpB5jB,IAAAC,cAAAD,IAAAkN,SAAA,KACAlN,IAAAC,cAACsf,GAAS,CACN4E,mBAAoBA,CAAC9lB,EAAMmjB,IAAanhB,KAAK8jB,mBAAmB9lB,EAAMgC,KAAKsG,MAAM+lB,UAAWlL,GAC5F/B,4BAA8BzhB,GAASqC,KAAKmzB,sBAAsBx1B,GAClEqiB,sBAAwBxO,GAAaxR,KAAKozB,gBAAgB5hB,GAC1D8M,mBAAoBte,KAAKsG,MAAMgY,mBAC/B7S,WAAYzL,KAAKsG,MAAMmF,WACvBmF,YAAa5Q,KAAKsG,MAAMsK,YACxBpP,WAAYxB,KAAKsG,MAAM9E,WACvBkJ,SAAU1K,KAAKsG,MAAMoE,SACrBgC,YAAa1M,KAAK0M,YAClB3E,WAAY/H,KAAK+H,WACjByS,YAAaxa,KAAKwa,YAClBD,gBAAiBva,KAAKsG,MAAM9E,YAAoD,GAAtCxB,KAAKsG,MAAM9E,WAAWg0B,cAAqBx1B,KAAKsG,MAAMiU,gBAChGiJ,sBAAuBxjB,KAAKsG,MAAMkd,sBAClCxN,kBAAmBhW,KAAKgW,kBACxBoB,cAAepX,KAAKsG,MAAM8Q,cAC1BlL,gBAAiBlM,KAAKsG,MAAM4F,gBAC5B+F,wBAAyBjS,KAAKiS,wBAC9BwN,gBAAiBzf,KAAKyf,gBACtBiB,oBAAqB1gB,KAAK0gB,oBAC1B5C,wBAAyBA,IAAM9d,KAAK8d,0BACpCwE,WAAatiB,KAAKsG,MAAM9E,WAAW8gB,WACnCjL,cAAgBrX,KAAKsG,MAAM9E,WAAW6V,cACtCE,aAAevX,KAAKsG,MAAM9E,WAAW+V,aACrCnS,QAASpF,KAAKsG,MAAMupB,iBACpBza,2BAA4BpV,KAAKoV,2BACjC2K,kBAAmB/f,KAAK+f,kBACxB5I,iBAAkBnX,KAAKsG,MAAM6Q,iBAC7B7B,0BAA4BsO,GAAS5jB,KAAKsV,0BAA0BsO,GACpEzU,iBAAkBnP,KAAKsG,MAAM6I,mBAKjCxP,IAAAC,cAAC0mB,GAAkB,CACf9d,MAAOxI,KAAKsG,MAAMkC,MAClB0H,SAAUlQ,KAAKsG,MAAM4J,SACrBlB,UAAWhP,KAAKsG,MAAM0I,UACtBL,qBAAsB3O,KAAK2O,qBAC3BQ,iBAAkBnP,KAAKsG,MAAM6I,iBAC7B1D,WAAYzL,KAAKsG,MAAMmF,WACvBmF,YAAa5Q,KAAKsG,MAAMsK,YACxBpP,WAAYxB,KAAKsG,MAAM9E,WACvBkL,YAAa1M,KAAK0M,YAClB3E,WAAY/H,KAAK+H,WACjBgD,sBAAuB/K,KAAKsG,MAAMyE,sBAClCnE,yBAA0B5G,KAAK4G,yBAC/BF,cAAoC,MAArB1G,KAAKsG,MAAM8lB,OAC1B1hB,SAAU1K,KAAKsG,MAAMoE,SACrBmc,gBAAiB7mB,KAAK2mB,oBACtBqF,uBAAwBhsB,KAAKgsB,uBAC7Bjc,IAAK/P,KAAKwyB,kBACV9L,oBAAqB1mB,KAAK0mB,oBAC1BS,YAAannB,KAAKsG,MAAM6gB,YACxBD,uBAAwBlnB,KAAKsG,MAAM4gB,uBACnC5R,0BAA4BsO,GAAS5jB,KAAKsV,0BAA0BsO,MAxHpEjkB,IAAAC,cAAAD,IAAAkN,SAAA,KACAlN,IAAAC,cAAC0mB,GAAkB,CACf9d,MAAOxI,KAAKsG,MAAMkC,MAClB0H,SAAUlQ,KAAKsG,MAAM4J,SACrBlB,UAAWhP,KAAKsG,MAAM0I,UACtBL,qBAAsB3O,KAAK2O,qBAC3BQ,iBAAkBnP,KAAKsG,MAAM6I,iBAC7B1D,WAAYzL,KAAKsG,MAAMmF,WACvBmF,YAAa5Q,KAAKsG,MAAMsK,YACxBpP,WAAYxB,KAAKsG,MAAM9E,WACvBkL,YAAa1M,KAAK0M,YAClB3E,WAAY/H,KAAK+H,WACjBgD,sBAAuB/K,KAAKsG,MAAMyE,sBAClCnE,yBAA0B5G,KAAK4G,yBAC/BF,cAAoC,MAArB1G,KAAKsG,MAAM8lB,OAC1B1hB,SAAU1K,KAAKsG,MAAMoE,SACrBmc,gBAAiB7mB,KAAK2mB,oBACtBqF,uBAAwBhsB,KAAKgsB,uBAC7Bjc,IAAK/P,KAAKwyB,kBACV9L,oBAAqB1mB,KAAK0mB,oBAC1BS,YAAannB,KAAKsG,MAAM6gB,YACxBjC,aAAcllB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW0rB,uBACzDltB,KAAKsG,MAAM9E,WAAW0rB,uBAAuBtwB,IAAIq2B,GAAOA,EAAIvoB,UAAY,KAC5Ema,iBAAkB7kB,KAAK6kB,iBACvBqC,uBAAwBlnB,KAAKsG,MAAM4gB,uBACnC5R,0BAA4BsO,GAAS5jB,KAAKsV,0BAA0BsO,KACtE,KAAEjkB,IAAAC,cAACsf,GAAS,CACV4E,mBAAoBA,CAAC9lB,EAAMmjB,IACvBnhB,KAAK8jB,mBAAmB9lB,EAAMgC,KAAKsG,MAAMkC,MAAO2Y,GAEpD/B,4BAA8BzhB,GAASqC,KAAKmzB,sBAAsBx1B,GAClEqiB,sBAAwBxO,GAAaxR,KAAKozB,gBAAgB5hB,GAC1D8M,mBAAoBte,KAAKsG,MAAMgY,mBAC/B7S,WAAYzL,KAAKsG,MAAMmF,WACvBmF,YAAa5Q,KAAKsG,MAAMsK,YACxBpP,WAAYxB,KAAKsG,MAAM9E,WACvBkJ,SAAU1K,KAAKsG,MAAMoE,SACrBgC,YAAa1M,KAAK0M,YAClByC,iBAAoBnP,KAAKsG,MAAM6I,iBAC/BpH,WAAY/H,KAAK+H,WACjByS,YAAaxa,KAAKwa,YAClBD,gBACIva,KAAKsG,MAAM9E,YAC4B,IAAvCxB,KAAKsG,MAAM9E,WAAWg0B,cACtBx1B,KAAKsG,MAAMiU,gBAEfiJ,sBAAuBxjB,KAAKsG,MAAMkd,sBAClCxN,kBAAmBhW,KAAKgW,kBACxBoB,cAAepX,KAAKsG,MAAM8Q,cAC1BlL,gBAAiBlM,KAAKsG,MAAM4F,gBAC5B+F,wBAAyBjS,KAAKiS,wBAC9BwN,gBAAiBzf,KAAKyf,gBACtBiB,oBAAqB1gB,KAAK0gB,oBAC1B5C,wBAAyBA,IAAM9d,KAAK8d,0BACpCwE,WAAYtiB,KAAKsG,MAAM9E,WAAW8gB,WAClCjL,cAAerX,KAAKsG,MAAM9E,WAAW6V,cACrCE,aAAcvX,KAAKsG,MAAM9E,WAAW+V,aACpCnS,QAASpF,KAAKsG,MAAMupB,iBACpBza,2BAA4BpV,KAAKoV,2BACjC2K,kBAAmB/f,KAAK+f,kBACxBzK,0BAA4BsO,GAAS5jB,KAAKsV,0BAA0BsO,OAmElFjkB,IAAAC,cAAA,OAAK7C,GAAI,kBAAmBsE,MAAOrB,KAAKC,MAAMyG,cAhL5B,CAC9BnE,MAAO,OACPuI,SAAU,QA8K0F,MAElE,MAArB9K,KAAKsG,MAAM8lB,OACRzsB,IAAAC,cAACiN,WAAQ,KACLlN,IAAAC,cAAA,OAAK7C,GAAI,gBAAiBsE,MAAO,CAACo0B,QAASz1B,KAAKC,MAAM8K,sBAAwB,MAAQ,QAEtFpL,IAAAC,cAAA,OAAK7C,GAAI,oBAAqBsE,MAAO,CAAC8C,QAASnE,KAAKC,MAAM8K,sBAAwB,OAAS,OACvFpL,IAAAC,cAAC8lB,GAAM,CAAChb,SAAU1K,KAAKsG,MAAMoE,SAAUib,SAAW3lB,KAAKsG,MAAM9E,aAAexB,KAAKsG,MAAM9E,WAAW+zB,YACjF3P,OAAS5lB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWwJ,QAASmH,KAAMnS,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWmK,YACtHH,KAAMxL,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWgK,KACrDlK,MAAOtB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW6mB,aACtD1jB,gBAAiB3E,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW4mB,mBAChElD,aAAcllB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAW0rB,uBACzDltB,KAAKsG,MAAM9E,WAAW0rB,uBAAuBtwB,IAAIq2B,GAAOA,EAAIvoB,UAAY,KAC5Ema,iBAAkB7kB,KAAK6kB,iBAAkBgB,kBAAoB7lB,KAAKsG,MAAM9E,YAAcxB,KAAKsG,MAAM9E,WAAWqkB,kBACrHC,eAAgB9lB,KAAKsG,MAAM9E,WAAWskB,eAAiBE,YAAchmB,KAAKsG,MAAM0f,YAAcD,kBAAoB/lB,KAAK+lB,kBAAmBK,aAAepmB,KAAKomB,aAAe9B,mBAAoBtkB,KAAKskB,mBAAoBvZ,sBAAuB/K,KAAKsG,MAAMyE,0BAI1Q,KAGNpL,IAAAC,cAACwN,GAAgB,CAAC5E,MAAOxI,KAAKsG,MAAMkC,MAClB0H,SAAUlQ,KAAKsG,MAAM4J,SACrBlB,UAAWhP,KAAKsG,MAAM0I,UACtBL,qBAAsB3O,KAAK2O,qBAC3BQ,iBAAkBnP,KAAKsG,MAAM6I,iBAC7B1D,WAAYzL,KAAKsG,MAAMmF,WACvBmF,YAAa5Q,KAAKsG,MAAMsK,YACxBpP,WAAYxB,KAAKsG,MAAM9E,WACvBkL,YAAa1M,KAAK0M,YAClB3E,WAAY/H,KAAK+H,WACjBgD,sBAAuB/K,KAAKsG,MAAMyE,sBAClCnE,yBAA0B5G,KAAK4G,yBAC/BF,cAAoC,MAArB1G,KAAKsG,MAAM8lB,OAC1B1hB,SAAU1K,KAAKsG,MAAMoE,SACrB+nB,gBAAiBzyB,KAAKsG,MAAMmsB,gBAC5B5iB,iBAAkB7P,KAAKsG,MAAMuJ,mBAGzB,MAArB7P,KAAKsG,MAAM8lB,SAA+C,IAA7BpsB,KAAKsG,MAAM8Q,cACrCzX,IAAAC,cAACsf,GAAS,CACN4E,mBAAoBA,CAAC9lB,EAAMmjB,IAAanhB,KAAK8jB,mBAAmB9lB,EAAMgC,KAAKsG,MAAM+lB,UAAWlL,GAC5F/B,4BAA8BzhB,GAASqC,KAAKmzB,sBAAsBx1B,GAClEqiB,sBAAwBxO,GAAaxR,KAAKozB,gBAAgB5hB,GAC1D8M,mBAAoBte,KAAKsG,MAAMgY,mBAC/B7S,WAAYzL,KAAKsG,MAAMmF,WACvBmF,YAAa5Q,KAAKsG,MAAMsK,YACxBpP,WAAYxB,KAAKsG,MAAM9E,WACvBkJ,SAAU1K,KAAKsG,MAAMoE,SACrBgC,YAAa1M,KAAK0M,YAClB3E,WAAY/H,KAAK+H,WACjByS,YAAaxa,KAAKwa,YAClBD,gBAAiBva,KAAKsG,MAAMiU,gBAC5BiJ,sBAAuBxjB,KAAKsG,MAAMkd,sBAClCxN,kBAAmBhW,KAAKgW,kBACxBoB,cAAepX,KAAKsG,MAAM8Q,cAC1BlL,gBAAiBlM,KAAKsG,MAAM4F,gBAC5B+F,wBAAyBjS,KAAKiS,wBAC9BwN,gBAAiBzf,KAAKyf,gBACtBiB,oBAAqB1gB,KAAK0gB,oBAC1B5C,wBAAyBA,IAAM9d,KAAK8d,0BACpCwE,WAAatiB,KAAKsG,MAAM9E,WAAW8gB,WACnCjL,cAAgBrX,KAAKsG,MAAM9E,WAAW6V,cACtCE,aAAevX,KAAKsG,MAAM9E,WAAW+V,aACrCkb,gBAAiBzyB,KAAKsG,MAAMmsB,gBAC5Bnf,uBAAyBnB,GAASnS,KAAKsT,uBAAuBnB,GAC9D4R,yBAA0BA,IAAM/jB,KAAK+jB,2BACrClU,iBAAkB7P,KAAKsG,MAAMuJ,iBAC7BuT,yBAA2Bla,GAAUlJ,KAAKojB,yBAAyBla,GACnEyK,uBAAwB3T,KAAKsG,MAAMqN,uBACnCG,8BAA+B9T,KAAK8T,8BACpC+f,kBAAmB7zB,KAAK6zB,kBACxBtgB,sBAAwByQ,GAAShkB,KAAKuT,sBAAsByQ,GAC5DC,kBAAmBjkB,KAAKikB,kBACxBjS,aAAchS,KAAKsG,MAAM0L,aACzByR,gBAAiBzjB,KAAKyjB,gBACtBtM,iBAAkBnX,KAAKsG,MAAM6Q,iBAC7B0J,yBAA0B7gB,KAAK6gB,yBAC/B1R,iBAAkBnP,KAAKsG,MAAM6I,mBAG/B,OAMZxP,IAAAC,cAAA,OAAK7C,GAAI,0BACP4C,IAAAC,cAAC81B,KAAgB,SAShBhM,UCp+Cf,MAAMiM,WAAYl2B,YAChBC,SACE,OACEC,IAAAC,cAACg2B,IAAa,KACZj2B,IAAAC,cAACi2B,IAAM,KACLl2B,IAAAC,cAACk2B,IAAK,CAACC,OAAK,EAACC,KAAM,2EAA4EtyB,UAAWgmB,KAC1G/pB,IAAAC,cAACk2B,IAAK,CAACE,KAAM,sCAAuCtyB,UAAWgmB,QAO1DiM,UCdfM,IAASv2B,OAAOC,IAAAC,cAAC+1B,GAAG,MAAKpsB,SAASioB,eAAe,W","file":"static/js/main.dc5dd9ab.chunk.js","sourcesContent":["var map = {\n\t\"./ad.svg\": 387,\n\t\"./ae.svg\": 388,\n\t\"./af.svg\": 389,\n\t\"./ag.svg\": 390,\n\t\"./ai.svg\": 391,\n\t\"./al.svg\": 392,\n\t\"./am.svg\": 393,\n\t\"./ao.svg\": 394,\n\t\"./ar.svg\": 395,\n\t\"./as.svg\": 396,\n\t\"./at.svg\": 397,\n\t\"./au.svg\": 398,\n\t\"./aw.svg\": 399,\n\t\"./az.svg\": 400,\n\t\"./ba.svg\": 401,\n\t\"./bb.svg\": 402,\n\t\"./bd.svg\": 403,\n\t\"./be.svg\": 404,\n\t\"./bf.svg\": 405,\n\t\"./bg.svg\": 406,\n\t\"./bh.svg\": 407,\n\t\"./bi.svg\": 408,\n\t\"./bj.svg\": 409,\n\t\"./bm.svg\": 410,\n\t\"./bo.svg\": 411,\n\t\"./br.svg\": 412,\n\t\"./bs.svg\": 413,\n\t\"./bt.svg\": 414,\n\t\"./bw.svg\": 415,\n\t\"./by.svg\": 416,\n\t\"./bz.svg\": 417,\n\t\"./ca.svg\": 418,\n\t\"./cd.svg\": 419,\n\t\"./cf.svg\": 420,\n\t\"./cg.svg\": 421,\n\t\"./ch.svg\": 422,\n\t\"./ci.svg\": 423,\n\t\"./ck.svg\": 424,\n\t\"./cl.svg\": 425,\n\t\"./cm.svg\": 426,\n\t\"./cn.svg\": 427,\n\t\"./co.svg\": 428,\n\t\"./cr.svg\": 429,\n\t\"./cu.svg\": 430,\n\t\"./cv.svg\": 431,\n\t\"./cw.svg\": 432,\n\t\"./cy.svg\": 433,\n\t\"./cz.svg\": 434,\n\t\"./de.svg\": 435,\n\t\"./dj.svg\": 436,\n\t\"./dk.svg\": 437,\n\t\"./dm.svg\": 438,\n\t\"./do.svg\": 439,\n\t\"./dz.svg\": 440,\n\t\"./ec.svg\": 441,\n\t\"./ee.svg\": 442,\n\t\"./eg.svg\": 443,\n\t\"./er.svg\": 444,\n\t\"./es.svg\": 445,\n\t\"./et.svg\": 446,\n\t\"./fi.svg\": 447,\n\t\"./fj.svg\": 448,\n\t\"./fk.svg\": 449,\n\t\"./fm.svg\": 450,\n\t\"./fo.svg\": 451,\n\t\"./fr.svg\": 452,\n\t\"./ga.svg\": 453,\n\t\"./gb.svg\": 454,\n\t\"./gd.svg\": 455,\n\t\"./ge.svg\": 456,\n\t\"./gg.svg\": 457,\n\t\"./gh.svg\": 458,\n\t\"./gi.svg\": 459,\n\t\"./gl.svg\": 460,\n\t\"./gm.svg\": 461,\n\t\"./gn.svg\": 462,\n\t\"./gq.svg\": 463,\n\t\"./gr.svg\": 464,\n\t\"./gt.svg\": 465,\n\t\"./gu.svg\": 466,\n\t\"./gw.svg\": 467,\n\t\"./hk.svg\": 468,\n\t\"./hn.svg\": 469,\n\t\"./hr.svg\": 470,\n\t\"./ht.svg\": 471,\n\t\"./hu.svg\": 472,\n\t\"./id.svg\": 473,\n\t\"./ie.svg\": 474,\n\t\"./il.svg\": 475,\n\t\"./im.svg\": 476,\n\t\"./in.svg\": 477,\n\t\"./io.svg\": 478,\n\t\"./iq.svg\": 479,\n\t\"./ir.svg\": 480,\n\t\"./is.svg\": 481,\n\t\"./it.svg\": 482,\n\t\"./je.svg\": 483,\n\t\"./jm.svg\": 484,\n\t\"./jo.svg\": 485,\n\t\"./jp.svg\": 486,\n\t\"./ke.svg\": 487,\n\t\"./kg.svg\": 488,\n\t\"./kh.svg\": 489,\n\t\"./ki.svg\": 490,\n\t\"./km.svg\": 491,\n\t\"./kn.svg\": 492,\n\t\"./kp.svg\": 493,\n\t\"./kr.svg\": 494,\n\t\"./kw.svg\": 495,\n\t\"./ky.svg\": 496,\n\t\"./kz.svg\": 497,\n\t\"./la.svg\": 498,\n\t\"./lb.svg\": 499,\n\t\"./li.svg\": 500,\n\t\"./lk.svg\": 501,\n\t\"./lr.svg\": 502,\n\t\"./ls.svg\": 503,\n\t\"./lt.svg\": 504,\n\t\"./lu.svg\": 505,\n\t\"./lv.svg\": 506,\n\t\"./ly.svg\": 507,\n\t\"./ma.svg\": 508,\n\t\"./mc.svg\": 509,\n\t\"./md.svg\": 510,\n\t\"./me.svg\": 511,\n\t\"./mg.svg\": 512,\n\t\"./mh.svg\": 513,\n\t\"./mk.svg\": 514,\n\t\"./ml.svg\": 515,\n\t\"./mm.svg\": 516,\n\t\"./mn.svg\": 517,\n\t\"./mo.svg\": 518,\n\t\"./mp.svg\": 519,\n\t\"./mq.svg\": 520,\n\t\"./mr.svg\": 521,\n\t\"./ms.svg\": 522,\n\t\"./mt.svg\": 523,\n\t\"./mu.svg\": 524,\n\t\"./mv.svg\": 525,\n\t\"./mw.svg\": 526,\n\t\"./mx.svg\": 527,\n\t\"./my.svg\": 528,\n\t\"./mz.svg\": 529,\n\t\"./na.svg\": 530,\n\t\"./nato.svg\": 531,\n\t\"./ne.svg\": 532,\n\t\"./nf.svg\": 533,\n\t\"./ng.svg\": 534,\n\t\"./ni.svg\": 535,\n\t\"./nl.svg\": 536,\n\t\"./no.svg\": 537,\n\t\"./np.svg\": 538,\n\t\"./nr.svg\": 539,\n\t\"./nu.svg\": 540,\n\t\"./nz.svg\": 541,\n\t\"./om.svg\": 542,\n\t\"./pa.svg\": 543,\n\t\"./pe.svg\": 544,\n\t\"./pf.svg\": 545,\n\t\"./pg.svg\": 546,\n\t\"./ph.svg\": 547,\n\t\"./pk.svg\": 548,\n\t\"./pl.svg\": 549,\n\t\"./pn.svg\": 550,\n\t\"./pr.svg\": 551,\n\t\"./ps.svg\": 552,\n\t\"./pt.svg\": 553,\n\t\"./pw.svg\": 554,\n\t\"./py.svg\": 555,\n\t\"./qa.svg\": 556,\n\t\"./ro.svg\": 557,\n\t\"./rs.svg\": 558,\n\t\"./ru.svg\": 559,\n\t\"./rw.svg\": 560,\n\t\"./sa.svg\": 561,\n\t\"./sb.svg\": 562,\n\t\"./sc.svg\": 563,\n\t\"./sd.svg\": 564,\n\t\"./se.svg\": 565,\n\t\"./sg.svg\": 566,\n\t\"./si.svg\": 567,\n\t\"./sk.svg\": 568,\n\t\"./sl.svg\": 569,\n\t\"./sm.svg\": 570,\n\t\"./sn.svg\": 571,\n\t\"./so.svg\": 572,\n\t\"./sr.svg\": 573,\n\t\"./ss.svg\": 574,\n\t\"./st.svg\": 575,\n\t\"./sv.svg\": 576,\n\t\"./sx.svg\": 577,\n\t\"./sy.svg\": 578,\n\t\"./sz.svg\": 579,\n\t\"./tc.svg\": 580,\n\t\"./td.svg\": 581,\n\t\"./tg.svg\": 582,\n\t\"./th.svg\": 583,\n\t\"./tibet.svg\": 584,\n\t\"./tj.svg\": 585,\n\t\"./tk.svg\": 586,\n\t\"./tm.svg\": 587,\n\t\"./tn.svg\": 588,\n\t\"./to.svg\": 589,\n\t\"./tr.svg\": 590,\n\t\"./tt.svg\": 591,\n\t\"./tv.svg\": 592,\n\t\"./tw.svg\": 593,\n\t\"./tz.svg\": 594,\n\t\"./ua.svg\": 595,\n\t\"./ug.svg\": 596,\n\t\"./us.svg\": 597,\n\t\"./uy.svg\": 598,\n\t\"./uz.svg\": 599,\n\t\"./ve.svg\": 600,\n\t\"./vi.svg\": 601,\n\t\"./vn.svg\": 602,\n\t\"./vu.svg\": 603,\n\t\"./ws.svg\": 604,\n\t\"./ye.svg\": 605,\n\t\"./za.svg\": 606,\n\t\"./zm.svg\": 607,\n\t\"./zw.svg\": 608\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 211;","export default {\r\n apiEndpointDev: 'https://inchatbotapi.eu.ngrok.io/api/',\r\n apiEndpointTest: 'https://testapi.indialog.ai/api/',\r\n apiEndpointProd: 'https://api.indialog.ai/api/',\r\n signalrConnectionRetryInterval: 1000,\r\n imageChunkSize: 10240,\r\n messageLoadCount: 15,\r\n logoUrl: 'https://mediastore.inchatbot.com/17427bef-5404-4502-b9e6-3b0da1187624/Avatar/logo.png',\r\n uploadFileSizeLimit: 15728640 // 15 MB\r\n}\r\n","/**\r\n * MessageType enum constant.\r\n */\r\nexport default {\r\n text: 0,\r\n link: 1,\r\n image: 2,\r\n video: 3,\r\n card: 4,\r\n file:5\r\n}","export default {\r\n 'chatInput.connectionProblems': 'Problem with the internet connection.',\r\n 'chatInput.reconnecting': 'Reconnecting...',\r\n 'chatInput.chatAttachment.uploadFileError': 'An error occurred when sending the file!',\r\n 'chatInput.chatAttachment.fileSizeError': 'It is not possible to upload files larger than 15 MB!',\r\n 'chatInput.chatAttachment.maxFilesError': 'It is not possible to upload more than 5 files at once',\r\n 'chatInput.chatAttachment.sameFileError': 'It is not possible to upload the same file again!',\r\n 'chatInput.autoComplete.edit': 'Edit answer',\r\n 'chatInput.autoComplete.send': 'Send intent',\r\n 'chatInputField.chatInputPlaceholder': 'Ask me something...',\r\n 'chatInputField.chatInputPlaceholderAgentMode': 'Write here to the user...',\r\n 'chatInputField.chatInputPlaceholderFileUploadMode': 'Write what should be done with the content of the file.',\r\n 'chatInputField.suggestionInputPlaceholder': 'Choose one of the options...',\r\n 'speechBubble.dateTime.today' : 'Today',\r\n 'speechBubble.dateTime.at' : 'at',\r\n 'infoPage.privacyPolicyLinkText': 'Privacy policy',\r\n 'infoPage.goBackButtonText': 'Back',\r\n \"chatInput..title.send\": \"Send message\",\r\n \"topBar.title.help\": \"Info\",\r\n \"topBar.title.mini\": \"Minimize/Maximize\",\r\n \"topBar.title.close\": \"Close chat\"\r\n}\r\n","import da from './da';\r\nimport en from './en';\r\nimport de from './de';\r\n\r\nexport default {\r\n 'da-DK': da,\r\n 'en': en,\r\n 'en-US': en,\r\n 'de-DE': de,\r\n 'default': en\r\n}\r\n","export default {\r\n 'chatInput.connectionProblems': 'Problemer med internetforbindelsen.',\r\n 'chatInput.reconnecting': 'Genopretter forbindelsen...',\r\n 'chatInput.chatAttachment.uploadFileError': 'Der opstod en fejl da filen skulle sendes!',\r\n 'chatInput.chatAttachment.fileSizeError': 'Det er ikke muligt at uploade filer større end 15 MB!',\r\n 'chatInput.chatAttachment.maxFilesError': 'Det er ikke muligt at uploade mere end 5 filer på én gang',\r\n 'chatInput.chatAttachment.sameFileError': 'Det er ikke muligt at uploade den samme fil igen!',\r\n 'chatInput.autoComplete.edit': 'Rediger svar',\r\n 'chatInput.autoComplete.send': 'Send intent',\r\n 'chatInputField.chatInputPlaceholder': 'Spørg mig om noget...',\r\n 'chatInputField.chatInputPlaceholderAgentMode': 'Skriv her til brugeren...',\r\n 'chatInputField.chatInputPlaceholderFileUploadMode': 'Skriv, hvad der skal gøres med indholdet af filen.',\r\n 'chatInputField.suggestionInputPlaceholder': 'Tryk på en af valgmulighederne...',\r\n 'speechBubble.dateTime.today' : 'I dag',\r\n 'speechBubble.dateTime.at' : 'kl.',\r\n 'infoPage.privacyPolicyLinkText': 'Privatlivs politik',\r\n 'infoPage.goBackButtonText': 'Tilbage',\r\n 'chatInput..title.send': 'Send besked',\r\n 'topBar.title.help': 'Info',\r\n 'topBar.title.mini': 'Minimere/Maksimere',\r\n 'topBar.title.close': 'Luk chat',\r\n}\r\n","export default {\r\n 'chatInput.connectionProblems': 'Problem mit der Internetverbindung.',\r\n 'chatInput.reconnecting': 'Wiederverbindung ...',\r\n 'chatInput.chatAttachment.uploadFileError': 'Beim senden der datei ist ein fehler aufgetreten!',\r\n 'chatInput.chatAttachment.fileSizeError': 'Es ist nicht möglich, dateien mit mehr als 15 MB hochzuladen!',\r\n 'chatInput.chatAttachment.maxFilesError': 'Es ist nicht möglich, mehr als 5 Dateien gleichzeitig hochzuladen',\r\n 'chatInput.chatAttachment.sameFileError': 'Es ist nicht möglich, dieselbe datei erneut hochzuladen!',\r\n 'chatInput.autoComplete.edit': 'Antwort bearbeiten',\r\n 'chatInput.autoComplete.send': 'Senden sie intent',\r\n 'chatInputField.chatInputPlaceholder': 'Frag mich etwas...',\r\n 'chatInputField.chatInputPlaceholderAgentMode': 'Schreiben Sie hier an den Benutzer ...',\r\n 'chatInputField.chatInputPlaceholderFileUploadMode': 'Schreiben Sie, was mit dem Inhalt der Datei gemacht werden soll.',\r\n 'chatInputField.suggestionInputPlaceholder': 'Wählen Sie eine der Optionen ...',\r\n 'speechBubble.dateTime.today' : 'Heute',\r\n 'speechBubble.dateTime.at' : 'um',\r\n 'infoPage.privacyPolicyLinkText': 'Datenschutz-Bestimmungen',\r\n 'infoPage.goBackButtonText': 'Zurück',\r\n \"chatInput..title.send\": \"Nachricht senden\",\r\n \"topBar.title.help\": \"Info\",\r\n \"topBar.title.mini\": \"Minimieren/Maximieren\",\r\n \"topBar.title.close\": \"Chat schließen\"\r\n}\r\n","import localization from '../config/localization/Localization';\r\n\r\nfunction isLanguageSupported(languageCode){\r\n if(languageCode == null){\r\n return false\r\n }\r\n return Object.keys(localization).includes(languageCode)\r\n}\r\n\r\nexport function getLocalizationLanguageCode(languageCode){\r\n if(isLanguageSupported(languageCode)){\r\n return languageCode\r\n } else {\r\n return 'default'\r\n }\r\n}","import Localization from \"../config/localization/Localization\";\r\n\r\nexport function debounce(callback, wait) {\r\n let timeout = null\r\n let initialCall = true\r\n\r\n return function() {\r\n\r\n const next = () => {\r\n callback.apply(this, arguments)\r\n timeout = null\r\n }\r\n\r\n if(initialCall){\r\n initialCall = false\r\n next()\r\n }\r\n\r\n clearTimeout(timeout)\r\n timeout = setTimeout(next, wait)\r\n }\r\n}\r\n\r\nexport function removeHtmlTagsFromString(string){\r\n let strippedString = string.replace(/(<([^>]+)>)/gi, \"\");\r\n const tagsRegEx = /&(nbsp|amp|quot|lt|gt);/g;\r\n const translate = {\r\n \"nbsp\": \"\",\r\n \"amp\" : \"&\",\r\n \"quot\": \"\\\"\",\r\n \"lt\" : \"<\",\r\n \"gt\" : \">\"\r\n };\r\n strippedString = strippedString.replace(tagsRegEx, (match, entity) => {\r\n return translate[entity]\r\n })\r\n return strippedString;\r\n}\r\n\r\nexport function getLocaleDateTimeString(dateTimeUtc, lowerCase, localizationCode){\r\n if (!dateTimeUtc) {\r\n return null;\r\n }\r\n\r\n const dateTime = new Date(dateTimeUtc);\r\n const todayString = Localization[localizationCode]['speechBubble.dateTime.today'];\r\n const atString = Localization[localizationCode]['speechBubble.dateTime.at'];\r\n\r\n let result = null;\r\n\r\n // Check if its the same day\r\n if ((new Date()).toLocaleDateString() === dateTime.toLocaleDateString()) {\r\n result = todayString;\r\n } else {\r\n result = dateTime.toLocaleDateString();\r\n }\r\n\r\n result = result + ' ' + atString + ' ' + dateTime\r\n .toLocaleTimeString([], {hour: '2-digit', minute: '2-digit', hour12: false})\r\n .replace('AM', '')\r\n .replace('PM', '');\r\n\r\n if (lowerCase) {\r\n result = result.toLowerCase();\r\n }\r\n\r\n return result;\r\n};\r\n","import React, { Component } from 'react';\r\n\r\nimport '../../../../../chat.css';\r\n\r\n/**\r\n * A message type that shows a html encoded text message.\r\n */\r\nclass TextMessage extends Component {\r\n render() {\r\n return(\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default TextMessage;\r\n","import React, { Component } from 'react';\r\n\r\nimport '../../../../../chat.css';\r\nimport {\r\n Magnifier,\r\n GlassMagnifier,\r\n SideBySideMagnifier,\r\n PictureInPictureMagnifier,\r\n MOUSE_ACTIVATION,\r\n TOUCH_ACTIVATION\r\n} from \"react-image-magnifiers\";\r\n/**\r\n * A message type that shows an image.\r\n */\r\nclass ImageMessage extends Component {\r\n render() {\r\n return(\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ImageMessage;\r\n","import React, { Component } from 'react';\r\nimport LinkIcon from '@material-ui/icons/TransitEnterexit';\r\n\r\nimport '../../../../../chat.css';\r\n\r\n/**\r\n * A message type that shows a link box.\r\n */\r\nclass LinkMessage extends Component {\r\n render() {\r\n return(\r\n
\r\n \r\n
\r\n {this.props.title}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default LinkMessage;\r\n","import React, { Component } from 'react';\r\nimport ReactPlayer from 'react-player';\r\n\r\nimport '../../../../../chat.css';\r\n\r\n/**\r\n * A message type that shows a video.\r\n * Uses the ReactPlayer component. \r\n * https://github.com/CookPete/react-player\r\n */\r\nclass VideoMessage extends Component {\r\n render() {\r\n return(\r\n
\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default VideoMessage;\r\n","import React, { Component } from 'react';\r\nimport withStyles from \"@material-ui/core/styles/withStyles\";\r\nimport Card from '@material-ui/core/Card';\r\nimport CardActionArea from '@material-ui/core/CardActionArea';\r\nimport CardActions from '@material-ui/core/CardActions';\r\nimport CardContent from '@material-ui/core/CardContent';\r\nimport CardMedia from '@material-ui/core/CardMedia';\r\nimport Button from '@material-ui/core/Button';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nimport '../../../../../chat.css';\r\n\r\nconst styles = () => ({\r\n cardmedia: {\r\n height: 140,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'flex-end'\r\n },\r\n image: {\r\n height: 140,\r\n width: 'inherit'\r\n },\r\n title: {\r\n fontSize: '1rem'\r\n },\r\n cardContenttxt: {\r\n paddingBottom: 0,\r\n },\r\n cardContent: {\r\n paddingBottom: 0,\r\n\r\n }\r\n});\r\n\r\n/**\r\n * A message type that shows a card.\r\n */\r\nclass CardMessage extends Component {\r\n render() {\r\n const { classes } = this.props;\r\n return(\r\n \r\n \r\n \r\n {'image'}/\r\n \r\n \r\n \r\n {this.props.title}\r\n \r\n \r\n {this.props.subtitle}\r\n \r\n \r\n
\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default withStyles(styles)(CardMessage);\r\n","import React, { Component } from 'react';\r\nimport LinkIcon from '@material-ui/icons/TransitEnterexit';\r\n\r\nimport '../../../../../chat.css';\r\n\r\n/**\r\n * A message type that shows a link box.\r\n */\r\nclass FileMessage extends Component {\r\n render() {\r\n return(\r\n
\r\n this.props.downloadFile(this.props.url)} >\r\n
\r\n\r\n {this.props.title}\r\n \r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default FileMessage;\r\n","export default {\r\n chatBot: 0,\r\n searchBot: 1\r\n}","import React, { Component } from 'react';\r\n\r\nimport '../../../../chat.css';\r\nimport MessageType from '../../../../config/constants/MessageTypeEnum'\r\nimport TextMessage from './textMessage/TextMessage';\r\nimport ImageMessage from './imageMessage/ImageMessage';\r\nimport LinkMessage from './linkMessage/LinkMessage';\r\nimport VideoMessage from './videoMessage/VideoMessage';\r\nimport CardMessage from \"./cardMessage/CardMessage\";\r\nimport FileMessage from \"./fileMessage/FileMessage\";\r\nimport LayoutTypeEnum from \"../../../../config/constants/LayoutTypeEnum\";\r\n\r\n/**\r\n * Class for a message that acts as a component switch.\r\n * Here depending on the MessageType enum, the correct component for a specific message type is shown.\r\n */\r\nclass Message extends Component {\r\n render() {\r\n return(\r\n
\r\n {\r\n {\r\n [MessageType.text]: ,\r\n [MessageType.link]: ,\r\n [MessageType.image]: ,\r\n [MessageType.video]: ,\r\n [MessageType.card]: ,\r\n [MessageType.file]: ,\r\n }[this.props.message.messageType]\r\n }\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default Message;\r\n","/**\r\n * ChatResponseFeedback enum constant.\r\n */\r\nexport default {\r\n notSet: 0,\r\n like: 1,\r\n dislike: 2\r\n}","import React, { Component } from 'react';\r\n\r\n/**\r\n * Class that shows like/dislike buttons for chat feedback.\r\n */\r\nclass LikeIcon extends Component {\r\n\r\n render() {\r\n return(\r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default LikeIcon;\r\n","import React, { Component } from 'react';\r\n\r\nimport '../../../../chat.css';\r\nimport ChatResponseFeedbackEnum from '../../../../config/constants/ChatResponseFeedbackEnum'\r\nimport LikeIcon from \"./LikeIcon\";\r\n\r\n/**\r\n * Class that shows like/dislike buttons for chat feedback.\r\n */\r\nclass ChatFeedback extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n likeButtonIsHovered: false,\r\n dislikeButtonIsHovered: false\r\n }\r\n }\r\n\r\n handleFeedbackButtonHover = (chatResponseFeedbackType) => {\r\n if (chatResponseFeedbackType === ChatResponseFeedbackEnum.like) {\r\n this.setState({likeButtonIsHovered: !this.state.likeButtonIsHovered});\r\n\r\n } else {\r\n this.setState({dislikeButtonIsHovered: !this.state.dislikeButtonIsHovered});\r\n }\r\n }\r\n\r\n handleButtonClick = (chatResponseFeedback) => {\r\n if (this.props.spectatorMode) {\r\n return;\r\n }\r\n\r\n if (this.props.speechBubble.chatResponseFeedback === chatResponseFeedback) {\r\n chatResponseFeedback = ChatResponseFeedbackEnum.notSet;\r\n }\r\n\r\n this.props.sendChatResponseFeedback(this.props.speechBubble.chatQuestionId, chatResponseFeedback);\r\n };\r\n\r\n render() {\r\n return(\r\n
\r\n
this.handleButtonClick(ChatResponseFeedbackEnum.dislike)}\r\n onMouseEnter={() => this.handleFeedbackButtonHover(ChatResponseFeedbackEnum.dislike)}\r\n onMouseLeave={() => this.handleFeedbackButtonHover(ChatResponseFeedbackEnum.dislike)}>\r\n\r\n {this.props.speechBubble.chatResponseFeedback === ChatResponseFeedbackEnum.dislike || this.props.spectatorMode === false ?\r\n \r\n : null}\r\n
\r\n\r\n
this.handleButtonClick(ChatResponseFeedbackEnum.like)}\r\n onMouseEnter={() => this.handleFeedbackButtonHover(ChatResponseFeedbackEnum.like)}\r\n onMouseLeave={() => this.handleFeedbackButtonHover(ChatResponseFeedbackEnum.like)}>\r\n\r\n {this.props.speechBubble.chatResponseFeedback === ChatResponseFeedbackEnum.like || this.props.spectatorMode === false ?\r\n \r\n : null}\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default ChatFeedback;\r\n","/**\r\n * ChatQuestionType enum constant.\r\n */\r\nexport default {\r\n notSet: 0,\r\n textMessage: 1,\r\n suggestion: 2,\r\n menuItem: 3,\r\n welcomeIntent: 4,\r\n customIntent: 5\r\n}\r\n","/**\r\n * LineBreakType enum constant.\r\n */\r\nexport default {\r\n notSet: 0,\r\n newLine: 1,\r\n wrap: 2,\r\n carousel: 3\r\n}","export default {\r\n notSet: 0,\r\n widget: 1,\r\n facebook: 2,\r\n phoneCall: 3,\r\n sms: 4\r\n}\r\n","import React, {Component, Fragment} from 'react';\r\nimport axios from \"axios\";\r\nimport PhoneIcon from '@material-ui/icons/Phone';\r\nimport SmsIcon from '@material-ui/icons/Sms';\r\n\r\nimport {getLocalizationLanguageCode} from \"../../../util/localization\";\r\nimport {getLocaleDateTimeString} from \"../../../util/utilMethods\";\r\nimport '../../../chat.css';\r\n\r\nimport MessageType from '../../../config/constants/MessageTypeEnum';\r\nimport Message from './message/Message'\r\nimport ChatFeedback from \"./chatFeedback/ChatFeedback\";\r\nimport ChatQuestionTypeEnum from \"../../../config/constants/ChatQuestionTypeEnum\";\r\nimport LineBreakTypeEnum from \"../../../config/constants/LineBreakTypeEnum\";\r\nimport Setup from \"../../../config/Setup\";\r\nimport IntegrationTypeEnum from \"../../../config/constants/IntegrationTypeEnum\";\r\nimport LayoutTypeEnum from \"../../../config/constants/LayoutTypeEnum\";\r\n\r\n/**\r\n * Class that shows a single speechbubble.\r\n */\r\nclass SpeechBubble extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n hover: false,\r\n copiedIndex:-1\r\n };\r\n }\r\n\r\n /**\r\n * Returns a list of rows with all the visible messages.\r\n */\r\n getMessageRowList = () => {\r\n const {speechBubble} = this.props;\r\n \r\n if (!speechBubble.messageList) {\r\n return [];\r\n }\r\n\r\n let rowList = [];\r\n let messageList = [];\r\n\r\n speechBubble.messageList.forEach(message => {\r\n if (!message.hidden) {\r\n messageList.push(message);\r\n }\r\n });\r\n\r\n let rowMessageList = [];\r\n for(let i = 0; i < messageList.length; i++) {\r\n let lineBreak = messageList[i].messageType === MessageType.suggestion ? messageList[i].message.lineBreak : messageList[i].lineBreak;\r\n rowMessageList.push(messageList[i]);\r\n\r\n if (lineBreak !== false || i === messageList.length - 1) {\r\n let row = {\r\n messageList: rowMessageList\r\n };\r\n\r\n rowList.push(row);\r\n rowMessageList = [];\r\n }\r\n }\r\n\r\n return rowList;\r\n };\r\n\r\n speechBubbleClicked = () => {\r\n const {speechBubble} = this.props;\r\n \r\n let suggestion = speechBubble.suggestion;\r\n\r\n if (suggestion && !speechBubble.disabled) {\r\n this.props.sendIntent(suggestion.intentToTriggerId, ChatQuestionTypeEnum.suggestion, null, speechBubble, false);\r\n }\r\n };\r\n\r\n speechBubbleToggleHover = () => {\r\n const hover = !this.state.hover;\r\n this.setState({hover});\r\n };\r\n\r\n downloadFile = (url) => {\r\n return axios\r\n .post((process.env.NODE_ENV === 'development' ? Setup.apiEndpointDev : process.env.REACT_APP_TEST_BUILD ? Setup.apiEndpointTest : Setup.apiEndpointProd)+ 'storage/getTemporaryDownloadUrl/token/' + this.props.token , {url:url })\r\n .then(response => {\r\n window.open(response.data);\r\n })\r\n .catch(error => {\r\n throw error;\r\n })\r\n };\r\n handleCopyClick = (speechBubble) => {\r\n\r\n this.setState({copiedIndex: speechBubble.index});\r\n\r\n\r\n setTimeout(() => {\r\n this.setState({copiedIndex: -1});\r\n }, 500);\r\n\r\n const content = speechBubble.messageList.map(msg => msg.content).join('\\n');\r\n\r\n // Create a temporary element to hold the content\r\n const textElement = document.createElement('div');\r\n \r\n // Set the innerHTML to the content (which might contain HTML tags)\r\n textElement.innerHTML = content;\r\n \r\n // Get the plain text (without HTML tags)\r\n const plainText = textElement.textContent || textElement.innerText;\r\n \r\n // Create a new temporary element to copy the plain text\r\n const tempElement = document.createElement('div');\r\n tempElement.innerHTML = content;\r\n\r\n // Make it contenteditable to enable rich-text selection\r\n tempElement.setAttribute('contenteditable', 'true');\r\n document.body.appendChild(tempElement);\r\n\r\n // Create a range to select the content\r\n const range = document.createRange();\r\n range.selectNodeContents(tempElement);\r\n\r\n // Select the range\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n try {\r\n // Execute copy command\r\n document.execCommand('copy');\r\n } catch (err) {\r\n console.error(\"Error copying content:\", err);\r\n }\r\n\r\n // Clean up: Remove the temporary element\r\n document.body.removeChild(tempElement);\r\n };\r\n \r\n \r\n\r\n render() {\r\n const localizationCode = getLocalizationLanguageCode(this.props.language ? this.props.language.languageCode : null)\r\n const {speechBubble, chatConfig, showAvatar, spectatorMode, layoutMode} = this.props;\r\n const {withMemory} = chatConfig;\r\n const displayBackground = (layoutMode === LayoutTypeEnum.chatBot ||(layoutMode === LayoutTypeEnum.searchBot && withMemory)) ? speechBubble.displayBackground : false ;\r\n\r\n return(\r\n
\r\n {(!speechBubble.isUser && chatConfig.logoUrl !== null && speechBubble.suggestion == null &&\r\n speechBubble.messageList.some(m => m.messageType === MessageType.card) === false) && layoutMode !== LayoutTypeEnum.searchBot ?\r\n \r\n
\r\n { (speechBubble.index === 0 || speechBubble.isGpt == true) && showAvatar === true && speechBubble.lineBreakType !== LineBreakTypeEnum.carousel ?\r\n {'avatar'}/\r\n : null\r\n }\r\n
\r\n : null}\r\n \r\n {layoutMode !== LayoutTypeEnum.searchBot && speechBubble.index === 0 && !speechBubble.botWriting && !speechBubble.suggestion && (!speechBubble.isUser || this.props.spectatorMode) && speechBubble.lineBreakType !== LineBreakTypeEnum.carousel ?\r\n
\r\n {(!speechBubble.isUser && (speechBubble.avatarName || chatConfig.chatbotName) ?\r\n (speechBubble.avatarName ? speechBubble.avatarName : chatConfig.chatbotName) + ' ' : '') +\r\n (speechBubble.isUser ? getLocaleDateTimeString(speechBubble.dateTimeUtc, false, localizationCode) : getLocaleDateTimeString(speechBubble.dateTimeUtc, true, localizationCode))}\r\n
: null\r\n }\r\n\r\n \r\n\r\n {this.props.spectatorMode && this.props.speechBubble.isUser && this.props.speechBubble.integrationType > 0 ?\r\n
\r\n
\r\n\r\n {/*{this.props.speechBubble.integrationType === IntegrationTypeEnum.widget ?*/}\r\n {/* : null}*/}\r\n\r\n {/*{this.props.speechBubble.integrationType === IntegrationTypeEnum.facebook ?*/}\r\n {/* : null}*/}\r\n\r\n {this.props.speechBubble.integrationType === IntegrationTypeEnum.phoneCall ?\r\n : null}\r\n\r\n {this.props.speechBubble.integrationType === IntegrationTypeEnum.sms ?\r\n : null}\r\n\r\n
\r\n
: null}\r\n\r\n {this.getMessageRowList().map((row, index) => (\r\n \r\n {row.messageList.map((message, index) => (\r\n this.downloadFile(url)} message={message}\r\n isUser={speechBubble.isUser} sendMessage={this.props.sendMessage}\r\n chatConfig={chatConfig} key={index}/>\r\n\r\n ))}\r\n\r\n
\r\n\r\n\r\n ))}\r\n
\r\n\r\n {
\r\n\r\n
\r\n {speechBubble.isGpt == 'true' || (speechBubble.chatQuestionId && layoutMode === LayoutTypeEnum.chatBot) &&\r\n \r\n }\r\n {layoutMode === LayoutTypeEnum.searchBot && this.props.lastRow === true && speechBubble.chatResponseId && !speechBubble.isUser &&\r\n \r\n {/*
*/}\r\n {/* Hvordan vil du bedømme svaret?*/}\r\n {/*
*/}\r\n \r\n
\r\n }\r\n
\r\n\r\n <> {this.props.layoutMode !== LayoutTypeEnum.searchBot && !speechBubble.botWriting && !speechBubble.suggestion && (!speechBubble.isUser || this.props.spectatorMode) && speechBubble.lineBreakType !== LineBreakTypeEnum.carousel && (\r\n this.handleCopyClick(\r\n speechBubble\r\n )}\r\n >\r\n { speechBubble.index == this.state.copiedIndex ? (\r\n \r\n \r\n \r\n ) : (\r\n \r\n \r\n \r\n )}\r\n
\r\n )}\r\n {layoutMode === LayoutTypeEnum.searchBot && this.props.lastRow && !speechBubble.botWriting && (!speechBubble.isUser || this.props.spectatorMode) && speechBubble.lineBreakType !== LineBreakTypeEnum.carousel ?\r\n
\r\n {getLocaleDateTimeString(speechBubble.dateTimeUtc, false, localizationCode)}\r\n
: null\r\n }\r\n }\r\n\r\n \r\n \r\n );\r\n }\r\n }\r\n\r\n export default SpeechBubble;\r\n","import React, { Component } from 'react';\r\nimport Slide from '@material-ui/core/Slide';\r\nimport ReactDOM from 'react-dom';\r\n\r\nimport '../../chat.css';\r\nimport \"react-responsive-carousel/lib/styles/carousel.min.css\";\r\nimport SpeechBubble from './speechBubble/SpeechBubble';\r\nimport MessageTypeEnum from '../../config/constants/MessageTypeEnum';\r\nimport LineBreakTypeEnum from \"../../config/constants/LineBreakTypeEnum\";\r\nimport {Carousel} from \"react-responsive-carousel\";\r\nimport VizSensor from 'react-visibility-sensor';\r\nimport {CircularProgress} from \"@material-ui/core\";\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport LayoutTypeEnum from \"../../config/constants/LayoutTypeEnum\";\r\nimport Description from '@material-ui/icons/Description';\r\nimport PictureAsPdf from '@material-ui/icons/PictureAsPdf';\r\nimport Image from '@material-ui/icons/Image';\r\nimport TextFields from '@material-ui/icons/TextFields';\r\n\r\n\r\n\r\n/**\r\n * Class for the chatfield containing the speechbubbles.\r\n */\r\nclass ChatBotChatField extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n lastChatFieldContentHeight: 0,\r\n scrollToOldHeight: false,\r\n loadMoreEnabled: false\r\n };\r\n }\r\n\r\n /*\r\n * Returns a speechbubble that shows a user or bot is writing.\r\n */\r\n getIsWritingSpeechBubble = (isUser) => {\r\n return {\r\n messageList: [\r\n {\r\n messageType: MessageTypeEnum.text,\r\n content: '
' +\r\n '' +\r\n '
'\r\n }\r\n ],\r\n index: 0,\r\n isUser: isUser,\r\n botWriting: true\r\n };\r\n };\r\n\r\n /**\r\n * Scrolls to the bottom of the chatfield.\r\n */\r\n scrollToBottom = () => {\r\n if (this.messagesEnd) {\r\n if(this.props.chatConfig.layoutMode !== LayoutTypeEnum.searchBot)\r\n {\r\n this.messagesEnd.scrollIntoView({behavior: 'smooth'});\r\n }else\r\n {\r\n this.chatFieldParentContainerDiv.scrollTo({ top: this.chatFieldParentContainerDiv.scrollHeight, behavior: 'smooth' });\r\n\r\n }\r\n\r\n }\r\n };\r\n\r\n getChatFieldContentHeight= () => {\r\n // Checks if Internet Explorer\r\n const ua = window.navigator.userAgent;\r\n const isIe = ua.indexOf('MSIE ') > 0 || ua.indexOf('Trident/') > 0;\r\n\r\n if (!this.chatFieldContentDiv) {\r\n return null;\r\n }\r\n\r\n return isIe ? this.chatFieldContentDiv.scrollHeight : this.chatFieldContentDiv.clientHeight;\r\n };\r\n\r\n /**\r\n * Loads more chat messages when start of messages div is scrolled into view.\r\n */\r\n handleLoadMoreVisibilityChange = (isVisible) => {\r\n if (isVisible && this.state.loadMoreEnabled)\r\n {\r\n this.setState({lastChatFieldContentHeight: this.getChatFieldContentHeight(), scrollToOldHeight: true}, () => {\r\n this.props.loadMoreSpeechBubble();\r\n });\r\n }\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n if (prevProps.fileUploadedList !== this.props.fileUploadedList) {\r\n\r\n }\r\n }\r\n \r\n \r\n\r\n /**\r\n * Checks every 200 ms if the height of the chatfield has changed and scrolls top the bottom if it has.\r\n * This fix is because of componentDidUpdate() does not get called if for example \r\n * a height change is caused by a youtube video initializing in a child component.\r\n */\r\n\r\n componentDidMount = () => {\r\n const that = this;\r\n\r\n setInterval(() => {\r\n if (that.chatFieldContentDiv == null) {\r\n return;\r\n }\r\n\r\n const chatFieldContentHeight = this.getChatFieldContentHeight();\r\n\r\n if (chatFieldContentHeight && chatFieldContentHeight !== that.state.lastChatFieldContentHeight) {\r\n\r\n if (that.state.loadMoreEnabled === false) {\r\n setTimeout(() => {\r\n this.setState({loadMoreEnabled: true});\r\n }, 1000)\r\n }\r\n\r\n if (this.props.loadToEnd) {\r\n that.scrollToBottom();\r\n\r\n } else if (this.state.scrollToOldHeight) {\r\n that.chatFieldParentContainerDiv.scrollTop = chatFieldContentHeight - that.state.lastChatFieldContentHeight;\r\n }\r\n\r\n that.setState({lastChatFieldContentHeight: chatFieldContentHeight, scrollToOldHeight: false});\r\n }\r\n }, 200);\r\n\r\n setTimeout(() => {\r\n this.setState({loadMoreEnabled: true});\r\n }, 2000);\r\n };\r\n\r\n\r\n\r\n /**\r\n * Returns an array of the rows of speechbubbles.\r\n * Here continuous suggestions from the same response is added to the same rows.\r\n * @returns {[]|Array}\r\n */\r\n getSpeechBubbleRowList = () => {\r\n if (!this.props.speechBubbleList) {\r\n return [];\r\n }\r\n\r\n let rowList = [];\r\n let row = [];\r\n this.props.speechBubbleList.forEach((speechBubble, index, array) => {\r\n if (!speechBubble.hidden) {\r\n row.push(speechBubble);\r\n }\r\n\r\n const flex = (index + 1 <= array.length - 1) &&\r\n speechBubble.chatResponseId != null && array[index + 1].chatResponseId != null &&\r\n (speechBubble.chatResponseId === array[index + 1].chatResponseId) &&\r\n ((speechBubble.suggestion != null && array[index + 1].suggestion != null) ||\r\n (speechBubble.lineBreakType !== LineBreakTypeEnum.notSet &&\r\n speechBubble.lineBreakType !== LineBreakTypeEnum.newLine &&\r\n speechBubble.lineBreakType === array[index + 1].lineBreakType));\r\n\r\n if (flex === false) {\r\n if (row.length > 0) {\r\n rowList.push(row);\r\n }\r\n\r\n row = [];\r\n }\r\n });\r\n\r\n return rowList;\r\n };\r\n\r\n renderSpeechBubbleRow = (speechBubbleRow) => {\r\n return (\r\n speechBubbleRow.map((speechBubble, index) => (\r\n speechBubble.hidden ? null :\r\n (speechBubble.messageList.every((message) => {\r\n return message.hidden === true;\r\n }) ? null :\r\n \r\n \r\n )\r\n ))\r\n )\r\n };\r\n\r\n render() {\r\n\r\n const speechBubbleRowList = this.getSpeechBubbleRowList();\r\n\r\n return(\r\n\r\n
this.chatFieldParentContainerDiv = div}>\r\n {this.state.scrollToOldHeight ?\r\n
\r\n \r\n
: null\r\n }\r\n
this.chatFieldContentDiv = div}>\r\n {this.props.loadMore && speechBubbleRowList.length > 0 ?\r\n \r\n
\r\n : null\r\n }\r\n\r\n {speechBubbleRowList.map((speechBubbleRow, index) => (\r\n \r\n {speechBubbleRow[0].lineBreakType === LineBreakTypeEnum.carousel ?\r\n \r\n {this.renderSpeechBubbleRow(speechBubbleRow)}\r\n :\r\n\r\n this.renderSpeechBubbleRow(speechBubbleRow)\r\n }\r\n
\r\n ))}\r\n\r\n {this.props.botWriting ?\r\n (\r\n \r\n )\r\n : null}\r\n\r\n {this.props.userWriting ?\r\n \r\n : null}\r\n\r\n
{\r\n this.messagesEnd = el;\r\n }}>\r\n
\r\n
\r\n \r\n\r\n\r\n
\r\n\r\n );\r\n }\r\n}\r\n\r\nexport default ChatBotChatField;\r\n","import React, {Component} from 'react';\r\nimport '../../../chat.css';\r\nimport ChatQuestionTypeEnum from \"../../../config/constants/ChatQuestionTypeEnum\";\r\nimport Icon from \"@material-ui/core/Icon\";\r\nimport AttachmentICon from '@material-ui/icons/Attachment';\r\nimport Setup from \"../../../config/Setup\";\r\nimport axios from 'axios';\r\nimport Localization from \"../../../config/localization/Localization\";\r\nimport MoodICon from \"@material-ui/icons/Mood\";\r\nimport {getLocalizationLanguageCode} from \"../../../util/localization\";\r\n\r\n/**\r\n * Class for the chat message input menu.\r\n */\r\nclass ChatAttachment extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n anchorEl: null,\r\n file: null,\r\n loadedFile: null,\r\n progress: null,\r\n hover: false,\r\n maxSize: 270532608,\r\n loading: false,\r\n uploadIsHovered : false,\r\n pendingFiles: []\r\n }\r\n }\r\n\r\n handleUploadHover=()=>{\r\n this.setState({\r\n uploadIsHovered: !this.state.uploadIsHovered\r\n });\r\n }\r\n\r\n openMenu = () => {\r\n this.setState({anchorEl: this.btnEl});\r\n }\r\n\r\n closeMenu = () => {\r\n this.setState({anchorEl: null});\r\n };\r\n\r\n sendIntent = (chatMenuItem) => {\r\n this.props.sendIntent(chatMenuItem.intentId, ChatQuestionTypeEnum.menuItem,\r\n chatMenuItem.displayName, null, null, chatMenuItem.id);\r\n\r\n this.closeMenu();\r\n };\r\n\r\n componentDidUpdate(prevProps) {\r\n if (\r\n prevProps.fileUploadedListRemove !== this.props.fileUploadedListRemove &&\r\n this.props.fileUploadedListRemove !== null\r\n ) {\r\n this.setState(prevState => ({\r\n pendingFiles: prevState.pendingFiles.filter((_, i) => i !== this.props.fileUploadedListRemove)\r\n }), () => {\r\n this.props.handleFlushDeleteUploadedFile(); \r\n })}\r\n }\r\n\r\n\r\n\r\n handleCapture = ({ target }) => {\r\n const localizationCode = getLocalizationLanguageCode(this.props.language ? this.props.language.languageCode : null);\r\n const files = Array.from(target.files); // Konverter FileList til array\r\n let newPendingFiles = [...this.state.pendingFiles];\r\n\r\n // Check if limit of 5 files is reached\r\n if (newPendingFiles.length + files.length > 5) {\r\n this.props.setSnackbarErrorMessage(Localization[localizationCode]['chatInput.chatAttachment.maxFilesError'] || \"You can only upload up to 5 files.\");\r\n return;\r\n }\r\n\r\n files.forEach(file => {\r\n if (file.size > Setup.uploadFileSizeLimit) {\r\n this.props.setSnackbarErrorMessage(Localization[localizationCode]['chatInput.chatAttachment.fileSizeError']);\r\n return;\r\n }\r\n\r\n if (newPendingFiles.some(existingFile => existingFile.name === file.name && existingFile.size === file.size)) {\r\n this.props.setSnackbarErrorMessage(Localization[localizationCode]['chatInput.chatAttachment.sameFileError']);\r\n return;\r\n }\r\n\r\n const fileReader = new FileReader();\r\n this.setState({ progress: 0, loading: true });\r\n\r\n fileReader.onabort = () => console.log('File reading was aborted');\r\n fileReader.onerror = () => console.log('File reading has failed');\r\n\r\n fileReader.onload = (e) => {\r\n const arrayBuffer = e.target.result;\r\n const binaryStr = new Uint8Array(arrayBuffer).reduce((data, byte) => data + String.fromCharCode(byte), '');\r\n\r\n const newFile = {\r\n fileContent: binaryStr,\r\n name: file.name,\r\n customerId: '00000000-0000-0000-0000-000000000000'\r\n };\r\n\r\n // Opdater state med den nye fil\r\n this.setState((prevState) => ({\r\n pendingFiles: [...prevState.pendingFiles, newFile],\r\n loading: false\r\n }));\r\n\r\n this.props.handleAddUploadedFiles(file.name);\r\n this.props.handleAddPendingFiles(newFile);\r\n };\r\n\r\n fileReader.readAsArrayBuffer(file);\r\n });\r\n };\r\n\r\n\r\n\r\n /* sendFiles = () => {\r\n\r\n const { pendingFiles } = this.state;\r\n console.log(pendingFiles)\r\n\r\n this.setState({ loading: true });\r\n\r\n pendingFiles.forEach((file) => {\r\n this.props.uploadFileComplete(file, () => {\r\n console.log(`File ${file.name} uploaded successfully.`);\r\n });\r\n });\r\n\r\n this.setState({ pendingFiles: [], loading: false });\r\n this.props.handleResetUploadedFiles();\r\n }; */\r\n \r\n \r\n\r\n render() {\r\n return (\r\n
\r\n (this.state.loading === false ? (e.target.value = null) : null)}\r\n disabled={this.state.loading}\r\n />\r\n \r\n\r\n
\r\n );\r\n }\r\n \r\n}\r\n\r\nexport default ChatAttachment;\r\n","import React, {Component, createRef, Fragment} from 'react';\r\n\r\nimport '../../../chat.css';\r\nimport Localization from '../../../config/localization/Localization'\r\nimport TextareaAutosize from '@material-ui/core/TextareaAutosize';\r\nimport Icon from \"@material-ui/core/Icon\";\r\nimport MoodICon from \"@material-ui/icons/Mood\";\r\nimport Popover from \"@material-ui/core/Popover\";\r\nimport 'emoji-mart/css/emoji-mart.css'\r\nimport { Picker } from 'emoji-mart'\r\nimport { isMobile } from \"react-device-detect\";\r\nimport {getLocalizationLanguageCode} from \"../../../util/localization\";\r\nimport Button from \"@material-ui/core/Button\";\r\nimport LayoutTypeEnum from '../../../config/constants/LayoutTypeEnum';\r\nimport ChatAttachment from '../chatAttachment/ChatAttachment';\r\nimport { Chat } from '@material-ui/icons';\r\n\r\n\r\n/**\r\n * Class for the chat message input field.\r\n */\r\nclass ChatInputField extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.textareaRef = React.createRef();\r\n this.wrapperRef = React.createRef();\r\n this.state = {\r\n anchorEl: null,\r\n selectionStart:0,\r\n selectionEnd:0,\r\n emojiIsHovered : false,\r\n isExpanded: false,\r\n \r\n }\r\n }\r\n\r\n/* componentDidMount() {\r\n // Attach click event listener to the document\r\n document.addEventListener('mousedown', this.handleClickOutside);\r\n }\r\n\r\n componentWillUnmount() {\r\n // Remove click event listener from the document\r\n document.removeEventListener('mousedown', this.handleClickOutside);\r\n } */\r\n\r\n\r\n handleEmojiHover=()=>{\r\n this.setState({\r\n emojiIsHovered: !this.state.emojiIsHovered\r\n });\r\n }\r\n\r\n\r\n openEmojiPopover = () => {\r\n this.setState({anchorEl: this.btnEl});\r\n\r\n };\r\n\r\n closeEmojiPopover = () => {\r\n this.setState({anchorEl: null});\r\n };\r\n\r\n\r\n /**\r\n * Handles keyboard input in the chat input field.\r\n */\r\n handleInputKeyPress = (e) => {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n return this.props.sendMessage(true);\r\n \r\n }\r\n /* else if(e.key === 'ArrowUp'){\r\n\r\n e.preventDefault();\r\n this.props.onInputUpKeyStroke();\r\n } else if(e.key === 'ArrowDown'){\r\n e.preventDefault();\r\n this.props.onInputDownKeyStroke();\r\n }*/\r\n };\r\n\r\n\r\n handleInputOnClick = (e) => {\r\n\r\n if (typeof(this.input)==='object'&&this.input!==null) {\r\n const selectionStart = this.input.selectionStart\r\n const selectionEnd = this.input.selectionEnd\r\n this.setState({\r\n selectionStart: selectionStart,\r\n selectionEnd: selectionEnd,\r\n })\r\n\r\n if(this.props.chatConfig.layoutMode == LayoutTypeEnum.searchBot ){\r\n\r\n if(this.props.message.length == 0 && (this.props.speechBubbleList == null|| this.props.speechBubbleList.length == 0))\r\n {\r\n this.props.reEnableMostAskedQuestions()\r\n }\r\n this.setState({isExpanded: true})\r\n this.props.setShowSearchBotChatField(true);\r\n }\r\n } \r\n }\r\n\r\n handleClickOutside = (event) => {\r\n // Check if the click is outside the wrapper containing the textarea\r\n if (this.wrapperRef.current && !this.wrapperRef.current.contains(event.target)) {\r\n // Perform the desired action for clicks outside\r\n console.log('Clicked outside the textarea');\r\n // Example action: Hide an element or trigger a function\r\n const element = document.querySelector('#search-bot-chat-field-content-container');\r\n if (element) {\r\n element.style.display = 'none'; // Change display or other styles as needed\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Handles onchange input in the chat input field.\r\n */\r\n handleInputOnChange = (e) => {\r\n \r\n if (e.target.value === '' || this.props.message === '') {\r\n const isWriting = this.props.message === '';\r\n this.props.sendUserIsWriting(isWriting);\r\n }\r\n\r\n if (typeof(this.input)==='object'&&this.input!==null) {\r\n const selectionStart = this.input.selectionStart\r\n if (typeof(selectionStart)==='number') {\r\n this.setState({\r\n selectionStart:selectionStart,\r\n selectionEnd:selectionStart,\r\n })\r\n }\r\n }\r\n\r\n this.props.handleMessageChanges(e.target.value);\r\n };\r\n\r\n\r\n /**\r\n * Handles emoji in the chat input field.\r\n */\r\n addEmoji = (emoji) => {\r\n\r\n const emojiString = (this.props.message ? ' ': '') + emoji.native;\r\n\r\n const message = this.props.message.substr(0, this.state.selectionStart) + emojiString + this.props.message.substr(this.state.selectionStart);\r\n\r\n this.setState({anchorEl: null});\r\n\r\n this.props.handleMessageChanges(message);\r\n };\r\n\r\n render() {\r\n\r\n const localizationCode = getLocalizationLanguageCode(this.props.language ? this.props.language.languageCode : null)\r\n\r\n return (\r\n \r\n
\r\n {(this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot) ? (\r\n \r\n \r\n \r\n \r\n \r\n
\r\n ) : null}\r\n this.input=el}\r\n onKeyDown={this.handleInputKeyPress}\r\n maxRows={ this.props.chatConfig && this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot ? 1 : 1000 }\r\n style={{font: this.props.chatConfig ? this.props.chatConfig.font : null}}/>\r\n\r\n \r\n {this.props.chatConfig && isMobile === false && (this.props.chatConfig.enableEmoji || this.props.chatAgentMode) ?\r\n
\r\n\r\n {this.btnEl = el;}}>\r\n \r\n\r\n \r\n \r\n \r\n\r\n\r\n
: null}\r\n\r\n {this.props.showStopMessage ?\r\n
\r\n \r\n \r\n \r\n
: null\r\n }\r\n\r\n {(this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.props.message) ? ( this.props.handleResetChatInput()}\r\n style={{\r\n fontSize: '2rem', // Makes the × symbol larger\r\n fontWeight: 'normal', // Ensures the × is bold and visible\r\n textAlign: 'center', // Centers the text inside the button\r\n width: '30px', // Adjusts the button width (customize as needed)\r\n height: '30px', // Adjusts the button height (customize as needed)\r\n lineHeight: '30px', // Aligns the × vertically\r\n border: 'none', // Removes any default borders\r\n backgroundColor: 'transparent', // Optional: Makes the button background transparent\r\n cursor: 'pointer', // Adds a pointer cursor for better UX\r\n minWidth : '30px',\r\n color:'darkgray'\r\n }}\r\n >\r\n ×\r\n ): null}\r\n {this.props.fileUploadedText == false || this.props.message ?\r\n : null }\r\n
\r\n\r\n\r\n );\r\n }\r\n}\r\n\r\nexport default ChatInputField;","import React, { Component } from 'react';\r\nimport Menu from '@material-ui/core/Menu';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\n\r\nimport '../../../chat.css';\r\nimport ChatQuestionTypeEnum from \"../../../config/constants/ChatQuestionTypeEnum\";\r\nimport Icon from \"@material-ui/core/Icon\";\r\nimport MenuICon from '@material-ui/icons/Menu';\r\nimport AttachmentICon from \"@material-ui/icons/Attachment\";\r\nimport {Popover} from \"@material-ui/core\";\r\n/**\r\n * Class for the chat message input menu.\r\n */\r\nclass ChatInputMenu extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {isOpen: false,\r\n chatMenuItemList: [],\r\n menuIsHovered: false\r\n }\r\n }\r\n\r\n\r\n handleMenuHover=()=>{\r\n this.setState({\r\n menuIsHovered: !this.state.menuIsHovered\r\n });\r\n }\r\n\r\n openMenu = () => {\r\n let chatMenuItemList = [];\r\n\r\n if (this.props.chatConfig && this.props.language) {\r\n chatMenuItemList = this.props.chatConfig.chatMenuItemList.filter((chatMenuItem) => {\r\n return chatMenuItem.languageCode === this.props.language.languageCode;\r\n });\r\n }\r\n\r\n if (chatMenuItemList.length > 0) {\r\n chatMenuItemList.sort((a, b) => a.index - b.index);\r\n\r\n this.setState({chatMenuItemList}, () => {\r\n this.setState({isOpen: true});\r\n }); \r\n } \r\n };\r\n \r\n closeMenu = () => {\r\n this.setState({isOpen: false});\r\n };\r\n\r\n sendIntent = (chatMenuItem) => {\r\n this.props.sendIntent(chatMenuItem.intentId, ChatQuestionTypeEnum.menuItem,\r\n chatMenuItem.displayName, null, null, chatMenuItem.id);\r\n\r\n this.closeMenu();\r\n };\r\n\r\n render() {\r\n\r\n const anchorOrigin = this.props.showAbove ?\r\n {\r\n vertical: 'top',\r\n horizontal: 'right'\r\n }\r\n :\r\n {\r\n vertical: 'bottom',\r\n horizontal: 'right'\r\n }\r\n\r\n const transformOrigin = this.props.showAbove ?\r\n {\r\n vertical: 'bottom',\r\n horizontal: 'right',\r\n }\r\n :\r\n {\r\n vertical: 'top',\r\n horizontal: 'right'\r\n }\r\n \r\n return(\r\n \r\n
\r\n\r\n {this.btnEl = el;}}>\r\n \r\n \r\n\r\n \r\n {this.state.chatMenuItemList.map((chatMenuItem, index) => (\r\n {this.sendIntent(chatMenuItem);}} key={index} className={'chat-menu-item'}\r\n style={this.props.chatConfig && this.props.chatConfig.font ?\r\n {font: this.props.chatConfig.font} :\r\n {fontSize: '0.9rem'}}>\r\n {chatMenuItem.displayName}\r\n \r\n ))}\r\n \r\n
\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ChatInputMenu;\r\n","import React from 'react';\r\nimport ListItem from \"@material-ui/core/ListItem\";\r\nimport {Typography} from \"@material-ui/core\";\r\nimport Tooltip from \"@material-ui/core/Tooltip\";\r\nimport Localization from \"../../../../config/localization/Localization\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport EditIcon from \"@material-ui/icons/Edit\";\r\nimport SendIcon from \"@material-ui/icons/Send\";\r\nimport PropTypes from \"prop-types\";\r\nimport ListItemText from \"@material-ui/core/ListItemText\";\r\n\r\nconst AdminAutocompleteMenuItem = ({suggestion, localizationCode, onEditIntent, onSendIntent, replacedString}) => {\r\n return (\r\n \r\n \r\n \r\n \r\n }/>\r\n
\r\n \r\n onEditIntent(suggestion.intentId)}>\r\n \r\n \r\n \r\n \r\n onSendIntent(suggestion.intentId)}>\r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n};\r\n\r\nAdminAutocompleteMenuItem.propTypes = {\r\n localizationCode: PropTypes.string.isRequired,\r\n suggestion: PropTypes.object.isRequired,\r\n replacedString: PropTypes.string.isRequired,\r\n onSendIntent: PropTypes.func.isRequired,\r\n onEditIntent: PropTypes.func.isRequired,\r\n}\r\n\r\nexport default AdminAutocompleteMenuItem;","import React from 'react';\r\nimport {Typography} from \"@material-ui/core\";\r\nimport IconButton from \"@material-ui/core/IconButton\";\r\nimport SendIcon from \"@material-ui/icons/Send\";\r\nimport PropTypes from \"prop-types\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\n\r\nconst UserAutocompleteMenuItem = ({suggestion, onSendSuggestion, replacedString}) => {\r\n return (\r\n onSendSuggestion(suggestion.question)}\r\n >\r\n \r\n \r\n \r\n
\r\n {\r\n e.stopPropagation()\r\n onSendSuggestion(suggestion.question)\r\n }}\r\n disableRipple\r\n >\r\n \r\n
\r\n \r\n );\r\n};\r\n\r\nUserAutocompleteMenuItem.propTypes = {\r\n suggestion: PropTypes.object.isRequired,\r\n replacedString: PropTypes.string.isRequired,\r\n onSendSuggestion: PropTypes.func.isRequired,\r\n}\r\n\r\nexport default UserAutocompleteMenuItem;","import React, {Component} from 'react';\r\nimport PropTypes from 'prop-types';\r\nimport {ClickAwayListener, Popover} from \"@material-ui/core\";\r\nimport {getLocalizationLanguageCode} from \"../../../util/localization\";\r\nimport AdminAutocompleteMenuItem from \"./components/AdminAutocompleteMenuItem\";\r\nimport UserAutocompleteMenuItem from \"./components/UserAutocompleteMenuItem\";\r\n\r\n\r\nclass Autocomplete extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n openPopover: false,\r\n }\r\n }\r\n\r\n handleKeyPress = (e) => {\r\n if(e.key === 'ArrowUp'){\r\n e.preventDefault()\r\n if(e.target.previousElementSibling){\r\n e.target.previousElementSibling.focus()\r\n } else if(!this.props.showAbove) {\r\n this.props.onChangeFocusToInput()\r\n }\r\n }\r\n if(e.key === 'ArrowDown'){\r\n e.preventDefault()\r\n if(e.target.nextElementSibling){\r\n e.target.nextElementSibling.focus()\r\n } else if(this.props.showAbove) {\r\n this.props.onChangeFocusToInput()\r\n }\r\n }\r\n }\r\n\r\n handleSendChatAgentIntent = (e, intentId) => {\r\n this.props.onSendChatAgentIntent(e, intentId)\r\n }\r\n\r\n handleEditChatAgentIntent = (e, intentId) => {\r\n this.props.onEditChatAgentIntent(e, intentId)\r\n }\r\n\r\n handleSendUserSuggestion = (message) => {\r\n this.props.onSendUserSuggestion(message)\r\n }\r\n\r\n clickAwayHandler = () =>\r\n {\r\n this.props.flushTrainingPhraseList();\r\n }\r\n\r\n render() {\r\n\r\n const {anchorEl, searchString} = this.props;\r\n const localizationCode = getLocalizationLanguageCode(this.props.language ? this.props.language.languageCode : null)\r\n\r\n //Checking for chatAgentMode and if # is present in message string\r\n const formattedSearchString = this.props.chatAgentMode\r\n ? (searchString.charAt(0) === \"#\" ? searchString.substring(1).trim().toLowerCase() : '')\r\n : searchString.trim().toLowerCase()\r\n\r\n //Filtering based on search string\r\n let filteredTrainingPhraseList = this.props.trainingPhraseList\r\n .filter(suggestion => suggestion.question\r\n .toLowerCase()\r\n .includes(formattedSearchString) )\r\n\r\n filteredTrainingPhraseList = filteredTrainingPhraseList.slice(0, 5)\r\n\r\n const isOpen = formattedSearchString.length > 2 && filteredTrainingPhraseList.length > 0\r\n\r\n const anchorOrigin = this.props.showAbove ?\r\n {\r\n vertical: 'top',\r\n horizontal: 'left'\r\n }\r\n :\r\n {\r\n vertical: 'bottom',\r\n horizontal: 'left'\r\n }\r\n\r\n const transformOrigin = this.props.showAbove ?\r\n {\r\n vertical: 'bottom',\r\n horizontal: 'left',\r\n }\r\n :\r\n {\r\n vertical: 'top',\r\n horizontal: 'left'\r\n }\r\n\r\n return (\r\n \r\n \r\n
this.handleKeyPress(e)}>\r\n {filteredTrainingPhraseList.map(suggestion => {\r\n const regex = new RegExp(`${formattedSearchString}`, \"gi\")\r\n const replacedString = suggestion.question.replace(regex,'$&');\r\n\r\n if(this.props.chatAgentMode){\r\n return (\r\n \r\n )\r\n } else {\r\n return (\r\n \r\n )\r\n }\r\n })}\r\n
\r\n
\r\n \r\n\r\n );\r\n }\r\n}\r\n\r\nexport default React.forwardRef((props, ref) => );\r\n\r\nAutocomplete.propTypes = {\r\n anchorEl: PropTypes.object.isRequired,\r\n searchString: PropTypes.string.isRequired,\r\n trainingPhraseList: PropTypes.array.isRequired,\r\n onSendChatAgentIntent: PropTypes.func,\r\n flushTrainingPhraseList: PropTypes.func.isRequired,\r\n onEditChatAgentIntent: PropTypes.func,\r\n onSendUserIntent: PropTypes.func,\r\n language: PropTypes.object.isRequired,\r\n onChangeFocusToInput: PropTypes.func.isRequired,\r\n showAbove: PropTypes.bool.isRequired\r\n}","import React, {Component, createRef, Fragment} from 'react';\r\n\r\nimport '../../chat.css';\r\nimport Localization from '../../config/localization/Localization'\r\nimport ChatInputField from './chatInputField/ChatInputField';\r\nimport ChatAttachment from \"./chatAttachment/ChatAttachment\";\r\nimport ChatInputMenu from \"./chatInputMenu/ChatInputMenu\";\r\nimport IntegrationTypeEnum from \"../../config/constants/IntegrationTypeEnum\";\r\nimport {getLocalizationLanguageCode} from \"../../util/localization\";\r\nimport Autocomplete from \"./autocomplete/Autocomplete\";\r\nimport { debounce, removeHtmlTagsFromString} from \"../../util/utilMethods\";\r\nimport LayoutTypeEnum from \"../../config/constants/LayoutTypeEnum\";\r\nimport Description from '@material-ui/icons/Description';\r\nimport PictureAsPdf from '@material-ui/icons/PictureAsPdf';\r\nimport Image from '@material-ui/icons/Image';\r\nimport TextFields from '@material-ui/icons/TextFields';\r\n\r\n\r\n\r\n\r\n/**\r\n * Class for the chat message input menu.\r\n */\r\nclass ChatInput extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.inputRef = null;\r\n this.autoCompleteRef = createRef();\r\n this.handleGetTrainingPhraseListDebounced = debounce((searchText) => this.handleGetTrainingPhraseList(searchText), 200)\r\n this.state = {\r\n message: ''\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps) {\r\n // Sync state with prop when it changes\r\n if (prevProps.message !== this.props.message) {\r\n this.setState({ message: this.props.message });\r\n this.props.sendMessage(this.props.message, this.props.message);\r\n let message = this.props.message;\r\n\r\n if ( this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.props.chatConfig.withMemory) {\r\n message = '';\r\n }\r\n\r\n this.setState({message: message});\r\n }\r\n }\r\n\r\n handleGetTrainingPhraseList = (searchText) => {\r\n this.props.handleGetTrainingPhraseList(searchText)\r\n }\r\n\r\n handleMessageChanges = (message, disableAutomComplete = false) => {\r\n this.props.handleRootClick();\r\n this.setState({message: message}, () => {\r\n if(this.props.chatAgentMode){\r\n if(message.charAt(0) === \"#\" && message.length >= 3) {\r\n const formattedSearchString = message.substring(1).trim().toLowerCase();\r\n this.handleGetTrainingPhraseListDebounced(formattedSearchString)\r\n }\r\n } else if(this.props.chatConfig.enableAutocomplete){\r\n if(message.length >= 1 && disableAutomComplete === false) {\r\n const formattedSearchString = message.trim().toLowerCase();\r\n this.handleGetTrainingPhraseListDebounced(formattedSearchString)\r\n }\r\n }\r\n });\r\n };\r\n\r\n handleChangeFocusToInput = () => {\r\n //Textarea is burried in two divs, and therefore firstchild is used twice\r\n if(this.inputRef.firstChild && this.inputRef.firstChild.firstChild){\r\n this.inputRef.firstChild.firstChild.focus()\r\n }\r\n }\r\n\r\n handleResetChatInput = () => {\r\n this.setState({message: ''})\r\n this.props.reEnableMostAskedQuestions();\r\n this.props.clearSpeechBubble();\r\n const element = document.querySelector('#search-bot-chat-field-content-container');\r\n\r\n\r\n if (element) {\r\n element.style.display = 'block'; \r\n }\r\n\r\n\r\n }\r\n\r\n handleEditChatAgentIntent = (intentId) => {\r\n this.props.handleGetChatResponse(intentId)\r\n .then((result) => {\r\n if(result != null && result.speechBubbleList != null){\r\n let chatResponseString = '';\r\n result.speechBubbleList.forEach((speechBubble, sbIndex) => {\r\n if(speechBubble.messageList != null){\r\n speechBubble.messageList.forEach((message, mIndex) => {\r\n //Adds space between messages except first and last message\r\n if(!(sbIndex === 0 && mIndex === 0)\r\n && !(sbIndex === result.speechBubbleList.length-1 && mIndex === speechBubble.messageList)) {\r\n chatResponseString += \" \";\r\n }\r\n if(message.content != null) {\r\n const strippedString = removeHtmlTagsFromString(message.content)\r\n chatResponseString += strippedString\r\n } else if(message.url != null){\r\n chatResponseString += message.url\r\n }\r\n })\r\n }\r\n })\r\n this.setState({message: chatResponseString})\r\n this.props.flushTrainingPhraseList();\r\n this.handleChangeFocusToInput()\r\n }\r\n }).catch((e) => {\r\n console.log(e)\r\n })\r\n }\r\n\r\n handleSendChatAgentIntent = (intentId) => {\r\n const messageWasSent = this.props.sendChatAgentIntent(intentId);\r\n if(messageWasSent){\r\n this.setState({message: ''})\r\n this.props.flushTrainingPhraseList();\r\n this.handleChangeFocusToInput()\r\n }\r\n }\r\n\r\n handleSendMessage = (disableAutocomplete = false) => {\r\n\r\n if(this.props.chatConfig.layoutMode !== null && this.props.chatConfig.layoutMode === LayoutTypeEnum.chatBot) {\r\n this.props.updateStateOfPlaceholder();\r\n }\r\n\r\n if (this.state.message.replace(/(<([^>]+)>)/ig, \"\").trim() !== '') {\r\n this.props.sendUserIsWriting(false);\r\n let messageWasSent = this.props.sendMessage(this.state.message, this.state.message);\r\n\r\n\r\n\r\n if(disableAutocomplete == true)\r\n {\r\n this.props.flushTrainingPhraseList();\r\n this.handleChangeFocusToInput()\r\n }\r\n\r\n if ( messageWasSent &&\r\n (\r\n this.props.chatConfig.layoutMode === LayoutTypeEnum.chatBot ||\r\n (this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.props.chatConfig.withMemory)\r\n )\r\n ) {\r\n this.handleMessageChanges('', disableAutocomplete);\r\n }\r\n }\r\n };\r\n\r\n handleSendUserSuggestion = (message) => {\r\n let messageWasSent = this.props.sendMessage(message, message);\r\n if (messageWasSent) {\r\n if ( this.props.chatConfig.layoutMode === LayoutTypeEnum.chatBot ||\r\n (this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.props.chatConfig.withMemory))\r\n {\r\n message= '';\r\n }\r\n\r\n this.handleMessageChanges(message, true);\r\n this.props.flushTrainingPhraseList();\r\n this.handleChangeFocusToInput()\r\n }\r\n }\r\n\r\n handleInputUpKeyStroke = () => {\r\n if(this.props.chatConfig.layoutMode === LayoutTypeEnum.chatBot && this.autoCompleteRef && this.autoCompleteRef.lastChild){\r\n this.autoCompleteRef.lastChild.focus()\r\n }\r\n }\r\n\r\n handleInputDownKeyStroke = () => {\r\n if(this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.autoCompleteRef && this.autoCompleteRef.firstChild){\r\n this.autoCompleteRef.firstChild.focus()\r\n }\r\n }\r\n\r\n render() {\r\n const localizationCode = getLocalizationLanguageCode(this.props.language ? this.props.language.languageCode : null)\r\n const fileTypeIconMap = {\r\n PDF: ,\r\n DOCX: ,\r\n JPG: ,\r\n PNG: ,\r\n TXT: ,\r\n default: ,\r\n };\r\n return(\r\n
\r\n {\r\n this.props.disclaimer && this.props.chatConfig.layoutMode !== LayoutTypeEnum.searchBot &&
\r\n }\r\n {/* File Upload List */}\r\n {this.props.fileUploadedList && this.props.fileUploadedList.length > 0 && (\r\n \r\n {!this.props.botWriting && this.props.fileUploadedList.map((file, index) => {\r\n const fileExtension = file.split('.').pop().toUpperCase();\r\n const fileIcon = fileTypeIconMap[fileExtension] || fileTypeIconMap.default;\r\n\r\n return (\r\n \r\n \r\n {fileIcon}\r\n
\r\n\r\n {/* File Name */}\r\n \r\n {file}\r\n
\r\n\r\n\r\n\r\n this.props.handleDeleteUploadedFile(file)}\r\n style={{\r\n marginLeft: '10px',\r\n color: '#000000',\r\n cursor: 'pointer',\r\n fontSize: '14px',\r\n display: 'flex',\r\n alignItems: 'center', // Ensures delete icon is vertically centered\r\n }}\r\n >\r\n ✖\r\n \r\n\r\n \r\n );\r\n })}\r\n \r\n )}\r\n\r\n\r\n {(this.props.chatAgentMode || this.props.chatConfig.enableAutocomplete) && this.inputRef && this.props.language &&\r\n this.autoCompleteRef = el}\r\n anchorEl={this.inputRef}\r\n searchString={this.state.message}\r\n trainingPhraseList={this.props.trainingPhraseList}\r\n flushTrainingPhraseList={this.props.flushTrainingPhraseList}\r\n onEditChatAgentIntent={this.handleEditChatAgentIntent}\r\n onSendChatAgentIntent={this.handleSendChatAgentIntent}\r\n onSendUserSuggestion={this.handleSendUserSuggestion}\r\n language={this.props.language}\r\n onChangeFocusToInput={() => this.handleChangeFocusToInput()}\r\n showAbove= {this.props.chatConfig.layoutMode === LayoutTypeEnum.chatbot ||\r\n (this.props.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.props.chatConfig.openDownwards === false)}\r\n />\r\n }\r\n
\r\n {Localization[localizationCode]['chatInput.connectionProblems']}
\r\n {Localization[localizationCode]['chatInput.reconnecting']}\r\n
\r\n
this.inputRef = div} style={{display: this.props.showConnectionLostMsg ? 'none' : ''}}>\r\n this.handleSendMessage(disableAutomComplete)}\r\n stopMessage={this.props.stopMessage}\r\n showStopMessage={ this.props.showStopMessage}\r\n sendUserIsWriting={this.props.sendUserIsWriting}\r\n handleMessageChanges={(value, disableAutomComplete) => this.handleMessageChanges(value, disableAutomComplete)}\r\n message={this.state.message}\r\n onInputUpKeyStroke={this.handleInputUpKeyStroke}\r\n onInputDownKeyStroke={this.handleInputDownKeyStroke}\r\n chatInputText ={this.props.chatInputText}\r\n chatInputMax ={this.props.chatInputMax}\r\n handleResetChatInput = {this.handleResetChatInput}\r\n clearSpeechBubble={this.props.clearSpeechBubble}\r\n reEnableMostAskedQuestions={this.props.reEnableMostAskedQuestions}\r\n fileUploadedText={this.props.fileUploadedText}\r\n setShowSearchBotChatField={(show) => this.props.setShowSearchBotChatField(show)}\r\n speechBubbleList= {this.props.speechBubbleList}\r\n\r\n />\r\n {!this.state.message ?\r\n \r\n {this.props.chatConfig && this.props.integrationType !== IntegrationTypeEnum.facebook && (this.props.chatConfig.enableUpload || this.props.chatAgentMode) ?\r\n this.props.handleAddUploadedFiles(name)} \r\n handleResetUploadedFiles={() => this.props.handleResetUploadedFiles()} \r\n fileUploadedListRemove={this.props.fileUploadedListRemove} \r\n handleFlushDeleteUploadedFile={this.props.handleFlushDeleteUploadedFile} \r\n handleAddPendingFiles={(item) => this.props.handleAddPendingFiles(item)}\r\n flushPendingFiles={this.props.flushPendingFiles}\r\n pendingFiles={this.props.pendingFiles}\r\n fileUploadedText={this.props.fileUploadedText}\r\n \r\n /> : null}\r\n\r\n {\r\n this.props.chatConfig && this.props.language && this.props.chatConfig.showMenuInInput && this.props.chatConfig.chatMenuItemList.filter(cmi => cmi.languageId === this.props.language.id).length > 0 ?\r\n : null}\r\n : null }\r\n
\r\n\r\n\r\n\r\n\r\n \r\n );\r\n }\r\n}\r\n\r\nexport default ChatInput;\r\n","import React, { Component } from 'react';\r\nimport Button from \"@material-ui/core/Button\";\r\nimport Localization from \"../../config/localization/Localization\";\r\nimport Link from \"@material-ui/core/Link\";\r\nimport Setup from \"../../config/Setup\";\r\nimport Slide from \"@material-ui/core/Slide\";\r\nimport MenuItem from \"@material-ui/core/MenuItem\";\r\nimport Menu from \"@material-ui/core/Menu\";\r\nimport ChatQuestionTypeEnum from \"../../config/constants/ChatQuestionTypeEnum\";\r\nimport LinkIcon from \"@material-ui/icons/TransitEnterexit\";\r\nimport {getLocalizationLanguageCode} from \"../../util/localization\";\r\n\r\n\r\n/**\r\n * Class for the info page.\r\n */\r\nclass InfoPage extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n chatMenuItemList: []\r\n }\r\n }\r\n\r\n sendIntent = (chatMenuItem) => {\r\n this.props.sendIntent(chatMenuItem.intentId, ChatQuestionTypeEnum.menuItem,\r\n chatMenuItem.displayName, null, null, chatMenuItem.id);\r\n\r\n this.props.toggleShowInfoPage()\r\n };\r\n\r\n render() {\r\n\r\n let chatMenuItemList = [];\r\n const localizationCode = getLocalizationLanguageCode(this.props.language ? this.props.language.languageCode : null)\r\n\r\n if (this.props.chatConfig && this.props.language) {\r\n chatMenuItemList = this.props.chatConfig.chatMenuItemList.filter((chatMenuItem) => {\r\n return chatMenuItem.languageCode === this.props.language.languageCode;\r\n });\r\n }\r\n\r\n if (chatMenuItemList.length > 0) {\r\n chatMenuItemList.sort((a, b) => a.index - b.index);\r\n }\r\n\r\n return(\r\n
\r\n\r\n \r\n
\r\n\r\n
\r\n\r\n
\r\n\r\n {chatMenuItemList && chatMenuItemList.length > 0 ?\r\n
\r\n {chatMenuItemList.map((chatMenuItem, index) => (\r\n {this.sendIntent(chatMenuItem); }} key={index}\r\n style={{\r\n font: this.props.chatConfig && this.props.chatConfig.font ? this.props.chatConfig.font : null,\r\n color: this.props.color ? this.props.color : \"black\"\r\n }}>\r\n {chatMenuItem.displayName}\r\n \r\n ))}\r\n
: null}\r\n\r\n
\r\n\r\n {this.props.gdprLink ?\r\n
\r\n \r\n {this.props.language ?\r\n Localization[localizationCode]['infoPage.privacyPolicyLinkText'] : ''\r\n }\r\n \r\n \r\n
: null}\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n { this.props.chatConfig && this.props.chatConfig.showPoweredBy &&\r\n \r\n \r\n\r\n Powered by InDialog.ai\r\n \r\n\r\n {'InDialog\r\n \r\n }\r\n\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default InfoPage;\r\n","import React, { Component } from 'react';\r\nimport ReactFlagsSelect from 'react-flags-select';\r\nimport 'react-flags-select/css/react-flags-select.css';\r\n\r\nimport '../../../chat.css';\r\n\r\n/**\r\n * Class for the language selector component.\r\n */\r\nclass LanguageSelector extends Component {\r\n\r\n languageSelected = (countryCode) => {\r\n let languageChanged = this.props.languageSelected(countryCode);\r\n\r\n if (languageChanged === false) {\r\n this.refs.flagSelector.updateSelected(this.props.language.countryCode);\r\n }\r\n }\r\n\r\n render() {\r\n return(\r\n
\r\n {this.props.language && this.props.languageList && this.props.languageList.length > 1 ?\r\n lang.countryCode)} \r\n defaultCountry={this.props.language.countryCode}\r\n showSelectedLabel={false} \r\n showOptionLabel={false} \r\n selectedSize={14}\r\n onSelect={this.languageSelected}\r\n ref={'flagSelector'}/> : null}\r\n \r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default LanguageSelector;\r\n","import React from 'react';\r\n\r\nimport LanguageSelector from './languageSelector/LanguageSelector';\r\nimport {\r\n isMobile\r\n} from \"react-device-detect\";\r\nimport Icon from \"@material-ui/core/Icon\";\r\nimport HelpIcon from '@material-ui/icons/HelpOutline';\r\nimport LayoutTypeEnum from \"../../config/constants/LayoutTypeEnum\";\r\nimport CloseIcon from '@material-ui/icons/Close';\r\nimport MinimizeIcon from '@material-ui/icons/Minimize';\r\nimport FullIcon from '@material-ui/icons/AspectRatio';\r\nimport Button from \"@material-ui/core/Button\";\r\nimport Localization from \"../../config/localization/Localization\";\r\nimport {getLocalizationLanguageCode} from \"../../util/localization\";\r\n\r\nconst TopBar = (props) => {\r\n return (\r\n
\r\n {(props.layoutMode==null || props.layoutMode !== LayoutTypeEnum.searchBot) && props.avatar?\r\n\r\n
\r\n
\r\n \"avatar\"/
\r\n
\r\n
{props.name}
\r\n
{props.clientDescription}
\r\n
\r\n\r\n
: null\r\n }\r\n\r\n {/*{this.props.showInfo == false ? : null*/}\r\n {/*}*/}\r\n\r\n\r\n \r\n {isMobile == false && props.enableMaximize && }\r\n \r\n \r\n
\r\n );\r\n};\r\n\r\nexport default TopBar;","import React, { Component } from 'react';\r\nimport Slide from '@material-ui/core/Slide';\r\n\r\nimport '../../../chat.css';\r\nimport \"react-responsive-carousel/lib/styles/carousel.min.css\";\r\nimport SpeechBubble from '../speechBubble/SpeechBubble';\r\nimport MessageTypeEnum from '../../../config/constants/MessageTypeEnum';\r\nimport LineBreakTypeEnum from \"../../../config/constants/LineBreakTypeEnum\";\r\nimport {Carousel} from \"react-responsive-carousel\";\r\nimport VizSensor from 'react-visibility-sensor';\r\nimport LinearProgress from \"@material-ui/core/LinearProgress\";\r\nimport \"./SearchBotChatField.css\"\r\nimport LayoutTypeEnum from \"../../../config/constants/LayoutTypeEnum\";\r\nimport List from '@material-ui/core/List';\r\nimport ListItem from '@material-ui/core/ListItem';\r\nimport ListItemText from '@material-ui/core/ListItemText';\r\nimport Typography from '@material-ui/core/Typography';\r\nimport LanguageIcon from '@material-ui/icons/Language';\r\nimport Card from '@material-ui/core/Card';\r\nimport PublicIcon from '@material-ui/icons/Public'; // \"Better looking\" globe\r\nimport { getLocalizationLanguageCode } from '../../../util/localization';\r\nimport { Button } from '@material-ui/core';\r\nimport ChatBotChatField from '../ChatBotChatField';\r\nimport {isMobile} from \"react-device-detect\";\r\nimport LanguageSelector from \"../../topBar/languageSelector/LanguageSelector\";\r\n\r\n/**\r\n * Class for the chatfield containing the speechbubbles.\r\n */\r\nclass SearchBotChatField extends Component {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n lastChatFieldContentHeight: 0,\r\n scrollToOldHeight: false,\r\n loadMoreEnabled: false,\r\n chatMenuItemList: [],\r\n lastMessageLength: 0\r\n };\r\n this.handleLoadMoreVisibilityChange = this.handleLoadMoreVisibilityChange.bind(this)\r\n }\r\n\r\n /*\r\n * Returns a speechbubble that shows a user or bot is writing.\r\n */\r\n getIsWritingSpeechBubble = (isUser) => {\r\n return {\r\n messageList: [\r\n {\r\n messageType: MessageTypeEnum.text,\r\n content: '
' +\r\n '' +\r\n '
'\r\n }\r\n ],\r\n index: 0,\r\n isUser: isUser,\r\n botWriting: true\r\n };\r\n };\r\n\r\n /**\r\n * Scrolls to the top of the chatfield.\r\n */\r\n scrollToTop = () => {\r\n if (this.messagesEnd) {\r\n this.chatFieldParentContainerDiv.scrollTo({ top: this.chatFieldParentContainerDiv.scrollHeight, behavior: 'smooth' });\r\n }\r\n };\r\n\r\n handleInputOnClick = (e) => {\r\n // const element = document.querySelector('#search-bot-chat-field-container-parent');\r\n /* if (element) {\r\n element.style.display = 'none';\r\n } */\r\n this.initializeChatMenuItems(false)\r\n }\r\n\r\n\r\n\r\n getChatFieldContentHeight= () => {\r\n // Checks if Internet Explorer\r\n const ua = window.navigator.userAgent;\r\n const isIe = ua.indexOf('MSIE ') > 0 || ua.indexOf('Trident/') > 0;\r\n\r\n if (!this.chatFieldContentDiv) {\r\n return null;\r\n }\r\n\r\n return isIe ? this.chatFieldContentDiv.scrollHeight : this.chatFieldContentDiv.clientHeight;\r\n };\r\n\r\n /**\r\n * Loads more chat messages when start of messages div is scrolled into view.\r\n */\r\n handleLoadMoreVisibilityChange = (isVisible) => {\r\n if (isVisible && this.state.loadMoreEnabled)\r\n {\r\n this.setState({lastChatFieldContentHeight: 0, scrollToOldHeight: true}, () => {\r\n this.props.loadMoreSpeechBubble();\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks every 200 ms if the height of the chatfield has changed and scrolls top the top if it has.\r\n * This fix is because of componentDidUpdate() does not get called if for example\r\n * a height change is caused by a youtube video initializing in a child component.\r\n */\r\n componentDidUpdate(prevProps) {\r\n // If chatConfig or language changes, re-initialize menu items\r\n if (prevProps.chatConfig !== this.props.chatConfig || prevProps.language !== this.props.language) {\r\n /* this.initializeChatMenuItems(); */\r\n }\r\n\r\n // Scroll to top if switching to ChatBotChatField (withMemory enabled)\r\n if (!prevProps.chatConfig.withMemory && this.props.chatConfig.withMemory) {\r\n this.scrollToTop();\r\n }\r\n }\r\n\r\n componentDidMount = () => {\r\n /* this.initializeChatMenuItems(); */\r\n const that = this;\r\n\r\n setInterval(() => {\r\n if (that.chatFieldContentDiv == null) {\r\n return;\r\n }\r\n\r\n const chatFieldContentHeight = this.getChatFieldContentHeight();\r\n\r\n if (chatFieldContentHeight && chatFieldContentHeight !== that.state.lastChatFieldContentHeight) {\r\n\r\n if (that.state.loadMoreEnabled === false) {\r\n setTimeout(() => {\r\n this.setState({loadMoreEnabled: true});\r\n }, 1000)\r\n }\r\n\r\n if (this.props.loadToEnd) {\r\n that.scrollToTop();\r\n\r\n } else if (this.state.scrollToOldHeight) {\r\n that.chatFieldParentContainerDiv.scrollTop = chatFieldContentHeight - that.state.lastChatFieldContentHeight;\r\n }\r\n\r\n that.setState({lastChatFieldContentHeight: chatFieldContentHeight, scrollToOldHeight: false});\r\n }\r\n }, 200);\r\n\r\n setTimeout(() => {\r\n this.setState({loadMoreEnabled: true});\r\n }, 2000);\r\n\r\n if (this.props.chatConfig.withMemory) {\r\n setTimeout(() => this.scrollToTop(), 100);\r\n }\r\n\r\n };\r\n\r\n\r\n initializeChatMenuItems = (reset) => {\r\n if(reset){\r\n if (this.props.chatConfig && this.props.language) {\r\n const localizationCode = getLocalizationLanguageCode(\r\n this.props.language ? this.props.language.languageCode : null\r\n );\r\n\r\n const chatMenuItemList = this.props.chatConfig.chatMenuItemList.filter((chatMenuItem) => {\r\n return chatMenuItem.languageCode === this.props.language.languageCode;\r\n });\r\n\r\n this.setState({ chatMenuItemList }, () => {\r\n // Defer the resize call to ensure layout has settled\r\n setTimeout(() => {\r\n this.props.resizeChatContainer(chatMenuItemList.length);\r\n }, 0);\r\n });\r\n } else {\r\n this.setState({ chatMenuItemList: [] });\r\n }\r\n }\r\n else {\r\n this.setState({ chatMenuItemList: [] });\r\n }\r\n };\r\n\r\n\r\n handleMenuItemClick = async (menuItem) => {\r\n await this.props.onMenuItemClick(menuItem);\r\n\r\n this.setState({ chatMenuItemList: [] });\r\n };\r\n\r\n\r\n resetChatMenuItems = () => {\r\n this.setState({ chatMenuItemList: [] });\r\n };\r\n\r\n /**\r\n * Returns an array of the rows of speechbubbles.\r\n * Here continuous suggestions from the same response is added to the same rows.\r\n * @returns {[]|Array}\r\n */\r\n getSpeechBubbleRowList = () => {\r\n if (!this.props.speechBubbleList) {\r\n return [];\r\n }\r\n\r\n let rowList = [];\r\n let row = [];\r\n this.props.speechBubbleList.forEach((speechBubble, index, array) => {\r\n if (!speechBubble.hidden) {\r\n row.push(speechBubble);\r\n }\r\n\r\n const flex = (index + 1 <= array.length - 1) &&\r\n speechBubble.chatResponseId != null && array[index + 1].chatResponseId != null &&\r\n (speechBubble.chatResponseId === array[index + 1].chatResponseId) &&\r\n ((speechBubble.suggestion != null && array[index + 1].suggestion != null) ||\r\n (speechBubble.lineBreakType !== LineBreakTypeEnum.notSet &&\r\n speechBubble.lineBreakType !== LineBreakTypeEnum.newLine &&\r\n speechBubble.lineBreakType === array[index + 1].lineBreakType));\r\n\r\n if (flex === false) {\r\n if (row.length > 0) {\r\n rowList.push(row);\r\n }\r\n\r\n row = [];\r\n }\r\n });\r\n\r\n return rowList;\r\n };\r\n\r\n renderSpeechBubbleRow = (speechBubbleRow) => {\r\n // Determine if the row has any non-hidden messages and calculate the last message length\r\n /* const nonHiddenMessages = speechBubbleRow\r\n .flatMap((speechBubble) => speechBubble.messageList)\r\n .filter((message) => !message.hidden);\r\n\r\n if (nonHiddenMessages.length > 0) {\r\n const lastMessage = nonHiddenMessages[nonHiddenMessages.length - 1];\r\n // Update the state with the length of the last message only if it has changed\r\n //HER skal der være en condition !chatConfig.withMemory\r\n if (lastMessage.content.length !== this.state.lastMessageLength && (this.props.chatConfig.withMemory)) {\r\n this.setState({ lastMessageLength: lastMessage.content.length });\r\n }\r\n } */\r\n return (\r\n speechBubbleRow.map((speechBubble, index) => (\r\n speechBubble.hidden ? null :\r\n (speechBubble.messageList.every((message) => (message.hidden === true )) ? null :\r\n \r\n \r\n \r\n )\r\n ))\r\n );\r\n };\r\n\r\n\r\n\r\n clearSpeechBubble = () => {\r\n\r\n }\r\n\r\n render() {\r\n\r\n if (!this.props.showSearchBotChatField) {\r\n\r\n return null;\r\n }\r\n const { chatConfig, sourcesList } = this.props;\r\n const withMemory = chatConfig?.withMemory;\r\n let chatMenuItemList = this.state.chatMenuItemList;\r\n // Create the menu buttons as the content for the speech bubble\r\n const menuButtons = chatMenuItemList.slice(0, 3).map((menuItem, index) => (\r\n this.handleMenuItemClick(menuItem)}\r\n style={{\r\n margin: '5px',\r\n padding: '10px',\r\n borderRadius: '5px',\r\n border: '1px solid #ccc',\r\n background: '#f9f9f9',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n {menuItem.displayName || `Menu Item ${index + 1}`}\r\n \r\n ));\r\n\r\n const menuList = (\r\n
\r\n \r\n {chatMenuItemList.map((menuItem, index) => (\r\n this.handleMenuItemClick(menuItem)}\r\n style={{\r\n padding: '10px',\r\n borderBottom: '1px solid #eee',\r\n height: '35px',\r\n /* borderColor: this.props.chatConfig.speechBubbleUserColor, */\r\n\r\n }}\r\n onMouseOver={(event) => event.currentTarget.style.background = '#e0e0e0'}\r\n onMouseOut={(event) => event.currentTarget.style.background = 'transparent'}\r\n >\r\n \r\n \r\n ))}\r\n \r\n
\r\n );\r\n\r\n\r\n\r\n const speechBubbleRowList = this.getSpeechBubbleRowList();\r\n let sortedSpeechBubbleRowList = []\r\n\r\n let tempSpeechBubbleRowList = [];\r\n for(let i = 0; i < speechBubbleRowList.length; i++){\r\n\r\n if(speechBubbleRowList[i][0] != null){\r\n if(speechBubbleRowList[i][0].isUser){\r\n if(tempSpeechBubbleRowList.length > 0){\r\n tempSpeechBubbleRowList[tempSpeechBubbleRowList.length - 1].lastRow = true;\r\n sortedSpeechBubbleRowList.push(tempSpeechBubbleRowList)\r\n tempSpeechBubbleRowList = [];\r\n }\r\n sortedSpeechBubbleRowList.push([speechBubbleRowList[i]])\r\n } else if(tempSpeechBubbleRowList.length === 0 || speechBubbleRowList[i][0].dropId === tempSpeechBubbleRowList[0][0].dropId){\r\n tempSpeechBubbleRowList.push(speechBubbleRowList[i])\r\n } else {\r\n tempSpeechBubbleRowList[tempSpeechBubbleRowList.length - 1].lastRow = true;\r\n sortedSpeechBubbleRowList.push(tempSpeechBubbleRowList)\r\n tempSpeechBubbleRowList = [];\r\n tempSpeechBubbleRowList.push(speechBubbleRowList[i]);\r\n }\r\n\r\n }\r\n }\r\n\r\n if(tempSpeechBubbleRowList.length > 0){\r\n tempSpeechBubbleRowList[tempSpeechBubbleRowList.length - 1].lastRow = true;\r\n sortedSpeechBubbleRowList.push(tempSpeechBubbleRowList)\r\n }\r\n\r\n sortedSpeechBubbleRowList.reverse();\r\n sortedSpeechBubbleRowList = sortedSpeechBubbleRowList.flat();\r\n\r\n // let searchBotAnswerRowList = [];\r\n // for(let i = speechBubbleRowList.length - 1; i >= 0; i--){\r\n // if(speechBubbleRowList[i][0] != null) {\r\n // if (speechBubbleRowList[i][0].isUser) {\r\n // if (searchBotAnswerRowList.length > 0) {\r\n // searchBotAnswerRowList[0].lastRow = true;\r\n // const lastRow = searchBotAnswerRowList.find(answerRow => answerRow[0].suggestion == null)\r\n // if(lastRow){\r\n // lastRow.lastRow = true;\r\n // }\r\n // searchBotAnswerRowList.reverse();\r\n // sortedSpeechBubbleRowList.push(...searchBotAnswerRowList)\r\n // sortedSpeechBubbleRowList.push(speechBubbleRowList[i])\r\n // searchBotAnswerRowList = [];\r\n // } else {\r\n // sortedSpeechBubbleRowList.push(speechBubbleRowList[i])\r\n // }\r\n // } else {\r\n // if(speechBubbleRowList[i][0].chatResponseId === \"00000000-0000-0000-0000-000000000000\"){\r\n // sortedSpeechBubbleRowList.push(speechBubbleRowList[i])\r\n // } else {\r\n // if(searchBotAnswerRowList.length > 0 && searchBotAnswerRowList[0][0].chatResponseId !== speechBubbleRowList[i][0].chatResponseId){\r\n // const lastRow = searchBotAnswerRowList.find(answerRow => answerRow[0].suggestion == null)\r\n // if(lastRow){\r\n // lastRow.lastRow = true;\r\n // }\r\n // searchBotAnswerRowList.reverse();\r\n // sortedSpeechBubbleRowList.push(...searchBotAnswerRowList)\r\n // searchBotAnswerRowList = [];\r\n // }\r\n // searchBotAnswerRowList.push(speechBubbleRowList[i])\r\n // if(i === speechBubbleRowList.length - 1){\r\n // sortedSpeechBubbleRowList.push(...searchBotAnswerRowList)\r\n // }\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n\r\n if (sortedSpeechBubbleRowList.length > 0 && !(this.props.chatConfig.withMemory)) {\r\n sortedSpeechBubbleRowList = [sortedSpeechBubbleRowList[sortedSpeechBubbleRowList.length - 1]];\r\n }\r\n if(this.props.chatConfig.withMemory){\r\n sortedSpeechBubbleRowList = sortedSpeechBubbleRowList.reverse();\r\n }\r\n\r\n return (\r\n (this.chatFieldParentContainerDiv = div)}\r\n style={{ display: 'flex', flexDirection: 'column', height: '100%' }}\r\n >\r\n {/* The top disclaimers row, with an X on the right */}\r\n \r\n {/* LEFT container */}\r\n
\r\n {this.props.chatConfig.openDownwards ? (\r\n \r\n {this.props.chatConfig.disclaimer || ''}\r\n \r\n ) : null}\r\n
\r\n\r\n {/**/}\r\n\r\n {/* RIGHT container */}\r\n
\r\n this.props.setShowSearchBotChatField(false)}\r\n style={{\r\n fontSize: '24px',\r\n minWidth: 'auto',\r\n padding: '4px 8px',\r\n lineHeight: '1',\r\n color: this.props.chatConfig.startButtonFillColor,\r\n backgroundColor: this.props.chatConfig.startButtonBackgroundColor ? this.props.chatConfig.startButtonBackgroundColor :'transparent'\r\n }}\r\n aria-label=\"Close Chat\"\r\n >\r\n ×\r\n \r\n
\r\n \r\n\r\n\r\n\r\n {/* If scrolled up to load older messages, show a progress bar */}\r\n {this.state.scrollToOldHeight ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n\r\n (this.chatFieldContentDiv = div)}\r\n style={{ flex: 1, overflowY: 'auto' }}\r\n >\r\n {\r\n this.messagesEnd = el;\r\n }}\r\n />\r\n\r\n {/*\r\n If withMemory = true, we want to render the entire\r\n ChatBotChatField layout. Otherwise, we do the \"resume\"\r\n logic below.\r\n */}\r\n {this.props.chatConfig.withMemory ? ( this.props.speechBubbleList && this.props.speechBubbleList.length>0 &&\r\n /*\r\n RENDER THE FULL ChatBotChatField\r\n (the normal bottom-scroll chat layout)\r\n */\r\n \r\n ) : (\r\n /*\r\n RENDER THE \"RESUME\" LOGIC (if withMemory = false)\r\n */\r\n ((this.props.botWriting || this.props.speechBubbleList.length > 0) &&\r\n
\r\n {/* Only show “Resumé” if there's something to display */}\r\n {(this.props.botWriting || sortedSpeechBubbleRowList.length > 0) ? (\r\n
\r\n {/**/}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/* */}\r\n {/**/}\r\n Resultat\r\n
\r\n ) : null}\r\n\r\n {/* If the bot is writing, show a typing bubble */}\r\n {this.props.botWriting ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n\r\n {/* If the user is writing, show a typing bubble */}\r\n {this.props.userWriting ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n\r\n {/* Render the final sorted speech bubble rows */}\r\n
\r\n {sortedSpeechBubbleRowList.map((speechBubbleRow, index) => (\r\n \r\n {speechBubbleRow[0].lineBreakType ===\r\n LineBreakTypeEnum.carousel ? (\r\n \r\n {this.renderSpeechBubbleRow(speechBubbleRow)}\r\n \r\n ) : (\r\n this.renderSpeechBubbleRow(speechBubbleRow)\r\n )}\r\n
\r\n ))}\r\n
\r\n\r\n {/* Optionally show a VizSensor to load more when scrolled up */}\r\n {this.props.loadMore && speechBubbleRowList.length > 0 ? (\r\n \r\n
\r\n \r\n ) : null}\r\n
)\r\n )}\r\n\r\n {/* Menu items appear in BOTH modes, below the main chat area */}\r\n {this.state.chatMenuItemList.length > 0 ? (\r\n
{menuList}
\r\n ) : null}\r\n\r\n {sourcesList && sourcesList.length > 0 && chatConfig.showSources ? (\r\n
\r\n {/* Optionally uncomment the title if needed */}\r\n {/*
Fundne kilder
*/}\r\n \r\n {sourcesList.map(([content, title, url], index) => (\r\n \r\n \r\n { url &&\r\n
\r\n {/* Changed 'flexWrap' from 'wrap' to 'nowrap' to prevent wrapping */}\r\n \r\n \r\n {url}\r\n \r\n
}\r\n\r\n\r\n {chatConfig.showSourcesWithContent &&\r\n <>\r\n {/* Title */}\r\n \r\n {title}\r\n
\r\n\r\n {/* Content */}\r\n \r\n {content}\r\n \r\n }\r\n \r\n \r\n ))}\r\n \r\n \r\n ) : null}\r\n\r\n\r\n {/* Footer text */}\r\n \r\n\r\n \r\n { !this.props.chatConfig.openDownwards && this.props.chatConfig.disclaimer || ''}\r\n \r\n\r\n {this.props.chatConfig.showPoweredBy &&\r\n Powered by InDialog.ai}\r\n \r\n\r\n\r\n \r\n \r\n );\r\n }\r\n}\r\nexport default SearchBotChatField;","import React, {Component, Fragment, createRef} from 'react';\r\nimport * as SignalR from '@aspnet/signalr';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport '../chat.css';\r\nimport Setup from '../config/Setup'\r\nimport MessageType from '../config/constants/MessageTypeEnum'\r\nimport ChatBotChatField from './chatField/ChatBotChatField';\r\nimport ChatInput from './chatInput/ChatInput';\r\nimport ChatResponseFeedbackEnum from \"../config/constants/ChatResponseFeedbackEnum\";\r\nimport ChatQuestionTypeEnum from \"../config/constants/ChatQuestionTypeEnum\";\r\nimport LineBreakTypeEnum from \"../config/constants/LineBreakTypeEnum\";\r\nimport InfoPage from \"./infoPage/InfoPage\";\r\nimport axios from \"axios\";\r\nimport MuiAlert from \"@material-ui/lab/Alert\";\r\nimport Snackbar from \"@material-ui/core/Snackbar\";\r\nimport Localization from \"../config/localization/Localization\";\r\nimport CircularProgress from \"@material-ui/core/CircularProgress\";\r\nimport {isMobile} from \"react-device-detect\";\r\nimport { getLocalizationLanguageCode } from \"../util/localization\";\r\nimport LayoutTypeEnum from \"../config/constants/LayoutTypeEnum\";\r\nimport TopBar from \"./topBar/TopBar\";\r\nimport SearchBotChatField from \"./chatField/searchBotChatField/SearchBotChatField\";\r\nimport MarkdownIt from \"markdown-it\";\r\nimport markdownItCodeCopy from 'markdown-it-code-copy';\r\n\r\n/**\r\n * Class for the chat.\r\n * Handles the signalR logic for sending and receiving messages.\r\n */\r\nclass Chat extends Component {\r\n constructor(props) {\r\n super(props);\r\n this.searchBotFieldRef = createRef();\r\n this.chatAttachmentRef = createRef();\r\n const searchParams = new URLSearchParams(this.props.location.search.toString());\r\n const chatbotOpenState = (searchParams.get(\"openState\") === 'true');\r\n const intentId = searchParams.get(\"intentId\");\r\n const languageParam = searchParams.get(\"language\");\r\n\r\n\r\n const token = this.props.match.params.token;\r\n const userId = this.props.match.params.userId;\r\n const chatAgentMode = this.props.match.params.chatAgentMode ? true : false;\r\n const integrationType = this.props.match.params.integrationType ? parseInt(this.props.match.params.integrationType) : null;\r\n const domain = (document.referrer ?\r\n document.referrer.toLowerCase().split('/')[2].split(':')[0].trim()\r\n : (document.location.ancestorOrigins ? \r\n document.location.ancestorOrigins[0].toLowerCase().split('/')[2].split(':')[0].trim():null));\r\n const clientKey = this.props.match.params.clientKey;\r\n\r\n this.state = {\r\n botWriting: false,\r\n userWriting: false,\r\n speechBubbleList: [],\r\n hubConnection: null,\r\n connected: false,\r\n showConnectionLostMsg: false,\r\n token: token,\r\n languageParam: languageParam,\r\n language: this.props.match.params.languageData ? JSON.parse(decodeURIComponent(this.props.match.params.languageData)) : null,\r\n intentId: intentId,\r\n chatConfig: null,\r\n requestedWelcome: false,\r\n userId: userId,\r\n chatAgentMode: chatAgentMode,\r\n integrationType: integrationType,\r\n forceWelcomeMessage: false,\r\n startLoad: 0,\r\n loadMore: false,\r\n loadToEnd: true,\r\n showInfoPage: false,\r\n snackbarErrorMessage: null,\r\n chatbotOpenState: chatbotOpenState,\r\n hadFirstClick: false,\r\n welcomePreviewEnabled: false,\r\n clientKey: clientKey,\r\n domain: domain,\r\n disableConnectionRetry: false,\r\n trainingPhraseList: [],\r\n streamIdStopped: [],\r\n lastStreamId: null,\r\n isMaximized: false,\r\n speechBubbleBuffer :[],\r\n showStopMessage : false,\r\n\r\n isChatMinimized: true,\r\n chatInputMessage: '',\r\n showSearchBotChatField: false,\r\n chatFieldPlacement: 'top',\r\n openDownWards: null,\r\n pendingFileUrls: [],\r\n pendingFiles: [],\r\n fileUploadedList: [], // This keeps track of the visuals of the uploaded files.\r\n fileUploadedListRemove: null,\r\n fileUploadedText:false,\r\n fileUploading:false\r\n };\r\n\r\n // Event listener for outside iframe\r\n const iframeListener = (e) => {\r\n\r\n if (e.data.setchatbotOpenState != null) {\r\n this.setState({chatbotOpenState: e.data.setchatbotOpenState});\r\n\r\n } else if (e.data.setWelcomePreviewEnabled != null) {\r\n this.setState({welcomePreviewEnabled: e.data.setWelcomePreviewEnabled});\r\n }\r\n };\r\n\r\n try {\r\n if ('addEventListener' in window) {\r\n\r\n window.addEventListener('message', iframeListener);\r\n\r\n } else if ('attachEvent' in window) { //IE\r\n\r\n window.attachEvent('message', iframeListener);\r\n }\r\n } catch (err) {\r\n console.log(err);\r\n }\r\n }\r\n\r\n /**\r\n * Sends a SignalR message with one available retry after 3 seconds.\r\n */\r\n invokeSignalRMessage = (args) => {\r\n return this.state.hubConnection\r\n .invoke(...args)\r\n .catch(err => {\r\n console.error('Message failed, retrying...');\r\n\r\n setTimeout(() => {\r\n this.state.hubConnection\r\n .invoke(...args)\r\n .catch(err => {\r\n console.error(err);\r\n });\r\n }, 3000);\r\n })\r\n };\r\n\r\n markText = (text) => {\r\n var md = new MarkdownIt({\r\n linkify: true,\r\n html: true,\r\n }).use(markdownItCodeCopy, {\r\n iconStyle: \"font-size: 21px; opacity: 0.4;\",\r\n iconClass: \"mdi content-copy\",\r\n buttonStyle: 'position: absolute; top: 7.5px; right: 6px; cursor: pointer; outline: none;',\r\n buttonClass: ''\r\n });\r\n\r\n const defaultRender = md.renderer.rules.link_open || function (tokens, idx, options, env, self) {\r\n return self.renderToken(tokens, idx, options);\r\n };\r\n\r\n // Add target=\"_blank\" to external links\r\n md.renderer.rules.link_open = function (tokens, idx, options, env, self) {\r\n const aIndex = tokens[idx].attrIndex('target');\r\n\r\n if (aIndex < 0) {\r\n tokens[idx].attrPush(['target', '_blank']); // add new attribute\r\n } else {\r\n tokens[idx].attrs[aIndex][1] = '_blank'; // replace value of existing attr\r\n }\r\n\r\n // Adding rel=\"noopener noreferrer\"\r\n const relIndex = tokens[idx].attrIndex('rel');\r\n\r\n if (relIndex < 0) {\r\n tokens[idx].attrPush(['rel', 'noopener noreferrer']);\r\n } else {\r\n tokens[idx].attrs[relIndex][1] = 'noopener noreferrer';\r\n }\r\n\r\n const hrefIndex = tokens[idx].attrIndex('href');\r\n\r\n if (hrefIndex >= 0) {\r\n // Fjern parenteser i URL'en\r\n tokens[idx].attrs[hrefIndex][1] = tokens[idx].attrs[hrefIndex][1].replace(/\\(|\\)/g, '');\r\n }\r\n\r\n // pass token to default renderer.\r\n return defaultRender(tokens, idx, options, env, self);\r\n };\r\n\r\n let renderedText = md.render(text);\r\n // Remove the first

and the corresponding

if they exist\r\n if (renderedText.startsWith(\"

\")) {\r\n renderedText = renderedText.substring(3);\r\n }\r\n if (renderedText.endsWith(\"

\\n\")) {\r\n renderedText = renderedText.substring(0, renderedText.length - 5);\r\n }\r\n\r\n return renderedText;\r\n }\r\n\r\n setShowSearchBotChatField = (show) => {\r\n\r\n window.parent.postMessage({'showSearchBotChatField': show}, '*');\r\n\r\n this.setState({showSearchBotChatField: show})\r\n }\r\n\r\n loadMoreSpeechBubble = () => {\r\n this.setState({loadToEnd : false});\r\n this.invokeSignalRMessage(['SendChatHistory', this.state.language.id, this.state.startLoad, Setup.messageLoadCount]);\r\n };\r\n\r\n sendMostAskedQuestions = (questions) => {\r\n this.invokeSignalRMessage(['SendMostAskedQuestions', this.state.language.id, this.state.startLoad, Setup.messageLoadCount, questions]);\r\n } \r\n componentDidUpdate(prevProps, prevState) {\r\n if (prevState.pendingFileUrls !== this.state.pendingFileUrls) {\r\n const uniquePendingFileUrls = [...new Set(this.state.pendingFileUrls)];\r\n if (uniquePendingFileUrls.length !== this.state.pendingFileUrls.length) {\r\n this.setState({ pendingFileUrls: uniquePendingFileUrls });\r\n }\r\n }\r\n \r\n if (prevState.fileUploadedList !== this.state.fileUploadedList) {\r\n if (this.state.fileUploadedList && this.state.fileUploadedList.length > 0) {\r\n this.setState({ fileUploadedText: true });}\r\n const uniqueFileUploadedList = [...new Set(this.state.fileUploadedList)];\r\n if (uniqueFileUploadedList.length !== this.state.fileUploadedList.length) {\r\n this.setState({ fileUploadedList: uniqueFileUploadedList });\r\n }\r\n }\r\n \r\n if (prevState.sourcesList !== this.state.sourcesList && this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot) {\r\n this.resizeSourceContainer(this.state.sourcesList);\r\n }\r\n if ((prevState.chatConfig !== this.state.chatConfig)) {\r\n this.setChatFieldPlacement();\r\n }\r\n }\r\n \r\n\r\n\r\n /**\r\n * On startup a connection is made to the SignalR hub and event listeners is set up.\r\n */\r\n componentDidMount = () => {\r\n // SignalR connection config.\r\n const hubConnection = new SignalR.HubConnectionBuilder()\r\n .withUrl((process.env.NODE_ENV === 'development' ? Setup.apiEndpointDev : process.env.REACT_APP_TEST_BUILD ? Setup.apiEndpointTest : Setup.apiEndpointProd) +\r\n 'chat?token=' + this.state.token + '&userId=' + this.state.userId + '&chatAgentMode=' + this.state.chatAgentMode +\r\n '&clientKey=' + this.state.clientKey + '&domain=' + this.state.domain)\r\n .configureLogging(process.env.NODE_ENV === 'development' || process.env.REACT_APP_TEST_BUILD ? SignalR.LogLevel.Debug : SignalR.LogLevel.Error)\r\n .build();\r\n\r\n // Establishing connection to SignalR hub.\r\n this.setState({hubConnection}, () => {\r\n this.startChatConnection();\r\n\r\n // Event listener for when the connection is lost\r\n this.state.hubConnection.onclose((error) => {\r\n this.setState({connected: false}, () => {\r\n setTimeout(() => {\r\n this.startChatConnection();\r\n }, Setup.signalrConnectionRetryInterval);\r\n });\r\n });\r\n\r\n // Event listener for when the widget should disable retry\r\n this.state.hubConnection.on('DisableConnectionRetry', () => {\r\n this.setState({DisableConnectionRetry: true});\r\n window.parent.postMessage({'hideChatbot': true}, '*');\r\n });\r\n\r\n // Event listener for when the chat config is recieved.\r\n this.state.hubConnection.on('ChatConfig', (chatConfig, token) => {\r\n this.setState({token});\r\n\r\n if(chatConfig.layoutMode === LayoutTypeEnum.searchBot)\r\n {\r\n window.parent.postMessage({'setSearchbotToken': token}, '*');\r\n }else\r\n {\r\n window.parent.postMessage({'setChatToken': token}, '*');\r\n }\r\n\r\n\r\n\r\n hubConnection.connection.baseUrl = (process.env.NODE_ENV === 'development' ? Setup.apiEndpointDev : process.env.REACT_APP_TEST_BUILD ? Setup.apiEndpointTest : Setup.apiEndpointProd) +\r\n 'chat?token=' + token+ '&userId=' + this.state.userId + '&chatAgentMode=' + this.state.chatAgentMode +\r\n '&clientKey=' + this.state.clientKey + '&domain=' + this.state.domain;\r\n\r\n if (this.state.chatConfig) {\r\n return;\r\n }\r\n\r\n this.setState({chatConfig});\r\n\r\n let language = this.state.language;\r\n let languageParam = this.state.languageParam;\r\n\r\n // First try to read the language from query parameter.\r\n if (!language && languageParam) {\r\n //override e-gb to en - language\r\n if(languageParam.toLowerCase() == \"en-gb\")\r\n {\r\n languageParam = \"en\";\r\n }\r\n language = chatConfig.chatConfigLanguageList.find((lang) => {\r\n return lang.language.languageCode.toLowerCase() === languageParam.toLowerCase() ||\r\n lang.language.languageCodeShort.toLowerCase() === languageParam.toLowerCase() ||\r\n lang.language.countryCode.toLowerCase() === languageParam.toLowerCase() ||\r\n lang.language.name.toLowerCase() === languageParam.toLowerCase();\r\n }).language;\r\n }\r\n\r\n // If no language found, set the first language in the chat config as selected.\r\n if (!language) {\r\n language = chatConfig.chatConfigLanguageList[0].language;\r\n }\r\n\r\n this.setState({language}, () => {\r\n if(!(this.state.userId == null && this.state.chatConfig.layoutMode !== null && this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot)){\r\n this.invokeSignalRMessage(['SendChatHistory', this.state.language.id, this.state.startLoad, Setup.messageLoadCount]);\r\n }\r\n });\r\n\r\n // Inject client html, script and css\r\n const head = document.getElementsByTagName('head')[0];\r\n\r\n if (chatConfig.clientScript && this.state.userId == null) {\r\n const clientScriptElement = document.createElement('script');\r\n clientScriptElement.text = chatConfig.clientScript;\r\n\r\n head.appendChild(clientScriptElement);\r\n }\r\n\r\n if (chatConfig.clientCss) {\r\n const clientStyleElement = document.createElement('style');\r\n clientStyleElement.appendChild(document.createTextNode(chatConfig.clientCss));\r\n\r\n head.appendChild(clientStyleElement);\r\n }\r\n\r\n if (chatConfig.clientHeaderHtml) {\r\n\r\n const linkElement = document.createElement('link');\r\n linkElement.href = chatConfig.clientHeaderHtml;\r\n linkElement.rel = 'stylesheet';\r\n\r\n head.appendChild(linkElement);\r\n }\r\n\r\n if(chatConfig.soundOnMessageReceived) {\r\n var x = document.createElement(\"AUDIO\");\r\n x.id = \"audio_messagereceived\";\r\n x.src = \"/sound/\" + chatConfig.messageReceivedSound;\r\n x.preload = \"auto\";\r\n document.body.appendChild(x);\r\n }\r\n\r\n if (this.state.chatConfig && \r\n this.state.chatConfig.layoutMode !== null && \r\n this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot) {\r\n this.setSearchBot();\r\n this.setChatFieldPlacement();\r\n }\r\n else{\r\n this.setChatBot();\r\n }\r\n\r\n });\r\n\r\n // Event listener for when user or chat agent starts or stop writing\r\n this.state.hubConnection.on('SendUserIsWriting', (isChatAgent, isWriting) => {\r\n if (isChatAgent) {\r\n this.setState({botWriting: isWriting});\r\n } else {\r\n this.setState({userWriting: isWriting});\r\n }\r\n });\r\n\r\n // Event listener for when messages are recieved.\r\n this.state.hubConnection.on('Send', (chatResponse) => {\r\n if (this.state.chatbotOpenState === false) {\r\n const showNewMsgIcon = isMobile ? this.state.chatConfig.showNewMsgIconMobile : this.state.chatConfig.showNewMsgIconDesktop;\r\n\r\n if (showNewMsgIcon) {\r\n window.parent.postMessage({'showNewMsgIcon': true}, '*');\r\n }\r\n }\r\n\r\n this.setState({loadToEnd: true});\r\n this.handleChatResponse(chatResponse);\r\n });\r\n\r\n this.state.hubConnection.on('SendSource', (chatResponse) => {\r\n\r\n let uniqueTuples = [...this.state.sourcesList];\r\n /* console.log(speechBubbleList, \"HER\") */\r\n //Her skal du så hvert svar ^ lave et array eller noget, så du senere kan vise Link/Titel og et uddrag fra kilden\r\n if(chatResponse.speechBubbleList!=null && chatResponse.speechBubbleList.length> 0 ) {\r\n chatResponse.speechBubbleList.forEach((speechBubble) => {\r\n if (speechBubble.title !== \"\" && speechBubble.url !== \"\") {\r\n const exists = uniqueTuples.some(\r\n ([title, url]) => title === speechBubble.title && url === speechBubble.url\r\n );\r\n\r\n if (!exists) {\r\n uniqueTuples.push([speechBubble.messageList\r\n .map(message => this.markText(message.content))\r\n .join('\\n'),speechBubble.title, speechBubble.url]); // Add tuple to state array.\r\n }\r\n }\r\n });\r\n\r\n // Update state with unique tuples\r\n this.setState({ sourcesList: uniqueTuples });\r\n }\r\n\r\n });\r\n\r\n \r\n\r\n // Event listener when chat history is received\r\n this.state.hubConnection.on('SendChatHistory', (chatResponseListResult) => {\r\n let speechBubbleList = this.state.speechBubbleList;\r\n\r\n if(this.state.loadToEnd == false) {\r\n chatResponseListResult.item2= chatResponseListResult.item2.reverse();\r\n }\r\n\r\n chatResponseListResult.item2.forEach((chatResponse) => {\r\n if(this.state.loadToEnd == false) {\r\n chatResponse.speechBubbleList= chatResponse.speechBubbleList.reverse();\r\n }\r\n speechBubbleList = this.handleChatResponse(chatResponse, speechBubbleList);\r\n });\r\n\r\n const startLoadCalc = this.state.startLoad + chatResponseListResult.item2.length;\r\n const loadMoreCalc = startLoadCalc < chatResponseListResult.item1;\r\n\r\n this.setState({totalCount: chatResponseListResult.item1,startLoad: startLoadCalc, loadMore: loadMoreCalc});\r\n\r\n this.setState({speechBubbleList}, () => {\r\n if (this.state.requestedWelcome === false && this.state.userId == null) {\r\n if (this.state.intentId) {\r\n this.sendIntent(this.state.intentId, ChatQuestionTypeEnum.customIntent);\r\n } else {\r\n this.sendWelcome();\r\n }\r\n\r\n this.setState({requestedWelcome: true});\r\n }\r\n });\r\n\r\n });\r\n\r\n\r\n // Event listener when a user likes a message\r\n this.state.hubConnection.on('SendChatResponseFeedback', (chatQuestionId, chatResponseFeedback) => {\r\n let speechBubbleList = this.state.speechBubbleList;\r\n\r\n const speechBubbleIndex = speechBubbleList.findIndex(sb => sb.chatQuestionId === chatQuestionId);\r\n if (speechBubbleIndex !== -1) {\r\n speechBubbleList[speechBubbleIndex].chatResponseFeedback = chatResponseFeedback;\r\n\r\n this.setState({speechBubbleList});\r\n }\r\n });\r\n\r\n // Event listener for when mail is sent.\r\n this.state.hubConnection.on('SendEmail', () => {\r\n this.setState({botWriting: false});\r\n\r\n let speechBubbleList = this.state.speechBubbleList;\r\n\r\n speechBubbleList.forEach((speechBubble) => {\r\n if (speechBubble.isMailResponse) {\r\n speechBubble.hidden = false;\r\n }\r\n });\r\n\r\n this.setState({speechBubbleList});\r\n });\r\n\r\n this.state.hubConnection.on('SendTrainingPhraseList', (trainingPhraseList) => {\r\n this.setState({trainingPhraseList: trainingPhraseList });\r\n });\r\n });\r\n\r\n };\r\n\r\n toggleChatbot = () => {\r\n this.setState((prevState) => ({\r\n isChatMinimized: !prevState.isChatMinimized\r\n }));\r\n };\r\n\r\n handleMenuItemClick = (menuItem) => {\r\n\r\n const speechBubbleToDisplay = this.getMessageSpeechBubble(menuItem.displayName);\r\n\r\n this.setBotIsWriting();\r\n\r\n if(this.state.chatConfig.layoutMode !== null && this.state.chatConfig.layoutMode === LayoutTypeEnum.chatBot){\r\n this.appendSendMessage(speechBubbleToDisplay);\r\n }else {\r\n this.setState({ chatInputMessage: menuItem.displayName });\r\n }\r\n\r\n };\r\n\r\n handleResetUploadedFiles = () => {\r\n this.setState({fileUploadedList:[]})\r\n }\r\n\r\n handleAddUploadedFiles = (newFile) => {\r\n this.setState(prevState => {\r\n\r\n const fileExists = prevState.fileUploadedList.some(file => file === newFile);\r\n if (fileExists) {\r\n return null;\r\n }\r\n\r\n return {\r\n fileUploadedList: [...prevState.fileUploadedList, newFile]\r\n };\r\n });\r\n }\r\n\r\n handleDeleteUploadedFile = (fileName) => {\r\n this.setState((prevState) => {\r\n const updatedFileUploadedList = prevState.fileUploadedList.filter(file => file !== fileName);\r\n const updatedPendingFiles = prevState.pendingFiles.filter(file => !file.name.includes(fileName));\r\n\r\n return {\r\n fileUploadedList: updatedFileUploadedList,\r\n pendingFiles: updatedPendingFiles\r\n };\r\n }, () => {\r\n this.setState((prevState) => ({\r\n fileUploadedText: prevState.fileUploadedList.length > 0\r\n }));\r\n });\r\n };\r\n\r\n \r\n handleFlushDeleteUploadedFile = () => {\r\n this.setState({fileUploadedListRemove: null})\r\n if (this.state.fileUploadedList && this.state.fileUploadedList.length > 0) {\r\n this.setState({ fileUploadedText: true });\r\n } else {\r\n this.setState({ fileUploadedText: false });\r\n }\r\n }\r\n\r\n handleDeletePendingFile = (fileName) => {\r\n this.setState(prevState => ({\r\n fileUploadedList: prevState.fileUploadedList.filter(file => file !== fileName),\r\n pendingFiles: prevState.pendingFiles.filter(file => !file.name.includes(fileName)),\r\n }));\r\n };\r\n\r\n\r\n \r\n handleChatResponse = (chatResponse, speechBubbleList) => {\r\n\r\n if(chatResponse.isStream == true )\r\n {\r\n speechBubbleList = this.state.speechBubbleList;\r\n let uniqueTuples = Array.isArray(this.state.sourcesList) ? [...this.state.sourcesList] : [];\r\n/* console.log(speechBubbleList, \"HER\") */\r\n //Her skal du så hvert svar ^ lave et array eller noget, så du senere kan vise Link/Titel og et uddrag fra kilden\r\n if(speechBubbleList!=null && speechBubbleList.length> 0 ) {\r\n speechBubbleList.forEach((speechBubble) => {\r\n if (speechBubble.title !== \"\" && speechBubble.url !== \"\") {\r\n const exists = uniqueTuples.some(\r\n ([title, url]) => title === speechBubble.title && url === speechBubble.url\r\n );\r\n \r\n if (!exists) {\r\n uniqueTuples.push([speechBubble.title, speechBubble.url]); // Add tuple to state array.\r\n } \r\n }\r\n });\r\n \r\n // Update state with unique tuples\r\n this.setState({ sourcesList: uniqueTuples });\r\n \r\n\r\n const streamId = chatResponse.speechBubbleList[0].streamId;\r\n\r\n if(this.state.streamIdStopped.some((x) => x == streamId) )\r\n {\r\n return ;\r\n }\r\n\r\n if(chatResponse.speechBubbleList[0].index > 1) {\r\n\r\n let speechBubbleBuffer = this.state.speechBubbleBuffer;\r\n\r\n speechBubbleBuffer.push(chatResponse.speechBubbleList[0]);\r\n\r\n speechBubbleBuffer = speechBubbleBuffer.sort((a, b) => a.index - b.index);\r\n\r\n let lastSpeechBubble = speechBubbleList[speechBubbleList.length - 1];\r\n\r\n speechBubbleBuffer.forEach((item, index) => {\r\n\r\n lastSpeechBubble.index = (lastSpeechBubble.index == undefined || lastSpeechBubble.index == 0 ? 1 : lastSpeechBubble.index);\r\n\r\n const indexDiff = item.index - lastSpeechBubble.index;\r\n\r\n if (lastSpeechBubble && (lastSpeechBubble.isUser == undefined || lastSpeechBubble.isUser == false) && lastSpeechBubble.streamId == streamId && (indexDiff == 1) && item.isLastStream == false) {\r\n\r\n\r\n const lastSpeechBubbleMsg = lastSpeechBubble.messageList[0];\r\n const currentSpeechBubbleMsg = item.messageList[0];\r\n const speechBubbleContent = (lastSpeechBubbleMsg.contentSource ? lastSpeechBubbleMsg.contentSource : lastSpeechBubbleMsg.content) + (currentSpeechBubbleMsg.contentSource ? currentSpeechBubbleMsg.contentSource : currentSpeechBubbleMsg.content);\r\n speechBubbleList[speechBubbleList.length - 1].messageList[0].contentSource = speechBubbleContent;\r\n speechBubbleList[speechBubbleList.length - 1].messageList[0].content = this.markText(speechBubbleContent);\r\n speechBubbleList[speechBubbleList.length - 1].index = item.index;\r\n speechBubbleList[speechBubbleList.length - 1].isLastStream = item.isLastStream;\r\n speechBubbleBuffer = speechBubbleBuffer.filter(bufferItem => bufferItem.index !== item.index);\r\n\r\n }\r\n\r\n });\r\n\r\n let showStopMessage = true;\r\n\r\n if(chatResponse.speechBubbleList[0].isLastStream)\r\n {\r\n const currentSpeechBubbleContent = chatResponse.speechBubbleList[0].messageList[0].content;\r\n speechBubbleList[speechBubbleList.length - 1].messageList[0].contentSource = currentSpeechBubbleContent;\r\n speechBubbleList[speechBubbleList.length - 1].messageList[0].content = this.markText(currentSpeechBubbleContent);\r\n speechBubbleList[speechBubbleList.length - 1].isLastStream = true;\r\n\r\n let streamIdStopped = this.state.streamIdStopped;\r\n\r\n streamIdStopped.push(chatResponse.speechBubbleList[0].streamId);\r\n\r\n showStopMessage = false;\r\n\r\n this.setState({streamIdStopped});\r\n }\r\n\r\n var botWritingStream = speechBubbleList[speechBubbleList.length - 1].isLastStream || speechBubbleList[speechBubbleList.length - 1].messageList[0].contentSource == undefined ? false: true\r\n\r\n this.setState({\r\n speechBubbleList: speechBubbleList,\r\n speechBubbleBuffer: speechBubbleBuffer,\r\n lastStreamId: streamId,\r\n showStopMessage,\r\n botWriting: this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot ? false: botWritingStream\r\n });\r\n\r\n return;\r\n }\r\n\r\n\r\n }\r\n\r\n }\r\n\r\n let delay = 0;\r\n\r\n const lastNonSuggestionSpeechBubbleIndex = chatResponse.speechBubbleList.map((speechBubble) => {\r\n return speechBubble.suggestion;\r\n }).lastIndexOf(null);\r\n\r\n //Id used in internal sorting for search bot layout\r\n const chatResponseDropId = uuidv4();\r\n\r\n chatResponse.speechBubbleList.forEach((speechBubble, i, array) => {\r\n // If any delay on speechbubble a 'is writing animation' speechbubble is shown.\r\n\r\n if (speechBubble.delay) {\r\n delay += speechBubble.delay;\r\n let botWriting = true;\r\n this.setState({botWriting});\r\n }\r\n\r\n if(this.state.loadToEnd == false)\r\n {\r\n if (speechBubble.suggestion) {\r\n speechBubble.hidden = true;\r\n }\r\n }\r\n\r\n speechBubble.dropId = chatResponseDropId;\r\n speechBubble.chatResponseId = chatResponse.id;\r\n speechBubble.integrationType = chatResponse.integrationType;\r\n\r\n speechBubble.index = i;\r\n\r\n if (!(this.state.chatConfig && \r\n this.state.chatConfig.layoutMode !== null &&\r\n this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot)) {\r\n speechBubble.dateTimeUtc = chatResponse.dateTimeUtc;\r\n }\r\n\r\n\r\n // Sets if chat rating buttons should be shown.\r\n if (chatResponse.chatQuestionId &&\r\n speechBubble.index === lastNonSuggestionSpeechBubbleIndex &&\r\n !speechBubble.isUser &&\r\n speechBubble.lineBreakType !== LineBreakTypeEnum.carousel) {\r\n\r\n speechBubble.chatQuestionId = chatResponse.chatQuestionId;\r\n speechBubble.chatResponseFeedback = chatResponse.chatResponseFeedback;\r\n }\r\n\r\n if (speechBubble.index > 0) {\r\n speechBubble.index -= array.some(speechBubble => speechBubble.isUser) ? 1 : 0;\r\n }\r\n\r\n // Disables suggestions if in spectatormode.\r\n if (speechBubble.suggestion && this.state.userId) {\r\n speechBubble.disabled = true;\r\n }\r\n\r\n\r\n if (speechBubble.isGpt) {\r\n speechBubble.messageList = speechBubble.messageList.map(message => {\r\n return { ...message, content: this.markText(message.content) };\r\n });\r\n }\r\n\r\n\r\n // If state should be updated.\r\n if (speechBubbleList) {\r\n if(this.state.loadToEnd) {\r\n speechBubbleList.push(speechBubble);\r\n } else\r\n {\r\n if(speechBubbleList.find(x=>x.chatQuestionId ==speechBubble.chatQuestionId) == undefined|| speechBubble.id=='00000000-0000-0000-0000-000000000000' || speechBubble.chatQuestionId == null) {\r\n speechBubbleList.unshift(speechBubble);\r\n }\r\n }\r\n } else {\r\n // Sets delay on when to show the speechbubble.\r\n setTimeout(() => {\r\n speechBubbleList = this.state.speechBubbleList;\r\n\r\n // Hide suggestions if user speechbubble is recieved.\r\n if (speechBubble.isUser || this.state.loadToEnd == false) {\r\n speechBubbleList.forEach((sb) => {\r\n if (sb.suggestion) {\r\n sb.hidden = true;\r\n }\r\n });\r\n }\r\n\r\n if(this.state.loadToEnd) {\r\n speechBubbleList.push(speechBubble);\r\n }else\r\n {\r\n if(speechBubbleList.find(x=>x.chatQuestionId ==speechBubble.chatQuestionId) == undefined|| speechBubble.id=='00000000-0000-0000-0000-000000000000' || speechBubble.chatQuestionId == null) {\r\n speechBubbleList.unshift(speechBubble);\r\n }\r\n }\r\n\r\n this.setState({speechBubbleList});\r\n\r\n if (i === array.length - 1 ) {\r\n let botWriting = false;\r\n this.setState({botWriting});\r\n }\r\n\r\n }, delay);\r\n\r\n if(this.state.chatConfig.soundOnMessageReceived && chatResponse.speechBubbleList && chatResponse.speechBubbleList[0] && chatResponse.speechBubbleList[0].avatarName) {\r\n setTimeout(() => {\r\n console.log(\"Play sound: Chat message received (delay = \" + speechBubble.delay + \")\");\r\n this.playReceivedMessageSound();\r\n }, speechBubble.delay);\r\n }\r\n\r\n // Open chatbot if message is recieved from chat agent.\r\n if (!this.state.userId && chatResponse && chatResponse.intentId === null) {\r\n window.parent.postMessage({'openChatbot': true}, '*');\r\n }\r\n }\r\n });\r\n\r\n\r\n\r\n // close chatbot , action close\r\n if (!this.state.userId && chatResponse && chatResponse.closeChatbot) {\r\n window.parent.postMessage({'closeChatbot': true}, '*');\r\n }\r\n\r\n\r\n if (this.state.chatConfig && \r\n this.state.chatConfig.layoutMode !== null &&\r\n this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot) {\r\n\r\n if (speechBubbleList && speechBubbleList.length > 0 ) {\r\n // Check WithMemory flag to determine whether to keep all speech bubbles or just the last one\r\n if (!this.state.chatConfig.withMemory) {\r\n speechBubbleList = [speechBubbleList[speechBubbleList.length - 1]];\r\n }\r\n\r\n this.setState({ speechBubbleList });\r\n }\r\n }\r\n\r\n return speechBubbleList;\r\n };\r\n\r\n playReceivedMessageSound = () => {\r\n var audio = document.getElementById(\"audio_messagereceived\");\r\n audio.play();\r\n }\r\n\r\n startChatConnection = () => {\r\n if (this.state.disableConnectionRetry) {\r\n return;\r\n }\r\n\r\n this.state.hubConnection.start()\r\n .then(() => {\r\n this.setState({connected: true});\r\n this.setState({showConnectionLostMsg: false})\r\n }).catch(() => {\r\n setTimeout(() => {\r\n this.startChatConnection();\r\n }, Setup.signalrConnectionRetryInterval);\r\n });\r\n };\r\n\r\n\r\n getMessageSpeechBubble = (message) => {\r\n return {\r\n isUser: true,\r\n messageList: [\r\n {\r\n messageType: MessageType.text,\r\n content: message,\r\n }\r\n ]\r\n };\r\n };\r\n\r\n //\r\n updateStateOfPlaceholder=()=>{\r\nthis.setState({fileUploadedText:false});\r\n }\r\n getFileMessageSpeechBubble = (filename, url) => {\r\n return {\r\n isUser: true,\r\n displayBackground: false,\r\n messageList: [\r\n {\r\n messageType: MessageType.file,\r\n filename:filename,\r\n url: url,\r\n lineBreak: 1\r\n }\r\n ]\r\n };\r\n };\r\n\r\n sendWelcome = () => {\r\n this.invokeSignalRMessage(['SendWelcome', this.state.language.languageCode, this.state.forceWelcomeMessage]);\r\n this.setState({forceWelcomeMessage: false});\r\n };\r\n\r\n sendUserIsWriting = (isWriting) => {\r\n this.invokeSignalRMessage(['SendUserIsWriting', isWriting]);\r\n };\r\n\r\n appendSendMessage = (speechBubble) => {\r\n\r\n this.setState({loadToEnd:true});\r\n\r\n let speechBubbleList = this.state.speechBubbleList;\r\n\r\n if(this.state.lastStreamId!=null)\r\n {\r\n let streamIdStopped = this.state.streamIdStopped\r\n\r\n streamIdStopped.push(this.state.lastStreamId);\r\n\r\n this.setState({streamIdStopped});\r\n }\r\n\r\n // Hides suggestions\r\n speechBubbleList.forEach((speechBubble) => {\r\n if (speechBubble.suggestion) {\r\n speechBubble.hidden = true;\r\n }\r\n });\r\n\r\n // Shows a message to the user that looks like they sent it.\r\n if (speechBubble && !(this.state.chatConfig.layoutMode !== null && this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot && this.state.chatConfig.withMemory === false)) {\r\n speechBubble.lineBreakType = LineBreakTypeEnum.newLine;\r\n if (this.state.chatAgentMode === true) {\r\n if (!speechBubbleList.some(msg => msg.content === speechBubble.content)) {\r\n speechBubbleList.push(speechBubble); \r\n }\r\n } else {\r\n speechBubbleList.push(speechBubble); \r\n }\r\n }\r\n\r\n this.setState({speechBubbleList});\r\n };\r\n\r\n stopMessage = () => {\r\n\r\n let streamIdStopped = this.state.streamIdStopped;\r\n\r\n if (!streamIdStopped.includes(this.state.lastStreamId)) {\r\n streamIdStopped.push(this.state.lastStreamId);\r\n this.setState({ streamIdStopped, botWriting: false });\r\n }\r\n \r\n this.setState({ showStopMessage: false });\r\n\r\n }\r\n\r\n setBotIsWriting = () => {\r\n this.setState({ botWriting: true });\r\n }\r\n\r\n handleAddPendingFiles = (newFile) => {\r\n this.setState(prevState => {\r\n const updatedPendingFiles = prevState.pendingFiles.filter(file => file.name !== newFile.name);\r\n return {\r\n pendingFiles: [...updatedPendingFiles, newFile]\r\n };\r\n });\r\n }\r\n\r\n\r\n flushPendingFiles = () => {\r\n this.setState({pendingFiles: []})\r\n }\r\n\r\n sendFiles = () => {\r\n const { pendingFiles } = this.state;\r\n\r\n\r\n // Convert each file upload to a Promise\r\n const uploadPromises = pendingFiles.map((file) => {\r\n return new Promise((resolve, reject) => {\r\n this.uploadFileComplete(file, this.props.match.params.token, (error) => {\r\n if (error) {\r\n console.error(`Error uploading file ${file.name}:`, error);\r\n reject(error);\r\n } else {\r\n resolve();\r\n }\r\n });\r\n });\r\n });\r\n\r\n return Promise.all(uploadPromises)\r\n .then(() => {\r\n this.setState({ pendingFiles: [], fileUploading: false });\r\n this.handleResetUploadedFiles();\r\n })\r\n .catch((error) => {\r\n console.error(\"Error in file uploads:\", error);\r\n this.setState({ fileUploading: false });\r\n });\r\n };\r\n\r\n /**\r\n * Gets called when a message is sent from the webclient.\r\n */\r\n \r\n sendMessage = async (message, messageToDisplay, urls) => {\r\n if (this.state.connected === false) {\r\n this.setState({ showConnectionLostMsg: true });\r\n this.flushTrainingPhraseList();\r\n return false;\r\n }\r\n\r\n if(this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot){\r\n this.resizeContainerSend([]);\r\n }\r\n\r\n // Call resetChatMenuItems before sending the message\r\n if (this.searchBotFieldRef.current) {\r\n this.searchBotFieldRef.current.resetChatMenuItems();\r\n }\r\n\r\n try {\r\n\r\n this.setBotIsWriting();\r\n\r\n // Existing sendMessage logic\r\n const speechBubbleToDisplay = urls\r\n ? this.getFileMessageSpeechBubble(messageToDisplay, urls)\r\n : this.getMessageSpeechBubble(messageToDisplay);\r\n\r\n if(this.state.chatConfig.layoutMode === LayoutTypeEnum.chatBot || this.state.chatConfig.withMemory){\r\n this.appendSendMessage(speechBubbleToDisplay);\r\n }\r\n\r\n // Wait for pending files to be uploaded before proceeding\r\n await this.sendFiles();\r\n\r\n\r\n this.invokeSignalRMessage([\r\n 'Send',\r\n message,\r\n this.state.language.languageCode,\r\n this.state.pendingFileUrls,\r\n this.state.lastStreamId\r\n ]);\r\n this.openChatContainer();\r\n this.setState({ sourcesList: [] });\r\n this.setState({ pendingFileUrls: [] });\r\n\r\n return true;\r\n } catch (error) {\r\n console.error('Error uploading files:', error);\r\n return false;\r\n }\r\n };\r\n\r\n\r\n sendIntent = (intentId, chatQuestionType, messageToDisplay, speechBubble, hideSuggestions, chatMenuItemId) => {\r\n if (this.state.connected === false) {\r\n this.setState({showConnectionLostMsg: true});\r\n return;\r\n }\r\n\r\n this.setState({loadToEnd: true});\r\n\r\n let speechBubbleToDisplay;\r\n\r\n // Clone speechbubble and show as the user send it.\r\n if (speechBubble) {\r\n speechBubbleToDisplay = JSON.parse(JSON.stringify(speechBubble));\r\n speechBubbleToDisplay.isUser = true;\r\n speechBubbleToDisplay.index = 0;\r\n speechBubbleToDisplay.chatResponseId = null;\r\n speechBubbleToDisplay.suggestion = null;\r\n } else if (messageToDisplay) {\r\n speechBubbleToDisplay = this.getMessageSpeechBubble(messageToDisplay);\r\n }\r\n\r\n this.appendSendMessage(speechBubbleToDisplay);\r\n\r\n // Sends either id of suggestion or chat menu item clicked or null.\r\n let key = null;\r\n if (chatQuestionType === ChatQuestionTypeEnum.suggestion) {\r\n key = speechBubble.suggestion.id;\r\n } else if (chatQuestionType === ChatQuestionTypeEnum.menuItem) {\r\n key = chatMenuItemId;\r\n }\r\n\r\n this.invokeSignalRMessage(['SendIntent', intentId, this.state.language.languageCode, chatQuestionType, key, speechBubbleToDisplay]);\r\n };\r\n\r\n sendChatAgentIntent = (intentId) => {\r\n if (this.state.connected === false) {\r\n this.setState({showConnectionLostMsg: true});\r\n return false;\r\n }\r\n this.invokeSignalRMessage(['SendIntent', intentId, this.state.language.languageCode, ChatQuestionTypeEnum.customIntent, null, null]);\r\n return true;\r\n };\r\n\r\n sendChatResponseFeedback = (chatQuestionId, chatResponseFeedback) => {\r\n if (this.state.connected === false) {\r\n this.setState({showConnectionLostMsg: true});\r\n return;\r\n }\r\n\r\n let speechBubbleList = this.state.speechBubbleList;\r\n let speechBubble = speechBubbleList.find((sb => {\r\n return sb.chatQuestionId === chatQuestionId;\r\n }));\r\n\r\n if (speechBubble) {\r\n speechBubble.chatResponseFeedback = chatResponseFeedback === ChatResponseFeedbackEnum.notSet ? null : chatResponseFeedback;\r\n }\r\n\r\n this.setState({speechBubbleList}, () => {\r\n this.invokeSignalRMessage(['SendChatResponseFeedback', chatQuestionId, chatResponseFeedback]);\r\n });\r\n };\r\n\r\n languageSelected = (countryCode) => {\r\n if (this.state.connected === false) {\r\n this.setState({showConnectionLostMsg: true});\r\n return false;\r\n }\r\n\r\n const language = this.state.chatConfig.chatConfigLanguageList.map(ccl => ccl.language).find((lang) => {\r\n return lang.countryCode === countryCode;\r\n });\r\n\r\n window.parent.postMessage({'languageSelected': language.languageCode}, '*');\r\n\r\n this.setState({language, requestedWelcome: false, forceWelcomeMessage: true, speechBubbleList: [], startLoad: 0, trainingPhraseSuggestionList: []}, () => {\r\n this.invokeSignalRMessage(['SendChatHistory', this.state.language.id , this.state.startLoad, Setup.messageLoadCount]);\r\n });\r\n\r\n return true;\r\n };\r\n\r\n clearSpeechBubble = () => {\r\n\r\n this.setState({speechBubbleList: [], sourcesList:[]})\r\n }\r\n getTrainingPhraseList = (searchText) => {\r\n if (this.state.connected === false) {\r\n this.setState({showConnectionLostMsg: true});\r\n return;\r\n }\r\n this.invokeSignalRMessage(['GetTrainingPhraseList', searchText, this.state.language.languageCode]);\r\n };\r\n\r\n getChatResponse = (intentId) => {\r\n if (this.state.connected === false) {\r\n this.setState({showConnectionLostMsg: true});\r\n return;\r\n }\r\n\r\n return this.invokeSignalRMessage(['GetChatResponse', intentId, this.state.language.languageCode]);\r\n };\r\n\r\n uploadFileComplete(file, token, callback) {\r\n \r\n return axios\r\n .post((process.env.NODE_ENV === 'development' ? Setup.apiEndpointDev : process.env.REACT_APP_TEST_BUILD ? Setup.apiEndpointTest : Setup.apiEndpointProd) + 'storage/upload/clientKey/' + this.state.clientKey , {file})\r\n .then(response => {\r\n this.sendUserIsWriting(false);\r\n this.setState(this.state.chatAgentMode ? {botWriting: false} : {userWriting: false});\r\n /* this.sendMessage(file.name, file.name, response.data) */\r\n\r\n this.setState((prevState) => ({\r\n pendingFileUrls: [...(prevState.pendingFileUrls || []), response.data], // Initialize if undefined\r\n }));\r\n\r\n callback();\r\n })\r\n .catch(error => {\r\n this.setSnackbarErrorMessage(Localization[getLocalizationLanguageCode(this.state.language ? this.state.language.languageCode : null)]['chatInput.chatAttachment.uploadFileError']);\r\n this.sendUserIsWriting(false);\r\n this.setState(this.state.chatAgentMode ? {botWriting: false} : {userWriting: false});\r\n callback();\r\n })\r\n }\r\n\r\n toggleShowInfoPage = () => {\r\n this.setState({showInfoPage: !this.state.showInfoPage});\r\n };\r\n\r\n closeChatbot = () => {\r\n\r\n this.setState({isMaximized: false});\r\n window.parent.postMessage({'closeChatbot': true}, '*');\r\n\r\n };\r\n\r\n openChatContainer = () => {\r\n window.parent.postMessage({'openChatContainer': true}, '*');\r\n };\r\n\r\n resizeChatContainer = (entries) => {\r\n window.parent.postMessage({'resizeChatContainer': entries}, '*');\r\n }\r\n\r\n setSearchBot = () => {\r\n window.parent.postMessage({'setSearchBot' : true}, '*')\r\n }\r\n\r\n setChatFieldPlacement = () => {\r\n window.parent.postMessage({ setChatFieldPlacement: this.state.chatConfig.openDownwards }, '*');\r\n if (this.state.chatConfig.openDownwards) {\r\n const searchBotLayoutElem = document.getElementById('search-bot-layout');\r\n if (searchBotLayoutElem) {\r\n // Remove any inline bottom and force top: 0\r\n searchBotLayoutElem.style.setProperty('bottom', 'auto', 'important');\r\n searchBotLayoutElem.style.setProperty('top', '0', 'important');\r\n }\r\n }\r\n };\r\n\r\n setChatBot = () => {\r\n window.parent.postMessage({'setChatBot' : true}, '*')\r\n }\r\n\r\n toggleMaxiChatbot = () => {\r\n window.parent.postMessage({'toggleMaxiChatbot': true}, '*');\r\n\r\n this.setState({isMaximized: !this.state.isMaximized});\r\n };\r\n\r\n resizeSourceContainer = (entries) => {\r\n const length = entries.length\r\n window.parent.postMessage({'resizeSourceContainer': length}, '*')\r\n }\r\n\r\n resizeContainerSend = (entries) => {\r\n const length = entries.length\r\n window.parent.postMessage({'resizeContainerSend': length}, '*')\r\n }\r\n\r\n setSnackbarErrorMessage = (errorMessage) => {\r\n this.setState({snackbarErrorMessage: errorMessage});\r\n };\r\n\r\n reEnableMostAskedQuestions = () => {\r\n window.parent.postMessage({'resetSearchBotWindow': true}, '*');\r\n if (this.searchBotFieldRef && this.searchBotFieldRef.current) {\r\n this.searchBotFieldRef.current.initializeChatMenuItems(true);\r\n }\r\n };\r\n\r\n disableMostAskedQuestions = () => {\r\n window.parent.postMessage({'resetSearchBotWindow': false}, '*');\r\n if (this.searchBotFieldRef && this.searchBotFieldRef.current) {\r\n this.searchBotFieldRef.current.initializeChatMenuItems(false);\r\n }\r\n };\r\n\r\n handleRootClick = () => {\r\n if (this.state.hadFirstClick === false) {\r\n\r\n if (this.state.welcomePreviewEnabled) {\r\n window.parent.postMessage({'disableWelcomePreview': true}, '*');\r\n this.setState({welcomePreviewEnabled: false});\r\n }\r\n\r\n this.setState({hadFirstClick: true});\r\n }\r\n };\r\n\r\n flushTrainingPhraseList = () => {\r\n this.setState({trainingPhraseList: []})\r\n }\r\n\r\n render() {\r\n\r\n const chatFieldSpectatorStyle = {\r\n width: '100%',\r\n maxWidth: '100%'\r\n };\r\n\r\n return (\r\n
\r\n\r\n {this.state.chatConfig ?\r\n \r\n { this.setSnackbarErrorMessage(null); }}\r\n autoHideDuration={3000}\r\n style={{top: '75px'}}\r\n >\r\n { this.setSnackbarErrorMessage(null); }}>\r\n {this.state.snackbarErrorMessage}\r\n \r\n \r\n\r\n \r\n\r\n {this.state.userId == null && this.state.chatConfig.layoutMode !== null && this.state.chatConfig.layoutMode === LayoutTypeEnum.searchBot ?\r\n
\r\n
\r\n ccl.language) : null}\r\n languageSelected={this.languageSelected} clientDescription={ this.state.chatConfig && this.state.chatConfig.clientDescription}\r\n enableMaximize={this.state.chatConfig.enableMaximize} isMaximized ={this.state.isMaximized} toggleMaxiChatbot ={this.toggleMaxiChatbot} closeChatbot ={this.closeChatbot} toggleShowInfoPage={this.toggleShowInfoPage} welcomePreviewEnabled={this.state.welcomePreviewEnabled}\r\n />\r\n
\r\n {!this.state.chatConfig.openDownwards ? (\r\n <>\r\n ccl.language) : null}\r\n languageSelected={this.languageSelected}\r\n showSearchBotChatField={this.state.showSearchBotChatField}\r\n setShowSearchBotChatField={(show) => this.setShowSearchBotChatField(show)}\r\n /> \r\n this.uploadFileComplete(file, this.state.token, callback)\r\n }\r\n handleGetTrainingPhraseList={(text) => this.getTrainingPhraseList(text)}\r\n handleGetChatResponse={(intentId) => this.getChatResponse(intentId)}\r\n trainingPhraseList={this.state.trainingPhraseList}\r\n botWriting={this.state.botWriting}\r\n userWriting={this.state.userWriting}\r\n chatConfig={this.state.chatConfig}\r\n language={this.state.language}\r\n sendMessage={this.sendMessage}\r\n speechBubbleList = {this.state.speechBubbleList}\r\n sendIntent={this.sendIntent}\r\n stopMessage={this.stopMessage}\r\n showStopMessage={\r\n this.state.chatConfig &&\r\n this.state.chatConfig.gptSetupType === 3 &&\r\n this.state.showStopMessage\r\n }\r\n showConnectionLostMsg={this.state.showConnectionLostMsg}\r\n sendUserIsWriting={this.sendUserIsWriting}\r\n chatAgentMode={this.state.chatAgentMode}\r\n integrationType={this.state.integrationType}\r\n setSnackbarErrorMessage={this.setSnackbarErrorMessage}\r\n handleRootClick={this.handleRootClick}\r\n sendChatAgentIntent={this.sendChatAgentIntent}\r\n flushTrainingPhraseList={() => this.flushTrainingPhraseList()}\r\n disclaimer={this.state.chatConfig.disclaimer}\r\n chatInputText={this.state.chatConfig.chatInputText}\r\n chatInputMax={this.state.chatConfig.chatInputMax}\r\n message={this.state.chatInputMessage}\r\n reEnableMostAskedQuestions={this.reEnableMostAskedQuestions}\r\n clearSpeechBubble={this.clearSpeechBubble}\r\n setShowSearchBotChatField={(show) => this.setShowSearchBotChatField(show)}\r\n />\r\n \r\n ) : (\r\n <>\r\n this.uploadFileComplete(file, this.state.clientKey, callback)}\r\n handleGetTrainingPhraseList={(text) => this.getTrainingPhraseList(text)}\r\n handleGetChatResponse={(intentId) => this.getChatResponse(intentId)}\r\n trainingPhraseList={this.state.trainingPhraseList}\r\n botWriting={this.state.botWriting}\r\n userWriting={this.state.userWriting}\r\n chatConfig={this.state.chatConfig}\r\n language={this.state.language}\r\n sendMessage={this.sendMessage}\r\n sendIntent={this.sendIntent}\r\n stopMessage={this.stopMessage}\r\n showStopMessage={this.state.chatConfig && this.state.chatConfig.gptSetupType == 3 && this.state.showStopMessage}\r\n showConnectionLostMsg={this.state.showConnectionLostMsg}\r\n sendUserIsWriting={this.sendUserIsWriting}\r\n chatAgentMode={this.state.chatAgentMode}\r\n integrationType={this.state.integrationType}\r\n setSnackbarErrorMessage={this.setSnackbarErrorMessage}\r\n handleRootClick={this.handleRootClick}\r\n sendChatAgentIntent={this.sendChatAgentIntent}\r\n flushTrainingPhraseList={() => this.flushTrainingPhraseList()}\r\n disclaimer ={this.state.chatConfig.disclaimer}\r\n chatInputText ={this.state.chatConfig.chatInputText}\r\n chatInputMax ={this.state.chatConfig.chatInputMax}\r\n message={this.state.chatInputMessage} \r\n reEnableMostAskedQuestions={this.reEnableMostAskedQuestions}\r\n clearSpeechBubble={this.clearSpeechBubble}\r\n fileUploadedText={this.state.fileUploadedText}\r\n setShowSearchBotChatField={(show) => this.setShowSearchBotChatField(show)}\r\n speechBubbleList={this.state.speechBubbleList}\r\n\r\n\r\n\r\n />\r\n this.setShowSearchBotChatField(show)}\r\n />\r\n \r\n )}\r\n\r\n
\r\n :\r\n
\r\n\r\n {this.state.userId == null ?\r\n \r\n
\r\n\r\n
\r\n ccl.language) : null}\r\n languageSelected={this.languageSelected} clientDescription={ this.state.chatConfig && this.state.chatConfig.clientDescription}\r\n enableMaximize={this.state.chatConfig.enableMaximize} isMaximized ={this.state.isMaximized} toggleMaxiChatbot ={this.toggleMaxiChatbot} closeChatbot ={this.closeChatbot} toggleShowInfoPage={this.toggleShowInfoPage} welcomePreviewEnabled={this.state.welcomePreviewEnabled}\r\n />\r\n
\r\n \r\n : null\r\n }\r\n\r\n \r\n\r\n {this.state.userId == null || this.state.chatAgentMode === true ?\r\n this.uploadFileComplete(file, this.state.clientKey, callback)}\r\n handleGetTrainingPhraseList={(text) => this.getTrainingPhraseList(text)}\r\n handleGetChatResponse={(intentId) => this.getChatResponse(intentId)}\r\n trainingPhraseList={this.state.trainingPhraseList}\r\n botWriting={this.state.botWriting}\r\n userWriting={this.state.userWriting}\r\n chatConfig={this.state.chatConfig}\r\n language={this.state.language}\r\n sendMessage={this.sendMessage}\r\n sendIntent={this.sendIntent}\r\n stopMessage={this.stopMessage}\r\n showStopMessage={this.state.showStopMessage}\r\n showConnectionLostMsg={this.state.showConnectionLostMsg}\r\n sendUserIsWriting={this.sendUserIsWriting}\r\n chatAgentMode={this.state.chatAgentMode}\r\n integrationType={this.state.integrationType}\r\n setSnackbarErrorMessage={this.setSnackbarErrorMessage}\r\n handleRootClick={this.handleRootClick}\r\n sendChatAgentIntent={this.sendChatAgentIntent}\r\n flushTrainingPhraseList={() => this.flushTrainingPhraseList()}\r\n disclaimer ={this.state.chatConfig.disclaimer}\r\n chatInputText ={this.state.chatConfig.chatInputText}\r\n chatInputMax ={this.state.chatConfig.chatInputMax}\r\n pendingFileUrls={this.state.pendingFileUrls}\r\n handleAddUploadedFiles={(name) => this.handleAddUploadedFiles(name)}\r\n handleResetUploadedFiles={() => this.handleResetUploadedFiles()}\r\n fileUploadedList={this.state.fileUploadedList}\r\n handleDeleteUploadedFile={(index) => this.handleDeleteUploadedFile(index)}\r\n fileUploadedListRemove={this.state.fileUploadedListRemove}\r\n handleFlushDeleteUploadedFile={this.handleFlushDeleteUploadedFile}\r\n chatAttachmentRef={this.chatAttachmentRef}\r\n handleAddPendingFiles={(item) => this.handleAddPendingFiles(item)}\r\n flushPendingFiles={this.flushPendingFiles}\r\n pendingFiles={this.state.pendingFiles}\r\n uploadFilesList={this.uploadFilesList}\r\n fileUploadedText={this.state.fileUploadedText}\r\n updateStateOfPlaceholder={this.updateStateOfPlaceholder}\r\n speechBubbleList={this.state.speechBubbleList}\r\n\r\n />\r\n : null}\r\n
\r\n }\r\n \r\n
:\r\n\r\n
\r\n \r\n
\r\n }\r\n\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default Chat;\r\n","import React, { Component } from 'react';\r\nimport { BrowserRouter, Route, Switch } from 'react-router-dom'\r\n\r\nimport Chat from './chat/Chat';\r\n\r\n/**\r\n * Wrapper class for the whole webclient.\r\n * To run with https: ($env:HTTPS = \"true\") -and (npm start)\r\n */\r\nclass App extends Component {\r\n render() {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n}\r\n\r\nexport default App;\r\n","/*import 'babel-polyfill';*/\r\nimport 'react-app-polyfill/ie11';\r\nimport 'react-app-polyfill/stable';\r\nimport React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport './index.css';\r\nimport App from './app/App';\r\n\r\nReactDOM.render(, document.getElementById('root'));\r\n"],"sourceRoot":""}