{"version":3,"sources":["serviceWorker.js","i18n/i18n.js","utils/helpers/localStorageHelper.js","utils/helpers/stringHelper.js","state/StateContainer.js","utils/helpers/deviceHelper.js","utils/helpers/sceneHelper.js","utils/helpers/windowHelper.js","utils/helpers/labelHelper.js","utils/constants.js","utils/helpers/stateHelper.js","utils/helpers/filterHelper.js","utils/helpers/effectHelper.js","components/ObjectWindow/ObjectWindow.jsx","components/SliderCheckbox/SliderCheckbox.jsx","components/Buttons/FilterButton/FIlterButton.jsx","components/DisplayWrapper/DisplayWrapper.jsx","components/HotspotFilters/HotspotFilters.jsx","components/Legend/LegendItem.jsx","components/Legend/Legend.jsx","utils/helpers/buttonActionHelper.js","components/Buttons/NavbarButton/NavbarButton.jsx","components/Buttons/StateButtonArray/StateButtonArray.jsx","components/Buttons/DefaultButton/DefaultButton.jsx","components/Buttons/StarButton/StarButton.jsx","components/Navbar/Navbar.jsx","components/DirectionControls/DirectionControls.jsx","components/MapView/MapView.jsx","components/Compass/Compass.jsx","utils/items.js","pages/Compare/Apartment.jsx","pages/Compare/ApartmentViewerBox.jsx","components/Buttons/CompareToggleView/CompareToggleView.jsx","utils/DragControls.js","utils/CompareScene.js","components/CompareCanvas/CompareCanvas.jsx","pages/Compare/Compare.jsx","components/CalibrationHelper/CalibrationHelper.jsx","components/Buttons/CustomButton/CustomButton.jsx","components/Buttons/CustomButtonArray/CustomButtonArray.jsx","components/Buttons/BackButton/BackButtonIcon.jsx","components/Buttons/BackButton/BackButton.jsx","components/ToggleApartmentView/ToggleApartmentView.jsx","components/ApartmentSidebar/ApartmentSidebar.jsx","pages/ShowApartment/ShowApartment.jsx","components/ProgressBar/ProgressBar.jsx","pages/LoadingOverlay/LoadingOverlay.jsx","utils/OrbViewScene.js","components/OrbViewButton/OrbViewButton.jsx","components/OrbViewSidebar/OrbViewSidebar.jsx","components/OrbView/OrbView.jsx","hooks/useScreenOrientation.jsx","components/LandscapeNotification/LandscapeNotification.jsx","App.jsx","index.jsx"],"names":["Boolean","window","location","hostname","match","resources","English","translation","French","German","Serbian","i18n","use","LanguageDetector","initReactI18next","init","debug","fallbackLng","interpolation","escapeValue","setToLocal","storageKey","storageValue","localStorage","setItem","JSON","stringify","makeStateKey","type","resolution","floor","row","concat","makeImageKey","column","removeAplhaFromColor","color","replace","convertRGBtoOBJ","colorString","includes","rgbKeys","rgbObj","split","i","r","g","b","a","getLoadingStateIdentifier","key","checkNumbersInSubstring","stringToCheck","length","ch","parseStateNumber","stateString","string","push","newSubstring","substring","this","shift","newString","isNaN","rgbStringToArray","rgbColorString","strokeColor","strokeRgbStringForthSplit","thenum","effectR","parseInt","effectG","effectB","StateContainer","Container","constructor","props","super","blockStateControls","event","state","waitForImage","detail","value","wheelHandler","isApartmentInfoShown","ctrlKey","isMouseOnSideBar","isMapShown","deltaY","increaseCameraZoom","decreaseCameraZoom","mousedownHandler","undefined","apartmentClickedInfo","startDragPosition","clientX","clientY","isClicked","document","getElementById","addEventListener","mousemoveHandler","mouseupHandler","isDragging","setState","removeEventListener","mouseoutHandler","dragPositionX","dragPositionY","pointStart","pointEnd","distanceX","distanceY","dragDistance","Math","sqrt","pow","jsonData","fixedDrag","abs","panUp","panDown","panLeft","panRight","touchUpHandler","touchmoveHandler","touchDownHandler","isSideBarOpen","touches","touchcancelHandler","mousedownApartmentHandler","mousemoveApartmentHandler","mouseupApartmentHandler","mouseoutApartmentHandler","panLeftApartment","panRightApartment","touchdownApartmentHandler","touchmoveApartmentHandler","touchupApartmentHandler","touchoutApartmentHandler","loadingProgress","currentState","currentRow","currentColumn","currentHotspotColumn","maxColumns","maxApartmentColumns","rowsPerState","hotspotColors","T1","DefaultColor","DefaultOpacity","HoverColor","HoverOpacity","StrokeColor","StrokeOpacity","T2","T3","T4","T5","hotspotUnavailableColor","currentFilter","currentTags","priceFilter","priceValues","quadratureFilter","quadratureValues","fov","spriteScale","cameraDistanceMultiplier","hotspotScale","cameraZoom","minZoom","maxZoom","zoomStep","hotspotAngle","compassStartingAngle","navbarScrollbarLogo","isFullscreen","isCompareShown","isUpButtonShown","isDownButtonShown","isLeftButtonShown","isRightButtonShown","isCompasShown","isFilterMenuShown","isInvestorLogoShown","magLogoVisible","isFullscreenButtonShown","isApartmentFullscreenButtonShown","isMainMenuShown","isApartment3DCanvasShown","apartmentViewButton","apartment3DViewButton","orbViews","shouldDisplayOrbViewScene","calibratorEnabled","allApartments","linkHotspots","favouriteApartments","favouriteApartmentsDetails","leftCompare3DContainerActive","leftApartmentStyles","D2","display","D3","rightCompare3DContainerActive","rightApartmentStyles","carouselCompareSettings","dots","infinite","arrows","speed","slidesToShow","slidesToScroll","adaptiveHeight","className","responsive","breakpoint","settings","angleStep","PI","attachEventListeners","favApartmentsDetails","keys","getItem","parse","localStorageHelper","addFavourite","apartmentKey","tempFavourite","removeItem","indexOfKeys","indexOf","splice","toggleSideMenu","toggleCompareShownOff","CustomEvent","dispatchEvent","renderMainCanvas","updateApartmentTextureHandler","parameters","lowUrlPath","lowResUrls","setProjectFont","fontUrl","css","style","createElement","styleSheet","cssText","appendChild","createTextNode","getElementsByTagName","getUnavailableApartmentsAndFilters","states","unavailableApartments","filters","forEach","apartments","apartment","isAvailable","sort","availableFilters","setCustomStateButtons","buttons","buttonArray","button","actions","parameter","name","placementOrder","setHotspotColors","convertedColors","colorKey","defaultColors","stringHelper","defaultColor","hoverColors","hoverColor","strokeColors","defaultOpacity","parseFloat","hoverOpacity","strokeOpacity","sortedButtons","skinEditor","customButtons","minPrice","maxPrice","minQuadrature","maxQuadrature","j","isLink","price","quadrature","view360s","views360","index","view360","enableCalibrator","isBalconFilterShown","balconyFilterVisibility","isGardenFilterVisibility","gardenFilterVisibility","isParkingFilterVisibility","parkingFilterVisibility","isTerraceFilterVisibility","terraceFilterVisibility","isGalleryFilterShown","galleryFilterVisibility","isPricingFilterShown","pricingFilterVisibility","isGarageFilterShown","garageFilterVisibility","isDuplexFilterShown","duplexFilterVisibility","min","max","loaderImg","loaderImageUrl","threeSixtyImageUrl","loadingScreen","loadingScreenBackgroundUrl","googleMapView","unavailableHotspotColor","menuColor","menuColorSecondary","secondaryMenuColor","clientLogo","projectLogo","menuVisibility","compassPointer","compassArrowUrl","compassFrame","compassBackgroundUrl","button2DHeader","button2DBody","button2DImageUrl","button2DImage","button3DHeader","button3DBody","button3DImageUrl","button3DImage","title","setSliderBackgroundColor","setActiveSliderBackgroundColor","fetchFavouriteApartments","setupDoneEvent","tracks","getElementsByClassName","backgroundColor","newValue","attachDragEvents","attachCustomEvents","customEvent","apartmentCount","console","warn","setClickedApartmentState","isClickedOn3D","e","clickedApartment","highResUrls","dettachDragEventsForApartment","dettachDragEvents","toggleMapOff","setApartmentViewed","id","selector","secondApartmentViewer","firstApartmentViewer","toggleFullscreen","setCurrentFilter","filter","tag","setCurrentTag","newTag","valueRange","updateCurrentFloorByButton","stateName","onSideBarMouseEnter","onSideBarMouseLeave","rootElement","setJsonData","updateLoadingProgress","removeFavorite","preventDefault","targetDefaultPosition","position","sideMenu","fullscreenNode","toggleApartmentInfo","attachDragEventsForApartment","updateSceneSettings","increaseCurrentFloor","currentFloorPlacement","updateCurrentFloor","decreaseCurrentFloor","handleShowElement","elementName","showOrHideBoolean","toggleMapOn","compare2DApartmentButtonActive","compare3DApartmentButtonActive","error","isMobileDevice","deviceRegex","test","navigator","userAgent","browserRegex","isMobile","deviceHelper","sprite","apartmentSprite","apartmentBackgroundSprite","hotspotScene","sphere","initializeCamera","camera","THREE","setFocalLength","copy","Vector3","lookAt","updateProjectionMatrix","initializeRenderer","canvasName","renderer","antialias","canvas","alpha","setPixelRatio","devicePixelRatio","physicallyCorrectLights","shadowMap","enabled","autoClearColor","autoClear","autoClearDepth","autoClearStencil","checkShaderErrors","maxMorphNormals","maxMorphTargets","capabilities","floatFragmentTextures","floatVertexTextures","isWebGL2","logarithmicDepthBuffer","maxAttributes","maxCubemapSize","maxFragmentUniforms","maxTextureSize","maxTextures","maxVaryings","maxVertexTextures","maxVertexUniforms","precision","vertexTextures","setSize","innerWidth","innerHeight","setClearColor","Color","initializeBackground","imageUrl","Object3D","skydomeTexture","load","minFilter","skyDomeMaterial","map","material","side","initializeSprite","initializeApartmentSprite","updateApartmentTexture","texture","textureAspectRation","image","width","height","scale","set","needsUpdate","updateTexture","updateCameraPosition","cameraKeyframeTrack","distanceScaleVariable","createPositionFromAnimation","updateTargetPosition","cameraTargetKeyframeTrack","clone","multiplyScalar","updateSpritePosition","defaultDistance","newDistance","targetPosition","compensateForSizeAttenuation","multiplier","keyframeTrack","positionX","values","positionY","positionZ","loadCameraAndTargetAnimations","loader","fbxUrl","Promise","resolve","reject","object","cameraAnimation","targetAnimation","animations","animation","track","toLowerCase","traverse","child","data","loadHotspots","fbxLoader","hotspotArray","scene","hotspotDictionary","promises","hotspot","loadHotspot","hotspotUrl","all","then","hotSpotObjects","catch","emptyObject","fbxScene","visible","item","isMesh","transparent","opacity","renderOrder","colorWrite","onWindowResize","aspect","label","makeBackground","hoverBase","element","overlay","background","classList","onMouseOver","onMouseOut","makeButton","backgroundImage","backgroundSize","border","cursor","makeApartmentName","borderBottom","labelElement","innerText","t","fontSize","favorisLabelElement","toUpperCase","nameTextElement","fontWeight","makeApartmentInfo","quadratureElement","typeElement","priceElement","left","top","typeLongElement","innerHTML","lineHeight","makeDetailsButton","borderRadius","makeHiddenDetailsButton","hideLabel","displayLabel","shouldDisplayLabel","showLabel","getHotspotLabelColor","projectJSON","hoverCloudColor","updateHotspotInfo","hotspotName","backgroundOverlay","apartmentType","apartmentPrice","apartmentTypeLong","favouriteButton","async","toLocaleLowerCase","showApartmentPrice","currencySymbol","moveLabel","mousePosition","createLabel","apartmentName","apartmentInfo","detailsButton","hiddenDetailsButton","children","API_URL","axios","require","isStateLoaded","imagesQueue","getHotspotLink","hotspotKey","array","linkTo","initializeBuildingStates","tempLoadingQueue","tempImagesQueue","rows","fakeQueue","k","fakeDictionary","path","initializeApartmentStates","apartmentStateKey","projectId","URL","searchParams","get","constants","changeLanguage","language","loadingQueues","defaultFloor","unshift","setCurrentPlaneVisibility","hoveredHotspotKey","currentTypes","currentPricesFilter","currentQuadratureFilter","currentStateJSON","setFilteredHotspotVisibility","checkAllApartmentTags","apartmentTags","numberOfFilters","checkApartmentPriceAndQuadrature","priceBoolean","quadratureBoolean","checkFilterTypes","extractCode","str","objects","floorIndex","stroke","keyToCompare","hoverToCompare","userData","outlineParameters","typesOkay","tagsOkay","tags","priceAndQuadratureOkay","initializeOutlineRenderer","effect","OutlineEffect","objectsInScene","edgeDistances","vertices","geometry","attributes","minDistance","Infinity","maxDistance","vertex","applyMatrix4","matrixWorld","distance","distanceTo","closest","furthest","distanceA","distanceB","onBeforeRender","gl","getContext","enable","STENCIL_TEST","stencilMask","stencilFunc","NOTEQUAL","stencilOp","KEEP","REPLACE","onAfterRender","ALWAYS","disable","sortObjects","render","ObjectWindow","Component","arguments","shouldPauseLoading","currentFloorLoading","isGIFShown","loadedImages","shiftedApartmentKeys","allStates","loadingQueue","cachedImages","labelIsHovered","hoveredLinkHotspotUrl","mousePositionY","loadingDone","isSideMenuHovered","sceneNeedsRender","imageIsChanging","frameId","frameParameters","defaultCameraTargetDistance","FBXLoader","mouse","raycaster","loadingClass","updateFrame","outlineEffect","requestAnimationFrame","intersects","intersectObjects","intersect","intersectedApartment","domElement","equals","labelHelper","filterHelper","applyCustomStateParameters","cameraPosition","sceneHelper","setDefaultCameraDistance","scaleHotspots","zoom","clear","clearDepth","initializeRenderLoop","cameraAndTargetKeyframeTracks","loadAndGetKeyframes","Object","add","effectHelper","windowHelper","onMouseMove","onTouchEnd","cameraDefaultPosition","defaultCameraPosition","defaultCameraTargetPosition","defaultCameraDistance","cameraDistance","hotspotSize","setScalar","showGIF","gifShown","hideGIF","forceUpdate","container","getBoundingClientRect","x","y","setFromCamera","changedTouches","waitForImageLoad","shiftFloorToStart","indexOfKey","imgKey","imgPaths","shiftColumnToStart","shouldWait","indexOfState","unsortedArray","numberOfElements","sortedArray","indexOfFirst","testArray","indexOfPrevious","indexOfNext","currentElement","previousElement","nextElement","buildingOrApartmentIdentifier","currentKey","loadingStateIndex","columns","imagesToLoad","textureKey","percentage","update","getLoadingProgress","applyBuildingImageInCurrentState","startLoadingQueue","lowImageKey","isBuilding","checkHighKey","applyApartmentImageInCurrentState","newProps","stateKey","imageKey","stateHelper","lowImagePath","loadLowResAndApply","handleUpdateApartmentTexture","lowKey","componentWillReceiveProps","changeColumn","changeFloor","initializeStartingQueue","loadDefaultStateImages","fullscreenWrapper","initializeScene","moreDetailsButton","hiddenMoreDetailsButton","href","React","src","alt","SliderCheckbox","checked","setChecked","useState","checkboxBackgroundColor","unstated","onChange","filterName","SliderCheckboxWithUnstated","Subscribe","to","assign","FilterButton","isActive","setFilterOpacity","state2","buttonClass","buttonFilter","onClick","DisplayWrapper","Fragment","displayParameter","stayInDom","HotspotFilters","dropdown","setDefaultFilterValues","_this$props$unstated$","InputRange","minValue","maxValue","setPriceFilter","onChangeComplete","setQuadratureFilter","withTranslation","LegendItem","_props$availableFilte","useTranslation","Legend","executeActions","eventType","action","actionHandler","eventName","functionName","NavbarButton","isHovered","buttonData","buttonContent","hoverIconUrl","iconUrl","returnBackgroundColor","buttonActionHelper","onMouseEnter","onMouseLeave","NavbarButtonWithUnstated","StateButtonArray","scrollable","setNavbarScrollable","buttonsInNavbar","isDefault","getIdOfButtonState","actionParameter","getButtonClass","stateIdOfButtonPressed","componentDidMount","_this$props$customBut","text","DefaultButton","formatButtonStyles","backgroundImageUrl","right","buttonName","DefaultButtonWithUnstated","StarButton","isIconHovered","setIsIconHovered","isStatic","styles","iconColor","size","fill","marginTop","viewBox","xmlns","d","fill-rule","StarButtonWithUnstated","Navbar","isOpen","carouselNavbarSettings","vertical","verticalSwiping","buttonContainer","idOfState","getStateBeingScrolledTo","scrollToHeight","scrollTo","behavior","sideMenuContainerBackground","transform","currentQuadrature","currentPrices","updateButtonContainerScroll","DirectionControls","MyMapComponent","withScriptjs","withGoogleMap","GoogleMap","defaultZoom","defaultCenter","lat","lng","isMarkerShown","Marker","defaultClickable","icon","url","defaultIcon","MapView","apiKey","latitude","longitude","pinIconUrl","googleMapURL","loadingElement","containerElement","mapElement","Compass","setRotationAngle","angle","round","containerPadding","padding","CompassWithUnstated","ItemTypes","Apartment","drag","useDrag","thumbnail","collect","monitor","ref","removeFavourite","pointerEvents","ApartmentViewerBox","apartmentViewed","setApartment","setName","setImage","setType","setQuadrature","pageNumber","setPageNumber","isOver","drop","useDrop","accept","twoDimensionalPlan","number","isSet","overflow","removeViewedApartment","CompareToggleView","handleButtonClicked","buttonType","activeButton","handle2dButtonClicked","buttonTypes","hideViewContainer","handle3dButtonClicked","containerType","containers","leftContainer","setActive3DViewContainer","rightContainer","activeContainer","container3DType","CompareToggleViewWithUnstated","DragControls","setAllEvents","setZoomHandler","setDragCanvas","setCursorEvent","onmouseover","setCursor","currentZoom","minCameraZoom","setCameraToInitialPosition","cameraInitialPosition","z","onmousedown","draggingObj","isItDragging","getWorldToCanvasABSCoordinates","positions","onmousemove","newX","newY","translateX","translateY","onmouseup","wx","wy","getWorldToCanvasABSWithCustomZ","onwheel","getWorldToCanvasPercentCoordinates","percentX","clientWidth","percentY","clientHeight","getABSBounds","getABSBoundsWithCustomZ","getWorldToCanvasCoordinates","getWorldToCanvasWithCustomZ","getWorldToCanvasABSPercentCoordinates","cz","halfHeight","tan","step","zoomOptions","zp","newZoom","futureX","futureY","offX","offY","setZ","CompareScene","canvasWrapper","image3dUrl","canvasWrapperPoperties","Scene","PerspectiveCamera","WebGLRenderer","handleWindowResize","initializeSpirte","updateSpriteTexture","onAnimationFrameHandler","Sprite","SpriteMaterial","textureUrl","textureLoader","LinearFilter","canvasWrapperProperties","TextureLoader","CompareCanvas","getCanvasWrapper","getCanvas","CompareCanvasWithUnstated","Compare","firstApartmentViewerKey","secondApartmentViewerKey","isFirstContainerSceneInit","isSecondContainerSceneInit","pdfLeftScale","pdfRightScale","shownPdfRight","shownPdfLeft","leftCanvasScrollInterval","rightCanvasScrollInterval","onWindowClose","renderPDFOnOpenWindow","twoDimensionalPlanUrl","loadLeftPDFDocument","loadRightPDFDocument","boxSelector","tempInterval","setTimeout","newScale","clearInterval","displayLeftPage","displayRightPage","renderLeftApartmentPDF","page","viewport","getViewport","handleLeftPDFScroll","context","renderContext","canvasContext","renderRightApartmentPDF","handleRightPDFScroll","pdf","num","getPage","pdfjsLib","GlobalWorkerOptions","workerSrc","version","getDocument","promise","newStyle","leftApartmentCanvas","rightApartmentCanvas","count","StarIcon","marginLeft","Slider","bind","isMouseOver","mouseOverFirst","mouseOverSecond","secondCompareContainerActiveType","CalibrationHelper","htmlFor","defaultValue","target","CustomButtonArray","_state2$state$customB","CustomButton","BackButtonIcon","isApartmentPage","xmlnsXlink","xmlSpace","bottomleftorigin","points","x1","y1","x2","y2","troke","BackButtonIconWithUnstated","BackButton","cancelAnimationFrame","triggerSceneRender","toggleApartmentInfoOff","BackButtonWithUnstated","ToggleApartmentView","ToggleApartmentViewWithUnstated","ApartmentSidebar","buttonImgUrl","handleFavouriteClick","getFavouriteButtonBackground","apartmentClickedKey","getFontSize","facingSide","terraceQuadrature","bathrooms","ShowApartment","_isMounted","pdfScale","shownPdf","canvasScrollInterval","canvasWidth","handlePDFScroll","displayPage","calculatePdfScale","calculateDifferenceMultiplier","usualSize","currentSize","renderApartmentPDF","cleanup","loadPDFDocument","download3dImage","saveAs","download3DImageOrPdf","rel","download","initializeApartmentScene","componentWillUnmount","ProgressBar","_ref","done","LoadingOverlay","rotation","initCamera","initRenderer","initControls","initLight","createSkybox","skyboxGeometry","SphereBufferGeometry","skyboxMaterial","MeshPhongMaterial","shading","FlatShading","BackSide","skyboxMesh","Mesh","changeSkyboxBackground","onComplete","sizes","controls","OrbitControls","enableDamping","enableZoom","light","AmbientLight","OrbViewButton","isButtonHovered","setIsButtonHovered","ShowScene","OrbViewScene","OrbViewButtonWithUnstated","OrbViewSidebar","_props$unstated$state","orbView","OrbViewSidebarWithUnstated","OrbView","displayStyle","backgroundColorStyle","useEffect","OrbViewWithUnstated","getOrientation","useScreenOrientation","orientation","setOrientation","disableCanvasPointerEvent","updateOrientation","LandscapeNotification","screenOrientation","App","loadingValue","shouldShowCanvas","DndProvider","options","HTML5toTouch","Fullscreen","setFullscreen","activeCompareApratmentType","rowsPerFloor","AppWithUnstated","Provider","ReactDOM","StrictMode","serviceWorker","ready","registration","unregister","message"],"mappings":"ooIAYoBA,QACW,cAA7BC,OAAOC,SAASC,UAEe,UAA7BF,OAAOC,SAASC,UAEhBF,OAAOC,SAASC,SAASC,MACvB,2D,4BCTN,MAAMC,EAAY,CAChBC,QAAS,CACPC,Y,QAEFC,OAAQ,CACND,Y,QAEFE,OAAQ,CACNF,Y,QAEFG,QAAS,CACPH,Y,SAIJI,IACGC,IAAIC,KACJD,IAAIE,KACJC,KAAK,CACJC,OAAO,EACPC,YAAa,SACbC,cAAe,CACbC,aAAa,GAEfd,cAGWM,QAAI,E,2CCzBJ,UAXf,MAOIS,WAAWC,EAAYC,GACnBrB,OAAOsB,aAAaC,QAAQH,EAAYI,KAAKC,UAAUJ,MC4IhD,UApJf,MASEK,aAAaC,EAAMC,EAAYC,EAAOC,GACpC,MAAM,GAANC,OAAUJ,EAAI,KAAAI,OAAIH,EAAU,KAAAG,OAAIF,EAAK,KAAAE,OAAID,GAW3CE,aAAaL,EAAMC,EAAYC,EAAOC,EAAKG,GACzC,MAAM,GAANF,OAAUJ,EAAI,KAAAI,OAAIH,EAAU,KAAAG,OAAIF,EAAK,KAAAE,OAAID,EAAG,KAAAC,OAAIE,GAOlDC,qBAAqBC,GACnB,IAAKA,EAAO,MAAO,UAMnB,QAHeA,EAAMhC,MADI,0JAGCgC,EAAMC,QAAQ,cAAe,MAAQD,EAIjEE,gBAAgBC,GACd,GAAIA,EAAYC,SAAS,QAAS,CAChC,MAAMC,EAAU,CAAC,IAAK,IAAK,IAAK,KAChC,IAAIC,EAAS,GACTN,EAAQG,EAAYF,QAAQ,oBAAqB,IAAIM,MAAM,KAE/D,IAAK,IAAIC,KAAKH,EACZC,EAAOD,EAAQG,IAAMR,EAAMQ,IAAM,EAEnC,MAAO,CAAC,OAADZ,OAAQU,EAAOG,EAAC,MAAAb,OAAKU,EAAOI,EAAC,MAAAd,OAAKU,EAAOK,EAAC,KAAKL,EAAOM,GAE/D,MAAO,CAACT,EAAa,GAOvBU,0BAA0BC,GAExB,OADoCA,EAAIP,MAAM,KACT,GASvCQ,wBAAwBC,GACtB,IAAK,IAAIR,EAAI,EAAGA,EAAIQ,EAAcC,OAAQT,IAAK,CAC7C,MAAMU,EAAKF,EAAcR,GACzB,GAAIU,GAAM,KAAOA,GAAM,IACrB,OAAO,EAGX,OAAO,EAGTC,iBAAiBC,GACf,IAAIC,EAAS,GAEb,IAAK,IAAIb,EAAI,EAAGA,EAAIY,EAAYH,OAAQT,IAAK,CAC3C,IAAIU,EAAKE,EAAYZ,GAErB,GAAIU,GAAM,KAAOA,GAAM,IACrBG,EAAOC,KAAKJ,OAGT,CAEH,IAAIK,EAAeH,EAAYI,UAAUhB,EAAGY,EAAYH,QAExD,GAAII,EAAOJ,OAAS,GACdQ,KAAKV,wBAAwBQ,GAC/B,OAAOH,GAOf,IAAK,IAAIZ,EAAI,EAAGA,EAAIa,EAAOJ,OAAQT,IAAK,CAEtC,GAAgB,MADAa,EAAOb,GAElB,MADgBa,EAAOK,QAK9B,IAAIC,EAAY,GAChB,IAAK,IAAInB,EAAI,EAAGA,EAAIa,EAAOJ,OAAQT,IACjCmB,GAAaN,EAAOb,GAItB,OAAyB,IAArBmB,EAAUV,QAAgBW,MAAMD,GAAmBP,EAChDO,EAITE,iBAAiBC,GACf,GAA8B,IAA1BA,EAAeb,OAAc,CAC/B,IAAIc,EAAc,GAKdC,EAH4BF,EAAevB,MAAM,OACM,GAAGA,MAAM,KACR,GAAGA,MAAM,KACV,GAAGA,MAAM,KAEhE0B,EAASD,EAA0B,GAAGhE,MAAM,OAAO,GAEnDkE,EADIC,SAASF,GACC,IAClBF,EAAYT,KAAKY,GACjBD,EAASD,EAA0B,GAAGhE,MAAM,OAAO,GACnD,IACIoE,EADID,SAASF,GACC,IAClBF,EAAYT,KAAKc,GACjBH,EAASD,EAA0B,GAAGhE,MAAM,OAAO,GACnD,IACIqE,EADIF,SAASF,GACC,IAGlB,OAFAF,EAAYT,KAAKe,GAEVN,KCxIE,MAAMO,UAAuBC,IAC1CC,YAAYC,GACVC,MAAMD,GAi7BR,KAIAE,mBAAsBC,IACpBnB,KAAKoB,MAAMC,aAAeF,EAAMG,OAAOC,OA0KzC,KAIAC,aAAgBL,IAEZnB,KAAKoB,MAAMK,sBACXN,EAAMO,SACN1B,KAAKoB,MAAMO,kBACX3B,KAAKoB,MAAMQ,aAGTT,EAAMU,OAAS,EACjB7B,KAAK8B,qBAGP9B,KAAK+B,uBAGP,KAIAC,iBAAoBb,IAClB,QACsCc,IAApCjC,KAAKoB,MAAMc,sBACXlC,KAAKoB,MAAMO,iBAEX,OACF3B,KAAKoB,MAAMe,kBAAoB,CAAChB,EAAMiB,QAASjB,EAAMkB,SACrDrC,KAAKoB,MAAMkB,WAAY,EAGVC,SAASC,eAAe,wBAC9BC,iBAAiB,YAAazC,KAAK0C,mBAG5C,KAGAC,eAAiB,KACf,QAAwCV,IAApCjC,KAAKoB,MAAMc,qBACb,OAEFlC,KAAKoB,MAAMe,kBAAoB,CAAC,EAAG,GACnCnC,KAAKoB,MAAMkB,WAAY,EACnBtC,KAAKoB,MAAMwB,YAAY5C,KAAK6C,SAAS,CAAED,YAAY,IAG1CL,SAASC,eAAe,wBAC9BM,oBAAoB,YAAa9C,KAAK0C,mBAG/C,KAGAK,gBAAkB,UACwBd,IAApCjC,KAAKoB,MAAMc,uBAEflC,KAAKoB,MAAMkB,WAAY,EACvBtC,KAAKoB,MAAM4B,cAAgB,EAC3BhD,KAAKoB,MAAM6B,cAAgB,EACvBjD,KAAKoB,MAAMwB,YAAY5C,KAAK6C,SAAS,CAAED,YAAY,MAGzD,KAIAF,iBAAoBvB,IAClB,IAAKnB,KAAKoB,MAAMkB,gBAAiDL,IAApCjC,KAAKoB,MAAMc,qBACtC,OAEF,IAAIgB,EAAa,CACflD,KAAKoB,MAAMe,kBAAkB,GAC7BnC,KAAKoB,MAAMe,kBAAkB,IAE3BgB,EAAW,CAAChC,EAAMiB,QAASjB,EAAMkB,SAEjCe,EAAYD,EAAS,GAAKD,EAAW,GACrCG,EAAYF,EAAS,GAAKD,EAAW,GAErCI,EAAeC,KAAKC,KACtBD,KAAKE,IAAIL,EAAW,GAAKG,KAAKE,IAAIJ,EAAW,IAG3CC,EAAetD,KAAKoB,MAAMsC,SAASC,YAElC3D,KAAKoB,MAAMwB,YACd5C,KAAK6C,SAAS,CAAED,YAAY,IAK5BW,KAAKK,IAAIP,GAAaE,KAAKK,IAAIR,IAC/BE,GAAgD,EAAhCtD,KAAKoB,MAAMsC,SAASC,UAEhCP,EAAY,EAAGpD,KAAK6D,QACnB7D,KAAK8D,UAENT,EAAY,EAAGrD,KAAK+D,UACnB/D,KAAKgE,WAIZhE,KAAKoB,MAAMe,kBAAoBgB,IAGjC,KAGAc,eAAiB,KACf,QAAwChC,IAApCjC,KAAKoB,MAAMc,qBACb,OAEFlC,KAAKoB,MAAMe,kBAAoB,CAAC,EAAG,GACnCnC,KAAKoB,MAAMkB,WAAY,EACnBtC,KAAKoB,MAAMwB,YAAY5C,KAAK6C,SAAS,CAAED,YAAY,IAE1CL,SAASC,eAAe,wBAC9BM,oBAAoB,YAAa9C,KAAKkE,mBAG/C,KAIAC,iBAAoBhD,IAClB,QACsCc,IAApCjC,KAAKoB,MAAMc,sBACXlC,KAAKoB,MAAMgD,cAEX,OACFpE,KAAKoB,MAAMe,kBAAoB,CAAChB,EAAMiB,QAASjB,EAAMkB,SACrDrC,KAAKoB,MAAMkB,WAAY,EAEVC,SAASC,eAAe,wBAC9BC,iBAAiB,YAAazC,KAAKkE,mBAG5C,KAIAA,iBAAoB/C,IAClB,IAAKnB,KAAKoB,MAAMkB,gBAAiDL,IAApCjC,KAAKoB,MAAMc,qBACtC,OAEF,IAAIgB,EAAa,CACflD,KAAKoB,MAAMe,kBAAkB,GAC7BnC,KAAKoB,MAAMe,kBAAkB,IAE3BgB,EAAW,CAAChC,EAAMkD,QAAQ,GAAGjC,QAASjB,EAAMkD,QAAQ,GAAGhC,SAGvDe,EAAYD,EAAS,GAAKD,EAAW,GAErCG,EAAYF,EAAS,GAAKD,EAAW,GAGrCI,EAAeC,KAAKC,KACtBD,KAAKE,IAAIL,EAAW,GAAKG,KAAKE,IAAIJ,EAAW,IAG3CC,EAAetD,KAAKoB,MAAMsC,SAASC,YAMrCJ,KAAKK,IAAIP,GAAaE,KAAKK,IAAIR,IAC/BE,GAAgD,EAAhCtD,KAAKoB,MAAMsC,SAASC,UAEhCP,EAAY,EAAGpD,KAAK6D,QACnB7D,KAAK8D,UAENT,EAAY,EAAGrD,KAAK+D,UACnB/D,KAAKgE,WAEZhE,KAAKoB,MAAMe,kBAAoBgB,IAGjC,KAGAmB,mBAAqB,UACqBrC,IAApCjC,KAAKoB,MAAMc,uBAGflC,KAAKoB,MAAMe,kBAAoB,CAAC,EAAG,GACnCnC,KAAKoB,MAAMkB,WAAY,EACnBtC,KAAKoB,MAAMwB,YAAY5C,KAAK6C,SAAS,CAAED,YAAY,MAGzD,KAIA2B,0BAA6BpD,IAC3B,QAAwCc,IAApCjC,KAAKoB,MAAMc,qBAAoC,OACnDlC,KAAKoB,MAAMe,kBAAoB,CAAChB,EAAMiB,QAASjB,EAAMkB,SACrDrC,KAAKoB,MAAMkB,WAAY,EAEVC,SAASC,eAAe,wBAC9BC,iBAAiB,YAAazC,KAAKwE,4BAG5C,KAGAC,wBAA0B,KACxB,QAAwCxC,IAApCjC,KAAKoB,MAAMc,qBACb,OAEFlC,KAAKoB,MAAMe,kBAAoB,CAAC,EAAG,GACnCnC,KAAKoB,MAAMkB,WAAY,EAEVC,SAASC,eAAe,wBAC9BM,oBAAoB,YAAa9C,KAAKwE,4BAG/C,KAGAE,yBAA2B,KACzB,QAAwCzC,IAApCjC,KAAKoB,MAAMc,qBAAoC,OAEnDlC,KAAKoB,MAAMkB,WAAY,EACvBtC,KAAKoB,MAAM4B,cAAgB,EAC3BhD,KAAKoB,MAAM6B,cAAgB,EAEdV,SAASC,eAAe,wBAC9BM,oBAAoB,YAAa9C,KAAKwE,4BAG/C,KAIAA,0BAA6BrD,IAC3B,IAAKnB,KAAKoB,MAAMkB,UAAW,OAE3B,IAAIY,EAAa,CACflD,KAAKoB,MAAMe,kBAAkB,GAC7BnC,KAAKoB,MAAMe,kBAAkB,IAE3BgB,EAAW,CAAChC,EAAMiB,QAASjB,EAAMkB,SAEjCe,EAAYD,EAAS,GAAKD,EAAW,GACrCG,EAAYF,EAAS,GAAKD,EAAW,GAGtBK,KAAKC,KACtBD,KAAKE,IAAIL,EAAW,GAAKG,KAAKE,IAAIJ,EAAW,IAG5BrD,KAAKoB,MAAMsC,SAASC,YAKnCJ,KAAKK,IAAIP,GAAaE,KAAKK,IAAIR,KAC7BC,EAAY,EAAGrD,KAAK2E,mBACnB3E,KAAK4E,qBAIZ5E,KAAKoB,MAAMe,kBAAoBgB,IAGjC,KAIA0B,0BAA6B1D,IAC3B,QAAwCc,IAApCjC,KAAKoB,MAAMc,sBAAsClC,KAAKoB,MAAMQ,WAC9D,OAEF5B,KAAKoB,MAAMe,kBAAoB,CAAChB,EAAMiB,QAASjB,EAAMkB,SACrDrC,KAAKoB,MAAMkB,WAAY,EAEVC,SAASC,eAAe,wBAC9BC,iBAAiB,YAAazC,KAAK8E,4BAG5C,KAGAC,wBAA0B,KACxB,QAAwC9C,IAApCjC,KAAKoB,MAAMc,qBACb,OAEFlC,KAAKoB,MAAMe,kBAAoB,CAAC,EAAG,GACnCnC,KAAKoB,MAAMkB,WAAY,EAEVC,SAASC,eAAe,wBAC9BM,oBAAoB,YAAa9C,KAAK8E,4BAG/C,KAGAE,yBAA2B,KACzB,QAAwC/C,IAApCjC,KAAKoB,MAAMc,qBAAoC,OAEnDlC,KAAKoB,MAAMkB,WAAY,EACvBtC,KAAKoB,MAAM4B,cAAgB,EAC3BhD,KAAKoB,MAAM6B,cAAgB,EAEdV,SAASC,eAAe,wBAC9BM,oBAAoB,YAAa9C,KAAK8E,4BAG/C,KAIAA,0BAA6B3D,IAC3B,IAAKnB,KAAKoB,MAAMkB,UAAW,OAC3B,IAAIY,EAAa,CACflD,KAAKoB,MAAMe,kBAAkB,GAC7BnC,KAAKoB,MAAMe,kBAAkB,IAE3BgB,EAAW,CAAChC,EAAMkD,QAAQ,GAAGjC,QAASjB,EAAMkD,QAAQ,GAAGhC,SAEvDe,EAAYD,EAAS,GAAKD,EAAW,GACrCG,EAAYF,EAAS,GAAKD,EAAW,GAGtBK,KAAKC,KACtBD,KAAKE,IAAIL,EAAW,GAAKG,KAAKE,IAAIJ,EAAW,IAG5BrD,KAAKoB,MAAMsC,SAASC,YAInCJ,KAAKK,IAAIP,GAAaE,KAAKK,IAAIR,KAC7BC,EAAY,EAAGrD,KAAK2E,mBACnB3E,KAAK4E,qBAGZ5E,KAAKoB,MAAMe,kBAAoBgB,IAp7C/BnD,KAAKoB,MAAQ,CACXsC,SAAU,GAEVuB,gBAAiB,EAEjBC,aAAc,EACdC,WAAY,EACZC,cAAe,EACfC,qBAAsB,EACtBC,WAAY,GACZC,oBAAqB,GAErBC,aAAc,GAEdC,cAAe,CACbC,GAAI,CACFC,aAAc,GACdC,eAAgB,GAEhBC,WAAY,GACZC,aAAc,GAEdC,YAAa,GACbC,cAAe,IAEjBC,GAAI,CACFN,aAAc,GACdE,WAAY,GACZE,YAAa,IAEfG,GAAI,CACFP,aAAc,GACdE,WAAY,GACZE,YAAa,IAEfI,GAAI,CACFR,aAAc,GACdE,WAAY,GACZE,YAAa,IAEfK,GAAI,CACFT,aAAc,GACdE,WAAY,GACZE,YAAa,KAGjBM,wBAAyB,GAEzBC,cAAe,GACfC,YAAa,GACbC,YAAa,GACbC,YAAa,GACbC,iBAAkB,GAClBC,iBAAkB,GAElBC,IAAK,IACLC,YAAa,EACbC,yBAA0B,IAC1BC,aAAc,IACdC,WAAY,EACZC,QAAS,EACTC,QAAS,EACTC,SAAU,IAEVC,aAAc,EACdC,qBAAsB,KACtBC,oBAAqB,oCAErB3F,kBAAkB,EAClByC,eAAe,EACfmD,cAAc,EAEd3F,YAAY,EACZ4F,gBAAgB,EAChBC,iBAAiB,EACjBC,mBAAmB,EACnBC,mBAAmB,EACnBC,oBAAoB,EACpBC,eAAe,EACfC,mBAAmB,EACnBC,qBAAqB,EACrBC,gBAAgB,EAChBC,yBAAyB,EACzBC,kCAAkC,EAClCC,iBAAiB,EACjBC,0BAA0B,EAC1BC,qBAAqB,EACrBC,uBAAuB,EAEvBC,SAAU,GACVC,2BAA2B,EAE3BC,mBAAmB,EAEnBhH,sBAAsB,EACtBS,0BAAsBD,EACtBZ,cAAc,EAEdqH,cAAe,GACfC,aAAc,GACdC,oBAAqB,KACrBC,2BAA4B,GAE5B1G,kBAAmB,CAAC,EAAG,GACvBG,WAAW,EACXM,YAAY,EAEZkG,8BAA8B,EAC9BC,oBAAqB,CACnBC,GAAI,CAAEC,QAAS,SACfC,GAAI,CAAED,QAAS,SAEjBE,+BAAgC,EAChCC,qBAAsB,CACpBJ,GAAI,CAAEC,QAAS,SACfC,GAAI,CAAED,QAAS,SAGjBI,wBAAyB,CACvBC,MAAM,EACNC,UAAU,EACVC,QAAQ,EACRC,MAAO,IACPC,aAAc,EACdC,eAAgB,EAChBC,gBAAgB,EAChBC,UAAW,6BACXC,WAAY,CACV,CACEC,WAAY,IACZC,SAAU,CACRN,aAAc,EACdC,eAAgB,IAGpB,CACEI,WAAY,IACZC,SAAU,CACRN,aAAc,EACdC,eAAgB,IAGpB,CACEI,WAAY,KACZC,SAAU,CACRN,aAAc,EACdC,eAAgB,IAGpB,CACEI,WAAY,KACZC,SAAU,CACRN,aAAc,EACdC,eAAgB,IAGpB,CACEI,WAAY,KACZC,SAAU,CACRN,aAAc,EACdC,eAAgB,OAO1B,IAAIM,EAAa,EAAI1G,KAAK2G,GAAMlK,KAAKoB,MAAMkE,WAC3CtF,KAAKoB,MAAMgG,cAAgB,EAAI6C,EAAYjK,KAAKoB,MAAMgE,cACtDpF,KAAKmK,uBAMP,iCACE,IAAIC,EAAuB,GACvBC,EAAOjO,OAAOsB,aAAa4M,QAAQ,wBACvC,GAAa,OAATD,EAAe,CACjBA,EAAOzM,KAAK2M,MAAMF,GAElB,IAAK,IAAItL,EAAI,EAAGA,EAAIsL,EAAK7K,OAAQT,SACWkD,IAAtCjC,KAAKoB,MAAMsH,cAAc2B,EAAKtL,KAChCqL,EAAqBvK,KAAKG,KAAKoB,MAAMsH,cAAc2B,EAAKtL,UAI5DsL,EAAO,GACPG,EAAmBjN,WAAW,uBAAwB8M,GACtDrK,KAAK6C,SAAS,CAAE+F,oBAAqByB,UAGjCrK,KAAK6C,SAAS,CAClBgG,2BAA4BuB,EAC5BxB,oBAAqByB,IAQzBI,aAAaC,GACX,IAAI7B,EAA6B7I,KAAKoB,MAAMyH,2BAC5C,QAA+C5G,IAA3CjC,KAAKoB,MAAMsH,cAAcgC,GAA6B,CAExD7B,EAA2BhJ,KAAKG,KAAKoB,MAAMsH,cAAcgC,IACzD1K,KAAK6C,SAAS,CAAEgG,+BAEhB,IAAI8B,EAAgB3K,KAAKoB,MAAMwH,oBAC/B+B,EAAc9K,KAAK6K,GAEnB1K,KAAK6C,SAAS,CAAE+F,oBAAqB+B,IAIb,OAFFvO,OAAOsB,aAAa4M,QAAQ,yBAGhDlO,OAAOsB,aAAakN,WAAW,wBAEjCxO,OAAOsB,aAAaC,QAClB,uBACAC,KAAKC,UAAUmC,KAAKoB,MAAMwH,uBAShC,qBAAqB8B,GACnB,IAAIL,EAAOrK,KAAKoB,MAAMwH,oBAClB+B,EAAgB3K,KAAKoB,MAAMyH,2BAE3BgC,EAAcR,EAAKS,QAAQJ,GAG/B,IAAK,IAAI3L,EAAI,EAAGA,EAAI4L,EAAcnL,OAAQT,IACxC,GAAI4L,EAAc5L,GAAGM,MAAQqL,EAAc,CACzCC,EAAcI,OAAOhM,EAAG,GACxBiB,KAAK6C,SAAS,CACZgG,2BAA4B8B,IAE9B,OAKiB,IAAjBE,IACFR,EAAKU,OAAOF,EAAa,SACnB7K,KAAK6C,SAAS,CAClB+F,oBAAqByB,KAKzBjO,OAAOsB,aAAaC,QAAQ,uBAAwBC,KAAKC,UAAUwM,IAMrEW,iBACEhL,KAAK6C,SAAS,CAAEuB,eAAgBpE,KAAKoB,MAAMgD,gBAM7C6G,wBACEjL,KAAK6C,SAAS,CACZ2E,gBAAgB,EAChB/F,sBAAsB,EACtBS,0BAAsBD,IAGxB,IAAId,EAAQ,IAAI+J,YAAY,sBAC5B9O,OAAO+O,cAAchK,GAMvBiK,mBACE,IAAIjK,EAAQ,IAAI+J,YAAY,oBAEf3I,SAASC,eAAe,wBAC9B2I,cAAchK,GAMvBkK,gCACE,IAAIC,EAAa,GACjBA,EAAWzL,KAAKG,KAAKoB,MAAM8D,cAC3BoG,EAAWzL,KAAKG,KAAKoB,MAAMc,qBAAqB7C,KAChDiM,EAAWzL,KAAKG,KAAKoB,MAAMiE,sBAE3B,IAAIkG,EACFvL,KAAKoB,MAAMc,qBAAqBsJ,WAC9BxL,KAAKoB,MAAMiE,sBAEfiG,EAAWzL,KAAK0L,GAChB,IAAIpK,EAAQ,IAAI+J,YAAY,yBAA0B,CACpD5J,OAAQ,CACNgK,WAAYA,KAIhBlP,OAAO+O,cAAchK,GAOvBsK,eAAeC,GACb,IAAIC,EAAM,GAEND,IACFC,EAAG,oEAAAxN,OAEUuN,EAAO,gBAGtB,MAAME,EAAQrJ,SAASsJ,cAAc,SACjCD,EAAME,WACRF,EAAME,WAAWC,QAAUJ,EAE3BC,EAAMI,YAAYzJ,SAAS0J,eAAeN,IAE5CpJ,SAAS2J,qBAAqB,QAAQ,GAAGF,YAAYJ,GAOvDO,mCAAmCC,GACjC,MAAMC,EAAwB,GACxBC,EAAU,GAChBF,EAAOG,QAASnL,IACVA,EAAMoL,YACRpL,EAAMoL,WAAWD,QAASE,IACnBA,EAAUC,aACbL,EAAsBxM,KAAK4M,EAAUpN,KAElCiN,EAAQ3N,SAAS8N,EAAU1O,OAA4B,KAAnB0O,EAAU1O,MACjDuO,EAAQzM,KAAK4M,EAAU1O,UAK/BuO,EAAQK,OACR3M,KAAK6C,SAAS,CAAE+J,iBAAkBN,IAGpCO,sBAAsBT,EAAQU,GAC5B,IAAIC,EAAcD,EASlB,OARAV,EAAOG,QAASnL,IACd2L,EAAYR,QAASS,IACfA,EAAOC,QAAQ,GAAGC,YAAc9L,EAAM+L,OACxCH,EAAOI,eAAiBhM,EAAMgM,oBAIpCL,EAAYJ,KAAK,CAACxN,EAAGD,IAAMC,EAAEiO,eAAiBlO,EAAEkO,gBACzCL,EAGTM,iBAAiB5H,GACf,IAEI6H,EAAkB,GAwBtB,MA1Ba,CAAC,KAAM,KAAM,KAAM,KAAM,MAG/Bf,QAASgB,IACd,IAAIC,EAAgBC,EAAahP,gBAC/BgH,EAAc8H,GAAUG,cAEtBC,EAAcF,EAAahP,gBAC7BgH,EAAc8H,GAAUK,YAEtBC,EAAeJ,EAAahP,gBAC9BgH,EAAc8H,GAAUjN,aAG1BgN,EAAgBC,GAAY,CAC1BG,aAAcF,EAAc,GAC5BM,eAAgBC,WAAWP,EAAc,IAEzCI,WAAYD,EAAY,GACxBK,aAAcD,WAAWJ,EAAY,IAErCrN,YAAauN,EAAa,GAC1BI,cAAeF,WAAWF,EAAa,OAIpCP,EAQT,kBAAkBnM,GAChBnB,KAAKiK,UAAa,EAAI1G,KAAK2G,GAAM/I,EAAMG,OAAOoC,SAAS4B,WACvDtF,KAAKmM,mCAAmChL,EAAMG,OAAOoC,SAAS0I,QAC9D,MAAMA,EAASjL,EAAMG,OAAOoC,SAAS0I,OAErC,IAAI8B,EAAgBlO,KAAK6M,sBACvB1L,EAAMG,OAAOoC,SAAS0I,OACtBjL,EAAMG,OAAOoC,SAASyK,WAAWC,eAE/B3I,EAAgBzF,KAAKqN,iBACvBlM,EAAMG,OAAOoC,SAAS+B,eAGpBiD,EAAgB,GAChBH,EAAW,GACXI,EAAe,GACf0F,EAAW,EACXC,EAAW,EACXC,EAAgB,EAChBC,EAAgB,EAGpB,IAAK,IAAIzP,EAAI,EAAGA,EAAIqN,EAAO5M,OAAQT,IACjC,GAAIqN,EAAOrN,GAAGyN,WAAWhN,OAAS,EAAG,CACnC,IAAIgN,EAAaJ,EAAOrN,GAAGyN,WAC3B,IAAK,IAAIiC,EAAI,EAAGA,EAAIjC,EAAWhN,OAAQiP,KACR,IAAzBjC,EAAWiC,GAAGC,QAAiB/F,EAAa9I,KAAK2M,EAAWiC,SAEpCxM,IAAxBuK,EAAWiC,GAAGE,QACZnC,EAAWiC,GAAGE,MAAQN,EACxBA,EAAW7B,EAAWiC,GAAGE,MAChBnC,EAAWiC,GAAGE,MAAQL,IAC/BA,EAAW9B,EAAWiC,GAAGE,aAII1M,IAA7BuK,EAAWiC,GAAGG,aACZpC,EAAWiC,GAAGG,WAAaL,EAC7BA,EAAgB/B,EAAWiC,GAAGG,WACrBpC,EAAWiC,GAAGG,WAAaJ,IACpCA,EAAgBhC,EAAWiC,GAAGG,aAGlClG,EAAc8D,EAAWiC,GAAGpP,KAAOmN,EAAWiC,GAKpD,GAAGtN,EAAMG,OAAOoC,SAASmL,SAAU,CACjC,MAAMC,EAAW3N,EAAMG,OAAOoC,SAASmL,SAEvC,IAAK,IAAIE,EAAQ,EAAGA,EAAQD,EAAStP,OAAQuP,IAAS,CACpD,MAAMC,EAAUF,EAASC,GACzBxG,EAAS1I,KAAKmP,UAKZhP,KAAK6C,SAAS,CAClBqE,QAAS/F,EAAMG,OAAOoC,SAASwD,QAC/BD,QAAS9F,EAAMG,OAAOoC,SAASuD,QAC/BD,WAAY7F,EAAMG,OAAOoC,SAASuD,QAClCwB,kBAAmBtH,EAAMG,OAAOoC,SAASuL,iBACzCvL,SAAUvC,EAAMG,OAAOoC,SAEvBwL,oBACE/N,EAAMG,OAAOoC,SAASyK,WAAWgB,wBACnCC,yBACEjO,EAAMG,OAAOoC,SAASyK,WAAWkB,uBACnCC,0BACEnO,EAAMG,OAAOoC,SAASyK,WAAWoB,wBACnCC,0BACErO,EAAMG,OAAOoC,SAASyK,WAAWsB,wBACnCC,qBACEvO,EAAMG,OAAOoC,SAASyK,WAAWwB,wBACnCC,qBACEzO,EAAMG,OAAOoC,SAASyK,WAAW0B,wBACnCC,oBACE3O,EAAMG,OAAOoC,SAASyK,WAAW4B,uBACnCC,oBACE7O,EAAMG,OAAOoC,SAASyK,WAAW8B,uBAEnCxJ,YAAa,CAAC4H,EAAUC,GACxB9H,YAAa,CAAE0J,IAAK7B,EAAU8B,IAAK7B,GACnC3H,iBAAkB,CAAC4H,EAAeC,GAClC9H,iBAAkB,CAAEwJ,IAAK3B,EAAe4B,IAAK3B,GAE7C4B,UAAWjP,EAAMG,OAAOoC,SAAS2M,eACjCC,mBAAoBnP,EAAMG,OAAOoC,SAAS4M,mBAC1CC,cAAepP,EAAMG,OAAOoC,SAAS8M,2BAErClL,WAAYnE,EAAMG,OAAOoC,SAAS4B,WAClCH,WAAYhE,EAAMG,OAAOoC,SAASyB,WAClCD,aAAc/D,EAAMG,OAAOoC,SAASwB,aACpCM,aAAcrE,EAAMG,OAAOoC,SAAS8B,aACpCJ,cAAejE,EAAMG,OAAOoC,SAAS0B,cAErCuD,aAAcA,EACdD,cAAeA,EACfjD,cAAeA,EACfgL,cAAetP,EAAMG,OAAOoC,SAAS+M,cACrCpK,wBAAyBlF,EAAMG,OAAOoC,SAASgN,wBAE/CtJ,cAAe,EAAIpH,KAAKiK,UAAY9I,EAAMG,OAAOoC,SAAS0B,cAG1DuL,UAAWxP,EAAMG,OAAOoC,SAASyK,WAAWwC,WAAa,yBACzDC,mBAAoBzP,EAAMG,OAAOoC,SAASyK,WAAW0C,oBAAsB,4BAC3EC,WAAY3P,EAAMG,OAAOoC,SAASyK,WAAW2C,WAC7CC,YAAa5P,EAAMG,OAAOoC,SAASyK,WAAW4C,YAC9C3C,cAAeF,EACf8C,eAAgB7P,EAAMG,OAAOoC,SAASyK,WAAW6C,eACjDhJ,eAAgB7G,EAAMG,OAAOoC,SAASyK,WAAWnG,eACjDiJ,eAAgB9P,EAAMG,OAAOoC,SAASyK,WAAW+C,gBACjDC,aAAchQ,EAAMG,OAAOoC,SAASyK,WAAWiD,qBAC/C/J,qBACElG,EAAMG,OAAOoC,SAASyK,WAAW9G,qBAEnCkB,SAAUA,EACV8I,eACElQ,EAAMG,OAAOoC,SAASyK,WAAWkD,eACnCC,aACEnQ,EAAMG,OAAOoC,SAASyK,WAAWmD,aACnCC,iBACEpQ,EAAMG,OAAOoC,SAASyK,WAAWqD,cACnCC,eACEtQ,EAAMG,OAAOoC,SAASyK,WAAWsD,eACnCC,aACEvQ,EAAMG,OAAOoC,SAASyK,WAAWuD,aACnCC,iBACExQ,EAAMG,OAAOoC,SAASyK,WAAWyD,gBAIrCrP,SAASsP,MAAQ1Q,EAAMG,OAAOoC,SAASyJ,KAEvCnN,KAAK8R,yBAAyB3Q,EAAMG,OAAOoC,SAASyK,WAAWwC,WAC/D3Q,KAAK+R,iCACL/R,KAAKgS,2BACLhS,KAAKyL,eAAetK,EAAMG,OAAOoC,SAASyK,WAAWzC,SAErD,IAAIuG,EAAiB,IAAI/G,YAAY,oBAAqB,CACxD5J,OAAQ,CACNmF,YAAa,CACXyJ,IAAK7B,EACL8B,IAAK7B,GAEP3H,iBAAkB,CAChBuJ,IAAK3B,EACL4B,IAAK3B,MAKXpS,OAAO+O,cAAc8G,GAOvB,+BAA+B1T,GAC7B,MAAM2T,QAAe3P,SAAS4P,uBAC5B,kCAGF,IAAK,IAAIpT,EAAI,EAAGA,EAAImT,EAAO1S,OAAQT,IAAK,CAC1BmT,EAAOnT,GACb6M,MAAMwG,gBAAkB3E,EAAanP,qBAAqBC,IAIpEwT,iCACE,MAAMG,EAAS3P,SAAS4P,uBAAuB,8BAE/C,IAAK,IAAIpT,EAAI,EAAGA,EAAImT,EAAO1S,OAAQT,IAAK,CAC1BmT,EAAOnT,GACb6M,MAAMwG,gBAAkB3E,EAAanP,qBAAqB0B,KAAKoB,MAAMwP,qBAQ/E,4BAA4BzP,GAI1B,SAHMnB,KAAK6C,SAAS,CAClBoC,gBAAiB9D,EAAMG,OAAO+Q,WAEG,MAA/BrS,KAAKoB,MAAM6D,gBAAyB,CACtCjF,KAAKsS,mBACLtS,KAAKuS,qBACL,IAAIC,EAAc,IAAItH,YAAY,mBAClC9O,OAAO+O,cAAcqH,IAQzB,0BAA0BrR,GACxB,IAAIuJ,EAAevJ,EAAMG,OAAOoJ,aAE5B+H,EACFzS,KAAKoB,MAAMsC,SAAS0I,OAAOpM,KAAKoB,MAAM8D,cAAcsH,WAAWhN,OACjE,GAAIiT,GAAkB,EAEpB,YADAC,QAAQC,KAAK,SAADxU,OAAU6B,KAAKoB,MAAM8D,aAAY,wBAI/ClF,KAAK4S,yBAAyBH,EAAgB/H,SACxC1K,KAAK6C,SAAS,CAClBX,qBAAsBlC,KAAKoB,MAAMsH,cAAcgC,GAC/CrF,qBAAsB,EACtB5D,sBAAsB,EACtB2G,0BAA0B,EAC1ByK,eAAe,IAGjB,IAAIC,EAAI,IAAI5H,YAAY,mBAAoB,CAC1C5J,OAAQ,CACNyR,iBAAkB/S,KAAKoB,MAAMc,wBAIjC9F,OAAO+O,cAAc2H,GASvBF,yBAAyBH,EAAgB/H,GACvC,IAAK,IAAI3L,EAAI,EAAGA,EAAI0T,EAAgB1T,IAClC,GACEiB,KAAKoB,MAAMsC,SAAS0I,OAAOpM,KAAKoB,MAAM8D,cAAcsH,WAAWzN,GAC5DM,MAAQqL,EACX,CACA1K,KAAKoB,MAAMc,qBACTlC,KAAKoB,MAAMsC,SAAS0I,OAAOpM,KAAKoB,MAAM8D,cAAcsH,WAAWzN,GACjEiB,KAAKoB,MAAMmE,oBACTvF,KAAKoB,MAAMc,qBAAqB8Q,YAAYxT,OAC9C,OAQN,+BACEQ,KAAKiT,gCAELjT,KAAKoL,yBACCpL,KAAK6C,SAAS,CAClBpB,sBAAsB,EACtBS,0BAAsBD,IAO1BH,qBACM9B,KAAKoB,MAAM4F,WAAahH,KAAKoB,MAAM+F,SAAWnH,KAAKoB,MAAM8F,SAG7DlH,KAAK6C,SAAS,CACZmE,WAAahH,KAAKoB,MAAM4F,YAAchH,KAAKoB,MAAM+F,WAOrDpF,qBACM/B,KAAKoB,MAAM4F,WAAahH,KAAKoB,MAAM+F,SAAWnH,KAAKoB,MAAM6F,SAG7DjH,KAAK6C,SAAS,CACZmE,WAAahH,KAAKoB,MAAM4F,YAAchH,KAAKoB,MAAM+F,WAOrD,0BACQnH,KAAK6C,SAAS,CAAEjB,YAAY,IAClC5B,KAAKkT,oBAMPC,eACEnT,KAAK6C,SAAS,CAAEjB,YAAY,IAC5B5B,KAAKsS,mBAQPc,mBAAmBC,EAAIC,GACJ,IAAbA,EAIJtT,KAAK6C,SAAS,CAAE0Q,sBAAuBF,IAHrCrT,KAAK6C,SAAS,CAAE2Q,qBAAsBH,IAU1C,oBAAoB9L,SACZvH,KAAK6C,SAAS,CAAE0E,iBAMxBkM,mBACEzT,KAAK6C,SAAS,CAAE0E,cAAevH,KAAKoB,MAAMmG,eAS5CmM,iBAAiBC,GACf,MAAMxS,EAAQ,IAAI+J,YAAY,oBAET3I,SAASC,eAAe,wBAC9B2I,cAAchK,GAEzBnB,KAAKoB,MAAMkF,cAAc3H,SAASgV,GACpC3T,KAAKoB,MAAMkF,cAAciG,QAAQ,CAACqH,EAAK7E,KACjC6E,IAAQD,GACV3T,KAAKoB,MAAMkF,cAAcyE,OAAOgE,EAAO,KAI3C/O,KAAKoB,MAAMkF,cAAczG,KAAK8T,GAUlCE,cAAcC,GACZ,MAAM3S,EAAQ,IAAI+J,YAAY,oBAE1BlL,KAAKoB,MAAMmF,YAAY5H,SAASmV,GAClC9T,KAAKoB,MAAMmF,YAAYgG,QAAQ,CAACqH,EAAK7E,KAC/B6E,IAAQE,GACV9T,KAAKoB,MAAMmF,YAAYwE,OAAOgE,EAAO,KAIzC/O,KAAKoB,MAAMmF,YAAY1G,KAAKiU,GAETvR,SAASC,eAAe,wBAC9B2I,cAAchK,GAG/B,qBAAqB4S,SACb/T,KAAK6C,SAAS,CAAE2D,YAAauN,IAGrC,0BAA0BA,SAClB/T,KAAK6C,SAAS,CAAE6D,iBAAkBqN,IAM1C,gBACE,GAAI/T,KAAKoB,MAAMC,cAAgBrB,KAAKoB,MAAMQ,WAAY,OAGtD,MAAMqI,EAAa,EAAI1G,KAAK2G,GAAMlK,KAAKoB,MAAMkE,WAC7CtF,KAAK6C,SAAS,CACZuE,aAAepH,KAAKoB,MAAMgG,cAAgB6C,IAIX,IAA7BjK,KAAKoB,MAAMgE,oBACPpF,KAAK6C,SAAUzB,IACZ,CAAEgE,cAAehE,EAAMkE,WAAa,WAGvCtF,KAAK6C,SAAUzB,IACZ,CAAEgE,cAAehE,EAAMgE,cAAgB,KAQpD,iBACE,GAAIpF,KAAKoB,MAAMC,cAAgBrB,KAAKoB,MAAMQ,WAAY,OAEtD,MAAMqI,EAAa,EAAI1G,KAAK2G,GAAMlK,KAAKoB,MAAMkE,WAC7CtF,KAAK6C,SAAS,CACZuE,aAAepH,KAAKoB,MAAMgG,cAAgB6C,IAGxCjK,KAAKoB,MAAMgE,gBAAkBpF,KAAKoB,MAAMkE,WAAa,QACjDtF,KAAK6C,SAAUzB,IACZ,CAAEgE,cAAe,WAGpBpF,KAAK6C,SAAUzB,IACZ,CAAEgE,cAAehE,EAAMgE,cAAgB,KAQpD,cACMpF,KAAKoB,MAAMC,cAAgBrB,KAAKoB,MAAMQ,aAExC5B,KAAKoB,MAAMoE,aAAaxF,KAAKoB,MAAM8D,cAAgB,IACnDlF,KAAKoB,MAAM+D,iBAELnF,KAAK6C,SAAUzB,IACZ,CAAE+D,WAAY,WAGjBnF,KAAK6C,SAAUzB,IACZ,CAAE+D,WAAY/D,EAAM+D,WAAa,MAQ9C,gBACMnF,KAAKoB,MAAMC,cAAgBrB,KAAKoB,MAAMQ,aACZ,IAA1B5B,KAAKoB,MAAM+D,iBACPnF,KAAK6C,SAAUzB,IACZ,CACL+D,WAAY/D,EAAMoE,aAAapE,EAAM8D,cAAgB,WAInDlF,KAAK6C,SAAUzB,IACZ,CAAE+D,WAAY/D,EAAM+D,WAAa,MAS9C,yBAAyBlH,GACnB+B,KAAKoB,MAAMC,cAAgBrB,KAAKoB,MAAMQ,kBAEpC5B,KAAK6C,SAAS,CAClBqC,aAAcjH,EACdkH,WAAY,IAQhB6O,2BAA2BC,GACrBjU,KAAKoB,MAAMQ,YACf5B,KAAKoB,MAAMsC,SAAS0I,OAAOG,QAASnL,IAC9BA,EAAM+L,OAAS8G,GACjBjU,KAAK6C,SAAS,CACZqC,aAAc9D,EAAMiS,GACpBlO,WAAY,MASpB,yBAC0C,IAApCnF,KAAKoB,MAAMiE,2BACPrF,KAAK6C,SAAUzB,IACZ,CACLiE,qBAAsBjE,EAAMmE,oBAAsB,WAIhDvF,KAAK6C,SAAUzB,IACZ,CACLiE,qBAAsBjE,EAAMiE,qBAAuB,KAIzDrF,KAAKqL,gCAMP,0BAEIrL,KAAKoB,MAAMiE,uBACXrF,KAAKoB,MAAMmE,oBAAsB,QAE3BvF,KAAK6C,SAAUzB,IACZ,CAAEiE,qBAAsB,WAG3BrF,KAAK6C,SAAUzB,IACZ,CACLiE,qBAAsBjE,EAAMiE,qBAAuB,KAIzDrF,KAAKqL,gCAcP6I,sBACMlU,KAAKoB,MAAMO,kBACf3B,KAAK6C,SAAS,CAAElB,kBAAkB,IAMpCwS,sBACMnU,KAAKoB,MAAMO,kBACb3B,KAAK6C,SAAS,CAAElB,kBAAkB,IAOtCwI,uBACE,IAAIiK,EAAc7R,SAASC,eAAe,QAC1C4R,EAAY3R,iBAAiB,cAAgBtB,IAC3CnB,KAAKqU,YAAYlT,KAEnBiT,EAAY3R,iBAAiB,wBAA0BtB,IACrDnB,KAAKsU,sBAAsBnT,KAG7B/E,OAAOqG,iBAAiB,eAAiBtB,IACvCnB,KAAKyK,aAAatJ,EAAMG,OAAOjC,OAEjCjD,OAAOqG,iBAAiB,kBAAoBtB,IAC1CnB,KAAKuU,eAAepT,EAAMG,OAAOjC,OAGnCjD,OAAOqG,iBAAiB,UAAYqQ,IACpB,QAAVA,EAAEzT,MACJyT,EAAE0B,iBACFxU,KAAKyT,sBAITrX,OAAOqG,iBAAiB,2BAA6BtB,IACnDnB,KAAK6C,SAAS,CAAE4R,sBAAuBtT,EAAMG,OAAOoT,aAOxDnC,qBACE,GAAIvS,KAAKoB,MAAM4P,eAAgB,CAC7B,IAAI2D,EAAWpS,SAASC,eAAe,aAEvCmS,EAASlS,iBAAiB,YAActB,IACtCnB,KAAKkU,wBAGPS,EAASlS,iBAAiB,aAAetB,IACvCnB,KAAKmU,wBAIT,IAAIS,EAAiBrS,SAASC,eAAe,wBAE7CoS,EAAenS,iBAAiB,iBAAmBqQ,GACjD9S,KAAKkB,mBAAmB4R,IAG1B8B,EAAenS,iBAAiB,sBAAwBtB,IACtDnB,KAAK6U,oBAAoB1T,KAG3ByT,EAAenS,iBAAiB,0BAA4BtB,IAC1DnB,KAAK8U,+BAEL9U,KAAKqL,kCAOTiH,mBACE,IAAIsC,EAAiBrS,SAASC,eAAe,wBAE7CoS,EAAenS,iBAAiB,QAASzC,KAAKwB,cAC9CoT,EAAenS,iBAAiB,YAAazC,KAAKgC,kBAClD4S,EAAenS,iBAAiB,UAAWzC,KAAK2C,gBAChDiS,EAAenS,iBAAiB,WAAYzC,KAAK+C,iBAEjD6R,EAAenS,iBAAiB,aAAczC,KAAKmE,kBACnDyQ,EAAenS,iBAAiB,WAAYzC,KAAKiE,gBACjD2Q,EAAenS,iBAAiB,cAAezC,KAAKsE,oBAMtD4O,oBACE,IAAI0B,EAAiBrS,SAASC,eAAe,wBAE7CoS,EAAe9R,oBAAoB,QAAS9C,KAAKwB,cACjDoT,EAAe9R,oBAAoB,YAAa9C,KAAKgC,kBACrD4S,EAAe9R,oBAAoB,UAAW9C,KAAK2C,gBACnDiS,EAAe9R,oBAAoB,WAAY9C,KAAK+C,iBAEpD6R,EAAe9R,oBAAoB,aAAc9C,KAAKmE,kBACtDyQ,EAAe9R,oBAAoB,WAAY9C,KAAKiE,gBACpD2Q,EAAe9R,oBAAoB,cAAe9C,KAAKsE,oBAMzDwQ,+BACE,IAAIF,EAAiBrS,SAASC,eAAe,wBAE7CoS,EAAenS,iBACb,YACAzC,KAAKuE,2BAEPqQ,EAAenS,iBAAiB,UAAWzC,KAAKyE,yBAChDmQ,EAAenS,iBAAiB,WAAYzC,KAAK0E,0BAEjDkQ,EAAenS,iBACb,aACAzC,KAAK6E,2BAEP+P,EAAenS,iBAAiB,WAAYzC,KAAK+E,yBACjD6P,EAAenS,iBACb,cACAzC,KAAKgF,0BAOTiO,gCACE,IAAI2B,EAAiBrS,SAASC,eAAe,wBAE7CoS,EAAe9R,oBACb,YACA9C,KAAKuE,2BAEPqQ,EAAe9R,oBAAoB,UAAW9C,KAAKyE,yBACnDmQ,EAAe9R,oBACb,WACA9C,KAAK0E,0BAGPkQ,EAAe9R,oBACb,aACA9C,KAAK6E,2BAEP+P,EAAe9R,oBACb,WACA9C,KAAK+E,yBAEP6P,EAAe9R,oBACb,cACA9C,KAAKgF,0BA6VT+P,oBAAoBjO,EAA0BC,GACX,IAA7BD,GACF9G,KAAK6C,SAAS,CACZiE,yBAA0BiH,WAAWjH,KAGpB,IAAjBC,GACF/G,KAAK6C,SAAS,CAAEkE,aAAcgH,WAAWhH,KAGtBxE,SAASC,eAAe,wBAC9B2I,cAAc,IAAID,YAAY,qBAM/C8J,uBACE,MAAMC,EACJjV,KAAKoB,MAAMsC,SAAS0I,OAAOpM,KAAKoB,MAAM8D,cAAckI,eAEtDpN,KAAKoB,MAAMsC,SAAS0I,OAAOG,QAAQ,CAACnL,EAAO2N,KACrC3N,EAAMgM,iBAAmB6H,EAAwB,GACnDjV,KAAKkV,mBAAmBnG,KAM9BoG,uBACE,MAAMF,EACJjV,KAAKoB,MAAMsC,SAAS0I,OAAOpM,KAAKoB,MAAM8D,cAAckI,eAEtDpN,KAAKoB,MAAMsC,SAAS0I,OAAOG,QAAQ,CAACnL,EAAO2N,KACrC3N,EAAMgM,iBAAmB6H,EAAwB,GACnDjV,KAAKkV,mBAAmBnG,KAS9BqG,kBAAkBC,EAAaC,GAC7B,GAAoB,cAAhBD,EAEJ,OAAQA,GACN,IAAK,UACH,GAAIC,EAEF,YADAtV,KAAKuV,cAGPvV,KAAKmT,eACL,MACF,IAAK,wBACH,GAAImC,EAAmB,CACrBtV,KAAKkT,oBACL,IAAI/R,EAAQ,IAAI+J,YAAY,qBAC5B9O,OAAO+O,cAAchK,GAGvBnB,KAAK6C,SAAS,CAAE2E,eAAgB8N,IAC5BA,GAAmBtV,KAAK6C,SAAS,CAAEpB,sBAAsB,IAC7D,MACF,IAAK,iBACHzB,KAAK6C,SAAS,CAAEiF,kBAAmBwN,IAEnC,MACF,IAAK,mBACHtV,KAAK6C,SAAS,CAAEkF,oBAAqBuN,IAErC,MACF,IAAK,mBACHtV,KAAK6C,SAAS,CAAEoF,wBAAyBqN,IAEzC,MACF,IAAK,mBACHtV,KAAK6C,SAAS,CAAE4E,gBAAiB6N,IAEjC,MACF,IAAK,qBACHtV,KAAK6C,SAAS,CAAE6E,kBAAmB4N,IAEnC,MACF,IAAK,uBACHtV,KAAK6C,SAAS,CAAE8E,kBAAmB2N,IAEnC,MACF,IAAK,wBACHtV,KAAK6C,SAAS,CAAE+E,mBAAoB0N,IAEpC,MACF,IAAK,gBACHtV,KAAK6C,SAAS,CAAEgF,cAAeyN,IAE/B,MACF,IAAK,4BACHtV,KAAK6C,SAAS,CAAEqF,iCAAkCoN,IAClD,MACF,IAAK,sBACHtV,KAAK6C,SAAS,CAAEwF,oBAAqBiN,IACrC,MACF,IAAK,wBACHtV,KAAK6C,SAAS,CAAEyF,sBAAuBgN,IACvC,MACF,IAAK,6BAML,IAAK,+BACHtV,KAAK6C,SAAS,CACZ2S,gCAAgC,EAChCC,gCAAgC,IAElC,MACF,IAAK,gBACHzV,KAAK6C,SAAS,CAAEsF,gBAAiBmN,IACjC,MACF,IAAK,kBACH,GAAItV,KAAKoB,MAAMc,qBAAqB8Q,YAAYxT,QAAU,EAAG,OACzD8V,IACFtV,KAAK8U,+BAEL9U,KAAKqL,iCAEPrL,KAAK6C,SAAS,CAAEuF,yBAA0BkN,IAC1C,MACF,IAAK,eACHtV,KAAK6C,SAAS,CAAE2F,0BAA2B8M,IAC7C,MACA,QACE5C,QAAQgD,MAAM,sB,oBCnjDP,UAnBf,MACEC,iBACE,MAAMC,EAAc,mDAAmDC,KACrEC,UAAUC,WAGNC,EACJ,sGAAsGH,KACpGC,UAAUC,WAGd,QAAIH,KAEAI,ICTR,MAAMC,EAAWC,EAAaP,iBA+Yf,UA9Yf,MAEE5U,cACEf,KAAKmW,OAAS,KACdnW,KAAKoW,gBAAkB,KACvBpW,KAAKqW,0BAA4B,KACjCrW,KAAKoW,gBAAkB,KACvBpW,KAAKsW,aAAe,KACpBtW,KAAKuW,OAAS,KAOhBC,mBACE,IAAIC,EAAS,IAAIC,IACf,IAEA,SACA,GACA,KAiBF,OAfAD,EAAOE,eAAe,IAOtBF,EAAO/B,SAASkC,KACd,IAAIC,KAAQ,KAAM,KAAM,IAK1BJ,EAAOK,OAAO,IAAID,KAAQ,EAAG,EAAG,IAChCJ,EAAOM,yBACAN,EAOTO,mBAAmBC,GACjB,IAAIC,EAAW,IAAIR,KAAoB,CACrCS,WAAW,EACXC,OAAQ7U,SAASC,eAAeyU,GAChCI,OAAO,IAqCT,OAlCAH,EAASI,cAAc/T,KAAK2M,IAAI,EAAG9T,OAAOmb,mBAAqB,GAC/DL,EAASM,yBAA0B,EACnCN,EAASO,UAAUC,SAAU,EAC7BR,EAASS,gBAAiB,EAE1BT,EAASU,WAAY,EACrBV,EAASW,gBAAiB,EAC1BX,EAASY,kBAAmB,EAC5BZ,EAAS/Z,MAAM4a,mBAAoB,EACnCb,EAASc,gBAAkB,EAC3Bd,EAASe,gBAAkB,EAC3Bf,EAASgB,aAAe,IACnBhB,EAASgB,aACZC,uBAAuB,EACvBC,qBAAqB,EACrBC,UAAU,EACVC,wBAAwB,EACxBC,cAAe,EACfC,eAAgB,EAChBC,oBAAqB,EACrBC,eAAgB,EAChBC,YAAa,EACbC,YAAa,EACbC,kBAAmB,EACnBC,kBAAmB,EACnBC,UAAW,KACXC,gBAAgB,GAIlB/C,EAAWiB,EAAS+B,QAAQ7c,OAAO8c,WAAY9c,OAAO+c,aAAejC,EAAS+B,QAA4B,GAApB7c,OAAO8c,WAAuC,GAApB9c,OAAO8c,WAAoB,OAE3IhC,EAASkC,cAAc,IAAIC,IAAM,UAE1BnC,EAUToC,qBAAqBC,GACnB,IAAKA,EAAU,OAAO,IAAIC,IAE1B,MAAMC,GAAiB,IAAI/C,MAAsBgD,KAAKH,GACtDE,EAAeE,UAAYjD,IAC3B,MAAMkD,EAAkB,IAAIlD,IAAwB,CAClDmD,IAAKJ,IAGDlD,EAAS,IAAIG,IACjB,IAAIA,IAAqB,IAAM,GAAI,IACnCkD,GAKF,OAHArD,EAAOuD,SAASC,KAAOrD,IAEvB1W,KAAKuW,OAASA,EACPA,EAMTyD,mBACE,GAAIha,KAAKmW,OAAQ,OAAOnW,KAAKmW,OAE7B,IAAIA,EAAS,IAAIO,IAAa,IAAIA,KAElC,OAAQ1W,KAAKmW,OAASA,EAMxB8D,4BACE,GAAIja,KAAKoW,gBAAiB,OAAOpW,KAAKoW,gBAEtC,IAAIA,EAAkB,IAAIM,IAAa,IAAIA,KAC3C,OAAQ1W,KAAKoW,gBAAkBA,EAQjC8D,uBAAuBC,GAErBA,EAAQR,UAAYjD,IAEpB,MAAMP,EAASnW,KAAKia,4BACdG,EAAsBD,EAAQE,MAAMC,MAAQH,EAAQE,MAAME,OAEhEpE,EAAOqE,MAAMC,IAAI,EAAIL,EAAqB,IAAK,GAC/CjE,EAAO2D,SAASD,IAAMM,EACtBhE,EAAO2D,SAASY,aAAc,EAOhCC,cAAcR,GACZ,MAAMhE,EAASnW,KAAKga,mBACdI,EAAsBD,EAAQE,MAAMC,MAAQH,EAAQE,MAAME,OAGhEpE,EAAOqE,MAAMC,IAAI,MAAQL,EADN,EACwC,MADxC,EAC4D,GAE/EjE,EAAO2D,SAASD,IAAMM,EACtBhE,EAAO2D,SAASY,aAAc,EAUhCE,qBAAqBnE,EAAQoE,EAAqBzV,EAAe0V,GAC/D,IAAKD,EAOH,OANApE,EAAO/B,SAASkC,KACd,IAAIC,KAAQ,GAAI,GAAI,IAKfJ,EAAO/B,SAGhB,MAAMA,EAAW1U,KAAK+a,4BAA4BF,EAAqBzV,EAAe0V,GAEtF,OADArE,EAAO/B,SAASkC,KAAKlC,GACdA,EAWTsG,qBAAqBvE,EAAQwE,EAA2B7V,EAAeqP,EAAuBqG,GAC5F,QAAkC7Y,IAA9BgZ,EACF,YAA8BhZ,IAA1BwS,GACFgC,EAAOK,OAAO,IAAID,KAAQ,EAAG,EAAG,IACzB,IAAIA,KAAQ,EAAG,EAAG,KAE3BJ,EAAOK,OAAOrC,EAAsByG,QAAQC,eAAeL,IACpDrG,EAAsByG,QAAQC,eAAeL,IAEtD,MAAMpG,EAAW1U,KAAK+a,4BAA4BE,EAA2B7V,EAAe0V,GAE5F,OADArE,EAAOK,OAAOpC,GACPA,EAaT0G,qBAAqBjF,EAAQ8E,EAA2B7V,EAAeiW,EAAiBC,EAAaR,EAAuBS,GAC1H,QAAkCtZ,IAA9BgZ,EAGF,OAFAjb,KAAKwb,6BAA6BrF,EAAQkF,EAAiBC,QAC3DnF,EAAOzB,SAASkC,KAAK2E,GAGvBvb,KAAKwb,6BAA6BrF,EAAQkF,EAAiBC,GAC3D,MAAM5G,EAAW1U,KAAK+a,4BAA4BE,EAA2B7V,EAAe0V,GAC5F3E,EAAOzB,SAASkC,KAAKlC,GASvB8G,6BAA6BrF,EAAQkF,EAAiBC,GAGpD,IAAIG,EAAa,EACjBA,EAAa,IAHCJ,EAAkBC,GACMD,EAGtClF,EAAOqE,MAAMC,IAAI,mBAA6BgB,EAAa,EAAG,MAAQA,EAAa,EAAG,GASxFV,4BAA4BW,EAAetW,EAAe0V,GACxD,MAAMa,EAAYD,EAAcE,OAAuB,EAAhBxW,GACjCyW,EAAYH,EAAcE,OAAwB,EAAhBxW,EAAqB,GACvD0W,EAAYJ,EAAcE,OAAwB,EAAhBxW,EAAqB,GAC7D,OAAO,IAAIyR,KAAQ8E,EAAYb,EAAuBe,EAAYf,EAAuBgB,EAAYhB,GAGvGiB,8BAA8BC,EAAQC,GACpC,OAAO,IAAIC,QAAQ,CAACC,EAASC,KAC3BJ,EAAOtC,KACLuC,EACCI,IACC,IAAIC,OAAkBra,EAClBsa,OAAkBta,EAEtBoa,EAAOG,WAAWjQ,QAAQkQ,IAExBA,EAAUvK,OAAO3F,QAAQmQ,IACnBA,EAAMvP,KAAKwP,cAAche,SAAS,WAAa+d,EAAMvP,KAAKxO,SAAS,YACrE4d,EAAkBG,EAGhBA,EAAMvP,KAAKxO,SAAS,cACtB2d,EAAkBI,OAOxBL,EAAOO,SAASC,IACd,GAAIA,EAAM1P,KAAKwP,cAAche,SAAS,UAAW,CAC/C,MAAMwC,EAAQ,IAAI+J,YAAY,2BAA4B,CACxD5J,OAAQ,CACNoT,SAAUmI,EAAMnI,YAGpBtY,OAAO+O,cAAchK,MAGzBgb,EAAQ,CAACG,EAAiBC,KAE3BO,GAAS,KACTpH,GAAU0G,EAAO1G,MAiBxBqH,aAAaC,EAAW1G,EAAcG,EAAQwG,EAAcC,EAAOlc,GACjE,MAAMmc,EAAoB,GACpBC,EAAW,GAWjB,OATAH,EAAa1Q,QAAQ8Q,IACnBD,EAASvd,KACP,IAAIqc,QACFC,IACEA,EAAQnc,KAAKsd,YAAYD,EAAQE,WAAYP,EAAWvG,EAAQzV,SAKjEkb,QAAQsB,IAAIJ,GAChBK,KAAKC,IACJT,EAAa1Q,QAAQ,CAAC8Q,EAAStO,KAC7BoO,EAAkBpO,GAAS2O,EAAe3O,KAGrCoO,IAERQ,MAAMjL,QAAQgD,OAUnB4H,YAAYC,EAAYP,EAAWvG,EAAQzV,GACzC,OAAO,IAAIkb,QAAQ,CAACC,EAASC,KAC3B,GAAmB,KAAfmB,EAAmB,CACrB,MAAMK,EAAc,IAAIlH,IACxByF,EAAQyB,GAEVZ,EAAUtD,KACR6D,EAECM,IACCA,EAASC,SAAU,EACnBD,EAASjB,UAAS,SAAUmB,GACtBA,EAAKC,SAGPD,EAAKjE,SAAW,IAAIpD,IAAwB,CAC1CuH,aAAa,EACbC,QAAS,IAGPH,EAAK5Q,KAAKwP,cAAche,SAAS,aACjCof,EAAKjE,SAAW,IAAIpD,IACpBqH,EAAKD,SAAU,GAGfC,EAAK5Q,KAAKxO,SAAS,UACrBof,EAAKI,YAAc,EACnBJ,EAAKjE,SAASsE,YAAa,IAIb,oBAAdL,EAAK5Q,OAEPsJ,EAAO/B,SAASkC,KACdmH,EAAKrJ,SAASyG,eAAe,MAE/B1E,EAAOM,6BAKXoF,EAAQ0B,IAETf,GAAS,KACTpH,GAAU,UC3XJ,UAff,MAOE2I,eAAenH,EAAUT,GACvBS,EAAS+B,QAA4B,GAApB7c,OAAO8c,WAAuC,GAApB9c,OAAO8c,WAAoB,OAEtEzC,EAAO6H,OAAS,WAChB7H,EAAOM,2BCmVI,UA5Vf,MACEhW,cACEf,KAAKue,MAAQ,KASfC,eAAezgB,EAAMuc,EAAOC,GAE1B,MAAMkE,EAAYlc,SAASsJ,cAAc9N,GACnC2gB,EAAUnc,SAASsJ,cAAc9N,GACjC4gB,EAAUpc,SAASsJ,cAAc9N,GACjC6gB,EAAarc,SAASsJ,cAAc9N,GAwB1C,OAtBA4gB,EAAQE,UAAY,mCACpBF,EAAQtL,GAAK,qBAEbuL,EAAWC,UAAY,2BAEvBJ,EAAUI,UAAY,2BACtBJ,EAAU7S,MAAM0O,MAAQA,EAAQ,KAChCmE,EAAU7S,MAAM2O,OAASA,EAAS,KAElCkE,EAAUhc,iBAAiB,aAAczC,KAAK8e,aAC9CL,EAAUhc,iBAAiB,aAAczC,KAAK+e,YAE9CL,EAAQG,UAAY,2BACpBH,EAAQ9S,MAAM3C,QAAU,OAGxBwV,EAAUzS,YAAY2S,GACtBF,EAAUzS,YAAY4S,GACtBF,EAAQ1S,YAAYyS,GAIbC,EASTM,WAAWjhB,EAAMuc,EAAOC,GACtB,MAAMmE,EAAUnc,SAASsJ,cAAc9N,GAcvC,OAbA2gB,EAAQrL,GAAK,mBAEbqL,EAAQG,UAAY,iCACpBH,EAAQ9S,MAAMqT,gBACZ,+CACFP,EAAQ9S,MAAMsT,eAAiB,UAC/BR,EAAQ9S,MAAMuT,OAAS,OACvBT,EAAQ9S,MAAMwG,gBAAkB,gBAChCsM,EAAQ9S,MAAM0O,MAAQA,EAAQ,KAC9BoE,EAAQ9S,MAAM2O,OAASA,EAAS,KAChCmE,EAAQ9S,MAAMwT,OAAS,UACvBV,EAAQ9S,MAAMsT,eAAiB,QAExBR,EAMTW,oBACE,MAAMX,EAAUnc,SAASsJ,cAAc,MAAO,IAAK,IACnD6S,EAAQG,UAAY,+BACpBH,EAAQ9S,MAAM0O,MAAQ,QACtBoE,EAAQ9S,MAAM2O,OAAS,OACvBmE,EAAQ9S,MAAM0T,aAAe,kBAE7B,MAAMC,EAAehd,SAASsJ,cAAc,IAAK,GAAI,IACrD0T,EAAaV,UAAY,2BACzBU,EAAaC,UAAY1iB,IAAK2iB,EAAE,aAChCF,EAAa3T,MAAM0O,MAAQ,OAC3BiF,EAAa3T,MAAM2O,OAAS,OAC5BgF,EAAa3T,MAAMrN,MAAQ,QAC3BghB,EAAa3T,MAAM8T,SAAW,OAE9B,MAAMC,EAAsBpd,SAASsJ,cAAc,IAAK,GAAI,IAC5D8T,EAAoBd,UAAY,wBAChCc,EAAoBH,UAAY1iB,IAAK2iB,EAAE,aAAaG,cACpDD,EAAoB/T,MAAM0O,MAAQ,OAClCqF,EAAoB/T,MAAM2O,OAAS,OACnCoF,EAAoB/T,MAAMrN,MAAQ,QAClCohB,EAAoB/T,MAAM8T,SAAW,MAErC,MAAMG,EAAkBtd,SAASsJ,cAAc,IAAK,GAAI,IAcxD,OAbAgU,EAAgBhB,UAAY,6BAC5BgB,EAAgBL,UAAY,QAC5BK,EAAgBxM,GAAK,eACrBwM,EAAgBjU,MAAM0O,MAAQ,QAC9BuF,EAAgBjU,MAAM2O,OAAS,OAC/BsF,EAAgBjU,MAAMrN,MAAQ,QAC9BshB,EAAgBjU,MAAM8T,SAAW,OACjCG,EAAgBjU,MAAMkU,WAAa,IAEnCpB,EAAQ1S,YAAYuT,GACpBb,EAAQ1S,YAAY2T,GACpBjB,EAAQ1S,YAAY6T,GAEbnB,EAMTqB,oBACE,MAAMrB,EAAUnc,SAASsJ,cAAc,MAAO,IAAK,IACnD6S,EAAQG,UAAY,+BACpBH,EAAQ9S,MAAM0O,MAAQ,QACtBoE,EAAQ9S,MAAM2O,OAAS,OAEvB,MAAMyF,EAAoBzd,SAASsJ,cAAc,IAAK,IAAK,IAC3DmU,EAAkBnB,UAAY,gCAC9BmB,EAAkBR,UAAY,YAC9BQ,EAAkB3M,GAAK,aACvB2M,EAAkBpU,MAAM0O,MAAQ,QAChC0F,EAAkBpU,MAAM2O,OAAS,OACjCyF,EAAkBpU,MAAMrN,MAAQ,QAChCyhB,EAAkBpU,MAAM8T,SAAW,OACnCM,EAAkBpU,MAAMkU,WAAa,OAErC,MAAMG,EAAc1d,SAASsJ,cAAc,IAAK,IAAK,IACrDoU,EAAYpB,UAAY,0BACxBoB,EAAYT,UAAY,KACxBS,EAAY5M,GAAK,iBACjB4M,EAAYrU,MAAM0O,MAAQ,QAC1B2F,EAAYrU,MAAM2O,OAAS,OAC3B0F,EAAYrU,MAAMrN,MAAQ,QAC1B0hB,EAAYrU,MAAM8T,SAAW,OAC7BO,EAAYrU,MAAMkU,WAAa,IAG/B,MAAMI,EAAe3d,SAASsJ,cAAc,IAAK,IAAK,IACtDqU,EAAarB,UAAY,0BACzBqB,EAAa7M,GAAK,kBAClB6M,EAAatU,MAAM0O,MAAQ,QAC3B4F,EAAatU,MAAM2O,OAAS,OAC5B2F,EAAatU,MAAMuU,KAAO,QAC1BD,EAAatU,MAAMwU,IAAM,MACzBF,EAAatU,MAAMrN,MAAQ,QAC3B2hB,EAAatU,MAAM8T,SAAW,OAC9BQ,EAAatU,MAAMkU,WAAa,IAEhC,MAAMO,EAAkB9d,SAASsJ,cAAc,IAAK,IAAK,IAgBzD,OAfAwU,EAAgBxB,UAAY,+BAC5BwB,EAAgBC,UAAY,wBAC5BD,EAAgBhN,GAAK,sBACrBgN,EAAgBzU,MAAM0O,MAAQ,QAC9B+F,EAAgBzU,MAAM2O,OAAS,OAC/B8F,EAAgBzU,MAAMrN,MAAQ,QAC9B8hB,EAAgBzU,MAAM8T,SAAW,OACjCW,EAAgBzU,MAAM2U,WAAa,OAEnC7B,EAAQ1S,YAAYgU,GACpBtB,EAAQ1S,YAAYiU,GACpBvB,EAAQ1S,YAAYqU,GACpB3B,EAAQ1S,YAAYkU,GAGbxB,EAQT8B,kBAAkBlG,EAAOC,GACvB,MAAMmE,EAAUnc,SAASsJ,cAAc,UAevC,OAdA6S,EAAQrL,GAAK,iBAEbqL,EAAQG,UAAY,+BACpBH,EAAQc,UAAa1iB,IAAK2iB,EAAE,gBAAgBG,cAC5ClB,EAAQ9S,MAAMuT,OAAS,OACvBT,EAAQ9S,MAAMrN,MAAQ,OACtBmgB,EAAQ9S,MAAMwG,gBAAkB,QAChCsM,EAAQ9S,MAAM0O,MAAQA,EAAQ,KAC9BoE,EAAQ9S,MAAM2O,OAASA,EAAS,KAChCmE,EAAQ9S,MAAMwT,OAAS,UACvBV,EAAQ9S,MAAM8T,SAAW,MACzBhB,EAAQ9S,MAAM6U,aAAe,OAC7B/B,EAAQ9S,MAAMkU,WAAa,IAEpBpB,EAQTgC,wBAAwBpG,EAAOC,GAC7B,MAAMmE,EAAUnc,SAASsJ,cAAc,UAUvC,OATA6S,EAAQrL,GAAK,wBAEbqL,EAAQG,UAAY,sCACpBH,EAAQ9S,MAAMuT,OAAS,OACvBT,EAAQ9S,MAAMwG,gBAAkB,gBAChCsM,EAAQ9S,MAAM0O,MAAQA,EAAQ,KAC9BoE,EAAQ9S,MAAM2O,OAASA,EAAS,KAChCmE,EAAQ9S,MAAMwT,OAAS,UAEhBV,EAMTiC,YACO3gB,KAAKue,QACVve,KAAKue,MAAM3S,MAAM3C,QAAU,QAG7B2X,aAAaC,GACN7gB,KAAKue,QAERve,KAAKue,MAAM3S,MAAM3C,QADf4X,EACyB,QAGF,QAM7BC,YACE9gB,KAAKue,MAAM3S,MAAM3C,QAAU,QAM7B6V,cACE,MAAM3d,EAAQ,IAAI+J,YAAY,kBACT3I,SAASC,eAAe,wBAC9B2I,cAAchK,GAM/B4d,aACE,MAAM5d,EAAQ,IAAI+J,YAAY,iBACT3I,SAASC,eAAe,wBAC9B2I,cAAchK,GAQ/B4f,qBAAqBC,EAAavU,GAGhC,IAAKuU,EAAYvb,cAAcgH,EAAU1O,MAAO,OAGhD,OADc0O,EAAUwU,gBAAkBxU,EAAUwU,gBAAkBD,EAAYvb,cAAcgH,EAAU1O,MAAM6P,WAWlHsT,kBAAkB7hB,EAAK6F,EAAc0D,EAAqBoY,GACxD,MAAMG,EAAc5e,SAASC,eAAe,gBACtC4e,EAAoB7e,SAASC,eAAe,sBAE5CoM,EAAarM,SAASC,eAAe,cACrC6e,EAAgB9e,SAASC,eAAe,kBACxC8e,EAAiB/e,SAASC,eAAe,mBACzC+e,EAAoBhf,SAASC,eAAe,uBAC5Cgf,EAAkBjf,SAASC,eAAe,oBAEhD,GAAwB,OAApBgf,EAA0B,OAEhBR,EAAY5U,OAAOlH,GAG3BsH,WAAWD,QAAQkV,UAEvB,GAAIhV,EAAUpN,MAAQA,EAAK,CASzB,GARA+hB,EAAkBxV,MAAMwG,sBAAwBpS,KAAK+gB,qBAAqBC,EAAavU,GACvF0U,EAAY3B,UAAY/S,EAAUU,KAClCyB,EAAW4Q,UAAS,GAAArhB,OAAMsO,EAAUmC,WAAU,UAC9CyS,EAAc7B,UAAY/S,EAAU1O,KACpCwjB,EAAkBjB,UAAS,GAAAniB,OAAMrB,IAAK2iB,EAAE,aAAaiC,oBAAmB,UAAAvjB,OAASsO,EAAU1O,KAAK,GAAE,KAAAI,OAA0B,MAAtBsO,EAAU1O,KAAK,GAAajB,IAAK2iB,EAAE,SAAS9C,cAAgB7f,IAAK2iB,EAAE,UAAU9C,eAI/KlQ,EAAUkV,mBAEZ,YADAL,EAAe9B,UAAY/S,EAAUkC,MAAQlC,EAAUmV,gBAGzDN,EAAe9B,UAAY,MAI3B5W,EAAoBjK,SAASU,GAC/BmiB,EAAgB5V,MAAMqT,gBAAkB,gDAExCuC,EAAgB5V,MAAMqT,gBAAkB,+CAI5C4C,UAAUC,GACR9hB,KAAKue,MAAM3S,MAAMwU,IAAG,GAAAjiB,OAAM2jB,EAAcjG,UAAY,IAAG,MACvD7b,KAAKue,MAAM3S,MAAMuU,KAAI,GAAAhiB,OAAM2jB,EAAcnG,UAAY,IAAG,MAO1DoG,cACE,MAAMnN,EAAiBrS,SAASC,eAAe,wBAE/C,IAAIoc,EAAa5e,KAAKwe,eAAe,MAAO,IAAK,KAEjD,MAAMwD,EAAgBhiB,KAAKqf,oBACrB4C,EAAgBjiB,KAAK+f,oBACrB/S,EAAShN,KAAKgf,WAAW,SAAU,GAAI,IACvCkD,EAAgBliB,KAAKwgB,kBAAkB,IAAK,IAC5C2B,EAAsBniB,KAAK0gB,wBAAwB,IAAK,IAS9D,OARA9B,EAAWwD,SAAS,GAAGpW,YAAYgB,GACnC4R,EAAWwD,SAAS,GAAGpW,YAAYkW,GACnCtD,EAAWwD,SAAS,GAAGpW,YAAYmW,GACnCvD,EAAWwD,SAAS,GAAGpW,YAAYgW,GACnCpD,EAAWwD,SAAS,GAAGpW,YAAYiW,GACnCrN,EAAe5I,YAAY4S,GAE3B5e,KAAKue,MAAQK,EACN5e,KAAKue,QC1VD,EACD,CACV8D,QAAS,gDCEb,MAAMC,EAAQC,EAAQ,KA6IP,UA3If,MAGEC,cAAcC,EAAapjB,GACzB,IAAK,IAAIN,EAAI,EAAGA,EAAI0jB,EAAYjjB,OAAQT,IACtC,GAAIM,IAAQojB,EAAY1jB,GAAI,OAAO,EAErC,OAAO,EAGT2jB,eAAeC,EAAYC,GACzB,IAAK,IAAI7jB,EAAI,EAAGA,EAAI6jB,EAAMpjB,OAAQT,IAAK,CACrC,MAAMse,EAAUuF,EAAM7jB,GACtB,GAAIse,EAAQhe,MAAQsjB,GAActF,EAAQ3O,OAAQ,OAAO2O,EAAQwF,OAEnE,MAAO,GAQTC,yBAAyBhG,GACvB,IAAIiG,EAAmB,GACnBC,EAAkB,GACtB,IAAK,IAAIjkB,EAAI,EAAGA,EAAI+d,EAAKtX,aAAahG,OAAQT,IAAK,CACjD,IAAIkkB,EAAOnG,EAAKtX,aAAazG,GAC7B,IAAK,IAAI0P,EAAI,EAAGA,EAAIwU,EAAMxU,IAAK,CAE7B,IAAIpP,EAAMoO,EAAa3P,aAAa,IAAK,OAAQiB,EAAG0P,GAChDyU,EAAY,GAEhB,IAAK,IAAIC,EAAI,EAAGA,EAAIrG,EAAK1Q,OAAOrN,GAAGkkB,KAAKxU,GAAGuE,YAAYxT,OAAQ2jB,IAAK,CAClE,IAAIC,EAAiB,GACjBC,EAAOvG,EAAK1Q,OAAOrN,GAAGkkB,KAAKxU,GAAGuE,YAAYmQ,GAC9CC,EAAe,GAAKD,EACpBC,EAAe,GAAKC,EACpBH,EAAUrjB,KAAKujB,GAGjBL,EAAiBljB,KAAKqjB,GACtBF,EAAgBnjB,KAAKR,IAIzB,MAAO,CAAC0jB,EAAkBC,GAQ5BM,0BAA0BlX,GACxB,IAAI2W,EAAmB,GACnBC,EAAkB,GAEtB,IAAK,IAAIjkB,EAAI,EAAGA,EAAIqN,EAAO5M,OAAQT,IAAK,CACtC,IAAIyN,EAAaJ,EAAOrN,GAAGyN,WAC3B,GAAIA,EAAWhN,OAAS,EACtB,IAAK,IAAIiP,EAAI,EAAGA,EAAIjC,EAAWhN,OAAQiP,IACrC,GAAIjC,EAAWiC,GAAGuE,YAAYxT,OAAS,EAAG,CACxC,IAAI+jB,EAAiB,UAAAplB,OAAaY,EAAC,KAAAZ,OAAIqO,EAAWiC,GAAGpP,KACjD6jB,EAAY,GAEhB,IAAK,IAAIC,EAAI,EAAGA,EAAI3W,EAAWiC,GAAGuE,YAAYxT,OAAQ2jB,IAAK,CACzD,IAAIC,EAAiB,GACjBC,EAAO7W,EAAWiC,GAAGuE,YAAYmQ,GACrCC,EAAe,GAAKD,EACpBC,EAAe,GAAKC,EACpBH,EAAUrjB,KAAKujB,GAEjBJ,EAAgBnjB,KAAK0jB,GACrBR,EAAiBljB,KAAKqjB,IAM9B,MAAO,CAACH,EAAkBC,GAO5B,gCACE,MACMQ,EADa,IAAIC,IAAIrnB,OAAOC,UACLqnB,aAAaC,IAAI,aAI9C,IAAI7G,SAFmBwF,EAAMqB,IAAI,GAADxlB,OAAIylB,EAAqBvB,SAAOlkB,OAAGqlB,KAE/C1G,KAEpBhgB,EAAK+mB,eAAe/G,EAAKgH,UAEzB,IAAI1M,EAAS7U,SAASC,eAAe,QACjCrB,EAAQ,IAAI+J,YAAY,cAAe,CACzC5J,OAAQ,CACNoC,SAAUoZ,KAGd1F,EAAOjM,cAAchK,GAErB,IAAI4hB,EAAmB,GACnBC,EAAkB,GAElBe,EAAgB/jB,KAAK8iB,yBAAyBhG,GAElDiG,EAAmBgB,EAAc,GACjCf,EAAkBe,EAAc,GAEhCA,EAAgB/jB,KAAKsjB,0BAA0BxG,EAAK1Q,QAEpD2W,EAAmBA,EAAiB5kB,OAAO4lB,EAAc,IACzDf,EAAkBA,EAAgB7kB,OAAO4lB,EAAc,IAIvD,IAAIC,EAAelH,EAAK5X,aACxB,IAAK,IAAInG,EAAI,EAAGA,EAAI+d,EAAKtX,aAAawe,GAAejlB,IAAK,CACxD,IAAIM,EAAMoO,EAAa3P,aAAa,IAAK,OAAQkmB,EAAcjlB,GAG3D+L,EAAUkY,EAAgBlY,QAAQzL,GAClCujB,EAAQG,EAAiBjY,GAE7BkY,EAAgBjY,OAAOD,EAAS,GAChCiY,EAAiBhY,OAAOD,EAAS,GAEjCiY,EAAiBkB,QAAQrB,GACzBI,EAAgBiB,QAAQ5kB,GAE1B,MAAO,CAAC0jB,EAAkBC,KC6Cf,UAtLf,MAeIkB,0BAA0B5N,EAAc6N,EAAmB1e,EAAeY,EAAyBE,EAAarB,EAAckf,EAAcC,EAAqBC,EAAyBC,GACtLjO,EAAa8L,SAAS7V,QAAQ,CAACsQ,EAAO9N,KAC9B7J,IAAiB6J,GACjB8N,EAAMiB,SAAU,EAChB9d,KAAKwkB,6BAA6B3H,EAAMuF,SAAU+B,EAAmB1e,EAAeY,EAAyBE,EAAa6d,EAAcC,EAAqBC,EAAyBvV,EAAOwV,IAE7L1H,EAAMiB,SAAU,IAW5B2G,sBAAsBle,EAAame,GAC/B,GAA2B,IAAvBne,EAAY/G,QAAyC,IAAzBklB,EAAcllB,OAAc,OAAO,EAEnE,IAAImlB,EAAkBpe,EAAY/G,OAClC,IAAK,IAAIT,EAAI,EAAGA,EAAI2lB,EAAcllB,OAAQT,IAClCwH,EAAY5H,SAAS+lB,EAAc3lB,KACnC4lB,IAIR,QAAIA,EAAkB,GAW1BC,iCAAiC3C,EAAeoC,EAAqBC,GACjE,IAAIO,EAAgB5C,EAActT,OAAS0V,EAAoBnU,KAAO+R,EAActT,OAAS0V,EAAoBlU,IAC7G2U,EAAqB7C,EAAcrT,YAAc0V,EAAwBpU,KAAO+R,EAAcrT,YAAc0V,EAAwBnU,IAExI,SAAI0U,IAAgBC,GAUxBC,iBAAiBX,EAAcnC,GAC3B,QAA4B,IAAxBmC,EAAa5kB,SAAgB4kB,EAAazlB,SAASsjB,EAAclkB,OAIzEinB,YAAYC,GACR,MACM1oB,EAAQ0oB,EAAI1oB,MADJ,gBAEd,OAAOA,EAAQA,EAAM,GAAK,KAkB9BioB,6BAA6BU,EAASf,EAAmB1e,EAAeY,EAAyBE,EAAa6d,EAAcC,EAAqBC,EAAyBa,EAAYZ,GAClL,IACIa,EADA5Y,EAAa,UAGQvK,IAArBsiB,GAAuD,OAArBA,IAClC/X,EAAa+X,EAAiBY,GAAY3Y,YAG9C0Y,EAAQ3Y,QAASsQ,IACVA,EAAM1P,KAAKwP,cAAche,SAAS,YACjCymB,EAASplB,KAAKglB,YAAYnI,EAAM1P,KAAKwP,gBAGrCE,EAAMmB,QACY,MAAdxR,GACAA,EAAWD,QAASE,IAChB,IAAI4Y,EAAe5Y,EAAUpN,IAAIV,SAAS,KAAO8N,EAAUpN,IAAIb,QAAQ,IAAK,IAAMiO,EAAUpN,IACxFimB,EAAiBnB,EAAkBxlB,SAAS,KAAOwlB,EAAkB3lB,QAAQ,IAAK,IAAM2lB,EAiB5F,GAfKiB,IAAWC,EAAa1I,eACzBE,EAAM1P,KAAKwP,cAAche,SAAS,WACjCymB,IAAWE,EAAe3I,eAE3BE,EAAM/C,SAASvb,MAAMkc,IAAI,IAAI/D,IAAYjR,EAAcgH,EAAU1O,MAAMuC,cACvEuc,EAAM/C,SAASmE,aAAc,EAC7BpB,EAAM/C,SAASoE,QAAU,EACzBrB,EAAM/C,SAASY,aAAc,EAC7BmC,EAAMiB,SAAU,IAETsH,GAAYjB,GAAqBiB,IAAWE,EAAe3I,gBAC3DE,EAAM1P,KAAKwP,cAAche,SAAS,YACrCke,EAAMiB,SAAU,GAGpBjB,EAAM1P,OAASV,EAAUpN,IAAK,CAE9B,GAAIwd,EAAM1P,OAASgX,EAGf,OAFAtH,EAAM/C,SAASoE,QAAUzY,EAAcgH,EAAU1O,MAAMiQ,kBACvD6O,EAAM/C,SAASvb,MAAMkc,IAAI,IAAI/D,IAAYjR,EAAcgH,EAAU1O,MAAM2P,eAU3E,GANImP,EAAM1P,OAASgX,IACftH,EAAM/C,SAASyL,SAASC,kBAAoB,CACxC1H,SAAS,IAIZrR,EAAUC,YAIV,CACD,IAAI+Y,EAAYzlB,KAAK+kB,iBAAiBX,EAAc3X,GAChDiZ,EAAW1lB,KAAKykB,sBAAsBle,EAAakG,EAAUkZ,MAC7DC,EAAyB5lB,KAAK4kB,iCAAiCnY,EAAW4X,EAAqBC,GAE/FF,EAAa5kB,OAAS,EAClBimB,GAAaC,GAAYE,GACzB/I,EAAM/C,SAASvb,MAAMkc,IAAI,IAAI/D,IAAYjR,EAAcgH,EAAU1O,MAAM2P,eACvEmP,EAAM/C,SAASoE,QAAUzY,EAAcgH,EAAU1O,MAAM+P,iBAGvD+O,EAAM/C,SAASoE,QAAU,GACzBrB,EAAM/C,SAASvb,MAAMkc,IAAIpU,IAKzBqf,GAAYE,GACZ/I,EAAM/C,SAASvb,MAAMkc,IAAI,IAAI/D,IAAYjR,EAAcgH,EAAU1O,MAAM2P,eACvEmP,EAAM/C,SAASoE,QAAUzY,EAAcgH,EAAU1O,MAAM+P,iBAGvD+O,EAAM/C,SAASvb,MAAMkc,IAAIpU,GACzBwW,EAAM/C,SAASoE,QAAU,SA1BjCrB,EAAM/C,SAASoE,QAAU,EACzBrB,EAAM/C,SAASvb,MAAMkc,IAAIpU,U,SCvD1C,UAxFf,MACIwf,0BAA0BvP,EAAcG,EAAQS,GAC5C,IAAI4O,EAAS,IAAIC,IAAc7O,EAAU,IACzC,IAAI8O,EAAiB,GAErB,IAAK,IAAIjnB,EAAI,EAAGA,EAAIuX,EAAa8L,SAAS5iB,OAAQT,IAC9C,IAAK,IAAI0P,EAAI,EAAGA,EAAI6H,EAAa8L,SAASrjB,GAAGqjB,SAAS5iB,OAAQiP,IACR,SAA9C6H,EAAa8L,SAASrjB,GAAGqjB,SAAS3T,GAAG1Q,MACrCioB,EAAenmB,KAAKyW,EAAa8L,SAASrjB,GAAGqjB,SAAS3T,IAKlE,SAASwX,EAAclI,GACnB,MACMmI,EADWnI,EAAKoI,SACIC,WAAW1R,SAASkO,MAE9C,IAAIyD,EAAcC,IACdC,GAAeD,IAEnB,IAAK,IAAIvnB,EAAI,EAAGA,EAAImnB,EAAS1mB,OAAQT,GAAK,EAAG,CACzC,MAAMynB,EAAS,IAAI9P,KAAcwP,EAASnnB,GAAImnB,EAASnnB,EAAI,GAAImnB,EAASnnB,EAAI,IAC5EynB,EAAOC,aAAa1I,EAAK2I,aAEzB,MAAMC,EAAWlQ,EAAO/B,SAASkS,WAAWJ,GAC5CH,EAAc9iB,KAAK2M,IAAImW,EAAaM,GACpCJ,EAAchjB,KAAK4M,IAAIoW,EAAaI,GAGxC,MAAO,CAAEE,QAASR,EAAaS,SAAUP,GAuD7C,OALA,YA/CA,WACI,IAAIpI,EAAc,EAEE6H,EAAerZ,KAAK,CAACxN,EAAGD,KACxC,IAAI6nB,EAAYd,EAAc9mB,GAC1B6nB,EAAYf,EAAc/mB,GAI9B,OAFY6nB,EAAUF,QAAUE,EAAUD,UAAY,GAC1CE,EAAUH,QAAUG,EAAUF,UAAY,IAK5Cva,QAASwR,IACnBA,EAAKI,YAAcA,KAEfJ,EAAK5Q,KAAKwP,cAAche,SAAS,WAAaof,EAAK5Q,KAAKxO,SAAS,MAAQof,EAAKI,YAAc,IAC5FJ,EAAKkJ,eAAkB/P,IACvB,MAAMgQ,EAAKhQ,EAASiQ,aACpBD,EAAGE,OAAOF,EAAGG,cACbH,EAAGI,YAAY,KACfJ,EAAGK,YAAYL,EAAGM,SAAU,EAAG,KAC/BN,EAAGO,UAAUP,EAAGQ,KAAMR,EAAGQ,KAAMR,EAAGS,UAGpC5J,EAAK6J,cAAiB1Q,IAClB,MAAMgQ,EAAKhQ,EAASiQ,aACpBD,EAAGE,OAAOF,EAAGG,cACbH,EAAGI,YAAY,KACfJ,EAAGK,YAAYL,EAAGM,SAAU,EAAG,KAC/BN,EAAGO,UAAUP,EAAGQ,KAAMR,EAAGQ,KAAMR,EAAGQ,QAGpC3J,EAAK6J,cAAiB1Q,IAClB,MAAMgQ,EAAKhQ,EAASiQ,aACpBD,EAAGI,YAAY,KACfJ,EAAGK,YAAYL,EAAGW,OAAQ,EAAG,KAC7BX,EAAGO,UAAUP,EAAGQ,KAAMR,EAAGQ,KAAMR,EAAGQ,MAClCR,EAAGY,QAAQZ,EAAGG,iBAU1BU,GACAjC,EAAOkC,OAAO1R,EAAcG,M,OCpExC,MAAMwR,UAAqBC,YAAUnnB,cAAA,SAAAonB,WAAA,KACnC/mB,MAAQ,CACNqV,OAAQ,GACR2R,oBAAoB,EACpBC,oBAAqB,GACrBC,YAAY,EACZC,aAAc,EACdC,qBAAsB,GACtBC,UAAW,GACXhG,YAAa,GACbiG,aAAc,GACdC,aAAc,GACdC,gBAAgB,EAChBzE,kBAAmB,GACnB0E,sBAAuB,GACvBC,eAAgB,EAChBC,aAAa,EACblI,oBAAoB,EACpBmI,mBAAmB,EAEnBC,kBAAkB,EAClBC,iBAAiB,EAEjBtgB,oBAAqB,GAErBugB,QAAS,EACTC,gBAAiB,GACjBC,4BAA6B,EAE7BrM,UAAW,IAAIsM,IACftN,OAAQ,IAAItF,KACZ6S,MAAO,IAAI7S,KAAc,KAAM,MAC/B8S,UAAW,IAAI9S,KACf,KACF+S,aAAe,CAAExgB,QAAS,QAgH1B,KAYAygB,YAAcjI,MACZvE,EACA5G,EACAY,EACAyS,EACAlT,EACA8H,EACApI,EACAoT,EACAC,EACAjT,EACAsE,EACAI,KAEA,IAAI5H,EAAKuW,sBAAsBnI,SAC7BzhB,KAAK0pB,YACHxM,EACA5G,EACAY,EACAyS,EACAlT,EACA8H,EACApI,EACAoT,EACAC,EACAjT,EACAsE,EACAI,IAKJ,GADAjb,KAAK6C,SAAS,CAAEsmB,QAAS9V,IACrBrT,KAAKoB,MAAMwnB,eAAgB,OAO/B,GALA5oB,KAAK6C,SAAS,CAAEshB,kBAAmB,KAEnCnkB,KAAK6C,SAAS,CAAEge,oBAAoB,IAIlCvK,EAAawH,SACbxH,EAAa8L,SAAS5iB,SACrBQ,KAAKgB,MAAM4B,aACX5C,KAAKgB,MAAMY,aACX5B,KAAKgB,MAAMwG,iBACXxH,KAAKgB,MAAMS,qBAEZ,IAAK,MAAMob,KAASvG,EAAa8L,SAAU,CACzC,IAAIyH,EAAa,GASjB,GARAA,QAAmBL,EAAUM,iBAC3BxT,EAAa8L,SAASvF,GAAOuF,UAGL,IAAtByH,EAAWrqB,QACbQ,KAAK6C,SAAS,CAAEshB,kBAAmB,KAInC0F,EAAWrqB,OAAS,GACpB8W,EAAa8L,SAASvF,GAAOiB,SAC7B+L,EAAW,GAAGxN,OAAOyB,QACrB,CACA,IAAIiM,EAAYF,EAAW,GAC3B7pB,KAAK6C,SAAS,CAAEshB,kBAAmB4F,EAAU1N,OAAOlP,OAEpD,MAAM6c,EAAuBhqB,KAAKgB,MAAM0H,cAAc1I,KAAKoB,MAAM+iB,mBAOjE,GALG6F,GAAwBA,EAAqBtb,SAC9CwI,EAAS+S,WAAWre,MAAMwT,OAAS,UACnCpf,KAAK6C,SAAS,CAAEgmB,sBAAuBmB,EAAqBnH,eAGnB5gB,IAAvCjC,KAAKgB,MAAMqF,wBAAuC,CACpD,IAAI9H,EAAQ,IAAImY,IAAY1W,KAAKgB,MAAMqF,yBACvC,GAAIwjB,EAAW,GAAGxN,OAAOvC,SAASvb,MAAM2rB,OAAO3rB,GAC7C,OAICyB,KAAKgB,MAAMS,sBACd0oB,EAAYjJ,kBACV6I,EAAU1N,OAAOlP,KACjBnN,KAAKgB,MAAMkE,aACXlF,KAAKgB,MAAM4H,oBACX5I,KAAKgB,MAAMggB,aAGf,MAkBF,GAf0B,IAAtB6I,EAAWrqB,SAC4B,KAArCQ,KAAKoB,MAAMynB,uBACb7oB,KAAK6C,SAAS,CAAEgmB,sBAAuB,KAEzCvS,EAAa8L,SAASvF,GAAOuF,SAAS7V,QAASsQ,IACzCA,EAAM/C,WACR+C,EAAM/C,SAASoE,QAAU,EACzBrB,EAAM/C,SAASyL,SAASC,kBAAoB,CAC1C1H,SAAS,MAIf5G,EAAS+S,WAAWre,MAAMwT,OAAS,WAGjCpf,KAAKoB,MAAMynB,sBACb,MAKN,GAAI7oB,KAAKoB,MAAM8nB,gBACb,OAGClpB,KAAKoB,MAAMynB,wBACZ7oB,KAAKoB,MAAM+iB,mBACVnkB,KAAKoB,MAAM+iB,kBAAkBxlB,SAAS,UAEvCqB,KAAK6C,SAAS,CAAEge,oBAAoB,IAEpCsJ,EAAYtI,UAAU7hB,KAAKoB,MAAMmoB,QAGnCa,EAAalG,0BACX5N,EACAtW,KAAKoB,MAAM+iB,kBACXnkB,KAAKgB,MAAMyE,cACXzF,KAAKgB,MAAMqF,wBACXrG,KAAKgB,MAAMuF,YACXvG,KAAKgB,MAAMkE,aACXlF,KAAKgB,MAAMsF,cACXtG,KAAKgB,MAAMqjB,oBACXrkB,KAAKgB,MAAMsjB,wBACXtkB,KAAKgB,MAAMggB,YAAY7T,KAAOnN,KAAKgB,MAAMggB,YAAY5U,OAAS,MAEhEpM,KAAKqqB,2BAA2BrqB,KAAKgB,MAAMkE,cAE3C,MAAMolB,QAAuBC,EAAY3P,qBACvCnE,EACAoE,EACA7a,KAAKgB,MAAMoE,cACXpF,KAAKoB,MAAM0F,0BAGb,GAAI+T,EAAqB,CACvB,MAAMU,QAAuBgP,EAAYvP,qBACvCvE,EACAwE,EACAjb,KAAKgB,MAAMoE,cACXpF,KAAKgB,MAAMyT,sBACXzU,KAAKoB,MAAM0F,0BAGP6f,QAAiB2D,EAAe1D,WAAWrL,IAGJ,IAA3Cvb,KAAKoB,MAAMioB,6BACXrpB,KAAKgB,MAAMyH,0BAELzI,KAAKwqB,yBACT3P,EACAI,GAIJsP,EAAYnP,qBACVjF,EACA8E,EACAjb,KAAKgB,MAAMoE,cACXpF,KAAKoB,MAAMioB,4BACX1C,EACA3mB,KAAKoB,MAAM0F,yBACXyU,GAIJ4O,EAAYvJ,aAAa5gB,KAAKoB,MAAMyf,oBACpC7gB,KAAKyqB,cAAczqB,KAAKoB,MAAM2F,aAAcuP,GAE5CG,EAAOiU,KAAO1qB,KAAKgB,MAAMgG,WACzBkQ,EAASyT,QAETlU,EAAOM,yBAEPG,EAAS8Q,OAAO9K,EAAOzG,GACvBS,EAAS0T,aACTjB,KAqnBF,KAGAkB,qBAAuB,KACrB,IAAIvf,EAAatL,KAAKoB,MAAMgoB,gBAC5BQ,sBAAsB,KACpB5pB,KAAK0pB,YACHpe,EAAW4R,MACX5R,EAAWgL,aACXhL,EAAW4L,SACX5L,EAAWqe,cACXre,EAAWmL,OACXnL,EAAWiT,MACXjT,EAAW6K,OACX7K,EAAWie,MACXje,EAAWke,UACXle,EAAWiL,OACXjL,EAAWuP,oBACXvP,EAAW2P,8BA57BjB,4BACE,IAAK,IAAI7Z,KAASpB,KAAKgB,MAAMggB,YAAY5U,OACvC,GAAIhL,EAAMmc,WAAY,CAKpB,aAJ6BgN,EAAYxO,8BACvC/b,KAAKoB,MAAM4b,UACX5b,EAAMmc,YAKZ,MAAO,CAAC,KAAM,MAMhB,wBACE7G,IAAYgB,SAAU,EACtB,MAAMwF,EAAQ,IAAIxG,IACZJ,EAAe,IAAII,IACnBQ,EAAWqT,EAAYvT,mBAAmB,aAC1CP,EAAS8T,EAAY/T,mBACrBL,EAASoU,EAAYvQ,mBACrBzD,QAAegU,EAAYjR,qBAC/BtZ,KAAKgB,MAAMsP,oBAGPwa,QAAsC9qB,KAAK+qB,sBACjD,IAAIlQ,EACAI,EACC6P,EAA8B,IAIjCjQ,EAAsBiQ,EAA8B,GACpD7P,EAA4B6P,EAA8B,KAJ1DjQ,EAAsB,KACtBI,EAA4B,MAM9BxE,EAAOiU,KAAO1qB,KAAKgB,MAAMgG,WAEzB,MAAMmW,QAA0BoN,EAAYxN,aAC1C/c,KAAKoB,MAAM4b,UACX1G,EACAG,EACAzW,KAAKgB,MAAMggB,YAAY5U,OACvB8Q,EACAld,KAAKgB,OAGPhB,KAAK6C,SAAS,CAAE4T,OAAQA,IACxB,IAAK,IAAI1X,EAAI,EAAGA,EAAIisB,OAAO3gB,KAAK8S,GAAmB3d,OAAQT,IACzDuX,EAAa2U,IAAI9N,EAAkBpe,IAIrC,MAAM4qB,EAAgBuB,EAAarF,0BACjCvP,EACAG,EACAS,GAGF,IAAIqH,QAAc4L,EAAYpI,YAAYtL,GAE1CyG,EAAM+N,IAAI9U,GACV+G,EAAM+N,IAAI1U,GAEVna,OAAOqG,iBACL,SACA,KACE0oB,EAAa9M,eAAenH,EAAUT,KAExC,GAGFra,OAAOqG,iBACL,YACCtB,IACMnB,KAAKoB,MAAM2nB,aAChB/oB,KAAKorB,YAAYjqB,EAAOnB,KAAKoB,MAAMooB,UAAWxpB,KAAKoB,MAAMmoB,MAAO9S,KAElE,GAGFra,OAAOqG,iBACL,WACCtB,IACCnB,KAAKqrB,WAAWlqB,EAAOnB,KAAKoB,MAAMooB,UAAWxpB,KAAKoB,MAAMmoB,MAAO9S,KAEjE,GAGFzW,KAAK6C,SAAS,CACZumB,gBAAiB,CACflM,QACA5G,eACAY,WACAyS,gBACAlT,SACA8H,QACApI,SACAoT,MAAOvpB,KAAKoB,MAAMmoB,MAClBC,UAAWxpB,KAAKoB,MAAMooB,UACtBjT,SACAsE,sBACAI,6BAEFqQ,sBAAuB7U,EAAO/B,SAASwG,UAmN3C,+BACEL,EACAI,GAEA,MAAMsQ,EAAwB,IAAI1U,KAChCgE,EAAoBe,OAAO,GAC3Bf,EAAoBe,OAAO,GAC3Bf,EAAoBe,OAAO,IAG7B,IAAI4P,EAEFA,OADgCvpB,IAA9BgZ,QACkC,IAAIpE,KACtCoE,EAA0BW,OAAO,GACjCX,EAA0BW,OAAO,GACjCX,EAA0BW,OAAO,UAGC5b,KAAKgB,MAAMyT,sBAEjD+W,EAA8BA,EAC3BtQ,QACAC,eAAenb,KAAKoB,MAAM0F,0BAE7B,MAAM2kB,QAA8BF,EACjCpQ,eAAenb,KAAKoB,MAAM0F,0BAC1B8f,WAAW4E,GACdxrB,KAAK6C,SAAS,CAAEwmB,4BAA6BoC,IAO/CpB,2BAA2BnlB,GACzB,GAAIlF,KAAKgB,MAAMyH,kBAKb,OAJAzI,KAAK6C,SAAS,CACZiE,yBAA0B9G,KAAKgB,MAAM8F,gCAEvC9G,KAAK6C,SAAS,CAAEkE,aAAc/G,KAAKgB,MAAM+F,eAI3C,MAAM3F,EAAQpB,KAAKgB,MAAMggB,YAAY5U,OAAOlH,GAC5ClF,KAAK6C,SAAS,CAAEiE,yBAA0B1F,EAAMsqB,iBAChD1rB,KAAK6C,SAAS,CAAEkE,aAAc3F,EAAMuqB,cAQtClB,cAAc1jB,EAAcuP,GAC1BA,EAAakE,MAAMoR,UAAU7kB,GAM/B8kB,UACE,MAAM1qB,EAAQ,IAAI+J,YAAY,UAAW,CACvC5J,OAAQ,CACNwqB,UAAU,KAGOvpB,SAASC,eAAe,wBAC9B2I,cAAchK,GAE7BnB,KAAK6C,SAAS,CAAEylB,YAAY,IAC5BtoB,KAAKypB,aAAe,CAAExgB,QAAS,QAKjC8iB,UACE,MAAM5qB,EAAQ,IAAI+J,YAAY,UAAW,CACvC5J,OAAQ,CACNwqB,UAAU,KAGOvpB,SAASC,eAAe,wBAC9B2I,cAAchK,GAE7BnB,KAAK6C,SAAS,CAAEylB,YAAY,IAC5BtoB,KAAKypB,aAAe,CAAExgB,QAAS,QAC/BjJ,KAAKgsB,cAUPZ,YAAYjqB,EAAOqoB,EAAWD,EAAO9S,GACnC,GAAIzW,KAAKoB,MAAM4nB,kBAAmB,OAElC,IAAIiD,EAAY1pB,SACbC,eAAe,wBACf0pB,wBAEHlsB,KAAK6C,SAAS,CACZ0mB,MAAO,CAGL4C,GAAKhrB,EAAMiB,QAAU6pB,EAAU9L,MAAQ8L,EAAU3R,MAAS,EAAI,EAC9D8R,IAAMjrB,EAAMkB,QAAU4pB,EAAU7L,KAAO6L,EAAU1R,OAAU,EAAI,EAC/DoB,UAAWxa,EAAMiB,QAAU6pB,EAAU9L,KACrCtE,UAAW1a,EAAMkB,QAAU4pB,EAAU7L,OAGzCoJ,EAAU6C,cAAc9C,EAAO9S,GAUjC4U,WAAWlqB,EAAOqoB,EAAWD,EAAO9S,GAClCzW,KAAK6C,SAAS,CACZ0mB,MAAO,CACL4C,EAAIhrB,EAAMmrB,eAAe,GAAGlqB,QAAUhG,OAAO8c,WAAc,EAAI,EAC/DkT,GAAKjrB,EAAMmrB,eAAe,GAAGjqB,QAAUjG,OAAO+c,YAAe,EAAI,KAGrEqQ,EAAU6C,cAAc9C,EAAO9S,GAOjC8V,iBAAiBlJ,GACf,OAAO,IAAInH,QAAQ,CAACC,EAASC,KAC3Bpc,KAAKoB,MAAM4a,OAAOtC,KAChB2J,EACClJ,IACCgC,EAAQhC,IAEV,KACCzE,GAAU0G,EAAO1G,EAAMA,UAS9B8W,kBAAkBntB,GAEhB,IAA6C,IAAzCW,KAAKoB,MAAMqhB,YAAY3X,QAAQzL,GAAa,OAChD,IAAIotB,EAAazsB,KAAKoB,MAAMqhB,YAAY3X,QAAQzL,GAE5CqtB,EAAS1sB,KAAKoB,MAAMqhB,YAAYgK,GAChCE,EAAW3sB,KAAKoB,MAAMsnB,aAAa+D,GAEvCzsB,KAAKoB,MAAMqhB,YAAY1X,OAAO0hB,EAAY,GAC1CzsB,KAAKoB,MAAMsnB,aAAa3d,OAAO0hB,EAAY,GAE3CzsB,KAAKoB,MAAMqhB,YAAYwB,QAAQyI,GAC/B1sB,KAAKoB,MAAMsnB,aAAazE,QAAQ0I,GASlCC,mBAAmBvtB,EAAKhB,GAA4B,IAApBwuB,IAAU1E,UAAA3oB,OAAA,QAAAyC,IAAAkmB,UAAA,KAAAA,UAAA,GACpC2E,EAAe9sB,KAAKoB,MAAMqhB,YAAY3X,QAAQzL,GAC9C0tB,EAAgB/sB,KAAKoB,MAAMsnB,aAAaoE,GAC5C,GAAIC,EAAcvtB,OAAS,EAAG,OAAOutB,EACrC,IAAIC,EAAmBD,EAAcvtB,OACjCytB,EAAc,GACdC,EAAe,EAEfC,EAAY,GAChB,IAAK,IAAIpuB,EAAI,EAAGA,EAAIguB,EAAcvtB,OAAQT,IACxCouB,EAAUttB,KAAKktB,EAAchuB,GAAG,IAC5BguB,EAAchuB,GAAG,KAAOV,IAC1B6uB,EAAenuB,GAInB,IAAIquB,EAAkBF,EAAe,EACjCG,EAAcH,EAAe,EAE7BE,EAAkB,IACpBA,EAAkBJ,EAAmB,GAGnCK,GAAeL,IACjBK,EAAc,GAEhB,IAAIC,EAAiBP,EAAcG,GAC/BK,EAAkBR,EAAcK,GAChCI,EAAcT,EAAcM,GAMhC,IAJAJ,EAAYptB,KAAKytB,GACjBL,EAAYptB,KAAK0tB,GACjBN,EAAYptB,KAAK2tB,GAEVP,EAAYztB,SAAWwtB,GAC5BI,IACAC,IAEID,EAAkB,IAAGA,EAAkBJ,EAAmB,GAC1DK,GAAeL,IAAkBK,EAAc,GAEnDE,EAAkBR,EAAcK,GAChCI,EAAcT,EAAcM,GAE5BJ,EAAYptB,KAAK0tB,GACbH,IAAoBC,GAAaJ,EAAYptB,KAAK2tB,GAIxD,OADAxtB,KAAKoB,MAAMsnB,aAAaoE,GAAgBG,EACpCJ,EACK,IAAI3Q,QAASC,GAAYA,UADlC,EASF,0BACE,KAAOnc,KAAKoB,MAAMsnB,aAAalpB,OAAS,GAAG,CAGzC,GAFAQ,KAAKoB,MAAMinB,oBAAsBroB,KAAKoB,MAAMqhB,YAAY,QAElBxgB,IAAlCjC,KAAKoB,MAAMsnB,aAAa,GAAG,GAAkB,CAC/ChW,QAAQC,KAAK,8CACb3S,KAAKoB,MAAMsnB,aAAa,GAAGzoB,QACe,IAAtCD,KAAKoB,MAAMsnB,aAAa,GAAGlpB,SAC7BQ,KAAKoB,MAAMsnB,aAAazoB,QACxBD,KAAKoB,MAAMqhB,YAAYxiB,SAEzB,SAGF,IAAIojB,EAAOrjB,KAAKoB,MAAMsnB,aAAa,GAAG,GAAG,GACrCrpB,EACFW,KAAKoB,MAAMinB,oBAAsB,IAAMroB,KAAKoB,MAAMsnB,aAAa,GAAG,GAAG,GAEnE+E,EACFhgB,EAAarO,0BAA0BC,GAErC8a,QAAgBna,KAAKusB,iBAAiBlJ,GAC1ClJ,EAAQR,UAAYjD,IAEpB1W,KAAKoB,MAAMunB,aAAatpB,GAAO8a,EAE/B,IAAIuT,EAAajgB,EAAarP,aACM,MAAlCqvB,EAAwC,IAAM,IAC9C,OACAztB,KAAKgB,MAAMkE,aACuB,MAAlCuoB,EACIztB,KAAKgB,MAAMmE,gBACyBlD,IAApCjC,KAAKgB,MAAMkB,qBACXlC,KAAKgB,MAAMkB,qBAAqB7C,IAChC,GAC8B,MAAlCouB,EACIztB,KAAKgB,MAAMoE,cACXpF,KAAKgB,MAAMqE,sBAGjB,GAAIrF,KAAKoB,MAAMinB,sBAAwBroB,KAAKoB,MAAMqhB,YAAY,GAC5DziB,KAAKoB,MAAMsnB,aAAa,GAAGzoB,QACe,IAAtCD,KAAKoB,MAAMsnB,aAAa,GAAGlpB,SAC7BQ,KAAKoB,MAAMsnB,aAAazoB,QACxBD,KAAKoB,MAAMqhB,YAAYxiB,SAErBZ,IAAQquB,IAC4B,MAAlCD,EACFlD,EAAY5P,cAAcR,GACvBoQ,EAAYrQ,uBAAuBC,GACxCna,KAAK6C,SAAS,CAAEomB,kBAAkB,IAE9BjpB,KAAKoB,MAAMknB,YAAYtoB,KAAK+rB,YAEI,IAAlC/rB,KAAKoB,MAAMgnB,2BACPpoB,KAAK4sB,mBACT5sB,KAAKoB,MAAMqhB,YAAY,GACvBziB,KAAKgB,MAAMoE,eACX,GAEFpF,KAAKoB,MAAMgnB,oBAAqB,OAE7B,CACL,IAAIuF,EAAoB3tB,KAAKoB,MAAMqhB,YAAY3X,QAC7C9K,KAAKoB,MAAMinB,qBAGbroB,KAAKoB,MAAMsnB,aAAaiF,GAAmB1tB,QAEe,IAAtDD,KAAKoB,MAAMsnB,aAAaiF,GAAmBnuB,QAC7CQ,KAAKoB,MAAMsnB,aAAa3d,OAAO4iB,EAAmB,IAEd,IAAlC3tB,KAAKoB,MAAMgnB,2BACPpoB,KAAK4sB,mBACT5sB,KAAKoB,MAAMqhB,YAAY,GACvBziB,KAAKgB,MAAMoE,eACX,GAEFpF,KAAKoB,MAAMgnB,oBAAqB,IAItCpoB,KAAK6C,SAAS,CAAEwlB,oBAAqB,KAMvC,+BACE,IAAIpqB,EAAQ+B,KAAKgB,MAAMkE,aACnB+d,EAAOjjB,KAAKgB,MAAMggB,YAAY5U,OAAOnO,GAAOglB,KAAKzjB,OACjDouB,EAAU5tB,KAAKgB,MAAMsE,WAErBuoB,EAAe5K,EAAO2K,EACtBrF,EAAe,EAEnB,IAAK,IAAIxpB,EAAI,EAAGA,EAAIkkB,EAAMlkB,IAAK,CAC7B,IAAK,IAAI0P,EAAI,EAAGA,EAAImf,EAASnf,IAAK,CAChC,IAAIqf,EAAargB,EAAarP,aAAa,IAAK,OAAQH,EAAOc,EAAG0P,GAC9D4U,EAAOrjB,KAAKoB,MAAMsnB,aAAa,GAAG,GAAG,GAErCvO,QAAgBna,KAAKusB,iBAAiBlJ,GAC1ClJ,EAAQR,UAAYjD,IACpB1W,KAAKoB,MAAMunB,aAAamF,GAAc3T,EAEtCoO,IAEA,IAAIwF,EAAaxqB,KAAKtF,MAAOsqB,EAAesF,EAAgB,KAC5D7tB,KAAKgB,MAAMgtB,OAAOC,mBAAmBF,GACrC/tB,KAAKoB,MAAMsnB,aAAa,GAAGzoB,QAE7BD,KAAKoB,MAAMqhB,YAAYxiB,QACvBD,KAAKoB,MAAMsnB,aAAazoB,QAG1B,IAAIZ,EAAMoO,EAAarP,aACrB,IACA,OACAH,EACA+B,KAAKgB,MAAMmE,WACXnF,KAAKgB,MAAMoE,eAIbpF,KAAKkuB,iCAAiC7uB,GACtCW,KAAK6C,SAAS,CAAEkmB,aAAa,IAE7B/oB,KAAKmuB,oBAUP,yBAAyB7iB,EAAY8iB,EAAa/K,GAA0B,IAApBgL,IAAUlG,UAAA3oB,OAAA,QAAAyC,IAAAkmB,UAAA,KAAAA,UAAA,GAChEnoB,KAAK6C,SAAS,CAAEqmB,iBAAiB,IAEjC,IAAIoF,EAAe,GAEnBA,EAAe7gB,EAAarP,aAC1BiwB,EAAa,IAAM,IACnB,OACA/iB,EAAW,GACXA,EAAW,GACXA,EAAW,SAGiCrJ,IAA1CjC,KAAKoB,MAAMunB,aAAa2F,IACtBtuB,KAAKoB,MAAMknB,YAAYtoB,KAAK+rB,UAE7B/rB,KAAKoB,MAAMknB,YAAYtoB,KAAK6rB,UAEjC,IAAIjX,EAAiBrS,SAASC,eAAe,wBACzCrB,EAAQ,IAAI+J,YAAY,iBAAkB,CAC5C5J,OAAQ,CACNC,OAAO,KAGXqT,EAAezJ,cAAchK,GAE7B,IAAIgZ,QAAgBna,KAAKusB,iBAAiBlJ,GAE1ClJ,EAAQR,UAAYjD,IAGpB1W,KAAKoB,MAAMunB,aAAayF,GAAejU,EACvC,IAAIuT,EAAa,GAEjBA,EAAajgB,EAAarP,aACxBiwB,EAAa,IAAM,IACnB,MACAruB,KAAKgB,MAAMkE,aACXlF,KAAKgB,MAAMmE,WACXnF,KAAKgB,MAAMoE,eAMXgpB,IAAgBV,QAC0BzrB,IAA1CjC,KAAKoB,MAAMunB,aAAa2F,KAExBntB,EAAQ,IAAI+J,YAAY,iBAAkB,CACxC5J,OAAQ,CACNC,OAAO,KAGXqT,EAAezJ,cAAchK,GAEzBnB,KAAKoB,MAAMknB,YAAYtoB,KAAK+rB,WAE9BsC,EAAY9D,EAAY5P,cAAcR,GACrCoQ,EAAYrQ,uBAAuBC,GAExCna,KAAK6C,SAAS,CAAEomB,kBAAkB,IAClCjpB,KAAK6C,SAAS,CAAEqmB,iBAAiB,IAE7BlpB,KAAKoB,MAAMknB,YAAYtoB,KAAK+rB,UAEhC5qB,EAAQ,IAAI+J,YAAY,iBAAkB,CACxC5J,OAAQ,CACNC,OAAO,KAGXqT,EAAezJ,cAAchK,GAO/B,uCAAuC9B,QACA4C,IAAjCjC,KAAKoB,MAAMunB,aAAatpB,KAC1BkrB,EAAY5P,cAAc3a,KAAKoB,MAAMunB,aAAatpB,IAClDW,KAAK6C,SAAS,CAAEomB,kBAAkB,KAQtCsF,kCAAkClvB,QACK4C,IAAjCjC,KAAKoB,MAAMunB,aAAatpB,IAC1BkrB,EAAYrQ,uBAAuBla,KAAKoB,MAAMunB,aAAatpB,IAQ/D,kBAAkBmvB,GAChB,MAAMvwB,EAAQuwB,EAAStpB,aACjBhH,EAAMswB,EAASrpB,WACf9G,EAASmwB,EAASppB,cACxB,IAAIqpB,EAAWhhB,EAAa3P,aAAa,IAAK,OAAQG,EAAOC,GACzDwwB,EAAWD,EAAW,IAAMpwB,EAEhC,GAAIswB,EAAYnM,cAAcxiB,KAAKoB,MAAMqhB,YAAagM,GACpDzuB,KAAKkuB,iCAAiCQ,OACnC,CAEH,QAA0CzsB,IAAtCjC,KAAKoB,MAAMunB,aAAa+F,GAC1B1uB,KAAKkuB,iCAAiCQ,OAEnC,CACH,IAAIN,EAAc3gB,EAAarP,aAC7B,IACA,MACAH,EACAC,EACAG,GAEF,QAA6C4D,IAAzCjC,KAAKoB,MAAMunB,aAAayF,GAC1BpuB,KAAKkuB,iCAAiCE,OAEnC,CACH,IAAIQ,EACF5uB,KAAKgB,MAAMggB,YAAY5U,OAAOnO,GAAOglB,KAAK/kB,GAAKsN,WAAWnN,SACtD2B,KAAK6uB,mBACT,CAAC5wB,EAAOC,EAAKG,GACb+vB,EACAQ,QAEwC3sB,IAAtCjC,KAAKoB,MAAMunB,aAAa+F,KAEtB1uB,KAAKoB,MAAMinB,sBAAwBoG,EAErCzuB,KAAKoB,MAAMgnB,oBAAqB,EAEhCpoB,KAAK4sB,mBACH6B,EACAzuB,KAAKgB,MAAMoE,eACX,KAOVpF,KAAKwsB,kBAAkBiC,IAQ3B,gBAAgBD,GACd,MAAMvwB,EAAQuwB,EAAStpB,aACjBhH,EAAMswB,EAASrpB,WACf9G,EAASmwB,EAASppB,cAExB,IAAIqpB,EAAWhhB,EAAa3P,aAAa,IAAK,OAAQG,EAAOC,GACzDwwB,EAAWD,EAAW,IAAMpwB,EAEhC,GAAIswB,EAAYnM,cAAcxiB,KAAKoB,MAAMqhB,YAAagM,GACpDzuB,KAAKkuB,iCAAiCQ,OACjC,CAEL,QAA0CzsB,IAAtCjC,KAAKoB,MAAMunB,aAAa+F,GAC1B1uB,KAAKkuB,iCAAiCQ,OAGnC,CACH,IAAIN,EAAc3gB,EAAarP,aAC7B,IACA,MACAH,EACAC,EACAG,GAEF,QAA6C4D,IAAzCjC,KAAKoB,MAAMunB,aAAayF,GAC1BpuB,KAAKkuB,iCAAiCE,OACjC,CACL,IAAIQ,EACF5uB,KAAKgB,MAAMggB,YAAY5U,OAAOnO,GAAOglB,KAAK/kB,GAAKsN,WAAWnN,SACtD2B,KAAK6uB,mBACT,CAAC5wB,EAAOC,EAAKG,GACb+vB,EACAQ,IAMF5uB,KAAKoB,MAAMinB,sBAAwBoG,IAErCzuB,KAAKoB,MAAMgnB,oBAAqB,GAGlCpoB,KAAKwsB,kBAAkBiC,IAU3B,mBAAmBD,GACjB,MAAMvwB,EAAQuwB,EAAStpB,aACjBhH,EAAMswB,EAASrpB,WACf9G,EAASmwB,EAASppB,cACxB,IAAIqpB,EAAWhhB,EAAa3P,aAAa,IAAK,OAAQG,EAAOC,GACzDwwB,EAAWD,EAAW,IAAMpwB,EAGhC,GAAIswB,EAAYnM,cAAcxiB,KAAKoB,MAAMqhB,YAAagM,GACpDzuB,KAAKkuB,iCAAiCQ,QAGtC,QAA0CzsB,IAAtCjC,KAAKoB,MAAMunB,aAAa+F,GAE1B1uB,KAAKkuB,iCAAiCQ,OAGnC,CAEH,IAAIN,EAAc3gB,EAAarP,aAC7B,IACA,MACAH,EACAC,EACAG,GAEF,QAA6C4D,IAAzCjC,KAAKoB,MAAMunB,aAAayF,GAC1BpuB,KAAKkuB,iCAAiCE,OACjC,CACL,IAAIQ,EACF5uB,KAAKgB,MAAMggB,YAAY5U,OAAOnO,GAAOglB,KAAK/kB,GAAKsN,WAAWnN,SACtD2B,KAAK6uB,mBACT,CAAC5wB,EAAOC,EAAKG,GACb+vB,EACAQ,KAoCVE,6BAA6BxjB,GAC3B,IAAIjM,EAAMoO,EAAarP,aACrB,IACA,OACAkN,EAAW,GACXA,EAAW,GACXA,EAAW,IAEb,QAAqCrJ,IAAjCjC,KAAKoB,MAAMunB,aAAatpB,GAAoB,CAC9C,IAAI0vB,EAASthB,EAAarP,aACxB,IACA,MACAkN,EAAW,GACXA,EAAW,GACXA,EAAW,SAG2BrJ,IAApCjC,KAAKoB,MAAMunB,aAAaoG,GAC1B/uB,KAAK6uB,mBAAmBvjB,EAAYyjB,EAAQzjB,EAAW,IAAI,GAE3Dif,EAAYrQ,uBAAuBla,KAAKoB,MAAMunB,aAAaoG,SAG7DxE,EAAYrQ,uBAAuBla,KAAKoB,MAAMunB,aAAatpB,IAI/D2vB,0BAA0BR,GACxB,IAAIvwB,EAAQ+B,KAAKgB,MAAMkE,aACnBhH,EAAM8B,KAAKgB,MAAMmE,WACRnF,KAAKgB,MAAMoE,gBAETopB,EAASppB,cACtBpF,KAAKivB,aAAaT,IACTvwB,IAAUuwB,EAAStpB,cAEnBhH,IAAQswB,EAASrpB,aAD1BnF,KAAKkvB,YAAYV,GAMrB,0BACE,IAAI5L,QAAc+L,EAAYQ,0BAC9BnvB,KAAK6C,SAAS,CAAE4lB,UAAW7F,EAAM,KAEjC5iB,KAAK6C,SAAS,CACZ6lB,aAAc9F,EAAM,GACpBH,YAAaG,EAAM,KAGrB5iB,KAAKovB,yBAEL,MAAMC,EAAoB9sB,SAASC,eAAe,wBAElD,GAAIxC,KAAKgB,MAAMgQ,eAAgB,CAC7B,MAAM2D,EAAWpS,SAASC,eAAe,aAEzCmS,EAASlS,iBAAiB,YAAa,KACrCzC,KAAK6C,SAAS,CAAEmmB,mBAAmB,MAGrCrU,EAASlS,iBAAiB,WAAY,KACpCzC,KAAK6C,SAAS,CAAEmmB,mBAAmB,MAIvCqG,EAAkB5sB,iBAAiB,gBAAkBtB,IACnDnB,KAAK6C,SAAS,CACZ+lB,gBAAgB,EAChBzE,kBAAmB,OAIvBkL,EAAkB5sB,iBAAiB,iBAAmBtB,IACpDnB,KAAK6C,SAAS,CAAE+lB,gBAAgB,MAGlCyG,EAAkB5sB,iBAAiB,mBAAqBtB,IACtD,IAAImK,EAAatL,KAAKoB,MAAMgoB,gBAC5BQ,sBAAsB,KACpB5pB,KAAK0pB,YACHpe,EAAW4R,MACX5R,EAAWgL,aACXhL,EAAW4L,SACX5L,EAAWqe,cACXre,EAAWmL,OACXnL,EAAWiT,MACXjT,EAAW6K,OACX7K,EAAWie,MACXje,EAAWke,UACXle,EAAWiL,OACXjL,EAAWuP,oBACXvP,EAAW2P,+BAKjB7e,OAAOqG,iBAAiB,WAAY,KAClCzC,KAAK6C,SAAS,CAAEomB,kBAAkB,MAEpC7sB,OAAOqG,iBAAiB,YAActB,IAChCnB,KAAKoB,MAAMwnB,iBACf5oB,KAAKoB,MAAM0nB,eAAiB3nB,EAAMkB,WAGpCjG,OAAOqG,iBAAiB,oBAAqBgf,gBACrCzhB,KAAKsvB,wBACLtvB,KAAK6qB,yBAGbzuB,OAAOqG,iBAAiB,mBAAqBtB,IAC3C,IAAIstB,EAAWhhB,EAAa3P,aAC1B,IACA,OACAkC,KAAKgB,MAAMkE,aACXlF,KAAKgB,MAAMmE,YAERwpB,EAAYnM,cAAcxiB,KAAKoB,MAAMqhB,YAAagM,KACjDzuB,KAAKoB,MAAMinB,sBAAwBoG,GAErCzuB,KAAKoB,MAAMgnB,oBAAqB,EAChCpoB,KAAKwsB,kBAAkBiC,IAEvBzuB,KAAKwsB,kBAAkBiC,MAK7BryB,OAAOqG,iBAAiB,kBAAoBqQ,IAC1C,MAAM0O,EAAkBjf,SAASC,eAAe,oBAC1C+sB,EAAoBhtB,SAASC,eAAe,kBAC5CgtB,EAA0BjtB,SAASC,eACvC,yBAGFpG,OAAOqG,iBAAiB,QAAS,KACU,KAArCzC,KAAKoB,MAAMynB,wBACbzsB,OAAOgkB,IAAI/jB,SAASozB,KAAOzvB,KAAKoB,MAAMynB,yBAG1CrH,EAAgB/e,iBAAiB,QAAUqQ,IACzC,IAAIlK,EAAsB5I,KAAKgB,MAAM4H,oBACrC,MAAM8B,EAAe1K,KAAKoB,MAAM+iB,kBAEhC,GAAIvb,EAAoBjK,SAAS+L,GAAe,CAC9C,IAAIvJ,EAAQ,IAAI+J,YAAY,kBAAmB,CAC7C5J,OAAQ,CACNjC,IAAKqL,KAQT,OAJAtO,OAAO+O,cAAchK,QAErBqgB,EAAgB5V,MAAMqT,gBACpB,gDAIJuC,EAAgB5V,MAAMqT,gBACpB,gDAEF,IAAI9d,EAAQ,IAAI+J,YAAY,eAAgB,CAC1C5J,OAAQ,CACNjC,IAAKqL,KAITtO,OAAO+O,cAAchK,KAGvBouB,EAAkB9sB,iBAAiB,QAASgf,UAC1C,IAAI/W,EAAe+C,EAAa3P,aAC9B,IACA,OACAkC,KAAKgB,MAAMkE,aACXlF,KAAKoB,MAAM+iB,mBAGb,GAAInkB,KAAKoB,MAAMqhB,YAAY9jB,SAAS+L,GAAe,CACjD,IACG1K,KAAKoB,MAAMonB,qBAAqB7pB,SAAS+L,IAC1C1K,KAAKoB,MAAMqnB,UAAU9pB,SAAS+L,GAC9B,OACM1K,KAAK4sB,mBAAmBliB,EAAc,GAAG,GAC/C,IAAI8d,EAAuBxoB,KAAKoB,MAAMonB,qBACtCA,EAAqB3oB,KAAK6K,GAC1B1K,KAAK6C,SAAS,CAAE2lB,yBAEdxoB,KAAKoB,MAAMqnB,UAAU9pB,SAAS+L,IAChC1K,KAAKwsB,kBAAkB9hB,GAG3B,IAAIvJ,EAAQ,IAAI+J,YAAY,sBAAuB,CACjD5J,OAAQ,CACNoJ,aAAc1K,KAAKoB,MAAM+iB,qBAG7BkL,EAAkBlkB,cAAchK,KAGlCquB,EAAwB/sB,iBAAiB,QAAUqQ,IACjD,IAAIpI,EAAe+C,EAAa3P,aAC9B,IACA,OACAkC,KAAKgB,MAAMkE,aACXlF,KAAKoB,MAAM+iB,mBAEb,GAAInkB,KAAKoB,MAAMqhB,YAAY9jB,SAAS+L,GAAe,CACjD,IACG1K,KAAKoB,MAAMonB,qBAAqB7pB,SAAS+L,IAC1C1K,KAAKoB,MAAMqnB,UAAU9pB,SAAS+L,GAC9B,CACA1K,KAAK4sB,mBAAmBliB,EAAc,GAAG,GACzC,IAAI8d,EAAuBxoB,KAAKoB,MAAMonB,qBACtCA,EAAqB3oB,KAAK6K,GAE1B1K,KAAK6C,SAAS,CAAE2lB,yBAEdxoB,KAAKoB,MAAMqnB,UAAU9pB,SAAS+L,IAChC1K,KAAKwsB,kBAAkB9hB,GAE3B,IAAIvJ,EAAQ,IAAI+J,YAAY,sBAAuB,CACjD5J,OAAQ,CACNoJ,aAAc1K,KAAKoB,MAAM+iB,qBAG7BkL,EAAkBlkB,cAAchK,OAIpC/E,OAAOqG,iBAAiB,yBAA2BtB,IACjDnB,KAAK8uB,6BAA6B3tB,EAAMG,OAAOgK,cAInD0c,SACE,OACE0H,IAAA7jB,cAAA,OAAKD,MAAO5L,KAAKypB,aAAc5f,UAAU,yBACvC6lB,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAAA,OACE8jB,IAAG,GAAAxxB,OACD6B,KAAKgB,MAAMoP,UACPpQ,KAAKgB,MAAMoP,UACX,6CAENwf,IAAI,QAQD3H,Q,OC9uCf,SAAS4H,EAAe7uB,GAEtB,MAAO8uB,EAASC,GAAcC,oBAAS,GAEjCC,EAA0BH,EAAU9uB,EAAMkvB,SAAS9uB,MAAMwP,mBAAqB5P,EAAMkvB,SAAS9uB,MAAMuP,UAEzG,OACE+e,IAAA7jB,cAAA,OAAKhC,UAAU,sBACf6lB,IAAA7jB,cAAA,OACEhC,UAAS,UAAA1L,OAAY2xB,EAAU,iBAAmB,IAClDlkB,MAAO,CACLwG,gBAAiB3E,EAAanP,qBAAqB2xB,KAGrDP,IAAA7jB,cAAA,SACE9N,KAAK,WACLoyB,SAAUA,KACRJ,GAAYD,GACZ9uB,EAAMkvB,SAASrc,cAAc7S,EAAMovB,aAErCvmB,UAAU,aAEZ6lB,IAAA7jB,cAAA,OACEhC,UAAS,gBAAA1L,OAAkB2xB,EAAU,gBAAkB,OAG1D9uB,EAAMud,MACLmR,IAAA7jB,cAAA,OAAKhC,UAAU,kBAAkB7I,EAAMud,OACrC,MAcO8R,MARqBrvB,GAEhC0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAYR,IAAA7jB,cAACgkB,EAAc7E,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,M,kBCzCxD,MAAMO,UAAqBvI,YAAUnnB,cAAA,SAAAonB,WAAA,KACjC/mB,MAAQ,CACJsvB,UAAU,GAQdC,iBAAiBrqB,EAAcqN,GACxBrN,EAAc3H,SAASgV,GACtB3T,KAAK6C,SAAS,CAAC6tB,UAAU,IAG7B1wB,KAAK6C,SAAS,CAAC6tB,UAAU,IAG7B1I,SACI,OACI0H,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACV+vB,GAENlB,IAAA7jB,cAAA,UACAhC,UAAW7J,KAAKgB,MAAM6vB,YACtBjlB,MAAO,CACHwG,gBAAiBwe,EAAOxvB,MAAMqE,cAAczF,KAAKgB,MAAM8vB,cAAcpjB,aACrEwQ,QAASle,KAAKoB,MAAMsvB,SAAU,EAAG,IAGrCK,QAAStP,gBACCmP,EAAOld,iBAAiB1T,KAAKgB,MAAM8vB,cACzC9wB,KAAK2wB,iBAAiBC,EAAOxvB,MAAMkF,cAActG,KAAKgB,MAAM8vB,gBAI3D9wB,KAAKgB,MAAM8vB,gBAQbL,QCtBAO,MAhBf,SAAwBhwB,GACtB,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,GACAlB,IAAA7jB,cAAC6jB,IAAMuB,SAAQ,KACZL,EAAOxvB,MAAMJ,EAAMkwB,kBAClBlwB,EAAMohB,SACJphB,EAAMmwB,UACRzB,IAAA7jB,cAAA,OAAKD,MAAO,CAAE3C,QAAS,SAAWjI,EAAMohB,UACtC,Q,cCLd,MAAMgP,UAAuBlJ,YAE3BnnB,YAAYC,GACVC,MAAMD,GACNhB,KAAKoB,MAAQ,CACXiwB,UAAU,EACV5qB,YAAa,CACXyJ,IAAK,EACLC,IAAK,KAEPxJ,iBAAkB,CAChBuJ,IAAK,EACLC,IAAK,OAIT/T,OAAOqG,iBAAiB,oBAAsBtB,IAC5CnB,KAAKsxB,uBAAuBnwB,KAQhCmwB,uBAAuBnwB,GACrBnB,KAAK6C,SAAS,CACZ4D,YAAatF,EAAMG,OAAOmF,YAC1BE,iBAAkBxF,EAAMG,OAAOqF,mBAInCqhB,SAAU,IAADuJ,EACP,MAAM,EAAE9R,GAAMzf,KAAKgB,MAEnB,OACE0uB,IAAA7jB,cAAC6jB,IAAMuB,SAAQ,KACTvB,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAAA,MAAIhC,UAAW,gBACb6lB,IAAA7jB,cAAA,YAAO4T,EAAE,UAAUG,eAAsB,IACxCH,EAAE,kBAAkBG,eAEvB8P,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,6BAEjBxB,IAAA7jB,cAACgkB,EAAc,CACbO,WAAY,UACZ7R,MAAOkB,EAAE,WAAWG,iBAIxB8P,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,uBAEjBxB,IAAA7jB,cAACgkB,EAAc,CAACO,WAAY,UAAW7R,MAAOkB,EAAE,WAAWG,iBAE7D8P,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,wBAEjBxB,IAAA7jB,cAACgkB,EAAc,CAACO,WAAY,UAAW7R,MAAOkB,EAAE,WAAWG,iBAE7D8P,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,6BAEjBxB,IAAA7jB,cAACgkB,EAAc,CAACO,WAAY,UAAW7R,MAAOkB,EAAE,WAAWG,iBAE7D8P,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,uBAEjBxB,IAAA7jB,cAACgkB,EAAc,CAACO,WAAY,SAAU7R,MAAOkB,EAAE,UAAUG,iBAG3D8P,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,4BAEjBxB,IAAA7jB,cAACgkB,EAAc,CAACO,WAAY,SAAU7R,MAAOkB,EAAE,UAAUG,iBAE3D8P,IAAA7jB,cAACmlB,EAAc,CACbG,WAAW,EACXD,iBAAiB,uBAEjBxB,IAAA7jB,cAACgkB,EAAc,CAACO,WAAY,SAAU7R,MAAOkB,EAAE,UAAUG,kBAK7D8P,IAAA7jB,cAACmlB,EAAc,CACbE,iBAAiB,uBACjBC,WAAW,GAEXzB,IAAA7jB,cAAA,OAAKhC,UAAU,cACb6lB,IAAA7jB,cAAA,KAAGhC,UAAU,eAAc,OAC3B6lB,IAAA7jB,cAAC2lB,IAAU,CACTC,SAAUzxB,KAAKgB,MAAMkvB,SAAS9uB,MAAMqF,YAAY,GAChDirB,SAAU1xB,KAAKgB,MAAMkvB,SAAS9uB,MAAMqF,YAAY,GAEhDlF,MAAOvB,KAAKoB,MAAMqF,YAClB0pB,SAAW5uB,IACTvB,KAAK6C,SAAS,CAAE4D,YAAalF,IAC7BvB,KAAKgB,MAAMkvB,SAASyB,eAAepwB,GAEnC,MAAMJ,EAAQ,IAAI+J,YAAY,oBACjB3I,SAASC,eAAe,wBAC9B2I,cAAchK,IAEvBywB,iBAAmBrwB,IACjB,MAAMJ,EAAQ,IAAI+J,YAAY,oBACjB3I,SAASC,eAAe,wBAC9B2I,cAAchK,IAEvByK,MAAO,CAAEwG,gBAAiBpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,eAK1D+e,IAAA7jB,cAAA,OAAKhC,UAAU,cACb6lB,IAAA7jB,cAAA,KAAGhC,UAAU,+BAA8B,UAE3C6lB,IAAA7jB,cAAC2lB,IAAU,CACTC,SAAUzxB,KAAKgB,MAAMkvB,SAAS9uB,MAAMuF,iBAAiB,GACrD+qB,SAAU1xB,KAAKgB,MAAMkvB,SAAS9uB,MAAMuF,iBAAiB,GAErDpF,MAAOvB,KAAKoB,MAAMuF,iBAClBwpB,SAAW5uB,IACTvB,KAAK6C,SAAS,CAAE8D,iBAAkBpF,IAClCvB,KAAKgB,MAAMkvB,SAAS2B,oBAAoBtwB,GAExC,MAAMJ,EAAQ,IAAI+J,YAAY,oBACjB3I,SAASC,eACpB,wBAEK2I,cAAchK,IAEvBywB,iBAAmBrwB,IACjB,MAAMJ,EAAQ,IAAI+J,YAAY,oBACjB3I,SAASC,eACpB,wBAEK2I,cAAchK,OAK3BuuB,IAAA7jB,cAAA,OAAKhC,UAAU,kBACb6lB,IAAA7jB,cAAA,UAAK4T,EAAE,QAAQG,gBAEjB8P,IAAA7jB,cAAA,OAAKhC,UAAU,cAC8B,QADlB0nB,EACxBvxB,KAAKgB,MAAMkvB,SAAS9uB,MAAMwL,wBAAgB,IAAA2kB,OAAA,EAA1CA,EAA4C1X,IAAIlG,GAE7C+b,IAAA7jB,cAAC4kB,EAAY,CACXpxB,IAAKsU,EACLmd,aAAcnd,EACdkd,YAAW,qBAmBlBiB,oBARqB9wB,GAEhC0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAYR,IAAA7jB,cAACulB,EAAcpG,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,OCpJzC6B,MApCf,SAAoB/wB,GAAQ,IAADgxB,EACzB,MAAM,EAAEvS,GAAMwS,cAEd,OACEvC,IAAA7jB,cAAA,OACEhC,UAAU,aACV+B,MAAO,CACL2O,OAAO,GAADpc,OACJ6C,EAAM4L,iBACF,KAAO5L,EAAM4L,iBAAiBpN,OAAS,GACvC,GAAE,KAERyJ,QAAQ,GAAD9K,QACiB,QAAtB6zB,EAAAhxB,EAAM4L,wBAAgB,IAAAolB,OAAA,EAAtBA,EAAwBrzB,SAASqC,EAAMjD,OAAQ,OAAS,UAI5D2xB,IAAA7jB,cAAA,OAAKhC,UAAU,eACZ,IACD6lB,IAAA7jB,cAAA,OACEhC,UAAS,GAAA1L,OAAK6C,EAAMjD,KAAK4e,cAAa,SACtC/Q,MAAO,CACLwG,gBAAiBpR,EAAMyE,cAAczE,EAAMjD,MAAM2P,gBAE7C,KAEVgiB,IAAA7jB,cAAA,OAAKhC,UAAU,eACb6lB,IAAA7jB,cAAA,SAAI7K,EAAMjD,MACV2xB,IAAA7jB,cAAA,SACG4T,EAAE,aAAa,IAACiQ,IAAA7jB,cAAA,WAAM,IAAE7K,EAAMjD,KAAK,GAAG,IAAiB,OAAfiD,EAAMjD,KAAgB0hB,EAAE,SAAWA,EAAE,c,OC3BzE,SAASyS,EAAOlxB,GAC7B,OACE0uB,IAAA7jB,cAAA,OAAKhC,UAAU,oBACZ7I,EAAM4L,iBACH5L,EAAM4L,iBAAiBiN,IAAKlG,GAE1B+b,IAAA7jB,cAACkmB,EAAU,CACT1yB,IAAKsU,EACL/G,iBAAkB5L,EAAM4L,iBACxBnH,cAAezE,EAAMyE,cACrB1H,KAAM4V,KAIV,MCqCK,UAvDf,MAQIwe,eAAellB,EAAS2jB,EAAQwB,GAC5BnlB,EAAQV,QAAQ8lB,IACZryB,KAAKsyB,cAAcD,EAAQzB,EAAQwB,KAU3CE,cAAcD,EAAQzB,EAAQwB,GACtBA,IAAcC,EAAOE,YAGF,cAAnBF,EAAO3T,SAAmD,gBAAxB2T,EAAOG,cAMjB,YAAxBH,EAAOG,eACPp2B,OAAOC,SAAWg2B,EAAOnlB,WAKe,QAAxCmlB,EAAOG,aAAazyB,UAAU,EAAG,IACjC6wB,EAAOyB,EAAOG,gBAIU,gBAAxBH,EAAOG,cACP5B,EAAOxb,kBAAkBid,EAAO3T,SAAS,GAEjB,gBAAxB2T,EAAOG,cACP5B,EAAOxb,kBAAkBid,EAAO3T,SAAS,GAGjB,qBAAxB2T,EAAOG,cACP5B,EAAOnd,oBAxBPmd,EAAO5c,2BAA2Bqe,EAAOnlB,cCnBrD,MAAMulB,UAAqBvK,YAAUnnB,cAAA,SAAAonB,WAAA,KACnC/mB,MAAQ,CACNsxB,WAAW,GAGb1K,SACE,MAAMhb,EAAShN,KAAKgB,MAAM2xB,YACpB,cAAEC,GAAkB5yB,KAAKgB,MAW/B,OACE0uB,IAAA7jB,cAAA,UACEhC,UAAS,iBAAA1L,OAAmB6B,KAAKgB,MAAM6vB,aACvCjlB,MAAO,CACLqT,gBAAgB,OAAD9gB,OACb6B,KAAKoB,MAAMsxB,WACP1lB,EAAO6lB,aACL7lB,EAAO6lB,aAET7lB,EAAO8lB,QAAO,KAEpB1gB,gBApByBvI,IACX,8CAAdA,GAA6D7J,KAAKoB,MAAMsxB,UACnEjlB,EAAanP,qBAAqB0B,KAAKgB,MAAMkvB,SAAS9uB,MAAMwP,oBAGnE5Q,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,UAePoiB,CAAsB,iBAAD50B,OAAkB6B,KAAKgB,MAAM6vB,cACnEnR,SAAS,GAADvhB,OAAKy0B,EAAcpzB,OAAO,EAAE,GAAG,GAAE,OAE3CH,IAAK2N,EAAOG,KACZ4jB,QAASA,KACPiC,EAAmBb,eACjBnlB,EAAOC,QACPjN,KAAKgB,MAAMkvB,SACX,UAGJ+C,aAAcA,KACZjzB,KAAK6C,SAAS,CAAE6vB,WAAW,IAC3BM,EAAmBb,eACjBnlB,EAAOC,QACPjN,KAAKgB,MAAMkvB,SACX,eAGJgD,aAAcA,KACZlzB,KAAK6C,SAAS,CAAE6vB,WAAW,IAC3BM,EAAmBb,eACjBnlB,EAAOC,QACPjN,KAAKgB,MAAMkvB,SACX,gBAIH0C,IAcMO,MARmBnyB,GAE9B0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAYR,IAAA7jB,cAAC4mB,EAAYzH,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,MCpEtD,MAAMkD,UAAyBlL,YAAUnnB,cAAA,SAAAonB,WAAA,KACvC/mB,MAAQ,CACNiyB,YAAY,GAOdC,sBACE,IAAItzB,KAAKgB,MAAMoN,cAAe,OAC9B,MAAMmlB,EAAkBvzB,KAAKgB,MAAMoN,cAAcuF,OAAQ3G,GAAyC,cAA9BA,EAAOC,QAAQ,GAAGyR,SAA2B1R,EAAOwmB,WAErE,MAAnBp3B,OAAO8c,WAAqB,IAEjC,GAAKqa,EAAgB/zB,OAC9CQ,KAAK6C,SAAS,CAACwwB,YAAY,IAG7BrzB,KAAK6C,SAAS,CAACwwB,YAAY,IAQ7BI,mBAAmBC,EAAgBtnB,GACjC,IAAK,IAAIrN,EAAI,EAAGA,EAAIqN,EAAO5M,OAAQT,IAAK,CACtC,MAAMqC,EAAQgL,EAAOrN,GACrB,GAAGqC,EAAM+L,OAASumB,EAChB,OAAOtyB,EAAMiS,IAYnBsgB,eAAetB,EAAOntB,EAAakH,GACjC,IAAIimB,EAAQ,OAAO,EACnB,MAAMuB,EAAyB5zB,KAAKyzB,mBAAmBpB,EAAOnlB,UAAUd,GACxE,SAAIimB,GAAUntB,IAAiB0uB,IACtB,8BAKXC,oBACEz3B,OAAOqG,iBAAiB,oBAAoB,KAC1CzC,KAAKszB,wBAGPl3B,OAAOqG,iBAAiB,SAAS,KAC/BzC,KAAKszB,wBAKTtL,SACE,IAAI,WAAEqL,GAAerzB,KAAKoB,MAC1B,OACEsuB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,IAAM,IAAAkD,EAAA,OACNpE,IAAA7jB,cAAA,OACAwH,GAAG,YACDxJ,UAAWwpB,EAAY,aAAa,IAEtC3D,IAAA7jB,cAAA,OACEhC,UAAS,4BAEgB,QAFaiqB,EAErC9zB,KAAKgB,MAAMoN,qBAAa,IAAA0lB,OAAA,EAAxBA,EACOngB,OAAQ3G,GAAyC,cAA9BA,EAAOC,QAAQ,GAAGyR,SAA2B1R,EAAOwmB,WACxE3Z,IAAK7M,GAEF0iB,IAAA7jB,cAAC4mB,EAAY,CACXpzB,IAAK2N,EAAOG,KACZylB,cAAe5lB,EAAO+mB,KACtBpB,WAAY3lB,EACZ6jB,YACE7wB,KAAK2zB,eAAe3mB,EAAOC,QAAQ,GAAG2jB,EAAOxvB,MAAM8D,aAAa0rB,EAAOxvB,MAAMsC,SAAS0I,QAAS,8BAC7F,iBAcbgnB,QCjGf,MAAMY,UAAsB9L,YAAUnnB,cAAA,SAAAonB,WAAA,KACpC/mB,MAAQ,CACNsxB,WAAW,GACX,KAEFuB,mBAAqB,CAACjnB,EAAQknB,IACzBlnB,EAAO8lB,QACH,CACL7T,gBAAgB,OAAD9gB,OACb6B,KAAKoB,MAAMsxB,WACP1lB,EAAO6lB,aACL7lB,EAAO6lB,aAET7lB,EAAO8lB,QAAO,MAInBoB,EACQ,CACLjV,gBAAgB,OAAD9gB,OAAS+1B,EAAkB,MAG7B,eAAhBlnB,EAAOG,KACD,CACLgnB,MACEn0B,KAAKgB,MAAMkvB,SAAS9uB,MAAMmH,SAAS/I,OAAS,EAAI,OAAS,QAIxD,CACLyJ,QAAS,QACTmJ,gBAAgB,GAADjU,OACb6B,KAAKgB,MAAMoR,gBACP3E,EAAanP,qBAAqB0B,KAAKgB,MAAMoR,iBAC7C,OAMV4V,SACE,OACE0H,IAAA7jB,cAAC6jB,IAAMuB,SAAQ,UAC8BhvB,IAA5CjC,KAAKgB,MAAMkvB,SAAS9uB,MAAMgN,cACvBpO,KAAKgB,MAAMkvB,SAAS9uB,MAAMgN,cAAcyL,IAAK7M,GACvCA,EAAOG,OAASnN,KAAKgB,MAAMozB,YAAepnB,EAAO0jB,SAInDhB,IAAA7jB,cAAA,UACExM,IAAK2N,EAAOG,KACZvB,MAAO5L,KAAKi0B,mBAAmBjnB,EAAQhN,KAAKgB,MAAMie,iBAClDpV,UAAW7J,KAAKgB,MAAM6vB,YACtBE,QAASA,KACPiC,EAAmBb,eACjBnlB,EAAOC,QACPjN,KAAKgB,MAAMkvB,SACX,UAGJ+C,aAAcA,KACZjzB,KAAK6C,SAAS,CAAC6vB,WAAW,IAC1BM,EAAmBb,eACjBnlB,EAAOC,QACPjN,KAAKgB,MAAMkvB,SACX,eAGJgD,aAAcA,KACZlzB,KAAK6C,SAAS,CAAC6vB,WAAW,IAC1BM,EAAmBb,eACjBnlB,EAAOC,QACPjN,KAAKgB,MAAMkvB,SACX,gBAGJljB,EAAO+mB,MA9BF,MAiCX,OAcKM,MARoBrzB,GAE/B0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAYR,IAAA7jB,cAACmoB,EAAahJ,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,MCtFvD,SAASoE,EAAWtzB,GAClB,MAAOuzB,EAAeC,GAAoBxE,oBAAS,IAE7C,SAAEyE,GAAazzB,GACf,EAAEye,GAAMwS,cAERhc,EAAWC,EAAaP,iBAExB+e,EAAS,CACbC,UAAWJ,EAAgBvzB,EAAMkvB,SAAS9uB,MAAMuP,UAAY,UAC5DuN,QAASqW,EAAgB,EAAI,GAC7BniB,gBAAiBqiB,EACbzzB,EAAMkvB,SAAS9uB,MAAMuP,UACrB3P,EAAMkvB,SAAS9uB,MAAMwP,mBACzBgkB,KAAMH,EAAW,OAAS,OAC1BrV,OAAQqV,EAAW,UAAY,WAkBjC,OACE/E,IAAA7jB,cAAA,OACEklB,QAjBJ,WACM0D,GACJzzB,EAAMkvB,SAAS9a,kBAAkB,yBAAyB,IAgBxD6d,aAbJ,WACMwB,GACJD,GAAiB,IAYftB,aATJ,WACMuB,GACJD,GAAiB,IAQf3qB,UAAU,YACV+B,MAAO,CACLwG,gBAAiB6D,EACfxI,EAAanP,qBAAqB0C,EAAMkvB,SAAS9uB,MAAMwP,oBACvD5P,EAAMkvB,SAAS9uB,MAAMwP,mBACvBwO,OAAQsV,EAAOtV,SAGjBsQ,IAAA7jB,cAAA,OACEgpB,KACEJ,EACIhnB,EAAanP,qBAAqB0C,EAAMkvB,SAAS9uB,MAAMuP,WACvD+jB,EAAOC,UAEb/oB,MAAO,CAAEkpB,UAAWL,EAAW,MAAQ,KACvCvW,QAASuW,EAAW,EAAIC,EAAOxW,QAC/B5D,MAAOoa,EAAOE,KACdra,OAAQma,EAAOE,KACfG,QAAQ,gBACRC,MAAM,8BAENtF,IAAA7jB,cAAA,QACEopB,EAAE,+kBACFC,YAAU,aAGdxF,IAAA7jB,cAAA,KACED,MAAO,CAAEsS,QAASuW,EAAW,EAAIC,EAAOxW,SACxCrU,UAAU,kBAET4V,EAAE,aAAaG,gBAcTuV,OARf,SAAgCn0B,GAC9B,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACyoB,EAAUtJ,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,O,OCrEtD,MAAMkF,WAAelN,YACpBnnB,YAAYC,GACXC,MAAMD,GACNhB,KAAKoB,MAAQ,CACZi0B,QAAQ,EACRC,uBAAwB,CACvBhsB,MAAM,EACNC,UAAU,EACVC,QAAQ,EACRC,MAAO,IACPC,aAAc,EACdC,eAAgB,EAEhB4rB,UAAU,EACVC,iBAAiB,IAUpB,8BAA8BvhB,EAAW7H,GACxC,IAAK,IAAIrN,EAAI,EAAGA,EAAIqN,EAAO5M,OAAQT,IAAK,CACvC,MAAMqC,EAAQgL,EAAOrN,GACrB,GAAIqC,EAAM+L,OAAS8G,EAClB,OAAO7S,EAAMiS,GAGf,OAAO,KASR,kCAAkCjF,EAAelJ,EAAckH,GAC9D,MAAMqpB,EAAkBlzB,SAASC,eAAe,aAC1C+wB,EAA+B,OAAbnlB,QAAa,IAAbA,OAAa,EAAbA,EAAeuF,OACrC3G,IAAYA,EAAOwmB,WAGrB,IAAK,IAAIzkB,EAAQ,EAAGA,EAAQwkB,EAAgB/zB,OAAS,EAAGuP,IAAS,CAChE,MAAM/B,EAASumB,EAAgBxkB,GAC/B,QAAe9M,IAAX+K,QAA8C/K,IAAtB+K,EAAOC,QAAQ,GAAkB,OAE7D,MAAMyoB,QAAkB11B,KAAK21B,wBAC5B3oB,EAAOC,QAAQ,GAAGC,UAClBd,GAED,GAAkB,OAAdspB,EAAoB,OAExB,GAAIA,IAAcxwB,EAAc,CAC/B,MAAM0wB,EAC0B,IAA9BrC,EAAgB/zB,OAAS,GAAkB,GAARuP,EACrC0mB,EAAgBI,SAAS,CACxBzV,IAAKwV,EACLzV,KAAM,EACN2V,SAAU,aAMd9N,SACC,MAAM/R,EAAWC,EAAaP,kBACxB,EAAE8J,GAAMzf,KAAKgB,MACb+0B,EAA8B9f,EACjC,GACAxI,EAAanP,qBACb0B,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,WAG7B,OAAQ3Q,KAAKgB,MAAMkvB,SAAS9uB,MAAM4P,eACjC0e,IAAA7jB,cAAA,OACCwH,GAAI,YACJxJ,UAAW,aACX+B,MAAO,CACNoqB,UAAU,cAAD73B,OACR6B,KAAKgB,MAAMkvB,SAAS9uB,MAAMgD,cACvB,MACA,SAAQ,OAIbsrB,IAAA7jB,cAAA,OACChC,UAAU,6BACV+B,MAAO,CACNwG,gBAAiB2jB,IAGlBrG,IAAA7jB,cAAA,OACChC,UAAU,YACV+B,MAAO,CACNwG,gBAAiBpS,KAAKgB,MAAMkvB,SAASvf,YAGtC+e,IAAA7jB,cAAA,OACChC,UAAU,mBACV+B,MAAO,CACNqT,gBAAgB,OAAD9gB,OACd6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM2P,YACvB/Q,KAAKgB,MAAMkvB,SAAS9uB,MAAM2P,YAC1B,GAAE,QAIR2e,IAAA7jB,cAAA,OAAKhC,UAAU,wBACd6lB,IAAA7jB,cAACyoB,GAAU,OAEXre,EACAyZ,IAAA7jB,cAAA6jB,IAAAuB,SAAA,MAEAvB,IAAA7jB,cAAA,UACChC,UAAU,mBACVknB,QAASA,KACR/wB,KAAKgB,MAAMkvB,SAASllB,mBAGrB0kB,IAAA7jB,cAAA,SAAI4T,EAAE,QAAQG,eACd8P,IAAA7jB,cAAA,WACA6jB,IAAA7jB,cAAA,OACC8jB,IAAI,0CACJC,IAAI,GACJhkB,MAAO,CACNoqB,UAAU,UAAD73B,OACP6B,KAAKgB,MAAMkvB,SAAS9uB,MACnBgD,eAEE,GADD,GACG,aAOZsrB,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,uBAChCxB,IAAA7jB,cAAA,OACChC,UAAU,oBACV+B,MAAO,CACNqT,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM0P,WAAU,UAKhE4e,IAAA7jB,cAAA,OACChC,UAAU,gBACV+B,MAAO,CACNwG,gBAAiBpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,YAG5C+e,IAAA7jB,cAACqmB,EAAM,CACNtlB,iBACC5M,KAAKgB,MAAMkvB,SAAS9uB,MAAMwL,iBAE3BnH,cAAezF,KAAKgB,MAAMkvB,SAAS9uB,MAAMqE,gBAE1CiqB,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,qBAChCxB,IAAA7jB,cAACulB,EAAc,CACd6E,kBACCj2B,KAAKgB,MAAMkvB,SAAS9uB,MAAMuF,iBAE3BzB,aACClF,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,aAE3BgxB,cACCl2B,KAAKgB,MAAMkvB,SAAS9uB,MAAMqF,gBAK9BipB,IAAA7jB,cAAA,OAAKhC,UAAU,UACd6lB,IAAA7jB,cAAA,OACChC,UAAU,uBACV+B,MAAO,CACNwG,gBACCpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,YAG5B+e,IAAA7jB,cAACmoB,EAAa,CACbnD,YAAY,cACZuD,WAAW,SAEZ1E,IAAA7jB,cAAA,UACChC,UAAU,YACVknB,QAAStP,gBACFzhB,KAAKgB,MAAMkvB,SAASlb,uBAC1BhV,KAAKm2B,4BACJn2B,KAAKgB,MAAMkvB,SAAS9uB,MAAMgN,cAC1BpO,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,aAC1BlF,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAAS0I,YAKvCsjB,IAAA7jB,cAACunB,EAAgB,CAChBhlB,cAAepO,KAAKgB,MAAMkvB,SAAS9uB,MAAMgN,gBAE1CshB,IAAA7jB,cAAA,OACChC,UAAU,yBACV+B,MAAO,CACNwG,gBACCpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,YAG5B+e,IAAA7jB,cAAA,UACChC,UAAU,cACVknB,QAAStP,gBACFzhB,KAAKgB,MAAMkvB,SAAS/a,uBAC1BnV,KAAKm2B,4BACJn2B,KAAKgB,MAAMkvB,SAAS9uB,MAAMgN,cAC1BpO,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,aAC1BlF,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAAS0I,WAKrCpM,KAAKgB,MAAMkvB,SAAS9uB,MAAM4G,gBAC1B0nB,IAAA7jB,cAAA,OACChC,UAAU,4BACV8lB,IACC3vB,KAAKgB,MAAMkvB,SAAS9uB,MAClBkG,oBAEHsoB,IAAI,yBAvJyC,MAyKtCkC,sBARf,SAA4B9wB,GAC3B,OACC0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAaR,IAAA7jB,cAACupB,GAAMpK,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,S,OCzP/C,MAAMkG,WAA0BlO,YAAUnnB,cAAA,SAAAonB,WAAA,KACxC/mB,MAAQ,GAER4mB,SACE,OACE0H,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,GACAlB,IAAA7jB,cAAA,OAAKhC,UAAU,wBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,eACb6lB,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,mBAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZnD,YAAY,YACZuD,WAAW,kBAIjB1E,IAAA7jB,cAAA,OAAKhC,UAAU,eACb6lB,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,qBAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZnD,YAAY,cACZuD,WAAW,qBAGf1E,IAAA7jB,cAAA,OAAKhC,UAAU,oBAAoB8lB,IAAI,mCAAmCC,IAAI,KAC9EF,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,sBAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZnD,YAAY,eACZuD,WAAW,uBAIjB1E,IAAA7jB,cAAA,OAAKhC,UAAU,eACb6lB,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,qBAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZnD,YAAY,cACZuD,WAAW,uBAWdgC,U,gBC3Cf,MAAMC,GAAiBC,wBACrBC,yBAAev1B,GACb0uB,IAAA7jB,cAAC2qB,aAAS,CACRC,YAAaz1B,EAAMy1B,YACnBC,cAAe,CAAEC,IAAK31B,EAAM01B,cAAcC,IAAKC,IAAK51B,EAAM01B,cAAcE,MAEvE51B,EAAM61B,eACLnH,IAAA7jB,cAACirB,UAAM,CACLC,kBAAkB,EAClBC,KAAM,CAAEC,IAA2B,KAAtBj2B,EAAMk2B,iBAAqBj1B,EAAYjB,EAAMk2B,aAC1DxiB,SAAU,CACRiiB,IAAK31B,EAAM01B,cAAcC,IACzBC,IAAK51B,EAAM01B,cAAcE,UAQrC,MAAMO,WAAgBjP,YAAUnnB,cAAA,SAAAonB,WAAA,KAC9B/mB,MAAQ,CACNg2B,OAAQ,2CAEVpP,SACE,OACE0H,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,GACAlB,IAAA7jB,cAAA,OAAKhC,UAAU,iBACb6lB,IAAA7jB,cAAA,UACEhC,UAAU,cACVknB,QAASA,IAAMH,EAAOzd,sBAGqBlR,IAA3C2uB,EAAOxvB,MAAMqP,cAAcgmB,YAEzB/G,IAAA7jB,cAACwqB,GAAc,CACbI,YAAa7F,EAAOxvB,MAAMqP,cAAcgmB,YACxCC,cAAe,CAAEC,IAAK/F,EAAOxvB,MAAMqP,cAAc4mB,SAAUT,IAAKhG,EAAOxvB,MAAMqP,cAAc6mB,WAC3FJ,YAAatG,EAAOxvB,MAAMqP,cAAc8mB,WACxCV,eAAe,EACfW,aAAY,+CAAAr5B,OAAiD6B,KAAKoB,MAAMg2B,OAAM,sCAC9EK,eAAgB/H,IAAA7jB,cAAA,OAAKD,MAAO,CAAE2O,OAAO,SACrCmd,iBAAkBhI,IAAA7jB,cAAA,OAAKD,MAAO,CAAE2O,OAAO,SACvCod,WAAYjI,IAAA7jB,cAAA,OAAKD,MAAO,CAAE2O,OAAO,YAGnC,QASD4c,U,OC7Df,MAAMS,WAAgB1P,YAAUnnB,cAAA,SAAAonB,WAAA,KAC9B/mB,MAAQ,GAKRy2B,mBACE,MAAMC,GACuB,QAA3B93B,KAAKgB,MAAMoG,aAA0BpH,KAAKgB,MAAMqG,qBAClD,OAAO9D,KAAKw0B,MAAMD,GAIpB9P,SACE,MAAM/R,EAAWC,EAAaP,iBAExBqiB,EACJh4B,KAAKgB,MAAMkvB,SAAS9uB,MAAMmH,SAAS/I,OAAS,EAAC,GAAArB,OACtC8X,EAAW,OAAS,OAAM,gBAAA9X,OAC1B8X,EAAW,OAAS,OAAM,aAEnC,OACEyZ,IAAA7jB,cAAA,OACEhC,UAAU,oBACV+B,MAAO,CAAEqsB,QAASD,IAEpBtI,IAAA7jB,cAAA,OACEhC,UAAU,gBACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM+P,aAAY,KAC9D6kB,UAAU,UAAD73B,OAAY6B,KAAK63B,mBAAkB,UAG9CnI,IAAA7jB,cAAA,OACEhC,UAAU,kBACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM6P,eAAc,WAiB7DinB,OARcl3B,GAEzB0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAYR,IAAA7jB,cAAC+rB,GAAO5M,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,M,mDCvDzC,MAAMiI,GACC,Y,OCuDAC,OAjDIp3B,IAClB,OAAO,WAAE4B,GAAcy1B,GAAQC,aAAQ,CACtCva,KAAM,CACLhgB,KAAMo6B,GACN9kB,GAAIrS,EAAMqS,GACVlG,KAAMnM,EAAMmM,KACZyB,WAAY5N,EAAM4N,WAClB2pB,UAAWv3B,EAAMu3B,UACjBlX,cAAergB,EAAMjD,MAEtBy6B,QAAUC,IAAO,CAChB71B,aAAc61B,EAAQ71B,kBAIlB,EAAE6c,GAAMwS,cAEd,OACCvC,IAAA7jB,cAAA,OAAKhC,UAAU,YAAY6uB,IAAKL,GAC/B3I,IAAA7jB,cAAA,OACChC,UAAU,wBACV8lB,IAAI,iCACJoB,QAASA,KACR/vB,EAAM23B,gBAAgB33B,EAAMqS,KAE7Buc,IAAI,KAELF,IAAA7jB,cAAA,OACChC,UAAU,2BACV+B,MAAO,CACNsS,QAAStb,EAAa,MAAQ,MAC9Bg2B,cAAe,SAGhBlJ,IAAA7jB,cAAA,KAAGhC,UAAU,iCACX,IACA4V,EAAE,aAAc,KAElBiQ,IAAA7jB,cAAA,KAAGhC,UAAU,+BAA8B,IAAE7I,EAAMmM,KAAK,KACxDuiB,IAAA7jB,cAAA,KAAGhC,UAAU,iCAAgC,IAAE7I,EAAMjD,KAAK,KAC1D2xB,IAAA7jB,cAAA,KAAGhC,UAAU,uCACX,IACA7I,EAAM4N,WAAW,KAAE8gB,IAAA7jB,cAAA,WAAK,KAAQ,Q,UCuBvBgtB,OAjEa73B,IACxB,MAAO83B,EAAiBC,GAAgB/I,mBAAS,OAC1C7iB,EAAM6rB,GAAWhJ,mBAAS,KAC1B3V,EAAO4e,GAAYjJ,mBAAS,KAC5BjyB,EAAMm7B,GAAWlJ,mBAAS,KAC1BphB,EAAYuqB,GAAiBnJ,mBAAS,KACtCoJ,EAAYC,GAAiBrJ,mBAAS,KAEtC,OAAEsJ,GAAUC,GAAQC,aAAQ,CAC/BC,OAAQtB,GACRoB,KAAMA,CAACxb,EAAM0a,KACTM,EAAahb,EAAK1K,IAClB4lB,EAASlb,EAAK2b,oBACdR,EAAQnb,EAAKsD,eACb8X,EAAcpb,EAAKnP,YACnBoqB,EAAQjb,EAAK5Q,MACbnM,EAAMoS,mBAAmB2K,EAAK1K,GAAIrS,EAAM24B,SAE5CnB,QAAUC,IAAO,CAAQa,SAAUb,EAAQa,aAI/C,OACI5J,IAAA7jB,cAAA,OAAK6sB,IAAKa,EAAM1vB,UAAU,wBACrB7I,EAAM44B,MACHlK,IAAA7jB,cAAA,OAAKhC,UAAU,kBACX6lB,IAAA7jB,cAAA,QAAMhC,UAAU,YAAW,eAC3B6lB,IAAA7jB,cAAA,QAAMhC,UAAU,WAAU,IAAE7I,EAAMihB,cAAc9U,MAChDuiB,IAAA7jB,cAAA,QAAMhC,UAAU,YAAY7I,EAAMihB,cAAclkB,MAChD2xB,IAAA7jB,cAAA,QAAMhC,UAAU,YACX7I,EAAMihB,cAAcrT,WAAW,KAAE8gB,IAAA7jB,cAAA,WAAK,OAG/C,KAGA6jB,IAAA7jB,cAAA,OACID,MAAO,CACH8I,SAAU,WACV6F,OAAQ,OACRD,MAAO,OACPuf,SAAU,SAGdnK,IAAA7jB,cAAA,UACIhC,UAAU,0BACVknB,QAASA,KACL/vB,EAAM84B,sBAAsB94B,EAAM24B,QAClCZ,EAAa,MACbE,EAAS,MACTC,EAAQ,QAEf,KAGDxJ,IAAA7jB,cAAA,UACIwH,GAAE,aAAAlV,OAAe6C,EAAM24B,QACvB/tB,MAAO5K,EAAM4K,W,OC1DrC,MAAMmuB,WAA0B7R,YAC9BnnB,cACEE,QAAQ,KAWV+4B,oBAAuBC,IACrBj6B,KAAK6C,SAAS,CAAEq3B,aAAcD,KAC9B,KAEFE,sBAAwB,KACtBn6B,KAAKg6B,oBAAoBh6B,KAAKoB,MAAMg5B,YAAYpxB,IAChDhJ,KAAKq6B,kBAAkB,OACvB,KAEFC,sBAAwB,KACtBt6B,KAAKg6B,oBAAoBh6B,KAAKoB,MAAMg5B,YAAYlxB,IAChDlJ,KAAKq6B,kBAAkB,OAGzB,KAIAA,kBAAqBE,IACnB,MAAMC,EAAa,CACjBC,cAAeA,KACbz6B,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BkG,oBAAqB,IAChB/I,KAAKgB,MAAMkvB,SAASnnB,oBACvB,CAACwxB,GAAgB,CAAEtxB,QAAS,WAIV,OAAlBsxB,GACFv6B,KAAK06B,yBAAyB,SAGlCC,eAAgBA,KACd36B,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BuG,qBAAsB,IACjBpJ,KAAKgB,MAAMkvB,SAAS9mB,qBACvB,CAACmxB,GAAgB,CAAEtxB,QAAS,WAIV,OAAlBsxB,GACFv6B,KAAK06B,yBAAyB,WAKpC,GAAIF,EAAWx6B,KAAKgB,MAAM45B,iBACxB,OAAOJ,EAAWx6B,KAAKgB,MAAM45B,oBAGjC,KAIAF,yBAA4BG,IACF,SAApBA,GACF76B,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BiG,8BAA8B,IAIV,UAApB+xB,GACF76B,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BsG,+BAA+B,KAxEnCnJ,KAAKoB,MAAQ,CACXg5B,YAAa,CACXpxB,GAAI,KACJE,GAAI,MAENgxB,aAAc,MAwElBlS,SACE,OACE0H,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,QAAMhC,UAAU,aAAY,MAC5B6lB,IAAA7jB,cAAA,QAAMhC,UAAU,aAAY,QAC5B6lB,IAAA7jB,cAAA,OACEhC,UAAS,2EAAA1L,OAGL6B,KAAKoB,MAAM84B,eAAiBl6B,KAAKoB,MAAMg5B,YAAYpxB,IACnD,iBAEJ+nB,QAAS/wB,KAAKm6B,yBAGlBzK,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,OACEhC,UAAS,wDAAA1L,OAEP6B,KAAKoB,MAAM84B,eAAiBl6B,KAAKoB,MAAMg5B,YAAYlxB,IACnD,iBAEF6nB,QAAS/wB,KAAKs6B,wBAEhB5K,IAAA7jB,cAAA,QAAMhC,UAAU,aAAY,MAC5B6lB,IAAA7jB,cAAA,QAAMhC,UAAU,aAAY,WAevBixB,OARwB95B,GAEnC0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACkuB,GAAiB/O,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,MC2C9C6K,OAnKf,MACEh6B,YAAY0V,EAAQS,GAAW,KAkB/B8jB,aAAe,KACbh7B,KAAKi7B,iBACLj7B,KAAKk7B,gBACLl7B,KAAKm7B,kBACL,KAEFA,eAAiB,KACfn7B,KAAKkX,SAAS+S,WAAWmR,YAAc,IAAMp7B,KAAKq7B,aAClD,KAEFA,UAAY,KACVr7B,KAAKs7B,YAAct7B,KAAKu7B,cACnBv7B,KAAKkX,SAAS+S,WAAWre,MAAMwT,OAAS,aACxCpf,KAAKkX,SAAS+S,WAAWre,MAAMwT,OAAS,WAC7C,KAEFoc,2BAA6B,KAC3Bx7B,KAAKyW,OAAO/B,SAASyX,EAAInsB,KAAKy7B,sBAAsBtP,EACpDnsB,KAAKyW,OAAO/B,SAAS0X,EAAIpsB,KAAKy7B,sBAAsBrP,EACpDpsB,KAAKyW,OAAO/B,SAASgnB,EAAI17B,KAAKy7B,sBAAsBC,GACpD,KAEFR,cAAgB,KACdl7B,KAAKkX,SAAS+S,WAAW0R,YAAex6B,IACtC,MAAM,QAAEiB,EAAO,QAAEC,GAAYlB,EAC7BnB,KAAK47B,YAAYC,cAAe,EAChC,MAAM,EAAE1P,EAAC,EAAEC,GAAMpsB,KAAK87B,+BAA+B15B,EAASC,GAC9DrC,KAAK47B,YAAYG,UAAY,CAAE5P,IAAGC,MAGpCpsB,KAAKkX,SAAS+S,WAAW+R,YAAe76B,IACtC,GAAInB,KAAK47B,YAAYC,cAAgB77B,KAAKs7B,YAAct7B,KAAKu7B,cAAe,CAC1E,MAAM,QAAEn5B,EAAO,QAAEC,GAAYlB,GACvB,EAAEgrB,EAAC,EAAEC,GAAMpsB,KAAK47B,YAAYG,WAC1B5P,EAAG8P,EAAM7P,EAAG8P,GAASl8B,KAAK87B,+BAChC15B,EACAC,GAEFrC,KAAK47B,YAAYG,UAAY,CAAE5P,EAAG8P,EAAM7P,EAAG8P,GAC3Cl8B,KAAKyW,OAAO0lB,WAAWhQ,EAAI8P,GAC3Bj8B,KAAKyW,OAAO2lB,WAAWhQ,EAAI8P,KAI/Bl8B,KAAKkX,SAAS+S,WAAWoS,UAAY,KACnCr8B,KAAK47B,YAAYC,cAAe,IAElC,KAEFC,+BAAiC,CAACQ,EAAIC,KACpC,MAAM,EAAEb,GAAM17B,KAAKyW,OAAO/B,SAC1B,OAAO1U,KAAKw8B,+BAA+BF,EAAIC,EAAIb,IACnD,KAEFT,eAAiB,KACfj7B,KAAKkX,SAAS+S,WAAWwS,QAAWt7B,IAClCA,EAAMqT,iBACNxU,KAAK0qB,KAAKvpB,KAEZ,KAEFu7B,mCAAqC,CAACJ,EAAIC,KACxC,MAAMnlB,EAASpX,KAAKkX,SAAS+S,WAG7B,MAAO,CAAE0S,SAFSL,EAAKllB,EAAOwlB,YAAe,EAAI,EAE9BC,UADAN,EAAKnlB,EAAO0lB,aAAgB,EAAI,IAEnD,KAEFC,aAAe,IACN/8B,KAAKg9B,wBAAwBh9B,KAAKyW,OAAO/B,SAASgnB,GACzD,KAEFuB,4BAA8B,CAACX,EAAIC,KACjC,MAAM,EAAEb,GAAM17B,KAAKyW,OAAO/B,SAC1B,OAAO1U,KAAKk9B,4BAA4BZ,EAAIC,EAAIb,IAChD,KAEFyB,sCAAwC,CAACb,EAAIC,KAC3C,MAAMnlB,EAASpX,KAAKkX,SAAS+S,WAG7B,MAAO,CAAE0S,SAFQL,EAAKllB,EAAOwlB,YAEVC,SADF,EAAIN,EAAKnlB,EAAO0lB,eAEjC,KAEFN,+BAAiC,CAACF,EAAIC,EAAIa,KACxC,MAAM,SAAET,EAAQ,SAAEE,GAAa78B,KAAKm9B,sCAClCb,EACAC,IAEI,MAAEjiB,EAAK,OAAEC,GAAWva,KAAKg9B,wBAAwBI,GAGvD,MAAO,CAAEjR,EAFI7R,EAAQqiB,EAEHvQ,EADL7R,EAASsiB,IAEtB,KAEFK,4BAA8B,CAACZ,EAAIC,EAAIa,KACrC,MAAM,SAAET,EAAQ,SAAEE,GAAa78B,KAAK08B,mCAClCJ,EACAC,IAEI,EAAEpQ,EAAC,EAAEC,GAAMpsB,KAAKyW,OAAO/B,UACvB,MAAE4F,EAAK,OAAEC,GAAWva,KAAKg9B,wBAAwBI,GAGvD,MAAO,CAAEjR,EAFIA,EAAK7R,EAAQ,EAAKqiB,EAEbvQ,EADLA,EAAK7R,EAAS,EAAKsiB,IAEhC,KAEFG,wBAA2BtB,IACzB,MAAM90B,EAAM5G,KAAKyW,OAAO7P,IAClB0X,EAASte,KAAKyW,OAAO6H,OACrB+e,EAAa95B,KAAK+5B,IAAK12B,EAAMrD,KAAK2G,GAAM,IAAM,GAAKwxB,EAEzD,MAAO,CAAEphB,MAAmB,GADV+iB,EAAa/e,GACA/D,OAAqB,EAAb8iB,IACvC,KAEF3S,KAAQvpB,IACN,MAAM,QAAEiB,EAAO,QAAEC,EAAO,OAAER,GAAWV,GAC/B,KAAEo8B,EAAI,QAAEt2B,EAAO,QAAEC,GAAYlH,KAAKw9B,aAChC9B,EAAG+B,GAAOz9B,KAAKyW,OAAO/B,SAC9B,IAAIgpB,EAAUD,EACdC,GAAW77B,EAAS07B,EAChBG,EAAUx2B,EACZw2B,EAAUx2B,EACDw2B,EAAUz2B,IACnBy2B,EAAUz2B,GAGI,IAAZy2B,GAAe19B,KAAKw7B,6BAExB,MAAM,EAAErP,EAAC,EAAEC,GAAMpsB,KAAKi9B,4BAA4B76B,EAASC,IACnD8pB,EAAGwR,EAASvR,EAAGwR,GAAY59B,KAAKk9B,4BACtC96B,EACAC,EACAq7B,GAEIG,EAAO1R,EAAIwR,EACXG,EAAO1R,EAAIwR,EACjB59B,KAAKyW,OAAO0lB,WAAkB,GAAP0B,GACvB79B,KAAKyW,OAAO2lB,WAAkB,GAAP0B,GACvB99B,KAAKyW,OAAO/B,SAASqpB,KAAKL,GAC1B19B,KAAKs7B,YAAcoC,EACnB19B,KAAKq7B,aA9JLr7B,KAAKyW,OAASA,EACdzW,KAAKkX,SAAWA,EAChBlX,KAAKw9B,YAAc,CACjBt2B,QAAS,EACTD,QAAS,EACTs2B,KAAM,KAERv9B,KAAKu7B,cAAgB,EACrBv7B,KAAKs7B,YAAct7B,KAAKyW,OAAO/B,SAASgnB,EACxC17B,KAAKy7B,sBAAwB,CAC3BtP,EAAG,EACHC,EAAG,EACHsP,EAAG,GAEL17B,KAAK47B,YAAc,CAAEC,cAAc,EAAOE,UAAW,CAAE5P,EAAG,EAAGC,EAAG,MC4FrD4R,OApGf,MACEj9B,YAAYk9B,EAAe7mB,GAU3B,KAGAla,KAAQghC,IACN,MAAMC,EAAyBn+B,KAAKi+B,cAAc/R,wBAElD,GAAiC,IAA7BiS,EAAuBhS,EAAS,OAEpCnsB,KAAKkd,MAAQ,IAAIkhB,IACjBp+B,KAAKyW,OAAS,IAAI4nB,IAChB,GACAF,EAAuB7jB,MAAQ6jB,EAAuB5jB,OACtD,GACA,KAEFva,KAAKyW,OAAO/B,SAASgnB,EAAI,EAEzB17B,KAAKkX,SAAW,IAAIonB,KAAc,CAChCnnB,WAAW,EACXC,OAAQpX,KAAKoX,OACbC,OAAO,IAETrX,KAAKkX,SAAS+B,QACZklB,EAAuB7jB,MACvB6jB,EAAuB5jB,QAGzBva,KAAKkX,SAASI,cAAclb,OAAOmb,kBAGlB,IAAIwjB,GAAa/6B,KAAKyW,OAAQzW,KAAKkX,UAC3C8jB,eAET5+B,OAAOqG,iBACL,SACA,KACEzC,KAAKu+B,uBAEP,GAGFv+B,KAAKw+B,mBACLx+B,KAAKy+B,oBAAoBP,GAEzBl+B,KAAK0+B,2BACL,KAEFA,wBAA0B,KACxB1+B,KAAKkX,SAAS8Q,OAAOhoB,KAAKkd,MAAOld,KAAKyW,QAEtCra,OAAOwtB,sBAAsB,IAC3B5pB,KAAK0+B,4BAEP,KAEFF,iBAAmB,KACjB,GAAIx+B,KAAKmW,OAAQ,OAAOnW,KAAKmW,OAE7BnW,KAAKmW,OAAS,IAAIwoB,IAAO,IAAIC,KAC7B5+B,KAAKkd,MAAM+N,IAAIjrB,KAAKmW,SACpB,KAEFsoB,oBAAuBI,IACrB7+B,KAAK8+B,cAAcplB,KAAKmlB,EAAa1kB,IACnCA,EAAQR,UAAYolB,IAEpB,MAAM3kB,EAAsBD,EAAQE,MAAMC,MAAQH,EAAQE,MAAME,OAEhEva,KAAKmW,OAAOqE,MAAMC,IAAI,EAAIL,EAAqB,IAAK,GACpDpa,KAAKmW,OAAO2D,SAASD,IAAMM,EAC3Bna,KAAKmW,OAAO2D,SAASY,aAAc,KAErC,KAEF6jB,mBAAqB,KACnB,GAAIv+B,KAAKi+B,cAAe,OAExB,IAAIe,EAA0Bh/B,KAAKi+B,cAAc/R,wBAEjDlsB,KAAKkX,SAAS+B,QACZ+lB,EAAwB1kB,MACxB0kB,EAAwBzkB,QAE1Bva,KAAKyW,OAAO6H,OACV0gB,EAAwB1kB,MAAQ0kB,EAAwBzkB,OAC1Dva,KAAKyW,OAAOM,0BA9FZ/W,KAAKi+B,cAAgBA,EACrBj+B,KAAKoX,OAASA,EACdpX,KAAKkd,MAAQ,KACbld,KAAKyW,OAAS,KACdzW,KAAKkX,SAAW,KAChBlX,KAAKmW,OAAS,KACdnW,KAAK8+B,cAAgB,IAAIG,O,OCb7B,MAAMC,WAAsBhX,YAC1BnnB,cACEE,QAAQ,KAIVk+B,iBAAmB,IACV58B,SAASC,eAAe,GAADrE,OAEG,kBAA7B6B,KAAKgB,MAAMu5B,cACP,oCACA,uCAGT,KAED6E,UAAY,IACF78B,SAASC,eAAe,GAADrE,OAEG,kBAA7B6B,KAAKgB,MAAMu5B,cACP,0BACA,6BAlBTv6B,KAAKoB,MAAQ,GAuBfyyB,oBACE,MAAMoK,EAAgBj+B,KAAKm/B,mBACrB/nB,EAASpX,KAAKo/B,YAEC,IAAIpB,GAAaC,EAAe7mB,EAAQpX,KAAKgB,MAAMk9B,YAC3DhhC,KAAK8C,KAAKgB,MAAMk9B,YAI/BlW,SACE,OACE0H,IAAA7jB,cAAA,OACEhC,UAAU,8BACVwJ,GAAE,GAAAlV,OAC6B,kBAA7B6B,KAAKgB,MAAMu5B,cACP,oCACA,sCAEN3uB,MAC+B,kBAA7B5L,KAAKgB,MAAMu5B,cACPv6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM2H,oBAAoBG,GAC9ClJ,KAAKgB,MAAMkvB,SAAS9uB,MAAMgI,qBAAqBF,IAGrDwmB,IAAA7jB,cAAA,UACEwH,GAAE,GAAAlV,OAC6B,kBAA7B6B,KAAKgB,MAAMu5B,cACP,0BACA,4BAEN1wB,UAAU,wBAeLw1B,OARoBr+B,GAE/B0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAaR,IAAA7jB,cAACqzB,GAAalU,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,M,cCtDxD,MAAMoP,WAAgBpX,YACpBnnB,cACEE,QACAjB,KAAKoB,MAAQ,CACXoS,qBAAsB,KACtBD,sBAAuB,KACvBgsB,wBAAyB,KACzBC,yBAA0B,KAC1BC,2BAA2B,EAC3BC,4BAA4B,EAG5BC,aAAc,EACdC,cAAe,EACfC,cAAe,KACfC,aAAc,KACdC,8BAA0B99B,EAC1B+9B,+BAA2B/9B,GAG7B7F,OAAOqG,iBAAiB,qBAAuBqQ,IAC7C9S,KAAKigC,kBAGP7jC,OAAOqG,iBAAiB,oBAAsBqQ,IAC5C9S,KAAKkgC,0BAOTD,gBACEjgC,KAAK6C,SAAS,CACZ88B,aAAc,EACdC,cAAe,IAQnB,8BAC0C,OAApC5/B,KAAKoB,MAAMoS,sBACiD,KAA1DxT,KAAKoB,MAAMoS,qBAAqB2sB,uBAClCngC,KAAKogC,oBACHpgC,KAAKoB,MAAMoS,qBAAqB2sB,uBAKG,OAArCngC,KAAKoB,MAAMmS,uBACkD,KAA3DvT,KAAKoB,MAAMmS,sBAAsB4sB,uBACnCngC,KAAKqgC,qBACHrgC,KAAKoB,MAAMmS,sBAAsB4sB,uBAWzC,yBAAyB9gC,EAAKihC,GACR,IAAhBA,SACItgC,KAAK6C,SAAS,CAClB2Q,qBAAsBxT,KAAKgB,MAAM0H,cAAcrJ,GAC/CkgC,wBAAyBlgC,IAG3BW,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BkG,oBAAqB,IAChB/I,KAAKgB,MAAMkvB,SAASnnB,oBACvBC,GAAI,CAAEC,QAAS,SACfC,GAAI,CAAED,QAAS,WAI2C,KAA1DjJ,KAAKoB,MAAMoS,qBAAqB2sB,uBAClCngC,KAAKogC,oBACHpgC,KAAKoB,MAAMoS,qBAAqB2sB,+BAG9BngC,KAAK6C,SAAS,CAClB0Q,sBAAuBvT,KAAKgB,MAAM0H,cAAcrJ,GAChDmgC,yBAA0BngC,IAG1BW,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BuG,qBAAsB,IACjBpJ,KAAKgB,MAAMkvB,SAAS9mB,qBACvBJ,GAAI,CAAEC,QAAS,SACfC,GAAI,CAAED,QAAS,WAK0C,KAA3DjJ,KAAKoB,MAAMmS,sBAAsB4sB,uBACnCngC,KAAKqgC,qBACHrgC,KAAKoB,MAAMmS,sBAAsB4sB,wBAQzC,0BAA0BrtB,GAExB,GADAA,EAAE0B,sBAC0CvS,IAAxCjC,KAAKoB,MAAM2+B,yBAAwC,OACvD,IAAIQ,EAAeC,WAAW,KAC5B,IAAIC,EAAWzgC,KAAKoB,MAAMu+B,aAC1B,GAAI7sB,EAAEjR,OAAS,EAAG,CAChB,GAAI4+B,GAAY,EAGd,OAFAC,cAAcH,QACdvgC,KAAK6C,SAAS,CAAEk9B,8BAA0B99B,IAG5Cw+B,GAAY,SACP,GAAI3tB,EAAEjR,OAAS,EAAG,CACvB,GAAI4+B,GAAY,EAGd,OAFAC,cAAcH,QACdvgC,KAAK6C,SAAS,CAAEk9B,8BAA0B99B,IAG5Cw+B,GAAY,IAEdzgC,KAAK6C,SAAS,CACZ88B,aAAcc,EACdV,8BAA0B99B,IAE5BjC,KAAK2gC,gBAAgB3gC,KAAKoB,MAAM0+B,aAAc,GAE9CY,cAAcH,IACb,WACGvgC,KAAK6C,SAAS,CAAEk9B,yBAA0BQ,IAKlD,2BAA2BztB,GAEzB,GADAA,EAAE0B,sBAC2CvS,IAAzCjC,KAAKoB,MAAM4+B,0BAAyC,OACxD,IAAIO,EAAeC,WAAW,KAC5B,IAAIC,EAAWzgC,KAAKoB,MAAMw+B,cAC1B,GAAI9sB,EAAEjR,OAAS,EAAG,CAChB,GAAI4+B,GAAY,EAGd,OAFAC,cAAcH,QACdvgC,KAAK6C,SAAS,CAAEm9B,+BAA2B/9B,IAG7Cw+B,GAAY,SACP,GAAI3tB,EAAEjR,OAAS,EAAG,CACvB,GAAI4+B,GAAY,EAGd,OAFAC,cAAcH,QACdvgC,KAAK6C,SAAS,CAAEm9B,+BAA2B/9B,IAG7Cw+B,GAAY,IAEdzgC,KAAK6C,SAAS,CACZ+8B,cAAea,EACfT,+BAA2B/9B,IAE7BjC,KAAK4gC,iBAAiB5gC,KAAKoB,MAAMy+B,cAAe,GAEhDa,cAAcH,IACb,WACGvgC,KAAK6C,SAAS,CAAEm9B,0BAA2BO,IAOnDM,uBAAuBC,GACrB,IAAIC,EAAWD,EAAKE,YAAY,CAAExmB,MAAOxa,KAAKoB,MAAMu+B,eAChDvoB,EAAS7U,SAASC,eAAe,eACrC,QAAeP,IAAXmV,EAAsB,OAC1BA,EAAO3U,iBAAiB,QAAUqQ,IAChC9S,KAAKihC,oBAAoBnuB,KAG3B,IAAIouB,EAAU9pB,EAAO+P,WAAW,MAChC/P,EAAOmD,OAASwmB,EAASxmB,OACzBnD,EAAOkD,MAAQymB,EAASzmB,MACxB,IAAI6mB,EAAgB,CAClBC,cAAeF,EACfH,SAAUA,GAEZD,EAAK9Y,OAAOmZ,GAMdE,wBAAwBP,GACtB,IAAIC,EAAWD,EAAKE,YAAY,CAAExmB,MAAOxa,KAAKoB,MAAMw+B,gBAChDxoB,EAAS7U,SAASC,eAAe,eACrC,QAAeP,IAAXmV,EAAsB,OAC1BA,EAAO3U,iBAAiB,QAAUqQ,IAChC9S,KAAKshC,qBAAqBxuB,KAE5B,IAAIouB,EAAU9pB,EAAO+P,WAAW,MAChC/P,EAAOmD,OAASwmB,EAASxmB,OACzBnD,EAAOkD,MAAQymB,EAASzmB,MACxB,IAAI6mB,EAAgB,CAClBC,cAAeF,EACfH,SAAUA,GAEZD,EAAK9Y,OAAOmZ,GAOdR,gBAAgBY,EAAKC,GACnBD,EAAIE,QAAQD,GAAK/jB,KAAMqjB,IACrB9gC,KAAK6gC,uBAAuBC,KAQhCF,iBAAiBW,EAAKC,GACpBD,EAAIE,QAAQD,GAAK/jB,KAAMqjB,IACrB9gC,KAAKqhC,wBAAwBP,KAQjCV,oBAAoBnJ,GAClByK,KAASC,oBAAoBC,UAAS,2CAAAzjC,OAA8CujC,KAASG,QAAO,kBACvFH,KAASI,YAAY7K,GAC3B8K,QAAQtkB,KAAM8jB,IACnBvhC,KAAK2gC,gBAAgBY,EAAK,GAC1BvhC,KAAK6C,SAAS,CAAEi9B,aAAcyB,MAQlClB,qBAAqBpJ,GACnByK,KAASC,oBAAoBC,UAAS,2CAAAzjC,OAA8CujC,KAASG,QAAO,kBACvFH,KAASI,YAAY7K,GAC3B8K,QAAQtkB,KAAM8jB,IACnBvhC,KAAK4gC,iBAAiBW,EAAK,GAC3BvhC,KAAK6C,SAAS,CAAEg9B,cAAe0B,MAQnC,4BAA4BjB,GAC1B,GAAoB,IAAhBA,GACF,GAAwC,OAApCtgC,KAAKoB,MAAMoS,qBAA+B,YAE9C,GAAyC,OAArCxT,KAAKoB,MAAMmS,sBAAgC,OAGjD,GAAoB,IAAhB+sB,EAAmB,CACrB,IAAIlpB,EAAS7U,SAASC,eAAe,oBACtBP,IAAXmV,GACFA,EAAOtU,oBAAoB,QAAUgQ,IACnC9S,KAAKihC,oBAAoBnuB,KAG7B,IAAIkvB,EAAW,CAAE/4B,QAAS,cACpBjJ,KAAK6C,SAAS,CAClBo/B,oBAAqB,KACrBzuB,qBAAsB,KACtB+rB,wBAAyB,KACzBx2B,oBAAqBi5B,IAGvBhiC,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BkG,oBAAqB,IAChB/I,KAAKgB,MAAMkvB,SAASnnB,oBACvBC,GAAI,CAAEC,QAAS,WAIlBjJ,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BiG,8BAA8B,QAG5B,CACL,IAAIsO,EAAS7U,SAASC,eAAe,oBACtBP,IAAXmV,GACFA,EAAOtU,oBAAoB,QAAUgQ,IACnC9S,KAAKshC,qBAAqBxuB,WAGxB9S,KAAK6C,SAAS,CAClBq/B,qBAAsB,KACtB3uB,sBAAuB,KACvBisB,yBAA0B,OAG5Bx/B,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BuG,qBAAsB,IACjBpJ,KAAKgB,MAAMkvB,SAAS9mB,qBACvBJ,GAAI,CAAEC,QAAS,WAIlBjJ,KAAKgB,MAAMkvB,SAASrtB,SAAS,CAC3BsG,+BAA+B,KAUtCwvB,gBAAgBt5B,GACd,IAAI8iC,EAAQ,EAC4B,OAApCniC,KAAKoB,MAAMoS,sBAA+B2uB,IACL,OAArCniC,KAAKoB,MAAMmS,uBAAgC4uB,IAE/C,IAAIhhC,EAAQ,IAAI+J,YAAY,kBAAmB,CAC7C5J,OAAQ,CACNjC,MACA8iC,MAAOA,KAGX/lC,OAAO+O,cAAchK,GAIvB6mB,SACE,MAAM,EAAEvI,GAAMzf,KAAKgB,MAEnB,OACE0uB,IAAA7jB,cAAC6jB,IAAMuB,SAAQ,KACZjxB,KAAKgB,MAAMkvB,SAAS9uB,MAAMoG,eACzBkoB,IAAA7jB,cAAA,OAAKwH,GAAG,iBAAiBxJ,UAAU,qBACjC6lB,IAAA7jB,cAAA,OAAKhC,UAAU,mBACb6lB,IAAA7jB,cAAA,OACEhC,UAAU,kBACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OACb6B,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAAS0I,OACjCpM,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,cAC1B+d,KAAKjjB,KAAKgB,MAAMkvB,SAAS9uB,MAAM+D,YAAY6N,YAC3ChT,KAAKgB,MAAMkvB,SAAS9uB,MAAMgE,eAC3B,OAILsqB,IAAA7jB,cAAA,OAAKhC,UAAU,qBACb6lB,IAAA7jB,cAAA,UACEhC,UAAU,cACVknB,QAASA,KACP/wB,KAAKgB,MAAMkvB,SAAS5d,mBACpBtS,KAAKgB,MAAMkvB,SAASjlB,0BAGtBykB,IAAA7jB,cAAA,OACE8jB,IAAI,2CACJC,IAAI,gBAENF,IAAA7jB,cAAA,QAAMhC,UAAU,sBACb,IACD6lB,IAAA7jB,cAAA,YAAM,IAAE4T,EAAE,SAASG,cAAc,KAAQ,IAAC8P,IAAA7jB,cAAA,cAAQ,SAIxD6jB,IAAA7jB,cAAA,OACEhC,UAAU,kBACV+B,MAAO,CACLwG,gBAAiB3E,EAAanP,qBAC5B0B,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,aAI9B+e,IAAA7jB,cAAA,OACEhC,UAAU,OACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OACb6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM2P,YACtB/Q,KAAKgB,MAAMkvB,SAAS9uB,MAAM2P,YAC1B,GAAE,QAIZ2e,IAAA7jB,cAAA,OACEhC,UAAU,uBACV+B,MAAO,CAAEwG,gBAAiBpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMwP,qBAEpD8e,IAAA7jB,cAACu2B,GAAQ,CAAC3N,UAAU,OAK1B/E,IAAA7jB,cAAA,OAAKhC,UAAU,oBACZ7J,KAAKgB,MAAM8P,WACV4e,IAAA7jB,cAAA,OACEhC,UAAU,QACV+lB,IAAI,cACJD,IAAK3vB,KAAKgB,MAAM8P,aAEhB,KACJ4e,IAAA7jB,cAAA,OACEwH,GAAG,sBACHzH,MAAO,CACL0O,MAAO,MACPC,OAAQ,MACR8nB,WAAariC,KAAKgB,MAAM8P,WAAqB,MAAR,QAGvC4e,IAAA7jB,cAACy2B,KACKtiC,KAAKgB,MAAMkvB,SAAS9uB,MAAMiI,wBAE7BrJ,KAAKgB,MAAMkvB,SAAS9uB,MAAMyH,2BACvB7I,KAAKgB,MAAMkvB,SAAS9uB,MAAMyH,2BACvB8K,OAAQlH,GAELA,EAAUpN,MACRW,KAAKoB,MAAMm+B,yBACb9yB,EAAUpN,MACRW,KAAKoB,MAAMo+B,0BAGhB3lB,IAAKpN,GACJijB,IAAA7jB,cAACusB,GAAS,CACRO,gBAAiB34B,KAAK24B,gBAAgB4J,KAAKviC,MAC3CqT,GAAI5G,EAAUpN,IACdA,IAAKoN,EAAUpN,IACfsP,MAAOlC,EAAUkC,MACjB5Q,KAAM0O,EAAU1O,KAChBoP,KAAMV,EAAUU,KAChBorB,UAAW9rB,EAAU8rB,UACrB3pB,WAAYnC,EAAUmC,cAG5B,SAMZ8gB,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,0BAEb6lB,IAAA7jB,cAACgtB,GAAkB,CACjBjtB,MAAO5L,KAAKgB,MAAMkvB,SAAS9uB,MAAM2H,oBAAoBC,GACrDw5B,YAAaxiC,KAAKoB,MAAMqhC,eACxBxgB,cAAejiB,KAAKoB,MAAMoS,qBAC1BomB,QAAS55B,KAAKoB,MAAMoS,qBACpBmmB,OAAQ,EACRvmB,mBAAoBpT,KAAKoT,mBAAmBmvB,KAAKviC,MACjD85B,sBAAuB95B,KAAK85B,sBAAsByI,KAAKviC,QAGxDA,KAAKoB,MAAMoS,sBACVxT,KAAKgB,MAAMkvB,SAAS9uB,MAAM0H,8BACxB4mB,IAAA7jB,cAACqzB,GAAa,CACZ3E,cAAc,gBACd2D,WACEl+B,KAAKoB,MAAMoS,qBAAqBR,YAAY,KAInDhT,KAAKoB,MAAMoS,sBACVkc,IAAA7jB,cAACkuB,GAAiB,CAACa,gBAAgB,kBAGA,OAApC56B,KAAKoB,MAAMoS,qBACVkc,IAAA7jB,cAAA,QAAMhC,UAAU,mBACb4V,EAAE,2BAA2BG,eAE9B,MAEN8P,IAAA7jB,cAAA,OAAKhC,UAAU,oCAEb6lB,IAAA7jB,cAACgtB,GAAkB,CACjBjtB,MAAO5L,KAAKgB,MAAMkvB,SAAS9uB,MAAMgI,qBAAqBJ,GACtDw5B,YAAaxiC,KAAKoB,MAAMshC,gBACxBzgB,cAAejiB,KAAKoB,MAAMmS,sBAC1BqmB,QAAS55B,KAAKoB,MAAMmS,sBACpBovB,kCAAgC,EAChChJ,OAAQ,EACRvmB,mBAAoBpT,KAAKoT,mBAAmBmvB,KAAKviC,MACjD85B,sBAAuB95B,KAAK85B,sBAAsByI,KAAKviC,QAExDA,KAAKoB,MAAMmS,uBACVvT,KAAKgB,MAAMkvB,SAAS9uB,MAAM+H,+BACxBumB,IAAA7jB,cAACqzB,GAAa,CACZ3E,cAAc,iBACd2D,WACEl+B,KAAKoB,MAAMmS,sBAAsBP,YAAY,KAIpDhT,KAAKoB,MAAMmS,uBACVmc,IAAA7jB,cAACkuB,GAAiB,CAACa,gBAAgB,mBAEC,OAArC56B,KAAKoB,MAAMmS,sBACVmc,IAAA7jB,cAAA,QAAMhC,UAAU,mBACb4V,EAAE,2BAA2BG,eAE9B,QAIR,OAcGkS,qBARc9wB,GAE3B0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACbqvB,GAAcR,IAAA7jB,cAACyzB,GAAOtU,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,O,OC5hBjD,MAAM0S,WAA0B1a,YAAUnnB,cAAA,SAAAonB,WAAA,KACxC/mB,MAAQ,CACNsqB,eAAgB,EAChB3kB,aAAc,GAIhBihB,SACE,OACE0H,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,GACAlB,IAAA7jB,cAAA,OAAKhC,UAAU,yBAEb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,mBACb6lB,IAAA7jB,cAAA,SAAOg3B,QAAQ,mBAAkB,qBACjCnT,IAAA7jB,cAAA,SACEwH,GAAG,kBACHyvB,aAAclS,EAAOxvB,MAAM0F,yBAC3By2B,KAAM,KACNpN,SAAU1O,gBACFzhB,KAAK6C,SAAS,CAAE6oB,eAAgB5Y,EAAEiwB,OAAOxhC,QAC/CqvB,EAAO7b,oBACL/U,KAAKoB,MAAMsqB,eACX1rB,KAAKoB,MAAM2F,eAIfhJ,KAAK,YAIT2xB,IAAA7jB,cAAA,OAAKhC,UAAU,mBACb6lB,IAAA7jB,cAAA,SAAOg3B,QAAQ,iBAAgB,mBAC/BnT,IAAA7jB,cAAA,SACEwH,GAAG,gBACHyvB,aAAclS,EAAOxvB,MAAM2F,aAC3Bw2B,KAAM,KACNpN,SAAU1O,gBACFzhB,KAAK6C,SAAS,CAAEkE,aAAc+L,EAAEiwB,OAAOxhC,QAC7CqvB,EAAO7b,oBACL/U,KAAKoB,MAAMsqB,eACX1rB,KAAKoB,MAAM2F,eAGfhJ,KAAK,eAWN6kC,U,OCzDf,MAAM5O,WAAsB9L,YAAUnnB,cAAA,SAAAonB,WAAA,KACpC/mB,MAAQ,CACNsxB,WAAW,GAIb1K,SACE,MAAMhb,EAAShN,KAAKgB,MAAM2xB,WAC1B,OACEjD,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,GACMlB,IAAA7jB,cAAA,UACExM,IAAK2N,EAAOG,KACZvB,MAAOoB,EAAO8lB,QAAQ,CAAE7T,gBAAgB,OAAD9gB,OAAS6B,KAAKoB,MAAMsxB,WAAY1lB,EAAO6lB,aAAa7lB,EAAO6lB,aAA6B7lB,EAAO8lB,QAAO,MAAM,CAAC7pB,QAAS,SAC7JY,UAAW7J,KAAKgB,MAAM6vB,YACtBE,QAASA,KACPiC,EAAmBb,eACjBnlB,EAAOC,QACP2jB,EACA,UAGJqC,aAAcA,KACZjzB,KAAK6C,SAAS,CAAC6vB,WAAW,IAC1BM,EAAmBb,eACjBnlB,EAAOC,QACP2jB,EACA,eAGJsC,aAAcA,KACZlzB,KAAK6C,SAAS,CAAC6vB,WAAW,IAC1BM,EAAmBb,eACjBnlB,EAAOC,QACP2jB,EACA,gBAGJ5jB,EAAO+mB,QAOVC,UC3Cf,MAAMgP,WAA0B9a,YAAUnnB,cAAA,SAAAonB,WAAA,KACtC/mB,MAAQ,GACR4mB,SACI,OACE0H,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,IAAM,IAAAqS,EAAA,OACNvT,IAAA7jB,cAAA,OAAKhC,UAAU,uBACc,QADOo5B,EACjCrS,EAAOxvB,MAAMgN,qBAAa,IAAA60B,OAAA,EAA1BA,EACGtvB,OAAQ3G,IAAYA,EAAOwmB,WAC5B3Z,IAAK7M,GAEF0iB,IAAA7jB,cAACq3B,GAAY,CACX7jC,IAAK2N,EAAOG,KACZinB,WAAYpnB,EAAOG,KACnBwlB,WAAY3lB,EACZ6jB,YAAY,uBAWrBmS,U,iBC1Bf,SAASG,GAAeniC,GACtB,MAAM,gBAAEoiC,GAAoBpiC,EACtBiV,EAAWC,EAAaP,iBAE9B,OACE+Z,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAAA,OACEyO,MAAK,GAAAnc,OAAKilC,EAAe,GAAAjlC,OAAM8X,EAAW,QAAU,SAAY,SAChEsE,OAAM,QACNsnB,QAAQ,MACRxuB,GAAG,UACH2hB,MAAM,6BACNqO,WAAW,+BACXlX,EAAE,MACFC,EAAE,MACF2I,QAAQ,aACRuO,SAAS,YAET5T,IAAA7jB,cAAA,gBACE6jB,IAAA7jB,cAAA,OAAKmpB,MAAM,YACTtF,IAAA7jB,cAAA,eACA6jB,IAAA7jB,cAAA,qBACE0O,OAAO,OACPD,MAAM,MACN6R,EAAE,OACFC,EAAE,QACFmX,iBAAiB,WAIvB7T,IAAA7jB,cAAA,WACEgpB,KAAM7zB,EAAMkvB,SAAS9uB,MAAMuP,UAC3B0C,GAAG,WACHmwB,OAAO,qFAET9T,IAAA7jB,cAAA,YACEgpB,KAAK,UACLxhB,GAAG,YACHmwB,OAAO,6CAET9T,IAAA7jB,cAAA,QACEwH,GAAG,YACHowB,GAAG,OACHC,GAAG,OACHC,GAAG,QACHC,GAAG,OACHC,MAAM,UACNhP,KAAK,YAEPnF,IAAA7jB,cAAA,QAAMwH,GAAG,WAAW4hB,EAAE,aAAa4O,MAAM,UAAUhP,KAAK,YACxDnF,IAAA7jB,cAAA,YACEgpB,KAAK,UACLxhB,GAAG,WACHmwB,OAAO,gWAKT9T,IAAA7jB,cAAA,YACEuZ,OAAO,UACPyP,KAAK,UACLxhB,GAAG,WACHmwB,OAAO,2CAET9T,IAAA7jB,cAAA,QACEuZ,OAAO,UACPyP,KAAK,UACLxhB,GAAG,WACHowB,GAAG,OACHC,GAAG,OACHC,GAAG,QACHC,GAAG,SAELlU,IAAA7jB,cAAA,WACEgpB,KAAM7zB,EAAMkvB,SAAS9uB,MAAMwP,mBAC3ByC,GAAG,WACHmwB,OAAO,qFAcFM,OAPf,SAAoC9iC,GAClC,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACs3B,GAAcnY,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,OCnF1D,SAAS6T,GAAW/iC,GAClB,MAAM,QAAEmoB,EAAO,gBAAEia,GAAoBpiC,GAE/B,EAAEye,EAAC,KAAE3iB,GAASm1B,eACd,SAAEnO,GAAahnB,EAqDrB,OACE4yB,IAAA7jB,cAAA,OAAKklB,QAPP,WACEiT,qBAAqB7a,GAPvB,WACE,MAAMhoB,EAAQ,IAAI+J,YAAY,oBACT3I,SAASC,eAAe,wBAC9B2I,cAAchK,GAK7B8iC,GACAjjC,EAAMkvB,SAASgU,0BAIar6B,UAAU,eACpC6lB,IAAA7jB,cAACs3B,GAAc,CAACC,gBAAiBA,IACjC1T,IAAA7jB,cAAA,OAAKhC,UAAU,wBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,iBACb6lB,IAAA7jB,cAAA,KAAGhC,UAtDD,GAAN1L,OADe,WAAb2lB,EACQsf,EACJ,6CACA,0EAGEA,EACJ,uDACA,4BA+CiC3jB,EAAE,SAASG,cAAc,KAC1D8P,IAAA7jB,cAAA,UAAQhC,UA1CN,GAAN1L,OADe,WAAb2lB,EACQsf,EACJ,gFACA,iDAGEA,EACJ,2DACA,8BAoCG31B,EAAa/N,iBACZsB,EAAMkvB,SAAS9uB,MAAMsC,SAAS0I,OAC5BpL,EAAMkvB,SAAS9uB,MAAM8D,cACrBiI,MACF,4BACoC,MAG1CuiB,IAAA7jB,cAAA,KAAGhC,UAtCC,GAAN1L,OADe,WAAb2lB,EACQsf,EACJ,6EACA,+CAGEA,EACJ,0DACA,6BAgCC3jB,EAAE,UAAUG,cAAc,4BAAsC,OAe5DukB,OARf,SAAgCnjC,GAC9B,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACk4B,GAAU/Y,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,O,OCrFtD,SAASkU,GAAoBpjC,GAC3B,MAAMiV,EAAWC,EAAaP,iBAE9B,OACE+Z,IAAA7jB,cAAA,OAAKhC,UAAU,wBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAAA,QAAMhC,UAAU,6BAA6B7I,EAAMkvB,SAAS9uB,MAAMiQ,gBAAkB,MACnFrQ,EAAMkvB,SAAS9uB,MAAMkQ,cAC3Boe,IAAA7jB,cAAA,QAAMhC,UAAU,8BAA8B7I,EAAMkvB,SAAS9uB,MAAMkQ,cAG9Doe,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,uBAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZI,WAAW,iBACXvD,YACE7vB,EAAMkvB,SAAS9uB,MAAMgH,yBAEY,KAD7BpH,EAAMkvB,SAAS9uB,MAAMc,qBAClBi+B,sBACD,oBACA,kCACF,sBAENlhB,gBAAiBje,EAAMkvB,SAAS9uB,MAAMmQ,kBAAoB,wCAKhEme,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,yBAC9BlwB,EAAMkvB,SAAS9uB,MAAMc,qBAAqB8Q,YAAYxT,OAAS,EAC9DkwB,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAACmoB,EAAa,CACZI,WAAW,oBACXvD,YACE7vB,EAAMkvB,SAAS9uB,MAAMgH,yBACjB,sBACApH,EAAMkvB,SAAS9uB,MAAMc,qBAAqB8Q,YACvCxT,OAAS,EACZ,kCACA,mBAENyf,gBAAiBje,EAAMkvB,SAAS9uB,MAAMuQ,kBAAoB,sCAG3DsE,EACCyZ,IAAA7jB,cAAA6jB,IAAAuB,SAAA,KACGjwB,EAAMkvB,SAAS9uB,MAAMsQ,cACjCge,IAAA7jB,cAAA,QAAMhC,UAAU,8BAA8B7I,EAAMkvB,SAAS9uB,MAAMsQ,cACxDge,IAAA7jB,cAAA,QAAMhC,UAAU,6BAA6B7I,EAAMkvB,SAAS9uB,MAAMqQ,gBAAkB,OAGtFie,IAAA7jB,cAAA6jB,IAAAuB,SAAA,KACEvB,IAAA7jB,cAAA,QAAMhC,UAAU,6BAA6B7I,EAAMkvB,SAAS9uB,MAAMqQ,gBAAkB,MACnFzQ,EAAMkvB,SAAS9uB,MAAMsQ,cACjCge,IAAA7jB,cAAA,QAAMhC,UAAU,8BAA8B7I,EAAMkvB,SAAS9uB,MAAMsQ,gBAI5D,OAcG2yB,OARf,SAAyCrjC,GACvC,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACu4B,GAAmBpZ,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,O,OC5D/D,MAAMoU,WAAyBpc,YAAUnnB,cAAA,SAAAonB,WAAA,KACvC/mB,MAAQ,CACNmjC,aAAc,KACdtuB,SAAUC,EAAaP,kBASzB6uB,qBAAqB57B,EAAqB1G,GACxC,MAAMwI,EAAexI,EAAqB7C,IAE1C,GAAIuJ,EAAoBjK,SAAS+L,GAAe,CAC9C,IAAIvJ,EAAQ,IAAI+J,YAAY,kBAAmB,CAC7C5J,OAAQ,CACNjC,IAAKqL,KAOT,OAHAtO,OAAO+O,cAAchK,QAErBnB,KAAK6C,SAAS,CAAE0hC,cAAc,IAIhCvkC,KAAK6C,SAAS,CAAE0hC,cAAc,IAE9B,IAAIpjC,EAAQ,IAAI+J,YAAY,eAAgB,CAC1C5J,OAAQ,CACNjC,IAAKqL,KAITtO,OAAO+O,cAAchK,GAQvBsjC,6BAA6B77B,EAAqB87B,GAChD,OAAI97B,EAAoBjK,SAAS+lC,GACxB,yCAEF,wCAGTC,YAAY5Q,GACV,OAAIA,EAAKv0B,OAAS,EACT,OAELu0B,EAAKv0B,OAAS,EACT,OAEF,OAGTwoB,SACE,MAAM,EAAEvI,GAAMzf,KAAKgB,OACb,WAAE4jC,GAAe5kC,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,sBAC3C,KAAEnE,GAASiC,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAE3C,OACEwtB,IAAA7jB,cAAA,OAAKhC,UAAU,gCACZ7J,KAAKoB,MAAM6U,UACVyZ,IAAA7jB,cAAA6jB,IAAAuB,SAAA,KACEvB,IAAA7jB,cAAA,UACEhC,UAAU,sCACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKykC,6BAC3BzkC,KAAKgB,MAAMkvB,SAAS9uB,MAAMwH,oBAC1B5I,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqB7C,KAChD,MAEH0xB,QAASA,KACP/wB,KAAKwkC,qBACHxkC,KAAKgB,MAAMkvB,SAAS9uB,MAAMwH,oBAC1B5I,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,yBAKhCwtB,IAAA7jB,cAAA,OAAKhC,UAAU,iCACb6lB,IAAA7jB,cAACu4B,GAAmB,OAEtB1U,IAAA7jB,cAAA,OAAKhC,UAAU,yBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,iCACb6lB,IAAA7jB,cAACk4B,GAAU,CACT5a,QAASnpB,KAAKoB,MAAM+nB,QACpBia,iBAAiB,OAM3B1T,IAAA7jB,cAAA,OACEhC,UAAU,gDACV+B,MAAO,CACLwG,gBAAiB3E,EAAanP,qBAC5B0B,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,aAI9B+e,IAAA7jB,cAAA,OAAKhC,UAAU,gCACb6lB,IAAA7jB,cAAA,OACEhC,UAAU,mBACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM2P,YAC5C/Q,KAAKgB,MAAMkvB,SAAS9uB,MAAM2P,YAC1B,GAAE,QAIZ2e,IAAA7jB,cAAA,OAAKhC,UAAU,SACf6lB,IAAA7jB,cAAA,OAAKhC,UAAU,wBACb6lB,IAAA7jB,cAACyoB,GAAU,QAGf5E,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,uBAC/BxB,IAAA7jB,cAAA,OACEhC,UAAU,iCACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAM0P,WAAU,UAKpE4e,IAAA7jB,cAAA,OACEhC,UAAU,gBACV+B,MAAO,CACLwG,gBAAiBpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,YAG7C+e,IAAA7jB,cAAA,OAAKhC,UAAU,mBACb6lB,IAAA7jB,cAAA,OACE8jB,IAAI,mCACJC,IAAI,sBACJ/lB,UAAU,uBAEZ6lB,IAAA7jB,cAAA,OAAKhC,UAAU,iBACb6lB,IAAA7jB,cAAA,QAAMhC,UAAU,OAAO4V,EAAE,cACzBiQ,IAAA7jB,cAAA,QACED,MAAO,CACLrN,MACEyB,KAAKgB,MAAMkvB,SAAS9uB,MAAMqE,cACxBzF,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqBnE,MAC/C2P,cAEN7D,UAAU,WAET7J,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqBiL,QAItDuiB,IAAA7jB,cAAA,OAAKhC,UAAU,mBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,OACEhC,UAAS,GAAA1L,OAAK6B,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqBnE,KAAK4e,cAAa,SAC/E/Q,MAAO,CACLwG,gBACEpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMqE,cACxBzF,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqBnE,MAC/C2P,iBAIVgiB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,QAAMhC,UAAU,MAAM4V,EAAE1hB,IACxB2xB,IAAA7jB,cAAA,YAAM,IAAE4T,EAAE,aAAa9C,eACvB+S,IAAA7jB,cAAA,YACG7L,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqBnE,KAAK,GAAI,IACG,MAA3DiC,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqBnE,KAAK,GAAa0hB,EAAE,SAAWA,EAAE,aAIvFiQ,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YAAO4T,EAAE,YACTiQ,IAAA7jB,cAAA,YAAO4T,EAAE,aAAa9C,gBAExB+S,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YACE6jB,IAAA7jB,cAAA,SACG7L,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqB0M,WAAY,IAAI,aAMvE5O,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBACxB2iC,kBACDnV,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YAAO4T,EAAE,aAEXiQ,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YACE6jB,IAAA7jB,cAAA,SAEI7L,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBACvB2iC,kBACH,IAAI,aAMZ,KACJnV,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YAAO4T,EAAE,kBAEXiQ,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YAAO4T,EAAEmlB,MAGblV,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BAA4B4V,EAAE,aAC7CiQ,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YACE6jB,IAAA7jB,cAAA,SACG7L,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqB4iC,cAKvD9kC,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBACxByf,mBACD+N,IAAA7jB,cAAA,OAAKhC,UAAU,uBACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BAA2B,QAC1C6lB,IAAA7jB,cAAA,OAAKhC,UAAU,4BACb6lB,IAAA7jB,cAAA,YACE6jB,IAAA7jB,cAAA,SACG7L,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqByM,MAC9C3O,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBACvB0f,mBAKX,MAEN8N,IAAA7jB,cAAA,OAAKhC,UAAU,oBAGjB6lB,IAAA7jB,cAAA,OAAKhC,UAAU,kBACb6lB,IAAA7jB,cAAA,OACEhC,UAAU,eACV+B,MAAO,CACLwG,gBAAiBpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,YAG7C+e,IAAA7jB,cAAA,UACEhC,UAAU,sCACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKykC,6BAC3BzkC,KAAKgB,MAAMkvB,SAAS9uB,MAAMwH,oBAC1B5I,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAAqB7C,KAChD,MAEH0xB,QAASA,KACP/wB,KAAKwkC,qBACHxkC,KAAKgB,MAAMkvB,SAAS9uB,MAAMwH,oBAC1B5I,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,0BAKlCwtB,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAAA,SACG4T,EAAE,SAASG,cACZ8P,IAAA7jB,cAAA,WACA6jB,IAAA7jB,cAAA,QACED,MAAO,CACL8T,SAAU1f,KAAK2kC,YACbl3B,EAAa/N,iBACXM,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAAS0I,OACjCpM,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,cAC1BiI,SAKPM,EAAa/N,iBACZM,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAAS0I,OACjCpM,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,cAC1BiI,SAKVuiB,IAAA7jB,cAAA,OACEhC,UAAU,kBACV+B,MAAO,CACLwG,gBAAiBpS,KAAKgB,MAAMkvB,SAAS9uB,MAAMuP,cAKjD+e,IAAA7jB,cAAA,OACEhC,UAAU,eACV+B,MAAO,CACLqT,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAAS0I,OACvDpM,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,cAC1B+d,KAAKjjB,KAAKgB,MAAMkvB,SAAS9uB,MAAM+D,YAAY6N,YAC7ChT,KAAKgB,MAAMkvB,SAAS9uB,MAAMgE,eACzB,UAiBA0sB,sBARf,SAAsC9wB,GACpC,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACy4B,GAAgBtZ,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,S,OC7T5D,MAAM6U,WAAsB7c,YAAUnnB,cAAA,SAAAonB,WAAA,KACpC6c,YAAa,EAAM,KAEnB5jC,MAAQ,CACN8b,MAAO,GACPzG,OAAQ,GACRS,SAAU,GACV4pB,KAAM,KACNmE,SAAU/uB,EAAaP,iBAAmB,EAAI,GAC9CuvB,SAAU,KACV9tB,OAAQ,KACR+tB,0BAAsBljC,EACtBmjC,YAAa,EACbnvB,SAAUC,EAAaP,kBA0GzB,KAGA0vB,gBAAkB5jB,UAEhB,GADA3O,EAAE0B,sBACsCvS,IAApCjC,KAAKoB,MAAM+jC,qBAAoC,OACnD,GAAInlC,KAAKgB,MAAMoH,yBAA0B,OAEzC,IAAIm4B,EAAeC,WAAW,KAC5B,IAAIC,EAAWzgC,KAAKoB,MAAM6jC,SAC1B,GAAInyB,EAAEjR,OAAS,EAAG,CAChB,GAAI4+B,GAAY,GAGd,OAFAC,cAAcH,QACdvgC,KAAK6C,SAAS,CAAEsiC,0BAAsBljC,IAGxCw+B,GAAY,QACP,GAAI3tB,EAAEjR,OAAS,EAAG,CACvB,GAAI4+B,GAAY,mBAGd,OAFAC,cAAcH,QACdvgC,KAAK6C,SAAS,CAAEsiC,0BAAsBljC,IAGxCw+B,GAAY,GAEdzgC,KAAK6C,SAAS,CAAEoiC,SAAUxE,EAAU0E,0BAAsBljC,IAC1DjC,KAAKslC,YAAYtlC,KAAKoB,MAAM8jC,SAAU,GAEtCxE,cAAcH,IACb,WACGvgC,KAAK6C,SAAS,CAAEsiC,qBAAsB5E,KAlI9C,iCACE,IAEIvB,EAFgBz8B,SAASC,eAAe,4BAEA0pB,wBAExChP,EAAQ,IAAIxG,IACZD,EAAS,IAAIC,IACf,GACAsoB,EAAwB1kB,MAAQ0kB,EAAwBzkB,OACxD,GACA,KAEEnD,EAAS7U,SAASC,eAAe,oBAErCiU,EAAO/B,SAASgnB,EAAI,EAEpB,IAAIxkB,EAAW,IAAIR,KAAoB,CACrCS,WAAW,EACXC,SACAC,OAAO,IAETH,EAAS+B,QACP+lB,EAAwB1kB,MACxB0kB,EAAwBzkB,QAG1BrD,EAASI,cAAclb,OAAOmb,kBAE9B,IAAIpB,EAASoU,EAAYtQ,4BAEzB7d,OAAOqG,iBACL,SACA,KACEzC,KAAKqe,eAAenH,EAAUT,EAAQW,KAExC,GAGF8F,EAAM+N,IAAI9U,SAEJnW,KAAK6C,SAAS,CAClBqa,MAAOA,EACPzG,OAAQA,EACRS,SAAUA,EACViS,QAAS,IAGM,IAAI4R,GAAatkB,EAAQS,GACjC8jB,eASX3c,eAAenH,EAAUT,GACvB,IAAIwnB,EAAgB17B,SAASC,eAAe,4BAE5C,IAAKy7B,EAAe,OAEpB,IAAIe,EAA0Bf,EAAc/R,wBAE5ChV,EAAS+B,QACP+lB,EAAwB1kB,MACxB0kB,EAAwBzkB,QAE1B9D,EAAO6H,OACL0gB,EAAwB1kB,MAAQ0kB,EAAwBzkB,OAC1D9D,EAAOM,yBAST2S,YAAYxS,EAAUgG,EAAOzG,GAC3BzW,KAAK6C,SAAS,CACZsmB,QAASS,sBAAsB,KAC7B5pB,KAAK0pB,YAAYxS,EAAUgG,EAAOzG,OAItCS,EAAS8Q,OAAO9K,EAAOzG,GAMzBoU,uBACE7qB,KAAK0pB,YAAY1pB,KAAKoB,MAAM8V,SAAUlX,KAAKoB,MAAM8b,MAAOld,KAAKoB,MAAMqV,QAwCrE8uB,oBAME,OAAO,EALUvlC,KAAKwlC,8BACpB,KACAppC,OAAO8c,YAMXssB,8BAA8BC,EAAWC,GACvC,OAAQA,EAAcD,KAAeC,EAAcD,GAAa,GAOlEE,mBAAmB7E,GACjB9gC,KAAK6C,SAAS,CAAEi+B,SAChBA,EAAK8E,UAGL,IAAI7E,EAAWD,EAAKE,YAAY,CAC9BxmB,MAAOxa,KAAKoB,MAAM6jC,SAAWjlC,KAAKulC,sBAEhCnuB,EAAS7U,SAASC,eAAe,cAErC,IAAK4U,EAAQ,OAEb,IAAI8pB,EAAU9pB,EAAO+P,WAAW,MAGhC/P,EAAOmD,OAFY,EAEUwmB,EAASxmB,OACtCnD,EAAOkD,MAHY,EAGSymB,EAASzmB,MAErClD,EAAOxL,MAAM2O,OAASwmB,EAASxmB,OAC/BnD,EAAOxL,MAAM0O,MAAQymB,EAASzmB,MAE9Bta,KAAK6C,SAAS,CAAEuiC,YAAahuB,EAAOkD,QACpC,IAAI6mB,EAAgB,CAClBC,cAAeF,EACfH,SAAUA,EACV/K,UAAW,CAZM,EAYO,EAAG,EAZV,EAYyB,EAAG,IAE/C8K,EAAK9Y,OAAOmZ,GAQdmE,YAAY/D,EAAKC,GACfD,EAAIE,QAAQD,GAAK/jB,KAAMqjB,IACrB9gC,KAAK2lC,mBAAmB7E,KAQ5B+E,gBAAgB5O,GACdyK,KAASC,oBAAoBC,UAAS,2CAAAzjC,OAA8CujC,KAASG,QAAO,kBACvFH,KAASI,YAAY7K,GAC3B8K,QAAQtkB,KAAM8jB,IAInBvhC,KAAKslC,YAAY/D,EAAK,GACtBvhC,KAAK6C,SAAS,CAAEqiC,SAAU3D,MAQ9BuE,gBAAgBlV,GACd,MAAMrX,EACJqX,EAAOxvB,MAAMc,qBAAqB8Q,YAChC4d,EAAOxvB,MAAMiE,sBAGjB0gC,kBAAOxsB,EAAS,GAADpb,OAAKyyB,EAAOxvB,MAAMc,qBAAqB7C,IAAG,SAO3D2mC,qBAAqBpV,GACnB,OAAIA,EAAOxvB,MAAMgH,yBAEbsnB,IAAA7jB,cAAA,OACEhC,UAAU,eACVknB,QAASA,IAAM/wB,KAAK8lC,gBAAgBlV,KAMxClB,IAAA7jB,cAAA,KACE4jB,KAAMmB,EAAOxvB,MAAMc,qBAAqBi+B,sBACxC4C,OAAO,SACPkD,IAAI,sBACJp8B,UAAU,eACVq8B,UAAQ,IAKd,gCACQlmC,KAAKmmC,2BACXnmC,KAAK6qB,uBAEL,IAAIjW,EAAiBrS,SAASC,eAAe,wBAE7CoS,EAAenS,iBAAiB,wBAA0BtB,IACxD6iC,qBAAqBhkC,KAAKoB,MAAM+nB,WAElCvU,EAAenS,iBAAiB,+BAAiCtB,IAC/D6iC,qBAAqBhkC,KAAKoB,MAAM+nB,WAElCnpB,KAAK6C,SAAS,CAAEuU,OAAQ7U,SAASC,eAAe,gBAEhDpG,OAAOqG,iBAAiB,mBAAqBqQ,IACtC9S,KAAKglC,iBAIwB/iC,IAA9B6Q,EAAExR,OAAOyR,kBAC6C,KAApDD,EAAExR,OAAOyR,iBAAiBotB,wBAC5BvrB,EAAenS,iBAAiB,QAASzC,KAAKqlC,iBAE9CrlC,KAAK6lC,gBAAgB/yB,EAAExR,OAAOyR,iBAAiBotB,0BAKrDngC,KAAKglC,YAAa,EAGpBoB,uBACEpmC,KAAKglC,YAAa,EACGziC,SAASC,eAAe,wBAC9BM,oBAAoB,QAAS9C,KAAKqlC,iBAGnDrd,SACE,OACE0H,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZ+vB,GACAlB,IAAA7jB,cAAA,OAAKwH,GAAG,gBAAgBxJ,UAAU,yBAChC6lB,IAAA7jB,cAACy4B,GAAgB,MAEjB5U,IAAA7jB,cAAA,OAAKhC,UAAU,2BACb6lB,IAAA7jB,cAAA,OAAKwH,GAAG,4BACNqc,IAAA7jB,cAAA,UACED,MAAO,CACL3C,QAAS2nB,EAAOxvB,MAAMgH,yBAClB,QACA,QAENiL,GAAG,uBAGLrT,KAAKoB,MAAM6U,UACXyZ,IAAA7jB,cAAA,OAAKhC,UAAU,gCACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,mCACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,iCACb6lB,IAAA7jB,cAACk4B,GAAU,CAAC5a,QAASnpB,KAAKoB,MAAM+nB,WAEjCnpB,KAAKgmC,qBAAqBpV,KAKjClB,IAAA7jB,cAAA,OAAKhC,UAAU,kCACZ+mB,EAAOxvB,MAAMyR,cAAgB,UACA5Q,IADO2uB,EAAOxvB,MACvCc,qBACHwtB,IAAA7jB,cAAA,OACEwH,GAAG,gBACHzH,MAAO,CACL2O,OAAQ,OACRD,MAAO,OACPuf,SAAUjJ,EAAOxvB,MAAMgH,yBACnB,SACA,OACJa,QAE+B,KAD7B2nB,EAAOxvB,MAAMc,qBACVi+B,sBACC,OACA,aAINzQ,IAAA7jB,cAAA,UACED,MAAO,CACLsS,QAAS0S,EAAOxvB,MAAMgH,yBAClB,IACA,KAENiL,GAAG,gBAIP,MAGNqc,IAAA7jB,cAAA,OAAKhC,UAAU,kCACX7J,KAAKoB,MAAM6U,SAET,KADFyZ,IAAA7jB,cAACu4B,GAAmB,MAItB1U,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,oCAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZI,WAAW,uBACXvD,YAAY,uCAYjBiB,qBAAkBiT,I,OCjYlBsB,OAdf,SAAoBC,GAAY,IAAX,KAAEC,GAAMD,EAE3B,OACE5W,IAAA7jB,cAAA,OAAKhC,UAAU,YACb6lB,IAAA7jB,cAAA,OAAKhC,UAAU,gBAAgB+B,MAAO,CACpC0O,MAAM,GAADnc,OAAKooC,EAAI,KACdroB,QAAS,IAETwR,IAAA7jB,cAAA,OAAKhC,UAAU,gBAAgB08B,EAAK,Q,OCe7BC,OArBf,SAAwBxlC,GAEtB,OACE0uB,IAAA7jB,cAAA,OAAKhC,UAAU,yBAGb6lB,IAAA7jB,cAAA,OACE8jB,IAAK3uB,EAAMie,gBACXrT,MAAO5K,EAAMyoB,aACb5f,UAAU,kBACV+lB,IAAI,KAGNF,IAAA7jB,cAAA,OAAKhC,UAAU,oBACb6lB,IAAA7jB,cAACw6B,GAAW,CAACE,KAAMvlC,EAAMiE,qB,mBCoGlB,WA3Gf,MACElE,cAAe,KAgBf7D,KAAO,KACL8C,KAAKoX,OAAS7U,SAASC,eAAe,mBACtCxC,KAAKkd,MAAQ,IAAIkhB,IACjBp+B,KAAK8+B,cAAgB,IAAIG,KAEzBj/B,KAAKkd,MAAMupB,SAASra,EAAI7oB,KAAK2G,GAE7BlK,KAAK0mC,aACL1mC,KAAK2mC,eACL3mC,KAAK4mC,eACL5mC,KAAK6mC,YACL7mC,KAAK8mC,eAEL1qC,OAAOqG,iBAAiB,SAAUzC,KAAKu+B,oBAEvCv+B,KAAK0+B,2BACL,KAEFoI,aAAe,KACb,MACMjtB,EAAM7Z,KAAK8+B,cAAcplB,KADhB,sCAGf1Z,KAAK+mC,eAAiB,IAAIC,IAAqB,IAAK,GAAI,IACxDhnC,KAAKinC,eAAiB,IAAIC,IAAkB,CAC1CrtB,IAAKA,EACLstB,QAASC,MAEXpnC,KAAKinC,eAAeltB,KAAOstB,IAC3BrnC,KAAKsnC,WAAa,IAAIC,IAAKvnC,KAAK+mC,eAAgB/mC,KAAKinC,gBACrDjnC,KAAKkd,MAAM+N,IAAIjrB,KAAKsnC,aACpB,KAEFE,uBAAyB,CAAC3I,EAAY4I,KACpCznC,KAAK8+B,cAAcplB,KAAKmlB,EAAa1kB,IACpCna,KAAKsnC,WAAWxtB,SAASD,IAAMM,EAC5BstB,GACFA,OAEH,KAEDf,WAAa,KACX1mC,KAAKyW,OAAS,IAAI4nB,IAChB,GACAr+B,KAAK0nC,MAAMptB,MAAQta,KAAK0nC,MAAMntB,OAC9B,GACA,KAEFva,KAAKyW,OAAO/B,SAASgnB,EAAI,GACzB,KAEFiL,aAAe,KACb3mC,KAAKkX,SAAW,IAAIonB,KAAc,CAChCnnB,WAAW,EACXC,OAAQpX,KAAKoX,SAEfpX,KAAKkX,SAAS+B,QAAQjZ,KAAK0nC,MAAMptB,MAAOta,KAAK0nC,MAAMntB,QAEnDva,KAAKkX,SAASkC,cAAc,GAC5BpZ,KAAKkX,SAAS+S,WAAWre,MAAMwT,OAAS,QACxC,KAEFwnB,aAAe,KACb5mC,KAAK2nC,SAAW,IAAIC,KAAc5nC,KAAKyW,OAAQzW,KAAKoX,QACpDpX,KAAK2nC,SAASE,eAAgB,EAC9B7nC,KAAK2nC,SAASG,YAAa,GAC3B,KAEFjB,UAAY,KACV,MAAMkB,EAAQ,IAAIC,IAAa,UAC/BhoC,KAAKkd,MAAM+N,IAAI8c,IACf,KAEFrJ,wBAA0B,KACxB1+B,KAAKkX,SAAS8Q,OAAOhoB,KAAKkd,MAAOld,KAAKyW,QAEtCra,OAAOwtB,sBAAsB,IAAM5pB,KAAK0+B,4BACxC,KAEFH,mBAAqB,KACnBv+B,KAAK0nC,MAAMptB,MAAQle,OAAO8c,WAC1BlZ,KAAK0nC,MAAMntB,OAASne,OAAO+c,YAE3BnZ,KAAKyW,OAAO6H,OAASte,KAAK0nC,MAAMptB,MAAQta,KAAK0nC,MAAMntB,OACnDva,KAAKyW,OAAOM,yBAEZ/W,KAAKkX,SAAS+B,QAAQjZ,KAAK0nC,MAAMptB,MAAOta,KAAK0nC,MAAMntB,QACnDva,KAAKkX,SAASI,cAAc/T,KAAK2M,IAAI9T,OAAOmb,iBAAkB,KArG9DvX,KAAKoX,OAAS,KACdpX,KAAKkd,MAAQ,KACbld,KAAKyW,OAAS,KACdzW,KAAKkX,SAAW,KAChBlX,KAAK8+B,cAAgB,KACrB9+B,KAAK2nC,SAAW,KAChB3nC,KAAK0nC,MAAQ,CACXptB,MAAOle,OAAO8c,WACdqB,OAAQne,OAAO+c,aAEjBnZ,KAAKinC,eAAiB,KACtBjnC,KAAK+mC,eAAiB,KACtB/mC,KAAKsnC,WAAa,OCpBtB,SAASW,GAAcjnC,GACrB,MAAOknC,EAAiBC,GAAsBnY,oBAAS,IACjD,MAAE3V,EAAK,GAAEhH,GAAOrS,EAEhBoR,EAAkB81B,EACpBz6B,EAAanP,qBACX0C,EAAMkvB,SAAS9uB,MAAMwP,oBAEvB5P,EAAMkvB,SAAS9uB,MAAMuP,UAEzB,SAASy3B,IACPpnC,EAAMkvB,SAAS9a,kBAAkB,gBAAgB,GAOnD,OACEsa,IAAA7jB,cAAA,UACEhC,UAAU,sBACVknB,QAPJ,WACEsX,GAAab,uBAAuBntB,EAAO+tB,IAOzCnV,aAAcA,IAAMkV,GAAmB,GACvCjV,aAAcA,IAAMiV,GAAmB,GACvCv8B,MAAO,CAAEwG,oBAERiB,GAaQi1B,OARf,SAAmCtnC,GACjC,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAACo8B,GAAajd,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,O,OCjCzD,SAASqY,GAAevnC,GAAQ,IAADwnC,EAC7B,MAAM,EAAE/oB,GAAMwS,cAEd,OACEvC,IAAA7jB,cAAA,OAAKhC,UAAU,eACb6lB,IAAA7jB,cAAA,OACEhC,UAAU,mBACV+B,MAAO,CAAEwG,gBAAiBpR,EAAMkvB,SAAS9uB,MAAMuP,YAE/C+e,IAAA7jB,cAAA,OACEhC,UAAU,2BACV+B,MAAO,CACLwG,gBAAiB3E,EAAanP,qBAC5B0C,EAAMkvB,SAAS9uB,MAAMuP,aAIzB+e,IAAA7jB,cAAA,KAAGhC,UAAU,iCAAgC,YACjC6lB,IAAA7jB,cAAA,WAAM,IAAE4T,EAAE,WAI1BiQ,IAAA7jB,cAAA,OAAKhC,UAAU,iCACgB,QADe2+B,EAC5CxnC,EAAMkvB,SAAS9uB,MAAMmH,gBAAQ,IAAAigC,OAAA,EAA7BA,EAA+B3uB,IAAK4uB,GAAY/Y,IAAA7jB,cAACo8B,GAAa,CAAC5tB,MAAOouB,EAAQpuB,MAAOhH,GAAIo1B,EAAQp1B,QAc1Fq1B,OARf,SAAoC1nC,GAClC,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAAC08B,GAAcvd,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,O,OClC1D,SAASyY,GAAQ3nC,GACf,MAAOknC,EAAiBC,GAAsBnY,oBAAS,GAEjD0E,EAAS,CACbkU,aAAc5nC,EAAMkvB,SAAS9uB,MAAMoH,0BAC/B,QACA,OACJqgC,qBAAsBX,EAClBlnC,EAAMkvB,SAAS9uB,MAAMwP,mBACrB,WAWN,OAJAk4B,oBAAU,KACR9nC,EAAMkvB,SAAS9uB,MAAMmH,SAAS/I,OAAS,GAAK6oC,GAAanrC,QACxD,CAAC8D,EAAMkvB,SAAS9uB,MAAMmH,SAAS/I,SAGhCkwB,IAAA7jB,cAAC6jB,IAAMuB,SAAQ,KACbvB,IAAA7jB,cAAA,UAAQwH,GAAG,kBAAkBzH,MAAO,CAAE3C,QAASyrB,EAAOkU,gBACtDlZ,IAAA7jB,cAAA,UACEklB,QAZN,WACE/vB,EAAMkvB,SAAS9a,kBAAkB,gBAAgB,IAY7C6d,aAAcA,IAAMkV,GAAmB,GACvCjV,aAAcA,IAAMiV,GAAmB,GACvC90B,GAAG,iBACHzH,MAAO,CACL3C,QAASyrB,EAAOkU,aAChBx2B,gBAAiBsiB,EAAOmU,uBAE3B,MAeQE,OARf,SAA6B/nC,GAC3B,OACE0uB,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAAC88B,GAAO3d,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,OC/CnD,MAAM8Y,GAAiBA,IACjB5sC,OAAO+c,YAAc/c,OAAO8c,WAAmB,WAE5C,YA0CM+vB,OAvCf,WACE,MAAOC,EAAaC,GAAkBnZ,mBAASgZ,MAOzCI,EAA4BA,KAChC,GAAGhtC,OAAO8c,WAAa,IAAK,OAEb3W,SAASC,eAAe,wBAChCoJ,MAAMgtB,cAAgB,QAGzByQ,EAAoBA,KACxBF,EAAeH,MAEK,cAAhBE,GAA6BE,IAEb,aAAhBF,IAhBW3mC,SAASC,eAAe,wBAChCoJ,MAAMgtB,cAAgB,SA+B/B,OAbAkQ,oBAAU,KAEY,aADAE,MACYI,MAGlCN,oBAAU,KACR1sC,OAAOqG,iBAAiB,SAAU4mC,GAE3B,KACLjtC,OAAO0G,oBAAoB,SAAUumC,KAEtC,CAACA,IAEGH,G,OCRMI,OA5Bf,WACE,MAEMrzB,EAAWC,EAAaP,iBACxB4zB,EAAoBN,MACpB,EAAExpB,GAAMwS,cAKd,OAFEhc,GAPgC,aAOpBszB,EAKZ7Z,IAAA7jB,cAAA,OAAKhC,UAAU,0BACb6lB,IAAA7jB,cAAA,SACG4T,EAAE,kBAAkB,IAACiQ,IAAA7jB,cAAA,WACrB4T,EAAE,iBAELiQ,IAAA7jB,cAAA,OAAKhC,UAAU,gCACb6lB,IAAA7jB,cAAA,OACE8jB,IAAI,uDACJC,IAAI,OAX0B,M,cCUxC,MAAM4Z,WAAYthB,YAKhB+F,mBAAmBwb,GACjB,IAAIryB,EAAS7U,SAASC,eAAe,QACjCrB,EAAQ,IAAI+J,YAAY,wBAAyB,CACnD5J,OAAQ,CACN+Q,SAAUo3B,KAGdryB,EAAOjM,cAAchK,GAGvBuoC,iBAAiBtoC,GACf,OAAIA,EAAMK,sBAAwBL,EAAMoG,eAAuB,EACxD,EAGTwgB,SAEE,OACE0H,IAAA7jB,cAAC89B,IAAW,CAACC,QAASC,KACpBna,IAAA7jB,cAAC88B,GAAO,MACRjZ,IAAA7jB,cAACy9B,GAAqB,MACtB5Z,IAAA7jB,cAACi+B,IAAU,CACTpyB,QAAS1X,KAAKgB,MAAMkvB,SAAS9uB,MAAMmG,aACnC4oB,SAAW5oB,GACTvH,KAAKgB,MAAMkvB,SAAS6Z,cAAcxiC,IAGpCmoB,IAAA7jB,cAAA,OAAKwH,GAAG,uBAAuBxJ,UAAS,wBACS,MAA9C7J,KAAKgB,MAAMkvB,SAAS9uB,MAAM6D,gBAA0B,KACnDyqB,IAAA7jB,cAAC26B,GAAc,CACbvhC,gBAAiBjF,KAAKgB,MAAMkvB,SAAS9uB,MAAM6D,gBAC3CwkB,aAAc,CACZxgB,QAAS,QACTgW,gBAAgB,OAAD9gB,OAAS6B,KAAKgB,MAAMkvB,SAAS9uB,MAAMmP,cAAa,QAIrEmf,IAAA7jB,cAAA,UACED,MAAO,CAGLsS,QAASle,KAAK0pC,iBAAiB1pC,KAAKgB,MAAMkvB,SAAS9uB,OAC/C,EACA,EACFw3B,cAAe,QAEnBvlB,GAAG,cAGLqc,IAAA7jB,cAACyzB,GAAO,CACNxuB,WACE9Q,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAASyK,WAC/BnO,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SAASyK,WAAW2C,WAC9C,KAENpI,cAAe1I,KAAKgB,MAAMkvB,SAAS9uB,MAAMsH,cACzClB,eAAgBxH,KAAKgB,MAAMkvB,SAAS9uB,MAAMoG,eAC1CwiC,2BACEhqC,KAAKgB,MAAMkvB,SAAS9uB,MAAM4oC,6BAI7BhqC,KAAKgB,MAAMkvB,SAAS9uB,MAAMK,sBACzBiuB,IAAA7jB,cAACk5B,GAAa,CACZ38B,yBACEpI,KAAKgB,MAAMkvB,SAAS9uB,MAAMgH,yBAE5BlG,qBACElC,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,uBAKhCwtB,IAAA7jB,cAACmlB,EAAc,CAACG,WAAW,EAAMD,iBAAiB,mBAChDxB,IAAA7jB,cAACupB,GAAM,CACLzzB,iBAAkB3B,KAAKgB,MAAMkvB,SAAS9uB,MAAMO,iBAC5C4T,YAAavV,KAAKgB,MAAMkvB,SAAS3a,YAAYgtB,KAAKviC,SAIrDA,KAAKgB,MAAMkvB,SAAS9uB,MAAMmH,SAAS/I,OAAS,GAAKkwB,IAAA7jB,cAAC08B,GAAc,MAEhEvoC,KAAKgB,MAAMkvB,SAAS9uB,MAAMQ,WAAa8tB,IAAA7jB,cAACsrB,GAAO,MAAM,KAEtDzH,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,iBAC/BxB,IAAA7jB,cAAC+rB,GAAO,CACNxwB,aAAcpH,KAAKgB,MAAMkvB,SAAS9uB,MAAMgG,aACxCC,qBACErH,KAAKgB,MAAMkvB,SAAS9uB,MAAMiG,wBAKe,MAA9CrH,KAAKgB,MAAMkvB,SAAS9uB,MAAM6D,gBAA0B,KACnDyqB,IAAA7jB,cAAA,WACE6jB,IAAA7jB,cAACuqB,GAAiB,MAElB1G,IAAA7jB,cAACm3B,GAAiB,MAClBtT,IAAA7jB,cAACmlB,EAAc,CAACE,iBAAiB,2BAC/BxB,IAAA7jB,cAACmoB,EAAa,CACZnD,YAAY,oBACZuD,WAAW,gBAGdp0B,KAAKgB,MAAMkvB,SAAS9uB,MAAMqH,kBACzBinB,IAAA7jB,cAAC+2B,GAAiB,MAChB,OAKVlT,IAAA7jB,cAACoc,EAAY,CACXhjB,gBAAiBjF,KAAKgB,MAAMkvB,SAAS9uB,MAAM6D,gBAC3C5D,aAAcrB,KAAKgB,MAAMkvB,SAAS9uB,MAAMC,aACxC6D,aAAclF,KAAKgB,MAAMkvB,SAAS9uB,MAAM8D,aACxCC,WAAYnF,KAAKgB,MAAMkvB,SAAS9uB,MAAM+D,WACtCC,cAAepF,KAAKgB,MAAMkvB,SAAS9uB,MAAMgE,cACzCkB,cAAetG,KAAKgB,MAAMkvB,SAAS9uB,MAAMkF,cACzCge,wBAAyBtkB,KAAKgB,MAAMkvB,SAAS9uB,MAAMsF,iBACnD2d,oBAAqBrkB,KAAKgB,MAAMkvB,SAAS9uB,MAAMoF,YAC/CD,YAAavG,KAAKgB,MAAMkvB,SAAS9uB,MAAMmF,YACvCjB,WAAYtF,KAAKgB,MAAMkvB,SAAS9uB,MAAMkE,WACtCD,qBACErF,KAAKgB,MAAMkvB,SAAS9uB,MAAMiE,qBAE5B4kC,aAAcjqC,KAAKgB,MAAMkvB,SAAS9uB,MAAMoE,aACxC4B,aAAcpH,KAAKgB,MAAMkvB,SAAS9uB,MAAMgG,aACxCJ,WAAYhH,KAAKgB,MAAMkvB,SAAS9uB,MAAM4F,WACtCF,yBACE9G,KAAKgB,MAAMkvB,SAAS9uB,MAAM0F,yBAE5BC,aAAc/G,KAAKgB,MAAMkvB,SAAS9uB,MAAM2F,aACxC0B,kBAAmBzI,KAAKgB,MAAMkvB,SAAS9uB,MAAMqH,kBAC7C7F,WAAY5C,KAAKgB,MAAMkvB,SAAS9uB,MAAMwB,WACtCgmB,eAAgB5oB,KAAKgB,MAAMkvB,SAAS9uB,MAAMwnB,eAC1ChnB,WAAY5B,KAAKgB,MAAMkvB,SAAS9uB,MAAMQ,WACtCH,qBACEzB,KAAKgB,MAAMkvB,SAAS9uB,MAAMK,qBAE5B+F,eAAgBxH,KAAKgB,MAAMkvB,SAAS9uB,MAAMoG,eAC1C7F,iBAAkB3B,KAAKgB,MAAMkvB,SAAS9uB,MAAMO,iBAC5Cqf,YAAahhB,KAAKgB,MAAMkvB,SAAS9uB,MAAMsC,SACvCgF,cAAe1I,KAAKgB,MAAMkvB,SAAS9uB,MAAMsH,cACzCxG,qBACElC,KAAKgB,MAAMkvB,SAAS9uB,MAAMc,qBAE5ByG,aAAc3I,KAAKgB,MAAMkvB,SAAS9uB,MAAMuH,aACxCtC,wBACErG,KAAKgB,MAAMkvB,SAAS9uB,MAAMiF,wBAE5BZ,cAAezF,KAAKgB,MAAMkvB,SAAS9uB,MAAMqE,cACzCmD,oBAAqB5I,KAAKgB,MAAMkvB,SAAS9uB,MAAMwH,oBAC/CwH,UAAWpQ,KAAKgB,MAAMkvB,SAAS9uB,MAAMgP,UACrCE,mBAAoBtQ,KAAKgB,MAAMkvB,SAAS9uB,MAAMkP,mBAC9CmE,sBACEzU,KAAKgB,MAAMkvB,SAAS9uB,MAAMqT,sBAE5BuZ,OAAQ,CACNC,mBAAoBjuB,KAAKiuB,mBAAmBsU,KAAKviC,YAmBhDkqC,OAVUlpC,GAErB0uB,IAAA7jB,cAACs+B,IAAQ,KACPza,IAAA7jB,cAACykB,IAAS,CAACC,GAAI,CAAC1vB,IACZqvB,GAAaR,IAAA7jB,cAAC29B,GAAGxe,OAAAwF,OAAA,GAAKxvB,EAAK,CAAEkvB,SAAUA,OCpMjDka,IAASpiB,OACP0H,IAAA7jB,cAAC6jB,IAAM2a,WAAU,KACf3a,IAAA7jB,cAAC29B,GAAG,OAENjnC,SAASC,eAAe,StDuHpB,kBAAmBsT,WACrBA,UAAUw0B,cAAcC,MACrB9sB,KAAK+sB,IACJA,EAAaC,eAEd9sB,MAAMjI,IACLhD,QAAQgD,MAAMA,EAAMg1B,a","file":"static/js/main.5a301404.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\r\n// register() is not called by default.\r\n\r\n// This lets the app load faster on subsequent visits in production, and gives\r\n// it offline capabilities. However, it also means that developers (and users)\r\n// will only see deployed updates on subsequent visits to a page, after all the\r\n// existing tabs open on the page have been closed, since previously cached\r\n// resources are updated in the background.\r\n\r\n// To learn more about the benefits of this model and instructions on how to\r\n// opt-in, read https://bit.ly/CRA-PWA\r\n\r\nconst isLocalhost = Boolean(\r\n window.location.hostname === 'localhost' ||\r\n // [::1] is the IPv6 localhost address.\r\n window.location.hostname === '[::1]' ||\r\n // 127.0.0.0/8 are considered localhost for IPv4.\r\n window.location.hostname.match(\r\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\r\n )\r\n);\r\n\r\nexport function register(config) {\r\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\r\n // The URL constructor is available in all browsers that support SW.\r\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\r\n if (publicUrl.origin !== window.location.origin) {\r\n // Our service worker won't work if PUBLIC_URL is on a different origin\r\n // from what our page is served on. This might happen if a CDN is used to\r\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\r\n return;\r\n }\r\n\r\n window.addEventListener('load', () => {\r\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\r\n\r\n if (isLocalhost) {\r\n // This is running on localhost. Let's check if a service worker still exists or not.\r\n checkValidServiceWorker(swUrl, config);\r\n\r\n // Add some additional logging to localhost, pointing developers to the\r\n // service worker/PWA documentation.\r\n navigator.serviceWorker.ready.then(() => {\r\n console.log(\r\n 'This web app is being served cache-first by a service ' +\r\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\r\n );\r\n });\r\n } else {\r\n // Is not localhost. Just register service worker\r\n registerValidSW(swUrl, config);\r\n }\r\n });\r\n }\r\n}\r\n\r\nfunction registerValidSW(swUrl, config) {\r\n navigator.serviceWorker\r\n .register(swUrl)\r\n .then(registration => {\r\n registration.onupdatefound = () => {\r\n const installingWorker = registration.installing;\r\n if (installingWorker == null) {\r\n return;\r\n }\r\n installingWorker.onstatechange = () => {\r\n if (installingWorker.state === 'installed') {\r\n if (navigator.serviceWorker.controller) {\r\n // At this point, the updated precached content has been fetched,\r\n // but the previous service worker will still serve the older\r\n // content until all client tabs are closed.\r\n console.log(\r\n 'New content is available and will be used when all ' +\r\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\r\n );\r\n\r\n // Execute callback\r\n if (config && config.onUpdate) {\r\n config.onUpdate(registration);\r\n }\r\n } else {\r\n // At this point, everything has been precached.\r\n // It's the perfect time to display a\r\n // \"Content is cached for offline use.\" message.\r\n console.log('Content is cached for offline use.');\r\n\r\n // Execute callback\r\n if (config && config.onSuccess) {\r\n config.onSuccess(registration);\r\n }\r\n }\r\n }\r\n };\r\n };\r\n })\r\n .catch(error => {\r\n console.error('Error during service worker registration:', error);\r\n });\r\n}\r\n\r\nfunction checkValidServiceWorker(swUrl, config) {\r\n // Check if the service worker can be found. If it can't reload the page.\r\n fetch(swUrl, {\r\n headers: { 'Service-Worker': 'script' },\r\n })\r\n .then(response => {\r\n // Ensure service worker exists, and that we really are getting a JS file.\r\n const contentType = response.headers.get('content-type');\r\n if (\r\n response.status === 404 ||\r\n (contentType != null && contentType.indexOf('javascript') === -1)\r\n ) {\r\n // No service worker found. Probably a different app. Reload the page.\r\n navigator.serviceWorker.ready.then(registration => {\r\n registration.unregister().then(() => {\r\n window.location.reload();\r\n });\r\n });\r\n } else {\r\n // Service worker found. Proceed as normal.\r\n registerValidSW(swUrl, config);\r\n }\r\n })\r\n .catch(() => {\r\n console.log(\r\n 'No internet connection found. App is running in offline mode.'\r\n );\r\n });\r\n}\r\n\r\nexport function unregister() {\r\n if ('serviceWorker' in navigator) {\r\n navigator.serviceWorker.ready\r\n .then(registration => {\r\n registration.unregister();\r\n })\r\n .catch(error => {\r\n console.error(error.message);\r\n });\r\n }\r\n}\r\n","import i18n from \"i18next\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport LanguageDetector from \"i18next-browser-languagedetector\";\r\n\r\nimport translationEN from \"./translations/translationEN.json\";\r\nimport translationFR from \"./translations/translationFR.json\";\r\nimport translationGR from \"./translations/translationGR.json\";\r\nimport translationSR from \"./translations/translationSR.json\";\r\n\r\nconst resources = {\r\n English: {\r\n translation: translationEN,\r\n },\r\n French: {\r\n translation: translationFR,\r\n },\r\n German: {\r\n translation: translationGR,\r\n },\r\n Serbian: {\r\n translation: translationSR,\r\n },\r\n};\r\n\r\ni18n\r\n .use(LanguageDetector)\r\n .use(initReactI18next)\r\n .init({\r\n debug: true,\r\n fallbackLng: \"French\",\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n resources,\r\n });\r\n\r\nexport default i18n;\r\n","class LocalStorageHelper {\r\n\r\n /**\r\n * Sets data to localstorage.\r\n * @param storageKey Key of value\r\n * @param storageValue Value to save\r\n */\r\n setToLocal(storageKey, storageValue) {\r\n window.localStorage.setItem(storageKey, JSON.stringify(storageValue));\r\n }\r\n}\r\nexport default new LocalStorageHelper();","class StringHelper {\r\n\r\n /**\r\n * Creates a state key string from passed parameters.\r\n * @param type Value which tells us which scene the key is for\r\n * @param resolution Resolution param of the image image\r\n * @param floor Number of the floor of the image\r\n * @param row Number of the row of the image\r\n */\r\n makeStateKey(type, resolution, floor, row) {\r\n return `${type}_${resolution}_${floor}_${row}`;\r\n }\r\n\r\n /**\r\n * Creates image key string from passed parameters.\r\n * @param type Value which tells us which scene the key is for\r\n * @param resolution Resolution in which the image will be fetched in\r\n * @param floor Number of the floor of the image\r\n * @param row Number of the row of the image\r\n * @param column Number of the column of the\r\n */\r\n makeImageKey(type, resolution, floor, row, column) {\r\n return `${type}_${resolution}_${floor}_${row}_${column}`;\r\n }\r\n\r\n /**\r\n * Changes the passed rgba color aplha value to 1.\r\n * @param color Rgba color to be modified\r\n */\r\n removeAplhaFromColor(color) {\r\n if (!color) return \"#192747\";\r\n\r\n const checkRgbaPattern = /^^rgba[(](?:\\s*0*(?:\\d\\d?(?:\\.\\d+)?(?:\\s*%)?|\\.\\d+\\s*%|100(?:\\.0*)?\\s*%|(?:1\\d\\d|2[0-4]\\d|25[0-5])(?:\\.\\d+)?)\\s*,){3}\\s*0*(?:\\.\\d+|1(?:\\.0*)?)\\s*[)]$/g;\r\n const isRgba = color.match(checkRgbaPattern) ? true : false;\r\n\r\n const newColor = isRgba ? color.replace(/[\\d\\.]+\\)$/g, '1)') : color;\r\n return newColor;\r\n }\r\n\r\n convertRGBtoOBJ(colorString) {\r\n if (colorString.includes('rgba')) {\r\n const rgbKeys = ['r', 'g', 'b', 'a'];\r\n let rgbObj = {};\r\n let color = colorString.replace(/^rgba?\\(|\\s+|\\)$/g, '').split(',');\r\n\r\n for (let i in rgbKeys)\r\n rgbObj[rgbKeys[i]] = color[i] || 1;\r\n\r\n return [`rgb(${rgbObj.r}, ${rgbObj.g}, ${rgbObj.b})`, rgbObj.a];\r\n }\r\n return [colorString, 1];\r\n }\r\n\r\n /**\r\n * Returns the first letter of the provided state key.\r\n * @param key Key of the State.\r\n */\r\n getLoadingStateIdentifier(key) {\r\n let apartmentOrBuildingIdentifier = key.split(\"_\");\r\n return apartmentOrBuildingIdentifier[0];\r\n }\r\n\r\n /**\r\n * Method that finds first number in string. \r\n * Returns true when it comes across the first number in string.\r\n * Returns false when string does not contain any number.\r\n * @param stringToCheck String we want to check if it contains number.\r\n */\r\n checkNumbersInSubstring(stringToCheck) {\r\n for (let i = 0; i < stringToCheck.length; i++) {\r\n const ch = stringToCheck[i];\r\n if (ch >= '0' && ch <= '9') {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n parseStateNumber(stateString) {\r\n let string = [];\r\n // Loop thru all characters in string.\r\n for (let i = 0; i < stateString.length; i++) {\r\n let ch = stateString[i];\r\n // Char is number, add it to the array.\r\n if (ch >= '0' && ch <= '9') {\r\n string.push(ch);\r\n }\r\n // Came across character that is not number.\r\n else {\r\n // Take the substring from this element to the end.\r\n let newSubstring = stateString.substring(i, stateString.length);\r\n // Check if there are any more numbers in substring, if we previously found numbers (array.length).\r\n if (string.length > 0) {\r\n if (this.checkNumbersInSubstring(newSubstring)) {\r\n return stateString;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Remove all zeros from array that are infront of the number.\r\n for (let i = 0; i < string.length; i++) {\r\n const element = string[i];\r\n if (element === '0') string.shift();\r\n else break;\r\n }\r\n\r\n // Construct the number from Array of char.\r\n let newString = \"\";\r\n for (let i = 0; i < string.length; i++) {\r\n newString += string[i];\r\n }\r\n\r\n // Check if string is number.\r\n if (newString.length === 0 || isNaN(newString)) return stateString;\r\n return newString;\r\n\r\n }\r\n\r\n rgbStringToArray(rgbColorString) {\r\n if (rgbColorString.length !== 0) {\r\n let strokeColor = [];\r\n\r\n let strokeRgbStringFirstSplit = rgbColorString.split(\"rgb\");\r\n let strokeRgbStringSecondSplit = strokeRgbStringFirstSplit[1].split(\")\")\r\n let strokeRgbStringThirddSplit = strokeRgbStringSecondSplit[0].split(\"(\")\r\n let strokeRgbStringForthSplit = strokeRgbStringThirddSplit[1].split(\",\")\r\n\r\n let thenum = strokeRgbStringForthSplit[0].match(/\\d+/)[0]\r\n let r = parseInt(thenum)\r\n let effectR = r / 255\r\n strokeColor.push(effectR)\r\n thenum = strokeRgbStringForthSplit[1].match(/\\d+/)[0]\r\n let g = parseInt(thenum);\r\n let effectG = g / 255\r\n strokeColor.push(effectG);\r\n thenum = strokeRgbStringForthSplit[2].match(/\\d+/)[0]\r\n let b = parseInt(thenum);\r\n let effectB = b / 255\r\n strokeColor.push(effectB);\r\n\r\n return strokeColor;\r\n } else return;\r\n }\r\n\r\n\r\n}\r\n\r\nexport default new StringHelper();\r\n","import { Container } from \"unstated\";\r\n\r\nimport localStorageHelper from \"../utils/helpers/localStorageHelper\";\r\nimport stringHelper from \"../utils/helpers/stringHelper\";\r\n\r\nexport default class StateContainer extends Container {\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n jsonData: {},\r\n\r\n loadingProgress: 0,\r\n //We will get this value from the project json\r\n currentState: 0,\r\n currentRow: 0,\r\n currentColumn: 0,\r\n currentHotspotColumn: 0,\r\n maxColumns: 59,\r\n maxApartmentColumns: 59,\r\n\r\n rowsPerState: [],\r\n\r\n hotspotColors: {\r\n T1: {\r\n DefaultColor: \"\",\r\n DefaultOpacity: \"\",\r\n\r\n HoverColor: \"\",\r\n HoverOpacity: \"\",\r\n\r\n StrokeColor: \"\",\r\n StrokeOpacity: \"\",\r\n },\r\n T2: {\r\n DefaultColor: \"\",\r\n HoverColor: \"\",\r\n StrokeColor: \"\",\r\n },\r\n T3: {\r\n DefaultColor: \"\",\r\n HoverColor: \"\",\r\n StrokeColor: \"\",\r\n },\r\n T4: {\r\n DefaultColor: \"\",\r\n HoverColor: \"\",\r\n StrokeColor: \"\",\r\n },\r\n T5: {\r\n DefaultColor: \"\",\r\n HoverColor: \"\",\r\n StrokeColor: \"\",\r\n },\r\n },\r\n hotspotUnavailableColor: \"\",\r\n\r\n currentFilter: [],\r\n currentTags: [],\r\n priceFilter: {},\r\n priceValues: [],\r\n quadratureFilter: {},\r\n quadratureValues: [],\r\n\r\n fov: 100,\r\n spriteScale: 3,\r\n cameraDistanceMultiplier: 0.01,\r\n hotspotScale: 0.01,\r\n cameraZoom: 0,\r\n minZoom: 0,\r\n maxZoom: 0,\r\n zoomStep: 0.02,\r\n\r\n hotspotAngle: 0,\r\n compassStartingAngle: null,\r\n navbarScrollbarLogo: \"./design/new-exports/mag_znak.png\",\r\n\r\n isMouseOnSideBar: false,\r\n isSideBarOpen: false,\r\n isFullscreen: false,\r\n\r\n isMapShown: false,\r\n isCompareShown: false,\r\n isUpButtonShown: true,\r\n isDownButtonShown: true,\r\n isLeftButtonShown: true,\r\n isRightButtonShown: true,\r\n isCompasShown: true,\r\n isFilterMenuShown: true,\r\n isInvestorLogoShown: true,\r\n magLogoVisible: false,\r\n isFullscreenButtonShown: true,\r\n isApartmentFullscreenButtonShown: true,\r\n isMainMenuShown: true,\r\n isApartment3DCanvasShown: false,\r\n apartmentViewButton: true,\r\n apartment3DViewButton: true,\r\n\r\n orbViews: [],\r\n shouldDisplayOrbViewScene: false,\r\n\r\n calibratorEnabled: false,\r\n\r\n isApartmentInfoShown: false,\r\n apartmentClickedInfo: undefined,\r\n waitForImage: false,\r\n //Used in compare logic\r\n allApartments: [],\r\n linkHotspots: [],\r\n favouriteApartments: null,\r\n favouriteApartmentsDetails: [],\r\n //Drag variables\r\n startDragPosition: [0, 0],\r\n isClicked: false,\r\n isDragging: false,\r\n\r\n leftCompare3DContainerActive: false, \r\n leftApartmentStyles: {\r\n D2: { display: \"block\" },\r\n D3: { display: \"none\" },\r\n },\r\n rightCompare3DContainerActive: false, \r\n rightApartmentStyles: {\r\n D2: { display: \"block\" },\r\n D3: { display: \"none\" },\r\n },\r\n\r\n carouselCompareSettings: {\r\n dots: false,\r\n infinite: true,\r\n arrows: true,\r\n speed: 200,\r\n slidesToShow: 3,\r\n slidesToScroll: 1,\r\n adaptiveHeight: false,\r\n className: \"compare__header--apartment\",\r\n responsive: [\r\n {\r\n breakpoint: 777,\r\n settings: {\r\n slidesToShow: 2,\r\n slidesToScroll: 1,\r\n },\r\n },\r\n {\r\n breakpoint: 827,\r\n settings: {\r\n slidesToShow: 3,\r\n slidesToScroll: 1,\r\n },\r\n },\r\n {\r\n breakpoint: 1231,\r\n settings: {\r\n slidesToShow: 3,\r\n slidesToScroll: 1,\r\n },\r\n },\r\n {\r\n breakpoint: 1401,\r\n settings: {\r\n slidesToShow: 4,\r\n slidesToScroll: 1,\r\n },\r\n },\r\n {\r\n breakpoint: 1921,\r\n settings: {\r\n slidesToShow: 5,\r\n slidesToScroll: 2,\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n\r\n let angleStep = (2 * Math.PI) / this.state.maxColumns;\r\n this.state.hotspotAngle = -1 * angleStep * this.state.currentColumn;\r\n this.attachEventListeners();\r\n }\r\n\r\n /**\r\n * Gets an array of apartment keys from localstorage and sets them into state.\r\n */\r\n async fetchFavouriteApartments() {\r\n let favApartmentsDetails = [];\r\n let keys = window.localStorage.getItem(\"favourite-apartments\");\r\n if (keys !== null) {\r\n keys = JSON.parse(keys);\r\n // Check the favourite apartment keys if they exist in list of all apartments.\r\n for (let i = 0; i < keys.length; i++) {\r\n if (this.state.allApartments[keys[i]] !== undefined) {\r\n favApartmentsDetails.push(this.state.allApartments[keys[i]]);\r\n }\r\n }\r\n } else {\r\n keys = [];\r\n localStorageHelper.setToLocal(\"favourite-apartments\", keys);\r\n this.setState({ favouriteApartments: keys });\r\n }\r\n\r\n await this.setState({\r\n favouriteApartmentsDetails: favApartmentsDetails,\r\n favouriteApartments: keys,\r\n });\r\n }\r\n\r\n /**\r\n * Adds the passed apartment key to localstorage and that apartments info into a dictionary.\r\n * @param apartmentKey Key of the apartment we are adding\r\n */\r\n addFavourite(apartmentKey) {\r\n let favouriteApartmentsDetails = this.state.favouriteApartmentsDetails;\r\n if (this.state.allApartments[apartmentKey] !== undefined) {\r\n // Set up detail\r\n favouriteApartmentsDetails.push(this.state.allApartments[apartmentKey]);\r\n this.setState({ favouriteApartmentsDetails });\r\n // Set up key\r\n let tempFavourite = this.state.favouriteApartments;\r\n tempFavourite.push(apartmentKey);\r\n\r\n this.setState({ favouriteApartments: tempFavourite });\r\n\r\n let localApartments = window.localStorage.getItem(\"favourite-apartments\");\r\n\r\n if (localApartments !== null) {\r\n window.localStorage.removeItem(\"favourite-apartments\");\r\n }\r\n window.localStorage.setItem(\r\n \"favourite-apartments\",\r\n JSON.stringify(this.state.favouriteApartments)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Removes the passed apartment key from localstorage and that apartments info from a dictionary.\r\n * @param apartmentKey Key of the apartment we are removing\r\n */\r\n async removeFavorite(apartmentKey) {\r\n let keys = this.state.favouriteApartments;\r\n let tempFavourite = this.state.favouriteApartmentsDetails;\r\n\r\n let indexOfKeys = keys.indexOf(apartmentKey);\r\n\r\n // Find and remove favourite apartment info.\r\n for (let i = 0; i < tempFavourite.length; i++) {\r\n if (tempFavourite[i].key === apartmentKey) {\r\n tempFavourite.splice(i, 1);\r\n this.setState({\r\n favouriteApartmentsDetails: tempFavourite,\r\n });\r\n break;\r\n }\r\n }\r\n\r\n // Remove favourite key from the array.\r\n if (indexOfKeys !== -1) {\r\n keys.splice(indexOfKeys, 1);\r\n await this.setState({\r\n favouriteApartments: keys,\r\n });\r\n }\r\n\r\n // Update Local Storage\r\n window.localStorage.setItem(\"favourite-apartments\", JSON.stringify(keys));\r\n }\r\n\r\n /**\r\n * Toggles display of side menu.\r\n */\r\n toggleSideMenu() {\r\n this.setState({ isSideBarOpen: !this.state.isSideBarOpen });\r\n }\r\n\r\n /**\r\n * Turns off display of the compare page.\r\n */\r\n toggleCompareShownOff() {\r\n this.setState({\r\n isCompareShown: false,\r\n isApartmentInfoShown: false,\r\n apartmentClickedInfo: undefined,\r\n });\r\n\r\n let event = new CustomEvent(\"closeCompareWindow\");\r\n window.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Triggers an event to start rendering the main canvas.\r\n */\r\n renderMainCanvas() {\r\n let event = new CustomEvent(\"renderMainCanvas\");\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Takes values from the statecontainer and dispatches them to an event to update the apartment 3D view texture.\r\n */\r\n updateApartmentTextureHandler() {\r\n let parameters = [];\r\n parameters.push(this.state.currentState);\r\n parameters.push(this.state.apartmentClickedInfo.key);\r\n parameters.push(this.state.currentHotspotColumn);\r\n\r\n let lowUrlPath =\r\n this.state.apartmentClickedInfo.lowResUrls[\r\n this.state.currentHotspotColumn\r\n ];\r\n parameters.push(lowUrlPath);\r\n let event = new CustomEvent(\"updateApartmentTexture\", {\r\n detail: {\r\n parameters: parameters,\r\n },\r\n });\r\n\r\n window.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Takes a an url to a font and imports and applies it.\r\n * @param fontUrl Url for the font hosted on umbraco\r\n */\r\n setProjectFont(fontUrl) {\r\n let css = \"\";\r\n\r\n if (fontUrl) {\r\n css = `@font-face {\r\n font-family: \"Our font\";\r\n src: url(${fontUrl});\r\n }`;\r\n }\r\n const style = document.createElement(\"style\");\r\n if (style.styleSheet) {\r\n style.styleSheet.cssText = css;\r\n } else {\r\n style.appendChild(document.createTextNode(css));\r\n }\r\n document.getElementsByTagName(\"head\")[0].appendChild(style);\r\n }\r\n\r\n /**\r\n * Parses passed states array and sets an array of unavailable apartments into the state container.\r\n * @param states Array of states from the API\r\n */\r\n getUnavailableApartmentsAndFilters(states) {\r\n const unavailableApartments = [];\r\n const filters = [];\r\n states.forEach((state) => {\r\n if (state.apartments) {\r\n state.apartments.forEach((apartment) => {\r\n if (!apartment.isAvailable) {\r\n unavailableApartments.push(apartment.key);\r\n }\r\n if (!filters.includes(apartment.type) && apartment.type !== \"\") {\r\n filters.push(apartment.type);\r\n }\r\n });\r\n }\r\n });\r\n filters.sort();\r\n this.setState({ availableFilters: filters });\r\n }\r\n\r\n setCustomStateButtons(states, buttons) {\r\n let buttonArray = buttons;\r\n states.forEach((state) => {\r\n buttonArray.forEach((button) => {\r\n if (button.actions[0].parameter === state.name) {\r\n button.placementOrder = state.placementOrder;\r\n }\r\n });\r\n });\r\n buttonArray.sort((a, b) => a.placementOrder - b.placementOrder);\r\n return buttonArray;\r\n }\r\n\r\n setHotspotColors(hotspotColors) {\r\n let colors = [\"T1\", \"T2\", \"T3\", \"T4\", \"T5\"];\r\n\r\n let convertedColors = {};\r\n colors.forEach((colorKey) => {\r\n let defaultColors = stringHelper.convertRGBtoOBJ(\r\n hotspotColors[colorKey].defaultColor\r\n );\r\n let hoverColors = stringHelper.convertRGBtoOBJ(\r\n hotspotColors[colorKey].hoverColor\r\n );\r\n let strokeColors = stringHelper.convertRGBtoOBJ(\r\n hotspotColors[colorKey].strokeColor\r\n );\r\n\r\n convertedColors[colorKey] = {\r\n defaultColor: defaultColors[0],\r\n defaultOpacity: parseFloat(defaultColors[1]),\r\n\r\n hoverColor: hoverColors[0],\r\n hoverOpacity: parseFloat(hoverColors[1]),\r\n\r\n strokeColor: strokeColors[0],\r\n strokeOpacity: parseFloat(strokeColors[1]),\r\n };\r\n });\r\n\r\n return convertedColors;\r\n }\r\n\r\n /**\r\n * Function that is bound to an event.\r\n * Takes data from the API and stores it into state.\r\n * @param event Event parameter\r\n */\r\n async setJsonData(event) {\r\n this.angleStep = (2 * Math.PI) / event.detail.jsonData.maxColumns;\r\n this.getUnavailableApartmentsAndFilters(event.detail.jsonData.states);\r\n const states = event.detail.jsonData.states;\r\n\r\n let sortedButtons = this.setCustomStateButtons(\r\n event.detail.jsonData.states,\r\n event.detail.jsonData.skinEditor.customButtons\r\n );\r\n let hotspotColors = this.setHotspotColors(\r\n event.detail.jsonData.hotspotColors\r\n );\r\n\r\n let allApartments = [];\r\n let orbViews = [];\r\n let linkHotspots = [];\r\n let minPrice = 0;\r\n let maxPrice = 0;\r\n let minQuadrature = 0;\r\n let maxQuadrature = 0;\r\n\r\n // Load all Apartments into array.\r\n for (let i = 0; i < states.length; i++) {\r\n if (states[i].apartments.length > 0) {\r\n let apartments = states[i].apartments;\r\n for (let j = 0; j < apartments.length; j++) {\r\n if (apartments[j].isLink === true) linkHotspots.push(apartments[j]);\r\n // Find min and max price\r\n if (apartments[j].price !== undefined) {\r\n if (apartments[j].price < minPrice) {\r\n minPrice = apartments[j].price;\r\n } else if (apartments[j].price > maxPrice) {\r\n maxPrice = apartments[j].price;\r\n }\r\n }\r\n // Find min and max quadrature\r\n if (apartments[j].quadrature !== undefined) {\r\n if (apartments[j].quadrature < minQuadrature) {\r\n minQuadrature = apartments[j].quadrature;\r\n } else if (apartments[j].quadrature > maxQuadrature) {\r\n maxQuadrature = apartments[j].quadrature;\r\n }\r\n }\r\n allApartments[apartments[j].key] = apartments[j];\r\n }\r\n }\r\n }\r\n\r\n if(event.detail.jsonData.view360s) {\r\n const views360 = event.detail.jsonData.view360s;\r\n \r\n for (let index = 0; index < views360.length; index++) {\r\n const view360 = views360[index];\r\n orbViews.push(view360)\r\n }\r\n }\r\n\r\n\r\n await this.setState({\r\n maxZoom: event.detail.jsonData.maxZoom,\r\n minZoom: event.detail.jsonData.minZoom,\r\n cameraZoom: event.detail.jsonData.minZoom,\r\n calibratorEnabled: event.detail.jsonData.enableCalibrator,\r\n jsonData: event.detail.jsonData,\r\n\r\n isBalconFilterShown:\r\n event.detail.jsonData.skinEditor.balconyFilterVisibility,\r\n isGardenFilterVisibility:\r\n event.detail.jsonData.skinEditor.gardenFilterVisibility,\r\n isParkingFilterVisibility:\r\n event.detail.jsonData.skinEditor.parkingFilterVisibility,\r\n isTerraceFilterVisibility:\r\n event.detail.jsonData.skinEditor.terraceFilterVisibility,\r\n isGalleryFilterShown:\r\n event.detail.jsonData.skinEditor.galleryFilterVisibility, \r\n isPricingFilterShown:\r\n event.detail.jsonData.skinEditor.pricingFilterVisibility,\r\n isGarageFilterShown:\r\n event.detail.jsonData.skinEditor.garageFilterVisibility,\r\n isDuplexFilterShown:\r\n event.detail.jsonData.skinEditor.duplexFilterVisibility,\r\n\r\n priceValues: [minPrice, maxPrice],\r\n priceFilter: { min: minPrice, max: maxPrice },\r\n quadratureValues: [minQuadrature, maxQuadrature],\r\n quadratureFilter: { min: minQuadrature, max: maxQuadrature },\r\n\r\n loaderImg: event.detail.jsonData.loaderImageUrl,\r\n threeSixtyImageUrl: event.detail.jsonData.threeSixtyImageUrl,\r\n loadingScreen: event.detail.jsonData.loadingScreenBackgroundUrl,\r\n\r\n maxColumns: event.detail.jsonData.maxColumns,\r\n currentRow: event.detail.jsonData.currentRow,\r\n currentState: event.detail.jsonData.currentState,\r\n rowsPerState: event.detail.jsonData.rowsPerState,\r\n currentColumn: event.detail.jsonData.currentColumn,\r\n\r\n linkHotspots: linkHotspots,\r\n allApartments: allApartments,\r\n hotspotColors: hotspotColors,\r\n googleMapView: event.detail.jsonData.googleMapView,\r\n hotspotUnavailableColor: event.detail.jsonData.unavailableHotspotColor,\r\n\r\n hotspotAngle: -1 * this.angleStep * event.detail.jsonData.currentColumn,\r\n\r\n /* Skin Editor Properties */\r\n menuColor: event.detail.jsonData.skinEditor.menuColor || \"rgba(14, 47, 76, 0.81)\",\r\n menuColorSecondary: event.detail.jsonData.skinEditor.secondaryMenuColor || \"rgba(163, 196, 117, 0.81)\",\r\n clientLogo: event.detail.jsonData.skinEditor.clientLogo,\r\n projectLogo: event.detail.jsonData.skinEditor.projectLogo,\r\n customButtons: sortedButtons,\r\n menuVisibility: event.detail.jsonData.skinEditor.menuVisibility,\r\n magLogoVisible: event.detail.jsonData.skinEditor.magLogoVisible,\r\n compassPointer: event.detail.jsonData.skinEditor.compassArrowUrl,\r\n compassFrame: event.detail.jsonData.skinEditor.compassBackgroundUrl,\r\n compassStartingAngle:\r\n event.detail.jsonData.skinEditor.compassStartingAngle,\r\n\r\n orbViews: orbViews,\r\n button2DHeader: \r\n event.detail.jsonData.skinEditor.button2DHeader,\r\n button2DBody:\r\n event.detail.jsonData.skinEditor.button2DBody,\r\n button2DImageUrl:\r\n event.detail.jsonData.skinEditor.button2DImage,\r\n button3DHeader:\r\n event.detail.jsonData.skinEditor.button3DHeader,\r\n button3DBody:\r\n event.detail.jsonData.skinEditor.button3DBody,\r\n button3DImageUrl:\r\n event.detail.jsonData.skinEditor.button3DImage \r\n });\r\n\r\n // Set document title\r\n document.title = event.detail.jsonData.name;\r\n // Set Favourite Apartments\r\n this.setSliderBackgroundColor(event.detail.jsonData.skinEditor.menuColor);\r\n this.setActiveSliderBackgroundColor();\r\n this.fetchFavouriteApartments();\r\n this.setProjectFont(event.detail.jsonData.skinEditor.fontUrl);\r\n\r\n let setupDoneEvent = new CustomEvent(\"setupDefaultState\", {\r\n detail: {\r\n priceValues: {\r\n min: minPrice,\r\n max: maxPrice,\r\n },\r\n quadratureValues: {\r\n min: minQuadrature,\r\n max: maxQuadrature,\r\n },\r\n },\r\n });\r\n\r\n window.dispatchEvent(setupDoneEvent);\r\n }\r\n\r\n /**\r\n * Changes the color of the slider background.\r\n * @param color Color to which the backgroud color is switched to\r\n */\r\n async setSliderBackgroundColor(color) {\r\n const tracks = await document.getElementsByClassName(\r\n \"input-range__track--background\"\r\n );\r\n\r\n for (let i = 0; i < tracks.length; i++) {\r\n let track = tracks[i];\r\n track.style.backgroundColor = stringHelper.removeAplhaFromColor(color);\r\n }\r\n }\r\n\r\n setActiveSliderBackgroundColor() {\r\n const tracks = document.getElementsByClassName(\"input-range__track--active\");\r\n\r\n for (let i = 0; i < tracks.length; i++) {\r\n let track = tracks[i];\r\n track.style.backgroundColor = stringHelper.removeAplhaFromColor(this.state.menuColorSecondary);\r\n }\r\n }\r\n\r\n /**\r\n * Function that is bound to an event and updates the loading proggress.\r\n * @param event Event parameter\r\n */\r\n async updateLoadingProgress(event) {\r\n await this.setState({\r\n loadingProgress: event.detail.newValue,\r\n });\r\n if (this.state.loadingProgress === 100) {\r\n this.attachDragEvents();\r\n this.attachCustomEvents();\r\n let customEvent = new CustomEvent(\"LoadingFinished\");\r\n window.dispatchEvent(customEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Displays the showApartment page.\r\n * @param event Event parameter\r\n */\r\n async toggleApartmentInfo(event) {\r\n let apartmentKey = event.detail.apartmentKey;\r\n\r\n let apartmentCount =\r\n this.state.jsonData.states[this.state.currentState].apartments.length;\r\n if (apartmentCount <= 0) {\r\n console.warn(`State ${this.state.currentState} has no apartments!`);\r\n return;\r\n }\r\n\r\n this.setClickedApartmentState(apartmentCount, apartmentKey);\r\n await this.setState({\r\n apartmentClickedInfo: this.state.allApartments[apartmentKey],\r\n currentHotspotColumn: 0,\r\n isApartmentInfoShown: true,\r\n isApartment3DCanvasShown: false,\r\n isClickedOn3D: false,\r\n });\r\n\r\n let e = new CustomEvent(\"ApartmentInfoSet\", {\r\n detail: {\r\n clickedApartment: this.state.apartmentClickedInfo,\r\n },\r\n });\r\n\r\n window.dispatchEvent(e);\r\n }\r\n\r\n\r\n /**\r\n * Puts the clicked apartments information into state.\r\n * @param apartmentCount Number of apartments in that state\r\n * @param apartmentKey Key of the clicked apartment\r\n */\r\n setClickedApartmentState(apartmentCount, apartmentKey) {\r\n for (var i = 0; i < apartmentCount; i++) {\r\n if (\r\n this.state.jsonData.states[this.state.currentState].apartments[i]\r\n .key === apartmentKey\r\n ) {\r\n this.state.apartmentClickedInfo =\r\n this.state.jsonData.states[this.state.currentState].apartments[i];\r\n this.state.maxApartmentColumns =\r\n this.state.apartmentClickedInfo.highResUrls.length;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Turns off the display of the showApartment page.\r\n */\r\n async toggleApartmentInfoOff() {\r\n this.dettachDragEventsForApartment();\r\n\r\n this.renderMainCanvas();\r\n await this.setState({\r\n isApartmentInfoShown: false,\r\n apartmentClickedInfo: undefined,\r\n });\r\n }\r\n\r\n /**\r\n * Increases zoom value in main scene.\r\n */\r\n increaseCameraZoom() {\r\n if (this.state.cameraZoom + this.state.zoomStep > this.state.maxZoom) {\r\n return;\r\n }\r\n this.setState({\r\n cameraZoom: (this.state.cameraZoom += this.state.zoomStep),\r\n });\r\n }\r\n\r\n /**\r\n * Decreases zoom value in main scene.\r\n */\r\n decreaseCameraZoom() {\r\n if (this.state.cameraZoom - this.state.zoomStep < this.state.minZoom) {\r\n return;\r\n }\r\n this.setState({\r\n cameraZoom: (this.state.cameraZoom -= this.state.zoomStep),\r\n });\r\n }\r\n\r\n /**\r\n * Turns on display of google map view.\r\n */\r\n async toggleMapOn() {\r\n await this.setState({ isMapShown: true });\r\n this.dettachDragEvents();\r\n }\r\n\r\n /**\r\n * Turns off display of google map view.\r\n */\r\n toggleMapOff() {\r\n this.setState({ isMapShown: false });\r\n this.attachDragEvents();\r\n }\r\n\r\n /**\r\n * Sets which apartment is being viewed in one of the two ApartmentViewerBoxes in the compare page.\r\n * @param id Id of the apartment\r\n * @param selector Number which identifies to which container the apartment is being set\r\n */\r\n setApartmentViewed(id, selector) {\r\n if (selector === 1) {\r\n this.setState({ firstApartmentViewer: id });\r\n return;\r\n }\r\n this.setState({ secondApartmentViewer: id });\r\n }\r\n\r\n /**\r\n * Turns fullscreen on/off depending which value is passed.\r\n * @param isFullscreen A value to which the fullscreen state will be set to\r\n */\r\n async setFullscreen(isFullscreen) {\r\n await this.setState({ isFullscreen });\r\n }\r\n\r\n /**\r\n * Toggles fullscreen on/off.\r\n */\r\n toggleFullscreen() {\r\n this.setState({ isFullscreen: !this.state.isFullscreen });\r\n }\r\n\r\n /**\r\n * Adds filter values to a filter array.\r\n * If a value is already present if is removed.\r\n * Triggers a render.\r\n * @param filter Filter value which is being added/removed\r\n */\r\n setCurrentFilter(filter) {\r\n const event = new CustomEvent(\"sceneNeedsRender\");\r\n\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(event);\r\n\r\n if (this.state.currentFilter.includes(filter)) {\r\n this.state.currentFilter.forEach((tag, index) => {\r\n if (tag === filter) {\r\n this.state.currentFilter.splice(index, 1);\r\n }\r\n });\r\n } else {\r\n this.state.currentFilter.push(filter);\r\n }\r\n }\r\n\r\n /**\r\n * Adds a tag to an array of tags used for filtering.\r\n * If a value is already present if is removed.\r\n * Triggers a render.\r\n * @param newTag Tag which is being added/removed\r\n */\r\n setCurrentTag(newTag) {\r\n const event = new CustomEvent(\"sceneNeedsRender\");\r\n\r\n if (this.state.currentTags.includes(newTag)) {\r\n this.state.currentTags.forEach((tag, index) => {\r\n if (tag === newTag) {\r\n this.state.currentTags.splice(index, 1);\r\n }\r\n });\r\n } else {\r\n this.state.currentTags.push(newTag);\r\n }\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(event);\r\n }\r\n\r\n async setPriceFilter(valueRange) {\r\n await this.setState({ priceFilter: valueRange });\r\n }\r\n\r\n async setQuadratureFilter(valueRange) {\r\n await this.setState({ quadratureFilter: valueRange });\r\n }\r\n\r\n /**\r\n * Changes the current column and angle of hotspots.\r\n */\r\n async panLeft() {\r\n if (this.state.waitForImage || this.state.isMapShown) return;\r\n\r\n //Rotate hotspot logic\r\n const angleStep = (2 * Math.PI) / this.state.maxColumns;\r\n this.setState({\r\n hotspotAngle: (this.state.hotspotAngle += angleStep),\r\n });\r\n\r\n //State logic\r\n if (this.state.currentColumn === 0) {\r\n await this.setState((state) => {\r\n return { currentColumn: state.maxColumns - 1 };\r\n });\r\n } else {\r\n await this.setState((state) => {\r\n return { currentColumn: state.currentColumn - 1 };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Changes the current column and angle of hotspots.\r\n */\r\n async panRight() {\r\n if (this.state.waitForImage || this.state.isMapShown) return;\r\n\r\n const angleStep = (2 * Math.PI) / this.state.maxColumns;\r\n this.setState({\r\n hotspotAngle: (this.state.hotspotAngle -= angleStep),\r\n });\r\n\r\n if (this.state.currentColumn === this.state.maxColumns - 1) {\r\n await this.setState((state) => {\r\n return { currentColumn: 0 };\r\n });\r\n } else {\r\n await this.setState((state) => {\r\n return { currentColumn: state.currentColumn + 1 };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Changes the current row.\r\n */\r\n async panUp() {\r\n if (this.state.waitForImage || this.state.isMapShown) return;\r\n if (\r\n this.state.rowsPerState[this.state.currentState] - 1 ===\r\n this.state.currentRow\r\n ) {\r\n await this.setState((state) => {\r\n return { currentRow: 0 };\r\n });\r\n } else {\r\n await this.setState((state) => {\r\n return { currentRow: state.currentRow + 1 };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Changes the current row.\r\n */\r\n async panDown() {\r\n if (this.state.waitForImage || this.state.isMapShown) return;\r\n if (this.state.currentRow === 0) {\r\n await this.setState((state) => {\r\n return {\r\n currentRow: state.rowsPerState[state.currentState] - 1,\r\n };\r\n });\r\n } else {\r\n await this.setState((state) => {\r\n return { currentRow: state.currentRow - 1 };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Changes the current floor to the passed parameter.\r\n * @param floor Which floor/state to switch to\r\n */\r\n async updateCurrentFloor(floor) {\r\n if (this.state.waitForImage || this.state.isMapShown) return;\r\n\r\n await this.setState({\r\n currentState: floor,\r\n currentRow: 0,\r\n });\r\n }\r\n\r\n /**\r\n * Finds the floor whose name has been passed in the parameter and changes currentState to its id.\r\n * @param stateName Name of the state which we are switching to\r\n */\r\n updateCurrentFloorByButton(stateName) {\r\n if (this.state.isMapShown) return;\r\n this.state.jsonData.states.forEach((state) => {\r\n if (state.name === stateName) {\r\n this.setState({\r\n currentState: state.id,\r\n currentRow: 0,\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Changes the current column for the apartment 3d view.\r\n */\r\n async panLeftApartment() {\r\n if (this.state.currentHotspotColumn === 0) {\r\n await this.setState((state) => {\r\n return {\r\n currentHotspotColumn: state.maxApartmentColumns - 1,\r\n };\r\n });\r\n } else {\r\n await this.setState((state) => {\r\n return {\r\n currentHotspotColumn: state.currentHotspotColumn - 1,\r\n };\r\n });\r\n }\r\n this.updateApartmentTextureHandler();\r\n }\r\n\r\n /**\r\n * Changes the current column for the apartment 3d view.\r\n */\r\n async panRightApartment() {\r\n if (\r\n this.state.currentHotspotColumn ===\r\n this.state.maxApartmentColumns - 1\r\n ) {\r\n await this.setState((state) => {\r\n return { currentHotspotColumn: 0 };\r\n });\r\n } else {\r\n await this.setState((state) => {\r\n return {\r\n currentHotspotColumn: state.currentHotspotColumn + 1,\r\n };\r\n });\r\n }\r\n this.updateApartmentTextureHandler();\r\n }\r\n\r\n /**\r\n * Function that sets the event value to state.\r\n * @param event Event parameter\r\n */\r\n blockStateControls = (event) => {\r\n this.state.waitForImage = event.detail.value;\r\n };\r\n\r\n /**\r\n * Sets isMouseOnSidebar to true.\r\n */\r\n onSideBarMouseEnter() {\r\n if (this.state.isMouseOnSideBar) return;\r\n this.setState({ isMouseOnSideBar: true });\r\n }\r\n\r\n /**\r\n * Sets isMouseOnSidebar to false.\r\n */\r\n onSideBarMouseLeave() {\r\n if (this.state.isMouseOnSideBar) {\r\n this.setState({ isMouseOnSideBar: false });\r\n }\r\n }\r\n\r\n /**\r\n * Attaches event listeners.\r\n */\r\n attachEventListeners() {\r\n let rootElement = document.getElementById(\"root\");\r\n rootElement.addEventListener(\"setJsonData\", (event) => {\r\n this.setJsonData(event);\r\n });\r\n rootElement.addEventListener(\"updateLoadingProgress\", (event) => {\r\n this.updateLoadingProgress(event);\r\n });\r\n\r\n window.addEventListener(\"addFavourite\", (event) => {\r\n this.addFavourite(event.detail.key);\r\n });\r\n window.addEventListener(\"removeFavourite\", (event) => {\r\n this.removeFavorite(event.detail.key);\r\n });\r\n\r\n window.addEventListener(\"keydown\", (e) => {\r\n if (e.key === \"F11\") {\r\n e.preventDefault();\r\n this.toggleFullscreen();\r\n }\r\n });\r\n\r\n window.addEventListener(\"setTargetDefaultPosition\", (event) => {\r\n this.setState({ targetDefaultPosition: event.detail.position });\r\n });\r\n }\r\n\r\n /**\r\n * Attaches custom events.\r\n */\r\n attachCustomEvents() {\r\n if (this.state.menuVisibility) {\r\n let sideMenu = document.getElementById(\"side-menu\");\r\n\r\n sideMenu.addEventListener(\"mouseover\", (event) => {\r\n this.onSideBarMouseEnter();\r\n });\r\n\r\n sideMenu.addEventListener(\"mouseleave\", (event) => {\r\n this.onSideBarMouseLeave();\r\n });\r\n }\r\n\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n\r\n fullscreenNode.addEventListener(\"imageIsLoading\", (e) =>\r\n this.blockStateControls(e)\r\n );\r\n\r\n fullscreenNode.addEventListener(\"openApartmentWindow\", (event) => {\r\n this.toggleApartmentInfo(event);\r\n });\r\n\r\n fullscreenNode.addEventListener(\"toggleApartmentControls\", (event) => {\r\n this.attachDragEventsForApartment();\r\n\r\n this.updateApartmentTextureHandler();\r\n });\r\n }\r\n\r\n /*\r\n * Attaches Event listeners on fullscreen node for mouse movement and click logic.\r\n */\r\n attachDragEvents() {\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n // Mouse events\r\n fullscreenNode.addEventListener(\"wheel\", this.wheelHandler);\r\n fullscreenNode.addEventListener(\"mousedown\", this.mousedownHandler);\r\n fullscreenNode.addEventListener(\"mouseup\", this.mouseupHandler);\r\n fullscreenNode.addEventListener(\"mouseout\", this.mouseoutHandler);\r\n\r\n fullscreenNode.addEventListener(\"touchstart\", this.touchDownHandler);\r\n fullscreenNode.addEventListener(\"touchend\", this.touchUpHandler);\r\n fullscreenNode.addEventListener(\"touchcancel\", this.touchcancelHandler);\r\n }\r\n\r\n /*\r\n * Dettaches Event listeners on fullscreen node for mouse movement and click logic.\r\n */\r\n dettachDragEvents() {\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n\r\n fullscreenNode.removeEventListener(\"wheel\", this.wheelHandler);\r\n fullscreenNode.removeEventListener(\"mousedown\", this.mousedownHandler);\r\n fullscreenNode.removeEventListener(\"mouseup\", this.mouseupHandler);\r\n fullscreenNode.removeEventListener(\"mouseout\", this.mouseoutHandler);\r\n\r\n fullscreenNode.removeEventListener(\"touchstart\", this.touchDownHandler);\r\n fullscreenNode.removeEventListener(\"touchend\", this.touchUpHandler);\r\n fullscreenNode.removeEventListener(\"touchcancel\", this.touchcancelHandler);\r\n }\r\n\r\n /**\r\n * Attaches event listeners for apartment 3D view.\r\n */\r\n attachDragEventsForApartment() {\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n\r\n fullscreenNode.addEventListener(\r\n \"mousedown\",\r\n this.mousedownApartmentHandler\r\n );\r\n fullscreenNode.addEventListener(\"mouseup\", this.mouseupApartmentHandler);\r\n fullscreenNode.addEventListener(\"mouseout\", this.mouseoutApartmentHandler);\r\n\r\n fullscreenNode.addEventListener(\r\n \"touchstart\",\r\n this.touchdownApartmentHandler\r\n );\r\n fullscreenNode.addEventListener(\"touchend\", this.touchupApartmentHandler);\r\n fullscreenNode.addEventListener(\r\n \"touchcancel\",\r\n this.touchoutApartmentHandler\r\n );\r\n }\r\n\r\n /**\r\n * Dettaches event listeners for apartment 3D view.\r\n */\r\n dettachDragEventsForApartment() {\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n\r\n fullscreenNode.removeEventListener(\r\n \"mousedown\",\r\n this.mousedownApartmentHandler\r\n );\r\n fullscreenNode.removeEventListener(\"mouseup\", this.mouseupApartmentHandler);\r\n fullscreenNode.removeEventListener(\r\n \"mouseout\",\r\n this.mouseoutApartmentHandler\r\n );\r\n\r\n fullscreenNode.removeEventListener(\r\n \"touchstart\",\r\n this.touchdownApartmentHandler\r\n );\r\n fullscreenNode.removeEventListener(\r\n \"touchend\",\r\n this.touchupApartmentHandler\r\n );\r\n fullscreenNode.removeEventListener(\r\n \"touchcancel\",\r\n this.touchoutApartmentHandler\r\n );\r\n }\r\n\r\n /**\r\n * Handles mousewheel events.\r\n * @param event Event parameter\r\n */\r\n wheelHandler = (event) => {\r\n if (\r\n this.state.isApartmentInfoShown ||\r\n event.ctrlKey ||\r\n this.state.isMouseOnSideBar ||\r\n this.state.isMapShown\r\n )\r\n return;\r\n if (event.deltaY < 0) {\r\n this.increaseCameraZoom();\r\n return;\r\n }\r\n this.decreaseCameraZoom();\r\n };\r\n\r\n /**\r\n * Handles the mousedown event.\r\n * @param event Event parameter\r\n */\r\n mousedownHandler = (event) => {\r\n if (\r\n this.state.apartmentClickedInfo !== undefined ||\r\n this.state.isMouseOnSideBar\r\n )\r\n return;\r\n this.state.startDragPosition = [event.clientX, event.clientY];\r\n this.state.isClicked = true;\r\n\r\n // Attach mousemove event\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.addEventListener(\"mousemove\", this.mousemoveHandler);\r\n };\r\n\r\n /**\r\n * Handles the mouseup event.\r\n */\r\n mouseupHandler = () => {\r\n if (this.state.apartmentClickedInfo !== undefined) {\r\n return;\r\n }\r\n this.state.startDragPosition = [0, 0];\r\n this.state.isClicked = false;\r\n if (this.state.isDragging) this.setState({ isDragging: false });\r\n\r\n // Dettach mousemove event\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.removeEventListener(\"mousemove\", this.mousemoveHandler);\r\n };\r\n\r\n /**\r\n * Handles the mouseout event.\r\n */\r\n mouseoutHandler = () => {\r\n if (this.state.apartmentClickedInfo !== undefined) return;\r\n\r\n this.state.isClicked = false;\r\n this.state.dragPositionX = 0;\r\n this.state.dragPositionY = 0;\r\n if (this.state.isDragging) this.setState({ isDragging: false });\r\n };\r\n\r\n /**\r\n * Handles the mousemove event.\r\n * @param event Event parameter\r\n */\r\n mousemoveHandler = (event) => {\r\n if (!this.state.isClicked || this.state.apartmentClickedInfo !== undefined)\r\n return;\r\n\r\n let pointStart = [\r\n this.state.startDragPosition[0],\r\n this.state.startDragPosition[1],\r\n ];\r\n let pointEnd = [event.clientX, event.clientY];\r\n\r\n let distanceX = pointEnd[1] - pointStart[1];\r\n let distanceY = pointEnd[0] - pointStart[0];\r\n\r\n let dragDistance = Math.sqrt(\r\n Math.pow(distanceX, 2) + Math.pow(distanceY, 2)\r\n );\r\n\r\n if (dragDistance < this.state.jsonData.fixedDrag) return;\r\n\r\n if (!this.state.isDragging) {\r\n this.setState({ isDragging: true });\r\n }\r\n\r\n // Checks which lenght is longer (if lenght of X is greater then lenght of Y) it means that end point is closer to the 'Y' axis.\r\n if (\r\n Math.abs(distanceY) < Math.abs(distanceX) &&\r\n dragDistance >= this.state.jsonData.fixedDrag * 2\r\n ) {\r\n if (distanceX > 0) this.panUp();\r\n else this.panDown();\r\n } else {\r\n if (distanceY > 0) this.panLeft();\r\n else this.panRight();\r\n }\r\n\r\n // Move the starting position to the end position.\r\n this.state.startDragPosition = pointEnd;\r\n };\r\n\r\n /**\r\n * Handles the touchup event.\r\n */\r\n touchUpHandler = () => {\r\n if (this.state.apartmentClickedInfo !== undefined) {\r\n return;\r\n }\r\n this.state.startDragPosition = [0, 0];\r\n this.state.isClicked = false;\r\n if (this.state.isDragging) this.setState({ isDragging: false });\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.removeEventListener(\"touchmove\", this.touchmoveHandler);\r\n };\r\n\r\n /**\r\n * Handles the touchdown event.\r\n * @param event Event parameter\r\n */\r\n touchDownHandler = (event) => {\r\n if (\r\n this.state.apartmentClickedInfo !== undefined ||\r\n this.state.isSideBarOpen\r\n )\r\n return;\r\n this.state.startDragPosition = [event.clientX, event.clientY];\r\n this.state.isClicked = true;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.addEventListener(\"touchmove\", this.touchmoveHandler);\r\n };\r\n\r\n /**\r\n * Handles the touchmove event.\r\n * @param event Event parameter\r\n */\r\n touchmoveHandler = (event) => {\r\n if (!this.state.isClicked || this.state.apartmentClickedInfo !== undefined)\r\n return;\r\n\r\n let pointStart = [\r\n this.state.startDragPosition[0],\r\n this.state.startDragPosition[1],\r\n ];\r\n let pointEnd = [event.touches[0].clientX, event.touches[0].clientY];\r\n\r\n // Gets the lenght of the 'X' axis between start and end point\r\n let distanceX = pointEnd[1] - pointStart[1];\r\n // Gets the lenght of the 'Y' axis between start and end point\r\n let distanceY = pointEnd[0] - pointStart[0];\r\n\r\n // Gets the lenght of the end and start point.\r\n let dragDistance = Math.sqrt(\r\n Math.pow(distanceX, 2) + Math.pow(distanceY, 2)\r\n );\r\n\r\n if (dragDistance < this.state.jsonData.fixedDrag) {\r\n return;\r\n }\r\n\r\n // Checks which lenght is longer (if lenght of X is greater then lenght of Y) it means that end point is closer to the 'Y' axis.\r\n if (\r\n Math.abs(distanceY) < Math.abs(distanceX) &&\r\n dragDistance >= this.state.jsonData.fixedDrag * 2\r\n ) {\r\n if (distanceX > 0) this.panUp();\r\n else this.panDown();\r\n } else {\r\n if (distanceY > 0) this.panLeft();\r\n else this.panRight();\r\n }\r\n this.state.startDragPosition = pointEnd;\r\n };\r\n\r\n /**\r\n * Handles the touchcancel event.\r\n */\r\n touchcancelHandler = () => {\r\n if (this.state.apartmentClickedInfo !== undefined) {\r\n return;\r\n }\r\n this.state.startDragPosition = [0, 0];\r\n this.state.isClicked = true;\r\n if (this.state.isDragging) this.setState({ isDragging: false });\r\n };\r\n\r\n /**\r\n * Handles the mousedown event for the apartment 3D view.\r\n * @param event Event parameter\r\n */\r\n mousedownApartmentHandler = (event) => {\r\n if (this.state.apartmentClickedInfo === undefined) return;\r\n this.state.startDragPosition = [event.clientX, event.clientY];\r\n this.state.isClicked = true;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.addEventListener(\"mousemove\", this.mousemoveApartmentHandler);\r\n };\r\n\r\n /**\r\n * Handles the mouseup event for the apartment 3D view.\r\n */\r\n mouseupApartmentHandler = () => {\r\n if (this.state.apartmentClickedInfo === undefined) {\r\n return;\r\n }\r\n this.state.startDragPosition = [0, 0];\r\n this.state.isClicked = false;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.removeEventListener(\"mousemove\", this.mousemoveApartmentHandler);\r\n };\r\n\r\n /**\r\n * Handles the mouseout event for the apartment 3D view.\r\n */\r\n mouseoutApartmentHandler = () => {\r\n if (this.state.apartmentClickedInfo === undefined) return;\r\n\r\n this.state.isClicked = false;\r\n this.state.dragPositionX = 0;\r\n this.state.dragPositionY = 0;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.removeEventListener(\"mousemove\", this.mousemoveApartmentHandler);\r\n };\r\n\r\n /**\r\n * Handles the mousemove event for the apartment 3D view.\r\n * @param event Event parameter\r\n */\r\n mousemoveApartmentHandler = (event) => {\r\n if (!this.state.isClicked) return;\r\n\r\n let pointStart = [\r\n this.state.startDragPosition[0],\r\n this.state.startDragPosition[1],\r\n ];\r\n let pointEnd = [event.clientX, event.clientY];\r\n\r\n let distanceX = pointEnd[1] - pointStart[1];\r\n let distanceY = pointEnd[0] - pointStart[0];\r\n\r\n // Gets the lenght of the end and start point.\r\n let dragDistance = Math.sqrt(\r\n Math.pow(distanceX, 2) + Math.pow(distanceY, 2)\r\n );\r\n\r\n if (dragDistance < this.state.jsonData.fixedDrag) {\r\n return;\r\n }\r\n\r\n // Checks which lenght is longer (if lenght of X is greater then lenght of Y) it means that end point is closer to the 'Y' axis.\r\n if (Math.abs(distanceY) > Math.abs(distanceX)) {\r\n if (distanceY > 0) this.panLeftApartment();\r\n else this.panRightApartment();\r\n }\r\n\r\n // Move the starting position to the end position.\r\n this.state.startDragPosition = pointEnd;\r\n };\r\n\r\n /**\r\n * Handles the touchdown event for the apartment 3D view.\r\n * @param event Event parameter\r\n */\r\n touchdownApartmentHandler = (event) => {\r\n if (this.state.apartmentClickedInfo === undefined || this.state.isMapShown)\r\n return;\r\n\r\n this.state.startDragPosition = [event.clientX, event.clientY];\r\n this.state.isClicked = true;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.addEventListener(\"touchmove\", this.touchmoveApartmentHandler);\r\n };\r\n\r\n /**\r\n * Handles the touchup event for the apartment 3D view.\r\n */\r\n touchupApartmentHandler = () => {\r\n if (this.state.apartmentClickedInfo === undefined) {\r\n return;\r\n }\r\n this.state.startDragPosition = [0, 0];\r\n this.state.isClicked = false;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.removeEventListener(\"touchmove\", this.touchmoveApartmentHandler);\r\n };\r\n\r\n /**\r\n * Handles the touchout event for the apartment 3D view.\r\n */\r\n touchoutApartmentHandler = () => {\r\n if (this.state.apartmentClickedInfo === undefined) return;\r\n\r\n this.state.isClicked = false;\r\n this.state.dragPositionX = 0;\r\n this.state.dragPositionY = 0;\r\n\r\n let canvas = document.getElementById(\"full-screenable-node\");\r\n canvas.removeEventListener(\"touchmove\", this.touchmoveApartmentHandler);\r\n };\r\n\r\n /**\r\n * Handles the touchmove event for the apartment 3D view.\r\n * @param event Event parameter\r\n */\r\n touchmoveApartmentHandler = (event) => {\r\n if (!this.state.isClicked) return;\r\n let pointStart = [\r\n this.state.startDragPosition[0],\r\n this.state.startDragPosition[1],\r\n ];\r\n let pointEnd = [event.touches[0].clientX, event.touches[0].clientY];\r\n\r\n let distanceX = pointEnd[1] - pointStart[1];\r\n let distanceY = pointEnd[0] - pointStart[0];\r\n\r\n // Gets the lenght of the end and start point.\r\n let dragDistance = Math.sqrt(\r\n Math.pow(distanceX, 2) + Math.pow(distanceY, 2)\r\n );\r\n\r\n if (dragDistance < this.state.jsonData.fixedDrag) {\r\n return;\r\n }\r\n // Checks which lenght is longer (if lenght of X is greater then lenght of Y) it means that end point is closer to the 'Y' axis.\r\n if (Math.abs(distanceY) > Math.abs(distanceX)) {\r\n if (distanceY > 0) this.panLeftApartment();\r\n else this.panRightApartment();\r\n }\r\n // Move the starting position to the end position.\r\n this.state.startDragPosition = pointEnd;\r\n };\r\n\r\n updateSceneSettings(cameraDistanceMultiplier, hotspotScale) {\r\n if (cameraDistanceMultiplier !== 0) {\r\n this.setState({\r\n cameraDistanceMultiplier: parseFloat(cameraDistanceMultiplier),\r\n });\r\n }\r\n if (hotspotScale !== 0) {\r\n this.setState({ hotspotScale: parseFloat(hotspotScale) });\r\n }\r\n\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(new CustomEvent(\"sceneNeedsRender\"));\r\n }\r\n\r\n /**\r\n * Increases current floor by one.\r\n */\r\n increaseCurrentFloor() {\r\n const currentFloorPlacement =\r\n this.state.jsonData.states[this.state.currentState].placementOrder;\r\n\r\n this.state.jsonData.states.forEach((state, index) => {\r\n if (state.placementOrder === currentFloorPlacement + 1)\r\n this.updateCurrentFloor(index);\r\n });\r\n }\r\n /**\r\n * Decreases current floor by one.\r\n */\r\n decreaseCurrentFloor() {\r\n const currentFloorPlacement =\r\n this.state.jsonData.states[this.state.currentState].placementOrder;\r\n\r\n this.state.jsonData.states.forEach((state, index) => {\r\n if (state.placementOrder === currentFloorPlacement - 1)\r\n this.updateCurrentFloor(index);\r\n });\r\n }\r\n // <======== Action functions for buttons ========>\r\n /**\r\n * Shows/hides elements of the ui by changing their display variables.\r\n * @param elementName Name of element we are displaying/hiding\r\n * @param showOrHideBoolean Boolean that dictates whether we show/hide a component\r\n */\r\n handleShowElement(elementName, showOrHideBoolean) {\r\n if (elementName === \"stateView\") return;\r\n\r\n switch (elementName) {\r\n case \"mapView\":\r\n if (showOrHideBoolean) {\r\n this.toggleMapOn();\r\n return;\r\n }\r\n this.toggleMapOff();\r\n break;\r\n case \"compareFavouritesView\":\r\n if (showOrHideBoolean) {\r\n this.dettachDragEvents();\r\n let event = new CustomEvent(\"openCompareWindow\");\r\n window.dispatchEvent(event);\r\n }\r\n\r\n this.setState({ isCompareShown: showOrHideBoolean });\r\n if (showOrHideBoolean) this.setState({ isApartmentInfoShown: false });\r\n break;\r\n case \"filterMenuView\":\r\n this.setState({ isFilterMenuShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"investorLogoView\":\r\n this.setState({ isInvestorLogoShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"fullscreenButton\":\r\n this.setState({ isFullscreenButtonShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"verticalUpButton\":\r\n this.setState({ isUpButtonShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"verticalDownButton\":\r\n this.setState({ isDownButtonShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"horizontalLeftButton\":\r\n this.setState({ isLeftButtonShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"horizontalRightButton\":\r\n this.setState({ isRightButtonShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"compassButton\":\r\n this.setState({ isCompasShown: showOrHideBoolean });\r\n\r\n break;\r\n case \"apartmentFullscreenButton\":\r\n this.setState({ isApartmentFullscreenButtonShown: showOrHideBoolean });\r\n break;\r\n case \"apartmentViewButton\":\r\n this.setState({ apartmentViewButton: showOrHideBoolean });\r\n break;\r\n case \"apartment3DViewButton\":\r\n this.setState({ apartment3DViewButton: showOrHideBoolean });\r\n break;\r\n case \"compareApratmentViewButton\":\r\n this.setState({\r\n compare2DApartmentButtonActive: true,\r\n compare3DApartmentButtonActive: false\r\n }); \r\n break;\r\n case \"compareApartment3DViewButton\": \r\n this.setState({\r\n compare2DApartmentButtonActive: true,\r\n compare3DApartmentButtonActive: false,\r\n }); \r\n break;\r\n case \"stateMenuView\":\r\n this.setState({ isMainMenuShown: showOrHideBoolean });\r\n break;\r\n case \"apartment3DView\":\r\n if (this.state.apartmentClickedInfo.highResUrls.length <= 0) return;\r\n if (showOrHideBoolean) {\r\n this.attachDragEventsForApartment();\r\n // Update texture\r\n this.updateApartmentTextureHandler();\r\n }\r\n this.setState({ isApartment3DCanvasShown: showOrHideBoolean });\r\n break;\r\n case \"orbViewScene\": \r\n this.setState({ shouldDisplayOrbViewScene: showOrHideBoolean });\r\n break; \r\n default:\r\n console.error(\"no element found\");\r\n break;\r\n }\r\n }\r\n}\r\n","class DeviceHelper {\r\n isMobileDevice() {\r\n const deviceRegex = /(tablet|ipad|playbook|silk)|(android(?!.*mobi))/i.test(\r\n navigator.userAgent\r\n );\r\n\r\n const browserRegex =\r\n /Mobile|Android|iP(hone|od)|IEMobile|BlackBerry|Kindle|Silk-Accelerated|(hpw|web)OS|Opera M(obi|ini)/.test(\r\n navigator.userAgent\r\n );\r\n\r\n if (deviceRegex) return true;\r\n\r\n if (browserRegex) return true;\r\n\r\n return false;\r\n }\r\n}\r\n\r\nexport default new DeviceHelper();\r\n","import * as THREE from \"three\";\r\nimport { Vector3, Color, Object3D } from \"three\";\r\nimport deviceHelper from \"./deviceHelper\";\r\n\r\nconst isMobile = deviceHelper.isMobileDevice();\r\nclass SceneHelper {\r\n\r\n constructor() {\r\n this.sprite = null;\r\n this.apartmentSprite = null;\r\n this.apartmentBackgroundSprite = null;\r\n this.apartmentSprite = null;\r\n this.hotspotScene = null;\r\n this.sphere = null;\r\n // this.item = null;\r\n }\r\n\r\n /**\r\n * Creates camera with settings.\r\n */\r\n initializeCamera() {\r\n let camera = new THREE.PerspectiveCamera(\r\n 100,\r\n // window.innerWidth / window.innerHeight,\r\n 1.777777,\r\n 0.1,\r\n 2000\r\n );\r\n camera.setFocalLength(35)\r\n // camera.lookAt(new Vector3(0.10593, -2.0524, 0));\r\n\r\n // This is where the camera position is hardcoded to align the hotspots\r\n // camera.position.copy(\r\n // new Vector3(22.612559451406984, 30.53181744066928, 45.523622716900114)\r\n // );\r\n camera.position.copy(\r\n new Vector3(3800, 3700, 1)\r\n );\r\n\r\n\r\n\r\n camera.lookAt(new Vector3(0, 0, 0));\r\n camera.updateProjectionMatrix();\r\n return camera;\r\n }\r\n\r\n\r\n /**\r\n * Creates renderer with settings.\r\n */\r\n initializeRenderer(canvasName) {\r\n let renderer = new THREE.WebGLRenderer({\r\n antialias: true,\r\n canvas: document.getElementById(canvasName),\r\n alpha: true,\r\n });\r\n\r\n renderer.setPixelRatio(Math.min(2, window.devicePixelRatio) || 1);\r\n renderer.physicallyCorrectLights = true;\r\n renderer.shadowMap.enabled = false;\r\n renderer.autoClearColor = false;\r\n // renderer.sortObjects = false;\r\n renderer.autoClear = true;\r\n renderer.autoClearDepth = true;\r\n renderer.autoClearStencil = true;\r\n renderer.debug.checkShaderErrors = false;\r\n renderer.maxMorphNormals = 0;\r\n renderer.maxMorphTargets = 0;\r\n renderer.capabilities = {\r\n ...renderer.capabilities,\r\n floatFragmentTextures: false,\r\n floatVertexTextures: false,\r\n isWebGL2: true,\r\n logarithmicDepthBuffer: false,\r\n maxAttributes: 0,\r\n maxCubemapSize: 0,\r\n maxFragmentUniforms: 0,\r\n maxTextureSize: 0,\r\n maxTextures: 0,\r\n maxVaryings: 0,\r\n maxVertexTextures: 0,\r\n maxVertexUniforms: 0,\r\n precision: null,\r\n vertexTextures: false,\r\n };\r\n\r\n // renderer.autoClear = false;\r\n isMobile ? renderer.setSize(window.innerWidth, window.innerHeight) : renderer.setSize(window.innerWidth * 0.9, (window.innerWidth * 0.9) * 0.5625);\r\n\r\n renderer.setClearColor(new Color(\"white\"));\r\n\r\n return renderer;\r\n }\r\n\r\n\r\n\r\n\r\n /**\r\n * Creates a sphere with a texture applied to the inside.\r\n * @param imageUrl Url to the image for the texture\r\n */\r\n initializeBackground(imageUrl) {\r\n if (!imageUrl) return new Object3D()\r\n\r\n const skydomeTexture = new THREE.TextureLoader().load(imageUrl);\r\n skydomeTexture.minFilter = THREE.LinearFilter;\r\n const skyDomeMaterial = new THREE.MeshBasicMaterial({\r\n map: skydomeTexture,\r\n });\r\n\r\n const sphere = new THREE.Mesh(\r\n new THREE.SphereGeometry(1000, 32, 32),\r\n skyDomeMaterial\r\n );\r\n sphere.material.side = THREE.DoubleSide;\r\n\r\n this.sphere = sphere;\r\n return sphere;\r\n }\r\n\r\n /**\r\n * Creates sprite.\r\n */\r\n initializeSprite() {\r\n if (this.sprite) return this.sprite;\r\n\r\n let sprite = new THREE.Sprite(new THREE.SpriteMaterial());\r\n\r\n return (this.sprite = sprite);\r\n }\r\n\r\n /**\r\n * Creates apartment sprite.\r\n */\r\n initializeApartmentSprite() {\r\n if (this.apartmentSprite) return this.apartmentSprite;\r\n\r\n let apartmentSprite = new THREE.Sprite(new THREE.SpriteMaterial());\r\n return (this.apartmentSprite = apartmentSprite);\r\n }\r\n\r\n\r\n /**\r\n * Changes apartment sprite texture.\r\n * @param texture Texture that to be applied.\r\n */\r\n updateApartmentTexture(texture) {\r\n\r\n texture.minFilter = THREE.LinearFilter;\r\n\r\n const sprite = this.initializeApartmentSprite();\r\n const textureAspectRation = texture.image.width / texture.image.height;\r\n\r\n sprite.scale.set(6 * textureAspectRation, 5.5, 1);\r\n sprite.material.map = texture;\r\n sprite.material.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * Changes the sprite texture.\r\n * @param texture Texture that to be applied.\r\n */\r\n updateTexture(texture) {\r\n const sprite = this.initializeSprite();\r\n const textureAspectRation = texture.image.width / texture.image.height;\r\n\r\n const multiplier = 3;\r\n sprite.scale.set(17.83 * textureAspectRation * multiplier, 17.83 * multiplier, 1);\r\n\r\n sprite.material.map = texture;\r\n sprite.material.needsUpdate = true;\r\n }\r\n\r\n /**\r\n * Updates the camera position to the appropriate frame of the camera path depending on the current column.\r\n * @param camera Three.js main canvas camera\r\n * @param cameraKeyframeTrack Keyframe position track of the camera animation\r\n * @param currentColumn Current column being shown on the main scene\r\n * @param distanceScaleVariable Variable used for scaling distances\r\n */\r\n updateCameraPosition(camera, cameraKeyframeTrack, currentColumn, distanceScaleVariable) {\r\n if (!cameraKeyframeTrack) {\r\n camera.position.copy(\r\n new Vector3(38, 37, 1)\r\n );\r\n // camera.position.copy(\r\n // new Vector3(-72.2016, 91.4999, 112.908)\r\n // );\r\n return camera.position\r\n }\r\n\r\n const position = this.createPositionFromAnimation(cameraKeyframeTrack, currentColumn, distanceScaleVariable)\r\n camera.position.copy(position);\r\n return position\r\n }\r\n\r\n /**\r\n * Updates the camera target position to the appropriate frame of the camera target path depending on the current column.\r\n * @param camera Three.js main canvas camera\r\n * @param cameraTargetKeyframeTrack Keyframe position track of the camera animation\r\n * @param currentColumn Current column being shown on the main scene\r\n * @param targetDefaultPosition Default position of the target in the provided fbx\r\n * @param distanceScaleVariable Variable used for scaling distances\r\n */\r\n updateTargetPosition(camera, cameraTargetKeyframeTrack, currentColumn, targetDefaultPosition, distanceScaleVariable) {\r\n if (cameraTargetKeyframeTrack === undefined) {\r\n if (targetDefaultPosition === undefined) {\r\n camera.lookAt(new Vector3(0, 0, 0));\r\n return new Vector3(0, 0, 0);\r\n }\r\n camera.lookAt(targetDefaultPosition.clone().multiplyScalar(distanceScaleVariable));\r\n return targetDefaultPosition.clone().multiplyScalar(distanceScaleVariable);\r\n }\r\n const position = this.createPositionFromAnimation(cameraTargetKeyframeTrack, currentColumn, distanceScaleVariable)\r\n camera.lookAt(position);\r\n return position\r\n }\r\n\r\n /**\r\n * Updates the sprite position to the appropriate frame of the camera target path depending on the current column.\r\n * @param scene Main scene of the main canvas where the sprite added\r\n * @param cameraTargetKeyframeTrack Keyframe position track of the camera animation\r\n * @param currentColumn Current column being shown on the main scene\r\n * @param defaultDistance Default distance of the camera and camera target\r\n * @param newDistance Current distance of the camera and camera target\r\n * @param distanceScaleVariable Variable used for scaling distances\r\n * @param targetDefaultPosition Default position of the target in the provided fbx\r\n */\r\n updateSpritePosition(sprite, cameraTargetKeyframeTrack, currentColumn, defaultDistance, newDistance, distanceScaleVariable, targetPosition) {\r\n if (cameraTargetKeyframeTrack === undefined) {\r\n this.compensateForSizeAttenuation(sprite, defaultDistance, newDistance)\r\n sprite.position.copy(targetPosition);\r\n return\r\n }\r\n this.compensateForSizeAttenuation(sprite, defaultDistance, newDistance)\r\n const position = this.createPositionFromAnimation(cameraTargetKeyframeTrack, currentColumn, distanceScaleVariable)\r\n sprite.position.copy(position)\r\n }\r\n\r\n /**\r\n * Updates the size of the sprite to compensate for the size change of increasing/decreasing distance.\r\n * @param sprite Sprite of the main scene for displaying renders\r\n * @param defaultDistance Default distance of the camera and camera target\r\n * @param newDistance Current distance of the camera and camera target\r\n */\r\n compensateForSizeAttenuation(sprite, defaultDistance, newDistance) {\r\n const delta = defaultDistance - newDistance;\r\n const percentageDifference = -delta / defaultDistance;\r\n let multiplier = 1;\r\n multiplier = 1 + percentageDifference;\r\n sprite.scale.set(17.83 * 1.7777777777777777 * multiplier * 3, 17.83 * multiplier * 3, 1)\r\n }\r\n\r\n /**\r\n * Returns a vector scaled to the division variable from the passed animation depending on the current column.\r\n * @param keyframeTrack Keyframe position track\r\n * @param currentColumn Current column being shown on the main scene\r\n * @param distanceScaleVariable Variable used for scaling distances\r\n */\r\n createPositionFromAnimation(keyframeTrack, currentColumn, distanceScaleVariable) {\r\n const positionX = keyframeTrack.values[currentColumn * 3]\r\n const positionY = keyframeTrack.values[(currentColumn * 3) + 1]\r\n const positionZ = keyframeTrack.values[(currentColumn * 3) + 2]\r\n return new Vector3(positionX * distanceScaleVariable, positionY * distanceScaleVariable, positionZ * distanceScaleVariable)\r\n }\r\n\r\n loadCameraAndTargetAnimations(loader, fbxUrl) {\r\n return new Promise((resolve, reject) => {\r\n loader.load(\r\n fbxUrl,\r\n (object) => {\r\n let cameraAnimation = undefined;\r\n let targetAnimation = undefined;\r\n\r\n object.animations.forEach(animation => {\r\n\r\n animation.tracks.forEach(track => {\r\n if (track.name.toLowerCase().includes(\"target\") && track.name.includes(\"position\")) {\r\n targetAnimation = track;\r\n return\r\n }\r\n if (track.name.includes(\"position\")) {\r\n cameraAnimation = track;\r\n return\r\n }\r\n })\r\n\r\n })\r\n\r\n object.traverse(child => {\r\n if (child.name.toLowerCase().includes(\"target\")) {\r\n const event = new CustomEvent(\"setTargetDefaultPosition\", {\r\n detail: {\r\n position: child.position,\r\n }\r\n })\r\n window.dispatchEvent(event)\r\n }\r\n })\r\n resolve([cameraAnimation, targetAnimation])\r\n },\r\n (data) => null,\r\n (error) => reject(error)\r\n )\r\n });\r\n\r\n }\r\n\r\n /**\r\n * Calls a loader method for each fbx from the API.\r\n * Waits for all files to finish loading.\r\n * @param fbxLoader Loader for fbx files\r\n * @param hotspotScene Scene for hotspots\r\n * @param camera Camera for rendering in three.js\r\n * @param hotspotArray Parameters that tell the function which files to load\r\n * @param scene Scene for three.js\r\n * @param props Props from the ObjectWindow\r\n * @param gui Temporary GUI for testing\r\n */\r\n loadHotspots(fbxLoader, hotspotScene, camera, hotspotArray, scene, props) {\r\n const hotspotDictionary = {}\r\n const promises = [];\r\n\r\n hotspotArray.forEach(hotspot => {\r\n promises.push(\r\n new Promise(\r\n resolve => {\r\n resolve(this.loadHotspot(hotspot.hotspotUrl, fbxLoader, camera, props))\r\n }\r\n ));\r\n });\r\n\r\n return Promise.all(promises)\r\n .then(hotSpotObjects => {\r\n hotspotArray.forEach((hotspot, index) => {\r\n hotspotDictionary[index] = hotSpotObjects[index];\r\n });\r\n\r\n return hotspotDictionary;\r\n })\r\n .catch(console.error)\r\n }\r\n\r\n\r\n\r\n /**\r\n * Loads a hotspot from a passed url.\r\n * @param hotspotUrl Url for a fbx file containing hotspots and scene info \r\n * @param fbxLoader Three js fbx loader\r\n */\r\n loadHotspot(hotspotUrl, fbxLoader, camera, props) {\r\n return new Promise((resolve, reject) => {\r\n if (hotspotUrl === \"\") {\r\n const emptyObject = new THREE.Object3D()\r\n resolve(emptyObject)\r\n }\r\n fbxLoader.load(\r\n hotspotUrl,\r\n\r\n (fbxScene) => {\r\n fbxScene.visible = true;\r\n fbxScene.traverse(function (item) {\r\n if (item.isMesh) {\r\n // item.renderOrder = 2;\r\n // order --\r\n item.material = new THREE.MeshBasicMaterial({\r\n transparent: true,\r\n opacity: 0,\r\n });\r\n\r\n if (item.name.toLowerCase().includes('stroke_')) {\r\n item.material = new THREE.MeshBasicMaterial();\r\n item.visible = false;\r\n }\r\n\r\n if (item.name.includes(\"mask\")) {\r\n item.renderOrder = 1;\r\n item.material.colorWrite = false;\r\n } \r\n }\r\n\r\n if (item.name === \"Camera_position\") {\r\n\r\n camera.position.copy(\r\n item.position.multiplyScalar(0.01)\r\n );\r\n camera.updateProjectionMatrix();\r\n }\r\n\r\n });\r\n\r\n resolve(fbxScene);\r\n },\r\n (data) => null,\r\n (error) => null\r\n );\r\n });\r\n\r\n\r\n }\r\n\r\n}\r\n\r\nexport default new SceneHelper();\r\n","class WindowHelper {\r\n\r\n /**\r\n * Resizes the canvas to fit a new viewport on the window resize event.\r\n * @param renderer Three.js render for the main canvas/scene\r\n * @param camera Three.js camera for the main scene\r\n */\r\n onWindowResize(renderer, camera) {\r\n renderer.setSize(window.innerWidth * 0.9, (window.innerWidth * 0.9) * 0.5625);\r\n // camera.aspect = window.innerWidth / window.innerHeight;\r\n camera.aspect = 1.77777777;\r\n camera.updateProjectionMatrix();\r\n }\r\n}\r\n\r\nexport default new WindowHelper();\r\n","import i18n from 'i18next';\r\n\r\nclass LabelHelper {\r\n constructor() {\r\n this.label = null;\r\n }\r\n\r\n /**\r\n * Creates the label background element\r\n * @param type Type of html element\r\n * @param width Width of element\r\n * @param height Height of element\r\n */\r\n makeBackground(type, width, height) {\r\n\r\n const hoverBase = document.createElement(type);\r\n const element = document.createElement(type);\r\n const overlay = document.createElement(type);\r\n const background = document.createElement(type);\r\n\r\n overlay.classList = \"label-element background-overlay\";\r\n overlay.id = \"background-overlay\";\r\n\r\n background.classList = \"label-element background\";\r\n\r\n hoverBase.classList = \"label-element hover-base\"\r\n hoverBase.style.width = width + \"px\";\r\n hoverBase.style.height = height + \"px\";\r\n\r\n hoverBase.addEventListener(\"mouseenter\", this.onMouseOver);\r\n hoverBase.addEventListener(\"mouseleave\", this.onMouseOut);\r\n\r\n element.classList = \"label-element label-base\";\r\n element.style.display = \"none\"\r\n\r\n // \"345px 263px\"\r\n hoverBase.appendChild(overlay)\r\n hoverBase.appendChild(background)\r\n element.appendChild(hoverBase)\r\n\r\n\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Creates the label background element.\r\n * @param type Type of html element\r\n * @param width Width of element\r\n * @param height Height of element\r\n */\r\n makeButton(type, width, height) {\r\n const element = document.createElement(type);\r\n element.id = \"favourite-button\";\r\n\r\n element.classList = \"label-element favourite-button\";\r\n element.style.backgroundImage =\r\n \"url('design/new-exports/Star_with_plus.png')\";\r\n element.style.backgroundSize = \"contain\";\r\n element.style.border = \"none\";\r\n element.style.backgroundColor = \"rgba(0,0,0,0)\";\r\n element.style.width = width + \"px\";\r\n element.style.height = height + \"px\";\r\n element.style.cursor = \"pointer\";\r\n element.style.backgroundSize = \"cover\";\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Creates name of apartment element.\r\n */\r\n makeApartmentName() {\r\n const element = document.createElement(\"div\", 230, 60);\r\n element.classList = \"label-element apartment-name\";\r\n element.style.width = 230 + \"px\";\r\n element.style.height = 60 + \"px\";\r\n element.style.borderBottom = \"1px solid white\";\r\n\r\n const labelElement = document.createElement(\"p\", 50, 20);\r\n labelElement.classList = \"label-element name-label\";\r\n labelElement.innerText = i18n.t(\"APARTMENT\");\r\n labelElement.style.width = 50 + \"px\";\r\n labelElement.style.height = 20 + \"px\";\r\n labelElement.style.color = \"white\";\r\n labelElement.style.fontSize = \"12pt\";\r\n\r\n const favorisLabelElement = document.createElement(\"p\", 50, 20);\r\n favorisLabelElement.classList = \"label-element favoris\";\r\n favorisLabelElement.innerText = i18n.t(\"FAVORITES\").toUpperCase();\r\n favorisLabelElement.style.width = 50 + \"px\";\r\n favorisLabelElement.style.height = 20 + \"px\";\r\n favorisLabelElement.style.color = \"white\";\r\n favorisLabelElement.style.fontSize = \"8pt\";\r\n\r\n const nameTextElement = document.createElement(\"p\", 50, 20);\r\n nameTextElement.classList = \"label-element hotspot-name\";\r\n nameTextElement.innerText = \"D 5.1\";\r\n nameTextElement.id = \"hotspot-name\";\r\n nameTextElement.style.width = 100 + \"px\";\r\n nameTextElement.style.height = 20 + \"px\";\r\n nameTextElement.style.color = \"white\";\r\n nameTextElement.style.fontSize = \"20pt\";\r\n nameTextElement.style.fontWeight = 600;\r\n\r\n element.appendChild(labelElement);\r\n element.appendChild(favorisLabelElement);\r\n element.appendChild(nameTextElement);\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Creates apartment info element.\r\n */\r\n makeApartmentInfo() {\r\n const element = document.createElement(\"div\", 250, 60);\r\n element.classList = \"label-element apartment-info\";\r\n element.style.width = 250 + \"px\";\r\n element.style.height = 60 + \"px\";\r\n\r\n const quadratureElement = document.createElement(\"p\", 200, 20);\r\n quadratureElement.classList = \"label-element info-quadrature\";\r\n quadratureElement.innerText = \"75.88 m2 \";\r\n quadratureElement.id = \"quadrature\";\r\n quadratureElement.style.width = 200 + \"px\";\r\n quadratureElement.style.height = 20 + \"px\";\r\n quadratureElement.style.color = \"white\";\r\n quadratureElement.style.fontSize = \"12pt\";\r\n quadratureElement.style.fontWeight = \"bold\";\r\n\r\n const typeElement = document.createElement(\"p\", 200, 20);\r\n typeElement.classList = \"label-element info-type\";\r\n typeElement.innerText = \"T4\";\r\n typeElement.id = \"apartment-type\";\r\n typeElement.style.width = 200 + \"px\";\r\n typeElement.style.height = 20 + \"px\";\r\n typeElement.style.color = \"white\";\r\n typeElement.style.fontSize = \"18pt\";\r\n typeElement.style.fontWeight = 700;\r\n\r\n\r\n const priceElement = document.createElement(\"p\", 200, 20);\r\n priceElement.classList = \"label-element info-type\";\r\n priceElement.id = \"apartment-price\";\r\n priceElement.style.width = 200 + \"px\";\r\n priceElement.style.height = 20 + \"px\";\r\n priceElement.style.left = 105 + \"px\";\r\n priceElement.style.top = 4 + \"px\";\r\n priceElement.style.color = \"white\";\r\n priceElement.style.fontSize = \"15pt\";\r\n priceElement.style.fontWeight = 700;\r\n\r\n const typeLongElement = document.createElement(\"p\", 200, 20);\r\n typeLongElement.classList = \"label-element info-type-long\";\r\n typeLongElement.innerHTML = \"4 bed apartment\";\r\n typeLongElement.id = \"apartment-type-long\";\r\n typeLongElement.style.width = 200 + \"px\";\r\n typeLongElement.style.height = 20 + \"px\";\r\n typeLongElement.style.color = \"white\";\r\n typeLongElement.style.fontSize = \"12pt\";\r\n typeLongElement.style.lineHeight = \"12pt\";\r\n\r\n element.appendChild(quadratureElement);\r\n element.appendChild(typeElement);\r\n element.appendChild(typeLongElement);\r\n element.appendChild(priceElement);\r\n\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Creates details button element.\r\n * @param width \r\n * @param height \r\n */\r\n makeDetailsButton(width, height) {\r\n const element = document.createElement(\"button\");\r\n element.id = \"details-button\";\r\n\r\n element.classList = \"label-element details-button\";\r\n element.innerText = i18n.t(\"MORE_DETAILS\").toUpperCase();\r\n element.style.border = \"none\";\r\n element.style.color = \"gray\";\r\n element.style.backgroundColor = \"white\";\r\n element.style.width = width + \"px\";\r\n element.style.height = height + \"px\";\r\n element.style.cursor = \"pointer\";\r\n element.style.fontSize = \"8pt\";\r\n element.style.borderRadius = \"15px\";\r\n element.style.fontWeight = 700;\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Creates hidden details button element.\r\n * @param width \r\n * @param height \r\n */\r\n makeHiddenDetailsButton(width, height) {\r\n const element = document.createElement(\"button\");\r\n element.id = \"hidden-details-button\";\r\n\r\n element.classList = \"label-element hidden-details-button\";\r\n element.style.border = \"none\";\r\n element.style.backgroundColor = \"rgba(1,1,1,0)\";\r\n element.style.width = width + \"px\";\r\n element.style.height = height + \"px\";\r\n element.style.cursor = \"pointer\";\r\n\r\n return element;\r\n }\r\n\r\n /**\r\n * Turns off display of label.\r\n */\r\n hideLabel() {\r\n if (!this.label) return\r\n this.label.style.display = \"none\"\r\n\r\n }\r\n displayLabel(shouldDisplayLabel) {\r\n if (!this.label) return\r\n if (shouldDisplayLabel) {\r\n this.label.style.display = \"block\"\r\n return\r\n }\r\n this.label.style.display = \"none\"\r\n\r\n }\r\n /**\r\n * Turns on display of label.\r\n */\r\n showLabel() {\r\n this.label.style.display = \"block\"\r\n }\r\n\r\n /**\r\n * Dispatches label mouseover event.\r\n */\r\n onMouseOver() {\r\n const event = new CustomEvent(\"labelIsHovered\");\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Dispatches label mouseout event.\r\n */\r\n onMouseOut() {\r\n const event = new CustomEvent(\"labelMouseOut\");\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Returs the color for a particular apartment from data from the API.\r\n * @param projectJSON Whole project json returned from the API\r\n * @param apartment Object containing the info of an apartment\r\n */\r\n getHotspotLabelColor(projectJSON, apartment) {\r\n\r\n\r\n if (!projectJSON.hotspotColors[apartment.type]) return;\r\n\r\n const color = apartment.hoverCloudColor ? apartment.hoverCloudColor : projectJSON.hotspotColors[apartment.type].hoverColor;\r\n return color\r\n }\r\n\r\n /**\r\n * Updates the info displayed on the label depending on which hotspot is being hovered.\r\n * @param key Key of the hotspot being hovered\r\n * @param currentState Index of current state\r\n * @param favouriteApartments List of keys of favourited apartments\r\n * @param projectJSON Whole project json returned from the API\r\n */\r\n updateHotspotInfo(key, currentState, favouriteApartments, projectJSON) {\r\n const hotspotName = document.getElementById(\"hotspot-name\");\r\n const backgroundOverlay = document.getElementById(\"background-overlay\");\r\n\r\n const quadrature = document.getElementById(\"quadrature\");\r\n const apartmentType = document.getElementById(\"apartment-type\");\r\n const apartmentPrice = document.getElementById(\"apartment-price\");\r\n const apartmentTypeLong = document.getElementById(\"apartment-type-long\");\r\n const favouriteButton = document.getElementById(\"favourite-button\");\r\n\r\n if (favouriteButton === null) return\r\n //const state = this.info.states[currentState];\r\n const state = projectJSON.states[currentState]\r\n\r\n\r\n state.apartments.forEach(async (apartment) => {\r\n\r\n if (apartment.key === key) {\r\n backgroundOverlay.style.backgroundColor = await this.getHotspotLabelColor(projectJSON, apartment)\r\n hotspotName.innerText = apartment.name;\r\n quadrature.innerText = `${apartment.quadrature}㎡`;\r\n apartmentType.innerText = apartment.type;\r\n apartmentTypeLong.innerHTML = `${i18n.t(\"APARTMENT\").toLocaleLowerCase()}
${apartment.type[1]} ${apartment.type[1] === \"1\" ? i18n.t(\"PIECE\").toLowerCase() : i18n.t(\"PIECES\").toLowerCase()}`;\r\n\r\n\r\n\r\n if (apartment.showApartmentPrice) {\r\n apartmentPrice.innerText = apartment.price + apartment.currencySymbol; //TODO implement currency type\r\n return;\r\n }\r\n apartmentPrice.innerText = \"\";\r\n\r\n }\r\n });\r\n if (favouriteApartments.includes(key)) {\r\n favouriteButton.style.backgroundImage = \"url('design/new-exports/Star_with_minus.png')\";\r\n } else {\r\n favouriteButton.style.backgroundImage = \"url('design/new-exports/Star_with_plus.png')\";\r\n }\r\n }\r\n\r\n moveLabel(mousePosition) {\r\n this.label.style.top = `${mousePosition.positionY - 220}px`;\r\n this.label.style.left = `${mousePosition.positionX - 300}px`;\r\n }\r\n\r\n /**\r\n * Creates label and appends all children elements.\r\n * @param camera Three js camera used to render the main canvas\r\n */\r\n createLabel() {\r\n const fullscreenNode = document.getElementById(\"full-screenable-node\")\r\n\r\n let background = this.makeBackground(\"div\", 365, 263);\r\n\r\n const apartmentName = this.makeApartmentName();\r\n const apartmentInfo = this.makeApartmentInfo();\r\n const button = this.makeButton(\"button\", 43, 40);\r\n const detailsButton = this.makeDetailsButton(105, 30);\r\n const hiddenDetailsButton = this.makeHiddenDetailsButton(105, 85);\r\n background.children[0].appendChild(button);\r\n background.children[0].appendChild(detailsButton);\r\n background.children[0].appendChild(hiddenDetailsButton);\r\n background.children[0].appendChild(apartmentName);\r\n background.children[0].appendChild(apartmentInfo);\r\n fullscreenNode.appendChild(background)\r\n\r\n this.label = background;\r\n return this.label;\r\n }\r\n}\r\n\r\nexport default new LabelHelper();\r\n","export default {\r\n production: {\r\n API_URL: \"https://configurator.mag.archi/api/projects/\",\r\n },\r\n local: {\r\n API_URL: \"http://localhost:64838/api/projects/\",\r\n },\r\n test: {\r\n API_URL: \"https://mag.marbleit.rs/api/projects/\",\r\n }\r\n};\r\n","import i18n from \"../../i18n/i18n\";\r\nimport stringHelper from \"./stringHelper\";\r\nimport constants from \"../constants\";\r\n\r\nconst axios = require('axios');\r\n\r\nclass StateHelper {\r\n\r\n\r\n isStateLoaded(imagesQueue, key) {\r\n for (let i = 0; i < imagesQueue.length; i++) {\r\n if (key === imagesQueue[i]) return false;\r\n }\r\n return true;\r\n }\r\n\r\n getHotspotLink(hotspotKey, array) {\r\n for (let i = 0; i < array.length; i++) {\r\n const hotspot = array[i];\r\n if (hotspot.key === hotspotKey && hotspot.isLink) return hotspot.linkTo;\r\n }\r\n return \"\";\r\n }\r\n\r\n /**\r\n * Loop thru all states and for each state creates key and all images for that state pushes in one array.\r\n * Returns Array of states keys and Array of array images for each state.\r\n * @param data Json data from UMBRACO.\r\n */\r\n initializeBuildingStates(data) {\r\n let tempLoadingQueue = [];\r\n let tempImagesQueue = [];\r\n for (let i = 0; i < data.rowsPerState.length; i++) {\r\n let rows = data.rowsPerState[i];\r\n for (let j = 0; j < rows; j++) {\r\n\r\n let key = stringHelper.makeStateKey(\"B\", \"High\", i, j);\r\n let fakeQueue = [];\r\n\r\n for (let k = 0; k < data.states[i].rows[j].highResUrls.length; k++) {\r\n let fakeDictionary = [];\r\n let path = data.states[i].rows[j].highResUrls[k];\r\n fakeDictionary[0] = k;\r\n fakeDictionary[1] = path;\r\n fakeQueue.push(fakeDictionary);\r\n }\r\n\r\n tempLoadingQueue.push(fakeQueue);\r\n tempImagesQueue.push(key);\r\n }\r\n }\r\n\r\n return [tempLoadingQueue, tempImagesQueue];\r\n }\r\n\r\n /**\r\n * Loop thru all apartments and for each apartment creates key and all images for that state pushes in one array.\r\n * Returns Array of apartments keys and Array of array images for each apartment.\r\n * @param states States Data.\r\n */\r\n initializeApartmentStates(states) {\r\n let tempLoadingQueue = [];\r\n let tempImagesQueue = [];\r\n\r\n for (let i = 0; i < states.length; i++) {\r\n let apartments = states[i].apartments;\r\n if (apartments.length > 0) {\r\n for (let j = 0; j < apartments.length; j++) {\r\n if (apartments[j].highResUrls.length > 0) {\r\n let apartmentStateKey = `A_High_${i}_${apartments[j].key}`;\r\n let fakeQueue = [];\r\n\r\n for (let k = 0; k < apartments[j].highResUrls.length; k++) {\r\n let fakeDictionary = [];\r\n let path = apartments[j].highResUrls[k];\r\n fakeDictionary[0] = k;\r\n fakeDictionary[1] = path;\r\n fakeQueue.push(fakeDictionary);\r\n }\r\n tempImagesQueue.push(apartmentStateKey);\r\n tempLoadingQueue.push(fakeQueue);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return [tempLoadingQueue, tempImagesQueue];\r\n }\r\n\r\n /**\r\n * Creates loading queue with two separate arrays.\r\n * One for state keys, one for state image paths.\r\n */\r\n async initializeStartingQueue() {\r\n const currentUrl = new URL(window.location);\r\n const projectId = currentUrl.searchParams.get(\"projectId\");\r\n\r\n const response = await axios.get(`${constants.production.API_URL}${projectId}`);\r\n \r\n let data = response.data;\r\n\r\n i18n.changeLanguage(data.language);\r\n\r\n let canvas = document.getElementById(\"root\");\r\n let event = new CustomEvent(\"setJsonData\", {\r\n detail: {\r\n jsonData: data,\r\n }\r\n });\r\n canvas.dispatchEvent(event);\r\n\r\n let tempLoadingQueue = [];\r\n let tempImagesQueue = [];\r\n\r\n let loadingQueues = this.initializeBuildingStates(data);\r\n\r\n tempLoadingQueue = loadingQueues[0];\r\n tempImagesQueue = loadingQueues[1];\r\n\r\n loadingQueues = this.initializeApartmentStates(data.states);\r\n\r\n tempLoadingQueue = tempLoadingQueue.concat(loadingQueues[0]);\r\n tempImagesQueue = tempImagesQueue.concat(loadingQueues[1]);\r\n\r\n\r\n // Push Default States to be loaded first!\r\n let defaultFloor = data.currentState;\r\n for (let i = 0; i < data.rowsPerState[defaultFloor]; i++) {\r\n let key = stringHelper.makeStateKey(\"B\", \"High\", defaultFloor, i);\r\n\r\n // Push this key to the beginning\r\n let indexOf = tempImagesQueue.indexOf(key);\r\n let array = tempLoadingQueue[indexOf];\r\n\r\n tempImagesQueue.splice(indexOf, 1);\r\n tempLoadingQueue.splice(indexOf, 1);\r\n\r\n tempLoadingQueue.unshift(array);\r\n tempImagesQueue.unshift(key);\r\n }\r\n return [tempLoadingQueue, tempImagesQueue];\r\n }\r\n\r\n}\r\n\r\nexport default new StateHelper();\r\n","import * as THREE from \"three\";\r\nimport StringHelper from \"./stringHelper\";\r\n\r\nclass FilterHelper {\r\n\r\n /**\r\n * Sets which floor of hotspots to be visible and triggers further filtering for the visible plane.\r\n * @param hotspotScene Three js scene which contains the hotspots\r\n * @param hoveredHotspotKey Key of the hotspot currently hovered\r\n * @param hotspotColors Colors for hotspots.\r\n * @param hotspotUnavailableColor Color for unavailable hotspots\r\n * @param currentTags Current tags for filtering\r\n * @param currentState Number of current state/floor\r\n * @param currentTypes Array of values to filter by\r\n * @param currentPricesFilter Array of two price values by which hotspots are filtered\r\n * @param currentQuadratureFilter Array of two quadrature values by which hotspots are filtered\r\n * @param currentStateJSON Json data of the current state/floor from the API\r\n */\r\n setCurrentPlaneVisibility(hotspotScene, hoveredHotspotKey, hotspotColors, hotspotUnavailableColor, currentTags, currentState, currentTypes, currentPricesFilter, currentQuadratureFilter, currentStateJSON) {\r\n hotspotScene.children.forEach((child, index) => {\r\n if (currentState === index) {\r\n child.visible = true;\r\n this.setFilteredHotspotVisibility(child.children, hoveredHotspotKey, hotspotColors, hotspotUnavailableColor, currentTags, currentTypes, currentPricesFilter, currentQuadratureFilter, index, currentStateJSON);\r\n } else {\r\n child.visible = false;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Checks if the tags of an apartment are contained within current filter tags.\r\n * Returns a boolean.\r\n * @param currentTags Current tags\r\n * @param apartmentTags Tags of an apartment\r\n */\r\n checkAllApartmentTags(currentTags, apartmentTags) {\r\n if (currentTags.length !== 0 && apartmentTags.length === 0) return false;\r\n\r\n let numberOfFilters = currentTags.length;\r\n for (let i = 0; i < apartmentTags.length; i++) {\r\n if (currentTags.includes(apartmentTags[i])) {\r\n numberOfFilters--;\r\n }\r\n }\r\n\r\n if (numberOfFilters > 0) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if the passed apartment is within price and quadrature filters.\r\n * Returns a boolean.\r\n * @param apartmentInfo Info of the apartment being filtered\r\n * @param currentPricesFilter Price range filter values\r\n * @param currentQuadratureFilter Quadrature range filter values\r\n */\r\n checkApartmentPriceAndQuadrature(apartmentInfo, currentPricesFilter, currentQuadratureFilter) {\r\n let priceBoolean = (apartmentInfo.price >= currentPricesFilter.min && apartmentInfo.price <= currentPricesFilter.max);\r\n let quadratureBoolean = (apartmentInfo.quadrature >= currentQuadratureFilter.min && apartmentInfo.quadrature <= currentQuadratureFilter.max);\r\n // Check price filter and quadrature filter\r\n if (priceBoolean && quadratureBoolean) return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Checks if an apartment has the type filter which we are filtering by.\r\n * Returns a boolean.\r\n * @param currentTypes Array of types we are currently filtering by\r\n * @param apartmentInfo Info of the apartment we are filtering\r\n */\r\n checkFilterTypes(currentTypes, apartmentInfo) {\r\n if (currentTypes.length === 0 || currentTypes.includes(apartmentInfo.type)) return true;\r\n return false;\r\n }\r\n\r\n extractCode(str) { \r\n const regex = /stroke_(.*)/i;\r\n const match = str.match(regex);\r\n return match ? match[1] : null;\r\n }\r\n\r\n /**\r\n * Filters which hotspots should be visible and sets their colors.\r\n * @param objects Array of objects loaded from a single fbx \r\n * @param hotspotScene Three js scene which contains the hotspots\r\n * @param hoveredHotspotKey Key of the hotspot currently hovered\r\n * @param hotspotColors Colors for hotspots.\r\n * @param hotspotUnavailableColor Color for unavailable hotspots\r\n * @param currentTags Current tags for filtering\r\n * @param currentState Number of current state/floor\r\n * @param currentTypes Array of values to filter by\r\n * @param currentPricesFilter Array of two price values by which hotspots are filtered\r\n * @param currentQuadratureFilter Array of two quadrature values by which hotspots are filtered\r\n * @param floorIndex Index of active state/floor\r\n * @param currentStateJSON Json data of the current state/floor from the API\r\n */\r\n setFilteredHotspotVisibility(objects, hoveredHotspotKey, hotspotColors, hotspotUnavailableColor, currentTags, currentTypes, currentPricesFilter, currentQuadratureFilter, floorIndex, currentStateJSON) {\r\n let apartments = null;\r\n let stroke;\r\n\r\n if (currentStateJSON !== undefined || currentStateJSON !== null) {\r\n apartments = currentStateJSON[floorIndex].apartments\r\n } \r\n \r\n objects.forEach((child) => {\r\n if(child.name.toLowerCase().includes(\"stroke\")) {\r\n stroke = this.extractCode(child.name.toLowerCase()); \r\n }\r\n\r\n if (child.isMesh) {\r\n if (apartments != null) {\r\n apartments.forEach((apartment) => {\r\n let keyToCompare = apartment.key.includes('_') ? apartment.key.replace('_', '') : apartment.key;\r\n let hoverToCompare = hoveredHotspotKey.includes('_') ? hoveredHotspotKey.replace('_', '') : hoveredHotspotKey;\r\n \r\n if ((stroke === keyToCompare.toLowerCase()) &&\r\n child.name.toLowerCase().includes(\"stroke\") &&\r\n (stroke === hoverToCompare.toLowerCase())) {\r\n \r\n child.material.color.set(new THREE.Color(hotspotColors[apartment.type].strokeColor));\r\n child.material.transparent = false;\r\n child.material.opacity = 1;\r\n child.material.needsUpdate = true;\r\n child.visible = true;\r\n \r\n } else if (stroke && (!hoveredHotspotKey || stroke !== hoverToCompare.toLowerCase()) &&\r\n child.name.toLowerCase().includes(\"stroke\")) {\r\n child.visible = false;\r\n }\r\n\r\n if (child.name === apartment.key) { \r\n\r\n if (child.name === hoveredHotspotKey) { \r\n child.material.opacity = hotspotColors[apartment.type].hoverOpacity;\r\n child.material.color.set(new THREE.Color(hotspotColors[apartment.type].defaultColor));\r\n return;\r\n }\r\n\r\n if (child.name !== hoveredHotspotKey) {\r\n child.material.userData.outlineParameters = {\r\n visible: false,\r\n };\r\n }\r\n\r\n if (!apartment.isAvailable) {\r\n child.material.opacity = 1;\r\n child.material.color.set(hotspotUnavailableColor);\r\n }\r\n else {\r\n let typesOkay = this.checkFilterTypes(currentTypes, apartment);\r\n let tagsOkay = this.checkAllApartmentTags(currentTags, apartment.tags);\r\n let priceAndQuadratureOkay = this.checkApartmentPriceAndQuadrature(apartment, currentPricesFilter, currentQuadratureFilter);\r\n\r\n if (currentTypes.length > 0) {\r\n if (typesOkay && tagsOkay && priceAndQuadratureOkay) {\r\n child.material.color.set(new THREE.Color(hotspotColors[apartment.type].defaultColor));\r\n child.material.opacity = hotspotColors[apartment.type].defaultOpacity;\r\n }\r\n else {\r\n child.material.opacity = 0.6;\r\n child.material.color.set(hotspotUnavailableColor);\r\n }\r\n }\r\n // There are no filter by types => Check rest\r\n else {\r\n if (tagsOkay && priceAndQuadratureOkay) {\r\n child.material.color.set(new THREE.Color(hotspotColors[apartment.type].defaultColor));\r\n child.material.opacity = hotspotColors[apartment.type].defaultOpacity;\r\n }\r\n else {\r\n child.material.color.set(hotspotUnavailableColor);\r\n child.material.opacity = 0.6;\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 new FilterHelper();","import { OutlineEffect } from 'three/examples/jsm/effects/OutlineEffect.js';\r\nimport * as THREE from 'three';\r\n\r\nclass EffectHelper {\r\n initializeOutlineRenderer(hotspotScene, camera, renderer) {\r\n var effect = new OutlineEffect(renderer, {});\r\n let objectsInScene = [];\r\n\r\n for (let i = 0; i < hotspotScene.children.length; i++) {\r\n for (let j = 0; j < hotspotScene.children[i].children.length; j++) {\r\n if (hotspotScene.children[i].children[j].type === \"Mesh\") {\r\n objectsInScene.push(hotspotScene.children[i].children[j]);\r\n }\r\n }\r\n }\r\n\r\n function edgeDistances(item) {\r\n const geometry = item.geometry;\r\n const vertices = geometry.attributes.position.array;\r\n \r\n let minDistance = Infinity;\r\n let maxDistance = -Infinity;\r\n \r\n for (let i = 0; i < vertices.length; i += 3) {\r\n const vertex = new THREE.Vector3(vertices[i], vertices[i + 1], vertices[i + 2]);\r\n vertex.applyMatrix4(item.matrixWorld);\r\n \r\n const distance = camera.position.distanceTo(vertex);\r\n minDistance = Math.min(minDistance, distance);\r\n maxDistance = Math.max(maxDistance, distance);\r\n }\r\n \r\n return { closest: minDistance, furthest: maxDistance };\r\n }\r\n\r\n function sortObjects() {\r\n let renderOrder = 2;\r\n \r\n let sortedObjects = objectsInScene.sort((a, b) => {\r\n let distanceA = edgeDistances(a);\r\n let distanceB = edgeDistances(b);\r\n\r\n let avgA = (distanceA.closest + distanceA.furthest) / 2;\r\n let avgB = (distanceB.closest + distanceB.furthest) / 2;\r\n return avgA - avgB;\r\n \r\n });\r\n\r\n sortedObjects.forEach((item) => {\r\n item.renderOrder = renderOrder++;\r\n\r\n if(!item.name.toLowerCase().includes(\"stroke\") && item.name.includes('_') && item.renderOrder < 10) { \r\n item.onBeforeRender = (renderer) => {\r\n const gl = renderer.getContext();\r\n gl.enable(gl.STENCIL_TEST);\r\n gl.stencilMask(0xff);\r\n gl.stencilFunc(gl.NOTEQUAL, 1, 0xff);\r\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);\r\n };\r\n \r\n item.onAfterRender = (renderer) => {\r\n const gl = renderer.getContext();\r\n gl.enable(gl.STENCIL_TEST);\r\n gl.stencilMask(0xff);\r\n gl.stencilFunc(gl.NOTEQUAL, 1, 0xff);\r\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\r\n };\r\n } else {\r\n item.onAfterRender = (renderer) => {\r\n const gl = renderer.getContext();\r\n gl.stencilMask(0xff);\r\n gl.stencilFunc(gl.ALWAYS, 1, 0xff);\r\n gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);\r\n gl.disable(gl.STENCIL_TEST);\r\n };\r\n }\r\n \r\n });\r\n\r\n \r\n }\r\n\r\n function render() {\r\n sortObjects();\r\n effect.render(hotspotScene, camera);\r\n }\r\n\r\n return render;\r\n }\r\n}\r\n\r\nexport default new EffectHelper();\r\n","import React, { Component } from \"react\";\r\nimport { Vector3 } from \"three\";\r\n\r\nimport * as THREE from \"three\";\r\nimport { FBXLoader } from \"three/examples/jsm/loaders/FBXLoader.js\";\r\n\r\nimport sceneHelper from \"../../utils/helpers/sceneHelper\";\r\nimport stringHelper from \"../../utils/helpers/stringHelper\";\r\nimport windowHelper from \"../../utils/helpers/windowHelper\";\r\nimport labelHelper from \"../../utils/helpers/labelHelper\";\r\nimport stateHelper from \"../../utils/helpers/stateHelper\";\r\nimport filterHelper from \"../../utils/helpers/filterHelper\";\r\nimport effectHelper from \"../../utils/helpers/effectHelper\";\r\n\r\nimport \"./ObjectWindow.css\";\r\n\r\nclass ObjectWindow extends Component {\r\n state = {\r\n camera: \"\",\r\n shouldPauseLoading: false,\r\n currentFloorLoading: \"\",\r\n isGIFShown: false,\r\n loadedImages: 0,\r\n shiftedApartmentKeys: [],\r\n allStates: [],\r\n imagesQueue: [],\r\n loadingQueue: [],\r\n cachedImages: {},\r\n labelIsHovered: false,\r\n hoveredHotspotKey: \"\",\r\n hoveredLinkHotspotUrl: \"\",\r\n mousePositionY: 0,\r\n loadingDone: false,\r\n shouldDisplayLabel: false,\r\n isSideMenuHovered: false,\r\n\r\n sceneNeedsRender: true,\r\n imageIsChanging: false,\r\n\r\n favouriteApartments: [],\r\n\r\n frameId: 0,\r\n frameParameters: {},\r\n defaultCameraTargetDistance: 0,\r\n\r\n fbxLoader: new FBXLoader(),\r\n loader: new THREE.TextureLoader(),\r\n mouse: new THREE.Vector2(9999, 9999),\r\n raycaster: new THREE.Raycaster(),\r\n };\r\n loadingClass = { display: \"none\" };\r\n\r\n async loadAndGetKeyframes() {\r\n for (let state of this.props.projectJSON.states) {\r\n if (state.hotspotUrl) {\r\n const keyframeTracks = await sceneHelper.loadCameraAndTargetAnimations(\r\n this.state.fbxLoader,\r\n state.hotspotUrl\r\n );\r\n return keyframeTracks;\r\n }\r\n }\r\n return [null, null];\r\n }\r\n\r\n /**\r\n * Function use to initialize three.js scene and attach event listeners related to three.js.\r\n */\r\n async initializeScene() {\r\n THREE.Cache.enabled = true;\r\n const scene = new THREE.Scene();\r\n const hotspotScene = new THREE.Scene();\r\n const renderer = sceneHelper.initializeRenderer(\"my-canvas\");\r\n const camera = sceneHelper.initializeCamera();\r\n const sprite = sceneHelper.initializeSprite();\r\n const sphere = await sceneHelper.initializeBackground(\r\n this.props.threeSixtyImageUrl\r\n );\r\n\r\n const cameraAndTargetKeyframeTracks = await this.loadAndGetKeyframes();\r\n let cameraKeyframeTrack;\r\n let cameraTargetKeyframeTrack;\r\n if (!cameraAndTargetKeyframeTracks[0]) {\r\n cameraKeyframeTrack = null;\r\n cameraTargetKeyframeTrack = null;\r\n } else {\r\n cameraKeyframeTrack = cameraAndTargetKeyframeTracks[0];\r\n cameraTargetKeyframeTrack = cameraAndTargetKeyframeTracks[1];\r\n }\r\n\r\n camera.zoom = this.props.cameraZoom;\r\n\r\n const hotspotDictionary = await sceneHelper.loadHotspots(\r\n this.state.fbxLoader,\r\n hotspotScene,\r\n camera,\r\n this.props.projectJSON.states,\r\n scene,\r\n this.props\r\n );\r\n\r\n this.setState({ camera: camera });\r\n for (let i = 0; i < Object.keys(hotspotDictionary).length; i++) {\r\n hotspotScene.add(hotspotDictionary[i]);\r\n }\r\n\r\n // effectHelper.initializeOutlineRenderer(hotspotScene, camera, renderer);\r\n const outlineEffect = effectHelper.initializeOutlineRenderer(\r\n hotspotScene,\r\n camera,\r\n renderer\r\n );\r\n\r\n let label = await labelHelper.createLabel(camera);\r\n\r\n scene.add(sprite);\r\n scene.add(sphere);\r\n\r\n window.addEventListener(\r\n \"resize\",\r\n () => {\r\n windowHelper.onWindowResize(renderer, camera);\r\n },\r\n false\r\n );\r\n\r\n window.addEventListener(\r\n \"mousemove\",\r\n (event) => {\r\n if (!this.state.loadingDone) return;\r\n this.onMouseMove(event, this.state.raycaster, this.state.mouse, camera);\r\n },\r\n false\r\n );\r\n\r\n window.addEventListener(\r\n \"touchend\",\r\n (event) => {\r\n this.onTouchEnd(event, this.state.raycaster, this.state.mouse, camera);\r\n },\r\n false\r\n );\r\n\r\n this.setState({\r\n frameParameters: {\r\n scene,\r\n hotspotScene,\r\n renderer,\r\n outlineEffect,\r\n camera,\r\n label,\r\n sprite,\r\n mouse: this.state.mouse,\r\n raycaster: this.state.raycaster,\r\n sphere,\r\n cameraKeyframeTrack,\r\n cameraTargetKeyframeTrack,\r\n },\r\n cameraDefaultPosition: camera.position.clone(),\r\n });\r\n }\r\n\r\n /**\r\n * Render loop.\r\n * @param scene\r\n * @param hotspotScene\r\n * @param renderer\r\n * @param outlineEffect\r\n * @param camera\r\n * @param label\r\n * @param mouse\r\n * @param raycaster\r\n * @param sphere\r\n */\r\n updateFrame = async (\r\n scene,\r\n hotspotScene,\r\n renderer,\r\n outlineEffect,\r\n camera,\r\n label,\r\n sprite,\r\n mouse,\r\n raycaster,\r\n sphere,\r\n cameraKeyframeTrack,\r\n cameraTargetKeyframeTrack\r\n ) => {\r\n let id = requestAnimationFrame(async () =>\r\n this.updateFrame(\r\n scene,\r\n hotspotScene,\r\n renderer,\r\n outlineEffect,\r\n camera,\r\n label,\r\n sprite,\r\n mouse,\r\n raycaster,\r\n sphere,\r\n cameraKeyframeTrack,\r\n cameraTargetKeyframeTrack\r\n )\r\n );\r\n\r\n this.setState({ frameId: id });\r\n if (this.state.labelIsHovered) return;\r\n\r\n this.setState({ hoveredHotspotKey: \"\" });\r\n\r\n this.setState({ shouldDisplayLabel: false });\r\n\r\n //Used to check if hotspots are interected\r\n if (\r\n hotspotScene.visible &&\r\n hotspotScene.children.length &&\r\n !this.props.isDragging &&\r\n !this.props.isMapShown &&\r\n !this.props.isCompareShown &&\r\n !this.props.isApartmentInfoShown\r\n ) {\r\n for (const child in hotspotScene.children) {\r\n let intersects = [];\r\n intersects = await raycaster.intersectObjects(\r\n hotspotScene.children[child].children\r\n );\r\n\r\n if (intersects.length === 0) {\r\n this.setState({ hoveredHotspotKey: \"\" });\r\n }\r\n\r\n if (\r\n intersects.length > 0 &&\r\n hotspotScene.children[child].visible &&\r\n intersects[0].object.visible\r\n ) {\r\n let intersect = intersects[0];\r\n this.setState({ hoveredHotspotKey: intersect.object.name });\r\n\r\n const intersectedApartment = this.props.allApartments[this.state.hoveredHotspotKey];\r\n\r\n if(intersectedApartment && intersectedApartment.isLink) {\r\n renderer.domElement.style.cursor = \"pointer\";\r\n this.setState({ hoveredLinkHotspotUrl: intersectedApartment.linkTo });\r\n } \r\n\r\n if (this.props.hotspotUnavailableColor !== undefined) {\r\n let color = new THREE.Color(this.props.hotspotUnavailableColor);\r\n if (intersects[0].object.material.color.equals(color)) {\r\n return;\r\n }\r\n }\r\n\r\n if (!this.props.isApartmentInfoShown) {\r\n labelHelper.updateHotspotInfo(\r\n intersect.object.name,\r\n this.props.currentState,\r\n this.props.favouriteApartments,\r\n this.props.projectJSON\r\n );\r\n }\r\n break;\r\n }\r\n\r\n if (intersects.length === 0) {\r\n if (this.state.hoveredLinkHotspotUrl !== \"\") {\r\n this.setState({ hoveredLinkHotspotUrl: \"\" });\r\n }\r\n hotspotScene.children[child].children.forEach((child) => {\r\n if (child.material) {\r\n child.material.opacity = 0;\r\n child.material.userData.outlineParameters = {\r\n visible: false,\r\n };\r\n }\r\n });\r\n renderer.domElement.style.cursor = \"default\";\r\n }\r\n\r\n if (this.state.hoveredLinkHotspotUrl) {\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (this.state.imageIsChanging) {\r\n return;\r\n }\r\n if (\r\n !this.state.hoveredLinkHotspotUrl &&\r\n this.state.hoveredHotspotKey &&\r\n !this.state.hoveredHotspotKey.includes(\"mask\")\r\n ) {\r\n this.setState({ shouldDisplayLabel: true });\r\n\r\n labelHelper.moveLabel(this.state.mouse);\r\n }\r\n\r\n filterHelper.setCurrentPlaneVisibility(\r\n hotspotScene,\r\n this.state.hoveredHotspotKey,\r\n this.props.hotspotColors,\r\n this.props.hotspotUnavailableColor,\r\n this.props.currentTags,\r\n this.props.currentState,\r\n this.props.currentFilter,\r\n this.props.currentPricesFilter,\r\n this.props.currentQuadratureFilter,\r\n this.props.projectJSON.name ? this.props.projectJSON.states : null\r\n );\r\n this.applyCustomStateParameters(this.props.currentState);\r\n\r\n const cameraPosition = await sceneHelper.updateCameraPosition(\r\n camera,\r\n cameraKeyframeTrack,\r\n this.props.currentColumn,\r\n this.state.cameraDistanceMultiplier\r\n );\r\n\r\n if (cameraKeyframeTrack) {\r\n const targetPosition = await sceneHelper.updateTargetPosition(\r\n camera,\r\n cameraTargetKeyframeTrack,\r\n this.props.currentColumn,\r\n this.props.targetDefaultPosition,\r\n this.state.cameraDistanceMultiplier\r\n );\r\n\r\n const distance = await cameraPosition.distanceTo(targetPosition);\r\n\r\n if (\r\n this.state.defaultCameraTargetDistance === 0 ||\r\n this.props.calibratorEnabled\r\n ) {\r\n await this.setDefaultCameraDistance(\r\n cameraKeyframeTrack,\r\n cameraTargetKeyframeTrack\r\n );\r\n }\r\n\r\n sceneHelper.updateSpritePosition(\r\n sprite,\r\n cameraTargetKeyframeTrack,\r\n this.props.currentColumn,\r\n this.state.defaultCameraTargetDistance,\r\n distance,\r\n this.state.cameraDistanceMultiplier,\r\n targetPosition\r\n );\r\n }\r\n\r\n labelHelper.displayLabel(this.state.shouldDisplayLabel);\r\n this.scaleHotspots(this.state.hotspotScale, hotspotScene);\r\n\r\n camera.zoom = this.props.cameraZoom;\r\n renderer.clear();\r\n\r\n camera.updateProjectionMatrix();\r\n\r\n renderer.render(scene, camera);\r\n renderer.clearDepth();\r\n outlineEffect();\r\n };\r\n\r\n /**\r\n * Sets the default camera distance from the initial position of the animations.\r\n * @param cameraKeyframeTrack Keyframetrack containing camera positions\r\n * @param cameraTargetKeyframeTrack Keyframetrack containing camera target positions\r\n */\r\n async setDefaultCameraDistance(\r\n cameraKeyframeTrack,\r\n cameraTargetKeyframeTrack\r\n ) {\r\n const defaultCameraPosition = new Vector3(\r\n cameraKeyframeTrack.values[0],\r\n cameraKeyframeTrack.values[1],\r\n cameraKeyframeTrack.values[2]\r\n );\r\n\r\n let defaultCameraTargetPosition;\r\n if (cameraTargetKeyframeTrack !== undefined) {\r\n defaultCameraTargetPosition = await new Vector3(\r\n cameraTargetKeyframeTrack.values[0],\r\n cameraTargetKeyframeTrack.values[1],\r\n cameraTargetKeyframeTrack.values[2]\r\n );\r\n } else {\r\n defaultCameraTargetPosition = await this.props.targetDefaultPosition;\r\n }\r\n defaultCameraTargetPosition = defaultCameraTargetPosition\r\n .clone()\r\n .multiplyScalar(this.state.cameraDistanceMultiplier);\r\n\r\n const defaultCameraDistance = await defaultCameraPosition\r\n .multiplyScalar(this.state.cameraDistanceMultiplier)\r\n .distanceTo(defaultCameraTargetPosition);\r\n this.setState({ defaultCameraTargetDistance: defaultCameraDistance });\r\n }\r\n\r\n /**\r\n * Sets variables to state that are used to calibrate overlap of hotspots.\r\n * @param currentState Number of the current state\r\n */\r\n applyCustomStateParameters(currentState) {\r\n if (this.props.calibratorEnabled) {\r\n this.setState({\r\n cameraDistanceMultiplier: this.props.cameraDistanceMultiplier,\r\n });\r\n this.setState({ hotspotScale: this.props.hotspotScale });\r\n return;\r\n }\r\n\r\n const state = this.props.projectJSON.states[currentState];\r\n this.setState({ cameraDistanceMultiplier: state.cameraDistance });\r\n this.setState({ hotspotScale: state.hotspotSize });\r\n }\r\n\r\n /**\r\n * Scales the three.js scene containing the hotspots.\r\n * @param hotspotScale Scale variable used to scale the hotspot scene\r\n * @param hotspotScene Three.js scene containing the hotspots\r\n */\r\n scaleHotspots(hotspotScale, hotspotScene) {\r\n hotspotScene.scale.setScalar(hotspotScale);\r\n }\r\n\r\n /**\r\n * Shows loading gif.\r\n */\r\n showGIF() {\r\n const event = new CustomEvent(\"showGIF\", {\r\n detail: {\r\n gifShown: true,\r\n },\r\n });\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(event);\r\n\r\n this.setState({ isGIFShown: true });\r\n this.loadingClass = { display: \"flex\" };\r\n }\r\n /**\r\n * Hides loading gif.\r\n */\r\n hideGIF() {\r\n const event = new CustomEvent(\"showGIF\", {\r\n detail: {\r\n gifShown: false,\r\n },\r\n });\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n fullscreenNode.dispatchEvent(event);\r\n\r\n this.setState({ isGIFShown: false });\r\n this.loadingClass = { display: \"none\" };\r\n this.forceUpdate();\r\n }\r\n\r\n /**\r\n * Handles mousemove event for raycasting.\r\n * @param event Event parameter\r\n * @param raycaster Three.js raycaster\r\n * @param mouse Mouse position data\r\n * @param camera Three.js camera for the main scene\r\n */\r\n onMouseMove(event, raycaster, mouse, camera) {\r\n if (this.state.isSideMenuHovered) return;\r\n\r\n let container = document\r\n .getElementById(\"full-screenable-node\")\r\n .getBoundingClientRect();\r\n\r\n this.setState({\r\n mouse: {\r\n // x: (event.clientX / window.innerWidth) * 2 - 1,\r\n // y: -(event.clientY / window.innerHeight) * 2 + 1,\r\n x: ((event.clientX - container.left) / container.width) * 2 - 1,\r\n y: -((event.clientY - container.top) / container.height) * 2 + 1,\r\n positionX: event.clientX - container.left,\r\n positionY: event.clientY - container.top,\r\n },\r\n });\r\n raycaster.setFromCamera(mouse, camera);\r\n }\r\n\r\n /**\r\n * Handles touchend event for raycasting.\r\n * @param event Event parameter\r\n * @param raycaster Three.js raycaster\r\n * @param mouse Mouse position data\r\n * @param camera Three.js camera for the main scene\r\n */\r\n onTouchEnd(event, raycaster, mouse, camera) {\r\n this.setState({\r\n mouse: {\r\n x: (event.changedTouches[0].clientX / window.innerWidth) * 2 - 1,\r\n y: -(event.changedTouches[0].clientY / window.innerHeight) * 2 + 1,\r\n },\r\n });\r\n raycaster.setFromCamera(mouse, camera);\r\n }\r\n\r\n /**\r\n * Texture loader that waits for image to download.\r\n * @param path Path where to load image from.\r\n */\r\n waitForImageLoad(path) {\r\n return new Promise((resolve, reject) => {\r\n this.state.loader.load(\r\n path,\r\n (texture) => {\r\n resolve(texture);\r\n },\r\n null,\r\n (error) => reject(error.error)\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Takes the n-th State from array and moves it to the start to be loaded.\r\n * @param key Key of the State we are moving to the beginning.\r\n */\r\n shiftFloorToStart(key) {\r\n // Check if state with this key is already loaded.\r\n if (this.state.imagesQueue.indexOf(key) === -1) return;\r\n let indexOfKey = this.state.imagesQueue.indexOf(key);\r\n //if(indexOfKey === 0) return; // TODO: Test this for column changing it does not need to shift if its already loading this state.\r\n let imgKey = this.state.imagesQueue[indexOfKey];\r\n let imgPaths = this.state.loadingQueue[indexOfKey];\r\n\r\n this.state.imagesQueue.splice(indexOfKey, 1);\r\n this.state.loadingQueue.splice(indexOfKey, 1);\r\n\r\n this.state.imagesQueue.unshift(imgKey);\r\n this.state.loadingQueue.unshift(imgPaths);\r\n }\r\n\r\n /**\r\n * Given the position of the column, creates new array where the elements are in order: [column+i, column-i, ...]\r\n * @param key Key of the State.\r\n * @param column Number of Column.\r\n * @param shouldWait Should this method return promise.\r\n */\r\n shiftColumnToStart(key, column, shouldWait = true) {\r\n let indexOfState = this.state.imagesQueue.indexOf(key);\r\n let unsortedArray = this.state.loadingQueue[indexOfState];\r\n if (unsortedArray.length < 3) return unsortedArray; // <=\r\n let numberOfElements = unsortedArray.length;\r\n let sortedArray = [];\r\n let indexOfFirst = 0;\r\n\r\n let testArray = [];\r\n for (var i = 0; i < unsortedArray.length; i++) {\r\n testArray.push(unsortedArray[i][0]);\r\n if (unsortedArray[i][0] === column) {\r\n indexOfFirst = i;\r\n }\r\n }\r\n\r\n let indexOfPrevious = indexOfFirst - 1;\r\n let indexOfNext = indexOfFirst + 1;\r\n\r\n if (indexOfPrevious < 0) {\r\n indexOfPrevious = numberOfElements - 1;\r\n }\r\n\r\n if (indexOfNext >= numberOfElements) {\r\n indexOfNext = 0;\r\n }\r\n let currentElement = unsortedArray[indexOfFirst];\r\n let previousElement = unsortedArray[indexOfPrevious];\r\n let nextElement = unsortedArray[indexOfNext];\r\n\r\n sortedArray.push(currentElement);\r\n sortedArray.push(previousElement);\r\n sortedArray.push(nextElement);\r\n\r\n while (sortedArray.length !== numberOfElements) {\r\n indexOfPrevious--;\r\n indexOfNext++;\r\n\r\n if (indexOfPrevious < 0) indexOfPrevious = numberOfElements - 1;\r\n if (indexOfNext >= numberOfElements) indexOfNext = 0;\r\n\r\n previousElement = unsortedArray[indexOfPrevious];\r\n nextElement = unsortedArray[indexOfNext];\r\n\r\n sortedArray.push(previousElement);\r\n if (indexOfPrevious !== indexOfNext) sortedArray.push(nextElement);\r\n }\r\n\r\n this.state.loadingQueue[indexOfState] = sortedArray;\r\n if (shouldWait) {\r\n return new Promise((resolve) => resolve());\r\n }\r\n }\r\n\r\n /**\r\n * Starts loading Queue always loades the first element in Array.\r\n * After loading image, first element in array is removed.\r\n */\r\n async startLoadingQueue() {\r\n while (this.state.loadingQueue.length > 0) {\r\n this.state.currentFloorLoading = this.state.imagesQueue[0];\r\n\r\n if (this.state.loadingQueue[0][0] === undefined) {\r\n console.warn(\"this.state.loadingQueue[0][0] is undefiend\");\r\n this.state.loadingQueue[0].shift();\r\n if (this.state.loadingQueue[0].length === 0) {\r\n this.state.loadingQueue.shift();\r\n this.state.imagesQueue.shift();\r\n }\r\n continue;\r\n }\r\n\r\n let path = this.state.loadingQueue[0][0][1];\r\n let key =\r\n this.state.currentFloorLoading + \"_\" + this.state.loadingQueue[0][0][0];\r\n\r\n let buildingOrApartmentIdentifier =\r\n stringHelper.getLoadingStateIdentifier(key);\r\n\r\n let texture = await this.waitForImageLoad(path);\r\n texture.minFilter = THREE.LinearFilter;\r\n\r\n this.state.cachedImages[key] = texture;\r\n\r\n let currentKey = stringHelper.makeImageKey(\r\n buildingOrApartmentIdentifier === \"B\" ? \"B\" : \"A\",\r\n \"High\",\r\n this.props.currentState,\r\n buildingOrApartmentIdentifier === \"B\"\r\n ? this.props.currentRow\r\n : this.props.apartmentClickedInfo !== undefined\r\n ? this.props.apartmentClickedInfo.key\r\n : \"\",\r\n buildingOrApartmentIdentifier === \"B\"\r\n ? this.props.currentColumn\r\n : this.props.currentHotspotColumn\r\n );\r\n\r\n if (this.state.currentFloorLoading === this.state.imagesQueue[0]) {\r\n this.state.loadingQueue[0].shift();\r\n if (this.state.loadingQueue[0].length === 0) {\r\n this.state.loadingQueue.shift();\r\n this.state.imagesQueue.shift();\r\n }\r\n if (key === currentKey) {\r\n if (buildingOrApartmentIdentifier === \"B\")\r\n sceneHelper.updateTexture(texture);\r\n else sceneHelper.updateApartmentTexture(texture);\r\n this.setState({ sceneNeedsRender: true });\r\n\r\n if (this.state.isGIFShown) this.hideGIF();\r\n }\r\n if (this.state.shouldPauseLoading === true) {\r\n await this.shiftColumnToStart(\r\n this.state.imagesQueue[0],\r\n this.props.currentColumn,\r\n true\r\n );\r\n this.state.shouldPauseLoading = false;\r\n }\r\n } else {\r\n let loadingStateIndex = this.state.imagesQueue.indexOf(\r\n this.state.currentFloorLoading\r\n );\r\n // We shifted the new state to be loaded first => pop this state from queue(Where).\r\n this.state.loadingQueue[loadingStateIndex].shift();\r\n // If we loaded all images from the second state => second because it was shifted in the mean time.\r\n if (this.state.loadingQueue[loadingStateIndex].length === 0) {\r\n this.state.loadingQueue.splice(loadingStateIndex, 1);\r\n }\r\n if (this.state.shouldPauseLoading === true) {\r\n await this.shiftColumnToStart(\r\n this.state.imagesQueue[0],\r\n this.props.currentColumn,\r\n true\r\n );\r\n this.state.shouldPauseLoading = false;\r\n }\r\n }\r\n }\r\n this.setState({ currentFloorLoading: \"\" });\r\n }\r\n\r\n /**\r\n * Loads, stores default state images and update the proggress for loading bar.\r\n */\r\n async loadDefaultStateImages() {\r\n let floor = this.props.currentState;\r\n let rows = this.props.projectJSON.states[floor].rows.length;\r\n let columns = this.props.maxColumns;\r\n\r\n let imagesToLoad = rows * columns;\r\n let loadedImages = 0;\r\n\r\n for (var i = 0; i < rows; i++) {\r\n for (var j = 0; j < columns; j++) {\r\n let textureKey = stringHelper.makeImageKey(\"B\", \"High\", floor, i, j);\r\n let path = this.state.loadingQueue[0][0][1];\r\n\r\n let texture = await this.waitForImageLoad(path);\r\n texture.minFilter = THREE.LinearFilter;\r\n this.state.cachedImages[textureKey] = texture;\r\n\r\n loadedImages++;\r\n\r\n let percentage = Math.floor((loadedImages / imagesToLoad) * 100);\r\n this.props.update.getLoadingProgress(percentage);\r\n this.state.loadingQueue[0].shift();\r\n }\r\n this.state.imagesQueue.shift();\r\n this.state.loadingQueue.shift();\r\n }\r\n\r\n let key = stringHelper.makeImageKey(\r\n \"B\",\r\n \"High\",\r\n floor,\r\n this.props.currentRow,\r\n this.props.currentColumn\r\n );\r\n\r\n //Apply Apartment Image in Current State\r\n this.applyBuildingImageInCurrentState(key);\r\n this.setState({ loadingDone: true });\r\n //Start LoadingQueue\r\n this.startLoadingQueue();\r\n }\r\n\r\n /**\r\n *\r\n * @param parameters\r\n * @param lowImageKey\r\n * @param path\r\n * @param isBuilding\r\n */\r\n async loadLowResAndApply(parameters, lowImageKey, path, isBuilding = true) {\r\n this.setState({ imageIsChanging: true });\r\n // If High res image with same parametars is loaded in meantime.\r\n let checkHighKey = \"\";\r\n\r\n checkHighKey = stringHelper.makeImageKey(\r\n isBuilding ? \"B\" : \"A\",\r\n \"High\",\r\n parameters[0],\r\n parameters[1],\r\n parameters[2]\r\n );\r\n\r\n if (this.state.cachedImages[checkHighKey] !== undefined) {\r\n if (this.state.isGIFShown) this.hideGIF();\r\n }\r\n if (!this.state.isGIFShown) this.showGIF();\r\n\r\n let fullscreenNode = document.getElementById(\"full-screenable-node\");\r\n let event = new CustomEvent(\"imageIsLoading\", {\r\n detail: {\r\n value: true,\r\n },\r\n });\r\n fullscreenNode.dispatchEvent(event);\r\n\r\n let texture = await this.waitForImageLoad(path);\r\n // Apply Texture\r\n texture.minFilter = THREE.LinearFilter;\r\n\r\n // Cache this low res\r\n this.state.cachedImages[lowImageKey] = texture;\r\n let currentKey = \"\";\r\n\r\n currentKey = stringHelper.makeImageKey(\r\n isBuilding ? \"A\" : \"B\",\r\n \"Low\",\r\n this.props.currentState,\r\n this.props.currentRow,\r\n this.props.currentColumn\r\n );\r\n\r\n // If current key is not at the same as this key.\r\n // Or the high res image is loaded in the meantime.\r\n if (\r\n lowImageKey !== currentKey ||\r\n this.state.cachedImages[checkHighKey] !== undefined\r\n ) {\r\n event = new CustomEvent(\"imageIsLoading\", {\r\n detail: {\r\n value: false,\r\n },\r\n });\r\n fullscreenNode.dispatchEvent(event);\r\n\r\n if (this.state.isGIFShown) this.hideGIF();\r\n }\r\n if (isBuilding) sceneHelper.updateTexture(texture);\r\n else sceneHelper.updateApartmentTexture(texture);\r\n\r\n this.setState({ sceneNeedsRender: true });\r\n this.setState({ imageIsChanging: false });\r\n\r\n if (this.state.isGIFShown) this.hideGIF();\r\n\r\n event = new CustomEvent(\"imageIsLoading\", {\r\n detail: {\r\n value: false,\r\n },\r\n });\r\n fullscreenNode.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * Finds the building texture with key from cache and sends it to the event.\r\n * @param key State Building key\r\n */\r\n async applyBuildingImageInCurrentState(key) {\r\n if (this.state.cachedImages[key] !== undefined) {\r\n sceneHelper.updateTexture(this.state.cachedImages[key]);\r\n this.setState({ sceneNeedsRender: true });\r\n }\r\n }\r\n\r\n /**\r\n * Finds the apartment texture with key from cache and sends it to the event.\r\n * @param key State Apartment key\r\n */\r\n applyApartmentImageInCurrentState(key) {\r\n if (this.state.cachedImages[key] !== undefined) {\r\n sceneHelper.updateApartmentTexture(this.state.cachedImages[key]);\r\n }\r\n }\r\n\r\n /**\r\n * Handles when props change, applies texture for this state or if there are is no texture => Load it.\r\n * @param newProps\r\n */\r\n async changeFloor(newProps) {\r\n const floor = newProps.currentState;\r\n const row = newProps.currentRow;\r\n const column = newProps.currentColumn;\r\n let stateKey = stringHelper.makeStateKey(\"B\", \"High\", floor, row);\r\n let imageKey = stateKey + \"_\" + column;\r\n\r\n if (stateHelper.isStateLoaded(this.state.imagesQueue, stateKey))\r\n this.applyBuildingImageInCurrentState(imageKey);\r\n else {\r\n // Check if image with these parametars is already loaded.\r\n if (this.state.cachedImages[imageKey] !== undefined)\r\n this.applyBuildingImageInCurrentState(imageKey);\r\n // Image with these parametars is not loaded.\r\n else {\r\n let lowImageKey = stringHelper.makeImageKey(\r\n \"B\",\r\n \"Low\",\r\n floor,\r\n row,\r\n column\r\n );\r\n if (this.state.cachedImages[lowImageKey] !== undefined)\r\n this.applyBuildingImageInCurrentState(lowImageKey);\r\n // Load Low Res Image.\r\n else {\r\n let lowImagePath =\r\n this.props.projectJSON.states[floor].rows[row].lowResUrls[column];\r\n await this.loadLowResAndApply(\r\n [floor, row, column],\r\n lowImageKey,\r\n lowImagePath\r\n );\r\n if (this.state.cachedImages[imageKey] === undefined) {\r\n // This state is Already loading\r\n if (this.state.currentFloorLoading === stateKey) {\r\n // Pause async loading so that columns can be shifted\r\n this.state.shouldPauseLoading = true;\r\n } else {\r\n this.shiftColumnToStart(\r\n stateKey,\r\n this.props.currentColumn,\r\n false\r\n );\r\n }\r\n }\r\n }\r\n }\r\n // Shift this state to beginning of the queue, to be loaded.\r\n this.shiftFloorToStart(stateKey);\r\n }\r\n }\r\n\r\n /**\r\n * Handles when props change, applies texture for this state or if there are is no texture => Load it.\r\n * @param newProps\r\n */\r\n async changeRow(newProps) {\r\n const floor = newProps.currentState;\r\n const row = newProps.currentRow;\r\n const column = newProps.currentColumn;\r\n\r\n let stateKey = stringHelper.makeStateKey(\"B\", \"High\", floor, row);\r\n let imageKey = stateKey + \"_\" + column;\r\n\r\n if (stateHelper.isStateLoaded(this.state.imagesQueue, stateKey)) {\r\n this.applyBuildingImageInCurrentState(imageKey);\r\n } else {\r\n // Check if high image with these parametars is already loaded.\r\n if (this.state.cachedImages[imageKey] !== undefined) {\r\n this.applyBuildingImageInCurrentState(imageKey);\r\n }\r\n // High Image with these parametars is not loaded.\r\n else {\r\n let lowImageKey = stringHelper.makeImageKey(\r\n \"B\",\r\n \"Low\",\r\n floor,\r\n row,\r\n column\r\n );\r\n if (this.state.cachedImages[lowImageKey] !== undefined) {\r\n this.applyBuildingImageInCurrentState(lowImageKey);\r\n } else {\r\n let lowImagePath =\r\n this.props.projectJSON.states[floor].rows[row].lowResUrls[column];\r\n await this.loadLowResAndApply(\r\n [floor, row, column],\r\n lowImageKey,\r\n lowImagePath\r\n );\r\n }\r\n }\r\n\r\n // This state is Already loading\r\n if (this.state.currentFloorLoading === stateKey) {\r\n // Pause async loading so that columns could be shifted\r\n this.state.shouldPauseLoading = true;\r\n }\r\n // Shift this state to beginning of the queue, to be loaded.\r\n this.shiftFloorToStart(stateKey);\r\n\r\n //this.shiftFloorToStart(stateKey);\r\n }\r\n }\r\n\r\n /**\r\n * Handles when props change, applies texture for this state or if there are is no texture => Load it.\r\n * @param newProps\r\n */\r\n async changeColumn(newProps) {\r\n const floor = newProps.currentState;\r\n const row = newProps.currentRow;\r\n const column = newProps.currentColumn;\r\n let stateKey = stringHelper.makeStateKey(\"B\", \"High\", floor, row);\r\n let imageKey = stateKey + \"_\" + column;\r\n\r\n // Whole state is loaded\r\n if (stateHelper.isStateLoaded(this.state.imagesQueue, stateKey)) {\r\n this.applyBuildingImageInCurrentState(imageKey);\r\n } else {\r\n // Check if image with these parametars is already loaded.\r\n if (this.state.cachedImages[imageKey] !== undefined) {\r\n // Apply High Res image.\r\n this.applyBuildingImageInCurrentState(imageKey);\r\n }\r\n // Image with these parametars is not loaded.\r\n else {\r\n // Load Low Res Image.\r\n let lowImageKey = stringHelper.makeImageKey(\r\n \"B\",\r\n \"Low\",\r\n floor,\r\n row,\r\n column\r\n );\r\n if (this.state.cachedImages[lowImageKey] !== undefined) {\r\n this.applyBuildingImageInCurrentState(lowImageKey);\r\n } else {\r\n let lowImagePath =\r\n this.props.projectJSON.states[floor].rows[row].lowResUrls[column];\r\n await this.loadLowResAndApply(\r\n [floor, row, column],\r\n lowImageKey,\r\n lowImagePath\r\n );\r\n }\r\n // Shift this state to beginning of the queue, to be loaded.\r\n //this.shiftFloorToStart(stateKey);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Initializes render loop for main scene/canvas.\r\n */\r\n initializeRenderLoop = () => {\r\n let parameters = this.state.frameParameters;\r\n requestAnimationFrame(() => {\r\n this.updateFrame(\r\n parameters.scene,\r\n parameters.hotspotScene,\r\n parameters.renderer,\r\n parameters.outlineEffect,\r\n parameters.camera,\r\n parameters.label,\r\n parameters.sprite,\r\n parameters.mouse,\r\n parameters.raycaster,\r\n parameters.sphere,\r\n parameters.cameraKeyframeTrack,\r\n parameters.cameraTargetKeyframeTrack\r\n );\r\n });\r\n };\r\n\r\n /**\r\n * Handles the event for updating apartment texture\r\n * @param parameters Current State, Apartmnet Key, Current Hotspot Column, Low img url\r\n */\r\n handleUpdateApartmentTexture(parameters) {\r\n let key = stringHelper.makeImageKey(\r\n \"A\",\r\n \"High\",\r\n parameters[0],\r\n parameters[1],\r\n parameters[2]\r\n );\r\n if (this.state.cachedImages[key] === undefined) {\r\n let lowKey = stringHelper.makeImageKey(\r\n \"A\",\r\n \"Low\",\r\n parameters[0],\r\n parameters[1],\r\n parameters[2]\r\n );\r\n // If we have low res iamge with this key cached => show it.\r\n if (this.state.cachedImages[lowKey] === undefined) {\r\n this.loadLowResAndApply(parameters, lowKey, parameters[3], false);\r\n } else {\r\n sceneHelper.updateApartmentTexture(this.state.cachedImages[lowKey]);\r\n }\r\n } else {\r\n sceneHelper.updateApartmentTexture(this.state.cachedImages[key]);\r\n }\r\n }\r\n\r\n componentWillReceiveProps(newProps) {\r\n let floor = this.props.currentState;\r\n let row = this.props.currentRow;\r\n let column = this.props.currentColumn;\r\n\r\n if (column !== newProps.currentColumn) {\r\n this.changeColumn(newProps);\r\n } else if (floor !== newProps.currentState) {\r\n this.changeFloor(newProps);\r\n } else if (row !== newProps.currentRow) {\r\n this.changeFloor(newProps);\r\n }\r\n }\r\n\r\n async componentDidMount() {\r\n let array = await stateHelper.initializeStartingQueue();\r\n this.setState({ allStates: array[1] });\r\n\r\n this.setState({\r\n loadingQueue: array[0],\r\n imagesQueue: array[1],\r\n });\r\n\r\n this.loadDefaultStateImages();\r\n\r\n const fullscreenWrapper = document.getElementById(\"full-screenable-node\");\r\n\r\n if (this.props.menuVisibility) {\r\n const sideMenu = document.getElementById(\"side-menu\");\r\n\r\n sideMenu.addEventListener(\"mouseover\", () => {\r\n this.setState({ isSideMenuHovered: true });\r\n });\r\n\r\n sideMenu.addEventListener(\"mouseout\", () => {\r\n this.setState({ isSideMenuHovered: false });\r\n });\r\n }\r\n\r\n fullscreenWrapper.addEventListener(\"labelMouseOut\", (event) => {\r\n this.setState({\r\n labelIsHovered: false,\r\n hoveredHotspotKey: \"\",\r\n });\r\n });\r\n\r\n fullscreenWrapper.addEventListener(\"labelIsHovered\", (event) => {\r\n this.setState({ labelIsHovered: true });\r\n });\r\n\r\n fullscreenWrapper.addEventListener(\"renderMainCanvas\", (event) => {\r\n let parameters = this.state.frameParameters;\r\n requestAnimationFrame(() => {\r\n this.updateFrame(\r\n parameters.scene,\r\n parameters.hotspotScene,\r\n parameters.renderer,\r\n parameters.outlineEffect,\r\n parameters.camera,\r\n parameters.label,\r\n parameters.sprite,\r\n parameters.mouse,\r\n parameters.raycaster,\r\n parameters.sphere,\r\n parameters.cameraKeyframeTrack,\r\n parameters.cameraTargetKeyframeTrack\r\n );\r\n });\r\n });\r\n\r\n window.addEventListener(\"touchend\", () => {\r\n this.setState({ sceneNeedsRender: true });\r\n });\r\n window.addEventListener(\"mousemove\", (event) => {\r\n if (this.state.labelIsHovered) return;\r\n this.state.mousePositionY = event.clientY;\r\n });\r\n\r\n window.addEventListener(\"setupDefaultState\", async () => {\r\n await this.initializeScene();\r\n await this.initializeRenderLoop();\r\n });\r\n\r\n window.addEventListener(\"apartmentInfoOff\", (event) => {\r\n let stateKey = stringHelper.makeStateKey(\r\n \"B\",\r\n \"High\",\r\n this.props.currentState,\r\n this.props.currentRow\r\n );\r\n if (!stateHelper.isStateLoaded(this.state.imagesQueue, stateKey)) {\r\n if (this.state.currentFloorLoading === stateKey) {\r\n // Shift this one to be loaded.\r\n this.state.shouldPauseLoading = true;\r\n this.shiftFloorToStart(stateKey);\r\n } else {\r\n this.shiftFloorToStart(stateKey);\r\n }\r\n }\r\n });\r\n\r\n window.addEventListener(\"LoadingFinished\", (e) => {\r\n const favouriteButton = document.getElementById(\"favourite-button\");\r\n const moreDetailsButton = document.getElementById(\"details-button\");\r\n const hiddenMoreDetailsButton = document.getElementById(\r\n \"hidden-details-button\"\r\n );\r\n\r\n window.addEventListener(\"click\", () => {\r\n if (this.state.hoveredLinkHotspotUrl !== \"\") \r\n window.top.location.href = this.state.hoveredLinkHotspotUrl;\r\n });\r\n\r\n favouriteButton.addEventListener(\"click\", (e) => {\r\n let favouriteApartments = this.props.favouriteApartments;\r\n const apartmentKey = this.state.hoveredHotspotKey;\r\n\r\n if (favouriteApartments.includes(apartmentKey)) {\r\n let event = new CustomEvent(\"removeFavourite\", {\r\n detail: {\r\n key: apartmentKey,\r\n },\r\n });\r\n\r\n window.dispatchEvent(event);\r\n\r\n favouriteButton.style.backgroundImage =\r\n \"url('design/new-exports/Star_with_plus.png')\";\r\n return;\r\n }\r\n\r\n favouriteButton.style.backgroundImage =\r\n \"url('design/new-exports/Star_with_minus.png')\";\r\n\r\n let event = new CustomEvent(\"addFavourite\", {\r\n detail: {\r\n key: apartmentKey,\r\n },\r\n });\r\n\r\n window.dispatchEvent(event);\r\n });\r\n\r\n moreDetailsButton.addEventListener(\"click\", async (e) => {\r\n let apartmentKey = stringHelper.makeStateKey(\r\n \"A\",\r\n \"High\",\r\n this.props.currentState,\r\n this.state.hoveredHotspotKey\r\n );\r\n\r\n if (this.state.imagesQueue.includes(apartmentKey)) {\r\n if (\r\n !this.state.shiftedApartmentKeys.includes(apartmentKey) &&\r\n this.state.allStates.includes(apartmentKey)\r\n ) {\r\n await this.shiftColumnToStart(apartmentKey, 0, true);\r\n let shiftedApartmentKeys = this.state.shiftedApartmentKeys;\r\n shiftedApartmentKeys.push(apartmentKey);\r\n this.setState({ shiftedApartmentKeys });\r\n }\r\n if (this.state.allStates.includes(apartmentKey)) {\r\n this.shiftFloorToStart(apartmentKey);\r\n }\r\n }\r\n let event = new CustomEvent(\"openApartmentWindow\", {\r\n detail: {\r\n apartmentKey: this.state.hoveredHotspotKey,\r\n },\r\n });\r\n fullscreenWrapper.dispatchEvent(event);\r\n });\r\n\r\n hiddenMoreDetailsButton.addEventListener(\"click\", (e) => {\r\n let apartmentKey = stringHelper.makeStateKey(\r\n \"A\",\r\n \"High\",\r\n this.props.currentState,\r\n this.state.hoveredHotspotKey\r\n );\r\n if (this.state.imagesQueue.includes(apartmentKey)) {\r\n if (\r\n !this.state.shiftedApartmentKeys.includes(apartmentKey) &&\r\n this.state.allStates.includes(apartmentKey)\r\n ) {\r\n this.shiftColumnToStart(apartmentKey, 0, false);\r\n let shiftedApartmentKeys = this.state.shiftedApartmentKeys;\r\n shiftedApartmentKeys.push(apartmentKey);\r\n\r\n this.setState({ shiftedApartmentKeys });\r\n }\r\n if (this.state.allStates.includes(apartmentKey))\r\n this.shiftFloorToStart(apartmentKey);\r\n }\r\n let event = new CustomEvent(\"openApartmentWindow\", {\r\n detail: {\r\n apartmentKey: this.state.hoveredHotspotKey,\r\n },\r\n });\r\n fullscreenWrapper.dispatchEvent(event);\r\n });\r\n });\r\n\r\n window.addEventListener(\"updateApartmentTexture\", (event) => {\r\n this.handleUpdateApartmentTexture(event.detail.parameters);\r\n });\r\n }\r\n\r\n render() {\r\n return (\r\n
EUR
\r\n㎡
\r\n\r\n{props.type}
\r\n\r\n {t(\"APARTMENT\")}
{props.type[1]} {props.type === \"T1\" ? t(\"PIECE\") : t(\"PIECES\")}\r\n
\r\n {t(\"FAVORITES\").toUpperCase()}\r\n
\r\n\r\n\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t{t(\"APARTMENT\")}{\" \"}\r\n\t\t\t\t
\r\n\t\t\t\t{props.name}
\r\n\t\t\t\t{props.type}
\r\n\t\t\t\t\r\n\t\t\t\t\t{\" \"}\r\n\t\t\t\t\t{props.quadrature} m2{\" \"}\r\n\t\t\t\t
\r\n\t\t\t{t(\"STAGE\").toUpperCase()}
\r\n \r\n {stringHelper.parseStateNumber(\r\n props.unstated.state.jsonData.states[\r\n props.unstated.state.currentState\r\n ].name\r\n )}\r\n {\" \"}\r\n \r\n\r\n {t(\"RETURN\").toUpperCase()} {\" \"}\r\n
\r\n\r\n 360 °
{t(\"VIEW\")} \r\n
\r\n {t(\"LANDSCAPE_VIEW\")}
\r\n {t(\"ROTATE_PHONE\")}\r\n