{"version":3,"file":"desktop_common-a89763b10dae8d1e509d.client.js","mappings":"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","sources":["webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/iconMortgageFamily.url.svg?c6b4","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/iconMortgagePreferential.url.svg?4f1c","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/icon/Mortgage2IconSuccess.url.svg?a61f","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/NoOffersBanner/NoOffersImg.url.svg?1bdc","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/mortgageBuyOrDieImg.url.svg?f8c2","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/stupid/bankLogos.url.svg?4bb9","webpack://@search/whitelabel-search-www/../graphql-gateway/server/typenames/SuggestItemTypeEnum.ts","webpack://@search/whitelabel-search-www/../graphql-gateway/typings/index.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperAppLandingRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperLandingRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/DeveloperSearchRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingCardRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingConstructionRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingQuizRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingSearchMapRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingSearchMapTileRoute.ts","webpack://@search/whitelabel-search-www/../packages/nb-routes/src/NewBuildingSearchRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/ClassifiedRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/RouterProvider.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/parkingsMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/livingTenantMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/sortOffersMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/windowsDirectionMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/SearchSeoType.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/SearchType.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/searchDefaults.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/SearchSeoChpuMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/phoneCallRoute/PhoneCallRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/unsubscribeRoute/UnsubscribeRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/dedupeValues.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/authorTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/categoryTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/dealTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/newBuildingMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/renovationMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/roomMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/sellTypeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/bathroomMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/wallsMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/livingFacilityMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/furnitureMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/bankPledgeMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/layoutImageMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/buildEpochMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/finishingMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/newBuilding/mappers.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskMetroBranchMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskCityMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskDistrictMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskMetroMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/msk/mskRayonMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/regionMetroSlugMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/regionMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/spb/spbCityMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/spb/spbDistrictMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/mappers/regions/spb/spbMetroMapper.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/offerRoute/OfferRoute.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/BuildEpochSeoMatcher.ts","webpack://@search/whitelabel-search-www/../packages/offer-search-routes/src/searchRoute/PriceSeoMatcher.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/dict/filters/regions.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/GtmContext.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/boot/ssr/script/sentry-fixes.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/domainHelpers.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/emails/useCallbackEmail.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/AddressStore.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/District.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/proto/district.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/MetroRoute.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/proto/route.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/MetroStation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/proto/metroStaionRaw.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/geoBaseStoreFromGql.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/GeoBase.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/geo/useGeoTips.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/google/dataLayerPush.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/google/useGoogleOptimize.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/google/useGtmOnVisible.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/lazy/ImageLazy.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/lazy/ImageLazySeo.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/lazy/ImageLazySrcSet.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/useImageSliderActiveItem.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/useImageSliderCross.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/ImageSlider.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/slider/useImageSliderItems.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/image/useIntersectionTrigger.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/analytics/NewBuildingAnalytics.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/CustomTypography/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/IconTransport/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/ImageBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/List/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/MediaKitFixedSizeBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/MetroRoute/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/common/SnippetPhone/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/desktop/FilterCollapser/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/components/desktop/NewBuildingBaseSnippet/snippetContext.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/developer-promo/analytics.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterDeserializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterCollection.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterFactory.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewBuildingFilterInitial.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterSerializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/filters/converters.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/hooks/useCalltouchReplacement.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/libs/constants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/libs/root-regions.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/analytics/ClassifiedAnalytics.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/analytics/ClassifiedOfferGtmContext.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/regionToBackoffice.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Switch/Container.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Switch/Link.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Switch/Switch.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Desktop/Desktop.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/Mobile/YMapClickPane.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/seo/SeoSearchUtm.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/enums/index.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/init-cookie-modal-hack.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/DefaultBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/GalleryBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/NewBuildingClassBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/IconPercent/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/PreferentialMortgageBadge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Badge/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BadgeBox/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/MortgageOfferIcon.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/WorkingHours/WorkingHours.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CallbackModal/useCallbackRequest.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CallbackModal/sendCalltouchCallbackRequest.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CallbackModal/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CoreSvgSpriteIcon/CoreSvgSpriteIcon.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/CustomerFeedback/OpenButton/Blue/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/CustomerFeedback/OpenButton/BlueBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/OpenButton/Default/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/OpenButton/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/CustomerFeedbackMutation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/useSendCustomerFeedback.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/NewBuildings/state.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/NewBuildings/dict.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/NewBuildings/buildCustomerFeedbackVars.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/CustomerFeedback/Modal/NewBuildings/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/successImage.url.svg?7d77","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/CustomerFeedback/Modal/NewBuildings/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/CustomerFeedbackAnketologModal/CustomerFeedbackAnketologModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/components/Modal/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useKey.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/useCustomerFeedbackExternalState.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/CustomerFeedback/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/DistrictControl/components/SPBCenterDistricts/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/DistrictControl/components/NewMoscowDistrict/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/DistrictControl/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/BasicError.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoriteLimitModal/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoritesModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/share/SharePrintButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useQueryDisplayValues/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/filters/ClassifiedFilterCollection.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/filters/metadata/ClassifiedFilterMetadata.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/filters/ClassifiedFilterFactory.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/services/codecs/FilterDeserializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/services/codecs/FilterSerializer.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/presetBounds.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/seo/seoSearchFlatRoom.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/seo/seoSearchLand.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/search/page/SearchOffersCount/SearchOffersCountQuery.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoritesMutation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/search/page/SearchOffersQuery/SearchOffersQuery.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/search/page/SearchOffersQuery/index.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/page/SearchOffersMapQuery/SearchOffersMapQuery.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/offer/ymap/page/useOfferYMapPageState2.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/HiddenMutation.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/useFavoritesButtonState.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Footer/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Price/popper/usePopper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Price/popper/useDomOnClickOutside.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/GeoSuggest/SuggestPopup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/GeoSuggest/GeoSuggest.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/GeoSuggest/MetroMark.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Header/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/newbuilding/developer-promo/helpers.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Html/HtmlHead/ldEventScript.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Image/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageEconomy/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageFields/constants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageFields/useBankMortgageForm.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MinimalBanksMortgageOffers/MinimalBanksMortgageOffers.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgageAppSourceContext.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/MortgagePurposeEnum.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/contants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/declensions.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/domain/MortgageField.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/minimalBanksMortgageUrl.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/field/Mortgage2Field.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/icon/Mortgage2IconWrap.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/mortgage2ContactsFormSend.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/mortgage2ParamsFromClasified.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/starter/Mortgage2StarterModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/success/Mortgage2SuccessContent.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/useMortgage2BestOffer.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/useMortgage2Request.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useAppTypeById.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/useMortgage2User.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/consult/Mortgage2ConsultModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/MortgageOfferSkeleton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/BanksMortgageOffers/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieResultCard.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieReason.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/calculateBuyOrDie.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/validate-helper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/mapRegionToSelect.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieFormField.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/subcomponents/MortgageBuyOrDieForm.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/MortgageBuyOrDieModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/MortgageBuyOrDieTrigger.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/MortgageCalculatorFields/MortgageCalculatorFields.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/ArrowButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/ArrowButtonPair.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/ArrowButtonPop.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/ArrowButton/useArrowButton.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/CardScroller/CardScroller.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/MortgageOffersScroller/MortgageOffersScroller.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/MortgageDiscountConditions/MortgageDiscountConditions.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/NoOffersBanner/NoOffersBanner.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage3/useChangeDiscount.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgageBuyOrDie/helpers/getLocalStorageLastValue.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/domain/MortgageFieldsBuilder.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/stupid/MortgageStupidModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/stupid/useStupidMortgage.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/useGovernmentMortgage.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/useMinimalBanksMortageState.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/OfferRouteCard/IconBus.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/OfferRouteCard/IconPedestrian.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Price/popper/getWindowSize.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/QRCodePhoneButton/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/Slider/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/SlimSelect/SlimMultiSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/SlimSelect/SlimSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/SubwayStation/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/WorkingHours/useWorkingHours.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/Desktop.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/Provider.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/YMapPOI/dict/poi.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/YMap/YMapPOI/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/icons/IconClose.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/LoadingSpinner/LoadingSpinner.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/Picture/Picture.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/Arrow/Arrow.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/HeroPicture/HeroPicture.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/MinimalBanksMortgage/mortgage2/icon/Mortgage2IconM2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/Gallery/Gallery.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/FSGallery/FSGallery.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryDesktop/constants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/ButtonTwoState.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/share/ShareButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/domain/share/useShareLinks.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/FavoritesButton/FavoritesButton.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryMobile2/GalleryButtons/GalleryButtons.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/GalleryMobile2/GalleryMobile2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/gallery/useGetCurrentIndexImages.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useDebouncedCallback.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useIdle.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useInitialPhone.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useSwiper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/hooks/useVHProperty.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/tools/makeOfferUrl.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/constants/keycode.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/MinimalBanksMortgageSnippetDesktop/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/NewsTinyCard/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/NewBuildingNews/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/common/components/NewBuildingPromoBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/NewBuildingPromoBanner/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/selectors/get_new_building_link.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/NavButtons/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/GalleryPreview/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/ThumbnailSnippet/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/CheckboxGroup2/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/FilterSelect/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/NewRangeInput/RangeInput.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/NewNumberInputRange/NumberInputRange.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter/Filter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter/MobileFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter/MobileFilter2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/apartments/DesktopApartmentFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/area/AreaFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/bathroom/BathroomFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/ceil_height/CeilHeightFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/common/MultiSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/common/RadioSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/area/DesktopAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/balcony/DesktopBalconyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/buildings/DesktopBuildingsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/commissioning/DesktopCommissioningFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/commissioning_list/DesktopCommissioningListFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/finishing/DesktopFinishingFlatTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/finishing_type/DesktopFinishingTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/floor/DesktopFloorFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/DesktopGeoFiltersView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/DesktopGeoFiltersView2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/FilterTagList/FilterTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/FilterTagList/FilterTagListItem.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/FilterTagList2/FilterTagList2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapEkb.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapKzn.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapMsk.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapNnv.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapNsk.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapSmr.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/LazySvgMap/LazySvgMapSpb.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/transportLimit/MobileTransportLimitFilterView2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/GeoErrorBoundary/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/MetroSuggest/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/DistricsTab/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/geo/GeoSelector/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_accreditation/DesktopAccreditationFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_building_class/DesktopBuildingClassFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_closedSales/DesktopClosedSalesFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_new_building_deal/DesktopNewBuildingDealFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_payment_type/DesktopPaymentTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_position/DesktopPositionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/new_safety/DesktopSafetyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/parking/DesktopParkingFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/PriceInput/priceTypeMapping.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/common/PriceInput/PriceInput.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/contants.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/price/DesktopPriceFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/region/DesktopRegionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/rooms/DesktopRoomsTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/special_events/DesktopFlatsSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/special_events/DesktopMiscSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/special_events/DesktopOtherSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/desktop/walls/DesktopWallsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/floor/FloorFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/floors_total/FloorsTotalFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/kitchen_area/KitchenAreaFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/living_area/LivingAreaFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/accreditation/MobileAccreditationFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/apartments/MobileApartmentsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/balcony/MobileBalconyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/bathroom/MobileBathroomFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/building_class/MobileBuildingClassFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/ceilHeight/MobileCeilHeightFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/closedSales/MobileClosedSalesFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/commissioning/MobileCommissioningFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/developer/MobileDeveloperSuggestModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/developer/MobileDeveloperFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/finishing_type/MobileFinishingTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/floor/MobileFloorFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/floors_total/MobileFloorsTotalFilter.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroMark2/MetroMark2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroSelect/MetroSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroSelect/useMetroSelect.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MetroModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/SuggestModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/components/DistrictSelectItem/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/components/DistrictSelectGroup/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/DistrictSelect.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictSelect/useDistrictSelect.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/DistrictModal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/taglist/GeoTagItem.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/GeoTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/taglist/FullGeoTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/taglist/PreviewGeoTagList.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/geo/MobileGeoFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/kitchenArea/MobileKitchenAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/livingArea/MobileLivingAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/new_building_deal/MobileNewBuildingDealFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/notOnlyM2Pro/MobileNotOnlyM2ProFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/parking/MobileParkingFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/payment_type/MobilePaymentTypeFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/position/MobilePositionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/price/MobilePriceFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/region/MobileRegionFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/room/MobileRoomFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/safety/MobileSafetyFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/special_events/MobileFlatsSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/special_events/MobileMiscSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/special_events/MobileOtherSpecialEventsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/totalArea/MobileTotalAreaFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/transportLimit/MobileTransportLimitFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/mobile/walls/MobileWallsFilterView.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/filter_types/region/RenderRegionSelectUikitContent.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/components/new_filter/Filter2.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/districtHelper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/priceHelper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/helpers/regionHelper.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/models/Filter.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/filters/models/FilterCollection.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/ModalHeading/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/mobile/components/StickyPhoneWrapper/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/FiltersForm/FiltersFormTips/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/IconClose/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/desktop/components/FiltersForm/FiltersFormTips/FiltersFormTip/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/tips/serializeToTips.ts","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/tips/OffersSearchTips/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-frontend-core/view/tips/labels.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/Breadcrumb/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/Modal/Modal.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/Paper/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Button/Button.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Checkbox/CheckboxControl/CheckboxControl.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Checkbox/Checkbox.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/CheckboxGroup/CheckboxGroup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Highlight/Highlight.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Icon/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Input/InputControl/InputControl.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Input/Input.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/getDimensions.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/getPosition.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/getViewportFactor.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/utils.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/enums/index.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Suggest/useSuggestionList.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Suggest/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/PopupTail/index.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Popup/Popup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/InlinePopup/InlinePopup.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/components/controls/Tooltip/Tooltip.tsx","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/lib/mergeRefs.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/size.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/tone.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/view.ts","webpack://@search/whitelabel-search-www/../vtbeco-ui/src/types/mode.ts"],"sourcesContent":["export default \"2efcca13fd43b67c9c99e97bfef38db9.svg\";","export default \"334d04dcd714b1fd42f83fb98df974bf.svg\";","export default \"4138435e3b6b41c80ea8074e38263380.svg\";","export default \"dc195dc74c4ba180d5070c3a7bf6e6f3.svg\";","export default \"87685346be520c1da76d3a204796603d.svg\";","export default \"6bc5d1786bc934a4ead38a0748906172.svg\";","\nexport enum SuggestItemTypeEnum {\n    NewBuilding = 'SuggestItemNewBuilding',\n    Metro = 'SuggestItemMetro',\n    District = 'SuggestItemDistrict',\n    Address = 'SuggestItemAddress',\n    Developer = 'SuggestItemDeveloper',\n    Default = 'SuggestItemDefault'\n}\n","/* eslint-disable comma-dangle */\nimport { IncomingMessage } from 'http';\nimport { MetadataValue } from '@grpc/grpc-js';\nimport Cookies from 'universal-cookie';\nimport type { RedisOptions } from 'ioredis';\nimport { Image } from '@vtblife/classified-model/dist-grpcjs/classified/common_pb';\nimport { QuarterEnum } from '@vtblife/classified-model/dist-grpcjs/util/common_pb';\nimport { HeaderConfig, MenuConfig } from '@vtblife/layout-config/dist/types';\nimport type { Purpose } from '@vtblife/mortgage-api/build-grpcjs/ru/vtblife/mortgage/v1/model/common_pb';\nimport type { MortgageProperty } from '@vtblife/mortgage-api/build-grpcjs/ru/vtblife/mortgage/v1/model/mortgage_property_pb';\nimport type { HivePluginOptions } from '@graphql-hive/client';\nimport { NewBuildingWhitelabelEnum } from '../server/enums/NewBuildingWhitelabelEnum';\nimport type { UserInfo } from '../server/lib/auth';\nimport { buildGqlContext } from '../server/gql-context';\nimport type { MortgageClientTimeouts } from '../api/MortgageClient';\nimport type {\n    Mg2CalculationTimeouts,\n    Mg2PreviewCalculationTimeouts,\n    Mg2BorrowerTimeouts,\n    Mg2RosterClientTimeouts,\n} from '../server/mortgage2/clients';\nimport type { MortgageCalculatorClientTimeouts } from '../api/MortgageCalculatorClient';\nimport type { PreferencesPersonalClientTimeouts } from '../api/PreferencesPersonalClient';\nimport type { PreferencesPersonalOpenClientTimeouts } from '../api/PreferencesPersonalOpenClient';\nimport type { PreferencesBusinessClientTimeouts } from '../api/PreferencesBusinessClient';\nimport type { OfferPlacementClientTimeouts } from '../server/offer-placement/OfferPlacementClient';\nimport type { ClickerTrackerClientTimeouts } from '../server/clicker-tracker/ClickerTrackerClient';\nimport type { ClickerStatsClientTimeouts } from '../server/clicker-stats/ClickerStatsClient';\nimport type { FeedsClientTimeouts } from '../src/domains/user-offer-stat/FeedsClient';\nimport type { BastilleExternalClientTimeouts } from '../api/BastilleExternalClient';\nimport type { MonetizationClientTimeouts } from '../api/MonetizationClient';\nimport type { BillingApiClientTimeouts } from '../api/BillingApiClient';\nimport type { VarlamovClientTimeouts } from '../api/VarlamovClient';\nimport type { ReglamentClientTimeouts } from '../server/sobor/ReglamentClient';\nimport type { FileClientTimeouts as ReglamentFileClientTimeouts } from '../server/sobor/FileClient';\nimport type { SearchClientTimeouts } from '../api/SearchClient';\nimport type { ExternalGeoClientTimeouts } from '../api/ExternalGeoClient';\nimport type { GeoSuggestClientTimeouts } from '../api/GeoSuggestClient';\nimport type { GeoSupportedRegionsClientTimeouts } from '../api/GeoSupportedRegionsClient';\nimport type { DeveloperSearchClientTimeouts } from '../api/DeveloperSearchClient';\nimport type { NewBuildingRootRegionsClientTimeouts } from '../api/NewBuildingRootRegionsClient';\nimport type { NewBuildingSearchClientTimeouts } from '../api/NewBuildingSearchClient';\nimport type { NewBuildingPreferencesClientTimeouts } from '../api/NewBuildingPreferencesClient';\nimport type { NewBuildingSuggestClientTimeouts } from '../api/NewBuildingSuggestClient';\nimport type { SuggestClientTimeouts } from '../api/SuggestClient';\nimport type { UserDetailsClientTimeouts } from '../api/UserDetailsClient';\nimport type { MailConfirmationClientTimeouts } from '../api/MailConfirmationClients';\nimport type { UserProfileClientTimeouts } from '../api/UserProfileClient';\nimport type { UserProfileV2ClientTimeouts } from '../api/UserProfileV2Client';\nimport type { PersonsSearchClientTimeouts } from '../api/PersonsSearchClient';\nimport type { CompanyApiClientTimeouts } from '../api/CompanyApiClient';\nimport type { EmailGatewayClientTimeouts } from '../api/EmailGatewayClient';\nimport type { RegistraturaClientTimeouts } from '../api/RegistraturaClient';\nimport type { OnboardingApiClientTimeouts } from '../api/OnboardingClient';\nimport type { SimilarsClientTimeouts } from '../api/SimilarsClient';\nimport type { SportlotoClientTimeouts } from '../api/SportlotoClient';\nimport type { CallbackClientTimeouts } from '../api/CallbackClient';\nimport type { ShawshankClientTimeouts } from '../api/ShawshankClient';\nimport type { HoosegowMortgageCommentClientTimeouts } from '../api/HoosegowMortgageCommentClient';\nimport type { ParoleClientTimeouts } from '../api/ParoleClient';\nimport type { OfficersClientTimeouts } from '../api/OfficersClient';\nimport type { PagesClientTimeouts } from '../api/PagesClient';\nimport type { RepairClientTimeouts } from '../api/RepairClient';\nimport type { DocumentStorageClientTimeouts } from '../api/DocumentStorageClient';\nimport type { MangoustClientTimeouts } from '../api/MangoustClient';\nimport type { SRGClientData } from '../api/SRGClient';\nimport { RouletteClientTimeouts } from '../api/RouletteClient';\nimport { Mg2DynamoTimeouts } from '../server/mortgage2/dynamo/client';\nimport { MortgageDictionaryClientTimeouts } from '../api/MortgageDictionaryClient';\nimport { Mg2IdxAdapterTimeouts } from '../server/mortgage2/idx/client';\nimport { Mg2DispatchTimeouts } from '../server/mortgage2/dispatch/client';\nimport { Mg2DispatchFileTimeouts } from '../server/mortgage2/dispatch/clientFiles';\nimport { Mg2DealerTimeouts } from '../server/mortgage2/dealer/client';\nimport { Mg2DocumentsLoaderTimeouts } from '../server/mortgage2/documentsLoader/client';\nimport { ReglamentClient } from 'graphql-gateway/server/sobor/ReglamentClient';\n\nexport * from '../server/typenames';\n\nexport enum View {\n    mobile = 'mobile',\n    desktop = 'desktop'\n}\n\nexport type MetadataOptions = Record<string, MetadataValue>;\n\nexport interface Request extends IncomingMessage {\n    url: string;\n    xTraceId: string;\n    body: object;\n    searchIndex: NewBuildingWhitelabelEnum;\n    universalCookies: Cookies;\n    user?: UserInfo;\n}\n\nexport type ConfigItem<T extends Record<string, number>> = {\n    host: string;\n    timeouts: T;\n}\n\nexport interface Config {\n    env: string;\n    isBranch?: boolean;\n    M2_HOST: string;\n\n    API_MORTGAGE: ConfigItem<MortgageClientTimeouts>;\n    API_MORTGAGE_DICTIONARY: ConfigItem<MortgageDictionaryClientTimeouts>;\n    API_MORTGAGE_HAGGLER: ConfigItem<Mg2CalculationTimeouts & Mg2PreviewCalculationTimeouts>;\n    API_MORTGAGE_ROSTER: ConfigItem<Mg2RosterClientTimeouts>;\n    API_MORTGAGE_BORROWER: ConfigItem<Mg2BorrowerTimeouts>;\n    API_DYNAMO: ConfigItem<Mg2DynamoTimeouts>;\n    API_RELAY: ConfigItem<Mg2DispatchTimeouts>;\n    API_RELAY_FILES: ConfigItem<Mg2DispatchFileTimeouts>;\n    API_DEALER: ConfigItem<Mg2DealerTimeouts>;\n    IDX_ADAPTER: ConfigItem<Mg2IdxAdapterTimeouts>;\n    API_MORTGAGE_CALCULATOR: ConfigItem<MortgageCalculatorClientTimeouts>;\n    API_PREFERENCES_PERSONAL: ConfigItem<PreferencesPersonalClientTimeouts>;\n    API_PREFERENCES_PERSONAL_OPEN: ConfigItem<PreferencesPersonalOpenClientTimeouts>;\n    API_PREFERENCES_BUSINESS: ConfigItem<PreferencesBusinessClientTimeouts>;\n    API_OFFER_PLACEMENT: ConfigItem<OfferPlacementClientTimeouts>;\n    API_CLICKER_TRACKER: ConfigItem<ClickerTrackerClientTimeouts>;\n    API_CLICKER_STATS: ConfigItem<ClickerStatsClientTimeouts>;\n    API_FEEDS: ConfigItem<FeedsClientTimeouts>;\n    API_BASTILLE_EXTERNAL: ConfigItem<BastilleExternalClientTimeouts>;\n    API_MONETIZATION: ConfigItem<MonetizationClientTimeouts>;\n    API_BILLING: ConfigItem<BillingApiClientTimeouts>;\n    API_VARLAMOV: ConfigItem<VarlamovClientTimeouts>;\n    API_REGLAMENT: ConfigItem<ReglamentClientTimeouts>;\n    API_REGLAMENT_FILE: ConfigItem<ReglamentFileClientTimeouts>;\n    GRPS_API: string;\n    staticPath?: string;\n    API_OFFER_SEARCH: ConfigItem<SearchClientTimeouts>;\n    API_GEO_SEARCH: ConfigItem<ExternalGeoClientTimeouts | GeoSuggestClientTimeouts>;\n    API_GEO_ROOT_REGIONS: ConfigItem<GeoSupportedRegionsClientTimeouts>;\n    API_NEW_BUILDING_SEARCH: ConfigItem<\n        DeveloperSearchClientTimeouts |\n        NewBuildingRootRegionsClientTimeouts |\n        NewBuildingSearchClientTimeouts |\n        NewBuildingSuggestClientTimeouts\n    >;\n    API_NEW_BUILDING_WHITELABEL_SEARCH: ConfigItem<\n        DeveloperSearchClientTimeouts |\n        NewBuildingRootRegionsClientTimeouts |\n        NewBuildingSearchClientTimeouts\n    >;\n    API_NEW_BUILDING_PREFERENCES: ConfigItem<NewBuildingPreferencesClientTimeouts>;\n    API_SUGGEST: ConfigItem<SuggestClientTimeouts>;\n    API_AUTH: ConfigItem<UserDetailsClientTimeouts>;\n    API_PROFILE: ConfigItem<\n        MailConfirmationClientTimeouts |\n        UserProfileClientTimeouts |\n        UserProfileV2ClientTimeouts\n    >;\n    API_PERSON: ConfigItem<PersonsSearchClientTimeouts>;\n    API_COMPANY: ConfigItem<CompanyApiClientTimeouts>;\n    API_REPAIR: string;\n    API_EMAIL_GATEWAY: ConfigItem<EmailGatewayClientTimeouts>;\n    NEW_BUILDING_CALLBACK_DEFAULT_EMAIL_SENDER: string;\n    NEW_BUILDING_CALLBACK_MSK_EMAIL_SENDER: string;\n    NEW_BUILDING_CALLBACK_SPB_EMAIL_SENDER: string;\n    NEW_BUILDING_ONLINE_BOOKING_MSK_EMAIL_SENDER: string;\n    NEW_BUILDING_ONLINE_BOOKING_SPB_EMAIL_SENDER: string;\n    NEW_BUILDING_QUIZ_URL: string;\n    NEW_BUILDING_DESCRIPTION_URL: string;\n    NEW_BUILDING_SAMOLET_DEVELOPER_PROMO?: string;\n    NEW_BUILDING_SAMOLET_PLUS_DEVELOPER_PROMO?: string;\n    NEW_BUILDING_CDS_DEVELOPER_PROMO?: string;\n    SALES_CALLBACK_EMAIL_RECIPIENT: string;\n    CLASSIFIED_SEARCH_CALLBACK_EMAIL_SENDER: string;\n    CLASSIFIED_SEARCH_PATH_SEO_FILES: string;\n    MORTGAGE_CALLBACK_EMAIL_RECIPIENT: string;\n    MORTGAGE_CALC_ANALYTICS_EMAIL_RECIPIENT: string;\n    FEED_STATS_EMAIL_RECIPIENT: string;\n    FEED_STATS_EMAIL_SENDER: string;\n    API_REGISTRATURA: ConfigItem<RegistraturaClientTimeouts>;\n    S3_HOST: string;\n    API_ONBOARDING: ConfigItem<OnboardingApiClientTimeouts>;\n    port?: number;\n    MAP_TILE_URL: string;\n    API_SLACK_HOOKS: string;\n    API_MM_HOOKS: string;\n    API_OFFERS_SIMILAR: ConfigItem<SimilarsClientTimeouts>;\n    GRAPHQL_GATEWAY: string;\n    API_MENU: string;\n    API_SPORTLOTO: ConfigItem<SportlotoClientTimeouts>;\n    API_NEWS: string;\n    API_CALLBACK: ConfigItem<CallbackClientTimeouts>;\n    tracingReporter?: {\n        agentHost?: string;\n        agentPort?: number;\n        collectorEndpoint?: string;\n    };\n    redis?: RedisOptions;\n    REMONT: {\n        LANDING_IZHS_EMAIL_RECIPIENT: string[];\n        LANDING_IZHS_EMAIL_FROM: string;\n    };\n    MORTGAGE: {\n        LANDING_IT_EMAIL_RECIPIENT: string[];\n        LANDING_IT_EMAIL_FROM: string;\n    };\n    API_CAPTCHA_VALIDATOR: string;\n\n    API_HOOSEGOW_SHAWSHANK: ConfigItem<ShawshankClientTimeouts>;\n    API_HOOSEGOW_PAROLE: ConfigItem<ParoleClientTimeouts>;\n    API_BANK_SERVICE: string;\n    API_HOOSEGOW_OFFICER: ConfigItem<OfficersClientTimeouts>;\n    API_HOOSEGOW_MORTGAGE_COMMENT: ConfigItem<HoosegowMortgageCommentClientTimeouts>;\n    API_PAGES: ConfigItem<PagesClientTimeouts>;\n    RIELTORS_MSK_CALLBACK_EMAIL_RECIPIENTS: string[];\n    RIELTORS_SPB_CALLBACK_EMAIL_RECIPIENTS: string[];\n    API_REPAIR_CL: ConfigItem<RepairClientTimeouts>;\n    API_DOCUMENT_STORAGE: ConfigItem<DocumentStorageClientTimeouts>;\n    API_MANGOUST: ConfigItem<MangoustClientTimeouts>;\n    hive: Partial<HivePluginOptions>;\n    API_SRG: SRGClientData;\n    API_ROULETTE: ConfigItem<RouletteClientTimeouts>;\n    API_DOCUMENT_GENERATOR: ConfigItem<Mg2DocumentsLoaderTimeouts>;\n}\n\nexport type GraphqlContext = ReturnType<typeof buildGqlContext>;\n\nexport interface Breadcrumbs {\n    items: BreadcrumbsItem[];\n    rdfMeta: string;\n}\n\nexport interface BreadcrumbsItem {\n    title: string;\n    path: string;\n    active?: boolean;\n}\n\nexport interface Menu extends MenuConfig{\n    isAuth: boolean;\n}\nexport interface Header extends HeaderConfig{\n    isAuth: boolean;\n}\nexport interface HeaderPersonalButton {\n    url: string;\n    professionalUrl?: string;\n    authorizedUrl?: string;\n}\n\nexport interface RepairRequestResult {\n    errorText: string;\n}\n\nexport type ArrayElement<A> = A extends readonly (infer T)[] ? T : never;\n\nexport type NewBuildingCardSeoText = {\n    appInstance: string;\n    site: string;\n    siteFull: string;\n    titleNominative: string;\n    titleLocative: string;\n    fullTypeNominative: string;\n    typeGenitive: string;\n    titleGenitive: string;\n    address: string;\n    priceMin: number | null;\n    developerName: string | null;\n    hasApartmentsOnly: boolean;\n    seoTitle?: string;\n    geo?: string;\n    geoLocative?: string;\n    metaTitle?: string;\n    metaDescription?: string;\n    name: string;\n}\n\nexport type NewBuildingOffersSeoText = {\n    dealType: {\n        verb: string;\n        noun: string;\n    };\n    realtyObject: {\n        singular: {\n            accusative: string;\n        };\n        plural: {\n            nominative: string;\n            genitive: string;\n            accusative: string;\n        };\n    };\n    typeLocative: string;\n    mainName: string;\n    additionalName: string;\n    regionLocative?: string;\n}\n\ninterface IElementSeoText {\n    header: string;\n    title: string;\n    metaDescription: string;\n    seoInfo: string;\n}\n\nexport interface SearchNewBuildingsSeoText {\n    region: string;\n    district: IElementSeoText | null;\n    metro: IElementSeoText | null;\n    buildingClass: IElementSeoText | null;\n    commissioning: IElementSeoText | null;\n    room: IElementSeoText | null;\n    finishingType: IElementSeoText | null;\n    appInstance: string;\n}\n\nexport interface IConstructionProgress {\n    image: Image.AsObject;\n    year: number;\n    quarter: QuarterEnum.Quarter;\n    address?: string;\n    baseUrl?: string;\n}\n\nexport enum InspectionStatusEnum {\n    Passed = 'PASSED',\n    Failed = 'FAILED'\n}\n\nexport interface IInspectionStatus {\n    isVerified?: boolean;\n    value: InspectionStatusEnum;\n    detailText: string;\n    desktopLink?: string;\n    mobileLink?: string;\n    statusText?: string;\n}\n\nexport interface INewBuildingRouteParams {\n    id: number;\n    regionId: number;\n    region: string;\n    subRegion: string | null;\n    subRegionDisplayName: string | null;\n    type: string;\n    name: string;\n}\n\nexport type ValueOf<T> = T[keyof T];\n\nexport interface INewBuildingMortgageParams {\n    term: number;\n    regionId: number;\n    isMainRegion: boolean;\n    propertyCost: number;\n    ownAmount: number;\n    purpose: ValueOf<typeof Purpose.PurposeValue>;\n    claimType: ValueOf<typeof MortgageProperty.ClaimType>;\n}\n\nexport type NewBuildingOfferMortgageParamsType = Pick<\n    INewBuildingMortgageParams, 'term' | 'propertyCost' | 'ownAmount' | 'purpose' | 'claimType'\n>\n","import { s } from '@search/router/src/schema';\nimport { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport {\n    developerAppLandingMapper,\n    developerLandingMapper\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nexport const DeveloperAppLandingType = s.rec({\n    developerId: developerLandingMapper.Type,\n    developerName: developerLandingMapper.SeoType\n});\n\nexport type IDeveloperAppLandingType = ReturnType<typeof DeveloperAppLandingType>\n\nexport const DeveloperAppLandingSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    developerNameSeo: developerAppLandingMapper.SeoType\n});\n\nexport type IDeveloperAppLandingSeoType = ReturnType<typeof DeveloperAppLandingSeoType>\n\nexport const developerAppLandingDefaults = {} as const;\n\nexport class DeveloperAppLandingRoute extends SusaninRoute<\n    IDeveloperAppLandingSeoType,\n    IDeveloperAppLandingType,\n    IRouterContext,\n    typeof developerAppLandingDefaults\n> {\n    displayName = 'DeveloperAppLandingRoute';\n\n    protected metadata = DeveloperAppLandingSeoType.config;\n\n    protected pattern(p: Tokens<IDeveloperAppLandingSeoType>) {\n        return `${this.patternHost()}/${p.developerNameSeo}/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            developerNameSeo: developerAppLandingMapper.keys\n        };\n    }\n\n    defaults() {\n        return developerAppLandingDefaults;\n    }\n\n    protected fromQuery() {\n        const developerName = 'samolet';\n\n        return DeveloperAppLandingType({\n            developerId: developerLandingMapper.typeFromSeo(developerName),\n            developerName\n        });\n    }\n\n    protected toQuery() {\n        return DeveloperAppLandingSeoType({\n            developerNameSeo: developerAppLandingMapper.seoFromType('samolet')\n        });\n    }\n}\n","import { s } from '@search/router/src/schema';\nimport { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport { developerLandingMapper } from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nexport const DeveloperLandingType = s.rec({\n    developerId: developerLandingMapper.Type,\n    developerName: developerLandingMapper.SeoType\n});\n\nexport type IDeveloperLandingType = ReturnType<typeof DeveloperLandingType>\n\nexport const DeveloperLandingSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    developerName: developerLandingMapper.SeoType\n});\n\nexport type IDeveloperLandingSeoType = ReturnType<typeof DeveloperLandingSeoType>\n\nexport const developerLandingDefaults = {} as const;\n\nexport class DeveloperLandingRoute extends SusaninRoute<\n    IDeveloperLandingSeoType,\n    IDeveloperLandingType,\n    IRouterContext,\n    typeof developerLandingDefaults\n> {\n    displayName = 'DeveloperLandingRoute';\n\n    protected metadata = DeveloperLandingSeoType.config;\n\n    protected pattern(p: Tokens<IDeveloperLandingSeoType>) {\n        return `${this.patternHost()}/${p.developerName}/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            developerName: developerLandingMapper.keys\n        };\n    }\n\n    defaults() {\n        return developerLandingDefaults;\n    }\n\n    protected fromQuery({ developerName }: IDeveloperLandingSeoType) {\n        return DeveloperLandingType({\n            developerId: developerLandingMapper.typeFromSeo(developerName),\n            developerName\n        });\n    }\n\n    protected toQuery({ developerId }: IDeveloperLandingType) {\n        return DeveloperLandingSeoType({\n            developerName: developerLandingMapper.seoFromType(developerId)\n        });\n    }\n}\n","import { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nexport const DeveloperType = s.rec({\n    id: s.num,\n    name: s.str,\n    region: s.nullOpt(s.num),\n    pageNumber: s.nullOpt(s.num)\n});\n\nexport type IDeveloperType = ReturnType<typeof DeveloperType>\n\nexport const DeveloperSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    id: s.str,\n    name: s.str,\n    region: s.nullOpt(s.str),\n    pageNumber: s.nullOpt(s.str)\n});\n\nexport type IDeveloperSeoType = ReturnType<typeof DeveloperSeoType>\n\nexport const developerDefaults = {} as const;\n\nexport class DeveloperRoute extends NewBuildingRoute<\n    IDeveloperSeoType,\n    IDeveloperType,\n    typeof developerDefaults\n> {\n    displayName = 'DeveloperRoute';\n\n    protected metadata = DeveloperSeoType.config;\n\n    protected pattern(params: Tokens<IDeveloperSeoType>) {\n        return `${this.patternHost()}(/${params.region})/novostroyki/zastroyshik-${params.name}-${params.id}/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            id: '\\\\d+'\n        };\n    }\n\n    defaults() {\n        return developerDefaults;\n    }\n\n    protected fromQuery(seoParams: IDeveloperSeoType) {\n        seoParams = DeveloperSeoType(seoParams);\n\n        const region = this.regionId(seoParams.region);\n\n        return DeveloperType({\n            region: region === this.defaultRegion().id ? undefined : region,\n            id: Number(seoParams.id),\n            name: seoParams.name,\n            pageNumber: strToNum(seoParams.pageNumber)\n        });\n    }\n\n    protected toQuery(params: IDeveloperType) {\n        const parsedParams = DeveloperType(params);\n\n        const result = this.regionParams(parsedParams.region);\n        const region = result?.region;\n\n        return DeveloperSeoType({\n            ...result,\n            region: region === this.defaultRegion().translit ? undefined : region,\n            name: parsedParams.name,\n            id: String(parsedParams.id),\n            pageNumber: numToStr(parsedParams.pageNumber)\n        });\n    }\n}\n\nexport class WLDeveloperRoute extends DeveloperRoute {\n    displayName = 'WLDeveloperRoute';\n\n    protected pattern(params: Tokens<IDeveloperSeoType>) {\n        return `${this.patternHost()}/zastroyshik-${params.name}-${params.id}/`;\n    }\n\n    protected fromQuery(seoParams: IDeveloperSeoType) {\n        return {\n            ...super.fromQuery(seoParams),\n            region: strToNum(seoParams.region)\n        };\n    }\n\n    protected toQuery(params: IDeveloperType) {\n        return {\n            ...super.toQuery(params),\n            region: numToStr(params.region),\n            origin: undefined\n        };\n    }\n}\n","import { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\n\nimport type { Writeable } from '../types';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nexport const DeveloperSearchType = s.rec({\n    region: s.nullOpt(s.num),\n    pageNumber: s.nullOpt(s.num)\n});\n\nexport type IDeveloperSearchType = ReturnType<typeof DeveloperSearchType>\n\nexport const DeveloperSearchSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    region: s.nullOpt(s.str),\n    pageNumber: s.nullOpt(s.str)\n});\n\nexport type IDeveloperSearchSeoType = ReturnType<typeof DeveloperSearchSeoType>\n\nexport const developerSearchDefaults = {} as const;\n\nexport class DeveloperSearchRoute extends NewBuildingRoute<\n    IDeveloperSearchSeoType,\n    IDeveloperSearchType,\n    typeof developerSearchDefaults\n> {\n    displayName = 'DeveloperSearchRoute';\n\n    protected metadata = DeveloperSearchSeoType.config;\n\n    protected pattern(params: Tokens<IDeveloperSearchSeoType>) {\n        return `${this.patternHost()}(/${params.region})/novostroyki/zastroyshiki/`;\n    }\n\n    defaults() {\n        return developerSearchDefaults;\n    }\n\n    protected fromQuery(seoParams: IDeveloperSearchSeoType) {\n        seoParams = DeveloperSearchSeoType(seoParams);\n\n        const region = this.regionId(seoParams.region);\n\n        return DeveloperSearchType({\n            region: region === this.defaultRegion().id ? undefined : region,\n            pageNumber: strToNum(seoParams.pageNumber)\n        });\n    }\n\n    protected toQuery(params: IDeveloperSearchType) {\n        const parsedParams = DeveloperSearchType(params);\n\n        const result = this.regionParams(parsedParams.region);\n        const region = result?.region;\n\n        return DeveloperSearchSeoType({\n            ...result,\n            region: region === this.defaultRegion().translit ? undefined : region,\n            pageNumber: numToStr(parsedParams.pageNumber)\n        });\n    }\n}\n\nexport class WLDeveloperSearchRoute extends DeveloperSearchRoute {\n    displayName = 'WLDeveloperSearchRoute';\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    protected pattern(params: Tokens<IDeveloperSearchSeoType>) {\n        return '/zastroyshiki/';\n    }\n\n    protected fromQuery(seoParams: IDeveloperSearchSeoType) {\n        const ret: Partial<Writeable<IDeveloperSearchType>> = super.fromQuery(seoParams);\n\n        ret.region = strToNum(seoParams.region);\n\n        return ret;\n    }\n\n    protected toQuery(params: IDeveloperSearchType) {\n        const ret: Partial<Writeable<IDeveloperSearchSeoType>> = super.toQuery(params);\n\n        ret.region = numToStr(params.region);\n        delete ret.origin;\n\n        return ret;\n    }\n}\n","import {\n    NewBuildingOffersSortEnum,\n} from '@search/graphql-typings';\nimport {\n    newBuildingTypeMapper,\n    roomMapper,\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\nimport { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\nimport { SusaninRoute } from '@search/router/src/susanin';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nconst NewBuildingCardCommonParams = {\n    id: s.nullOpt(s.num),\n    commissioningDate: s.maybeArray(s.str),\n\n    finishingFlat: s.maybeArray(s.str),\n\n    floorMin: s.nullOpt(s.num),\n    floorMax: s.nullOpt(s.num),\n    floorFirst: s.nullOpt(s.str),\n    floorLast: s.nullOpt(s.str),\n\n    bathroom: s.maybeArray(s.str),\n\n    rooms: s.maybeArray(roomMapper.Type),\n\n    priceMin: s.nullOpt(s.num),\n    priceMax: s.nullOpt(s.num),\n    priceType: s.nullOpt(s.str),\n\n    totalAreaRangeMin: s.nullOpt(s.num),\n    totalAreaRangeMax: s.nullOpt(s.num),\n    livingAreaRangeMin: s.nullOpt(s.num),\n    livingAreaRangeMax: s.nullOpt(s.num),\n    kitchenAreaRangeMin: s.nullOpt(s.num),\n\n    buildingId: s.maybeArray(s.num),\n\n    pageNumber: s.nullOpt(s.num),\n    pageSize: s.nullOpt(s.num),\n    sort: s.nullOpt(s.str),\n\n    from: s.nullOpt(s.str)\n};\n\nconst NewBuildingCardCommonType = s.rec(NewBuildingCardCommonParams);\n\ntype INewBuildingCardCommonType = ReturnType<typeof NewBuildingCardCommonType>\n\nconst NewBuildingCardCommonSeoParams = {\n    origin: s.nullOpt(s.str),\n    id: s.nullOpt(s.str),\n    commissioningDate: s.maybeArray(s.str),\n\n    finishingFlat: s.maybeArray(s.str),\n\n    floorMin: s.nullOpt(s.str),\n    floorMax: s.nullOpt(s.str),\n    floorFirst: s.nullOpt(s.str),\n    floorLast: s.nullOpt(s.str),\n\n    bathroom: s.maybeArray(s.str),\n\n    rooms: s.maybeArray(roomMapper.Type),\n\n    priceMin: s.nullOpt(s.str),\n    priceMax: s.nullOpt(s.str),\n    priceType: s.nullOpt(s.str),\n\n    totalAreaRangeMin: s.nullOpt(s.str),\n    totalAreaRangeMax: s.nullOpt(s.str),\n    livingAreaRangeMin: s.nullOpt(s.str),\n    livingAreaRangeMax: s.nullOpt(s.str),\n    kitchenAreaRangeMin: s.nullOpt(s.str),\n\n    buildingId: s.maybeArray(s.str),\n\n    pageNumber: s.nullOpt(s.str),\n    pageSize: s.nullOpt(s.str),\n    sort: s.nullOpt(s.str),\n\n    from: s.nullOpt(s.str)\n};\n\nconst NewBuildingCardCommonSeoType = s.rec(NewBuildingCardCommonSeoParams);\n\ntype INewBuildingCardCommonSeoType = ReturnType<typeof NewBuildingCardCommonSeoType>\n\nconst newBuildingCardCommonDefaults = {\n    pageSize: 20 as number,\n    pageNumber: 1 as number,\n    sort: NewBuildingOffersSortEnum.PriceAsc as string\n};\n\nconst fromCommonQuery = (\n    seoParams: INewBuildingCardCommonSeoType,\n    defaults: typeof newBuildingCardCommonDefaults\n) => ({\n    commissioningDate: seoParams.commissioningDate,\n\n    finishingFlat: seoParams.finishingFlat,\n\n    floorMin: strToNum(seoParams.floorMin),\n    floorMax: strToNum(seoParams.floorMax),\n    floorFirst: seoParams.floorFirst,\n    floorLast: seoParams.floorLast,\n\n    bathroom: seoParams.bathroom,\n\n    rooms: seoParams.rooms,\n\n    priceMin: strToNum(seoParams.priceMin),\n    priceMax: strToNum(seoParams.priceMax),\n    priceType: seoParams.priceType,\n\n    totalAreaRangeMin: strToNum(seoParams.totalAreaRangeMin),\n    totalAreaRangeMax: strToNum(seoParams.totalAreaRangeMax),\n    livingAreaRangeMin: strToNum(seoParams.livingAreaRangeMin),\n    livingAreaRangeMax: strToNum(seoParams.livingAreaRangeMax),\n    kitchenAreaRangeMin: strToNum(seoParams.kitchenAreaRangeMin),\n\n    buildingId: seoParams.buildingId ? (\n        Array.isArray(seoParams.buildingId) ? seoParams.buildingId : [ seoParams.buildingId ]\n    ).map(strToNum) as number[] : undefined,\n\n    pageNumber: strToNum(seoParams.pageNumber) || defaults.pageNumber,\n    pageSize: strToNum(seoParams.pageSize) ?? defaults.pageSize,\n    sort: seoParams.sort || defaults.sort,\n\n    from: seoParams.from\n});\n\nconst toCommonQuery = (\n    params: INewBuildingCardCommonType,\n    defaults: typeof newBuildingCardCommonDefaults\n) => ({\n    commissioningDate: params.commissioningDate,\n\n    finishingFlat: params.finishingFlat,\n\n    floorMin: numToStr(params.floorMin),\n    floorMax: numToStr(params.floorMax),\n    floorFirst: params.floorFirst,\n    floorLast: params.floorLast,\n\n    bathroom: params.bathroom,\n\n    rooms: params.rooms,\n\n    priceMin: numToStr(params.priceMin),\n    priceMax: numToStr(params.priceMax),\n    priceType: params.priceType,\n\n    totalAreaRangeMin: numToStr(params.totalAreaRangeMin),\n    totalAreaRangeMax: numToStr(params.totalAreaRangeMax),\n    livingAreaRangeMin: numToStr(params.livingAreaRangeMin),\n    livingAreaRangeMax: numToStr(params.livingAreaRangeMax),\n    kitchenAreaRangeMin: numToStr(params.kitchenAreaRangeMin),\n\n    buildingId: params.buildingId ? (\n        Array.isArray(params.buildingId) ? params.buildingId : [ params.buildingId ]\n    ).map(numToStr) as string[] : undefined,\n\n    pageNumber: params.pageNumber && params.pageNumber !== defaults.pageNumber ?\n        numToStr(params.pageNumber) :\n        undefined,\n    pageSize: params.pageSize && params.pageSize !== defaults.pageSize ?\n        numToStr(params.pageSize) :\n        undefined,\n    sort: params.sort && params.sort !== defaults.sort ?\n        params.sort :\n        undefined,\n\n    from: params.from\n});\n\nexport const NewBuildingCardType = s.rec({\n    region: s.str,\n    subRegion: s.nullOpt(s.str),\n    type: s.opt(newBuildingTypeMapper.Type),\n    name: s.str,\n\n    ...NewBuildingCardCommonParams\n});\n\nexport type INewBuildingCardType = ReturnType<typeof NewBuildingCardType>\n\nexport const NewBuildingCardSeoType = s.rec({\n    region: s.nullOpt(s.str),\n    subRegion: s.nullOpt(s.str),\n    type: s.opt(newBuildingTypeMapper.SeoType),\n    name: s.str,\n\n    ...NewBuildingCardCommonSeoParams\n});\n\nexport type INewBuildingCardSeoType = ReturnType<typeof NewBuildingCardSeoType>\n\nexport const newBuildingCardDefaults = {\n    region: 'rossiya',\n\n    ...newBuildingCardCommonDefaults\n} as const;\n\nexport class NewBuildingCardRoute extends NewBuildingRoute<\n    INewBuildingCardSeoType,\n    INewBuildingCardType,\n    typeof newBuildingCardDefaults\n> {\n    displayName = 'NewBuildingCardRoute';\n\n    protected metadata = NewBuildingCardSeoType.config;\n\n    protected pattern(params: Tokens<INewBuildingCardSeoType>) {\n        return `${this.patternHost()}(/${\n            params.region\n        })/novostroyki(/${\n            params.subRegion\n        })/${\n            params.type\n        }-${\n            params.name\n        }-${\n            params.id\n        }/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            id: '\\\\d+',\n            type: newBuildingTypeMapper.keys\n        };\n    }\n\n    defaults() {\n        return newBuildingCardDefaults;\n    }\n\n    regionSlugSimple(regionId: number) {\n        return this.context.rootRegions?.getById(regionId)?.translit ??\n            this.defaultRegion().translit;\n    }\n\n    protected fromQuery(seoParams: INewBuildingCardSeoType) {\n        seoParams = NewBuildingCardSeoType(seoParams);\n\n        return NewBuildingCardType({\n            region: this.regionSlugSimple(this.regionId(seoParams.region)),\n            subRegion: seoParams.subRegion,\n            type: seoParams.type,\n            name: seoParams.name,\n            id: strToNum(seoParams.id),\n\n            ...fromCommonQuery(seoParams, this.defaults())\n        });\n    }\n\n    protected toQuery(params: INewBuildingCardType) {\n        params = NewBuildingCardType(params);\n\n        return NewBuildingCardSeoType({\n            ...this.regionParams(this.regionId(params.region)),\n            subRegion: params.subRegion,\n            type: params.type as INewBuildingCardSeoType['type'],\n            name: params.name,\n            id: numToStr(params.id),\n\n            ...toCommonQuery(params, this.defaults())\n        });\n    }\n}\n\nexport const WlNewBuildingCardType = s.rec({\n    ...NewBuildingCardCommonParams\n});\n\nexport type IWlNewBuildingCardType = ReturnType<typeof WlNewBuildingCardType>\n\nexport const WLNewBuildingCardSeoType = s.rec({\n    ...NewBuildingCardCommonSeoParams\n});\n\nexport type IWLNewBuildingCardSeoType = ReturnType<typeof WLNewBuildingCardSeoType>\n\nexport const wlNewBuildingCardDefaults = {\n    ...newBuildingCardCommonDefaults\n} as const;\n\nexport class WLNewBuildingCardRoute extends SusaninRoute<\n    IWLNewBuildingCardSeoType,\n    IWlNewBuildingCardType,\n    IRouterContext,\n    typeof wlNewBuildingCardDefaults\n> {\n    displayName = 'WLNewBuildingCardRoute';\n\n    protected metadata = WLNewBuildingCardSeoType.config;\n\n    protected pattern(params: Tokens<IWLNewBuildingCardSeoType>) {\n        return `${this.patternHost()}/novostroyki/${params.id}/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            id: '\\\\d+'\n        };\n    }\n\n    defaults() {\n        return wlNewBuildingCardDefaults;\n    }\n\n    protected fromQuery(seoParams: IWLNewBuildingCardSeoType) {\n        seoParams = WLNewBuildingCardSeoType(seoParams);\n\n        return WlNewBuildingCardType({\n            id: strToNum(seoParams.id),\n\n            ...fromCommonQuery(seoParams, this.defaults())\n        });\n    }\n\n    protected toQuery(params: IWlNewBuildingCardType) {\n        params = WlNewBuildingCardType(params);\n\n        return WLNewBuildingCardSeoType({\n            id: numToStr(params.id),\n\n            ...toCommonQuery(params, this.defaults()),\n\n            origin: undefined\n        });\n    }\n}\n","import {\n    newBuildingTypeMapper\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\nimport { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nconst NewBuildingConstructionCommonParams = {\n    id: s.nullOpt(s.num)\n};\n\nconst NewBuildingConstructionCommonSeoParams = {\n    origin: s.nullOpt(s.str),\n    id: s.nullOpt(s.str)\n};\n\nconst newBuildingConstructionCommonDefaults = {};\n\nexport const NewBuildingConstructionType = s.rec({\n    region: s.str,\n    subRegion: s.nullOpt(s.str),\n    type: s.opt(newBuildingTypeMapper.Type),\n    name: s.str,\n\n    ...NewBuildingConstructionCommonParams\n});\n\nexport type INewBuildingConstructionType = ReturnType<typeof NewBuildingConstructionType>\n\nexport const NewBuildingConstructionSeoType = s.rec({\n    region: s.nullOpt(s.str),\n    subRegion: s.nullOpt(s.str),\n    type: s.opt(newBuildingTypeMapper.SeoType),\n    name: s.str,\n\n    ...NewBuildingConstructionCommonSeoParams\n});\n\nexport type INewBuildingConstructionSeoType = ReturnType<typeof NewBuildingConstructionSeoType>\n\nexport const newBuildingConstructionDefaults = {\n    region: 'rossiya',\n\n    ...newBuildingConstructionCommonDefaults\n} as const;\n\nexport class NewBuildingConstructionRoute extends NewBuildingRoute<\n    INewBuildingConstructionSeoType,\n    INewBuildingConstructionType,\n    typeof newBuildingConstructionDefaults\n> {\n    displayName = 'NewBuildingConstructionRoute';\n\n    protected metadata = NewBuildingConstructionSeoType.config;\n\n    protected pattern(params: Tokens<INewBuildingConstructionSeoType>) {\n        return `${this.patternHost()}(/${\n            params.region\n        })/novostroyki(/${\n            params.subRegion\n        })/${\n            params.type\n        }-${\n            params.name\n        }-${\n            params.id\n        }/hod-stroitelstva/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            id: '\\\\d+',\n            type: newBuildingTypeMapper.keys\n        };\n    }\n\n    defaults() {\n        return newBuildingConstructionDefaults;\n    }\n\n    regionSlugSimple(regionId: number) {\n        return this.context.rootRegions?.getById(regionId)?.translit ??\n            this.defaultRegion().translit;\n    }\n\n    protected fromQuery(seoParams: INewBuildingConstructionSeoType) {\n        seoParams = NewBuildingConstructionSeoType(seoParams);\n\n        return NewBuildingConstructionType({\n            region: this.regionSlugSimple(this.regionId(seoParams.region)),\n            subRegion: seoParams.subRegion,\n            type: seoParams.type,\n            name: seoParams.name,\n            id: strToNum(seoParams.id)\n        });\n    }\n\n    protected toQuery(params: INewBuildingConstructionType) {\n        params = NewBuildingConstructionType(params);\n\n        return NewBuildingConstructionSeoType({\n            ...this.regionParams(this.regionId(params.region)),\n            subRegion: params.subRegion,\n            type: params.type as INewBuildingConstructionSeoType['type'],\n            name: params.name,\n            id: numToStr(params.id)\n        });\n    }\n}\n","import { s } from '@search/router/src/schema';\nimport { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport type { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport type { INewBuildingRouterContext as IRouterContext } from '../types';\n\nexport const NewBuildingQuizType = s.rec({\n    id: s.nullOpt(s.str)\n});\n\nexport type INewBuildingQuizType = ReturnType<typeof NewBuildingQuizType>\n\nexport const NewBuildingQuizSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    id: s.nullOpt(s.str)\n});\n\nexport type INewBuildingQuizSeoType = ReturnType<typeof NewBuildingQuizSeoType>\n\nexport class NewBuildingQuizRoute extends SusaninRoute<\n    INewBuildingQuizSeoType,\n    INewBuildingQuizType,\n    IRouterContext\n> {\n    displayName = 'NewBuildingQuizRoute';\n\n    protected metadata = NewBuildingQuizSeoType.config;\n\n    protected pattern(p: Tokens<INewBuildingQuizSeoType>) {\n        return `${this.patternHost()}/novostroyki/quiz(/${p.id})/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            id: '[\\\\w]+[-\\\\w]*'\n        };\n    }\n\n    defaults() {\n        return {};\n    }\n\n    protected fromQuery(seoParams: INewBuildingQuizSeoType) {\n        return NewBuildingQuizType({\n            id: seoParams.id\n        });\n    }\n\n    protected toQuery(params: INewBuildingQuizType) {\n        return NewBuildingQuizSeoType({\n            id: params.id\n        });\n    }\n}\n","import { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\nimport { ROSSIYA } from '@search/filter-enums/enums/Region';\n\nimport { INewBuildingRouterContext } from '../types';\n\nexport abstract class NewBuildingRoute<External, Internal, Defaults = unknown> extends SusaninRoute<\n    External, Internal, INewBuildingRouterContext, Defaults\n> {\n    protected patternHost(): string {\n        return '(<origin>)';\n    }\n\n    protected conditions() {\n        return {\n            origin: 'https?://[^\\/]+'\n        };\n    }\n\n    protected defaultRegion() {\n        return {\n            id: ROSSIYA,\n            translit: 'rossiya'\n        };\n    }\n\n    protected regionSlugHost(regionId: number) {\n        let result = super.regionSlugHost(regionId);\n\n        if (result) return result;\n\n        const parentId = this.context.rootRegions?.getById(regionId)?.narrowRegion?.id;\n\n        if (parentId) result = super.regionSlugHost(parentId);\n\n        return result;\n    }\n\n    regionId(regionSlug?: string | null) {\n        let regionId = regionSlug ? this.context.rootRegions?.getByTranslitName(regionSlug)?.id : undefined;\n\n        if (! regionId) regionId = this.hostParts()?.regionId;\n\n        return regionId ?? this.defaultRegion().id;\n    }\n\n    regionSlugPath(regionId: number) {\n        return this.context.rootRegions?.getById(regionId)?.translit ??\n            this.defaultRegion().translit;\n    }\n\n    countrySlugPath(regionId: number) {\n        return this.context.rootRegions?.getSlugFromGeo?.(regionId);\n    }\n\n    countrySlugId(slug: string, regionId: number) {\n        return this.context.rootRegions?.getGeoFromSlug?.(slug, regionId);\n    }\n}\n","import { Tokens } from '@search/router/src/RouterInterfaces';\n\nimport {\n    NewBuildingSearchRoute,\n    INewBuildingSearchSeoType,\n    WLNewBuildingSearchRoute\n} from './NewBuildingSearchRoute';\n\nexport class NewBuildingSearchMapRoute extends NewBuildingSearchRoute {\n    displayName = 'NewBuildingSearchMapRoute';\n\n    protected pattern(p: Tokens<INewBuildingSearchSeoType>) {\n        return `${this.patternHost()}(/${\n            p.region\n        })/novostroyki/karta(/srok-${\n            p.commissioningSeo\n        })(/${\n            p.roomSeo\n        })(/${\n            p.euroPlanningSeo\n        })(/${\n            p.hasFinishingSeo\n        })(/otdelka-${\n            p.finishingTypeSeo\n        })(/klass-${\n            p.buildingClassSeo\n        })(/${\n            p.wallsTypeSeo\n        })(/${\n            p.floorLastSeo\n        })(/${\n            p.ceilingHeightSeo\n        })(/${\n            p.kitchenAreaRangeMinSeo\n        })(/${\n            p.law214Seo\n        })(/${\n            p.escrowSeo\n        })(/${\n            p.armyMortgageSeo\n        })(/${\n            p.motherCapitalSeo\n        })(/${\n            p.installmentSeo\n        })(/${\n            p.closedAreaSeo\n        })(/${\n            p.conciergeSeo\n        })(/${\n            p.balconySeo\n        })(/${\n            p.apartmentsSeo\n        })(/${\n            p.parkingSeo\n        })(/${\n            p.flatsSpecialEventsSeo\n        })(/${\n            p.priceMaxSeo\n        })(/${\n            p.pricePerMeterMaxSeo\n        })(/${\n            p.cheapSeo\n        })(/${\n            p.closeToMetroSeo\n        })(/metro-${\n            p.metroSeo\n        })(/rayon-${\n            p.rayon\n        })(/${\n            p.okrug\n        }-okrug)(/${\n            p.geoSlugSeo\n        })(/${\n            p.city\n        })/`;\n    }\n}\n\nexport class WLNewBuildingSearchMapRoute extends WLNewBuildingSearchRoute {\n    displayName = 'WLNewBuildingSearchMapRoute';\n\n    protected pattern() {\n        return `${this.patternHost()}/karta/`;\n    }\n}\n","import { s } from '@search/router/src/schema';\nimport {\n    INewBuildingSearchType,\n    NewBuildingSearchParams,\n    NewBuildingSearchSeoParams,\n    WLNewBuildingSearchRoute\n} from './NewBuildingSearchRoute';\n\nexport const NewBuildingSearchMapTileType = s.rec({\n    ...NewBuildingSearchParams,\n\n    excludeLong: s.opt(s.num),\n    excludeLat: s.opt(s.num)\n});\n\nexport type INewBuildingSearchMapTileType = ReturnType<typeof NewBuildingSearchMapTileType>\n\nexport const NewBuildingSearchMapTileSeoType = s.rec({\n    ...NewBuildingSearchSeoParams,\n\n    excludeLong: s.opt(s.str),\n    excludeLat: s.opt(s.str)\n});\n\nexport type INewBuildingSearchMapTileSeoType = ReturnType<typeof NewBuildingSearchMapTileSeoType>\n\nexport class NewBuildingSearchMapTileRoute extends WLNewBuildingSearchRoute {\n    displayName = 'NewBuildingSearchMapTileRoute';\n\n    protected pattern() {\n        return `${this.patternHost()}/search/nb/tile/`;\n    }\n\n    protected fromQuery(seo: INewBuildingSearchMapTileSeoType) {\n        return {\n            ...super.fromQuery(seo),\n            excludeLat: seo.excludeLat && parseFloat(seo.excludeLat) || undefined,\n            excludeLong: seo.excludeLong && parseFloat(seo.excludeLong) || undefined\n        };\n    }\n\n    protected toQuery(p: INewBuildingSearchMapTileType) {\n        return {\n            ...super.toQuery(p as unknown as INewBuildingSearchType),\n            excludeLat: p.excludeLat && String(p.excludeLat) || undefined,\n            excludeLong: p.excludeLong && String(p.excludeLong) || undefined\n        };\n    }\n}\n","import { AreaUnitEnum, CommissioningEnum, FinishingEnum, NewBuildingSortEnum } from '@search/graphql-typings';\nimport { FinishingTypeEnum } from '@search/filter-enums/gql/schema-types-fix';\nimport { RegionIdEnum, ROSSIYA } from '@search/filter-enums/enums/Region';\nimport { s } from '@search/router/src/schema';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { numToStr, strToNum } from '@search/router/src/schema/strToNum';\nimport { mskCityMapper } from '@search/offer-search-routes/src/mappers/regions/msk/mskCityMapper';\nimport { spbCityMapper } from '@search/offer-search-routes/src/mappers/regions/spb/spbCityMapper';\nimport { mskRayonMapper } from '@search/offer-search-routes/src/mappers/regions/msk/mskRayonMapper';\nimport {\n    getCityMapperByRegion,\n    getDistrictMapperByRegion,\n    getMetroMapperByRegion\n} from '@search/offer-search-routes/src/mappers/regions';\nimport {\n    apartmentsMapper,\n    armyMortgageMapper,\n    balconyMapper,\n    buildingClassMapper,\n    ceilingHeightMapper,\n    cheapMapper,\n    closedAreaMapper,\n    closeToMetroMapper,\n    commissioningMapper,\n    conciergeMapper,\n    escrowMapper,\n    euroPlanningMapper,\n    finishingMapper,\n    finishingTypeMapper,\n    flatsSpecialEventMapper,\n    floorLastMapper,\n    installmentMapper,\n    kitchenAreaRangeMinMapper,\n    law214Mapper,\n    motherCapitalMapper,\n    newBuildingTypes,\n    parkingMapper,\n    priceMaxMapper,\n    pricePerMeterMaxMapper,\n    quarterMapper,\n    roomMapper,\n    sOtdelkoySeoValue,\n    wallsTypeMapper,\n    YES\n} from '@search/offer-search-routes/src/mappers/newBuilding/mappers';\nimport { YMapVector, yMapVectorPack, yMapVectorUnpack } from '@search/common-core/ymap/Vector';\nimport {\n    CeilingHeightString,\n    FlatsSpecialEventString,\n    IsApartmentsOptionsString,\n    ParkingTypeString\n} from '@search/filter-enums/enums';\n\nimport type { Writeable } from '../types';\n\nimport { NewBuildingRoute } from './NewBuildingRoute';\n\nexport const NewBuildingSearchParams = {\n    region: s.num,\n\n    commissioning: s.nullOpt(s.str),\n\n    rooms: s.maybeArray(roomMapper.Type),\n\n    addressId: s.maybeArray(s.num),\n    metroId: s.maybeArray(s.num),\n    districtId: s.maybeArray(s.num),\n    newBuildingId: s.maybeArray(s.num),\n    developerId: s.nullOpt(s.num),\n\n    transportType: s.nullOpt(s.str),\n    maxMinutes: s.nullOpt(s.str),\n\n    wallsType: s.maybeArray(wallsTypeMapper.Type),\n    parking: s.maybeArray(parkingMapper.Type),\n\n    floorsTotalMin: s.nullOpt(s.num),\n    floorsTotalMax: s.nullOpt(s.num),\n\n    priceMin: s.nullOpt(s.num),\n    priceMax: s.nullOpt(s.num),\n    priceType: s.nullOpt(s.str),\n\n    totalAreaRangeMin: s.nullOpt(s.num),\n    totalAreaRangeMax: s.nullOpt(s.num),\n\n    livingAreaRangeMin: s.nullOpt(s.num),\n    livingAreaRangeMax: s.nullOpt(s.num),\n\n    kitchenAreaRangeMin: s.nullOpt(s.num),\n\n    floorMin: s.nullOpt(s.num),\n    floorMax: s.nullOpt(s.num),\n    floorFirst: s.nullOpt(s.str),\n    floorLast: s.nullOpt(floorLastMapper.Type),\n\n    ceilingHeight: s.nullOpt(s.str),\n\n    bathroom: s.maybeArray(s.str),\n    balcony: s.nullOpt(s.boolExt),\n\n    buildingClass: s.maybeArray(buildingClassMapper.Type),\n\n    hasFinishing: s.nullOpt(finishingMapper.Type),\n    finishingType: s.nullOpt(s.list(finishingTypeMapper.Type)),\n\n    standalone: s.nullOpt(s.boolExt),\n    apartments: s.nullOpt(apartmentsMapper.Type),\n\n    concierge: s.nullOpt(s.boolExt),\n    closedArea: s.nullOpt(s.boolExt),\n    guardedArea: s.nullOpt(s.boolExt),\n\n    accreditedByVTB: s.nullOpt(s.boolExt),\n\n    law214: s.nullOpt(s.boolExt),\n    escrow: s.nullOpt(s.boolExt),\n\n    armyMortgage: s.nullOpt(s.boolExt),\n    installment: s.nullOpt(s.boolExt),\n    motherCapital: s.nullOpt(s.boolExt),\n\n    closedSales: s.nullOpt(s.bool),\n\n    pageNumber: s.nullOpt(s.num),\n    pageSize: s.nullOpt(s.num),\n    sort: s.nullOpt(s.str),\n\n    selectedNewBuildingId: s.nullOpt(s.num),\n\n    flatsSpecialEvents: s.maybeArray(s.str),\n    otherSpecialEvents: s.maybeArray(s.str),\n    miscSpecialEvents: s.maybeArray(s.str),\n\n    notOnlyM2Pro: s.nullOpt(s.bool),\n\n    geoSlug: s.opt(s.str),\n\n    mapBounds: s.opt(s.rec({\n        bounds: s.opt(s.rec({\n            min: s.rec({\n                x: s.num,\n                y: s.num\n            }),\n            max: s.rec({\n                x: s.num,\n                y: s.num\n            })\n        })),\n\n        polygon: s.opt(s.list(s.rec({\n            x: s.num,\n            y: s.num\n        })))\n    })),\n\n    x: s.nullOpt(s.num),\n    y: s.nullOpt(s.num),\n    z: s.nullOpt(s.num),\n\n    showHighlighted: s.nullOpt(s.bool)\n};\n\nexport const NewBuildingSearchType = s.rec(NewBuildingSearchParams);\n\nexport type INewBuildingSearchType = ReturnType<typeof NewBuildingSearchType>\n\nexport const NewBuildingSearchSeoParams = {\n    origin: s.nullOpt(s.str),\n    region: s.nullOpt(s.str),\n\n    geoSlugSeo: s.opt(s.str),\n\n    metroSeo: s.nullOpt(s.str),\n    rayon: s.nullOpt(s.str),\n    okrug: s.nullOpt(s.str),\n    city: s.nullOpt(s.str),\n\n    commissioningSeo: s.nullOpt(s.str),\n    commissioning: s.nullOpt(s.str),\n\n    roomSeo: s.nullOpt(roomMapper.SeoType),\n    rooms: s.maybeArray(roomMapper.Type),\n    euroPlanningSeo: s.nullOpt(euroPlanningMapper.SeoType),\n\n    addressId: s.maybeArray(s.str),\n    metroId: s.maybeArray(s.str),\n    districtId: s.maybeArray(s.str),\n    newBuildingId: s.maybeArray(s.str),\n    developerId: s.nullOpt(s.str),\n\n    transportType: s.nullOpt(s.str),\n    maxMinutes: s.nullOpt(s.str),\n    closeToMetroSeo: s.nullOpt(closeToMetroMapper.SeoType),\n\n    wallsTypeSeo: s.nullOpt(wallsTypeMapper.SeoType),\n    wallsType: s.maybeArray(wallsTypeMapper.Type),\n\n    parking: s.maybeArray(parkingMapper.Type),\n    parkingSeo: s.nullOpt(parkingMapper.SeoType),\n\n    floorsTotalMin: s.nullOpt(s.str),\n    floorsTotalMax: s.nullOpt(s.str),\n\n    priceMin: s.nullOpt(s.str),\n    priceMax: s.nullOpt(s.str),\n    priceMaxSeo: s.nullOpt(priceMaxMapper.SeoType),\n    cheapSeo: s.nullOpt(cheapMapper.SeoType),\n    priceType: s.nullOpt(s.str),\n    priceTypeSeo: s.nullOpt(s.str),\n    pricePerMeterMaxSeo: s.nullOpt(pricePerMeterMaxMapper.SeoType),\n\n    totalAreaRangeMin: s.nullOpt(s.str),\n    totalAreaRangeMax: s.nullOpt(s.str),\n\n    livingAreaRangeMin: s.nullOpt(s.str),\n    livingAreaRangeMax: s.nullOpt(s.str),\n\n    kitchenAreaRangeMin: s.nullOpt(s.str),\n    kitchenAreaRangeMinSeo: s.nullOpt(kitchenAreaRangeMinMapper.SeoType),\n\n    floorMin: s.nullOpt(s.str),\n    floorMax: s.nullOpt(s.str),\n    floorFirst: s.nullOpt(s.str),\n\n    floorLastSeo: s.nullOpt(floorLastMapper.SeoType),\n    floorLast: s.nullOpt(floorLastMapper.Type),\n\n    ceilingHeight: s.nullOpt(s.str),\n    ceilingHeightSeo: s.nullOpt(ceilingHeightMapper.SeoType),\n\n    bathroom: s.maybeArray(s.str),\n\n    balcony: s.nullOpt(balconyMapper.Type),\n    balconySeo: s.nullOpt(balconyMapper.SeoType),\n\n    buildingClassSeo: s.nullOpt(buildingClassMapper.SeoType),\n    buildingClass: s.maybeArray(buildingClassMapper.Type),\n\n    hasFinishingSeo: s.nullOpt(finishingMapper.SeoType),\n    hasFinishing: s.nullOpt(finishingMapper.SeoType),\n\n    finishingTypeSeo: s.nullOpt(finishingTypeMapper.SeoType),\n    finishingType: s.maybeArray(finishingTypeMapper.Type),\n\n    standalone: s.maybeArray(s.str),\n\n    apartments: s.nullOpt(apartmentsMapper.Type),\n    apartmentsSeo: s.nullOpt(apartmentsMapper.SeoType),\n\n    concierge: s.nullOpt(conciergeMapper.Type),\n    conciergeSeo: s.nullOpt(conciergeMapper.SeoType),\n\n    closedArea: s.nullOpt(closedAreaMapper.Type),\n    closedAreaSeo: s.nullOpt(closedAreaMapper.SeoType),\n\n    guardedArea: s.nullOpt(s.str),\n\n    accreditedByVTB: s.nullOpt(s.str),\n\n    law214Seo: s.nullOpt(law214Mapper.SeoType),\n    law214: s.nullOpt(law214Mapper.Type),\n\n    escrowSeo: s.nullOpt(escrowMapper.SeoType),\n    escrow: s.nullOpt(escrowMapper.Type),\n\n    armyMortgageSeo: s.nullOpt(armyMortgageMapper.SeoType),\n    armyMortgage: s.nullOpt(armyMortgageMapper.Type),\n\n    installmentSeo: s.nullOpt(installmentMapper.SeoType),\n    installment: s.nullOpt(installmentMapper.Type),\n\n    motherCapital: s.nullOpt(motherCapitalMapper.Type),\n    motherCapitalSeo: s.nullOpt(motherCapitalMapper.SeoType),\n\n    closedSales: s.nullOpt(s.str),\n\n    pageNumber: s.nullOpt(s.str),\n    pageSize: s.nullOpt(s.str),\n    sort: s.nullOpt(s.str),\n\n    selectedNewBuildingId: s.nullOpt(s.str),\n\n    flatsSpecialEvents: s.maybeArray(s.str),\n    flatsSpecialEventsSeo: s.nullOpt(flatsSpecialEventMapper.SeoType),\n\n    otherSpecialEvents: s.maybeArray(s.str),\n    miscSpecialEvents: s.maybeArray(s.str),\n\n    notOnlyM2Pro: s.nullOpt(s.str),\n\n    lx: s.opt(s.str),\n    ly: s.opt(s.str),\n    rx: s.opt(s.str),\n    ry: s.opt(s.str),\n\n    pol: s.opt(s.str),\n\n    x: s.nullOpt(s.str),\n    y: s.nullOpt(s.str),\n    z: s.nullOpt(s.str),\n\n    showHighlighted: s.nullOpt(s.str)\n};\n\nexport const NewBuildingSearchSeoType = s.rec(NewBuildingSearchSeoParams);\n\nexport type INewBuildingSearchSeoType = ReturnType<typeof NewBuildingSearchSeoType>\n\nconst fillGeoSeo = (\n    result: Partial<Writeable<INewBuildingSearchSeoType>>,\n    region: number,\n    geoIds: number | number[],\n    name: 'districtId' | 'addressId',\n    isCloseToMetro: boolean\n) => {\n    if (\n        ! isCloseToMetro &&\n        ! (result.metroSeo || result.city || result.rayon || result.okrug) &&\n        Array.isArray(geoIds) && geoIds.length === 1\n    ) {\n        const geoId = geoIds[0];\n\n        const cityMapper = getCityMapperByRegion(region);\n\n        result.city = cityMapper?.seoFromTypeOptional(geoId);\n\n        if (! result.city) {\n            const districtMapper = getDistrictMapperByRegion(region);\n\n            const rayon = mskRayonMapper.seoFromTypeOptional(geoId);\n            const rayonOrOkrug = districtMapper?.seoFromTypeOptional(geoId);\n\n            if (rayon || districtMapper?.name === 'spbDistrictMapper') {\n                result.rayon = rayon || rayonOrOkrug;\n            }\n\n            if (districtMapper?.name === 'mskDistrictMapper') {\n                result.okrug = rayonOrOkrug;\n            }\n        }\n\n        result[name] = result.city || result.rayon || result.okrug ?\n            undefined :\n            [ numToStr(geoId) as string ];\n    } else {\n        result[name] = (\n            Array.isArray(geoIds) ? geoIds : [ geoIds ]\n        ).map(numToStr) as string[];\n    }\n};\n\nfunction addGeo<T>(geoArray: T | readonly T[] | undefined | null, geoId?: T) {\n    if (! geoId) {\n        return geoArray;\n    }\n\n    if (! geoArray) {\n        return geoId;\n    }\n\n    return Array.isArray(geoArray) ? [ ...geoArray, geoId ] : [ geoArray, geoId ];\n}\n\nfunction getGeoNumber(geo: number | readonly number[] | null | undefined) {\n    if (Array.isArray(geo)) {\n        return geo.length;\n    }\n\n    return geo ? 1 : 0;\n}\n\nexport const searchDefaults = {\n    rooms: [],\n    addressId: [],\n    metroId: [],\n    districtId: [],\n    pageSize: 10 as number,\n    pageNumber: 1 as number,\n    sort: NewBuildingSortEnum.RelevanceDesc as string\n} as const;\n\nexport class NewBuildingSearchRoute extends NewBuildingRoute<\n    INewBuildingSearchSeoType,\n    INewBuildingSearchType,\n    typeof searchDefaults\n> {\n    displayName = 'NewBuildingSearchRoute';\n\n    protected metadata = NewBuildingSearchSeoType.config;\n\n    protected pattern(p: Tokens<INewBuildingSearchSeoType>) {\n        return `${\n            this.patternHost()\n        }(/${\n            p.region\n        })/novostroyki(/srok-${\n            p.commissioningSeo\n        })(/${\n            p.roomSeo\n        })(/${\n            p.euroPlanningSeo\n        })(/${\n            p.hasFinishingSeo\n        })(/otdelka-${\n            p.finishingTypeSeo\n        })(/klass-${\n            p.buildingClassSeo\n        })(/${\n            p.wallsTypeSeo\n        })(/${\n            p.floorLastSeo\n        })(/${\n            p.ceilingHeightSeo\n        })(/${\n            p.kitchenAreaRangeMinSeo\n        })(/${\n            p.law214Seo\n        })(/${\n            p.escrowSeo\n        })(/${\n            p.armyMortgageSeo\n        })(/${\n            p.motherCapitalSeo\n        })(/${\n            p.installmentSeo\n        })(/${\n            p.closedAreaSeo\n        })(/${\n            p.conciergeSeo\n        })(/${\n            p.balconySeo\n        })(/${\n            p.apartmentsSeo\n        })(/${\n            p.parkingSeo\n        })(/${\n            p.flatsSpecialEventsSeo\n        })(/${\n            p.priceMaxSeo\n        })(/${\n            p.pricePerMeterMaxSeo\n        })(/${\n            p.cheapSeo\n        })(/${\n            p.closeToMetroSeo\n        })(/metro-${\n            p.metroSeo\n        })(/rayon-${\n            p.rayon\n        })(/${\n            p.okrug\n        }-okrug)(/${\n            p.geoSlugSeo\n        })(/${\n            p.city\n        })/`;\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            city: [ ...mskCityMapper.keys, ...spbCityMapper.keys ],\n            geoSlugSeo: `(?!karta|zastroyshik|quiz|${newBuildingTypes.join('|')})[\\\\w\\\\d\\\\-_]+`,\n            roomSeo: roomMapper.keys,\n            buildingClassSeo: buildingClassMapper.keys,\n            hasFinishingSeo: finishingMapper.keys,\n            finishingTypeSeo: finishingTypeMapper.keys,\n            wallsTypeSeo: wallsTypeMapper.keys,\n            floorLastSeo: floorLastMapper.keys,\n            law214Seo: law214Mapper.keys,\n            escrowSeo: escrowMapper.keys,\n            armyMortgageSeo: armyMortgageMapper.keys,\n            installmentSeo: installmentMapper.keys,\n            priceMaxSeo: priceMaxMapper.keys,\n            pricePerMeterMaxSeo: pricePerMeterMaxMapper.keys,\n            cheapSeo: cheapMapper.keys,\n            closeToMetroSeo: closeToMetroMapper.keys,\n            closedAreaSeo: closedAreaMapper.keys,\n            conciergeSeo: conciergeMapper.keys,\n            balconySeo: balconyMapper.keys,\n            motherCapitalSeo: motherCapitalMapper.keys,\n            apartmentsSeo: apartmentsMapper.keys,\n            parkingSeo: parkingMapper.keys,\n            ceilingHeightSeo: ceilingHeightMapper.keys,\n            kitchenAreaRangeMinSeo: kitchenAreaRangeMinMapper.keys,\n            euroPlanningSeo: euroPlanningMapper.keys,\n            flatsSpecialEventsSeo: flatsSpecialEventMapper.keys\n        };\n    }\n\n    defaults() {\n        return searchDefaults;\n    }\n\n    // eslint-disable-next-line complexity\n    protected fromQuery(seo: INewBuildingSearchSeoType) {\n        const defaults = this.defaults();\n\n        const result: Partial<Writeable<INewBuildingSearchType>> = {\n            rooms: [],\n            finishingType: []\n        };\n\n        const raw = NewBuildingSearchSeoType(seo);\n\n        result.region = this.regionId(raw.region);\n\n        const commissioning = raw.commissioningSeo || raw.commissioning;\n\n        if (commissioning) {\n            if (commissioning.indexOf('q') !== -1) {\n                const [ year, quarter ] = commissioning.split('q');\n                const quarterNumber = parseInt(quarter, 10) as 1 | 2 | 3 | 4;\n\n                result.commissioning = `${quarterMapper.seoFromType(quarterNumber)}_${year}`;\n            } else {\n                if (Object.values(CommissioningEnum).includes(commissioning as CommissioningEnum)) {\n                    result.commissioning = commissioning;\n                } else if (commissioningMapper.hasSeo(commissioning)) {\n                    result.commissioning = commissioningMapper.typeFromSeo(commissioning);\n                } else {\n                    const [ quarter, year ] = commissioning.split('_');\n\n                    if (quarter && year) {\n                        result.commissioning = `${quarterMapper.typeFromSeo(quarter)}_${year}`;\n                    }\n                }\n            }\n        }\n\n        if (raw.roomSeo) {\n            result.rooms = roomMapper.toEnums(raw.roomSeo);\n        }\n\n        if (raw.rooms) {\n            result.rooms = Array.isArray(raw.rooms) ? raw.rooms : [ raw.rooms ];\n        }\n\n        if (raw.euroPlanningSeo) {\n            const [\n                rooms,\n                kitchen\n            ] = euroPlanningMapper.typeFromSeo(raw.euroPlanningSeo).split('|');\n\n            // @ts-ignore\n            result.rooms = [ rooms ];\n            result.kitchenAreaRangeMin = strToNum(kitchen);\n        }\n\n        const hasFinishing = raw.hasFinishingSeo || raw.hasFinishing;\n\n        if (hasFinishing) {\n            let finishingTypeFromHasFinishing: typeof sOtdelkoySeoValue | [ FinishingTypeEnum.WithoutFinishing ];\n\n            if (hasFinishing === 'bez-otdelki') {\n                finishingTypeFromHasFinishing = [ FinishingTypeEnum.WithoutFinishing ];\n            } else {\n                finishingTypeFromHasFinishing = sOtdelkoySeoValue;\n                result.hasFinishing = finishingMapper.typeFromSeo(hasFinishing);\n            }\n\n            if (result.finishingType) {\n                // @ts-expect-error\n                result.finishingType = result.finishingType.concat(finishingTypeFromHasFinishing);\n            } else {\n                // @ts-expect-error\n                result.finishingType = finishingTypeFromHasFinishing;\n            }\n        }\n\n        if (raw.finishingTypeSeo) {\n            result.finishingType = finishingTypeMapper.toEnums(raw.finishingTypeSeo);\n        }\n\n        if (raw.finishingType && result.finishingType) {\n            result.finishingType = result.finishingType.concat(raw.finishingType);\n        }\n\n        // eslint-disable-next-line no-nested-ternary\n        result.buildingClass = raw.buildingClassSeo ?\n            buildingClassMapper.toEnums(raw.buildingClassSeo) :\n            // eslint-disable-next-line no-nested-ternary\n            raw.buildingClass ?\n                Array.isArray(raw.buildingClass) ?\n                    raw.buildingClass :\n                    [ raw.buildingClass ] :\n                [];\n\n        // eslint-disable-next-line no-nested-ternary\n        result.wallsType = raw.wallsTypeSeo ? wallsTypeMapper.toEnums(raw.wallsTypeSeo) :\n            // eslint-disable-next-line no-nested-ternary\n            raw.wallsType ?\n                Array.isArray(raw.wallsType) ?\n                    raw.wallsType :\n                    [ raw.wallsType ] :\n                [];\n\n        result.floorLast = raw.floorLastSeo ?\n            floorLastMapper.toEnums(raw.floorLastSeo)[0] :\n            raw.floorLast;\n\n        result.law214 = (\n            raw.law214Seo ?\n                law214Mapper.toEnums(raw.law214Seo)[0] :\n                raw.law214\n        ) === YES;\n\n        result.escrow = (\n            raw.escrowSeo ?\n                escrowMapper.toEnums(raw.escrowSeo)[0] :\n                raw.escrow\n        ) === YES;\n\n        result.armyMortgage = (\n            raw.armyMortgageSeo ?\n                armyMortgageMapper.toEnums(raw.armyMortgageSeo)[0] :\n                raw.armyMortgage\n        ) === YES;\n\n        result.installment = (\n            raw.installmentSeo ?\n                installmentMapper.toEnums(raw.installmentSeo)[0] :\n                raw.installment\n        ) === YES;\n\n        result.closedArea = (\n            raw.closedAreaSeo ?\n                closedAreaMapper.toEnums(raw.closedAreaSeo)[0] :\n                raw.closedArea\n        ) === YES;\n\n        result.concierge = (\n            raw.conciergeSeo ?\n                conciergeMapper.toEnums(raw.conciergeSeo)[0] :\n                raw.concierge\n        ) === YES;\n\n        result.balcony = (\n            raw.balconySeo ?\n                balconyMapper.toEnums(raw.balconySeo)[0] :\n                raw.balcony\n        ) === YES;\n\n        result.motherCapital = (\n            raw.motherCapitalSeo ?\n                motherCapitalMapper.toEnums(raw.motherCapitalSeo)[0] :\n                raw.motherCapital\n        ) === YES;\n\n        const apartmentsOnlySeoStr = apartmentsMapper.seoFromType(IsApartmentsOptionsString.APARTMENTS_ONLY);\n\n        result.apartments = raw.apartmentsSeo === apartmentsOnlySeoStr ?\n            apartmentsMapper.toEnums(raw.apartmentsSeo)[0] :\n            raw.apartments;\n\n        if (raw.ceilingHeightSeo) {\n            result.ceilingHeight = ceilingHeightMapper.typeFromSeo(raw.ceilingHeightSeo);\n        }\n\n        if (raw.kitchenAreaRangeMinSeo) {\n            result.kitchenAreaRangeMin = kitchenAreaRangeMinMapper.typeFromSeo(raw.kitchenAreaRangeMinSeo);\n        }\n\n        if (raw.parkingSeo === parkingMapper.seoFromType(ParkingTypeString.UNDERGROUND)) {\n            result.parking = [ ParkingTypeString.UNDERGROUND ];\n        } else if (raw.parkingSeo === parkingMapper.seoFromType(ParkingTypeString.AVAILABLE)) {\n            result.parking = [ ParkingTypeString.UNDERGROUND, ParkingTypeString.CLOSED, ParkingTypeString.OPEN ];\n        } else {\n            // eslint-disable-next-line no-nested-ternary\n            result.parking = raw.parking ? (\n                Array.isArray(raw.parking) ? raw.parking : [ raw.parking ]\n            ) : [];\n        }\n\n        if (raw.flatsSpecialEventsSeo) {\n            result.flatsSpecialEvents = [ flatsSpecialEventMapper.typeFromSeo(raw.flatsSpecialEventsSeo) ];\n        }\n\n        if (raw.priceMaxSeo) {\n            result.priceMax = priceMaxMapper.toEnums(raw.priceMaxSeo)[0];\n        }\n\n        if (raw.pricePerMeterMaxSeo) {\n            result.priceMax = pricePerMeterMaxMapper.toEnums(raw.pricePerMeterMaxSeo)[0];\n            result.priceType = AreaUnitEnum.Meter;\n        }\n\n        if (raw.cheapSeo) {\n            result.priceMax = cheapMapper.toEnums(raw.cheapSeo)[0];\n\n            result.sort = NewBuildingSortEnum.PriceAsc;\n        } else {\n            result.sort = raw.sort || defaults.sort;\n        }\n\n        if (raw.city) {\n            const cityMapper = result.region ? getCityMapperByRegion(result.region) : undefined;\n\n            result.districtId = cityMapper?.toIds(raw.districtId, raw.city);\n        }\n\n        if (raw.rayon) {\n            const districtMapper = result.region ? getDistrictMapperByRegion(result.region) : undefined;\n            const mskDistrictIds = mskRayonMapper.hasSeo(raw.rayon) ?\n                mskRayonMapper.toIds(raw.districtId, raw.rayon) :\n                null;\n\n            result.districtId = mskDistrictIds ?? districtMapper?.toIds(raw.districtId, raw.rayon);\n        }\n\n        if (raw.okrug) {\n            const districtMapper = result.region ? getDistrictMapperByRegion(result.region) : undefined;\n\n            result.districtId = districtMapper?.toIds(raw.districtId, raw.okrug);\n        }\n\n        if (! result.districtId) {\n            result.districtId = raw.districtId?.length ? (\n                Array.isArray(raw.districtId) ?\n                    raw.districtId :\n                    [ raw.districtId ]\n            ).map(strToNum) as number[] : undefined;\n        }\n\n        if (raw.closedSales) {\n            result.closedSales = Boolean(raw.closedSales);\n        }\n\n        if (raw.notOnlyM2Pro) {\n            result.notOnlyM2Pro = Boolean(raw.notOnlyM2Pro);\n        }\n\n        const hasBounds = ! [ raw.lx, raw.ly, raw.rx, raw.ry ].some(coord => coord === undefined);\n\n        if (hasBounds || raw.pol) {\n            result.mapBounds = {\n                bounds: hasBounds ? {\n                    min: {\n                        x: Number(raw.lx),\n                        y: Number(raw.ly)\n                    },\n                    max: {\n                        x: Number(raw.rx),\n                        y: Number(raw.ry)\n                    }\n                } : undefined,\n                polygon: raw.pol ? yMapVectorUnpack(raw.pol) : []\n            };\n        }\n\n        if (raw.showHighlighted) {\n            result.showHighlighted = Boolean(raw.showHighlighted);\n        }\n\n        const metroMapper = result.region ? getMetroMapperByRegion(result.region) : undefined;\n\n        if (raw.closeToMetroSeo) {\n            [\n                result.transportType,\n                result.maxMinutes\n            ] = closeToMetroMapper.toEnums(raw.closeToMetroSeo)[0]\n                .split('|');\n        } else {\n            // eslint-disable-next-line no-nested-ternary\n            result.metroId = metroMapper ?\n                metroMapper.toIds(raw.metroId, raw.metroSeo) :\n                raw.metroId?.length ? (\n                    Array.isArray(raw.metroId) ?\n                        raw.metroId :\n                        [ raw.metroId ]\n                ).map(strToNum) as number[] : undefined;\n\n            result.transportType = raw.transportType;\n            result.maxMinutes = raw.maxMinutes;\n        }\n\n        if (raw.geoSlugSeo) {\n            result.geoSlug = raw.geoSlugSeo;\n\n            const geo = result.region ? this.countrySlugId(raw.geoSlugSeo, result.region) : undefined;\n\n            if (geo?.kind === 'LOCALITY') {\n                result.addressId = addGeo(result.addressId, geo?.id);\n            }\n\n            if (geo?.kind === 'DISTRICT') {\n                result.districtId = addGeo(result.districtId, geo?.id);\n            }\n        }\n\n        if (! result.addressId) {\n            result.addressId = raw.addressId?.length ? (\n                Array.isArray(raw.addressId) ?\n                    raw.addressId :\n                    [ raw.addressId ]).map(strToNum) as number[] : undefined;\n        }\n\n        if (! result.districtId) {\n            result.districtId = raw.districtId?.length ? (\n                Array.isArray(raw.districtId) ?\n                    raw.districtId :\n                    [ raw.districtId ]).map(strToNum) as number[] : undefined;\n        }\n\n        return NewBuildingSearchType({\n            region: Number(result.region),\n\n            priceMin: strToNum(raw.priceMin),\n            priceMax: strToNum(raw.priceMax),\n            priceType: raw.priceType,\n\n            totalAreaRangeMin: strToNum(raw.totalAreaRangeMin),\n            totalAreaRangeMax: strToNum(raw.totalAreaRangeMax),\n\n            livingAreaRangeMin: strToNum(raw.livingAreaRangeMin),\n            livingAreaRangeMax: strToNum(raw.livingAreaRangeMax),\n\n            kitchenAreaRangeMin: strToNum(raw.kitchenAreaRangeMin),\n\n            floorMin: strToNum(raw.floorMin),\n            floorMax: strToNum(raw.floorMax),\n            floorFirst: raw.floorFirst,\n\n            floorsTotalMin: strToNum(raw.floorsTotalMin),\n            floorsTotalMax: strToNum(raw.floorsTotalMax),\n\n            ceilingHeight: raw.ceilingHeight,\n\n            bathroom: raw.bathroom,\n\n            newBuildingId: raw.newBuildingId ? (\n                Array.isArray(raw.newBuildingId) ?\n                    raw.newBuildingId :\n                    [ raw.newBuildingId ]\n            ).map(strToNum) as number[] : undefined,\n            developerId: raw.developerId ? strToNum(raw.developerId) : undefined,\n\n            standalone: raw.standalone === YES,\n\n            accreditedByVTB: raw.accreditedByVTB === YES,\n\n            guardedArea: raw.guardedArea === YES,\n\n            pageNumber: strToNum(raw.pageNumber) || defaults.pageNumber,\n            pageSize: strToNum(raw.pageSize) || defaults.pageSize,\n\n            selectedNewBuildingId: strToNum(raw.selectedNewBuildingId),\n\n            flatsSpecialEvents: raw.flatsSpecialEvents,\n            otherSpecialEvents: raw.otherSpecialEvents,\n            miscSpecialEvents: raw.miscSpecialEvents,\n\n            x: strToNum(raw.x),\n            y: strToNum(raw.y),\n            z: strToNum(raw.z),\n\n            ...result\n        });\n    }\n\n    // eslint-disable-next-line complexity\n    protected toQuery(p: INewBuildingSearchType) {\n        const defaults = this.defaults();\n\n        p = NewBuildingSearchType(p);\n\n        let result: Partial<Writeable<INewBuildingSearchSeoType>> = {};\n\n        // https://jira.m2.ru/browse/NB-1625\n        const seoResult: Partial<Writeable<INewBuildingSearchSeoType>> = {};\n        const queryResult: Partial<Writeable<INewBuildingSearchSeoType>> = {};\n\n        let totalSegments = 0;\n\n        if (p.commissioning) {\n            let commissioning;\n\n            if (commissioningMapper.hasType(p.commissioning)) {\n                commissioning = commissioningMapper.seoFromType(p.commissioning);\n            } else {\n                const [ quarter, year ] = p.commissioning.split('_');\n\n                commissioning = [ year, quarterMapper.typeFromSeo(quarter) ].join('q');\n            }\n\n            seoResult.commissioningSeo = commissioning;\n            queryResult.commissioning = commissioning;\n\n            totalSegments++;\n        }\n\n        if (\n            euroPlanningMapper.hasType(`${p.rooms}|${p.kitchenAreaRangeMin}`) &&\n            (! p.apartments || p.apartments !== IsApartmentsOptionsString.APARTMENTS_ONLY)\n        ) {\n            seoResult.euroPlanningSeo = euroPlanningMapper.seoFromType(`${p.rooms}|${p.kitchenAreaRangeMin}`);\n\n            totalSegments++;\n\n            queryResult.rooms = p.rooms;\n            queryResult.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n        } else {\n            if (p.rooms && Array.isArray(p.rooms)) {\n                if (p.rooms.length === 1) {\n                    seoResult.roomSeo = roomMapper.seoFromType(p.rooms[0]);\n\n                    totalSegments++;\n                } else {\n                    seoResult.rooms = p.rooms;\n                }\n\n                queryResult.rooms = p.rooms;\n            }\n\n            if (p.kitchenAreaRangeMin) {\n                if (kitchenAreaRangeMinMapper.hasType(p.kitchenAreaRangeMin)) {\n                    seoResult.kitchenAreaRangeMinSeo = kitchenAreaRangeMinMapper.seoFromType(p.kitchenAreaRangeMin);\n\n                    totalSegments++;\n                } else {\n                    seoResult.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n                }\n\n                queryResult.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n            }\n        }\n\n        if (p.finishingType) {\n            // в finishingTypeMapper под-ключ и чистовая принимают одно и тоже значение\n            // чтобы убрать дубли, в случае\n            // /novostroyki/otdelka-pod-klyuch/?finishingType=FINE&finishingType=PRE_FINISHING -> /novostroyki/?finishingType=FINE&finishingType=PRE_FINISHING\n            const finishingTypeDeduplicated = Array.from(new Set(p.finishingType));\n\n            if (p.finishingType.length === 1) {\n                const finishingSeoTag = finishingTypeMapper.seoFromType(p.finishingType[0]);\n\n                // не для всех есть ЧПУ (предчистовая)\n                if (finishingSeoTag) {\n                    // переехало в новый finishingTypeEnum, но тег нужно оставить прошлого вида\n                    if (finishingSeoTag === 'bez-otdelki') seoResult.hasFinishingSeo = 'bez-otdelki';\n                    else seoResult.finishingTypeSeo = finishingSeoTag;\n                    // отдельного значения в Enum отправляемом на бэк более нет и теперь\n                    // подключ === чистовая\n                    if (finishingSeoTag === 'pod-klyuch') seoResult.finishingTypeSeo = 'chistovaya';\n\n                    seoResult.finishingType = undefined;\n                    totalSegments++;\n                }\n            }\n            if (p.hasFinishing === FinishingEnum.Available && ! seoResult.finishingTypeSeo) {\n                seoResult.hasFinishingSeo = 's-otdelkoy';\n                seoResult.finishingType = undefined;\n                totalSegments++;\n            }\n\n            if (! seoResult.finishingTypeSeo && ! seoResult.hasFinishingSeo) {\n                seoResult.finishingType = finishingTypeDeduplicated;\n            }\n\n            queryResult.finishingType = finishingTypeDeduplicated;\n        }\n\n        if (p.buildingClass) {\n            if (Array.isArray(p.buildingClass) && p.buildingClass.length === 1) {\n                seoResult.buildingClassSeo = buildingClassMapper.seoFromType(p.buildingClass[0]);\n\n                totalSegments++;\n            } else {\n                seoResult.buildingClass = p.buildingClass;\n            }\n\n            queryResult.buildingClass = p.buildingClass;\n        }\n\n        if (p.wallsType) {\n            if (Array.isArray(p.wallsType) && p.wallsType.length === 1) {\n                seoResult.wallsTypeSeo = wallsTypeMapper.seoFromType(p.wallsType[0]);\n\n                totalSegments++;\n            } else {\n                seoResult.wallsType = p.wallsType;\n            }\n\n            queryResult.wallsType = p.wallsType;\n        }\n\n        if (p.floorLast) {\n            seoResult.floorLastSeo = floorLastMapper.seoFromType(p.floorLast);\n\n            totalSegments++;\n\n            queryResult.floorLast = p.floorLast;\n        }\n\n        if (p.law214) {\n            seoResult.law214Seo = law214Mapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.law214 = YES;\n        }\n\n        if (p.escrow) {\n            seoResult.escrowSeo = escrowMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.escrow = YES;\n        }\n\n        if (p.armyMortgage) {\n            seoResult.armyMortgageSeo = armyMortgageMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.armyMortgage = YES;\n        }\n\n        if (p.installment) {\n            seoResult.installmentSeo = installmentMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.installment = YES;\n        }\n\n        if (p.closedArea) {\n            seoResult.closedAreaSeo = closedAreaMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.closedArea = YES;\n        }\n\n        if (p.concierge) {\n            seoResult.conciergeSeo = conciergeMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.concierge = YES;\n        }\n\n        if (p.balcony) {\n            seoResult.balconySeo = balconyMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.balcony = YES;\n        }\n\n        if (p.motherCapital) {\n            seoResult.motherCapitalSeo = motherCapitalMapper.seoFromType(YES);\n\n            totalSegments++;\n\n            queryResult.motherCapital = YES;\n        }\n\n        if (p.apartments) {\n            if (p.apartments === IsApartmentsOptionsString.APARTMENTS_ONLY) {\n                seoResult.apartmentsSeo = apartmentsMapper.seoFromType(p.apartments);\n\n                totalSegments++;\n            } else {\n                seoResult.apartments = p.apartments;\n            }\n\n            queryResult.apartments = p.apartments;\n        }\n\n        if (p.ceilingHeight) {\n            if (ceilingHeightMapper.hasType(p.ceilingHeight)) {\n                seoResult.ceilingHeightSeo = ceilingHeightMapper.seoFromType(p.ceilingHeight as CeilingHeightString);\n\n                totalSegments++;\n            } else {\n                seoResult.ceilingHeight = p.ceilingHeight;\n            }\n\n            queryResult.ceilingHeight = p.ceilingHeight;\n        }\n\n        if (p.parking) {\n            if (Array.isArray(p.parking) && p.parking.length === 3) {\n                seoResult.parkingSeo = parkingMapper.seoFromType(ParkingTypeString.AVAILABLE);\n\n                totalSegments++;\n            } else if (p.parking.length === 1 && p.parking[0] === ParkingTypeString.UNDERGROUND) {\n                seoResult.parkingSeo = parkingMapper.seoFromType(ParkingTypeString.UNDERGROUND);\n\n                totalSegments++;\n            } else {\n                seoResult.parking = p.parking;\n            }\n\n            queryResult.parking = Array.isArray(p.parking) ? p.parking : [ p.parking ];\n        }\n\n        if (p.flatsSpecialEvents) {\n            if (p.flatsSpecialEvents.length === 1 && flatsSpecialEventMapper.hasType(p.flatsSpecialEvents[0])) {\n                seoResult.flatsSpecialEventsSeo = flatsSpecialEventMapper.seoFromType(\n                    p.flatsSpecialEvents[0] as FlatsSpecialEventString\n                );\n\n                totalSegments++;\n            } else {\n                seoResult.flatsSpecialEvents = p.flatsSpecialEvents;\n            }\n\n            queryResult.flatsSpecialEvents = Array.isArray(p.flatsSpecialEvents) ?\n                p.flatsSpecialEvents :\n                [ p.flatsSpecialEvents ];\n        }\n\n        if (p.priceMax && priceMaxMapper.hasType(p.priceMax)) {\n            if (cheapMapper.hasType(p.priceMax) && p.sort === NewBuildingSortEnum.PriceAsc) {\n                seoResult.cheapSeo = cheapMapper.seoFromType(p.priceMax);\n            } else {\n                seoResult.priceMaxSeo = priceMaxMapper.seoFromType(p.priceMax);\n            }\n\n            totalSegments++;\n\n            queryResult.priceMax = numToStr(p.priceMax);\n            queryResult.priceType = p.priceType;\n        } else if (p.priceMax && pricePerMeterMaxMapper.hasType(p.priceMax) && p.priceType === 'METER') {\n            seoResult.pricePerMeterMaxSeo = pricePerMeterMaxMapper.seoFromType(p.priceMax);\n\n            totalSegments++;\n\n            queryResult.priceMax = numToStr(p.priceMax);\n            queryResult.priceType = p.priceType;\n        } else {\n            result.priceMax = numToStr(p.priceMax);\n            result.priceType = p.priceType;\n        }\n\n        const isCloseToMetro = Boolean(\n            p.transportType && p.maxMinutes &&\n            closeToMetroMapper.hasType(`${p.transportType}|${p.maxMinutes}`)\n        );\n\n        if (! (\n            (Array.isArray(p.metroId) ? p.metroId.length : p.metroId) ||\n            (Array.isArray(p.districtId) ? p.districtId.length : p.districtId) ||\n            (Array.isArray(p.addressId) ? p.addressId.length : p.addressId)\n        ) && isCloseToMetro) {\n            seoResult.closeToMetroSeo = closeToMetroMapper.seoFromType(`${p.transportType}|${p.maxMinutes}`);\n\n            totalSegments++;\n\n            queryResult.transportType = p.transportType;\n            queryResult.maxMinutes = p.maxMinutes;\n        } else {\n            result.transportType = p.transportType;\n            result.maxMinutes = p.maxMinutes;\n        }\n\n        const slugNumber = getGeoNumber(p.addressId) + getGeoNumber(p.districtId);\n        let slugSource;\n\n        if (p.geoSlug) {\n            result.geoSlugSeo = p.geoSlug;\n        } else if (p.addressId || p.districtId) {\n            if (slugNumber === 1) {\n                const addressId = Array.isArray(p.addressId) ? p.addressId[0] : p.addressId;\n                const districtId = Array.isArray(p.districtId) ? p.districtId[0] : p.districtId;\n\n                if (addressId) {\n                    const slug = this.countrySlugPath(addressId) ?? undefined;\n\n                    result.geoSlugSeo = slug;\n                    slugSource = slug ? 'addressId' : undefined;\n                } else if (districtId) {\n                    const slug = this.countrySlugPath(districtId) ?? undefined;\n\n                    result.geoSlugSeo = slug;\n                    slugSource = slug ? 'districtId' : undefined;\n                }\n            }\n        }\n\n        p.addressId && slugSource !== 'addressId' && fillGeoSeo(\n            result,\n            p.region,\n            p.addressId as number | number[],\n            'addressId',\n            isCloseToMetro\n        );\n\n        p.districtId && slugSource !== 'districtId' && fillGeoSeo(\n            result,\n            p.region,\n            p.districtId as number | number[],\n            'districtId',\n            isCloseToMetro\n        );\n\n        result = {\n            ...result,\n            ...(totalSegments <= 2 ? seoResult : queryResult)\n        };\n\n        if (! result.cheapSeo) {\n            result.sort = p.sort && p.sort !== defaults.sort ? p.sort : undefined;\n        }\n\n        const metroMapper = getMetroMapperByRegion(p.region);\n        let metroSeo: string | undefined;\n\n        if (metroMapper && Array.isArray(p.metroId) && p.metroId.length === 1) {\n            metroSeo = metroMapper.seoFromTypeOptional(p.metroId[0]);\n        }\n\n        if (metroSeo && ! isCloseToMetro) {\n            result.metroSeo = metroSeo;\n        } else {\n            result.metroId = (\n                Array.isArray(p.metroId) ?\n                    p.metroId :\n                    [ p.metroId ]\n            ).map(numToStr) as string[];\n        }\n\n        if (p.closedSales) {\n            result.closedSales = 'YES';\n        }\n\n        if (p.notOnlyM2Pro) {\n            result.notOnlyM2Pro = 'YES';\n        }\n\n        const { bounds, polygon } = p.mapBounds ?? {};\n\n        if (p.showHighlighted) {\n            result.showHighlighted = 'YES';\n        }\n\n        return NewBuildingSearchSeoType({\n            ...result,\n            ...this.regionParams(p.region),\n\n            priceMin: numToStr(p.priceMin),\n\n            totalAreaRangeMin: numToStr(p.totalAreaRangeMin),\n            totalAreaRangeMax: numToStr(p.totalAreaRangeMax),\n\n            livingAreaRangeMin: numToStr(p.livingAreaRangeMin),\n            livingAreaRangeMax: numToStr(p.livingAreaRangeMax),\n\n            floorMin: numToStr(p.floorMin),\n            floorMax: numToStr(p.floorMax),\n            floorFirst: p.floorFirst,\n\n            floorsTotalMin: numToStr(p.floorsTotalMin),\n            floorsTotalMax: numToStr(p.floorsTotalMax),\n\n            bathroom: p.bathroom,\n\n            newBuildingId: p.newBuildingId ? (\n                Array.isArray(p.newBuildingId) ?\n                    p.newBuildingId :\n                    [ p.newBuildingId ]\n            ).map(numToStr) as string[] : undefined,\n            developerId: p.developerId ? numToStr(p.developerId) : undefined,\n\n            standalone: p.standalone ? YES : undefined,\n\n            accreditedByVTB: p.accreditedByVTB ? YES : undefined,\n\n            guardedArea: p.guardedArea ? YES : undefined,\n\n            pageNumber: p.pageNumber && p.pageNumber !== defaults.pageNumber ? numToStr(p.pageNumber) : undefined,\n            pageSize: p.pageSize && p.pageSize !== defaults.pageSize ? numToStr(p.pageSize) : undefined,\n\n            selectedNewBuildingId: numToStr(p.selectedNewBuildingId),\n\n            otherSpecialEvents: p.otherSpecialEvents,\n            miscSpecialEvents: p.miscSpecialEvents,\n\n            lx: bounds?.min.x.toString(),\n            ly: bounds?.min.y.toString(),\n            rx: bounds?.max.x.toString(),\n            ry: bounds?.max.y.toString(),\n\n            pol: polygon ? yMapVectorPack(polygon as YMapVector[]) : undefined,\n\n            x: numToStr(p.x),\n            y: numToStr(p.y),\n            z: numToStr(p.z)\n        });\n    }\n}\n\nexport class WLNewBuildingSearchRoute extends NewBuildingSearchRoute {\n    displayName = 'WLNewBuildingSearchRoute';\n\n    protected pattern() {\n        return `${this.patternHost()}/`;\n    }\n\n    protected defaultRegion() {\n        return {\n            id: RegionIdEnum.MSK,\n            translit: 'moskva'\n        };\n    }\n\n    protected fromQuery(seo: INewBuildingSearchSeoType) {\n        const ret = super.fromQuery(seo);\n        const regionRet: { region?: number } = {};\n\n        if (seo.region) {\n            regionRet.region = strToNum(seo.region);\n        }\n\n        return {\n            ...ret,\n            ...regionRet,\n\n            rooms: seo.rooms,\n            commissioning: seo.commissioning,\n            buildingClass: seo.buildingClass,\n            wallsType: seo.wallsType,\n            floorLast: seo.floorLast,\n\n            law214: seo.law214 === YES,\n            escrow: seo.escrow === YES,\n            armyMortgage: seo.armyMortgage === YES,\n            installment: seo.installment === YES,\n            concierge: seo.concierge === YES,\n            closedArea: seo.closedArea === YES,\n            balcony: seo.balcony === YES,\n            motherCapital: seo.motherCapital === YES,\n            apartments: seo.apartments,\n            parking: seo.parking\n        };\n    }\n\n    protected toQuery(p: INewBuildingSearchType) {\n        const ret: Partial<Writeable<INewBuildingSearchSeoType>> = super.toQuery(p);\n\n        ret.region = String(p.region);\n\n        ret.rooms = p.rooms;\n        ret.commissioning = p.commissioning;\n        ret.finishingType = p.finishingType ?? undefined;\n        ret.buildingClass = p.buildingClass;\n        ret.wallsType = p.wallsType;\n        ret.floorLast = p.floorLast;\n\n        ret.law214 = p.law214 ? YES : undefined;\n        ret.escrow = p.escrow ? YES : undefined;\n        ret.armyMortgage = p.armyMortgage ? YES : undefined;\n        ret.installment = p.installment ? YES : undefined;\n        ret.concierge = p.concierge ? YES : undefined;\n        ret.balcony = p.balcony ? YES : undefined;\n        ret.motherCapital = p.motherCapital ? YES : undefined;\n        ret.closedArea = p.closedArea ? YES : undefined;\n        ret.apartments = p.apartments;\n        ret.parking = p.parking;\n        ret.flatsSpecialEvents = p.flatsSpecialEvents;\n        ret.ceilingHeight = p.ceilingHeight;\n        ret.kitchenAreaRangeMin = numToStr(p.kitchenAreaRangeMin);\n\n        ret.districtId = Array.isArray(p.districtId) ?\n            p.districtId :\n            [ p.districtId ];\n        ret.metroId = Array.isArray(p.metroId) ?\n            p.metroId :\n            [ p.metroId ];\n\n        if (ret.geoSlugSeo) {\n            const geo = p.region ? this.countrySlugId(ret.geoSlugSeo, p.region) : undefined;\n\n            if (geo?.kind === 'LOCALITY') {\n                ret.addressId = addGeo(ret.addressId, geo?.id.toString());\n            }\n\n            if (geo?.kind === 'DISTRICT') {\n                ret.districtId = addGeo(ret.districtId, geo?.id.toString());\n            }\n        }\n\n        delete ret.metroSeo;\n        delete ret.rayon;\n        delete ret.okrug;\n        delete ret.city;\n        delete ret.roomSeo;\n        delete ret.commissioningSeo;\n        delete ret.finishingTypeSeo;\n        delete ret.buildingClassSeo;\n        delete ret.wallsTypeSeo;\n        delete ret.floorLastSeo;\n        delete ret.law214Seo;\n        delete ret.escrowSeo;\n        delete ret.armyMortgageSeo;\n        delete ret.installmentSeo;\n        delete ret.conciergeSeo;\n        delete ret.closedAreaSeo;\n        delete ret.apartmentsSeo;\n        delete ret.parkingSeo;\n        delete ret.ceilingHeightSeo;\n        delete ret.kitchenAreaRangeMinSeo;\n        delete ret.euroPlanningSeo;\n        delete ret.balconySeo;\n        delete ret.motherCapitalSeo;\n        delete ret.flatsSpecialEventsSeo;\n        delete ret.origin;\n        delete ret.geoSlugSeo;\n\n        return ret;\n    }\n}\n\nexport const convertParamsToGQLFilters = (params: INewBuildingSearchType) => ({\n    regionId: Number(params.region ?? ROSSIYA),\n    commissioning: params.commissioning,\n    rooms: params.rooms,\n    addressId: params.addressId,\n    metroId: params.metroId,\n    districtId: params.districtId,\n    newBuildingId: Array.isArray(params.newBuildingId) ? params.newBuildingId[0] : undefined,\n    developerId: params.developerId,\n    transportType: params.transportType,\n    maxMinutes: params.maxMinutes,\n    wallsType: params.wallsType,\n    parking: params.parking,\n    floorsTotalMin: params.floorsTotalMin,\n    floorsTotalMax: params.floorsTotalMax,\n    priceMin: params.priceMin,\n    priceMax: params.priceMax,\n    floorMin: params.floorMin,\n    floorMax: params.floorMax,\n    floorFirst: params.floorFirst,\n    floorLast: params.floorLast,\n    totalAreaRangeMin: params.totalAreaRangeMin,\n    totalAreaRangeMax: params.totalAreaRangeMax,\n    livingAreaRangeMin: params.livingAreaRangeMin,\n    livingAreaRangeMax: params.livingAreaRangeMax,\n    kitchenAreaRangeMin: params.kitchenAreaRangeMin,\n    ceilingHeight: params.ceilingHeight,\n    bathroom: params.bathroom,\n    balcony: params.balcony,\n    buildingClass: params.buildingClass,\n    hasFinishing: params.hasFinishing,\n    finishingType: params.finishingType,\n    standalone: params.standalone,\n    apartments: params.apartments,\n    concierge: params.concierge,\n    closedArea: params.closedArea,\n    guardedArea: params.guardedArea,\n    accreditedByVTB: params.accreditedByVTB,\n    law214: params.law214,\n    escrow: params.escrow,\n    armyMortgage: params.armyMortgage,\n    installment: params.installment,\n    motherCapital: params.motherCapital,\n    priceType: params.priceType,\n    closedSales: params.closedSales,\n    mapBounds: params.mapBounds,\n    flatsSpecialEvents: params.flatsSpecialEvents,\n    otherSpecialEvents: params.otherSpecialEvents,\n    miscSpecialEvents: params.miscSpecialEvents,\n    notOnlyM2Pro: params.notOnlyM2Pro,\n});\n","import { SusaninRoute } from '@search/router/src/susanin/SusaninRoute';\n\nimport { regionMapper } from './mappers/regions/regionMapper';\nimport { RouterContext } from './RouterProvider';\n\nexport abstract class ClassifiedRoute<External, Internal, Defaults = unknown> extends SusaninRoute<\n    External, Internal, RouterContext, Defaults\n> {\n    protected patternHost(): string {\n        return '(<origin>)';\n    }\n\n    protected conditions() {\n        return {\n            origin: 'https?://[^\\/]+'\n        };\n    }\n\n    protected regionSlugHost(regionId: number) {\n        let result = super.regionSlugHost(regionId);\n\n        if (result) return result;\n\n        const parentId = this.context.rootRegions?.byId(regionId)?.narrowRegion?.id;\n\n        if (parentId) result = super.regionSlugHost(parentId);\n\n        return result;\n    }\n\n    regionId(regionSlug?: string | null) {\n        let regionId = regionSlug ? this.context.rootRegions?.bySlug(regionSlug)?.id : undefined;\n\n        if (! regionId) regionId = this.hostParts()?.regionId;\n\n        return regionId;\n    }\n\n    regionSlugPath(regionId: number) {\n        const regGeo = this.context.rootRegions?.byId(regionId);\n\n        return regGeo?.translit ??\n            regionMapper.seoFromTypeOptional(regionId) ??\n            regionMapper.seoFromTypeOptional(this.regionIdDefault());\n    }\n}\n","import { createRouterProvider, RouterProviderProps } from '@search/router/src/react/createRouterProvider';\nimport type { SlugMapper } from '@search/geo/src/SlugMapper';\n\nexport type IRootRegions = {\n    byId(id: number): { translit?: string | null; narrowRegion?: {id: number} | null } | undefined;\n    bySlug(slug: string): { id: number } | undefined;\n    slugs: SlugMapper;\n};\n\nexport type RouterContext = {\n    urlMapper?(src: string): string | undefined;\n    isMobile?: boolean;\n    isServer?: boolean;\n    isCanonical?: boolean;\n    onlyRelativeUrl?: boolean;\n    preferRelativeUrl?: boolean;\n    rootRegions?: IRootRegions;\n}\n\nexport type RouterProviderAppProps = RouterProviderProps<RouterContext>;\n\nconst { RouterProvider, useRouter } = createRouterProvider<RouterContext>();\n\nexport { RouterProvider, useRouter };\n","// import { Bathroom } from '../../view/enums/Bathroom';\nimport { SeoMapper } from '@search/router/src';\n\nexport const parkingsMapper = new SeoMapper('parkingsMapper', {\n    UNKNOWN: 'UNKNOWN',\n    CLOSED: 'CLOSED',\n    UNDERGROUND: 'UNDERGROUND',\n    OPEN: 'OPEN'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const livingTenantMapper = new SeoMapper('livingTenantMapper', {\n    UNKNOWN: 'UNKNOWN',\n    CHILDREN_ALLOWED: 'CHILDREN_ALLOWED',\n    PETS_ALLOWED: 'PETS_ALLOWED',\n} as const);\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { SeoMapper } from '@search/router/src';\n\nexport const sortOffersMapper = new SeoMapper('sortOffersMapper', {\n    '': 'unknown',\n    date: 'date',\n    timeToMetro: 'timeToMetro',\n    room: 'room',\n    floor: 'floor',\n    totalArea: 'totalArea',\n    price: 'price',\n    date_asc: 'date_asc',\n    timeToMetro_desc: 'timeToMetro_desc',\n    room_desc: 'room_desc',\n    floor_desc: 'floor_desc',\n    totalArea_desc: 'totalArea_desc',\n    price_desc: 'price_desc',\n    priceSqMeter: 'priceSqMeter',\n    priceSqMeter_desc: 'priceSqMeter_desc',\n    distanceToCityCenter: 'distanceToCityCenter',\n    updateDate_desc: 'updateDate_desc',\n    updateDate: 'updateDate'\n} as const);\n\nexport type SortOffersType =\n    'unknown'\n    | 'date'\n    | 'timeToMetro'\n    | 'room' | 'floor'\n    | 'totalArea'\n    | 'price'\n    | 'date_asc'\n    | 'timeToMetro_desc'\n    | 'room_desc'\n    | 'floor_desc'\n    | 'totalArea_desc'\n    | 'price_desc'\n    | 'priceSqMeter'\n    | 'priceSqMeter_desc'\n    | 'distanceToCityCenter'\n    | 'updateDate_desc'\n    | 'updateDate'\n    | undefined\n;\n","import { SeoMapper } from '@search/router/src';\n\nexport const windowsDirectionMapper = new SeoMapper('windowsDirectionMapper', {\n    BOTH: 'BOTH',\n    REAR: 'REAR',\n    FRONT: 'FRONT',\n    UNKNOWN: 'UNKNOWN'\n} as const);\n","import { s } from '@search/router/src/schema/schema';\n\nimport {\n    authorTypeMapper, bankPledgeMapper, bathroomMapper, categoryTypeMapper, dealTypeMapper,\n    furnitureMapper, layoutImageMapper, livingFacilityMapper, newBuildingMapper,\n    renovationMapper, roomMapper, sellTypeMapper, wallsMapper, buildEpochMapper,\n    finishingMapper\n} from '../mappers';\nimport { newBuildingTypeMapper } from '../mappers/newBuilding/mappers';\nimport { windowsDirectionMapper } from '../mappers/windowsDirectionMapper';\nimport { sortOffersMapper } from '../mappers/sortOffersMapper';\nimport { parkingsMapper } from '../mappers/parkingsMapper';\nimport { livingTenantMapper } from '../mappers/livingTenantMapper';\n\nexport const SearchSeoType = s.rec({\n    seoSeg1: s.nullOpt(s.str),\n    seoSeg2: s.nullOpt(s.str),\n    seoSegPrice: s.nullOpt(s.str),\n    geoSlug1: s.nullOpt(s.str),\n    geoSlug2: s.nullOpt(s.str),\n    origin: s.nullOpt(s.str),\n    region: s.nullOpt(s.str),\n\n    renovation: s.maybeArray(renovationMapper.SeoType),\n    finishingType: s.maybeArray(finishingMapper.SeoType),\n    commissioning: s.nullOpt(s.str),\n    renovationSegment: s.nullOpt(renovationMapper.SeoType),\n    metroIds: s.maybeArray(s.str),\n    metroSegment: s.nullOpt(s.str),\n    metroBranch: s.nullOpt(s.str),\n    newSegment: s.nullOpt(newBuildingMapper.SeoType),\n    newBuilding: s.maybeArray(newBuildingMapper.SeoType),\n    bankPledgeOptionsSegment: s.nullOpt(bankPledgeMapper.SeoType),\n    bankPledgeOptions: s.nullOpt(bankPledgeMapper.SeoType),\n    apartments: s.nullOpt(s.str),\n    houseCategory: s.maybeArray(s.str),\n    houseCategorySegment: s.nullOpt(s.str),\n    cotedjSegment: s.nullOpt(s.str),\n    rayon: s.nullOpt(s.str),\n    okrug: s.nullOpt(s.str),\n\n    room: s.nullOpt(s.str),\n    rooms: s.maybeArray(roomMapper.SeoType),\n    roomsInOffer: s.maybeArray(s.str),\n    addresses: s.maybeArray(s.str),\n    geohash: s.nullOpt(s.str),\n    districtIds: s.maybeArray(s.str),\n    newBuildingIds: s.maybeArray(s.str),\n\n    newBuildingId: s.nullOpt(s.str),\n    newBuildingType: s.nullOpt(newBuildingTypeMapper.SeoType),\n    newBuildingName: s.nullOpt(s.str),\n\n    dealType: s.nullOpt(dealTypeMapper.SeoType),\n    categoryType: s.nullOpt(categoryTypeMapper.SeoType),\n\n    totalAreaMin: s.nullOpt(s.str),\n    totalAreaMax: s.nullOpt(s.str),\n\n    landAreaMin: s.nullOpt(s.str),\n    landAreaMax: s.nullOpt(s.str),\n\n    houseAreaMin: s.nullOpt(s.str),\n    houseAreaMax: s.nullOpt(s.str),\n    bathroomLocation: s.maybeArray(s.str),\n\n    priceMin: s.nullOpt(s.str),\n    priceMax: s.nullOpt(s.str),\n    mortgagePayment: s.nullOpt(s.str),\n    priceMaxSegment: s.nullOpt(s.str),\n    priceUnit: s.nullOpt(s.str),\n\n    livingAreaMin: s.nullOpt(s.str),\n    livingAreaMax: s.nullOpt(s.str),\n\n    kitchenAreaMin: s.nullOpt(s.str),\n    kitchenAreaMax: s.nullOpt(s.str),\n\n    seoSegBuildEpoch: s.nullOpt(s.str),\n    builtYearMin: s.nullOpt(s.str),\n    builtYearMax: s.nullOpt(s.str),\n\n    floorMin: s.nullOpt(s.str),\n    floorMax: s.nullOpt(s.str),\n\n    last: s.nullOpt(s.str),\n    first: s.nullOpt(s.str),\n\n    floorsTotalMin: s.nullOpt(s.str),\n    floorsTotalMax: s.nullOpt(s.str),\n\n    cellHeight: s.nullOpt(s.str),\n\n    bathroom: s.maybeArray(bathroomMapper.SeoType),\n    bathroomSegment: s.nullOpt(bathroomMapper.SeoType),\n    landStatus: s.maybeArray(s.str),\n    landStatusSegment: s.nullOpt(s.str),\n\n    heating: s.maybeArray(s.str),\n    gas: s.maybeArray(s.str),\n    water: s.maybeArray(s.str),\n    electricity: s.maybeArray(s.str),\n    sewerage: s.maybeArray(s.str),\n    communications: s.nullOpt(s.str),\n\n    // @deprecated use transport & transportTimeLimit\n    transportType: s.nullOpt(s.str),\n    // @deprecated use transport & transportTimeLimit\n    timeLimit: s.nullOpt(s.str),\n\n    transport: s.nullOpt(s.str),\n    transportTimeLimit: s.nullOpt(s.str),\n    nearMetroSegment: s.nullOpt(s.str),\n\n    livingFacility: s.maybeArray(livingFacilityMapper.SeoType),\n    furniture: s.maybeArray(furnitureMapper.SeoType),\n    livingTenantOptions: s.maybeArray(livingTenantMapper.SeoType),\n    utilitiesIncluded: s.nullOpt(s.str),\n    depositType: s.nullOpt(s.str),\n    commisionType: s.nullOpt(s.str),\n    rentPrepayment: s.nullOpt(s.str),\n    rentPrepaymentSegment: s.nullOpt(s.str),\n    walls: s.maybeArray(wallsMapper.SeoType),\n    parkings: s.maybeArray(parkingsMapper.SeoType),\n    parkingsSegment: s.nullOpt(s.str),\n    author: s.maybeArray(authorTypeMapper.SeoType),\n    userId: s.nullOpt(s.str),\n    authorSegment: s.nullOpt(s.str),\n    sellType: s.maybeArray(sellTypeMapper.SeoType),\n    balcony: s.nullOpt(s.str),\n    photoOptions: s.nullOpt(s.str),\n    layoutImageOptions: s.maybeArray(layoutImageMapper.SeoType),\n    renovationProgram: s.nullOpt(s.str),\n    nearbyOptions: s.nullOpt(s.str),\n    sellerOrganizationName: s.nullOpt(s.str),\n\n    infrastructure: s.maybeArray(s.str),\n\n    hasLift: s.nullOpt(s.str),\n    seoMortgageAllowed: s.nullOpt(s.str),\n    seoMortgageAllowedSegment: s.nullOpt(s.str),\n\n    windowsDirection: s.maybeArray(windowsDirectionMapper.SeoType),\n\n    buildEpoch: s.maybeArray(buildEpochMapper.SeoType),\n\n    onlineView: s.nullOpt(s.str),\n\n    selectedOffers: s.maybeArray(s.str),\n    pageNumber: s.nullOpt(s.str),\n    pageSize: s.nullOpt(s.str),\n    sort: s.nullOpt(sortOffersMapper.SeoType),\n\n    x: s.opt(s.str),\n    y: s.opt(s.str),\n    z: s.opt(s.str),\n\n    lx: s.opt(s.str),\n    ly: s.opt(s.str),\n    rx: s.opt(s.str),\n    ry: s.opt(s.str),\n    pol: s.opt(s.str),\n\n    citySegment: s.opt(s.str)\n});\n","import { s } from '@search/router/src/schema/schema';\n\nimport {\n    authorTypeMapper, bankPledgeMapper, bathroomMapper, categoryTypeMapper, dealTypeMapper,\n    furnitureMapper, layoutImageMapper, livingFacilityMapper, newBuildingMapper,\n    renovationMapper, roomMapper, sellTypeMapper, wallsMapper, buildEpochMapper, finishingMapper\n} from '../mappers';\nimport { livingTenantMapper } from '../mappers/livingTenantMapper';\nimport { newBuildingTypeMapper } from '../mappers/newBuilding/mappers';\nimport { parkingsMapper } from '../mappers/parkingsMapper';\nimport { sortOffersMapper } from '../mappers/sortOffersMapper';\nimport { windowsDirectionMapper } from '../mappers/windowsDirectionMapper';\nimport { mskMetroBranchMapper } from '../mappers/regions/msk';\n\nexport const SearchType = s.rec({\n    segments: s.opt(s.rec({\n        isGetEmpty: s.bool,\n        infrastructure: s.nullOpt(s.list(s.str)),\n        balcony: s.nullOpt(s.str),\n        hasLift: s.nullOpt(s.str),\n        kitchenAreaMin: s.nullOpt(s.num),\n        tagCount: s.num,\n        rooms: s.list(roomMapper.Type),\n        addresses: s.list(s.num),\n        districtIds: s.list(s.num),\n        nearMetroSegment: s.opt(s.str),\n        metroIds: s.list(s.num),\n        metroBranch: s.nullOpt(mskMetroBranchMapper.Type),\n        floorMax: s.nullOpt(s.num),\n        floorMin: s.nullOpt(s.num),\n        floorsTotalMin: s.nullOpt(s.num),\n        floorsTotalMax: s.nullOpt(s.num),\n        cellHeight: s.nullOpt(s.str),\n        totalAreaMax: s.nullOpt(s.num),\n        renovation: s.list(renovationMapper.Type),\n        last: s.nullOpt(s.str),\n        nearbyOptions: s.nullOpt(s.str),\n        renovationProgram: s.nullOpt(s.str),\n        newBuilding: s.list(newBuildingMapper.Type),\n        bankPledgeOptions: s.nullOpt(bankPledgeMapper.Type),\n        apartments: s.nullOpt(s.str),\n        bathroom: s.list(bathroomMapper.Type),\n        furniture: s.list(furnitureMapper.Type),\n        parkings: s.list(parkingsMapper.Type),\n        author: s.list(authorTypeMapper.Type),\n        seoMortgageAllowed: s.opt(s.bool),\n        houseCategory: s.list(s.str),\n        landStatus: s.list(s.str),\n        bathroomLocation: s.nullOpt(s.list(s.str)),\n        rentPrepayment: s.nullOpt(s.str),\n        heating: s.nullOpt(s.list(s.str)),\n        gas: s.nullOpt(s.list(s.str)),\n        water: s.nullOpt(s.list(s.str)),\n        electricity: s.nullOpt(s.list(s.str)),\n        sewerage: s.nullOpt(s.list(s.str)),\n        communications: s.nullOpt(s.str),\n        priceMax: s.opt(s.num),\n        priceMin: s.opt(s.num),\n        transport: s.opt(s.str),\n        transportTimeLimit: s.opt(s.str),\n        landAreaMin: s.nullOpt(s.num),\n        landAreaMax: s.nullOpt(s.num),\n        builtYearMin: s.opt(s.num),\n        builtYearMax: s.opt(s.num)\n    })),\n    geoSlugs: s.opt(s.list(s.str)),\n    seoMortgageAllowed: s.opt(s.bool),\n    region: s.num,\n    rooms: s.list(roomMapper.Type),\n    roomsInOffer: s.list(s.num),\n    renovation: s.list(renovationMapper.Type),\n    finishingType: s.list(finishingMapper.Type),\n    commissioning: s.nullOpt(s.str),\n\n    addresses: s.list(s.num),\n    metroIds: s.list(s.num),\n    metroBranch: s.nullOpt(mskMetroBranchMapper.Type),\n    districtIds: s.list(s.num),\n    newBuildingIds: s.list(s.num),\n\n    newBuildingType: s.opt(newBuildingTypeMapper.Type),\n    newBuildingName: s.opt(s.str),\n\n    dealType: dealTypeMapper.Type,\n    categoryType: categoryTypeMapper.Type,\n\n    totalAreaMin: s.nullOpt(s.num),\n    totalAreaMax: s.nullOpt(s.num),\n\n    landAreaMin: s.nullOpt(s.num),\n    landAreaMax: s.nullOpt(s.num),\n\n    houseCategory: s.list(s.str),\n    houseAreaMin: s.nullOpt(s.num),\n    houseAreaMax: s.nullOpt(s.num),\n    bathroomLocation: s.nullOpt(s.list(s.str)),\n\n    priceMin: s.nullOpt(s.num),\n    priceMax: s.nullOpt(s.num),\n    mortgagePayment: s.nullOpt(s.num),\n    priceUnit: s.nullOpt(s.str),\n\n    livingAreaMin: s.nullOpt(s.num),\n    livingAreaMax: s.nullOpt(s.num),\n\n    kitchenAreaMin: s.nullOpt(s.num),\n    kitchenAreaMax: s.nullOpt(s.num),\n\n    builtYearMin: s.nullOpt(s.num),\n    builtYearMax: s.nullOpt(s.num),\n\n    floorMin: s.nullOpt(s.num),\n    floorMax: s.nullOpt(s.num),\n\n    last: s.nullOpt(s.str),\n    first: s.nullOpt(s.str),\n\n    floorsTotalMin: s.nullOpt(s.num),\n    floorsTotalMax: s.nullOpt(s.num),\n\n    cellHeight: s.nullOpt(s.str),\n\n    newBuilding: s.list(newBuildingMapper.Type),\n    bathroom: s.list(bathroomMapper.Type),\n\n    landStatus: s.list(s.str),\n\n    heating: s.list(s.str),\n    gas: s.list(s.str),\n    water: s.list(s.str),\n    electricity: s.list(s.str),\n    sewerage: s.list(s.str),\n\n    // @deprecated use transport & transportTimeLimit\n    transportType: s.nullOpt(s.str),\n    // @deprecated use transport & transportTimeLimit\n    timeLimit: s.nullOpt(s.str),\n\n    transport: s.nullOpt(s.str),\n    transportTimeLimit: s.nullOpt(s.str),\n\n    livingFacility: s.list(livingFacilityMapper.Type),\n    furniture: s.list(furnitureMapper.Type),\n    livingTenantOptions: s.list(livingTenantMapper.Type),\n    utilitiesIncluded: s.nullOpt(s.bool),\n    depositType: s.nullOpt(s.str),\n    commisionType: s.nullOpt(s.str),\n    rentPrepayment: s.nullOpt(s.str),\n    walls: s.list(wallsMapper.Type),\n    parkings: s.list(parkingsMapper.Type),\n    author: s.list(authorTypeMapper.Type),\n    userId: s.nullOpt(s.str),\n    sellType: s.list(sellTypeMapper.Type),\n    balcony: s.nullOpt(s.str),\n    photoOptions: s.nullOpt(s.str),\n    renovationProgram: s.nullOpt(s.str),\n    nearbyOptions: s.nullOpt(s.str),\n    sellerOrganizationName: s.nullOpt(s.str),\n    layoutImageOptions: s.list(layoutImageMapper.Type),\n    bankPledgeOptions: s.nullOpt(bankPledgeMapper.Type),\n    apartments: s.nullOpt(s.str),\n    infrastructure: s.nullOpt(s.list(s.str)),\n    hasLift: s.nullOpt(s.str),\n\n    windowsDirection: s.list(windowsDirectionMapper.Type),\n\n    buildEpoch: s.list(buildEpochMapper.Type),\n\n    onlineView: s.nullOpt(s.str),\n\n    pageNumber: s.num,\n    pageSize: s.num,\n    sort: s.opt(sortOffersMapper.Type),\n\n    tile: s.opt(s.rec({\n        x: s.num,\n        y: s.num,\n        z: s.num\n    })),\n    selectedOffers: s.opt(s.list(s.str)),\n    mapBounds: s.opt(s.rec({\n        geohash: s.opt(s.str),\n        bounds: s.opt(s.rec({\n            min: s.rec({\n                x: s.num,\n                y: s.num\n            }),\n            max: s.rec({\n                x: s.num,\n                y: s.num\n            })\n        })),\n        polygon: s.opt(s.list(s.rec({\n            x: s.num,\n            y: s.num\n        })))\n    })),\n    utm_source: s.opt(s.str),\n    utm_medium: s.opt(s.str),\n    utm_campaign: s.opt(s.str),\n    utm_content: s.opt(s.str),\n    utm_term: s.opt(s.str),\n});\n","import { DealType } from '@search/filter-enums/enums/DealType';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\n\nexport const searchDefaults = {\n    dealType: DealType.SELL,\n    categoryType: RealtyObjectType.FLAT,\n    priceUnit: 'ALL',\n    rooms: [],\n    layoutImageOptions: [],\n    roomsInOffer: [],\n    renovation: [],\n    addresses: [],\n    metroIds: [],\n    districtIds: [],\n    newBuildingIds: [],\n    pageNumber: 1,\n    pageSize: 20 as number,\n    // sort: undefined,\n    newBuilding: [],\n    bathroom: [],\n    livingFacility: [],\n    furniture: [],\n    finishingType: [],\n    livingTenantOptions: [],\n    walls: [],\n    parkings: [],\n    author: [],\n    houseCategory: [],\n    bathroomLocation: [],\n    heating: [],\n    sellType: [],\n    infrastructure: [],\n    landStatus: [],\n    gas: [],\n    water: [],\n    electricity: [],\n    sewerage: [],\n    windowsDirection: [],\n    buildEpoch: []\n} as const;\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable max-len */\nimport { SeoChpuMapper } from '@search/router/src';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { DealType } from '@search/filter-enums/enums';\n\nexport type TSearchSeoChpuMapper = ReturnType<typeof SearchSeoChpuMapper.chpuMap>;\ntype SearchSeoChpuMapperKeys = (keyof TSearchSeoChpuMapper)[];\n\nconst floorArr = [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ] as const;\nconst areArr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 20, 25, 30, 40, 50, 100 ] as const;\n\ntype TFloorMap = { [x in `${typeof floorArr[number]}-etazh`]?: { floorMin: number; floorMax: number} };\ntype TAreMap = { [x in `${typeof areArr[number]}-sotok`]?: { landAreaMin?: number; landAreaMax: number} };\n\nconst generateFloorMap = ({ returnParams }: { returnParams?: boolean }) => floorArr.reduce(\n    (prev, cur: typeof floorArr[number]) => {\n        prev[`${cur}-etazh`] = returnParams ? { floorMax: cur, floorMin: cur } : undefined;\n        return prev;\n    },\n    {} as TFloorMap\n);\n\nexport const generateAreChpuMap = ({ returnParams }: { returnParams?: boolean }) => areArr.reduce(\n    (prev, cur: typeof areArr[number]) => {\n        if (cur === 1 && returnParams) prev[`${cur}-sotok`] = { landAreaMax: cur };\n        prev[`${cur}-sotok`] = returnParams ? { landAreaMin: cur, landAreaMax: cur } : undefined;\n        return prev;\n    },\n    {} as TAreMap\n);\n\nexport class SearchSeoChpuMapper extends SeoChpuMapper<typeof SearchSeoChpuMapper.chpuMap> {\n    static chpuKeys = Object.keys(SearchSeoChpuMapper.chpuMap()) as SearchSeoChpuMapperKeys;\n\n    extraTagWeight = new Map([\n        [ 's-gazom-i-vodoj', 2 ],\n    ]);\n\n    tagsIntersection = new Map<SearchSeoChpuMapperKeys[number], string[]>([\n        [ 's-gazom-i-vodoj', [ 's-gazom', 's-vodoj' ] ],\n        [ 'cottage', [ 's-otopleniem', 's-vodoj', 's-kanalizacziej', 's-elektrichestvom' ] ],\n    ]);\n\n    static euroKitchenArea = 17;\n\n    // eslint-disable-next-line complexity\n    static chpuMap(ctx: {\n        categoryType?: RealtyObjectType;\n        dealType?: DealType;\n        apartments?: string | null;\n        rooms?: readonly Rooms[];\n        kitchenAreaMin?: string | null | number;\n        last?: string | null | number;\n        livingTenantOptions?: readonly ('UNKNOWN' | 'CHILDREN_ALLOWED' | 'PETS_ALLOWED')[] | null;\n        commisionType?: string | null;\n    } = {}) {\n        const isFlat = ctx.categoryType === RealtyObjectType.FLAT;\n        // const isSell = ctx.dealType === DealType.SELL;\n        const isRent = ctx.dealType === DealType.RENT;\n        const isHouse = ctx.categoryType === RealtyObjectType.HOUSE;\n        const isLand = ctx.categoryType === RealtyObjectType.LAND;\n        const isApartments = ctx.apartments === 'APARTMENTS_ONLY';\n        const isEuroLayout = ctx.rooms?.length === 1 && [ Rooms.ROOM_1, Rooms.ROOM_2, Rooms.ROOM_3 ].includes(ctx.rooms[0]) && Number(ctx.kitchenAreaMin) === this.euroKitchenArea;\n        const isLastFloor = ctx.last === 'ONLY';\n        const isChpuDeposite = ctx.dealType === DealType.RENT &&\n            ctx.commisionType !== 'NO_CLIENT_COMMISSION' &&\n            ! ctx.livingTenantOptions?.includes('PETS_ALLOWED') &&\n            ! ctx.livingTenantOptions?.includes('CHILDREN_ALLOWED');\n\n        return {\n            'vysokie-potolki': { cellHeight: 'FROM_3' },\n            '1-etazh': isLastFloor ? undefined : { floorMax: 1 },\n            'poslednij-etazh': { last: 'ONLY' },\n            'bolshaya-kukhnya': { kitchenAreaMin: 15 },\n            renovacziya: { renovationProgram: 'HAS_ANY' },\n            'okhrana-territorii': { infrastructure: [ 'CLOSED_AREA' ] },\n            's-konserzhem': { infrastructure: [ 'CONCIERGE' ] },\n            'ryadom-shkola': { nearbyOptions: 'GOOD_SCHOOL' },\n            evroodnushka: ! isApartments && isFlat ? { rooms: [ Rooms.ROOM_1 ], kitchenAreaMin: this.euroKitchenArea } : undefined,\n            evrodvushka: ! isApartments && isFlat ? { rooms: [ Rooms.ROOM_2 ], kitchenAreaMin: this.euroKitchenArea } : undefined,\n            evrotreshka: ! isApartments && isFlat ? { rooms: [ Rooms.ROOM_3 ], kitchenAreaMin: this.euroKitchenArea } : undefined,\n            malogabaritnaya: isFlat ? { totalAreaMax: 29 } : undefined,\n            's-liftom': { hasLift: 'HAS_ANY' },\n            's-balkonom': { balcony: 'HAS_ANY' },\n            apartamenty: isFlat && ! isEuroLayout ? { apartments: 'APARTMENTS_ONLY' } : undefined,\n            's-sanuzlom': { bathroomLocation: [ 'INSIDE' ] },\n            's-otopleniem': isHouse ? { heating: [ 'HAS_ANY' ] } : undefined,\n            's-gazom': isHouse || isLand ? { gas: [ 'HAS_ANY' ] } : undefined,\n            's-vodoj': isHouse || isLand ? { water: [ 'HAS_ANY' ] } : undefined,\n            's-elektrichestvom': isHouse || isLand ? { electricity: [ 'HAS_ANY' ] } : undefined,\n            's-kanalizacziej': isHouse || isLand ? { sewerage: [ 'HAS_ANY' ] } : undefined,\n            's-gazom-i-vodoj': isHouse || isLand ? { water: [ 'HAS_ANY' ], gas: [ 'HAS_ANY' ] } : undefined,\n            's-kommunikaciyami': isHouse || isLand ? { water: [ 'HAS_ANY' ], gas: [ 'HAS_ANY' ], electricity: [ 'HAS_ANY' ], sewerage: [ 'HAS_ANY' ] } : undefined,\n            cottage: isHouse ?\n                {\n                    heating: [ 'HAS_ANY' ],\n                    water: [ 'HAS_ANY' ],\n                    sewerage: [ 'HAS_ANY' ],\n                    electricity: [ 'HAS_ANY' ],\n                    houseCategory: [ 'STANDALONE' ],\n                    landStatus: [ 'DNP', 'IZHS', 'SNT' ]\n                } :\n                undefined,\n            ...generateFloorMap({ returnParams: ! isLastFloor }),\n            ...generateAreChpuMap({ returnParams: isLand }),\n            odnoetazhnyj: isHouse ? { floorsTotalMax: 1 } : undefined,\n            dvuhetazhnyj: isHouse ? { floorsTotalMax: 2, floorsTotalMin: 2 } : undefined,\n            trekhetazhnyj: isHouse ? { floorsTotalMax: 3, floorsTotalMin: 3 } : undefined,\n            'bez-mebeli': isFlat || isHouse ? { furniture: [ 'NO' ] as ('NO' | 'ALL' | 'UNKNOWN' | 'KITCHEN')[] } : undefined,\n            's-mebelyu': isFlat || isHouse ? { furniture: [ 'ALL' ] as ('NO' | 'ALL' | 'UNKNOWN' | 'KITCHEN')[] } : undefined,\n            'dlya-postoyannogo-prozhivaniya': isHouse ? { houseCategory: [ 'STANDALONE' ] } : undefined,\n            'bez-komissii': isRent ? { commisionType: 'NO_CLIENT_COMMISSION' } : undefined,\n            's-zhivotnymi': isRent ? { livingTenantOptions: [ 'PETS_ALLOWED' ] as ('UNKNOWN' | 'PETS_ALLOWED' | 'CHILDREN_ALLOWED')[] } : undefined,\n            's-detmi': isRent ? { livingTenantOptions: [ 'CHILDREN_ALLOWED' ] as ('UNKNOWN' | 'PETS_ALLOWED' | 'CHILDREN_ALLOWED')[] } : undefined,\n            'bez-zaloga': isChpuDeposite ? { depositType: 'NO_DEPOSIT' } : undefined,\n        };\n    }\n}\n\n// new SearchSeoChpuMapper({}).toChpu({}).chpuParams\n// new SearchSeoChpuMapper({}).toChpu({\n//     rooms: [] as readonly[]\n// });\n","import { s, SusaninRoute } from '@search/router/src';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { RouterContext } from '../RouterProvider';\n\nconst PhoneCallType = s.rec({\n    offerId: s.str\n});\n\nexport type IPhoneCallType = ReturnType<typeof PhoneCallType>;\n\nconst PhoneCallSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    offerId: s.str\n});\n\nexport type IPhoneCallSeoType = ReturnType<typeof PhoneCallSeoType>;\n\nexport class PhoneCallRoute extends SusaninRoute<IPhoneCallSeoType, IPhoneCallType, RouterContext> {\n    displayName = 'PhoneCallRoute';\n\n    protected metadata = PhoneCallSeoType.config;\n\n    static middlewareUrl = '/m/search/phone-call';\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    protected pattern(p: Tokens<IPhoneCallSeoType>) {\n        return `${this.patternHost()}/m/search/phone-call(/)`;\n    }\n\n    defaults() {\n        return {};\n    }\n\n    protected fromQuery(seo: IPhoneCallSeoType) {\n        return PhoneCallType({\n            offerId: seo.offerId\n        });\n    }\n\n    protected toQuery(p: IPhoneCallType) {\n        const offerId = p.offerId;\n\n        try {\n            return PhoneCallSeoType({\n                offerId\n            });\n        } catch (e) {\n            // @ts-expect-error\n            e.message += `, offerId: ${offerId}`;\n            throw e;\n        }\n    }\n}\n","import {\n    s,\n    SusaninRoute,\n    queryParamtoArray\n} from '@search/router/src';\nimport { Tokens } from '@search/router/src/RouterInterfaces';\nimport { RouterContext } from '../RouterProvider';\n\nconst UnsubscribeType = s.rec({\n    sid: s.list(s.str),\n    uid: s.str,\n    oid: s.opt(s.str)\n});\n\ntype IUnsubscribeType = ReturnType<typeof UnsubscribeType>;\n\nconst UnsubscribeSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    sid: s.list(s.str),\n    uid: s.str,\n    oid: s.opt(s.str)\n});\n\ntype IUnsubscribeSeoType = ReturnType<typeof UnsubscribeSeoType>;\n\nexport class UnsubscribeRoute extends SusaninRoute<IUnsubscribeSeoType, IUnsubscribeType, RouterContext> {\n    displayName = 'UnsubscribeRoute';\n\n    protected metadata = UnsubscribeSeoType.config;\n\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    protected pattern(p: Tokens<IUnsubscribeSeoType>) {\n        return `${this.patternHost()}/search/unsubscribe/`;\n    }\n\n    defaults() {\n        return {};\n    }\n\n    protected fromQuery(seo: IUnsubscribeSeoType) {\n        return UnsubscribeType({\n            sid: queryParamtoArray(seo.sid),\n            oid: seo.oid,\n            uid: seo.uid\n        });\n    }\n\n    protected toQuery({ sid, uid, oid }: IUnsubscribeType) {\n        try {\n            return UnsubscribeSeoType({\n                sid,\n                uid,\n                oid\n            });\n        } catch (e) {\n            // @ts-expect-error\n            e.message += `, searchId: ${sid}`;\n            throw e;\n        }\n    }\n}\n","export function dedupeValues(o: Record<string, number>) {\n    const keys = Object.keys(o) as (keyof typeof o)[];\n    const result = new Set<number>();\n\n    for (const key of keys) {\n        if (key.match(/\\d$/)) continue;\n\n        result.add(o[key]);\n    }\n\n    return Array.from(result);\n}\n","import { SeoMapper } from '@search/router/src';\nimport { AuthorTypeOptionsWithRealtor } from '@search/filter-enums/enums/AuthorTypeOptions';\n\nexport const authorTypeMapper = new SeoMapper('authorTypeMapper', {\n    unknown: AuthorTypeOptionsWithRealtor.UNKNOWN,\n    owner: AuthorTypeOptionsWithRealtor.OWNER,\n    agency: AuthorTypeOptionsWithRealtor.AGENCY,\n    developer: AuthorTypeOptionsWithRealtor.DEVELOPER,\n    partner: AuthorTypeOptionsWithRealtor.PARTNER,\n    realtor: AuthorTypeOptionsWithRealtor.REALTOR,\n    pit: AuthorTypeOptionsWithRealtor.PIT\n} as const);\n","import { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { SeoMapper } from '@search/router/src';\n\nexport const categoryTypeMapper = new SeoMapper('categoryTypeMapper', {\n    kvartiru: RealtyObjectType.FLAT,\n    komnatu: RealtyObjectType.ROOM,\n    unknown: RealtyObjectType.UNKNOWN,\n    uchastok: RealtyObjectType.LAND,\n    dom: RealtyObjectType.HOUSE,\n    usadba: RealtyObjectType.COUNTRY_ESTATE,\n    1: RealtyObjectType.FLAT,\n    2: RealtyObjectType.ROOM\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { DealType } from '@search/filter-enums/enums/DealType';\n\nexport const dealTypeMapper = new SeoMapper('dealTypeMapper', {\n    kupit: DealType.SELL,\n    snyat: DealType.RENT,\n    UNKNOWN: DealType.UNKNOWN,\n    // impl_not_set: DealType.UNKNOWN\n} as const);\n","import { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\nimport { SeoMapper } from '@search/router/src';\n\nexport const newBuildingMapper = new SeoMapper('newBuildingMapper', {\n    new: NewBuilding.NEW,\n    second: NewBuilding.SECOND,\n    unknown: NewBuilding.UNKNOWN\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { Renovation } from '@search/filter-enums/enums/Renovation';\n\nexport const renovationMapper = new SeoMapper('renovation', {\n    unknown: Renovation.UNKNOWN,\n    euro: Renovation.EURO,\n    cosmeticheskii: Renovation.COSMETIC,\n    disainerskii: Renovation.DESIGNED,\n    'nujen-remont': Renovation.NEED,\n    'net-remonta': Renovation.NONE\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\n\nexport const roomMapper = new SeoMapper('roomMapper', {\n    unknown: Rooms.UNKNOWN,\n    studiya: Rooms.STUDIO,\n    '1-komnata': Rooms.ROOM_1,\n    '2-komnaty': Rooms.ROOM_2,\n    '3-komnaty': Rooms.ROOM_3,\n    '4-komnaty': Rooms.ROOM_4,\n    '5-komnat_i_bolee': Rooms.ROOM_5_AND_MORE,\n    'svobodnaya-planirovka': Rooms.OPEN_PLAN\n    // 'hz-planirovka': 8\n} as const);\n","import { SeoMapper } from '@search/router/src';\nimport { SellType } from '@search/filter-enums/enums/SellType';\n\nexport const sellTypeMapper = new SeoMapper('sellTypeMapper', {\n    unknown: SellType.UNKNOWN,\n    secondary_primary: SellType.SECONDARY_PRIMARY,\n    secondary: SellType.SECONDARY,\n    primary_reassignment: SellType.PRIMARY_REASSIGNMENT,\n    primary: SellType.PRIMARY,\n    alternative: SellType.ALTERNATIVE\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const bathroomMapper = new SeoMapper('bathroomMapper', {\n    'razdelnyj-sanuzel': 'PARTED',\n    'sovmeshhennyj-sanuzel': 'COMBINED',\n    'hz-kakoi-sanuzel': 'UNKNOWN',\n    'neskolko-sanuzlov': 'SEVERAL'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const wallsMapper = new SeoMapper('wallsMapper', {\n    UNKNOWN: 'UNKNOWN',\n    MONOLITH: 'MONOLITH',\n    BRICK_MONOLITH: 'BRICK_MONOLITH',\n    BRICK: 'BRICK',\n    PANEL: 'PANEL',\n    BLOCK: 'BLOCK',\n    WOOD: 'WOOD'\n} as const);\n","// import { Bathroom } from '../../view/enums/Bathroom';\nimport { SeoMapper } from '@search/router/src';\n\nexport const livingFacilityMapper = new SeoMapper('livingFacilityMapper', {\n    UNKNOWN: 'UNKNOWN',\n    INTERNET: 'INTERNET',\n    WASHING_MACHINE: 'WASHING_MACHINE',\n    FRIDGE: 'FRIDGE',\n    DISHWASHER: 'DISHWASHER',\n    AIR_CONDITIONER: 'AIR_CONDITIONER',\n    TV: 'TV',\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const furnitureMapper = new SeoMapper('furnitureMapper', {\n    UNKNOWN: 'UNKNOWN',\n    NO: 'NO',\n    KITCHEN: 'KITCHEN',\n    ALL: 'ALL'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const bankPledgeMapper = new SeoMapper('bankPledgeMapper', {\n    'v-zaloge': 'IN_PLEDGE',\n    notInPledge: 'NOT_IN_PLEDGE',\n    unknown: 'UNKNOWN'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const layoutImageMapper = new SeoMapper('layoutImageMapper', {\n    HAS_ANY: 'HAS_ANY',\n    UNKNOWN: 'UNKNOWN'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const buildEpochMapper = new SeoMapper('buildEpochMapper', {\n    unknown: 'UNKNOWN',\n    stalin: 'STALIN',\n    brezhnev: 'BREZHNEV',\n    khrushchev: 'KHRUSHCHEV'\n} as const);\n","import { SeoMapper } from '@search/router/src';\n\nexport const finishingMapper = new SeoMapper('finishingMapper', {\n    UNKNOWN: 'UNKNOWN',\n    WITHOUT_FINISHING: 'WITHOUT_FINISHING',\n    PRE_FINISHING: 'PRE_FINISHING',\n    FINE: 'FINE',\n    WITH_FURNITURE: 'WITH_FURNITURE'\n} as const);\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { SeoMapper } from '@search/router/src/schema/SeoMapper';\nimport { BuildingClass } from '@search/filter-enums/enums/BuildingClass';\nimport { WallsTypeString } from '@search/filter-enums/enums/WallsType';\nimport { FloorConstraintsString } from '@search/filter-enums/enums/FloorConstraints';\nimport { FinishingEnum, FinishingTypeEnum, FinishingFlatEnum } from '@search/filter-enums/gql/schema-types-fix';\nimport { IsApartmentsOptionsString } from '@search/filter-enums/enums/IsApartmentsOptions';\nimport { ParkingTypeString } from '@search/filter-enums/enums/ParkingType';\nimport { CeilingHeightString } from '@search/filter-enums/enums/CeilingHeight';\nimport { FlatsSpecialEventString } from '@search/filter-enums/enums/SpecialEvents';\n\nexport const YES = 'YES';\n\nexport const roomMapper = new SeoMapper('roomsMapper', {\n    studii: 'STUDIO',\n    '1-komnatnye': 'ROOM_1',\n    '2-komnatnye': 'ROOM_2',\n    '3-komnatnye': 'ROOM_3',\n    '4-komnatnye': 'ROOM_4',\n    '5-komnatnye-i-bolee': 'ROOM_5_AND_MORE',\n    'so-svobodnoy-planirovkoy': 'OPEN_PLAN'\n} as const);\n\nexport const quarterMapper = new SeoMapper('quarterMapper', {\n    UNKNOWN: 0,\n    FIRST: 1,\n    SECOND: 2,\n    THIRD: 3,\n    FOURTH: 4\n} as const);\n\nexport const finishingFlatMapper = new SeoMapper('finishingFlatMapper', {\n    '': FinishingFlatEnum.NotRelevant,\n    YES: FinishingFlatEnum.Available,\n    NO: FinishingFlatEnum.NotAvailable\n} as const);\n\n// eslint-disable-next-line max-len\nexport const sOtdelkoySeoValue = [ FinishingTypeEnum.Fine, FinishingTypeEnum.PreFinishing, FinishingTypeEnum.WithFurniture ];\n\nexport const finishingMapper = new SeoMapper('finishingMapper', {\n    '': FinishingEnum.NotRelevant,\n    's-otdelkoy': FinishingEnum.Available,\n    'bez-otdelki': FinishingEnum.NotAvailable // оставляем, т.к. такое ЧПУ ещё существует и нам нужно учитывать этот ключ\n} as const);\n\nexport const finishingTypeMapper = new SeoMapper('finishingTypeMapper', {\n    chistovaya: FinishingTypeEnum.Fine,\n    's-mebelyu': FinishingTypeEnum.WithFurniture,\n    'pod-klyuch': FinishingTypeEnum.Fine, // заменяем на чистовую, т.к. такого фильтра больше нет, но ЧПУ может встречаться\n    '': FinishingTypeEnum.PreFinishing,\n    'bez-otdelki': FinishingTypeEnum.WithoutFinishing // для ts\n} as const);\n\nexport const buildingClassMapper = new SeoMapper('buildingClassMapper', {\n    biznes: BuildingClass.BUSINESS,\n    komfort: BuildingClass.COMFORT,\n    'komfort-plus': BuildingClass.COMFORT_PLUS,\n    ekonom: BuildingClass.ECONOMY,\n    elitnyy: BuildingClass.ELITE\n});\n\nexport const wallsTypeMapper = new SeoMapper('wallsTypeMapper', {\n    kirpichnye: WallsTypeString.BRICK,\n    monolitnye: WallsTypeString.MONOLITH,\n    'kirpichno-monolitnye': WallsTypeString.BRICK_MONOLITH,\n    panelnye: WallsTypeString.PANEL,\n    blochnye: WallsTypeString.BLOCK\n});\n\nexport const floorLastMapper = new SeoMapper('floorLastMapper', {\n    'na-poslednem-etazhe': FloorConstraintsString.ONLY,\n    'ne-na-poslednem-etazhe': FloorConstraintsString.EXCLUDE\n});\n\nexport const law214Mapper = new SeoMapper('law214Mapper', {\n    '214-fz': YES\n});\n\nexport const escrowMapper = new SeoMapper('escrowMapper', {\n    'eskrou-scheta': YES\n});\n\nexport const armyMortgageMapper = new SeoMapper('armyMortgageMapper', {\n    'voennaya-ipoteka': YES\n});\n\nexport const installmentMapper = new SeoMapper('installmentMapper', {\n    'v-rassrochku': YES\n});\n\nexport const commissioningMapper = new SeoMapper('commissioningMapper', {\n    sdan: 'COMMISSIONED',\n    stroitsya: 'IN_PROGRESS',\n    lyuboy: 'UNKNOWN'\n});\n\nexport const newBuildingTypes = [ 'zhk', 'zhiloi-raion', 'apart-kompleks', 'apart-otel', 'kvartal',\n    'loft', 'mfk', 'rezidentsiya', 'mikroraion', 'dom', 'klubnii-dom' ];\nexport const newBuildingTypeMapper = new SeoMapper('newBuildingTypeMapper', {\n    zhk: 'zhk',\n    'zhiloi-raion': 'zhiloi-raion',\n    'apart-kompleks': 'apart-kompleks',\n    'apart-otel': 'apart-otel',\n    kvartal: 'kvartal',\n    loft: 'loft',\n    mfk: 'mfk',\n    rezidentsiya: 'rezidentsiya',\n    mikroraion: 'mikroraion',\n    dom: 'dom',\n    'klubnii-dom': 'klubnii-dom'\n} as const);\n\nexport const developerAppLandingMapper = new SeoMapper('developerAppLandingMapper', {\n    'samolet-app': 'samolet',\n} as const);\n\nexport const developerLandingMapper = new SeoMapper('developerLandingMapper', {\n    samolet: 114,\n} as const);\n\nexport const priceMaxMapper = new SeoMapper('priceMaxMapper', {\n    'do-1-mln-rub': 1e6,\n    'do-1,5-mln-rub': 1.5e6,\n    'do-2-mln-rub': 2e6,\n    'do-3-mln-rub': 3e6,\n    'do-3,5-mln-rub': 3.5e6,\n    'do-4-mln-rub': 4e6,\n    'do-5-mln-rub': 5e6,\n    'do-6-mln-rub': 6e6,\n    'do-7-mln-rub': 7e6,\n    'do-8-mln-rub': 8e6,\n    'do-10-mln-rub': 10e6,\n    'do-15-mln-rub': 15e6,\n    'do-20-mln-rub': 20e6\n});\n\nexport const pricePerMeterMaxMapper = new SeoMapper('pricePerMeterMaxMapper', {\n    '100000-rub-za-m2': 100e3,\n    '150000-rub-za-m2': 150e3,\n    '200000-rub-za-m2': 200e3,\n    '250000-rub-za-m2': 250e3\n});\n\nexport const cheapMapper = new SeoMapper('cheapMapper', {\n    deshevyye: 8e6\n});\n\nexport const closeToMetroMapper = new SeoMapper('closeToMetroMapper', {\n    'ryadom-s-metro': 'FOOT|MAX_20_MINUTES'\n});\n\nexport const closedAreaMapper = new SeoMapper('closedAreaMapper', {\n    's-zakrytoj-territoriej': YES\n});\n\nexport const conciergeMapper = new SeoMapper('conciergeMapper', {\n    's-konserzhem': YES\n});\n\nexport const balconyMapper = new SeoMapper('balconyMapper', {\n    's-balkonom': YES\n});\n\nexport const motherCapitalMapper = new SeoMapper('motherCapitalMapper', {\n    'materinskij-kapital': YES\n});\n\nexport const parkingMapper = new SeoMapper('parkingMapper', {\n    'parkovka-podzemnaya': ParkingTypeString.UNDERGROUND,\n    's-parkovkoi': ParkingTypeString.AVAILABLE,\n    'parkovka-zakrytaya': ParkingTypeString.CLOSED,\n    'parkovka-otkrytaya': ParkingTypeString.OPEN\n});\n\nexport const apartmentsMapper = new SeoMapper('apartmentsMapper', {\n    apartamenty: IsApartmentsOptionsString.APARTMENTS_ONLY,\n    'bez-apartamentov': IsApartmentsOptionsString.NO_APARTMENTS\n});\n\nexport const ceilingHeightMapper = new SeoMapper('ceilingHeightMapper', {\n    'vysokie-potolki': CeilingHeightString.FROM_3\n});\n\nexport const kitchenAreaRangeMinMapper = new SeoMapper('kitchenAreaRangeMinMapper', {\n    'bolshaya-kukhnya': 15\n});\n\nexport const euroPlanningMapper = new SeoMapper('euroPlanningMapper', {\n    evrodvushki: 'ROOM_1|17',\n    evrotreshki: 'ROOM_2|17'\n});\n\nexport const flatsSpecialEventMapper = new SeoMapper('flatsSpecialEventMapper', {\n    'po-skidke': FlatsSpecialEventString.FLAT_DISCOUNT,\n    'na-starte-prodazh': FlatsSpecialEventString.FLAT_SALES_START\n});\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskMetroBranchMapper = new SeoMapper('mskMetroLinesMapper', {\n    'kaluzhsko-rizhskaya': 158,\n    zamoskvoretskaya: 58,\n    'serpukhovsko-timiryazevskaya': 264,\n    'arbatsko-pokrovskaya': 101,\n    'tagansko-krasnopresnenskaya': 155,\n    'lyublinsko-dmitrovskaya': 271,\n    solncevskaya: 234,\n    sokolnicheskaya: 4,\n    mck: 305,\n    'mcd-1': 169286,\n    'mcd-2': 169288\n} as const);\n\nexport const stationsIdsByBranchSeo = new Map([\n    [\n        'zamoskvoretskaya',\n        [ 59, 62, 98, 96, 94, 91, 92, 89, 84, 83, 80, 14571, 79, 77, 76, 75, 74, 73, 72, 71, 69, 67, 65, 64 ]\n    ],\n    [\n        'sokolnicheskaya',\n        [ 1842, 56, 54, 51, 49, 44, 43, 41, 39, 36, 35, 34, 33, 31, 28, 25, 24, 22, 21, 19, 18, 14, 12, 11, 9, 5 ]\n    ],\n    [\n        'serpukhovsko-timiryazevskaya',\n        [ 299, 298, 296, 294, 293, 291, 290, 288, 287, 285, 284, 283, 282,\n            281, 280, 279, 278, 277, 275, 274, 272, 270, 268, 267, 265 ]\n    ],\n    [\n        'kaluzhsko-rizhskaya',\n        [ 200, 199, 197, 194, 191, 189, 188, 186, 184, 181, 3500, 152,\n            180, 179, 178, 177, 159, 176, 174, 172, 170, 168, 166, 163 ]\n    ],\n    [\n        'arbatsko-pokrovskaya',\n        [ 129, 130, 131, 133, 134, 136, 137, 138, 14568, 14567, 128,\n            123, 102, 105, 106, 107, 110, 112, 114, 118, 120, 117 ]\n    ],\n    [\n        'tagansko-krasnopresnenskaya',\n        [ 230, 229, 228, 226, 224, 222, 220, 217, 216, 156, 215, 214,\n            213, 179, 212, 211, 1067, 210, 208, 207, 205, 203, 201 ]\n    ],\n    [\n        'lyublinsko-dmitrovskaya',\n        [ 169312, 169345, 169350, 331, 330, 328, 327, 324, 322, 321, 319, 318, 317,\n            316, 315, 314, 313, 312, 311, 309, 307, 6478, 3227, 303, 301, 272 ]\n    ],\n    [\n        'solncevskaya',\n        [ 169341, 169321, 235, 238, 240, 242, 244,\n            246, 248, 249, 250, 251, 120, 253 ]\n    ],\n    [\n        'mck',\n        [ 14593, 7450, 944, 4286, 4633, 6474, 14596, 14595, 8431, 1095, 3890, 14594,\n            1191, 8240, 8954, 14598, 7772, 1899, 14597, 306, 2155, 726,\n            4695, 3483, 4644, 2630, 2603, 145, 332, 3192, 270 ]\n    ],\n    [\n        'mcd-1',\n        [ 169374, 169362, 169348, 169292, 169287, 169330, 169296, 118,\n            169366, 169336, 169379, 169382, 274, 169291, 169327, 169322, 169364,\n            169343, 169365, 169357, 169381, 169376, 169298, 169358, 211 ]\n    ],\n    [\n        'mcd-2',\n        [ 169302, 169289, 169361, 169340, 169303, 169306, 169307, 169331, 169373,\n            169319, 926048, 169359, 169294, 169311, 169324, 169368, 169300, 169349,\n            169325, 169353, 578220, 169309, 169372, 169371, 169308, 169315, 169314,\n            169380, 169290, 169297, 169333, 309, 3483, 319, 220, 1095, 129 ]\n    ],\n]);\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskOblCity = {\n    balashikha: 511,\n    dubna: 6152,\n    aprelevka: 2345,\n    bronnitsy: 1581,\n    vidnoe: 700,\n    volokolamsk: 8342,\n    voskresensk: 4299,\n    vysokovsk: 8022,\n    golitsyno: 7628,\n    dedovsk: 4124,\n    dzerzhinskiy: 8923,\n    dmitrov: 3280,\n    dolgoprudniy: 811,\n    domodedovo: 949,\n    drezna: 32255,\n    egorevsk: 23338,\n    zhukovskiy: 778,\n    zvenigorod: 971,\n    ivanteevka: 482,\n    istra: 2775,\n    kashira: 1220,\n    klin: 4068,\n    kolomna: 460996,\n    korolyov: 526,\n    kotelniki: 232,\n    krasnoarmeysk: 3986,\n    krasnogorsk: 643,\n    krasnozavodsk: 15489,\n    krasnoznamensk: 16975,\n    kubinka: 46933,\n    'likino-dulyovo': 19625,\n    lobnya: 498,\n    'losino-petrovskiy': 6082,\n    lukhovitsy: 31429,\n    lytkarino: 806,\n    lyubertsy: 571,\n    mozhaisk: 6417,\n    mytischi: 516,\n    'naro-fominsk': 7784,\n    noginsk: 4901,\n    odintsovo: 1324,\n    ozyory: 20877,\n    'orekhovo-zuevo': 9142,\n    'pavlovskiy-posad': 31812,\n    podolsk: 1078,\n    protvino: 76951,\n    pushkino: 488335,\n    puschino: 8204,\n    ramenskoe: 629,\n    reutov: 830,\n    ruza: 7512,\n    'sergiev-posad': 1680,\n    serpukhov: 3290,\n    solnechnogorsk: 1723,\n    'staraya-kupavna': 1440,\n    stupino: 8488,\n    taldom: 499,\n    fryazino: 617,\n    khimki: 544,\n    khotkovo: 7576,\n    chekhov: 2359,\n    shatura: 8461,\n    schyolkovo: 601,\n    elektrogorsk: 77408,\n    elektrostal: 3436,\n    yakhroma: 1649\n};\n\nexport const mskCity = {\n    'novaya-moskva': 141530\n};\n\nexport const mskCityMapper = new SeoMapper('mskCityMapper', {\n    ...mskOblCity,\n    ...mskCity\n});\n\nexport const mskOblCityIds = Object.values(mskOblCity);\nexport const mskCityIds = Object.values(mskCity) as number[];\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskOblDistrict = {\n    'istra-gorodskoi': 948,\n    'bogorodskii-gorodskoi': 1438,\n    'volokolamskii-gorodskoi': 1075,\n    'dmitrovskii-gorodskoi': 921,\n    'kolomenskii-gorodskoi': 460995,\n    'leninskii-gorodskoi': 608,\n    'mozhaiskii-gorodskoi': 1235,\n    'naro-fominskii-gorodskoi': 1474,\n    'odintsovskii-gorodskoi': 487,\n    'orekhovo-zuevskii-gorodskoi': 2394,\n    'pushkinskii-gorodskoi': 488334,\n    'ramenskii-gorodskoi': 600,\n    'ruzskii-gorodskoi': 578,\n    'sergievo-posadskii-gorodskoi': 1156,\n    'taldomskii-gorodskoi': 497,\n    'balashikha-gorodskoi': 510,\n    'bronnitsi-gorodskoi': 1580,\n    'vlasikha-gorodskoi': 2764,\n    'voskresensk-gorodskoi': 3011,\n    'voskhod-gorodskoi': 14540,\n    'dzerzhinskii-gorodskoi': 8922,\n    'dolgoprudnii-gorodskoi': 809,\n    'domodedovo-gorodskoi': 947,\n    'dubna-gorodskoi': 6151,\n    'yegorevsk-gorodskoi': 9000,\n    'zhukovskii-gorodskoi': 777,\n    'zaraisk-gorodskoi': 8701,\n    'zvyozdnii-gorodok-gorodskoi': 14543,\n    'ivanteevka-gorodskoi': 481,\n    'kashira-gorodskoi': 1219,\n    'klin-gorodskoi': 1596,\n    'korolyov-gorodskoi': 525,\n    'kotelniki-gorodskoi': 231,\n    'krasnoarmeisk-gorodskoi': 3985,\n    'krasnogorsk-gorodskoi': 109,\n    'krasnoznamensk-gorodskoi': 4069,\n    'lobnya-gorodskoi': 495,\n    'losino-petrovskii-gorodskoi': 565,\n    'lotoshino-gorodskoi': 4104,\n    'lukhovitsi-gorodskoi': 14545,\n    'litkarino-gorodskoi': 805,\n    'lyubertsy-gorodskoi': 534,\n    'molodyozhnii-gorodskoi': 14546,\n    'mytischi-gorodskoi': 500,\n    'ozyori-gorodskoi': 14547,\n    'pavlovskii-posad-gorodskoi': 4049,\n    'podolsk-gorodskoi': 1077,\n    'protvino-gorodskoi': 14548,\n    'pushchino-gorodskoi': 8203,\n    'reutov-gorodskoi': 828,\n    'roshal-gorodskoi': 14550,\n    'serebryanie-prudi-gorodskoi': 6190,\n    'serpukhov-gorodskoi': 2805,\n    'solnechnogorsk-gorodskoi': 686,\n    'stupino-gorodskoi': 2940,\n    'fryazino-gorodskoi': 616,\n    'khimki-gorodskoi': 543,\n    'chernogolovka-gorodskoi': 2472,\n    'chekhov-gorodskoi': 1167,\n    'shatura-gorodskoi': 8460,\n    'shakhovskaya-gorodskoi': 1697,\n    'shchyolkovo-gorodskoi': 599,\n    'elektrogorsk-gorodskoi': 14551,\n    'elektrostal-gorodskoi': 3435\n} as const;\n\nexport const mskSpecialDistricts = {\n    'zelenogradskii-administrativnii': 381\n} as const;\n\nexport const mskDistrict = {\n    ...mskSpecialDistricts,\n    'vostochnii-administrativnii': 7,\n    'zapadnii-administrativnii': 37,\n    'novomoskovskii-administrativnii': 45,\n    'severnii-administrativnii': 60,\n    'severo-vostochnii-administrativnii': 164,\n    'severo-zapadnii-administrativnii': 103,\n    'troitskii-administrativnii': 414,\n    'tsentralnii-administrativnii': 15,\n    'yugo-vostochnii-administrativnii': 218,\n    'yugo-zapadnii-administrativnii': 182,\n    'yuzhnii-administrativnii': 81\n} as const;\n\nexport const mskDistrictMapper = new SeoMapper('mskDistrictMapper', {\n    ...mskOblDistrict,\n    ...mskDistrict\n} as const);\n\nexport const mskOblDistrictIds = Object.values(mskOblDistrict);\nexport const mskDistrictIds = Object.values(mskDistrict);\n","import { SeoMapper } from '@search/router/src';\nimport { dedupeValues } from '../../dedupeValues';\n\nexport const mskOblMetroStation = {\n    myakinino: 107\n} as const;\n\nexport const mskMetroStation = {\n    aeroport: 71,\n    akademicheskaya: 184,\n    'aleksandrovskii-sad': 151,\n    alekseevskaya: 174,\n    'alma-atinskaya': 98,\n    altufevo: 265,\n    aminevskaya: 169305,\n    andronovka: 3890,\n    anikeevka: 169290,\n    annino: 298,\n    arbatskaya: 14567,\n    arbatskaya2: 126,\n    aviamotornaya: 256,\n    aviamotornaya2: 256,\n    'aviamotornaya-2': 169339,\n    'aviamotornaya-3': 501821,\n    avtozavodskaya: 14596,\n    avtozavodskaya2: 80,\n    babushkinskaya: 166,\n    bagrationovskaya: 143,\n    bakovka: 169362,\n    balakovka: 169362,\n    baltiiskaya: 4695,\n    barrikadnaya: 213,\n    baumanskaya: 130,\n    begovaya: 211,\n    'begovaya-2': 169355,\n    belokamennaya: 7772,\n    belomorskaya: 62,\n    belorusskaya: 73,\n    belorusskaya2: 169379,\n    'belorusskaya-3': 14576,\n    belyaevo: 191,\n    beskudnikovo: 169322,\n    bibirevo: 267,\n    'biblioteka-imeni-lenina': 25,\n    bittsa: 169306,\n    'bittsevskii-park': 341,\n    borisovo: 328,\n    borovitskaya: 281,\n    'borovskoe-shosse': 240,\n    'botanicheskii-sad': 14597,\n    'botanicheskii-sad2': 170,\n    bratislavskaya: 324,\n    'bulvar-admirala-ushakova': 346,\n    'bulvar-dmitriya-donskogo': 299,\n    'bulvar-rokossovskogo': 14598,\n    'bulvar-rokossovskogo2': 5,\n    'buninskaya-alleya': 348,\n    'buninskaya-alleya-2': 285747,\n    butirskaya: 307,\n    butovo: 169303,\n    chekhovskaya: 280,\n    cherkizovskaya: 9,\n    chertanovskaya: 291,\n    'chistie-prudi': 21,\n    chkalovskaya: 314,\n    davidkovo: 169285,\n    degunino: 169327,\n    'delovoi-tsentr': 14593,\n    'delovoi-tsentr2': 253,\n    'delovoi-tsentr-3': 495007,\n    depo: 169294,\n    dinamo: 72,\n    dmitrovskaya: 275,\n    dmitrovskaya2: 169333,\n    dobrininskaya: 154,\n    dolgoprudnaya: 169357,\n    domodedovskaya: 94,\n    dostoevskaya: 311,\n    dubrovka: 14595,\n    dubrovka2: 317,\n    elektrozavodskaya: 131,\n    'elektrozavodskaya-2': 169342,\n    'elektrozavodskaya-3': 487162,\n    'filatov-lug': 51,\n    fili: 144,\n    fili2: 169366,\n    'filyovskii-park': 141,\n    fiztekh: 169350,\n    fonvizinskaya: 6478,\n    frunzenskaya: 33,\n    govorovo: 244,\n    grazhdanskaya: 169325,\n    izmailovo: 8240,\n    izmailovskaya: 136,\n    kakhovskaya: 339,\n    'kakhovskaya-2': 169375,\n    kalanchyovskaya: 169300,\n    kalitniki: 169324,\n    kaluzhskaya: 189,\n    kantemirovskaya: 89,\n    kashirskaya: 14571,\n    khlebnikovo: 169376,\n    khoroshyovo: 2603,\n    khoroshyovskaya: 333,\n    'khoroshyovskaya-2': 14587,\n    khovrino: 59,\n    kievskaya: 123,\n    'kievskaya-2': 14569,\n    'kievskaya-3': 14575,\n    'kitai-gorod': 179,\n    'kitai-gorod-2': 14589,\n    'klenovii-bulvar': 169367,\n    kolomenskaya: 84,\n    kommunarka: 1842,\n    komsomolskaya: 18,\n    'komsomolskaya-2': 14581,\n    konkovo: 194,\n    koptevo: 726,\n    kosino: 351,\n    kotelniki: 230,\n    kozhukhovskaya: 318,\n    'krasnie-vorota': 19,\n    'krasnii-baltiets': 169353,\n    'krasnii-stroitel': 169307,\n    krasnogorskaya: 169314,\n    krasnogvardeiskaya: 96,\n    krasnopresnenskaya: 162,\n    krasnoselskaya: 14,\n    'krestyanskaya-zastava': 316,\n    krilatskoe: 112,\n    krimskaya: 4286,\n    kropotkinskaya: 28,\n    kubanskaya: 169311,\n    kuntsevskaya: 117,\n    kuntsevskaya2: 169296,\n    'kuntsevskaya-3': 14590,\n    'kuntsevskaya-4': 169301,\n    kurskaya: 129,\n    'kurskaya-2': 169310,\n    'kurskaya-3': 14574,\n    kutuzovskaya: 145,\n    'kutuzovskaya-2': 14592,\n    kuzminki: 222,\n    'kuznetskii-most': 215,\n    lefortovo: 269422,\n    'lefortovo-2': 169326,\n    'leninskii-prospekt': 181,\n    'lermontovskii-prospekt': 228,\n    lesoparkovaya: 342,\n    lianozovo: 169345,\n    lianozovo2: 169364,\n    likhobori: 2155,\n    lobnya: 169358,\n    lokomotiv: 8954,\n    'lomonosovskii-prospekt': 250,\n    lubyanka: 22,\n    lukhmanovskaya: 355,\n    luzhniki: 7450,\n    lyublino: 322,\n    'marina-roshcha': 309,\n    'marina-roshcha-2': 169332,\n    marino: 327,\n    mark: 169343,\n    marksistskaya: 254,\n    mayakovskaya: 74,\n    medvedkovo: 163,\n    mendeleevskaya: 278,\n    mezhdunarodnaya: 147,\n    'michurinskii-prospekt': 248,\n    'michurinskii-prospekt-2': 169317,\n    minskaya: 251,\n    mitino: 105,\n    mnyovniki: 169316,\n    molodyozhnaya: 114,\n    'moskva-tovarnaya': 169368,\n    'moskva-tovarnaya-2': 235038,\n    moskvoreche: 169319,\n    nagatinskaya: 285,\n    'nagatinskii-zaton': 169304,\n    nagornaya: 287,\n    nakhabino: 169297,\n    'nakhimovskii-prospekt': 288,\n    'narodnoe-opolchenie': 169383,\n    nekrasovka: 356,\n    nemchinovka: 169292,\n    nizhegorodskaya: 3192,\n    'nizhegorodskaya-2': 169351,\n    'nizhegorodskaya-3': 169335,\n    novatorskaya: 169313,\n    'novie-cheryomushki': 188,\n    novodachnaya: 169365,\n    novogireevo: 261,\n    novokhokhlovskaya: 1095,\n    'novokhokhlovskaya-2': 169352,\n    novokosino: 262,\n    novokuznetskaya: 77,\n    novoperedelkino: 238,\n    novoslobodskaya: 161,\n    novoyasenevskaya: 200,\n    odintsovo: 169374,\n    'okhotnii-ryad': 24,\n    okruzhnaya: 3227,\n    okruzhnaya2: 169291,\n    okruzhnaya3: 306,\n    okskaya: 169360,\n    oktyabrskaya: 152,\n    'oktyabrskaya-2': 14573,\n    'oktyabrskoe-pole': 210,\n    olkhovaya: 56,\n    opalikha: 169380,\n    orekhovo: 92,\n    ostafevo: 169361,\n    otradnoe: 268,\n    ozyornaya: 246,\n    panfilovskaya: 4644,\n    'park-kulturi': 31,\n    'park-kulturi-2': 14582,\n    'park-pobedi': 120,\n    'park-pobedi-2': 14583,\n    partizanskaya: 134,\n    paveletskaya: 79,\n    'paveletskaya-2': 14570,\n    pavshino: 169315,\n    pechatniki: 319,\n    'pechatniki-2': 169338,\n    'pechatniki-3': 169354,\n    penyagino: 169308,\n    pererva: 169359,\n    perovo: 259,\n    pervomaiskaya: 137,\n    'petrovskii-park': 337,\n    'petrovskii-park-2': 14586,\n    'petrovsko-razumovskaya': 272,\n    'petrovsko-razumovskaya-2': 14579,\n    pikhtino: 169321,\n    pionerskaya: 140,\n    planernaya: 201,\n    'ploshchad-gagarina': 944,\n    'ploshchad-ilicha': 255,\n    'ploshchad-revolyutsii': 128,\n    podolsk: 169302,\n    pokrovskoe: 169331,\n    'pokrovskoe-streshnevo': 169347,\n    polezhaevskaya: 1067,\n    polyanka: 282,\n    novomoskovskaya: 169370,\n    prazhskaya: 294,\n    'preobrazhenskaya-ploshchad': 11,\n    profsoyuznaya: 186,\n    prokshino: 54,\n    proletarskaya: 216,\n    'prospekt-mira': 159,\n    'prospekt-mira-2': 14577,\n    'prospekt-vernadskogo': 39,\n    'prospekt-vernadskogo-2': 169299,\n    pushkinskaya: 214,\n    'pyatnitskoe-shosse': 102,\n    'rabochii-posyolok': 169330,\n    ramenki: 249,\n    rasskazovka: 235,\n    'rechnoi-vokzal': 64,\n    rimskaya: 315,\n    rizhskaya: 176,\n    'rizhskaya-2': 169349,\n    'rizhskaya-3': 169346,\n    rostokino: 1899,\n    rumyantsevo: 44,\n    'ryazanskii-prospekt': 224,\n    salarevo: 49,\n    savyolovskaya: 277,\n    savyolovskaya2: 169382,\n    'savyolovskaya-3': 14584,\n    'savyolovskaya-4': 14580,\n    seligerskaya: 301,\n    semyonovskaya: 133,\n    serpukhovskaya: 283,\n    setun: 169287,\n    sevastopolskaya: 290,\n    shabolovskaya: 3500,\n    shcherbinka: 169340,\n    shchukinskaya: 208,\n    'shchukinskaya-2': 578220,\n    shchyolkovskaya: 138,\n    shelepikha: 332,\n    'shelepikha-2': 1217,\n    'shelepikha-3': 14585,\n    sheremetevskaya: 169298,\n    shipilovskaya: 330,\n    'shosse-entuziastov': 14594,\n    'shosse-entuziastov2': 258,\n    silikatnaya: 169289,\n    skhodnenskaya: 203,\n    skolkovo: 169348,\n    'slavyanskii-bulvar': 118,\n    'slavyanskii-bulvar-2': 169328,\n    smolenskaya: 14568,\n    smolenskaya2: 124,\n    sokol: 69,\n    'sokolinaya-gora': 1191,\n    sokolniki: 12,\n    'sokolniki-2': 169295,\n    solntsevo: 242,\n    spartak: 207,\n    sportivnaya: 34,\n    'sretenskii-bulvar': 313,\n    stakhanovskaya: 169377,\n    streshnevo: 3483,\n    'streshnevo-2': 169378,\n    strogino: 110,\n    studencheskaya: 146,\n    sukharevskaya: 177,\n    sviblovo: 168,\n    taganskaya: 156,\n    'taganskaya-2': 14578,\n    teatralnaya: 76,\n    tekhnopark: 83,\n    tekstilshchiki: 220,\n    'tekstilshchiki-2': 169363,\n    'tekstilshchiki-3': 169356,\n    terekhovo: 169334,\n    testovskaya: 169336,\n    timiryazevskaya: 274,\n    timiryazevskaya2: 169318,\n    tretyakovskaya: 180,\n    'tretyakovskaya-2': 14572,\n    trikotazhnaya: 169372,\n    troparyovo: 43,\n    trubnaya: 312,\n    tsaritsino: 91,\n    tsaritsino2: 169373,\n    tsska: 335,\n    'tsska-2': 14588,\n    'tsvetnoi-bulvar': 279,\n    tulskaya: 284,\n    turgenevskaya: 178,\n    tushinskaya: 205,\n    tushinskaya2: 169309,\n    tverskaya: 75,\n    'tyoplii-stan': 197,\n    ugreshskaya: 8431,\n    'ulitsa-1905-goda': 212,\n    'ulitsa-800-letiya-moskvi': 169312,\n    'ulitsa-akademika-yangelya': 296,\n    'ulitsa-dmitrievskogo': 352,\n    'ulitsa-gorchakova': 347,\n    'ulitsa-skobelevskaya': 344,\n    'ulitsa-starokachalovskaya': 343,\n    universitet: 36,\n    varshavskaya: 169344,\n    'varshavskaya-2': 338,\n    vdnkh: 172,\n    'verkhnie-kotli': 4633,\n    'verkhnie-likhobori': 303,\n    vikhino: 226,\n    vistavochnaya: 150,\n    vladikino: 270,\n    'vladikino-2': 14591,\n    vnukovo: 169341,\n    'vodnii-stadion': 65,\n    vodniki: 169381,\n    voikovskaya: 67,\n    'volgogradskii-prospekt': 217,\n    volokolamskaya: 106,\n    volokolamskaya2: 169371,\n    volzhskaya: 321,\n    'vorobyovi-gori': 35,\n    voroncovskaya: 427507,\n    voroncovskaya2: 408984,\n    yasenevo: 199,\n    'yugo-vostochnaya': 169293,\n    'yugo-zapadnaya': 41,\n    yuzhnaya: 293,\n    zhulebino: 229,\n    zil: 6474,\n    zorge: 2630,\n    zyablikovo: 331,\n    zyuzino: 169329\n} as const;\n\nexport const mskMetroMapper = new SeoMapper('mskMetroMapper', {\n    ...mskOblMetroStation,\n    ...mskMetroStation\n} as const);\n\nexport const mskOblMetroIds = dedupeValues(mskOblMetroStation);\nexport const mskMetroIds = dedupeValues(mskMetroStation);\n","import { SeoMapper } from '@search/router/src';\n\nexport const mskOblRayon = {} as const;\n\nexport const mskRayon = {\n    bogorodskoe: 8,\n    sokolniki: 13,\n    golovinskiy: 66,\n    aeroport: 70,\n    brateevo: 99,\n    tsaritsino: 90,\n    'moskvoreche-saburovo': 88,\n    'fili-davidkovo': 119,\n    mitino: 104,\n    filyovskiy_park: 142,\n    taganskiy: 157,\n    meschanskiy: 160,\n    kuzminki: 223,\n    solntsevo: 243,\n    ostankinskiy: 173,\n    cheryomushki: 187,\n    zyuzino: 289,\n    beskudnikovskiy: 302,\n    chertanovo_severnoe: 292,\n    marina_roscha: 310,\n    pechatniki: 320,\n    khoroshyovskiy: 334,\n    veshnyaki: 364,\n    vostochnoe_izmailovo: 368,\n    koptevo: 379,\n    savyolki: 403,\n    yuzhnoe_medvedkovo: 411,\n    preobrazhenskoe: 10,\n    basmannyi: 20,\n    khovrino: 61,\n    strogino: 111,\n    severnoe_izmailovo: 139,\n    presnenskiy: 148,\n    severnoe_tushino: 202,\n    tekstilschiki: 221,\n    lefortovo: 257,\n    'ochakovo-matveevskoe': 247,\n    severnoe_medvedkovo: 165,\n    babushkinskiy: 167,\n    alekseevskiy: 175,\n    akademicheskiy: 185,\n    rostokino: 171,\n    konkovo: 192,\n    chertanovo_yuzhnoe: 297,\n    severnoe_butovo: 300,\n    yuzhnoe_butovo: 345,\n    nekrasovka: 357,\n    altufevskiy: 359,\n    biryulyovo_vostochnoe: 362,\n    vostochnyi: 369,\n    kurkino: 383,\n    losinoostrovskiy: 387,\n    kotlovka: 380,\n    lomonosovskiy: 386,\n    molzhaninovskiy: 394,\n    nizhegorodskiy: 397,\n    matushkino: 389,\n    'khoroshyovo-mnyovniki': 410,\n    staroe_kryukovo: 409,\n    metrogorodok: 2546,\n    krasnoselskiy: 16,\n    khamovniki: 29,\n    zamoskvoreche: 78,\n    prospekt_vernadskogo: 40,\n    zyablikovo: 97,\n    kuntsevo: 115,\n    sokolinaya_gora: 132,\n    yakimanka: 153,\n    'pokrovskoe-streshnevo': 206,\n    schukino: 209,\n    ryazanskiy: 225,\n    gagarinskiy: 183,\n    savyolovskiy: 276,\n    timiryazevskiy: 273,\n    novokosino: 263,\n    marino: 325,\n    vnukovo: 365,\n    biryulyovo_zapadnoe: 363,\n    golyanovo: 370,\n    dmitrovskiy: 371,\n    donskoi: 373,\n    marfino: 388,\n    lianozovo: 385,\n    mozhaiskiy: 393,\n    perovo: 401,\n    kryukovo: 382,\n    sokol: 407,\n    silino: 406,\n    arbat: 26,\n    tverskoi: 23,\n    danilovskiy: 82,\n    ramenki: 38,\n    'troparyovo-nikulino': 42,\n    levoberezhnyi: 63,\n    voikovskiy: 68,\n    'orekhovo-borisovo_yuzhnoe': 95,\n    'orekhovo-borisovo_severnoe': 93,\n    'nagatino-sadovniki': 85,\n    dorogomilovo: 121,\n    krilatskoe: 113,\n    izmailovo: 135,\n    yuzhnoe_tushino: 204,\n    'vyhino-zhulebino': 227,\n    yuzhnoportovyi: 219,\n    'novo-peredelkino': 239,\n    sviblovo: 169,\n    obruchevskiy: 190,\n    tyopliy_stan: 195,\n    yasenevo: 198,\n    bibirevo: 266,\n    novogireevo: 260,\n    otradnoe: 269,\n    nagornyi: 286,\n    chertanovo_tsentralnoe: 295,\n    zapadnoe_degunino: 304,\n    lyublino: 323,\n    butyrskiy: 308,\n    'kosino-ukhtomskiy': 353,\n    begovoi: 360,\n    vostochnoe_degunino: 366,\n    ivanovskoe: 375,\n    kapotnya: 376,\n    severnyi: 405,\n    yaroslavskiy: 412\n} as const;\n\nexport const mskRayonMapper = new SeoMapper('mskRayonMapper', {\n    ...mskOblRayon,\n    ...mskRayon\n} as const);\n\nexport const mskOblRayonIds = Object.values(mskOblRayon) as number[];\nexport const mskRayonIds = Object.values(mskRayon);\n","import { SeoMapper } from '@search/router/src';\n\nconst ekbMetroMapper = new SeoMapper('ekbMetroMapper', {\n    uralmash: 169323,\n    geologicheskaya: 3317,\n    botanicheskaya: 6291,\n    dinamo: 169337,\n    'ploshchad-1905-goda': 2059,\n    mashinostroitelei: 169320,\n    uralskaya: 1008,\n    'prospekt-kosmonavtov': 4829,\n    chkalovskaya: 6510\n});\n\nconst kznMetroMapper = new SeoMapper('kznMetroMapper', {\n    'severnii-vokzal': 5475,\n    'ploshchad-gabdulli-tukaya': 14623,\n    aviastroitelnaya: 14621,\n    'sukonnaya-sloboda': 14624,\n    yashlek: 14622,\n    ametevo: 5429,\n    'kozya-sloboda': 2269,\n    gorki: 2295,\n    dubravnaya: 14625,\n    kremlyovskaya: 2177,\n    'prospekt-pobedi': 3665\n});\n\nconst nskMetroMapper = new SeoMapper('nskMetroMapper', {\n    'marshala-pokrishkina': 4632,\n    oktyabrskaya: 4332,\n    studencheskaya: 3934,\n    'zolotaya-niva': 14601,\n    'ploshchad-marksa': 2156,\n    'beryozovaya-roshcha': 14600,\n    'rechnoi-vokzal': 3809,\n    'krasnii-prospekt': 4447,\n    sibirskaya: 14599,\n    'ploshchad-garina-mikhailovskogo': 4701,\n    'ploshchad-lenina': 14602,\n    gagarinskaya: 2988,\n    zaeltsovskaya: 1319\n});\n\nconst samaraMetroMapper = new SeoMapper('samaraMetroMapper', {\n    bezimyanka: 3346,\n    moskovskaya: 5732,\n    kirovskaya: 14605,\n    gagarinskaya: 14608,\n    yungorodok: 14604,\n    rossiiskaya: 14609,\n    pobeda: 14606,\n    sovetskaya: 14607,\n    alabinskaya: 4378,\n    sportivnaya: 3916\n});\n\nconst nnMetroMapper = new SeoMapper('nnMetroMapper', {\n    gorkovskaya: 1968,\n    'dvigatel-revolyutsii': 14613,\n    burevestnik: 14620,\n    leninskaya: 14612,\n    burnakovskaya: 2194,\n    kirovskaya: 14617,\n    avtozavodskaya: 14615,\n    kanavinskaya: 14619,\n    moskovskaya: 14610,\n    chkalovskaya: 14611,\n    strelka: 24659,\n    'park-kulturi': 4879,\n    proletarskaya: 14614,\n    zarechnaya: 5452,\n    komsomolskaya: 14616\n});\n\nexport function regionMetroSlugMapper(region: number) {\n    if (region === 1961) return nnMetroMapper;\n    if (region === 3339) return samaraMetroMapper;\n    if (region === 1310) return nskMetroMapper;\n    if (region === 2165) return kznMetroMapper;\n    if (region === 993) return ekbMetroMapper;\n}\n","import { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport { SeoMapper } from '@search/router/src';\nimport { isSpbWide, isMskWide } from '@search/helpers/src/isRegion';\nimport { mskDistrictMapper, mskMetroMapper } from './msk';\nimport { spbDistrictMapper, spbMetroMapper } from './spb';\nimport { mskCityMapper } from './msk/mskCityMapper';\nimport { spbCityMapper } from './spb/spbCityMapper';\nimport { regionMetroSlugMapper } from './regionMetroSlugMapper';\n\nexport const regionMapper = new SeoMapper('regionMapper', {\n    moskva: RegionIdEnum.MSK,\n    'moskva-i-oblast': RegionIdEnum.MSK_AND_MSK_OBL,\n    'sankt-peterburg-i-oblast': RegionIdEnum.SPB_AND_LEN_OBL,\n    'sankt-peterburg': RegionIdEnum.SPB,\n    'moskovskaya-oblast': RegionIdEnum.MSK_OBL,\n    'leningradskaya-oblast': RegionIdEnum.LEN_OBL\n} as const);\n\nexport function getMetroMapperByRegion(region: number) {\n    if (isMskWide(region)) return mskMetroMapper;\n    if (isSpbWide(region)) return spbMetroMapper;\n\n    return regionMetroSlugMapper(region);\n}\n\nexport function getDistrictMapperByRegion(\n    region: ReturnType<typeof regionMapper.Type>\n) {\n    if (isMskWide(region)) return mskDistrictMapper;\n    if (isSpbWide(region)) return spbDistrictMapper;\n}\n\nexport function getCityMapperByRegion(\n    region: number\n) {\n    if (isMskWide(region)) return mskCityMapper;\n    if (isSpbWide(region)) return spbCityMapper;\n}\n","import { SeoMapper } from '@search/router/src';\n\nexport const lenOblCity = {} as const;\n\nexport const spbInnerTowns = {\n    kolpino: 2258,\n    'krasnoe-selo': 4848,\n    kronshtadt: 7689,\n    zelenogorsk: 919,\n    sestroretsk: 2898,\n    lomonosov: 4983,\n    petergof: 469,\n    pavlovsk: 8095,\n    pushkin: 718\n};\n\nexport const spbInnerLocalities = {\n    pargolovo: 3925,\n    levashovo: 69835,\n    pontonniy: 41212,\n    'ust-izhora': 71536,\n    'petro-slavyanka': 71323,\n    sapyorniy: 72330,\n    metallostroi: 2273,\n    beloostrov: 47020,\n    komarovo: 47373,\n    molodyozhnoe: 69214,\n    pesochniy: 8678,\n    repino: 8420,\n    serovo: 74973,\n    smolyachkovo: 5329,\n    solnechnoe: 7879,\n    ushkovo: 75561,\n    strelna: 8680,\n    lisiy_nos: 8093,\n    shushary: 7659,\n    aleksandrovskaya: 57851,\n    tyarlevo: 55715\n};\n\nexport const spbCity = {\n    ...spbInnerTowns,\n    ...spbInnerLocalities\n};\n\nexport const spbCityMapper = new SeoMapper('spbCityMapper', {\n    ...lenOblCity,\n    ...spbCity\n});\n\nexport const lenOblCityIds = Object.values(lenOblCity) as number[];\nexport const spbCityIds = Object.values(spbCity);\n","import { SeoMapper } from '@search/router/src';\n\nexport const lenOblDistrict = {\n    boksitogorskii: 14552,\n    volosovskii: 4511,\n    volkhovskii: 4672,\n    vsevolozhskii: 887,\n    viborgskii_lo: 1060,\n    gatchinskii: 3486,\n    kingiseppskii: 4318,\n    kirishskii: 8525,\n    kirovskii_lo: 7811,\n    lodeinopolskii: 3598,\n    lomonosovskii: 996,\n    luzhskii: 4715,\n    podporozhskii: 14561,\n    priozerskii: 1376,\n    slantsevskii: 14564,\n    sosnovoborskii: 7860,\n    tikhvinskii: 7885,\n    tosnenskii: 1032\n} as const;\n\nexport const spbDistrict = {\n    admiralteiskii: 446,\n    vasileostrovskii: 448,\n    viborgskii: 450,\n    kalininskii: 451,\n    kirovskii: 453,\n    kolpinskii: 455,\n    krasnogvardeiskii: 456,\n    krasnoselskii: 458,\n    kronshtadtskii: 460,\n    kurortnii: 461,\n    moskovskii: 462,\n    nevskii: 464,\n    petrogradskii: 466,\n    petrodvortsovii: 468,\n    primorskii: 471,\n    pushkinskii: 473,\n    frunzenskii: 474,\n    tsentralnii: 476\n} as const;\n\nexport const spbDistrictMapper = new SeoMapper('spbDistrictMapper', {\n    ...lenOblDistrict,\n    ...spbDistrict\n} as const);\n\nexport const lenOblDistrictIds = Object.values(lenOblDistrict);\nexport const spbDistrictIds = Object.values(spbDistrict);\n","import { SeoMapper } from '@search/router/src';\nimport { dedupeValues } from '../../dedupeValues';\n\nexport const lenOblMetroStation = {\n    devyatkino: 894\n} as const;\n\nexport const spbMetroStation = {\n    avtovo: 7588,\n    admiralteiskaya: 5229,\n    akademicheskaya: 7502,\n    baltiiskaya: 4994,\n    begovaya: 2175,\n    bukharestskaya: 9366,\n    vasileostrovskaya: 2787,\n    vladimirskaya: 7834,\n    volkovskaya: 8359,\n    viborgskaya: 7573,\n    gorkovskaya: 8206,\n    'gostinii-dvor': 14627,\n    'grazhdanskii-prospekt': 6299,\n    dostoevskaya: 2208,\n    dunaiskaya: 1387,\n    elizarovskaya: 1005,\n    zvenigorodskaya: 7832,\n    zvyozdnaya: 2846,\n    'kirovskii-zavod': 8124,\n    'komendantskii-prospekt': 5611,\n    'krestovskii-ostrov': 6873,\n    kupchino: 4487,\n    ladozhskaya: 560,\n    'leninskii-prospekt': 7587,\n    lesnaya: 2125,\n    'ligovskii-prospekt': 5115,\n    lomonosovskaya: 3565,\n    mayakovskaya: 7882,\n    mezhdunarodnaya: 8418,\n    moskovskaya: 4847,\n    'moskovskie-vorota': 3434,\n    'nevskii-prospekt': 2247,\n    'obvodnii-kanal': 7968,\n    narvskaya: 3954,\n    // Old and new mapping for Zenit (Novokrestovskaya)\n    // First map entry (novokrestovskaya) keeps the link https://m2.ru/sankt-peterburg-i-oblast/nedvizhimost/kupit-kvartiru/metro-novokrestovskaya/ working\n    // Second entry is the main entry (the code is written in a such a way) - it is used for route building (when reverse mapping is needed) (e.g. build an url after selecting in geo suggest, build an url for sitemap)\n    novokrestovskaya: 7589,\n    zenit: 7589,\n    novocherkasskaya: 4784,\n    obukhovo: 3000,\n    ozerki: 2221,\n    parnas: 1234,\n    petrogradskaya: 6665,\n    pionerskaya: 3564,\n    'park-pobedi': 8147,\n    'ploshchad-aleksandra-nevskogo': 2845,\n    // These two are kept for backward compatibility only\n    'ploshchad-aleksandra-nevskogo-1': 2845,\n    'ploshchad-aleksandra-nevskogo-2': 2845,\n    'ploshchad-vosstaniya': 6231,\n    'ploshchad-lenina': 2136,\n    'ploshchad-muzhestva': 4480,\n    politekhnicheskaya: 7524,\n    primorskaya: 7539,\n    proletarskaya: 4578,\n    'prospekt-bolshevikov': 3413,\n    'prospekt-veteranov': 1150,\n    'prospekt-prosveshcheniya': 5096,\n    pushkinskaya: 2135,\n    ribatskoe: 1389,\n    sadovaya: 5435,\n    'sennaya-ploshchad': 9039,\n    spasskaya: 5252,\n    sportivnaya: 3953,\n    'staraya-derevnya': 5615,\n    'tekhnologicheskii-institut': 1338,\n    // These two are kept for backward compatibility only\n    'tekhnologicheskii-institut-1': 1338,\n    'tekhnologicheskii-institut-2': 1338,\n    udelnaya: 3691,\n    'ulitsa-dibenko': 5309,\n    frunzenskaya: 1189,\n    chernishevskaya: 1354,\n    chkalovskaya: 7572,\n    'chyornaya-rechka': 3401,\n    elektrosila: 4995,\n    'prospekt-slavy': 20613,\n    shushary: 67241,\n    'yugo-zapadnaya': 174415,\n    putylovskaya: 174417,\n    teatralnaya: 257084,\n    'gorniy-institut': 257085\n} as const;\n\nexport const spbMetroMapper = new SeoMapper('spbMetroMapper', {\n    ...lenOblMetroStation,\n    ...spbMetroStation\n} as const);\n\nexport const lenOblMetroIds = dedupeValues(lenOblMetroStation);\nexport const spbMetroIds = dedupeValues(spbMetroStation);\n","/* eslint-disable padding-line-between-statements */\n/* eslint-disable complexity */\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\n// @ts-nocheck\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { s, SchemaTypeError, Tokens } from '@search/router/src';\n\nimport { ClassifiedRoute } from '../ClassifiedRoute';\nimport { categoryTypeMapper, dealTypeMapper, newBuildingMapper, roomMapper } from '../mappers';\n\nconst OfferType = s.rec({\n    offerId: s.str,\n    slug: s.opt(s.str),\n    region: s.opt(s.num),\n    dealType: s.opt(dealTypeMapper.Type),\n    categoryType: s.opt(categoryTypeMapper.Type),\n    room: s.opt(roomMapper.Type),\n    newBuilding: s.opt(newBuildingMapper.Type),\n    mapBounds: s.opt(s.rec({\n        lx: s.num,\n        ly: s.num,\n        rx: s.num,\n        ry: s.num\n    }))\n});\n\nexport type IOfferType = ReturnType<typeof OfferType>;\n\nconst OfferSeoType = s.rec({\n    origin: s.nullOpt(s.str),\n    // offerId: s.str,\n    region: s.opt(s.str),\n    dealType: s.opt(dealTypeMapper.SeoType),\n    categoryType: s.opt(categoryTypeMapper.SeoType),\n    room: s.opt(roomMapper.SeoType),\n    newBuilding: s.opt(newBuildingMapper.SeoType),\n    lx: s.opt(s.str),\n    ly: s.opt(s.str),\n    rx: s.opt(s.str),\n    ry: s.opt(s.str),\n    slugAndId: s.str\n});\n\nexport type IOfferSeoType = ReturnType<typeof OfferSeoType>;\n\nconst offerDefaults = {\n    dealType: DealType.SELL,\n    categoryType: RealtyObjectType.FLAT,\n    newBuilding: NewBuilding.UNKNOWN\n} as const;\n\nconst dealReg = '(?<deal>prodazha|arenda)';\n\nconst realtyReg = '(?:(?<flat>kvartiri)|(?<room>komnat(?:i|a|noi)?)|(?<house>usadbi|doma)|(?<land>uchastka))';\n\nconst roomReg = '(?:(?<studio>studii)|(?:(?<rooms>[1-4])(-komnatnoi)?)' +\n    '|(?<multiroom>mnogokomnatnoi)|(?<openplan>so-svobodnoi-planirovkoi))';\n\nconst offerIdReg = '(?<offerId>[a-z,0-9]+(-[a-z,0-9]+){4,4})';\n\nconst slugRegExp = new RegExp(`(?:(?<slug>${dealReg}(?:-${roomReg})?-${realtyReg}(?:-.+)?)|(?:offer))?-${offerIdReg}$`);\n\nexport class OfferRoute extends ClassifiedRoute<IOfferSeoType, IOfferType> {\n    displayName = 'OfferRoute';\n\n    protected metadata = OfferSeoType.config;\n\n    protected pattern(p: Tokens<IOfferSeoType>) {\n        return `${this.patternHost()}(/${p.region})/nedvizhimost(/${p.dealType}-${p.categoryType})(/${p.room\n        })(/${p.newBuilding})/${p.slugAndId}/`;\n    }\n\n    protected extraPatterns(p: Tokens<IOfferSeoType>) {\n        return [\n            `${this.patternHost()}/search/${p.slugAndId}/`\n        ];\n    }\n\n    protected conditions() {\n        return {\n            ...super.conditions(),\n            room: roomMapper.keys,\n            categoryType: categoryTypeMapper.keys,\n            slugAndId: '(?:prodazha|arenda|offer)-.*',\n            dealType: dealTypeMapper.keys,\n            newBuilding: newBuildingMapper.keys\n        };\n    }\n\n    defaults() {\n        return offerDefaults;\n    }\n\n    protected fromQuery(seo: IOfferSeoType) {\n        const raw = OfferSeoType(seo);\n        const regionSlug = raw.region === 'search' ? 'moskva' : raw.region;\n\n        const region = regionSlug ? this.regionId(regionSlug) : undefined;\n\n        const p = raw.slugAndId.match(slugRegExp)?.groups;\n\n        if (! p?.offerId) {\n            throw new SchemaTypeError(`offer id not found, slugAndId: ${raw.slugAndId}`);\n        }\n\n        let dealType = DealType.SELL;\n\n        if (p.deal === 'arenda') dealType = DealType.RENT;\n\n        let categoryType = RealtyObjectType.FLAT;\n\n        if (p.room) categoryType = RealtyObjectType.ROOM;\n        if (p.house) categoryType = RealtyObjectType.HOUSE;\n        if (p.land) categoryType = RealtyObjectType.LAND;\n\n        let room: undefined | Rooms;\n\n        if (p.studio) room = Rooms.STUDIO;\n        if (p.rooms === '1') room = Rooms.ROOM_1;\n        if (p.rooms === '2') room = Rooms.ROOM_2;\n        if (p.rooms === '3') room = Rooms.ROOM_3;\n        if (p.rooms === '4') room = Rooms.ROOM_4;\n        if (p.multiroom) room = Rooms.ROOM_5_AND_MORE;\n        if (p.openplan) room = Rooms.OPEN_PLAN;\n\n        return ({\n            offerId: p.offerId,\n            region,\n            slug: p.slug,\n            dealType,\n            categoryType,\n            room,\n            mapBounds: raw.lx && raw.ly && raw.rx && raw.ry ? {\n                lx: Number(raw.lx),\n                ly: Number(raw.ly),\n                rx: Number(raw.rx),\n                ry: Number(raw.ry)\n            } : undefined\n        });\n    }\n\n    protected toQuery(p: IOfferType) {\n        // params = OfferType(params);\n        const offerId = p.offerId;\n        const slug = p.slug ?? 'offer';\n\n        try {\n            return OfferSeoType({\n                ...this.regionParams(p.region),\n                slugAndId: `${slug}-${offerId}`,\n                lx: p.mapBounds?.lx ? String(p.mapBounds.lx) : undefined,\n                ly: p.mapBounds?.ly ? String(p.mapBounds.ly) : undefined,\n                rx: p.mapBounds?.rx ? String(p.mapBounds.rx) : undefined,\n                ry: p.mapBounds?.ry ? String(p.mapBounds.ry) : undefined\n            });\n        } catch (e) {\n            // @ts-expect-error\n            e.message += `, offer: ${offerId}`;\n            throw e;\n        }\n    }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable max-len */\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { DealType } from '@search/filter-enums/enums/DealType';\n\ntype MatchParamsBase = {\n    dealType: DealType;\n    categoryType: RealtyObjectType;\n    builtYearMin?: number | null;\n    builtYearMax?: number | null;\n};\n\ntype MatchParams = MatchParamsBase & { seg?: string | null };\n\nexport class BuildEpochSeoMatcher {\n    static $ = new BuildEpochSeoMatcher();\n    protected map(): Record<string, readonly (MatchParamsBase)[]> {\n        return {\n            stalinka: [\n                { dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, builtYearMin: 1933, builtYearMax: 1956 },\n            ],\n            khrushchevka: [\n                { dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, builtYearMin: 1957, builtYearMax: 1969 },\n            ],\n            brezhnevka: [\n                { dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, builtYearMin: 1970, builtYearMax: 1980 },\n            ],\n        };\n    }\n\n    protected mapCached = Object.entries(this.map());\n\n    readonly chpuKeys = Object.keys(this.map());\n\n    matchAll(p: MatchParams, _isFirstMatch = false) {\n        const result = [] as { seg: string; params: MatchParamsBase }[];\n\n        for (const [ seg, variants ] of this.mapCached) {\n            if (p.seg && seg !== p.seg) continue;\n\n            let isSegAlreadyPushed = false;\n\n            for (const params of variants) {\n                if (isSegAlreadyPushed) continue;\n                if (p.categoryType !== params.categoryType) continue;\n                if (p.dealType !== params.dealType) continue;\n                if (p.builtYearMin && p.builtYearMin !== params.builtYearMin) continue;\n                if (p.builtYearMax && p.builtYearMax !== params.builtYearMax) continue;\n                if (p.builtYearMin === undefined || p.builtYearMax === undefined) continue;\n\n                result.push({ seg, params });\n                if (! isSegAlreadyPushed) isSegAlreadyPushed = true;\n                if (_isFirstMatch) return result;\n            }\n        }\n\n        return result;\n    }\n\n    match(p: MatchParams) {\n        const result = this.matchAll(p, true);\n\n        return result.length ? result[0] : undefined;\n    }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\ntype MatchParamsBase = {\n    dealType: DealType;\n    categoryType: RealtyObjectType;\n    priceMax?: number | null;\n    priceMin?: number | null;\n};\n\ntype MatchParams = MatchParamsBase & { region: number; regionTranslit?: string | null; seg?: string | null };\n\nexport class PriceSeoMatcher {\n    static $ = new PriceSeoMatcher();\n    protected map(): Record<string, readonly (MatchParamsBase & { region: (number | RegExp)[] })[]> {\n        const msk = [ RegionIdEnum.MSK, RegionIdEnum.MSK_AND_MSK_OBL, RegionIdEnum.MSK_OBL ];\n        const spb = [ RegionIdEnum.SPB, RegionIdEnum.SPB_AND_LEN_OBL, RegionIdEnum.LEN_OBL ];\n        const province = [] as number[];\n\n        return {\n            deshevye: [\n                { region: msk, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMax: 8500000 },\n                { region: spb, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMax: 5500000 },\n                { region: province, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMax: 3500000 },\n            ],\n            nedorogo: [\n                { region: msk, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMax: 25500 },\n                { region: spb, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMax: 25500 },\n                { region: province, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMax: 18000 },\n            ],\n            elitnye: [\n                { region: msk, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMin: 35000000 },\n                { region: spb, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMin: 25000000 },\n                { region: province, dealType: DealType.SELL, categoryType: RealtyObjectType.FLAT, priceMin: 10000000 },\n\n                { region: msk, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMin: 150000 },\n                { region: spb, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMin: 100000 },\n                { region: province, dealType: DealType.RENT, categoryType: RealtyObjectType.FLAT, priceMin: 80000 },\n            ],\n            dachu: [\n                { region: msk, dealType: DealType.SELL, categoryType: RealtyObjectType.HOUSE, priceMax: 6500000 },\n                { region: spb, dealType: DealType.SELL, categoryType: RealtyObjectType.HOUSE, priceMax: 6500000 },\n                { region: province, dealType: DealType.SELL, categoryType: RealtyObjectType.HOUSE, priceMax: 5200000 },\n\n                { region: msk, dealType: DealType.RENT, categoryType: RealtyObjectType.HOUSE, priceMax: 100000 },\n                { region: spb, dealType: DealType.RENT, categoryType: RealtyObjectType.HOUSE, priceMax: 100000 },\n            ],\n            'v-derevne': [\n                {\n                    region: [ RegionIdEnum.MSK_OBL, RegionIdEnum.LEN_OBL ],\n                    dealType: DealType.SELL,\n                    categoryType: RealtyObjectType.HOUSE,\n                    priceMax: 7500000\n                },\n                {\n                    region: [ /\\-oblast$/ ],\n                    dealType: DealType.SELL,\n                    categoryType: RealtyObjectType.HOUSE,\n                    priceMax: 5500000\n                },\n                {\n                    region: [ RegionIdEnum.MSK_OBL, RegionIdEnum.LEN_OBL ],\n                    dealType: DealType.SELL,\n                    categoryType: RealtyObjectType.LAND,\n                    priceMax: 7500000\n                },\n                {\n                    region: [ /\\-oblast$/ ],\n                    dealType: DealType.SELL,\n                    categoryType: RealtyObjectType.LAND,\n                    priceMax: 5500000\n                },\n            ],\n        };\n    }\n\n    protected mapCached = Object.entries(this.map());\n\n    readonly chpuKeys = Object.keys(this.map());\n\n    matchAll(p: MatchParams, _isFirstMatch = false) {\n        const result = [] as { seg: string; params: MatchParamsBase }[];\n\n        for (const [ seg, variants ] of this.mapCached) {\n            if (p.seg && seg !== p.seg) continue;\n\n            let isSegAlreadyPushed = false;\n\n            for (const params of variants) {\n                if (isSegAlreadyPushed) continue;\n                if (p.categoryType !== params.categoryType) continue;\n                if (p.dealType !== params.dealType) continue;\n                if (p.priceMax && p.priceMax !== params.priceMax) continue;\n                if (p.priceMin && p.priceMin !== params.priceMin) continue;\n                if (p.priceMax === undefined && p.priceMin === undefined) continue;\n\n                const matchedRegion = params.region.find(\n                    reg => reg instanceof RegExp && p.regionTranslit ?\n                        p.regionTranslit.match(reg) :\n                        reg === p.region\n                );\n\n                if (! matchedRegion && params.region.length !== 0) continue;\n\n                result.push({ seg, params });\n                if (! isSegAlreadyPushed) isSegAlreadyPushed = true;\n                if (_isFirstMatch) return result;\n            }\n        }\n\n        return result;\n    }\n\n    match(p: MatchParams) {\n        const result = this.matchAll(p, true);\n\n        return result.length ? result[0] : undefined;\n    }\n}\n","import { RegionIdEnum } from '../../enums';\n\nexport default [\n    {\n        fullName: 'Москва и Московская область',\n        label: 'Москва и область',\n        value: RegionIdEnum.MSK_AND_MSK_OBL\n    },\n    {\n        fullName: 'Москва',\n        label: 'Москва',\n        value: RegionIdEnum.MSK\n    },\n    {\n        fullName: 'Московская область',\n        label: 'Московская область',\n        value: RegionIdEnum.MSK_OBL\n    },\n    {\n        fullName: 'Санкт-Петербург и Ленинградская область',\n        label: 'Санкт-Петербург и область',\n        value: RegionIdEnum.SPB_AND_LEN_OBL\n    },\n    {\n        fullName: 'Санкт-Петербург',\n        label: 'Санкт-Петербург',\n        value: RegionIdEnum.SPB\n    },\n    {\n        fullName: 'Ленинградская область',\n        label: 'Ленинградская область',\n        value: RegionIdEnum.LEN_OBL\n    }\n];\n","export function getGtmLabel(value?: string) {\n    if (! value) return {};\n\n    return {\n        'data-gtm': value\n    };\n}\n","/* eslint-disable */\n// @ts-ignore\nwindow.Sentry = window.Sentry || undefined;\n","export type ExtractId<T> = T extends { id: infer Id } ? Id : never;\n\nexport function isPresent<T>(t: T | undefined | null | void): t is T {\n    return t !== undefined && t !== null;\n}\n\nexport function arrayToMap<Item extends { id: any }>(array: readonly Item[]) {\n    const map = new Map<ExtractId<Item>, Item>();\n\n    for (const item of array) map.set(item.id, item);\n    return map;\n}\n\ninterface Flavoring<FlavorT> {\n    _type?: FlavorT;\n  }\nexport type Flavor<T, FlavorT> = T & Flavoring<FlavorT>\n\nexport type NonMethods<O extends {}> = {\n    [P in keyof O]: O[P] extends (...args: any[]) => any ? never : O[P];\n};\n\nexport function titleSorter<T extends { title: string }>(a: T, b: T): number {\n    if (a.title > b.title) return 1;\n    if (a.title < b.title) return -1;\n    return 0;\n}\n\nexport class CopyObject {\n    copy(params: Partial<NonMethods<this>>): this {\n        let changed = false;\n        const next = Object.assign(new (this.constructor as any)(), this);\n\n        for (const key in params) {\n            if (params[key as keyof this] !== this[key as keyof this]) {\n                changed = true;\n                next[key] = params[key];\n            }\n        }\n\n        return changed ? next : this;\n    }\n}\n","import { useCallback } from 'react';\n\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport type {\n    useCallbackEmailMutation$variables as useCallbackEmailMutationVariables,\n    useCallbackEmailMutation$data as useCallbackEmailMutationResponse\n} from './__generated__/useCallbackEmailMutation.graphql';\n\nconst mutation = graphql`\n    mutation useCallbackEmailMutation(\n        $subject: String!\n        $body: String!\n        $emailRecipient: String\n    ) {\n        createEmailCallbackSimple(\n            subject: $subject\n            body: $body\n            emailRecipient: $emailRecipient\n        ) {\n            emailMessageId\n        }\n    }\n`;\n\nexport const useCallbackEmail = () => {\n    const gql = useGqlContext();\n\n    return useCallback(\n        (\n            vars: useCallbackEmailMutationVariables,\n            opts?: { signal?: AbortSignal; pathUniqSuffix?: String }\n        ) => gql.client<\n            useCallbackEmailMutationVariables,\n            useCallbackEmailMutationResponse\n        >(\n            mutation,\n            vars,\n            opts\n        ),\n        [ gql ]\n    );\n};\n","import {\n    TipAddress, TipTypeEnum\n} from '@search/graphql-typings';\n\nimport { GeoId } from './GeoBase';\nimport { Address } from './Address';\n\nexport class AddressStore {\n    protected items = new Map<GeoId, Address>();\n\n    get(id: GeoId): Address | undefined {\n        return this.items.get(id);\n    }\n\n    getGql(id: GeoId): TipAddress | undefined {\n        const geo = this.get(id);\n\n        if (! geo) return undefined;\n\n        return {\n            __typename: 'TipAddress',\n            id: geo.id,\n            title: geo.displayName ?? geo.mainName,\n            translit: geo.translit,\n            type: TipTypeEnum.Address\n        };\n    }\n\n    add(item: Address): void {\n        this.items.set(item.id, item);\n    }\n\n    remove(id: GeoId): void {\n        this.items.delete(id);\n    }\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { TipTypeEnum } from '@search/graphql-typings';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { titleSorter, isPresent } from '../domainHelpers';\nimport { geoProtoDistrict } from './proto/district';\nimport { GeoObject2 } from './GeoObject2';\nimport { GeoId } from './GeoBase';\n\nexport interface District {\n    readonly __typename?: undefined;\n    readonly kind: GeoKind.DISTRICT;\n    readonly id: GeoId;\n    readonly parentId: GeoId;\n    readonly title: string;\n    readonly translit: string;\n    readonly locativeName?: string;\n    readonly titleShort?: string;\n    readonly isIntracity?: boolean;\n    readonly narrowRegionId?: number;\n}\n\nexport class DistrictStore {\n    protected readonly map = new Map<GeoId, District>();\n    protected readonly ids: GeoId[] = [];\n    regionId: number | undefined;\n\n    get items() {\n        return Array.from(this.map.values());\n    }\n\n    get(id: GeoId): District | undefined {\n        return this.map.get(id);\n    }\n\n    getGql(id: GeoId) {\n        const geo = this.get(id);\n\n        if (! geo) return undefined;\n\n        return {\n            __typename: 'TipDistrict',\n            id: geo.id,\n            translit: geo.translit,\n            title: geo.title ?? geo.titleShort,\n            type: TipTypeEnum.District\n        };\n    }\n\n    has(id: GeoId): boolean {\n        return this.map.has(id);\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    protected _sorted: District[] | null = null;\n\n    get sortedByTitle(): readonly District[] {\n        if (! this._sorted) {\n            this._sorted = this.ids\n                .map(id => this.get(id))\n                .filter(isPresent)\n                .sort(titleSorter);\n        }\n        return this._sorted;\n    }\n\n    protected byRegionDistricts: DistrictStore | undefined = undefined;\n\n    byRegion() {\n        const regionId = this.regionId;\n\n        if (regionId === RegionIdEnum.LEN_OBL || regionId === RegionIdEnum.MSK_OBL) {\n            if (this.byRegionDistricts) {\n                return this.byRegionDistricts;\n            }\n            const filtered = new DistrictStore();\n\n            for (const id of this.ids) {\n                const item = this.get(id);\n\n                if (item?.parentId === regionId) {\n                    filtered.addDistrict(item);\n                }\n            }\n\n            this.byRegionDistricts = filtered;\n\n            return filtered;\n        }\n\n        return this;\n    }\n\n    addDistrict(district: District) {\n        const id = district.id;\n\n        this.ids.push(id);\n        this.map.set(id, district);\n    }\n\n    isEmpty() {\n        return this.ids.length === 0;\n    }\n\n    add(geo: GeoObject2) {\n        if (geo.kind !== GeoKind.DISTRICT && geo.kind !== GeoKind.LOCALITY) return;\n\n        const id = geo.id;\n\n        if (this.map.has(id)) return;\n\n        const district = geoProtoDistrict(geo);\n\n        this.addDistrict(district);\n    }\n}\n","import { cityIn } from 'lvovich';\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { District } from '../District';\nimport { GeoObject2 } from '../GeoObject2';\n\nexport function geoProtoDistrict(geo: GeoObject2) {\n    if (geo.kind !== GeoKind.DISTRICT && geo.kind !== GeoKind.LOCALITY) {\n        throw new Error(\n            `Not an district id: ${geo.id}, kind: ${geo.kind}`\n        );\n    }\n\n    const id: number = geo.id;\n    const title = geo.displayName ?? geo.mainName ?? '';\n    const titleShort: string | undefined = geo.shortDisplayName;\n    let locativeName = geo.locativeDisplayName;\n\n    if (! locativeName) {\n        let cityInTitle: string | undefined;\n        const word = 'городской округ';\n        const locativeWord = 'городском округе';\n\n        if (title.startsWith('посёлок')) {\n            cityInTitle = 'посёлке ' + title.substring('посёлке'.length);\n        } else if (title.startsWith(word)) {\n            cityInTitle = locativeWord + ' ' + title.substring(word.length);\n        } else if (title.endsWith(word)) {\n            cityInTitle = cityIn(title.substring(0, title.length - word.length)) + ' ' + locativeWord;\n        } else {\n            cityInTitle = cityIn(title);\n            if (title === 'посёлок Белоостров') cityInTitle = 'посёлке Белоостров';\n            if (title === 'Лобня') cityInTitle = 'Лобне';\n        }\n\n        locativeName = `${textPrefixIn(title)} ${cityInTitle}`;\n    }\n\n    const district: District = {\n        kind: geo.kind,\n        id,\n        title,\n        titleShort,\n        locativeName,\n        narrowRegionId: geo?.narrowRegion?.id,\n        isIntracity: geo?.isIntracity,\n        parentId: geo.parentId ?? 0\n    };\n\n    return district;\n}\n\nfunction textPrefixIn(word: string) {\n    if (word === 'Фрунзенский') return 'во';\n\n    return 'в';\n}\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { GeoId } from './GeoBase';\nimport { geoProtoRoute } from './proto/route';\nimport { GeoObject2 } from './GeoObject2';\n\nexport interface MetroRoute {\n    readonly kind: GeoKind.ROUTE;\n    readonly id: GeoId;\n    readonly title: string;\n    readonly shortDisplayName?: string;\n    readonly color: string;\n}\n\nexport class RouteStore {\n    protected items = new Map<GeoId, MetroRoute>();\n\n    get(id: GeoId): MetroRoute | undefined {\n        return this.items.get(id);\n    }\n\n    add(geo: GeoObject2) {\n        if (geo.kind !== GeoKind.ROUTE) return;\n\n        const id: GeoId = geo.id;\n\n        if (this.items.has(id)) return;\n\n        const route = geoProtoRoute(geo);\n\n        this.items.set(id, route);\n    }\n}\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { GeoObject2 } from '../GeoObject2';\nimport { MetroRoute } from '../MetroRoute';\n\nexport function geoProtoRoute(geo: GeoObject2) {\n    if (geo.kind !== GeoKind.ROUTE) {\n        throw new Error(\n            `Not an route id: ${geo.id}, kind: ${geo.kind}`\n        );\n    }\n\n    const id = geo.id;\n\n    const title = geo.mainName ?? geo.displayName;\n\n    const body = geo.body;\n    const color = body?.route?.colorHex ?? 'pink';\n\n    const route: MetroRoute = {\n        kind: GeoKind.ROUTE,\n        id,\n        title,\n        shortDisplayName: geo.shortDisplayName,\n        color\n    };\n\n    return route;\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport { TipMetroStation, TipTypeEnum } from '@search/graphql-typings';\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { titleSorter } from '../domainHelpers';\nimport { GeoId } from './GeoBase';\nimport { MetroRoute, RouteStore } from './MetroRoute';\nimport { geoProtoMetroStationRaw } from './proto/metroStaionRaw';\nimport { GeoObject2 } from './GeoObject2';\n\nexport interface MetroStationBase {\n    readonly id: GeoId;\n    readonly title: string;\n    allRoutesColorsList: readonly string[];\n}\n\nexport interface MetroStation extends MetroStationBase {\n    readonly __typename?: undefined;\n    readonly id: GeoId;\n    readonly kind: GeoKind.METRO;\n    readonly title: string;\n    readonly route: MetroRoute;\n    interchangedStations: readonly MetroStation[];\n    readonly coordinates?: {\n        latitude: number;\n        longitude: number;\n    };\n}\n\nexport interface MetroAlphabetGroup {\n    readonly letter?: string;\n    readonly stations: MetroStation[];\n}\n\nexport interface MetroRouteGroup {\n    id: string;\n    route: MetroRoute;\n    __typename?: undefined;\n    kind: 'metro-route';\n    readonly stations: MetroStation[];\n}\n\nexport interface MetroStationRaw extends MetroStationBase {\n    readonly id: GeoId;\n    readonly kind: GeoKind.METRO;\n    readonly title: string;\n    readonly routeId: GeoId;\n    readonly interchangeStationsIds: readonly GeoId[];\n    readonly coordinates?: {\n        latitude: number;\n        longitude: number;\n    };\n}\n\nexport class MetroStore {\n    protected items = new Map<GeoId, MetroStationRaw>();\n    protected ids: GeoId[] = [];\n    protected routes: RouteStore;\n\n    constructor(routes: RouteStore) {\n        this.routes = routes;\n    }\n\n    has(id: GeoId): boolean {\n        return this.items.has(id);\n    }\n\n    get(id: GeoId): MetroStation | undefined {\n        return this.entities.get(id);\n    }\n\n    getGql(id: GeoId): TipMetroStation | undefined {\n        const geo = this.get(id);\n\n        if (! geo) return undefined;\n\n        return {\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            __typename: 'TipMetroStation',\n            id: geo.id,\n            allRoutesColors: geo.allRoutesColorsList as string[],\n            title: geo.title,\n            type: TipTypeEnum.Metro\n        };\n    }\n\n    isEmpty() {\n        return this.ids.length === 0;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    protected _entities: Map<GeoId, MetroStation> | null = null;\n\n    protected get entities(): ReadonlyMap<GeoId, MetroStation> {\n        if (this._entities) return this._entities;\n        const entities: Map<GeoId, MetroStation> = this._entities = new Map();\n        const items = this.sortedByTitle;\n\n        for (const item of items) {\n            if (item) {\n                entities.set(item.id, item);\n            }\n        }\n\n        return entities;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    protected _sorted: MetroStation[] | null = null;\n\n    get sortedByTitle(): readonly MetroStation[] {\n        if (this._sorted) return this._sorted;\n        const sorted: MetroStation[] = this._sorted = [];\n\n        for (const stationId of this.ids) {\n            const station = createMetroStation(\n                stationId,\n                this.items,\n                this.routes\n            );\n\n            if (station) {\n                sorted.push(station);\n            }\n        }\n        sorted.sort(titleSorter);\n\n        return sorted;\n    }\n\n    findRouteByStations(stationIds: GeoId[]): {groups: MetroRouteGroup[]; stations: MetroStation[]} {\n        const groups = this.groupedByRoute;\n        const idSet = new Set(stationIds);\n        const fullGroups: MetroRouteGroup[] = [];\n\n        for (const group of groups) {\n            let equalStations = 0;\n\n            for (const station of group.stations) {\n                if (idSet.has(station.id)) equalStations++;\n            }\n            if (equalStations === group.stations.length) {\n                for (const station of group.stations) idSet.delete(station.id);\n                fullGroups.push(group);\n            }\n        }\n        const stations: MetroStation[] = [];\n\n        for (const stationId of stationIds) {\n            const station = this.get(stationId);\n\n            if (idSet.has(stationId) && station) stations.push(station);\n        }\n\n        return { groups: fullGroups, stations };\n    }\n\n    get groupedByRoute(): readonly MetroRouteGroup[] {\n        const stations = this.sortedByTitle;\n        const stationsMap = new Map<GeoId, MetroRouteGroup>();\n\n        for (const station of stations) {\n            const route = station.route;\n            const key = route.id;\n            let stationGroup = stationsMap.get(key);\n\n            if (! stationGroup) {\n                stationGroup = {\n                    id: String(route.id),\n                    route,\n                    kind: 'metro-route',\n                    stations: []\n                };\n                stationsMap.set(key, stationGroup);\n            }\n            stationGroup.stations.push(station);\n        }\n\n        return Array.from(stationsMap.values()).sort(\n            (a: MetroRouteGroup, b: MetroRouteGroup) => (a.route.title > b.route.title ? 1 : -1)\n        );\n    }\n\n    get groupedByAlphabet(): readonly MetroAlphabetGroup[] {\n        const stationsMap = new Map<string, MetroAlphabetGroup>();\n        const distinctStations = this.noInterchanged;\n\n        for (const station of distinctStations) {\n            const letter = station.title.substring(0, 1);\n            let stationGroup = stationsMap.get(letter);\n\n            if (! stationGroup) {\n                stationGroup = {\n                    letter,\n                    stations: []\n                };\n                stationsMap.set(letter, stationGroup);\n            }\n            stationGroup.stations.push(station);\n        }\n\n        const aggregate = Array.from(stationsMap.values());\n\n        aggregate.sort((a, b) => {\n            return a.letter!.charCodeAt(0) - b.letter!.charCodeAt(0);\n        });\n\n        aggregate.forEach(stationGroup => {\n            stationGroup.stations.sort((a, b) => {\n                // eslint-disable-next-line\n                return a.title < b.title ? -1 : a.title > b.title ? 1 : 0;\n            });\n        });\n\n        return aggregate;\n    }\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    protected _noInterchanged: readonly MetroStation[] | null = null;\n    /**\n     * Если у станции есть пересадочная с таким же названием - вторая будет отброшена\n     */\n    get noInterchanged(): readonly MetroStation[] {\n        if (this._noInterchanged) return this._noInterchanged;\n        this._noInterchanged = metroStationNoIntercharged(this.sortedByTitle);\n\n        return this._noInterchanged;\n    }\n\n    add(geo: GeoObject2) {\n        if (geo.kind !== GeoKind.METRO) return;\n        const id = geo.id;\n\n        if (this.items.has(id)) return;\n        const station = geoProtoMetroStationRaw(geo);\n\n        this.ids.push(id);\n        this.items.set(id, station);\n    }\n}\n\nexport function metroStationNoIntercharged(stations: readonly MetroStation[]): readonly MetroStation[] {\n    const processed = new Set<number>();\n    const result: MetroStation[] = [];\n\n    for (const station of stations) {\n        if (processed.has(station.id)) continue;\n        for (const interchanged of station.interchangedStations) {\n            if (interchanged.title === station.title) {\n                processed.add(interchanged.id);\n            }\n        }\n        result.push(station);\n    }\n\n    return result;\n}\n\nfunction createMetroStation(\n    stationId: GeoId,\n    stationMap: Map<GeoId, MetroStationRaw>,\n    routeMap: RouteStore,\n    processedStations = new Map<GeoId, MetroStation>()\n): MetroStation | undefined {\n    let station = processedStations.get(stationId);\n\n    if (station) return station;\n\n    const stationRaw = stationMap.get(stationId);\n\n    if (! stationRaw) return; // throw new GeoBaseError(stationId, `, parent: ${JSON.stringify(parent)}`);\n    const route = routeMap.get(stationRaw.routeId);\n\n    if (! route) return;\n\n    station = {\n        id: stationRaw.id,\n        kind: GeoKind.METRO,\n        title: stationRaw.title,\n        interchangedStations: [],\n        allRoutesColorsList: [],\n        route,\n        coordinates: stationRaw.coordinates\n    };\n    processedStations.set(stationRaw.id, station);\n\n    const interchangedStations: MetroStation[] = [];\n\n    for (const interchangedStationId of stationRaw.interchangeStationsIds) {\n        const interchangedStation = createMetroStation(\n            interchangedStationId,\n            stationMap,\n            routeMap,\n            processedStations\n        );\n\n        if (interchangedStation) {\n            interchangedStations.push(interchangedStation);\n        }\n    }\n\n    station.interchangedStations = interchangedStations;\n    station.allRoutesColorsList = stationRaw.allRoutesColorsList || [];\n\n    return station;\n}\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { MetroStationRaw } from '../MetroStation';\nimport { GeoObject2 } from '../GeoObject2';\n\nexport function geoProtoMetroStationRaw(geo: GeoObject2) {\n    if (geo.kind as unknown as GeoKind !== GeoKind.METRO) {\n        throw new Error(\n            `Not an metro station id: ${geo.id}, kind: ${geo.kind}`\n        );\n    }\n\n    const id: number = geo.id;\n\n    const routeId: number = geo.parentId ?? 0;\n    const title =\n        geo.displayName ?? geo?.mainName?.replace('метро ', '') ?? '';\n\n    const body = geo.body;\n    const metro = body?.metro;\n    const interchangeStationsIds = metro?.interchangeStationsIdsList ?? [];\n    const allRoutesColorsList = metro?.allRoutesColorsList ?? [];\n    const coordinates = metro?.coordinates;\n\n    const station: MetroStationRaw = {\n        kind: GeoKind.METRO,\n        id,\n        title,\n        routeId,\n        interchangeStationsIds,\n        allRoutesColorsList,\n        coordinates\n    };\n\n    return station;\n}\n","/* eslint-disable complexity */\nimport { GeoKind } from '@search/filter-enums/enums';\nimport { isPresent } from '../domainHelpers';\nimport { GeoBaseStore } from './GeoBase';\n\nexport function geoBaseStoreFromGql(geo: Geo): GeoBaseStore {\n    const store = new GeoBaseStore();\n\n    for (const metro of geo?.metro ?? []) {\n        if (! metro) continue;\n\n        store.add({\n            id: metro.id,\n            kind: geoKindFromGqlKind(metro.kind),\n            displayName: metro.title ?? '',\n            shortDisplayName: metro.shortDisplayName ?? undefined,\n            parentId: metro.route.id,\n            body: {\n                metro: {\n                    allRoutesColorsList: metro.lines ?? [],\n                    interchangeStationsIdsList: metro.interchangedStations?.filter(isPresent) ?? [],\n                    coordinates: metro.coordinates ?? undefined\n                }\n            }\n        });\n    }\n\n    for (const district of geo?.districts ?? []) {\n        if (! district) continue;\n\n        store.add({\n            id: district.id,\n            kind: geoKindFromGqlKind(district.kind),\n            isIntracity: district.isIntracity ?? false,\n            parentId: district.parentId,\n            narrowRegion: district.narrowRegion,\n            displayName: district.displayName || district.title || '',\n            mainName: district.mainName ?? undefined,\n            shortDisplayName: district.shortDisplayName || district.displayName || undefined,\n            locativeDisplayName: district.locative ?? undefined\n        });\n    }\n\n    for (const line of geo?.lines ?? []) {\n        if (! line) continue;\n        store.add({\n            id: line.id,\n            kind: geoKindFromGqlKind(line.kind),\n            displayName: line.title ?? '',\n            body: {\n                route: {\n                    colorHex: line.color ?? 'pink'\n                }\n            }\n        });\n    }\n\n    return store;\n}\n\nfunction geoKindFromGqlKind(kind: KindEnum): GeoKind {\n    return GeoKind[kind];\n}\n\ntype KindEnum = 'AIRPORT' | 'APARTMENT' | 'AREA' | 'COMPOSITE_OBJECT' | 'COUNTRY' | 'DISTRICT' | 'ENTRANCE'\n    | 'HOUSE' | 'HYDRO' | 'LOCALITY' | 'METRO' | 'OTHER' | 'PROVINCE' | 'RAILWAY_STATION'\n    | 'ROUTE' | 'STATION' | 'STREET' | 'STREET_ADDRESS' | 'VEGETATION';\n\ntype Geo = {\n    readonly metro: Array<{\n        readonly id: number;\n        readonly title?: string | null | undefined;\n        readonly kind: KindEnum;\n        readonly lines: Array<string> | null | undefined;\n        readonly mainName: string | null | undefined;\n        readonly interchangedStations: Array<number | null | undefined> | null | undefined;\n        readonly shortDisplayName: string | null | undefined;\n        readonly locativeDisplayName: string | null | undefined;\n        readonly route: {\n            readonly id: number;\n        };\n        readonly coordinates: {\n            readonly latitude: number;\n            readonly longitude: number;\n        } | null | undefined;\n    } | null | undefined> | null | undefined;\n    readonly lines: Array<{\n        readonly id: number;\n        readonly title: string | null;\n        readonly kind: KindEnum;\n        readonly color: string | null;\n    } | null | undefined> | null | undefined;\n    readonly districts: Array<{\n        readonly kind: KindEnum;\n        readonly parentId: number;\n        readonly displayName: string | null;\n        readonly mainName: string | null;\n        readonly shortDisplayName: string | null;\n        readonly locative: string | null;\n        readonly title: string | null;\n        readonly id: number;\n        readonly isIntracity?: boolean | null;\n        readonly narrowRegion?: {\n            readonly id: number;\n        };\n    } | null | undefined > | null | undefined;\n} | null | undefined;\n","import { GeoKind } from '@search/filter-enums/enums/GeoKind';\n\nimport { CopyObject, Flavor } from '../domainHelpers';\nimport { AddressStore } from './AddressStore';\nimport { District, DistrictStore } from './District';\nimport { GeoObject2 } from './GeoObject2';\nimport { RouteStore } from './MetroRoute';\nimport { MetroStation, MetroStore, MetroRouteGroup } from './MetroStation';\nimport { geoBaseStoreFromGql } from './geoBaseStoreFromGql';\nimport { Address } from './Address';\n\nexport class GeoBase extends CopyObject {\n    loading: boolean = true;\n    error?: Error = undefined;\n    store = new GeoBaseStore();\n    public regionId: GeoId | null;\n\n    constructor(regionId: GeoId | null = 0) {\n        super();\n        this.regionId = regionId;\n    }\n}\n\nexport type GeoId = Flavor<number, 'GeoId'>;\n\nexport type GeoFilteredItem = MetroStation | District | Address | MetroRouteGroup;\n\nexport class GeoBaseStore extends CopyObject {\n    readonly districts = new DistrictStore();\n    readonly routes = new RouteStore();\n    readonly stations = new MetroStore(this.routes);\n    readonly addresses = new AddressStore();\n\n    static fromGql(geo: Parameters<typeof geoBaseStoreFromGql>[0]) {\n        return geoBaseStoreFromGql(geo);\n    }\n\n    add(geo: GeoObject2) {\n        this.districts.add(geo);\n        this.stations.add(geo);\n        this.routes.add(geo);\n\n        const kind = geo.kind;\n\n        if (\n            kind === GeoKind.HOUSE ||\n            kind === GeoKind.STREET ||\n            kind === GeoKind.LOCALITY ||\n            kind === GeoKind.AREA ||\n            kind === GeoKind.PROVINCE ||\n            kind === GeoKind.COUNTRY ||\n            kind === GeoKind.HYDRO ||\n            kind === GeoKind.VEGETATION ||\n            kind === GeoKind.AIRPORT ||\n            kind === GeoKind.OTHER ||\n            kind === GeoKind.RAILWAY_STATION ||\n            kind === GeoKind.STATION ||\n            kind === GeoKind.ENTRANCE ||\n            kind === GeoKind.COMPOSITE_OBJECT ||\n            kind === GeoKind.STREET_ADDRESS ||\n            kind === GeoKind.APARTMENT\n        ) {\n            // @ts-ignore\n            this.addresses.add(geo);\n        }\n    }\n\n    getById(id: GeoId): GeoFilteredItem | undefined {\n        const { districts, stations, addresses } = this;\n        const district = districts.get(id);\n\n        if (district) return district;\n\n        const station = stations.get(id);\n\n        if (station) return station;\n\n        const address = addresses.get(id);\n\n        if (address) return address;\n\n        return undefined;\n    }\n\n    getByIds(ids: readonly GeoId[]): GeoFilteredItem[] {\n        const result: GeoFilteredItem[] = [];\n\n        for (const id of ids) {\n            const item = this.getById(id);\n\n            if (item) result.push(item);\n        }\n\n        return result;\n    }\n}\n","import React from 'react';\n\nimport { QueryDisplayValues } from '@search/vtbeco-frontend-core/view/common/hooks/useQueryDisplayValues';\nimport { DeveloperFilter, Filters, GeoFilter } from '@search/vtbeco-frontend-core/view/filters/models/Filter';\nimport { GeoBaseStore } from '@search/vtbeco-frontend-core/domain/geo/GeoBase';\nimport { isPresent } from '@search/vtbeco-frontend-core/domain/domainHelpers';\n\nimport { NewbuildingFilterCollection } from '../newbuilding/filters/NewbuildingFilterCollection';\nimport { ClassifiedFilterCollection } from '../offer/filters/ClassifiedFilterCollection';\n\nexport function useGeoTips(\n    qv: QueryDisplayValues,\n    filters: NewbuildingFilterCollection | ClassifiedFilterCollection,\n    store: GeoBaseStore\n) {\n    const geoFilter = filters.get<GeoFilter>(Filters.geo);\n    const developerFilter = filters.get<DeveloperFilter>(Filters.developer);\n\n    const { addressIds, districtIds, metroIds, newBuildingIds } = geoFilter ?? {};\n    const developerId = developerFilter?.developerId;\n\n    return React.useMemo(() => [\n        ...addressIds.map(id => (qv.addresses && qv.addresses[id]) ?? store.addresses.getGql(id)),\n        ...districtIds.map(id => (qv.districts && qv.districts[id]) ?? store.districts.getGql(id)),\n        ...metroIds.map(id => (qv.metros && qv.metros[id]) ?? store.stations.getGql(id)),\n        ...newBuildingIds.map(id => qv.newBuildings && qv.newBuildings[id]),\n        developerId ? qv.developers && qv.developers[developerId] : null\n    ].filter(isPresent), [\n        addressIds,\n        districtIds,\n        metroIds,\n        newBuildingIds,\n        developerId,\n        qv.addresses,\n        qv.districts,\n        qv.metros,\n        qv.newBuildings,\n        qv.developers,\n        store.addresses,\n        store.districts,\n        store.stations\n    ]);\n}\n","import { DataLayerObject } from './DataLayerObject';\n\ndeclare const window: Window & {\n    dataLayer?: Object[];\n};\n\nexport function dataLayerPush(data: DataLayerObject) {\n    if (typeof window === 'undefined') {\n        return;\n    }\n\n    if (! window.dataLayer) {\n        window.dataLayer = [];\n    }\n\n    window.dataLayer.push(data);\n}\n","/* eslint-disable camelcase */\nimport React from 'react';\nimport { googleOptimizeCallbackEvent } from './googleOptimizeCallbackEvent';\nimport { dataLayerPush } from './dataLayerPush';\n\n/**\n * @see https://support.google.com/optimize/answer/9059383?hl=en\n */\ninterface GoogleOptimize {\n    get<Variant>(experimentId: string): Variant | undefined;\n}\n\ndeclare const window: Window & {\n    // eslint-disable-next-line camelcase\n    google_optimize?: GoogleOptimize;\n};\n\nexport type GoogleOptimizeConfig = Record<string, string | undefined>;\n\nconst googleOptimizeConfigDefault = {} as GoogleOptimizeConfig;\n\nconst GoogleOptimizeContext = React.createContext(googleOptimizeConfigDefault);\n\nGoogleOptimizeContext.displayName = 'GoogleOptimizeContext';\n\nexport function GoogleOptimizeProvider({\n    children,\n    value = googleOptimizeConfigDefault\n}: {\n    value?: GoogleOptimizeConfig;\n    children?: React.ReactChild;\n}) {\n    return (<GoogleOptimizeContext.Provider value={value}>\n        {children}\n    </GoogleOptimizeContext.Provider>);\n}\n\nlet activated = false;\n\nexport function useGoogleOptimize<Variant = string>(\n    {\n        experimentLabel,\n        checkVariantTimeout = 1000\n    }: {\n        checkVariantTimeout?: number;\n        experimentLabel: string;\n    }\n) {\n    const config = React.useContext(GoogleOptimizeContext);\n    const experimentId = config[experimentLabel];\n\n    if (! activated && experimentId) {\n        dataLayerPush({ event: 'optimize.activate' });\n        activated = true;\n    }\n\n    const win = typeof window === 'undefined' ? undefined : window;\n\n    const getVariantId = React.useCallback((nextVariantId?: Variant | undefined) => {\n        // for testing\n        let overridedVariant = experimentId ?\n            (win?.sessionStorage.getItem(experimentId) as unknown as Variant) ?? undefined :\n            undefined;\n\n        if (! overridedVariant && experimentId && win?.location.search) {\n            overridedVariant = (new URLSearchParams(win.location.search)\n                .get(`dbg_${experimentLabel}`)) as unknown as NonNullable<Variant>;\n        }\n\n        const debugApiVariant = experimentId ? win?.google_optimize?.get<Variant>(experimentId) : undefined;\n\n        const realVariant = nextVariantId ?? debugApiVariant;\n\n        if (overridedVariant !== undefined && overridedVariant !== null) {\n            // eslint-disable-next-line no-console\n            console.log(\n                `Google optimize experiment \\`${experimentId}\\` variant \\`${\n                    realVariant ?? 'off'}\\` overrided by \\`${overridedVariant}\\``\n            );\n        }\n\n        return overridedVariant ?? realVariant;\n    }, [ experimentId, win ]);\n\n    const variantIdRef = React.useRef(getVariantId());\n\n    const [ variantId, setVariantId ] = React.useState(variantIdRef.current);\n\n    const onUpdateVariant = React.useCallback((nextVariantIdRaw?: Variant | undefined) => {\n        const nextVariantId = getVariantId(nextVariantIdRaw);\n\n        if (nextVariantId === variantIdRef.current) return;\n        variantIdRef.current = nextVariantId;\n        setVariantId(nextVariantId);\n    }, [ setVariantId, getVariantId ]);\n\n    React.useEffect(() => {\n        if (! experimentId) return;\n\n        googleOptimizeCallbackEvent({\n            experimentId,\n            onUpdateVariant\n        });\n\n        let count = 0;\n\n        // @see https://github.com/hudovisk/react-optimize/blob/master/src/Experiment.js\n        const handler = variantIdRef.current !== undefined ? undefined : setInterval(() => {\n            const googleOptimize = win?.google_optimize;\n\n            if (count > 10) {\n                clearInterval(handler);\n            }\n            count++;\n\n            if (! googleOptimize) return;\n\n            clearInterval(handler);\n            onUpdateVariant();\n        }, checkVariantTimeout) as unknown as number;\n\n        return () => {\n            clearInterval(handler);\n            googleOptimizeCallbackEvent({\n                experimentId,\n                onUpdateVariant,\n                remove: true\n            });\n        };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ experimentId, onUpdateVariant, checkVariantTimeout, variantIdRef ]);\n\n    return {\n        variantId\n    };\n}\n","import React from 'react';\nimport { IntersectionTriggerProps, IntersectionTrigger, useIntersectionTrigger } from '../image/useIntersectionTrigger';\n\nconst GtmOnVisibleContext = React.createContext({\n    it: new IntersectionTrigger({ threshold: 1 })\n});\n\nfunction useGtmOnVisibleContext() {\n    return React.useContext(GtmOnVisibleContext);\n}\n\nexport function useGtmOnVisible<El extends HTMLElement>({\n    containerRef,\n    onVisible\n}: {\n    containerRef?: React.RefObject<El>;\n    onVisible(el: El): void;\n}) {\n    const { it } = useGtmOnVisibleContext();\n\n    React.useEffect(() => {\n        const el = containerRef?.current;\n\n        if (! el) return;\n\n        it.add(el, { onVisible });\n\n        return () => it.remove(el);\n    }, [ it, containerRef, onVisible ]);\n}\n\nexport type GtmOnVisibleProviderProps = IntersectionTriggerProps & { children?: React.ReactNode };\n\nexport function GtmOnVisibleProvider({ rootMargin, rootRef, threshold, children }: GtmOnVisibleProviderProps) {\n    const { it: parent } = useGtmOnVisibleContext();\n    const it = useIntersectionTrigger({ rootMargin, rootRef, threshold, parent });\n\n    const value = React.useMemo(() => ({\n        it\n    }), [ it ]);\n\n    return <GtmOnVisibleContext.Provider value={value}>{children}</GtmOnVisibleContext.Provider>;\n}\n\n","import React from 'react';\nimport { UseIntersectionTriggerProps, IntersectionTrigger,\n    useIntersectionTrigger } from '../useIntersectionTrigger';\n\nexport type ImageLazyProps = React.ComponentProps<'img'> & {\n    /**\n     * url заглушки,  во время загрузки основной картинки, работает только для не-нативной ленивой загрузки\n     */\n    mockSrc?: string;\n\n    /**\n     * Метод ленивой загрузки\n     *\n     * detect - автодетект, нативная ленивая загрузка, если браузер поддерживает.\n     * Для SSR, на сервере надо задать в ImageLazyObserverProvider свойство isBrowserSupportsLazy, можно детектить из user agent.\n     * Иначе на сервере тег картинки сгенерится как для эмуляции на IntersectionObserver.\n     * После загрузки js в браузер, будет лишний перерендер дома.\n     *\n     * Если браузер не поддерживает, будет эмуляция на IntersectionObserver, которая срабатывает с задержкой.\n     * До загрузки js, картинки не будут видны, заметно при history.back или forward + pushState.\n     * Робот, не умеющий в js, увидит вместо src - mockSrc, хотя прочтет data-src.\n     *\n     * io - упреждающая ленивая загрузка на IntersectionObserver. Больше рассчитана для мобильной галереи.\n     * При ssr будет заметна подгрузка, пока js не прогрузился\n     *\n     * native - нативный lazy, даже если браузер не поддерживает.\n     * Можно делать первую картинку в снипете.\n     * В сафари будет жадная загрузка. В хроме, нативный lazy подгрузит заранее.\n     */\n    loadingLazy?: 'native' | 'io' | 'detect';\n}\n\nexport type ImageLazyObserverProps = {\n    children: React.ReactNode;\n\n    /**\n     * Заглушка по-умолчанию, которая будет показываться в случае не нативного lazy на IntersectionObserver.\n     */\n    defaultMockSrc?: string;\n\n    /**\n     * Поддерживает ли браузер lazy load для картнок.\n     *\n     * При SSR, тут надо по user agent детектить поддержку lazy,\n     * иначе будет лишний repaint/reflow, после загрузки всех картинок на клиенте\n     */\n    isBrowserSupportsLazy?: boolean;\n} & UseIntersectionTriggerProps;\n\nconst imageLazyOptionsDefault = {\n    defaultMockSrc: 'data:image/svg+xml;charset=utf8,%3Csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%3E%3C/svg%3E',\n    /**\n     * Работает только в клиентской части, на сервере надо через user agent устанавивать ImageLazyObserverProvider.isBrowserSupportsLazy.\n     */\n    isBrowserSupportsLazy: typeof HTMLImageElement !== 'undefined' && 'loading' in HTMLImageElement.prototype,\n    it: new IntersectionTrigger({ rootMargin: '500px 10%' })\n};\n\nexport const ImageLazyObserverContext = React.createContext(imageLazyOptionsDefault);\n\nexport function useImageLazyObserver() {\n    return React.useContext(ImageLazyObserverContext);\n}\n\nexport function ImageLazyObserverProvider({\n    children,\n    rootRef,\n    threshold,\n    defaultMockSrc = imageLazyOptionsDefault.defaultMockSrc,\n    isBrowserSupportsLazy = imageLazyOptionsDefault.isBrowserSupportsLazy,\n    rootMargin = '500px 10%'\n}: ImageLazyObserverProps) {\n    const { it: parent } = useImageLazyObserver();\n    const it = useIntersectionTrigger({ rootRef, threshold, rootMargin, parent });\n\n    const value = React.useMemo(() => ({\n        defaultMockSrc,\n        isBrowserSupportsLazy,\n        it\n    }), [ it, isBrowserSupportsLazy, defaultMockSrc ]);\n\n    return <ImageLazyObserverContext.Provider value={value}>{children}</ImageLazyObserverContext.Provider>;\n}\n\nexport type UseImageLazyProps<El extends HTMLImageElement> = Pick<ImageLazyProps, 'loadingLazy' | 'src' | 'mockSrc'>\n    & {\n        ref?: React.LegacyRef<El>;\n        srcSet?: string;\n    }\n\nexport function useImageLazy<El extends HTMLImageElement>(\n    {\n        loadingLazy,\n        ref,\n        src,\n        srcSet,\n        mockSrc\n    }: UseImageLazyProps<El>\n) {\n    const ll = useImageLazyObserver();\n\n    const isNative = loadingLazy === 'native' || (loadingLazy === 'detect' && ll.isBrowserSupportsLazy);\n    const loading = isNative ? 'lazy' : undefined;\n\n    const isIO = loadingLazy === 'io' || (loadingLazy === 'detect' && ! ll.isBrowserSupportsLazy);\n    const it = isIO ? ll.it : undefined;\n\n    const mock = mockSrc ?? ll.defaultMockSrc;\n\n    const realRef = React.useRef({ src: it ? mock : src, srcSet: it ? mock : srcSet });\n    const [ , setCount ] = React.useState(0);\n    const imgRef = React.useRef<El | null>(null);\n    const extRef = React.useRef(ref);\n\n    extRef.current = ref;\n\n    React.useEffect(() => {\n        const el = imgRef.current;\n\n        if (! el) return;\n\n        it?.add(el, {\n            onVisible() {\n                realRef.current = { src, srcSet };\n                setCount(p => p + 1);\n            }\n        });\n\n        const subRef = extRef.current;\n\n        if (typeof subRef === 'function') subRef(el);\n\n        if (subRef && typeof subRef === 'object') {\n            (subRef as React.MutableRefObject<El>).current = el;\n        }\n\n        if (! it && (src !== realRef.current.src || srcSet !== realRef.current.srcSet)) {\n            realRef.current = { src, srcSet };\n            setCount(p => p + 1);\n        }\n\n        return () => it?.remove(el);\n    }, [ it, src, srcSet ]);\n\n    return {\n        loading,\n        imgRef,\n        real: realRef.current\n    } as const;\n}\n\n/**\n * Drop-in замена для стандартного img, с фолбэком ленивой загрузки на IntersectionObserver,\n * который, в свою очередь, с фолбэком на жадную загрузку.\n */\nexport const ImageLazy = React.forwardRef<Omit<HTMLImageElement, 'loading'>, ImageLazyProps>((\n    {\n        loadingLazy,\n        mockSrc,\n        src,\n        srcSet,\n        ...props\n    },\n    ref\n) => {\n    const { imgRef, real, loading } = useImageLazy({\n        loadingLazy,\n        ref,\n        src,\n        srcSet,\n        mockSrc\n    });\n\n    return (\n        <img\n            {...props}\n            ref={imgRef}\n            crossOrigin='anonymous'\n            loading={loading}\n            src={real.src}\n            srcSet={real.srcSet}\n        />\n    );\n});\n","import './ImageLazySeo.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { useImageLazy, ImageLazyProps } from './ImageLazy';\nimport { useImageLazySrcSet } from './ImageLazySrcSet';\n\nconst cn = classname.bind(null, 'ImageLazySeo');\n\nexport const ImageLazySeo = React.forwardRef<Omit<HTMLImageElement, 'loading'>, ImageLazyProps & {\n    imgClassName?: string;\n    noLocalItemScope?: boolean;\n    metaName?: string;\n    itemProp?: string;\n    itemScope?: boolean;\n    originPath?: string;\n    srcWidth?: number;\n    srcHeight?: number;\n    dataSet?: Record<string, string | number | boolean>;\n}>((\n    {\n        dataSet,\n        noLocalItemScope,\n        children,\n        itemProp,\n        itemScope,\n        width,\n        height,\n        srcWidth = typeof width === 'number' ? width : undefined,\n        srcHeight = typeof height === 'number' ? height : undefined,\n        originPath,\n        metaName,\n        loadingLazy,\n        src,\n        srcSet,\n        mockSrc,\n        className,\n        imgClassName,\n        ...imgProps\n    },\n    ref\n) => {\n    const name = metaName ?? imgProps.title;\n\n    // eslint-disable-next-line guard-for-in\n    for (const key in dataSet) {\n        const newKey = 'data-' + key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n\n        (imgProps as unknown as typeof dataSet)[newKey] = dataSet[key];\n    }\n\n    const getSrcSet = useImageLazySrcSet();\n\n    const calc = srcWidth && srcHeight && originPath ?\n        getSrcSet({ width: srcWidth, height: srcHeight, originPath }) :\n        undefined;\n\n    const { imgRef, real, loading } = useImageLazy({\n        loadingLazy,\n        ref,\n        src: src ?? calc?.src,\n        srcSet: calc?.srcSet,\n        mockSrc\n    });\n\n    return (\n        <picture\n            itemProp={itemProp}\n            itemScope={itemScope}\n            itemType={itemScope || itemProp ? 'http://schema.org/ImageObject' : undefined}\n            className={cn(null, undefined, className)}\n        >\n            {calc?.srcSet && <source srcSet={real.srcSet} />}\n            <img\n                {...imgProps}\n                className={cn('img', undefined, imgClassName)}\n                itemProp='contentUrl'\n                crossOrigin='anonymous'\n                src={real.src}\n                loading={loading}\n                ref={imgRef}\n            />\n            {name && itemProp && (<meta itemProp='name' content={name} />)}\n            {children}\n        </picture>\n    );\n});\n","/* eslint-disable no-undef */\n/* eslint-disable react-hooks/exhaustive-deps */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport React from 'react';\n\ntype Image = { width: number; height: number; originPath: string };\n\nconst defaultData = {\n    src: undefined as undefined | string,\n    srcSet: undefined as undefined | string\n};\n\nconst defaultProvider = (img: Image) => defaultData;\n\nconst ImageLazySrcSetContext = React.createContext(defaultProvider);\n\nexport function useClImageLazySrcSetUrl({ baseUrl = 'https://img.m2.ru' } = {}) {\n    return React.useCallback(\n        (scale: number, img: Image) => `${baseUrl}/i/s${img.width * scale}x${img.height * scale}${img.originPath}`,\n        [ baseUrl ]\n    );\n}\n\nconst isHiDpi = typeof window === 'undefined' ?\n    undefined :\n    new URLSearchParams(window.location.search).get('dbg_hidpi') === '1';\n\nexport function ImageLazySrcSetProvide({\n    scales = [ 1, 2 ],\n    children,\n    getUrl\n}: {\n    scales?: readonly number[];\n    getUrl(scale: number, img: Image): string;\n    children?: React.ReactNode;\n}) {\n    if (isHiDpi) scales = [ 1, 2 ];\n\n    const getSrcSet = React.useCallback((img: Image) => {\n        const data = scales.map(scale => {\n            const url = getUrl(scale, img);\n\n            return scale === 1 ? url : `${url} ${scale}x`;\n        });\n        const src = data.length > 0 ? data[0] : undefined;\n        const srcSet = data.join(', ');\n\n        return { src, srcSet };\n    }, [ scales.join('.'), getUrl ]);\n\n    return <ImageLazySrcSetContext.Provider value={getSrcSet} children={children} />;\n}\n\nexport function useImageLazySrcSet() {\n    return React.useContext(ImageLazySrcSetContext);\n}\n","import React from 'react';\n\nfunction imageSliderActiveItemRestoreItem<Key extends React.Key>(key: Key, el: HTMLElement) {\n    // Не работает в сафари.\n    el.scrollIntoView();\n}\n\nexport function useImageSliderActiveItem<\n    ContainerEl extends HTMLElement, ItemEl extends HTMLElement, Key extends React.Key\n>({\n    containerRef,\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    itemRefs = React.useRef(new Map<Key, ItemEl>()),\n    isVertical = false,\n    onActiveItem,\n    restoreItemKey,\n    restoreItem = imageSliderActiveItemRestoreItem\n}: {\n    restoreItem?: (key: Key, el: ItemEl) => void;\n    restoreItemKey?: Key;\n    onActiveItem?: (key: Key, el: ItemEl) => void;\n    isVertical?: boolean;\n    containerRef: React.RefObject<ContainerEl>;\n    itemRefs?: React.RefObject<Map<Key, ItemEl>>;\n}) {\n    const savedRef = React.useRef<Key>();\n\n    const onScroll = React.useCallback((e: React.UIEvent) => {\n        if (! onActiveItem) return;\n\n        const parentRect = containerRef.current?.getBoundingClientRect();\n\n        if (! parentRect) return;\n\n        const parentFirst = isVertical ? parentRect.top : parentRect.left;\n        const parentLast = isVertical ? parentRect.bottom : parentRect.right;\n        const parentCenter = Math.round(parentFirst + (parentLast - parentFirst) / 2);\n\n        let targetKey: Key | undefined;\n        let targetChild: ItemEl | undefined;\n\n        itemRefs.current?.forEach((child, key) => {\n            const childRect = child?.getBoundingClientRect();\n\n            if (! childRect) return;\n\n            const childFirst = isVertical ? childRect.top : childRect.left;\n            const childLast = isVertical ? childRect.bottom : childRect.right;\n\n            if (childFirst < parentCenter && childLast > parentCenter) {\n                targetKey = key;\n                targetChild = child;\n                return;\n            }\n        });\n\n        if (! targetKey || ! targetChild) return;\n        if (savedRef.current === targetKey) return;\n        savedRef.current = targetKey;\n\n        // console.log('onActiveItem:save', {targetKey, targetChild });\n        e.preventDefault();\n        onActiveItem(targetKey, targetChild);\n    }, [ containerRef, itemRefs, isVertical ]);\n\n    React.useEffect(() => {\n        itemRefs.current?.forEach((child, key) => {\n            if (key !== restoreItemKey) return;\n            // console.log('onActiveItem:restore', {key, child});\n            restoreItem(key, child);\n        });\n    }, [ itemRefs, restoreItem, restoreItemKey ]);\n\n    return {\n        onScroll\n    };\n}\n","import React from 'react';\n\nexport type ImageSliderAnimateProps = {\n    /**\n     * Айтем или весь контейнер, если был задан containerCrossSwipeEnabled\n     */\n    el: HTMLElement;\n\n    /**\n     * True, если вертикальное размещение айтемов в свайпе (ландшафтная ориентация экрана)\n     */\n    isVertical: boolean;\n\n    /**\n     * Если isVertical true - смещение по x, иначе - по y\n     */\n    touchShift: number;\n}\n\n/**\n * Анимация кросс-свайпа.\n * Возвращает true, если считает, что на onTouchEnd надо выполнить экшен onCrossSwipeFwd или onCrossSwipeBack\n */\nexport type ImageSliderAnimate = (props: ImageSliderAnimateProps) => boolean;\n\nexport type ImageSliderBaseProps<Key extends React.Key> = {\n    /**\n     * True, если вертикальное размещение айтемов в свайпе (ландшафтная ориентация экрана)\n     */\n    isVertical?: boolean;\n\n    /**\n     * Действие на прямой (слева направо, сверху вниз) свайп, перпендикулярный скролл-свайпу\n     * Если не заданно, прямой кросс-свайп не будет анимироваться.\n     *\n     * Если isVertical true - выполнится в конце свайпа вправо\n     * Если isVertical false - выполнится в конце свайпа вниз\n     */\n    onCrossSwipeFwd?: (key: Key, e: React.TouchEvent<HTMLElement>) => void;\n\n    /**\n     * Действие на обратный (справа налево, снизу вверх) свайп, перпендикулярный скролл-свайпу\n     * Если не заданно, обратный кросс-свайп не будет анимироваться.\n     *\n     * Если isVertical true - выполнится в конце свайпа влево\n     * Если isVertical false - выполнится в конце свайпа вверх\n     */\n    onCrossSwipeBack?: (key: Key, e: React.TouchEvent<HTMLElement>) => void;\n\n    /**\n     * Анимация кросс-свайпа.\n     * Возвращает true, если считает, что на onTouchEnd надо выполнить экшен onCrossSwipeFwd или onCrossSwipeBack\n     */\n    crossSwipeAnimate?: ImageSliderAnimate;\n}\n\n/**\n * Упрощает построение свайпов, где основной свайп скроллит, а перпендикулярный занят под альтернативные действия.\n */\nexport function useImageSliderCross<\n    ContainerEl extends HTMLElement, ItemEl extends HTMLElement, Key extends React.Key\n>({\n    onCrossSwipeFwd,\n    onCrossSwipeBack,\n    containerRef,\n    isVertical = false,\n    itemRefs,\n    crossSwipeAnimate = imageSliderCrossSwipeAnimateDefault\n}: ImageSliderBaseProps<Key> & {\n    itemRefs: React.RefObject<Map<Key, ItemEl>>;\n    containerRef?: React.RefObject<ContainerEl>;\n}) {\n    const touchPosStartRef = React.useRef({ x: 0, y: 0 });\n    const touchShiftEndRef = React.useRef(0);\n\n    const getItemElement = React.useCallback((key: Key) => {\n        return containerRef?.current ?? itemRefs.current?.get(key);\n    }, [ itemRefs, containerRef ]);\n\n    const onTouchStart = React.useCallback((e: React.TouchEvent<ItemEl>) => {\n        const event = e.touches.length ? e.touches[0] : undefined;\n\n        if (! event) return;\n\n        touchShiftEndRef.current = 0;\n        touchPosStartRef.current = { x: event.clientX, y: event.clientY };\n    }, [ ]);\n\n    const onTouchEnd = React.useCallback((key: Key, e: React.TouchEvent<ItemEl>) => {\n        const touchShift = touchShiftEndRef.current;\n\n        if (touchShift < 0 && onCrossSwipeBack) {\n            return onCrossSwipeBack(key, e);\n        }\n        if (touchShift > 0 && onCrossSwipeFwd) {\n            return onCrossSwipeFwd(key, e);\n        }\n\n        const el = getItemElement(key);\n\n        if (! el) return;\n\n        crossSwipeAnimate({\n            el,\n            isVertical,\n            touchShift\n        });\n    }, [ getItemElement, onCrossSwipeFwd, onCrossSwipeBack, crossSwipeAnimate, isVertical ]);\n\n    const onTouchMove = React.useCallback((key: Key, e: React.TouchEvent<ItemEl> & React.ChangeEvent<ItemEl>) => {\n        const el = getItemElement(key);\n\n        if (! el) return;\n\n        const event = e.touches.length > 0 ? e.touches[0] : undefined;\n\n        if (! event) return;\n\n        const shift = {\n            x: Math.floor(event.clientX - touchPosStartRef.current.x),\n            y: Math.floor(event.clientY - touchPosStartRef.current.y)\n        };\n\n        // Если начали скролл-свайпить, то кросс-свайп не должен анимироваться\n        if (! isVertical && Math.abs(shift.x) > 10) return;\n        if (isVertical && Math.abs(shift.y) > 10) return;\n\n        let touchShift = isVertical ? shift.x : shift.y;\n\n        // Если не задали экшен на обратный кросс-свайп, то не анимируем его\n        if (touchShift > 0 && onCrossSwipeBack) touchShift = 0;\n        // Если не задали экшен на прямой кросс-свайп, то не анимируем его\n        if (touchShift < 0 && onCrossSwipeFwd) touchShift = 0;\n\n        const isActionTriggered = crossSwipeAnimate({\n            el,\n            isVertical,\n            touchShift\n        });\n\n        touchShiftEndRef.current = isActionTriggered ? touchShift : 0;\n    }, [ getItemElement, isVertical, crossSwipeAnimate, onCrossSwipeBack, onCrossSwipeFwd ]);\n\n    return {\n        onTouchStart,\n        onTouchEnd,\n        onTouchMove\n    };\n}\n\nfunction imageSliderCrossSwipeAnimateDefault(\n    {\n        el,\n        isVertical,\n        touchShift\n    }: ImageSliderAnimateProps\n) {\n    const shiftAbs = Math.abs(touchShift);\n\n    if (shiftAbs < 20) touchShift = 0;\n\n    const x = ! isVertical ? 0 : touchShift;\n    const y = isVertical ? 0 : touchShift;\n\n    const dims = el.getBoundingClientRect();\n    const length = isVertical ? dims.right - dims.left : dims.bottom - dims.top;\n    const opacity = Math.min(1, Math.max(0, 1 - 0.7 * (shiftAbs / length)));\n\n    el.style.transform = `translate(${x}px, ${y}px)`;\n    el.style.opacity = `${opacity.toFixed(3)}`;\n\n    return shiftAbs > 30;\n}\n","import './ImageSlider.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nimport { useImageSliderActiveItem } from './useImageSliderActiveItem';\nimport { ImageSliderBaseProps, useImageSliderCross } from './useImageSliderCross';\nimport { useImageSliderItems } from './useImageSliderItems';\n\nconst cn = classname.bind(null, 'ImageSlider');\n\nexport function ImageSlider<Key extends React.Key>(\n    {\n        crossSwipeAnimate,\n        className,\n        itemClassName,\n        items,\n        containerCrossSwipeEnabled = false,\n        children,\n        onCrossSwipeFwd,\n        onCrossSwipeBack,\n        isVertical = false,\n        restoreItemKey,\n        onActiveItem,\n        noOverflow = false\n    }: {\n        className?: string;\n        itemClassName?: string;\n        items: readonly React.ReactElement<{ key: Key }>[];\n\n        /**\n         * True, если кросс-свайп должен анимировать весь контейнер, а не только конкретный айтем\n         */\n        containerCrossSwipeEnabled?: boolean;\n        children?: React.ReactNode;\n        restoreItemKey?: Key;\n        onActiveItem?: (key: Key, el: HTMLElement) => void;\n        noOverflow?: boolean;\n    } & ImageSliderBaseProps<Key>\n) {\n    const { containerRef, itemRefs, setItem } = useImageSliderItems<HTMLDivElement, HTMLDivElement, Key>();\n\n    const { onScroll } = useImageSliderActiveItem({\n        containerRef,\n        itemRefs,\n        isVertical,\n        onActiveItem,\n        restoreItemKey\n    });\n\n    const { onTouchStart, onTouchMove, onTouchEnd } = useImageSliderCross({\n        containerRef: containerCrossSwipeEnabled ? containerRef : undefined,\n        itemRefs,\n        onCrossSwipeFwd,\n        onCrossSwipeBack,\n        isVertical,\n        crossSwipeAnimate\n    });\n\n    return (\n        <div\n            ref={containerRef}\n            onScroll={onScroll}\n            className={cn(null, {\n                vertical: isVertical,\n                overflow: ! noOverflow\n            }, className)}\n        >\n            {items.map((item, index) => {\n                const key = (item.key ?? index) as unknown as Key;\n\n                return (<div\n                    key={`${key}-item`}\n                    onTouchStart={onTouchStart}\n                    ref={setItem.bind(null, key)}\n                    onTouchEnd={onTouchEnd.bind(null, key)}\n                    onTouchMove={onTouchMove.bind(null, key)}\n                    className={cn('slide', { vertical: isVertical }, itemClassName)}\n                >\n                    {item}\n                </div>);\n            })}\n            {children}\n        </div>\n    );\n}\n\n","import React from 'react';\n\nexport function useImageSliderItems<\n    ContainerEl extends HTMLElement, ItemEl extends HTMLElement, Key extends React.Key\n>() {\n    const itemRefs = React.useRef(new Map<Key, ItemEl>());\n    const containerRef = React.useRef<ContainerEl>(null);\n\n    const setItem = React.useCallback((key: Key, ref?: ItemEl | null) => {\n        if (ref) itemRefs.current?.set(key, ref);\n    }, [ itemRefs ]);\n\n    return {\n        containerRef,\n        itemRefs,\n        setItem\n    };\n}\n","import React from 'react';\n\nconst deferQueue: (() => void)[] = [];\n\nlet deferTick: Promise<void> | undefined;\n\nfunction deferQueueRun() {\n    let cb: (() => void) | undefined;\n\n    // eslint-disable-next-line no-cond-assign\n    while (cb = deferQueue.pop()) {\n        cb();\n    }\n    deferTick = undefined;\n}\n\nexport function deferRun(cb: () => void) {\n    deferQueue.push(cb);\n    if (! deferTick) {\n        deferTick = Promise.resolve().then(deferQueueRun);\n    }\n}\n\nexport type IntersectionTriggerItemOptions<El extends HTMLElement> = {\n    /**\n     * Сработает только для не-нативной загрузки, когда картинка попадает в область видимости\n     */\n    onVisible(target: El): void;\n\n    /**\n     * Сработает только для не-нативной загрузки, когда картинка выходит из области видимости\n     */\n    onInvisible?(target: El): void;\n};\n\nexport type IntersectionTriggerProps = {\n    /**\n     * Видимая область, относительно которой будет учитываться rootMargin и наблюдатся пересечения.\n     * IO вызывает onVisible на элементе при соответствующих условиях, даже если root-элемент невидим.\n     *\n     * undefined - root element body\n     * false - IntersectionTrigger не будет добавлять элементы в реальный IO, а будет только запоминать.\n     * Когда root сменится в методе update на HTMLElement, то все запомненные элементы добавятся в IO.\n     *\n     * https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options\n     */\n    root?: HTMLElement | false;\n\n    /**\n     * https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options\n     */\n    rootMargin?: string;\n\n    /**\n     * https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API#Intersection_observer_options\n     */\n    threshold?: number;\n}\n\nexport class IntersectionTrigger {\n    constructor(protected props: IntersectionTriggerProps = {}) {\n        this.props = props;\n    }\n\n    protected ioCache: IntersectionObserver | undefined = undefined;\n\n    protected get isNative() {\n        return typeof IntersectionObserver !== 'undefined';\n    }\n\n    protected get io() {\n        if (this.ioCache) return this.ioCache;\n        if (! this.isNative) return undefined;\n\n        /**\n         * В реальный IO не добавляем, а только в this.elementOptions.\n         * Когда через this.update подъедет HTMLElement в root, добавим все элементы из elementOptions в IO\n         */\n        if (this.props.root === false) return undefined;\n\n        this.ioCache = new IntersectionObserver(this.observerCallback.bind(this), {\n            threshold: this.props.threshold,\n            rootMargin: this.props.rootMargin,\n            root: this.props.root\n        });\n\n        return this.ioCache;\n    }\n\n    update(props: IntersectionTriggerProps) {\n        this.props = props;\n        this.ioCache?.disconnect();\n        this.ioCache = undefined;\n\n        if (this.elementOptions.size === 0) return;\n\n        // Картинки будут складываться в elementOptions,\n        // когда появится HTMLElement в root, эффект дернет update и элементы добавятся в реальный IO.\n        for (const [ el, opts ] of this.elementOptions) {\n            this.add(el, opts);\n        }\n    }\n\n    protected elementOptions = new Map<HTMLElement, IntersectionTriggerItemOptions<HTMLElement>>();\n\n    protected observerCallback<El extends HTMLElement>(\n        entries: IntersectionObserverEntry[],\n        observer: IntersectionObserver\n    ) {\n        for (const entry of entries) {\n            const img = entry.target as El;\n            const opts = this.elementOptions.get(img);\n\n            if (! entry.isIntersecting) {\n                opts?.onInvisible?.(img);\n                continue;\n            }\n\n            opts?.onVisible(img);\n\n            if (! opts?.onInvisible) observer.unobserve(img);\n        }\n    }\n\n    disconnect() {\n        this.ioCache?.disconnect();\n        this.elementOptions.clear();\n        this.ioCache = undefined;\n    }\n\n    add<El extends HTMLElement>(el: El, opts: IntersectionTriggerItemOptions<El>) {\n        this.elementOptions.set(el, opts);\n        const io = this.io;\n\n        if (! this.isNative) {\n            // Невозможен lazy loading без поддержки в браузере IntersectionObserver.\n            deferRun(() => opts.onVisible?.(el));\n            return;\n        }\n\n        io?.observe(el);\n    }\n\n    remove(el: HTMLElement) {\n        this.io?.unobserve(el);\n        this.elementOptions.delete(el);\n    }\n}\n\nexport type UseIntersectionTriggerProps = Omit<IntersectionTriggerProps, 'root' | 'isSlave'> & {\n    /**\n     * Родительский IntersectionTrigger\n     */\n     parent?: IntersectionTrigger;\n\n     /**\n     * Если rootRef передан, то через родительский IntersectionTrigger, будет мониториться наличие и видимость rootRef.current.\n     * При видимом rootRef.current все элементы перенесутся в реальный IO.\n     */\n    rootRef?: React.RefObject<HTMLElement>;\n};\n\nexport function useIntersectionTrigger(\n    {\n        rootRef,\n        parent,\n        rootMargin,\n        threshold\n    }: UseIntersectionTriggerProps\n) {\n    /**\n     * см. IntersectionTriggerProps.root в случае false\n     */\n    const [ visibleRoot, setVisibleRoot ] = React.useState<HTMLElement | false | undefined>(\n        rootRef ? false : rootRef\n    );\n\n    React.useEffect(() => {\n        const root = rootRef?.current;\n\n        if (! root || ! parent) return;\n\n        parent.add(root, { onVisible: setVisibleRoot });\n\n        return () => parent.remove(root);\n    }, [ parent, rootRef ]);\n\n    const itRef = React.useRef(new IntersectionTrigger());\n\n    React.useEffect(() => {\n        itRef.current.update({\n            rootMargin,\n            threshold,\n            root: visibleRoot\n        });\n    }, [ visibleRoot, rootMargin, threshold ]);\n\n    React.useEffect(() => {\n        const it = itRef.current;\n\n        return () => it.disconnect();\n    }, [ ]);\n\n    return itRef.current;\n}\n","export enum NewBuildingAnalytics {\n    // Показать телефон на выдаче новостроек\n    NewBuildingShowPhone = 'nb-snippet-phone',\n    NewBuildingReplacePhone = 'ct-number-replace',\n    NewBuildingReplacePhoneTry = 'ct-number-replace-try',\n    NewBuildingReplacePhoneFail = 'ct-number-replace-fail',\n\n    // Добавить новостройку в избранное\n    NewBuildingAddToFavorites = 'new_building_add_to_favorites',\n    // Добавить оффер в избранное\n    OfferAddToFavorites = 'flat_add_to_favorites',\n\n    // Загрузка выдачи\n    NewBuildingSerpLoad = 'nb-serp-load',\n\n    // Баннер про инвестиции\n    InvestmentPromoClick = 'nb_investment_banner_click',\n\n    // Отзыв о сайте\n    CustomerFeedbackClick = 'nb_feedback_click'\n}\n","import React, { AllHTMLAttributes, useMemo } from 'react';\n\nimport cn from '@search/classname/src';\n\nimport './styles.css';\n\nexport type Level =\n    'promo-h1' |\n    'promo-h1-mobile' |\n\n    'promo-h2' |\n    'promo-h2-mobile' |\n\n    'promo-h3' |\n    'promo-h3-mobile' |\n\n    'promo-h4' |\n    'promo-h4-mobile' |\n\n    'promo-h5' |\n\n    'promo-subheader' |\n    'promo-subheader-alone' |\n    'promo-subheader-mobile' |\n\n    'promo-primary' |\n    'promo-primary-alone' |\n    'promo-primary-mobile' |\n\n    'h1' |\n    'h2' |\n    'h3' |\n    'h4' |\n\n    'primary-alone' |\n    'primary' |\n\n    'secondary-alone' |\n    'secondary' |\n\n    'small-alone' |\n    'small' |\n\n    'tiny-alone' |\n    'tiny';\n\ntype UIKitColor = 'black-50' | 'black-75' | 'black-100' | 'black-200' | 'black-250' | 'black-300' | 'black-350' |\n    'black-400' | 'black-450' | 'black-500' | 'black-50-alpha' | 'black-100-alpha' | 'black-200-alpha' |\n    'black-300-alpha' | 'black-400-alpha' | 'black-500-alpha' | 'white-0' | 'white-500' | 'white-100-alpha' |\n    'white-200-alpha' | 'white-300-alpha' | 'white-400-alpha' | 'white-500-alpha' | 'blue-50' | 'blue-100' |\n    'blue-200' | 'blue-300' | 'blue-400' | 'blue-500' | 'blue-600' | 'blue-700' | 'orange-300' | 'orange-500' |\n    'orange-600' | 'orange-700' | 'purple-300' | 'purple-500' | 'purple-600' | 'purple-700' | 'turquoise-300' |\n    'turquoise-500' | 'turquoise-600' | 'turquoise-700' | 'yellow-300' | 'yellow-500' | 'yellow-600' | 'yellow-700' |\n    'green-300' | 'green-500' | 'green-600' | 'green-700' | 'red-300' | 'red-500' | 'red-600' | 'red-700' | 'primary' |\n    'secondary' | 'minor' | 'link' | 'link-minor' | 'disabled' | 'disabled-transparent' |\n    'disabled-transparent-alt-bg' | 'primary-alt-bg' | 'secondary-alt-bg' | 'link-alt-bg' | 'error';\n\nexport type Color = UIKitColor;\n\nexport const cnCustomTypography = cn.bind(null, 'CustomTypography');\n\nexport interface ICustomTypographyProps extends AllHTMLAttributes<HTMLElement | HTMLLinkElement> {\n    /**\n     * Тип текста\n     * @default 'primary'\n     */\n    level?: Level;\n\n    /**\n     * Конкретный тэг HTML\n     **/\n    tag?: React.ElementType;\n\n    /**\n     * Цвет текста\n     * @default --c-text-primary (задаётся глобально, находится в vtblife/uikit-2/dist/css/global.css)\n     **/\n    color?: Color;\n\n    /**\n     * Жирный ли текст\n     **/\n    bold?: boolean;\n\n    /**\n     * перечеркнутый ли текст\n     **/\n    lineThrough?: boolean;\n\n    /**\n     * Запрещено ли переносить текст\n     * @default 'false'\n     **/\n    noWrap?: boolean;\n\n    /**\n     * Выравнивание текста\n     **/\n    align?: 'left' | 'center' | 'right' | 'justify';\n}\n\nconst CustomTypography: React.FC<ICustomTypographyProps> = React.forwardRef<HTMLElement, ICustomTypographyProps>((\n    props,\n    ref\n) => {\n    const {\n        level = 'primary',\n        tag,\n        color,\n        bold,\n        lineThrough = false,\n        noWrap = false,\n        align,\n        className: classNameProp,\n        ...rest\n    } = props;\n\n    const Component = tag ||\n        [ 'h1', 'h2', 'h3', 'h4' ].find(t => level.includes(t)) ||\n        'div';\n\n    const className = useMemo(() => cnCustomTypography(null, {\n        level,\n        color,\n        bold,\n        lineThrough,\n        noWrap,\n        align\n    }, classNameProp), [\n        level,\n        color,\n        bold,\n        lineThrough,\n        noWrap,\n        align,\n        classNameProp\n    ]);\n\n    return (\n        <Component\n            {...rest}\n            ref={ref}\n            className={className}\n        />\n    );\n});\n\nexport default CustomTypography;\n","import React from 'react';\n\ntype SVGProps = {\n    color: string;\n    opacity?: number;\n};\n\nconst icons = {\n    FOOT: ({ color, opacity }: SVGProps) => (\n        <svg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'>\n            {/* eslint-disable-next-line max-len */}\n            <path d='M5.739 11.118l1.166 1.867-.9 2.449a.878.878 0 01-1.116.516.87.87 0 01-.516-1.116l1.366-3.716zM3.14 6.82l.966-1.416c.267-.383.65-.683 1.083-.85 1.766-.683 2-.666 2.166-.666l1.25.083c.35.017.616.117 1.932 1.783a.86.86 0 00.483.3l1.3.283a.75.75 0 01.583.9.759.759 0 01-.9.583l-1.3-.283c-.533-.117-1-.417-1.349-.834a1.77 1.77 0 00-.15-.183l-1.2 3.499 2.9 4.648c.25.417.133.95-.284 1.2a.943.943 0 01-.466.133c-.3 0-.583-.15-.733-.416L5.822 9.802A2.509 2.509 0 015.54 7.82l.583-2c-.117.05-.25.1-.4.15a.963.963 0 00-.383.3l-.966 1.416a.754.754 0 01-.617.334c-.15 0-.3-.05-.433-.134-.333-.25-.433-.716-.183-1.066zM8.06 3.49A1.75 1.75 0 118.44.01a1.75 1.75 0 01-.38 3.48z' fill={color} fillOpacity={opacity} />\n        </svg>\n    ),\n    PUBLIC_TRANSPORT: ({ color, opacity }: SVGProps) => (\n        <svg width='16' height='16' fill='none' xmlns='http://www.w3.org/2000/svg'>\n            {/* eslint-disable-next-line max-len */}\n            <path fillRule='evenodd' clipRule='evenodd' d='M14.43 9.237l.01.241.059 1.835a2.343 2.343 0 01-.499 1.52V14.5a.5.5 0 01-.5.5H12a.5.5 0 01-.5-.5v-.768h-7v.768a.5.5 0 01-.5.5H2.5a.5.5 0 01-.5-.5v-1.666a2.343 2.343 0 01-.499-1.52l.06-1.834.008-.244.28-7.135A1.28 1.28 0 013.118 1h9.766c.637 0 1.177.47 1.268 1.101l.28 7.136zM2.633 10.91a1.095 1.095 0 101.093-1.096c-.604 0-1.093.49-1.093 1.096zm8.549 0a1.095 1.095 0 102.188 0 1.095 1.095 0 10-2.188 0zM3.245 8.615c3.022.503 6.206.463 9.494-.017a.787.787 0 00.672-.802c-.04-1.356-.112-4.218-.112-4.218a.499.499 0 00-.488-.432c-1.363-.264-8.134-.244-9.621 0a.499.499 0 00-.489.432s-.073 2.888-.113 4.238a.785.785 0 00.657.8zM7 1.5a.5.5 0 000 1h2a.5.5 0 000-1H7z' fill={color} fillOpacity={opacity} />\n        </svg>\n    )\n};\n\nexport type IconTransportProps = {\n    transportType: 'FOOT' | 'PUBLIC_TRANSPORT';\n} & SVGProps;\n\nconst IconTransport: React.FunctionComponent<IconTransportProps> = ({\n    transportType,\n    color,\n    opacity = 1\n}) => {\n    const Icon = icons[transportType];\n\n    return (\n        <Icon\n            color={color}\n            opacity={opacity}\n        />\n    );\n};\n\nexport default IconTransport;\n","import React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport type { DeveloperPromoEventResult } from '../../../developer-promo/analytics';\nimport { useGtmOnVisible } from '../../../../google/useGtmOnVisible';\nimport { useClassifiedOfferDataLayerPush } from '../../../../offer/analytics/ClassifiedOfferGtmContext';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'ImageBanner');\n\ninterface IImageBannerProps {\n    targetLink: string;\n    image: string;\n    view: 'square' | 'horizontal';\n    gtm?: string;\n    gtmClickData?: { event: string } | DeveloperPromoEventResult;\n    gtmAdditionalClickData?: { event: string };\n    gtmShowData?: { event: string } | DeveloperPromoEventResult;\n    className?: string;\n    loading?: 'lazy' | 'eager';\n}\n\nconst ImageBanner: React.FC<IImageBannerProps> = ({\n    targetLink,\n    image,\n    view,\n    gtm,\n    gtmClickData,\n    gtmShowData,\n    gtmAdditionalClickData,\n    className,\n    loading\n}) => {\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    const containerRef = React.useRef<HTMLAnchorElement>(null);\n\n    const handleClick = React.useCallback(() => {\n        gtmClickData && dataLayerPush(gtmClickData);\n        gtmAdditionalClickData && dataLayerPush(gtmAdditionalClickData);\n    }, [ gtmClickData, gtmAdditionalClickData, dataLayerPush ]);\n    const onVisible = React.useCallback(() => {\n        gtmShowData && dataLayerPush(gtmShowData);\n    }, [ gtmShowData, dataLayerPush ]);\n\n    useGtmOnVisible({ containerRef, onVisible });\n\n    return (\n        <a\n            ref={containerRef}\n            href={targetLink}\n            target='_blank'\n            className={cn(null, { view }, className)}\n            data-gtm={gtm}\n            onClick={handleClick}\n        >\n            <img\n                src={image}\n                className={cn('image')}\n                crossOrigin='anonymous'\n                alt=''\n                loading={loading}\n            />\n        </a>\n    );\n};\n\nexport default ImageBanner;\n\n","import React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cnList = classname.bind(null, 'List');\n\ninterface IList {\n    /**\n     * Вид списка\n     */\n    layout?: 'horizontal' | 'vertical';\n\n    /**\n     * Разделитель между элементами в режиме horizontal\n     */\n    separator?: string | React.ReactNode;\n\n    children: Array<React.ReactNode>;\n\n    className?: string;\n}\n\nexport const List: React.FunctionComponent<IList> = ({\n    children,\n    className,\n    separator,\n    layout = 'horizontal'\n}) => {\n    const content = React.Children.toArray(children).reduce((ret: Array<React.ReactNode>, item, index) => {\n        if (index > 0 && separator) {\n            ret.push(\n                <span\n                    key={`separator_${index}`}\n                    className={cnList('separator')}\n                >\n                    {separator}\n                </span>\n            );\n        }\n\n        ret.push(item);\n\n        return ret;\n    }, []);\n\n    return (\n        <ul className={cnList(null, { layout }, className)}>\n            {content}\n        </ul>\n    );\n};\n\ninterface IListItem {\n    title?: string;\n    className?: string;\n}\n\nexport const ListItem: React.FunctionComponent<IListItem> = ({ children, className, title = '' }) => {\n    return (\n        <li\n            title={title}\n            className={cnList('item', undefined, className)}\n        >\n            {children}\n        </li>\n    );\n};\n","import React from 'react';\n\nimport { FixedSizeBanner } from '@vtblife/media-kit/dist/banners/fixed-size-banner/fixed-size-banner';\n\nimport { DeveloperPromoEventResult } from '../../../../newbuilding/developer-promo/analytics';\nimport { useClassifiedOfferDataLayerPush } from '../../../../offer/analytics/ClassifiedOfferGtmContext';\n\ninterface IMediaKitFixedSizeBannerProps{\n    gtmClickData?: { event: string } | DeveloperPromoEventResult;\n    gtmShowData?: { event: string } | DeveloperPromoEventResult;\n    dataGtm?: string;\n}\n\nconst MediaKitFixedSizeBanner: React.FunctionComponent<IMediaKitFixedSizeBannerProps> = ({\n    gtmClickData,\n    gtmShowData,\n    dataGtm\n}) => {\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    return (\n        <FixedSizeBanner\n            placementId='nb-page-side'\n            format='300x300'\n            dataGtm={dataGtm}\n            onClick={gtmClickData ? () => (dataLayerPush(gtmClickData)) : undefined}\n            onShow={gtmShowData ? () => (dataLayerPush(gtmShowData)) : undefined}\n            defaultProps={{\n                desktopImageUrl: 'https://cdn.m2.ru/assets/file-upload-server/39b07be20aedfd9d9e1413e9226788b6.jpeg',\n                format: '300x300',\n                urls: [ 'https://m2.ru/ipoteka/' ]\n            }}\n        />\n    );\n};\n\nexport default React.memo(MediaKitFixedSizeBanner);\n","import React, { FunctionComponent } from 'react';\nimport { Typography, Link } from '@vtblife/uikit';\n\nimport type { RouteMetro } from '@search/graphql-typings';\n\nimport classname from '@search/classname/src';\n\nimport IconTransport from '../IconTransport';\nimport type { IconTransportProps } from '../IconTransport';\n\nimport './styles.css';\n\nexport interface IMetroRouteProps {\n    metro: RouteMetro;\n    view?: 'desktop' | 'mobile';\n    onDarkBackground?: boolean;\n    className?: string;\n    withoutTransport?: boolean;\n    searchUrl?: string;\n}\n\nconst cn = classname.bind(null, 'MetroRoute');\n\nconst MetroRoute: FunctionComponent<IMetroRouteProps> = ({\n    view = 'desktop',\n    metro,\n    onDarkBackground = false,\n    className,\n    withoutTransport,\n    searchUrl\n}) => {\n    const isMobile = view === 'mobile';\n    const level = isMobile ? 'secondary-alone' : undefined;\n    const {\n        station,\n        timeMinutes,\n        transportType\n    } = metro;\n\n    const { name, lines } = station || {};\n    const hasSearchUrl = Boolean(searchUrl);\n\n    return (\n        <div className={cn(null, undefined, className)}>\n            <div>\n                {\n                    lines?.map(color => (\n                        <div\n                            key={color}\n                            className={cn('line')}\n                            style={{ backgroundColor: color }}\n                        />\n                    ))\n                }\n            </div>\n            {\n                hasSearchUrl ? (\n                    <div>\n                        <Link\n                            href={searchUrl}\n                            text={false}\n                            target='blank'\n                        >\n                            <Typography\n                                tag='span'\n                                variant={level}\n                                color={onDarkBackground ? 'white-500' : 'primary'}\n                                className={cn('name', { isUrl: true })}\n                            >\n                                {name}\n                            </Typography>\n                        </Link>\n                    </div>\n                ) : (\n                    <Typography\n                        variant={level}\n                        color={onDarkBackground ? 'white-500' : 'primary'}\n                    >\n                        {name}\n                    </Typography>\n                )\n            }\n            {\n                withoutTransport ? null : (\n                    <Typography\n                        variant={level}\n                        // eslint-disable-next-line no-nested-ternary\n                        color={onDarkBackground ? 'white-500' : 'secondary'}\n                    >\n                        <IconTransport\n                            transportType={transportType as IconTransportProps['transportType']}\n                            // eslint-disable-next-line no-nested-ternary\n                            color={onDarkBackground ? '#fff' : '#a4a1b5'}\n                        />\n                        {`${timeMinutes} мин.`}\n                    </Typography>\n                )\n            }\n        </div>\n    );\n};\n\nexport default MetroRoute;\n","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport isEqual from 'lodash/isEqual';\n\nimport { Button, LinkButton } from '@vtblife/uikit';\nimport { LinkButtonProps } from '@vtblife/uikit/dist/components/link/types';\n\nimport { formatPhone } from '@search/helpers/src/formatPhone';\nimport { NewBuildingWhitelabelEnum } from '@search/graphql-typings';\nimport { useManualGql, graphql } from '@search/gql-client/src/useGql';\n\nimport { DATA_GTM } from '../../../libs/constants';\nimport { NewBuildingAnalytics } from '../../../analytics/NewBuildingAnalytics';\nimport { useCalltouchReplacement } from '../../../hooks/useCalltouchReplacement';\nimport { dataLayerPush } from '../../../../google/dataLayerPush';\n\nimport type {\n    SnippetPhoneQuery$data as SnippetPhoneQueryResponse,\n    SnippetPhoneQuery$variables as SnippetPhoneQueryVariables\n} from './__generated__/SnippetPhoneQuery.graphql';\n\ntype PhoneParamsType = {\n    newBuildingId: number;\n    developerId: number;\n    phoneNum: number;\n    whitelabel?: NewBuildingWhitelabelEnum;\n}\n\ninterface IPhoneProps {\n    phoneParams: PhoneParamsType;\n    isMobile?: boolean;\n    render?(props: {\n        href?: string;\n        handleClick: Function;\n        phone: string;\n        loading: boolean;\n    }): React.ReactElement;\n    onPhoneEventPush?: () => void;\n    onMap?: boolean;\n    calltouchId?: string;\n    fullWidth?: LinkButtonProps['fullWidth'];\n    variant?: LinkButtonProps['variant'];\n    size?: LinkButtonProps['size'];\n    gtm?: LinkButtonProps['gtm'];\n}\n\ntype ButtonDataType = {\n    href?: string;\n    text: string;\n    loading: boolean;\n};\n\nconst DEFAULT_BUTTON_TEXT = 'Показать телефон';\n\nconst SNIPPET_PHONE_QUERY = graphql`\n    query SnippetPhoneQuery(\n        $developerId: Int!,\n        $newBuildingId: Int!,\n        $phoneNum: Int!,\n        $whitelabel: NewBuildingWhitelabelEnum\n    ) {\n        newBuildingPhone(\n            phoneNum: $phoneNum\n            newBuildingId: $newBuildingId\n            developerId: $developerId\n            whiteLabel: $whitelabel\n        ) {\n            formattedNumber\n            isReplaceable\n        }\n    }\n`;\n\nconst SnippetPhone = ({\n    onPhoneEventPush,\n    phoneParams,\n    render,\n    onMap,\n    isMobile,\n    calltouchId,\n    ...buttonProps\n}: IPhoneProps) => {\n    const [ phoneFromGql, setPhoneFromGql ] = useState<{\n        formattedNumber: string;\n        isReplaceable: boolean;\n    }>({\n        formattedNumber: '',\n        isReplaceable: false\n    });\n    const [ originalPhone, setOriginalPhone ] = useState<string>('');\n    const [ buttonData, setButtonData ] = useState<ButtonDataType>({\n        href: undefined,\n        text: DEFAULT_BUTTON_TEXT,\n        loading: false\n    });\n\n    const phoneParamsRef = useRef<PhoneParamsType>();\n\n    useEffect(() => {\n        if (! isEqual(phoneParamsRef.current, phoneParams)) {\n            phoneParamsRef.current = phoneParams;\n        }\n    }, [ phoneParams ]);\n\n    const { load } = useManualGql<SnippetPhoneQueryVariables, SnippetPhoneQueryResponse>(SNIPPET_PHONE_QUERY);\n\n    const makeCall = useCallback((phoneURL?: string) => {\n        const href = phoneURL || buttonData.href;\n\n        href && window.open(href, '_self');\n    }, [ buttonData.href ]);\n\n    const handleClick = useCallback(() => {\n        if (! phoneFromGql.formattedNumber) {\n            setButtonData(prevState => ({\n                ...prevState,\n                loading: true\n            }));\n\n            // eslint-disable-next-line @typescript-eslint/no-floating-promises\n            load(phoneParams).then(data => {\n                if (data?.newBuildingPhone) {\n                    setPhoneFromGql(data?.newBuildingPhone);\n                }\n            });\n\n            onPhoneEventPush && onPhoneEventPush();\n\n            return;\n        }\n\n        isMobile && makeCall();\n    }, [ onPhoneEventPush, phoneFromGql.formattedNumber, isMobile, makeCall, load, phoneParams ]);\n\n    useEffect(() => {\n        if (phoneFromGql.formattedNumber) {\n            let original = phoneFromGql.formattedNumber.replace(/\\s/g, '');\n\n            original = original.substring(original.length - 10);\n\n            setOriginalPhone(original);\n        }\n    }, [ calltouchId, phoneFromGql.formattedNumber ]);\n\n    const { calltouchPhone, hasTriedReplace, replaceError } = useCalltouchReplacement({\n        originalPhone,\n        ctId: calltouchId\n    });\n\n    useEffect(() => {\n        if ((hasTriedReplace || ! calltouchId) && originalPhone && buttonData.text === DEFAULT_BUTTON_TEXT) {\n            const phone = calltouchPhone || originalPhone;\n            const href = `tel:+7${phone}`;\n\n            setButtonData(prevState => ({\n                ...prevState,\n                href,\n                text: formatPhone(`8${phone}`, { skipSymbols: true, separateLast: true }),\n                loading: false\n            }));\n\n            isMobile && makeCall(href);\n        }\n    }, [\n        isMobile, calltouchId, calltouchPhone, originalPhone, buttonData.text, hasTriedReplace, makeCall\n    ]);\n\n    useEffect(() => {\n        if (calltouchPhone) {\n            dataLayerPush({\n                event: NewBuildingAnalytics.NewBuildingReplacePhone,\n                'phone-origin': originalPhone,\n                'phone-replace': calltouchPhone\n            });\n        }\n    }, [ calltouchPhone, originalPhone ]);\n\n    useEffect(() => {\n        if (replaceError !== 'NONE') {\n            dataLayerPush({\n                event: NewBuildingAnalytics.NewBuildingReplacePhoneFail,\n                'phone-origin': originalPhone\n            });\n        }\n    }, [ replaceError, originalPhone ]);\n\n    useEffect(() => {\n        if (hasTriedReplace) {\n            dataLayerPush({\n                event: NewBuildingAnalytics.NewBuildingReplacePhoneTry,\n                replaceable: phoneFromGql.isReplaceable,\n                replaced: Boolean(calltouchPhone),\n                'replace-error': replaceError,\n                'phone-origin': originalPhone,\n                ...(calltouchPhone ? {\n                    'phone-replace': calltouchPhone\n                } : {})\n            });\n        }\n    }, [ hasTriedReplace, calltouchPhone, phoneFromGql.isReplaceable, originalPhone ]);\n\n    if (render) {\n        return render({\n            handleClick,\n            href: buttonData.href,\n            phone: buttonData.text,\n            loading: buttonData.loading\n        });\n    }\n\n    const commonButtonProps = {\n        size: buttonProps.size ?? 's',\n        onClick: handleClick,\n        href: buttonData.href,\n        gtm: onPhoneEventPush || phoneFromGql.formattedNumber ? undefined : (buttonProps.gtm ?? DATA_GTM.SNIPPET_PHONE),\n        fullWidth: buttonProps.fullWidth,\n        variant: buttonProps.variant ?? 'primary',\n        loading: buttonData.loading\n    };\n\n    return isMobile ? (\n        <Button\n            {...commonButtonProps}\n            variant={buttonProps.variant ?? 'primary'}\n        >\n            Позвонить\n        </Button>\n    ) : (\n        <LinkButton\n            {...commonButtonProps}\n            href={buttonData.href}\n        >\n            {buttonData.text}\n        </LinkButton>\n    );\n};\n\nexport default SnippetPhone;\n","import React from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'FilterCollapser');\n\nexport function FilterCollapser({\n    activeCount,\n    collapsed,\n    reset: resetRaw,\n    toggle\n}: {\n    toggle: () => void;\n    reset: () => void;\n    activeCount: number;\n    collapsed: boolean;\n}) {\n    const reset = React.useCallback((e: MouseEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        resetRaw();\n    }, [ resetRaw ]);\n\n    return (\n        <div\n            onClick={toggle}\n            className={cn()}\n            data-test='filter-toggle'\n        >\n            <div className={cn('inner')}>\n                <Typography variant='primary'>Фильтры</Typography>\n                {\n                    activeCount ? (\n                        <>\n                            <div className={cn('counter')}>{activeCount}</div>\n                            <Typography\n                                tag='span'\n                                variant='primary'\n                                onClick={reset}\n                                className={cn('reset')}\n                                data-test='filter-reset'\n                            >\n                                Сбросить\n                            </Typography>\n                        </>\n                    ) : null\n                }\n            </div>\n            <div className={cn('toggle')}>\n                <Icon\n                    name={collapsed ? 'chevron-down' : 'chevron-up'}\n                    size={Size.Small}\n                />\n            </div>\n        </div>\n    );\n}\n\nexport function useFilterCollapser({\n    reset,\n    initCollapsed = false,\n    clearSelected\n}: {\n    clearSelected: () => void;\n    initCollapsed?: boolean;\n    reset?: () => void;\n}) {\n    const [ collapsed, setCollapsed ] = React.useState<boolean>(initCollapsed);\n\n    const toggleCollapsed = React.useCallback(() => {\n        setCollapsed(prevState => ! prevState);\n        clearSelected();\n    }, [ setCollapsed, clearSelected ]);\n\n    const handleReset = React.useCallback(() => {\n        setCollapsed(false);\n        clearSelected();\n        reset && reset();\n    }, [ reset, setCollapsed, clearSelected ]);\n\n    const close = React.useCallback(\n        () => setCollapsed(true),\n        [ setCollapsed ]\n    );\n\n    return {\n        reset: handleReset,\n        collapsed,\n        close,\n        toggleCollapsed\n    };\n}\n","import React, { useState } from 'react';\n\nexport interface ISnippetContext {\n    state: ISnippetProviderContext;\n    toggleMap: () => void;\n    openMap: () => void;\n    closeMap: () => void;\n    setState: React.Dispatch<React.SetStateAction<ISnippetProviderContext>>;\n}\n\nexport interface ISnippetProviderContext {\n    isOpenMap: boolean;\n}\n\nexport const SnippetContext = React.createContext<ISnippetContext | undefined>(undefined);\n\nexport const SnippetProviderContext: React.FunctionComponent<{}> = props => {\n    const [ state, setState ] = useState<ISnippetProviderContext>({ isOpenMap: false });\n    const toggleMap = () => {\n        setState(prevState => ({ ...prevState, isOpenMap: ! prevState.isOpenMap }));\n    };\n    const openMap = () => {\n        setState(prevState => prevState.isOpenMap ? prevState : { ...prevState, isOpenMap: true });\n    };\n    const closeMap = () => {\n        setState(prevState => ! prevState.isOpenMap ? prevState : { ...prevState, isOpenMap: false });\n    };\n\n    return (\n        <SnippetContext.Provider value={{ state, toggleMap, openMap, setState, closeMap }}>\n            {props.children}\n        </SnippetContext.Provider>\n    );\n};\n","/* eslint-disable camelcase */\nimport { DeveloperWithPromoName } from './types';\n\nconst DeveloperToRegionMap = {\n    samolet: 'ipoteka',\n    mortgage: 'ipoteka_region'\n} as const;\n\ntype DeveloperWithPromoNameOrMoprtgage = DeveloperWithPromoName | 'mortgage';\ntype SpecProjectCityKeys = typeof DeveloperToRegionMap[keyof typeof DeveloperToRegionMap]\ntype DeveloperPromoEvent = {\n    event: 'nb_evt_banner';\n    theme: `${SpecProjectCityKeys}_special_project`;\n    section: 'banner_right' | 'banner_left' | 'promo_block' | 'spec_snippet' | 'slider' | 'JK_list' | 'phone' | 'JK' | 'developer' | 'logo';\n    action: 'click' | 'view' | 'open';\n    pageType: 'card' | 'serp' | 'landing' | 'placeholder' | 'main';\n};\n\nexport type DeveloperPromoEventResult = Omit<DeveloperPromoEvent, 'pageType'> & { page_type: DeveloperPromoEvent['pageType'] }\n\nexport const getDeveloperBannerGtmData = (\n    developerWithPromoName: DeveloperWithPromoNameOrMoprtgage | undefined | string,\n    data: Pick<DeveloperPromoEvent, 'section' | 'action' | 'pageType'>\n): DeveloperPromoEventResult | undefined => {\n    const { pageType: page_type, ...rest } = data;\n    const commonFields = { ...rest, page_type, event: 'nb_evt_banner' as const };\n\n    switch (developerWithPromoName) {\n        case 'samolet':\n            if (page_type === 'card') {\n                return {\n                    theme: `${DeveloperToRegionMap[developerWithPromoName]}_special_project`,\n                    ...commonFields\n                };\n            }\n            break;\n\n        default: {\n            const keySpecProject = DeveloperToRegionMap[developerWithPromoName as unknown as DeveloperWithPromoNameOrMoprtgage];\n\n            if (! keySpecProject) return;\n            return {\n                theme: `${keySpecProject}_special_project`,\n                ...commonFields\n            };\n        }\n    }\n};\n","import { IDeserializer } from '../../../view/filters/services/codecs/FilterDeserializer';\nimport {\n    Filters,\n    IFilter,\n    RoomFilter,\n    RegionFilter,\n    PriceFilter,\n    TransportLimitFilter,\n    GeoFilter,\n    CommissioningFilter,\n    FinishingTypeFilter,\n    AreaFilter,\n    LivingAreaFilter,\n    KitchenAreaFilter,\n    FloorFilter,\n    CellHeightFilter,\n    BathroomFilter,\n    BalconyFilter,\n    ParkingFilter,\n    WallsTypeFilter,\n    ApartmentFilter,\n    PositionFilter,\n    DeveloperFilter,\n    FloorsTotalFilter,\n    BuildingClassFilter,\n    SafetyFilter,\n    AccreditationFilter,\n    NewBuildingDealFilter,\n    PaymentTypeFilter,\n    CommissioningListFilter,\n    BuildingsFilter,\n    FinishingFlatFilter,\n    ClosedSalesFilter,\n    ShowHighlightedFilter,\n    MapBoundsFilter,\n    SelectedNewBuildingFilter,\n    FlatsSpecialEventsFilter,\n    OtherSpecialEventsFilter,\n    MiscSpecialEventsFilter,\n    NotOnlyM2ProFilter,\n} from '../../../view/filters/models/Filter';\n\nimport {\n    Area,\n    FloorConstraints,\n    Rooms,\n    TransportType,\n    TimeLimit,\n    CeilingHeight,\n    BalconyOptions,\n    ParkingType,\n    WallsType,\n    IsApartments,\n    Position,\n    Safety,\n    BuildingClass,\n    Accreditation,\n    NewBuildingDeal,\n    PaymentType,\n    Bathroom,\n    FlatsSpecialEvents,\n    OtherSpecialEvents,\n    MiscSpecialEvents\n} from './converters';\n\nconst ensureArray = (value: any): any[] => value ? [].concat(value) : [];\nconst ensureNumericArray = (value: any): number[] => ensureArray(value).map(Number);\n\nconst deserializers: Record<Filters, IDeserializer> = {\n    [Filters.commissioning]: {\n        keys: [ 'commissioning' ],\n        handler: ({ commissioning }) => new CommissioningFilter(commissioning)\n    },\n    [Filters.finishingType]: {\n        keys: [ 'hasFinishing', 'finishingType' ],\n        handler: ({ hasFinishing, finishingType }) => new FinishingTypeFilter({\n            hasFinishing,\n            finishingType\n        })\n    },\n    [Filters.region]: {\n        keys: [ 'region' ],\n        handler: ({ region }) => new RegionFilter(region && parseInt(region, 10))\n    },\n    [Filters.rooms]: {\n        keys: [ 'rooms' ],\n        handler: ({ rooms }) => new RoomFilter(\n            ensureArray(rooms).map(value => Rooms.enumValue[value as keyof typeof Rooms.enumValue])\n        )\n    },\n    [Filters.price]: {\n        keys: [ 'priceMin', 'priceMax', 'priceType' ],\n        handler: ({ priceMin, priceMax, priceType }) => new PriceFilter(\n            Area.enumValue[priceType as keyof typeof Area.enumValue],\n            {\n                from: priceMin || null,\n                to: priceMax || null\n            }\n        )\n    },\n    [Filters.transportLimit]: {\n        keys: [ 'transportType', 'maxMinutes' ],\n        handler: ({ transportType, maxMinutes }) => new TransportLimitFilter(\n            TimeLimit.enumValue[maxMinutes],\n            TransportType.enumValue[transportType]\n        )\n    },\n    [Filters.geo]: {\n        keys: [ 'metroId', 'districtId', 'addressId', 'newBuildingId' ],\n        handler: ({ metroId, districtId, addressId, newBuildingId }) => {\n            const parsedMetroIds = ensureNumericArray(metroId);\n            const parsedDistrictIds = ensureNumericArray(districtId);\n            const parsedAddressIds = ensureNumericArray(addressId);\n            const parsedNewBuildingIds = ensureNumericArray(newBuildingId);\n\n            return new GeoFilter(\n                new Set([ ...parsedMetroIds, ...parsedDistrictIds, ...parsedAddressIds ]),\n                parsedMetroIds,\n                parsedDistrictIds,\n                parsedAddressIds,\n                parsedNewBuildingIds\n            );\n        }\n    },\n    [Filters.totalArea]: {\n        keys: [ 'totalAreaRangeMin', 'totalAreaRangeMax' ],\n        handler: ({ totalAreaRangeMin, totalAreaRangeMax }) => new AreaFilter({\n            from: totalAreaRangeMin || null,\n            to: totalAreaRangeMax || null\n        })\n    },\n    [Filters.livingArea]: {\n        keys: [ 'livingAreaRangeMin', 'livingAreaRangeMax' ],\n        handler: ({ livingAreaRangeMin, livingAreaRangeMax }) => new LivingAreaFilter({\n            from: livingAreaRangeMin || null,\n            to: livingAreaRangeMax || null\n        })\n    },\n    [Filters.kitchenArea]: {\n        keys: [ 'kitchenAreaRangeMin' ],\n        handler: ({ kitchenAreaRangeMin }) => new KitchenAreaFilter({\n            from: kitchenAreaRangeMin || null,\n            to: null\n        })\n    },\n    [Filters.floor]: {\n        keys: [ 'floorMin', 'floorMax', 'floorFirst', 'floorLast' ],\n        handler: ({ floorMin, floorMax, floorFirst, floorLast }) => new FloorFilter(\n            {\n                from: floorMin || null,\n                to: floorMax || null\n            },\n            FloorConstraints.enumValue[floorFirst] || null,\n            FloorConstraints.enumValue[floorLast] || null\n        )\n    },\n    [Filters.cellHeight]: {\n        keys: [ 'ceilingHeight' ],\n        handler: ({ ceilingHeight }) => new CellHeightFilter(\n            CeilingHeight.enumValue[ceilingHeight as keyof typeof CeilingHeight.enumValue]\n        )\n    },\n    [Filters.bathroom]: {\n        keys: [ 'bathroom' ],\n        handler: ({ bathroom }) => {\n            if (! bathroom) {\n                return new BathroomFilter();\n            }\n\n            return new BathroomFilter(\n                [].concat(bathroom)\n                    .map((value: string) => Bathroom.enumValue[value])\n                    .filter(Boolean)\n            );\n        }\n    },\n    [Filters.balcony]: {\n        keys: [ 'balcony' ],\n        handler: ({ balcony }) => new BalconyFilter(balcony ? BalconyOptions.enumValue.HAS_ANY : undefined)\n    },\n    [Filters.parkings]: {\n        keys: [ 'parking' ],\n        handler: ({ parking }) => new ParkingFilter(\n            ensureArray(parking)\n                .map(item => ParkingType.enumValue[item as keyof typeof ParkingType.enumValue])\n        )\n    },\n    [Filters.walls]: {\n        keys: [ 'wallsType' ],\n        handler: ({ wallsType }) => new WallsTypeFilter(\n            ensureArray(wallsType)\n                .map(item => WallsType.enumValue[item as keyof typeof WallsType.enumValue])\n        )\n    },\n    [Filters.apartments]: {\n        keys: [ 'apartments' ],\n        handler: ({ apartments }) => new ApartmentFilter(\n            IsApartments.enumValue[apartments as keyof typeof IsApartments.enumValue]\n        )\n    },\n    [Filters.position]: {\n        keys: [ 'standalone' ],\n        handler: ({ standalone }) => new PositionFilter(\n            [ standalone && Position.enumValue.standalone ]\n                .filter(Boolean)\n        )\n    },\n    [Filters.safety]: {\n        keys: [ 'concierge', 'closedArea', 'guardedArea' ],\n        handler: ({ concierge, closedArea, guardedArea }) => new SafetyFilter(\n            [\n                concierge && Safety.enumValue.concierge,\n                closedArea && Safety.enumValue.closedArea,\n                guardedArea && Safety.enumValue.guardedArea\n            ]\n                .filter(Boolean)\n        )\n    },\n    [Filters.developer]: {\n        keys: [ 'developerId' ],\n        handler: ({ developerId }) => new DeveloperFilter(developerId && Number(developerId))\n    },\n    [Filters.floorsTotal]: {\n        keys: [ 'floorsTotalMin', 'floorsTotalMax' ],\n        handler: ({ floorsTotalMin, floorsTotalMax }) => new FloorsTotalFilter({\n            from: floorsTotalMin || null,\n            to: floorsTotalMax || null\n        })\n    },\n    [Filters.buildingClass]: {\n        keys: [ 'buildingClass' ],\n        handler: ({ buildingClass }) => new BuildingClassFilter(\n            ensureArray(buildingClass)\n                .map(item => BuildingClass.enumValue[item as keyof typeof BuildingClass.enumValue])\n        )\n    },\n    [Filters.accreditation]: {\n        keys: [ 'accreditedByVTB' ],\n        handler: ({ accreditedByVTB }) => new AccreditationFilter(\n            [ accreditedByVTB && Accreditation.enumValue.accreditedByVTB ]\n                .filter(Boolean)\n        )\n    },\n    [Filters.newBuildingDeal]: {\n        keys: [ 'law214', 'escrow' ],\n        handler: ({ law214, escrow }) => new NewBuildingDealFilter(\n            [\n                law214 && NewBuildingDeal.enumValue.law214,\n                escrow && NewBuildingDeal.enumValue.escrow\n            ]\n                .filter(Boolean)\n        )\n    },\n    [Filters.paymentType]: {\n        keys: [ 'armyMortgage', 'installment', 'motherCapital' ],\n        handler: ({ armyMortgage, installment, motherCapital }) => new PaymentTypeFilter(\n            [\n                armyMortgage && PaymentType.enumValue.armyMortgage,\n                installment && PaymentType.enumValue.installment,\n                motherCapital && PaymentType.enumValue.motherCapital\n            ]\n                .filter(Boolean)\n        )\n    },\n    [Filters.commissioningList]: {\n        keys: [ 'commissioningDate' ],\n        handler: ({ commissioningDate }) => new CommissioningListFilter(ensureArray(commissioningDate))\n    },\n    [Filters.buildings]: {\n        keys: [ 'buildingId' ],\n        handler: ({ buildingId }) => new BuildingsFilter(ensureNumericArray(buildingId))\n    },\n    [Filters.finishingFlat]: {\n        keys: [ 'finishingFlat' ],\n        handler: ({ finishingFlat }) => new FinishingFlatFilter({ finishingType: finishingFlat })\n    },\n    [Filters.closedSales]: {\n        keys: [ 'closedSales' ],\n        handler: ({ closedSales }) => new ClosedSalesFilter(closedSales)\n    },\n    [Filters.showHighlighted]: {\n        keys: [ 'showHighlighted' ],\n        handler: ({ showHighlighted }) => new ShowHighlightedFilter(showHighlighted)\n    },\n    [Filters.mapBounds]: {\n        keys: [ 'mapBounds' ],\n        handler: ({ mapBounds }) => {\n            return new MapBoundsFilter(mapBounds?.bounds, mapBounds?.polygon);\n        }\n    },\n    [Filters.selectedNewBuilding]: {\n        keys: [ 'selectedNewBuildingId' ],\n        handler: ({ selectedNewBuildingId }) => new SelectedNewBuildingFilter(\n            selectedNewBuildingId && Number(selectedNewBuildingId)\n        )\n    },\n    [Filters.flatsSpecialEvents]: {\n        keys: [ 'flatsSpecialEvents' ],\n        handler: ({ flatsSpecialEvents }) => new FlatsSpecialEventsFilter(\n            ensureArray(flatsSpecialEvents)\n                .map(item => FlatsSpecialEvents.enumValue[item as keyof typeof FlatsSpecialEvents.enumValue])\n        )\n    },\n    [Filters.otherSpecialEvents]: {\n        keys: [ 'otherSpecialEvents' ],\n        handler: ({ otherSpecialEvents }) => new OtherSpecialEventsFilter(\n            ensureArray(otherSpecialEvents)\n                .map(item => OtherSpecialEvents.enumValue[item as keyof typeof OtherSpecialEvents.enumValue])\n        )\n    },\n    [Filters.miscSpecialEvents]: {\n        keys: [ 'miscSpecialEvents' ],\n        handler: ({ miscSpecialEvents }) => new MiscSpecialEventsFilter(\n            ensureArray(miscSpecialEvents)\n                .map(item => MiscSpecialEvents.enumValue[item as keyof typeof MiscSpecialEvents.enumValue])\n        )\n    },\n    [Filters.notOnlyM2Pro]: {\n        keys: [ 'notOnlyM2Pro' ],\n        handler: ({ notOnlyM2Pro }) => new NotOnlyM2ProFilter(notOnlyM2Pro)\n    }\n};\n\nclass NewbuildingFilterDeserializer {\n    deserialize(parsedQuery: any): Map<Filters, IFilter> {\n        const result: Map<Filters, IFilter> = new Map<Filters, IFilter>();\n\n        (Object.keys(deserializers) as Filters[]).forEach((filterName: Filters) => {\n            const keys = deserializers[filterName].keys;\n\n            const hasFilter = keys.some(key => {\n                // @ts-ignore\n                return parsedQuery[key] !== undefined || parsedQuery[key] !== null;\n            });\n\n            const data = {};\n\n            for (const key of keys) {\n                // @ts-ignore\n                const parsedObject = parsedQuery[key];\n\n                if (parsedObject) {\n                    // @ts-ignore\n                    data[key] = parsedObject;\n                }\n            }\n\n            if (hasFilter) {\n                result.set(filterName, deserializers[filterName].handler(data));\n            }\n        });\n\n        return result;\n    }\n}\n\nexport const newbuildingFilterDeserializer = new NewbuildingFilterDeserializer();\n","import { FilterCollection } from '../../../view/filters/models/FilterCollection';\n\nexport class NewbuildingFilterCollection extends FilterCollection {\n    rebuild() {\n        return new NewbuildingFilterCollection(this._filters);\n    }\n}\n","import { IFilter, Filters } from '../../../view/filters/models/Filter';\nimport { NewbuildingFilterCollection } from './NewbuildingFilterCollection';\n\nclass NewbuildingFilterFactory {\n    create(\n        filters: Map<Filters, IFilter> = new Map<Filters, IFilter>()\n    ): NewbuildingFilterCollection {\n        return new NewbuildingFilterCollection(\n            new Map<Filters, IFilter>(filters.entries())\n        );\n    }\n}\n\nexport const newbuildingFilterFactory = new NewbuildingFilterFactory();\n","import {\n    Filters,\n    IFilter,\n    AreaFilter,\n    LivingAreaFilter,\n    KitchenAreaFilter,\n    FloorFilter,\n    CellHeightFilter,\n    BathroomFilter,\n    BalconyFilter,\n    GeoFilter,\n    TransportLimitFilter,\n    SafetyFilter,\n    ParkingFilter,\n    WallsTypeFilter,\n    ApartmentFilter,\n    PositionFilter,\n    DeveloperFilter,\n    FloorsTotalFilter,\n    BuildingClassFilter,\n    AccreditationFilter,\n    NewBuildingDealFilter,\n    PaymentTypeFilter,\n    ClosedSalesFilter,\n    ShowHighlightedFilter,\n    BuildingsFilter,\n    SelectedNewBuildingFilter,\n    CommissioningListFilter,\n    RoomFilter,\n    PriceFilter,\n    FinishingFlatFilter,\n    FlatsSpecialEventsFilter,\n    OtherSpecialEventsFilter,\n    MiscSpecialEventsFilter,\n    NotOnlyM2ProFilter\n} from '../../../view/filters/models/Filter';\n\nimport { NewbuildingFilterCollection } from './NewbuildingFilterCollection';\nimport { newbuildingFilterDeserializer } from './NewbuildingFilterDeserializer';\nimport { newbuildingFilterFactory } from './NewbuildingFilterFactory';\n\nexport function getInitialFilters(params?: Object) {\n    let initialFilters;\n\n    if (params) {\n        initialFilters = newbuildingFilterDeserializer.deserialize(params);\n    }\n\n    return newbuildingFilterFactory.create(initialFilters);\n}\n\nexport function getInitialAdditionalFilters(prev: NewbuildingFilterCollection, resetGeo = true) {\n    return newbuildingFilterFactory.create(new Map<Filters, IFilter>([\n        ...prev.getFilters(),\n        [ Filters.totalArea, new AreaFilter() ],\n        [ Filters.livingArea, new LivingAreaFilter() ],\n        [ Filters.kitchenArea, new KitchenAreaFilter() ],\n        [ Filters.floor, new FloorFilter() ],\n        [ Filters.cellHeight, new CellHeightFilter() ],\n        [ Filters.bathroom, new BathroomFilter() ],\n        [ Filters.balcony, new BalconyFilter() ],\n        [ Filters.developer, new DeveloperFilter() ],\n        [ Filters.floorsTotal, new FloorsTotalFilter() ],\n        [ Filters.buildingClass, new BuildingClassFilter() ],\n        [ Filters.parkings, new ParkingFilter() ],\n        [ Filters.walls, new WallsTypeFilter() ],\n        [ Filters.apartments, new ApartmentFilter() ],\n        [ Filters.position, new PositionFilter() ],\n        [ Filters.safety, new SafetyFilter() ],\n        [ Filters.accreditation, new AccreditationFilter() ],\n        [ Filters.newBuildingDeal, new NewBuildingDealFilter() ],\n        [ Filters.paymentType, new PaymentTypeFilter() ],\n        [ Filters.transportLimit, new TransportLimitFilter() ],\n        [ Filters.closedSales, new ClosedSalesFilter() ],\n        [ Filters.selectedNewBuilding, new SelectedNewBuildingFilter() ],\n        [ Filters.showHighlighted, new ShowHighlightedFilter() ],\n        [ Filters.flatsSpecialEvents, new FlatsSpecialEventsFilter() ],\n        [ Filters.otherSpecialEvents, new OtherSpecialEventsFilter() ],\n        [ Filters.miscSpecialEvents, new MiscSpecialEventsFilter() ],\n        [ Filters.notOnlyM2Pro, new NotOnlyM2ProFilter() ],\n        [ Filters.geo, resetGeo ? new GeoFilter() : prev.get(Filters.geo) ]\n    ]));\n}\n\nexport function getInitialOfferBuildingsFilters(prev: NewbuildingFilterCollection) {\n    return newbuildingFilterFactory.create(new Map<Filters, IFilter>([\n        ...prev.getFilters(),\n        [ Filters.buildings, new BuildingsFilter() ]\n    ]));\n}\n\nexport function getInitialOfferFilters(prev: NewbuildingFilterCollection) {\n    return newbuildingFilterFactory.create(new Map<Filters, IFilter>([\n        ...prev.getFilters(),\n        [ Filters.commissioningList, new CommissioningListFilter() ],\n        [ Filters.rooms, new RoomFilter() ],\n        [ Filters.price, new PriceFilter() ],\n        [ Filters.totalArea, new AreaFilter() ],\n        [ Filters.livingArea, new LivingAreaFilter() ],\n        [ Filters.kitchenArea, new KitchenAreaFilter() ],\n        [ Filters.floor, new FloorFilter() ],\n        [ Filters.finishingFlat, new FinishingFlatFilter() ]\n    ]));\n}\n","import {\n    Filters,\n    IFilter,\n    CommissioningFilter,\n    FinishingTypeFilter,\n    RegionFilter,\n    RoomFilter,\n    PriceFilter,\n    TransportLimitFilter,\n    GeoFilter,\n    AreaFilter,\n    LivingAreaFilter,\n    KitchenAreaFilter,\n    FloorFilter,\n    CellHeightFilter,\n    BathroomFilter,\n    BalconyFilter,\n    ParkingFilter,\n    WallsTypeFilter,\n    ApartmentFilter,\n    PositionFilter,\n    SafetyFilter,\n    DeveloperFilter,\n    FloorsTotalFilter,\n    BuildingClassFilter,\n    AccreditationFilter,\n    NewBuildingDealFilter,\n    PaymentTypeFilter,\n    CommissioningListFilter,\n    BuildingsFilter,\n    FinishingFlatFilter,\n    ClosedSalesFilter,\n    ShowHighlightedFilter,\n    MapBoundsFilter,\n    SelectedNewBuildingFilter,\n    FlatsSpecialEventsFilter,\n    OtherSpecialEventsFilter,\n    MiscSpecialEventsFilter,\n    NotOnlyM2ProFilter\n} from '../../../view/filters/models/Filter';\n\nimport {\n    Area,\n    FloorConstraints,\n    Rooms,\n    TransportType,\n    TimeLimit,\n    CeilingHeight,\n    Bathroom,\n    BalconyOptions,\n    ParkingType,\n    WallsType,\n    IsApartments,\n    Position,\n    Safety,\n    BuildingClass,\n    Accreditation,\n    NewBuildingDeal,\n    PaymentType,\n    FlatsSpecialEvents,\n    OtherSpecialEvents,\n    MiscSpecialEvents\n} from './converters';\n\nconst serializers: Record<Filters, Function> = {\n    [Filters.commissioning]: (filter: CommissioningFilter) => filter.commissioning,\n    [Filters.finishingType]: (filter: FinishingTypeFilter) => ({\n        hasFinishing: filter.value.hasFinishing,\n        finishingType: filter.value.finishingType\n    }),\n    [Filters.region]: (filter: RegionFilter) => ({\n        region: filter.region\n    }),\n    [Filters.rooms]: (filter: RoomFilter) => filter.rooms.map(val => Rooms.stringValue[val]),\n    [Filters.price]: (filter: PriceFilter) => ({\n        priceMin: filter.value.from,\n        priceMax: filter.value.to,\n        priceType: Area.stringValue[filter.priceType]\n    }),\n    [Filters.transportLimit]: (filter: TransportLimitFilter) => {\n        return {\n            transportType: TransportType.stringValue[filter.transportType],\n            maxMinutes: TimeLimit.stringValue[filter.timeLimit]\n        };\n    },\n    [Filters.geo]: (filter: GeoFilter) => ({\n        metroId: filter.metroIds,\n        districtId: filter.districtIds,\n        addressId: filter.addressIds,\n        newBuildingId: filter.newBuildingIds\n    }),\n    [Filters.totalArea]: (filter: AreaFilter) => ({\n        totalAreaRangeMin: filter.value.from,\n        totalAreaRangeMax: filter.value.to\n    }),\n    [Filters.livingArea]: (filter: LivingAreaFilter) => ({\n        livingAreaRangeMin: filter.value.from,\n        livingAreaRangeMax: filter.value.to\n    }),\n    [Filters.kitchenArea]: (filter: KitchenAreaFilter) => ({\n        kitchenAreaRangeMin: filter.value.from\n    }),\n    [Filters.floor]: (filter: FloorFilter) => ({\n        floorMin: filter.range.from,\n        floorMax: filter.range.to,\n        floorFirst: FloorConstraints.stringValue[filter.first],\n        floorLast: FloorConstraints.stringValue[filter.last]\n    }),\n    [Filters.cellHeight]: (filter: CellHeightFilter) => ({\n        ceilingHeight: CeilingHeight.stringValue[filter.value]\n    }),\n    [Filters.bathroom]: (filter: BathroomFilter) => filter.value\n        .map(value => Bathroom.stringValue[value])\n        .filter(Boolean),\n    [Filters.balcony]: (filter: BalconyFilter) => BalconyOptions.stringValue[filter.hasBalcony] ? 'YES' : undefined,\n    [Filters.parkings]: (filter: ParkingFilter) => ({\n        parking: filter.parkings.map(val => ParkingType.stringValue[val])\n    }),\n    [Filters.walls]: (filter: WallsTypeFilter) => ({\n        wallsType: filter.walls.map(val => WallsType.stringValue[val])\n    }),\n    [Filters.apartments]: (filter: ApartmentFilter) => IsApartments.stringValue[filter.isApartment],\n    [Filters.position]: (filter: PositionFilter) => (filter.position.reduce((params, val) => ({\n        ...params,\n        [Position.stringValue[val]]: 'YES'\n    }), {})),\n    [Filters.safety]: (filter: SafetyFilter) => (filter.safety.reduce((params, val) => ({\n        ...params,\n        [Safety.stringValue[val]]: 'YES'\n    }), {})),\n    [Filters.developer]: (filter: DeveloperFilter) => ({\n        developerId: filter.developerId\n    }),\n    [Filters.floorsTotal]: (filter: FloorsTotalFilter) => ({\n        floorsTotalMin: filter.range.from,\n        floorsTotalMax: filter.range.to\n    }),\n    [Filters.buildingClass]: (filter: BuildingClassFilter) => ({\n        buildingClass: filter.buildingClass.map(val => BuildingClass.stringValue[val])\n    }),\n    [Filters.accreditation]: (filter: AccreditationFilter) => (filter.accreditation.reduce((params, val) => ({\n        ...params,\n        [Accreditation.stringValue[val]]: 'YES'\n    }), {})),\n    [Filters.newBuildingDeal]: (filter: NewBuildingDealFilter) => (filter.deal.reduce((params, val) => ({\n        ...params,\n        [NewBuildingDeal.stringValue[val]]: 'YES'\n    }), {})),\n    [Filters.paymentType]: (filter: PaymentTypeFilter) => (filter.type.reduce((params, val) => ({\n        ...params,\n        [PaymentType.stringValue[val]]: 'YES'\n    }), {})),\n    [Filters.commissioningList]: (filter: CommissioningListFilter) => ({\n        commissioningDate: filter.commissioningList\n    }),\n    [Filters.buildings]: (filter: BuildingsFilter) => ({\n        buildingId: filter.buildings\n    }),\n    [Filters.finishingFlat]: (filter: FinishingFlatFilter) => filter.value.finishingType,\n    [Filters.closedSales]: (filter: ClosedSalesFilter) => filter.includingClosedSales,\n    [Filters.showHighlighted]: (filter: ShowHighlightedFilter) => filter.shouldShowHighlighted,\n    [Filters.mapBounds]: (filter: MapBoundsFilter) => ({\n        mapBounds: {\n            bounds: filter.bounds,\n            polygon: filter.polygon\n        }\n    }),\n    [Filters.selectedNewBuilding]: (filter: SelectedNewBuildingFilter) => ({\n        selectedNewBuildingId: filter.selectedNewBuildingId\n    }),\n    [Filters.flatsSpecialEvents]: (filter: FlatsSpecialEventsFilter) => ({\n        flatsSpecialEvents: filter.value.map(val => FlatsSpecialEvents.stringValue[val])\n    }),\n    [Filters.otherSpecialEvents]: (filter: OtherSpecialEventsFilter) => ({\n        otherSpecialEvents: filter.value.map(val => OtherSpecialEvents.stringValue[val])\n    }),\n    [Filters.miscSpecialEvents]: (filter: MiscSpecialEventsFilter) => ({\n        miscSpecialEvents: filter.value.map(val => MiscSpecialEvents.stringValue[val])\n    }),\n    [Filters.notOnlyM2Pro]: (filter: NotOnlyM2ProFilter) => filter.notOnlyM2Pro\n};\n\nconst addValue: any = (\n    values: Record<string, any>,\n    key: string,\n    value: any,\n    destructObjects: boolean = true\n) => {\n    if (\n        value === null ||\n        typeof value === 'undefined' ||\n        value === 'UNKNOWN'\n    ) {\n        return values;\n    }\n\n    if (Array.isArray(value)) {\n        const filteredValue = value.filter(Boolean);\n\n        if (filteredValue.length === 0) {\n            return values;\n        }\n\n        return {\n            ...values,\n            [key]: filteredValue\n        };\n    }\n\n    if (destructObjects && typeof value === 'object') {\n        return Object.keys(value)\n            .reduce(\n                (subValues, subKey) => addValue(subValues, subKey, value[subKey], false),\n                values\n            );\n    }\n\n    return {\n        ...values,\n        [key]: value\n    };\n};\n\nclass NewbuildingFilterSerializer {\n    serialize(\n        filters: Map<Filters, IFilter>\n    ) {\n        return Object.keys(serializers)\n            .reduce((values, filterName) => {\n                const filter = filters.get(filterName as Filters);\n\n                return filter ? addValue(\n                    values,\n                    filterName,\n                    serializers[filterName as Filters](filter)\n                ) : values;\n            }, {});\n    }\n}\n\nexport const newbuildingFilterSerializer = new NewbuildingFilterSerializer();\n","import {\n    Rooms as RoomsEnum,\n    AreaUnit as AreaUnitEnum,\n    FloorConstraints as FloorConstraintsEnum,\n    TimeLimit as TimeLimitEnum,\n    TransportType as TransportTypeEnum,\n    CeilingHeight as CeilingHeightEnum,\n    Bathroom as BathroomEnum,\n    BalconyOptions as BalconyOptionsEnum,\n    ParkingType as ParkingTypeEnum,\n    WallsType as WallsTypeEnum,\n    IsApartmentsOptions as IsApartmentsEnum,\n    Position as PositionEnum,\n    BuildingClass as BuildingClassEnum,\n    Safety as SafetyEnum,\n    Accreditation as AccreditationEnum,\n    NewBuildingDeal as NewBuildingDealEnum,\n    PaymentType as PaymentTypeEnum,\n    FlatsSpecialEvent as FlatsSpecialEventEnum, FlatsSpecialEventString,\n    OtherSpecialEvent as OtherSpecialEventEnum, OtherSpecialEventString,\n    MiscSpecialEvent as MiscSpecialEventEnum, MiscSpecialEventString\n} from '@search/filter-enums/enums';\n\nexport const Area = {\n    stringValue: {\n        [AreaUnitEnum.METER]: 'METER'\n    },\n    enumValue: {\n        METER: AreaUnitEnum.METER\n    }\n};\n\nexport const FloorConstraints = {\n    stringValue: {\n        [FloorConstraintsEnum.ONLY]: 'ONLY',\n        [FloorConstraintsEnum.EXCLUDE]: 'EXCLUDE'\n    },\n    enumValue: {\n        ONLY: FloorConstraintsEnum.ONLY,\n        EXCLUDE: FloorConstraintsEnum.EXCLUDE\n    }\n};\n\nexport const Rooms = {\n    stringValue: {\n        [RoomsEnum.STUDIO]: 'STUDIO',\n        [RoomsEnum.ROOM_1]: 'ROOM_1',\n        [RoomsEnum.ROOM_2]: 'ROOM_2',\n        [RoomsEnum.ROOM_3]: 'ROOM_3',\n        [RoomsEnum.ROOM_4]: 'ROOM_4',\n        [RoomsEnum.ROOM_5_AND_MORE]: 'ROOM_5_AND_MORE',\n        [RoomsEnum.OPEN_PLAN]: 'OPEN_PLAN'\n    },\n    enumValue: {\n        STUDIO: RoomsEnum.STUDIO,\n        ROOM_1: RoomsEnum.ROOM_1,\n        ROOM_2: RoomsEnum.ROOM_2,\n        ROOM_3: RoomsEnum.ROOM_3,\n        ROOM_4: RoomsEnum.ROOM_4,\n        ROOM_5_AND_MORE: RoomsEnum.ROOM_5_AND_MORE,\n        OPEN_PLAN: RoomsEnum.OPEN_PLAN\n    }\n};\n\nexport const TransportType = {\n    stringValue: {\n        [TransportTypeEnum.FOOT]: 'FOOT',\n        [TransportTypeEnum.PUBLIC_TRANSPORT]: 'PUBLIC_TRANSPORT'\n    },\n    enumValue: {\n        FOOT: TransportTypeEnum.FOOT,\n        PUBLIC_TRANSPORT: TransportTypeEnum.PUBLIC_TRANSPORT\n    }\n};\n\nexport const TimeLimit = {\n    stringValue: {\n        [TimeLimitEnum.MAX_5_MINUTES]: 'MAX_5_MINUTES',\n        [TimeLimitEnum.MAX_10_MINUTES]: 'MAX_10_MINUTES',\n        [TimeLimitEnum.MAX_15_MINUTES]: 'MAX_15_MINUTES',\n        [TimeLimitEnum.MAX_20_MINUTES]: 'MAX_20_MINUTES',\n        [TimeLimitEnum.MAX_25_MINUTES]: 'MAX_25_MINUTES',\n        [TimeLimitEnum.MAX_30_MINUTES]: 'MAX_30_MINUTES',\n        [TimeLimitEnum.MAX_40_MINUTES]: 'MAX_40_MINUTES',\n        [TimeLimitEnum.MAX_50_MINUTES]: 'MAX_50_MINUTES',\n        [TimeLimitEnum.MAX_60_MINUTES]: 'MAX_60_MINUTES'\n    },\n    enumValue: {\n        MAX_5_MINUTES: TimeLimitEnum.MAX_5_MINUTES,\n        MAX_10_MINUTES: TimeLimitEnum.MAX_10_MINUTES,\n        MAX_15_MINUTES: TimeLimitEnum.MAX_15_MINUTES,\n        MAX_20_MINUTES: TimeLimitEnum.MAX_20_MINUTES,\n        MAX_25_MINUTES: TimeLimitEnum.MAX_25_MINUTES,\n        MAX_30_MINUTES: TimeLimitEnum.MAX_30_MINUTES,\n        MAX_40_MINUTES: TimeLimitEnum.MAX_40_MINUTES,\n        MAX_50_MINUTES: TimeLimitEnum.MAX_50_MINUTES,\n        MAX_60_MINUTES: TimeLimitEnum.MAX_60_MINUTES\n    }\n};\n\nexport const CeilingHeight = {\n    stringValue: {\n        [CeilingHeightEnum.FROM_2_5]: 'FROM_2_5',\n        [CeilingHeightEnum.FROM_2_7]: 'FROM_2_7',\n        [CeilingHeightEnum.FROM_3]: 'FROM_3',\n        [CeilingHeightEnum.FROM_4]: 'FROM_4'\n    },\n    enumValue: {\n        FROM_2_5: CeilingHeightEnum.FROM_2_5,\n        FROM_2_7: CeilingHeightEnum.FROM_2_7,\n        FROM_3: CeilingHeightEnum.FROM_3,\n        FROM_4: CeilingHeightEnum.FROM_4\n    }\n};\n\nexport const Bathroom = {\n    stringValue: {\n        [BathroomEnum.COMBINED]: 'COMBINED',\n        [BathroomEnum.PARTED]: 'PARTED'\n    },\n    enumValue: {\n        COMBINED: BathroomEnum.COMBINED,\n        PARTED: BathroomEnum.PARTED\n    }\n};\n\nexport const BalconyOptions = {\n    stringValue: {\n        [BalconyOptionsEnum.HAS_ANY]: 'HAS_ANY'\n    },\n    enumValue: {\n        HAS_ANY: BalconyOptionsEnum.HAS_ANY\n    }\n};\n\nexport const ParkingType = {\n    stringValue: {\n        [ParkingTypeEnum.CLOSED]: 'CLOSED',\n        [ParkingTypeEnum.UNDERGROUND]: 'UNDERGROUND',\n        [ParkingTypeEnum.OPEN]: 'OPEN'\n    },\n    enumValue: {\n        CLOSED: ParkingTypeEnum.CLOSED,\n        UNDERGROUND: ParkingTypeEnum.UNDERGROUND,\n        OPEN: ParkingTypeEnum.OPEN\n    }\n};\n\nexport const WallsType = {\n    stringValue: {\n        [WallsTypeEnum.MONOLITH]: 'MONOLITH',\n        [WallsTypeEnum.BRICK_MONOLITH]: 'BRICK_MONOLITH',\n        [WallsTypeEnum.BRICK]: 'BRICK',\n        [WallsTypeEnum.PANEL]: 'PANEL',\n        [WallsTypeEnum.BLOCK]: 'BLOCK'\n    },\n    enumValue: {\n        MONOLITH: WallsTypeEnum.MONOLITH,\n        BRICK_MONOLITH: WallsTypeEnum.BRICK_MONOLITH,\n        BRICK: WallsTypeEnum.BRICK,\n        PANEL: WallsTypeEnum.PANEL,\n        BLOCK: WallsTypeEnum.BLOCK\n    }\n};\n\nexport const IsApartments = {\n    stringValue: {\n        [IsApartmentsEnum.NO_APARTMENTS]: 'NO_APARTMENTS',\n        [IsApartmentsEnum.APARTMENTS_ONLY]: 'APARTMENTS_ONLY'\n    },\n    enumValue: {\n        NO_APARTMENTS: IsApartmentsEnum.NO_APARTMENTS,\n        APARTMENTS_ONLY: IsApartmentsEnum.APARTMENTS_ONLY\n    }\n};\n\nexport const Position = {\n    stringValue: {\n        [PositionEnum.STANDALONE]: 'standalone'\n    },\n    enumValue: {\n        standalone: PositionEnum.STANDALONE\n    }\n};\n\nexport const Safety = {\n    stringValue: {\n        [SafetyEnum.CONCIERGE]: 'concierge',\n        [SafetyEnum.CLOSED_AREA]: 'closedArea',\n        [SafetyEnum.GUARDED_AREA]: 'guardedArea'\n    },\n    enumValue: {\n        concierge: SafetyEnum.CONCIERGE,\n        closedArea: SafetyEnum.CLOSED_AREA,\n        guardedArea: SafetyEnum.GUARDED_AREA\n    }\n};\n\nexport const BuildingClass = {\n    stringValue: {\n        [BuildingClassEnum.ECONOMY]: 'ECONOMY',\n        [BuildingClassEnum.COMFORT]: 'COMFORT',\n        [BuildingClassEnum.COMFORT_PLUS]: 'COMFORT_PLUS',\n        [BuildingClassEnum.BUSINESS]: 'BUSINESS',\n        [BuildingClassEnum.ELITE]: 'ELITE'\n    },\n    enumValue: {\n        ECONOMY: BuildingClassEnum.ECONOMY,\n        COMFORT: BuildingClassEnum.COMFORT,\n        COMFORT_PLUS: BuildingClassEnum.COMFORT_PLUS,\n        BUSINESS: BuildingClassEnum.BUSINESS,\n        ELITE: BuildingClassEnum.ELITE\n    }\n};\n\nexport const NewBuildingDeal = {\n    stringValue: {\n        [NewBuildingDealEnum.LAW_214]: 'law214',\n        [NewBuildingDealEnum.ESCROW]: 'escrow'\n    },\n    enumValue: {\n        law214: NewBuildingDealEnum.LAW_214,\n        escrow: NewBuildingDealEnum.ESCROW\n    }\n};\n\nexport const Accreditation = {\n    stringValue: {\n        [AccreditationEnum.ACCREDITED_BY_VTB]: 'accreditedByVTB'\n    },\n    enumValue: {\n        accreditedByVTB: AccreditationEnum.ACCREDITED_BY_VTB\n    }\n};\n\nexport const PaymentType = {\n    stringValue: {\n        [PaymentTypeEnum.ARMY_MORTGAGE]: 'armyMortgage',\n        [PaymentTypeEnum.INSTALLMENT]: 'installment',\n        [PaymentTypeEnum.MOTHER_CAPITAL]: 'motherCapital'\n    },\n    enumValue: {\n        armyMortgage: PaymentTypeEnum.ARMY_MORTGAGE,\n        installment: PaymentTypeEnum.INSTALLMENT,\n        motherCapital: PaymentTypeEnum.MOTHER_CAPITAL\n    }\n};\n\nexport const FlatsSpecialEvents = {\n    stringValue: {\n        [FlatsSpecialEventEnum.FLAT_DISCOUNT]: FlatsSpecialEventString.FLAT_DISCOUNT,\n        [FlatsSpecialEventEnum.FLAT_INSTALLMENT_PLAN]: FlatsSpecialEventString.FLAT_INSTALLMENT_PLAN,\n        [FlatsSpecialEventEnum.FLAT_SALES_START]: FlatsSpecialEventString.FLAT_SALES_START\n    },\n    enumValue: {\n        [FlatsSpecialEventString.FLAT_DISCOUNT]: FlatsSpecialEventEnum.FLAT_DISCOUNT,\n        [FlatsSpecialEventString.FLAT_INSTALLMENT_PLAN]: FlatsSpecialEventEnum.FLAT_INSTALLMENT_PLAN,\n        [FlatsSpecialEventString.FLAT_SALES_START]: FlatsSpecialEventEnum.FLAT_SALES_START\n    }\n};\n\nexport const OtherSpecialEvents = {\n    stringValue: {\n        [OtherSpecialEventEnum.OTHER_DISCOUNT]: OtherSpecialEventString.OTHER_DISCOUNT,\n        [OtherSpecialEventEnum.OTHER_INSTALLMENT_PLAN]: OtherSpecialEventString.OTHER_INSTALLMENT_PLAN,\n        [OtherSpecialEventEnum.OTHER_SALES_START]: OtherSpecialEventString.OTHER_SALES_START\n    },\n    enumValue: {\n        [OtherSpecialEventString.OTHER_DISCOUNT]: OtherSpecialEventEnum.OTHER_DISCOUNT,\n        [OtherSpecialEventString.OTHER_INSTALLMENT_PLAN]: OtherSpecialEventEnum.OTHER_INSTALLMENT_PLAN,\n        [OtherSpecialEventString.OTHER_SALES_START]: OtherSpecialEventEnum.OTHER_SALES_START\n    }\n};\n\nexport const MiscSpecialEvents = {\n    stringValue: {\n        [MiscSpecialEventEnum.GIFT]: MiscSpecialEventString.GIFT,\n        [MiscSpecialEventEnum.PROMO]: MiscSpecialEventString.PROMO\n    },\n    enumValue: {\n        [MiscSpecialEventString.GIFT]: MiscSpecialEventEnum.GIFT,\n        [MiscSpecialEventString.PROMO]: MiscSpecialEventEnum.PROMO\n    }\n};\n","/* eslint-disable react-hooks/rules-of-hooks */\nimport { useCallback, useEffect, useState, useRef } from 'react';\nimport {\n    addCallTouchScript, CalltouchType,\n    DynamicReplacementErrorType,\n    DynamicReplacementErrorEnum,\n    CalltouchSubpoolType,\n} from '@search/classified-common/src/scripts/useCalltouch';\nimport { formatPhone } from '@search/helpers/src/formatPhone';\ndeclare const window: Window & {\n    ct?: CalltouchType;\n};\n\ninterface IUseCalltouchReplacement {\n    originalPhone: string;\n    ctId?: string;\n}\n\nconst convertDynamicReplacementError = (v: DynamicReplacementErrorEnum) => {\n    switch (v) {\n        case DynamicReplacementErrorEnum.CALLTRACKING_BY_CLICK_IS_OFF:\n            return 'CALLTOUCH:CALLTRACKING_BY_CLICK_IS_OFF';\n        case DynamicReplacementErrorEnum.REPLACEMENT_CONDITIONS_NOT_COMPLETED:\n            return 'CALLTOUCH:REPLACEMENT_CONDITIONS_NOT_COMPLETED';\n        case DynamicReplacementErrorEnum.SUBPOOLNAME_NOT_FOUND:\n            return 'CALLTOUCH:SUBPOOLNAME_NOT_FOUND';\n        case DynamicReplacementErrorEnum.SERVER_ERROR:\n            return 'CALLTOUCH:SERVER';\n        case DynamicReplacementErrorEnum.SCRIPT:\n            return 'SCRIPT';\n        case DynamicReplacementErrorEnum.TIMEOUT:\n            return 'TIMEOUT';\n        case DynamicReplacementErrorEnum.UNKNOWN_ERROR:\n            return 'CALLTOUCH:UNKNOWN';\n        default:\n            return 'UNKNOWN';\n    }\n};\n\nexport type ReplaceError = 'NONE' | ReturnType<typeof convertDynamicReplacementError>;\n\ninterface IReplacementData {\n    calltouchPhone: string;\n    hasTriedReplace: boolean;\n    replaceError: ReplaceError;\n}\n\nexport function useCalltouchReplacement({\n    originalPhone,\n    ctId\n}: IUseCalltouchReplacement): IReplacementData {\n    const [ replacementData, setReplacementData ] = useState<IReplacementData>({\n        calltouchPhone: '',\n        hasTriedReplace: false,\n        replaceError: 'NONE'\n    });\n    const [ longRequestTimeout, setLongRequestTimeout ] = useState<ReturnType<typeof setTimeout> | null>(null);\n    const replacementDataRef = useRef(replacementData);\n\n    replacementDataRef.current = replacementData;\n\n    if (! ctId) {\n        return replacementData;\n    }\n\n    const setFailedReplacementData = useCallback((replaceError: ReplaceError) => setReplacementData(prevState => ({\n        ...prevState,\n        hasTriedReplace: true,\n        replaceError\n    })), []);\n\n    const launchDynamicReplacement = useCallback((modId: string, subpoolName: string) => {\n        try {\n            setLongRequestTimeout(setTimeout(() => {\n                if (! replacementDataRef.current.hasTriedReplace) {\n                    setFailedReplacementData('TIMEOUT');\n                }\n            }, 2000));\n\n            if (! window.ct) {\n                setFailedReplacementData('SCRIPT');\n\n                return;\n            }\n\n            window.ct('goal', 'phone_click');\n\n            window.ct(modId, 'dynamic_replacement', {\n                callback(success: boolean, result: CalltouchSubpoolType[] | DynamicReplacementErrorType) {\n                    const calltouchPhone = success ? (result as CalltouchSubpoolType[])[0].phoneNumber.slice(1) : '';\n                    const errorType = success ? undefined : (result as DynamicReplacementErrorType).type;\n\n                    setReplacementData(prevState => prevState.hasTriedReplace ? prevState : ({\n                        ...prevState,\n                        calltouchPhone,\n                        hasTriedReplace: true,\n                        replaceError: errorType ? convertDynamicReplacementError(errorType) : 'NONE'\n                    }));\n                },\n                subPoolNames: [ subpoolName ]\n            });\n        } catch (e) {\n            setFailedReplacementData('UNKNOWN');\n        }\n    }, []);\n\n    useEffect(() => {\n        if (ctId && originalPhone && ! replacementData.calltouchPhone) {\n            launchDynamicReplacement(ctId, originalPhone);\n        }\n    }, [ ctId, originalPhone, replacementData.calltouchPhone ]);\n\n    useEffect(() => {\n        if (replacementData.hasTriedReplace && longRequestTimeout !== null) {\n            clearTimeout(longRequestTimeout);\n            setLongRequestTimeout(null);\n        }\n    }, [ replacementData.hasTriedReplace, longRequestTimeout ]);\n\n    return replacementData;\n}\n\nexport class CalltouchError extends Error {\n    protected cause: unknown;\n\n    constructor(\n        readonly props: {\n            code: ReplaceError;\n            callTouchId?: string;\n            phone?: string;\n        },\n        p?: {\n            cause?: unknown;\n        }\n    ) {\n        // @ts-ignore\n        super(`calltouchReplacementFetch error: ${JSON.stringify(props)}`, p);\n        this.props = props;\n        this.cause = p?.cause;\n    }\n\n    get callTouchId() { return this.props.callTouchId; }\n    get code() { return this.props.code; }\n    get phone() { return this.props.phone; }\n\n    toJSON() { return this.props; }\n}\n\nexport async function calltouchReplacementFetch({\n    callTouchId,\n    originalPhone: phone\n}: {\n    callTouchId: string;\n    originalPhone: string;\n}) {\n    const originalPhone = phone.replace('+7', '').replace(/ /g, '');\n\n    const ct = await addCallTouchScript(callTouchId);\n\n    return new Promise<string | undefined>((resolve, reject) => {\n        const timer = setTimeout(() => reject(\n            new CalltouchError({ code: 'TIMEOUT', callTouchId, phone: originalPhone })\n        ), 2000);\n\n        ct('goal', 'phone_click');\n\n        ct(callTouchId, 'dynamic_replacement', {\n            callback(success: boolean, result: CalltouchSubpoolType[] | DynamicReplacementErrorType) {\n                clearTimeout(timer);\n                if (success) {\n                    const newPhone = Array.isArray(result) ? result[0]?.phoneNumber : undefined;\n\n                    return resolve(newPhone ? formatPhone(newPhone, { skipSymbols: true }) : undefined);\n                }\n\n                const errorType = Array.isArray(result) || ! result.type ?\n                    'UNKNOWN' :\n                    convertDynamicReplacementError(result.type);\n\n                reject(new CalltouchError({ code: errorType, callTouchId, phone: originalPhone }, { cause: result }));\n            },\n            subPoolNames: [ originalPhone ]\n        });\n    });\n}\n","import { NewBuildingSortEnum, NewBuildingOffersSortEnum } from '@search/graphql-typings';\n\nimport { DeveloperWithPromoName } from '../developer-promo/types';\n\nexport const VTB_IPOTEKA_LINK = 'https://www.vtb.ru/personal/ipoteka/novostrojki/';\n\nexport const STATIC_URL = 'https://static.m2.ru';\n\nconst NO_PHOTO_SRC_2X = 'https://cdn.m2.ru/assets/file-upload-server/11ae2be505b8e791517e93536a53b29a.png';\n\nexport const NO_PHOTO_SRC = 'https://cdn.m2.ru/assets/file-upload-server/a2753e1d796eb360ead3bff35e8a3f9e.png';\nexport const NO_PHOTO_SRC_SET = `${NO_PHOTO_SRC} 1x, ${NO_PHOTO_SRC_2X} 2x`;\n\nexport const CURRENT_YEAR = new Date().getFullYear();\n\nexport enum M2ProEnum {\n    All = 'ALL',\n    M2Pro = 'M2PRO'\n}\n\nexport const M2PRO_OPTIONS = {\n    [M2ProEnum.All]: {\n        value: M2ProEnum.All,\n        label: 'Все ЖК',\n        buttonLabel: 'Все ЖК'\n    },\n    [M2ProEnum.M2Pro]: {\n        value: M2ProEnum.M2Pro,\n        label: 'M2Pro Новостройки',\n        buttonLabel: 'M2Pro Новостройки'\n    }\n};\n\nexport const SORT_OPTIONS = [\n    {\n        value: NewBuildingSortEnum.RelevanceDesc,\n        label: 'По умолчанию'\n    },\n    {\n        value: NewBuildingSortEnum.PriceAsc,\n        label: 'Сначала дешевые'\n    },\n    {\n        value: NewBuildingSortEnum.PriceDesc,\n        label: 'Сначала дорогие'\n    },\n    {\n        value: NewBuildingSortEnum.DateOfCommissioningAsc,\n        label: 'Сдаются раньше'\n    },\n    {\n        value: NewBuildingSortEnum.DateOfCommissioningDesc,\n        label: 'Сдаются позже'\n    },\n    {\n        value: NewBuildingSortEnum.TimeToMetroAsc,\n        label: 'Сначала ближе к метро'\n    },\n    {\n        value: NewBuildingSortEnum.SqmPriceAsc,\n        label: 'Сначала дешевле за м²'\n    },\n    {\n        value: NewBuildingSortEnum.SqmPriceDesc,\n        label: 'Сначала дороже за м²'\n    },\n    {\n        value: NewBuildingSortEnum.TotalAreaAsc,\n        label: 'Сначала с меньшей площадью'\n    },\n    {\n        value: NewBuildingSortEnum.TotalAreaDesc,\n        label: 'Сначала с большей площадью'\n    }\n];\n\nexport const OFFERS_SORT_OPTIONS = [ {\n    value: NewBuildingOffersSortEnum.PriceAsc,\n    label: 'Сначала дешёвые'\n}, {\n    value: NewBuildingOffersSortEnum.PriceDesc,\n    label: 'Сначала дорогие'\n}, /* {\n    value: NewBuildingOffersSortEnum.CreateDateAsc,\n    label: 'Сначала новые'\n}, {\n    value: NewBuildingOffersSortEnum.CreateDateDesc,\n    label: 'Сначала старые'\n}, {\n    value: NewBuildingOffersSortEnum.TimeToMetroAsc,\n    label: 'Сначала ближе к метро'\n}, */ {\n    value: NewBuildingOffersSortEnum.PriceSqMeterAsc,\n    label: 'Сначала дешевле за м²'\n}, {\n    value: NewBuildingOffersSortEnum.PriceSqMeterDesc,\n    label: 'Сначала дороже за м²'\n}, {\n    value: NewBuildingOffersSortEnum.TotalAreaAsc,\n    label: 'Сначала с меньшей площадью'\n}, {\n    value: NewBuildingOffersSortEnum.TotalAreaDesc,\n    label: 'Сначала с большей площадью'\n} ];\n\nexport enum DATA_GTM {\n    SNIPPET_PHONE = 'snippet-phone',\n    SNIPPET_MAP = 'snippet-map',\n    SNIPPET_ACCREDITED = 'snippet-accredited',\n    SNIPPET_FLATS = 'snippet-flats',\n\n    MORTGAGE_BANNER_SEND = 'ipoteka_from_serp_promo_send',\n    MORTGAGE_ON_SNIPPET = 'ipoteka_from_serp_snippet',\n    MORTGAGE_BROKER_SEND = 'ipoteka_from_card_application',\n    MORTGAGE_BROKER_SHOW_MORE = 'ipoteka_from_card_all',\n    MORTGAGE_BROKER_BANK_OFFER = 'ipoteka_from_card_bank',\n    MORTGAGE_RIGHT_BLOCK = 'ipoteka_from_card_developer',\n    MORTGAGE_OFFER = 'ipoteka_from_card_offer',\n\n    MORTGAGE_SEND_CLICK = 'new_building_card_sale_view_ipoteka_banks',\n    MORTGAGE_SHOW_MORE_CLICK = 'new_building_card_sale_view_ipoteka_call_back',\n    MORTGAGE_STARTER_MODAL_SEND_ID = 'new_building_card_sale_ipoteka_banks',\n\n    MORTGAGE_RIGHT_BLOCK_STARTER_MODAL_SHOW_ID = 'new_building_card_right_block_sale_view_ipoteka_banks',\n    MORTGAGE_RIGHT_BLOCK_STARTER_MODAL_SEND_ID = 'new_building_card_right_block_sale_ipoteka_banks',\n\n    MORTGAGE_OFFER_STARTER_MODAL_SHOW_ID = 'new_building_card_offer_sale_view_ipoteka_banks',\n    MORTGAGE_OFFER_STARTER_MODAL_SEND_ID = 'new_building_card_offer_sale_ipoteka_banks',\n\n    MORTGAGE_SNIPPET_STARTER_MODAL_SHOW_ID = 'new_building_snippet_sale_view_ipoteka_banks',\n    MORTGAGE_SNIPPET_STARTER_MODAL_SEND_ID = 'new_building_snippet_sale_ipoteka_banks',\n\n    PROMO_BANNER = 'promo-banner',\n    PROMO_SNIPPET = 'promo-snippet',\n    PROMO_SNIPPET_PHONE = 'promo-snippet-phone',\n\n    CARD_PHONE_1 = 'card-phone-1',\n    CARD_PHONE_2 = 'card-phone-2',\n    CARD_PHONE_3 = 'card-phone-3',\n    CARD_PHONE_4 = 'card-phone-4',\n    CARD_PHONE_5 = 'card-phone-5',\n    CARD_PHONE_OFFER_MODAL = 'popup-flat-phone',\n    CARD_PHONE_GALLERY = 'card-phone-gallery',\n\n    CARD_SQUARE_BANNER = 'square-banner',\n    CARD_SQUARE_BANNER_PHONE = 'square-banner-phone',\n    CARD_BANNER = 'card-banner',\n\n    CARD_CALL_BACK = 'call-request',\n    CARD_CALL_BACK_SPECIAL_EVENT = 'call-request4',\n    CARD_CALL_BACK_BUILDING = 'call-request5',\n    CARD_CALL_BACK_OFFER = 'popup-flat-call-request',\n    CARD_CALL_BACK_SEND = 'call-request-send',\n    CARD_CALL_BACK_SEND_SPECIAL_EVENT = 'call-request-send4',\n    CARD_CALL_BACK_SEND_BUILDING = 'call-request-send5',\n    CARD_CALL_BACK_SEND_OFFER = 'popup-flat-call-request-send',\n\n    OFFER_CALL_BACK = 'popup-flat-call-request',\n    OFFER_CALL_BACK_SEND = 'popup-flat-call-request-send',\n\n    POPUP_CALL_BACK = 'аb-call-me',\n    POPUP_CALL_BACK_SEND = 'аb-send-call-me',\n    POPUP_PHONE = 'аb-show-phone',\n\n    FOOTER_PHONE = 'phone-footer-opg'\n}\n\nexport const developerLandingDataGTM = (\n    developerWithPromoName: DeveloperWithPromoName,\n    event: 'slide-show' | 'slide-click' | 'snippet-show' | 'snippet-click'\n) => `${developerWithPromoName}-landing-${event}`;\n","import type { YMapBounds } from '@search/ymap/src/bounds';\nimport type { GeoObject, RegionSection } from '@search/graphql-typings';\nimport { GroupedOptions } from '@vtblife/uikit/legacy';\nimport { legacySlugToNew } from '@search/router/src/legacySlug';\nimport { GeoBase, SlugMapper } from '@search/geo/src/SlugMapper';\n\nexport type { RegionSection } from '@search/graphql-typings';\n\nexport interface IRegion extends GeoObject {\n    isParent?: boolean;\n    bounds: YMapBounds;\n}\n\ntype RootRegionOption = {\n    isParent?: IRegion['isParent'];\n    fullName: string;\n    label: string;\n    value: string;\n};\n\nfunction isRegionSection(item: RegionSection | GeoObject): item is RegionSection {\n    return (item as RegionSection).rootRegion !== undefined;\n}\n\nfunction isGeoObject(item: RegionSection | GeoObject): item is GeoObject {\n    return (item as GeoObject).id !== undefined;\n}\n\nfunction buildRegionMap(ret: Record<number, GeoObject>, region: RegionSection | GeoObject) {\n    if (isRegionSection(region) && region.rootRegion) {\n        ret[region.rootRegion.id] = region.rootRegion;\n    }\n\n    if (isRegionSection(region) && region.regions) {\n        region.regions\n            .forEach(item => item && buildRegionMap(ret, item));\n    }\n\n    if (isGeoObject(region)) {\n        ret[region.id] = region;\n    }\n\n    return ret;\n}\n\nfunction buildFlatRegion(ret: Array<IRegion | GeoObject>, region: RegionSection | GeoObject) {\n    if (isRegionSection(region) && region.rootRegion) {\n        ret.push({ ...region.rootRegion, isParent: true });\n    }\n\n    if (isRegionSection(region) && region.regions) {\n        ret.push(...region.regions.filter((item): item is GeoObject => item !== null));\n    }\n\n    return ret;\n}\n\nexport type IRootRegions = {\n    getById(id: number): undefined | { translit?: string | null; narrowRegion?: { id: number } };\n    getByTranslitName(slug: string): undefined | { id: number };\n    addGeoSlug?(geo: GeoBase, regionId: number): void;\n    getGeoFromSlug?(slug: string, regionId: number): GeoBase | undefined;\n    getSlugFromGeo?(regionId: number): string | null | undefined;\n    getGeoSlug?(regionId: number): GeoBase | undefined;\n};\n\nexport class RootRegions implements IRootRegions {\n    private regions: RegionSection[];\n    private regionsIdMap: Record<number, any>;\n    private regionsFlat: any[];\n    private slugs: SlugMapper;\n\n    constructor(regions: RegionSection[]) {\n        this.regions = regions;\n        this.regionsFlat = regions.reduce(buildFlatRegion, []);\n        this.regionsIdMap = regions.reduce(buildRegionMap, {} as Record<number, IRegion>);\n        this.slugs = new SlugMapper();\n    }\n\n    regionsEnumeration(): Set<number> {\n        return new Set<number>(Object.keys(this.regionsIdMap).map(Number));\n    }\n\n    getById(id: number) {\n        return this.regionsIdMap[Number(id)];\n    }\n\n    getByTranslitName(translit: string) {\n        const newSlug = legacySlugToNew(translit) ?? translit;\n\n        return this.regionsFlat.find(item => item.translit === translit || item.translit === newSlug);\n    }\n\n    getFlatList() {\n        return this.regionsFlat;\n    }\n\n    getRegions() {\n        return this.regions;\n    }\n\n    getRegionsLikeOptions() {\n        return this.getRegions()\n            .reduce((ret, { rootRegion, regions }) => {\n                const options = [];\n\n                if (rootRegion) {\n                    options.push({\n                        isParent: true,\n                        fullName: rootRegion.mainName,\n                        label: rootRegion.displayName,\n                        value: String(rootRegion.id)\n                    } as RootRegionOption);\n                }\n\n                ret.push({\n                    label: '',\n                    options: options\n                        .concat(\n                            // @ts-ignore\n                            (regions || [])\n                                .filter((item): item is GeoObject => item !== null)\n                                .map(item => ({\n                                    isParent: false,\n                                    fullName: item.mainName ?? '',\n                                    label: String(item.displayName),\n                                    value: String(item.id)\n                                }))\n                        )\n                });\n\n                return ret;\n            }, [] as GroupedOptions<RootRegionOption>[]);\n    }\n\n    addGeoSlug(geo: GeoBase, regionId: number) {\n        return this.slugs.add(geo, regionId);\n    }\n\n    getGeoFromSlug(slug: string, regionId: number) {\n        return this.slugs.id(slug, regionId);\n    }\n\n    getSlugFromGeo(regionId: number) {\n        return this.slugs.slug(regionId)?.translit;\n    }\n\n    getGeoSlug(regionId: number) {\n        return this.slugs.slug(regionId);\n    }\n}\n","export enum ClassifiedAnalytics {\n    // Затрекать показ сниппета\n    SearchSaleViewOffer = 'classified_serp_sale_view_offer',\n    SearchSaleViewPaidOffer = 'classified_serp_sale_view_paid_offer',\n    SearchSaleViewHighlightOffer = 'classified_serp_sale_view_highlight_offer',\n    SearchRentViewOffer = 'classified_serp_rent_view_offer',\n    SearchRentViewPaidOffer = 'classified_serp_rent_view_paid_offer',\n    SearchRentViewHighlightOffer = 'classified_serp_rent_view_highlight_offer',\n\n    // Показать телефон на серпе вторичка\n    SearchSaleShowTel = 'classified_serp_sale_show_tel',\n    SearchSalePaidShowTel = 'classified_serp_sale_paid_show_tel',\n    SearchRentShowTel = 'classified_serp_rent_show_tel',\n\n    // Показать телефон на серпе новостройки\n    SearchSaleNewShowTel = 'classified_serp_newsale_show_tel',\n    SearchSaleFromDevShowTel = 'classified_serp_newsale_dev_show_tel',\n    SearchSaleFromDevPaidShowTel = 'classified_newsale_paid_show_tel',\n    SearchRentNewShowTel = 'classified_serp_newrent_show_tel',\n\n    // Показать телефон на серпе: оффер c VAS - Highlight\n    SearchSaleHighlightShowTel = 'classified_serp_sale_highlight_show_tel',\n\n    // Баннеры\n    CardSaleIpotekaBannerSend = 'classified_card_sale_ipoteka_banner_promo',\n    CardSaleIpotekaBannerShow = 'classified_card_sale_view_ipoteka_banner_promo',\n    SearchSaleIpotekaBannerSend = 'classified_serp_sale_ipoteka_banner_promo',\n    SearchSaleIpotekaBannerShow = 'classified_serp_sale_view_ipoteka_banner_promo',\n    SearchBanner = 'classified_serp_nb_promo_banner',\n\n    // Промо-баннеры на карточке оффера\n    PromoBannerCardTop = 'classified_card_sp_banner_top',\n    PromoBannerCardBottom = 'classified_card_sp_banner_bottom',\n\n    // Показать телефоны в оффере, вторичка, верх\n    SearchCardSaleShowTelTop = 'classified_card_sale_show_tel_top',\n    SearchCardSalePaidShowTelTop = 'classified_card_sale_paid_show_tel_top',\n    SearchCardRentShowTelTop = 'classified_card_rent_show_tel_top',\n\n    // Показать телефоны в оффере, вторичка, низ\n    SearchCardSaleShowTelBottom = 'classified_card_sale_show_tel_bottom',\n    SearchCardSalePaidShowTelBottom = 'classified_card_sale_paid_show_tel_bottom',\n    SearchCardRentShowTelBottom = 'classified_card_rent_show_tel_bottom',\n\n    // Показать телефоны в оффере, новостройки, верх\n    SearchCardSaleNewShowTelTop = 'classified_new_card_sale_show_tel_top',\n    SearchCardSaleFromDevShowTelTop = 'classified_new_card_sale_dev_show_tel_top',\n    SearchCardRentNewShowTelTop = 'classified_new_card_rent_show_tel_top',\n\n    // Показать телефоны в оффере, новостройки, низ\n    SearchCardSaleNewShowTelBottom = 'classified_new_card_sale_show_tel_bottom',\n    SearchCardSaleFromDevShowTelBottom = 'classified_new_card_sale_dev_show_tel_bottom',\n    SearchCardRentNewShowTelBottom = 'classified_new_card_rent_show_tel_bottom',\n\n    // Показать телефоны в оффере, новостройки, без разницы\n    SearchCardSaleFromDevPaidShowTel = 'classified_newsale_paid_show_tel',\n\n    // Добавить в избранное квартиру, продажа\n    SearchCardSaleFlatAddFavorites = 'classified_serp_sale_flat_add_favorites',\n\n    // Открыть из серпа оффер c VAS - Highlight\n    SaleOpenHighlightOffer = 'classified_sale_open_highlight_offer',\n\n    // Открыть оффер квартиры, новостройка\n    SaleFlatOpenNewOffer = 'classified_sale_flat_open_new_offer',\n    SaleFlatOpenNewDevOffer = 'classified_sale_flat_open_new_dev_offer',\n    RentFlatOpenNewOffer = 'classified_rent_flat_open_new_offer',\n\n    // Открыть оффер квартиры, вторичка\n    SaleFlatOpenSecondOffer = 'classified_sale_flat_open_second_offer',\n    RentFlatOpenSecondOffer = 'classified_rent_flat_open_second_offer',\n\n    // Открыть васовый оффер, вторичка\n    SaleOpenPaidOffer = 'classified_sale_open_paid_offer',\n\n    // Открыть не васовый оффер, вторичка\n    SaleOpenSecondOffer = 'classified_sale_open_second_offer',\n\n    // @deprecated use SearchSaleIpotekaBanner via dataLayer\n    IpotekaFromOffer = 'ipoteka_from_offer',\n}\n\nexport enum AnalyticsFromTags {\n    SpecProjectCardCL = 'from=SpecProjectcardCL'\n}\n","/* eslint-disable camelcase */\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport React from 'react';\n\nimport { dataLayerPush } from '../../google/dataLayerPush';\nimport type { OfferType } from '../search/page/OfferQuery';\nimport { RankingEnum, OfferQuery$data } from '../search/page/OfferQuery/__generated__/OfferQuery.graphql';\nimport { OfferSnippetModel } from '../search/page/SearchOffersQuery';\n\nconst contextDefault: TOfferGtm2 & {\n    ownerId: undefined | number;\n    offerId: undefined | string;\n} = {\n    ownerId: undefined,\n    offerId: undefined\n};\n\ntype Offer = Pick<\n    NonNullable<Extract<OfferQuery$data['offer'], {__typename: 'ProfOfferSnippet'}>['related']>[number] |\n    OfferType |\n    OfferSnippetModel,\n    'dealType' | 'status' | 'seller' | 'realtyObject' | 'newBuildingCard' | 'location' | 'id'\n>;\n\ntype OfferRealtyType = NonNullable<Offer['realtyObject']>['__typename'];\n\nfunction getRealtyType(realtyType?: OfferRealtyType) {\n    switch (realtyType) {\n        case 'ProfOfferRoom': return 'room';\n        case 'ProfOfferHouse': return 'house';\n        case 'ProfOfferLand': return 'land';\n        case 'ProfOfferFlat':\n        case '%other':\n        default: return 'flat';\n    }\n}\n\nexport const ClassifiedOfferGtmContext = React.createContext(contextDefault);\n\nexport function useClassifiedOfferDataLayerPush() {\n    const ctx = React.useContext(ClassifiedOfferGtmContext);\n\n    return React.useCallback(\n        <O extends {event: string}>(p: O) => dataLayerPush(\n            ctx === contextDefault || ! ctx.offerId ? p : {\n                ...ctx,\n                ...p\n            }\n        ),\n        [ ctx ]\n    );\n}\n\ntype Page = 'serp' | 'card' | 'favorites' | 'map' | 'similar' | 'buildingRelated' | 'other' | 'hidden-offers';\ntype TOfferGtm2 = {\n    section: 'sell' | 'rent';\n    type: 'second' | 'new_owner' | 'new_dev';\n    vas: boolean;\n    offerId: string;\n    partnerVas: string | 'unknown';\n    nbPaid: Lowercase<RankingEnum>;\n    vasType: 'highlight' | 'top' | 'highlight_top' | 'unknown';\n    pageType: Page; // old\n    page_type: Page; // new api\n    region: number;\n    ownerId: number | undefined;\n    realtyObjectType: 'flat' | 'house' | 'land' | 'room';\n}\n\n// может пора сделать его первым?\nexport const createOfferGtm2Context = ({ place, offer }: {\n    place: TOfferGtm2['pageType'];\n    offer: Offer;\n}) => {\n    const gtmData: TOfferGtm2 = {\n        section: 'sell',\n        type: 'second',\n        vas: offer.status?.hasAnyPriority ?? false,\n        offerId: offer.id,\n        partnerVas: 'unknown',\n        nbPaid: (offer.newBuildingCard?.ranking ?? 'UNKNOWN').toLocaleLowerCase() as Lowercase<RankingEnum>,\n        vasType: 'unknown',\n        pageType: place,\n        page_type: place,\n        region: offer.location.narrowRegion?.id ?? RegionIdEnum.MSK,\n        ownerId: offer.seller.ownerId ?? undefined,\n        realtyObjectType: getRealtyType(offer.realtyObject?.__typename)\n    };\n\n    if (offer.dealType?.__typename === 'ProfOfferDealRent') {\n        gtmData.section = 'rent';\n    }\n\n    if (offer.realtyObject?.__typename === 'ProfOfferFlat' &&\n        offer.realtyObject.building?.isNewbuilding\n    ) {\n        gtmData.type = 'new_owner';\n\n        if (offer.seller.sellerType === 'DEVELOPER') {\n            gtmData.type = 'new_dev';\n        }\n    }\n\n    if (offer.status?.hasAnyPriority && offer.seller.organizationName) {\n        gtmData.partnerVas = offer.seller.organizationName;\n    }\n\n    if (offer.status?.hasHighlight) {\n        gtmData.vasType = 'highlight';\n    }\n    if (offer.status?.hasTop) {\n        gtmData.vasType = 'top';\n    }\n    if (offer.status?.hasHighlight && offer.status?.hasTop) {\n        gtmData.vasType = 'highlight_top';\n    }\n\n    return gtmData;\n};\n","import { backofficeRegionRepository } from '@search/backoffice-const/src/constants';\n\nexport function offerRegionToMortgage(regionId?: number | null): number {\n    const boRegion = regionId ? backofficeRegionRepository.byGeoId(regionId) : undefined;\n\n    return boRegion ? Number(boRegion.value) : 3;\n}\n","import './Container.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'OfferYMapDesktopSwitchContainer');\n\nexport function OfferYMapDesktopSwitchContainer({\n    className,\n    children,\n    dark\n}: {\n    dark?: boolean;\n    children: React.ReactNode;\n    className?: string;\n}) {\n    return (\n        <div className={cn('container', { dark }, className)}>{children}</div>\n    );\n}\n","\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'OfferYMapDesktopSwitchContainer');\n\nexport function OfferYMapDesktopSwitchLink({\n    className,\n    dark,\n    children,\n    active,\n    icon = null,\n    href,\n    dataTest,\n    onClick: onClickRaw\n}: {\n    dataTest?: string;\n    dark: boolean;\n    onClick?: () => void;\n    href: string;\n    icon?: React.ReactElement | null;\n    active: boolean;\n    children?: React.ReactNode;\n    className?: string;\n}) {\n    const onClick = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n        e.stopPropagation();\n        e.preventDefault();\n        if (onClickRaw) {\n            onClickRaw();\n        }\n    }, [ onClickRaw ]);\n\n    return (\n        <a\n            data-test={dataTest}\n            className={cn('link', { active, dark }, className)}\n            onClick={onClick}\n            href={href}\n        >\n            {icon ? <div className={cn('icon', { active })}>{icon}</div> : null}\n            {children}\n        </a>\n    );\n}\n","import React from 'react';\n\nimport { IconList, IconYMap } from '@search/ymap/src/Icon';\n\nimport { useClassifiedOfferDataLayerPush } from '../../../../offer/analytics/ClassifiedOfferGtmContext';\nimport { OfferYMapDesktopSwitchContainer } from './Container';\nimport { OfferYMapDesktopSwitchLink } from './Link';\n\ntype OfferYMapDesktopLinkId = 'map' | 'list';\n\nexport function OfferYMapDesktopSwitch({\n    active,\n    className,\n    onClick,\n    listUrl,\n    mapUrl,\n    dataTest = 'ymap-switch',\n    dark = false\n}: {\n    dataTest?: string;\n    className?: string;\n    listUrl: string;\n    mapUrl: string;\n    dark?: boolean;\n    onClick: (id: OfferYMapDesktopLinkId) => void;\n    active: OfferYMapDesktopLinkId;\n}) {\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    return (\n        <OfferYMapDesktopSwitchContainer dark={dark} className={className}>\n            <OfferYMapDesktopSwitchLink\n                dark={dark}\n                dataTest={`${dataTest}-list`}\n                href={listUrl}\n                active={active === 'list'}\n                onClick={() => {\n                    onClick('list');\n                    dataLayerPush({ event: 'classified_map_click_to_serp' });\n                }}\n                icon={<IconList />}\n            >\n                Список\n            </OfferYMapDesktopSwitchLink>\n            <OfferYMapDesktopSwitchLink\n                dark={dark}\n                dataTest={`${dataTest}-map`}\n                href={mapUrl}\n                active={active === 'map'}\n                onClick={() => {\n                    onClick('map');\n                    dataLayerPush({ event: 'classified_serp_click_to_map' });\n                }}\n                icon={<IconYMap />}\n            >\n                На карте\n            </OfferYMapDesktopSwitchLink>\n        </OfferYMapDesktopSwitchContainer>\n    );\n}\n","import './Desktop.css';\n\nimport React, { useState, useRef } from 'react';\nimport { Button } from '@vtblife/uikit';\nimport { Checkbox } from '@vtblife/uikit/legacy';\n\nimport {\n    YMapControlGeoLocation,\n    YMapControlGroup,\n    YMapControlRuler,\n    YMapControlTraffic,\n    YMapControlZoom\n} from '@search/ymap/src/Control';\nimport { YMapMargin, YMapBounds } from '@search/ymap/src/bounds';\nimport { YMapLayer } from '@search/ymap/src/Layer';\nimport { YMapPane } from '@search/ymap/src/Pane';\nimport { YMapVector } from '@search/ymap/src/Vector';\nimport { YMapDrawAreaPane } from '@search/ymap/src/DrawArea/Pane';\nimport classname from '@search/classname/src';\n\nimport { errorCatcherWrap } from '@search/error/src/catcher';\nimport { OfferYMapDesktopSwitch } from './Switch/Switch';\n\nconst cn = classname.bind(null, 'OfferYMapDesktop');\n\ninterface OfferYMapDesktopProps {\n    tileUrl?: string | undefined;\n    bounds?: YMapBounds;\n    handleClickList?: () => void;\n    setBounds: (bounds: YMapBounds) => void;\n    children?: React.ReactNode | null;\n    listUrl?: string;\n    mapUrl?: string;\n    setPolygon: (coordinates: YMapVector[]) => void;\n    selectedArea?: readonly YMapVector[];\n    tipsVisible?: boolean;\n    tipsExpanded?: boolean;\n    displaySwitcher?: boolean;\n    displayArea?: boolean;\n    isDrawAreaVisible?: boolean;\n    toggleDrawArea?: () => void;\n    controlAlign?: 'right' | 'left';\n    altLayout?: boolean;\n    hasSidebar?: boolean;\n    saveSearch?: () => void;\n    showInfrastructure?: boolean;\n    setShowInfrastructure?: (isShowInfrastructure: boolean) => void;\n    renderCustomerFeedback?: React.ReactNode;\n    renderMortgageButton?: React.ReactNode;\n}\n\nexport const OfferYMapDesktop = errorCatcherWrap(function OfferYMapDesktop({\n    bounds,\n    tileUrl,\n    tipsVisible = false,\n    tipsExpanded = false,\n    listUrl,\n    mapUrl,\n    handleClickList,\n    setBounds,\n    setPolygon,\n    children,\n    selectedArea,\n    displaySwitcher = true,\n    displayArea = true,\n    isDrawAreaVisible = false,\n    controlAlign = 'right',\n    toggleDrawArea = () => {},\n    altLayout = false,\n    hasSidebar,\n    saveSearch,\n    showInfrastructure,\n    setShowInfrastructure,\n    renderCustomerFeedback,\n    renderMortgageButton\n}: OfferYMapDesktopProps) {\n    let margin: YMapVector | YMapMargin = { x: 75, y: 10 };\n    // Во время движения по карте пин скрываем\n    const [ moving, setMoving ] = useState(false);\n    // Пока карту не трогали - пин скрыт\n    const trigger = useRef(false);\n\n    const onMouseUp = () => {\n        setMoving(false);\n    };\n    const onMouseDown = () => {\n        setMoving(true);\n        trigger.current = true;\n    };\n\n    if (hasSidebar) {\n        margin = {\n            topLeft: {\n                x: isDrawAreaVisible ? 385 : 120,\n                y: 10\n            },\n\n            bottomRight: {\n                x: 75,\n                y: 10\n            }\n        };\n    }\n\n    return (<YMapPane\n        bounds={bounds}\n        margin={margin}\n        setBounds={setBounds}\n        isScrollZoomEnabled\n        onMouseUp={onMouseUp}\n        onMouseDown={onMouseDown}\n    >\n        <YMapControlGroup hAlign={controlAlign} vAlign='middle' layout='vertical'>\n            <YMapControlZoom />\n            <YMapControlGeoLocation />\n            <YMapControlTraffic />\n            <YMapControlRuler />\n        </YMapControlGroup>\n\n        {tileUrl && <YMapLayer tileUrl={tileUrl} />}\n\n        {/*{saveSearch && <div className={cn('save-search', { alt: altLayout })}>*/}\n        {/*    <Button*/}\n        {/*        variant='primary-alt-bg'*/}\n        {/*        icon='magnifier-heart'*/}\n        {/*        dataTest='save-search-map'*/}\n        {/*        onClick={saveSearch}*/}\n        {/*        shadow*/}\n        {/*    >*/}\n        {/*        Сохранить поиск*/}\n        {/*    </Button>*/}\n        {/*</div>}*/}\n\n        {\n            (displayArea || setShowInfrastructure) && <div className={cn('toggle', {\n                tipsVisible,\n                tipsExpanded,\n                alt: altLayout,\n                hasSave: saveSearch !== undefined\n            })}>\n                {\n                    setShowInfrastructure && <Checkbox\n                        checked={showInfrastructure}\n                        onChange={setShowInfrastructure}\n                        className={cn('infrastructure')}\n                    >\n                        Инфраструктура\n                    </Checkbox>\n                }\n\n                {\n                    displayArea && <Button\n                        variant={isDrawAreaVisible ? 'danger' : 'primary-alt-bg'}\n                        onClick={toggleDrawArea}\n                        shadow\n                        icon='finger-draw'\n                    >{isDrawAreaVisible ? 'Удалить область' : 'Нарисовать область'}</Button>\n                }\n\n                {isDrawAreaVisible ? <YMapDrawAreaPane handleDrawEnd={setPolygon} selectedArea={selectedArea} /> : null}\n            </div>\n        }\n\n        {children}\n\n        {\n            displaySwitcher && mapUrl && listUrl && handleClickList && <OfferYMapDesktopSwitch\n                className={cn(altLayout ? 'switch-alt' : 'switch')}\n                listUrl={listUrl}\n                mapUrl={mapUrl}\n                active='map'\n                onClick={(id: string) => id === 'list' ? handleClickList() : undefined}\n                dark\n            />\n        }\n\n        {renderMortgageButton && trigger.current && ! moving && (\n            <div className={cn('mortgageButton')}>\n                {renderMortgageButton}\n            </div>\n        )}\n\n        {renderCustomerFeedback && (\n            <div className={cn('rateUs')}>\n                {renderCustomerFeedback}\n            </div>\n        )}\n    </YMapPane>);\n});\n","import React, { useCallback, useEffect } from 'react';\n\nimport { useYMapPane } from '@search/ymap/src/Pane';\n\nimport './Mobile.css';\n\nexport function YMapClickPane({\n    resetSelected\n}: {\n    resetSelected?: () => void;\n}) {\n    const { map } = useYMapPane();\n\n    const onClick = useCallback(() => {\n        resetSelected && resetSelected();\n    }, [ resetSelected ]);\n\n    useEffect(() => {\n        map.events.add('click', onClick);\n\n        return () => {\n            map.events.remove('click', onClick);\n        };\n    }, [ map, onClick ]);\n\n    return null;\n}\n","/* global window */\n\nconst win = typeof window === 'undefined' ? undefined : window;\n\nexport class SeoSearchUtm {\n    protected static storage = win?.localStorage;\n\n    static init() {\n        if (! this.storage) return;\n\n        const params = new URLSearchParams(window.location.search);\n        const utmParams = [] as ({ key: string; value: string })[];\n        let hasValues = false;\n\n        params.forEach((value, key) => {\n            if (! key.startsWith('utm_')) return;\n            if (value) hasValues = true;\n\n            utmParams.push({ key, value });\n        });\n\n        if (! hasValues) return;\n\n        this.storage?.setItem(\n            this.key,\n            JSON.stringify(utmParams)\n        );\n    }\n\n    protected static key = 'seoSearchUtm';\n\n    static get() {\n        try {\n            const data = this.storage?.getItem(this.key);\n\n            return data ?\n                (JSON.parse(data) as ({ key: string; value: string })[]) :\n                undefined;\n        } catch (e) {\n            e.message = 'SeoSearchUtm.get ' + e.message;\n            throw e;\n        }\n    }\n}\n","\nexport enum LandStatus {\n    IZHS = 'IZHS',\n    SNTDNP = 'SNTDNP',\n    LPH = 'LPH'\n}\n\nexport enum HouseType {\n    STANDALONE = 'STANDALONE',\n    PART_OF_HOUSE = 'PART_OF_HOUSE',\n    DUPLEX = 'DUPLEX',\n    TOWNHOUSE = 'TOWNHOUSE'\n}\n\nexport enum RegionEnum {\n    MSK = 'MSK',\n    MSK_AND_MSK_OBL = 'MSK_AND_MSK_OBL',\n    SPB = 'SPB',\n    SPB_AND_LEN_OBL = 'SPB_AND_LEN_OBL',\n    LEN_OBL = 'LEN_OBL',\n    MSK_OBL = 'MSK_OBL',\n}\n\nexport enum RegionIdEnum {\n    MSK = 3,\n    MSK_AND_MSK_OBL = 9513,\n    MSK_OBL = 108,\n    SPB = 444,\n    SPB_AND_LEN_OBL = 9514,\n    LEN_OBL = 886\n}\n\nexport enum DealType {\n    SELL = 'SELL',\n    RENT = 'RENT'\n}\n\nexport enum CategoryType {\n    HOUSE = 'HOUSE',\n    ROOM = 'ROOM',\n    FLAT = 'FLAT',\n    LAND = 'LAND'\n}\n\nexport enum RoomsEnum {\n    STUDIO = 'STUDIO',\n    ROOM_1 = 'ROOM_1',\n    ROOM_2 = 'ROOM_2',\n    ROOM_3 = 'ROOM_3',\n    ROOM_4 = 'ROOM_4',\n    ROOM_5_AND_MORE = 'ROOM_5_AND_MORE',\n    OPEN_PLAN = 'OPEN_PLAN'\n}\n\nexport enum NewBuilding {\n    NEW = 'NEW',\n    SECOND = 'SECOND'\n}\n\nexport enum CeilingHeightEnum {\n    FROM_2_5 = 'FROM_2_5',\n    FROM_2_7 = 'FROM_2_7',\n    FROM_3 = 'FROM_3',\n    FROM_4 = 'FROM_4'\n}\n\nexport enum Bathroom {\n    UNKNOWN = 'UNKNOWN',\n    COMBINED = 'COMBINED',\n    PARTED = 'PARTED',\n    SEVERAL = 'SEVERAL',\n}\n\nexport enum Renovation {\n    EURO = 'EURO',\n    COSMETIC = 'COSMETIC',\n    DESIGNED = 'DESIGNED',\n    NEED = 'NEED',\n    NONE = 'NONE'\n}\n\nexport enum PriceUnitEnum {\n    ALL = 'ALL',\n    METER = 'METER',\n    ARE = 'ARE'\n}\n\nexport enum NewBuildingTypeEnum {\n    RESIDENTIAL_COMPLEX = 'RESIDENTIAL_COMPLEX',\n    RESIDENTIAL_AREA = 'RESIDENTIAL_AREA',\n    APART_COMPLEX = 'APART_COMPLEX',\n    APART_HOTEL = 'APART_HOTEL',\n    QUARTER = 'QUARTER',\n    LOFT = 'LOFT',\n    MULTI_FUNCTIONAL_COMPLEX = 'MULTI_FUNCTIONAL_COMPLEX',\n    RESIDENCE = 'RESIDENCE',\n    MICRO_DISTRICT = 'MICRO_DISTRICT',\n    HOUSE = 'HOUSE',\n    CLUB_HOUSE = 'CLUB_HOUSE'\n}\n\nexport enum SortEnum {\n    DATE = 'date',\n    DATE_DESC = 'date_desc',\n    PRICE = 'price',\n    PRICE_DESC = 'price_desc'\n}\n\nexport enum NewBuildingSortingEnum {\n    UNKNOWN = 'UNKNOWN',\n    RELEVANCE = 'RELEVANCE',\n    PRICE = 'PRICE',\n    DATE_OF_COMMISSIONING = 'DATE_OF_COMMISSIONING',\n}\n\nexport enum BuildingStatusEnum {\n    IN_PROGRESS = 'IN_PROGRESS',\n    COMMISSIONED = 'COMMISSIONED',\n    FROZEN = 'FROZEN',\n\n}\n\nexport enum QuarterEnum {\n    FIRST = 'FIRST',\n    SECOND = 'SECOND',\n    THIRD = 'THIRD',\n    FOURTH = 'FOURTH'\n}\n\nexport enum NewBuildingClassEnum {\n    ECONOMY = 'ECONOMY',\n    COMFORT = 'COMFORT',\n    COMFORT_PLUS = 'COMFORT_PLUS',\n    BUSINESS = 'BUSINESS',\n    ELITE = 'ELITE'\n}\n\n// Материал стен дома;\nexport enum WallsTypeEnum {\n    MONOLITH = 'MONOLITH',\n    BRICK = 'BRICK',\n    BRICK_MONOLITH = 'BRICK_MONOLITH',\n    PANEL = 'PANEL',\n    BLOCK = 'BLOCK',\n    // WOOD = 'WOOD',\n}\n\nexport enum GeoKindEnum {\n    UNKNOWN,\n    HOUSE,\n    STREET,\n    METRO,\n    DISTRICT,\n    LOCALITY,\n    AREA,\n    PROVINCE,\n    COUNTRY,\n    HYDRO,\n    VEGETATION,\n    AIRPORT,\n    OTHER,\n    RAILWAY_STATION,\n    ROUTE,\n    STATION,\n    COMPOSITE_OBJECT,\n    STREET_ADDRESS,\n    APARTMENT\n}\n\nexport enum ImageAttributesTypeEnum {\n    UNKNOWN = 'UNKNOWN',\n    LAYOUT = 'LAYOUT',\n}\n","/* eslint-disable */\nexport const styleId = 'layout-components-modals-style';\nexport const userAuthorizationStateStyleId = 'user-authorization-state-style';\n\n// shouldn't have closures, inlined to html via .toString()\nexport function initCookieModalHack() {\n    try {\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        run();\n    } catch (err) {\n        console.error(err);\n    }\n\n    function run() {\n        // 1. constants\n        const cookieName = 'cookies_accepted';\n        const cookiesRejectedLSKey = 'cookies_rejected';\n        const styleId = 'layout-components-modals-style';\n        const userAuthorizationStateStyleId = 'user-authorization-state-style';\n\n        // 2. variables\n        const style = document.querySelector(`#${styleId}`);\n        const userAuthorizationStateStyle = document.querySelector(`#${userAuthorizationStateStyleId}`);\n        // @ts-ignore\n        const user = window.__INITIAL_STATE__?.userStore?.user;\n        let styleTextNode: Text;\n        let userAuthorizationStateStyleTextNode: Text;\n\n        // 3. global variables\n        // sync with projects/root/src/common-modules/layout-components/constants/domains.ts\n        // @ts-ignore\n        window.__shouldUseChatStub = [ 'rb.m2', 'm2.region.vtb.ru' ].includes(document.location.hostname);\n        // @ts-ignore\n        window.__isCookieModalVisible =\n            !(document.cookie ? document.cookie.split('; ') : []).find(\n                (cookie) => decodeURIComponent(cookie.split('=')[0]) === cookieName,\n            ) && !window?.localStorage?.getItem(cookiesRejectedLSKey);\n        // @ts-ignore\n        window.__isUserAuthorized = Boolean(user && user.isAuthenticated);\n\n        // 4. callbacks\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        // @ts-ignore\n        window.__hideCookiesModal = hideCookiesModal;\n\n        // 5. main logic\n        // @ts-ignore\n        if (window.__isCookieModalVisible) {\n            // eslint-disable-next-line @typescript-eslint/no-use-before-define\n            updateCss();\n        } else {\n            // includes updateCss() inside\n            // @ts-ignore\n            window.__hideCookiesModal();\n        }\n\n        updateUserInfoCss();\n\n        // 6. functions\n        function updateCss() {\n            let css = '';\n\n            // @ts-ignore\n            if (window.__isCookieModalVisible) {\n                // node_modules/@vtblife/uikit/dist/css/mixins/ds-breakpoint.css\n                css += `\n                .chatWidget, .chatWidgetButton, .chatListButton {\n                    bottom: 152px !important;\n                }\n\n                @media screen and (max-width: 767px) {\n                    .chatWidget, .chatWidgetButton, .chatListButton {\n                        bottom: 120px !important;\n                    }\n                }\\n`;\n            } else {\n                css += `\n                .cookie-consent-wrapper {\n                    display: none !important;\n                }\\n`;\n            }\n\n            // @ts-ignore\n            if (! window.__shouldUseChatStub) {\n                css += `\n                .chatWidgetButton {\n                    display: none !important;\n                }\\n`;\n            }\n\n            if (! styleTextNode) {\n                styleTextNode = document.createTextNode(css);\n                style?.appendChild(styleTextNode);\n            } else {\n                styleTextNode.textContent = css;\n            }\n        }\n\n        function hideCookiesModal() {\n            // @ts-ignore\n            window.__isCookieModalVisible = false;\n            updateCss();\n        }\n\n        function updateUserInfoCss() {\n            let css = '';\n\n            // @ts-ignore\n            if (window.__isUserAuthorized) {\n                css += `\n                .initialAuthorizedUser {\n                    display: block !important;\n                }\\n`;\n            } else {\n                css += `\n                .initialUnauthorizedUser {\n                    display: block !important;\n                }\\n`;\n            }\n\n            if (! userAuthorizationStateStyleTextNode) {\n                userAuthorizationStateStyleTextNode = document.createTextNode(css);\n                userAuthorizationStateStyle?.appendChild(userAuthorizationStateStyleTextNode);\n            } else {\n                userAuthorizationStateStyleTextNode.textContent = css;\n            }\n        }\n    }\n}\n","import './styles.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { Badge, IBadgeProps } from '..';\n\nconst cn = classname.bind(null, 'DefaultBadge');\n\ninterface IDefaultBadgeProps extends IBadgeProps {\n    variant: 'transparent' | 'gray' | 'blue';\n}\n\nexport const DefaultBadge = ({\n    variant,\n    children,\n    ...props\n}: IDefaultBadgeProps) => (\n    <Badge\n        size='xs'\n        className={cn(null, { variant })}\n        textClassName={cn('text', { variant })}\n        {...props}\n    >\n        {children}\n    </Badge>\n);\n","import React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { Badge, IBadgeProps } from '..';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'GalleryBadge');\n\nexport const GalleryBadge = ({\n    children,\n    ...props\n}: IBadgeProps) => (\n    <Badge\n        size='m'\n        level='primary-alone'\n        className={cn()}\n        bold\n        {...props}\n    >\n        {children}\n    </Badge>\n);\n","import React, { FunctionComponent } from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { Badge as DSBadge } from '@vtblife/uikit';\nimport { BadgeColor, BadgeProps } from '@vtblife/uikit/dist/components/badge/types';\n\nimport { Badge, IBadgeProps } from '../index';\n\nimport './styles.css';\n\ntype NewBuildingClass = 'BUSINESS' | 'COMFORT' | 'COMFORT_PLUS' | 'ECONOMY' | 'ELITE' | 'UNKNOWN'\n\nconst NEW_BUILDING_CLASS_COLORS: Record<NewBuildingClass, BadgeColor> = {\n    BUSINESS: 'purple',\n    COMFORT: 'turquoise',\n    COMFORT_PLUS: 'green',\n    ECONOMY: 'orange',\n    ELITE: 'black',\n    UNKNOWN: 'black'\n};\n\nexport interface NewBuildingClassBadgeProps extends IBadgeProps {\n    className?: string;\n    newBuildingClass: NewBuildingClass;\n}\n\nconst cn = classname.bind(null, 'NewBuildingClassBadge');\n\nexport const NewBuildingClassBadge: FunctionComponent<NewBuildingClassBadgeProps> = ({\n    size,\n    children,\n    className,\n    newBuildingClass,\n    ...rest\n}) => {\n    return (\n        <Badge\n            {...rest}\n            className={cn(null, { class: newBuildingClass }, className)}\n            textClassName={cn('text', { class: newBuildingClass })}\n            noBottomMargin\n        >\n            {children}\n        </Badge>\n    );\n};\n\nexport const NewBuildingClassDSBadge: FunctionComponent<Omit<BadgeProps, 'color'> & {\n    newBuildingClass: NewBuildingClass;\n}> = ({\n    newBuildingClass,\n    children,\n    ...rest\n}) => (\n    <DSBadge\n        {...rest}\n        color={NEW_BUILDING_CLASS_COLORS[newBuildingClass]}\n    >\n        {children}\n    </DSBadge>\n);\n","import React from 'react';\n\nimport Icon, { IIconProps } from '../Icon';\n\nimport './styles.css';\n\ninterface IIconPercent extends IIconProps {\n    type?: 'percent';\n}\n\nexport default ({\n    type = 'percent',\n    ...props\n}: IIconPercent): React.ReactElement => React.cloneElement(<Icon />, {\n    type,\n    ...props\n});\n","import React from 'react';\n\nimport IconPercent from '@search/vtbeco-ui/src/components/controls/IconPercent';\nimport classname from '@search/classname/src';\n\nimport { Badge, IBadgeProps } from '..';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'PreferentialMortgageBadge');\n\ninterface IPreferentialMortgageBadge extends IBadgeProps {\n    variant: 'default' | 'vtb';\n}\n\nexport const PreferentialMortgageBadge = ({\n    size,\n    variant,\n    ...props\n}: IPreferentialMortgageBadge) => {\n    return (\n        <Badge\n            size={size}\n            className={cn(null, { variant })}\n            textClassName={cn('text')}\n            before={<IconPercent />}\n            {...props}\n        >\n            Ипотека 6,5%\n        </Badge>\n    );\n};\n","import React, { HTMLAttributes, ReactNode, Ref } from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport type { TypographyColor, TypographyVariant } from '@vtblife/uikit/dist/components/typography/types';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport type BadgeIndent = 'xxs' | 'xs' | 's' | 'm' | 'l';\n\nexport interface IBadgeProps extends HTMLAttributes<HTMLDivElement> {\n    size?: 'xs' | 'm';\n    color?: TypographyColor;\n    level?: TypographyVariant;\n    bold?: boolean;\n    backgroundColor?: string;\n    before?: ReactNode;\n    rightIndent?: BadgeIndent | null;\n    noBottomMargin?: boolean;\n    textClassName?: string;\n    anchorRef?: Ref<HTMLDivElement | null>;\n}\n\nconst cn = classname.bind(null, 'Badge');\n\nexport const Badge = ({\n    className,\n    size = 'xs',\n    level = 'small-alone',\n    color = 'white-500',\n    backgroundColor,\n    before,\n    children,\n    rightIndent = 'xxs',\n    noBottomMargin = false,\n    textClassName,\n    anchorRef,\n    bold = false,\n    ...props\n}: IBadgeProps) => {\n    return (\n        <div\n            {...props}\n            ref={anchorRef}\n            className={cn(null, {\n                size,\n                rightIndent: rightIndent === null ? undefined : rightIndent,\n                noBottomMargin\n            }, className)}\n            style={{ backgroundColor }}\n        >\n            {before && (\n                <div className={cn('before')}>\n                    {before}\n                </div>\n            )}\n            <Typography\n                color={color}\n                className={textClassName}\n                variant={level}\n                bold={bold}\n            >\n                {children}\n            </Typography>\n        </div>\n    );\n};\n","import React, { HTMLAttributes } from 'react';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport interface IBadgeBoxProps extends HTMLAttributes<HTMLDivElement> {\n    position?: 'top-left' | 'top-right' | 'top-right-same' | 'bottom-left' | 'bottom-right' | 'built-in';\n    view?: 'desktop' | 'mobile';\n}\n\nconst cn = classname.bind(null, 'BadgeBox');\n\nexport const BadgeBox = ({\n    position,\n    view = 'desktop',\n    className,\n    children,\n    ...props\n}: IBadgeBoxProps) => (\n    <div\n        {...props}\n        className={cn(null, { position, view }, className)}\n    >\n        {children}\n    </div>\n);\n","import './style.css';\n\nimport React from 'react';\n\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport classname from '@search/classname/src';\n\nimport Image from '../Image';\nimport type { MinimalBanksMortgageOffersQueryResponseOffer } from '../MinimalBanksMortgage/MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\n\nimport iconMortgageFamily from './iconMortgageFamily.url.svg';\nimport iconMortgagePreferential from './iconMortgagePreferential.url.svg';\n\nconst cn = classname.bind(null, 'MortgageOfferIcon');\n\nexport function MortgageOfferIcon({ name, size = 's', pseudoCount, offer }: {\n    name?: string;\n    size?: 's' | 'm';\n} & ({\n    pseudoCount: number;\n    offer?: undefined;\n} | {\n    offer: MinimalBanksMortgageOffersQueryResponseOffer;\n    pseudoCount?: undefined;\n})) {\n    const staticPath = useStaticPathConfig();\n    const mul = size === 's' ? 1 : 1.5;\n    const width = Math.floor((offer?.type ? 56 : 24) * mul);\n    const height = Math.floor(24 * mul);\n\n    if (pseudoCount) {\n        return (\n            <div className={cn('pseudo')} style={{ width, height }}>+{pseudoCount}</div>\n        );\n    }\n\n    let imgUrl = offer?.icon?.origin ?? '';\n\n    if (offer?.type === 'FAMILY') imgUrl = `${staticPath}${iconMortgageFamily}`;\n\n    if (offer?.type === 'PREFERENTIAL') imgUrl = `${staticPath}${iconMortgagePreferential}`;\n\n    if (offer?.type === 'IT_MORTGAGE') imgUrl = `${staticPath}${iconMortgagePreferential}`;\n\n    return (\n        <Image\n            width={width}\n            height={height}\n            loading='lazy'\n            alt={name ?? offer?.name ?? ''}\n            url={imgUrl}\n        />\n    );\n}\n","import './styles.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\nimport { Select } from '@vtblife/uikit';\n\nimport type { useWorkingHours } from './useWorkingHours';\n\nconst cn = classname.bind(null, 'WorkingHours');\n\nexport function WorkingHours({\n    mobile,\n    workingHoursRange,\n    setStartHoursRange,\n    setEndHoursRange,\n    startHourValues,\n    endHourValues,\n    size = 'l'\n}: {\n    mobile?: boolean;\n    size?: 's' | 'm' | 'l';\n} & Omit<ReturnType<typeof useWorkingHours>, 'rawWorkingHoursRange'>) {\n    return (\n        <div className={cn('flex')}>\n            <Select\n                onChange={setStartHoursRange}\n                native={mobile}\n            >\n                <Select.Button\n                    size={size}\n                    label='Не ранее'\n                >\n                    {workingHoursRange.start}\n                </Select.Button>\n                <Select.Content height={172}>\n                    {\n                        startHourValues.map(({ value, label, disabled }) => (\n                            <Select.Option\n                                key={value}\n                                disabled={disabled}\n                                value={value}\n                                selected={workingHoursRange.start === label}\n                            >\n                                {label}\n                            </Select.Option>\n                        ))\n                    }\n                </Select.Content>\n            </Select>\n            <Select\n                onChange={setEndHoursRange}\n                native={mobile}\n            >\n                <Select.Button\n                    label='Не позднее'\n                    size={size}\n                >\n                    {workingHoursRange.end}\n                </Select.Button>\n                <Select.Content height={172}>\n                    {\n                        endHourValues.map(({ value, label, disabled }) => (\n                            <Select.Option\n                                key={value}\n                                disabled={disabled}\n                                value={value}\n\n                                selected={workingHoursRange.end === label}\n                            >\n                                {label}\n                            </Select.Option>\n                        ))\n                    }\n                </Select.Content>\n            </Select>\n        </div>\n    );\n}\n","import { useCallback } from 'react';\nimport { formatPhone } from '@search/helpers/src/formatPhone';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport type {\n    useCallbackRequestMutation$data as useCallbackRequestMutationResponse,\n    useCallbackRequestMutation$variables as useCallbackRequestMutationVariables\n} from './__generated__/useCallbackRequestMutation.graphql';\n\nconst mutation = graphql`\n    mutation useCallbackRequestEmailMutation(\n        $phone: String!\n        $newBuildingName: String\n        $address: String!\n        $developerName: String\n        $hours: String!\n        $extra: String\n        $subjectExtra: String\n        $emailSender: EmailSenderEnum!\n        $offerLink: String\n        $isCallbackRequestCreated: Boolean\n        $isNewBuilding: Boolean\n        $newBuildingRanking: String\n        $regionId: Int\n    ) {\n        createEmailCallback(\n            phone: $phone\n            newBuildingName: $newBuildingName\n            address: $address\n            developerName: $developerName\n            hours: $hours\n            extra: $extra\n            subjectExtra: $subjectExtra\n            emailSender: $emailSender\n            link: $offerLink\n            isCallbackRequestCreated: $isCallbackRequestCreated\n            isNewBuilding: $isNewBuilding\n            newBuildingRanking: $newBuildingRanking\n            regionId: $regionId\n        ) {\n            emailMessageId\n        }\n    }\n`;\n\nexport const useCallbackRequest = () => {\n    const gql = useGqlContext();\n\n    return useCallback(\n        (vars: useCallbackRequestMutationVariables, opts?: { signal?: AbortSignal }) => {\n            const phone = formatPhone(vars.phone);\n\n            return gql.client<\n                useCallbackRequestMutationVariables,\n                useCallbackRequestMutationResponse\n            >(\n                mutation,\n                {\n                    ...vars,\n                    phone\n                },\n                {\n                    pathUniqSuffix: `/callback/${phone}/`,\n                    ...opts\n                }\n            );\n        },\n        [ gql ]\n    );\n};\n","type FieldType = {\n    name: string; // Название поля (длина от 1 до 15)\n    value: string; // Значение поля (длина от 1 до 15)\n}\n\nexport type CreateRequestSuccessResponse = {\n    callbackRequestId: number; // Идентификатор заявки на обратный звонок\n}\n\nexport type ErrorResponse = {\n    type: CalltouchCallbackError; // Тип ошибки\n    message: string; // Текст ошибки\n    details: object; // Детали ошибки\n}\n\nexport enum CalltouchCallbackError {\n    UNKNOWN_ERROR = 'unknown_error',\n    SERVER_ERROR = 'server_error',\n    REQUEST_THROTTLE_TIMEOUT= 'request_throttle_timeout',\n    REQUEST_THROTTLE_COUNT = 'request_throttle_count',\n    VALIDATION_ERROR = 'validation_error',\n    REQUEST_PHONE_BLACKLISTED = 'request_phone_blacklisted',\n    REQUEST_WIDGET_NOT_FOUND = 'request_widget_not_found'\n}\n\ndeclare const window: Window & {\n    ctw?: {\n        // Создание заявки на обратный звонок от Calltouch\n        createRequest: (\n            routeKey: string, // Идентификатор формы (длина от 1 до 255)\n            phone: string, // Номер телефона с кодом страны и города, без плюса (11 символов)\n            fields: FieldType[], // Дополнительные поля (не более 5), используются для синтеза речи\n            requestCallback: (success: boolean, responseData: CreateRequestSuccessResponse | ErrorResponse) => void, // функция обратного вызова для обработки результата запроса\n            scheduleTime: string | null, // Время в формате Y-m-d H:i:s (например, 2018-02-12 22:33:00), на которое нужно запланировать звонок; если null, то звонок будет выполнен сразу\n            tags: string[], // Пользовательские теги (не более 10),\n            unitId: number, // Идентификатор отдела\n        ) => void;\n    };\n};\n\ntype Hours = {\n    start?: number;\n    end?: number;\n}\n\ninterface ISendCalltouchCallbackRequest {\n    phone: string;\n    unitId: number;\n    routeKey?: string;\n    fields?: FieldType[];\n    hours?: Hours | null;\n    tags?: string[];\n}\n\nconst ROUTE_KEY = 'm2_cb';\n\nconst getScheduleTime = (hours: Hours | null) => {\n    if (! hours || ! hours.start || ! hours.end) {\n        return null;\n    }\n\n    const resultDate = new Date();\n\n    resultDate.setHours(hours.start);\n\n    resultDate.setMinutes(0);\n    resultDate.setSeconds(0);\n\n    const untilDate = new Date();\n\n    untilDate.setHours(hours.end);\n    untilDate.setMinutes(0);\n    untilDate.setSeconds(0);\n\n    const currentDate = new Date();\n\n    // Если текущее время позднее, чем время \"до\" — переносим на завтра\n    if (currentDate > untilDate) {\n        resultDate.setDate(resultDate.getDate() + 1);\n    }\n\n    const [ date, time ] = resultDate\n        .toLocaleString('ru-RU', { timeZone: 'Europe/Moscow' })\n        .split(', ');\n\n    return `${date.split('.').reverse().join('-')} ${time}`;\n};\n\nexport const sendCalltouchCallbackRequest = ({\n    routeKey = ROUTE_KEY,\n    phone,\n    fields = [],\n    hours = null,\n    tags = [],\n    unitId\n}: ISendCalltouchCallbackRequest): Promise<CreateRequestSuccessResponse> => {\n    const scheduleTime = getScheduleTime(hours);\n\n    return new Promise((res, rej) => {\n        const requestCallback = makeRequestCallback(res, rej);\n\n        window.ctw?.createRequest?.(\n            routeKey,\n            phone,\n            fields,\n            requestCallback,\n            scheduleTime,\n            tags,\n            unitId\n        );\n    });\n};\n\nconst makeRequestCallback = (\n    resolve: (value: CreateRequestSuccessResponse) => void,\n    reject: (reason?: ErrorResponse) => void\n) => (\n    success: boolean,\n    responseData: CreateRequestSuccessResponse | ErrorResponse\n) => {\n    if (success) {\n        return resolve(responseData as CreateRequestSuccessResponse);\n    }\n\n    const error = responseData as ErrorResponse;\n\n    // eslint-disable-next-line no-console\n    console.error('sendCalltouchCallbackRequest error', error);\n\n    return reject(error);\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\nimport { PhoneInput, Size } from '@vtblife/uikit/legacy';\nimport { ModalProps } from '@vtblife/uikit/dist/components/modal/types';\n\nimport { formatPhone } from '@search/helpers/src/formatPhone';\nimport classname from '@search/classname/src';\nimport { useToggleValue } from '@search/hooks/src/useToggleValue';\nimport { STATUS } from '@search/gql-client/src';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\nimport { useApplicationContext } from '@search/hooks/src/providers/ApplicationProvider/ApplicationProvider';\nimport { useClassifiedOfferDataLayerPush } from '../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\n\nimport { useInitialPhone } from '../../hooks/useInitialPhone';\nimport { useWorkingHours } from '../WorkingHours/useWorkingHours';\nimport { WorkingHours } from '../WorkingHours/WorkingHours';\nimport { normalizeCallbackUrl } from '../MinimalBanksMortgage/mortgage2/mortgage2ContactsFormSend';\nimport type { useCallbackRequestEmailMutation$variables as useCallbackRequestEmailMutationVariables } from './__generated__/useCallbackRequestEmailMutation.graphql';\nimport { useCallbackRequest } from './useCallbackRequest';\nimport {\n    ErrorResponse,\n    sendCalltouchCallbackRequest,\n    CalltouchCallbackError\n} from './sendCalltouchCallbackRequest';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CallbackModal');\n\nconst PHONE_NUMBER_LENGTH = 11;\nconst START_HOUR_WORKING_DAY_SALES = 9;\nconst END_HOUR_WORKING_DAY_SALES = 21;\nconst DEFAULT_REQUEST_ERROR_MESSAGE = 'Что-то пошло не так, попробуйте позже.';\nconst HOST_M2_IPOTEKA = 'https://m2.ru/ipoteka';\n\nexport type CallbackDataType = Pick<\n    ICallbackModalProps,\n    'newBuildingName' | 'address' | 'developerName' | 'extra' | 'subjectExtra' | 'emailSender' | 'callbackUnitId'\n>;\n\ninterface ICallbackModalProps extends\n    Omit<ModalProps, 'opened' | 'children'>,\n    Omit<useCallbackRequestEmailMutationVariables, 'phone' | 'hours'>\n{\n    isOpened?: boolean;\n    startHour?: number;\n    endHour?: number;\n    gtmSendClick?: string;\n    onSendEventPush?: () => void;\n    gtmShowModal?: string;\n    btnWrapperClass?: string;\n    onClose?(): void;\n    renderTrigger?: (openModalCallback: () => void) => React.ReactNode;\n    callbackUnitId?: number; // Идентификатор отдела в Коллтаче (зависит от региона)\n    enableInnerText360?: boolean;\n    hasNoText?: boolean;\n    withoutIconOnButton?: boolean;\n    buttonSize?: 's' | 'm' | 'l';\n    onDarkBackground?: boolean;\n}\n\nconst INIT_REQUEST_DATA = {\n    status: STATUS.INIT,\n    errorMessage: ''\n};\n\nexport const CallbackModal: React.FC<ICallbackModalProps> = ({\n    size = 's',\n    mobile = false,\n    startHour = START_HOUR_WORKING_DAY_SALES,\n    endHour = END_HOUR_WORKING_DAY_SALES,\n    newBuildingName,\n    address,\n    developerName,\n    offerLink,\n    extra,\n    subjectExtra,\n    emailSender,\n    gtmSendClick,\n    onSendEventPush,\n    gtmShowModal,\n    renderTrigger,\n    btnWrapperClass,\n    callbackUnitId,\n    newBuildingRanking,\n    regionId,\n    isNewBuilding,\n    onClose,\n    enableInnerText360,\n    hasNoText,\n    withoutIconOnButton,\n    buttonSize,\n    onDarkBackground = false\n}) => {\n    const {\n        rawWorkingHoursRange,\n        workingHoursRange,\n        setStartHoursRange,\n        setEndHoursRange,\n        startHourValues,\n        endHourValues\n    } = useWorkingHours({ startHour, endHour });\n\n    const initialPhone = useInitialPhone();\n    const [ phoneNumber, setPhoneNumber ] = useState(initialPhone);\n\n    const [ requestData, setRequestData ] = useState(INIT_REQUEST_DATA);\n\n    const {\n        handleToggleTogVal: handleToggleModal,\n        isToggleValue: isOpenModal\n    } = useToggleValue(Boolean(onClose));\n\n    useEffect(() => {\n        if (isOpenModal) {\n            setPhoneNumber(initialPhone);\n\n            setRequestData(INIT_REQUEST_DATA);\n        }\n    }, [ initialPhone, isOpenModal ]);\n\n    const isFirstShowModal = useRef(true);\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const sendGtmFirstShowModal = useCallback(() => {\n        if (isFirstShowModal.current) {\n            gtmShowModal && dataLayerPush({ event: gtmShowModal });\n            isFirstShowModal.current = false;\n        }\n    }, [ isFirstShowModal, gtmShowModal, dataLayerPush ]);\n\n    const sendCallBackRequest = useCallbackRequest();\n\n    const sendRequest = useCallback(async () => {\n        const makeSendCallBackRequest = async (isCallbackRequestCreated?: boolean) => {\n            const { data } = await sendCallBackRequest({\n                extra,\n                address,\n                regionId,\n                offerLink: normalizeCallbackUrl(offerLink),\n                emailSender,\n                subjectExtra,\n                developerName,\n                isNewBuilding,\n                newBuildingName,\n                newBuildingRanking,\n                isCallbackRequestCreated,\n                phone: phoneNumber,\n                hours: `c ${workingHoursRange.start} до ${workingHoursRange.end}`\n            });\n\n            const errorMessage = data?.createEmailCallback.emailMessageId ? '' : DEFAULT_REQUEST_ERROR_MESSAGE;\n\n            setRequestData({\n                status: errorMessage ? STATUS.ERROR : STATUS.RESOLVE,\n                errorMessage\n            });\n        };\n\n        gtmSendClick && dataLayerPush({ event: gtmSendClick });\n        onSendEventPush?.();\n        dataLayerPush({ event: 'up_evt_call_back' });\n\n        setRequestData(state => ({\n            ...state,\n            status: STATUS.PENDING\n        }));\n\n        let isCallbackRequestCreated = false;\n        let isLimitExceeded = false;\n\n        if (callbackUnitId) {\n            try {\n                const { callbackRequestId } = await sendCalltouchCallbackRequest({\n                    phone: phoneNumber,\n                    unitId: callbackUnitId,\n                    hours: rawWorkingHoursRange,\n                    fields: [ {\n                        name: 'Название объекта',\n                        value: newBuildingName ?? ''\n                    } ]\n                });\n\n                isCallbackRequestCreated = Boolean(callbackRequestId);\n            } catch (e) {\n                const errorType = (e as ErrorResponse).type;\n\n                if (errorType === CalltouchCallbackError.REQUEST_THROTTLE_TIMEOUT || errorType === CalltouchCallbackError.REQUEST_THROTTLE_COUNT) {\n                    isLimitExceeded = true;\n                    setRequestData({\n                        status: STATUS.ERROR,\n                        errorMessage: DEFAULT_REQUEST_ERROR_MESSAGE\n                    });\n                }\n            }\n        }\n\n        if (! isLimitExceeded) {\n            makeSendCallBackRequest(isCallbackRequestCreated).catch(() => {\n                setRequestData({\n                    status: STATUS.ERROR,\n                    errorMessage: DEFAULT_REQUEST_ERROR_MESSAGE\n                });\n            });\n        }\n    }, [\n        dataLayerPush,\n        emailSender,\n        phoneNumber,\n        newBuildingName,\n        address,\n        developerName,\n        offerLink,\n        extra,\n        subjectExtra,\n        workingHoursRange,\n        sendCallBackRequest,\n        gtmSendClick,\n        rawWorkingHoursRange,\n        callbackUnitId,\n        regionId,\n        isNewBuilding,\n        newBuildingRanking,\n        onSendEventPush\n    ]);\n\n    const isResolvedData = requestData.status === STATUS.RESOLVE;\n\n    const applicationContext = useApplicationContext();\n    const isClassifiedApp = applicationContext === ApplicationIdEnum.ClassifiedDesktop || applicationContext === ApplicationIdEnum.ClassifiedTouch;\n\n    const handleClick = useCallback(() => {\n        if (isClassifiedApp) {\n            window.location.href = HOST_M2_IPOTEKA;\n        } else { // if (newBuildingName)\n            sendGtmFirstShowModal();\n            handleToggleModal();\n        }\n    }, [ sendGtmFirstShowModal, handleToggleModal ]);\n\n    const buttons = renderTrigger ? renderTrigger(handleClick) : (\n        <div className={cn('buttonWrapper', {\n            enableInnerText360: enableInnerText360 && ! hasNoText\n        }, btnWrapperClass)}>\n            <Button\n                icon={withoutIconOnButton || ! newBuildingName ? undefined : 'phone-incoming'}\n                fullWidth={! hasNoText}\n                variant={onDarkBackground ? 'secondary-alt-bg' : 'secondary'}\n                onClick={handleClick}\n                dataTest='callback-button-cta'\n                size={buttonSize ?? 's'}\n            >\n                {hasNoText ? null : isClassifiedApp ? (\n                    <>\n                        <span className={cn('inner-text-360')}>Купить в ипотеку</span>\n                        <span className={cn('inner-text')}>Купить в ипотеку</span>\n                    </>\n                ) : (\n                    <>\n                        <span className={cn('inner-text-360')}>Перезвоните</span>\n                        <span className={cn('inner-text')}>Перезвоните мне</span>\n                    </>\n                )}\n            </Button>\n        </div>\n    );\n\n    return (<>\n        {onClose ? null : buttons}\n        <Modal\n            zIndex={mobile ? 1050 : undefined} // --l-modal\n            opened={isOpenModal}\n            size={size}\n            mobile={mobile}\n            swipeToClose={! mobile}\n            onClose={onClose ?? handleToggleModal}\n            data-scroll-lock-ignore\n        >\n            {mobile && (\n                <Modal.Header>\n                    Обратный звонок\n                </Modal.Header>\n            )}\n            <Modal.Content scrollable>\n                {\n                    mobile ? (\n                        isResolvedData && (\n                            <Typography\n                                bold\n                                variant='h3'\n                                className={cn('title', { mobile })}\n                            >\n                                Принято\n                            </Typography>\n                        )\n                    ) : (\n                        <Typography\n                            bold\n                            variant='h3'\n                            className={cn('title', { mobile })}\n                        >\n                            {isResolvedData ? 'Принято' : 'Обратный звонок'}\n                        </Typography>\n                    )\n                }\n                <Typography variant='primary' className={cn('mainMessage', { mobile })}>\n                    {\n                        isResolvedData ?\n                            'Мы перезвоним вам в указанное время.' :\n                            // eslint-disable-next-line max-len\n                            'Оставьте свой номер телефона, и мы обязательно перезвоним в указанное время (МСК).'\n                    }\n                </Typography>\n                {\n                    isResolvedData ? (\n                        <Typography\n                            bold\n                            variant='primary'\n                            className={cn('result')}\n                        >\n                            {`${\n                                formatPhone(phoneNumber, { skipParenthesis: true, separateLast: true })\n                            } c ${\n                                workingHoursRange.start\n                            } до ${\n                                workingHoursRange.end\n                            } (МСК)`}\n                        </Typography>\n                    ) : (\n                        <>\n                            <div className={cn('form', { mobile })}>\n                                <PhoneInput\n                                    fullWidth\n                                    value={phoneNumber}\n                                    onChange={setPhoneNumber}\n                                    hasClear\n                                    inputMode='numeric'\n                                    label='Номер телефона'\n                                    size={Size.Large}\n                                    className={cn('phone')}\n                                />\n                                <WorkingHours\n                                    mobile={mobile}\n                                    workingHoursRange={workingHoursRange}\n                                    setStartHoursRange={setStartHoursRange}\n                                    setEndHoursRange={setEndHoursRange}\n                                    startHourValues={startHourValues}\n                                    endHourValues={endHourValues}\n                                />\n                            </div>\n                            {\n                                requestData.status === STATUS.ERROR && (\n                                    <Typography\n                                        color='red-500'\n                                        variant='primary'\n                                        className={cn('errorMessage', { mobile })}\n                                    >\n                                        {requestData.errorMessage}\n                                    </Typography>\n                                )\n                            }\n                            <Button\n                                fullWidth\n                                onClick={sendRequest}\n                                disabled={\n                                    phoneNumber.length < PHONE_NUMBER_LENGTH ||\n                                    requestData.status === STATUS.PENDING\n                                }\n                            >\n                                Отправить\n                            </Button>\n                        </>\n                    )\n                }\n            </Modal.Content>\n        </Modal>\n    </>);\n};\n","import './CoreSvgSpriteIcon.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'CoreSvgSpriteIcon');\n\ninterface IProps<T extends string> extends React.SVGProps<SVGSVGElement> {\n    name: T;\n    height?: number;\n    width?: number;\n    color?: string;\n    className?: string;\n    viewBoxWidth?: number;\n    viewBoxHeight?: number;\n}\n\nexport const CoreSvgSpriteIcon = <T extends string>({\n    name,\n    width = 24,\n    height = 24,\n    viewBoxWidth = width,\n    viewBoxHeight = height,\n    color,\n    className,\n    ...otherProps\n}: IProps<T>) => {\n    return (\n        <svg\n            height={height}\n            width={width}\n            className={cn(null, undefined, className)}\n            color={color}\n            viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`}\n            {...otherProps}\n        >\n            <use href={`#${name}`} />\n        </svg>\n    );\n};\n","import React, { Ref } from 'react';\n\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport type { ICustomerFeedbackOpenButton } from '../../../../../common/components/CustomerFeedback/components/OpenButton';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackOpenButtonBlue');\n\nexport const OpenButtonBlue = React.forwardRef(({\n    handleCloseOpenBtn,\n    handleOpen\n}: Pick<ICustomerFeedbackOpenButton, 'handleCloseOpenBtn' | 'handleOpen'>, ref: Ref<HTMLDivElement>) => (\n    <div\n        ref={ref}\n        className={cn()}\n    >\n        <Button\n            size='s'\n            rounded='left'\n            onClick={handleOpen}\n            dataTest='customer-feedback-open-btn'\n        >\n            Отзыв о сайте\n        </Button>\n        <Button\n            size='s'\n            icon='times'\n            rounded='right'\n            onClick={handleCloseOpenBtn}\n            dataTest='customer-feedback-close-btn'\n        />\n    </div>\n));\n","import React, { useCallback, useEffect, useState } from 'react';\nimport throttle from 'lodash/throttle';\n\nimport { Button, Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport type { ICustomerFeedbackOpenButton } from '../../../../../common/components/CustomerFeedback/components/OpenButton';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackOpenButtonBlueBanner');\n\nexport const OpenButtonBlueBanner = ({\n    handleCloseOpenBtn,\n    handleOpen,\n}: Pick<ICustomerFeedbackOpenButton, 'handleCloseOpenBtn' | 'handleOpen'>) => {\n    const [ isVisible, setVisible ] = useState<boolean>(false);\n    const [ hasTimerWorked, setTimerWorked ] = useState<boolean>(false);\n\n    const footerElement = document.getElementById('footer');\n    const viewportHeight = window.innerHeight;\n\n    const handleScroll = useCallback(() => {\n        if (! hasTimerWorked) {\n            return;\n        }\n\n        const footerTop = footerElement?.getBoundingClientRect()?.top ?? 0;\n\n        setVisible(footerTop > viewportHeight);\n    }, [ hasTimerWorked ]);\n\n    useEffect(() => {\n        const throttledHandleScroll = throttle(handleScroll, 100);\n\n        window.addEventListener('scroll', throttledHandleScroll);\n\n        return () => window.removeEventListener('scroll', throttledHandleScroll);\n    }, [ handleScroll ]);\n\n    useEffect(() => {\n        const timeoutId = setTimeout(() => {\n            setVisible(true);\n            setTimerWorked(true);\n        }, 30000);\n\n        return () => clearTimeout(timeoutId);\n    }, []);\n\n    return (\n        <div className={cn(null, { isVisible })}>\n            <div className={cn('left')}>\n                <div\n                    className={cn('close')}\n                    onClick={handleCloseOpenBtn}\n                    data-test='customer-feedback-close-btn'\n                >\n                    <Icon\n                        size='s'\n                        name='times'\n                    />\n                </div>\n                <Typography\n                    variant='secondary'\n                    color='primary-alt-bg'\n                    bold\n                >\n                    Отзыв о сайте\n                </Typography>\n            </div>\n            <Button\n                size='xs'\n                onClick={handleOpen}\n                variant='secondary-alt-bg'\n                dataTest='customer-feedback-open-btn'\n            >\n                Оценить\n            </Button>\n        </div>\n    );\n};\n","import React, { Ref } from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport type { ICustomerFeedbackOpenButton } from '../index';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackOpenButtonDefault');\n\nexport const OpenButtonDefault = React.forwardRef(({\n    isMobile,\n    isSticky,\n    handleCloseOpenBtn,\n    handleOpen\n}: Pick<ICustomerFeedbackOpenButton, 'isSticky' | 'handleCloseOpenBtn' | 'handleOpen'> & { isMobile: boolean }, ref: Ref<HTMLButtonElement>) => (\n    <button ref={ref} className={cn(null, { isMobile, isSticky })} onClick={handleOpen}>\n        <span className={cn('left-section', { isMobile })}>\n            <Icon name='m2-star' color='#FAC32D' size='m' />\n            <Typography\n                color='blue-500'\n                variant='primary'\n                bold={isMobile}\n            >\n                Оцените нас...\n            </Typography>\n        </span>\n        <span className={cn('close', { isMobile })} onClick={handleCloseOpenBtn}>\n            <Icon name='times' color='#B6B9C9' size='s' />\n        </span>\n    </button>\n));\n","import React, { Ref, useCallback, useEffect, useMemo, useRef } from 'react';\nimport throttle from 'lodash/throttle';\n\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { OpenButtonBlue } from '../../../../../desktop/components/CustomerFeedback/OpenButton/Blue';\nimport { OpenButtonBlueBanner } from '../../../../../mobile/components/CustomerFeedback/OpenButton/BlueBanner';\n\nimport { OpenButtonDefault } from './Default';\n\nconst BOTTOM_GAP = 16;\nconst SCROLL_HEIGHT = 20; // Примерная высота горизонтального скрола\n\nexport interface ICustomerFeedbackOpenButton {\n    handleOpen: () => void;\n    handleCloseOpenBtn: (e?: React.MouseEvent<Element, MouseEvent>) => void;\n    applicationId: ApplicationIdEnum;\n    isSticky?: boolean;\n}\n\nexport const CustomerFeedbackOpenButton = ({\n    handleOpen,\n    handleCloseOpenBtn,\n    isSticky = false,\n    applicationId\n}: ICustomerFeedbackOpenButton) => {\n    const ref = useRef<HTMLButtonElement | HTMLDivElement>(null);\n\n    const isMobile = useMemo(() => [\n        ApplicationIdEnum.NewBuildingsTouch,\n        ApplicationIdEnum.ClassifiedTouch\n    ].includes(applicationId), [ applicationId ]);\n\n    const handleScroll = useCallback(() => {\n        if (ref.current) {\n            const rect = ref.current.getBoundingClientRect();\n\n            // если стики кнопка достигла своего местоположения в разметке – скрыть\n            // сравниваем со SCROLL_HEIGHT, потому что если появится горизонтальный скролл,\n            // rect.bottom будет меньше и логика сломается\n            if (window.innerHeight - rect.bottom - BOTTOM_GAP > SCROLL_HEIGHT) {\n                ref.current.style.visibility = 'hidden';\n            } else {\n                ref.current.style.visibility = 'visible';\n            }\n        }\n    }, [ ref ]);\n\n    useEffect(() => {\n        if (! isMobile) {\n            const throttleHandleScroll = throttle(handleScroll, 100) as EventListener;\n\n            window.addEventListener('scroll', throttleHandleScroll);\n\n            return () => {\n                window.removeEventListener('scroll', throttleHandleScroll);\n            };\n        }\n\n        return;\n    }, [ isMobile, handleScroll ]);\n\n    switch (applicationId) {\n        case ApplicationIdEnum.NewBuildingsDesktop:\n            return (\n                <OpenButtonBlue\n                    handleOpen={handleOpen}\n                    handleCloseOpenBtn={handleCloseOpenBtn}\n                    ref={ref as Ref<HTMLDivElement>}\n                />\n            );\n\n        case ApplicationIdEnum.NewBuildingsTouch:\n            return (\n                <OpenButtonBlueBanner\n                    handleOpen={handleOpen}\n                    handleCloseOpenBtn={handleCloseOpenBtn}\n                />\n            );\n\n        case ApplicationIdEnum.ClassifiedDesktop:\n        case ApplicationIdEnum.ClassifiedTouch:\n        default:\n            return (\n                <OpenButtonDefault\n                    handleOpen={handleOpen}\n                    handleCloseOpenBtn={handleCloseOpenBtn}\n                    isMobile={isMobile}\n                    isSticky={isSticky}\n                    ref={ref as Ref<HTMLButtonElement>}\n                />\n            );\n    }\n};\n","import { graphql } from '@search/gql-client/src';\n\nconst customerFeedbackMutation = graphql`\n    mutation CustomerFeedbackMutation(\n        $rating: Int!,\n        $message: String!,\n        $applicationId: ApplicationIdEnum!,\n        $complexityOptions: [String!],\n        $contact: String,\n        $usability: CustomerFeedbackAnswer,\n        $infoFullness: CustomerFeedbackAnswer,\n        $extraFeatures: String,\n        $searchSuccess: String\n    ) {\n        sendCustomerFeedback(\n            rating: $rating,\n            message: $message,\n            applicationId: $applicationId,\n            complexityOptions: $complexityOptions,\n            contact: $contact,\n            usability: $usability,\n            infoFullness: $infoFullness,\n            extraFeatures: $extraFeatures,\n            searchSuccess: $searchSuccess\n        ) {\n            status\n        }\n    }\n`;\n\nexport default customerFeedbackMutation;\n","import { useCallback } from 'react';\n\nimport { useGqlContext } from '@search/gql-client/src';\n\nimport type {\n    CustomerFeedbackMutation$variables as CustomerFeedbackMutationVariables,\n    CustomerFeedbackMutation$data as CustomerFeedbackMutationResponse\n} from './__generated__/CustomerFeedbackMutation.graphql';\nimport customerFeedbackMutation from './CustomerFeedbackMutation';\n\nconst useSendCustomerFeedback = () => {\n    const gql = useGqlContext();\n\n    return useCallback(\n        (vars: CustomerFeedbackMutationVariables) => gql.client<\n            CustomerFeedbackMutationVariables,\n            CustomerFeedbackMutationResponse\n        >(customerFeedbackMutation, vars),\n        [ gql ]\n    );\n};\n\nexport default useSendCustomerFeedback;\n","import type { ExtraFeature, FeedbackOption, InfoFullnessDetail, UsabilityDetail } from './dict';\n\nexport interface IFeedbackFormState {\n    usability: {\n        value?: FeedbackOption;\n        details: Array<UsabilityDetail>;\n        customText: string;\n    };\n    infoFullness: {\n        value?: FeedbackOption;\n        details: Array<InfoFullnessDetail>;\n        customText: string;\n    };\n    extraFeatures: Array<ExtraFeature>;\n    searchSuccess?: FeedbackOption;\n    comment: string;\n    contact: string;\n}\n\nexport const initialFormState: IFeedbackFormState = {\n    usability: {\n        value: undefined,\n        details: [],\n        customText: ''\n    },\n    infoFullness: {\n        value: undefined,\n        details: [],\n        customText: ''\n    },\n    extraFeatures: [],\n    searchSuccess: undefined,\n    comment: '',\n    contact: ''\n};\n\nexport enum ACTIONS {\n    USABILITY_UPDATE,\n    USABILITY_DETAILS_UPDATE,\n    USABILITY_DETAILS_RESET,\n    USABILITY_CUSTOM_TEXT_UPDATE,\n    INFO_FULLNESS_UPDATE,\n    INFO_FULLNESS_DETAILS_UPDATE,\n    INFO_FULLNESS_DETAILS_RESET,\n    INFO_FULLNESS_CUSTOM_TEXT_UPDATE,\n    EXTRA_FEATURES_UPDATE,\n    EXTRA_FEATURES_RESET,\n    SEARCH_SUCCESS_UPDATE,\n    COMMENT_UPDATE,\n    CONTACT_UPDATE,\n    SET_INITIAL_FORM_DATA,\n}\n\nexport type Action =\n    | { type: ACTIONS.USABILITY_UPDATE; payload: FeedbackOption }\n    | { type: ACTIONS.USABILITY_DETAILS_UPDATE; payload: { value: UsabilityDetail; isCheck: boolean }}\n    | { type: ACTIONS.USABILITY_DETAILS_RESET }\n    | { type: ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE; payload: string}\n    | { type: ACTIONS.INFO_FULLNESS_UPDATE; payload: FeedbackOption }\n    | { type: ACTIONS.INFO_FULLNESS_DETAILS_UPDATE; payload: { value: InfoFullnessDetail; isCheck: boolean }}\n    | { type: ACTIONS.INFO_FULLNESS_DETAILS_RESET }\n    | { type: ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE; payload: string }\n    | { type: ACTIONS.EXTRA_FEATURES_UPDATE; payload: { value: ExtraFeature; isCheck: boolean } }\n    | { type: ACTIONS.EXTRA_FEATURES_RESET }\n    | { type: ACTIONS.SEARCH_SUCCESS_UPDATE; payload: FeedbackOption }\n    | { type: ACTIONS.COMMENT_UPDATE; payload: string }\n    | { type: ACTIONS.CONTACT_UPDATE; payload: string }\n    | { type: ACTIONS.SET_INITIAL_FORM_DATA }\n\nexport function reducer(state: IFeedbackFormState, action: Action): IFeedbackFormState {\n    switch (action.type) {\n        case ACTIONS.USABILITY_UPDATE:\n            return {\n                ...state,\n                usability: {\n                    ...initialFormState.usability,\n                    value: action.payload\n                }\n            };\n\n        case ACTIONS.USABILITY_DETAILS_UPDATE:\n            return {\n                ...state,\n                usability: {\n                    ...state.usability,\n                    details: action.payload.isCheck ?\n                        [ ...state.usability.details, action.payload.value ] :\n                        state.usability.details.filter(item => item !== action.payload.value)\n                }\n            };\n\n        case ACTIONS.USABILITY_DETAILS_RESET:\n            return {\n                ...state,\n                usability: {\n                    ...state.usability,\n                    details: initialFormState.usability.details\n                }\n            };\n\n        case ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE:\n            return {\n                ...state,\n                usability: {\n                    ...state.usability,\n                    customText: action.payload\n                }\n            };\n\n        case ACTIONS.INFO_FULLNESS_UPDATE:\n            return {\n                ...state,\n                infoFullness: {\n                    ...initialFormState.infoFullness,\n                    value: action.payload\n                }\n            };\n\n        case ACTIONS.INFO_FULLNESS_DETAILS_UPDATE:\n            return {\n                ...state,\n                infoFullness: {\n                    ...state.infoFullness,\n                    details: action.payload.isCheck ?\n                        [ ...state.infoFullness.details, action.payload.value ] :\n                        state.infoFullness.details.filter(item => item !== action.payload.value)\n                }\n            };\n\n        case ACTIONS.INFO_FULLNESS_DETAILS_RESET:\n            return {\n                ...state,\n                infoFullness: {\n                    ...state.infoFullness,\n                    details: initialFormState.infoFullness.details\n                }\n            };\n\n        case ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE:\n            return {\n                ...state,\n                infoFullness: {\n                    ...state.infoFullness,\n                    customText: action.payload\n                }\n            };\n\n        case ACTIONS.EXTRA_FEATURES_UPDATE:\n            return {\n                ...state,\n                extraFeatures: action.payload.isCheck ?\n                    [ ...state.extraFeatures, action.payload.value ] :\n                    state.extraFeatures.filter(item => item !== action.payload.value)\n            };\n\n        case ACTIONS.EXTRA_FEATURES_RESET:\n            return {\n                ...state,\n                extraFeatures: initialFormState.extraFeatures\n            };\n\n        case ACTIONS.SEARCH_SUCCESS_UPDATE:\n            return {\n                ...state,\n                searchSuccess: action.payload\n            };\n\n        case ACTIONS.COMMENT_UPDATE:\n            return {\n                ...state,\n                comment: action.payload\n            };\n\n        case ACTIONS.CONTACT_UPDATE:\n            return {\n                ...state,\n                contact: action.payload\n            };\n\n        case ACTIONS.SET_INITIAL_FORM_DATA:\n            return initialFormState;\n\n        default:\n            return state;\n    }\n}\n","export const QUESTION = {\n    usability: 'Вам было удобно пользоваться поиском недвижимости?',\n    infoFullness: 'Информация о жилых комплексах была полной?',\n    extraFeatures: 'Что могло бы помочь вам в выборе квартиры?',\n    searchSuccess: 'Вы нашли подходящие варианты квартир?',\n    comment: 'Расскажите подробнее о своём опыте',\n    contact: 'Если вы оставите контактные данные, мы поможем решить возникшие проблемы',\n};\n\nexport enum FeedbackOption {\n    YES = 'YES',\n    NO = 'NO'\n}\n\nexport const USABILITY_OPTIONS: Record<FeedbackOption, string> = {\n    [FeedbackOption.YES]: 'Да, всё хорошо',\n    [FeedbackOption.NO]: 'Нет, возникли сложности',\n};\n\nexport const INFO_FULLNESS_OPTIONS: Record<FeedbackOption, string> = {\n    [FeedbackOption.YES]: 'Да, данных достаточно',\n    [FeedbackOption.NO]: 'Хотелось бы увидеть больше',\n};\n\nexport const SEARCH_SUCCESS_OPTIONS: Record<FeedbackOption, string> = {\n    [FeedbackOption.YES]: 'Да, всё получилось',\n    [FeedbackOption.NO]: 'Пока в поиске',\n};\n\nexport enum UsabilityDetail {\n    LACK_FILTER = 'LACK_FILTER',\n    DIFFICULTLY = 'DIFFICULTLY',\n    FEW_OFFERS = 'FEW_OFFERS',\n    INACCURATE_SEARCH = 'INACCURATE_SEARCH',\n    SLOW_LOADING = 'SLOW_LOADING',\n    OTHER = 'OTHER'\n}\n\nexport enum InfoFullnessDetail {\n    STREET_PANORAMA = 'STREET_PANORAMA',\n    AREA_GENERAL_PLAN = 'AREA_GENERAL_PLAN',\n    PARKING_SCHEME = 'PARKING_SCHEME',\n    MORE_PHOTO = 'MORE_PHOTO',\n    PROJECT_BOOKLETS = 'PROJECT_BOOKLETS',\n    OTHER = 'OTHER'\n}\n\nexport enum ExtraFeature {\n    WINDOW_VIEW = 'WINDOW_VIEW',\n    FLOOR_PLAN = 'FLOOR_PLAN',\n    FINISHING_TYPE = 'FINISHING_TYPE',\n    REPAIR_COST = 'REPAIR_COST',\n    VIRTUAL_TOURS = 'VIRTUAL_TOURS',\n    FURNITURE_PLAN = 'FURNITURE_PLAN'\n}\n\nexport const USABILITY_DETAILS_OPTIONS: Record<UsabilityDetail, string> = {\n    [UsabilityDetail.LACK_FILTER]: 'Нет нужных фильтров',\n    [UsabilityDetail.DIFFICULTLY]: 'Сложно разобраться',\n    [UsabilityDetail.FEW_OFFERS]: 'Мало предложений',\n    [UsabilityDetail.INACCURATE_SEARCH]: 'Неточные результаты поиска',\n    [UsabilityDetail.SLOW_LOADING]: 'Медленная загрузка',\n    [UsabilityDetail.OTHER]: 'Другое'\n};\n\nexport const INFO_FULLNESS_DETAILS_OPTIONS: Record<InfoFullnessDetail, string> = {\n    [InfoFullnessDetail.STREET_PANORAMA]: 'Панораму улицы',\n    [InfoFullnessDetail.AREA_GENERAL_PLAN]: 'Генплан района',\n    [InfoFullnessDetail.PARKING_SCHEME]: 'Схему паркинга',\n    [InfoFullnessDetail.MORE_PHOTO]: 'Больше фотографий и видео',\n    [InfoFullnessDetail.PROJECT_BOOKLETS]: 'Буклеты о проектах',\n    [InfoFullnessDetail.OTHER]: 'Другое'\n};\n\nexport const EXTRA_FEATURES_OPTIONS: Record<ExtraFeature, string> = {\n    [ExtraFeature.WINDOW_VIEW]: 'Вид из окна',\n    [ExtraFeature.FLOOR_PLAN]: 'Поэтажный план',\n    [ExtraFeature.FINISHING_TYPE]: 'Варианты отделки',\n    [ExtraFeature.REPAIR_COST]: 'Стоимость ремонта',\n    [ExtraFeature.VIRTUAL_TOURS]: 'Виртуальные туры',\n    [ExtraFeature.FURNITURE_PLAN]: 'План с мебелью'\n};\n\nexport const ERROR_MESSAGE = 'Что-то пошло не так, попробуйте позже.';\n","import type { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport type { CustomerFeedbackMutation$variables } from '../../../__generated__/CustomerFeedbackMutation.graphql';\n\nimport {\n    EXTRA_FEATURES_OPTIONS,\n    FeedbackOption,\n    INFO_FULLNESS_DETAILS_OPTIONS,\n    INFO_FULLNESS_OPTIONS,\n    InfoFullnessDetail,\n    SEARCH_SUCCESS_OPTIONS,\n    USABILITY_DETAILS_OPTIONS,\n    USABILITY_OPTIONS,\n    UsabilityDetail\n} from './dict';\nimport type { IFeedbackFormState } from './state';\n\nexport const buildCustomerFeedbackVars = (\n    params: IFeedbackFormState,\n    applicationId: ApplicationIdEnum\n): CustomerFeedbackMutation$variables => {\n    const usabilityText = ! params.usability.value ? '' : (\n        params.usability.value === FeedbackOption.YES ? USABILITY_OPTIONS[FeedbackOption.YES] : `${\n            USABILITY_OPTIONS[FeedbackOption.NO]\n        }${\n            params.usability.details.length ? `: ${\n                params.usability.details\n                    .filter(item => item !== UsabilityDetail.OTHER)\n                    .map(item => USABILITY_DETAILS_OPTIONS[item])\n                    .join(', ')\n            }` : ''\n        }${\n            params.usability.details.includes(UsabilityDetail.OTHER) ? `${\n                params.usability.details.length > 1 ? ', ' : ''\n            }${\n                USABILITY_DETAILS_OPTIONS[UsabilityDetail.OTHER]\n            }${\n                params.usability.customText ? `: ${params.usability.customText}` : ''\n            }` : ''\n        }`\n    );\n\n    const infoFullnessText = ! params.infoFullness.value ? '' : (\n        params.infoFullness.value === FeedbackOption.YES ? INFO_FULLNESS_OPTIONS[FeedbackOption.YES] : `${\n            INFO_FULLNESS_OPTIONS[FeedbackOption.NO]\n        }${\n            params.infoFullness.details.length ? `: ${\n                params.infoFullness.details\n                    .filter(item => item !== InfoFullnessDetail.OTHER)\n                    .map(item => INFO_FULLNESS_DETAILS_OPTIONS[item])\n                    .join(', ')\n            }` : ''\n        }${\n            params.infoFullness.details.includes(InfoFullnessDetail.OTHER) ? `${\n                params.infoFullness.details.length > 1 ? ', ' : ''\n            }${\n                INFO_FULLNESS_DETAILS_OPTIONS[InfoFullnessDetail.OTHER]\n            }${\n                params.infoFullness.customText ? `: ${params.infoFullness.customText}` : ''\n            }` : ''\n        }`\n    );\n\n    const extraFeatures = params.extraFeatures\n        .map(item => EXTRA_FEATURES_OPTIONS[item])\n        .join(', ');\n\n    const searchSuccess = params.searchSuccess ? SEARCH_SUCCESS_OPTIONS[params.searchSuccess] : '';\n\n    return {\n        rating: 0,\n        applicationId,\n        usability: {\n            value: params.usability.value && params.usability.value === FeedbackOption.YES,\n            text: usabilityText\n        },\n        infoFullness: {\n            value: params.infoFullness.value && params.infoFullness.value === FeedbackOption.YES,\n            text: infoFullnessText\n        },\n        extraFeatures,\n        searchSuccess,\n        message: params.comment,\n        contact: params.contact\n    };\n};\n","import React, { useCallback, useEffect, useReducer, useState } from 'react';\n\nimport { Checkbox, Modal, Input, Button, Typography } from '@vtblife/uikit';\nimport { Textarea } from '@vtblife/uikit/legacy';\n\nimport { STATUS } from '@search/gql-client/src';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport classname from '@search/classname/src';\n\nimport useSendCustomerFeedback from '../../../../../common/components/CustomerFeedback/useSendCustomerFeedback';\nimport type { CustomerFeedbackModalType } from '../../../../../common/components/CustomerFeedback/components/Modal';\nimport { Action, ACTIONS, IFeedbackFormState, initialFormState, reducer } from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/state';\nimport {\n    ERROR_MESSAGE,\n    EXTRA_FEATURES_OPTIONS,\n    ExtraFeature,\n    FeedbackOption,\n    INFO_FULLNESS_DETAILS_OPTIONS,\n    INFO_FULLNESS_OPTIONS,\n    InfoFullnessDetail,\n    QUESTION,\n    SEARCH_SUCCESS_OPTIONS,\n    USABILITY_DETAILS_OPTIONS,\n    USABILITY_OPTIONS,\n    UsabilityDetail\n} from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/dict';\nimport { buildCustomerFeedbackVars } from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/buildCustomerFeedbackVars';\nimport FeedbackSuccessIcon from '../../../../../common/components/CustomerFeedback/components/Modal/successImage.url.svg';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackModalNewBuildingsDesktop');\n\ntype ICustomerFeedbackModalNewBuildings = Pick<\n    CustomerFeedbackModalType,\n    'modalIsOpen' | 'handleCloseModal' | 'handleFinishedFeedback' | 'applicationId' | 'disableFeedbackReappearance'\n>\n\nexport const CustomerFeedbackModalNewBuildings = ({\n    modalIsOpen,\n    handleCloseModal: handleCloseModalExternal,\n    handleFinishedFeedback,\n    disableFeedbackReappearance,\n    applicationId = ApplicationIdEnum.NewBuildingsDesktop,\n}: ICustomerFeedbackModalNewBuildings) => {\n    const [ state, dispatch ] = useReducer(reducer, initialFormState);\n    const [ requestStatus, setRequestStatus ] = useState<STATUS>(STATUS.INIT);\n\n    const handleCloseModal = useCallback(() => {\n        dispatch({ type: ACTIONS.SET_INITIAL_FORM_DATA });\n        setRequestStatus(STATUS.INIT);\n\n        if (requestStatus === STATUS.RESOLVE) {\n            handleFinishedFeedback();\n            disableFeedbackReappearance();\n\n            return;\n        }\n\n        handleCloseModalExternal();\n    }, [ requestStatus, handleFinishedFeedback, handleCloseModalExternal, disableFeedbackReappearance ]);\n\n    const sendCustomerFeedback = useSendCustomerFeedback();\n\n    const handleSendCustomerFeedback = useCallback(() => {\n        const vars = buildCustomerFeedbackVars(state, applicationId);\n\n        setRequestStatus(STATUS.PENDING);\n\n        sendCustomerFeedback(vars)\n            .then(() => {\n                setRequestStatus(STATUS.RESOLVE);\n            })\n            .catch(() => {\n                setRequestStatus(STATUS.ERROR);\n            });\n    }, [ state, applicationId ]);\n\n    useEffect(() => {\n        if (requestStatus === STATUS.ERROR) {\n            // eslint-disable-next-line no-alert\n            window.alert(ERROR_MESSAGE);\n        }\n    }, [ requestStatus ]);\n\n    return (\n        <Modal\n            overflow={false}\n            swipeToClose={false}\n            opened={modalIsOpen}\n            onClose={handleCloseModal}\n        >\n            {\n                requestStatus === STATUS.RESOLVE ? (\n                    <SuccessModalContent handleCloseModal={handleCloseModal} />\n                ) : (\n                    <>\n                        <Modal.Title>Оцените удобство сервиса m2.ru</Modal.Title>\n                        <PrimaryModalContent\n                            state={state}\n                            dispatch={dispatch}\n                            isLoading={requestStatus === STATUS.PENDING}\n                            handleSendCustomerFeedback={handleSendCustomerFeedback}\n                        />\n                    </>\n                )\n            }\n        </Modal>\n    );\n};\n\nconst PrimaryModalContent = ({\n    state,\n    dispatch,\n    isLoading,\n    handleSendCustomerFeedback\n}: {\n    state: IFeedbackFormState;\n    dispatch: React.Dispatch<Action>;\n    handleSendCustomerFeedback: () => void;\n    isLoading?: boolean;\n}) => {\n    return (\n        <div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.usability}\n            </Typography>\n            <div className={cn('basic')}>\n                {Object.entries(USABILITY_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('basicOption')}\n                    >\n                        <Checkbox\n                            radio\n                            value={state.usability.value === key}\n                            onChange={() => dispatch({\n                                type: ACTIONS.USABILITY_UPDATE,\n                                payload: key as FeedbackOption\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            {\n                state.usability.value === FeedbackOption.NO && (\n                    <div className={cn('details')}>\n                        {Object.entries(USABILITY_DETAILS_OPTIONS).map(([ key, value ]) => (\n                            <div\n                                key={key}\n                                className={cn('detailsOption')}\n                            >\n                                <Checkbox\n                                    variant='filter'\n                                    value={state.usability.details.includes(key as UsabilityDetail)}\n                                    onChange={isCheck => dispatch({\n                                        type: ACTIONS.USABILITY_DETAILS_UPDATE,\n                                        payload: { isCheck, value: key as UsabilityDetail }\n                                    })}\n                                >\n                                    {value}\n                                </Checkbox>\n                            </div>\n                        ))}\n                    </div>\n                )\n            }\n            {\n                state.usability.details.includes(UsabilityDetail.OTHER) && (\n                    <div className={cn('other')}>\n                        <Input\n                            value={state.usability.customText}\n                            placeholder='Ваш вариант'\n                            onChange={value => dispatch({\n                                type: ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE,\n                                payload: value\n                            })}\n                        />\n                    </div>\n                )\n            }\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.infoFullness}\n            </Typography>\n            <div className={cn('basic')}>\n                {Object.entries(INFO_FULLNESS_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('basicOption')}\n                    >\n                        <Checkbox\n                            radio\n                            value={state.infoFullness.value === key}\n                            onChange={() => dispatch({\n                                type: ACTIONS.INFO_FULLNESS_UPDATE,\n                                payload: key as FeedbackOption\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            {\n                state.infoFullness.value === FeedbackOption.NO && (\n                    <div className={cn('details')}>\n                        {Object.entries(INFO_FULLNESS_DETAILS_OPTIONS).map(([ key, value ]) => (\n                            <div\n                                key={key}\n                                className={cn('detailsOption')}\n                            >\n                                <Checkbox\n                                    variant='filter'\n                                    value={state.infoFullness.details.includes(key as InfoFullnessDetail)}\n                                    onChange={isCheck => dispatch({\n                                        type: ACTIONS.INFO_FULLNESS_DETAILS_UPDATE,\n                                        payload: { isCheck, value: key as InfoFullnessDetail }\n                                    })}\n                                >\n                                    {value}\n                                </Checkbox>\n                            </div>\n                        ))}\n                    </div>\n                )\n            }\n            {\n                state.infoFullness.details.includes(InfoFullnessDetail.OTHER) && (\n                    <div className={cn('other')}>\n                        <Input\n                            value={state.infoFullness.customText}\n                            placeholder='Ваш вариант'\n                            onChange={value => dispatch({\n                                type: ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE,\n                                payload: value\n                            })}\n                        />\n                    </div>\n                )\n            }\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.extraFeatures}\n            </Typography>\n            <div className={cn('details')}>\n                {Object.entries(EXTRA_FEATURES_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('detailsOption')}\n                    >\n                        <Checkbox\n                            variant='filter'\n                            value={state.extraFeatures.includes(key as ExtraFeature)}\n                            onChange={isCheck => dispatch({\n                                type: ACTIONS.EXTRA_FEATURES_UPDATE,\n                                payload: { isCheck, value: key as ExtraFeature }\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.searchSuccess}\n            </Typography>\n            <div className={cn('basic')}>\n                {Object.entries(SEARCH_SUCCESS_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('basicOption')}\n                    >\n                        <Checkbox\n                            radio\n                            value={state.searchSuccess === key}\n                            onChange={() => dispatch({\n                                type: ACTIONS.SEARCH_SUCCESS_UPDATE,\n                                payload: key as FeedbackOption\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.comment}\n            </Typography>\n            <div className={cn('comment')}>\n                <Textarea\n                    rows={3}\n                    fullWidth\n                    value={state.comment}\n                    placeholder='Если у вас есть предложения по улучшению сервиса, или возникла проблема — расскажите нам'\n                    onChange={value => dispatch({\n                        type: ACTIONS.COMMENT_UPDATE,\n                        payload: value\n                    })}\n                />\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.contact}\n            </Typography>\n            <div className={cn('contacts')}>\n                <Input\n                    size='m'\n                    value={state.contact}\n                    placeholder='Телефон или email'\n                    onChange={value => dispatch({\n                        type: ACTIONS.CONTACT_UPDATE,\n                        payload: value\n                    })}\n                />\n            </div>\n            <Modal.StickyActions>\n                <Button\n                    fullWidth\n                    loading={isLoading}\n                    disabled={isLoading}\n                    onClick={handleSendCustomerFeedback}\n                >\n                    Отправить отзыв\n                </Button>\n            </Modal.StickyActions>\n        </div>\n    );\n};\n\nconst SuccessModalContent = ({ handleCloseModal }: { handleCloseModal: () => void }) => {\n    const staticPath = useStaticPathConfig();\n\n    return (\n        <div className={cn('success')}>\n            <img\n                crossOrigin='anonymous'\n                alt='Спасибо за оценку!'\n                width={208}\n                height={156}\n                src={`${staticPath}${FeedbackSuccessIcon}`}\n            />\n            <Typography\n                bold\n                variant='h3'\n                className={cn('success-feedback-sent')}\n            >\n                Отзыв отправлен!\n            </Typography>\n            <Typography\n                variant='primary'\n                className={cn('success-thanks-text')}\n            >\n                Спасибо, что помогаете нам становиться лучше\n            </Typography>\n            <Modal.Actions>\n                <Button\n                    fullWidth\n                    size='l'\n                    variant='secondary'\n                    onClick={handleCloseModal}\n                >\n                    Закрыть\n                </Button>\n            </Modal.Actions>\n        </div>\n    );\n};\n","export default \"34a62ecb2f45490ad2feaf6c8999f70a.svg\";","import React, { useCallback, useEffect, useReducer, useState, useMemo } from 'react';\n\nimport { Checkbox, Modal, Select, Input, Button, Typography } from '@vtblife/uikit';\nimport { Textarea } from '@vtblife/uikit/legacy';\n\nimport { STATUS } from '@search/gql-client/src';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\nimport classname from '@search/classname/src';\n\nimport type { CustomerFeedbackModalType } from '../../../../../common/components/CustomerFeedback/components/Modal';\nimport useSendCustomerFeedback from '../../../../../common/components/CustomerFeedback/useSendCustomerFeedback';\nimport {\n    Action,\n    ACTIONS,\n    IFeedbackFormState,\n    initialFormState,\n    reducer\n} from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/state';\nimport {\n    ERROR_MESSAGE,\n    EXTRA_FEATURES_OPTIONS,\n    ExtraFeature,\n    FeedbackOption,\n    INFO_FULLNESS_DETAILS_OPTIONS,\n    INFO_FULLNESS_OPTIONS,\n    InfoFullnessDetail,\n    QUESTION,\n    SEARCH_SUCCESS_OPTIONS,\n    USABILITY_DETAILS_OPTIONS,\n    USABILITY_OPTIONS,\n    UsabilityDetail\n} from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/dict';\nimport { buildCustomerFeedbackVars } from '../../../../../common/components/CustomerFeedback/components/Modal/NewBuildings/buildCustomerFeedbackVars';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackModalNewBuildingsMobile');\n\ntype ICustomerFeedbackModalNewBuildings = Pick<\n    CustomerFeedbackModalType,\n    'modalIsOpen' | 'handleCloseModal' | 'handleFinishedFeedback' | 'applicationId' | 'disableFeedbackReappearance'\n>\n\nexport const CustomerFeedbackModalNewBuildings = ({\n    modalIsOpen,\n    handleCloseModal: handleCloseModalExternal,\n    handleFinishedFeedback,\n    disableFeedbackReappearance,\n    applicationId = ApplicationIdEnum.NewBuildingsTouch,\n}: ICustomerFeedbackModalNewBuildings) => {\n    const [ state, dispatch ] = useReducer(reducer, initialFormState);\n    const [ requestStatus, setRequestStatus ] = useState<STATUS>(STATUS.INIT);\n\n    const [ isUsabilityDetailsModalOpen, setUsabilityDetailsModalOpen ] = useState<boolean>(false);\n    const [ isInfoFullnessModalOpen, setInfoFullnessModalOpen ] = useState<boolean>(false);\n    const [ isExtraFeaturesModalOpen, setExtraFeaturesModalOpen ] = useState<boolean>(false);\n\n    const handleCloseModal = useCallback(() => {\n        dispatch({ type: ACTIONS.SET_INITIAL_FORM_DATA });\n        setRequestStatus(STATUS.INIT);\n\n        if (requestStatus === STATUS.RESOLVE) {\n            handleFinishedFeedback();\n            disableFeedbackReappearance();\n\n            return;\n        }\n\n        handleCloseModalExternal();\n    }, [ requestStatus, handleFinishedFeedback, handleCloseModalExternal, disableFeedbackReappearance ]);\n\n    const handleOpenUsabilityDetailsModal = useCallback(() => setUsabilityDetailsModalOpen(true), []);\n    const handleCloseUsabilityDetailsModal = useCallback(() => setUsabilityDetailsModalOpen(false), []);\n\n    const handleOpenInfoFullnessModal = useCallback(() => setInfoFullnessModalOpen(true), []);\n    const handleCloseInfoFullnessModal = useCallback(() => setInfoFullnessModalOpen(false), []);\n\n    const handleOpenExtraFeaturesModal = useCallback(() => setExtraFeaturesModalOpen(true), []);\n    const handleCloseExtraFeaturesModal = useCallback(() => setExtraFeaturesModalOpen(false), []);\n\n    const sendCustomerFeedback = useSendCustomerFeedback();\n\n    const handleSendCustomerFeedback = useCallback(() => {\n        const vars = buildCustomerFeedbackVars(state, applicationId);\n\n        setRequestStatus(STATUS.PENDING);\n\n        sendCustomerFeedback(vars)\n            .then(() => {\n                setRequestStatus(STATUS.RESOLVE);\n            })\n            .catch(() => {\n                setRequestStatus(STATUS.ERROR);\n            });\n    }, [ state, applicationId ]);\n\n    useEffect(() => {\n        if (requestStatus === STATUS.ERROR) {\n            // eslint-disable-next-line no-alert\n            window.alert(ERROR_MESSAGE);\n        }\n    }, [ requestStatus ]);\n\n    return (\n        <>\n            <Modal\n                overflow={false}\n                swipeToClose={false}\n                opened={modalIsOpen}\n                onClose={handleCloseModal}\n                mobile\n            >\n                <Modal.Header>Оцените удобство сервиса</Modal.Header>\n                {\n                    requestStatus === STATUS.RESOLVE ? (\n                        <SuccessModalContent handleCloseModal={handleCloseModal} />\n                    ) : (\n                        <PrimaryModalContent\n                            state={state}\n                            dispatch={dispatch}\n                            isLoading={requestStatus === STATUS.PENDING}\n                            handleOpenUsabilityDetailsModal={handleOpenUsabilityDetailsModal}\n                            handleOpenInfoFullnessModal={handleOpenInfoFullnessModal}\n                            handleOpenExtraFeaturesModal={handleOpenExtraFeaturesModal}\n                            handleSendCustomerFeedback={handleSendCustomerFeedback}\n                        />\n                    )\n                }\n            </Modal>\n            <UsabilityDetailsModal\n                state={state}\n                dispatch={dispatch}\n                isOpen={isUsabilityDetailsModalOpen}\n                handleClose={handleCloseUsabilityDetailsModal}\n            />\n            <InfoFullnessModal\n                state={state}\n                dispatch={dispatch}\n                isOpen={isInfoFullnessModalOpen}\n                handleClose={handleCloseInfoFullnessModal}\n            />\n            <ExtraFeaturesModal\n                state={state}\n                dispatch={dispatch}\n                isOpen={isExtraFeaturesModalOpen}\n                handleClose={handleCloseExtraFeaturesModal}\n            />\n        </>\n    );\n};\n\nconst PrimaryModalContent = ({\n    state,\n    dispatch,\n    isLoading,\n    handleOpenUsabilityDetailsModal,\n    handleOpenInfoFullnessModal,\n    handleOpenExtraFeaturesModal,\n    handleSendCustomerFeedback\n}: {\n    state: IFeedbackFormState;\n    dispatch: React.Dispatch<Action>;\n    handleSendCustomerFeedback: () => void;\n    handleOpenUsabilityDetailsModal: () => void;\n    handleOpenInfoFullnessModal: () => void;\n    handleOpenExtraFeaturesModal: () => void;\n    isLoading?: boolean;\n}) => {\n    const extraFeaturesSelectedText = useMemo(() => Object.entries(EXTRA_FEATURES_OPTIONS)\n        .filter(([ key ]) => state.extraFeatures.includes(key as ExtraFeature))\n        .map(([ , value ]) => value)\n        .join(', '), [ state.extraFeatures ]);\n\n    return (\n        <Modal.Content scrollable>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.usability}\n            </Typography>\n            <div className={cn('basic')}>\n                {Object.entries(USABILITY_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('basicOption')}\n                    >\n                        <Checkbox\n                            radio\n                            value={state.usability.value === key}\n                            onChange={() => {\n                                dispatch({\n                                    type: ACTIONS.USABILITY_UPDATE,\n                                    payload: key as FeedbackOption\n                                });\n\n                                key === FeedbackOption.NO && handleOpenUsabilityDetailsModal();\n                            }}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.infoFullness}\n            </Typography>\n            <div className={cn('basic')}>\n                {Object.entries(INFO_FULLNESS_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('basicOption')}\n                    >\n                        <Checkbox\n                            radio\n                            value={state.infoFullness.value === key}\n                            onChange={() => {\n                                dispatch({\n                                    type: ACTIONS.INFO_FULLNESS_UPDATE,\n                                    payload: key as FeedbackOption\n                                });\n\n                                key === FeedbackOption.NO && handleOpenInfoFullnessModal();\n                            }}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.extraFeatures}\n            </Typography>\n            <div className={cn('details')}>\n                <Select mode='multiple'>\n                    <Select.Button onClick={handleOpenExtraFeaturesModal}>\n                        {extraFeaturesSelectedText || 'Выберите варианты ответа'}\n                    </Select.Button>\n                </Select>\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.searchSuccess}\n            </Typography>\n            <div className={cn('basic')}>\n                {Object.entries(SEARCH_SUCCESS_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('basicOption')}\n                    >\n                        <Checkbox\n                            radio\n                            value={state.searchSuccess === key}\n                            onChange={() => dispatch({\n                                type: ACTIONS.SEARCH_SUCCESS_UPDATE,\n                                payload: key as FeedbackOption\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.comment}\n            </Typography>\n            <div className={cn('comment')}>\n                <Textarea\n                    rows={3}\n                    fullWidth\n                    value={state.comment}\n                    placeholder='Если у вас есть предложения по улучшению сервиса, или возникла проблема — расскажите нам'\n                    onChange={value => dispatch({\n                        type: ACTIONS.COMMENT_UPDATE,\n                        payload: value\n                    })}\n                />\n            </div>\n            <Typography\n                bold\n                variant='primary-alone'\n                className={cn('question')}\n            >\n                {QUESTION.contact}\n            </Typography>\n            <div className={cn('contacts')}>\n                <Input\n                    size='m'\n                    value={state.contact}\n                    placeholder='Телефон или email'\n                    onChange={value => dispatch({\n                        type: ACTIONS.CONTACT_UPDATE,\n                        payload: value\n                    })}\n                />\n            </div>\n            <Modal.StickyActions>\n                <Button\n                    fullWidth\n                    loading={isLoading}\n                    disabled={isLoading}\n                    onClick={handleSendCustomerFeedback}\n                >\n                    Отправить отзыв\n                </Button>\n            </Modal.StickyActions>\n        </Modal.Content>\n    );\n};\n\nconst SuccessModalContent = ({ handleCloseModal }: { handleCloseModal: () => void }) => {\n    return (\n        <div className={cn('success')}>\n            <Typography\n                bold\n                variant='h3'\n                className={cn('success-feedback-sent')}\n            >\n                Отзыв отправлен!\n            </Typography>\n            <Typography\n                variant='primary'\n                className={cn('success-thanks-text')}\n            >\n                Спасибо, что помогаете нам становиться лучше\n            </Typography>\n            <div className={cn('button')}>\n                <Button\n                    fullWidth\n                    variant='secondary'\n                    onClick={handleCloseModal}\n                >\n                    Закрыть\n                </Button>\n            </div>\n        </div>\n    );\n};\n\nconst UsabilityDetailsModal = ({\n    state,\n    dispatch,\n    isOpen,\n    handleClose\n}: {\n    state: IFeedbackFormState;\n    dispatch: React.Dispatch<Action>;\n    isOpen: boolean;\n    handleClose: () => void;\n}) => (\n    <Modal\n        overflow={false}\n        swipeToClose={false}\n        opened={isOpen}\n        onClose={() => {\n            dispatch({ type: ACTIONS.USABILITY_DETAILS_RESET });\n            handleClose();\n        }}\n        mobile\n    >\n        <Modal.Header>Удобство поиска</Modal.Header>\n        <div className={cn('content')}>\n            <div className={cn('details')}>\n                {Object.entries(USABILITY_DETAILS_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('detailsOption')}\n                    >\n                        <Checkbox\n                            value={state.usability.details.includes(key as UsabilityDetail)}\n                            onChange={isCheck => dispatch({\n                                type: ACTIONS.USABILITY_DETAILS_UPDATE,\n                                payload: { isCheck, value: key as UsabilityDetail }\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            {\n                state.usability.details.includes(UsabilityDetail.OTHER) && (\n                    <div className={cn('other')}>\n                        <Input\n                            value={state.usability.customText}\n                            placeholder='Ваш вариант'\n                            onChange={value => dispatch({\n                                type: ACTIONS.USABILITY_CUSTOM_TEXT_UPDATE,\n                                payload: value\n                            })}\n                        />\n                    </div>\n                )\n            }\n        </div>\n        <div className={cn('button')}>\n            <Button\n                fullWidth\n                onClick={handleClose}\n            >\n                Подтвердить\n            </Button>\n        </div>\n    </Modal>\n);\n\nconst InfoFullnessModal = ({\n    state,\n    dispatch,\n    isOpen,\n    handleClose\n}: {\n    state: IFeedbackFormState;\n    dispatch: React.Dispatch<Action>;\n    isOpen: boolean;\n    handleClose: () => void;\n}) => (\n    <Modal\n        overflow={false}\n        swipeToClose={false}\n        opened={isOpen}\n        onClose={() => {\n            dispatch({ type: ACTIONS.INFO_FULLNESS_DETAILS_RESET });\n            handleClose();\n        }}\n        mobile\n    >\n        <Modal.Header>Информация о ЖК</Modal.Header>\n        <div className={cn('content')}>\n            <Typography\n                color='secondary'\n                variant='secondary-alone'\n            >\n                Хотелось бы увидеть:\n            </Typography>\n            <div className={cn('details')}>\n                {Object.entries(INFO_FULLNESS_DETAILS_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('detailsOption')}\n                    >\n                        <Checkbox\n                            value={state.infoFullness.details.includes(key as InfoFullnessDetail)}\n                            onChange={isCheck => dispatch({\n                                type: ACTIONS.INFO_FULLNESS_DETAILS_UPDATE,\n                                payload: { isCheck, value: key as InfoFullnessDetail }\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n            {\n                state.infoFullness.details.includes(InfoFullnessDetail.OTHER) && (\n                    <div className={cn('other')}>\n                        <Input\n                            value={state.infoFullness.customText}\n                            placeholder='Ваш вариант'\n                            onChange={value => dispatch({\n                                type: ACTIONS.INFO_FULLNESS_CUSTOM_TEXT_UPDATE,\n                                payload: value\n                            })}\n                        />\n                    </div>\n                )\n            }\n        </div>\n        <div className={cn('button')}>\n            <Button\n                fullWidth\n                onClick={handleClose}\n            >\n                Подтвердить\n            </Button>\n        </div>\n    </Modal>\n);\n\nconst ExtraFeaturesModal = ({\n    state,\n    dispatch,\n    isOpen,\n    handleClose\n}: {\n    state: IFeedbackFormState;\n    dispatch: React.Dispatch<Action>;\n    isOpen: boolean;\n    handleClose: () => void;\n}) => (\n    <Modal\n        overflow={false}\n        swipeToClose={false}\n        opened={isOpen}\n        onClose={() => {\n            dispatch({ type: ACTIONS.EXTRA_FEATURES_RESET });\n            handleClose();\n        }}\n        mobile\n    >\n        <Modal.Header>Информация о квартирах</Modal.Header>\n        <div className={cn('content')}>\n            <Typography\n                color='secondary'\n                variant='secondary-alone'\n            >\n                Хотелось бы увидеть:\n            </Typography>\n            <div className={cn('details')}>\n                {Object.entries(EXTRA_FEATURES_OPTIONS).map(([ key, value ]) => (\n                    <div\n                        key={key}\n                        className={cn('detailsOption')}\n                    >\n                        <Checkbox\n                            value={state.extraFeatures.includes(key as ExtraFeature)}\n                            onChange={isCheck => dispatch({\n                                type: ACTIONS.EXTRA_FEATURES_UPDATE,\n                                payload: { isCheck, value: key as ExtraFeature }\n                            })}\n                        >\n                            {value}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n        </div>\n        <div className={cn('button')}>\n            <Button\n                fullWidth\n                onClick={handleClose}\n            >\n                Подтвердить\n            </Button>\n        </div>\n    </Modal>\n);\n","import React, { useCallback, useEffect, useState } from 'react';\nimport { useCookies } from 'react-cookie';\nimport { Modal } from '@vtblife/uikit';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport classname from '@search/classname/src';\n\nimport './CustomerFeedbackAnketologModal.css';\n\nconst cn = classname.bind(null, 'CustomerFeedbackAnketologModal');\n\ntype Survey = {\n    link: string;\n}\n\nfunction buildSurveyLink({\n    userIdQuery,\n    yMetricaId\n}: {\n    userIdQuery: string;\n    yMetricaId: string;\n}) {\n    return `https://anketolog.ru/s/640716/GWwkMkKd?${userIdQuery}${yMetricaId}`;\n}\n\nexport const CustomerFeedbackAnketologModal = ({\n    modalIsOpen,\n    handleCloseModal,\n    disableFeedbackReappearance,\n}: {\n    modalIsOpen: boolean;\n    handleCloseModal: () => void;\n    disableFeedbackReappearance: () => void;\n}) => {\n    const { auth } = useM2AuthContext();\n    const userIdQuery = auth.user?.userId ? `ap_user_id=${auth.user.userId}&` : '';\n    const [ cookies ] = useCookies([ '_ym_uid' ]);\n    // eslint-disable-next-line dot-notation\n    const yMetricaId = cookies['_ym_uid'] ? `ap_yMetrica=${cookies['_ym_uid']}&` : '';\n\n    const [ survey, setSurvey ] = useState<Survey>({\n        link: buildSurveyLink({ userIdQuery, yMetricaId })\n    });\n\n    const handleClose = useCallback(() => {\n        disableFeedbackReappearance();\n        handleCloseModal();\n    }, [ disableFeedbackReappearance, handleCloseModal ]);\n\n    useEffect(() => {\n        setSurvey(survey => ({\n            ...survey,\n            // https://help.anketolog.ru/p/dopolnitelnye-parametry - как передавать пользовательские данные в опрос\n            link: buildSurveyLink({ userIdQuery, yMetricaId }),\n        }));\n    }, [ userIdQuery, yMetricaId ]);\n\n    return (\n        <Modal opened={modalIsOpen} size='l' onClose={handleClose} dataTest='feedback-survey'>\n            <iframe className={cn('iframe')} name='survey' src={survey.link} data-scroll-lock-ignore />\n        </Modal>\n    );\n};\n","import React from 'react';\n\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { CustomerFeedbackModalNewBuildings as CustomerFeedbackModalNewBuildingsDesktop } from '../../../../../desktop/components/CustomerFeedback/Modal/NewBuildings';\nimport { CustomerFeedbackModalNewBuildings as CustomerFeedbackModalNewBuildingsMobile } from '../../../../../mobile/components/CustomerFeedback/Modal/NewBuildings';\nimport { useCustomerFeedbackExternalState } from '../../useCustomerFeedbackExternalState';\n\nimport { CustomerFeedbackAnketologModal } from '../CustomerFeedbackAnketologModal/CustomerFeedbackAnketologModal';\n\nexport type CustomerFeedbackModalType = Omit<ReturnType<typeof useCustomerFeedbackExternalState>, 'openBtnIsVisible' | 'handleOpenModal' | 'handleCloseOpenBtn'> & {\n    applicationId?: ApplicationIdEnum;\n}\n\nexport const CustomerFeedbackModal = ({\n    modalIsOpen,\n    handleCloseModal,\n    disableFeedbackReappearance,\n    handleFinishedFeedback,\n    applicationId\n}: CustomerFeedbackModalType) => {\n    switch (applicationId) {\n        case ApplicationIdEnum.NewBuildingsDesktop:\n            return (\n                <CustomerFeedbackModalNewBuildingsDesktop\n                    modalIsOpen={modalIsOpen}\n                    handleCloseModal={handleCloseModal}\n                    applicationId={applicationId}\n                    handleFinishedFeedback={handleFinishedFeedback}\n                    disableFeedbackReappearance={disableFeedbackReappearance}\n                />\n            );\n\n        case ApplicationIdEnum.NewBuildingsTouch:\n            return (\n                <CustomerFeedbackModalNewBuildingsMobile\n                    modalIsOpen={modalIsOpen}\n                    handleCloseModal={handleCloseModal}\n                    applicationId={applicationId}\n                    handleFinishedFeedback={handleFinishedFeedback}\n                    disableFeedbackReappearance={disableFeedbackReappearance}\n                />\n            );\n\n        case ApplicationIdEnum.ClassifiedTouch:\n        case ApplicationIdEnum.ClassifiedDesktop:\n        default: {\n            return (<CustomerFeedbackAnketologModal\n                modalIsOpen={modalIsOpen}\n                handleCloseModal={handleCloseModal}\n                disableFeedbackReappearance={disableFeedbackReappearance}\n            />);\n        }\n    }\n};\n","/* global window */\nimport React from 'react';\n\ntype KeyCodes = 'Escape';\ntype KeyHandlers = Record<KeyCodes, ((...args: any[]) => void) | undefined>;\n\nfunction useKeyHandler(handlers: KeyHandlers) {\n    return React.useCallback((event: KeyboardEvent) => {\n        const handler = handlers[event.key as KeyCodes];\n\n        handler?.();\n    }, Object.keys(handlers).map(key => handlers[key as unknown as KeyCodes]));\n}\n\nexport function useKeyUp(onKeyUp: (event: KeyboardEvent) => void) {\n    React.useEffect(() => {\n        window.addEventListener('keyup', onKeyUp);\n\n        return () => {\n            window.removeEventListener('keyup', onKeyUp);\n        };\n    }, [ onKeyUp ]);\n}\n\nexport function useKeyCancel(onCancel?: () => void) {\n    const handler = useKeyHandler({ Escape: onCancel });\n\n    useKeyUp(handler);\n}\n","import React, { useState, useCallback, useEffect } from 'react';\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { dataLayerPush } from '../../../../domain/google/dataLayerPush';\nimport { useKeyCancel } from '../../hooks/useKey';\n\nconst CL_LOCAL_STORAGE_KEY = 'cl_customer_feedback_interaction';\nconst NB_LOCAL_STORAGE_KEY = 'nb_customer_feedback_interaction';\n\nconst LOCAL_STORAGE_KEY_MAP: Record<ApplicationIdEnum, string> = {\n    [ApplicationIdEnum.ClassifiedDesktop]: CL_LOCAL_STORAGE_KEY,\n    [ApplicationIdEnum.ClassifiedTouch]: CL_LOCAL_STORAGE_KEY,\n    [ApplicationIdEnum.NewBuildingsDesktop]: NB_LOCAL_STORAGE_KEY,\n    [ApplicationIdEnum.NewBuildingsTouch]: NB_LOCAL_STORAGE_KEY,\n};\n\nexport const useCustomerFeedbackExternalState = ({\n    applicationId,\n    modalOpenEvent\n}: {\n    applicationId: ApplicationIdEnum;\n    modalOpenEvent?: string;\n}) => {\n    const [ modalIsOpen, setModalIsOpen ] = useState(false);\n    const [ openBtnIsVisible, setOpenBtnIsVisible ] = useState(false);\n\n    const handleOpenModal = useCallback(() => {\n        setModalIsOpen(true);\n        modalOpenEvent && dataLayerPush({ event: modalOpenEvent });\n    }, [ modalOpenEvent ]);\n\n    const handleCloseModal = useCallback(() => {\n        setModalIsOpen(false);\n        setOpenBtnIsVisible(true);\n    }, []);\n\n    const handleFinishedFeedback = useCallback(() => {\n        setModalIsOpen(false);\n        setOpenBtnIsVisible(false);\n    }, []);\n\n    const disableFeedbackReappearance = useCallback((e?: React.MouseEvent<Element, MouseEvent>) => {\n        const currentDate = new Date();\n\n        e?.stopPropagation();\n        window.localStorage.setItem(LOCAL_STORAGE_KEY_MAP[applicationId], currentDate.toString());\n    }, [ applicationId ]);\n\n    const handleCloseOpenBtn = useCallback((e?: React.MouseEvent<Element, MouseEvent>) => {\n        e?.stopPropagation();\n        setOpenBtnIsVisible(false);\n        disableFeedbackReappearance();\n    }, []);\n\n    useKeyCancel(handleCloseModal);\n\n    useEffect(() => {\n        const lastOpening = window.localStorage.getItem(LOCAL_STORAGE_KEY_MAP[applicationId]);\n\n        if (! lastOpening) {\n            setOpenBtnIsVisible(true);\n            return;\n        }\n\n        const currentDate = new Date();\n        const dateToShowBtn = new Date(lastOpening);\n\n        dateToShowBtn.setDate(dateToShowBtn.getDate() + 45);\n\n        setOpenBtnIsVisible(currentDate > dateToShowBtn);\n    }, [ applicationId ]);\n\n    return {\n        openBtnIsVisible,\n        modalIsOpen,\n        handleOpenModal,\n        handleCloseModal,\n        handleFinishedFeedback,\n        handleCloseOpenBtn,\n        disableFeedbackReappearance\n    };\n};\n","import React from 'react';\n\nimport { ApplicationIdEnum } from '@search/graphql-typings';\n\nimport { CustomerFeedbackOpenButton } from './components/OpenButton';\nimport { CustomerFeedbackModal } from './components/Modal';\nimport { useCustomerFeedbackExternalState } from './useCustomerFeedbackExternalState';\n\nexport interface ICustomerFeedback {\n    applicationId: ApplicationIdEnum;\n    isSticky?: boolean;\n    modalOpenEvent?: string;\n}\n\nexport const CustomerFeedback = ({\n    applicationId,\n    isSticky = false,\n    modalOpenEvent\n}: ICustomerFeedback) => {\n    const {\n        openBtnIsVisible,\n        modalIsOpen,\n        handleOpenModal,\n        handleCloseModal,\n        handleCloseOpenBtn,\n        handleFinishedFeedback,\n        disableFeedbackReappearance\n    } = useCustomerFeedbackExternalState({\n        applicationId,\n        modalOpenEvent\n    });\n\n    if (! openBtnIsVisible) {\n        return null;\n    }\n\n    return (\n        <>\n            <CustomerFeedbackOpenButton\n                applicationId={applicationId}\n                isSticky={isSticky}\n                handleOpen={handleOpenModal}\n                handleCloseOpenBtn={handleCloseOpenBtn}\n            />\n            <CustomerFeedbackModal\n                applicationId={applicationId}\n                modalIsOpen={modalIsOpen}\n                handleCloseModal={handleCloseModal}\n                disableFeedbackReappearance={disableFeedbackReappearance}\n                handleFinishedFeedback={handleFinishedFeedback}\n            />\n        </>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Button } from '@vtblife/uikit';\n\ninterface IProps {\n    onChange: (data: { diff: { selected: number[]; deselected: number[] }}) => void;\n    selectedDistricts?: Set<number>;\n}\n\nconst SPB_CENTER_DISTRICTS = [ 466, 448, 446, 476 ];\n\nexport const SPBCenterDistricts: React.FC<IProps> = ({ onChange, selectedDistricts = new Set() }) => {\n    const selected = SPB_CENTER_DISTRICTS.every(id => selectedDistricts.has(id)) &&\n        selectedDistricts.size === SPB_CENTER_DISTRICTS.length;\n\n    const selectSPBCenterDistricts = useCallback(() => {\n        onChange({\n            diff: {\n                selected: SPB_CENTER_DISTRICTS,\n                deselected: Array.from(selectedDistricts).filter(id => ! SPB_CENTER_DISTRICTS.includes(id))\n            }\n        });\n    }, [ onChange ]);\n\n    return (\n        <Button\n            variant='secondary'\n            size='s'\n            fullWidth\n            selected={selected}\n            onClick={selectSPBCenterDistricts}\n        >\n            Центр\n        </Button>\n    );\n};\n","import './styles.css';\n\nimport React, { useCallback, useMemo } from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'NewMoscowDistrict');\n\ninterface IProps {\n    onChange: (data: { diff: { selected: number[]; deselected: number[] }}) => void;\n    selectedDistricts?: Set<number>;\n}\n\nconst NEW_MOSCOW_DISTRICT = 141530;\nconst EXCEPT_NEW_MOSCOW_DISTRICTS = [ 381, 103, 81, 182, 218, 15, 60, 164, 37, 7 ];\n\nexport const NewMoscowDistricts: React.FC<IProps> = ({ onChange, selectedDistricts = new Set() }) => {\n    const isNewMoscowSelected = useMemo(() => {\n        return selectedDistricts.size === 1 && selectedDistricts.has(NEW_MOSCOW_DISTRICT);\n    }, [ selectedDistricts ]);\n\n    const isExceptNewMoscowSelected = useMemo(() => {\n        const intersectExpectNewMoscowDistricts = new Set([ ...selectedDistricts, ...EXCEPT_NEW_MOSCOW_DISTRICTS ]);\n\n        return selectedDistricts.size !== 0 &&\n            intersectExpectNewMoscowDistricts.size === EXCEPT_NEW_MOSCOW_DISTRICTS.length &&\n            intersectExpectNewMoscowDistricts.size === selectedDistricts.size;\n    }, [ selectedDistricts ]);\n\n    const selectNewMoscowDistricts = useCallback(() => {\n        const deselected = [ ...selectedDistricts ].filter(value => value !== NEW_MOSCOW_DISTRICT);\n\n        onChange({\n            diff: {\n                selected: [ NEW_MOSCOW_DISTRICT ],\n                deselected\n            }\n        });\n    }, [ onChange, selectedDistricts ]);\n\n    const selectExceptNewMoscowDistricts = useCallback(() => {\n        const deselected = [ ...selectedDistricts ].filter(value => ! EXCEPT_NEW_MOSCOW_DISTRICTS.includes(value));\n\n        onChange({\n            diff: {\n                selected: EXCEPT_NEW_MOSCOW_DISTRICTS,\n                deselected\n            }\n        });\n    }, [ onChange, selectedDistricts ]);\n\n    return (<>\n        <div className={cn('new-moscow-button')}>\n            <Button\n                variant='secondary'\n                size='s'\n                fullWidth\n                selected={isNewMoscowSelected}\n                onClick={selectNewMoscowDistricts}\n            >\n                Новая Москва\n            </Button>\n        </div>\n        <Button\n            variant='secondary'\n            size='s'\n            fullWidth\n            selected={isExceptNewMoscowSelected}\n            onClick={selectExceptNewMoscowDistricts}\n        >\n            Без Новой Москвы\n        </Button>\n    </>);\n};\n","import React from 'react';\n\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport { SPBCenterDistricts } from './components/SPBCenterDistricts';\nimport { NewMoscowDistricts } from './components/NewMoscowDistrict';\n\ninterface IProps {\n    regionId: RegionIdEnum;\n    onChange: (data: { diff: { selected: number[]; deselected: number[] }}) => void;\n    selectedDistricts?: Set<number>;\n    className?: string;\n}\n\nexport const DistrictControl: React.FC<IProps> = ({ regionId, onChange, className, selectedDistricts }) => {\n    let districtsSelectButton;\n\n    switch (regionId) {\n        case RegionIdEnum.SPB:\n            districtsSelectButton = (\n                <SPBCenterDistricts\n                    onChange={onChange}\n                    selectedDistricts={selectedDistricts}\n                />\n            );\n\n            break;\n        case RegionIdEnum.MSK:\n            districtsSelectButton = (\n                <NewMoscowDistricts\n                    onChange={onChange}\n                    selectedDistricts={selectedDistricts}\n                />\n            );\n\n            break;\n\n        default: {\n            districtsSelectButton = null;\n        }\n    }\n\n    return (\n        <div className={className}>\n            {districtsSelectButton}\n        </div>\n    );\n};\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable @typescript-eslint/naming-convention */\nimport React from 'react';\n\nimport { Modal, Size } from '@vtblife/uikit/legacy';\nimport { UseAuthClosedError, UseAuthError } from '@search/auth/src/useAuth';\n\nexport type BasicError = {\n    __typename: 'AuthUserIdError';\n    message?: string | null;\n} | {\n    __typename: 'InternalError';\n    message?: string | null;\n} | {\n    __typename: '%other';\n} | {\n    __typename?: string;\n};\n\nconst BasicErrorContext = React.createContext({\n    setError(error?: BasicError | string | undefined | null) {}\n});\n\nexport function useBasicError() {\n    return React.useContext(BasicErrorContext);\n}\n\nexport function BasicErrorProvider(props: {\n    isMobile?: boolean;\n    children?: React.ReactNode;\n}) {\n    const [ error, setError ] = React.useState<BasicError | string | undefined | null>();\n    const closeModal = React.useCallback(() => {\n        setError(undefined);\n    }, [ setError ]);\n\n    let modal: React.ReactNode | null = null;\n\n    if (error) {\n        // eslint-disable-next-line no-console\n        console.error(error);\n        if (! UseAuthClosedError.is(error) && ! UseAuthError.is(error)) {\n            modal = (<Modal\n                title='Упс...'\n                isOpen\n                size={Size.Small}\n                closeOnOverlayClick\n                onClose={closeModal}\n                dataTest='any-error-modal'\n            >\n                Что-то пошло не так\n            </Modal>);\n        }\n    }\n\n    const value = React.useMemo(() => ({ setError }), [ setError ]);\n\n    return (<BasicErrorContext.Provider value={value}>\n        {modal}\n        {props.children}\n    </BasicErrorContext.Provider>);\n}\n\n","import React from 'react';\nimport { Modal, Size } from '@vtblife/uikit/legacy';\nimport classname from '@search/classname/src';\nimport { useLkLinks } from '@search/classified-common/src/SaveSearch/useLkLinks';\nimport './styles.css';\n\ninterface IProps {\n    isOpenLimitModal: boolean;\n    onClose: () => void;\n    isNewBuilding?: boolean;\n}\n\nconst cn = classname.bind(null, 'FavoriteLimitModal');\n\nconst FavoriteLimitModal = (props: IProps) => {\n    const { favoritesUrl } = useLkLinks();\n\n    return (\n        <Modal\n            title='Упс...'\n            isOpen={props.isOpenLimitModal}\n            size={Size.Small}\n            closeOnOverlayClick\n            onClose={props.onClose}\n            dataTest='favorites-limit-modal'\n            className={cn()}\n        >\n            <p>{\n                `В вашем избранном много вариантов.\\u00A0Выберите самые лучшие из них и удалите лишние, чтобы добавить${\n                    props.isNewBuilding ? ' этот ЖК' : ' это объявление'\n                }.`\n            }</p>\n            <a\n                href={favoritesUrl}\n                target='_blank'\n                className={cn('favorites-link')}\n            >\n                Перейти в избранное\n            </a>\n        </Modal>\n    );\n};\n\nexport default FavoriteLimitModal;\n","import React from 'react';\n\nimport { EditFavoriteNewBuildingsResponse } from '@search/graphql-typings';\n\nimport { FavoritesMutation$data as FavoritesMutationResponse } from './__generated__/FavoritesMutation.graphql';\nimport { BasicError, useBasicError } from './BasicError';\nimport FavoriteLimitModal from './FavoriteLimitModal';\n\nexport type FavoritesError = BasicError | FavoritesMutationResponse['editFavoritePersonal2']['firstError'];\ntype NewBuildingFavoritesError = BasicError | EditFavoriteNewBuildingsResponse['firstError'];\n\nconst FavoriteModalsContext = React.createContext({\n    setError(error: FavoritesError | NewBuildingFavoritesError | undefined | null) {}\n});\n\nexport function useFavoritesModal() {\n    return React.useContext(FavoriteModalsContext);\n}\n\nexport function FavoritesModalProvider({\n    children,\n    isMobile = false\n}: {\n    isMobile?: boolean;\n    children?: React.ReactNode;\n}) {\n    const { setError: setParentError } = useBasicError();\n    const [ error, setChildError ] = React.useState<FavoritesError | NewBuildingFavoritesError | undefined | null>();\n\n    const setError = React.useCallback((err: FavoritesError | NewBuildingFavoritesError | undefined | null) => {\n        if (! err) {\n            setChildError(undefined);\n            setParentError(undefined);\n\n            return;\n        }\n\n        const code = typeof err === 'object' && err ?\n            (err.__typename ?? err.cause?.__typename ?? err.message) :\n            undefined;\n\n        switch (code) {\n            case 'FavoritesErrorLimitExceeded':\n            case 'FavoriteNewBuildingsLimitExceededError':\n                return setChildError(err);\n\n            default:\n                return setParentError(err);\n        }\n    }, [ setParentError ]);\n\n    const closeModal = React.useCallback(() => {\n        setError(undefined);\n    }, [ setError ]);\n\n    let modal: React.ReactNode | null = null;\n    const code = typeof error === 'object' && error ?\n        (error.__typename ?? error.cause?.__typename ?? error.message) :\n        undefined;\n\n    switch (code) {\n        case 'FavoritesErrorLimitExceeded': {\n            modal = (\n                <FavoriteLimitModal\n                    onClose={closeModal}\n                    isOpenLimitModal\n                />\n            );\n\n            break;\n        }\n\n        case 'FavoriteNewBuildingsLimitExceededError': {\n            modal = (\n                <FavoriteLimitModal\n                    onClose={closeModal}\n                    isOpenLimitModal\n                    isNewBuilding\n                />\n            );\n\n            break;\n        }\n\n        default:\n            modal = null;\n    }\n\n    const value = React.useMemo(() => ({ setError }), [ setError ]);\n\n    return (\n        <FavoriteModalsContext.Provider value={value}>\n            {modal}\n            {children}\n        </FavoriteModalsContext.Provider>\n    );\n}\n","/* global document */\nimport React from 'react';\nimport { Tooltip, Button, useTooltip } from '@vtblife/uikit';\nimport { useClassifiedOfferDataLayerPush } from '../offer/analytics/ClassifiedOfferGtmContext';\n\nexport const downloadOfferPdf = (offerId: string) => {\n    let form = document.getElementById('print-form') as HTMLFormElement | undefined;\n\n    if (! form) {\n        form = document.createElement('form');\n        document.body.appendChild(form);\n        form.id = 'print-form';\n        form.method = 'POST';\n        form.target = '_blank';\n    }\n\n    form.action = `/search/print/offer-${offerId}/`;\n    form.submit();\n\n    form.remove();\n    // window.open(`/search/print/offer-${p.offerId}/`);\n};\n\nexport function SharePrintButton(p: {\n    isButtonText?: boolean;\n    gtmPrint?: string;\n    offerId: string;\n}) {\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    const showPrintDialog = React.useCallback(() => {\n        p.gtmPrint && dataLayerPush({ event: p.gtmPrint });\n\n        downloadOfferPdf(p.offerId);\n    }, [ p.gtmPrint, p.offerId, dataLayerPush ]);\n\n    const tt = useTooltip();\n\n    return (<div ref={tt.registerControl}>\n        <Button\n            size='s'\n            fullWidth\n            icon='printer'\n            variant='secondary'\n            dataTest='card-button-print'\n            onClick={showPrintDialog}\n        >{p.isButtonText ? 'Распечатать' : ''}</Button>\n        <Tooltip\n            direction='up'\n            to={tt.to}\n        >\n            Распечатать\n        </Tooltip>\n    </div>);\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable max-len */\nimport { useEffect, useState, useCallback, useMemo } from 'react';\nimport {\n    TipAddress,\n    TipDeveloper,\n    TipNewBuilding,\n    TipBuilding,\n    TipMetroStation\n} from '@search/graphql-typings';\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\n\nimport { graphql, useGql } from '@search/gql-client/src';\n\nimport type {\n    useQueryDisplayValuesQuery$data as useQueryDisplayValuesQueryResponse,\n    useQueryDisplayValuesQuery$variables as useQueryDisplayValuesQueryVariables\n} from './__generated__/useQueryDisplayValuesQuery.graphql';\n\nexport type QueryDisplayValueKey = 'developers' | 'newBuildings' | 'buildings' | 'addresses' | 'metros' | 'districts';\n// eslint-disable-next-line max-len\nexport type QueryDisplayValue = TipAddress | TipDeveloper | TipNewBuilding | TipBuilding | TipMetroStation;\nexport type QueryDisplayValues = Partial<Record<QueryDisplayValueKey, Record<number, QueryDisplayValue>>>;\nexport type AddQueryDisplayValue = (type: QueryDisplayValueKey, data: QueryDisplayValue & { kind?: string; region?: number }) => void;\n\nexport type ExtendedTip = QueryDisplayValue | {\n    __typename: 'TipRouteMetro';\n    id: string;\n    transportType: {\n        value: TransportType;\n    };\n    timeLimit: {\n        formatted: string;\n    };\n};\n\nconst query = graphql`\n    query useQueryDisplayValuesQuery(\n        $newBuildingIds: [Int!]\n        $addressIds: [Int!]\n        $geoSlugs: [String!]\n        $regionId: Int\n        $districtIds: [Int!]\n        $metroIds: [Int!]\n    ) {\n        searchOffersTips(\n            newBuildingIds: $newBuildingIds\n            addressIds: $addressIds\n            geoSlugs: $geoSlugs\n            regionId: $regionId\n            districtIds: $districtIds\n            metroIds: $metroIds\n        ) {\n            newBuildings {\n                id\n                title\n                type\n            }\n            addresses {\n                id\n                title\n                translit\n                type\n                locative\n            }\n            metros {\n                id\n                title\n                type\n            }\n            districts {\n                id\n                title\n                type\n                translit\n                locative\n            }\n        }\n    }\n`;\n\ninterface UseQueryDisplayValuesProps {\n    newBuildingIds?: readonly number[];\n    addressIds?: readonly number[];\n    metroIds?: readonly number[];\n    districtIds?: readonly number[];\n}\n\ninterface UseQueryDisplayValuesOptions {\n    clientSide: boolean;\n    suspense: true | undefined;\n}\n\nexport type UseQueryDisplayValuesReturnType = Readonly<[\n    QueryDisplayValues,\n    (key: QueryDisplayValueKey, value: QueryDisplayValue) => void\n]>;\n\nconst buildState = (data = {}) => {\n    return Object.entries(data ?? {})\n        .reduce<QueryDisplayValues>((acc, tip) => {\n            const [ key, value ] = tip as [ QueryDisplayValueKey, QueryDisplayValue[] ];\n\n            if (value) {\n                acc[key] = value.reduce<Record<number, QueryDisplayValue>>((ret, item) => {\n                    if (item) {\n                        ret[item.id] = item;\n                    }\n\n                    return ret;\n                }, {});\n            }\n\n            return acc;\n        }, {} as QueryDisplayValues);\n};\n\nconst defaultOptions = { suspense: undefined, clientSide: false };\n\nexport const useQueryDisplayValues = (\n    params: UseQueryDisplayValuesProps = {},\n    opts: UseQueryDisplayValuesOptions = defaultOptions\n): UseQueryDisplayValuesReturnType => {\n    const queryParams = useMemo(() => params, [ JSON.stringify(params) ]);\n\n    const { data } = useGql<\n        useQueryDisplayValuesQueryVariables,\n        useQueryDisplayValuesQueryResponse\n    >(query, queryParams, { suspense: opts.suspense });\n\n    const initialState = useMemo(() => buildState(data?.searchOffersTips ?? undefined), [ data?.searchOffersTips ]);\n\n    const [\n        queryDisplayValues,\n        setQueryDisplayValues\n    ] = useState<QueryDisplayValues>(initialState);\n\n    useEffect(() => {\n        if (opts.clientSide) {\n            setQueryDisplayValues(buildState(Object.assign({}, data?.searchOffersTips)));\n        }\n    }, [ data?.searchOffersTips, setQueryDisplayValues, opts.clientSide ]);\n\n    const addDisplayValue = useCallback((key: QueryDisplayValueKey, value: QueryDisplayValue) => setQueryDisplayValues(\n        prev => {\n            const prevValues = prev[key];\n            const { id } = value;\n\n            if (prevValues && prevValues[id]) {\n                return prev;\n            }\n\n            const next = { ...prev };\n\n            if (! prevValues) {\n                next[key] = {};\n            }\n\n            next[key]![id] = value;\n\n            return next;\n        }\n    ), []);\n\n    return [\n        queryDisplayValues,\n        addDisplayValue\n    ] as const;\n};\n","import { AreaUnit } from '@search/filter-enums/enums/AreaUnit';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { RegionIdEnum, regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport { HouseCategory } from '@search/filter-enums/enums';\nimport { MortgagePurpose } from '@search/graphql-typings';\nimport {\n    CategoryTypeFilter,\n    DealTypeFilter,\n    Filters,\n    HouseCategoryFilter,\n    MapBoundsFilter,\n    NewBuildingFilter,\n    PriceFilter,\n    RegionFilter,\n    SellerOrganizationNameFilter\n} from '../../../view/filters/models/Filter';\n\n/**\n * ClassifiedFilterCollection business logic for filters in classified\n *\n * Contains methods for:\n * 1. retrieve typed filters like - getDealTypeFilter\n * 2. get current data about filter state - isRoomFilterActive\n * 3. ui info about view control state - isRoomFilterShown\n *\n * Before add new method check that there's no already defined method\n */\nexport class ClassifiedFilterCollection extends FilterCollection {\n    rebuild() {\n        return new ClassifiedFilterCollection(this._filters);\n    }\n\n    getDealTypeFilter(): DealTypeFilter {\n        return this.get(Filters.dealType);\n    }\n\n    getCategoryTypeFilter(): CategoryTypeFilter {\n        return this.get(Filters.categoryType);\n    }\n\n    getPriceFilter(): PriceFilter {\n        return this.get(Filters.price);\n    }\n\n    getRegionFilter(): RegionFilter {\n        return this.get(Filters.region);\n    }\n\n    getNewBuildingFilter(): NewBuildingFilter {\n        return this.get(Filters.newBuilding);\n    }\n\n    getMapBoundsFilter(): MapBoundsFilter {\n        return this.get(Filters.mapBounds);\n    }\n\n    getMortgagePurpose(): MortgagePurpose {\n        if (this.isActiveFilterHouseAllowedMortgage()) {\n            return MortgagePurpose.Secondary;\n        } else if (this.isNewBuilding()) {\n            return MortgagePurpose.Primary;\n        }\n        return MortgagePurpose.Secondary;\n    }\n\n    getSellerOrganizationName(): SellerOrganizationNameFilter {\n        return this.get(Filters.sellerOrganizationName);\n    }\n\n    isActiveFilterHouseAllowedMortgage(): boolean {\n        return (this.get(Filters.houseCategory) as HouseCategoryFilter)?.categories\n            .every(category => category !== HouseCategory.DUPLEX && category !== HouseCategory.PART_OF_HOUSE) ?? false;\n    }\n\n    isNewBuilding() {\n        return this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.NEW) ?? false;\n    }\n\n    isOnlySecond() {\n        return (this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.SECOND) &&\n            this.getNewBuildingFilter()?.newBuilding.length === 1) ?? false;\n    }\n\n    isOnlyNewBuildings() {\n        return (this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.NEW) &&\n            this.getNewBuildingFilter()?.newBuilding.length === 1) ?? false;\n    }\n\n    isFlatFilterActive(): boolean {\n        return this.getCategoryTypeFilter().categoryType === RealtyObjectType.FLAT;\n    }\n\n    isLandFilterActive(): boolean {\n        return this.getCategoryTypeFilter().categoryType === RealtyObjectType.LAND;\n    }\n\n    isHouseFilterActive(): boolean {\n        return this.getCategoryTypeFilter().categoryType === RealtyObjectType.HOUSE;\n    }\n\n    isRoomFilterActive(): boolean {\n        return this.getCategoryTypeFilter().categoryType === RealtyObjectType.ROOM;\n    }\n\n    isRentFilterActive(): boolean {\n        return this.getDealTypeFilter().dealType === DealType.RENT;\n    }\n\n    isSellFilterActive(): boolean {\n        return this.getDealTypeFilter().dealType === DealType.SELL;\n    }\n\n    isPricePerAllSquare() {\n        return this.getPriceFilter().priceType === AreaUnit.UNKNOWN;\n    }\n\n    isPricePerMeterSquare() {\n        return this.getPriceFilter().priceType === AreaUnit.METER;\n    }\n\n    isMortgagePayment() {\n        return this.isSellFilterActive() && this.getPriceFilter().priceType === AreaUnit.MORTGAGE_PAYMENT;\n    }\n\n    isRegionMsk(): boolean {\n        return this.getRegionFilter().region === RegionIdEnum.MSK;\n    }\n\n    isRegionMskMo(): boolean {\n        return this.getRegionFilter().region === RegionIdEnum.MSK_AND_MSK_OBL;\n    }\n\n    isRegionMo(): boolean {\n        return this.getRegionFilter().region === RegionIdEnum.MSK_OBL;\n    }\n\n    isRegionMskOrMo(): boolean {\n        return this.isRegionMo() || this.isRegionMsk() || this.isRegionMskMo();\n    }\n\n    isRegionSpb(): boolean {\n        return this.getRegionFilter().region === RegionIdEnum.SPB;\n    }\n\n    isRegionSpbLO(): boolean {\n        return this.getRegionFilter().region === RegionIdEnum.SPB_AND_LEN_OBL;\n    }\n\n    isRegionLo(): boolean {\n        return this.getRegionFilter().region === RegionIdEnum.LEN_OBL;\n    }\n\n    isRegionSpbOrLo(): boolean {\n        return this.isRegionLo() || this.isRegionSpb() || this.isRegionSpbLO();\n    }\n\n    isNewBuildingShown(): boolean {\n        return this.isSellFilterActive() && this.isFlatFilterActive();\n    }\n\n    isBankPledgeOptionActive(): boolean {\n        return this.isSellFilterActive() && this.isFlatFilterActive();\n    }\n\n    isSellFlatFilterActive(): boolean {\n        return this.isSellFilterActive() && this.isFlatFilterActive();\n    }\n\n    isFlatOrRoomFilterActive(): boolean {\n        return this.isFlatFilterActive() || this.isRoomFilterActive();\n    }\n\n    isFloorTotalFilterShownNotHouse(): boolean {\n        return (! this.isLandFilterActive()) && (! this.isHouseFilterActive());\n    }\n\n    isLandOrHouseFilterActive(): boolean {\n        return this.isLandFilterActive() || this.isHouseFilterActive();\n    }\n\n    isSellRoomFilterActive(): boolean {\n        return this.isSellFilterActive() && this.isRoomFilterActive();\n    }\n\n    isSellFlatOrRoomFilterActive(): boolean {\n        return this.isSellFilterActive() && this.isFlatOrRoomFilterActive();\n    }\n\n    isWindowsDirectionFilterShownInRent(): boolean {\n        return this.isFlatOrRoomFilterActive() && this.isRentFilterActive();\n    }\n\n    isRentFlatOrRoomFilterActive(): boolean {\n        return this.isRentFilterActive() && this.isFlatOrRoomFilterActive();\n    }\n\n    hasMetroInRegion() {\n        return regionsWithMetroEnumeration.has(this.getRegionFilter().region);\n    }\n\n    isRenovationProgramFilterActive(): boolean {\n        return (this.getRegionFilter().region === RegionIdEnum.MSK ||\n            this.getRegionFilter().region === RegionIdEnum.MSK_OBL ||\n            this.getRegionFilter().region === RegionIdEnum.MSK_AND_MSK_OBL) &&\n            this.isSellFilterActive() && this.isFlatOrRoomFilterActive() &&\n            ! ((this.getNewBuildingFilter()?.newBuilding.includes(NewBuilding.NEW) &&\n                this.getNewBuildingFilter()?.newBuilding.length === 1));\n    }\n\n    isNearbySchoolFilterActive(): boolean {\n        return (this.getRegionFilter().region === RegionIdEnum.MSK ||\n            this.getRegionFilter().region === RegionIdEnum.MSK_OBL ||\n            this.getRegionFilter().region === RegionIdEnum.MSK_AND_MSK_OBL) &&\n            this.isFlatOrRoomFilterActive();\n    }\n\n    isOnlineViewFilterActive(): boolean {\n        return this.isFlatOrRoomFilterActive() || this.isHouseFilterActive() || this.isLandFilterActive();\n    }\n}\n","import { FilterCollectionMetadata } from '../types/FilterCollectionMetadata';\nimport {\n    ApartmentFilter,\n    AreaFilter,\n    AuthorFilter,\n    BalconyFilter,\n    BankPledgeOptionsFilter,\n    BathroomFilter,\n    CategoryTypeFilter,\n    CellHeightFilter,\n    DealTypeFilter,\n    Filters,\n    FloorFilter,\n    FloorsTotalFilter,\n    FurnitureFilter,\n    GeoFilter,\n    HeatingFilter,\n    HouseAreaFilter,\n    HouseCategoryFilter,\n    IFilter,\n    InfrastructureFilter,\n    KitchenAreaFilter,\n    LandAreaFilter,\n    LandStatusFilter,\n    LayoutImageOptionsFilter,\n    LivingAreaFilter,\n    LivingFacilityFilter,\n    LivingTenantOptionFilter,\n    MapBoundsFilter,\n    NearbySchoolFilter,\n    NewBuildingDataFilter,\n    NewBuildingFilter,\n    ParkingFilter,\n    PhotoOptionsFilter,\n    PriceFilter,\n    RegionFilter,\n    RenovationFilter,\n    RenovationProgramFilter,\n    RentConditionsFilter,\n    RentPrepaymentFilter,\n    RoomFilter,\n    RoomsInOfferFilter,\n    SellerOrganizationNameFilter,\n    SellTypeFilter,\n    SeoMortgageAllowedFilter,\n    SupplyOptionsFilter,\n    TransportLimitFilter,\n    WallsTypeFilter,\n    WindowsDirectionFilter,\n    YearBuildingFilter,\n    BuildEpochFilter,\n    OnlineViewFilter,\n    MortgagePaymentFilter,\n    FinishingFilter,\n    ClCommisioninFilter,\n    CommissioningFilter\n} from '../../../../view/filters/models/Filter';\n\ntype FilterCreator = () => IFilter;\n\nexport const filterCreator: Record<Filters, FilterCreator> = {\n    [Filters.dealType]: () => new DealTypeFilter(),\n    [Filters.categoryType]: () => new CategoryTypeFilter(),\n    [Filters.rooms]: () => new RoomFilter(),\n    [Filters.livingArea]: () => new LivingAreaFilter(),\n    [Filters.price]: () => new PriceFilter(),\n    [Filters.mortgagePayment]: () => new MortgagePaymentFilter(),\n    [Filters.totalArea]: () => new AreaFilter(),\n    [Filters.kitchenArea]: () => new KitchenAreaFilter(),\n    [Filters.builtYear]: () => new YearBuildingFilter(),\n    [Filters.floor]: () => new FloorFilter(),\n    [Filters.cellHeight]: () => new CellHeightFilter(),\n    [Filters.renovation]: () => new RenovationFilter(),\n    [Filters.bathroom]: () => new BathroomFilter(),\n    [Filters.region]: () => new RegionFilter(),\n    [Filters.transportLimit]: () => new TransportLimitFilter(),\n    [Filters.newBuilding]: () => new NewBuildingFilter(),\n    [Filters.geo]: () => new GeoFilter(),\n    [Filters.newBuildingData]: () => new NewBuildingDataFilter(),\n    [Filters.walls]: () => new WallsTypeFilter(),\n    [Filters.parkings]: () => new ParkingFilter(),\n    [Filters.author]: () => new AuthorFilter(),\n    [Filters.sellType]: () => new SellTypeFilter(),\n    [Filters.infrastructure]: () => new InfrastructureFilter(),\n    [Filters.balcony]: () => new BalconyFilter(),\n    [Filters.photoOptions]: () => new PhotoOptionsFilter(),\n    [Filters.layoutImageOptions]: () => new LayoutImageOptionsFilter(),\n    [Filters.apartments]: () => new ApartmentFilter(),\n    [Filters.livingFacility]: () => new LivingFacilityFilter(),\n    [Filters.furniture]: () => new FurnitureFilter(),\n    [Filters.livingTenantOptions]: () => new LivingTenantOptionFilter(),\n    [Filters.rentPrepayment]: () => new RentPrepaymentFilter(),\n    [Filters.rentConditions]: () => new RentConditionsFilter(),\n    [Filters.roomsInOffer]: () => new RoomsInOfferFilter(),\n    [Filters.floorsTotal]: () => new FloorsTotalFilter(),\n    [Filters.landStatus]: () => new LandStatusFilter(),\n    [Filters.landArea]: () => new LandAreaFilter(),\n    [Filters.supplyOptions]: () => new SupplyOptionsFilter(),\n    [Filters.houseCategory]: () => new HouseCategoryFilter(),\n    [Filters.houseArea]: () => new HouseAreaFilter(),\n    [Filters.bathroomLocation]: () => new BathroomFilter(),\n    [Filters.heating]: () => new HeatingFilter(),\n    [Filters.mapBounds]: () => new MapBoundsFilter(),\n    [Filters.bankPledgeOptions]: () => new BankPledgeOptionsFilter(),\n    [Filters.seoMortgageAllowed]: () => new SeoMortgageAllowedFilter(),\n    [Filters.windowsDirection]: () => new WindowsDirectionFilter(),\n    [Filters.nearbyOptions]: () => new NearbySchoolFilter(),\n    [Filters.renovationProgram]: () => new RenovationProgramFilter(),\n    [Filters.sellerOrganizationName]: () => new SellerOrganizationNameFilter(),\n    [Filters.buildEpoch]: () => new BuildEpochFilter(),\n    [Filters.onlineView]: () => new OnlineViewFilter(),\n    [Filters.finishingType]: () => new FinishingFilter(),\n    [Filters.commissioning]: () => new CommissioningFilter()\n};\n\nexport const supportedClassifiedFilters = [\n    Filters.dealType,\n    Filters.categoryType,\n    Filters.rooms,\n    Filters.livingArea,\n    Filters.price,\n    Filters.mortgagePayment,\n    Filters.totalArea,\n    Filters.kitchenArea,\n    Filters.builtYear,\n    Filters.floor,\n    Filters.cellHeight,\n    Filters.renovation,\n    Filters.bathroom,\n    Filters.region,\n    Filters.transportLimit,\n    Filters.newBuilding,\n    Filters.geo,\n    Filters.newBuildingData,\n    Filters.walls,\n    Filters.parkings,\n    Filters.author,\n    Filters.sellType,\n    Filters.infrastructure,\n    Filters.balcony,\n    Filters.photoOptions,\n    Filters.layoutImageOptions,\n    Filters.apartments,\n    Filters.livingFacility,\n    Filters.furniture,\n    Filters.livingTenantOptions,\n    Filters.rentPrepayment,\n    Filters.rentConditions,\n    Filters.roomsInOffer,\n    Filters.landArea,\n    Filters.landStatus,\n    Filters.supplyOptions,\n    Filters.houseCategory,\n    Filters.houseArea,\n    Filters.bathroomLocation,\n    Filters.heating,\n    Filters.floorsTotal,\n    Filters.mapBounds,\n    Filters.bankPledgeOptions,\n    Filters.seoMortgageAllowed,\n    Filters.windowsDirection,\n    Filters.nearbyOptions,\n    Filters.renovationProgram,\n    Filters.sellerOrganizationName,\n    Filters.buildEpoch,\n    Filters.onlineView,\n    Filters.finishingType,\n    Filters.commissioning\n];\n\nexport const sellFlatMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.rooms,\n        Filters.livingArea,\n        Filters.price,\n        Filters.mortgagePayment,\n        Filters.totalArea,\n        Filters.kitchenArea,\n        Filters.builtYear,\n        Filters.floor,\n        Filters.floorsTotal,\n        Filters.cellHeight,\n        Filters.renovation,\n        Filters.bathroom,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.newBuilding,\n        Filters.geo,\n        Filters.newBuildingData,\n        Filters.walls,\n        Filters.parkings,\n        Filters.author,\n        Filters.sellType,\n        Filters.infrastructure,\n        Filters.balcony,\n        Filters.photoOptions,\n        Filters.layoutImageOptions,\n        Filters.apartments,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.seoMortgageAllowed,\n        Filters.windowsDirection,\n        Filters.nearbyOptions,\n        Filters.renovationProgram,\n        Filters.sellerOrganizationName,\n        Filters.buildEpoch,\n        Filters.onlineView,\n        Filters.furniture,\n        Filters.finishingType,\n        Filters.commissioning\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n\nexport const rentFlatMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.rooms,\n        Filters.livingArea,\n        Filters.price,\n        Filters.totalArea,\n        Filters.kitchenArea,\n        Filters.builtYear,\n        Filters.floor,\n        Filters.floorsTotal,\n        Filters.cellHeight,\n        Filters.renovation,\n        Filters.bathroom,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.geo,\n        Filters.newBuildingData,\n        Filters.livingFacility,\n        Filters.furniture,\n        Filters.livingTenantOptions,\n        Filters.rentPrepayment,\n        Filters.rentConditions,\n        Filters.walls,\n        Filters.parkings,\n        Filters.author,\n        Filters.sellType,\n        Filters.infrastructure,\n        Filters.balcony,\n        Filters.photoOptions,\n        Filters.layoutImageOptions,\n        Filters.apartments,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.windowsDirection,\n        Filters.nearbyOptions,\n        Filters.sellerOrganizationName,\n        Filters.onlineView,\n        Filters.buildEpoch\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n\nexport const sellLandMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.landStatus,\n        Filters.price,\n        Filters.mortgagePayment,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.geo,\n        Filters.author,\n        Filters.sellType,\n        Filters.photoOptions,\n        Filters.landArea,\n        Filters.supplyOptions,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.sellerOrganizationName,\n        Filters.onlineView\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n\nexport const sellHouseMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.price,\n        Filters.mortgagePayment,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.geo,\n        Filters.floorsTotal,\n        Filters.author,\n        Filters.sellType,\n        Filters.photoOptions,\n        Filters.houseCategory,\n        Filters.houseArea,\n        Filters.landArea,\n        Filters.floorsTotal,\n        Filters.builtYear,\n        Filters.rooms,\n        Filters.bathroomLocation,\n        Filters.supplyOptions,\n        Filters.landStatus,\n        Filters.heating,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.sellerOrganizationName,\n        Filters.onlineView,\n        Filters.furniture\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n\nexport const sellRoomMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.rooms,\n        Filters.livingArea,\n        Filters.price,\n        Filters.mortgagePayment,\n        Filters.totalArea,\n        Filters.kitchenArea,\n        Filters.builtYear,\n        Filters.floor,\n        Filters.floorsTotal,\n        Filters.cellHeight,\n        Filters.renovation,\n        Filters.bathroom,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.geo,\n        Filters.newBuildingData,\n        Filters.walls,\n        Filters.parkings,\n        Filters.author,\n        Filters.sellType,\n        Filters.infrastructure,\n        Filters.balcony,\n        Filters.photoOptions,\n        Filters.layoutImageOptions,\n        Filters.apartments,\n        Filters.roomsInOffer,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.windowsDirection,\n        Filters.nearbyOptions,\n        Filters.renovationProgram,\n        Filters.sellerOrganizationName,\n        Filters.buildEpoch,\n        Filters.onlineView\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n\nexport const rentRoomMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.rooms,\n        Filters.livingArea,\n        Filters.price,\n        Filters.totalArea,\n        Filters.kitchenArea,\n        Filters.builtYear,\n        Filters.floor,\n        Filters.floorsTotal,\n        Filters.cellHeight,\n        Filters.renovation,\n        Filters.bathroom,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.geo,\n        Filters.newBuildingData,\n        Filters.livingFacility,\n        Filters.furniture,\n        Filters.livingTenantOptions,\n        Filters.rentPrepayment,\n        Filters.rentConditions,\n        Filters.walls,\n        Filters.parkings,\n        Filters.author,\n        Filters.sellType,\n        Filters.infrastructure,\n        Filters.balcony,\n        Filters.photoOptions,\n        // FIXME does we need apartments?\n        Filters.apartments,\n        Filters.roomsInOffer,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.windowsDirection,\n        Filters.nearbyOptions,\n        Filters.sellerOrganizationName,\n        Filters.onlineView,\n        Filters.buildEpoch\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n\nexport const rentHouseMetadata: FilterCollectionMetadata = {\n    filterIds: [\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.price,\n        Filters.region,\n        Filters.transportLimit,\n        Filters.geo,\n        Filters.livingFacility,\n        Filters.furniture,\n        Filters.livingTenantOptions,\n        Filters.rentPrepayment,\n        Filters.rentConditions,\n        Filters.author,\n        Filters.photoOptions,\n        Filters.houseCategory,\n        Filters.houseArea,\n        Filters.landArea,\n        Filters.floorsTotal,\n        Filters.floorsTotal,\n        Filters.builtYear,\n        Filters.rooms,\n        Filters.bathroomLocation,\n        Filters.supplyOptions,\n        Filters.landStatus,\n        Filters.heating,\n        Filters.mapBounds,\n        Filters.bankPledgeOptions,\n        Filters.sellerOrganizationName,\n        Filters.onlineView,\n        Filters.furniture\n    ],\n    persistIds: new Set([\n        Filters.dealType,\n        Filters.categoryType,\n        Filters.region,\n        Filters.mapBounds\n    ])\n};\n","/* eslint-disable complexity */\nimport {\n    DealType,\n    RealtyObjectType\n} from '@search/filter-enums/enums';\nimport {\n    IFilter,\n    Filters,\n    DealTypeFilter,\n    CategoryTypeFilter\n} from '../../../view/filters/models/Filter';\nimport { ClassifiedFilterCollection } from './ClassifiedFilterCollection';\nimport { filterCreator, sellFlatMetadata, sellRoomMetadata, rentFlatMetadata, rentRoomMetadata, sellLandMetadata, sellHouseMetadata, rentHouseMetadata } from './metadata/ClassifiedFilterMetadata';\nimport { FilterCollectionMetadata } from './types/FilterCollectionMetadata';\n\n/**\n * ClassifiedFilterFactory\n * Contains methods for create and update ClassifiedFilterCollection.\n * Do not instance ClassifiedFilterCollection directly\n */\nclass ClassifiedFilterFactory {\n    createOrUpdateFilters(\n        filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n        filter?: IFilter\n    ): ClassifiedFilterCollection {\n        const { filterIds, persistIds } = this.getRelevantFilterMetadata(filters, filter);\n        const isChangeSegment = (filter) ? filter.id === Filters.dealType || filter.id === Filters.categoryType : false;\n\n        const filterList = filterIds.map(id => {\n            let newFilter: IFilter;\n\n            if (isChangeSegment) {\n                if (filter && filter.id === id) {\n                    newFilter = filter;\n                } else {\n                    const gettingFilter = filters.get(id);\n\n                    newFilter = persistIds.has(id) && gettingFilter ?\n                        gettingFilter :\n                        filterCreator[id]();\n                }\n            } else {\n                newFilter = filters.get(id) || filterCreator[id]();\n            }\n\n            return [ id, newFilter ] as const;\n        });\n\n        const filterMap = new Map<Filters, IFilter>(filterList);\n\n        if (isChangeSegment) {\n            const dealTypeFilter = filterMap.get(Filters.dealType) as DealTypeFilter;\n            const realtyTypeFilter = filterMap.get(Filters.categoryType) as CategoryTypeFilter;\n\n            if (\n                realtyTypeFilter?.categoryType === RealtyObjectType.LAND &&\n                dealTypeFilter?.dealType === DealType.RENT\n            ) {\n                filterMap.set(Filters.categoryType, new CategoryTypeFilter(RealtyObjectType.FLAT));\n                filterMap.set(Filters.dealType, new DealTypeFilter(DealType.RENT));\n            }\n        }\n\n        return this.create(filterMap);\n    }\n\n    create(\n        filters: Map<Filters, IFilter> = new Map<Filters, IFilter>()\n    ): ClassifiedFilterCollection {\n        return new ClassifiedFilterCollection(filters);\n    }\n\n    getRelevantFilterMetadata(\n        filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n        filter?: IFilter\n    ): FilterCollectionMetadata {\n        const realtyType = ((filter && filter.id === Filters.categoryType) ?\n            filter :\n            filters.get(Filters.categoryType)) as CategoryTypeFilter;\n\n        const dealTypeFilter = ((filter && filter.id === Filters.dealType) ?\n            filter :\n            filters.get(Filters.dealType)) as DealTypeFilter;\n\n        if (\n            realtyType?.categoryType === RealtyObjectType.LAND &&\n            dealTypeFilter?.dealType === DealType.RENT\n        ) {\n            return rentFlatMetadata;\n        }\n\n        if (dealTypeFilter?.dealType === DealType.SELL) {\n            if (realtyType?.categoryType === RealtyObjectType.FLAT) {\n                return sellFlatMetadata;\n            } else if (realtyType?.categoryType === RealtyObjectType.ROOM) {\n                return sellRoomMetadata;\n            } else if (realtyType?.categoryType === RealtyObjectType.LAND) {\n                return sellLandMetadata;\n            } else if (realtyType?.categoryType === RealtyObjectType.HOUSE) {\n                return sellHouseMetadata;\n            }\n\n            return sellFlatMetadata;\n        } else if (dealTypeFilter?.dealType === DealType.RENT) {\n            if (realtyType?.categoryType === RealtyObjectType.FLAT) {\n                return rentFlatMetadata;\n            } else if (realtyType?.categoryType === RealtyObjectType.ROOM) {\n                return rentRoomMetadata;\n            } else if (realtyType?.categoryType === RealtyObjectType.HOUSE) {\n                return rentHouseMetadata;\n            }\n\n            return rentFlatMetadata;\n        }\n\n        return sellFlatMetadata;\n    }\n\n    getAdditionalFilterIds(\n        filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n        exceptIds: Filters[] = []\n    ): Filters[] {\n        const additionalFilterIds = [ ...filters.keys() ].filter(id => {\n            const categoryFilter = filters.get(Filters.categoryType) as CategoryTypeFilter;\n            const isFlat = categoryFilter.categoryType === RealtyObjectType.FLAT;\n\n            return (\n                Filters.dealType !== id &&\n                Filters.categoryType !== id &&\n                Filters.newBuilding !== id &&\n                ! (isFlat && Filters.rooms === id) &&\n                Filters.price !== id &&\n                Filters.region !== id &&\n                ! exceptIds.includes(id)\n            );\n        });\n\n        return additionalFilterIds;\n    }\n\n    clearAdditionalFilters(\n        filters: Map<Filters, IFilter> = new Map<Filters, IFilter>(),\n        exceptIds: Filters[] = []\n    ): Map<Filters, IFilter> {\n        const additionalFilterIds = this.getAdditionalFilterIds(filters, exceptIds);\n\n        additionalFilterIds.forEach(id => {\n            filters.set(id, filters.get(id)!.create());\n        });\n\n        return filters;\n    }\n}\n\nexport const classifiedFilterFactory = new ClassifiedFilterFactory();\n","import { arrayStrToNum } from '@search/router/src';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { FinishingTypeEnum, WindowsDirectionSearchOffersEnum } from '@search/graphql-typings';\nimport {\n    AreaUnit,\n    BalconyOptions,\n    BankPledgeOptions,\n    Bathroom,\n    BathroomLocationOptions,\n    CeilingHeight,\n    CommissionType,\n    DealType,\n    DepositType,\n    ElectricityOptions,\n    FloorConstraints,\n    FurnitureOption,\n    GasOptions,\n    HeatingOptions,\n    HouseCategory,\n    InfrastructureOptions,\n    IsApartmentsOptions,\n    LandStatus,\n    LayoutImageOptions,\n    LiftOptions,\n    LivingFacilitiesOption,\n    LivingTenantOption,\n    NearbyOptions,\n    ParkingType,\n    PhotoOptions,\n    PrepaymentType,\n    RealtyObjectType, RenovationProgram,\n    SewerageOptions,\n    TimeLimit,\n    TransportType,\n    WallsType,\n    WaterOptions,\n    OnlineView,\n    BuildEpoch,\n    FinishingTypeOption,\n    Commissioning,\n    Quarter\n} from '@search/filter-enums/enums';\nimport {\n    ApartmentFilter,\n    AreaFilter,\n    AuthorFilter,\n    BalconyFilter,\n    BankPledgeOptionsFilter,\n    BathroomFilter,\n    BathroomLocationFilter,\n    CategoryTypeFilter,\n    CellHeightFilter,\n    DealTypeFilter,\n    Filters,\n    FloorFilter,\n    FloorsTotalFilter,\n    FurnitureFilter,\n    GeoFilter,\n    HeatingFilter,\n    HouseAreaFilter,\n    HouseCategoryFilter,\n    IFilter,\n    InfrastructureFilter,\n    KitchenAreaFilter,\n    LandAreaFilter,\n    LandStatusFilter,\n    LayoutImageOptionsFilter,\n    LivingAreaFilter,\n    LivingFacilityFilter,\n    LivingTenantOptionFilter,\n    MapBoundsFilter,\n    NearbySchoolFilter,\n    NewBuildingDataFilter,\n    NewBuildingFilter,\n    ParkingFilter,\n    PhotoOptionsFilter,\n    PriceFilter,\n    MortgagePaymentFilter,\n    RegionFilter,\n    RenovationFilter, RenovationProgramFilter,\n    RentConditionsFilter,\n    RentPrepaymentFilter,\n    RoomFilter,\n    RoomsInOfferFilter,\n    SellTypeFilter,\n    SeoMortgageAllowedFilter,\n    SupplyOptionsFilter,\n    TransportLimitFilter,\n    WallsTypeFilter,\n    WindowsDirectionFilter,\n    YearBuildingFilter,\n    SellerOrganizationNameFilter,\n    BuildEpochFilter,\n    OnlineViewFilter,\n    FinishingFilter,\n    ClCommisioninFilter,\n    CommissioningFilter\n} from '../../models/Filter';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\nexport interface IDeserializer {\n    keys: string[];\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    handler: (...args: any) => IFilter;\n}\n\nexport const filterDeserializers: Record<Filters, IDeserializer> = {\n    [Filters.heating]: {\n        keys: [ 'heating' ],\n        handler: ({ heating }) => {\n            if (heating) {\n                return new HeatingFilter(\n                    heating.map((item: string) => HeatingOptions[item])\n                );\n            }\n\n            return new HeatingFilter();\n        }\n    },\n    [Filters.bathroomLocation]: {\n        keys: [ 'bathroomLocation' ],\n        handler: ({ bathroomLocation }) => {\n            if (bathroomLocation) {\n                return new BathroomLocationFilter(\n                    bathroomLocation.map((item: string) => BathroomLocationOptions[item])\n                );\n            }\n\n            return new BathroomLocationFilter();\n        }\n    },\n    [Filters.houseArea]: {\n        keys: [ 'houseAreaMin', 'houseAreaMax' ],\n        handler: ({ houseAreaMin, houseAreaMax }) => {\n            return new HouseAreaFilter({\n                from: houseAreaMin || null,\n                to: houseAreaMax || null\n            });\n        }\n    },\n    [Filters.houseCategory]: {\n        keys: [ 'houseCategory' ],\n        handler: ({ houseCategory }) => {\n            if (houseCategory) {\n                return new HouseCategoryFilter(\n                    houseCategory.map((item: string) => HouseCategory[item])\n                );\n            }\n\n            return new HouseCategoryFilter();\n        }\n    },\n    [Filters.landStatus]: {\n        keys: [ 'landStatus' ],\n        handler: ({ landStatus }) => {\n            if (landStatus) {\n                return new LandStatusFilter(\n                    landStatus.map((item: string) => LandStatus[item])\n                );\n            }\n            return new LandStatusFilter();\n        }\n    },\n    [Filters.landArea]: {\n        keys: [ 'landAreaMin', 'landAreaMax' ],\n        handler: ({ landAreaMin, landAreaMax }) => {\n            return new LandAreaFilter({\n                from: landAreaMin || null,\n                to: landAreaMax || null\n            });\n        }\n\n    },\n    [Filters.dealType]: {\n        keys: [ 'dealType' ],\n        handler: ({ dealType }) => {\n            return new DealTypeFilter(dealType || DealType.SELL);\n        }\n    },\n    [Filters.categoryType]: {\n        keys: [ 'categoryType' ],\n        handler: ({ categoryType }) => {\n            return new CategoryTypeFilter(categoryType || RealtyObjectType.FLAT);\n        }\n    },\n    [Filters.newBuilding]: {\n        keys: [ 'newBuilding' ],\n        handler: ({ newBuilding }) => {\n            if (! newBuilding) {\n                return new NewBuildingFilter();\n            }\n\n            return new NewBuildingFilter(Array.isArray(newBuilding) ? newBuilding : [ newBuilding ]);\n        }\n    },\n    [Filters.totalArea]: {\n        keys: [ 'totalAreaMin', 'totalAreaMax' ],\n        handler: ({ totalAreaMin, totalAreaMax }) => {\n            return new AreaFilter({\n                from: totalAreaMin || null,\n                to: totalAreaMax || null\n            });\n        }\n    },\n    [Filters.rooms]: {\n        keys: [ 'rooms' ],\n        handler: ({ rooms }) => {\n            if (! rooms) {\n                return new RoomFilter();\n            }\n            return new RoomFilter(Array.isArray(rooms) ? rooms : [ rooms ]);\n        }\n    },\n    [Filters.roomsInOffer]: {\n        keys: [ 'roomsInOffer' ],\n        handler: ({ roomsInOffer }) => {\n            if (! roomsInOffer) {\n                return new RoomsInOfferFilter();\n            }\n\n            return new RoomsInOfferFilter(Array.isArray(roomsInOffer) ? roomsInOffer : [ roomsInOffer ]);\n        }\n    },\n    [Filters.region]: {\n        keys: [ 'region' ],\n        handler: ({ region }) => {\n            return new RegionFilter(region || RegionIdEnum.MSK);\n        }\n    },\n    [Filters.price]: {\n        keys: [ 'priceMin', 'priceMax', 'priceUnit' ],\n        handler: ({ priceMin, priceMax, priceUnit }) => {\n            let priceType: AreaUnit;\n\n            if (priceUnit === 'ALL') priceType = AreaUnit.UNKNOWN;\n            else priceType = AreaUnit[priceUnit];\n\n            return new PriceFilter(priceType, {\n                from: priceMin || null,\n                to: priceMax || null\n            });\n        }\n    },\n    [Filters.mortgagePayment]: {\n        keys: [ 'mortgagePayment' ],\n        handler: ({ mortgagePayment }) => new MortgagePaymentFilter(mortgagePayment)\n    },\n    [Filters.sellerOrganizationName]: {\n        keys: [ 'sellerOrganizationName' ],\n        handler: ({ sellerOrganizationName }) => {\n            return new SellerOrganizationNameFilter(sellerOrganizationName);\n        }\n    },\n    [Filters.livingArea]: {\n        keys: [ 'livingAreaMin', 'livingAreaMax' ],\n        handler: ({ livingAreaMin, livingAreaMax }) => {\n            return new LivingAreaFilter({\n                from: livingAreaMin || null,\n                to: livingAreaMax || null\n            });\n        }\n    },\n    [Filters.kitchenArea]: {\n        keys: [ 'kitchenAreaMin', 'kitchenAreaMax' ],\n        handler: ({ kitchenAreaMin, kitchenAreaMax }) => {\n            return new KitchenAreaFilter({\n                from: kitchenAreaMin || null,\n                to: kitchenAreaMax || null\n            });\n        }\n    },\n    [Filters.builtYear]: {\n        keys: [ 'builtYearMin', 'builtYearMax' ],\n        handler: ({ builtYearMin, builtYearMax }) => {\n            return new YearBuildingFilter({\n                from: builtYearMin || null,\n                to: builtYearMax || null\n            });\n        }\n    },\n    [Filters.floorsTotal]: {\n        keys: [ 'floorsTotalMin', 'floorsTotalMax' ],\n        handler: ({ floorsTotalMin, floorsTotalMax }) => {\n            return new FloorsTotalFilter({\n                from: floorsTotalMin || null,\n                to: floorsTotalMax || null\n            });\n        }\n    },\n    [Filters.supplyOptions]: {\n        keys: [\n            'gas',\n            'water',\n            'electricity',\n            'sewerage'\n        ],\n        handler: ({\n            gas,\n            water,\n            electricity,\n            sewerage\n        }) => {\n            return new SupplyOptionsFilter(\n                gas?.map(item => GasOptions[item]),\n                water?.map(item => WaterOptions[item]),\n                electricity?.map(item => ElectricityOptions[item]),\n                sewerage?.map(item => SewerageOptions[item])\n            );\n        }\n    },\n    [Filters.floor]: {\n        keys: [ 'floorMin', 'floorMax', 'last', 'first' ],\n        handler: ({ floorMin, floorMax, last, first }) => {\n            const lastValue = last === 'ONLY' ?\n                FloorConstraints.ONLY : last === 'EXCLUDE' ? FloorConstraints.EXCLUDE : undefined;\n            const firstValue = first === 'ONLY' ?\n                FloorConstraints.ONLY : first === 'EXCLUDE' ? FloorConstraints.EXCLUDE : undefined;\n\n            return new FloorFilter(\n                {\n                    from: floorMin || null,\n                    to: floorMax || null\n                },\n                firstValue,\n                lastValue\n            );\n        }\n    },\n    [Filters.cellHeight]: {\n        keys: [ 'cellHeight' ],\n        handler: ({ cellHeight }) => {\n            return new CellHeightFilter(CeilingHeight[cellHeight] as unknown as CeilingHeight);\n        }\n    },\n    [Filters.renovation]: {\n        keys: [ 'renovation' ],\n        handler: ({ renovation }) => {\n            if (! renovation) {\n                return new RenovationFilter();\n            }\n            return new RenovationFilter(renovation);\n        }\n    },\n    [Filters.bathroom]: {\n        keys: [ 'bathroom' ],\n        handler: ({ bathroom }) => {\n            if (! bathroom) {\n                return new BathroomFilter();\n            }\n\n            if (typeof bathroom === 'string') {\n                bathroom = [ bathroom ];\n            }\n\n            const result = bathroom.map((value: string) => {\n                switch (value) {\n                    case 'COMBINED':\n                        return Bathroom.COMBINED;\n                    case 'PARTED':\n                        return Bathroom.PARTED;\n                    case 'SEVERAL':\n                        return Bathroom.SEVERAL;\n                    default:\n                        return null;\n                }\n            });\n\n            return new BathroomFilter(result);\n        }\n    },\n    [Filters.transportLimit]: {\n        keys: [ 'transport', 'transportTimeLimit' ],\n        handler: ({ transport, transportTimeLimit }) => {\n            return new TransportLimitFilter(\n                TimeLimit[transportTimeLimit],\n                TransportType[transport]\n            );\n        }\n    },\n    [Filters.geo]: {\n        keys: [ 'metroIds', 'districtIds', 'addresses', 'newBuildingIds' ],\n        handler: ({ metroIds, districtIds, addresses, newBuildingIds }) => {\n            const parsedMetroIds = arrayStrToNum(metroIds);\n            const parsedDistrictIds = arrayStrToNum(districtIds);\n            const parsedAddressIds = arrayStrToNum(addresses);\n            const parsedNewBuildingIds = arrayStrToNum(newBuildingIds);\n\n            return new GeoFilter(\n                new Set([ ...parsedMetroIds, ...parsedDistrictIds, ...parsedAddressIds ]),\n                parsedMetroIds,\n                parsedDistrictIds,\n                parsedAddressIds,\n                parsedNewBuildingIds\n            );\n        }\n    },\n    [Filters.newBuildingData]: {\n        keys: [ 'newBuildingType', 'newBuildingName', 'newBuildingIds' ],\n        handler: ({\n            newBuildingType: type,\n            newBuildingName: name,\n            newBuildingIds: ids\n        }) => type && name && ids.length === 1 ?\n            new NewBuildingDataFilter({\n                id: ids[0],\n                type,\n                name\n            }) :\n            new NewBuildingDataFilter()\n    },\n    [Filters.livingFacility]: {\n        keys: [ 'livingFacility' ],\n        handler: ({ livingFacility }) => {\n            if (! livingFacility) {\n                return new LivingFacilityFilter();\n            }\n\n            return new LivingFacilityFilter(\n                livingFacility.map((item: keyof typeof LivingFacilitiesOption) => {\n                    return LivingFacilitiesOption[item];\n                })\n            );\n        }\n    },\n    [Filters.furniture]: {\n        keys: [ 'furniture' ],\n        handler: ({ furniture }) => {\n            if (! furniture) {\n                return new FurnitureFilter();\n            }\n\n            return new FurnitureFilter(\n                furniture.map((item: keyof typeof FurnitureOption) => {\n                    return FurnitureOption[item];\n                })\n            );\n        }\n    },\n    [Filters.finishingType]: {\n        keys: [ 'finishingType' ],\n        handler: ({ finishingType }) => {\n            if (! finishingType) {\n                return new FinishingFilter();\n            }\n\n            return new FinishingFilter(\n                finishingType.map((item: keyof typeof FinishingTypeOption) => {\n                    return FinishingTypeOption[item];\n                })\n            );\n        }\n    },\n    [Filters.livingTenantOptions]: {\n        keys: [ 'livingTenantOptions' ],\n        handler: ({ livingTenantOptions }) => {\n            if (! livingTenantOptions) {\n                return new LivingTenantOptionFilter();\n            }\n\n            return new LivingTenantOptionFilter(\n                livingTenantOptions.map((item: keyof typeof LivingTenantOption) => {\n                    return LivingTenantOption[item];\n                })\n            );\n        }\n    },\n    [Filters.rentConditions]: {\n        keys: [\n            'utilitiesIncluded',\n            'commisionType',\n            'depositType'\n        ],\n        handler: ({\n            utilitiesIncluded,\n            depositType,\n            commisionType\n        }) => {\n            return new RentConditionsFilter(\n                utilitiesIncluded,\n                DepositType[depositType],\n                CommissionType[commisionType]\n            );\n        }\n    },\n    [Filters.rentPrepayment]: {\n        keys: [ 'rentPrepayment' ],\n        handler: ({\n            rentPrepayment\n        }: {\n            rentPrepayment?: keyof typeof PrepaymentType;\n        }) => {\n            if (! rentPrepayment) {\n                return new RentPrepaymentFilter();\n            }\n\n            return new RentPrepaymentFilter(\n                PrepaymentType[rentPrepayment]\n            );\n        }\n    },\n    [Filters.walls]: {\n        keys: [ 'walls' ],\n        handler: ({\n            walls\n        }) => {\n            if (! walls) {\n                return new WallsTypeFilter();\n            }\n\n            return new WallsTypeFilter(\n                walls.map((item: keyof typeof WallsType) => {\n                    return WallsType[item];\n                })\n            );\n        }\n    },\n    [Filters.parkings]: {\n        keys: [ 'parkings' ],\n        handler: ({\n            parkings\n        }) => {\n            if (! parkings) {\n                return new ParkingFilter();\n            }\n\n            return new ParkingFilter(\n                parkings.map((item: keyof typeof ParkingType) => {\n                    return ParkingType[item];\n                })\n            );\n        }\n    },\n    [Filters.author]: {\n        keys: [ 'author' ],\n        handler: ({\n            author\n        }) => {\n            return new AuthorFilter(author);\n        }\n    },\n    [Filters.sellType]: {\n        keys: [ 'sellType' ],\n        handler: ({\n            sellType\n        }) => {\n            return new SellTypeFilter(sellType);\n        }\n    },\n    [Filters.balcony]: {\n        keys: [ 'balcony' ],\n        handler: ({\n            balcony\n        }: {\n            balcony?: keyof typeof BalconyOptions;\n        }) => {\n            if (! balcony) {\n                return new BalconyFilter();\n            }\n\n            return new BalconyFilter(\n                BalconyOptions[balcony]\n            );\n        }\n    },\n    [Filters.photoOptions]: {\n        keys: [ 'photoOptions' ],\n        handler: ({\n            photoOptions\n        }: {\n            photoOptions?: keyof typeof PhotoOptions;\n        }) => {\n            if (! photoOptions) {\n                return new PhotoOptionsFilter();\n            }\n\n            return new PhotoOptionsFilter(\n                PhotoOptions[photoOptions]\n            );\n        }\n    },\n    [Filters.layoutImageOptions]: {\n        keys: [ 'layoutImageOptions' ],\n        handler: ({\n            layoutImageOptions = []\n        }) => {\n            return new LayoutImageOptionsFilter(\n                layoutImageOptions.map((item: number) => {\n                    return LayoutImageOptions[item];\n                })\n            );\n        }\n    },\n    [Filters.bankPledgeOptions]: {\n        keys: [ 'bankPledgeOptions' ],\n        handler: ({\n            bankPledgeOptions\n        }: {\n            bankPledgeOptions?: keyof typeof BankPledgeOptions;\n        }) => {\n            if (! bankPledgeOptions) {\n                return new BankPledgeOptionsFilter();\n            }\n\n            return new BankPledgeOptionsFilter(\n                BankPledgeOptions[bankPledgeOptions]\n            );\n        }\n    },\n    [Filters.nearbyOptions]: {\n        keys: [ 'nearbyOptions' ],\n        handler: ({\n            nearbyOptions\n        }: {\n            nearbyOptions?: keyof typeof NearbyOptions;\n        }) => {\n            if (! nearbyOptions) {\n                return new NearbySchoolFilter();\n            }\n\n            return new NearbySchoolFilter(\n                NearbyOptions[nearbyOptions]\n            );\n        }\n    },\n    [Filters.renovationProgram]: {\n        keys: [ 'renovationProgram' ],\n        handler: ({\n            renovationProgram\n        }: {\n            renovationProgram?: keyof typeof RenovationProgram;\n        }) => {\n            if (! renovationProgram) {\n                return new RenovationProgramFilter();\n            }\n\n            return new RenovationProgramFilter(\n                RenovationProgram[renovationProgram]\n            );\n        }\n    },\n    [Filters.seoMortgageAllowed]: {\n        keys: [ 'seoMortgageAllowed' ],\n        handler: ({\n            seoMortgageAllowed\n        }: {\n            seoMortgageAllowed?: boolean;\n        }) => {\n            return new SeoMortgageAllowedFilter(seoMortgageAllowed);\n        }\n    },\n    [Filters.apartments]: {\n        keys: [ 'apartments' ],\n        handler: ({\n            apartments\n        }: {\n            apartments?: keyof typeof IsApartmentsOptions;\n        }) => {\n            if (! apartments) {\n                return new ApartmentFilter();\n            }\n\n            return new ApartmentFilter(\n                IsApartmentsOptions[apartments]\n            );\n        }\n    },\n    [Filters.infrastructure]: {\n        keys: [ 'infrastructure', 'hasLift' ],\n        handler: ({\n            infrastructure = [],\n            hasLift\n        }: {\n            infrastructure: (keyof typeof InfrastructureOptions)[];\n            hasLift: keyof typeof LiftOptions;\n        }) => {\n            return new InfrastructureFilter(\n                infrastructure.map(item => InfrastructureOptions[item]),\n                LiftOptions[hasLift]\n            );\n        }\n    },\n    [Filters.mapBounds]: {\n        keys: [ 'mapBounds' ],\n        handler: ({ mapBounds }) => {\n            return new MapBoundsFilter(mapBounds?.bounds, mapBounds?.polygon, mapBounds?.geohash);\n        }\n    },\n    [Filters.windowsDirection]: {\n        keys: [ 'windowsDirection' ],\n        handler: ({ windowsDirection }) => {\n            if (! windowsDirection) {\n                return new WindowsDirectionFilter();\n            }\n\n            const result = windowsDirection.map((value: string) => {\n                switch (value) {\n                    case 'BOTH':\n                        return WindowsDirectionSearchOffersEnum.Both;\n                    case 'FRONT':\n                        return WindowsDirectionSearchOffersEnum.Front;\n                    case 'REAR':\n                        return WindowsDirectionSearchOffersEnum.Rear;\n                    default:\n                        return null;\n                }\n            });\n\n            return new WindowsDirectionFilter(result);\n        }\n    },\n    [Filters.buildEpoch]: {\n        keys: [ 'buildEpoch' ],\n        handler: ({ buildEpoch }) => {\n            if (! buildEpoch) return new BuildEpochFilter();\n\n            return new BuildEpochFilter(\n                buildEpoch.map((item: keyof typeof BuildEpoch) => {\n                    return BuildEpoch[item];\n                })\n            );\n        }\n    },\n    [Filters.onlineView]: {\n        keys: [ 'onlineView' ],\n        handler: ({ onlineView }: { onlineView: keyof typeof OnlineView}) => {\n            if (! onlineView) return new OnlineViewFilter();\n\n            return new OnlineViewFilter(OnlineView[onlineView]);\n        }\n    },\n    [Filters.commissioning]: {\n        keys: [ 'commissioning' ],\n        handler: ({ commissioning }) => new CommissioningFilter(commissioning)\n    }\n};\n","/* eslint-disable max-len */\n/* eslint-disable no-nested-ternary */\nimport {\n    LiftOptions,\n    InfrastructureOptions,\n    IsApartmentsOptions,\n    PhotoOptions,\n    BalconyOptions,\n    ParkingType,\n    WallsType,\n    PrepaymentType,\n    CommissionType,\n    DepositType,\n    LivingTenantOption,\n    FurnitureOption,\n    LivingFacilitiesOption,\n    AreaUnit,\n    FloorConstraints,\n    CeilingHeight,\n    Bathroom,\n    TransportType,\n    TimeLimit,\n    GasOptions,\n    WaterOptions,\n    ElectricityOptions,\n    SewerageOptions,\n    LandStatus,\n    HouseCategory,\n    BathroomLocationOptions,\n    HeatingOptions,\n    BankPledgeOptions,\n    LayoutImageOptions,\n    NearbyOptions,\n    RenovationProgram,\n    OnlineView,\n    BuildEpoch,\n    FinishingTypeOption\n} from '@search/filter-enums/enums';\nimport { WindowsDirectionSearchOffersEnum } from '@search/graphql-typings';\nimport {\n    Filters,\n    DealTypeFilter,\n    CategoryTypeFilter,\n    AreaFilter,\n    RoomFilter,\n    PriceFilter,\n    MortgagePaymentFilter,\n    LivingAreaFilter,\n    KitchenAreaFilter,\n    YearBuildingFilter,\n    FloorFilter,\n    CellHeightFilter,\n    RenovationFilter,\n    BathroomFilter,\n    NewBuildingFilter,\n    RegionFilter,\n    GeoFilter,\n    NewBuildingDataFilter,\n    FloorsTotalFilter,\n    LivingFacilityFilter,\n    FurnitureFilter,\n    LivingTenantOptionFilter,\n    RentConditionsFilter,\n    RentPrepaymentFilter,\n    WallsTypeFilter,\n    ParkingFilter,\n    BalconyFilter,\n    PhotoOptionsFilter,\n    ApartmentFilter,\n    InfrastructureFilter,\n    AuthorFilter,\n    SellTypeFilter,\n    TransportLimitFilter,\n    RoomsInOfferFilter,\n    LandAreaFilter,\n    LandStatusFilter,\n    SupplyOptionsFilter,\n    HouseCategoryFilter,\n    HouseAreaFilter,\n    HeatingFilter,\n    BathroomLocationFilter,\n    MapBoundsFilter,\n    BankPledgeOptionsFilter,\n    LayoutImageOptionsFilter,\n    WindowsDirectionFilter,\n    SeoMortgageAllowedFilter,\n    RenovationProgramFilter,\n    NearbySchoolFilter,\n    SellerOrganizationNameFilter,\n    BuildEpochFilter,\n    OnlineViewFilter,\n    FinishingFilter,\n    ClCommisioninFilter,\n    CommissioningFilter\n} from '../../models/Filter';\n\nexport const filterSerializers: Record<Filters, Function> = {\n    [Filters.heating]: (filter: HeatingFilter) => {\n        return filter?.heating?.map(item => HeatingOptions[item]);\n    },\n    [Filters.bathroomLocation]: (filter: BathroomLocationFilter) => {\n        return filter?.locations?.map(item => BathroomLocationOptions[item]);\n    },\n    [Filters.houseArea]: (filter: HouseAreaFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const value = filter.value;\n\n        return {\n            houseAreaMin: value.from,\n            houseAreaMax: value.to\n        };\n    },\n    [Filters.houseCategory]: (filter: HouseCategoryFilter) => {\n        return filter?.categories?.map(item => HouseCategory[item]);\n    },\n    [Filters.landStatus]: (filter: LandStatusFilter) => {\n        if (! filter) {\n            return null;\n        }\n\n        return filter.landStatuses.map(item => LandStatus[item]);\n    },\n\n    [Filters.supplyOptions]: (filter: SupplyOptionsFilter) => {\n        if (! filter) {\n            return null;\n        }\n        return {\n            gas: filter.gas.map(item => GasOptions[item]),\n            water: filter.water.map(item => WaterOptions[item]),\n            electricity: filter.electricity.map(item => ElectricityOptions[item]),\n            sewerage: filter.sewerage.map(item => SewerageOptions[item])\n        };\n    },\n    [Filters.landArea]: (filter: LandAreaFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const value = filter.value;\n\n        return {\n            landAreaMin: value.from,\n            landAreaMax: value.to\n        };\n    },\n    [Filters.dealType]: (filter: DealTypeFilter) => {\n        return filter && filter.dealType;\n    },\n    [Filters.transportLimit]: (filter: TransportLimitFilter) => {\n        if (filter) {\n            return {\n                transport: TransportType[filter.transportType!],\n                transportTimeLimit: TimeLimit[filter.timeLimit!]\n            };\n        }\n\n        return null;\n    },\n    [Filters.categoryType]: (filter: CategoryTypeFilter) => {\n        return filter.categoryType;\n    },\n    [Filters.totalArea]: (filter: AreaFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const value = filter.value;\n\n        return {\n            totalAreaMin: value.from,\n            totalAreaMax: value.to\n        };\n    },\n    [Filters.rooms]: (filter: RoomFilter) => {\n        return filter && filter.rooms.map(room => {\n            return room;\n        });\n    },\n    [Filters.roomsInOffer]: (filter: RoomsInOfferFilter) => {\n        if (! filter) {\n            return [];\n        }\n        return filter.roomsInOffer.map(room => {\n            return room;\n        });\n    },\n    [Filters.region]: (filter: RegionFilter) => {\n        return filter.region;\n    },\n    [Filters.price]: (filter: PriceFilter) => {\n        const { from, to } = filter.value;\n        let priceUnit: string;\n\n        switch (filter.priceType) {\n            case AreaUnit.UNKNOWN:\n                priceUnit = 'ALL';\n                break;\n            case AreaUnit.ARE:\n                priceUnit = 'ARE';\n                break;\n            case AreaUnit.HECTARE:\n                priceUnit = 'HECTARE';\n                break;\n            case AreaUnit.METER:\n                priceUnit = 'METER';\n                break;\n            case AreaUnit.MORTGAGE_PAYMENT:\n                priceUnit = 'MORTGAGE_PAYMENT';\n                break;\n            default:\n                priceUnit = 'UNKNOWN';\n        }\n\n        return {\n            priceMin: from,\n            priceMax: to,\n            priceUnit\n        };\n    },\n    [Filters.mortgagePayment]: (filter: MortgagePaymentFilter) => filter?.payment,\n    [Filters.livingArea]: (filter: LivingAreaFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const { from, to } = filter.value;\n\n        return {\n            livingAreaMin: from,\n            livingAreaMax: to\n        };\n    },\n    [Filters.kitchenArea]: (filter: KitchenAreaFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const { from, to } = filter.value;\n\n        return {\n            kitchenAreaMin: from,\n            kitchenAreaMax: to\n        };\n    },\n    [Filters.builtYear]: (filter: YearBuildingFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const { from, to } = filter.value;\n\n        return {\n            builtYearMin: from,\n            builtYearMax: to\n        };\n    },\n    [Filters.floor]: (filter: FloorFilter) => {\n        if (! filter) {\n            return null;\n        }\n\n        const { from, to } = filter.range;\n        const last = filter.last === FloorConstraints.ONLY ? 'ONLY' :\n            filter.last === FloorConstraints.EXCLUDE ? 'EXCLUDE' : null;\n        const first = filter.first === FloorConstraints.ONLY ? 'ONLY' :\n            filter.first === FloorConstraints.EXCLUDE ? 'EXCLUDE' : null;\n\n        return {\n            floorMin: from,\n            floorMax: to,\n            last,\n            first\n        };\n    },\n    [Filters.floorsTotal]: (filter: FloorsTotalFilter) => {\n        if (! filter) {\n            return null;\n        }\n        const { from, to } = filter.range;\n\n        return {\n            floorsTotalMin: from,\n            floorsTotalMax: to\n        };\n    },\n    [Filters.cellHeight]: (filter: CellHeightFilter) => {\n        if (! filter) {\n            return null;\n        }\n\n        switch (filter.value) {\n            case CeilingHeight.FROM_2_5:\n                return 'FROM_2_5';\n            case CeilingHeight.FROM_2_7:\n                return 'FROM_2_7';\n            case CeilingHeight.FROM_3:\n                return 'FROM_3';\n\n            case CeilingHeight.FROM_4:\n                return 'FROM_4';\n            default: return null;\n        }\n    },\n    [Filters.renovation]: (filter: RenovationFilter) => {\n        return filter && filter.value;\n    },\n    [Filters.newBuilding]: (filter: NewBuildingFilter) => {\n        if (! filter) {\n            return null;\n        }\n        return filter.newBuilding;\n    },\n    [Filters.bathroom]: (filter: BathroomFilter) => {\n        return filter && filter.value.map(value => {\n            switch (value) {\n                case Bathroom.COMBINED:\n                    return 'COMBINED';\n                case Bathroom.PARTED:\n                    return 'PARTED';\n                case Bathroom.SEVERAL:\n                    return 'SEVERAL';\n                default:\n                    return null;\n            }\n        });\n    },\n    [Filters.geo]: (filter: GeoFilter) => ({\n        metroIds: filter.metroIds.slice(),\n        districtIds: filter.districtIds.slice(),\n        addresses: filter.addressIds.slice(),\n        newBuildingIds: filter.newBuildingIds.slice()\n    }),\n    [Filters.newBuildingData]: (filter: NewBuildingDataFilter) => ({\n        newBuildingType: filter?.newBuilding?.type,\n        newBuildingName: filter?.newBuilding?.name\n    }),\n    [Filters.livingFacility]: (filter: LivingFacilityFilter) => {\n        if (! filter) {\n            return [];\n        }\n        return filter.facilities.map(facility => {\n            return LivingFacilitiesOption[facility];\n        });\n    },\n    [Filters.furniture]: (filter: FurnitureFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.furnitures.map(furniture => {\n            return FurnitureOption[furniture];\n        });\n    },\n    [Filters.finishingType]: (filter: FinishingFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.finishingType.map(type => {\n            return FinishingTypeOption[type];\n        });\n    },\n    [Filters.livingTenantOptions]: (filter: LivingTenantOptionFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.livingTenantOptions.map(option => {\n            return LivingTenantOption[option];\n        });\n    },\n    [Filters.rentConditions]: (filter: RentConditionsFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return {\n            utilitiesIncluded: filter.utilitiesIncluded || undefined,\n            commisionType: filter.commisionType === CommissionType.UNKNOWN ? undefined : CommissionType[filter.commisionType],\n            depositType: filter.depositType === DepositType.UNKNOWN ? undefined : DepositType[filter.depositType]\n        };\n    },\n    [Filters.rentPrepayment]: (filter: RentPrepaymentFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return PrepaymentType[filter.prePaymentType];\n    },\n    [Filters.walls]: (filter: WallsTypeFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.walls.map(wall => {\n            return WallsType[wall];\n        });\n    },\n    [Filters.parkings]: (filter: ParkingFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.parkings.map(parking => {\n            return ParkingType[parking];\n        });\n    },\n    [Filters.author]: (filter: AuthorFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.author;\n    },\n    [Filters.sellType]: (filter: SellTypeFilter) => {\n        if (! filter) {\n            return [];\n        }\n\n        return filter.sellType;\n    },\n    [Filters.balcony]: (filter: BalconyFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return BalconyOptions[filter.hasBalcony];\n    },\n    [Filters.photoOptions]: (filter: PhotoOptionsFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return PhotoOptions[filter.photoOption];\n    },\n    [Filters.renovationProgram]: (filter: RenovationProgramFilter) => {\n        if (! filter) return;\n\n        return RenovationProgram[filter.willRenovation];\n    },\n    [Filters.nearbyOptions]: (filter: NearbySchoolFilter) => {\n        if (! filter) return;\n\n        return NearbyOptions[filter.hasNearbySchool];\n    },\n    [Filters.layoutImageOptions]: (filter: LayoutImageOptionsFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return filter.layoutImageOption.map(option => {\n            return LayoutImageOptions[option];\n        });\n    },\n    [Filters.seoMortgageAllowed]: (filter: SeoMortgageAllowedFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return filter.isAllowed;\n    },\n    [Filters.bankPledgeOptions]: (filter: BankPledgeOptionsFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return BankPledgeOptions[filter.bankPledgeOption];\n    },\n    [Filters.apartments]: (filter: ApartmentFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        if (filter.isApartment === IsApartmentsOptions.UNKNOWN) {\n            return;\n        }\n\n        return IsApartmentsOptions[filter.isApartment];\n    },\n    [Filters.infrastructure]: (filter: InfrastructureFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return {\n            hasLift: LiftOptions[filter.hasLift] || undefined,\n            infrastructure: filter.infrastructure.map(infra => {\n                return InfrastructureOptions[infra];\n            })\n        };\n    },\n    [Filters.windowsDirection]: (filter: WindowsDirectionFilter) => {\n        return filter && filter.value.map(value => {\n            switch (value) {\n                case WindowsDirectionSearchOffersEnum.Both:\n                    return 'BOTH';\n                case WindowsDirectionSearchOffersEnum.Front:\n                    return 'FRONT';\n                case WindowsDirectionSearchOffersEnum.Rear:\n                    return 'REAR';\n                default:\n                    return null;\n            }\n        });\n    },\n    [Filters.sellerOrganizationName]: (filter: SellerOrganizationNameFilter) => {\n        if (! filter) return null;\n\n        return filter.sellerOrganizationName;\n    },\n    [Filters.mapBounds]: (filter: MapBoundsFilter) => {\n        if (! filter) {\n            return;\n        }\n\n        return {\n            mapBounds: {\n                bounds: filter.bounds,\n                polygon: filter.polygon,\n                geohash: filter.geohash\n            }\n        };\n    },\n    [Filters.buildEpoch]: (filter: BuildEpochFilter) => {\n        if (! filter) return [];\n\n        return filter.buildEpoch.map(epoch => {\n            return BuildEpoch[epoch];\n        });\n    },\n    [Filters.onlineView]: (filter: OnlineViewFilter) => {\n        if (! filter) return;\n\n        return OnlineView[filter.onlineView];\n    },\n    [Filters.commissioning]: (filter: CommissioningFilter) => {\n        if (! filter) return;\n\n        return filter.commissioning;\n    }\n};\n","import { YMapBounds } from '@search/ymap/src/bounds';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nexport const offerYMapPresetBounds: Record<number, YMapBounds> = {\n    [RegionIdEnum.SPB]: {\n        min: { x: 29.812084, y: 59.808254 },\n        max: { x: 30.828319, y: 60.059460 }\n    },\n    [RegionIdEnum.SPB_AND_LEN_OBL]: {\n        min: { x: 29.812084, y: 59.808254 },\n        max: { x: 30.828319, y: 60.059460 }\n    },\n    [RegionIdEnum.LEN_OBL]: {\n        min: { x: 29.812084, y: 59.808254 },\n        max: { x: 30.828319, y: 60.059460 }\n    },\n    [RegionIdEnum.MSK]: {\n        min: { x: 37.488248, y: 55.585993 },\n        max: { x: 37.74574, y: 55.875427 }\n    },\n    [RegionIdEnum.MSK_AND_MSK_OBL]: {\n        min: { x: 35.710134, y: 55.124008 },\n        max: { x: 39.341116, y: 56.287049 }\n    },\n    [RegionIdEnum.MSK_OBL]: {\n        min: { x: 35.710134, y: 55.124008 },\n        max: { x: 39.341116, y: 56.287049 }\n    }\n};\n","/* eslint-disable max-len */\n/* eslint-disable curly, complexity */\nimport upperFirst from 'lodash/upperFirst';\nimport { NewBuilding } from '@search/filter-enums/enums/NewBuilding';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { PriceSeoMatcher } from '@search/offer-search-routes/src/searchRoute/PriceSeoMatcher';\nimport { BuildEpochSeoMatcher } from '@search/offer-search-routes/src/searchRoute/BuildEpochSeoMatcher';\nimport { AuthorTypeOptionsWithRealtor, RealtyObjectType, Renovation, Rooms } from '@search/filter-enums/enums';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { seoSearchCommon, seoSearchCommonJoin, SeoSearchCommonProps } from './seoSearchCommon';\n\nexport function seoSearchFlatRoom({ params, geos, offersCount, offersSummary, region }: SeoSearchCommonProps) {\n    const segment = params.segments;\n    const {\n        conciergeText,\n        hasLiftText,\n        balconyText,\n\n        dealTypeText,\n        geoText,\n        regionText,\n        additionalRegionText,\n        offersCountText,\n        nearMetroText,\n        priceMaxText,\n        parkingText,\n        rentPaymentText,\n        seoMortgage,\n        generateFaqTexts,\n        isNonCapitalRegion\n    } = seoSearchCommon({ params, geos, offersCount, offersSummary, region });\n\n    let roomCount = 0;\n    const roomType = params.categoryType === RealtyObjectType.ROOM ? undefined : params?.segments?.rooms?.[0];\n\n    if (roomType === Rooms.ROOM_1) roomCount = 1;\n    if (roomType === Rooms.ROOM_2) roomCount = 2;\n    if (roomType === Rooms.ROOM_3) roomCount = 3;\n    if (roomType === Rooms.ROOM_4) roomCount = 4;\n\n    const roomsText = getFlatRoomCategoryText(params, roomCount, roomType);\n    const roomsFullText = getFlatCategoryFullText(params, roomCount);\n\n    const noClientCommision = params?.commisionType === 'NO_CLIENT_COMMISSION' ? 'без комиссии' : '';\n    let petsAllowed = {\n        accusative: '',\n        plural: ''\n    };\n    const withoutDeposit = params?.depositType === 'NO_DEPOSIT' ? 'без залога' : '';\n\n    if (params?.livingTenantOptions && params?.livingTenantOptions.includes('PETS_ALLOWED')) {\n        petsAllowed = {\n            accusative: ', в которой можно жить с животными',\n            plural: ', в которых можно жить с животными'\n        };\n    }\n\n    if (params?.livingTenantOptions && params?.livingTenantOptions.includes('CHILDREN_ALLOWED')) {\n        petsAllowed = {\n            accusative: ', в которой можно жить с детьми',\n            plural: ', в которых можно жить с детьми'\n        };\n    }\n\n    if (! params?.livingTenantOptions || params?.livingTenantOptions?.length > 1) {\n        petsAllowed = {\n            accusative: '',\n            plural: ''\n        };\n    }\n\n    let newBuildingText = {\n        accusative: '',\n        plural: '',\n        prepositional: ''\n    };\n\n    const nb = segment?.newBuilding?.[0];\n\n    if (nb === NewBuilding.NEW) newBuildingText = {\n        accusative: 'в\\u00A0новостройке',\n        plural: 'новостроек',\n        prepositional: 'в\\u00A0новостройках'\n    };\n\n    if (nb === NewBuilding.SECOND) newBuildingText = {\n        accusative: 'на\\u00A0вторичке',\n        plural: 'вторичек',\n        prepositional: 'на\\u00A0вторичном рынке жилья'\n    };\n\n    let renovationText = '';\n    const renovation = segment?.renovation?.[0];\n\n    if (renovation === Renovation.COSMETIC) renovationText = 'с\\u00A0косметическим ремонтом';\n    if (renovation === Renovation.DESIGNED) renovationText = 'с\\u00A0дизайнерским ремонтом';\n    if (renovation === Renovation.EURO) renovationText = 'с\\u00A0евроремонтом';\n    if (renovation === Renovation.NEED) renovationText = 'с\\u00A0ремонтом';\n    if (renovation === Renovation.NONE) renovationText = 'без\\u00A0ремонта';\n\n    let securityText = '';\n\n    if (segment?.infrastructure?.includes('CLOSED_AREA')) securityText = 'с охраняемой территорией';\n\n    let renovationProgramText = '';\n\n    if (segment?.renovationProgram === 'HAS_ANY') renovationProgramText = 'под реновацию';\n\n    let pledgeText = '';\n\n    if (segment?.bankPledgeOptions === 'IN_PLEDGE') pledgeText = 'в\\u00A0залоге';\n\n    const authorText = segment?.author?.includes(AuthorTypeOptionsWithRealtor.OWNER) ? 'от\\u00A0собственника' : '';\n    let bathroomText = '';\n    let furnitureText = '';\n\n    if (segment?.bathroom?.includes('PARTED')) bathroomText = 'с\\u00A0раздельным санузлом';\n    if (segment?.bathroom?.includes('COMBINED')) bathroomText = 'с\\u00A0совмещенным санузлом';\n\n    if (segment?.furniture?.includes('NO')) furnitureText = 'без мебели';\n    if (segment?.furniture?.includes('ALL')) furnitureText = 'с\\u00A0мебелью';\n    if (segment?.furniture?.includes('ALL') &&\n        params?.dealType === DealType.SELL &&\n        params?.categoryType === RealtyObjectType.FLAT) furnitureText = 'с\\u00A0ремонтом и\\u00A0мебелью';\n\n    let priceLevelText = {\n        accusative: '',\n        plural: '',\n        nominative: '',\n        genitive: ''\n    };\n    let priceClassText = {\n        accusative: '',\n        plural: ''\n    };\n\n    const priceSeo = PriceSeoMatcher.$.match({\n        categoryType: params.categoryType ?? RealtyObjectType.FLAT,\n        dealType: params.dealType as DealType ?? DealType.SELL,\n        priceMax: segment?.priceMax,\n        priceMin: segment?.priceMin,\n        region: params.region,\n        regionTranslit: region?.translit\n    });\n\n    if (priceSeo?.seg === 'deshevye') {\n        priceClassText = {\n            accusative: ' дешёвую',\n            plural: ' дешёвых'\n        };\n        priceLevelText = {\n            accusative: 'недорогую',\n            plural: 'недорогих',\n            nominative: 'недорогая',\n            genitive: 'недорогой'\n        };\n    }\n\n    if (priceSeo?.seg === 'elitnye') {\n        priceClassText = {\n            accusative: ' элитную',\n            plural: ' элитных'\n        };\n        priceLevelText = {\n            accusative: 'элитную',\n            plural: 'дорогих',\n            nominative: 'элитная',\n            genitive: 'элитной'\n        };\n    }\n\n    const etazhText = seoSearchCommonJoin(\n        segment?.floorMax === 1 ? 'на\\u00A0первом этаже' : '',\n        segment?.floorMax && segment?.floorMin && segment?.floorMax === segment?.floorMin && FLOOR_NAME_MAP.has(segment.floorMax) && FLOOR_NAME_MAP.has(segment.floorMin) ?\n            `на\\u00A0${FLOOR_NAME_MAP.get(segment.floorMin)} этаже` : '',\n        segment?.last === 'ONLY' ? 'на\\u00A0последнем этаже' : '',\n    );\n\n    let buildEpochText: string;\n\n    const buildEpochSeo = BuildEpochSeoMatcher.$.match({\n        categoryType: params.categoryType ?? RealtyObjectType.FLAT,\n        dealType: params.dealType as DealType ?? DealType.SELL,\n        builtYearMin: segment?.builtYearMin,\n        builtYearMax: segment?.builtYearMax\n    });\n\n    switch (buildEpochSeo?.seg) {\n        case 'stalinka':\n            buildEpochText = 'в сталинке';\n\n            break;\n        case 'khrushchevka':\n            buildEpochText = 'в хрущевке';\n\n            break;\n        case 'brezhnevka':\n            buildEpochText = 'в брежневке';\n\n            break;\n        default:\n            buildEpochText = '';\n    }\n\n    const branch = geos.find(item => item.id === params.metroBranch);\n    const isCircle = branch?.id === 169286 || branch?.id === 169288 || branch?.id === 305;\n    const branchText = branch ? `${isCircle ? 'около' : 'на'} ${BRANCH_NAME_MAP.get(branch?.id)}${isCircle ? '' : ' ветке метро'}` : '';\n    const fullBranchName = isCircle ? `около ${CIRCLE_FULL_MAP.get(branch?.id)}` : branch?.locative ?? '';\n\n    const prefixCommon = seoSearchCommonJoin(\n        newBuildingText.accusative,\n        pledgeText,\n        seoMortgage,\n        authorText,\n        renovationText,\n        renovationProgramText,\n        bathroomText,\n        furnitureText,\n        buildEpochText,\n        conciergeText,\n        hasLiftText,\n        balconyText,\n        parkingText,\n        priceSeo?.seg ? '' : priceMaxText,\n        rentPaymentText,\n        securityText,\n        segment?.cellHeight === 'FROM_3' ? 'с\\u00A0высокими потолками' : '',\n        etazhText,\n        segment?.kitchenAreaMin === 15 ? 'с\\u00A0большой кухней' : '',\n        segment?.nearbyOptions === 'GOOD_SCHOOL' ? 'рядом со\\u00A0школой' : '',\n        nearMetroText,\n        geoText,\n        branchText\n    );\n\n    const priceLast = priceSeo?.seg === 'nedorogo' ? ' недорого' : '';\n    const premiumText = priceSeo?.seg === 'elitnye' ? 'премиум' : '';\n\n    const allCommon = `${seoSearchCommonJoin(\n        prefixCommon,\n        noClientCommision,\n        withoutDeposit,\n        regionText,\n    )}${petsAllowed.accusative} ${priceLast}`;\n\n    let pageTitle = seoSearchCommonJoin(\n        upperFirst(dealTypeText.verb),\n        priceClassText.accusative,\n        roomsText.alternativeAccusative,\n        allCommon\n    );\n\n    const descriptionTitle = seoSearchCommonJoin(\n        upperFirst(dealTypeText.verb),\n        priceClassText.accusative,\n        roomsText.accusative,\n        allCommon\n    ).replace(/городском округе/gi, 'районе');\n\n    let metaTitle = `${descriptionTitle}\\u00A0— ${\n        offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n        seoSearchCommonJoin(\n            premiumText,\n            roomsText.alternativePlural,\n            newBuildingText.prepositional,\n            furnitureText,\n            renovationText,\n            petsAllowed.plural,\n            buildEpochText,\n            fullBranchName,\n            premiumText ? '' : 'недорого',\n        )}: планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n\n    const isMalogabaritnaya = params?.segments?.totalAreaMax === 29 && roomCount < 2;\n    let metaDescription = `🏢 ${pageTitle}${additionalRegionText} на\\u00A0m2.ru. ➜ В\\u00A0каталоге недвижимости ${\n        offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n        seoSearchCommonJoin(\n            priceLevelText.plural,\n            isMalogabaritnaya ? 'квартир гостиничного типа' : roomsText.plural,\n            newBuildingText.prepositional,\n            etazhText,\n            pledgeText,\n            authorText,\n            renovationText,\n            furnitureText,\n            petsAllowed.plural,\n            buildEpochText,\n            fullBranchName,\n            regionText\n        )}. ✔ Описание и\\u00A0фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n\n    if (params.categoryType === RealtyObjectType.ROOM && params.dealType === DealType.SELL && isNonCapitalRegion) {\n        pageTitle = seoSearchCommonJoin(\n            upperFirst(dealTypeText.noun),\n            priceClassText.plural,\n            roomsText.alternativePlural,\n            allCommon\n        );\n\n        metaTitle = `${descriptionTitle} ${premiumText ? '' : 'недорого'}, объявления о\\u00A0${dealTypeText.prepositional} ${\n            seoSearchCommonJoin(\n                premiumText,\n                roomsText.alternativePlural,\n                newBuildingText.prepositional,\n                furnitureText,\n                renovationText,\n                petsAllowed.plural,\n                buildEpochText,\n                fullBranchName,\n            )} в квартире, планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n\n        const description = seoSearchCommonJoin(\n            upperFirst(dealTypeText.proposal),\n            priceClassText.accusative,\n            roomsText.alternativeAccusative,\n            allCommon\n        );\n\n        metaDescription = `${description}${additionalRegionText} в квартирах на вторичном рынке и в новостройках по доступной цене. В\\u00A0каталоге недвижимости ${\n            offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n            seoSearchCommonJoin(\n                priceLevelText.plural,\n                isMalogabaritnaya ? 'квартир гостиничного типа' : roomsText.plural,\n                newBuildingText.prepositional,\n                etazhText,\n                pledgeText,\n                authorText,\n                renovationText,\n                furnitureText,\n                petsAllowed.plural,\n                buildEpochText,\n                fullBranchName,\n                regionText\n            )} с описанием объектов, планировок, фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n    }\n\n    if (isMalogabaritnaya) {\n        const additionalTitle = seoSearchCommonJoin(\n            upperFirst(dealTypeText.verb),\n            priceClassText.accusative,\n            'малосемейку или гостинку (КГТ)',\n            allCommon\n        ).replace(/городском округе/gi, 'районе');\n\n        metaTitle = `${additionalTitle}\\u00A0— ${\n            offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n            seoSearchCommonJoin(\n                premiumText,\n                roomsText.plural,\n                newBuildingText.prepositional,\n                renovationText,\n                furnitureText,\n                buildEpochText,\n                premiumText ? '' : 'недорого',\n            )}: планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n    }\n\n    const relativeTitle = seoSearchCommonJoin(\n        upperFirst(dealTypeText.verb),\n        'похожую',\n        roomsText.accusative,\n        allCommon\n    );\n\n    // Костыль для административных округов Москвы\n    if (region?.id === RegionIdEnum.MSK) {\n        if (/в Центральном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Центральном административном округе/gi, 'в центре').replace(/недорого: планировки/gi, 'в ЦАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Центральном административном округе/gi, 'в центре (ЦАО)');\n        } else\n        if (/в Восточном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Восточном административном округе/gi, 'на востоке').replace(/недорого: планировки/gi, 'в ВАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Восточном административном округе/gi, 'на востоке (ВАО)');\n        } else\n        if (/в Северо-Восточном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Северо-Восточном административном округе/gi, 'на северо-востоке').replace(/недорого: планировки/gi, 'в СВАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Северо-Восточном административном округе/gi, 'на северо-востоке (СВАО)');\n        } else\n        if (/в Юго-Восточном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Юго-Восточном административном округе/gi, 'на юго-востоке').replace(/недорого: планировки/gi, 'в ЮВАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Юго-Восточном административном округе/gi, 'на юго-востоке (ЮВАО)');\n        } else\n        if (/в Западном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Западном административном округе/gi, 'на западе').replace(/недорого: планировки/gi, 'в ЗАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Западном административном округе/gi, 'на западе (ЗАО)');\n        } else\n        if (/в Северо-Западном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Северо-Западном административном округе/gi, 'на северо-западе').replace(/недорого: планировки/gi, 'в СЗАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Северо-Западном административном округе/gi, 'на северо-западе (СЗАО)');\n        } else\n        if (/в Юго-Западном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Юго-Западном административном округе/gi, 'на юго-западе').replace(/недорого: планировки/gi, 'в ЮЗАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Юго-Западном административном округе/gi, 'на юго-западе (ЮЗАО)');\n        } else\n        if (/в Южном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Южном административном округе/gi, 'на юге').replace(/недорого: планировки/gi, 'в ЮАО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Южном административном округе/gi, 'на юге (ЮАО)');\n        }\n        if (/Северном административном округе/.test(geoText)) {\n            metaTitle = metaTitle.replace(/в Северном административном округе/gi, 'на севере').replace(/недорого: планировки/gi, 'в САО недорого: планировки');\n            metaDescription = metaDescription.replace(/в Северном административном округе/gi, 'на севере (САО)');\n        }\n    }\n\n    return {\n        metaTitle,\n        metaDescription,\n        pageTitle,\n        relativeTitle,\n        faqTexts: generateFaqTexts({\n            prefixSegmentText: priceLevelText,\n            segmentText: roomsText,\n            commonPostfixText: allCommon,\n            segmentFullText: roomsFullText\n        })\n    };\n}\n\nconst getFlatRoomCategoryText = (params: SeoSearchCommonProps['params'], roomCount: number, roomType?: Rooms) => {\n    // eslint-disable-next-line prefer-const\n    let { roomsText, small } = getCommonFlatRoomCategoryText(params, roomCount);\n\n    if (params.categoryType === RealtyObjectType.ROOM) roomsText = {\n        accusative: 'комнату',\n        plural: 'комнат',\n        genitive: 'комнаты',\n        nominative: 'комната',\n        alternativeAccusative: 'комнату',\n        alternativePlural: 'комнат',\n    };\n\n    if (params?.segments?.apartments === 'APARTMENTS_ONLY') roomsText = {\n        accusative: 'квартиру-апартаменты',\n        plural: 'квартир-апартаментов',\n        genitive: 'квартиры-апартамента',\n        nominative: 'квартира-апартамент',\n        alternativeAccusative: 'квартиру-апартаменты',\n        alternativePlural: 'квартир-апартаментов',\n    };\n\n    if (roomCount > 0 && params.segments?.kitchenAreaMin !== 17) roomsText = {\n        accusative: `${roomCount}-комнатную ${roomsText.accusative}`,\n        plural: `${roomCount}-комнатных ${roomsText.plural}`,\n        genitive: `${roomCount}-комнатной ${roomsText.genitive}`,\n        nominative: `${roomCount}-комнатная ${roomsText.nominative}`,\n        alternativeAccusative: `${ROOM_TRANSLIT[roomCount]}комнатную ${roomsText.accusative}`,\n        alternativePlural: `${ROOM_TRANSLIT[roomCount]}комнатных ${roomsText.plural}`\n    };\n    if (roomType === Rooms.ROOM_5_AND_MORE) return {\n        accusative: `многокомнатную ${roomsText.accusative}`,\n        plural: `многокомнатных ${roomsText.plural}`,\n        genitive: `многокомнатной ${roomsText.genitive}`,\n        nominative: `многокомнатная ${roomsText.nominative}`,\n        alternativeAccusative: `многокомнатную ${roomsText.accusative}`,\n        alternativePlural: `многокомнатных ${roomsText.plural}`\n    };\n    if (roomType === Rooms.STUDIO && params?.segments?.apartments === 'APARTMENTS_ONLY') return {\n        accusative: 'апартаменты-студию',\n        plural: 'апартаментов-студий',\n        genitive: 'апартамента-студии',\n        nominative: 'апартамент-студия',\n        alternativeAccusative: 'апартаменты-студию',\n        alternativePlural: 'апартаментов-студий'\n    };\n    if (roomType === Rooms.STUDIO && params?.segments?.apartments !== 'APARTMENTS_ONLY') return {\n        accusative: `${small.accusative}студию`,\n        plural: `${small.plural}студий`,\n        genitive: `${small.genitive}студий`,\n        nominative: `${small.nominative}студия`,\n        alternativeAccusative: `${small.accusative}студию`,\n        alternativePlural: `${small.plural}студий`,\n    };\n    if (roomType === Rooms.OPEN_PLAN) return {\n        accusative: `${roomsText.accusative} со\\u00A0свободной планировкой`,\n        plural: `${roomsText.plural} со\\u00A0свободной планировкой`,\n        genitive: `${roomsText.genitive} со\\u00A0свободной планировкой`,\n        nominative: `${roomsText.nominative} со\\u00A0свободной планировкой`,\n        alternativeAccusative: `${roomsText.accusative} со\\u00A0свободной планировкой`,\n        alternativePlural: `${roomsText.plural} со\\u00A0свободной планировкой`,\n    };\n\n    return roomsText;\n};\n\n/**\n * Метод для предоставления полнотекстового варианта комнатности квартир\n * отдаёт НЕ \"1-комнатная\", а \"однокомнатная\" только для 1-4 комнтных.\n * https://jira.m2.ru/browse/RS-7098\n*/\n\nfunction getFlatCategoryFullText(params: SeoSearchCommonProps['params'], roomCount: number) {\n    const { roomsText } = getCommonFlatRoomCategoryText(params, roomCount);\n\n    const roomCountText = ROOM_TRANSLIT[roomCount];\n\n    if (roomCount > 0 && params.segments?.kitchenAreaMin !== 17) return {\n        accusative: `${roomCountText}комнатную ${roomsText.accusative}`,\n        plural: `${roomCountText}комнатных ${roomsText.plural}`,\n        genitive: `${roomCountText}комнатной ${roomsText.genitive}`,\n        nominative: `${roomCountText}комнатная ${roomsText.nominative}`\n    };\n}\n\nfunction getCommonFlatRoomCategoryText(params: SeoSearchCommonProps['params'], roomCount: number) {\n    const small = { accusative: '', plural: '', genitive: '', nominative: '' };\n\n    if (params?.segments?.totalAreaMax === 29 && roomCount < 2) {\n        small.accusative = 'малогабаритную\\u00A0';\n        small.plural = 'малогабаритных\\u00A0';\n        small.genitive = 'малогабаритной\\u00A0';\n        small.nominative = 'малогабаритная\\u00A0';\n    }\n\n    let flatText = { accusative: 'квартиру', plural: 'квартир', genitive: 'квартиры', nominative: 'квартира' };\n\n    if (params.segments?.kitchenAreaMin === 17) {\n        if (roomCount === 1) flatText = { accusative: 'еврооднушку', plural: 'еврооднушек', genitive: 'еврооднушки', nominative: 'еврооднушка' };\n        if (roomCount === 2) flatText = { accusative: 'евродвушку', plural: 'евродвушек', genitive: 'евродвушки', nominative: 'евродвушка' };\n        if (roomCount === 3) flatText = { accusative: 'евротрешку', plural: 'евротрешек', genitive: 'евротрешки', nominative: 'евротрешка' };\n    }\n\n    return {\n        small,\n        roomsText: {\n            accusative: `${small.accusative}${flatText.accusative}`,\n            plural: `${small.plural}${flatText.plural}`,\n            genitive: `${small.genitive}${flatText.genitive}`,\n            nominative: `${small.nominative}${flatText.nominative}`,\n            alternativeAccusative: `${small.accusative}${flatText.accusative}`,\n            alternativePlural: `${small.plural}${flatText.plural}`,\n        }\n    };\n}\n\nconst FLOOR_NAME_MAP = new Map([\n    [ 2, 'втором' ],\n    [ 3, 'третьем' ],\n    [ 4, 'четвёртом' ],\n    [ 5, 'пятом' ],\n    [ 6, 'шестом' ],\n    [ 7, 'седьмом' ],\n    [ 8, 'восьмом' ],\n    [ 9, 'девятом' ],\n    [ 10, 'десятом' ],\n    [ 11, 'одиннадцатом' ],\n    [ 12, 'двенадцатом' ],\n    [ 13, 'тринадцатом' ],\n    [ 14, 'четырнадцатом' ],\n    [ 15, 'пятнадцатом' ],\n    [ 16, 'шестнадцатом' ],\n    [ 17, 'семнадцатом' ],\n    [ 18, 'восемнадцатом' ],\n    [ 19, 'девятнадцатом' ],\n    [ 20, 'двадцатом' ],\n]);\n\nconst ROOM_TRANSLIT: Record<number, string> = {\n    1: 'одно',\n    2: 'двух',\n    3: 'трёх',\n    4: 'четырёх'\n};\n\nconst BRANCH_NAME_MAP = new Map([\n    [ 58, 'зеленой' ],\n    [ 4, 'красной' ],\n    [ 264, 'серой' ],\n    [ 158, 'оранжевой' ],\n    [ 101, 'синей' ],\n    [ 155, 'фиолетовой' ],\n    [ 271, 'салатовой' ],\n    [ 234, 'желтой' ],\n    [ 305, 'МЦК' ],\n    [ 169286, 'МЦД-1' ],\n    [ 169288, 'МЦД-2' ]\n]);\n\nconst CIRCLE_FULL_MAP = new Map([\n    [ 305, 'Московского центрального кольца' ],\n    [ 169286, 'Белорусско-Савёловского диаметра' ],\n    [ 169288, 'Курско-Рижского диаметра' ]\n]);\n","/* eslint-disable complexity */\nimport upperFirst from 'lodash/upperFirst';\nimport { AuthorTypeOptions } from '@search/filter-enums/enums';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\nimport { seoSearchCommon, seoSearchCommonJoin, SeoSearchCommonProps } from './seoSearchCommon';\n\nexport function seoSearchLand({ params, geos, offersCount, offersSummary, region }: SeoSearchCommonProps) {\n    const segment = params.segments;\n    const {\n        dealTypeText,\n        offersCountText,\n        geoText,\n        regionText,\n        nearMetroText,\n        priceMaxText,\n        generateFaqTexts,\n        minPriceText,\n        isNonCapitalRegion,\n        priceSeo\n    } = seoSearchCommon({ params, geos, offersCount, offersSummary, region });\n\n    const landText = {\n        accusative: 'участок',\n        plural: 'земельных участков',\n        genitive: 'участков земли',\n        nominative: 'земельный участок',\n        shortGenitive: 'участков'\n    };\n\n    const areText = segment?.landAreaMax && segment?.landAreaMin && segment?.landAreaMax === segment?.landAreaMin &&\n        areSeoChpuSet.has(segment.landAreaMax) && areSeoChpuSet.has(segment.landAreaMin) ?\n        `${segment.landAreaMax}\\u00A0${declensionByNumber(segment.landAreaMax, [ 'сотка', 'сотки', 'соток' ])}` :\n        '';\n\n    let landStatusText = '';\n    const ls = new Set(segment?.landStatus ?? []);\n\n    if (ls.has('IZHS')) landStatusText = 'ИЖС';\n    if (ls.has('DNP')) landStatusText = 'СНТ, ДНП';\n    if (ls.has('AGRICULTURAL')) landStatusText = 'ЛПХ';\n    if (ls.has('IZHS') && ls.has('DNP') && ls.has('SNT')) landStatusText = 'для\\u00A0ПМЖ';\n\n    let authorText = '';\n    const authorFirst = segment?.author?.[0];\n\n    // @ts-ignore\n    if (authorFirst === AuthorTypeOptions.AGENCY) authorText = 'от\\u00A0агентства';\n    // @ts-ignore\n    if (authorFirst === AuthorTypeOptions.OWNER) authorText = 'от\\u00A0собственника';\n\n    let communicationsText = '';\n\n    if (segment?.gas?.[0] && segment?.water?.[0]) {\n        communicationsText = 'с\\u00A0газом и\\u00A0водой';\n    } else {\n        if (segment?.water?.[0]) communicationsText = 'с\\u00A0водой';\n        if (segment?.gas?.[0]) communicationsText = 'с\\u00A0газом';\n    }\n    if (segment?.water?.[0]) communicationsText = 'с\\u00A0водой';\n    if (segment?.electricity?.[0]) communicationsText = 'с\\u00A0электричеством';\n    if (segment?.heating?.[0]) communicationsText = 'с\\u00A0отоплением';\n    if (segment?.sewerage?.[0]) communicationsText = 'с\\u00A0канализацией';\n    if (segment?.communications) communicationsText = 'с\\u00A0коммуникациями';\n\n    const villageText = priceSeo?.seg === 'v-derevne' ? 'в\\u00A0 деревне' : undefined;\n\n    const prefixCommon = seoSearchCommonJoin(\n        landStatusText,\n        areText,\n        authorText,\n        communicationsText,\n        villageText,\n        villageText ? undefined : priceMaxText,\n        nearMetroText,\n        geoText\n    );\n    const allCommon = `${prefixCommon}${regionText ? ' ' : ''}${regionText}`;\n\n    let pageTitle = seoSearchCommonJoin(upperFirst(dealTypeText.verb), landText.nominative, allCommon);\n\n    let metaTitle = `${pageTitle}\\u00A0— ${\n        offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n        seoSearchCommonJoin(\n            landText.plural,\n            landStatusText,\n            areText\n        )} недорого: планировки, цены и\\u00A0фото\\u00A0— m2.ru`;\n\n    let metaDescription = `🏡 ${pageTitle} по доступной цене. ➜ В\\u00A0каталоге недвижимости ${\n        offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n        seoSearchCommonJoin(\n            landText.genitive,\n            landStatusText,\n            areText,\n            regionText\n        )}. ✔ Описание и\\u00A0фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n\n    if (isNonCapitalRegion) {\n        pageTitle = seoSearchCommonJoin(upperFirst(dealTypeText.noun), landText.plural, allCommon);\n\n        const title = seoSearchCommonJoin(upperFirst(dealTypeText.verb), landText.nominative, allCommon);\n\n        metaTitle = `${title}, ${seoSearchCommonJoin(\n            dealTypeText.noun,\n            landText.plural,\n            landStatusText,\n            areText\n        )} недорого. Найдено ${offersCountText} о\\u00A0${dealTypeText.prepositional} ${landText.shortGenitive} ${allCommon}\n                `;\n        const description = seoSearchCommonJoin(upperFirst(dealTypeText.proposal), landText.nominative, allCommon);\n\n        metaDescription = `${description} по доступной цене. ➜ ${seoSearchCommonJoin(\n            pageTitle,\n            minPriceText\n        )} с описанием объектов, планировок и фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n    }\n\n    if (ls.has('IZHS')) {\n        metaTitle = metaTitle.replace(/земельных участков ИЖС/gi, 'земельных участков под строительство дома');\n        // eslint-disable-next-line max-len\n        metaDescription = `🏡 ${pageTitle.replace(/ИЖС/gi, 'под строительство дома')} по доступной цене. ➜ В\\u00A0каталоге недвижимости ${\n            offersCountText} о\\u00A0${dealTypeText.prepositional} ${\n            seoSearchCommonJoin(\n                landText.genitive,\n                landStatusText,\n                areText,\n                regionText\n            )}. ✔ Описание и\\u00A0фото. ✔ Отзывы покупателей. ✔ Расположение на\\u00A0карте.`;\n    }\n\n    const relativeTitle = seoSearchCommonJoin(upperFirst(dealTypeText.verb), 'похожий', landText.accusative, allCommon);\n\n    return {\n        metaTitle,\n        metaDescription,\n        pageTitle,\n        relativeTitle,\n        faqTexts: generateFaqTexts({ segmentText: landText, commonPostfixText: allCommon })\n    };\n}\n\nconst areSeoChpuSet = new Set([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 15, 20, 25, 30, 40, 50, 100 ]);\n","import { graphql } from '@search/gql-client/src';\n\nexport const SearchOffersCountQuery = graphql`query SearchOffersCountQuery(\n    $filters: ProfessionalSearchInput\n) {\n    searchOffersSummary(filters: $filters) {\n        count\n    }\n}\n`;\n","import React from 'react';\nimport { UseAuthError } from '@search/auth/src/useAuth';\nimport { BaseError } from '@search/error/src/BaseError';\n\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport {\n    FavoritesMutation$data as FavoritesMutationResponse, FavoritesMutation$variables as FavoritesMutationVariables\n} from './__generated__/FavoritesMutation.graphql';\n\nconst favoritesMutation = graphql`\n  mutation FavoritesMutation($offerId: ID!, $isFavorite: Boolean!, $noteText: String) {\n    editFavoritePersonal2(isFavorite: $isFavorite, noteText: $noteText, offerId: $offerId) {\n        firstError {\n            __typename\n            ... on BaseError {\n                message\n            }\n            ... on AuthUserIdError {\n                message\n            }\n            ... on FavoritesErrorLimitExceeded {\n                count\n            }\n            ... on FavoritesErrorNoteTextSizeExceeded {\n                count\n            }\n            ... on FavoritesErrorNoteEmpty {\n                message\n            }\n        }\n    }\n  }\n`;\n\nconst stateMap = new Map<string, boolean>();\n\nexport function useFavoritesMutationSafe() {\n    const { authScheduler } = useM2AuthContext();\n    const favoritesMutationCb = useFavoritesMutation();\n\n    const favoritesMutationSafe = React.useMemo(\n        () => {\n            const register = authScheduler.register('favoritesMutation', favoritesMutationCb);\n\n            return {\n                ...register,\n                argsById(id: string) {\n                    return register.args().find(arg => arg.offerId === id);\n                }\n            };\n        },\n        [ favoritesMutationCb ]\n    );\n\n    return favoritesMutationSafe;\n}\n\nexport function useFavoritesMutation() {\n    const gql = useGqlContext();\n\n    return React.useCallback(async (props: FavoritesMutationVariables) => {\n        const data = await gql.execute<FavoritesMutationVariables, FavoritesMutationResponse>(\n            favoritesMutation,\n            {\n                ...props\n            }\n        );\n\n        const fe = data.data?.editFavoritePersonal2.firstError;\n\n        if (fe?.__typename === 'AuthUserIdError') throw new UseAuthError('AuthUserIdError', { cause: fe });\n\n        if (fe?.__typename === 'FavoritesErrorLimitExceeded') {\n            throw new BaseError('FavoritesErrorLimitExceeded', { cause: fe });\n        }\n\n        if (fe?.__typename === 'FavoritesErrorNoteTextSizeExceeded') {\n            throw new BaseError('FavoritesErrorNoteTextSizeExceeded', { cause: fe });\n        }\n        if (fe?.__typename === 'FavoritesErrorNoteEmpty') throw new BaseError('FavoritesErrorNoteEmpty', { cause: fe });\n\n        return data;\n    }, [ gql ]);\n}\n","import { graphql } from '@search/gql-client/src';\n\nexport const SearchOffersQuery = graphql`\n    fragment SearchOffersQueryNBInfoItemFields on InfoItem {\n        weight\n        label\n        snippetLabel\n        value\n        snippetValue\n    }\n\n    query SearchOffersQuery(\n        $regionId: Int!,\n        $paging: PagingInput!,\n        $sort: [SortInput!],\n        $skipGeo: Boolean!,\n        $skipNb: Boolean!,\n        $nbId: Int!,\n        $geos: [GeoSlugInput!]!,\n        $filters: ProfessionalSearchInput,\n        $realtyObject: RealtyObjectEnum!,\n        $pathName: String,\n        $touch: Boolean!,\n        $skipSeoCloudBack: Boolean!,\n        $limit: Int!,\n        $onlyUnique: Boolean!,\n        $skipLastSearch: Boolean!\n    ) {\n    mortgageBannerMinutesVariant: randomNumber(from: 0, to: 2) {\n        value\n    }\n    mortgageBannerTextVariant: randomNumber(from: 0, to: 1) {\n        value\n    }\n    userDetails {\n        userId\n        phone\n        hasOfferWithoutVas\n    }\n    geo(regionId: $regionId) @skip(if: $skipGeo) {\n        metro {\n            id\n            title\n            kind\n            lines\n            mainName\n            interchangedStations\n            lines\n            shortDisplayName\n            locativeDisplayName\n            route {\n                id\n            }\n        }\n\n        lines {\n           id\n           title\n           kind\n           shortDisplayName\n           color\n        }\n\n        districts {\n            kind\n            parentId\n            displayName\n            mainName\n            translit\n            shortDisplayName\n            locative\n            title\n            id\n            isIntracity,\n            narrowRegion {\n                id\n            }\n        }\n    }\n    geo2(geos: $geos) {\n        items {\n            __typename\n            ... on BaseLoaderItemError {\n                itemId\n            }\n            ... on GeoObject {\n                kind\n                parentId\n                displayName\n                mainName\n                translit\n                shortDisplayName\n                locative\n                title\n                id\n                isIntracity\n                locality {\n                    id\n                    title\n                    locative\n                }\n                narrowRegion {\n                    id\n                }\n            }\n        }\n    }\n    searchOffersSummary(filters: $filters) {\n        formattedRealty(realtyObject: $realtyObject)\n        count\n        priceRange {\n            from\n            to\n        }\n        formattedPriceRange\n        formattedPriceFrom\n        formattedPricePerUnitRange\n        formattedAreaRange\n        formattedAveragePrice\n        ratingValue\n        bestRating\n        reviewCount\n        avgPricePerUnit\n    }\n\n    searchOffersSeo(filters: $filters, pathName: $pathName) {\n        h1\n        metaTitle\n        metaDescription\n        autotext\n    }\n\n    newBuilding(\n        id: $nbId\n    ) @skip(if: $skipNb) {\n        id\n        gallery {\n            main {\n                large\n                originPath\n            }\n        }\n        hasPreferentialMortgage\n        buildingClass {\n            label\n            value\n            fullLabel\n        }\n        title {\n            nominative\n        }\n        buildingStatus {\n            title\n            isFrozen\n        }\n        routes(type: [ METRO ]) {\n            ...on RouteMetro {\n                station {\n                    id\n                    name\n                    lines\n                }\n                timeMinutes\n                transportType\n            }\n        }\n        address\n        snippetDescription\n        developerCards {\n            developer {\n                id\n                title\n                icon {\n                    origin\n                }\n                translitTitle\n            }\n        }\n        coordinates\n        routeParams {\n            region\n            regionId\n            subRegion\n            type\n            name\n            id\n        }\n        offersSeo {\n            h1\n        }\n        info {\n            commissioningDate {\n                ...SearchOffersQueryNBInfoItemFields\n            }\n            buildingClass {\n                ...SearchOffersQueryNBInfoItemFields\n            }\n            totalCount {\n                ...SearchOffersQueryNBInfoItemFields\n            }\n            apartments {\n                ...SearchOffersQueryNBInfoItemFields\n            }\n        }\n        isFavorite\n        ranking\n        priceMin\n    }\n\n    searchOffers(paging: $paging, sort: $sort, filters: $filters) {\n        paging {\n            total\n            pageNumber\n            pageSize\n            hasNext\n        }\n\n        seoTags {\n            watchAlso @skip(if: $skipSeoCloudBack) {\n                title\n                url\n            }\n            recommended {\n                title\n                url\n                count\n            }\n        }\n\n        items {\n            id\n            description\n            noteText\n            isFavorite\n            isHidden\n            isFavoriteVisible\n            isMortgageAllowed\n            onlineView\n            fromCian\n            mortgagePurpose\n            hasSubscription\n            text {\n                titleSnippet\n                titleCard\n                slug\n            }\n            stats {\n                isViewed\n            }\n            dealType {\n                __typename\n                ... on ProfOfferDealSell {\n                    price {\n                        value\n                        currency\n                        rubPrice\n                        areaUnit\n                        history {\n                            valueRub\n                            diff {\n                                rub\n                            }\n                            date2 {\n                                iso\n                                formattedFull\n                            }\n                        }\n                    }\n                    hasBankPledge\n                    sellType\n                    bargainAllowed {\n                        formatted\n                    }\n                    mortgageAllowed\n                }\n                ... on ProfOfferDealRent {\n                    commission {\n                        formatted\n                    }\n                    bargainAllowed {\n                        formatted\n                    }\n                    price {\n                        value\n                        rubPrice\n                        currency\n                        areaUnit\n                        history {\n                            valueRub\n                            diff {\n                                rub\n                            }\n                            date2 {\n                                iso\n                                formattedFull\n                            }\n                        }\n                    }\n                    period\n                    utilities {\n                        formatted\n                    }\n                    livingTenantRequirements {\n                        childrenAllowed {\n                            formatted\n                        }\n                        petsAllowed {\n                            formatted\n                        }\n                    }\n                    hasPrepayment {\n                        formatted\n                    }\n                    hasDeposit {\n                        formatted\n                    }\n                }\n            }\n            gallery {\n                baseUrl\n                mainImage {\n                    originPath\n                    preview1\n                    preview2\n                    attributesType\n                }\n                images {\n                    originPath\n                    preview1\n                    preview2\n                    medium\n                    small\n                    large\n                    attributesType\n                }\n            }\n            status {\n                isDeleted\n                createdActualizeFormatted\n                createdAt {\n                    formattedAutoDate\n                }\n                actualizedAt {\n                    formattedAutoDate\n                }\n                visibility\n                cluster {\n                    id\n                    tailSize\n                }\n                hasAnyPriority\n                hasTop\n                hasHighlight\n                vas {\n                    valueCase\n                }\n            }\n            infrastructure {\n                parking {\n                    type\n                }\n            }\n            realtyObject {\n                __typename\n                ... on ProfOfferFlat {\n                    flatType\n                    totalArea {\n                        formatted\n                        value\n                        unit\n                    }\n                    kitchenArea {\n                        value\n                        unit\n                    }\n                    livingArea {\n                        formatted\n                    }\n                    roomsCount\n                    roomType\n                    floor\n                    livingFacilities {\n                        hasAirConditioner\n                        hasDishwasher\n                        hasFridge\n                        hasFurniture\n                        hasInternet\n                        hasInternet\n                        hasKitchenFurniture\n                        hasTv\n                        hasWashingMachine\n                    }\n                    characteristics {\n                        hasBalcony\n                        ceilingHeightM\n                        bathroomType\n                        renovationType\n                    }\n                    building {\n                        buildingId\n                        newBuildingId\n                        isNewbuilding\n                        floorsTotal\n                        wallsType\n                        newBuildingBasicInfo {\n                            title\n                            slug @skip(if: $touch)\n                        }\n                        newBuildingStatus {\n                            builtYear\n                            formattedInProgress\n                        }\n                    }\n                }\n                ... on ProfOfferRoom {\n                    roomCount\n                    livingArea {\n                        formatted\n                        value\n                        unit\n                    }\n                    enclosingFlat {\n                        flatType\n                        totalArea {\n                            formatted\n                            value\n                            unit\n                        }\n                        kitchenArea {\n                            value\n                            unit\n                        }\n                        livingArea {\n                            formatted\n                        }\n                        roomsCount\n                        roomType\n                        floor\n                        livingFacilities {\n                            hasAirConditioner\n                            hasDishwasher\n                            hasFridge\n                            hasFurniture\n                            hasInternet\n                            hasInternet\n                            hasKitchenFurniture\n                            hasTv\n                            hasWashingMachine\n                        }\n                        characteristics {\n                                hasBalcony\n                            ceilingHeightM\n                            bathroomType\n                            renovationType\n                        }\n                        building {\n                            buildingId\n                            isNewbuilding\n                            floorsTotal\n                            wallsType\n                            newBuildingStatus {\n                                builtYear\n                            }\n                        }\n                    }\n                }\n                ... on ProfOfferHouse {\n                    category2 {\n                        formatted\n                        value\n                    }\n                    totalArea {\n                        value\n                        unit\n                        formatted\n                    }\n                    livingFacilities {\n                        hasAirConditioner\n                        hasDishwasher\n                        hasFridge\n                        hasFurniture\n                        hasInternet\n                        hasInternet\n                        hasKitchenFurniture\n                        hasTv\n                        hasWashingMachine\n                    }\n                    floorsTotal\n                    builtYear\n                    hasBathroom\n                    bathroomLocationType\n                    hasHeating\n                    heatingType\n                    land {\n                        area {\n                            formatted\n                        }\n                        supply {\n                            hasGas\n                            hasWater\n                            hasElectricity\n                            hasSewerage\n                        }\n                        status\n                    }\n                    roomsCount\n                }\n                ... on ProfOfferLand {\n                    area {\n                        value\n                        unit\n                        formatted\n                    }\n                    supply {\n                        hasGas\n                        hasWater\n                        hasElectricity\n                        hasSewerage\n                    }\n                    status\n                }\n            }\n            badges {\n                isRgrMember\n            }\n            location {\n                formattedAddressLong\n                cityCenterInfo {\n                    metersToCentralSquare\n                    locatedInCenter\n                }\n                formattedAddressShort\n                clickableAddress {\n                    id\n                    translit\n                    name\n                    kind\n                }\n                clickableAddressShort {\n                    id\n                    translit\n                    name\n                    kind\n                }\n                narrowRegion {\n                    id\n                    name\n                }\n                wideDistrict {\n                    id\n                    translit\n                    name\n                }\n                narrowDistrict {\n                    id\n                    translit\n                    name\n                }\n                locality {\n                    id\n                    translit\n                    name\n                }\n                street {\n                    id\n                    translit\n                    name\n                }\n                house {\n                    id\n                    translit\n                    name\n                }\n                coordinates {\n                    latitude\n                    longitude\n                }\n                routesList {\n                    ... on RouteMetro {\n                        timeMinutes\n                        transportType\n                        station {\n                            id\n                            name\n                            allRoutesColorsList\n                        }\n                    }\n                }\n                isMskMO\n                isSPbLO\n            }\n            seller {\n                ownerId\n                name\n                organizationName\n                sellerType\n                logo {\n                    preview2\n                    origin\n                }\n                placementUserId\n                isZhekaLogo\n                mainPhone {\n                    countryCode\n                    number\n                    hiddenSuffixLength\n                    formattedNumber\n                }\n                phoneList {\n                    countryCode\n                    number\n                    hiddenSuffixLength\n                    formattedNumber\n                }\n            }\n            isNewBuildingPaid\n            newBuildingCard {\n                ranking\n                title {\n                    nominative\n                    genitive\n                }\n                developerCards {\n                    developer {\n                        isSamolet\n                        title\n                        url\n                    }\n                }\n                buildings {\n                    id\n                    address\n                }\n            }\n        }\n        similarNb {\n            id\n            description\n            text {\n                titleSnippet\n                slug\n            }\n            gallery {\n                mainImage {\n                    originPath\n                    preview1\n                    small\n                    attributesType\n                }\n            }\n            dealType {\n                __typename\n                ... on ProfOfferDealSell {\n                    price {\n                        value\n                        rubPrice\n                        formatted\n                        currency\n                        areaUnit\n                    }\n                }\n            }\n            location {\n                formattedAddressLong\n                formattedAddressShort\n                routesList {\n                    ... on RouteMetro {\n                        timeMinutes\n                        transportType\n                        station {\n                            id\n                            name\n                            allRoutesColorsList\n                        }\n                    }\n                }\n                isMskMO\n                isSPbLO\n            }\n            realtyObject {\n                __typename\n                ... on ProfOfferFlat {\n                    building {\n                        buildingId\n                        newBuildingBasicInfo {\n                            title\n                        }\n                        newBuildingStatus {\n                            formattedInProgress\n                            isKeysComingSoonBadge\n                            isDoneBadge\n                        }\n                    }\n                }\n            }\n        }\n        emptyResultTitle\n    }\n    getLastSearches(limit: $limit, onlyUnique: $onlyUnique) @skip(if: $skipLastSearch) {\n        lastSearches {\n            searchText\n            searchUrl\n        }\n    }\n}\n`;\n","/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable no-nested-ternary */\nimport React from 'react';\n\nimport { Currency } from '@search/filter-enums/enums/Currency';\nimport { DealType } from '@search/filter-enums/enums/DealType';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { RentPeriod } from '@search/filter-enums/enums/RentPeriod';\nimport { SellerType } from '@search/filter-enums/enums/SellerType';\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { SearchRoute, useRouter, OfferRoute as OfferRouteType, SearchMapRoute, IOfferType } from '@search/offer-search-routes/src';\nimport { useGqlContext } from '@search/gql-client/src/gqlContext';\nimport { useGql2Loader, Gql2CacheInfoCallback, gql2CreateCachedFetcher } from '@search/gql-client/src/useGql2';\nimport type { GqlClientOptions, GqlClient } from '@search/gql-client/src/GqlClient';\nimport { regionFromLocation } from '@search/geo/src/regionFromLocation';\nimport { useClGeoRootRegion } from '@search/geo/src/clGeoRootRegion/useClGeoRootRegion';\nimport { useOfferSessionVisited } from '@search/common-core/src/useSessionStorage';\nimport type { PriceHistoryPart } from '../../../../../view/common/components/Price/PriceHistory/PriceHistoryPart';\nimport { MetroStationBase } from '../../../../geo/MetroStation';\nimport { ClassifiedAnalytics } from '../../../analytics/ClassifiedAnalytics';\nimport type { OfferType } from '../OfferQuery';\nimport {\n    AreaUnitEnum,\n    SearchOffersQuery$data as SearchOffersQueryResponse,\n    SearchOffersQuery$variables as SearchOffersQueryVariables,\n    TransportTypeEnum,\n    CurrencyEnum\n} from './__generated__/SearchOffersQuery.graphql';\nimport { SearchOffersQuery } from './SearchOffersQuery';\nimport { areaUnitCompat } from './helpers/areaCompat';\n\nconst cacheInfo: Gql2CacheInfoCallback<\n    'skipGeo' | 'skipNb',\n    SearchOffersQueryVariables,\n    SearchOffersQueryResponse\n> = v => ({\n    skipGeo: {\n        responseKey: 'geo',\n        cacheKey: String(\n            v.regionId === RegionIdEnum.MSK_OBL ?\n                RegionIdEnum.MSK_AND_MSK_OBL :\n                (\n                    v.regionId === RegionIdEnum.LEN_OBL ?\n                        RegionIdEnum.SPB_AND_LEN_OBL :\n                        v.regionId\n                )\n        ) + 'id-' + String(v.geos?.join('.') ?? '')\n    },\n    skipNb: {\n        responseKey: 'newBuilding',\n        cacheKey: v.filters?.newBuildingIds?.length ? v.filters.newBuildingIds.join('.') : undefined\n    }\n});\n\nconst cachePrefix = 'SearchOffers';\n\nfunction createSearchOffersFetcher({ gql, isMobile = false }: {\n    gql: GqlClient;\n    isMobile?: boolean;\n}) {\n    return (vars: Omit<SearchOffersQueryVariables, 'geos'> & {\n        geos?: readonly (number | string)[];\n    }, opts?: GqlClientOptions) => {\n        return gql.client<\n            SearchOffersQueryVariables,\n            SearchOffersQueryResponse\n        >(SearchOffersQuery, {\n            ...vars,\n            geos: vars.geos?.map(rec => typeof rec === 'number' ?\n                { smart: String(rec), regionId: undefined } :\n                { smart: rec, regionId: vars.filters?.regionId }\n            ) ?? [],\n            touch: isMobile\n        }, opts);\n    };\n}\n\nfunction useSearchOffersFetcher(isMobile?: boolean) {\n    const gql = useGqlContext();\n\n    return React.useCallback(createSearchOffersFetcher({ gql, isMobile }), [ gql ]);\n}\n\nexport function useSearchOffersLoader(isMobile?: boolean) {\n    const loader = useGql2Loader(useSearchOffersFetcher(isMobile), { cacheInfo, cachePrefix });\n    const rootRegions = useClGeoRootRegion();\n\n    return React.useCallback((props: Parameters<typeof loader>[0]) => {\n        const res = loader(props);\n        const data = res.data;\n        const regionId = props.filters?.regionId ?? 3;\n\n        data?.geo?.districts.forEach(geo => rootRegions.slugs.add(geo, regionId));\n        // data?.geo2?.items.forEach(geo => rootRegions.slugs.add(geo, regionId));\n        // data?.searchOffers.geoArgs?.forEach(geo => rootRegions.slugs.add(geo, regionId));\n        data?.searchOffers.items.forEach(item => item.location && rootRegions.slugs.addLocation(item.location));\n\n        return res;\n    }, [ rootRegions, loader ]);\n}\n\nexport type SearchOffersLoader = ReturnType<typeof useSearchOffersLoader>;\n\nexport type SearchOffers = SearchOffersQueryResponse['searchOffers'];\nexport type OfferSnippetModel = SearchOffers['items'][number];\nexport type LastSearches = NonNullable<SearchOffersQueryResponse['getLastSearches']>['lastSearches'];\nexport type OfferSimilarNb = NonNullable<NonNullable<SearchOffersQueryResponse['searchOffers']['similarNb']>[number]>;\n\nexport function useOfferVisited(model: { id?: string; stats?: { isViewed?: boolean | null } | null }) {\n    const visitedValue = useOfferSessionVisited();\n\n    const isVisited = model?.id ? (model.stats?.isViewed || visitedValue(model.id)) : undefined;\n\n    const enableIsVisited = React.useCallback(() => {\n        if (model?.id) visitedValue(model.id, true);\n    }, [ model?.id, visitedValue ]);\n\n    return { isVisited, enableIsVisited };\n}\n\nexport function useOfferCompat(model: OfferSnippetModel) {\n    const addresses = useHandyAddressCompat({ ...model, clickableAddress: model.location.clickableAddressShort });\n    const realtyObject = model.realtyObject;\n    const dealType = model.dealType;\n\n    const seller = sellerCompat(model.seller);\n\n    const isSellFlat = realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell';\n    const isNewBuilding = (isSellFlat && realtyObject.building?.isNewbuilding) ?? false;\n    const isNewBuildingDeveloperFlat = isNewBuilding && model.seller.sellerType === 'DEVELOPER';\n    const hasAnyPriority = model.status?.hasAnyPriority ?? false;\n    const isPledge = (dealType?.__typename === 'ProfOfferDealSell' && dealType.hasBankPledge) ?? false;\n    const isPit = model.seller.sellerType === 'PIT';\n    const onlineView = model.onlineView ?? false;\n    const description = model.description;\n    const regionId = regionFromLocation(model.location) ?? RegionIdEnum.MSK;\n    const price = priceCompat(dealType);\n    const coordinates = model.location.coordinates;\n    const pictures = model?.gallery?.images.map((photo, index) => ({\n        id: `${index}`,\n        originPath: photo.originPath,\n        // src: photo.preview1 ?? photo.preview2,\n        // src2x: photo.small ?? photo.medium,\n        // large: photo.large,\n        description: model.text?.titleCard ?? '',\n        attributesType: photo.attributesType\n    })) ?? [];\n\n    const offerRoutes = useOfferRouteListCompat(model);\n    const metersToCentralSquare = model.location.cityCenterInfo?.metersToCentralSquare;\n    const locatedInCenter = model.location.cityCenterInfo?.locatedInCenter ?? false;\n    const metersToCenter = metersToCentralSquare && metersToCentralSquare <= 30000 ?\n        String(Math.round(metersToCentralSquare / 100) / 10).replace('.', ',') :\n        undefined;\n\n    return {\n        formattedAddress: model.location.formattedAddressLong,\n        formattedAddressShort: model.location.formattedAddressShort,\n        offerSnippetClickGtmId: getOfferSnippetClickGtmId(model),\n        offerPhoneClickGtmId: getOfferPhoneClickGtmId(model),\n        addresses,\n        realtyObject,\n        dealType,\n        seller,\n        isNewBuilding,\n        isNewBuildingDeveloperFlat,\n        hasAnyPriority,\n        isPledge,\n        description,\n        regionId,\n        price,\n        coordinates,\n        pictures,\n        offerRoutes,\n        metersToCenter,\n        locatedInCenter,\n        isPit,\n        onlineView,\n        isSellFlat\n    };\n}\n\n// eslint-disable-next-line no-undef\nconst history = typeof window === 'undefined' ? undefined : window.history;\n\nexport function useOfferCardLink(\n    model?: {\n        id: string;\n        text?: null | {\n            slug?: string;\n        };\n        location: {\n            narrowRegion?: {\n                id: number;\n            } | null;\n        };\n    } | null\n) {\n    const id = model?.id;\n    const router = useRouter();\n    const route = router.route(OfferRouteType);\n\n    const routeParams: IOfferType | undefined = React.useMemo(() => model ? {\n        offerId: model.id,\n        slug: model.text?.slug,\n        region: model.location.narrowRegion?.id ?? RegionIdEnum.MSK\n    } : undefined, [ id ]);\n\n    const gql = useGqlContext();\n\n    const offerUrl = React.useMemo(\n        () => {\n            try {\n                return routeParams ? route.url(routeParams) : undefined;\n            } catch (e) {\n                e.message += ` offerId: ${id}`;\n                throw e;\n            }\n        },\n        [ routeParams, route, id ]\n    );\n\n    const gotoOffer = React.useCallback(<V>() => {\n        route.push(routeParams);\n    }, [ routeParams, route, gql, id ]);\n\n    const gotoBackRaw = React.useCallback(() => {\n        history?.back();\n    }, [ ]);\n    const gotoBack = (history?.length ?? 0) > 1 ? gotoBackRaw : undefined;\n\n    return {\n        offerUrl,\n        gotoBack,\n        gotoOffer\n    };\n}\n\ntype ClickableAddress = {\n    id: number;\n    name: string;\n    kind: string;\n}\n\nconst getKindParam = (address: ClickableAddress, regionId?: number) => {\n    if (\n        address.id === regionId ||\n        address.id === RegionIdEnum.SPB ||\n        address.id === RegionIdEnum.SPB_AND_LEN_OBL ||\n        address.id === RegionIdEnum.LEN_OBL ||\n        address.id === RegionIdEnum.MSK ||\n        address.id === RegionIdEnum.MSK_AND_MSK_OBL ||\n        address.id === RegionIdEnum.MSK_OBL\n    ) {\n        return { region: address.id };\n    }\n\n    switch (address.kind) {\n        case 'PROVINCE':\n            return { region: address.id };\n\n        case 'DISTRICT':\n            return { districtIds: [ address.id ] };\n\n        case 'LOCALITY':\n        case 'STREET':\n        case 'HOUSE':\n            return { addresses: [ address.id ] };\n\n        default: return undefined;\n    }\n};\n\nexport const useHandyAddressCompat = ({\n    dealType,\n    realtyObject,\n    location,\n    clickableAddress,\n    id\n}: {\n    id: string;\n    dealType: Parameters<typeof dealTypeFilterCompat>[0];\n    realtyObject?: Parameters<typeof realtyObjectFilterCompat>[0];\n    clickableAddress?: readonly (\n        NonNullable<OfferSnippetModel['location']['clickableAddress']>[number] & { isInRoute?: boolean }\n    )[] | null;\n    location: Parameters<typeof regionFromLocation>[0];\n}) => {\n    const router = useRouter();\n    const searchRoute = router.route(SearchRoute);\n    const params = router.paramsSafe(SearchRoute) ?? router.paramsSafe(SearchMapRoute);\n\n    return React.useMemo(() => {\n        if (! clickableAddress) return [];\n\n        const region = regionFromLocation(location) ?? RegionIdEnum.MSK;\n        const baseRouteParams = {\n            region,\n            dealType: dealTypeFilterCompat(dealType),\n            categoryType: realtyObjectFilterCompat(realtyObject)\n        };\n\n        const geoIds = params ? new Set([\n            ...params.districtIds,\n            ...params.metroIds,\n            ...params.addresses,\n            params.region\n        ]) : null;\n\n        const addresses = clickableAddress.map(item => {\n            try {\n                let isAddressInRoute = item.isInRoute || (geoIds && geoIds.has(item.id));\n\n                // if (item.kind === 'PROVINCE' && ! geoIds?.size) isAddressInRoute = true;\n                // if (item.id === region && ! geoIds?.size) isAddressInRoute = true;\n\n                const params2 = getKindParam(item, region);\n\n                const href = searchRoute.url({\n                    ...baseRouteParams,\n                    ...params2\n                });\n\n                if (router.location.href.startsWith(href)) isAddressInRoute = true;\n\n                return {\n                    content: item.name,\n                    href: isAddressInRoute ? undefined : href,\n                    isNofollowLink: item.kind === 'HOUSE'\n                };\n            } catch (e) {\n                e.message += ` offerId: ${id}`;\n                throw e;\n            }\n        });\n\n        return addresses;\n    }, [ id, params ]);\n};\n\nexport function dealTypeFilterCompat(\n    dealType: Pick<NonNullable<OfferSnippetModel['dealType']>, '__typename'> | null | undefined\n): DealType {\n    switch (dealType?.__typename) {\n        case 'ProfOfferDealRent': return DealType.RENT;\n        default: return DealType.SELL;\n    }\n}\n\nexport function dealTypeCompat(dealType: OfferSnippetModel['dealType']): DealType {\n    switch (dealType?.__typename) {\n        case 'ProfOfferDealRent': return DealType.RENT;\n        default: return DealType.SELL;\n    }\n}\n\nexport function dealTypePeriodCompat(dealType: OfferSnippetModel['dealType']): RentPeriod | undefined {\n    if (dealType?.__typename !== 'ProfOfferDealRent') return undefined;\n\n    switch (dealType.period) {\n        case 'DAY': return RentPeriod.DAY;\n        case 'MONTH': return RentPeriod.MONTH;\n        case 'YEAR': return RentPeriod.YEAR;\n        default: return undefined;\n    }\n}\n\nexport function realtyObjectFilterCompat(\n    realtyObject: Pick<NonNullable<OfferSnippetModel['realtyObject']>, '__typename'> | undefined | null\n): RealtyObjectType {\n    switch (realtyObject?.__typename) {\n        case 'ProfOfferFlat': return RealtyObjectType.FLAT;\n        case 'ProfOfferRoom': return RealtyObjectType.ROOM;\n        case 'ProfOfferHouse': return RealtyObjectType.HOUSE;\n        case 'ProfOfferLand': return RealtyObjectType.LAND;\n        default: return RealtyObjectType.FLAT;\n    }\n}\n\nexport function priceCompat(dealType?: OfferSnippetModel['dealType']) {\n    if (dealType?.__typename !== 'ProfOfferDealSell' && dealType?.__typename !== 'ProfOfferDealRent') return;\n\n    if (! dealType.price) return;\n\n    return price2Compat(dealType.price);\n}\n\nexport function price2Compat(\n    price: {\n        value: number;\n        history?: (readonly PriceHistoryPart[]) | null;\n        rubPrice?: number | null;\n        currency: CurrencyEnum;\n        areaUnit: AreaUnitEnum | null;\n        formatted?: string;\n        formattedWithCurrency?: string; // for Rent\n    },\n    divider = 100\n) {\n    const currency = price.currency === 'UNKNOWN' || ! price.currency ?\n        Currency.RUB :\n        Currency[price.currency];\n\n    return {\n        value: Math.ceil(price.value / divider),\n        rubPrice: price.rubPrice ? Math.ceil(price.rubPrice / divider) : undefined,\n        history: price.history,\n        currency,\n        formatted: price.formatted ?? price.formattedWithCurrency,\n        areaUnit: areaUnitCompat(price.areaUnit)\n    };\n}\n\nexport interface OfferRoute {\n    metro: MetroStationBase;\n    url?: string;\n    transportType: TransportType;\n    timeMinutes: number;\n}\n\nfunction transportTypeCompat(transport?: TransportTypeEnum | null): TransportType {\n    switch (transport) {\n        case 'PUBLIC_TRANSPORT': return TransportType.PUBLIC_TRANSPORT;\n        case 'FOOT': return TransportType.FOOT;\n        default: return TransportType.UNKNOWN;\n    }\n}\n\nexport function useOfferRouteListCompat(\n    offer: {\n        id: string;\n        dealType: OfferSnippetModel['dealType'];\n        realtyObject: OfferSnippetModel['realtyObject'];\n        location: {\n            routesList: OfferSnippetModel['location']['routesList'];\n            narrowRegion: OfferSnippetModel['location']['narrowRegion'];\n        };\n    }\n): OfferRoute[] {\n    const router = useRouter();\n\n    return React.useMemo(() => {\n        const routes = offer.location.routesList;\n        const result: OfferRoute[] = [];\n        const searchRoute = router.route(SearchRoute);\n\n        for (const route of routes ?? []) {\n            if (! route.timeMinutes || ! route.station) continue;\n\n            const metro: MetroStationBase = {\n                id: route.station.id,\n                allRoutesColorsList: route.station.allRoutesColorsList ?? [],\n                title: route.station.name\n            };\n\n            const url = searchRoute.prevParams?.metroIds.includes(metro.id) ? undefined : searchRoute.url({\n                dealType: dealTypeFilterCompat(offer.dealType),\n                categoryType: realtyObjectFilterCompat(offer.realtyObject),\n                region: regionFromLocation(offer.location) ?? RegionIdEnum.MSK,\n                metroIds: [ metro.id ],\n                seoMortgageAllowed: false\n            });\n\n            result.push({\n                url,\n                timeMinutes: route.timeMinutes,\n                transportType: transportTypeCompat(route.transportType),\n                metro\n            });\n        }\n\n        return result;\n    }, [ offer.id, router ]);\n}\n\nexport function sellerCompat(seller: OfferSnippetModel['seller'] | OfferType['seller']) {\n    return {\n        icon: seller.isZhekaLogo ? seller.logo?.origin : undefined,\n        name: seller.name ?? '',\n        organizationName: seller.organizationName ?? '',\n        sellerType: SellerType[seller.sellerType]\n    };\n}\n\nexport function getOfferSnippetClickGtmId(\n    {\n        seller, realtyObject, dealType, status\n    }: Pick<OfferSnippetModel, 'seller' | 'realtyObject' | 'dealType' | 'status'>\n): ClassifiedAnalytics | undefined {\n    if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell') {\n        if (seller?.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.SaleFlatOpenNewDevOffer;\n        }\n\n        if (realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.SaleFlatOpenNewOffer;\n        }\n\n        if (status?.hasHighlight) {\n            return ClassifiedAnalytics.SaleOpenHighlightOffer;\n        }\n\n        if (status?.hasAnyPriority) {\n            return ClassifiedAnalytics.SaleOpenPaidOffer;\n        }\n\n        return ClassifiedAnalytics.SaleFlatOpenSecondOffer;\n    }\n\n    if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealRent') {\n        if (realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.RentFlatOpenNewOffer;\n        }\n\n        return ClassifiedAnalytics.RentFlatOpenSecondOffer;\n    }\n\n    if (status?.hasHighlight && dealType?.__typename === 'ProfOfferDealSell') {\n        return ClassifiedAnalytics.SaleOpenHighlightOffer;\n    }\n\n    if (status?.hasAnyPriority && dealType?.__typename === 'ProfOfferDealSell') {\n        return ClassifiedAnalytics.SaleOpenPaidOffer;\n    }\n\n    if (! status?.hasAnyPriority && dealType?.__typename === 'ProfOfferDealSell') {\n        return ClassifiedAnalytics.SaleOpenSecondOffer;\n    }\n\n    return undefined;\n}\n\nexport function getOfferSimilarGtmIds(\n    {\n        seller, realtyObject, dealType, status, isMortgageAllowed\n    }: Pick<OfferSnippetModel, 'seller' | 'realtyObject' | 'dealType' | 'status' | 'isMortgageAllowed'>\n): { mortgage: string; phoneShown: string; click: string } {\n    const analytics = {\n        mortgage: '',\n        phoneShown: '',\n        click: ''\n    };\n\n    if (isMortgageAllowed) {\n        analytics.mortgage = 'classified_card_similar_sale_view_ipoteka_link';\n    }\n\n    // Вторичка\n    analytics.click = 'classified_card_similar_click_open_second_offer';\n    analytics.phoneShown = 'classified_card_similar_sale_show_tel';\n\n    // Вторичка VAS\n    if (status?.hasAnyPriority) {\n        analytics.click = 'classified_card_similar_click_open_second_vas_offer';\n        analytics.phoneShown = 'classified_card_similar_sale_vas_show_tel';\n    }\n\n    if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell') {\n        if (realtyObject.building?.isNewbuilding) {\n            analytics.click = 'classified_card_similar_click_open_new_offer';\n            analytics.phoneShown = 'classified_card_similar_new_show_tel';\n        }\n\n        if (seller?.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n            analytics.click = 'classified_card_similar_click_open_new_dev_offer';\n            analytics.phoneShown = 'classified_card_similar_new_dev_show_tel';\n        }\n    }\n\n    if (dealType?.__typename === 'ProfOfferDealRent') {\n        analytics.click = 'classified_card_similar_click_rent_open_second_offer';\n        analytics.phoneShown = 'classified_card_similar_rent_show_tel';\n    }\n\n    return analytics;\n}\n\nfunction getOfferPhoneClickGtmId(\n    { seller, realtyObject, dealType, status, isNewBuildingPaid }: OfferSnippetModel\n) {\n    if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealSell') {\n        if (isNewBuildingPaid && seller.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.SearchSaleFromDevPaidShowTel;\n        }\n        if (seller.sellerType === 'DEVELOPER' && realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.SearchSaleFromDevShowTel;\n        }\n\n        if (realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.SearchSaleNewShowTel;\n        }\n\n        if (status?.hasHighlight) {\n            return ClassifiedAnalytics.SearchSaleHighlightShowTel;\n        }\n\n        if (status?.hasAnyPriority) {\n            return ClassifiedAnalytics.SearchSalePaidShowTel;\n        }\n\n        return ClassifiedAnalytics.SearchSaleShowTel;\n    }\n\n    if (realtyObject?.__typename === 'ProfOfferFlat' && dealType?.__typename === 'ProfOfferDealRent') {\n        if (realtyObject.building?.isNewbuilding) {\n            return ClassifiedAnalytics.SearchRentNewShowTel;\n        }\n\n        return ClassifiedAnalytics.SearchRentShowTel;\n    }\n\n    if (dealType?.__typename === 'ProfOfferDealSell') {\n        if (status?.hasHighlight) {\n            return ClassifiedAnalytics.SearchSaleHighlightShowTel;\n        }\n\n        if (status?.hasAnyPriority) {\n            return ClassifiedAnalytics.SearchSalePaidShowTel;\n        }\n\n        return ClassifiedAnalytics.SearchSaleShowTel;\n    }\n\n    if (dealType?.__typename === 'ProfOfferDealRent') {\n        return ClassifiedAnalytics.SearchRentShowTel;\n    }\n\n    return undefined;\n}\n","import { graphql } from '@search/gql-client/src';\n\nexport const SearchOffersMapQuery = graphql`query SearchOffersMapQuery(\n    $regionId: Int!,\n    $nbId: Int!,\n    $skipGeo: Boolean!,\n    $skipNb: Boolean!,\n    $geoIds: [Int!],\n    $filters: ProfessionalSearchInput,\n    $taglessOnly: Boolean!,\n) {\n    newBuilding(\n        id: $nbId\n    ) @skip(if: $skipNb) {\n        offersSeo {\n            h1\n        }\n    }\n    geo(regionId: $regionId, geoIds: $geoIds) @skip(if: $skipGeo) {\n        metro {\n            id\n            title\n            kind\n            lines\n            mainName\n            interchangedStations\n            lines\n            shortDisplayName\n            locativeDisplayName\n            route {\n                id\n            }\n        }\n\n        lines {\n            id\n            title\n            kind\n            color\n        }\n\n        districts {\n            kind\n            parentId\n            displayName\n            mainName\n            shortDisplayName\n            locative\n            title\n            id\n            isIntracity\n            narrowRegion {\n                id\n            }\n        }\n    }\n    searchOffersCount(filters: $filters) {\n        count\n    }\n    searchOffersMap(filters: $filters, taglessOnly: $taglessOnly) {\n        tileUrl @skip(if: $taglessOnly)\n        points {\n            __typename\n            ... on TaglessOfferPoint {\n                geoHash\n                coordinates {\n                    latitude\n                    longitude\n                }\n            }\n            ... on MultiOfferPointFlat {\n                id\n                addressId\n                geoHash\n                count\n                coordinates {\n                    latitude\n                    longitude\n                }\n                minPriceRub\n                minPrice {\n                    value\n                    currency\n                    areaUnit\n                }\n                minArea {\n                    unit\n                    value\n                }\n                maxArea {\n                    unit\n                    value\n                }\n                isNewBuilding\n                hasHighlight\n            }\n            ... on MultiOfferPointRoom {\n                id\n                addressId\n                geoHash\n                count\n                coordinates {\n                    latitude\n                    longitude\n                }\n                minPriceRub\n                minPrice {\n                    value\n                    currency\n                    areaUnit\n                }\n                minArea {\n                    unit\n                    value\n                }\n                maxArea {\n                    unit\n                    value\n                }\n                isNewBuilding\n                hasHighlight\n            }\n            ... on MultiOfferPointHouse {\n                id\n                addressId\n                geoHash\n                count\n                coordinates {\n                    latitude\n                    longitude\n                }\n                minPriceRub\n                minPrice {\n                    value\n                    currency\n                    areaUnit\n                }\n                minArea {\n                    unit\n                    value\n                }\n                maxArea {\n                    unit\n                    value\n                }\n                isNewBuilding\n                hasHighlight\n            }\n            ... on MultiOfferPointLand {\n                id\n                addressId\n                geoHash\n                count\n                coordinates {\n                    latitude\n                    longitude\n                }\n                minPriceRub\n                minPrice {\n                    value\n                    currency\n                    areaUnit\n                }\n                minArea {\n                    unit\n                    value\n                }\n                maxArea {\n                    unit\n                    value\n                }\n                isNewBuilding\n                hasHighlight\n            }\n            ... on SingleOfferPointFlat {\n                offer {\n                    id\n                    isFavorite\n                    stats {\n                        isViewed\n                    }\n                    location {\n                        narrowRegion {\n                            id\n                        }\n                        coordinates {\n                            latitude\n                            longitude\n                        }\n                    }\n                    dealType {\n                        __typename\n                        ... on ProfOfferDealSell {\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                        ... on ProfOfferDealRent {\n                            utilities {\n                                has\n                            }\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    gallery {\n                        baseUrl\n                        mainImage {\n                            originPath\n                            medium\n                            preview1\n                        }\n                        images {\n                            originPath\n                            medium\n                            preview1\n                        }\n                    }\n                    realtyObject {\n                        __typename\n                        ... on ProfOfferFlat {\n                            roomType\n                            building {\n                                isNewbuilding\n                                floorsTotal\n                            }\n                            characteristics {\n                                floor\n                            }\n                            totalArea {\n                                value\n                                unit\n                            }\n                        }\n                    }\n                    status {\n                        hasHighlight\n                    }\n                }\n            }\n\n            ... on SingleOfferPointRoom {\n                offer {\n                    id\n                    isFavorite\n                    stats {\n                        isViewed\n                    }\n                    location {\n                        narrowRegion {\n                            id\n                        }\n                        coordinates {\n                            latitude\n                            longitude\n                        }\n                    }\n                    dealType {\n                        __typename\n                        ... on ProfOfferDealSell {\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                        ... on ProfOfferDealRent {\n                            utilities {\n                                has\n                            }\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    gallery {\n                        baseUrl\n                        mainImage {\n                            originPath\n                            preview1\n                        }\n                        images {\n                            originPath\n                            preview1\n                        }\n                    }\n                    realtyObject {\n                        __typename\n                        ... on ProfOfferRoom {\n                            livingArea {\n                                value\n                                unit\n                            }\n                            enclosingFlat {\n                                floor\n                                building {\n                                    isNewbuilding\n                                    floorsTotal\n                                }\n                            }\n                        }\n                    }\n                    status {\n                        hasHighlight\n                    }\n                }\n            }\n\n            ... on SingleOfferPointHouse {\n                offer {\n                    id\n                    isFavorite\n                    stats {\n                        isViewed\n                    }\n                    location {\n                        narrowRegion {\n                            id\n                        }\n                        coordinates {\n                            latitude\n                            longitude\n                        }\n                    }\n                    dealType {\n                        __typename\n                        ... on ProfOfferDealSell {\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                        ... on ProfOfferDealRent {\n                            utilities {\n                                has\n                            }\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    gallery {\n                        baseUrl\n                        mainImage {\n                            originPath\n                            preview1\n                        }\n                        images {\n                            originPath\n                            preview1\n                        }\n                    }\n                    realtyObject {\n                        __typename\n                        ... on ProfOfferHouse {\n                            totalArea {\n                                value\n                                unit\n                            }\n                            land {\n                                area {\n                                    value\n                                    unit\n                                }\n                            }\n                        }\n                    }\n                    status {\n                        hasHighlight\n                    }\n                }\n            }\n\n            ... on SingleOfferPointLand {\n                offer {\n                    id\n                    isFavorite\n                    stats {\n                        isViewed\n                    }\n                    location {\n                        narrowRegion {\n                            id\n                        }\n                        coordinates {\n                            latitude\n                            longitude\n                        }\n                    }\n                    dealType {\n                        __typename\n                        ... on ProfOfferDealSell {\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                        ... on ProfOfferDealRent {\n                            utilities {\n                                has\n                            }\n                            price {\n                                value\n                                rubPrice\n                                currency\n                                areaUnit\n                                history {\n                                    valueRub\n                                    diff {\n                                        rub\n                                    }\n                                    date2 {\n                                        iso\n                                        formattedAutoDate\n                                    }\n                                }\n                            }\n                        }\n                    }\n                    gallery {\n                        baseUrl\n                        mainImage {\n                            originPath\n                            preview1\n                        }\n                        images {\n                            originPath\n                            preview1\n                        }\n                    }\n                    realtyObject {\n                        __typename\n                        ... on ProfOfferLand {\n                            area {\n                                value\n                                unit\n                            }\n                        }\n                    }\n                    status {\n                        hasHighlight\n                    }\n                }\n            }\n        }\n    }\n}\n`;\n","/* eslint-disable @typescript-eslint/no-floating-promises */\n/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable no-shadow */\nimport React, { useMemo, useState } from 'react';\n\nimport { YMapVector } from '@search/common-core/ymap/Vector';\nimport { SearchMapRoute, SearchRoute } from '@search/offer-search-routes/src';\n\nimport { YMapBounds, yMapBoundsFromVectors, yMapBoundsRound } from '@search/ymap/src/bounds';\nimport { yMapVectorFromLatLon } from '@search/ymap/src/Vector';\nimport { YMapPlacemarkPriority } from '@search/ymap/src/Placemark';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { useGeoRootRegion } from '@search/geo/src/GeoRootRegionProvider';\nimport { formatNumber } from '@search/helpers/src/formatNumber';\nimport { useQueryDisplayValues } from '../../../../view/common/hooks/useQueryDisplayValues';\nimport { Filters, GeoFilter, MapBoundsFilter, RegionFilter, IFilter } from '../../../../view/filters/models/Filter';\nimport { GeoBaseStore } from '../../../geo/GeoBase';\nimport { useGeoTips } from '../../../geo/useGeoTips';\nimport { classifiedFilterFactory } from '../../filters/ClassifiedFilterFactory';\nimport { ClassifiedFilterCollection } from '../../filters/ClassifiedFilterCollection';\nimport { offerFilterGqlFromRoute } from '../../search/page/offerFilterGqlFromRoute';\nimport { offerSearchPageFilterToRoute } from '../../search/page/offerSearchPageFilterToRoute';\nimport {\n    offerSearchPageGetInitialFilters\n} from '../../search/page/offerSearchPageGetInitialFilters';\nimport { offerYMapPresetBounds } from '../presetBounds';\nimport { seoSearch } from '../../../seo/seoSearch';\nimport { OfferYMapUnionPlacemarkItem, offerYMapUnionPlacemarkIsMulti } from '../union/UnionPlacemarkItem';\nimport { useOfferYMapUnionItemUrlBuilder } from '../union/useItemUrlBuilder';\nimport { useSearchOffersCountFetcher } from '../../search/page/SearchOffersCount/useSearchOffersCountFetcher';\nimport { useFavoritesMutationSafe } from '../../../../view/common/components/FavoritesButton/FavoritesMutation';\nimport { OfferYMapApiPlacemarkResponseItem } from '../api/placemarkResponse';\nimport { useSearchOffersMapLoader, pointCompat } from './SearchOffersMapQuery/useSearchOffersMapQuery';\n\nexport const favoritedIds = new Set<string>();\n\nexport function useOfferYMapPageState2(searchRoute: SearchRoute | SearchMapRoute, isMobile = false) {\n    const searchParams = searchRoute.params();\n    const [ filters, updateState ] = React.useState(offerSearchPageGetInitialFilters(searchParams));\n\n    React.useEffect(() => {\n        updateState(offerSearchPageGetInitialFilters(searchParams));\n        loadingRef.current = false;\n    }, [ searchParams ]);\n\n    const searchOffersMapLoad = useSearchOffersMapLoader();\n\n    const nbId = searchParams.newBuildingIds[0] ?? 0;\n\n    const geoIds = [ ...searchParams.districtIds ];\n\n    const { auth } = useM2AuthContext();\n    const isMyOffers = auth.isAuthenticated && auth.isRealtorEmployeeEmpowered;\n    const userId = isMyOffers ? auth.user?.userId : null;\n\n    // Лучше, конечно, ориентироваться на зум, но тогда при изначальной отрисовке нам нужно его знать и идти в API уже с его учётом.\n    // Чтобы не таскать/протаскивать везде с собой зум, решил подхачить вот так\n    const showClusters = useMemo(() => {\n        let show = false;\n\n        if (searchParams.mapBounds?.bounds) {\n            show = (searchParams.mapBounds.bounds.max.x - searchParams.mapBounds.bounds.min.x) > 0.14 ||\n                (searchParams.mapBounds.bounds.max.y - searchParams.mapBounds.bounds.min.y) > 0.1;\n        } else {\n            return true;\n        }\n        return show;\n    }, [ searchParams.mapBounds?.bounds ]);\n    const response = searchOffersMapLoad({\n        regionId: searchParams.region,\n        nbId,\n        geoIds: geoIds.length > 0 ? geoIds : null,\n        filters: offerFilterGqlFromRoute({\n            ...searchParams,\n            selectedOffers: undefined,\n            mapBounds: {\n                ...searchParams.mapBounds,\n                geohash: undefined\n            },\n            userId\n        }),\n        taglessOnly: showClusters\n    });\n    const dataRef = React.useRef(response.data);\n\n    if (! response.loading) dataRef.current = response.data;\n\n    const data = dataRef.current;\n\n    const geoStore = React.useMemo(() => GeoBaseStore.fromGql(data?.geo), [ data?.geo ]);\n\n    geoStore.districts.regionId = searchParams.region;\n\n    const points = data?.searchOffersMap.points;\n\n    const pointBounds = React.useMemo(() => yMapBoundsFromVectors([\n        ...points?.map(offer => yMapVectorFromLatLon(pointCompat(offer).coordinates)) ?? [],\n        ...searchParams.mapBounds?.polygon ?? []\n    ]), [ points ]);\n\n    const loadingRef = React.useRef(false);\n\n    const handleSubmit = React.useCallback(() => {\n        if (response.loading) return;\n        response.clearCache(true);\n    }, [ response.clearCache, response.loading ]);\n\n    const updateFilters = React.useCallback((next: typeof filters) => {\n        const prev = searchRoute.params();\n\n        const newParams = next ? offerSearchPageFilterToRoute(next) : prev;\n\n        searchRoute.push(newParams, { delay: 1000 });\n        loadingRef.current = true;\n        updateState(next);\n    }, [ updateState, searchRoute ]);\n\n    const handleReset = React.useCallback(() => {\n        const initFilters = filters.reset();\n        const nextFilters = classifiedFilterFactory.createOrUpdateFilters(initFilters)\n            .update(new MapBoundsFilter()) as ClassifiedFilterCollection;\n\n        updateFilters(nextFilters);\n    }, [ updateFilters, filters ]);\n\n    const updateFilter = React.useCallback((filter: MapBoundsFilter) => {\n        if (loadingRef?.current) return;\n        const newFilters = filters.update(filter) as ClassifiedFilterCollection;\n\n        updateFilters(newFilters);\n\n        const oldParams = searchRoute?.params();\n\n        if (! oldParams || ! searchRoute) return;\n\n        searchRoute.replace({\n            ...oldParams,\n            mapBounds: {\n                bounds: filter.bounds,\n                polygon: filter.polygon,\n                geohash: filter.geohash\n            }\n        });\n    }, [ filters, searchRoute, updateFilters ]);\n\n    const {\n        isDrawAreaVisible,\n        toggleDrawArea,\n        closeDrawArea,\n        polygon,\n        setPolygon,\n        setBounds\n    } = useOfferYMapDrawArea({\n        filters,\n        updateFilter\n    });\n\n    const handleResetInSegment = React.useCallback(() => {\n        filters.remove(filters.get(Filters.price));\n        filters.remove(filters.get(Filters.rooms));\n        filters.remove(filters.get(Filters.newBuilding));\n        const newFilters = classifiedFilterFactory.clearAdditionalFilters(filters.getFilters());\n        const nextFilters = classifiedFilterFactory.createOrUpdateFilters(newFilters)\n            .update(new MapBoundsFilter()) as ClassifiedFilterCollection;\n\n        updateFilters(nextFilters);\n        closeDrawArea();\n    }, [ updateFilters, closeDrawArea, filters ]);\n\n    const geoFilter = filters.get(Filters.geo) as GeoFilter;\n\n    const geos = geoStore.getByIds(Array.from(geoFilter.geoIds))\n        ?.filter(item => searchParams.segments?.districtIds.includes(item.id) ||\n            searchParams.segments?.addresses.includes(item.id) ||\n            searchParams.segments?.metroIds.includes(item.id)\n        );\n\n    const [ queryDisplayValues, addQueryDisplayValue ] = useQueryDisplayValues({\n        newBuildingIds: geoFilter.newBuildingIds,\n        addressIds: geoFilter.addressIds\n    });\n\n    const regionFilter = filters.get(Filters.region) as RegionFilter;\n    const boundsFilter = filters.get(Filters.mapBounds) as MapBoundsFilter;\n    const rootRegions = useGeoRootRegion();\n    const rootRegion = rootRegions.byId(searchParams.region);\n    const bounds = boundsFilter.bounds ?? pointBounds ??\n        rootRegion?.bounds ?? offerYMapPresetBounds[regionFilter.region];\n    const boundsRef = React.useRef(bounds);\n\n    boundsRef.current = bounds;\n\n    // forced active item even if in points not received\n    const [ forcedActivePlacemark, setForcedActivePlacemark ] = useState<OfferYMapUnionPlacemarkItem>();\n    const setSelected = React.useCallback((item: OfferYMapUnionPlacemarkItem, e: MouseEvent, element?: HTMLElement) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        setForcedActivePlacemark(item);\n\n        const geohash = offerYMapUnionPlacemarkIsMulti(item) ? item.geohash : undefined;\n        const selectedOffer = ! offerYMapUnionPlacemarkIsMulti(item) ? item.id : undefined;\n        const selectedOffers = selectedOffer ? [ selectedOffer ] : undefined;\n\n        const prev = searchRoute.params();\n        const bounds = boundsRef.current;\n        const delta = bounds ? {\n            x: (bounds.max.x - bounds.min.x) / 2,\n            y: (bounds.max.y - bounds.min.y) / 2\n        } : undefined;\n        const center = item.coordinates;\n\n        let nextBounds = prev.mapBounds?.bounds;\n        const rect = element?.getBoundingClientRect();\n\n        if (delta && rect && ! isMobile && rect.left < 360) {\n            nextBounds = yMapBoundsRound({\n                min: {\n                    x: center.longitude - delta.x,\n                    y: center.latitude - delta.y\n                },\n                max: {\n                    x: center.longitude + delta.x,\n                    y: center.latitude + delta.y\n                }\n            });\n        }\n\n        if (delta && rect && isMobile && rect.bottom > 310) {\n            const centerY = center.latitude - (delta.y / 4);\n\n            nextBounds = yMapBoundsRound({\n                min: {\n                    x: center.longitude - delta.x,\n                    y: centerY - delta.y\n                },\n                max: {\n                    x: center.longitude + delta.x,\n                    y: centerY + delta.y\n                }\n            });\n        }\n\n        searchRoute.push({\n            ...prev,\n            selectedOffers,\n            mapBounds: {\n                ...prev.mapBounds,\n                bounds: nextBounds,\n                geohash\n            }\n        });\n    }, [ searchRoute, boundsRef, isMobile ]);\n\n    const clearSelected = React.useCallback(() => {\n        const prev = searchRoute.params();\n\n        setForcedActivePlacemark(undefined);\n        searchRoute.push({\n            ...prev,\n            selectedOffers: undefined,\n            mapBounds: {\n                ...prev.mapBounds,\n                geohash: undefined\n            }\n        });\n    }, [ searchRoute ]);\n\n    const hasSelected = Boolean(searchParams.mapBounds?.geohash || searchParams.selectedOffers?.length);\n\n    const selectedSet = React.useMemo(() => new Set([\n        ...(searchParams.mapBounds?.geohash ? [ searchParams.mapBounds.geohash ] : []),\n        ...searchParams.selectedOffers ?? []\n    ]), [ searchParams.mapBounds?.geohash, searchParams.selectedOffers ]);\n\n    const getItemUrl = useOfferYMapUnionItemUrlBuilder();\n\n    const favoritesMutationSafe = useFavoritesMutationSafe();\n\n    const isFavorite = React.useCallback((item: OfferYMapApiPlacemarkResponseItem) => {\n        const orig = favoritesMutationSafe.argsById(item.id)?.isFavorite;\n\n        return orig ?? (favoritedIds.has(item.id) ? true : item.isFavorite);\n    }, [ favoritesMutationSafe ]);\n    const [ isFavoriteForce, setIsFavoriteForce ] = React.useState([]);\n    const forceFavoriteUpdate = React.useCallback(() => {\n        setIsFavoriteForce([]);\n    }, []);\n    const selected = hasSelected ? {\n        geoHash: searchParams.mapBounds?.geohash,\n        selectedOffers: searchParams.selectedOffers,\n        forceFavoriteUpdate\n    } : undefined;\n\n    const responseItems = React.useMemo(() => {\n        const idsSet = new Set<string>();\n        const changedPoints = points?.map(raw => {\n            const item = pointCompat(raw);\n\n            if (item.kind === 'tagless') {\n                return item;\n            }\n            const isMultiPlacemark = offerYMapUnionPlacemarkIsMulti(item);\n            const isActive = isMultiPlacemark ?\n                selectedSet.has(item.geohash) :\n                selectedSet.has(item.id);\n\n            idsSet.add(isMultiPlacemark ? item.geohash : item.id);\n\n            const next: OfferYMapUnionPlacemarkItem = {\n                ...item,\n                isActive,\n                isFavorite: isMultiPlacemark ? false : isFavorite(item),\n                url: getItemUrl(item),\n                zIndexes: item.isHighlighted ? YMapPlacemarkPriority.Middle : undefined,\n                onClick: (e: MouseEvent, element?: HTMLElement) => setSelected(item, e, element)\n            };\n\n            return next;\n        }) ?? [];\n\n        if (\n            forcedActivePlacemark &&\n            ! idsSet.has(String(offerYMapUnionPlacemarkIsMulti(forcedActivePlacemark) ?\n                forcedActivePlacemark.geohash :\n                forcedActivePlacemark.id\n            ))\n        ) {\n            return [\n                ...changedPoints,\n                { ...forcedActivePlacemark, isActive: true }\n            ];\n        }\n        return changedPoints;\n    }, [ points, getItemUrl, setSelected, selectedSet, isFavorite, isFavoriteForce ]);\n    const clusterPoints = useMemo(() => {\n        if (! showClusters) return [];\n        return responseItems.map(item => {\n            return [\n                item.coordinates.latitude,\n                item.coordinates.longitude\n            ] as [ number, number ];\n        });\n    }, [ showClusters, responseItems ]);\n    const collection = useMemo(() => showClusters ? [] : responseItems, [ responseItems, showClusters ]);\n\n    const tips = useGeoTips(queryDisplayValues, filters, geoStore);\n\n    const offersCount = data?.searchOffersCount?.count ?? 0;\n\n    const isMskMOSPbLO = useMemo(() => [\n        RegionIdEnum.MSK,\n        RegionIdEnum.MSK_OBL,\n        RegionIdEnum.MSK_AND_MSK_OBL,\n        RegionIdEnum.SPB,\n        RegionIdEnum.LEN_OBL,\n        RegionIdEnum.SPB_AND_LEN_OBL\n    ].includes(searchParams.region), [ searchParams.region ]);\n    const isSellFlat = useMemo(() => filters.isSellFilterActive() && filters.isFlatFilterActive(), [ filters ]);\n    const showPromoRieltors = isMskMOSPbLO && ! filters.isNewBuilding() && isSellFlat;\n\n    const { pageTitle: headerTitle } = seoSearch({\n        params: searchParams,\n        geos,\n        offersCount,\n        region: rootRegion\n    });\n\n    return {\n        showClusters,\n        toggleDrawArea,\n        closeDrawArea,\n        isDrawAreaVisible,\n        count: offersCount,\n        collection,\n        clusterPoints,\n        loading: response.loading,\n        geoStore,\n        filters,\n        selected,\n        clearSelected,\n        tileUrl: data?.searchOffersMap.tileUrl,\n        bounds,\n        setBounds,\n        handleSubmit,\n        polygon,\n        setPolygon,\n        handleResetInSegment,\n        handleReset,\n        updateFilters,\n        addQueryDisplayValue,\n        queryDisplayValues,\n        tips,\n        headerTitle: data?.newBuilding?.offersSeo.h1 ?? headerTitle,\n        showPromoRieltors\n    };\n}\n\nexport function useOfferYMapDrawArea({\n    filters,\n    updateFilter: updateFilterRaw,\n    submit,\n    countInitial\n}: {\n    countInitial?: number;\n    submit?(): void;\n    filters: ClassifiedFilterCollection;\n    updateFilter(filter: IFilter): void;\n}) {\n    const boundsFilterInitial = filters.get(Filters.mapBounds) as MapBoundsFilter;\n    const regionFilter = filters.get(Filters.region) as RegionFilter;\n    const regionId = regionFilter.region;\n\n    const [ boundsFilterRaw, setBoundsFilterInt ] = React.useState(boundsFilterInitial);\n    const boundsFilter = submit ? boundsFilterRaw : boundsFilterInitial;\n\n    const countFetch = useSearchOffersCountFetcher();\n    const [ count, setCount ] = React.useState(countInitial ?? 0);\n\n    React.useEffect(() => {\n        if (! submit) return;\n\n        const newFilters = new ClassifiedFilterCollection(new Map(filters._filters));\n\n        newFilters.update(boundsFilter);\n\n        countFetch({ filters: newFilters }).then(data => {\n            setCount(data.data?.searchOffersSummary?.count ?? 0);\n        });\n    }, [ boundsFilter, filters, countFetch, submit ]);\n\n    const updateFilter = React.useCallback((filter: MapBoundsFilter) => {\n        if (submit) {\n            setBoundsFilterInt(filter);\n            return;\n        }\n\n        updateFilterRaw(filter);\n    }, [ updateFilterRaw, submit ]);\n\n    const setBounds = React.useCallback((newBounds: YMapBounds) => {\n        updateFilter(\n            new MapBoundsFilter(newBounds, boundsFilter.polygon, filters.getMapBoundsFilter().geohash)\n        );\n    }, [ boundsFilter, updateFilter, filters.getMapBoundsFilter().geohash ]);\n\n    const setPolygon = React.useCallback((newPolygon: YMapVector[]) => {\n        const prevBounds = boundsFilter.bounds;\n        const newBounds = newPolygon.length === 0 ? prevBounds : yMapBoundsFromVectors(newPolygon);\n\n        updateFilter(new MapBoundsFilter(newBounds, newPolygon));\n    }, [ boundsFilter, updateFilter ]);\n\n    const [\n        isDrawAreaVisible,\n        setIsDrawAreaVisible\n    ] = React.useState(Boolean(boundsFilter.polygon.length));\n\n    const closeDrawArea = React.useCallback(() => {\n        setIsDrawAreaVisible(false);\n    }, [ setIsDrawAreaVisible ]);\n\n    const toggleDrawArea = React.useCallback(() => {\n        setIsDrawAreaVisible(prev => ! prev);\n\n        if (isDrawAreaVisible) setPolygon([]);\n    }, [ setPolygon, isDrawAreaVisible ]);\n\n    const rootRegions = useGeoRootRegion();\n    const rootRegion = regionId ? rootRegions.byId(regionId) : undefined;\n\n    const bounds = boundsFilter.bounds ?? rootRegion?.bounds ?? undefined;\n    const polygon = boundsFilter.polygon;\n\n    const onSubmit = React.useCallback(() => {\n        if (submit) {\n            updateFilterRaw(new MapBoundsFilter(undefined, boundsFilter.polygon));\n            submit();\n        }\n    }, [ submit, boundsFilter ]);\n\n    const countStr = count > 0 ? `Показать ${formatNumber(count)}` : 'Нет объявлений';\n\n    return {\n        onSubmit,\n        count,\n        countStr,\n        bounds,\n        setBounds,\n        polygon,\n        setPolygon,\n        isDrawAreaVisible,\n        closeDrawArea,\n        toggleDrawArea\n    };\n}\n","import React from 'react';\n\nimport { BaseError } from '@search/error/src/BaseError';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { HiddenMutation$variables, HiddenMutation$data } from './__generated__/HiddenMutation.graphql';\n\nconst hiddenMutation = graphql`\n    mutation HiddenMutation($offerId: ID!, $isHidden: Boolean!) {\n        editHiddenPersonal(offerId: $offerId, isHidden: $isHidden) {\n            firstError {\n                __typename\n                ... on BaseError{\n                    message\n                }\n                ... on HiddenErrorInvalidOfferId {\n                    message\n                }\n                ... on HiddenErrorLimitExceeded {\n                    message\n                }\n                ... on HiddenErrorUnknown {\n                    message\n                }\n                ... on InternalError {\n                    message\n                }\n            }\n        }\n    }\n`;\n\nexport function useHiddenMutation() {\n    const gql = useGqlContext();\n\n    return React.useCallback(async (props: HiddenMutation$variables) => {\n        const data = await gql.execute<HiddenMutation$variables, HiddenMutation$data>(\n            hiddenMutation,\n            {\n                ...props\n            }\n        );\n\n        const firstError = data.data?.editHiddenPersonal.firstError;\n\n        if (firstError?.__typename === 'HiddenErrorLimitExceeded') {\n            throw new BaseError('HiddenErrorLimitExceeded', { cause: firstError });\n        }\n\n        if (firstError?.__typename === 'HiddenErrorInvalidOfferId') {\n            throw new BaseError('HiddenErrorInvalidOfferId', { cause: firstError });\n        }\n\n        return data;\n    }, [ gql ]);\n}\n\nexport function useHiddenMutationSafe() {\n    const { authScheduler } = useM2AuthContext();\n    const hiddenMutationCb = useHiddenMutation();\n\n    const hiddenMutationSafe = React.useMemo(() => {\n        const register = authScheduler.register('hiddenMutation', hiddenMutationCb);\n\n        return {\n            ...register,\n            argsById(id: string) {\n                return register.args().find(arg => arg.offerId === id);\n            }\n        };\n    }, [ hiddenMutationCb ]);\n\n    return hiddenMutationSafe;\n}\n","/* eslint-disable @typescript-eslint/no-floating-promises */\nimport React from 'react';\nimport { downloadOfferPdf } from '@search/vtbeco-frontend-core/domain/share/SharePrintButton';\nimport { isProfessional } from '@search/auth/src/helpers/isProfessional';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { useClassifiedOfferDataLayerPush } from '../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { favoritedIds } from '../../../../domain/offer/ymap/page/useOfferYMapPageState2';\nimport { useFavoritesModal } from './FavoritesModal';\nimport { useFavoritesMutationSafe } from './FavoritesMutation';\nimport { useHiddenMutationSafe } from './HiddenMutation';\n\ntype Setters<State> = {\n    [K in keyof State]: (args: State[K]) => void\n}\n\nfunction useRefState<State extends Object>(initialState: State, deps?: unknown[]) {\n    const [ , setCount ] = React.useState(0);\n    const refresh = React.useCallback(() => setCount(p => p + 1), []);\n\n    return React.useMemo(() => {\n        const get = { ...initialState };\n        const set = {} as Setters<State>;\n        const setAll = (newState: State) => Object.assign(get, newState);\n\n        Object.keys(get).forEach((key: any) => {\n            set[key as keyof State] = (v: State[keyof State]) => {\n                get[key as keyof State] = v;\n                refresh();\n            };\n        });\n\n        return { set, get, setAll };\n    }, deps ?? []);\n}\n\nexport function useFavoritesButtonState({\n    isFavorite: isFavoriteInitial,\n    noteTextInitial,\n    id: offerId,\n    eventAddId,\n    organizationName,\n    forceFavoriteUpdate\n} : {\n    forceFavoriteUpdate?(): void;\n    noteTextInitial?: string | null;\n    isFavorite: boolean;\n    id: string;\n    eventAddId?: string | null;\n    organizationName?: string | null;\n}) {\n    const { auth } = useM2AuthContext();\n    const isProf = isProfessional(auth.user?.currentRoleType);\n\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const favoritesMutationSafe = useFavoritesMutationSafe();\n\n    const { setError } = useFavoritesModal();\n\n    const [ isSaving, setIsSaving ] = React.useState(false);\n\n    const pendingArgs = favoritesMutationSafe.argsById(offerId);\n\n    const favorite = useRefState({\n        isFavorite: pendingArgs?.isFavorite ?? isFavoriteInitial,\n        // Если null - запендили удаление текста, если undefined, значит ничего не запендено, показываем noteInitial\n        noteText: pendingArgs?.noteText === null ? '' : (pendingArgs?.noteText ?? noteTextInitial ?? ''),\n    }, [ offerId ]);\n\n    React.useEffect(() => {\n        const favoriteState = favorite.get.isFavorite;\n        const favoriteString = favoriteState.toString();\n\n        if (sessionStorage?.getItem(`favorite-${offerId}`) !== favoriteString) {\n            sessionStorage?.setItem(`favorite-${offerId}`, `${favoriteString}`);\n        }\n    }, []);\n\n    const depsObj = {\n        offerId,\n        favoritesMutationSafe: favoritesMutationSafe.run,\n        setError,\n        eventAddId,\n        organizationName\n    };\n    const depsRef = React.useRef(depsObj);\n\n    depsRef.current = depsObj;\n\n    const updateFavorite = React.useCallback(async (next: Partial<typeof favorite.get>) => {\n        const deps = depsRef.current;\n\n        if (deps.eventAddId && next.isFavorite) {\n            dataLayerPush({\n                event: deps.eventAddId,\n                offerId: deps.offerId,\n                organizationName: deps.organizationName\n            });\n        }\n\n        const noteText = next.isFavorite === false ? '' : (next.noteText ?? favorite.get.noteText);\n\n        const req = { id: deps.offerId, ...favorite.get, ...next, offerId: deps.offerId, noteText };\n\n        try {\n            setIsSaving(true);\n            const res = await deps.favoritesMutationSafe(req);\n            const error = res?.data?.editFavoritePersonal2.firstError;\n\n            if (error) throw error;\n            deps.setError(undefined);\n            favorite.setAll(req);\n            if (req.isFavorite) favoritedIds.add(req.id);\n            else favoritedIds.delete(req.id);\n            forceFavoriteUpdate?.();\n        } catch (e) {\n            deps.setError(e);\n            sessionStorage?.setItem(`favorite-${offerId}`, 'false');\n        } finally {\n            setIsSaving(false);\n        }\n    }, [ favorite, forceFavoriteUpdate ]);\n\n    const favoriteToggle = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n        e.stopPropagation();\n        const isFavorite = ! favorite.get.isFavorite;\n\n        sessionStorage?.setItem(`favorite-${offerId}`, `${isFavorite}`);\n\n        updateFavorite({ isFavorite });\n    }, [ updateFavorite ]);\n\n    const [ isNoteEditing, setNoteEditing ] = React.useState(false);\n    const noteEditOpen = React.useCallback(() => setNoteEditing(true), [ ]);\n    const noteEditClose = React.useCallback(() => setNoteEditing(false), [ ]);\n    const handleDownloadPdf = React.useCallback(() => {\n        downloadOfferPdf(offerId);\n    }, [ ]);\n\n    const noteSave = React.useCallback((\n        { note }: { note?: string }\n    ) => {\n        dataLayerPush({ event: 'classified_save_note_click' });\n        updateFavorite({ isFavorite: true, noteText: note }).finally(noteEditClose);\n    }, [ updateFavorite ]);\n\n    const noteDelete = React.useCallback(() => {\n        updateFavorite({ noteText: '' }).finally(noteEditClose);\n    }, [ updateFavorite ]);\n\n    React.useEffect(() => {\n        if (sessionStorage?.getItem(`favorite-${offerId}`) === 'true') favorite?.set.isFavorite(true);\n        if (sessionStorage?.getItem(`favorite-${offerId}`) === 'false') favorite?.set.isFavorite(false);\n    }, [ typeof window !== 'undefined' ? sessionStorage?.getItem(`favorite-${offerId}`) : undefined ]);\n\n    return {\n        isProfessional: isProf,\n        isFavorite: favorite.get.isFavorite,\n        isSaving,\n        setIsFavorite: favorite.set.isFavorite,\n        favoriteToggle,\n\n        noteText: favorite.get.noteText,\n        isNoteEditing,\n        updateFavorite,\n        noteSave,\n        noteDelete,\n        noteEditOpen,\n        noteEditClose,\n        handleDownloadPdf,\n    };\n}\n\nexport type UseFavoritesButtonStateType = ReturnType<typeof useFavoritesButtonState>;\n\nexport function useHiddenButtonState({\n    isHidden: isHiddenInitial,\n    id: offerId\n} : {\n    isHidden: boolean;\n    id: string;\n}) {\n    const hiddenMutationSafe = useHiddenMutationSafe();\n\n    const [ isSaving, setIsSaving ] = React.useState(false);\n\n    const pendingArgs = hiddenMutationSafe.argsById(offerId);\n\n    const hidden = useRefState({\n        isHidden: pendingArgs?.isHidden ?? isHiddenInitial,\n    }, [ offerId ]);\n\n    const depsObj = {\n        offerId,\n        hiddenMutationSafe: hiddenMutationSafe.run,\n    };\n\n    const depsRef = React.useRef(depsObj);\n\n    depsRef.current = depsObj;\n\n    const updateHidden = React.useCallback(async (next: Partial<typeof hidden.get>) => {\n        const deps = depsRef.current;\n\n        const req = { id: deps.offerId, ...hidden.get, ...next, offerId: deps.offerId };\n\n        try {\n            setIsSaving(true);\n            const res = await deps.hiddenMutationSafe(req);\n            const error = res?.data?.editHiddenPersonal.firstError;\n\n            if (error) throw error;\n            hidden.setAll(req);\n        } catch (e) {\n            // eslint-disable-next-line no-console\n            console.log(e);\n        } finally {\n            setIsSaving(false);\n        }\n    }, [ hidden ]);\n\n    const hiddenToggle = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n        e.stopPropagation();\n        const isHidden = ! hidden.get.isHidden;\n\n        updateHidden({ isHidden });\n    }, [ updateHidden ]);\n\n    return {\n        isHidden: hidden.get.isHidden,\n        hiddenToggle,\n        isSaving\n    };\n}\n","import React from 'react';\nimport {\n    Footer as LayoutComponentFooter\n} from '@vtblife/layout-components';\nimport { errorCatcherWrap } from '@search/error/src/catcher';\nimport { MenuItemComponentProps } from '@vtblife/layout-components/dist/types/menu-item.interface';\nimport {\n    FooterLink,\n    FooterMiddleCol,\n    FooterPhoneType,\n} from '@vtblife/layout-components/dist/types/footer.interface';\nimport { FooterLink as FooterLinkConfig } from '@vtblife/layout-config/dist/types';\n\nimport { graphql, useGql } from '@search/gql-client/src';\nimport type { FooterQuery$data as FooterQueryResponse, FooterQuery$variables as FooterQueryVariables } from './__generated__/FooterQuery.graphql';\n\nconst query = graphql`\n    query FooterQuery($regionId: Int) {\n        footer(regionId: $regionId) {\n            downloadAppQrCode\n            socialLinks {\n                name\n                icon\n                href\n            }\n            top {\n                to\n                name\n                href\n                cdn\n            }\n            middleLinks {\n                title\n                links {\n                    to\n                    href\n                    cdn\n                    name\n                }\n            }\n        }\n    }\n`;\n\nconst FooterMenuItemComponent: React.FC<MenuItemComponentProps> = props => {\n    const { url = '/', path, ...rest } = props;\n\n    return <a key={url} href={url === 'undefined' ? path : url} {...rest} />;\n};\n\nconst Footer: React.FC<{\n    buildLink?: (url: string) => string;\n    phone?: FooterPhoneType;\n    regionId?: number;\n}> = ({ regionId, ...props }) => {\n    const { data } = useGql<FooterQueryVariables, FooterQueryResponse>(query, { regionId });\n\n    const { top, middleLinks: rawMiddleLinks, downloadAppQrCode, socialLinks = [] } = data?.footer || {};\n\n    const buildLink = (link: FooterLinkConfig) => {\n        const url = (link.to || link.href) as string;\n        const absoluteUrl = props.buildLink ? props.buildLink(url) : url;\n\n        return {\n            ...link,\n            href: link.cdn ? url : absoluteUrl\n        };\n    };\n\n    const topLinks: Array<Array<FooterLink>> = (top || [])\n        .map(links => (links || [])\n            .map(link => buildLink(link as FooterLinkConfig))\n        );\n\n    const middleLinks: Array<FooterMiddleCol> = (rawMiddleLinks || [])\n        .map(column => ({\n            title: column!.title,\n            links: (column!.links || []).map(link => buildLink(link as FooterLinkConfig))\n        }));\n\n    return (\n        <LayoutComponentFooter\n            top={topLinks}\n            middle={middleLinks}\n            menuItemComponent={FooterMenuItemComponent}\n            phone={props.phone}\n            socialLinks={socialLinks}\n            downloadAppQrCode={downloadAppQrCode}\n        />\n    );\n};\n\nexport default errorCatcherWrap(Footer);\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React from 'react';\n\nimport { Modifier } from '@popperjs/core';\nimport arrowModifier from '@popperjs/core/lib/modifiers/arrow';\nimport hideModifier from '@popperjs/core/lib/modifiers/hide';\nimport offsetModifier from '@popperjs/core/lib/modifiers/offset';\nimport preventOverflow from '@popperjs/core/lib/modifiers/preventOverflow';\nimport { defaultModifiers, popperGenerator } from '@popperjs/core/lib/popper-lite';\n\nimport { getElementSize, getWindowSize } from './getWindowSize';\nimport { useDomOnClickOutside } from './useDomOnClickOutside';\n\ntype TooltipDirection = 'up' | 'right' | 'down' | 'left';\n\ntype PopperDirection = 'top' | 'right' | 'bottom' | 'left';\n\nconst directions: TooltipDirection[] = [ 'up', 'right', 'down', 'left' ];\n\nconst padding = 8;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype PopperModifier = Partial<Modifier<any, any>>;\n\nconst directionAlias: Record<TooltipDirection, PopperDirection> = {\n    up: 'top',\n    down: 'bottom',\n    left: 'left',\n    right: 'right',\n};\n\nconst createPopper = popperGenerator({\n    defaultModifiers: [ ...defaultModifiers, preventOverflow, offsetModifier, arrowModifier, hideModifier ],\n});\n\nconst arrow = {\n    name: 'arrow',\n    options: {\n        padding: 2,\n    },\n};\n\nconst offset = {\n    name: 'offset',\n    options: {\n        offset: [ 0, padding ],\n    },\n};\n\nconst overflow = ($container: HTMLElement) => ({\n    name: 'preventOverflow',\n    options: {\n        boundary: $container,\n    },\n});\n\nconst adaptiveDirection = ($container: HTMLElement | null, direction: TooltipDirection): PopperModifier => ({\n    name: 'direction',\n    enabled: true,\n    phase: 'beforeRead',\n    fn({ state }) {\n        state.placement = fit({\n            $container,\n            $control: state.elements.reference as HTMLElement,\n            $tooltip: state.elements.popper,\n            direction,\n        });\n    },\n});\n\n// const silent = [offset, { name: 'eventListeners', enabled: false }, { name: 'computeStyles', enabled: false }];\n\nfunction fit({ $container, $control, $tooltip, direction }: {\n    $container: HTMLElement | null;\n    $control: HTMLElement;\n    $tooltip: HTMLElement;\n    direction: TooltipDirection;\n}) {\n    const box = $container ? getElementSize($container) : getWindowSize();\n    const origin = getElementSize(document.body);\n    const control = getElementSize($control);\n    const tooltip = getElementSize($tooltip);\n\n    const cleft = control.left - origin.left;\n    const cright = control.right - origin.left;\n    const ctop = control.top - origin.top;\n    const cbottom = control.bottom - origin.top;\n    const xmin = box.left - origin.left;\n    const xmax = box.right - origin.left;\n    const ymin = box.top - origin.top;\n    const ymax = box.bottom - origin.top;\n\n    const controlWithin = ctop - ymin >= 0 && ymax - cbottom >= 0;\n\n    const possibleDirections: Record<string, boolean> = {\n        left: controlWithin && cleft - padding - tooltip.width >= xmin,\n        right: controlWithin && cright + padding + tooltip.width <= xmax,\n        up: ctop - padding - tooltip.height >= ymin,\n        down: cbottom + padding + tooltip.height <= ymax,\n    };\n\n    const realDirection =\n        [\n            ...directions.slice(directions.indexOf(direction)),\n            ...directions.slice(0, directions.indexOf(direction)),\n        ].find(dir => possibleDirections[dir]) || direction;\n\n    return directionAlias[realDirection];\n}\n\nconst defaultContainer = { current: null };\n\nexport type UsePopperProps = {\n    container?: React.RefObject<HTMLElement>;\n    direction?: TooltipDirection;\n    triggerElement: HTMLElement | null | undefined;\n    hide(): void;\n}\n\nexport function usePopper({\n    container = defaultContainer,\n    direction = 'up',\n    triggerElement,\n    hide\n}: UsePopperProps) {\n    const popperRefs = React.useMemo(() => ({ current: [ null as HTMLElement | null ] }), [ ]);\n    const onClickOutside = React.useCallback((e: MouseEvent | TouchEvent) => {\n        e.preventDefault();\n        e.stopPropagation();\n        hide();\n    }, [ hide ]);\n\n    useDomOnClickOutside(popperRefs, onClickOutside);\n\n    const containerElement = container.current;\n\n    const popper = React.useMemo(() => {\n        // eslint-disable-next-line @typescript-eslint/no-shadow\n        let popper: ReturnType<typeof createPopper> | undefined;\n\n        return {\n            init(tooltipElement?: HTMLElement | null) {\n                if (! triggerElement) return;\n\n                if (! tooltipElement) {\n                    popper?.destroy();\n                    return;\n                }\n\n                popperRefs.current[0] = tooltipElement;\n                popperRefs.current[1] = triggerElement;\n                popper?.destroy();\n                popper = createPopper(triggerElement, tooltipElement, {\n                    placement: directionAlias[direction],\n                    modifiers: [\n                        arrow,\n                        offset,\n                        overflow(containerElement ?? document.body),\n                        adaptiveDirection(containerElement, direction),\n                    ],\n                });\n            },\n            destroy() {\n                popper?.destroy();\n                popperRefs.current.length = 0;\n                popper = undefined;\n            }\n        };\n    }, [ triggerElement, containerElement, direction ]);\n\n    React.useEffect(() => {\n        return () => popper.destroy();\n    }, [ popper ]);\n\n    return popper.init;\n}\n","import React, { useEffect } from 'react';\n\nexport function useDomOnClickOutside<El extends Element>(\n    refs: React.RefObject<readonly (El | undefined | null)[]>,\n    handler: (e: MouseEvent | TouchEvent) => void,\n    isEnabled = true,\n) {\n    useEffect(() => {\n        const listener = (event: MouseEvent | TouchEvent) => {\n            const target = event.target as El;\n\n            if (refs.current?.some(item => ! item || item.contains(target))) {\n                return;\n            }\n\n            handler(event);\n        };\n\n        if (isEnabled) {\n            document.addEventListener('mousedown', listener);\n            document.addEventListener('touchstart', listener);\n        } else {\n            document.removeEventListener('mousedown', listener);\n            document.removeEventListener('touchstart', listener);\n        }\n\n        return () => {\n            document.removeEventListener('mousedown', listener);\n            document.removeEventListener('touchstart', listener);\n        };\n    }, [ refs, handler, isEnabled ]);\n}\n","import React, { PropsWithChildren } from 'react';\nimport { createPortal } from 'react-dom';\nimport { usePopper } from '../Price/popper/usePopper';\n\nexport function SuggestPopup({\n    hide,\n    triggerElement,\n    children\n}: PropsWithChildren<Parameters<typeof usePopper>[0]>) {\n    const popupElement = usePopper({ direction: 'down', triggerElement, hide });\n\n    return createPortal(\n        <div\n            // zIndex from modals uikit -1\n            style={{ width: triggerElement?.offsetWidth, zIndex: 1000 }}\n            ref={popupElement}\n        >\n            {children}\n        </div>,\n        document.body\n    );\n}\n","/* eslint-disable complexity */\nimport React, { useState, useCallback, ReactNode, Fragment } from 'react';\nimport groupBy from 'lodash/groupBy';\n\nimport { Typography } from '@vtblife/uikit';\n\nimport { RootRegionsApplicationEnum, SuggestTypeEnum } from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport classname from '@search/classname/src';\nimport { IUseControlReturnedHandlers } from '@search/hooks/src/useControl';\n\nimport { Size } from '@search/vtbeco-ui/src/types';\nimport { Highlight } from '@search/vtbeco-ui/src/components/controls/Highlight/Highlight';\nimport Suggest, { IInitialSuggestState, ISuggestion, ISuggestProps } from '@search/vtbeco-ui/src/components/controls/Suggest';\n\nimport { mskOblMetroStation, mskMetroStation } from '@search/offer-search-routes/src/mappers/regions/msk/mskMetroMapper';\nimport { mskOblDistrict, mskDistrict } from '@search/offer-search-routes/src/mappers/regions/msk/mskDistrictMapper';\nimport { mskOblCity, mskCity } from '@search/offer-search-routes/src/mappers/regions/msk/mskCityMapper';\nimport { mskOblRayon, mskRayon } from '@search/offer-search-routes/src/mappers/regions/msk/mskRayonMapper';\n\nimport { lenOblMetroStation, spbMetroStation } from '@search/offer-search-routes/src/mappers/regions/spb/spbMetroMapper';\nimport { lenOblDistrict, spbDistrict } from '@search/offer-search-routes/src/mappers/regions/spb/spbDistrictMapper';\nimport { lenOblCity, spbCity } from '@search/offer-search-routes/src/mappers/regions/spb/spbCityMapper';\n\nimport type { UseToggleChainResult } from '@search/vtbeco-frontend-core/view/common/components/Price/popper/useToggleChain';\n\nimport { RegionIdEnum } from '../../../../enums';\nimport useDebouncedCallback from '../../../../view/common/hooks/useDebouncedCallback';\nimport { ArrayElement } from '../../../../types';\n\nimport { SuggestPopup } from './SuggestPopup';\nimport { MetroMark } from './MetroMark';\nimport './GeoSuggest.css';\nimport type {\n    GeoSuggestQuery$data as GeoSuggestQueryResponse,\n    GeoSuggestQuery$variables as GeoSuggestQueryVariables\n} from './__generated__/GeoSuggestQuery.graphql';\n\ntype ExtractSuggestItem<A> = A extends { __typename: '%other' } ? never : A;\n\nexport type SuggestionType = ExtractSuggestItem<\n    NonNullable<\n        ArrayElement<\n            NonNullable<GeoSuggestQueryResponse['suggest']>\n        >\n    >\n>;\nexport type SuggestionTypenameType = Exclude<SuggestionType['__typename'], '%other'>;\ntype SuggestionsByGroupType = Record<Partial<SuggestionTypenameType>, Array<SuggestionType>>;\n\nexport interface GeoSuggestProps {\n    regionId: number;\n    rootRegionsApp: RootRegionsApplicationEnum;\n    onGeoChange: (ids: SuggestionType) => void;\n    renderInput?: (\n        props: {\n            borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n            inputSize?: Size;\n            placeholder?: string;\n            disabled?: boolean;\n            borderOut?: boolean;\n        },\n        state: IInitialSuggestState<ISuggestion>,\n        handlers: IUseControlReturnedHandlers & {\n            handleInputChange: (text: string) => void;\n            handleInputKeyDown: (e: React.KeyboardEvent) => void;\n        }\n    ) => ReactNode;\n    onInputToggleFocus?: (disabled: boolean) => void;\n    autoFocus?: boolean;\n    listBorderOut?: boolean;\n    clear?: boolean;\n    borderOut?: boolean;\n    showNewBuildingsGroup?: boolean;\n    startWithNewBuildings?: boolean;\n    placeholder: string;\n    placeholderWithNewBuildings?: string;\n    limit?: number;\n    suggestTypes?: SuggestTypeEnum[];\n    spySuggest?: UseToggleChainResult;\n    selected?: Set<number>;\n}\n\nconst cn = classname.bind(null, 'GeoSuggest');\n\nconst TYPE_MAP: Record<SuggestionTypenameType, string> = {\n    SuggestItemMetro: 'Метро',\n    SuggestItemAddress: 'Адрес',\n    SuggestItemDistrict: 'Районы',\n    SuggestItemNewBuilding: 'Новостройки',\n    SuggestItemDeveloper: 'Застройщики'\n};\n\nconst QUERY = graphql`\n    query GeoSuggestQuery(\n        $text: String!\n        $rootRegionsApp: RootRegionsApplicationEnum\n        $suggestTypes: [SuggestTypeEnum!]\n        $userRegionId: Int\n        $limit: Int\n    ) {\n        suggest(\n            text: $text\n            rootRegionsApp: $rootRegionsApp\n            suggestTypes: $suggestTypes\n            userRegionId: $userRegionId\n            limit: $limit\n        ) {\n            __typename\n\n            ... on SuggestItemNewBuilding {\n                label\n                data {\n                    id\n                    scope\n                    regionId\n                }\n                newBuilding {\n                    id\n                    type\n                    name\n                    title {\n                        nominative\n                    }\n                }\n            }\n\n            ...on SuggestItemDeveloper {\n                label\n                data {\n                    id\n                    scope\n                }\n                developer {\n                    id\n                    title\n                }\n            }\n\n            ... on SuggestItemDistrict {\n                label\n                data {\n                    id\n                    scope\n                    regionId\n                }\n                district {\n                    id\n                    translit\n                    parentId\n                    mainName\n                    displayName\n                    displayNameWithContext\n                    kind\n                    locative\n                }\n            }\n\n            ... on SuggestItemMetro {\n                label\n                data {\n                    id\n                    scope\n                    regionId\n                }\n                metroStation {\n                    id\n                    allRoutesColorsList\n                    interchangedStations\n                    lines\n                }\n            }\n\n            ... on SuggestItemAddress {\n                label\n                data {\n                    id\n                    scope\n                    regionId\n                }\n                address {\n                    id\n                    translit\n                    kind\n                    parentId\n                    mainName\n                    displayName\n                    displayNameWithContext\n                    locative\n                }\n            }\n        }\n    }\n`;\n\ninterface GeoSuggestState {\n    suggestionsByGroup: SuggestionsByGroupType;\n    suggestions: SuggestionType[];\n}\n\nconst renderSuggestItem = (item: SuggestionType, label: string) => {\n    const scope = item?.data?.scope ? (\n        <Typography\n            variant='small-alone'\n            color='secondary'\n        >\n            {item.data.scope}\n        </Typography>\n    ) : null;\n\n    switch (item.__typename) {\n        case SuggestItemTypeEnum.Metro: {\n            return (\n                <Fragment>\n                    <div className={cn('list-item-suggest', { type: 'metro' })}>\n                        {\n                            item?.metroStation?.lines ? <MetroMark colors={item.metroStation.lines} /> : null\n                        }\n                        <Typography variant='primary'>\n                            <Highlight text={item.label || ''} highlight={label} />\n                        </Typography>\n                    </div>\n                    {scope}\n                </Fragment>\n            );\n        }\n\n        default:\n            return (\n                <Typography variant='primary'>\n                    <Highlight text={item?.label || ''} highlight={label} />\n                    {scope}\n                </Typography>\n            );\n    }\n};\n\nconst mskGeoIds = new Set(Object.values({\n    ...mskMetroStation,\n    ...mskRayon,\n    ...mskDistrict,\n    ...mskCity\n}));\n\nconst mskOblGeoIds = new Set(Object.values({\n    ...mskOblMetroStation,\n    ...mskOblRayon,\n    ...mskOblDistrict,\n    ...mskOblCity\n}));\n\nconst spbGeoIds = new Set(Object.values({\n    ...spbMetroStation,\n    ...spbDistrict,\n    ...spbCity\n}));\n\nconst lenOblGeoIds = new Set<number>(Object.values({\n    ...lenOblMetroStation,\n    ...lenOblDistrict,\n    ...lenOblCity\n}));\n\nexport const correctAndBroadenRegionId = (\n    id: number,\n    type: SuggestItemTypeEnum,\n    currentRegionId: number\n): number => {\n    if (type !== SuggestItemTypeEnum.District && type !== SuggestItemTypeEnum.Metro) {\n        return currentRegionId;\n    }\n\n    if (currentRegionId === RegionIdEnum.MSK && mskOblGeoIds.has(id)) {\n        return RegionIdEnum.MSK_AND_MSK_OBL;\n    }\n\n    if (currentRegionId === RegionIdEnum.MSK_OBL && mskGeoIds.has(id)) {\n        return RegionIdEnum.MSK_AND_MSK_OBL;\n    }\n\n    if (currentRegionId === RegionIdEnum.SPB && lenOblGeoIds.has(id)) {\n        return RegionIdEnum.SPB_AND_LEN_OBL;\n    }\n\n    if (currentRegionId === RegionIdEnum.LEN_OBL && spbGeoIds.has(id)) {\n        return RegionIdEnum.SPB_AND_LEN_OBL;\n    }\n\n    return currentRegionId;\n};\n\nexport const correctSuggestion = (\n    suggestion: SuggestionType,\n    regionId: number\n): [\n    SuggestionType,\n    number\n] => {\n    const id = suggestion?.data?.id;\n\n    let newSuggestion = suggestion;\n\n    if (suggestion?.__typename === SuggestItemTypeEnum.Address && Object.values({\n        ...mskRayon,\n        ...mskDistrict,\n        ...mskCity,\n        ...mskOblRayon,\n        ...mskOblDistrict,\n        ...mskOblCity,\n        ...spbDistrict,\n        ...spbCity,\n        ...lenOblDistrict,\n        ...lenOblCity\n    }).includes(id)) {\n        newSuggestion = {\n            ...suggestion,\n            __typename: SuggestItemTypeEnum.District,\n            district: suggestion.address,\n            address: undefined\n        };\n    }\n\n    return [\n        newSuggestion,\n        correctAndBroadenRegionId(id, newSuggestion?.__typename, regionId)\n    ];\n};\n\nexport const GeoSuggest: React.FC<GeoSuggestProps> = ({\n    regionId,\n    rootRegionsApp = RootRegionsApplicationEnum.Unknown,\n    onGeoChange,\n    renderInput,\n    onInputToggleFocus,\n    autoFocus = false,\n    clear = false,\n    borderOut = true,\n    listBorderOut = false,\n    showNewBuildingsGroup,\n    startWithNewBuildings = false,\n    placeholder,\n    placeholderWithNewBuildings,\n    limit,\n    suggestTypes,\n    spySuggest,\n    selected\n}) => {\n    const gql = useGqlContext();\n    const [ suggestions, setSuggestions ] = useState<GeoSuggestState>({\n        suggestionsByGroup: {\n            SuggestItemMetro: [],\n            SuggestItemAddress: [],\n            SuggestItemDistrict: [],\n            SuggestItemNewBuilding: [],\n            SuggestItemDeveloper: []\n        },\n        suggestions: []\n    });\n\n    const [ debouncedSuggest ] = useDebouncedCallback((text: string) => {\n        if (! text) return;\n\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        gql.execute<GeoSuggestQueryVariables, GeoSuggestQueryResponse>(QUERY, {\n            text,\n            rootRegionsApp,\n            userRegionId: regionId,\n            limit,\n            suggestTypes\n        })\n            .then(data => {\n                let items = data?.data?.suggest\n                    ?.filter(item => item && item.__typename !== '%other' && ! selected?.has(item.data.id)) ?? [];\n\n                // Пока умеем искать только один ЖК\n                if (! showNewBuildingsGroup) {\n                    items = items.filter(item => item && item.__typename !== SuggestItemTypeEnum.NewBuilding);\n                }\n\n                let suggestionsByGroup = groupBy(items, '__typename') as SuggestionsByGroupType;\n\n                // Делаем правильный порядок\n                suggestionsByGroup = {\n                    SuggestItemMetro: suggestionsByGroup.SuggestItemMetro ?? [],\n                    SuggestItemAddress: suggestionsByGroup.SuggestItemAddress ?? [],\n                    SuggestItemDistrict: suggestionsByGroup.SuggestItemDistrict ?? [],\n                    SuggestItemNewBuilding: suggestionsByGroup.SuggestItemNewBuilding ?? [],\n                    SuggestItemDeveloper: suggestionsByGroup.SuggestItemDeveloper ?? []\n                };\n\n                if (startWithNewBuildings) {\n                    const { SuggestItemNewBuilding, SuggestItemDeveloper } = suggestionsByGroup;\n\n                    suggestionsByGroup = {\n                        // @ts-ignore\n                        SuggestItemNewBuilding,\n                        // @ts-ignore\n                        SuggestItemDeveloper,\n                        ...suggestionsByGroup\n                    };\n                }\n\n                setSuggestions({\n                    suggestionsByGroup,\n                    suggestions: Object\n                        .values(suggestionsByGroup)\n                        .reduce<SuggestionType[]>((ret, groupedItems) =>\n                            ret.concat(groupedItems as []), [])\n                });\n            });\n    }, 300);\n\n    const fetchSuggestions = (text: string) => {\n        debouncedSuggest(text);\n    };\n\n    const setSuggestion = useCallback((suggestion: SuggestionType) => {\n        const [ newSuggestion, newRegionId ] = correctSuggestion(suggestion, regionId);\n\n        onGeoChange(newRegionId && regionId !== newRegionId ? {\n            ...newSuggestion,\n            data: {\n                ...newSuggestion.data,\n                regionId: newRegionId\n            }\n        } : newSuggestion);\n    }, [ onGeoChange, regionId ]);\n\n    const renderList = useCallback<NonNullable<ISuggestProps<SuggestionType>['renderList']>>(\n        (props, { focusedIndex, label = '' }, handlers) => {\n            let realIndex = 0;\n\n            return (\n                <div className={cn('list-container', { borderOut: listBorderOut })}>\n                    <div\n                        data-test='filter-geo-suggest'\n                        className={cn('list', { borderOut: listBorderOut })}>\n                        {\n                            Object\n                                .entries(suggestions.suggestionsByGroup)\n                                .filter(([ , items ]) => Array.isArray(items) && items.length)\n                                .map((ent, index, { length }) => {\n                                    // eslint-disable-next-line max-len\n                                    const [ group, items ] = ent as [ SuggestionTypenameType, SuggestionType[] ];\n\n                                    return (\n                                        <div\n                                            key={group}\n                                            data-test={`filter-geo-suggest-${group}`}\n                                            className={cn('list-group', { borderOut: listBorderOut })}\n                                        >\n                                            <Typography\n                                                variant='small-alone'\n                                                className={cn('list-group-header', { borderOut: listBorderOut })}\n                                            >\n                                                {TYPE_MAP[group] || ''}\n                                            </Typography>\n                                            {\n                                                items.map(item => {\n                                                    const currentIndex = realIndex++;\n\n                                                    const onMouseDown = onInputToggleFocus ? (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => {\n                                                        if (onInputToggleFocus) {\n                                                            onInputToggleFocus(false);\n                                                        }\n                                                        handlers.handleItemMouseDown(e, currentIndex);\n                                                    } : (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => handlers.handleItemMouseDown(e, currentIndex);\n\n                                                    return (\n                                                        <div\n                                                            data-test='filter-geo-suggest-item'\n                                                            id={`filter-geo-suggest-item-${item?.data?.id ?? currentIndex}`}\n                                                            key={`${label}-${currentIndex}`}\n                                                            className={cn('list-item', {\n                                                                borderOut: listBorderOut,\n                                                                highlight: currentIndex === focusedIndex\n                                                            })}\n                                                            onMouseEnter={e =>\n                                                                handlers.handleItemMouseEnter(e, currentIndex)\n                                                            }\n                                                            onMouseDown={onMouseDown}\n                                                        >\n                                                            {item && renderSuggestItem(item, label)}\n                                                        </div>\n                                                    );\n                                                })\n                                            }\n                                            {index < length - 1 && (\n                                                <div className={cn('group-divider', {\n                                                    borderOut: listBorderOut\n                                                })} />\n                                            )}\n                                        </div>\n                                    );\n                                })\n                        }\n                    </div>\n                </div>\n            );\n        },\n        [ listBorderOut, onInputToggleFocus, suggestions.suggestionsByGroup ]\n    );\n\n    return (\n        <div className={cn()}>\n            <Suggest\n                <SuggestionType>\n                width='max'\n                size='xxl'\n                inputSize='s'\n                clear={clear}\n                borderOut={borderOut}\n                autoFocus={autoFocus}\n                suggestions={suggestions.suggestions}\n                onClick={spySuggest?.show}\n                renderList={\n                    (props, suggestionState, handlers) => spySuggest ? (\n                        <SuggestPopup hide={spySuggest?.hide} triggerElement={spySuggest?.triggerElement}>\n                            {renderList(props, suggestionState, handlers)}\n                        </SuggestPopup>\n                    ) :\n                        renderList(props, suggestionState, handlers)\n                }\n                renderInput={renderInput}\n                onInputToggleFocus={onInputToggleFocus}\n                renderEmptyList={\n                    ({ emptyText }) => spySuggest ? (\n                        <SuggestPopup hide={spySuggest?.hide} triggerElement={spySuggest?.triggerElement}>\n                            <div className={cn('empty', { borderOut: listBorderOut })}>\n                                {emptyText}\n                            </div>\n                        </SuggestPopup>\n                    ) : (\n                        <div className={cn('empty', { borderOut: listBorderOut })}>\n                            {emptyText}\n                        </div>\n                    )\n                }\n                onSelect={setSuggestion}\n                clearOnSelect\n                placeholder={\n                    showNewBuildingsGroup && placeholderWithNewBuildings ?\n                        placeholderWithNewBuildings :\n                        placeholder\n                }\n                fetchSuggestions={fetchSuggestions} />\n        </div>\n    );\n};\n","import classname from '@search/classname/src';\nimport React from 'react';\nimport './MetroMark.css';\n\nconst cnMetroMark = classname.bind(null, 'MetroMark');\n\nexport const MetroMark: React.FunctionComponent<{\n    className?: string;\n    colors: readonly string[];\n}> = ({ colors, className }) => {\n    return (\n        <span className={cnMetroMark(null, {}, className)}>\n            {\n                colors.slice(0).reverse().map(color => (\n                    <span\n                        key={color}\n                        style={{ backgroundColor: color }}\n                        className={cnMetroMark('line', { type: 'mark' })}\n                    />\n                ))\n            }\n        </span>\n    );\n};\n","import React, { useCallback, useMemo } from 'react';\n\nimport { Header as LayoutComponentHeader } from '@vtblife/layout-components';\n\nimport { graphql } from '@search/gql-client/src/useGql';\nimport { useGql2Loader } from '@search/gql-client/src/useGql2';\nimport { useGqlContext } from '@search/gql-client/src/gqlContext';\nimport { useRouter } from '@search/offer-search-routes/src';\nimport { errorCatcherWrap } from '@search/error/src/catcher';\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport classname from '@search/classname/src';\nimport { NewBuildingCardRoute } from '@search/nb-routes/src/NewBuildingCardRoute';\nimport { NewBuildingConstructionRoute } from '@search/nb-routes/src/NewBuildingConstructionRoute';\nimport { NewBuildingSearchRoute } from '@search/nb-routes/src/NewBuildingSearchRoute';\nimport { DeveloperSearchRoute } from '@search/nb-routes/src/DeveloperSearchRoute';\nimport { DeveloperLandingRoute } from '@search/nb-routes/src/DeveloperLandingRoute';\nimport { DeveloperRoute } from '@search/nb-routes/src/DeveloperRoute';\nimport { NewBuildingSearchMapRoute } from '@search/nb-routes/src/NewBuildingSearchMapRoute';\nimport { Shared } from '@search/whitelabel-search-www/types/shared';\n\nimport { dataLayerPush } from '../../../../domain/google/dataLayerPush';\nimport { getDeveloperPromoName } from '../../../../domain/newbuilding/developer-promo/helpers';\nimport { getDeveloperBannerGtmData } from '../../../../domain/newbuilding/developer-promo/analytics';\nimport { DeveloperWithPromoName } from '../../../../domain/newbuilding/developer-promo/types';\n\nimport type { HeaderQuery$variables as HeaderQueryVariables, HeaderQuery$data as HeaderQueryResponse } from './__generated__/HeaderQuery.graphql';\nimport './styles.css';\n\nconst POSSIBLE_ACTIVE_PARTNERS_SET = new Set([\n    'samolet'\n]);\n\nconst cn = classname.bind(null, 'Header');\n\nconst headerQuery = graphql`\n    query HeaderQuery($regionId: Int) {\n        header(regionId: $regionId) {\n            items {\n                id\n                displayName\n                path\n                icon\n                dropdownMenu {\n                    id\n                    displayName\n                    url\n                    icon\n                    dropdownMenu {\n                        id\n                        displayName\n                        url\n                    }\n                }\n            }\n            partners {\n                samolet {\n                    id\n                    logo\n                    logoWhite\n                    url\n                }\n            }\n            personalButtons {\n                favorites {\n                    professionalUrl,\n                    url\n                }\n                offerPlacement {\n                    professionalUrl,\n                    authorizedUrl,\n                    url\n                }\n                savedSearch {\n                    professionalUrl,\n                    url\n                }\n            }\n            loginPaths {\n                default {\n                    id\n                    url\n                }\n                client {\n                    id\n                    url\n                }\n                partner {\n                    id\n                    url\n                }\n                professional {\n                    id\n                    url\n                }\n            }\n        }\n        sidebar(regionId: $regionId) {\n            items {\n                id\n                displayName\n                path\n                url\n                icon\n                showInDesktopProfileMenu\n                dropdownMenu {\n                    id\n                    displayName\n                    path\n                    url\n                    icon\n                    showInDesktopProfileMenu\n                }\n            }\n            footerItems {\n                id\n                displayName\n                path\n                url\n                icon\n                showInDesktopProfileMenu\n            }\n        }\n    }\n`;\n\nexport function useHeaderFetcher() {\n    const gql = useGqlContext();\n\n    return React.useCallback(\n        (vars: HeaderQueryVariables, opts?: { signal?: AbortSignal }) => gql.client<\n            HeaderQueryVariables,\n            HeaderQueryResponse\n        >(headerQuery, vars, opts)\n        , [ gql ]\n    );\n}\n\nexport function useHeaderLoader() {\n    return useGql2Loader(useHeaderFetcher(), { cachePrefix: 'Header', authTrack: true });\n}\n\nconst Header: React.FC<{\n    buildLink?: (url: string) => string;\n    regionId?: number;\n    developerPromoRegionId?: number;\n    isFullWidth?: boolean;\n    isBordered?: boolean;\n}> = ({\n    buildLink,\n    regionId,\n    developerPromoRegionId,\n    isFullWidth = true,\n    isBordered\n}) => {\n    const { auth } = useM2AuthContext();\n    const headerLoader = useHeaderLoader();\n    const { data: dataRaw } = headerLoader({ regionId });\n    const dataRef = React.useRef(dataRaw);\n\n    if (dataRaw) dataRef.current = dataRaw;\n    const data = dataRef.current;\n\n    // @ts-ignore\n    const router: Shared.RouterType = useRouter();\n    const developerWithPromoNameByRegion = useMemo<DeveloperWithPromoName | undefined>(() => {\n        const resultPartner = getDeveloperPromoName(developerPromoRegionId);\n\n        // @ts-expect-error\n        return POSSIBLE_ACTIVE_PARTNERS_SET.has(resultPartner) ? resultPartner : undefined;\n    }, [ developerPromoRegionId ]);\n    const partners = useMemo(() => {\n        return Object.fromEntries(Object.entries(data?.header.partners ?? {}).filter(([ key, value ]) => POSSIBLE_ACTIVE_PARTNERS_SET.has(key) && value));\n    }, [ data?.header.partners ]);\n\n    const pageType = useMemo(() => {\n        const { route } = router.resolve([\n            NewBuildingSearchRoute,\n            NewBuildingSearchMapRoute,\n            DeveloperSearchRoute,\n            NewBuildingCardRoute,\n            NewBuildingConstructionRoute,\n            DeveloperLandingRoute,\n            DeveloperRoute\n        ]);\n\n        switch (route.displayName) {\n            case 'NewBuildingCardRoute':\n            case 'NewBuildingConstructionRoute':\n                return 'card';\n            case 'DeveloperLandingRoute':\n                return 'landing';\n            case 'NewBuildingSearchRoute':\n            case 'NewBuildingSearchMapRoute':\n            case 'DeveloperSearchRoute':\n            case 'DeveloperRoute':\n                return 'serp';\n            default:\n                return;\n        }\n    }, [ router ]);\n\n    const onPartnerClick = useCallback((partnerName: string) => {\n        const dataObj = pageType && getDeveloperBannerGtmData(partnerName, {\n            action: 'click',\n            section: 'logo',\n            pageType\n        });\n\n        dataObj && dataLayerPush(dataObj);\n    }, [ pageType ]);\n\n    const currentRole = auth.user?.currentRoleType;\n\n    const getUrl = (url?: string | null) => buildLink && url?.startsWith('/') ? buildLink(url) : url;\n\n    const items = data?.header?.items?.map(item => ({\n        ...item,\n\n        path: getUrl(item?.path),\n\n        dropdownMenu: item.dropdownMenu?.map(dropDownItem => ({\n            ...dropDownItem,\n            url: getUrl(dropDownItem?.url),\n            id: dropDownItem.id + (dropDownItem.url ?? '0'),\n            dropdownMenu: dropDownItem.dropdownMenu?.map(subDropdownItem => ({\n                ...subDropdownItem,\n                url: getUrl(subDropdownItem?.url),\n                id: subDropdownItem.id + (subDropdownItem.url ?? '0')\n            }))\n        }))\n    })) ?? [];\n\n    return (\n        <div className={cn()}>\n            <LayoutComponentHeader\n                isColored\n                isBordered={isBordered}\n                isFullWidth={isFullWidth}\n                cdnUrl='https://cdn.m2.ru'\n                loginPaths={data?.header.loginPaths}\n                items={items}\n                partners={partners}\n                pathname={router.location.pathname}\n                activePartner={developerWithPromoNameByRegion}\n                authorizedItems={data?.sidebar}\n                roleType={currentRole}\n                logoutPath={`/logout?retpath=${encodeURIComponent(router.currentUrl)}`}\n                onPartnerClick={onPartnerClick}\n                personalButtons={data?.header?.personalButtons}\n            />\n        </div>\n    );\n};\n\nexport default errorCatcherWrap(Header);\n","import { isMskWide } from '@search/helpers/src/isRegion';\n\nimport { DeveloperWithPromoName } from './types';\n\nexport const getDeveloperPromoName = (regionId?: number): DeveloperWithPromoName | undefined => {\n    if (regionId) {\n        if (isMskWide(regionId)) {\n            return 'samolet';\n        }\n    }\n\n    return;\n};\n","/* eslint-disable max-len */\nimport { ScriptTagAttributes } from '../Scripts';\n\nconst today = new Date();\nconst currentMonthStart = new Date(Date.UTC(today.getFullYear(), today.getMonth(), 1));\nconst nextMonthEnd = new Date(Date.UTC(today.getFullYear(), today.getMonth() + 2, 0));\n\nexport function seoLdEventScript({\n    url = '',\n    actionName = '',\n    actionNamePrefix = '🔔 ',\n    imageUrl = undefined as string | undefined,\n    description = '',\n    startDate = currentMonthStart,\n    endDate = nextMonthEnd,\n    location = {\n        mainName: '',\n        latitude: undefined as number | undefined,\n        longitude: undefined as number | undefined,\n        region: ''\n    },\n    organizer = {\n        name: 'M2',\n        url: 'https://m2.ru'\n    }\n} = {}): ScriptTagAttributes {\n    const obj = {\n        '@context': 'http://schema.org',\n        '@type': 'SaleEvent',\n        name: `${actionNamePrefix}${actionName}`,\n        description,\n        startDate: startDate.toISOString(),\n        endDate: endDate.toISOString(),\n        url,\n        location: ! location ? undefined : {\n            '@type': 'Place',\n            '@context': 'http://schema.org',\n            name: location.mainName,\n            address: {\n                '@type': 'PostalAddress',\n                '@context': 'http://schema.org',\n                streetAddress: location.region,\n                addressLocality: location.region,\n                addressRegion: location.region\n            },\n            geo: ! location.latitude ? undefined : {\n                '@type': 'GeoCoordinates',\n                '@context': 'http://schema.org',\n                latitude: location.latitude,\n                longitude: location.longitude\n            }\n        },\n        image: imageUrl,\n        performer: { name: location.mainName, type: 'Thing' },\n        organizer: {\n            name: organizer.name,\n            type: 'Thing',\n            url: organizer.url\n        }\n    };\n\n    return {\n        content: JSON.stringify(obj),\n        type: 'application/ld+json'\n    };\n}\n\n","import React, { RefObject, useEffect, useRef } from 'react';\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\ntype ImageTag = React.DetailedHTMLFactory<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>;\ntype DivTag = React.DetailedHTMLFactory<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;\n\n/**\n * Параметры для картинки.\n */\nexport interface IImage {\n    url?: string;\n    alt?: string;\n    title?: string;\n    width?: number;\n    height?: number;\n    placeholder?: boolean | string;\n    type?: 'cover' | 'contain' | 'crop' | 'videoCover';\n    className?: string;\n    loading?: 'lazy' | 'eager';\n    ref?: RefObject<ImageTag | DivTag>;\n    onLoad?: () => void;\n    onLoadVerticalImage?: (value: boolean) => void;\n    onError?: () => void;\n    itemProp?: string;\n    style?: React.CSSProperties;\n}\n\nconst cn = classname.bind(null, 'Image');\n\nconst Image: React.FunctionComponent<IImage> = React.forwardRef((props, ref) => {\n    const refImg = useRef<HTMLImageElement>();\n\n    let Tag = ('img' as any) as ImageTag | DivTag;\n    const attrs: React.ImgHTMLAttributes<HTMLImageElement> = {\n        src: '',\n        alt: '',\n        title: '',\n        crossOrigin: 'anonymous'\n    };\n    const style: React.CSSProperties = { ...props.style };\n\n    if (props.url) {\n        attrs.src = props.url;\n    }\n\n    if (props.alt) attrs.alt = props.alt;\n    if (props.title) attrs.title = props.title;\n    if (props.width) attrs.width = props.width;\n    if (props.height) attrs.height = props.height;\n    if (props.itemProp) attrs.itemProp = props.itemProp;\n    if (props.loading) attrs.loading = props.loading;\n\n    if (typeof props.placeholder === 'string') {\n        style.backgroundColor = props.placeholder;\n    }\n\n    if (props.type) {\n        if (props.type !== 'videoCover') {\n            Tag = ('div' as any) as DivTag;\n\n            if (props.url) style.backgroundImage = 'url(' + props.url + ')';\n            if (props.width) style.width = props.width + 'px';\n            if (props.height) style.height = props.height + 'px';\n        }\n\n        attrs.crossOrigin = undefined;\n    }\n\n    useEffect(() => {\n        if (refImg.current) {\n            refImg.current.onload = null;\n            refImg.current.onerror = null;\n        }\n\n        refImg.current = null;\n\n        if (props.onLoad) {\n            refImg.current = document.createElement('img');\n\n            refImg.current.onload = () => {\n                if (props?.onLoadVerticalImage) {\n                    const isVertical = ((refImg.current?.width ?? 1) / (refImg.current?.height ?? 1)) <= 1;\n\n                    props?.onLoadVerticalImage(isVertical);\n                }\n                props.onLoad();\n\n                refImg.current.onload = null;\n            };\n\n            refImg.current.onerror = () => {\n                props.onError && props.onError();\n\n                refImg.current.onerror = null;\n            };\n\n            if (props.url) {\n                refImg.current.src = props.url;\n            }\n        }\n    }, [ props.url, props.onLoad, props.onError, props.onLoadVerticalImage ]);\n\n    return (\n        <Tag\n            {...attrs}\n            ref={ref}\n            style={style}\n            className={cn(null, {\n                placeholder: props.placeholder,\n                type: props.type\n            }, props.className)}\n        />\n    );\n});\n\nexport default Image;\n","import './styles.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { useTooltip } from '@vtblife/uikit';\n\nconst cn = classname.bind(null, 'MinimalBanksMortgageEconomy');\n\n// eslint-disable-next-line max-len\nconst defaultTitle = 'В\\u00A0связи с\\u00A0возможностью выбора наиболее выгодного предложения среди представленных банков';\n\nexport function MinimalBanksMortgageEconomy({\n    value,\n    title = defaultTitle,\n    underline = false,\n    dotted,\n}: {\n    underline?: boolean;\n    dotted?: boolean;\n    title?: string;\n    value: string;\n}) {\n    const { to, registerControl } = useTooltip();\n\n    return (\n        <span className={cn('percent')}>\n            {value}\n        </span>\n    );\n}\n","/**\n * @see https://gitlab.m2.ru/vtblife/frontend/mortgage/-/blob/master/src/common/dictionaries/src/form.ts\n */\nexport const PROPERTY_COST_DEFAULT = 4000000;\nexport const PROPERTY_COST_MIN = 500000;\nexport const PROPERTY_COST_MAX = 200000000;\nexport const PROPERTY_COST_STEP = 100000;\n\nexport const OWN_AMOUNT_DEFAULT = 1500000;\nexport const OWN_AMOUNT_MIN_FACTOR = 0.1;\nexport const OWN_AMOUNT_MAX_FACTOR = 0.9;\nexport const OWN_AMOUNT_STEP = 5000;\n\nexport const REMAINING_AMOUNT_DEFAULT = 1500000;\nexport const REMAINING_AMOUNT_MIN_FACTOR = 0.1;\nexport const REMAINING_AMOUNT_MAX_FACTOR = 0.9;\nexport const REMAINING_AMOUNT_STEP = 5000;\n\nexport const ADDITIONAL_AMOUNT_DEFAULT = 0;\nexport const ADDITIONAL_AMOUNT_MIN = 0;\n\nexport const TERM_DEFAULT = 20;\nexport const TERM_MIN = 1;\nexport const TERM_MAX = 30;\n\n/**\n * @see https://gitlab.m2.ru/vtblife/frontend/mortgage/-/blob/master/src/common/utils/src/calculate-factored-range.ts\n */\nexport const calculateFactoredRange = (\n    relativeValue: number,\n    minFactor = OWN_AMOUNT_MIN_FACTOR,\n    maxFactor = OWN_AMOUNT_MAX_FACTOR,\n    minRelativeValue = PROPERTY_COST_MIN,\n    maxRelativeValue = PROPERTY_COST_MAX\n): [number, number] => {\n    const correctRelativeValue = getRangedValue(relativeValue, minRelativeValue, maxRelativeValue);\n\n    return [ Math.round(correctRelativeValue * minFactor), Math.round(correctRelativeValue * maxFactor) ];\n};\n\n/**\n * @see https://gitlab.m2.ru/vtblife/frontend/mortgage/-/blob/master/src/common/utils/src/get-ranged-value.ts\n */\nexport const getRangedValue = (value: number, min: number, max: number): number => Math.min(Math.max(value, min), max);\n","import { MortgagePurpose } from '@search/graphql-typings';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { formatNumber } from '@search/helpers/src/formatNumber';\nimport {\n    calculateFactoredRange, getRangedValue, OWN_AMOUNT_STEP, PROPERTY_COST_MAX, PROPERTY_COST_MIN,\n    PROPERTY_COST_STEP, TERM_MAX, TERM_MIN\n} from './constants';\n\nexport interface UseBankMortgageFormProps {\n    /* Срок займа */\n    term: number;\n\n    isPreferentialNbCondition?: boolean;\n\n    /* Стоимость недвижимости */\n    propertyCost: number;\n\n    /* Сумма собственных средств */\n    ownAmount: number;\n\n    /* Тип ипотеки (Вторичка, Новостройка, Рефинансирование) */\n    purpose: typeof MortgagePurpose[keyof typeof MortgagePurpose];\n\n    /* id Региона (отличается от id в классифайде) */\n    regionId: number;\n\n    onChange: (data: Omit<UseBankMortgageFormProps, 'onChange'>) => void;\n\n    ownAmountFromPropertyCost?: boolean;\n}\n\nexport const calculateOwnAmount = (value: number, factor: number = 0.2) => calculateFactoredRange(value, factor)[0];\n\nexport const useBankMortgageForm = ({\n    onChange,\n    ownAmountFromPropertyCost = true,\n    ...initialState\n}: UseBankMortgageFormProps) => {\n    const [ formState, setFormState ] = useState(initialState);\n\n    /**\n     * @see https://gitlab.cloud.vtblife.ru/vtblife/frontend/mortgage/-/blob/7a482a47/src/client/components/realty-form/form-component.tsx\n     */\n    const calculatedFormValues = useMemo(() => {\n        const [ ownAmountMin, ownAmountMax ] = calculateFactoredRange(formState.propertyCost);\n        const percent = getRangedValue(Math.round((formState.ownAmount / formState.propertyCost) * 100), 0, 100);\n\n        return {\n            propertyCost: {\n                min: PROPERTY_COST_MIN,\n                max: PROPERTY_COST_MAX,\n                step: PROPERTY_COST_STEP\n            },\n            ownAmount: {\n                min: ownAmountMin,\n                max: ownAmountMax,\n                step: OWN_AMOUNT_STEP,\n                percent: `${percent ? `${percent}%` : ''}`,\n                labelFrom: `от ${formatNumber(ownAmountMin)} ₽`,\n                labelTo: `до ${formatNumber(ownAmountMax)} ₽`\n            },\n            term: {\n                min: TERM_MIN,\n                max: TERM_MAX\n            }\n        };\n    }, [ formState.ownAmount, formState.propertyCost ]);\n\n    const handleFieldChange = useCallback((\n        name: keyof typeof formState,\n        value: number | string\n    ) => {\n        setFormState(prevState => {\n            let newState = prevState;\n\n            let ownAmount = prevState.ownAmount;\n\n            //@ts-ignore\n            value = value ? Number(value) : (Number(calculatedFormValues[name].min) ?? 0);\n            //@ts-ignore\n            if (Number.isNaN(value)) value = (Number(calculatedFormValues[name].min) ?? 0);\n\n            if (name === 'propertyCost' && ownAmountFromPropertyCost) {\n                const [ ownAmountMin, ownAmountMax ] = calculateFactoredRange(value);\n\n                ownAmount = getRangedValue(prevState.ownAmount, ownAmountMin, ownAmountMax);\n            }\n\n            if (\n                prevState[name] !== value ||\n                ownAmount !== prevState.ownAmount\n            ) {\n                newState = {\n                    ...newState,\n                    ownAmount,\n                    [name]: value\n                };\n            }\n\n            if (onChange && newState !== prevState) onChange(newState);\n\n            return newState;\n        });\n    }, [ onChange ]);\n\n    return {\n        formState,\n        formErrors: {\n            propertyCost: formState.propertyCost < calculatedFormValues.propertyCost.min ||\n                formState.propertyCost > calculatedFormValues.propertyCost.max,\n            ownAmount: formState.ownAmount < calculatedFormValues.ownAmount.min ||\n                formState.ownAmount > calculatedFormValues.ownAmount.max\n        },\n        handleFieldChange,\n        calculatedFormValues\n    };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { useGqlContext } from '@search/gql-client/src/gqlContext';\nimport { graphql } from '@search/gql-client/src/useGql';\nimport { useGql2Loader } from '@search/gql-client/src/useGql2';\n\nimport useDebouncedCallback from '../../../hooks/useDebouncedCallback';\nimport { UseBankMortgageFormProps } from '../MinimalBanksMortgageFields/useBankMortgageForm';\nimport { useMinimalBanksMortgageEconomy } from '../useMinimalBanksMortageState';\nimport { mortgage2BestOfferFromOffers } from '../mortgage2/useMortgage2BestOffer';\n\nimport type {\n    MinimalBanksMortgageOffersQuery$data as MinimalBanksMortgageOffersQueryResponseGql,\n    MinimalBanksMortgageOffersQuery$variables as MinimalBanksMortgageOffersQueryVariablesGql\n} from './__generated__/MinimalBanksMortgageOffersQuery.graphql';\n\nexport type MinimalBanksMortgageOffersQueryResponse = MinimalBanksMortgageOffersQueryResponseGql;\nexport type MinimalBanksMortgageOffersQueryVariables = MinimalBanksMortgageOffersQueryVariablesGql;\n\nexport type MinimalBanksMortgageOffersQueryResponseOffer = MinimalBanksMortgageOffersQueryResponse['minimalBanksMortgageOffers'][number];\n\nconst MinimalBanksMortgageOffersQuery = graphql`\n    query MinimalBanksMortgageOffersQuery(\n        $term: Int!\n        $isPreferential: Boolean\n        $propertyCost: Float!\n        $ownAmount: Float!\n        $regionId: Int!\n        $purpose: MortgagePurpose!\n    ) {\n        minimalBanksMortgageOffers(\n            term: $term\n            isPreferential: $isPreferential\n            propertyCost: $propertyCost\n            ownAmount: $ownAmount\n            regionId: $regionId\n            purpose: $purpose\n        ) {\n            name\n            type\n            bankId\n            minimalPercent\n            minimalPercentFormatted\n            minimalPayment\n            minimalPaymentFormatted\n            icon {\n                origin\n            }\n        }\n    }\n`;\n\nexport function useMinimalBanksMortgageOffersFetcher() {\n    const gql = useGqlContext();\n\n    return useCallback(\n        (vars: MinimalBanksMortgageOffersQueryVariables, opts?: { signal?: AbortSignal }) => gql.client<\n            MinimalBanksMortgageOffersQueryVariables,\n            MinimalBanksMortgageOffersQueryResponse\n        >(MinimalBanksMortgageOffersQuery, vars, opts)\n            .then(response => {\n                return response;\n            }),\n        [ gql ]\n    );\n}\n\nexport type MinimalBanksMortgageOffer = MinimalBanksMortgageOffersQueryResponse['minimalBanksMortgageOffers'][number];\n\ntype MinimalBanksMortgageOfferDiscount = {\n    disabled?: boolean;\n    minimalPercentDiscount: number;\n    minimalPercentDiscountFormatted: string;\n    minimalPaymentDiscount: number;\n    minimalPaymentDiscountFormatted: string;\n};\n\nexport type MinimalBanksMortgageOfferWithDiscount = MinimalBanksMortgageOffer &\n    Partial<MinimalBanksMortgageOfferDiscount>;\n\nexport function useMinimalBanksMortgageOffersLoader() {\n    return useGql2Loader(\n        useMinimalBanksMortgageOffersFetcher(),\n        { cachePrefix: 'minimalBanksMortgageOffers' }\n    );\n}\n\nexport function useMinimalBanksMortgageOffersSliced({\n    term,\n    from,\n    propertyCost,\n    ownAmount,\n    regionId,\n    purpose,\n    isPreferentialNbCondition,\n    defaultVisibleOffers = 3\n}: Omit<UseBankMortgageFormProps, 'onChange'> & { from?: string; defaultVisibleOffers?: number }) {\n    const [ formData, setFormDataRaw ] = useState({\n        term,\n        purpose,\n        regionId,\n        ownAmount: Math.round(ownAmount),\n        propertyCost: Math.round(propertyCost)\n    });\n\n    const isFormChangedRef = useRef(false);\n\n    const wrapperSetFormDataRaw = useCallback((args: Parameters<typeof setFormDataRaw>[0]) => {\n        isFormChangedRef.current = true;\n        setFormDataRaw(args);\n    });\n\n    const [ setFormData ] = useDebouncedCallback(wrapperSetFormDataRaw, 500);\n\n    const [ fakeLoadingRaw, setFakeLoading ] = useState(false);\n    const minimalBanksMortgageOffersLoad = useMinimalBanksMortgageOffersLoader();\n\n    const { data, loading, errors: error } = formData.propertyCost > 0 && formData.ownAmount > 0 ?\n        minimalBanksMortgageOffersLoad({\n            ...formData,\n            isPreferential: isPreferentialNbCondition,\n            propertyCost: Math.round(formData.propertyCost)\n        }) :\n        { data: undefined, loading: false, errors: [] };\n\n    const offersFull = data?.minimalBanksMortgageOffers ?? [];\n    const offers = offersFull.slice(0, defaultVisibleOffers);\n    const bestMortgageOffer = mortgage2BestOfferFromOffers(offersFull);\n\n    const fakeLoading = fakeLoadingRaw || loading;\n\n    useEffect(() => {\n        if (loading) setFakeLoading(true);\n        const handle = setTimeout(() => setFakeLoading(false), 1000);\n\n        return () => {\n            clearTimeout(handle);\n        };\n    }, [ loading ]);\n\n    const isEmpty = offers.length === 0 && ! fakeLoading;\n\n    let totalCost: number | undefined = formData.propertyCost - formData.ownAmount;\n\n    if (totalCost <= 0) totalCost = undefined;\n\n    const totalCostFormatted = totalCost ? formatPrice({\n        value: totalCost * 100,\n        displayCurrency: true,\n        noFractional: true,\n        currency: Currency.RUB\n    }) : undefined;\n\n    let offersOrMocks: readonly (typeof offers[number] | undefined)[] = offers;\n\n    if (fakeLoading) {\n        const fakeOffers: undefined[] = [];\n\n        for (let i = 0; i < defaultVisibleOffers; i++) {\n            fakeOffers.push(undefined);\n        }\n        offersOrMocks = fakeOffers;\n    }\n\n    return {\n        ...useMinimalBanksMortgageEconomy({ ...formData, from }),\n        setFormData,\n        setFormDataRaw: wrapperSetFormDataRaw,\n        formData,\n        offersOrMocks,\n        offersFull,\n        bestMortgageOffer,\n        totalCost,\n        totalCostFormatted,\n        isEmpty,\n        error,\n        loading: fakeLoading,\n        isFormChanged: isFormChangedRef.current\n    };\n}\n\nexport type UseMinimalBanksMortgageOffersSlicedResult = ReturnType<typeof useMinimalBanksMortgageOffersSliced>;\n","import React from 'react';\n\nexport const Source = {\n    UNKNOWN_SOURCE: 0,\n    WEB_LK: 1,\n    MOBILE_APP: 2,\n    BANKI_RU: 3,\n    COMFORT_SEARCH_M2: 4,\n    SRAVNI_RU: 5,\n    WEB_LANDING: 6,\n    NOVOSTROIKY: 7,\n    // zbs is not defined\n    ZBS: 8\n};\n\nexport type SourceValue = typeof Source[keyof typeof Source];\n\nconst MortgageAppSourceContext = React.createContext<SourceValue>(Source.UNKNOWN_SOURCE);\n\nexport function useMortgageAppSource() {\n    return React.useContext(MortgageAppSourceContext);\n}\n\nexport const MortgageAppSourceProvider: React.FC<{ source: SourceValue }> = ({ children, source }) => {\n    return <MortgageAppSourceContext.Provider value={source}>{children}</MortgageAppSourceContext.Provider>;\n};\n","import './MortgageGovernmentDisclaimer.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MortgageGovernmentDisclaimer');\n\nexport function MortgageGovernmentDisclaimer({\n    onClick,\n    isAccent = false,\n    isLongDescr,\n    descriptionText,\n    mainText,\n    isImportant,\n    splitOnRows\n}: {\n    isAccent?: boolean;\n    isMobile?: boolean;\n    isLongDescr?: boolean;\n    onClick?(e: React.MouseEvent<HTMLButtonElement, MouseEvent>): void;\n    descriptionText?: React.ReactNode;\n    mainText?: string;\n    isImportant?: boolean;\n    splitOnRows?: boolean;\n}) {\n    return (<div className={cn(null, { isImportant, splitOnRows })}>\n        {isLongDescr && (<div className={cn('icon-wrap')}><Icon name='exclamation-circle' size='s' /></div>)}\n        <span className={cn('text', { isImportant, splitOnRows })}>{mainText ?? 'Одобрят ли вам ипотеку с\\u00A0господдержкой?'}</span>\n        <button\n            className={cn('button', { accent: isAccent })}\n            onClick={e => {\n                e.preventDefault();\n                onClick?.(e);\n            }}\n            data-test='disclamer-click'\n        >{descriptionText ?? (isLongDescr ? 'Узнать условия кредитования' : 'Условия кредитования')}</button>\n    </div>);\n}\n","import './MortgageGovernmentDisclaimer.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\n\nconst cn = classname.bind(null, 'MortgageGovernmentDisclaimer');\n\nexport function MortgageGovernmentDisclaimerModal({\n    isMobile,\n    onSuccess,\n    onClose,\n    additionalPrograms,\n    withoutAccent,\n    btnText = 'Подать заявку на ипотеку'\n}: {\n    isMobile?: boolean;\n    onSuccess?(e: React.MouseEvent<Element, MouseEvent>): void;\n    onClose?(): void;\n    additionalPrograms?: {title: string; desc: string; inner?: string}[];\n    withoutAccent?: boolean;\n    btnText?: string;\n}) {\n    const title = 'Одобрят ли вам ипотеку с\\u00A0господдержкой?';\n\n    return (<Modal\n        onClose={onClose}\n        closable\n        mobile={isMobile}\n        swipeToClose={! isMobile}\n        opened\n        size='m'\n    >\n        {isMobile ? <Modal.Header>{title}</Modal.Header> : <Modal.Title>{title}</Modal.Title>}\n\n        <Modal.Content scrollable={isMobile}>\n            <div className={cn('block-main')}>\n                <div className={cn('block')}>\n                    <Typography variant='h3'>Семейная ипотека до&nbsp;6%</Typography>\n                    <div>\n                        Подходит семьям с детьми, которые родились, были усыновлены или удочерены не ранее 2018&nbsp;года,\n                        и семьям в которых есть ребёнок с&nbsp;инвалидностью. <span className={cn('inner', { withoutAccent })}>\n                            Первоначальный взнос от&nbsp;15%, максимальный срок кредита – 30&nbsp;лет,\n                            а размер кредита до 12&nbsp;млн&nbsp;₽ (в&nbsp;регионах до 6&nbsp;млн&nbsp;₽).\n                        </span>\n                    </div>\n                </div>\n\n                <div className={cn('block')}>\n                    <Typography variant='h3'>Льготная ипотека до&nbsp;12%</Typography>\n                    <div>\n                        Подходит для всех категорий граждан РФ, приобретающих жилье в&nbsp;новостройках от&nbsp;застройщика. <span className={cn('inner', { withoutAccent })}>\n                            Первоначальный взнос от&nbsp;15%, максимальный срок кредита&nbsp;&mdash; 30&nbsp;лет, размер кредита до&nbsp;12&nbsp;млн&nbsp;₽ (в&nbsp;регионах до&nbsp;6&nbsp;млн&nbsp;₽).\n                        </span>\n                    </div>\n                </div>\n\n                <div className={cn('block')}>\n                    <Typography variant='h3'>ИТ&nbsp;ипотека от&nbsp;5%</Typography>\n                    <div>\n                        Подходит официально оформленных сотрудников IT-компаний, аккредитованных Минцифры РФ&nbsp;с&nbsp;зарплатой от&nbsp;150&nbsp;тыс.&nbsp;₽&nbsp;до&nbsp;вычета налогов. <span className={cn('inner', { withoutAccent })}>\n                            Первоначальный взнос от&nbsp;15%, максимальный срок кредита&nbsp;&mdash; 30&nbsp;лет, размер кредита до&nbsp;18&nbsp;млн&nbsp;₽ (в&nbsp;регионах до&nbsp;6&nbsp;млн&nbsp;₽).\n                        </span>\n                    </div>\n                </div>\n\n                {additionalPrograms?.map(({ inner, desc, title }) => (\n                    <div className={cn('block')} key={title}>\n                        <Typography variant='h3'>{title}</Typography>\n                        <div>\n                            {desc} {inner ? <span className={cn('inner', { withoutAccent })}>{inner}</span> : null}\n                        </div>\n                    </div>\n                ))}\n                <Modal.Actions>\n                    <Button\n                        variant='accent'\n                        onClick={e => {\n                            e.preventDefault();\n                            onSuccess?.(e);\n                        }}\n                        dataTest='mortgage-send'\n                    >{btnText}</Button>\n                </Modal.Actions>\n            </div>\n        </Modal.Content>\n    </Modal>);\n}\n","/**\n * Ипотечный брокер принимает только числовые значения в get параметрах.\n */\n\nexport enum MortgagePurposeEnum {\n    PRIMARY = 1,\n    SECONDARY = 2,\n    REFINANCE = 3,\n    PHP = 4,\n    FAMILY = 5,\n    UNKNOWN = 0\n}\n","import { formatLocaleNumber } from '@search/helpers/src/formatNumber';\n\nexport const defaultBanksTotal = 22;\nexport const defaultMortgageRateNb = 4.5;\nexport const defaultMortgageRateSecond = 13;\n\nexport const defaultMortgageRateNbFormatted = formatLocaleNumber(defaultMortgageRateNb);\nexport const defaultMortgageRateSecondFormatted = formatLocaleNumber(defaultMortgageRateSecond);\n","import { declensionByNumber } from '@search/helpers/src/declensionByNumber';\n\nexport const declensionOffers = (offersCount: number) =>\n    declensionByNumber(offersCount, [ 'предложение', 'предложения', 'предложений' ]);\n\nexport const declensionYear = (year: number) => declensionByNumber(year, [ 'год', 'года', 'лет' ]);\n\nexport const declensionСonsiderBankNominative = (banksTotal: number) =>\n    declensionByNumber(banksTotal, [ 'рассмотрит', 'рассмотрят', 'рассмотрят' ]);\n\nexport const declensionHour = (hours: number) => declensionByNumber(hours, [ 'час', 'часа', 'часов' ]);\n\nexport const declensionMinute = (minutes: number) => declensionByNumber(minutes, [ 'минута', 'минуты', 'минут' ]);\n\nexport const declensionBankNominative = (banksTotal: number) =>\n    declensionByNumber(banksTotal, [ 'банк', 'банка', 'банков' ]);\n\nexport const declensionBankGenitive = (banksTotal: number) =>\n    declensionByNumber(banksTotal, [ 'банка', 'банков', 'банков' ]);\n","import './MortgageField.css';\n\nimport React from 'react';\n\nimport type { TypographyProps } from '@vtblife/uikit/dist/components/typography/types';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MortgageField');\n\nexport function MortgageField({\n    title,\n    children,\n    gap = 'xs',\n    titleProps = {\n        variant: 'h3'\n    },\n    descriptionProps = {\n        color: 'secondary',\n        variant: 'primary-alone'\n    },\n    className\n}: {\n    gap?: 'xs' | 's' | 'm' | 'l';\n    titleProps?: {\n        accent?: boolean;\n        variant?: TypographyProps['variant'];\n        resetFont?: boolean;\n    };\n    descriptionProps?: {\n        accent?: boolean;\n        variant?: TypographyProps['variant'];\n        color?: TypographyProps['color'];\n    };\n    title: React.ReactNode;\n    children: React.ReactNode;\n    className?: string;\n}) {\n    return (<div className={cn('field', { gap }, className)}>\n        {title && <Typography\n            variant={titleProps?.variant}\n            color={titleProps?.accent ? 'orange-500' : undefined}\n            className={cn('title', { resetFont: titleProps.resetFont })}\n            children={title} />}\n        {children && <Typography\n            variant={descriptionProps.variant}\n            color={descriptionProps.accent ? 'orange-500' : (descriptionProps.color ?? 'secondary')}\n            children={children} />}\n    </div>);\n}\n","import { SourceValue, useMortgageAppSource } from './MortgageAppSourceContext';\nimport { MortgagePurposeEnum } from './MortgagePurposeEnum';\nimport { MinimalBanksMortgageOffersQueryVariables } from './MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\n\ntype MinimalBanksMortgageUrlCreateProps = Partial<MinimalBanksMortgageOffersQueryVariables> & {\n    isAuthenticated?: boolean;\n    from?: string;\n    email?: string;\n    mobilePhone?: string;\n    fio?: string;\n    source?: SourceValue;\n};\n\nexport function minimalBanksMortgageUrlCreate({\n    isAuthenticated,\n    source: initialSource,\n    ...props\n}: MinimalBanksMortgageUrlCreateProps) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    const source = initialSource ?? useMortgageAppSource();\n    const baseUrl = isAuthenticated ? '/ipoteka/demand' : '/ipoteka';\n    const keys = Object.keys(props) as (keyof typeof props)[];\n    const query = keys.filter(key => props[key] !== '').map(key => `${key}=${normalize(key, props[key])}`);\n\n    source && query.push(`source=${source}`);\n    const hash = isAuthenticated ? '' : '#mortgage-calculator';\n\n    return {\n        baseUrl,\n        fullUrl: `${baseUrl}?${query.join('&')}${hash}`\n    };\n}\n\nfunction normalize(\n    key: keyof MinimalBanksMortgageUrlCreateProps,\n    value: MinimalBanksMortgageUrlCreateProps[keyof MinimalBanksMortgageUrlCreateProps]\n) {\n    switch (key) {\n        case 'fio': return encodeURIComponent(value as string);\n        case 'purpose': return String(MortgagePurposeEnum[value as MortgagePurposeEnum]);\n        default: return String(value);\n    }\n}\n","import './Mortgage2Field.css';\n\nimport React from 'react';\n\nimport { formatLocaleNumber } from '@search/helpers/src/formatNumber';\nimport classname from '@search/classname/src';\nimport { Select, Input, PhoneInput } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { useMortgage2UserForm } from '../useMortgage2User';\nimport { useMortgage2Request } from '../useMortgage2Request';\n\nconst cn = classname.bind(null, 'Mortgage2Field');\n\nexport function Mortgage2FieldControls({ children }: {\n    children?: React.ReactNode;\n}) {\n    return (<div className={cn('controls')}>\n        {children}\n    </div>);\n}\n\nexport function Mortgage2FieldDescription({ children, accent }: {\n    children?: React.ReactNode;\n    accent?: boolean;\n}) {\n    return (<div className={cn('description', { accent })}>\n        {children}\n    </div>);\n}\n\nexport function Mortgage2FieldTitle({\n    children,\n    size,\n    accent\n}: {\n    children?: React.ReactNode;\n    accent?: boolean;\n    size: Size;\n}) {\n    return <div className={cn('title', { size, accent })}>{children}</div>;\n}\n\nexport function Mortgage2Field({\n    title,\n    children,\n    space,\n    titleSize,\n    titleAccent,\n    descriptionAccent,\n    className\n}: {\n    space: Size;\n    descriptionAccent?: boolean;\n    titleSize: Size;\n    titleAccent?: boolean;\n    title?: React.ReactNode;\n    children: React.ReactNode;\n    className?: string;\n}) {\n    return (<div className={cn('field', { space }, className)}>\n        {title && <Mortgage2FieldTitle size={titleSize} accent={titleAccent} children={title} />}\n        {children && <Mortgage2FieldDescription accent={descriptionAccent} children={children} />}\n    </div>);\n}\n\nexport function Mortgage2FieldPercent({\n    minimalPercentOld,\n    minimalPercent,\n    isAccent,\n    isFrom\n}: {\n    isFrom?: boolean;\n    isAccent?: boolean;\n    description?: string;\n    minimalPercent?: number;\n    minimalPercentOld?: number;\n}) {\n    return (<span className={cn('economy', { accent: isAccent })}>\n        {isFrom ? 'от ' : ''}<span>\n            {minimalPercent ? `${formatLocaleNumber(minimalPercent)} %` : ' '}\n        </span>\n        {minimalPercentOld && minimalPercentOld !== minimalPercent ? (\n            <span className={cn('economy', { prev: true })}>\n                {formatLocaleNumber(minimalPercentOld)} %\n            </span>\n        ) : null}\n    </span>);\n}\n\nexport function MortgageContactFields({\n    isMobile,\n    domain,\n    showCallbackHours,\n    sendQueryOnEnter\n} : {\n    isMobile?: boolean;\n    showCallbackHours?: boolean;\n    domain:ReturnType<typeof useMortgage2Request> | ReturnType<typeof useMortgage2UserForm>;\n    sendQueryOnEnter?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}) {\n    return (\n        <div className={cn('fields')}>\n            <Input\n                dataTest='mortgage-set-name'\n                label='Как вас зовут'\n                placeholder='Имя'\n                size={Size.Medium}\n                onBlur={domain.setNameTouched}\n                onKeyPress={sendQueryOnEnter}\n                error={domain.nameInputValid === false}\n                onChange={domain.setName}\n                value={domain.name}\n                disabled={domain.isFormSyncing}\n            />\n            <PhoneInput\n                dataTest='mortgage-set-phone'\n                label='Телефон'\n                size={Size.Medium}\n                inputMode='numeric'\n                onBlur={domain.setPhoneTouched}\n                onKeyPress={sendQueryOnEnter}\n                error={domain.phoneInputValid === false}\n                onChange={domain.setPhone}\n                value={domain.phone || undefined}\n                disabled={domain.isFormSyncing}\n            />\n            {showCallbackHours ? (\n                <>\n                    <Select\n                        onChange={domain.setStartHoursRange}\n                        native={isMobile}\n                    >\n                        <Select.Button\n                            size='m'\n                            label='Не ранее'\n                        >\n                            {domain.workingHoursRange.start}\n                        </Select.Button>\n                        <Select.Content height={172}>\n                            {\n                                domain.startHourValues.map(({ value, label, disabled }) => (\n                                    <Select.Option\n                                        key={value}\n                                        disabled={disabled}\n                                        value={value}\n                                        selected={domain.workingHoursRange.start === label}\n                                    >\n                                        {label}\n                                    </Select.Option>\n                                ))\n                            }\n                        </Select.Content>\n                    </Select>\n                    <Select\n                        onChange={domain.setEndHoursRange}\n                        native={isMobile}\n                    >\n                        <Select.Button\n                            label='Не позднее'\n                            size='m'\n                        >\n                            {domain.workingHoursRange.end}\n                        </Select.Button>\n                        <Select.Content height={172}>\n                            {\n                                domain.endHourValues.map(({ value, label, disabled }) => (\n                                    <Select.Option\n                                        key={value}\n                                        disabled={disabled}\n                                        value={value}\n                                        selected={domain.workingHoursRange.end === label}\n                                    >\n                                        {label}\n                                    </Select.Option>\n                                ))\n                            }\n                        </Select.Content>\n                    </Select>\n                </>\n            ) : null}\n        </div>\n    );\n}\n","import './Mortgage2IconWrap.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\nimport { Size } from '@vtblife/uikit/legacy';\n\nconst cn = classname.bind(null, 'Mortgage2IconWrap');\n\nexport function Mortgage2IconWrap({ children, size, alt, accent, isLandscapeOrientation }: {\n    children?: React.ReactNode;\n    size?: Size;\n    alt?: boolean;\n    accent?: boolean;\n    isLandscapeOrientation?: boolean;\n}) {\n    return (<div className={cn(undefined, { alt, size, accent, isLandscapeOrientation })}>\n        {children}\n    </div>);\n}\n","import React from 'react';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\nimport type { LocationPlacementIBType } from '@search/graphql-gateway/server/enums/LocationPlacementIBType';\nimport { ApplicationIdEnum, RealtyObjectEnum } from '@search/graphql-typings';\n\nimport type {\n    mortgage2ContactsFormSendMutation$variables as mortgage2ContactsFormSendMutationVariables,\n    mortgage2ContactsFormSendMutation$data as mortgage2ContactsFormSendMutationResponse\n} from './__generated__/mortgage2ContactsFormSendMutation.graphql';\nimport type { Mortgage2RealtyType } from './mortgageTypes';\n\nconst mortgage2ContactsFormSendMutation = graphql`\n    mutation mortgage2ContactsFormSendMutation(\n        $phone: String!,\n        $name: String!,\n        $link: String,\n        $locationPlacement: String,\n        $applicationId: ApplicationIdEnum!,\n        $regionId: Int,\n        $subject: String!,\n        $message: String,\n        $utm: RecordInput,\n        $realtyType: RealtyObjectEnum,\n        $discounts: [DiscountCalcEnum!],\n        $startCallbackHour: String,\n        $endCallbackHour: String,\n        $withGA: Boolean,\n        $withoutBackofficeEmail: Boolean,\n    ) {\n        classifiedSendMortgageContactsForm(\n            utm: $utm,\n            phone: $phone,\n            name: $name,\n            link: $link,\n            locationPlacement: $locationPlacement,\n            applicationId: $applicationId,\n            regionId: $regionId,\n            subject: $subject,\n            message: $message,\n            realtyType: $realtyType,\n            discounts: $discounts,\n            startCallbackHour: $startCallbackHour,\n            endCallbackHour: $endCallbackHour,\n            withGA: $withGA,\n            withoutBackofficeEmail: $withoutBackofficeEmail\n        ) {\n            emailMessageId\n        }\n    }\n`;\n\n// eslint-disable-next-line max-len\nexport type Mortgage2ContactsFormSendProps =\n    Omit<\n        mortgage2ContactsFormSendMutationVariables,\n        'phone' | 'subject' | 'name' | 'link' | 'locationPlacement' | 'realtyType' | 'applicationId'\n    > & {\n    offerUrl?: string;\n    locationPlacement: LocationPlacementIBType;\n    realtyType: Mortgage2RealtyType;\n    applicationId: ApplicationIdEnum;\n    // eslint-disable-next-line camelcase\n    gtmSendData?: { event: string; page_type: string; place?: string; action?: string };\n    // eslint-disable-next-line camelcase\n    gtmShowData?: { event: string; page_type: string; place?: string; action?: string };\n};\n\ntype UseMortgage2ContactsFormSendProps = Omit<mortgage2ContactsFormSendMutationVariables, 'locationPlacement'> & {\n    locationPlacement: LocationPlacementIBType;\n    startCallbackHour?: string;\n    endCallbackHour?: string;\n};\n\nexport function useMortgage2ContactsFormSend() {\n    const gql = useGqlContext();\n\n    return React.useCallback((vars: UseMortgage2ContactsFormSendProps, opts?: { signal?: AbortSignal }) => {\n        return gql.client<mortgage2ContactsFormSendMutationVariables, mortgage2ContactsFormSendMutationResponse>(\n            mortgage2ContactsFormSendMutation,\n            vars,\n            {\n                pathUniqSuffix: `/callback-mortgage/${vars.phone}/`,\n                ...opts\n            }\n        ).then();\n    }, [ gql ]);\n}\n\nexport function getSubjectAppName(appId?: ApplicationIdEnum | null) {\n    switch (appId) {\n        case ApplicationIdEnum.ClassifiedDesktop:\n        case ApplicationIdEnum.ClassifiedTouch:\n            return 'Уютного поиска';\n        case ApplicationIdEnum.NewBuildingsDesktop:\n        case ApplicationIdEnum.NewBuildingsTouch:\n            return 'Новостроек';\n        default:\n            return 'СПб команды';\n    }\n}\n\nexport function getRealtyObjectTypeGql(realtyType?: Mortgage2RealtyType | null) {\n    switch (realtyType) {\n        case 'ProfOfferRoom': return RealtyObjectEnum.Room;\n        case 'ProfOfferHouse': return RealtyObjectEnum.House;\n        case 'ProfOfferLand': return RealtyObjectEnum.Land;\n        case 'ProfOfferFlat':\n        default:\n            return RealtyObjectEnum.Flat;\n    }\n}\n\nexport function normalizeCallbackUrl(offerUrl?: string | null) {\n    let link;\n\n    if (offerUrl) {\n        link = offerUrl.includes('http') ? offerUrl : `${location.origin}${offerUrl}`;\n    } else {\n        link = location.href;\n    }\n\n    return link;\n}\n","import { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { CurrencyEnum, MortgagePurpose } from '@search/graphql-typings';\nimport { offerRegionToMortgage } from '../../../../../domain/offer/regionToBackoffice';\nimport { calculateOwnAmount } from '../MinimalBanksMortgageFields/useBankMortgageForm';\n\nfunction getTotalPrice({\n    regionId\n}: {\n    regionId?: number;\n}) {\n    const isMsk = regionId && [\n        RegionIdEnum.MSK,\n        RegionIdEnum.MSK_OBL,\n        RegionIdEnum.MSK_AND_MSK_OBL\n    ].includes(regionId);\n\n    return {\n        value: (isMsk ? 12.5 : 5.2) * 10e7,\n        currency: CurrencyEnum.Rub\n    };\n}\n\nexport function mortgage2ParamsFromClasified(props: {\n    purpose: MortgagePurpose;\n    term?: number;\n    regionId?: number;\n    mortgageRegionId?: number;\n    propertyCost?: number;\n    ownAmount?: number;\n    estimatePrice?: {\n        // В копейках, центах и т.д.\n        value: number;\n        currency: CurrencyEnum;\n    };\n}) {\n    const estimatedPriceByRegion = getTotalPrice({ regionId: props.regionId });\n    const propertyCost = props.propertyCost ?? Math.min(\n        (props.estimatePrice?.value ?? estimatedPriceByRegion.value) / 100,\n        50e6\n    );\n    const ownAmount = props.ownAmount ?? calculateOwnAmount(propertyCost, 0.2);\n\n    return {\n        purpose: props.purpose,\n        regionId: props.regionId ? offerRegionToMortgage(props.regionId) : props.mortgageRegionId!,\n        term: props.term ?? 20,\n        propertyCost,\n        ownAmount,\n        currency: estimatedPriceByRegion.currency\n    };\n}\n","/* eslint-disable react/jsx-handler-names */\nimport './Mortgage2StarterModal.css';\n\nimport React, { useEffect, useMemo, useRef } from 'react';\nimport { Modal, Button } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport classname from '@search/classname/src';\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport { MortgageOfferType } from '@search/graphql-typings/src';\nimport { declensionBankGenitive, declensionBankNominative } from '../../declensions';\nimport {\n    MinimalBanksMortgageOffer, MinimalBanksMortgageOfferWithDiscount\n} from '../../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport {\n    Mortgage2Field, MortgageContactFields, Mortgage2FieldControls, Mortgage2FieldPercent\n} from '../field/Mortgage2Field';\nimport { mortgage2ParamsFromClasified } from '../mortgage2ParamsFromClasified';\nimport { mortgage2BestOfferFromOffers } from '../useMortgage2BestOffer';\nimport { useMortgage2Request } from '../useMortgage2Request';\nimport { Mortgage2StarterProps } from '../useMortgage2User';\nimport type { Mortgage2ContactsFormSendProps } from '../mortgage2ContactsFormSend';\nimport { Mortgage2SuccessContent } from '../success/Mortgage2SuccessContent';\nimport { VTB_ID } from '../../mortgage3/useChangeDiscount';\nimport { MortgageGovernmentDisclaimer } from '../../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer';\nimport { MortgageGovernmentDisclaimerModal } from '../../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal';\nimport { MortgageOfferIcon } from '../../../BanksMortgageOffers/MortgageOfferIcon';\nimport { defaultBanksTotal } from '../../contants';\nimport { getGovernmentMortgage, useGovernmentMortgageType } from '../../useGovernmentMortgage';\nimport { dataLayerPush } from '../../../../../../domain/google/dataLayerPush';\n\nconst cn = classname.bind(null, 'Mortgage2StarterModal');\nconst COUNT_ICONS_BANK_SHOWING = 2;\n\ntype FieldsModal = 'rate' | 'payment' | 'cost' | 'ownAmount' | 'term' | 'all';\n// eslint-disable-next-line complexity\nexport function Mortgage2StarterModal({\n    mode = 'default',\n    isDefaultSelectedOffer,\n    showMoreBankIcons,\n    governmentMortgage: initialGovernmentMortgage,\n    fields = [ 'all' ],\n    isNewVibe,\n    alwaysFromWord,\n    ...props\n}: Mortgage2StarterProps\n    & Pick<Parameters<typeof useMortgage2Request>[0], 'realtyType'>\n    & { governmentMortgage?: useGovernmentMortgageType }\n    & {\n        isPreferentialNbCondition?: boolean;\n        isMobile?: boolean;\n        onClose?(e?: React.MouseEvent | React.KeyboardEvent): void;\n        term?: number;\n        propertyCost: number;\n        ownAmount: number;\n        mortgageOffers?: { minimalPercentDiscount?: number} & readonly MinimalBanksMortgageOffer[] | null;\n        selectedMortgageOffer?: MinimalBanksMortgageOfferWithDiscount;\n        withoutAuth?: boolean;\n        shouldVTBDiscountLogic?: boolean;\n        showCallbackHours?: boolean;\n        mode?: 'default' | 'min-data';\n        isDefaultSelectedOffer?: boolean;\n        showMoreBankIcons?: boolean;\n        fields?: FieldsModal[];\n        isNewVibe?: boolean;\n        alwaysFromWord?: boolean;\n        withoutShowContainer?: boolean;\n    }\n    & Mortgage2ContactsFormSendProps\n) {\n    const { selectedMortgageOffer } = props;\n\n    const params = mortgage2ParamsFromClasified(props);\n    const banksTotal = selectedMortgageOffer ? defaultBanksTotal - 1 : defaultBanksTotal;\n    const bestMortgageOffer = selectedMortgageOffer ?? mortgage2BestOfferFromOffers(props.mortgageOffers);\n    const isPreferentialOffer = bestMortgageOffer?.type === MortgageOfferType.Preferential || bestMortgageOffer?.type === MortgageOfferType.Family;\n\n    const userInfoLoad = useUserDetailsLoader();\n    const userInfo = userInfoLoad({});\n\n    const governmentMortgage = useMemo(() => {\n        return initialGovernmentMortgage ?? getGovernmentMortgage({\n            regionId: props.regionId,\n            propertyCost: props.propertyCost,\n            ownAmount: props.ownAmount,\n            isPreferentialNbCondition: props.isPreferentialNbCondition,\n        });\n    }, [ initialGovernmentMortgage, props.regionId, props.propertyCost, props.ownAmount, props.isPreferentialNbCondition ]);\n    const domain = useMortgage2Request({\n        ...props,\n        ...governmentMortgage,\n        userDetails: userInfo.data?.userProfile.person,\n        banksTotal,\n        selectedMortgageOffer,\n        bestMortgageOffer,\n        propertyCost: params.propertyCost,\n        ownAmount: params.ownAmount\n    });\n\n    const isFirstOpen = useRef(true);\n\n    useEffect(() => {\n        if (props.withoutShowContainer && isFirstOpen.current) {\n            props.gtmShowId && dataLayerPush({ event: props.gtmShowId });\n            props.gtmShowData && dataLayerPush(props.gtmShowData);\n            isFirstOpen.current = false;\n        }\n    }, [ props.gtmShowId, props.withoutShowContainer, props.gtmShowData ]);\n\n    const [ isModalOpened, setIsModalOpened ] = React.useState(false);\n    const banksIcons = props.mortgageOffers?.filter(item => item.bankId !== bestMortgageOffer?.bankId).slice(0, COUNT_ICONS_BANK_SHOWING);\n\n    const isTitlePercentAccent = useMemo(() => {\n        if (domain.minimalPercent === domain.minimalPercentOld) return false;\n        if (props.shouldVTBDiscountLogic) return bestMortgageOffer?.bankId === VTB_ID;\n        return ! selectedMortgageOffer;\n    }, [ domain.minimalPercent, domain.minimalPercentOld, props.shouldVTBDiscountLogic, bestMortgageOffer?.bankId, selectedMortgageOffer ]);\n\n    const fromWord = useMemo(() => ({\n        default: alwaysFromWord ? 'от\\u00A0' : '',\n        payment: selectedMortgageOffer && ! isPreferentialOffer && ! alwaysFromWord ? '' : 'от\\u00A0',\n        percent: alwaysFromWord || ! selectedMortgageOffer || isDefaultSelectedOffer || isPreferentialOffer,\n    }), [ alwaysFromWord, selectedMortgageOffer, isDefaultSelectedOffer, isPreferentialOffer ]);\n\n    const renderFieldNodes = useMemo(() => {\n        const result: React.ReactNode[] = [];\n\n        if (fields.includes('rate') || fields.includes('all')) {\n            result.push(<Mortgage2Field\n                key='rate'\n                space={Size.Small}\n                titleSize={Size.Small}\n                titleAccent={isTitlePercentAccent}\n                title={<Mortgage2FieldPercent\n                    isFrom={fromWord.percent}\n                    isAccent={isPreferentialOffer || isTitlePercentAccent}\n                    minimalPercent={domain.minimalPercent}\n                    minimalPercentOld={domain.minimalPercentOld}\n                />}\n                children={isPreferentialOffer ? 'ипотека с\\u00A0господдержкой' : 'ставка банка'}\n            />);\n        }\n        if (fields.includes('payment') || fields.includes('all')) {\n            result.push(<Mortgage2Field\n                key='payment'\n                space={Size.Small}\n                titleSize={Size.Small}\n                titleAccent={isTitlePercentAccent}\n                title={<>{fromWord.payment}{\n                    bestMortgageOffer?.minimalPaymentDiscountFormatted ?? bestMortgageOffer?.minimalPaymentFormatted\n                }</>}\n                children='ежемесячный платёж'\n            />);\n        }\n        if (fields.includes('cost') || fields.includes('all')) {\n            result.push(<Mortgage2Field\n                key='cost'\n                space={Size.Small}\n                titleSize={Size.Small}\n                title={<>{fromWord.default}{domain.propertyCostFormatted}</>}\n                children={`стоимость ${domain.realtyTypeFormattedLocative}`}\n            />);\n        }\n        if (fields.includes('ownAmount') || fields.includes('all')) {\n            result.push(<Mortgage2Field\n                key='ownAmount'\n                space={Size.Small}\n                titleSize={Size.Small}\n                title={<>{fromWord.default}{domain.ownAmountFormatted}</>}\n                children='первоначальный взнос'\n            />);\n        }\n        if ((fields.includes('term') || fields.includes('all')) && ! props.isMobile) {\n            result.push(<Mortgage2Field\n                key='term'\n                space={Size.Small}\n                titleSize={Size.Small}\n                title={<>{props.term} лет</>}\n                children='срок кредита'\n            />);\n        }\n\n        return result;\n    }, [\n        fields, domain, props.term, props.isMobile, isTitlePercentAccent, selectedMortgageOffer, isDefaultSelectedOffer, isPreferentialOffer,\n        domain.minimalPercent, domain.minimalPercentOld, bestMortgageOffer, domain.propertyCostFormatted, domain.realtyTypeFormattedLocative,\n        domain.ownAmountFormatted\n    ]);\n\n    const banksInfo = (\n        <div className={cn('descr')}>\n            <div className={cn('descr-text')}>\n                {selectedMortgageOffer && (<>Подайте заявку в&nbsp;{selectedMortgageOffer.name\n                } и&nbsp;еще <span>{banksTotal}&nbsp;{\n                    declensionBankNominative(banksTotal)}</span>.</>)}\n                {! selectedMortgageOffer && (<>Получите одобрение по&nbsp;ипотеке в&nbsp;течение {domain.timeFromBanksFormatted\n                } от&nbsp;<span>{banksTotal}&nbsp;{declensionBankGenitive(banksTotal)}.</span></>)}\n            </div>\n            {/* not important all conditions government mortgage */}\n            {(governmentMortgage.isPreferentialNbCondition || isNewVibe) && (<>\n                <div className={cn('icons')}>\n                    {bestMortgageOffer && (\n                        <MortgageOfferIcon offer={bestMortgageOffer} size='m' />\n                    )}\n                    {banksIcons && showMoreBankIcons && (<>\n                        {banksIcons.map(item => (\n                            <MortgageOfferIcon key={item.bankId} offer={item} size='m' />\n                        ))}\n                        <MortgageOfferIcon pseudoCount={banksTotal - COUNT_ICONS_BANK_SHOWING} size='m' />\n                    </>)}\n                </div>\n            </>)}\n        </div>\n    );\n\n    const content = (<div className={cn('main')}>\n        {props.isMobile ? (\n            <div className={cn('banksInfo')}>\n                {banksInfo}\n            </div>\n        ) : (\n            <Mortgage2Field\n                descriptionAccent\n                space={Size.Medium}\n                titleSize={Size.Small}\n                title={domain.textVariant === 'bankCount' ? 'Ипотека — быстро и просто!' : 'Заявка на ипотеку'}\n                children={banksInfo}\n            />\n        )}\n        <div className={cn('fields')}>\n            {renderFieldNodes}\n        </div>\n        <MortgageContactFields\n            isMobile={props.isMobile}\n            domain={domain}\n            showCallbackHours={props.showCallbackHours}\n        />\n        {/* not important all conditions government mortgage */}\n        {governmentMortgage.isPreferentialNbCondition && (<div\n            className={cn('disclamer')}\n        >\n            <MortgageGovernmentDisclaimer\n                isAccent\n                isMobile={props.isMobile}\n                onClick={() => setIsModalOpened(true)}\n            />\n        </div>)}\n        <Mortgage2FieldControls>\n            <Button\n                fullWidth\n                size={props.isMobile ? 'm' : 'l'}\n                disabled={domain.isFormSyncing || userInfo.loading}\n                dataTest='mortgage-send-query'\n                variant='accent'\n                onClick={domain.sendQuery}\n            >\n                Подать заявку\n            </Button>\n            {props.isMobile ? <> <br /><br /><br /></> : null}\n        </Mortgage2FieldControls>\n    </div>);\n\n    if (isModalOpened) {\n        return (<MortgageGovernmentDisclaimerModal\n            isMobile={props.isMobile}\n            onSuccess={() => setIsModalOpened(false)}\n            onClose={() => setIsModalOpened(false)}\n        />);\n    }\n\n    return (<Modal\n        opened\n        // @ts-expect-error\n        onClose={props.onClose}\n        mobile={props.isMobile}\n        swipeToClose={! props.isMobile}\n    >\n        {props.withoutAuth && domain.isFormSended ? (\n            <Mortgage2SuccessContent\n                title='Заявка принята'\n                isMobile={props.isMobile}\n            />\n        ) : (<>\n            {props.isMobile && (<>\n                <Modal.Header>\n                    {domain.textVariant === 'bankCount' ? 'Ипотека — быстро и просто!' : 'Заявка на ипотеку'}\n                </Modal.Header>\n                <Modal.Content scrollable>\n                    {content}\n                </Modal.Content>\n            </>)}\n            {! props.isMobile && (<>{content}</>)}\n        </>)}\n    </Modal>);\n}\n","import './Mortgage2SuccessContent.css';\n\nimport React from 'react';\nimport { Modal, Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport Grid from '@vtblife/uikit-grid';\n\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\n\nimport { Mortgage2Field } from '../field/Mortgage2Field';\nimport { Mortgage2IconWrap } from '../icon/Mortgage2IconWrap';\n\nimport Mortgage2IconSuccess from '../icon/Mortgage2IconSuccess.url.svg';\n\nconst cn = classname.bind(null, 'Mortgage2SuccessContent');\n\nexport function Mortgage2SuccessContent({\n    isMobile,\n    title = 'Скоро перезвоним',\n    subtitle = 'Ожидайте, совсем скоро вам перезвонит консультант.',\n    withoutGridWrapper\n}: {\n    isMobile?: boolean;\n    withoutGridWrapper?: boolean;\n    title?: string;\n    subtitle?: string;\n}) {\n    const staticPath = useStaticPathConfig();\n\n    const upperContent = (<>\n        {isMobile ? (\n            <>\n                <Modal.Header>\n                    {title}\n                </Modal.Header>\n                <Typography variant='primary-alone' color='secondary' className={cn('subtitle')}>\n                    {subtitle}\n                </Typography>\n            </>\n        ) : null}\n    </>);\n\n    const gridContent = (<>\n        {isMobile ? null : (\n            <Grid.Cell xs={12} m={12}>\n                <Mortgage2Field\n                    titleSize={Size.Large}\n                    space={Size.Medium}\n                    descriptionAccent\n                    title={title}\n                    children={subtitle}\n                />\n            </Grid.Cell>\n        )}\n        <Grid.Cell m={12}>\n            <Mortgage2IconWrap>\n                <img\n                    crossOrigin='anonymous'\n                    width={265}\n                    height={185}\n                    src={`${staticPath}${Mortgage2IconSuccess}`}\n                />\n            </Mortgage2IconWrap>\n        </Grid.Cell>\n    </>);\n\n    if (withoutGridWrapper) {\n        return (<>\n            {upperContent}\n            {gridContent}\n        </>);\n    }\n\n    return (\n        <>\n            {upperContent}\n            <Grid cols={12}>\n                {gridContent}\n            </Grid>\n        </>\n    );\n}\n","import React from 'react';\n\nimport {\n    MinimalBanksMortgageOfferWithDiscount, useMinimalBanksMortgageOffersLoader\n} from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { mortgage2ParamsFromClasified } from './mortgage2ParamsFromClasified';\n\nexport function mortgage2BestOfferFromOffers(\n    minimalBanksMortgageOffers?: readonly MinimalBanksMortgageOfferWithDiscount[] | null\n) {\n    const bestMortgageOffer = minimalBanksMortgageOffers?.reduce((acc, item) => {\n        const minimalPaymentItem = item.minimalPaymentDiscount ?? item.minimalPayment ?? 0;\n        const minimalPaymentAcc = acc?.minimalPaymentDiscount ?? acc?.minimalPayment ?? 0;\n\n        if (\n            minimalPaymentItem && (\n                ! minimalPaymentAcc ||\n                minimalPaymentItem < minimalPaymentAcc\n            )\n        ) return item;\n\n        return acc;\n    }, undefined as MinimalBanksMortgageOfferWithDiscount | undefined);\n\n    return bestMortgageOffer;\n}\n\nexport function useMortgage2BestOfferLoader() {\n    const minimalBanksMortgageOffersLoad = useMinimalBanksMortgageOffersLoader();\n\n    return React.useCallback((props: ReturnType<typeof mortgage2ParamsFromClasified>) => {\n        const mortgageInfo = minimalBanksMortgageOffersLoad(props);\n\n        const bestMortgageOffer = mortgage2BestOfferFromOffers(mortgageInfo?.data?.minimalBanksMortgageOffers);\n\n        return {\n            isLoading: mortgageInfo.loading,\n            error: mortgageInfo.errors?.length ? mortgageInfo.errors[0] : undefined,\n            selectedMortgageOffer: bestMortgageOffer,\n            mortgageOffers: mortgageInfo.data?.minimalBanksMortgageOffers\n        };\n    }, [ minimalBanksMortgageOffersLoad ]);\n}\n","import React, { useCallback, useRef } from 'react';\n\nimport { MortgagePurpose } from '@search/graphql-typings';\nimport { formatPrice } from '@search/helpers/src/gql/formatPrice';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\nimport { AuthInfo } from '@search/auth/src/AuthInfo';\nimport { UseAuthError } from '@search/auth/src/useAuth';\nimport { useUserDetailsFetcher } from '@search/auth/src/userDetails/userDetails';\nimport { userDetailsQuery$data } from '@search/auth/src/userDetails/__generated__/userDetailsQuery.graphql';\n\nimport { declensionBankGenitive } from '../declensions';\nimport { defaultBanksTotal } from '../contants';\nimport { useGtmOnVisible } from '../../../../../domain/google/useGtmOnVisible';\nimport { ClassifiedAnalytics } from '../../../../../domain/offer/analytics/ClassifiedAnalytics';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { minimalBanksMortgageUrlCreate } from '../minimalBanksMortgageUrl';\nimport { SeoSearchUtm } from '../../../../../domain/seo/SeoSearchUtm';\nimport { useAppTypeById } from '../../../hooks/useAppTypeById';\nimport type {\n    MinimalBanksMortgageOfferWithDiscount\n} from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { declensionHour, declensionMinute } from '../declensions';\nimport { useMortgageAppSource } from '../MortgageAppSourceContext';\nimport { mortgage2ParamsFromClasified } from './mortgage2ParamsFromClasified';\nimport { Mortgage2StarterProps, useMortgage2UserForm } from './useMortgage2User';\nimport { getRealtyObjectTypeGql, getSubjectAppName, Mortgage2ContactsFormSendProps, normalizeCallbackUrl, useMortgage2ContactsFormSend } from './mortgage2ContactsFormSend';\nimport type { Mortgage2RealtyType } from './mortgageTypes';\n\nconst openOrAuth = (authInfo?: AuthInfo) => {\n    return new Promise((resolve, reject) => {\n        if (authInfo?.isAuthenticated) {\n            resolve(null);\n        } else {\n            reject();\n        }\n    });\n};\n\nfunction getOverPayment(p: {\n    minimalPercent: number;\n    totalMonth: number;\n    amount: number;\n}) {\n    const monthRate = p.minimalPercent / 12 / 100;\n    const commonRate = (1 + monthRate) ** p.totalMonth;\n    const monthPayment = p.amount * monthRate * commonRate / (commonRate - 1);\n    const overPayment = monthPayment * p.totalMonth - p.amount;\n\n    return overPayment;\n}\n\nconst textVariants = [ 'main', 'bankCount' ] as const;\nconst mortgageBannerTextVariantDefault = Math.round(Math.random() * (textVariants.length - 1));\n\nconst responseTimeVariants = [\n    {\n        value: 1,\n        fieldText: 'на ответ от банков'\n    },\n    {\n        value: 10,\n        fieldText: 'на заполнение заявки'\n    },\n    {\n        value: 180,\n        fieldText: 'на одобрение от банков'\n    }\n] as const;\n\nconst mortgageBannerMinutesVariantDefault = Math.round(Math.random() * (responseTimeVariants.length - 1));\n\nexport function windowOpen(url: string, { isMobile }: { isMobile?: boolean }) {\n    url = url.startsWith('http') ? url : location.origin + url;\n\n    if (isMobile) {\n        location.assign(url);\n        return;\n    }\n\n    let form = document.getElementById('window-open-form') as HTMLFormElement;\n\n    if (! form) {\n        form = document.createElement('form');\n        document.body.appendChild(form);\n    }\n\n    const o = new URL(url);\n\n    form.method = 'get';\n    form.target = '_blank';\n    form.action = o.origin + o.pathname;\n    form.id = 'window-open-form';\n\n    const inputs: string[] = [];\n\n    o.searchParams.forEach((v, k) => {\n        inputs.push(`<input type=\"hidden\" name=\"${k}\" value=${v} />`);\n    });\n    form.innerHTML = inputs.join('\\n');\n\n    form.submit();\n}\n\nexport function useMortgage2Request({\n    regionId,\n    showPreferential,\n    mortgageRegionId,\n    selectedMortgageOffer,\n    bestMortgageOffer,\n    purpose,\n    term,\n    propertyCost,\n    ownAmount,\n    gtmSendId = ClassifiedAnalytics.SearchSaleIpotekaBannerSend,\n    gtmShowId,\n    gtmSendData,\n    gtmShowData,\n    mortgageBannerMinutesVariant = mortgageBannerMinutesVariantDefault,\n    mortgageBannerTextVariant = mortgageBannerTextVariantDefault,\n    banksTotal = defaultBanksTotal,\n    isMobile = false,\n    realtyType,\n    userDetails,\n    locationPlacement,\n    offerUrl,\n    applicationId,\n    withoutAuth,\n    withoutForm,\n    discounts,\n    shouldVTBDiscountLogic\n}: Mortgage2StarterProps & {\n    showPreferential?: boolean;\n    userDetails?: userDetailsQuery$data['userProfile']['person'];\n    isMobile?: boolean;\n    realtyType: Mortgage2RealtyType;\n    banksTotal?: number;\n    selectedMortgageOffer?: MinimalBanksMortgageOfferWithDiscount;\n    bestMortgageOffer?: MinimalBanksMortgageOfferWithDiscount;\n    propertyCost: number;\n    ownAmount: number;\n    withoutAuth?: boolean;\n    withoutForm?: boolean;\n    shouldVTBDiscountLogic?: boolean;\n} & Mortgage2ContactsFormSendProps) {\n    const mortgage2ContactsFormSend = useMortgage2ContactsFormSend();\n    const {\n        isFormSended,\n        isFormSyncing,\n        setFormAllTouched,\n        setFormSended,\n        setFormIsSending,\n        setFormResetSendingsFields,\n\n        name,\n        isNameValid,\n        isNameRequired,\n        nameInputValid,\n        setName,\n        setNameTouched,\n\n        phone,\n        startHourValues,\n        endHourValues,\n        workingHoursRange,\n        setStartHoursRange,\n        setEndHoursRange,\n        isPhoneValid,\n        phoneInputValid,\n        setPhone,\n        setPhoneTouched\n    } = useMortgage2UserForm({ userDetails });\n\n    let realtyTypeFormattedLocative = 'недвижимости';\n\n    switch (realtyType) {\n        case 'ProfOfferFlat':\n            realtyTypeFormattedLocative = 'квартиры';\n            break;\n        case 'ProfOfferRoom':\n            realtyTypeFormattedLocative = 'комнаты';\n            break;\n        case 'ProfOfferHouse':\n            realtyTypeFormattedLocative = 'дома';\n            break;\n        case 'ProfOfferLand':\n            realtyTypeFormattedLocative = 'участка';\n            break;\n        default:\n            realtyTypeFormattedLocative = 'недвижимости';\n    }\n\n    const params = mortgage2ParamsFromClasified({\n        purpose,\n        regionId,\n        mortgageRegionId,\n        term,\n        propertyCost,\n        ownAmount\n    });\n\n    const propertyCostFormatted = formatPrice({\n        value: params.propertyCost * 100,\n        currency: params.currency,\n        displayCurrency: true\n    });\n\n    const ownAmountFormatted = formatPrice({\n        value: params.ownAmount * 100,\n        currency: params.currency,\n        displayCurrency: true\n    });\n\n    const minimalPercentDefault = purpose === MortgagePurpose.Primary ? 6.1 : 7.5;\n\n    const offerForPercent = selectedMortgageOffer ?? bestMortgageOffer;\n    const minimalPercentWithDiscount = offerForPercent?.minimalPercentDiscount ?? offerForPercent?.minimalPercent;\n    const minimalPercent = minimalPercentWithDiscount ?? minimalPercentDefault;\n\n    let minimalPercentOld = 0;\n\n    if (shouldVTBDiscountLogic) {\n        if (offerForPercent?.minimalPercentDiscount) minimalPercentOld = offerForPercent?.minimalPercent ?? 0;\n    } else {\n        minimalPercentOld = selectedMortgageOffer ? 0 : minimalPercent; // тут должна быть скидка от сервиса, когда появится\n    }\n\n    // Вернется скидка от сервиса - можно раскомментировать\n    // const amount = params.propertyCost - params.ownAmount;\n    // const totalMonth = params.term * 12;\n    // const overPayment = getOverPayment({ amount, totalMonth, minimalPercent });\n    // const overPaymentOld = getOverPayment({ amount, totalMonth, minimalPercent: minimalPercentOld });\n    // const paymentDelta = Math.round(overPaymentOld - overPayment);\n    // const paymentDeltaFormatted = formatPrice({\n    //     value: paymentDelta * 100,\n    //     currency: params.currency,\n    //     displayCurrency: true\n    // });\n\n    const { waitAuth } = useM2AuthContext();\n\n    const userDetailsFetcher = useUserDetailsFetcher();\n    const userFioPhone = useRef<ReturnType<typeof updateUserDetails> | null>();\n    const updateUserDetails = useCallback((userInfo: userDetailsQuery$data) => {\n        const userDetails = userInfo?.userProfile.person;\n        const nameArr = [\n            userDetails?.surname, userDetails?.name, userDetails?.patronymic\n        ].filter(Boolean);\n\n        userDetails?.primaryPhone?.number && setPhone(userDetails.primaryPhone.number);\n        nameArr.length > 0 && setName(nameArr.join(' '));\n\n        return {\n            phone: userDetails?.primaryPhone?.number,\n            name: nameArr.join(' ')\n        };\n    });\n\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    const { isClApp } = useAppTypeById(applicationId);\n    const sourceMortgage = useMortgageAppSource();\n    const sendQuery = React.useCallback((e?: React.MouseEvent<Element> | React.KeyboardEvent<HTMLInputElement>) => {\n        e?.stopPropagation();\n        e?.preventDefault();\n\n        // RS-3869 remove - ! isMobile &&\n        // withoutForm for force to auth form after click btn\n        if (! withoutForm && (! isPhoneValid || (isNameRequired && ! isNameValid))) {\n            setFormAllTouched();\n            return;\n        }\n\n        setFormIsSending();\n        // windowOpen(minimalBanksMortgageUrl, { isMobile });\n\n        const utm = SeoSearchUtm.get();\n\n        const resolveResultPromise = () => {\n            setFormSended();\n            gtmSendId && dataLayerPush({ event: gtmSendId });\n            gtmSendData && dataLayerPush({\n                ...gtmSendData,\n                place: selectedMortgageOffer ? 'bank' : gtmSendData.place\n            });\n            if (isClApp &&\n                (selectedMortgageOffer?.type === 'PREFERENTIAL' ||\n                selectedMortgageOffer?.type === 'FAMILY')\n            ) {\n                dataLayerPush({\n                    event: 'up_action',\n                    theme: 'ipoteka',\n                    type: selectedMortgageOffer.type === 'PREFERENTIAL' ? 'gospr_benefit_req' : 'gospr_family_req'\n                });\n            } else if (isClApp) {\n                dataLayerPush({ event: 'up_ib_send_form' });\n            }\n\n            const { fullUrl: minimalBanksMortgageUrl } = minimalBanksMortgageUrlCreate({\n                isAuthenticated: true,\n                ...params,\n                mobilePhone: (userFioPhone.current?.phone ?? phone).substring(1),\n                fio: userFioPhone.current?.name ?? name,\n                source: sourceMortgage\n            });\n\n            ! withoutAuth && windowOpen(minimalBanksMortgageUrl, { isMobile });\n        };\n        const rejectedResultPromise = error => {\n            // eslint-disable-next-line no-console\n            console.error(error);\n            setFormSended(error);\n        };\n        const optionalMortgage2ContactsFormSend = (userDataFromPromise?: { name?: string; phone?: string} | null) => {\n            return mortgage2ContactsFormSend({\n                realtyType: getRealtyObjectTypeGql(realtyType),\n                name: userDataFromPromise?.name ?? name,\n                utm: utm ? { list: utm } : undefined,\n                phone: userDataFromPromise?.phone ?? phone,\n                regionId: mortgageRegionId ?? regionId,\n                applicationId,\n                locationPlacement,\n                link: normalizeCallbackUrl(offerUrl),\n                subject: `Заявка на ипотеку с${showPreferential ? ' гос. поддержкой с' : ''} “${\n                    getSubjectAppName(applicationId)}”`,\n                discounts,\n                startCallbackHour: workingHoursRange.start,\n                endCallbackHour: workingHoursRange.end,\n                message: selectedMortgageOffer ? `Банк: ${selectedMortgageOffer.name}` : '',\n                withGA: isClApp && ! withoutAuth,\n                withoutBackofficeEmail: isClApp && ! withoutAuth\n            });\n        };\n\n        const optionalWaitAuth = withoutAuth ? undefined :\n            waitAuth(\n                authInfo => openOrAuth(authInfo)\n                    .then(() => userDetailsFetcher())\n                    .catch(() => {\n                        throw new UseAuthError();\n                    }),\n                { phone: phone.substring(1), continueAfterLogin: true }\n            );\n\n        if (optionalWaitAuth) {\n            optionalWaitAuth\n                ?.then((dataUserDetails) => {\n                    const preparedUserDetails = userFioPhone.current = dataUserDetails.data && updateUserDetails(dataUserDetails.data);\n\n                    return optionalMortgage2ContactsFormSend(preparedUserDetails);\n                })\n                .then(resolveResultPromise)\n                .catch(rejectedResultPromise);\n        } else {\n            optionalMortgage2ContactsFormSend()\n                .then(resolveResultPromise)\n                .catch(rejectedResultPromise);\n        }\n    }, [\n        withoutForm,\n        showPreferential,\n        isPhoneValid,\n        isNameValid,\n        isNameRequired,\n        setFormIsSending,\n        mortgage2ContactsFormSend,\n        realtyType,\n        name,\n        phone,\n        mortgageRegionId,\n        regionId,\n        applicationId,\n        locationPlacement,\n        offerUrl,\n        discounts,\n        workingHoursRange.start,\n        workingHoursRange.end,\n        selectedMortgageOffer,\n        withoutAuth,\n        waitAuth,\n        setFormAllTouched,\n        userDetailsFetcher,\n        setFormSended,\n        gtmSendId,\n        dataLayerPush,\n        sourceMortgage,\n        isMobile\n    ]);\n\n    const sendQueryOnEnter = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n        if (e.key !== 'Enter') return;\n        sendQuery(e);\n    }, [ sendQuery ]);\n\n    const textVariant = textVariants[mortgageBannerTextVariant] ?? textVariants[0];\n\n    const minutes = responseTimeVariants[mortgageBannerMinutesVariant] ?? responseTimeVariants[0];\n    const hours = Math.floor(minutes.value / 60);\n    const responseTimeFormatted = hours >= 1 ?\n        `${hours} ${declensionHour(hours)}` :\n        `${minutes.value} ${declensionMinute(minutes.value)}`;\n    const responseDescriptionFormatted = minutes.fieldText;\n\n    const banksTotalFormattedGenitive = declensionBankGenitive(banksTotal >= 22 ? banksTotal : defaultBanksTotal);\n    const timeFromBanksFormatted = 'минуты';\n\n    const onVisible = React.useCallback(() => {\n        gtmShowId && dataLayerPush({ event: gtmShowId });\n        gtmShowData && dataLayerPush(gtmShowData);\n    }, [ gtmShowId, dataLayerPush ]);\n\n    const containerRef = React.useRef<HTMLDivElement>(null);\n\n    useGtmOnVisible({ containerRef, onVisible });\n\n    return {\n        containerRef,\n\n        timeFromBanksFormatted,\n        textVariant,\n        banksTotal,\n        banksTotalFormattedGenitive,\n        ownAmountFormatted,\n        propertyCostFormatted,\n        responseTimeFormatted,\n        responseDescriptionFormatted,\n        minimalPercent,\n        minimalPercentOld,\n\n        realtyTypeFormattedLocative,\n\n        setPhoneTouched,\n        sendQueryOnEnter,\n        phoneInputValid,\n        setPhone,\n        phone,\n        workingHoursRange,\n        setStartHoursRange,\n        setEndHoursRange,\n        startHourValues,\n        endHourValues,\n\n        setNameTouched,\n        nameInputValid,\n        setName,\n        name,\n\n        isFormSyncing,\n        isFormSended,\n        sendQuery,\n        setFormResetSendingsFields\n    };\n}\n","import { ApplicationIdEnum } from '@search/graphql-typings';\nimport { useMemo } from 'react';\n\nexport function useAppTypeById(appId: ApplicationIdEnum) {\n    return useMemo(() => {\n        const isClApp = appId === ApplicationIdEnum.ClassifiedDesktop || appId === ApplicationIdEnum.ClassifiedTouch;\n        const isNbApp = appId === ApplicationIdEnum.NewBuildingsTouch || appId === ApplicationIdEnum.NewBuildingsDesktop;\n        const isZbsApp = appId === ApplicationIdEnum.ZbsSearch;\n\n        return { isClApp, isNbApp, isZbsApp };\n    }, [ appId ]);\n}\n","import React, { useEffect } from 'react';\n\nimport type { userDetailsQuery$data as userDetailsQueryResponse } from '@search/auth/src/userDetails/__generated__/userDetailsQuery.graphql';\nimport type { MortgagePurpose } from '@search/graphql-typings';\nimport { useWorkingHours } from '../../WorkingHours/useWorkingHours';\n\nexport type Mortgage2StarterProps = {\n    gtmSendId?: string;\n    gtmShowId?: string;\n    // eslint-disable-next-line camelcase\n    gtmSendData?: { event: string; page_type: string; place?: string; action?: string };\n    // eslint-disable-next-line camelcase\n    gtmShowData?: { event: string; page_type: string; place?: string; action?: string };\n    term?: number;\n    purpose: MortgagePurpose;\n    mortgageBannerMinutesVariant?: number;\n    mortgageBannerTextVariant?: number;\n    regionId?: number;\n    mortgageRegionId?: number;\n};\n\nexport function useMortgage2UserForm({\n    isNameRequired = false,\n    userDetails\n}: {\n    userDetails?: userDetailsQueryResponse['userProfile']['person'];\n    isNameRequired?: boolean;\n}) {\n    const [ state, setFormState ] = React.useState({\n        isFormSending: false,\n        isFormSended: false,\n        sendingError: undefined as Error | undefined,\n        phone: userDetails?.primaryPhone?.number ?? '',\n        isPhoneTouched: false,\n        name: '',\n        isNameTouched: false\n    });\n\n    const START_HOUR_WORKING_DAY_SALES = 9;\n    const END_HOUR_WORKING_DAY_SALES = 21;\n\n    const {\n        workingHoursRange,\n        setStartHoursRange,\n        setEndHoursRange,\n        startHourValues,\n        endHourValues\n    } = useWorkingHours({\n        startHour: START_HOUR_WORKING_DAY_SALES,\n        endHour: END_HOUR_WORKING_DAY_SALES\n    });\n\n    const setPhone = React.useCallback((phone: string) => setFormState(p => ({ ...p, phone })), [ ]);\n    const setPhoneTouched = React.useCallback(() => setFormState(p => ({ ...p, isPhoneTouched: true })), [ ]);\n    const setName = React.useCallback((name: string) => setFormState(p => ({ ...p, name })), [ ]);\n    const setNameTouched = React.useCallback(() => setFormState(p => ({ ...p, isNameTouched: true })), [ ]);\n\n    const setFormIsSending = React.useCallback((sendingError?: Error) => setFormState(p => ({\n        ...p, sendingError, isFormSending: true\n    })), [ ]);\n    const setFormSended = React.useCallback((sendingError?: Error) => setFormState(p => ({\n        ...p, sendingError, isFormSending: false, isFormSended: true\n    })), [ ]);\n    const setFormResetSendingsFields = React.useCallback(() => setFormState(p => ({\n        ...p, isFormSending: false, isFormSended: false, sendingError: undefined\n    })), [ ]);\n    const setFormAllTouched = React.useCallback(() => {\n        setFormState(p => ({ ...p, isPhoneTouched: true, isNameTouched: true, isFormSending: false }));\n    }, [ ]);\n\n    useEffect(() => {\n        userDetails?.primaryPhone?.number && setPhone(userDetails?.primaryPhone?.number);\n\n        const nameArr = [\n            userDetails?.surname, userDetails?.name, userDetails?.patronymic\n        ].filter(Boolean);\n\n        nameArr.length > 0 && setName(nameArr.join(' '));\n    }, [ userDetails, setPhone, setName ]);\n\n    const isNameValid = isNameRequired ? state.name.length > 1 : undefined;\n    const nameInputValid = state.isNameTouched ? isNameValid : undefined;\n\n    const isPhoneValid = state.phone.length > 10;\n    const phoneInputValid = state.isPhoneTouched ? isPhoneValid : undefined;\n\n    const result = {\n        ...state,\n        isFormSyncing: state.isFormSending,\n        setFormSended,\n        setFormIsSending,\n        setFormAllTouched,\n        setFormResetSendingsFields,\n\n        name: state.name,\n        isNameValid,\n        isNameRequired,\n        nameInputValid,\n        setName,\n        setNameTouched,\n\n        phone: state.phone,\n        isPhoneValid,\n        phoneInputValid,\n        setPhone,\n        setPhoneTouched,\n        workingHoursRange,\n        setStartHoursRange,\n        setEndHoursRange,\n        startHourValues,\n        endHourValues\n    };\n\n    return result as Omit<typeof result, 'isFormSending'>;\n}\n\n","import './Mortgage2ConsultModal.css';\n\nimport React from 'react';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport { ApplicationIdEnum } from '@search/graphql-typings/src';\n\nimport {\n    Mortgage2Field,\n    MortgageContactFields,\n    Mortgage2FieldControls\n} from '../field/Mortgage2Field';\nimport { Mortgage2IconWrap } from '../icon/Mortgage2IconWrap';\nimport { useMortgage2UserForm } from '../useMortgage2User';\nimport { getRealtyObjectTypeGql, getSubjectAppName, Mortgage2ContactsFormSendProps, normalizeCallbackUrl, useMortgage2ContactsFormSend } from '../mortgage2ContactsFormSend';\n\nimport { useClassifiedOfferDataLayerPush } from '../../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\n\nimport Mortgage2IconSuccess from '../icon/Mortgage2IconSuccess.url.svg';\n\nconst cn = classname.bind(null, 'Mortgage2ConsultModal');\n\nexport function Mortgage2ConsultModal({\n    isMobile,\n    onClose,\n    sendGtmId = 'classified_card_sale_ipoteka_call_back',\n    regionId,\n    offerUrl,\n    locationPlacement,\n    applicationId,\n    realtyType,\n    discounts,\n    showCallbackHours,\n    gtmSendData\n}: {\n    isMobile?: boolean;\n    showCallbackHours?: boolean;\n    onClose?(e: React.MouseEvent | React.KeyboardEvent): void;\n    sendGtmId?: string;\n} & Mortgage2ContactsFormSendProps) {\n    const staticPath = useStaticPathConfig();\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    const userDetailsLoad = useUserDetailsLoader();\n    const userInfo = userDetailsLoad({});\n\n    const domain = useMortgage2UserForm({\n        isNameRequired: true,\n        userDetails: userInfo.data?.userProfile.person\n    });\n    const mortgage2ContactsFormSend = useMortgage2ContactsFormSend();\n    const sendQuery = React.useCallback((e?: React.MouseEvent<Element> | React.KeyboardEvent<HTMLInputElement>) => {\n        e?.stopPropagation();\n        e?.preventDefault();\n\n        if (! domain.isPhoneValid || ! domain.isNameValid) {\n            domain.setFormAllTouched();\n            return;\n        }\n\n        domain.setFormIsSending();\n\n        mortgage2ContactsFormSend({\n            realtyType: getRealtyObjectTypeGql(realtyType),\n            regionId,\n            applicationId,\n            locationPlacement,\n            link: normalizeCallbackUrl(offerUrl),\n            name: domain.name,\n            phone: domain.phone,\n            startCallbackHour: domain.workingHoursRange.start,\n            endCallbackHour: domain.workingHoursRange.end,\n            subject: `Консультация по ипотеке с “${getSubjectAppName(applicationId)}”`,\n            discounts\n        })\n            .then(() => {\n                dataLayerPush({ event: sendGtmId });\n                domain.setFormSended();\n                gtmSendData && dataLayerPush({\n                    ...gtmSendData,\n                    place: 'consultation'\n                });\n                if (applicationId === ApplicationIdEnum.ClassifiedDesktop || applicationId === ApplicationIdEnum.ClassifiedTouch) {\n                    dataLayerPush({ event: 'up_ib_send_form' });\n                    dataLayerPush({ event: 'classified_card_sale_ipoteka_call_back' });\n                }\n            }).catch(error => {\n                domain.setFormSended(error);\n            });\n    }, [\n        domain,\n        mortgage2ContactsFormSend,\n        realtyType,\n        regionId,\n        applicationId,\n        locationPlacement,\n        offerUrl,\n        discounts,\n        dataLayerPush,\n        sendGtmId\n    ]);\n\n    const sendQueryOnEnter = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n        if (e.key !== 'Enter') return;\n        sendQuery(e);\n    }, [ sendQuery ]);\n\n    let content: React.ReactNode | undefined;\n\n    if (domain.isFormSended) {\n        content = (<>\n            {isMobile ? (\n                <>\n                    <Modal.Header>\n                        Скоро перезвоним\n                    </Modal.Header>\n                    <Typography color='secondary' className={cn('subtitle')}>\n                        Ожидайте, совсем скоро вам перезвонит консультант.\n                    </Typography>\n                </>\n            ) : null}\n            {isMobile ? null : (\n                <Mortgage2Field\n                    titleSize={Size.Large}\n                    space={Size.Medium}\n                    descriptionAccent\n                    title='Скоро перезвоним'\n                    children='Ожидайте, совсем скоро вам перезвонит консультант.'\n                />\n            )}\n            <Mortgage2IconWrap>\n                <img\n                    crossOrigin='anonymous'\n                    alt='успешно оставили заявку, благодарный человек'\n                    width={265}\n                    height={185}\n                    src={`${staticPath}${Mortgage2IconSuccess}`}\n                />\n            </Mortgage2IconWrap>\n        </>);\n    } else {\n        content = (<>\n            {isMobile ? (\n                <>\n                    <Modal.Header>\n                        Консультация по ипотеке\n                    </Modal.Header>\n                    <Typography color='secondary' className={cn('subtitle')}>\n                        Оставьте свой телефон, и консультант вам перезвонит.\n                    </Typography>\n                </>\n            ) : null}\n            {isMobile ? null : (\n                <Mortgage2Field\n                    titleSize={Size.Large}\n                    space={Size.Medium}\n                    descriptionAccent\n                    title='Консультация по ипотеке'\n                    children='Оставьте свой телефон, и консультант вам перезвонит.'\n                />\n            )}\n            <MortgageContactFields\n                isMobile={isMobile}\n                domain={domain}\n                showCallbackHours={showCallbackHours}\n                sendQueryOnEnter={sendQueryOnEnter}\n            />\n            <Mortgage2FieldControls>\n                <Button\n                    fullWidth\n                    size={isMobile ? 'm' : 'l'}\n                    disabled={domain.isFormSyncing}\n                    dataTest='mortgage-send-consult'\n                    onClick={sendQuery}\n                >\n                    Перезвоните мне\n                </Button>\n            </Mortgage2FieldControls>\n        </>);\n    }\n\n    return (<Modal\n        opened\n        onClose={onClose}\n        mobile={isMobile}\n        swipeToClose={! isMobile}\n    >{content}</Modal>);\n}\n","import React from 'react';\nimport { Skeleton } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport './style.css';\n\nconst cn = classname.bind(null, 'BanksMortgageOffers');\n\nexport const MortgageOfferSkeleton = () => {\n    return (\n        <div className={cn()}>\n            <div className={cn('offer')}>\n                <div className={cn('img-loader')}>\n                    <Skeleton />\n                </div>\n            </div>\n            <div className={cn('offer-info')}>\n                <span className={cn('percent-loader')}>\n                    <Skeleton />\n                </span>\n                <span className={cn('payment-loader')}>\n                    <Skeleton />\n                </span>\n            </div>\n        </div>\n    );\n};\n","/* eslint-disable complexity */\nimport './style.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport Icon from '@vtblife/uikit-icons';\nimport { getGtmLabel } from '../../../../domain/GtmContext';\nimport {\n    MinimalBanksMortgageOffersQueryResponseOffer,\n    MinimalBanksMortgageOffer as MinimalBanksMortgageOfferType\n} from '../MinimalBanksMortgage/MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { MortgageOfferIcon } from './MortgageOfferIcon';\n\nconst cn = classname.bind(null, 'BanksMortgageOffers');\n\ninterface MinimalBanksMortgageOfferProps {\n    offer: {\n        description?: string;\n        disabled?: boolean;\n        minimalPercentDiscountFormatted?: string;\n        minimalPaymentDiscountFormatted?: string;\n    } & MinimalBanksMortgageOffersQueryResponseOffer;\n    gtmCommonClick?: string;\n    selectMortgageOffer?(offer: MinimalBanksMortgageOfferType, e: React.MouseEvent<HTMLButtonElement>): void;\n    isAlternativeBg?: boolean;\n}\n\nexport const BankMortgageOffers = ({\n    offer,\n    gtmCommonClick,\n    isAlternativeBg,\n    selectMortgageOffer\n}: MinimalBanksMortgageOfferProps) => {\n    const equalPercent = offer?.minimalPercentDiscountFormatted === offer?.minimalPercentFormatted;\n    const disabled = offer?.disabled;\n\n    let name = offer?.name ?? '';\n\n    if (offer?.type === 'FAMILY') name = 'Семейная ипотека';\n    if (offer?.type === 'PREFERENTIAL') name = 'Льготная ипотека';\n    if (offer?.type === 'IT_MORTGAGE') name = 'IT-ипотека';\n\n    const description = offer?.disabled ? offer.description : undefined;\n\n    return (\n        <button\n            onClick={disabled || ! selectMortgageOffer ? undefined : selectMortgageOffer.bind(null, offer)}\n            type={disabled ? 'button' : 'submit'}\n            className={cn('button', { disabled })}\n            data-test={`MinimalBanksMortgageOffer-${offer?.bankId ?? 'unk'}`}\n            {...getGtmLabel(gtmCommonClick)}\n        >\n            <div className={cn('', { isAlternativeBg })}>\n                <div className={cn('offer')}>\n                    <MortgageOfferIcon offer={offer} />\n                    <Typography color='primary' tag='span' variant='secondary-alone'>\n                        {name}\n                    </Typography>\n                </div>\n                {description && (<Typography color='secondary'>{description}</Typography>)}\n                {description ? null : (<div className={cn('offer-info')}>\n                    <div className={cn('offer-percent')}>\n                        <Typography\n                            tag='span'\n                            color='primary'\n                            variant='promo-subheader'\n                            bold\n                            className={cn('percent', {\n                                typed: Boolean(offer?.type),\n                                discount: Boolean(offer?.minimalPercentDiscountFormatted) && ! equalPercent\n                            })}\n                        >\n                            {offer?.type && (<div className={cn('icon')}><Icon size='s' name='lightning-circle' /></div>)}\n                            {offer?.minimalPercentFormatted}\n                        </Typography>\n                        {! equalPercent && offer?.minimalPercentDiscountFormatted && <Typography variant='h3' color='orange-600'>\n                            {offer.minimalPercentDiscountFormatted}\n                        </Typography>}\n                    </div>\n                    <Typography color='primary' tag='span' className={cn('payment')}>\n                        {offer?.minimalPaymentDiscountFormatted ?? offer?.minimalPaymentFormatted}\n                    </Typography>\n                </div>)}\n            </div>\n        </button>\n    );\n};\n","import '../MortgageBuyOrDie.css';\n\nimport React, { RefObject, useCallback, useState } from 'react';\nimport { Typography, Badge, useDropdownHover, Dropdown, Tooltip, Modal, Button } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\nimport { cnMrtgBuyOrDie } from '../MortgageBuyOrDieModal';\n\nconst DROPDOWN_OPENING_DELAY = 250;\n\nconst PriceHoverControl = () => {\n    const { control } = useDropdownHover({ open: DROPDOWN_OPENING_DELAY });\n\n    return (\n        <span\n            ref={control as RefObject<HTMLDivElement>}\n            className={cnMrtgBuyOrDie('result-price-disclaimer-trigger')}\n        >\n            <Icon name='information-circle' size='m' color='rgb(172, 182, 195)' />\n        </span>\n    );\n};\n\nexport function MortgageBuyOrDieResultCard({\n    isProfitable,\n    type,\n    price,\n    time,\n    isMobile,\n    isOverLimit\n}: {\n    type: 'mortgage' | 'acc';\n    isProfitable: boolean;\n    isMobile?: boolean;\n    price: string;\n    time: string;\n    isOverLimit?: boolean;\n}) {\n    const texts = (() => {\n        if (type === 'mortgage') {\n            return {\n                mainText: 'Взять ипотеку и\\u00A0купить квартиру сейчас',\n                resultText: 'потратите вместе с\\u00A0процентами и\\u00A0закроете ипотеку'\n            };\n        }\n        return {\n            mainText: 'Арендовать квартиру и\\u00A0копить на\\u00A0свою',\n            resultText: `потратите на\\u00A0покупку квартиры, ${isOverLimit ? 'копить придётся' : 'накопите'}`\n        };\n    })();\n\n    const [ isOpenDisclaimer, setIsOpenDisclaimer ] = useState(false);\n    const openDislaimer = useCallback(() => setIsOpenDisclaimer(true));\n    const closeDislaimer = useCallback(() => setIsOpenDisclaimer(true));\n\n    return (<div className={cnMrtgBuyOrDie('result', { isProfitable })}>\n        <Badge color={isProfitable ? 'success' : 'lightgray'} variant={isProfitable ? 'solid' : 'light'}>\n            {isProfitable ? 'выгоднее' : 'дороже'}\n        </Badge>\n        <Typography bold variant='primary-alone'>{texts.mainText}</Typography>\n\n        <Typography bold variant='h2' onClick={isMobile ? openDislaimer : undefined} className={cnMrtgBuyOrDie('result-price')}>\n            {`${isOverLimit ? '>\\u00A0' : ''}${price}`}\n            {type === 'acc' && ! isMobile && (\n                <Dropdown>\n                    <PriceHoverControl />\n                    <Dropdown.Content positioning='end'>\n                        <div style={{ width: isMobile ? 280 : 320 }}>В&nbsp;среднем, недвижимость ежегодно дорожает на&nbsp;5-7%</div>\n                    </Dropdown.Content>\n                </Dropdown>\n            )}\n            {type === 'acc' && isMobile && (\n                <span className={cnMrtgBuyOrDie('result-price-disclaimer-trigger')}>\n                    <Icon name='information-circle' size='m' color='hsla(251, 15%, 50%, 0.5)' />\n                </span>\n            )}\n        </Typography>\n        {isOpenDisclaimer && (\n            <Modal\n                opened\n                closable\n                onClose={closeDislaimer}\n                swipeToClose\n            >\n                <Modal.Content>\n                    <div className={cnMrtgBuyOrDie('result-price-disclaimer')}>В&nbsp;среднем, недвижимость ежегодно дорожает на&nbsp;5-7%</div>\n                </Modal.Content>\n                <Modal.Actions>\n                    <Button variant='secondary' onClick={closeDislaimer}>Свернуть</Button>\n                </Modal.Actions>\n            </Modal>\n        )}\n        <Typography variant='primary-alone'>\n            {texts.resultText}&nbsp;\n            <Typography tag='span' bold>{time}</Typography>\n        </Typography>\n    </div>);\n}\n","import '../MortgageBuyOrDie.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport { cnMrtgBuyOrDie } from '../MortgageBuyOrDieModal';\n\nexport function MortgageBuyOrDieReason({\n    text,\n    type\n}: {\n    type: 'pos' | 'neg';\n    text: string;\n}) {\n    const icon = type === 'pos' ? 'check-circle' : 'information-circle';\n\n    return (<div className={cnMrtgBuyOrDie('reason')}>\n        <i className={cnMrtgBuyOrDie('reason-type-icon-bg', { type })}>\n            <Icon name={icon} />\n        </i>\n        <Typography>{text}</Typography>\n    </div>);\n}\n","import { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { getDeclensionMonths } from '@search/helpers/src/declension';\n\nimport { declensionYear } from '../../declensions';\n\n// Manager: Это по данным РБК недвижимость\nconst RISE_PRICE_RATE = 7 / 100;\n// https://www.cbr.ru/statistics/avgprocstav/ (ЦБ - 1,3%)\nconst DEPOSIT_RATE = 7.6 - 1.3;\nconst LIMIT_ACC_YEARS = 40;\n\nexport function calcMortgageRate(mortgagePercent: number) {\n    return mortgagePercent / 100 / 12;\n}\n\nfunction calcFormula({\n    futureCost = 0,\n    percent = 10,\n    invoice = 0,\n    currentCost\n}: {\n    percent: number;\n    futureCost: number;\n    invoice: number;\n    currentCost: number;\n}) {\n    const rate = calcMortgageRate(percent);\n\n    // должно быть минус БС, но т.к. мы её не учитываем как 'инвестицию' (т.е. её отбив),\n    // то используем только как то, к какой сумме должны прийти\n    const numeratorNumeratora = (futureCost * rate + invoice);\n    const denominatorNumeratora = (currentCost * rate + invoice);\n\n    return Math.log(numeratorNumeratora / denominatorNumeratora) / Math.log(1 + rate);\n}\n\nexport const calcMonthPaymentMap = new Map<string, number>();\n\nexport function calcMonthPayment({\n    years = 30,\n    mortgagePercent,\n    sumCredit\n}: {\n    years?: number;\n    mortgagePercent: number;\n    sumCredit: number;\n}) {\n    const stupidKey = `${sumCredit}${mortgagePercent}${years}`;\n\n    if (! calcMonthPaymentMap.has(stupidKey)) {\n        const mortgageRate = calcMortgageRate(mortgagePercent);\n        const countMonths = 12 * years;\n\n        calcMonthPaymentMap.set(stupidKey, (sumCredit * mortgageRate) / (1 - Math.pow(1 + mortgageRate, -countMonths)));\n    }\n    return calcMonthPaymentMap.get(stupidKey) as number;\n}\n\nfunction formatMonths(monthsFloat: number) {\n    let timeYears = Math.trunc(monthsFloat / 12);\n    let timeMonths = Math.ceil(12 * (monthsFloat / 12 - timeYears));\n\n    if (timeMonths === 12) {\n        timeMonths = 0;\n        timeYears++;\n    }\n\n    return `за\\u00A0${\n        timeYears ? `${timeYears}\\u00A0${declensionYear(timeYears)}` : ''\n    }${timeYears && timeMonths ? ' ' : ''}${\n        timeMonths ? getDeclensionMonths(timeMonths) : ''\n    }`;\n}\n\nfunction calcAccPeriod({\n    currentRateRise: initialRateRise,\n    propertyCost,\n    currentPropertyCost = propertyCost,\n    propertyCostPeriod\n}: {\n    currentRateRise: number;\n    currentPropertyCost?: number;\n    propertyCost: number;\n    propertyCostPeriod: (propertyCost: number) => number;\n}): {\n    periodPaymentsWithRise: number;\n    riseInPrice: number;\n    isOverLimit?: boolean;\n} {\n    const isFirstYear = initialRateRise === 1;\n    const currentRateRise = initialRateRise + RISE_PRICE_RATE;\n    // в первый год подорожание не должно быть учитано\n    const currentPropertyCostRise = isFirstYear ? propertyCost : currentPropertyCost * (1 + RISE_PRICE_RATE);\n    const periodPaymentsWithRise = propertyCostPeriod(currentPropertyCostRise);\n\n    // начисляем проценты подорожания и сравниваем, мы должны накопить больше, чем стоит квартира с учётом подорожания (1)\n    // если без удорожания мы будем копить на квартиру 5 лет, значит нам нужно учесть 5 подорожаний минимум (в данном случае сравнение происходит на каждом этапе подорожания)\n    // учли - пересчитываем сколько лет будем копить, и так пока не сойдётся условие (1)\n    const countYearsWithRise = isFirstYear ? 1 : (currentRateRise - 1) / RISE_PRICE_RATE;\n    const periodPaymentsWithRiseInYears = periodPaymentsWithRise / 12;\n\n    // нам нужно понять, что более limitAccYears лет будем копить, поэтому проверяем, что сейчас\n    // limitAccYears + 1 итерация, и что будет следующая тоже\n    if (\n        periodPaymentsWithRiseInYears > countYearsWithRise &&\n        Math.trunc(countYearsWithRise + 1) === LIMIT_ACC_YEARS + 1\n    ) {\n        return {\n            periodPaymentsWithRise,\n            riseInPrice: currentPropertyCost,\n            isOverLimit: true\n        };\n    }\n\n    if (periodPaymentsWithRiseInYears > countYearsWithRise) {\n        return calcAccPeriod({\n            currentRateRise,\n            currentPropertyCost: currentPropertyCostRise,\n            propertyCost,\n            propertyCostPeriod\n        });\n    }\n\n    return {\n        periodPaymentsWithRise,\n        riseInPrice: currentPropertyCostRise\n    };\n}\n\nexport function calculateBuyOrDie({\n    propertyCost,\n    initialPayment,\n    mortgagePercent,\n    comfortInvoice,\n    rent\n}: {\n    propertyCost: number; // стоимость квартиры\n    mortgagePercent: number;\n    initialPayment: number; // ownAmount\n    comfortInvoice: number;\n    rent: number;\n}) {\n    const {\n        periodPaymentsWithRise: calculatedDieMonths,\n        riseInPrice: calculatedDieFinalCost,\n        isOverLimit: isOverLimitAcc\n    } = calcAccPeriod({\n        currentRateRise: 1,\n        propertyCost,\n        propertyCostPeriod: (cost) => calcFormula({\n            percent: DEPOSIT_RATE,\n            invoice: comfortInvoice - rent,\n            futureCost: cost,\n            currentCost: initialPayment\n        })\n    });\n\n    const calculatedBuyMonths = calcFormula({\n        percent: mortgagePercent,\n        invoice: -comfortInvoice,\n        futureCost: 0,\n        currentCost: propertyCost - initialPayment\n    });\n\n    const priceBuy = formatPrice({\n        value: (initialPayment + calculatedBuyMonths * comfortInvoice) * 100,\n        currency: Currency.RUB,\n        noFractional: true,\n        displayCurrency: true\n    });\n    const priceDie = formatPrice({\n        value: calculatedDieFinalCost * 100,\n        currency: Currency.RUB,\n        noFractional: true,\n        displayCurrency: true,\n        inWords: calculatedDieFinalCost >= 1e7\n    });\n\n    const timeBuy = formatMonths(calculatedBuyMonths);\n    const timeDie = isOverLimitAcc ? `более ${LIMIT_ACC_YEARS}\\u00A0лет` : formatMonths(calculatedDieMonths);\n    const typeProfitable = isOverLimitAcc ? 'buy' : (initialPayment + calculatedBuyMonths * comfortInvoice) < calculatedDieFinalCost ? 'buy' : 'die';\n\n    return {\n        priceMortgage: priceBuy,\n        priceAcc: priceDie,\n        timeMortgage: timeBuy,\n        timeAcc: timeDie,\n        typeProfitable,\n        isOverLimitAcc\n    };\n}\n","import { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { FormType } from '../MortgageBuyOrDieModal';\nimport { calcMonthPayment } from './calculateBuyOrDie';\n\nconst REQUIRED_FIELD_TEXT = 'Обязательное поле';\n\nexport const validateFormFields = ({\n    touched,\n    formValues,\n    mortgagePercent\n}: {\n    touched: { rent: boolean; ownAmount: boolean; propertyCost: boolean; comfortInvoice: boolean };\n    formValues: FormType;\n    mortgagePercent?: number;\n}) => ({\n    rent: validateRent({ touched: touched.rent, ...formValues }),\n    comfortInvoice: validateComfortInvoice({ touched: touched.comfortInvoice, mortgagePercent, ...formValues }),\n    ownAmount: validateOwnAmount({ touched: touched.ownAmount, ...formValues }),\n    propertyCost: touched.propertyCost && formValues.propertyCost <= 0 ? REQUIRED_FIELD_TEXT : undefined,\n});\n\nfunction validateComfortInvoice(\n    { touched, comfortInvoice = 0, mortgagePercent, propertyCost, ownAmount }:\n    FormType & { touched: boolean; comfortInvoice?: number; mortgagePercent?: number }\n) {\n    if (touched) {\n        if (comfortInvoice <= 0) return { isError: true, text: REQUIRED_FIELD_TEXT };\n        if (comfortInvoice < 5000) return { isError: true, text: 'Слишком низкий платёж, на\\u00A0покупку квартиры потребуется более 30\\u00A0лет' };\n\n        if (mortgagePercent) {\n            const mortgagePaymentWithCurrentInvoice = calcMonthPayment({ mortgagePercent, sumCredit: propertyCost - ownAmount });\n\n            if (mortgagePaymentWithCurrentInvoice > comfortInvoice) {\n                const textMortgagePaymentWithCurrentInvoice = formatPrice({\n                    value: (mortgagePaymentWithCurrentInvoice + 1) * 100,\n                    currency: Currency.RUB,\n                    noFractional: true,\n                    displayCurrency: true\n                });\n\n                return { isError: true, text: `C\\u00A0таким платежом вы\\u00A0не\\u00A0закроете ипотеку даже за\\u00A030\\u00A0лет. Минимальный платёж за\\u00A0эту квартиру\\u00A0— ${textMortgagePaymentWithCurrentInvoice}/мес.` };\n            }\n        }\n    }\n    return { isError: false, text: 'Cумма, которую вы\\u00A0смогли\\u00A0бы платить за\\u00A0ипотеку, если\\u00A0бы не\\u00A0снимали квартиру' };\n}\n\nfunction validateOwnAmount({ touched, ownAmount = 0, propertyCost = 0 }: { touched: boolean; ownAmount?: number; propertyCost?: number }) {\n    if (touched) {\n        if (ownAmount > propertyCost) return { isError: true, text: 'Первый взнос не\\u00A0больше стоимости квартиры' };\n        if (ownAmount <= 0) return { isError: true, text: REQUIRED_FIELD_TEXT };\n        if (ownAmount < (propertyCost / 100 * 15)) return { isError: true, text: 'Первый взнос не\\u00A0менее\\u00A015%' };\n    }\n    return { isError: false, text: 'Первый взнос не\\u00A0менее\\u00A015%' };\n}\n\nfunction validateRent({ touched, rent }: { touched: boolean; rent: number }) {\n    if (touched) {\n        if (rent < 0) return { isError: true, text: REQUIRED_FIELD_TEXT };\n    }\n    return { isError: false, text: 'Если вы\\u00A0не\\u00A0платите за\\u00A0аренду\\u00A0— оставьте поле пустым' };\n}\n","\nimport { isSpbWide } from '@search/helpers/src/isRegion';\n\nexport const regionsEnumerationDie = [\n    { label: 'Москва и Московская область', value: 0 },\n    { label: 'Санкт-Петербург и Ленинградская область', value: 1 },\n];\n\nexport function mapRegionToSelect(regionId?: number) {\n    if (isSpbWide(regionId)) return regionsEnumerationDie[1].value;\n\n    // msk & default\n    return regionsEnumerationDie[0].value;\n}\n","import '../MortgageBuyOrDie.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport { cnMrtgBuyOrDie } from '../MortgageBuyOrDieModal';\n\nexport function MortgageBuyOrDieFormField({\n    text,\n    children\n}: React.PropsWithChildren<{\n    text: string;\n}>): React.ReactElement {\n    return (<div className={cnMrtgBuyOrDie('form-field')}>\n        <Typography bold variant='primary-alone'>{text}</Typography>\n        {children}\n    </div>);\n}\n","import '../MortgageBuyOrDie.css';\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Button, Select, useSelect, NumberInput, Modal } from '@vtblife/uikit';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\n\nimport { validateFormFields } from '../helpers/validate-helper';\nimport { cnMrtgBuyOrDie, FormType } from '../MortgageBuyOrDieModal';\nimport { regionsEnumerationDie } from '../helpers/mapRegionToSelect';\nimport { MortgageBuyOrDieFormField } from './MortgageBuyOrDieFormField';\n\nconst ROOM_OPTIONS: { label: string; value: Rooms }[] = [\n    { label: '1', value: Rooms.ROOM_1 },\n    { label: '2', value: Rooms.ROOM_2 },\n    { label: '3', value: Rooms.ROOM_3 },\n    { label: '4+', value: Rooms.ROOM_4 },\n    { label: 'Студия', value: Rooms.STUDIO },\n];\n\nexport function MortgageBuyOrDieModalForm({\n    onCalculate,\n    isMobile,\n    form,\n    setForm,\n    mortgagePercent\n}: {\n    isMobile?: boolean;\n    form: FormType;\n    setForm: React.Dispatch<React.SetStateAction<FormType>>;\n    onCalculate(): void;\n    mortgagePercent: number;\n}) {\n    const setOwnAmount = useCallback((newValue: number) => setForm((state) => ({ ...state, ownAmount: ! isNaN(newValue) ? newValue : 0 })), []);\n    const setPropertyCost = useCallback((newValue: number) => setForm((state) => ({ ...state, propertyCost: ! isNaN(newValue) ? newValue : 0 })), []);\n    const setRent = useCallback((newValue: number) => setForm((state) => ({ ...state, rent: ! isNaN(newValue) ? newValue : 0 })), []);\n    const setComfortInvoice = useCallback((newValue: number) => setForm((state) => ({ ...state, comfortInvoice: ! isNaN(newValue) ? newValue : 0 })), []);\n    const setRoomType = useCallback((roomType: FormType['roomType']) => () => {\n        setForm((state) => {\n            if (state.roomType === roomType) return { ...state, roomType: undefined };\n            return ({ ...state, roomType });\n        });\n    }, []);\n    const regionsSelect = useSelect(\n        newValue => setForm((state) => ({ ...state, region: newValue })),\n        {\n            selected: form.region, // initial value\n            texts: regionsEnumerationDie.map(option => ({ value: option.value, text: option.label }))\n        }\n    );\n\n    const [ formTouched, setFormTouched ] = useState({\n        rent: false,\n        comfortInvoice: false,\n        propertyCost: false,\n        ownAmount: false,\n    });\n\n    const validateForm = useCallback((isFinalValidate?: boolean) => {\n        return validateFormFields({\n            touched: isFinalValidate ?\n                { rent: true, comfortInvoice: true, propertyCost: true, ownAmount: true } : formTouched,\n            formValues: form,\n            mortgagePercent: isFinalValidate ? mortgagePercent : undefined\n        });\n    }, [ formTouched, form, mortgagePercent ]);\n    const [ formValidMessages, setFormValidMessages ] = useState(validateForm);\n\n    useEffect(() => setFormValidMessages(validateForm()), [ validateForm ]);\n\n    const setRentTouched = useCallback(() => setFormTouched((state) => ({ ...state, rent: true })), []);\n    const setPropertyCostTouched = useCallback(() => setFormTouched((state) => ({ ...state, propertyCost: true })), []);\n    const setOwnAmountTouched = useCallback(() => setFormTouched((state) => ({ ...state, ownAmount: true })), []);\n    const setComfortInvoiceTouched = useCallback(() => setFormTouched((state) => ({ ...state, comfortInvoice: true })), []);\n\n    const handleValidToCalculate = useCallback(() => {\n        const isFinalValidate = true;\n        const isValidFormFields = validateForm(isFinalValidate);\n\n        if (! isValidFormFields.rent.isError && ! isValidFormFields.comfortInvoice.isError &&\n            ! isValidFormFields.propertyCost && ! isValidFormFields.ownAmount.isError\n        ) {\n            onCalculate();\n        } else {\n            setFormValidMessages(isValidFormFields);\n        }\n    }, [ onCalculate, validateForm ]);\n\n    return (<>\n        <form className={cnMrtgBuyOrDie('form')}>\n            <MortgageBuyOrDieFormField text='Где вы&nbsp;собираетесь купить квартиру?'>\n                <Select native={isMobile} mode='single' onChange={regionsSelect.handleChange}>\n                    <Select.Button size='l' dataTest='regions-trigger'>\n                        {regionsSelect.selectedText}\n                    </Select.Button>\n                    <Select.Content>\n                        {regionsEnumerationDie.map(option => (\n                            <Select.Option\n                                dataTest={`ceilHeight-${option.value}`}\n                                key={option.value}\n                                value={option.value}\n                                selected={regionsSelect.is(option.value)}\n                            >\n                                {option.label}\n                            </Select.Option>\n                        ))}\n                    </Select.Content>\n                </Select>\n            </MortgageBuyOrDieFormField>\n            <MortgageBuyOrDieFormField text='Сколько комнат:'>\n                <div className={cnMrtgBuyOrDie('form-rooms')}>\n                    {ROOM_OPTIONS.map(({ value, label }) => (\n                        <Button\n                            variant='secondary'\n                            size='m'\n                            key={value}\n                            selected={form.roomType === value}\n                            onClick={setRoomType(value)}\n                        >\n                            {label}\n                        </Button>\n                    ))}\n                </div>\n            </MortgageBuyOrDieFormField>\n            <div className={cnMrtgBuyOrDie('form-inputs')}>\n                <MortgageBuyOrDieFormField text='Стоимость квартиры:'>\n                    <NumberInput\n                        dataTest='mortgage-die-set-propertyCost'\n                        size='l'\n                        inputMode='numeric'\n                        onChange={setPropertyCost}\n                        onBlur={setPropertyCostTouched}\n                        value={form.propertyCost}\n                        postfix='₽'\n                        hint={formValidMessages.propertyCost}\n                        error={Boolean(formValidMessages.propertyCost)}\n                    />\n                </MortgageBuyOrDieFormField>\n                <MortgageBuyOrDieFormField text='Уже накопили:'>\n                    <NumberInput\n                        dataTest='mortgage-die-set-amount'\n                        size='l'\n                        inputMode='numeric'\n                        postfix='₽'\n                        onChange={setOwnAmount}\n                        onBlur={setOwnAmountTouched}\n                        value={form.ownAmount}\n                        hint={formValidMessages.ownAmount.text}\n                        error={formValidMessages.ownAmount.isError}\n                    />\n                </MortgageBuyOrDieFormField>\n                <MortgageBuyOrDieFormField text='Арендная плата за&nbsp;съём жилья:'>\n                    <NumberInput\n                        dataTest='mortgage-die-set-rent'\n                        size='l'\n                        onChange={setRent}\n                        postfix='₽'\n                        value={form.rent}\n                        onBlur={setRentTouched}\n                        hint={formValidMessages.rent.text}\n                        error={formValidMessages.rent.isError}\n                    />\n                </MortgageBuyOrDieFormField>\n                <MortgageBuyOrDieFormField text='Комфортный платёж по&nbsp;ипотеке:'>\n                    <NumberInput\n                        dataTest='mortgage-die-set-invoice'\n                        size='l'\n                        onChange={setComfortInvoice}\n                        postfix='₽'\n                        value={form.comfortInvoice}\n                        onBlur={setComfortInvoiceTouched}\n                        hint={formValidMessages.comfortInvoice.text}\n                        error={formValidMessages.comfortInvoice.isError}\n                    />\n                </MortgageBuyOrDieFormField>\n            </div>\n        </form>\n        {! isMobile ? (\n            <Modal.Actions>\n                <Button\n                    fullWidth\n                    variant='accent'\n                    onClick={handleValidToCalculate}\n                >Рассчитать</Button>\n            </Modal.Actions>\n        ) : null}\n        {isMobile ? (\n            <Modal.StickyActions>\n                <Button\n                    fullWidth\n                    variant='accent'\n                    onClick={handleValidToCalculate}\n                >Рассчитать</Button>\n            </Modal.StickyActions>\n        ) : null}\n    </>);\n}\n","import './MortgageBuyOrDie.css';\n\nimport React, { useCallback, useState } from 'react';\nimport classname from '@search/classname/src';\nimport { Modal, Button, Typography } from '@vtblife/uikit';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { MortgageBuyOrDieResultCard } from './subcomponents/MortgageBuyOrDieResultCard';\nimport { MortgageBuyOrDieReason } from './subcomponents/MortgageBuyOrDieReason';\nimport { getLocalStorageLastValue } from './helpers/getLocalStorageLastValue';\nimport { calculateBuyOrDie } from './helpers/calculateBuyOrDie';\nimport { MortgageBuyOrDieModalForm } from './subcomponents/MortgageBuyOrDieForm';\nimport { mapRegionToSelect } from './helpers/mapRegionToSelect';\n\n// Немного другое название, потому что Андрей Африканов боится, что кто-то посмотрит наши классы\n// ужас какой\nexport const cnMrtgBuyOrDie = classname.bind(null, 'MortgageBuyOrAccModal');\n\nconst RENT_BUY_OR_ACC_KEY = 'rentBuyOrAcc';\nconst COMFORT_INVOICE_BUY_OR_ACC_KEY = 'comfortInvoiceBuyOrAcc';\n\nconst regionsEnumeration = [\n    { label: 'Москва и Московская область', value: 0 },\n    { label: 'Санкт-Петербург и Ленинградская область', value: 1 },\n];\n\nfunction convertRoomForAssign(roomType?: Rooms) {\n    switch (roomType) {\n        case Rooms.ROOM_5_AND_MORE:\n        case Rooms.ROOM_4:\n        case Rooms.OPEN_PLAN:\n            return Rooms.ROOM_4;\n        case undefined:\n        case Rooms.UNKNOWN:\n            return Rooms.ROOM_1;\n        default:\n            return roomType;\n    }\n}\n\nconst typeProfitableTextReasons: Record<'buy' | 'die', [ string, string ]> = {\n    buy: [\n        'Получить налоговый вычет до\\u00A0390\\u00A0000\\u00A0₽. Это поможет закрыть ипотеку досрочно, а\\u00A0значит заплатить банку меньше.',\n        'Рефинансировать ипотеку и\\u00A0снизить ставку. Другие банки готовы снизить процентную ставку, если вы\\u00A0переведете к\\u00A0ним ипотеку из\\u00A0своего банка.'\n    ],\n    die: [\n        'Недвижимость может резко вырасти в\\u00A0цене. Например, в\\u00A02021 квартиры подорожали на\\u00A022,6%, хотя ранее росли в\\u00A0цене на\\u00A05-7% ежегодно.',\n        'Инфляция может «съесть» накопления. По\\u00A0данным Росстата в\\u00A02022 инфляция составила 11,94%, а\\u00A0средняя ставка по\\u00A0вкладам в\\u00A03\\u00A0кв.\\u00A02022\\u00A0— 5,27%.'\n    ],\n};\n\nexport type FormType = {\n    ownAmount: number;\n    propertyCost: number;\n    rent: number;\n    comfortInvoice: number;\n    roomType?: Rooms;\n    region: typeof regionsEnumeration[number]['value'];\n}\n\nexport function MortgageBuyOrDieModal({\n    isMobile,\n    onSuccess,\n    onClose,\n    propertyCost,\n    regionId,\n    roomType,\n    mortgagePercent\n}: {\n    isMobile?: boolean;\n    onSuccess(e: React.MouseEvent<Element, MouseEvent>): void;\n    onClose?(): void;\n    roomType?: Rooms;\n    regionId?: number;\n\n    propertyCost: number;\n    // ownAmount: number;\n    mortgagePercent: number;\n}) {\n    const [ modalView, setModalView ] = useState<'form' | 'calcResult'>('form');\n    const [ typeProfitable, setTypeProfitable ] = useState<'buy' | 'die'>();\n    const [ calculatedData, setCalculatedData ] = useState<Omit<ReturnType<typeof calculateBuyOrDie>, 'typeProfitable'>>();\n\n    // we store it here to save state between modalView\n    const [ form, setForm ] = useState<FormType>({\n        propertyCost,\n        ownAmount: Math.ceil(propertyCost / 100 * 15),\n        rent: getLocalStorageLastValue(RENT_BUY_OR_ACC_KEY),\n        comfortInvoice: getLocalStorageLastValue(COMFORT_INVOICE_BUY_OR_ACC_KEY),\n        roomType: convertRoomForAssign(roomType),\n        region: mapRegionToSelect(regionId)\n    });\n\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const handleCalculate = useCallback(() => {\n        // after all checking\n        localStorage?.setItem(COMFORT_INVOICE_BUY_OR_ACC_KEY, String(form.comfortInvoice));\n        localStorage?.setItem(RENT_BUY_OR_ACC_KEY, String(form.rent));\n        const { typeProfitable: calculatedTypeProfitable, ...calculatedResult } = calculateBuyOrDie({\n            ...form,\n            mortgagePercent,\n            initialPayment: form.ownAmount\n        });\n\n        setCalculatedData(calculatedResult);\n        setModalView('calcResult');\n        dataLayerPush({\n            event: 'up_action',\n            theme: 'ipoteka',\n            page_type: 'card',\n            type: 'buy_or_save_calc'\n        });\n        document.querySelector('[class*=\"content-module__scrollable\"]')?.scrollTo(0, 0);\n        setTypeProfitable(localStorage?.getItem('buydie') as 'buy' | 'die' ?? calculatedTypeProfitable);\n    }, [ form, mortgagePercent ]);\n    const handleBackToForm = useCallback(() => {\n        setModalView('form');\n        setTypeProfitable(undefined);\n\n        dataLayerPush({\n            event: 'up_action',\n            theme: 'ipoteka',\n            page_type: 'card',\n            type: 'buy_or_save_back'\n        });\n    });\n    const handleSubmitMortgageReq = useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n        dataLayerPush({\n            event: 'up_action',\n            theme: 'ipoteka',\n            page_type: 'card',\n            type: 'buy_or_save_rate'\n        });\n        onSuccess(e);\n    });\n\n    const subtitle = modalView === 'form' ? 'Что будет выгоднее: копить или купить в\\u00A0ипотеку?' : 'Результаты расчёта';\n    const actionText = 'Узнать свою ставку';\n    const resultText = typeProfitable === 'buy' ? 'А\\u00A0ещё, купив квартиру в\\u00A0ипотеку вы\\u00A0сможете:' : 'Стоит учитывать риски, которые сложно спрогнозировать:';\n\n    return (<Modal\n        onClose={onClose}\n        closable\n        mobile={isMobile}\n        swipeToClose={! isMobile}\n        opened\n    >\n        {isMobile ? <Modal.Header>Калькулятор</Modal.Header> : <Modal.Title>{subtitle}</Modal.Title>}\n        <Modal.Content scrollable={isMobile}>\n            {isMobile ? <Typography className={cnMrtgBuyOrDie('subtitle')} variant='h3'>{subtitle}</Typography> : null}\n\n            {modalView === 'form' && (<>\n                <MortgageBuyOrDieModalForm\n                    isMobile={isMobile}\n                    form={form}\n                    mortgagePercent={mortgagePercent}\n                    onCalculate={handleCalculate}\n                    setForm={setForm}\n                />\n            </>)}\n\n            {modalView === 'calcResult' && calculatedData && (<>\n                <div className={cnMrtgBuyOrDie('results')}>\n                    <MortgageBuyOrDieResultCard\n                        type='mortgage'\n                        isMobile={isMobile}\n                        isProfitable={typeProfitable === 'buy'}\n                        price={calculatedData.priceMortgage}\n                        time={calculatedData.timeMortgage}\n                    />\n                    <MortgageBuyOrDieResultCard\n                        type='acc'\n                        isMobile={isMobile}\n                        isProfitable={typeProfitable === 'die'}\n                        price={calculatedData.priceAcc}\n                        time={calculatedData.timeAcc}\n                        isOverLimit={calculatedData.isOverLimitAcc}\n                    />\n                </div>\n                <div className={cnMrtgBuyOrDie('results-annotation')}>\n                    <Typography bold variant='primary-alone'>{resultText}</Typography>\n                    {typeProfitable && (<>\n                        <MortgageBuyOrDieReason\n                            type={typeProfitable === 'buy' ? 'pos' : 'neg'}\n                            text={typeProfitableTextReasons[typeProfitable][0]}\n                        />\n                        <MortgageBuyOrDieReason\n                            type={typeProfitable === 'buy' ? 'pos' : 'neg'}\n                            text={typeProfitableTextReasons[typeProfitable][1]}\n                        />\n                    </>)}\n                </div>\n\n                {/* force wrapper for correct ratio of buttons */}\n                {! isMobile ? (<>\n                    <div className={cnMrtgBuyOrDie('actions')}>\n                        <Button\n                            icon='arrow-left'\n                            variant='secondary'\n                            onClick={handleBackToForm}\n                        />\n                        <Button\n                            fullWidth\n                            variant={'secondary'}\n                            onClick={handleSubmitMortgageReq}\n                        >{actionText}</Button>\n                    </div>\n                    <Typography\n                        className={cnMrtgBuyOrDie('disclaimer')}\n                        variant='secondary-alone'\n                        color='secondary'\n                    >\n                        Расчет ориентировочный и&nbsp;не&nbsp;является инвестиционной рекомендацией.\n                    </Typography>\n                </>) : null}\n\n                {isMobile ? (<>\n                    <Typography variant='secondary-alone' color='secondary'>Расчет ориентировочный и&nbsp;не&nbsp;является инвестиционной рекомендацией.</Typography>\n                    <Modal.StickyActions>\n                        <div className={cnMrtgBuyOrDie('actions', { isSticky: true })}>\n                            <Button\n                                icon='arrow-left'\n                                variant='secondary'\n                                onClick={handleBackToForm}\n                            />\n                            <Button\n                                fullWidth\n                                variant={'secondary'}\n                                onClick={handleSubmitMortgageReq}\n                            >{actionText}</Button>\n                        </div>\n                    </Modal.StickyActions>\n                </>) : null}\n            </>)}\n        </Modal.Content>\n    </Modal>);\n}\n","import './MortgageBuyOrDie.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport Icon from '@vtblife/uikit-icons'; // TODO\n\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\nimport Image from '../../Image';\n\nimport mortgageBuyOrDieImg from './mortgageBuyOrDieImg.url.svg';\n\nconst cn = classname.bind(null, 'MortgageBuyOrAccTrigger');\n\nexport function MortgageBuyOrDieTrigger({ onClick, className }: { onClick(): void; className?: string }) {\n    const staticPath = useStaticPathConfig();\n\n    return (<div className={cn('', undefined, className)} onClick={onClick}>\n        <Image url={`${staticPath}${mortgageBuyOrDieImg}`} />\n        <div className={cn('texts')}>\n            <Typography bold variant='secondary-alone'>\n                Что сейчас выгоднее: арендовать и&nbsp;копить или купить квартиру&nbsp;в&nbsp;ипотеку?\n                {/* eslint-disable-next-line react/jsx-indent */}\n                <Typography tag='span' bold color='link' className={cn('link-hover')}>\n                    &ensp;Рассчитать&nbsp;➔\n                    {/* TODO ICON */}\n                    {/* <i\n                        // eslint-disable-next-line max-len\n                        style={{ lineHeight: 16, display: 'inline-flex', alignItems: 'center', verticalAlign: 'middle', marginLeft: 8 }}\n                    >\n                        <svg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'><path fillRule='evenodd' clipRule='evenodd' d='M11.13 7.25 7.88 4l1.06-1.06L14 8l-5.06 5.06L7.88 12l3.25-3.25h-9.2v-1.5h9.2Z' fill='#221F2E' /></svg>\n                    </i> */}\n                </Typography>\n            </Typography>\n            <Typography variant='small' color='secondary'>Калькулятор рентабельности поможет сделать правильный выбор</Typography>\n        </div>\n    </div>);\n}\n","import './MortgageCalculatorFields.css';\n\nimport React, { FunctionComponent } from 'react';\nimport { SliderNumberInput, Typography } from '@vtblife/uikit';\nimport { SliderNumberInputField, SliderMoneyInputField, Size } from '@vtblife/uikit/legacy';\nimport classname from '@search/classname/src';\n\nimport { useBankMortgageForm, UseBankMortgageFormProps } from '../../MinimalBanksMortgageFields/useBankMortgageForm';\nimport { MortgagePurposeEnum } from '../../MortgagePurposeEnum';\nimport { declensionYear } from '../../declensions';\n\nconst cn = classname.bind(null, 'BanksMortgageCalculatorFields');\n\nconst formatYear = (value: string) => {\n    return `${value} ${declensionYear(Number(value.replace(',', '.')))}`;\n};\n\nexport interface MinimalBanksMortgageFieldsProps extends UseBankMortgageFormProps {\n    className?: string;\n}\n\n/**\n * Задаем несуществующий FORM_ID чтобы поля не отправлялись при submit\n */\nconst FORM_ID = 'FORM_ID';\n\nexport const BanksMortgageCalculatorFields: FunctionComponent<MinimalBanksMortgageFieldsProps & { isMobile?: boolean }> = React.memo(props => {\n    const { className, isMobile, ...rest } = props;\n    const {\n        formState,\n        handleFieldChange,\n        calculatedFormValues: {\n            ownAmount,\n            propertyCost,\n            term\n        }\n    } = useBankMortgageForm(rest);\n\n    return (\n        <div className={cn(undefined, undefined, className)}>\n            <input hidden name='term' value={formState.term} readOnly />\n            <input hidden name='purpose' value={MortgagePurposeEnum[formState.purpose]} readOnly />\n            <input hidden name='regionId' value={formState.regionId} readOnly />\n            <input hidden name='ownAmount' value={formState.ownAmount} readOnly />\n            <input hidden name='propertyCost' value={formState.propertyCost} readOnly />\n            <div className={cn('field', { grid: 'cost' })}>\n                <SliderNumberInput\n                    currency='RUB'\n                    logarithmic\n                    size='l'\n                    inputMode='decimal'\n                    label='Стоимость недвижимости'\n                    max={propertyCost.max}\n                    min={propertyCost.min}\n                    step={propertyCost.step}\n                    name='propertyCost'\n                    onChange={handleFieldChange.bind(null, 'propertyCost')}\n                    value={formState.propertyCost}\n                />\n            </div>\n            <div className={cn('field', { grid: 'ownAmount' })}>\n                <SliderMoneyInputField\n                    contentAfter={isMobile ? undefined : <Typography variant='h4' color='black-400'>{ownAmount.percent}</Typography>}\n                    form={FORM_ID}\n                    inputMode='decimal'\n                    label='Первоначальный взнос'\n                    max={ownAmount.max}\n                    min={ownAmount.min}\n                    name='ownAmount'\n                    onChange={handleFieldChange.bind(null, 'ownAmount')}\n                    size={Size.Large}\n                    step={ownAmount.step}\n                    value={formState.ownAmount}\n                    hideNoteSpace\n                />\n            </div>\n            <div className={cn('field', { grid: 'term' })}>\n                <SliderNumberInputField\n                    form={FORM_ID}\n                    formatter={formatYear}\n                    inputMode='numeric'\n                    label='Срок кредита'\n                    max={term.max}\n                    min={term.min}\n                    name='term'\n                    onChange={handleFieldChange.bind(null, 'term')}\n                    size={Size.Large}\n                    value={formState.term ? formState.term : 1}\n                    hideNoteSpace\n                />\n            </div>\n        </div>\n    );\n});\n","import './ArrowButton.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'ArrowButton');\n\nexport type ArrowDirection = 'left' | 'right';\n\nexport function ArrowButton({\n    onClick,\n    size = 'm',\n    dataTest,\n    direction,\n    variant,\n    disabled,\n    isDisabledToHide\n}: {\n    size?: 'm' | 's';\n    disabled?: boolean;\n    variant?: 'alt';\n    direction: ArrowDirection;\n    onClick?(direction: ArrowDirection): void;\n    dataTest?: string;\n    isDisabledToHide?: boolean;\n}) {\n    return (\n        <button\n            disabled={disabled}\n            className={cn(null, { variant, size, disabled, isDisabledToHide })}\n            onClick={e => {\n                e.preventDefault();\n                e.stopPropagation();\n                onClick?.(direction);\n            }}\n            data-test={dataTest}\n        >\n            <Icon\n                name={direction === 'right' ? 'chevron-right' : 'chevron-left'}\n                size='m'\n            />\n        </button>\n    );\n}\n","import React from 'react';\n\nimport { ArrowButton, ArrowDirection } from './ArrowButton';\n\nexport function ArrowButtonPair({\n    onArrowClick,\n    isLeftEdge,\n    isRightEdge,\n    variant,\n    size,\n    dataTestPrefix = 'desktop-mortgage-calculator-arrow',\n    isDisabledToHide,\n}: {\n    onArrowClick(type: ArrowDirection): void;\n    isLeftEdge?: boolean;\n    isRightEdge?: boolean;\n    dataTestPrefix?: string;\n} & Pick<React.ComponentProps<typeof ArrowButton>, 'variant' | 'size' | 'isDisabledToHide'>) {\n    return (\n        <>\n            <ArrowButton\n                direction='left'\n                size={size}\n                variant={variant}\n                disabled={isLeftEdge}\n                onClick={onArrowClick}\n                dataTest={`${dataTestPrefix}-left`}\n                isDisabledToHide={isDisabledToHide}\n            />\n            <ArrowButton\n                direction='right'\n                size={size}\n                variant={variant}\n                disabled={isRightEdge}\n                onClick={onArrowClick}\n                dataTest={`${dataTestPrefix}-right`}\n                isDisabledToHide={isDisabledToHide}\n            />\n        </>\n    );\n}\n","import './ArrowButtonPop.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\n\nimport { ArrowButtonPair } from './ArrowButtonPair';\n\nconst cn = classname.bind(null, 'ArrowButtonPop');\n\nexport function ArrowButtonPop(p: React.ComponentProps<typeof ArrowButtonPair>) {\n    return (\n        <div className={cn(null, { left: p.isLeftEdge, right: p.isRightEdge })}>\n            <ArrowButtonPair {...p} />\n        </div>\n    );\n}\n","import React from 'react';\nimport type { ArrowDirection } from './ArrowButton';\n\nfunction findInvizibleNearestChilds(container: HTMLElement) {\n    const cr = container.parentElement?.getBoundingClientRect();\n\n    const childs = container.childNodes as unknown as readonly HTMLElement[];\n\n    let left: HTMLElement | undefined;\n    let right: HTMLElement | undefined;\n\n    if (! cr) return { left, right };\n\n    childs.forEach(child => {\n        const r = child.getBoundingClientRect();\n\n        if (r.x < cr.x) left = child;\n        if (r.x + r.width > cr.x + cr.width && ! right) right = child;\n    });\n\n    return { left, right };\n}\n\nexport function useArrowButton() {\n    const [ isLeftEdge, setIsLeftEdge ] = React.useState(true);\n    const [ isRightEdge, setIsRightEdge ] = React.useState(false);\n    const containerRef = React.useRef<HTMLDivElement>(null);\n\n    const onArrowClick = React.useCallback((arrowDirection: ArrowDirection) => {\n        const container = containerRef.current;\n\n        if (! container) return;\n\n        const nearest = findInvizibleNearestChilds(container);\n\n        const item = arrowDirection === 'left' ? nearest.left : nearest.right;\n\n        item?.scrollIntoView({\n            inline: arrowDirection === 'left' ? 'end' : 'start',\n            behavior: 'smooth',\n            block: 'nearest'\n        });\n    }, [ ]);\n\n    const onContainerScroll = React.useCallback((event: React.UIEvent<HTMLDivElement> & { target?: HTMLDivElement }) => {\n        const t = event.target;\n\n        if (! t) return;\n\n        setIsLeftEdge(t.scrollLeft === 0);\n        // +1 потому скролл не доезжат до конца идеально, не хватало 0.175 что ли.\n        setIsRightEdge((t.offsetWidth + t.scrollLeft) + 1 >= t.scrollWidth);\n    }, []);\n\n    const [ isScrollNeeded, setIsScrollNeeded ] = React.useState(false);\n\n    React.useEffect(() => {\n        const container = containerRef.current;\n\n        if (! container) return;\n        const nearest = findInvizibleNearestChilds(container);\n\n        setIsScrollNeeded(Boolean(nearest.left || nearest.right));\n    }, []);\n\n    return {\n        onArrowClick,\n        onContainerScroll,\n        isScrollNeeded,\n        isLeftEdge,\n        isRightEdge,\n        containerRef\n    };\n}\n","import './CardScroller.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'CardScroller');\n\nexport function CardScroller({\n    controls,\n    children,\n    isLeftMask,\n    isRightMask,\n    isBottomMargin,\n    containerRef,\n    autoWidth,\n    onContainerScroll,\n    isLeftMargin\n}: {\n    autoWidth?: boolean;\n    onContainerScroll?(e: React.UIEvent<HTMLDivElement> & { target?: HTMLDivElement }): void;\n    containerRef?: React.RefObject<HTMLDivElement>;\n    isLeftMask?: boolean;\n    isRightMask?: boolean;\n    isBottomMargin?: boolean;\n    isLeftMargin?: boolean;\n    controls?: React.ReactNode;\n    children: React.ReactNode;\n}) {\n    return (\n        <div\n            className={cn(null, { left: isLeftMask, right: isRightMask, bottom: isBottomMargin, leftMargin: isLeftMargin })}\n        >\n            <div\n                ref={containerRef}\n                onScroll={onContainerScroll}\n                className={cn('content', { autoWidth })}\n            >\n                {children}\n            </div>\n            {controls}\n        </div>\n    );\n}\n","import React from 'react';\n\nimport { ArrowButtonPop } from '../ArrowButton/ArrowButtonPop';\nimport { useArrowButton } from '../ArrowButton/useArrowButton';\nimport { CardScroller } from '../CardScroller/CardScroller';\n\nexport function BanksMortgageOffersScroller({\n    children,\n    isControls\n}: {\n    isControls?: boolean;\n    children: React.ReactNode;\n}) {\n    const {\n        onArrowClick,\n        onContainerScroll,\n        isLeftEdge,\n        isRightEdge,\n        containerRef\n    } = useArrowButton();\n\n    return (\n        <CardScroller\n            children={children}\n            onContainerScroll={onContainerScroll}\n            isLeftMask={! isLeftEdge}\n            isRightMask={! isRightEdge}\n            containerRef={containerRef}\n            controls={\n                isControls && (<ArrowButtonPop\n                    isDisabledToHide\n                    onArrowClick={onArrowClick}\n                    isLeftEdge={isLeftEdge}\n                    isRightEdge={isRightEdge}\n                />)\n            }\n        />\n    );\n}\n","import './MortgageDiscountConditions.css';\n\nimport React, { useMemo } from 'react';\nimport { Checkbox, Collapse, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { DiscountCalcEnum } from '@search/graphql-typings';\nimport { maxMortgageDiscountFormatted } from '../useChangeDiscount';\n\nconst cn = classname.bind(null, 'MortgageDiscountConditions');\n\nconst MortgageCondition = ({\n    children,\n    isMobile = false,\n    disabled = false,\n    value,\n    onChangeDiscount,\n    discountType\n}: {\n    value: boolean;\n    children: string;\n    isMobile?: boolean;\n    disabled?: boolean;\n    discountType: DiscountCalcEnum;\n    onChangeDiscount: (checked: boolean, discountType: DiscountCalcEnum) => void;\n}) => {\n    const textStyleCheckbox = useMemo(() => {\n        return isMobile ? 'small-alone' : 'secondary-alone';\n    }, [ isMobile ]);\n\n    return (\n        <div className={cn('checkbox')}>\n            <Checkbox disabled={disabled} value={value} onChange={checked => onChangeDiscount(checked, discountType)}>\n                <Typography variant={textStyleCheckbox} color='black-500'>{children}</Typography>\n            </Checkbox>\n            <Typography variant={textStyleCheckbox}>-0,3%</Typography>\n        </div>\n    );\n};\n\nexport const MortgageDiscountConditions = (\n    {\n        discountTypes,\n        isMobile,\n        discount,\n        onChangeDiscount,\n        className\n    }: {\n        discountTypes: readonly DiscountCalcEnum[];\n        isMobile?: boolean;\n        discount: string;\n        className?: string;\n        onChangeDiscount: (value: boolean, discountType: DiscountCalcEnum) => void;\n    }\n) => {\n    return (\n        <div className={cn(null, undefined, className)}>\n            <Collapse size='s' variant='gray'>\n                <Collapse.Item\n                    title={`Как сэкономить ${maxMortgageDiscountFormatted}% на\\u00A0ставке по\\u00A0ипотеке от\\u00A0ВТБ?`}\n                >\n                    {\n                        <div className={cn('checkbox-group')}>\n                            <MortgageCondition\n                                discountType={DiscountCalcEnum.SbrElreg}\n                                isMobile={isMobile}\n                                value={discountTypes.includes(DiscountCalcEnum.SbrElreg)}\n                                onChangeDiscount={onChangeDiscount}\n                            >\n                                Использование сервиса безопасных расчетов и&nbsp;электронной регистрации\n                            </MortgageCondition>\n                            <MortgageCondition\n                                discountType={DiscountCalcEnum.SalaryProject}\n                                value={discountTypes.includes(DiscountCalcEnum.SalaryProject)}\n                                isMobile={isMobile}\n                                onChangeDiscount={onChangeDiscount}\n                            >\n                                Являюсь участником зарплатного проекта ВТБ или готов им&nbsp;стать\n                            </MortgageCondition>\n                        </div>\n                    }\n                    {Number(discount) > 0 ? (\n                        <div className={cn('final-value')}>\n                            <Typography variant='secondary-alone' bold>\n                                Скидка на&nbsp;ставку по&nbsp;ипотеке от&nbsp;банка ВТБ\n                            </Typography>\n                            <Typography variant='secondary-alone' bold>\n                                {`-${discount.replace('.', ',')}%`}\n                            </Typography>\n                        </div>\n                    ) : null}\n                </Collapse.Item>\n            </Collapse>\n        </div>\n    );\n};\n","import './NoOffersBanner.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\n\nimport Image from '../../../Image';\nimport NoOffersImg from './NoOffersImg.url.svg';\n\nconst cn = classname.bind(null, 'NoOffersBanner');\n\nexport const NoOffersBanner = () => {\n    const staticPath = useStaticPathConfig();\n\n    return (\n        <div className={cn()}>\n            <Image url={`${staticPath}${NoOffersImg}`} />\n            <div className={cn('description')}>\n                <Typography variant='h4'>\n                    Предложений нет\n                </Typography>\n                <p className={cn('text')}>\n                    На&nbsp;таких условиях оформить ипотеку не&nbsp;получится.\n                    Попробуйте найти квартиру дешевле или увеличьте срок.\n                </p>\n            </div>\n        </div>\n    );\n};\n","import './styles.css';\n\nimport React, { FunctionComponent, useState, useCallback, useMemo, useRef } from 'react';\nimport {\n    Typography,\n    // Button,\n    LinkButton\n} from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { parseAndFormatNumber } from '@search/helpers/src/formatNumber';\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport { ApplicationIdEnum, MortgageOfferType } from '@search/graphql-typings/src';\n\nimport { MinimalBanksMortgageProps } from '../../../../desktop/components/MinimalBanksMortgage';\nimport {\n    MinimalBanksMortgageOffer,\n    useMinimalBanksMortgageOffersSliced\n} from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { offerRegionToMortgage } from '../../../../../domain/offer/regionToBackoffice';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { Mortgage2StarterModal } from '../mortgage2/starter/Mortgage2StarterModal';\nimport { Mortgage2ConsultModal } from '../mortgage2/consult/Mortgage2ConsultModal';\nimport { getGtmLabel } from '../../../../../domain/GtmContext';\nimport { MortgageOfferSkeleton } from '../../BanksMortgageOffers/MortgageOfferSkeleton';\nimport { BankMortgageOffers } from '../../BanksMortgageOffers';\nimport { MortgageGovernmentDisclaimer } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer';\nimport { MortgageGovernmentDisclaimerModal } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal';\nimport { MortgageBuyOrDieModal } from '../mortgageBuyOrDie/MortgageBuyOrDieModal';\nimport { MortgageBuyOrDieTrigger } from '../mortgageBuyOrDie/MortgageBuyOrDieTrigger';\nimport { MortgageStupidModal } from '../stupid/MortgageStupidModal';\nimport { mortgage2ParamsFromClasified } from '../mortgage2/mortgage2ParamsFromClasified';\nimport { useMortgage2Request } from '../mortgage2/useMortgage2Request';\nimport { defaultBanksTotal } from '../contants';\nimport { useGovernmentMortgage } from '../useGovernmentMortgage';\nimport { BanksMortgageCalculatorFields } from './MortgageCalculatorFields/MortgageCalculatorFields';\nimport { BanksMortgageOffersScroller } from './MortgageOffersScroller/MortgageOffersScroller';\nimport { MortgageDiscountConditions } from './MortgageDiscountConditions/MortgageDiscountConditions';\nimport { maxMortgageDiscountFormatted, useChangeDiscount, VTB_ID } from './useChangeDiscount';\nimport { NoOffersBanner } from './NoOffersBanner/NoOffersBanner';\n\nconst cn = classname.bind(null, 'MortgageCalculator');\n\n// eslint-disable-next-line complexity\nexport const Mortgage3Calc : FunctionComponent<MinimalBanksMortgageProps> = React.memo(({\n    term,\n    isMobile,\n    isPreferentialNbCondition,\n    propertyCost,\n    ownAmount,\n    purpose,\n    regionId,\n    mortgageRegionId,\n    areButtonsHidden,\n    gtmStarterModalSendedId,\n    gtmCommonClick,\n    gtmSendClick,\n    gtmShowMoreClick,\n    gtmShowData,\n    gtmSendData,\n    applicationId,\n    realtyType = 'ProfOfferFlat',\n    withoutAuth,\n    withoutForm,\n    locationPlacement,\n    buyOrDieMode,\n    roomType,\n    isNewBuilding = false,\n    mortgageDemandLink,\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    mortgageOfferFormData = useMinimalBanksMortgageOffersSliced({\n        term,\n        propertyCost,\n        ownAmount,\n        purpose,\n        isPreferentialNbCondition,\n        regionId: regionId ? offerRegionToMortgage(regionId) : mortgageRegionId!,\n        defaultVisibleOffers: 4\n    }),\n    minimalMortgagePaymentSendData,\n    minimalMortgageRate\n}) => {\n    const [ senderState, setSenderState ] = useState({\n        selectedMortgageOffer: undefined as MinimalBanksMortgageOffer | undefined,\n        isSendModalOpened: false,\n        isConsultModalOpened: false\n    });\n    const isPreferentialSelectedOffer = senderState.selectedMortgageOffer?.type === MortgageOfferType.Preferential || senderState.selectedMortgageOffer?.type === MortgageOfferType.Family;\n    const [ isStupidModalOpened, setIsStupidModalOpened ] = useState(false);\n    const [ isCalcBuyOrDieModalOpened, setIsCalcBuyOrDieModalOpened ] = useState(false);\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const openBuyOrDieModal = useCallback(() => {\n        setIsCalcBuyOrDieModalOpened(true);\n\n        dataLayerPush({\n            event: 'up_action',\n            theme: 'ipoteka',\n            page_type: 'card',\n            type: 'buy_or_save_open'\n        });\n    }, [ dataLayerPush ]);\n    const closeBuyOrDieModal = useCallback(() => setIsCalcBuyOrDieModalOpened(false));\n    // чтобы обратили внимание на контекст вызова, если вызывать в другом - нужно сделать пропс про аналитику buy/die в модалке опциональным\n    const openStupidModalByBuyOrDie = useCallback(() => setIsStupidModalOpened(true));\n    const closeStupidModal = useCallback(() => setIsStupidModalOpened(false));\n\n    const {\n        isEmpty,\n        // eslint-disable-next-line @typescript-eslint/naming-convention\n        loading,\n        error,\n        formData,\n        setFormData,\n        formUrl,\n        offersFull,\n        isFormChanged\n    } = mortgageOfferFormData;\n\n    const governmentMortgage = useGovernmentMortgage({\n        ...formData,\n        isPreferentialNbCondition,\n    });\n    const {\n        offers,\n        discount,\n        onChangeDiscount,\n        isShowAdditionalDiscounts,\n        shouldVTBDiscountLogic,\n        discountTypes,\n    } = useChangeDiscount({\n        ...formData,\n        ...governmentMortgage,\n        isPreferentialNbCondition,\n        applicationId,\n        offersFull\n    });\n\n    const minimalIncome = useMemo(() => {\n        const firstNatureOfferMinimalPayment = offers.find(offer => ! offer?.disabled)?.minimalPayment;\n\n        if (! firstNatureOfferMinimalPayment) return null;\n\n        minimalMortgagePaymentSendData && minimalMortgagePaymentSendData(firstNatureOfferMinimalPayment);\n\n        // Платеж не более 60% от дохода\n        return parseAndFormatNumber(Math.round(firstNatureOfferMinimalPayment / 0.6));\n    }, [ offers ]);\n\n    const sendModalClose = useCallback(() => {\n        setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: false, isConsultModalOpened: false });\n    }, [ ]);\n\n    const selectMortgageOffer = useCallback((\n        selectedMortgageOffer: MinimalBanksMortgageOffer,\n        e: React.MouseEvent<HTMLButtonElement>\n    ) => {\n        e.preventDefault();\n        if (areButtonsHidden) return;\n        if (selectedMortgageOffer?.type === 'PREFERENTIAL' || selectedMortgageOffer?.type === 'FAMILY') {\n            dataLayerPush({\n                event: 'up_action',\n                theme: 'ipoteka',\n                type: selectedMortgageOffer?.type === 'PREFERENTIAL' ? 'gospr_benefit_click' : 'gospr_family_click'\n            });\n        }\n        if (withoutAuth) {\n            gtmShowData && dataLayerPush({\n                ...gtmShowData,\n                place: 'bank',\n            });\n            setSenderState({ selectedMortgageOffer, isSendModalOpened: true, isConsultModalOpened: false });\n        } else {\n            domain.sendQuery(e);\n        }\n    }, [ areButtonsHidden, dataLayerPush, withoutAuth, gtmShowData ]);\n\n    const consultModalOpen = useCallback((e?: React.MouseEvent<Element, MouseEvent>) => {\n        e?.preventDefault();\n        if (gtmShowMoreClick || gtmCommonClick) {\n            dataLayerPush({ event: gtmShowMoreClick || gtmCommonClick });\n        }\n        gtmShowData && dataLayerPush({\n            ...gtmShowData,\n            place: 'consultation'\n        });\n        setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: false, isConsultModalOpened: true });\n    }, [ gtmShowMoreClick, gtmCommonClick, dataLayerPush, gtmShowData ]);\n\n    const consultModalClose = useCallback(() => {\n        setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: false, isConsultModalOpened: false });\n    }, [ ]);\n\n    const willNeedSendDiscountsVTB = (\n        senderState.selectedMortgageOffer?.bankId === VTB_ID ||\n        (! senderState.selectedMortgageOffer && offers?.[0]?.bankId === VTB_ID)\n    );\n\n    // временное решение/дублирование.\n    // Нужно переделать всё это на контексты внутри оффера, например.\n    const params = mortgage2ParamsFromClasified({\n        regionId,\n        mortgageRegionId,\n        purpose: formData.purpose,\n        term: formData.term,\n        ownAmount: formData.ownAmount,\n        propertyCost: formData.propertyCost,\n    });\n    const banksTotal = senderState.selectedMortgageOffer ? defaultBanksTotal - 1 : defaultBanksTotal;\n\n    const bestMortgageOffer = senderState.selectedMortgageOffer ?? mortgageOfferFormData.bestMortgageOffer;\n    const initialBestMortgageOffer = useRef(bestMortgageOffer);\n\n    if (! initialBestMortgageOffer.current && bestMortgageOffer) {\n        initialBestMortgageOffer.current = bestMortgageOffer;\n    }\n\n    const userInfoLoad = useUserDetailsLoader();\n    const userInfo = userInfoLoad({});\n    const domain = useMortgage2Request({\n        regionId,\n        mortgageRegionId,\n        purpose: formData.purpose,\n        term: formData.term,\n        ownAmount: params.ownAmount,\n        propertyCost: params.propertyCost,\n        locationPlacement,\n        realtyType,\n        applicationId,\n        withoutAuth,\n        withoutForm,\n        shouldVTBDiscountLogic,\n        showPreferential: governmentMortgage.showPreferential,\n        gtmSendId: gtmStarterModalSendedId,\n        discounts: willNeedSendDiscountsVTB ? discountTypes : undefined,\n        userDetails: userInfo.data?.userProfile.person,\n        banksTotal,\n        selectedMortgageOffer: senderState.selectedMortgageOffer,\n        bestMortgageOffer,\n    });\n\n    const [ isMrtgDisclaimerModalOpened, setIsMrtgDisclaimerModalOpened ] = React.useState(false);\n    const handleSubmitRequest = useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n        e?.preventDefault();\n        setIsMrtgDisclaimerModalOpened(false);\n        if (withoutAuth) {\n            setSenderState({ selectedMortgageOffer: undefined, isSendModalOpened: true, isConsultModalOpened: false });\n            gtmShowData && dataLayerPush({\n                ...gtmShowData,\n                place: senderState.selectedMortgageOffer ? 'bank' : gtmShowData.place\n            });\n        } else {\n            domain.sendQuery(e);\n        }\n        if (applicationId === ApplicationIdEnum.ClassifiedDesktop || applicationId === ApplicationIdEnum.ClassifiedTouch) {\n            dataLayerPush({\n                event: 'classified_card_sale_ipoteka_calc_click'\n            });\n        }\n    }, [ dataLayerPush, withoutAuth, gtmShowData, applicationId ]);\n\n    if (error) return null;\n\n    if (! isFormChanged && ! loading && offersFull.length === 0) {\n        return null;\n    }\n\n    return (\n        <>\n            <form\n                method='GET'\n                target='_blank'\n                action={formUrl}\n                className={cn()}\n            >\n                <Typography variant='promo-h3'>\n                    {governmentMortgage.showPreferential ?\n                        <>Доступные ипотечные программы</> :\n                        <>Ипотека с&nbsp;экономией до&nbsp;{maxMortgageDiscountFormatted}% на&nbsp;ставке</>\n                    }\n                </Typography>\n                <BanksMortgageCalculatorFields\n                    className={cn('fields')}\n                    term={formData.term}\n                    purpose={formData.purpose}\n                    regionId={formData.regionId}\n                    ownAmount={formData.ownAmount}\n                    propertyCost={formData.propertyCost}\n                    onChange={setFormData}\n                />\n                {offers.length && minimalIncome ? <Typography bold>\n                    {`Доход заемщика не менее: ${minimalIncome} ₽/мес.`}\n                </Typography> : <>&nbsp;</>}\n                <div className={cn('scroller-wrap')}>\n                    <BanksMortgageOffersScroller isControls={offersFull.length > 4}>\n                        {loading ? (\n                            [ undefined, undefined, undefined, undefined, undefined ].map((item, index) => (\n                                <MortgageOfferSkeleton key={index} />\n                            ))\n                        ) : null}\n                        {isEmpty ? <NoOffersBanner /> : null}\n                        {offers.length && ! loading ? (\n                            offers.map((offer, index) => (\n                                <BankMortgageOffers\n                                    offer={offer}\n                                    key={String(offer?.type ?? 'unk') + '' + (offer?.bankId ?? String(index))}\n                                    gtmCommonClick={gtmCommonClick}\n                                    selectMortgageOffer={selectMortgageOffer}\n                                />\n                            ))\n                        ) : null}\n                    </BanksMortgageOffersScroller>\n                </div>\n                {governmentMortgage.showPreferential && (<div className={cn('conditions')}>\n                    {isMrtgDisclaimerModalOpened && (<MortgageGovernmentDisclaimerModal\n                        btnText={`${withoutAuth ? 'Подать' : 'Оформить'} заявку на ипотеку`}\n                        isMobile={isMobile}\n                        onSuccess={handleSubmitRequest}\n                        onClose={() => {\n                            setIsMrtgDisclaimerModalOpened(false);\n                        }}\n                    />)}\n                    <MortgageGovernmentDisclaimer\n                        isLongDescr\n                        isMobile={isMobile}\n                        onClick={() => {\n                            setIsMrtgDisclaimerModalOpened(true);\n                        }}\n                    />\n                </div>)}\n                {isShowAdditionalDiscounts && ! buyOrDieMode && (<MortgageDiscountConditions\n                    className={cn('conditions')}\n                    discount={discount.toFixed(1)}\n                    discountTypes={discountTypes}\n                    onChangeDiscount={onChangeDiscount}\n                />)}\n                {buyOrDieMode && bestMortgageOffer && (\n                    <MortgageBuyOrDieTrigger className={cn('buyOrAcc')} onClick={openBuyOrDieModal} />\n                )}\n                <div className={cn('buttons')}>\n                    <LinkButton\n                        variant='accent'\n                        type='submit'\n                        onClick={mortgageDemandLink ? undefined : handleSubmitRequest}\n                        href={mortgageDemandLink}\n                        {...getGtmLabel(gtmSendClick || gtmCommonClick)}\n                        disabled={loading || isEmpty}\n                        fullWidth\n                        width={buyOrDieMode ? 292 : undefined}\n                        dataTest='MinimalBanksMortgage-send'\n                    >\n                        {`${withoutAuth ? 'Подать' : 'Оформить'} заявку${buyOrDieMode ? ' на ипотеку' : ''}`}\n                    </LinkButton>\n                    {/*{! buyOrDieMode && (*/}\n                    {/*    <Button*/}\n                    {/*        dataTest='MinimalBanksMortgage-show-more'*/}\n                    {/*        type='submit'*/}\n                    {/*        onClick={consultModalOpen}*/}\n                    {/*        variant='transparent'*/}\n                    {/*    >*/}\n                    {/*        Получить консультацию*/}\n                    {/*    </Button>*/}\n                    {/*)}*/}\n                </div>\n                {senderState.isSendModalOpened ? <Mortgage2StarterModal\n                    governmentMortgage={governmentMortgage}\n                    withoutAuth={withoutAuth}\n                    locationPlacement={locationPlacement}\n                    gtmSendId={gtmStarterModalSendedId}\n                    fields={isPreferentialSelectedOffer ? [ 'rate', 'payment' ] : undefined}\n                    onClose={sendModalClose}\n                    selectedMortgageOffer={senderState.selectedMortgageOffer}\n                    mortgageOffers={offers}\n                    realtyType={realtyType}\n                    regionId={regionId}\n                    mortgageRegionId={mortgageRegionId}\n                    applicationId={applicationId}\n                    purpose={formData.purpose}\n                    term={formData.term}\n                    ownAmount={formData.ownAmount}\n                    propertyCost={formData.propertyCost}\n                    shouldVTBDiscountLogic={shouldVTBDiscountLogic}\n                    discounts={willNeedSendDiscountsVTB ? discountTypes : undefined}\n                    gtmShowData={gtmShowData}\n                    gtmSendData={gtmSendData}\n                /> : null}\n                {senderState.isConsultModalOpened ? <Mortgage2ConsultModal\n                    regionId={regionId}\n                    realtyType={realtyType}\n                    applicationId={applicationId}\n                    locationPlacement={locationPlacement}\n                    gtmSendData={gtmSendData}\n                    // always sending if VTB is present in offers (not possible to choose a bank)\n                    discounts={isShowAdditionalDiscounts ? discountTypes : undefined}\n                    onClose={consultModalClose}\n                /> : null}\n                {isCalcBuyOrDieModalOpened && initialBestMortgageOffer.current && (\n                    <MortgageBuyOrDieModal\n                        regionId={regionId}\n                        mortgagePercent={initialBestMortgageOffer.current.minimalPercent}\n                        roomType={roomType}\n                        propertyCost={propertyCost}\n                        onSuccess={openStupidModalByBuyOrDie}\n                        onClose={closeBuyOrDieModal}\n                    />\n                )}\n                {isStupidModalOpened && (\n                    <MortgageStupidModal\n                        onClose={closeStupidModal}\n                        applicationId={applicationId}\n                        gtmSendId={gtmStarterModalSendedId}\n                        regionId={regionId}\n                        locationPlacement={locationPlacement}\n                        isNewBuilding={isNewBuilding}\n                        propertyCost={propertyCost}\n                        realtyType={realtyType}\n                        isSendBuyDieAnalytics\n                        minimalMortgageRate={minimalMortgageRate}\n                    />\n                )}\n            </form>\n            <Typography variant='secondary-alone' color='black-400' className={cn('mortgage-disclaimer')}>\n                Расчёт условий не&nbsp;является публичной офертой. Финальные условия кредитования определяются при заключении договора\n            </Typography>\n        </>\n    );\n});\n","import React, { useMemo } from 'react';\nimport { formatLocaleNumber, parseAndFormatNumber } from '@search/helpers/src/formatNumber';\nimport { DiscountCalcEnum, ApplicationIdEnum } from '@search/graphql-typings';\nimport { MinimalBanksMortgageOffer, MinimalBanksMortgageOfferWithDiscount } from '../MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { useGovernmentMortgageType, governmentMinPercent } from '../useGovernmentMortgage';\n\nconst MAX_MORTGAGE_DISCOUNT = 0.3;\n\nexport const VTB_ID = '3';\nexport const maxMortgageDiscountFormatted = formatLocaleNumber(MAX_MORTGAGE_DISCOUNT);\n\nexport function useChangeDiscount({\n    term,\n    propertyCost,\n    ownAmount,\n    isMobile,\n    offersFull,\n    applicationId,\n    showPreferential,\n    withDiscount = showPreferential,\n    isPreferentialNbCondition,\n    isGovernmentDebtExceeds,\n    isGovernmentPercentPoor,\n    governmentMaxDebt\n}: {\n    isMobile?: boolean;\n    withDiscount?: boolean;\n    term: number;\n    propertyCost: number;\n    ownAmount: number;\n    offersFull: readonly MinimalBanksMortgageOfferWithDiscount[];\n    applicationId: ApplicationIdEnum;\n    isPreferentialNbCondition?: boolean;\n} & useGovernmentMortgageType) {\n    // change, if default value options changed (!!!)\n    const [ activeDiscountTypes, setActiveDiscountTypes ] = React.useState(\n        new Set([ DiscountCalcEnum.SbrElreg ])\n    );\n    const debt = propertyCost - ownAmount;\n\n    // block with controls - hidden\n    // const prev = React.useRef({ term, debt });\n    // React.useEffect(() => {\n    //     if (! showPreferential) return;\n    //     if (prev.current.term === term && prev.current.debt === debt) return;\n    //     prev.current = { term, debt };\n\n    //     // setActiveDiscountTypes(new Set()); // block with controls - hidden\n    // }, [ showPreferential, term, debt ]);\n\n    const discount = 0.0 +\n        (activeDiscountTypes.has(DiscountCalcEnum.SbrElreg) ? 0.3 : 0) +\n        (activeDiscountTypes.has(DiscountCalcEnum.SalaryProject) ? 0.3 : 0);\n\n    const offers: Array<MortgageOfferDiscountifyType> = React.useMemo(\n        () => {\n            if (! offersFull.length) return [];\n\n            const offers = offersFull\n                // Убираем офферы госпрограмм\n                .filter(offer => ! offer.type)\n                .map(offer => mortgageOfferDiscountify({ offer, discount, debt, term }))\n                .sort(mortgageOfferSort);\n\n            if (! isPreferentialNbCondition) return offers;\n\n            let familyOffer = offersFull\n                .filter(offer => offer.type === 'FAMILY')\n                .map(offer => mortgageOfferDiscountify({ offer, discount, debt, term }));\n            let itOffer = offersFull\n                .filter(offer => offer.type === 'IT_MORTGAGE')\n                .map(offer => mortgageOfferDiscountify({ offer, discount, debt, term }));\n\n            if (isGovernmentPercentPoor) {\n                // @ts-ignore\n                familyOffer = [ { ...emptyOffer(), type: 'FAMILY', description: `Первоначальный взнос не менее ${governmentMinPercent}%`, disabled: true } ];\n                // @ts-ignore\n                itOffer = [ { ...emptyOffer(), type: 'IT_MORTGAGE', description: `Первоначальный взнос не менее ${governmentMinPercent}%`, disabled: true } ];\n            }\n\n            if (isGovernmentDebtExceeds) {\n                // @ts-ignore\n                familyOffer = [ { ...emptyOffer(), type: 'FAMILY', description: `Сумма кредита превышает ${Math.floor(governmentMaxDebt / 1e6)} млн ₽`, disabled: true } ];\n                // @ts-ignore\n                itOffer = [ { ...emptyOffer(), type: 'IT_MORTGAGE', description: `Сумма кредита превышает ${Math.floor(governmentMaxDebt / 1e6)} млн ₽`, disabled: true } ];\n            }\n\n            return [\n                familyOffer[0],\n                itOffer[0],\n                ...offers\n            ].filter(Boolean);\n        },\n        [ offersFull, discount, debt, term, governmentMaxDebt, isMobile, isGovernmentDebtExceeds, isGovernmentPercentPoor ]\n    );\n\n    // views discount only VTB if it is selected/best offer\n    const shouldVTBDiscountLogic = (\n        applicationId === ApplicationIdEnum.ClassifiedDesktop ||\n        applicationId === ApplicationIdEnum.ClassifiedTouch\n    );\n\n    // views VTB discount options block\n    const isShowAdditionalDiscounts = useMemo(() => {\n        return ! showPreferential && shouldVTBDiscountLogic && offersFull.some(offer => offer.bankId === VTB_ID);\n    }, [ shouldVTBDiscountLogic, showPreferential, offersFull ]);\n\n    const onChangeDiscount = React.useCallback((enabled: boolean, discountType: DiscountCalcEnum) => {\n        setActiveDiscountTypes(() => {\n            if (enabled) return new Set([ discountType ]);\n            return new Set();\n        });\n    }, [ ]);\n\n    return {\n        offers,\n        discount,\n        onChangeDiscount,\n        shouldVTBDiscountLogic,\n        isShowAdditionalDiscounts,\n        discountTypes: Array.from(activeDiscountTypes)\n    };\n}\n\nfunction emptyOffer() {\n    return {\n        minimalPaymentDiscount: undefined,\n        minimalPaymentDiscountFormatted: undefined,\n        minimalPercentDiscount: undefined,\n        minimalPercentDiscountFormatted: undefined,\n        bankId: '',\n        description: '',\n        disabled: true,\n        icon: null,\n        minimalPayment: null,\n        minimalPaymentFormatted: null,\n        minimalPercent: null,\n        minimalPercentFormatted: null,\n        name: null,\n        type: undefined as undefined | string,\n    };\n}\n\nfunction calculatePayment({ percent, term, debt }: {\n    percent: number;\n    term: number;\n    debt: number;\n}) {\n    const monthPercent = percent / (100 * 12);\n    const denominator = (1 - Math.pow(1 + monthPercent, (-1) * term * 12));\n\n    return Math.floor((monthPercent * debt) / denominator);\n}\n\nexport type MortgageOfferDiscountifyType = MinimalBanksMortgageOfferWithDiscount & { description?: string };\n\nfunction mortgageOfferDiscountify({ offer, discount, debt, term }: {\n    debt: number;\n    term: number;\n    offer: MinimalBanksMortgageOffer;\n    discount: number;\n}): MortgageOfferDiscountifyType {\n    // ВТБ присылает нам процент с учётом ВСЕХ скидок,\n    // поэтому в зачеркнутой цене нам нужно показывать без них\n    const minimalPercent = offer.bankId === VTB_ID && ! offer.type ?\n        Number(((offer.minimalPercent ?? 10) + MAX_MORTGAGE_DISCOUNT).toFixed(2)) : undefined;\n\n    // минимальный процент от банка, меняющийся в зависимости от выбранных скидок\n    const discountPercent = minimalPercent === undefined ? undefined : minimalPercent - discount;\n\n    const minimalPercentFormatted = minimalPercent === undefined ? undefined :\n        `${formatLocaleNumber(minimalPercent, 1)}%`;\n\n    const minimalPercentDiscount = discountPercent === undefined ? undefined : Number(discountPercent.toFixed(1));\n    const minimalPercentDiscountFormatted = minimalPercentDiscount === undefined ?\n        undefined :\n        `${formatLocaleNumber(minimalPercentDiscount)}%`;\n\n    const minimalPaymentDiscount = discountPercent === undefined ? undefined :\n        calculatePayment({ percent: discountPercent, term, debt });\n\n    const minimalPaymentDiscountFormatted = minimalPaymentDiscount === undefined ? undefined :\n        `${parseAndFormatNumber(minimalPaymentDiscount)} ₽/мес.`;\n\n    return {\n        ...offer,\n        disabled: false,\n        description: '',\n        minimalPercent: minimalPercent ?? offer.minimalPercent,\n        minimalPercentFormatted: minimalPercentFormatted ?? offer.minimalPercentFormatted,\n        minimalPercentDiscount,\n        minimalPercentDiscountFormatted,\n        minimalPaymentDiscount,\n        minimalPaymentDiscountFormatted\n    };\n}\n\nfunction mortgageOfferSort(\n    a: MortgageOfferDiscountifyType,\n    b: MortgageOfferDiscountifyType\n) {\n    if (a.type && ! b.type) return -1;\n    if (! a.type && b.type) return 1;\n\n    if (a.minimalPercentDiscount) return a.minimalPercentDiscount - (b.minimalPercent ?? 1);\n    if (b.minimalPercentDiscount) return (a.minimalPercent ?? 1) - b.minimalPercentDiscount;\n\n    // family mortgage always first\n    if (a.type === 'FAMILY' || b.type === 'FAMILY') return 1;\n\n    return (a.minimalPercent ?? 1) - (b.minimalPercent ?? 1);\n}\n","export function getLocalStorageLastValue(key: string) {\n    const lastValueStr = localStorage?.getItem(key);\n    const lastValue = typeof lastValueStr === 'string' ? Number(lastValueStr) : undefined;\n\n    return lastValue ?? 0;\n}\n","import './MortgageFieldsBuilder.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MortgageFieldsBuilder');\n\nexport function MortgageFieldsBuilder({\n    isMobile,\n    gridFields,\n    contactFields,\n    actions,\n    prefixNodes\n} : {\n    isMobile?: boolean;\n    gridFields?: React.ReactNode;\n    contactFields?: React.ReactNode;\n    actions?: React.ReactNode;\n    prefixNodes?: React.ReactNode;\n}) {\n    return (<>\n        <div className={cn('grid-main', { isMobile })}>\n            {prefixNodes}\n            <div className={cn('grid-fields', { isMobile })}>\n                {gridFields}\n            </div>\n            <div className={cn('grid-contacts')}>\n                {contactFields}\n            </div>\n            <div className={cn('grid-actions')}>\n                {actions}\n            </div>\n        </div>\n        {isMobile ? <> <br /><br /><br /></> : null}\n    </>);\n}\n","import './MortgageStupidModal.css';\n\nimport React, { useMemo } from 'react';\nimport { Modal, Input, PhoneInput, Button, Typography } from '@vtblife/uikit';\n\nimport { Currency } from '@search/filter-enums/enums/Currency';\nimport { formatPrice } from '@search/helpers/src/formatPrice';\nimport { useStaticPathConfig } from '@search/common-core/src/StaticPathContext';\n\nimport { formatLocaleNumber } from '@search/helpers/src/formatNumber';\nimport { defaultMortgageRateNbFormatted, defaultMortgageRateSecondFormatted } from '../contants';\n\nimport { Mortgage2SuccessContent } from '../mortgage2/success/Mortgage2SuccessContent';\nimport { MortgageGovernmentDisclaimer } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimer';\nimport { MortgageGovernmentDisclaimerModal } from '../MortgageGovernmentDisclaimer/MortgageGovernmentDisclaimerModal';\nimport { calculateOwnAmount } from '../MinimalBanksMortgageFields/useBankMortgageForm';\nimport { MortgageFieldsBuilder } from '../domain/MortgageFieldsBuilder';\nimport { MortgageField } from '../domain/MortgageField';\nimport Image from '../../Image';\nimport { useGovernmentMortgage } from '../useGovernmentMortgage';\n\nimport bankLogos from './bankLogos.url.svg';\nimport { MortgageStupidProps, useStupidMortgage } from './useStupidMortgage';\n\nexport function MortgageStupidModal(props: MortgageStupidProps & {\n    onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n    propertyCost?: number;\n    rate?: number;\n    renderCustomFirstGrid?: React.ReactNode;\n}) {\n    const {\n        isMobile,\n        onClose,\n        isNewBuilding,\n        propertyCost,\n        rate,\n        renderCustomFirstGrid,\n        minimalMortgageRate\n    } = props;\n\n    const prices = useMemo(() => {\n        if (! propertyCost) return;\n\n        const propertyCostFormatted = formatPrice({\n            value: propertyCost * 100,\n            currency: Currency.RUB,\n            displayCurrency: true\n        });\n        let ownAmount = calculateOwnAmount(propertyCost, isNewBuilding ? 0.15 : 0.1);\n\n        if (rate) ownAmount = calculateOwnAmount(propertyCost, rate);\n\n        const ownAmountFormatted = formatPrice({\n            value: ownAmount * 100,\n            currency: Currency.RUB,\n            displayCurrency: true\n        });\n\n        return {\n            propertyCostFormatted,\n            ownAmountFormatted,\n            ownAmount\n        };\n    }, [ propertyCost, isNewBuilding ]);\n\n    const governmentMortgage = useGovernmentMortgage({\n        propertyCost,\n        ownAmount: prices?.ownAmount,\n        regionId: props.regionId,\n        isPreferentialNbCondition: isNewBuilding\n    });\n    const {\n        sendQueryOnEnter,\n        sendQuery,\n\n        isFormSended,\n        isFormSyncing,\n        nameInputValid,\n        name,\n        setName,\n        setNameTouched,\n        phoneInputValid,\n        setPhone,\n        phone,\n        setPhoneTouched,\n        loading\n    } = useStupidMortgage({\n        ...props,\n        ...governmentMortgage\n    });\n    // not important all conditions government mortgage\n    const title = governmentMortgage.isPreferentialNbCondition ? 'Ипотека с\\u00A0господдержкой на\\u00A0М2' : 'Выгодная ипотека с\\u00A0М2';\n    const subtitle = 'Заполните единую анкету, выберите подходящую программу и\\u00A0получите одобрение от\\u00A0лучших банков';\n\n    const staticPath = useStaticPathConfig();\n\n    const [ isModalGovernmentOpened, setIsModalGovernmentOpened ] = React.useState(false);\n\n    if (isModalGovernmentOpened) {\n        return (<MortgageGovernmentDisclaimerModal\n            isMobile={isMobile}\n            onSuccess={() => setIsModalGovernmentOpened(false)}\n            onClose={() => setIsModalGovernmentOpened(false)}\n        />);\n    }\n\n    return (<Modal\n        opened\n        onClose={onClose}\n        mobile={isMobile}\n        swipeToClose={! isMobile}\n    >\n        {isFormSended ? (\n            <Mortgage2SuccessContent\n                title='Заявка принята'\n                isMobile={isMobile}\n            />\n        ) : (<>\n            {isMobile ? (\n                <Modal.Header>Заявка на&nbsp;ипотеку</Modal.Header>\n            ) : (\n                <Modal.Title>{title}</Modal.Title>\n            )}\n            <Modal.Content scrollable={isMobile}>\n                <MortgageFieldsBuilder\n                    isMobile={isMobile}\n                    prefixNodes={<>\n                        {isMobile && (\n                            <Typography variant='h3'>{title}</Typography>\n                        )}\n                        {subtitle && (\n                            <Typography>{subtitle}</Typography>\n                        )}\n                    </>}\n                    gridFields={<>\n                        {renderCustomFirstGrid ?? (\n                            <MortgageField\n                                titleProps={{ accent: true, variant: 'h3' }}\n                                title={`от ${formatLocaleNumber(minimalMortgageRate) || (isNewBuilding ? defaultMortgageRateNbFormatted : defaultMortgageRateSecondFormatted)}%`}\n                                children={(\n                                    // not important all conditions government mortgage\n                                    governmentMortgage.isPreferentialNbCondition ?\n                                        <MortgageGovernmentDisclaimer\n                                            isAccent\n                                            isImportant\n                                            splitOnRows\n                                            isMobile={isMobile}\n                                            descriptionText={<><Typography tag='span' color='secondary'>по&nbsp;</Typography>льготным программам</>}\n                                            mainText='минимальная ставка'\n                                            onClick={() => setIsModalGovernmentOpened(true)}\n                                        /> :\n                                        <>ставка по&nbsp;ипотеке <br />на&nbsp;вторичку</>\n                                )}\n                            />\n                        )}\n                        <MortgageField\n                            titleProps={{ resetFont: true }}\n                            title={<Image\n                                height={52}\n                                loading='lazy'\n                                alt='логотипы банков'\n                                url={`${staticPath}${bankLogos}`}\n                            />}\n                            children='более 20&nbsp;банков на&nbsp;выбор'\n                        />\n                        {prices ? (<>\n                            <MortgageField\n                                title={prices.propertyCostFormatted}\n                                children='стоимость квартиры'\n                            />\n                            <MortgageField\n                                title={prices.ownAmountFormatted}\n                                children='первоначальный взнос'\n                            />\n                        </>) : null}\n                    </>}\n                    contactFields={<>\n                        <Input\n                            dataTest='mortgage-set-name'\n                            label='Как вас зовут'\n                            placeholder='Имя'\n                            size='l'\n                            onBlur={setNameTouched}\n                            onKeyPress={sendQueryOnEnter}\n                            error={nameInputValid === false}\n                            onChange={setName}\n                            value={name}\n                            disabled={isFormSyncing}\n                        />\n                        <PhoneInput\n                            dataTest='mortgage-set-phone'\n                            label='Телефон'\n                            size='l'\n                            inputMode='numeric'\n                            onBlur={setPhoneTouched}\n                            onKeyPress={sendQueryOnEnter}\n                            error={phoneInputValid === false}\n                            onChange={setPhone}\n                            value={phone || undefined}\n                            disabled={isFormSyncing}\n                        />\n                    </>}\n                    actions={\n                        <Button\n                            fullWidth\n                            size={isMobile ? 'm' : 'l'}\n                            disabled={isFormSyncing || loading}\n                            dataTest='mortgage-send-query'\n                            variant='accent'\n                            onClick={sendQuery}\n                        >\n                            Подать заявку\n                        </Button>\n                    }\n                />\n            </Modal.Content>\n        </>)}\n    </Modal>);\n}\n","import './MortgageStupidBanner.css';\n\nimport React from 'react';\n\nimport { useUserDetailsLoader } from '@search/auth/src/userDetails/userDetails';\nimport { ApplicationIdEnum } from '@search/graphql-typings/src';\n\nimport { getRealtyObjectTypeGql, getSubjectAppName, Mortgage2ContactsFormSendProps, normalizeCallbackUrl, useMortgage2ContactsFormSend } from '../mortgage2/mortgage2ContactsFormSend';\nimport { useMortgage2UserForm } from '../mortgage2/useMortgage2User';\nimport { SeoSearchUtm } from '../../../../../domain/seo/SeoSearchUtm';\nimport { useClassifiedOfferDataLayerPush } from '../../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\nimport { useGtmOnVisible } from '../../../../../domain/google/useGtmOnVisible';\n\nexport type MortgageStupidProps = {\n    gtmSendId?: string;\n    gtmShowId?: string;\n    regionId?: number;\n    mortgageRegionId?: number;\n    onClose?: (e?: React.MouseEvent | React.KeyboardEvent) => void;\n    isNewBuilding: boolean;\n    showPreferential?: boolean;\n    isPreferentialNbCondition?: boolean;\n    isMobile?: boolean;\n    applicationId?: ApplicationIdEnum;\n    isSendBuyDieAnalytics?: boolean;\n    minimalMortgageRate?: number | null;\n} & Mortgage2ContactsFormSendProps;\n\nexport const useStupidMortgage = ({\n    gtmSendId,\n    gtmShowId,\n    regionId,\n    mortgageRegionId,\n    showPreferential,\n    isMobile,\n    applicationId,\n    locationPlacement,\n    realtyType,\n    offerUrl,\n    isSendBuyDieAnalytics,\n    gtmSendData\n}: MortgageStupidProps) => {\n    const userInfoLoad = useUserDetailsLoader();\n    const userDetails = userInfoLoad({});\n\n    const {\n        isFormSended,\n        isFormSyncing,\n        setFormAllTouched,\n        setFormSended,\n        setFormIsSending,\n\n        name,\n        isNameValid,\n        isNameRequired,\n        nameInputValid,\n        setName,\n        setNameTouched,\n\n        phone,\n        isPhoneValid,\n        phoneInputValid,\n        setPhone,\n        setPhoneTouched\n    } = useMortgage2UserForm({ userDetails: userDetails.data?.userProfile.person });\n\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const mortgage2ContactsFormSend = useMortgage2ContactsFormSend();\n    const sendQuery = React.useCallback((e?: React.MouseEvent<Element> | React.KeyboardEvent<HTMLInputElement>) => {\n        e?.stopPropagation();\n        e?.preventDefault();\n\n        // RS-3869 remove - ! isMobile &&\n        if (! isPhoneValid || (isNameRequired && ! isNameValid)) {\n            setFormAllTouched();\n            return;\n        }\n\n        setFormIsSending();\n\n        const utm = SeoSearchUtm.get();\n\n        mortgage2ContactsFormSend({\n            realtyType: getRealtyObjectTypeGql(realtyType),\n            name,\n            utm: utm ? { list: utm } : undefined,\n            phone,\n            regionId: mortgageRegionId ?? regionId,\n            applicationId,\n            locationPlacement,\n            link: normalizeCallbackUrl(offerUrl),\n            subject: `Заявка на ипотеку с${showPreferential ? ' гос. поддержкой с' : ''} “${\n                getSubjectAppName(applicationId)}”`,\n        })\n            .then(() => {\n                setFormSended();\n                gtmSendId && dataLayerPush({ event: gtmSendId });\n                gtmSendData && dataLayerPush(gtmSendData);\n                if (applicationId === ApplicationIdEnum.ClassifiedDesktop || applicationId === ApplicationIdEnum.ClassifiedTouch) {\n                    dataLayerPush({ event: 'up_ib_send_form' });\n                }\n                if (isSendBuyDieAnalytics) {\n                    dataLayerPush({\n                        event: 'up_action',\n                        theme: 'ipoteka',\n                        page_type: 'card',\n                        type: 'buy_or_save_req'\n                    });\n                }\n            }).catch(error => {\n                // eslint-disable-next-line no-console\n                console.error(error);\n                setFormSended(error);\n            });\n    }, [\n        showPreferential,\n        isPhoneValid,\n        isNameValid,\n        isNameRequired,\n        setFormIsSending,\n        realtyType,\n        name,\n        phone,\n        mortgageRegionId,\n        regionId,\n        applicationId,\n        locationPlacement,\n        offerUrl,\n        setFormAllTouched,\n        setFormSended,\n        gtmSendId,\n        dataLayerPush,\n        isMobile,\n        isSendBuyDieAnalytics\n    ]);\n    const sendQueryOnEnter = React.useCallback((e: React.KeyboardEvent<HTMLInputElement>) => {\n        if (e.key !== 'Enter') {\n            return;\n        }\n\n        sendQuery(e);\n    }, [ sendQuery ]);\n\n    const onVisible = React.useCallback(() => {\n        if (! gtmShowId) return;\n        dataLayerPush({ event: gtmShowId });\n    }, [ gtmShowId, dataLayerPush ]);\n\n    const containerRef = React.useRef<HTMLDivElement>(null);\n\n    useGtmOnVisible({ containerRef, onVisible });\n\n    return {\n        containerRef,\n        sendQueryOnEnter,\n        sendQuery,\n\n        isFormSended,\n        isFormSyncing,\n        nameInputValid,\n        setName,\n        setNameTouched,\n        phoneInputValid,\n        setPhone,\n        setPhoneTouched,\n        name,\n        phone,\n        loading: userDetails.loading\n    };\n};\n","import { useMemo } from 'react';\n\ntype UseGovernmentMortgage = {\n    regionId?: number;\n    propertyCost?: number;\n    isPreferentialNbCondition?: boolean;\n    ownAmount?: number;\n}\n\nexport const governmentMinPercent = 15;\nexport type useGovernmentMortgageType = ReturnType<typeof getGovernmentMortgage>;\n\nexport function getGovernmentMortgage({\n    regionId,\n    propertyCost,\n    isPreferentialNbCondition,\n    ownAmount,\n}: UseGovernmentMortgage) {\n    let governmentMaxDebt = 6e6;\n\n    // backoffice regionId: is msk, spb, msk obl, len obl\n    if ((regionId && [ 3, 1, 4, 2 ].includes(regionId))) {\n        governmentMaxDebt = 12e6;\n    }\n\n    if (! propertyCost || ! ownAmount) {\n        return {\n            isPreferentialNbCondition,\n            governmentMaxDebt,\n            isGovernmentDebtExceeds: true,\n            isGovernmentPercentPoor: true,\n            // when offer base - absent (example, banners in SERP), focus on isPreferentialNbCondition(isNewBuilding)\n            showPreferential: isPreferentialNbCondition,\n        };\n    }\n\n    const debt = propertyCost - ownAmount;\n    const percent = propertyCost ? Math.floor(100 * ownAmount / propertyCost) : 0;\n    const isGovernmentDebtExceeds = debt >= governmentMaxDebt;\n    const isGovernmentPercentPoor = percent < governmentMinPercent;\n    const showPreferential = Boolean(isPreferentialNbCondition && ! isGovernmentDebtExceeds && ! isGovernmentPercentPoor);\n\n    return {\n        showPreferential,\n        isPreferentialNbCondition,\n        isGovernmentDebtExceeds,\n        isGovernmentPercentPoor,\n        governmentMaxDebt\n    };\n}\n\nexport function useGovernmentMortgage({\n    regionId,\n    propertyCost,\n    isPreferentialNbCondition,\n    ownAmount,\n}: UseGovernmentMortgage) {\n    return useMemo(() => getGovernmentMortgage({\n        regionId,\n        propertyCost,\n        isPreferentialNbCondition,\n        ownAmount,\n    }), [\n        regionId,\n        propertyCost,\n        isPreferentialNbCondition,\n        ownAmount\n    ]);\n}\n","import { MortgagePurpose } from '@search/graphql-typings';\n\nimport { formatLocaleNumber, formatNumber } from '@search/helpers/src/formatNumber';\n\nimport { useM2AuthContext } from '@search/auth/src/M2AuthProvider';\n\nimport { calculateOwnAmount } from './MinimalBanksMortgageFields/useBankMortgageForm';\nimport {\n    MinimalBanksMortgageOffersQueryVariables, useMinimalBanksMortgageOffersLoader\n} from './MinimalBanksMortgageOffers/MinimalBanksMortgageOffers';\nimport { minimalBanksMortgageUrlCreate } from './minimalBanksMortgageUrl';\nimport { mortgage2BestOfferFromOffers } from './mortgage2/useMortgage2BestOffer';\n\nexport type UseMinimalBanksMortgageStateParams = {\n    mortgageRegionId: number;\n    propertyCost: number;\n    isNewBuilding: boolean;\n    term?: number;\n    percent?: number;\n}\n\nexport function minimalBanksMortgageParamsFromOffer({\n    mortgageRegionId,\n    propertyCost,\n    isNewBuilding,\n    term = 20,\n    percent\n}: UseMinimalBanksMortgageStateParams): MinimalBanksMortgageOffersQueryVariables {\n    const ownAmount = calculateOwnAmount(propertyCost, percent);\n    const purpose = isNewBuilding ? MortgagePurpose.Primary : MortgagePurpose.Secondary;\n\n    return {\n        purpose,\n        ownAmount,\n        regionId: mortgageRegionId,\n        term,\n        propertyCost\n    };\n}\n\nexport function getMinimalBanksMortgageEconomyPercent() {\n    const economy = 0.3;\n\n    const MAX_ECONOMY = 0.3;\n\n    return {\n        economy,\n        MAX_ECONOMY,\n        economyFormatted: `${formatLocaleNumber(economy)}%`,\n        maxEconomyFormatted: `${formatLocaleNumber(MAX_ECONOMY)}%`\n    };\n}\n\nexport function useMinimalBanksMortgageEconomy(variables: Partial<\n    MinimalBanksMortgageOffersQueryVariables & { from?: string }\n>) {\n    const { auth } = useM2AuthContext();\n    const { baseUrl, fullUrl } =\n        minimalBanksMortgageUrlCreate({ isAuthenticated: auth.isAuthenticated, ...variables });\n\n    const { economyFormatted, economy } = getMinimalBanksMortgageEconomyPercent();\n\n    return {\n        formUrl: baseUrl,\n        url: fullUrl,\n        economy,\n        economyFormatted\n    };\n}\n\nexport function useMinimalBanksMortgageOverall(variables: MinimalBanksMortgageOffersQueryVariables) {\n    const minimalBanksMortgageOffersLoad = useMinimalBanksMortgageOffersLoader();\n    const data = minimalBanksMortgageOffersLoad(variables);\n    const minimalBanksMortgageOffers = data.data?.minimalBanksMortgageOffers;\n    const bestMortgageOffer = mortgage2BestOfferFromOffers(minimalBanksMortgageOffers);\n\n    const allMinimalPayment = minimalBanksMortgageOffers?.reduce((min, offer) => {\n        const value = offer?.minimalPayment ?? min;\n\n        return min > value ? value : min;\n    }, variables.propertyCost);\n\n    return {\n        ...useMinimalBanksMortgageEconomy(variables),\n        bestMortgageOffer,\n        allMinimalPayment,\n        allMinimalPaymentFormatted: allMinimalPayment ?\n            `${formatNumber(Math.round(allMinimalPayment))}\\u00A0₽/мес.` :\n            undefined,\n        isLoading: Boolean(data.loading),\n        minimalBanksMortgageOffers\n    };\n}\n","import React from 'react';\n\nexport const IconBus = ({\n    color = '#B6B9C9'\n}: {\n    color?: string;\n}) => (\n    <svg width='16' height='16' viewBox='0 0 16 16' fill={color} xmlns='http://www.w3.org/2000/svg'>\n        <path\n            fillRule='evenodd'\n            clipRule='evenodd'\n            d='M14.4305 9.23685C14.4338 9.31745 14.4366 9.39787 14.4393 9.47847L14.4988 11.3131C14.5167 11.8656 14.3374 12.4028 14 12.8335V14.5C14 14.7761 13.7761 15 13.5 15H12C11.7239 15 11.5 14.7761 11.5 14.5V13.7317H4.5V14.5C4.5 14.7761 4.27614 15 4 15H2.5C2.22386 15 2 14.7761 2 14.5V12.834C1.66271 12.4034 1.48334 11.8664 1.50122 11.314L1.56073 9.47999C1.56339 9.39863 1.56624 9.31726 1.56947 9.2359L1.84971 2.10128C1.93983 1.46932 2.47996 1 3.11686 1H12.8833C13.5202 1 14.0604 1.46932 14.1505 2.10128L14.4305 9.23685ZM2.63167 10.9097C2.63167 11.5152 3.12123 12.0061 3.72544 12.0061C4.32964 12.0061 4.81939 11.5152 4.81939 10.9097C4.81939 10.3041 4.32964 9.81364 3.72544 9.81364C3.12123 9.81364 2.63167 10.3041 2.63167 10.9097ZM11.1806 10.9097C11.1806 11.5152 11.6705 12.0061 12.2746 12.0061C12.8788 12.0061 13.3683 11.5152 13.3683 10.9097C13.3683 10.3041 12.8788 9.81364 12.2746 9.81364C11.6705 9.81364 11.1806 10.3041 11.1806 10.9097ZM3.24462 8.61528C6.26696 9.11814 9.45127 9.07774 12.7394 8.59775C13.1337 8.54021 13.4233 8.1955 13.4115 7.7963C13.3712 6.43979 13.2991 3.57755 13.2991 3.57755C13.2647 3.33175 13.0546 3.14634 12.8107 3.14634C11.4481 2.88167 4.67718 2.90225 3.18968 3.14634C2.94575 3.14634 2.73567 3.33175 2.70126 3.57774C2.70126 3.57774 2.62844 6.46599 2.58794 7.81593C2.57616 8.21018 2.8564 8.55069 3.24462 8.61528ZM7 1.5C6.72386 1.5 6.5 1.72386 6.5 2C6.5 2.27614 6.72386 2.5 7 2.5H9C9.27614 2.5 9.5 2.27614 9.5 2C9.5 1.72386 9.27614 1.5 9 1.5H7Z'\n        />\n    </svg>\n);\n","import React from 'react';\n\nexport const IconPedestrian = ({\n    color = '#B6B9C9'\n}: {\n    color?: string;\n}) => (\n    <svg width='16' height='16' viewBox='0 0 16 16' fill={color} xmlns='http://www.w3.org/2000/svg'>\n        <path\n            d='M5.76127 11.1185L6.93706 12.9845L6.03002 15.4335C5.89565 15.7834 5.55971 16 5.20697 16C5.10619 16 5.00541 15.9833 4.90463 15.95C4.45111 15.7834 4.21595 15.2836 4.38392 14.8338L5.76127 11.1185Z'\n        />\n        <path\n            d='M3.14088 6.82011L4.1151 5.40397C4.38385 5.02078 4.77018 4.7209 5.20691 4.55429C6.98739 3.87121 7.22254 3.88787 7.39051 3.88787L8.65029 3.97118C9.00302 3.98784 9.27177 4.0878 10.5987 5.75384C10.7163 5.90379 10.8843 6.00375 11.0858 6.05373L12.396 6.33696C12.8159 6.42026 13.0679 6.82011 12.9839 7.23662C12.8999 7.65313 12.48 7.90304 12.0769 7.81973L10.7667 7.53651C10.2292 7.41988 9.75889 7.12 9.40615 6.70349C9.35576 6.63684 9.30537 6.5702 9.25498 6.52022L8.0456 10.0189L10.9683 14.6672C11.2202 15.0837 11.1026 15.6168 10.6827 15.8667C10.5315 15.95 10.3804 16 10.2124 16C9.91006 16 9.62451 15.8501 9.47334 15.5835L5.84519 9.80232C5.47566 9.21921 5.37488 8.48615 5.55964 7.81973L6.14754 5.82048C6.02996 5.87046 5.89558 5.92045 5.74441 5.97043C5.59324 6.03707 5.45886 6.13703 5.35808 6.27031L4.38385 7.68645C4.23268 7.90304 3.99752 8.01966 3.76237 8.01966C3.61119 8.01966 3.46002 7.96968 3.32564 7.88637C2.9897 7.63647 2.88892 7.16998 3.14088 6.82011Z'\n        />\n        <path\n            d='M8.10214 3.48958C7.13352 3.38501 6.43377 2.5214 6.5392 1.56066C6.64462 0.599919 7.51531 -0.094146 8.48392 0.0104232C9.45254 0.114992 10.1523 0.978597 10.0469 1.93934C9.94144 2.90008 9.07076 3.59415 8.10214 3.48958Z'\n        />\n    </svg>\n);\n","export function getWindowSize() {\n    return {\n        top: 0,\n        right: window.innerWidth,\n        bottom: window.innerHeight,\n        left: 0,\n        width: window.innerWidth,\n        height: window.innerHeight,\n    };\n}\n\nexport function getElementSize($element: HTMLElement) {\n    const { top, right, bottom, left } = $element.getBoundingClientRect();\n\n    return {\n        top,\n        right,\n        bottom,\n        left,\n        width: right - left,\n        height: bottom - top,\n    };\n}\n","import React, { ReactElement, RefObject } from 'react';\nimport QRCode from 'react-qr-code';\nimport { Dropdown, Button, ButtonProps, useDropdownHover } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport CustomTypography from '@search/vtbeco-frontend-core/domain/newbuilding/components/common/CustomTypography';\n\nimport './styles.css';\n\ntype QRPhoneButtonPropsType = ButtonProps & {\n    qrCodeValue?: string;\n    className?: string;\n    qrFgColor?: string;\n    renderButton?: ReactElement | null;\n    href?: string;\n    buttonVariant?: 'primary' | 'secondary';\n    dropdownContainer?: RefObject<HTMLElement>;\n}\n\nconst cn = classname.bind(null, 'QRCodePhoneButton');\nconst DROPDOWN_OPENING_DELAY = 250;\n\nconst QRCodeTrigger: React.FC<{ qrCodeValue: string; qrFgColor?: string }> = ({ qrFgColor, qrCodeValue }) => {\n    const { control } = useDropdownHover({ open: DROPDOWN_OPENING_DELAY });\n\n    return (\n        <div\n            ref={control as RefObject<HTMLDivElement>}\n            className={cn('trigger')}\n        >\n            <QRCode\n                value={qrCodeValue}\n                fgColor={qrFgColor}\n                size={52}\n            />\n        </div>\n    );\n};\n\nexport const QRCodePhoneButton: React.FunctionComponent<QRPhoneButtonPropsType> = ({\n    qrCodeValue,\n    className,\n    qrFgColor = '#221F2E',\n    children,\n    href,\n    renderButton,\n    fullWidth = true,\n    buttonVariant,\n    dropdownContainer,\n    ...buttonProps\n}) => {\n    return (\n        <div className={cn(null, undefined, className)}>\n            {renderButton ?? (\n                <a className={cn('link', { fullWidth })} href={href}>\n                    <Button\n                        variant={buttonVariant}\n                        fullWidth={fullWidth}\n                        {...buttonProps}\n                    >\n                        {children}\n                    </Button>\n                </a>\n            )}\n            {\n                qrCodeValue ? (\n                    <Dropdown>\n                        <QRCodeTrigger\n                            qrCodeValue={qrCodeValue}\n                            qrFgColor={qrFgColor}\n                        />\n                        <Dropdown.Content container={dropdownContainer}>\n                            <div className={cn('qrCodePopup')}>\n                                <CustomTypography\n                                    level='secondary-alone'\n                                    className={cn('qrCodePopupText')}\n                                >\n                                    Наведите камеру телефона на код, чтобы быстро набрать номер\n                                </CustomTypography>\n                                <QRCode\n                                    value={qrCodeValue}\n                                    fgColor={qrFgColor}\n                                    size={240}\n                                />\n                            </div>\n                        </Dropdown.Content>\n                    </Dropdown>\n                ) : null\n            }\n        </div>\n    );\n};\n","import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport throttle from 'lodash/throttle';\n\nimport { Button } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\n\nimport { useSwiper } from '@search/vtbeco-frontend-core/view/common/hooks/useSwiper';\n\nimport './styles.css';\n\ntype Direction = 'left' | 'right';\n\nconst cn = classname.bind(null, 'Slider');\nconst SCREEN_XL = 1420;\n\nconst Slider = ({\n    children,\n    totalItems,\n    onIndexChange,\n    contentClassName,\n    navClassName,\n    isNavHidden = false,\n    onSetMaxItems\n}: {\n    children: React.ReactNode[];\n    totalItems?: number;\n    onIndexChange?: (pageNumber: number) => void;\n    contentClassName?: string;\n    navClassName?: string;\n    isNavHidden?: boolean;\n    onSetMaxItems?: (maxItems: number) => void;\n}) => {\n    const [ index, setIndex ] = useState<number>(0);\n    const [ maxItems, setMaxItems ] = useState<number>(3);\n\n    const slidesTotal = useMemo(() => totalItems ?? children.length, [ children, totalItems ]);\n    const maxIndex = useMemo(() => slidesTotal - maxItems, [ slidesTotal, maxItems ]);\n\n    const handleSetMaxItems = useCallback((value: number) => {\n        setMaxItems(value);\n        onSetMaxItems?.(value);\n    }, [ onSetMaxItems ]);\n\n    const handleResize = useCallback(() => {\n        const { clientWidth } = document.documentElement;\n\n        if (clientWidth >= SCREEN_XL && maxItems !== 4) {\n            handleSetMaxItems(4);\n        } else if (clientWidth < SCREEN_XL && maxItems !== 3) {\n            handleSetMaxItems(3);\n        }\n\n        if (index > maxIndex) {\n            setIndex(maxIndex);\n        }\n    }, [ index, maxIndex, maxItems, handleSetMaxItems ]);\n\n    useEffect(() => {\n        const throttledHandleResize = throttle(handleResize, 200);\n\n        throttledHandleResize();\n\n        window.addEventListener('resize', throttledHandleResize);\n\n        return () => {\n            window.removeEventListener('resize', throttledHandleResize);\n        };\n    }, [ handleResize ]);\n\n    const handleShift = useCallback((direction: Direction) => {\n        const newIndex = Math.max(\n            Math.min(\n                index + (direction === 'left' ? -maxItems : maxItems),\n                maxIndex\n            ),\n            0\n        );\n\n        setIndex(newIndex);\n        onIndexChange && onIndexChange(newIndex);\n    }, [ index, maxIndex, maxItems, onIndexChange ]);\n\n    const onSwipeLeft = useCallback(() => handleShift('right'), [ handleShift ]);\n    const onSwipeRight = useCallback(() => handleShift('left'), [ handleShift ]);\n\n    const {\n        handleTouchEnd,\n        handleTouchMove,\n        handleTouchStart\n    } = useSwiper({\n        onSwipeLeft,\n        onSwipeRight\n    });\n\n    return (\n        <div className={cn()}>\n            {\n                slidesTotal > maxItems && ! isNavHidden ? (\n                    <div className={cn('nav', undefined, navClassName)}>\n                        {\n                            [\n                                'left' as Direction,\n                                'right' as Direction\n                            ].map(direction => (\n                                <div key={direction}>\n                                    <Button\n                                        size='s'\n                                        variant='secondary'\n                                        icon={`chevron-${direction}`}\n                                        disabled={\n                                            direction === 'left' && index === 0 ||\n                                            direction === 'right' && index === maxIndex\n                                        }\n                                        onClick={() => handleShift(direction)}\n                                    />\n                                </div>\n                            ))\n                        }\n                    </div>\n                ) : null\n            }\n            <div\n                className={cn('contentWrapper')}\n                onTouchEnd={handleTouchEnd}\n                onTouchMove={handleTouchMove}\n                onTouchStart={handleTouchStart}\n            >\n                <div\n                    className={cn('content', undefined, contentClassName)}\n                    style={{\n                        transform: `translateX(-${index * 100 / maxItems}%)`\n                    }}\n                >\n                    {children}\n                </div>\n            </div>\n        </div>\n    );\n};\n\nexport default Slider;\n","import React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Select, Dropdown, useMultipleSelect } from '@vtblife/uikit';\nimport { DropdownContentProps, DropdownControlProps } from '@vtblife/uikit/dist/components/dropdown/types';\n\ntype UikitSlimMultiSelectProps<T extends string | number> =\n    Pick<DropdownContentProps, 'height' | 'adaptiveHeight' | 'adaptivePlacement' | 'dataTest' | 'placement'> &\n    Pick<DropdownControlProps, 'size' | 'disabled'> &\n    {\n        onChange: (value: T[]) => void;\n        options: { value: T; label: string; disabled?: boolean }[];\n        value?: T[];\n        placeholder: string;\n\n        forcePlaceholder?: boolean;\n    }\n\nexport const SlimMultiSelect = <T extends number | string>({\n    value,\n    onChange,\n    options,\n    placeholder,\n    forcePlaceholder,\n\n    disabled,\n    size,\n\n    height,\n    adaptiveHeight,\n    adaptivePlacement,\n    placement = 'local',\n    dataTest,\n}: UikitSlimMultiSelectProps<T>) => {\n    const { is, handleChange, selectedText } = useMultipleSelect<T>(\n        (v: T[]) => onChange(v),\n        {\n            texts: options.map(el => ({ ...el, text: el.label })),\n            selected: value\n        }\n    );\n    const title = (forcePlaceholder || ! selectedText.length) ? placeholder : capitalize(selectedText);\n\n    return (<div>\n        <Select\n            onChange={handleChange}\n            dataTest={dataTest}\n            mode='multiple'\n        >\n            <Dropdown.Control\n                disabled={disabled}\n                arrow\n                size={size}\n                dataTest={dataTest && (dataTest + '-trigger')}\n            >{title}</Dropdown.Control>\n            <Select.Content\n                height={height}\n                adaptiveHeight={adaptiveHeight}\n                adaptivePlacement={adaptivePlacement}\n                placement={placement}\n            >\n                {options.map((item, key) => (\n                    <Select.Option\n                        value={item.value}\n                        key={key}\n                        selected={is(item.value)}\n                        disabled={item.disabled}\n                    >\n                        {item.label}\n                    </Select.Option>\n                ))}\n            </Select.Content>\n        </Select>\n    </div>);\n};\n","import React from 'react';\nimport { Select, Dropdown, useSelect } from '@vtblife/uikit';\nimport { DropdownContentProps, DropdownControlProps } from '@vtblife/uikit/dist/components/dropdown/types';\n\ntype SlimSelectProps<T extends string | number> =\n    Pick<DropdownContentProps, 'height' | 'adaptiveHeight' | 'adaptivePlacement' | 'dataTest' | 'placement'> &\n    Pick<DropdownControlProps, 'size' | 'disabled'> &\n    {\n        onChange: (value: T) => void;\n        options: { value: T; label: string; disabled?: boolean }[];\n        value?: T;\n        placeholder?: string;\n\n        forcePlaceholder?: boolean;\n    }\n\nexport const SlimSelect = <T extends number | string>({\n    value,\n    onChange,\n    options,\n    placeholder,\n    forcePlaceholder,\n\n    disabled,\n    size,\n\n    height,\n    adaptiveHeight,\n    adaptivePlacement,\n    placement = 'local',\n    dataTest,\n}: SlimSelectProps<T>) => {\n    const { is, handleChange, selectedText } = useSelect<T>(\n        (v: T) => onChange(v),\n        {\n            texts: options.map(el => ({ ...el, text: el.label })),\n            selected: value\n        }\n    );\n    const title = forcePlaceholder || ! selectedText.length ? placeholder : selectedText;\n\n    return (<div>\n        <Select\n            onChange={handleChange}\n            dataTest={dataTest}\n        >\n            <Dropdown.Control\n                disabled={disabled}\n                arrow\n                size={size}\n                dataTest={dataTest && (dataTest + '-trigger')}\n            >{title}</Dropdown.Control>\n            <Select.Content\n                height={height}\n                adaptiveHeight={adaptiveHeight}\n                adaptivePlacement={adaptivePlacement}\n                placement={placement}\n            >\n                {options.map((item, key) => (\n                    <Select.Option\n                        value={item.value}\n                        key={key}\n                        selected={is(item.value)}\n                        disabled={item.disabled}\n                    >\n                        {item.label}\n                    </Select.Option>\n                ))}\n            </Select.Content>\n        </Select>\n    </div>);\n};\n","import React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { TypographyProps } from '@vtblife/uikit/dist/components/typography/types';\n\nimport classname from '@search/classname/src';\n\nimport { MetroStationBase } from '../../../../../domain/geo/MetroStation';\n\nimport './styles.css';\n\nconst cnSubwayStationMark = classname.bind(null, 'SubwayStationMark');\n\nexport const SubwayStationMark: React.FunctionComponent<{\n    className?: string;\n    colors: readonly string[];\n}> = ({ colors, className }) => {\n    return (\n        <span className={cnSubwayStationMark(null, {}, className)}>\n            {\n                colors.slice(0).reverse().map((color, index) => (\n                    <span\n                        key={index}\n                        style={{ backgroundColor: color }}\n                        className={cnSubwayStationMark('line', { type: 'mark' })}\n                    />\n                ))\n            }\n        </span>\n    );\n};\n\nconst cnSubwayStation = classname.bind(null, 'SubwayStation');\n\nexport const SubwayStation: React.FunctionComponent<{\n    textVariant?: TypographyProps['variant'];\n    textColor?: TypographyProps['color'];\n    textBold?: TypographyProps['bold'];\n    className?: string;\n    station: MetroStationBase;\n    url?: string;\n    noClickable?: boolean;\n}> = React.memo(({ noClickable, station, className, textVariant, textColor, textBold, url, children }) => {\n    return (\n        <span className={cnSubwayStation(null, undefined, className)}>\n            <SubwayStationMark\n                colors={station.allRoutesColorsList}\n            />\n            <Typography\n                tag='span'\n                variant={textVariant}\n                color='primary'\n                className={cnSubwayStation('title')}\n                bold={textBold}\n            >\n                {\n                    (url !== undefined) ? (\n                        <a\n                            href={url}\n                            onClick={e => {\n                                if (noClickable) e.preventDefault();\n                            }}\n                            data-noclick={noClickable ? '1' : undefined}\n                            data-test='subway-link'\n                            className={cnSubwayStation('link', { noClickable })}\n                        >\n                            { station.title }\n                        </a>\n                    ) : (<>{ station.title }</>)\n                }\n            </Typography>\n            {children}\n        </span>\n    );\n});\n","import { ReactText, useCallback, useState } from 'react';\n\nexport interface IWorkingHour {\n    value: number;\n    label: string;\n    disabled: boolean;\n}\n\nfunction format(hour?: ReactText) {\n    if (hour === undefined) return;\n    return `${hour.toString().padStart(2, '0')}:00`;\n}\n\nfunction getSelectValues(\n    startHour: number,\n    endHour: number,\n    workingHoursRange: {\n        start?: number;\n        end?: number;\n    },\n    options?: {\n        filterHours?: { start: string; end: string };\n        withoutOffset?: boolean;\n    }\n) {\n    const startHourValues: IWorkingHour[] = [];\n    const endHourValues: IWorkingHour[] = [];\n\n    for (let hour = startHour; hour <= endHour; hour++) {\n        const label = format(hour) ?? '';\n\n        if (\n            (options?.withoutOffset || hour !== endHour) &&\n            label.includes(options?.filterHours?.start ?? '')\n        ) {\n            startHourValues.push({\n                label,\n                value: hour,\n                disabled: workingHoursRange.end !== undefined && hour >= workingHoursRange.end\n            });\n        }\n        if (\n            (options?.withoutOffset || hour !== startHour) &&\n            label.includes(options?.filterHours?.end ?? '')\n        ) {\n            endHourValues.push({\n                label,\n                value: hour,\n                disabled: workingHoursRange.start !== undefined && hour <= workingHoursRange.start\n            });\n        }\n    }\n\n    return { startHourValues, endHourValues };\n}\n\ntype TUseWorkingHours = {\n    startHour?: number;\n    endHour?: number;\n    withoutStartValues?: boolean;\n    filterHours?: { start: string; end: string };\n    withoutOffset?: boolean;\n}\n\nexport function useWorkingHours({\n    startHour = 9,\n    endHour = 21,\n    withoutStartValues,\n    filterHours,\n    withoutOffset\n}: TUseWorkingHours = {}) {\n    const [ workingHoursRange, setWorkingHouseRange ] = useState({\n        start: withoutStartValues ? undefined : startHour,\n        end: withoutStartValues ? undefined : endHour\n    });\n    const { startHourValues, endHourValues } = getSelectValues(\n        startHour,\n        endHour,\n        workingHoursRange,\n        {\n            filterHours,\n            withoutOffset\n        }\n    );\n\n    const setStartHoursRange = useCallback((startValue: ReactText, checked: boolean, e?: any) => {\n        e?.preventDefault();\n        setWorkingHouseRange(state => ({ ...state, start: typeof startValue === 'number' ? startValue : undefined }));\n    }, [ startHourValues ]);\n\n    const setEndHoursRange = useCallback((endValue: ReactText, checked: boolean, e?: any) => {\n        e?.preventDefault();\n        setWorkingHouseRange(state => ({ ...state, end: typeof endValue === 'number' ? endValue : undefined }));\n    }, [ endHourValues ]);\n\n    return {\n        rawWorkingHoursRange: {\n            start: workingHoursRange.start,\n            end: workingHoursRange.end\n        },\n        workingHoursRange: {\n            start: format(workingHoursRange.start),\n            end: format(workingHoursRange.end)\n        },\n        setStartHoursRange,\n        setEndHoursRange,\n        startHourValues,\n        endHourValues\n    };\n}\n","import React from 'react';\nimport {\n    YMapControlClose,\n    YMapControlGeoLocation,\n    YMapControlGroup,\n    YMapControlRuler,\n    YMapControlTraffic,\n    YMapControlZoom\n} from '@search/ymap/src/Control';\nimport { YMapPane } from '@search/ymap/src/Pane';\nimport { YMapPlacemarkPoint } from '@search/ymap/src/Placemark';\nimport { YMapBounds } from '@search/ymap/src/bounds';\n\nexport function VTBCoreYMapDesktop({\n    onClose,\n    center,\n    children,\n    noZoom,\n    bounds,\n    noPlacemark,\n    zoom = 14,\n    setBounds,\n    isScrollZoomEnabled,\n    useChangedMargin,\n    height,\n    width,\n    small\n}: {\n    bounds?: YMapBounds;\n    zoom?: number;\n    noZoom?: boolean;\n    noPlacemark?: boolean;\n    children?: React.ReactNode | React.ReactNode[];\n    center?: readonly [number, number] | undefined;\n    onClose?: () => void;\n    setBounds?: (bounds: YMapBounds) => void;\n    isScrollZoomEnabled?: boolean;\n    useChangedMargin?: boolean;\n    height?: number;\n    width?: number;\n    small?: boolean;\n}) {\n    return (\n        <YMapPane\n            zoom={zoom}\n            center={center}\n            bounds={bounds}\n            noZoom={noZoom}\n            setBounds={setBounds}\n            width={width}\n            height={height}\n            isScrollZoomEnabled={isScrollZoomEnabled}\n        >\n            {noPlacemark || (\n                <YMapPlacemarkPoint point={center} />\n            )}\n            <YMapControlGroup\n                hAlign='right'\n                vAlign='middle'\n                layout='vertical'\n                size={useChangedMargin ? 'mChangedMargin' : 'm'}\n            >\n                <YMapControlZoom />\n                {! small && (\n                    <>\n                        <YMapControlGeoLocation title='Моё местоположение' />\n                        <YMapControlTraffic title='Пробки' />\n                        <YMapControlRuler title='Линейка' />\n                    </>\n                )}\n            </YMapControlGroup>\n            {small && (\n                <YMapControlGroup\n                    hAlign='left'\n                    vAlign='top'\n                    layout='vertical'\n                    size={useChangedMargin ? 'mChangedMargin' : 'm'}\n                >\n                    <YMapControlTraffic title='Пробки' />\n                    <YMapControlRuler title='Линейка' />\n                    <YMapControlGeoLocation title='Моё местоположение' />\n                </YMapControlGroup>\n            )}\n            <YMapControlGroup\n                hAlign='right'\n                vAlign='top'\n                layout='horizontal'\n            >\n                {\n                    onClose ? (\n                        <YMapControlClose onClose={onClose} />\n                    ) : null\n                }\n            </YMapControlGroup>\n            {children}\n        </YMapPane>\n    );\n}\n","import React from 'react';\nimport { YMapApiProvider } from '@search/ymap/src/ApiProvider';\n\nconst VTBCoreDefaultStaticApiKey = '3e563b0a-500b-4069-8350-d27bd93ab22d';\n\nconst VTBCoreDefaultApiKey = '9d69994f-afe0-41ae-b5c2-f0997212d77e';\n\nexport function VTBCoreYMapProvider({\n    children,\n    apiKey = VTBCoreDefaultApiKey,\n    staticApiKey = VTBCoreDefaultStaticApiKey\n}: {\n    apiKey?: string;\n    staticApiKey?: string;\n    children: React.ReactChild;\n}) {\n    const staticApiUrl = staticApiKey ? 'https://enterprise.static-maps.yandex.ru/1.x' : undefined;\n\n    return (\n        <YMapApiProvider apiKey={apiKey} staticApiKey={staticApiKey} staticApiUrl={staticApiUrl}>\n            {children}\n        </YMapApiProvider>\n    );\n}\n","import { PoiKindEnum } from '@search/graphql-typings';\n\nexport type PoiImageName = 'SchoolPoiImg' | 'UniversityPoiImg' | 'KindergartenPoiImg' | 'HospitalPoiImg' |\n'PharmacyPoiImg' | 'ShopPoiImg' | 'FoodServicePoiImg' | 'SportCentrePoiImg' | '';\n\nexport const PoiKindToIconName: Record<PoiKindEnum, string> = {\n    [PoiKindEnum.Unknown]: '',\n    [PoiKindEnum.School]: 'SchoolPoi',\n    [PoiKindEnum.University]: 'UniversityPoi',\n    [PoiKindEnum.Kindergarten]: 'KindergartenPoi',\n    [PoiKindEnum.Hospital]: 'HospitalPoi',\n    [PoiKindEnum.Pharmacy]: 'PharmacyPoi',\n    [PoiKindEnum.Shop]: 'ShopPoi',\n    [PoiKindEnum.FoodService]: 'FoodServicePoi',\n    [PoiKindEnum.SportCentre]: 'SportCentrePoi'\n};\n\nexport const PoiKindToImageName: Record<PoiKindEnum, PoiImageName> = {\n    [PoiKindEnum.Unknown]: '',\n    [PoiKindEnum.School]: 'SchoolPoiImg',\n    [PoiKindEnum.University]: 'UniversityPoiImg',\n    [PoiKindEnum.Kindergarten]: 'KindergartenPoiImg',\n    [PoiKindEnum.Hospital]: 'HospitalPoiImg',\n    [PoiKindEnum.Pharmacy]: 'PharmacyPoiImg',\n    [PoiKindEnum.Shop]: 'ShopPoiImg',\n    [PoiKindEnum.FoodService]: 'FoodServicePoiImg',\n    [PoiKindEnum.SportCentre]: 'SportCentrePoiImg'\n};\n","import './styles.css';\n\nimport React, { FC, PropsWithChildren } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { NewBuildingPoi } from '@search/graphql-typings';\nimport { YMapPlacemarkPOI, YMapPlacemarkPriority } from '@search/ymap/src/Placemark';\n\nimport { CoreSvgSpriteIcon } from '../../CoreSvgSpriteIcon/CoreSvgSpriteIcon';\nimport { PoiKindToIconName, PoiKindToImageName, PoiImageName } from './dict/poi';\n\nconst cn = classname.bind(null, 'CorePoiHint');\n\nconst PoiHintWrapper = ({ children }: PropsWithChildren<{}>) => (\n    <div className={cn()}>\n        {children}\n    </div>\n);\n\nexport const CorePoiHint: FC<\n    Omit<NewBuildingPoi, 'latitude' | 'longitude'>\n> = ({\n    name,\n    kind,\n    description,\n    address,\n    specialization,\n    noctidial,\n    category\n}) => {\n    const iconName = PoiKindToImageName[kind];\n\n    if (! iconName) {\n        return null;\n    }\n\n    return (<>\n        <div className={cn('icon')}>\n            <CoreSvgSpriteIcon<PoiImageName>\n                height={52}\n                width={52}\n                name={iconName}\n            />\n        </div>\n        {\n            name && (\n                <Typography\n                    bold\n                    variant='secondary-alone'\n                    className={cn('name')}\n                >\n                    {name}\n                </Typography>\n            )\n        }\n        {\n            category && category !== name && (\n                <Typography\n                    variant='small-alone'\n                    color='secondary'\n                    className={cn('category')}\n                >\n                    {category}\n                </Typography>\n            )\n        }\n        {\n            address || noctidial || specialization || description ? (\n                <div className={cn('separator')} />\n            ) : null\n        }\n        {\n            address && (\n                <Typography\n                    variant='small-alone'\n                    className={cn('address')}\n                >\n                    {address}\n                </Typography>\n            )\n        }\n        {\n            noctidial && (\n                <Typography\n                    variant='small-alone'\n                    className={cn('noctidial')}\n                >\n                    Круглосуточно\n                </Typography>\n            )\n        }\n        {\n            specialization && (\n                <Typography\n                    variant='small-alone'\n                    color='secondary'\n                    className={cn('specialization')}\n                >\n                    {specialization}\n                </Typography>\n            )\n        }\n        {\n            description && (\n                <Typography\n                    variant='small-alone'\n                    color='secondary'\n                    className={cn('description')}\n                >\n                    {description}\n                </Typography>\n            )\n        }\n    </>);\n};\n\nexport const YMapPOI: FC<NewBuildingPoi & {\n    onClick?: () => void;\n    isSelected?: boolean;\n    layerPriority?: YMapPlacemarkPriority;\n}> = ({\n    latitude,\n    longitude,\n    name,\n    kind,\n    description,\n    address,\n    specialization,\n    noctidial,\n    category,\n    onClick,\n    isSelected,\n    layerPriority\n}) => {\n    const iconName = PoiKindToIconName[kind];\n\n    const hint = (\n        <PoiHintWrapper>\n            <CorePoiHint\n                name={name}\n                kind={kind}\n                description={description}\n                address={address}\n                specialization={specialization}\n                noctidial={noctidial}\n                category={category}\n            />\n        </PoiHintWrapper>\n    );\n\n    return (\n        iconName ? (\n            <YMapPlacemarkPOI\n                coordinates={{ y: latitude, x: longitude }}\n                iconName={iconName}\n                hintLayout={renderToStaticMarkup(hint)}\n                onClick={onClick}\n                isSelected={isSelected}\n                layerPriority={layerPriority}\n            />\n        ) : null\n    );\n};\n","import React from 'react';\n\nexport const IconClose: React.FC = ({ width, height }: { width?: number; height?: number }) => (\n    <svg\n        width={width ?? 32}\n        height={height ?? 32}\n        viewBox='0 0 18 18'\n    >\n        <path\n            stroke='currentColor'\n            strokeOpacity='0.92'\n            strokeWidth='1.5'\n            d='M1 1.00001L17 17M17 1L1 17'\n        />\n    </svg>\n);\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport './styles.css';\n\nconst cn = classname.bind(null, 'GalleryDesktopLoading');\n\nexport const LoadingSpinner = ({ show = true, staticLoader = false }) => {\n    if (show) {\n        return null;\n    }\n\n    return (\n        <div className={cn(null, { staticLoader })}>\n            {staticLoader ? '...' : null}\n        </div>\n    );\n};\n","import React, { useState } from 'react';\nimport classname from '@search/classname/src';\nimport { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';\n\nimport './styles.css';\n\nconst urlErrorImage = 'http://fabiusmaximus.com/wp-content/uploads/2012/12/20121230-no-error.png?w=300';\n\ninterface IPicture {\n    alt: string;\n    src: string;\n    width: number;\n    height: number;\n    active: boolean;\n    isLayout?: boolean;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktopPicture');\n\nexport function PictureWrapper({\n    width,\n    height,\n    children,\n    loading,\n    active,\n    isAltView\n}: {\n    isAltView?: boolean;\n    active?: boolean;\n    loading?: boolean;\n    children?: React.ReactNode;\n    width: number;\n    height: number;\n}) {\n    return (\n        <div className={cn(null, { active: active && isAltView, alt: isAltView })} style={{ width, height }}>\n            {loading && <div className={cn('spinner')}>\n                <LoadingSpinner show={loading} staticLoader />\n            </div>}\n            <div className={cn('wrap')}>\n                {children}\n                {active && ! isAltView && <div style={{ width, height }} className={cn('active')} />}\n            </div>\n        </div>\n    );\n}\n\nexport const Picture = ({\n    alt,\n    src,\n    height,\n    active,\n    width,\n    isLayout\n}: IPicture) => {\n    const [ state, setState ] = useState({\n        loading: true,\n        error: false\n    });\n\n    const onLoad = () => {\n        setTimeout(() => {\n            setState({\n                loading: false,\n                error: false\n            });\n        }, 100);\n    };\n\n    const onError = () => {\n        setState({\n            loading: false,\n            error: true\n        });\n    };\n\n    return (\n        <PictureWrapper\n            width={width}\n            height={height}\n            loading={state.loading}\n            active={active}\n        >\n            {state.error && (\n                <img\n                    crossOrigin='anonymous'\n                    className={cn('image')}\n                    src={urlErrorImage}\n                    height={height}\n                    width={width}\n                />\n            )}\n\n            {! state.error && (<>\n                <img\n                    alt={alt}\n                    src={src}\n                    height={height}\n                    width={width}\n                    className={cn('image', { isLayout })}\n                    onLoad={onLoad}\n                    onError={onError}\n                    crossOrigin='anonymous'\n                />\n            </>)}\n\n        </PictureWrapper>\n    );\n};\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport { DirectionArrow } from '../constants';\nimport './styles.css';\n\ninterface IArrow {\n    direction: DirectionArrow;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktopArrow');\n\nexport const Arrow = ({ direction }: IArrow) => {\n    return (\n        <div className={cn(null, { direction })} data-test={`galleryArrow-${direction}`}>\n            <svg width='21' height='57' fill='none'>\n                <path\n                    fill='currentColor'\n                    fillRule='evenodd'\n                    clipRule='evenodd'\n                    /* eslint-disable-next-line max-len */\n                    d='M2.09566 0.483599C0.153183 1.53577 -0.56855 3.96342 0.483625 5.9059L12.4517 28.0008L0.483625 50.0956C-0.56855 52.0381 0.153183 54.4658 2.09566 55.5179C4.03814 56.5701 6.46579 55.8484 7.51796 53.9059L20.518 29.9059C21.1617 28.7174 21.1617 27.2841 20.518 26.0956L7.51796 2.09563C6.46579 0.153156 4.03814 -0.568577 2.09566 0.483599Z'\n                />\n            </svg>\n        </div>\n    );\n};\n","/* eslint-disable no-nested-ternary, react-hooks/exhaustive-deps */\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport { LoadingSpinner } from '../LoadingSpinner/LoadingSpinner';\nimport { SizeThumbnail, FigcaptionPosition, DirectionArrow, FigcaptionPositionColor } from '../constants';\nimport { Arrow } from '../Arrow/Arrow';\n\nimport './styles.css';\n\ninterface IHeroPicture {\n    alt: string;\n    src: string;\n    size: SizeThumbnail;\n    handleNext: () => void;\n    handlePrev: () => void;\n    renderArrow: boolean;\n    countText?: string;\n    figcaptionPosition: FigcaptionPosition;\n    figcaptionPositionColor: FigcaptionPositionColor;\n    offerTitle?: string;\n    withCount?: boolean;\n    urlErrorImage?: string;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktopHeroPicture');\n\nexport function HeroPictureWrapper({\n    renderArrow,\n    handlePrev,\n    handleNext,\n    size,\n    renderLoader,\n    children,\n    isAltView\n}: {\n    size: SizeThumbnail;\n    children?: React.ReactNode;\n    renderArrow?: boolean;\n    renderLoader?: boolean;\n    handleNext: () => void;\n    handlePrev: () => void;\n    isAltView?: boolean;\n}) {\n    return (<div className={cn(null, { size })}>\n        <div className={cn('spinner')}>\n            {renderLoader ? <LoadingSpinner show /> : null}\n        </div>\n        <div className={cn('wrap', { alt: isAltView })}>\n            {children}\n            {renderArrow && (\n                <>\n                    <button className={cn('arrow', { left: true, alt: isAltView })} onClick={handlePrev}>\n                        <Arrow direction={DirectionArrow.LEFT} />\n                    </button>\n                    <button className={cn('arrow', { right: true, alt: isAltView })} onClick={handleNext}>\n                        <Arrow direction={DirectionArrow.RIGHT} />\n                    </button>\n                </>\n            )}\n        </div>\n    </div>);\n}\n\nexport const HeroPicture = ({\n    alt,\n    src,\n    size,\n    handleNext,\n    handlePrev,\n    renderArrow,\n    countText,\n    offerTitle,\n    figcaptionPosition,\n    figcaptionPositionColor,\n    withCount,\n    urlErrorImage\n}: IHeroPicture) => {\n    const [ cache, setCache ] = useState<string[]>([]);\n    const [ renderLoader, setRenderLoader ] = useState(false);\n    const [ state, setState ] = useState<{\n        hero?: string;\n        loading: boolean;\n        error: boolean;\n    }>({\n        hero: src,\n        loading: true,\n        error: false\n    });\n\n    const onLoad = () => setTimeout(() => {\n        setState({\n            hero: src,\n            loading: false,\n            error: false\n        });\n    }, 10);\n\n    const onError = useCallback(() => {\n        setState(prev => ({\n            ...prev,\n            loading: false,\n            error: true\n        }));\n    }, []);\n\n    useEffect(() => {\n        setRenderLoader(false);\n\n        if (cache.includes(src)) {\n            setState(({\n                hero: src,\n                loading: true,\n                error: false\n            }));\n        } else {\n            setCache([ ...cache, src ]);\n            setState(({\n                hero: undefined,\n                loading: true,\n                error: false\n            }));\n            onLoad();\n        }\n\n        const id = setInterval(() => {\n            setRenderLoader(true);\n        }, 1000);\n\n        return () => clearInterval(id);\n    }, [ src, cache ]);\n\n    return (<HeroPictureWrapper\n        renderLoader={renderLoader}\n        renderArrow={renderArrow}\n        size={size}\n        handleNext={handleNext}\n        handlePrev={handlePrev}\n    >\n        {state.error && <img\n            src={urlErrorImage}\n            crossOrigin='anonymous'\n            alt='При загрузке фото что-то пошло не так'\n            className={cn('error')}\n        />}\n\n        {! state.error && <figure className={cn('figure')}>\n            <img\n                alt={alt}\n                src={state.hero}\n                onLoad={onLoad}\n                onError={onError}\n                crossOrigin='anonymous'\n                className={cn('image')}\n            />\n            {(offerTitle || alt || withCount) ? (\n                <figcaption className={cn('figcaption', { position: figcaptionPosition })}>\n                    {offerTitle ? (\n                        <Typography\n                            variant='primary'\n                            color={figcaptionPositionColor}\n                            className={cn('title')}\n                        >\n                            {offerTitle}\n                        </Typography>\n                    ) : null}\n                    {alt ? (\n                        <Typography\n                            variant='primary'\n                            color={figcaptionPositionColor}\n                            className={cn('alt', {\n                                align: offerTitle ? (withCount ? 'center' : 'right') : (withCount ? 'left' : 'center')\n                            })}\n                        >\n                            {alt}\n                        </Typography>\n                    ) : null}\n                    {withCount ? (\n                        <Typography\n                            variant='primary'\n                            color={figcaptionPositionColor}\n                            className={cn('total', { align: 'right' })}\n                        >\n                            {countText}\n                        </Typography>\n                    ) : null}\n                </figcaption>\n            ) : null}\n        </figure>}\n    </HeroPictureWrapper>);\n};\n","/* eslint-disable */\nimport React from 'react';\n\nexport function Mortgage2IconM2({ className } : { className?: string}) {\n    return (\n        <svg width='36' height='32' viewBox='0 0 36 32' fill='none' xmlns='http://www.w3.org/2000/svg' className={className}>\n            <path d='M36 0H11v7H0v25h25v-7h11V0Zm-8.83 15.17v1.69h-7.04v-1.54s1.46-.74 2.4-1.26c1.24-.68 2.59-1.59 2.69-2.85.08-.97-.73-1.7-1.72-1.7-1.12 0-1.73.65-2.08 1.73l-1.54-.6c.47-1.3 1.53-2.73 3.61-2.73s3.56 1.52 3.56 3.29c0 2.22-2.44 3.3-3.87 3.94l-.04.02v.01h4.03ZM7.42 23.6v-8.42h2.63l2.46 6.04 2.45-6.04h2.65v8.42h-1.83v-6.32l-2.56 6.32h-1.38l-2.6-6.32v6.32H7.42Z' fill='currentColor' />\n        </svg>\n    );\n}\n","/* eslint-disable comma-dangle, react-hooks/exhaustive-deps, no-implicit-coercion */\nimport React, { useEffect, useState, useRef, useCallback } from 'react';\nimport classname from '@search/classname/src';\nimport { useKeyPress } from '@search/hooks/src/useKeyPress';\nimport {\n    ARROW_UP,\n    ARROW_RIGHT,\n    ARROW_DOWN,\n    ARROW_LEFT,\n} from '../../../../../constants/keycode';\nimport { Picture, PictureWrapper } from '../Picture/Picture';\nimport { HeroPicture, HeroPictureWrapper } from '../HeroPicture/HeroPicture';\nimport {\n    SizeThumbnail,\n    PADDED_PREVIEW,\n    WIDTH_THUMBNAIL,\n    HEIGHT_THUMBNAIL,\n    OFFSET_THUMBNAIL,\n    FigcaptionPosition,\n    FigcaptionPositionColor\n} from '../constants';\nimport './styles.css';\nimport { Mortgage2IconM2 } from '../../../MinimalBanksMortgage/mortgage2/icon/Mortgage2IconM2';\n\nexport interface IGallery {\n    srcImages: {\n        preview: string[];\n        origin: string[];\n        attributesType?: ('LAYOUT' | 'UNKNOWN' | null | undefined)[];\n    };\n    initialIndexSrcImage: number;\n    isOpenRepairForm?: boolean;\n    size: SizeThumbnail;\n    figcaptionPosition: FigcaptionPosition;\n    figcaptionPositionColor: FigcaptionPositionColor;\n    renderArrow?: boolean;\n    offerTitle?: string;\n    withCount?: boolean;\n    urlErrorImage?: string;\n    clickByCenter?: () => void;\n    withDuplicateSearchButton?: boolean;\n    starterBanner?: React.ReactNode;\n    repairBanner?: React.ReactNode;\n    hideThumbnails?: boolean;\n}\n\nconst cn = classname.bind(null, 'GalleryDesktop');\n\nconst FIRST_IMAGE_INDEX = 0;\n\ntype ImgRec = ({\n    t: 'img';\n    origin: string;\n    preview: string;\n    alt: string;\n    index: number;\n    attributesType?: 'UNKNOWN' | 'LAYOUT' | null;\n} | {\n    t: 'mortgage' | 'repair';\n}) & {\n    id: string;\n    next?: ImgRec;\n    prev?: ImgRec;\n};\n\n// eslint-disable-next-line complexity\nfunction getImgRec(\n    srcImages: IGallery['srcImages'],\n    {\n        isMortgage = false,\n        isRepair = false,\n        isOpenRepairForm = false,\n        initialIndexSrcImage = 0\n    }: {\n        isMortgage?: boolean;\n        isRepair?: boolean;\n        isOpenRepairForm?: boolean;\n        initialIndexSrcImage?: number;\n    }\n) {\n    const items: ImgRec[] = [];\n    let firstItem: undefined | ImgRec;\n    let lastItem: undefined | ImgRec;\n    let initialItem: undefined | ImgRec;\n    let prev: undefined | ImgRec;\n    let mortgageRec: ImgRec | undefined;\n    let repairRec: ImgRec | undefined;\n    const indexPositionMortgageBanner = isRepair ? 7 : 5;\n    const indexPositionRepairBanner = 3;\n\n    for (let i = 0; i < srcImages.preview.length; i++) {\n        if ((! isRepair || srcImages.preview.length > 5) && isMortgage && i === indexPositionMortgageBanner) {\n            mortgageRec = { t: 'mortgage', prev, next: undefined, id: 'gallery-preview-mortgage' };\n\n            if (prev) prev.next = mortgageRec;\n\n            items.push(mortgageRec);\n            prev = mortgageRec;\n        }\n\n        if (isRepair && i === indexPositionRepairBanner) {\n            repairRec = { t: 'repair', prev, next: undefined, id: 'gallery-preview-repair' };\n\n            if (prev) prev.next = repairRec;\n\n            items.push(repairRec);\n            prev = repairRec;\n        }\n\n        const imgRec: ImgRec = {\n            t: 'img',\n            index: i,\n            id: `gallery-preview-img-${i}`,\n            origin: srcImages.origin[i],\n            preview: srcImages.preview[i],\n            attributesType: srcImages.attributesType?.[i],\n            alt: '',\n            prev,\n            next: undefined\n        };\n\n        if (prev) prev.next = imgRec;\n\n        items.push(imgRec);\n        prev = imgRec;\n\n        if (i === 0) firstItem = imgRec;\n        if (i === initialIndexSrcImage) {\n            initialItem = imgRec;\n        }\n        if (isRepair && isOpenRepairForm && i === indexPositionRepairBanner) {\n            initialItem = repairRec;\n        }\n        lastItem = imgRec;\n    }\n\n    if (isRepair && isOpenRepairForm && srcImages.preview.length < 4) {\n        repairRec = { t: 'repair', prev, next: undefined, id: 'gallery-preview-repair' };\n        initialItem = repairRec;\n        if (prev) prev.next = repairRec;\n        items.push(repairRec);\n    }\n\n    if (isMortgage && ! mortgageRec && (srcImages.preview.length > 5 || ! isRepair)) {\n        mortgageRec = { t: 'mortgage', prev, next: undefined, id: 'gallery-preview-mortgage' };\n        if (prev) prev.next = mortgageRec;\n        items.push(mortgageRec);\n    }\n    if (isMortgage && ! isRepair && firstItem && ! firstItem.prev && srcImages.preview.length <= indexPositionMortgageBanner) {\n        firstItem.prev = mortgageRec;\n    }\n\n    if (isRepair && ! repairRec) {\n        repairRec = { t: 'repair', prev, next: undefined, id: 'gallery-preview-repair' };\n        if (prev) prev.next = repairRec;\n        items.push(repairRec);\n    }\n\n    return { items, totalImages: srcImages.preview.length, initialItem, firstItem, lastItem };\n}\n\nexport const Gallery: React.FC<IGallery> = ({\n    size,\n    starterBanner,\n    repairBanner,\n    srcImages,\n    initialIndexSrcImage = FIRST_IMAGE_INDEX,\n    isOpenRepairForm = false,\n    figcaptionPosition = FigcaptionPosition.TOP,\n    figcaptionPositionColor = FigcaptionPositionColor.WHITE,\n    offerTitle,\n    withCount,\n    renderArrow = true,\n    urlErrorImage,\n    clickByCenter,\n    withDuplicateSearchButton,\n    hideThumbnails,\n}) => {\n    const {\n        items,\n        totalImages,\n        initialItem,\n        firstItem,\n        lastItem\n    } = React.useMemo(\n        () => getImgRec(srcImages, { isMortgage: Boolean(starterBanner), isRepair: Boolean(repairBanner), initialIndexSrcImage, isOpenRepairForm }),\n        [\n            starterBanner,\n            repairBanner,\n            initialIndexSrcImage,\n            isOpenRepairForm,\n            srcImages.preview.join(';')\n        ]\n    );\n\n    const [ hero, setHeroRaw ] = useState(initialItem);\n\n    const changeHero = React.useCallback((current?: ImgRec) => {\n        if (! current) return;\n\n        setHeroRaw(current);\n        document.getElementById(current.id)?.focus();\n    }, [ ]);\n\n    const handlePrevClick = useCallback(() => {\n        changeHero(hero?.prev ?? lastItem);\n    }, [ lastItem, hero ]);\n\n    const handleNextClick = useCallback(() => {\n        changeHero(hero?.next ?? firstItem);\n    }, [ firstItem, hero ]);\n\n    const thumbnailsWrapRef = useRef<HTMLDivElement>(null);\n\n    const upKey = useKeyPress(ARROW_UP);\n    const rightKey = useKeyPress(ARROW_RIGHT);\n    const downKey = useKeyPress(ARROW_DOWN);\n    const leftKey = useKeyPress(ARROW_LEFT);\n\n    useEffect(() => {\n        if (hero) document.getElementById(hero.id)?.focus();\n    }, []);\n\n    useEffect(() => {\n        upKey && handleNextClick();\n        rightKey && handleNextClick();\n        downKey && handlePrevClick();\n        leftKey && handlePrevClick();\n    }, [\n        upKey,\n        leftKey,\n        rightKey,\n        downKey\n    ]);\n\n    useEffect(() => {\n        const wrapEl = thumbnailsWrapRef.current;\n        const thumbEl = hero ? document.getElementById(hero.id) : undefined;\n\n        if (! wrapEl || ! thumbEl) return;\n        const thumbRect = thumbEl?.getBoundingClientRect() ?? { x: 0, y: 0 };\n        const wrapRect = wrapEl?.getBoundingClientRect() ?? { width: 0, height: 0 };\n\n        const thumbWidth = WIDTH_THUMBNAIL[size];\n        const step = thumbWidth + OFFSET_THUMBNAIL;\n\n        if (\n            (thumbRect.x + thumbWidth * 1.5) > wrapRect.width\n        ) {\n            wrapEl.scrollLeft += step;\n        }\n\n        if (\n            (thumbRect.x < 0) || (thumbRect.x < thumbWidth * 1.5)\n        ) {\n            wrapEl.scrollLeft -= step;\n        }\n\n        if (hero?.prev?.t === 'img') new Image().src = hero.prev.origin;\n        if (hero?.next?.t === 'img') new Image().src = hero.next.origin;\n    }, [ hero ]);\n\n    return (\n        <div className={cn(null, { size, withTopTitle: figcaptionPosition === FigcaptionPosition.TOP })}>\n            {hero?.t === 'img' && <HeroPicture\n                src={hero.origin}\n                alt={hero.alt}\n                size={size}\n                handleNext={handleNextClick}\n                handlePrev={handlePrevClick}\n                countText={`${hero ? hero.index + 1 : 0} из ${totalImages}`}\n                offerTitle={offerTitle}\n                figcaptionPosition={figcaptionPosition}\n                figcaptionPositionColor={figcaptionPositionColor}\n                withCount={withCount}\n                renderArrow={renderArrow}\n                urlErrorImage={urlErrorImage}\n            />}\n            {hero?.t === 'repair' && repairBanner && <HeroPictureWrapper\n                size={size}\n                isAltView\n                handleNext={handleNextClick}\n                handlePrev={handlePrevClick}\n                renderArrow={renderArrow}\n            >\n                {repairBanner}\n            </HeroPictureWrapper>}\n\n            {hero?.t === 'mortgage' && starterBanner && <HeroPictureWrapper\n                size={size}\n                isAltView\n                handleNext={handleNextClick}\n                handlePrev={handlePrevClick}\n                renderArrow={renderArrow}\n            >\n                {starterBanner}\n            </HeroPictureWrapper>}\n\n            {withDuplicateSearchButton && hero?.t === 'img' && (\n                <a\n                    href={`https://yandex.ru/images/search?rpt=imageview&url=${hero.origin}`}\n                    className={cn('duplicateButton')}\n                    target='_blank'\n                >\n                    Дубль?\n                </a>\n            )}\n\n            {hideThumbnails ? null : (<div\n                style={{ paddingTop: PADDED_PREVIEW[size], }}\n                className={cn('thumbnails')}\n                data-test='galleryDesktop-thumbnails'\n                ref={thumbnailsWrapRef}\n            >\n                {items.map(rec => (\n                    <button\n                        type='button'\n                        key={rec.id}\n                        className={cn('control')}\n                        id={rec.id}\n                        onClick={changeHero.bind(null, rec)}\n                    >\n                        {rec.t === 'img' && <Picture\n                            src={rec.preview}\n                            alt={rec.alt}\n                            isLayout={rec.attributesType === 'LAYOUT'}\n                            width={WIDTH_THUMBNAIL[size]}\n                            height={HEIGHT_THUMBNAIL[size]}\n                            active={rec === hero}\n                        />}\n                        {rec.t === 'repair' && (\n                            <PictureWrapper\n                                width={WIDTH_THUMBNAIL[size]}\n                                height={HEIGHT_THUMBNAIL[size]}\n                                active={rec === hero}\n                                isAltView\n                            >\n                                <Mortgage2IconM2 className={cn('m2Icon', { isActive: rec === hero })} />\n                            </PictureWrapper>\n                        )}\n                        {rec.t === 'mortgage' && (\n                            <PictureWrapper\n                                width={WIDTH_THUMBNAIL[size]}\n                                height={HEIGHT_THUMBNAIL[size]}\n                                active={rec === hero}\n                                isAltView\n                            >\n                                <Mortgage2IconM2 className={cn('m2Icon', { isActive: rec === hero })} />\n                            </PictureWrapper>\n                        )}\n                    </button>\n                ))}\n            </div>)}\n\n            {clickByCenter && <div className={cn('place-click')} onClick={clickByCenter} />}\n        </div>\n    );\n};\n","/* eslint-disable react-hooks/exhaustive-deps */\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport classname from '@search/classname/src';\nimport { useKeyPress } from '@search/hooks/src/useKeyPress';\n\nimport { IconClose } from '../../../../../icons/IconClose';\nimport { ESCAPE } from '../../../../../constants/keycode';\nimport { Gallery, IGallery } from '../Gallery/Gallery';\nimport './styles.css';\n\ninterface IFSGallery extends IGallery {\n    onClose: () => void;\n    belowModal?: boolean;\n}\n\nconst cn = classname.bind(null, 'FSGallery');\nconst modalNode = typeof document === 'undefined' ? null : document.createElement('div');\n\nexport const FSGallery = ({\n    onClose,\n    belowModal,\n    ...rest\n}: IFSGallery) => {\n    const esc = useKeyPress(ESCAPE);\n\n    useEffect(() => {\n        esc && onClose();\n    }, [ esc ]);\n\n    useEffect(() => {\n        if (! modalNode) return;\n        const base = cn('overlay');\n\n        modalNode.classList?.add(base);\n\n        if (belowModal) modalNode.classList?.add(`${base}_belowModal`);\n        document.body.appendChild(modalNode);\n        const classes = cn(null, { open: true }).split(' ')[1];\n\n        document.body.classList.add(classes);\n\n        return () => {\n            document.body.removeChild(modalNode);\n            document.body.classList.remove('FSGallery_open');\n            modalNode.classList?.remove(base);\n            if (belowModal) modalNode.classList?.remove(`${base}_belowModal`);\n        };\n    }, [ belowModal ]);\n\n    return ReactDOM.createPortal(\n        <div className={cn('inner')}>\n            <Gallery {...rest} />\n\n            <div className={cn('icon-close')} onClick={onClose}\n                data-test='gallery-icon-close'>\n                <IconClose />\n            </div>\n        </div>,\n        // @ts-ignore\n        modalNode\n    );\n};\n","export enum SizeThumbnail {\n    M = 'm',\n    L = 'l'\n}\n\nexport enum FigcaptionPosition {\n    TOP = 'top',\n    BOTTOM = 'bottom'\n}\n\nexport enum FigcaptionPositionColor {\n    WHITE = 'white',\n    BLACK = 'black'\n}\n\nexport enum DirectionArrow {\n    LEFT = 'left',\n    RIGHT = 'right'\n}\n\nexport const OFFSET_THUMBNAIL = 8;\n\nexport const HEIGHT_THUMBNAIL = {\n    [SizeThumbnail.M]: 45,\n    [SizeThumbnail.L]: 75\n};\n\nexport const WIDTH_THUMBNAIL = {\n    [SizeThumbnail.M]: 60,\n    [SizeThumbnail.L]: 100\n};\n\nexport const PADDED_PREVIEW = {\n    [SizeThumbnail.M]: 8,\n    [SizeThumbnail.L]: 16\n};\n","import './ButtonTwoState.css';\n\nimport React from 'react';\nimport classname from '@search/classname/src';\nimport { Tooltip, Button, useTooltip, ButtonProps } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nconst cn = classname.bind(null, 'ButtonTwoState');\n\nexport function ButtonTwoState({\n    tooltipText,\n    tooltipAsText,\n    children = tooltipAsText ? tooltipText : null,\n    tooltipDirection = 'up',\n    variant,\n    isActive,\n    onClick,\n    size = 's',\n    dataAttrs,\n    dataTest,\n    onlyIconStyle,\n    paddingSize,\n    noTooltip,\n    ...props\n}: ButtonProps & {\n    tooltipAsText?: boolean;\n    isActive?: boolean;\n    tooltipText?: string;\n    tooltipDirection?: React.ComponentProps<typeof Tooltip>['direction'];\n    onlyIconStyle?: boolean;\n    noTooltip?: boolean;\n    /**\n     * Свойство для работы только в виде иконки. Паддинг вокруг иконки.\n     * @param {string} m - 10px\n     */\n    paddingSize?: 'm';\n}) {\n    const tooltip = useTooltip();\n    // const colorBlack400 = 'hsl(251, 10%, 46%)';\n    const colorBlack250 = 'hsl(251, 17%, 75%)';\n    const colorRed600 = 'hsl(5, 90%, 48%)';\n\n    let normalVariant = variant;\n    let iconColor = undefined as ButtonProps['iconColor'];\n\n    if (variant === 'transparent' || variant === 'transparent-alt-bg') {\n        const normalColor = children ? undefined : colorBlack250;\n\n        iconColor = isActive ? colorRed600 : normalColor;\n    }\n    if (isActive && (variant !== 'transparent' && variant !== 'transparent-alt-bg')) normalVariant = 'danger';\n\n    const button = variant === 'transparent-alt-bg' ? (\n        <button\n            data-test={dataTest}\n            className={cn(null, { isActive, isBlack: Boolean(children), onlyIconStyle, paddingSize })}\n            ref={tooltip.registerControl as React.Ref<HTMLButtonElement>}\n            onClick={e => {\n                e.stopPropagation();\n                onClick?.(e);\n            }}\n        >\n            <Icon\n                size='m'\n                name={props.icon as Extract<React.ComponentProps<typeof Icon>, { size: 'm' }>['name']}\n            />\n            {children && (\n                <span className={cn('text')}>\n                    {children}\n                </span>\n            )}\n        </button>\n    ) : (\n        <div className={cn(null)}>\n            <Button\n                {...props}\n                dataAttrs={dataAttrs}\n                dataTest={dataTest}\n                size={size}\n                iconColor={iconColor}\n                variant={normalVariant}\n                ref={tooltip.registerControl as React.Ref<HTMLButtonElement>}\n                onClick={e => {\n                    e.stopPropagation();\n                    onClick?.(e);\n                }}\n            >\n                {children}\n            </Button>\n        </div>\n    );\n\n    return (<>\n        {onClick ? button : null}\n        {! noTooltip && tooltipText && ! tooltipAsText ? (\n            <Tooltip\n                placement='body'\n                direction={tooltipDirection}\n                to={tooltip.to}\n                children={tooltipText}\n            />\n        ) : null}\n    </>);\n}\n","/* global window */\nimport React from 'react';\nimport { Tooltip, useTooltip, ShareModal } from '@vtblife/uikit';\nimport { useClassifiedOfferDataLayerPush } from '../offer/analytics/ClassifiedOfferGtmContext';\nimport { ButtonTwoState } from '../../view/common/components/FavoritesButton/ButtonTwoState';\nimport { useShareLinksNative } from './useShareLinks';\n\nexport function ShareButton({\n    gtmShowModal = 'ClModalShareStart',\n    gtmShare = 'ClModalShareChoise',\n    title,\n    isCircle,\n    isMobile,\n    children = 'Поделиться',\n    textPlacement = 'none',\n    preferNativeShare = true,\n    onModalVisibilityChange,\n}: {\n    isMobile?: boolean;\n    gtmShowModal?: string;\n    gtmShare?: string;\n    title?: string;\n    children?: React.ReactNode;\n    isCircle?: boolean;\n    textPlacement?: 'none' | 'button' | 'tooltip';\n    preferNativeShare?: boolean;\n    onModalVisibilityChange?(isVisible: boolean): void;\n}) {\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const [ isModal, setIsModal ] = React.useState(false);\n\n    const { nativeShare } = useShareLinksNative({ title, gtmShare });\n\n    React.useEffect(() => {\n        onModalVisibilityChange?.(isModal);\n    }, [ isModal ]);\n\n    const showModal = React.useCallback(() => {\n        if (nativeShare && preferNativeShare) {\n            nativeShare();\n            return;\n        }\n\n        if (gtmShowModal) dataLayerPush({ event: gtmShowModal });\n        setIsModal(true);\n    }, [ gtmShowModal, nativeShare, dataLayerPush, preferNativeShare ]);\n\n    const closeModal = React.useCallback(() => {\n        setIsModal(false);\n    }, []);\n\n    const tt = useTooltip();\n\n    const currentUrl =\n        typeof window === 'undefined' ? '' : window.location.href;\n\n    const analyticsPush = React.useCallback(\n        (id: string) => {\n            if (! gtmShare) return;\n            dataLayerPush({ event: gtmShare, soc_sources: id });\n        },\n        [ gtmShare, dataLayerPush ]\n    );\n\n    const variant = isMobile ? 'transparent-alt-bg' : 'secondary';\n\n    const body = (\n        <>\n            <ShareModal\n                url={currentUrl}\n                opened={isModal}\n                title={title}\n                onClose={closeModal}\n                onShare={analyticsPush}\n            />\n            <ButtonTwoState\n                size='s'\n                fullWidth\n                variant={isCircle ? 'primary-alt-bg' : variant}\n                shadow={isCircle}\n                icon='share'\n                dataTest='card-button-share'\n                circle={isCircle}\n                onClick={showModal}\n            >\n                {textPlacement === 'button' ? children : ''}\n            </ButtonTwoState>\n            {textPlacement === 'tooltip' ? (\n                <Tooltip direction='up' to={tt.to}>\n                    {children}\n                </Tooltip>\n            ) : null}\n        </>\n    );\n\n    return isMobile ? body : <div ref={tt.registerControl}>{body}</div>;\n}\n","/* global navigator, window */\nimport React from 'react';\n\nimport { useClassifiedOfferDataLayerPush } from '../offer/analytics/ClassifiedOfferGtmContext';\n\nexport function useShareLinksNative(p: {\n    title?: string;\n    shareUrl?: string;\n    gtmShare?: string;\n} = {}) {\n    const currentUrl = p.shareUrl ?? (typeof window === 'undefined' ? '' : window.location.href);\n    const isNativeShare = typeof navigator === 'undefined' ? undefined : navigator.share;\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n    const analyticsPush = React.useCallback((id: string) => {\n        const fullId = p.gtmShare;\n\n        if (! fullId) return;\n        dataLayerPush({ event: fullId });\n    }, [ p.gtmShare, dataLayerPush ]);\n\n    const nativeShare = React.useCallback(() => {\n        if (! isNativeShare) return;\n\n        analyticsPush('native');\n\n        navigator.share({\n            title: p.title,\n            url: currentUrl\n        });\n    }, [ ]);\n\n    return {\n        nativeShare: isNativeShare ? nativeShare : undefined\n    };\n}\n","import React from 'react';\n\nimport { ButtonTwoState } from './ButtonTwoState';\n\nexport function FavoritesButton(props: React.ComponentProps<typeof ButtonTwoState>) {\n    return (<ButtonTwoState\n        {...props}\n        icon='heart'\n        dataTest={props.isActive ? 'offer-favorite-yes' : 'offer-favorite-no'}\n        tooltipText={props.isActive ? 'В\\u00A0избранном' : 'В\\u00A0избранное'}\n    />);\n}\n","import React from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport './styles.css';\n\ninterface IProps {\n    handleOpenPanorama?: (e: React.MouseEvent<Element, MouseEvent>) => void;\n    handleOpenLayout?: (e: React.MouseEvent<Element, MouseEvent>) => void;\n}\n\nexport const GalleryButtons = ({ handleOpenPanorama, handleOpenLayout }: IProps) => (\n    <div className='GalleryButtons'>\n        {handleOpenPanorama && (\n            <Button\n                icon='panorama'\n                variant='transparent'\n                rounded='none'\n                size='s'\n                fullWidth\n                onClick={handleOpenPanorama}\n            >\n                Панорама\n            </Button>\n        )}\n        {handleOpenLayout && (<Button\n            icon='blueprint'\n            variant='transparent'\n            rounded='none'\n            size='s'\n            fullWidth\n            onClick={handleOpenLayout}\n        >\n            Планировка\n        </Button>)}\n    </div>\n);\n","/* eslint-disable @typescript-eslint/no-shadow */\n/* eslint-disable @typescript-eslint/naming-convention */\n/* eslint-disable comma-dangle, no-shadow, react-hooks/exhaustive-deps */\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\nimport classname from '@search/classname/src';\nimport Icon from '@vtblife/uikit-icons';\nimport { Button } from '@vtblife/uikit';\nimport { Dots } from '@vtblife/uikit/legacy';\n\nimport { ImageLazySeo } from '@search/vtbeco-frontend-core/domain/image/lazy/ImageLazySeo';\nimport { ImageLazyObserverProvider } from '@search/vtbeco-frontend-core/domain/image/lazy/ImageLazy';\nimport { ShareButton } from '@search/vtbeco-frontend-core/domain/share/ShareButton';\nimport NavButtons, { ArrowDirection } from '@search/vtbeco-frontend-core/view/desktop/components/snippet/parts/GallerySnippet/NavButtons';\n\nimport { NO_PHOTO_SRC, NO_PHOTO_SRC_SET } from '../../../../../domain/newbuilding/libs/constants';\nimport { useGetCurrentIndexImages } from '../useGetCurrentIndexImages';\nimport { FavoritesButton } from '../../FavoritesButton/FavoritesButton';\n\nimport { GalleryButtons } from './GalleryButtons/GalleryButtons';\nimport './GalleryMobile2.css';\n\nconst cn = classname.bind(null, 'GalleryMobile2');\n\nexport type PictureType = {\n    src?: string;\n    originPath?: string;\n    description?: string;\n}\n\ninterface IGalleryMobile2Props {\n    pictures?: PictureType[];\n\n    layoutImageSrc?: string;\n    layoutImageIndex?: number;\n\n    onClick?: (imgIndex: number) => void;\n    handleOpenPanorama?: () => void;\n    imageDataset?: Record<string, string>;\n    gotoBack?: () => void;\n\n    anchorHidingCircleButtons?: React.MutableRefObject<HTMLDivElement | null>;\n\n    isFavoriteActive?: boolean;\n    onFavoriteClick?(e: React.MouseEvent): void;\n    renderFavorite?: React.ReactNode;\n\n    noTooltip?: boolean;\n\n    renderBadges?: React.ReactNode;\n    renderSpecialEvents?: React.ReactNode;\n    renderVases?: React.ReactNode;\n    noSlider?: boolean;\n    showShareButton?: boolean;\n    onShareModalVisibilityChange?(isVisible: boolean): void;\n    maxPicturesCount?: number;\n    isNewBuilding?: boolean;\n    isOfferCard?: boolean;\n    hovered?: boolean;\n    withDots?: boolean;\n    withSpace?: boolean;\n    withNavButtons?: boolean;\n    relativeHeight?: boolean;\n    hideActionsButtons?: boolean;\n    isVisited?: boolean | null;\n    /**\n     * Для уменьшения LCP видимым на первом экране картинкам лучше НЕ задавать lazy.\n     * Больше инфы тут https://web.dev/lcp-lazy-loading/\n     */\n    isFirstOffer?: boolean;\n}\n\n// eslint-disable-next-line complexity\nexport const GalleryMobile2: React.FC<IGalleryMobile2Props> = ({\n    pictures = [],\n\n    isVisited = false,\n    layoutImageSrc,\n    layoutImageIndex,\n\n    onClick = () => { },\n    imageDataset,\n\n    renderBadges,\n    renderSpecialEvents,\n    renderVases,\n\n    anchorHidingCircleButtons,\n\n    isOfferCard,\n    withDots = true,\n    withSpace: withSpaceProp = false,\n    noSlider: noSliderProps = false,\n    isNewBuilding,\n    maxPicturesCount,\n    hovered,\n    withNavButtons,\n    relativeHeight,\n    hideActionsButtons,\n    isFirstOffer,\n\n    // maybe drill through children\n    isFavoriteActive,\n    onFavoriteClick,\n    renderFavorite: renderFavoriteProp,\n\n    showShareButton,\n    onShareModalVisibilityChange,\n    handleOpenPanorama,\n    gotoBack,\n    noTooltip = false\n}) => {\n    const { images, noSlider, restCountImages } = useMemo(() => {\n        let images = pictures;\n        let restCountImages = 0;\n        let noSlider = noSliderProps;\n\n        if (maxPicturesCount) {\n            images = pictures.slice(0, maxPicturesCount);\n            restCountImages = pictures.length - images.length;\n        }\n\n        if (images.length === 1) {\n            noSlider = true;\n        }\n        if (noSlider) {\n            images = images.slice(0, 1);\n        }\n\n        return {\n            images,\n            restCountImages,\n            noSlider\n        };\n    }, [ pictures, noSliderProps ]);\n\n    const { setChildRef, indexImage, galleryRef, setIndexImage } = useGetCurrentIndexImages(images.length);\n\n    const layoutImageRef = React.useRef<HTMLSpanElement | null>(null);\n    const setRefProps = (el: HTMLSpanElement | null, index: number, imageSrc: string) => {\n        setChildRef(el, index);\n        if (imageSrc === layoutImageSrc) {\n            layoutImageRef.current = el;\n        }\n    };\n    const handleOpenLayout = React.useCallback((e: React.MouseEvent<Element, MouseEvent>) => {\n        e.stopPropagation();\n        layoutImageRef.current?.scrollIntoView(false);\n        if (typeof layoutImageIndex === 'number' && layoutImageIndex >= 0) {\n            setIndexImage(layoutImageIndex);\n        }\n    }, [ layoutImageRef ]);\n\n    const circleButtonsRef = useRef<HTMLDivElement>(null);\n    const circleRightButtonsRef = useRef<HTMLDivElement>(null);\n    const circleButtonsWrapperRef = useRef<HTMLDivElement>(null);\n\n    useEffect(() => {\n        if (isOfferCard) {\n            const viewportHeight = window.innerHeight;\n            const observerCircleButtonsSticky = new IntersectionObserver(entries => {\n                entries.forEach(entry => {\n                    if (\n                        (! entry.isIntersecting && entry.intersectionRatio === 0) ||\n                        (entry.intersectionRatio < 1 && entry.intersectionRatio > 0.5)\n                    ) {\n                        circleButtonsRef.current?.classList.add('GalleryMobile2__circle-buttons_sticky');\n                    }\n                    if (entry.isIntersecting && entry.intersectionRatio === 1) {\n                        circleButtonsRef.current?.classList.remove('GalleryMobile2__circle-buttons_sticky');\n                    }\n                });\n            }, {\n                rootMargin: '0px 5px',\n                threshold: [ 0, 0.5, 1, 0.99 ]\n            });\n\n            const observerCircleButtonsShow = new IntersectionObserver(entries => {\n                entries.forEach(entry => {\n                    if (circleRightButtonsRef.current) {\n                        const isAnchorVisibleOrScrollThrough = entry.boundingClientRect.top <= viewportHeight;\n\n                        if (isAnchorVisibleOrScrollThrough) {\n                            circleRightButtonsRef.current.style.display = 'none';\n                        } else {\n                            circleRightButtonsRef.current.style.display = 'grid';\n                        }\n                    }\n                });\n            }, {\n                rootMargin: '0px 5px',\n                threshold: [ 0, 0.05, 0.5, 0.95, 1 ]\n            });\n\n            circleButtonsWrapperRef.current && observerCircleButtonsSticky.observe(circleButtonsWrapperRef.current);\n            anchorHidingCircleButtons?.current && observerCircleButtonsShow.observe(anchorHidingCircleButtons.current);\n\n            return () => {\n                observerCircleButtonsShow.disconnect();\n                observerCircleButtonsSticky.disconnect();\n            };\n        }\n    }, [ ]);\n\n    const galleryWidth = galleryRef.current?.clientWidth ?? 0;\n    const handleClickArrow = useCallback((arrowDirection: ArrowDirection) => {\n        if (arrowDirection === 'left') {\n            galleryRef.current?.scrollTo({ left: (galleryRef.current?.scrollLeft ?? 0) - galleryWidth });\n            setIndexImage(state => state - 1);\n        } else {\n            galleryRef.current?.scrollTo({ left: (galleryRef.current?.scrollLeft ?? 0) + galleryWidth });\n            setIndexImage(state => state + 1);\n        }\n    }, [ galleryWidth ]);\n\n    const lastImageIndex = images.length - 1;\n    const withSpace = withDots && images.length > 1 || withSpaceProp;\n    const showNavButtons = withNavButtons && images.length > 1;\n    const showActionButtons = ! hideActionsButtons && isOfferCard && (layoutImageSrc || handleOpenPanorama);\n\n    const renderFavoriteInner = onFavoriteClick ? (<FavoritesButton\n        isActive={isFavoriteActive}\n        onClick={onFavoriteClick}\n        variant='primary-alt-bg'\n        noTooltip={noTooltip}\n        circle\n        block\n        shadow\n    />) : undefined;\n\n    const renderFavorite = renderFavoriteInner ?? renderFavoriteProp;\n    const mainSrc = images?.[0]?.src ?? images?.[0]?.originPath;\n\n    return (\n        <div className={cn()}>\n            <link itemProp='image' href={mainSrc} />\n            <div\n                className={cn('galleryWrapper', {\n                    relativeHeight,\n                    withSpace,\n                    visited: isVisited,\n                    withActionButtons: showActionButtons\n                })}\n            >\n                {showNavButtons && (\n                    <NavButtons\n                        isActive={hovered}\n                        isLastImage={indexImage === lastImageIndex}\n                        isFirstImage={indexImage === 0}\n                        handleClickArrow={handleClickArrow}\n                    />\n                )}\n\n                <div\n                    ref={galleryRef}\n                    className={cn('gallery', { noSlider, withNavButtons, relativeHeight })}\n                >\n                    <ImageLazyObserverProvider\n                        rootRef={galleryRef}\n                        rootMargin='0px 50% 0px 0px'\n                    >\n                        {images.length === 0 && <NoPhoto isNewBuilding={isNewBuilding} />}\n                        {images.map(({ src, originPath, description }, index) => {\n                            const id = src ?? originPath ?? '';\n\n                            return src || originPath ? (\n                                <ImageLazySeo\n                                    dataSet={imageDataset}\n                                    onClick={() => onClick(index)}\n                                    src={src}\n                                    originPath={originPath}\n                                    srcWidth={280}\n                                    srcHeight={210}\n                                    key={id}\n                                    data-index={index}\n                                    className={cn('imageWrapper', {\n                                        noSlider, isLayout: id === layoutImageSrc, withSpace })}\n                                    imgClassName={cn('image', {\n                                        noSlider, isLayout: id === layoutImageSrc, withSpace })}\n                                    ref={ref => setRefProps(ref, index, id)}\n                                    // Для первой картинки принудительно нативный lazy, в сафари будет всегда загружаться, в хроме - нативно лениво.\n                                    // eslint-disable-next-line no-nested-ternary\n                                    loadingLazy={isFirstOffer && index === 0 ?\n                                        'eager' :\n                                        index === 0 ? 'native' : 'io'}\n                                    alt={description}\n                                    title={description}\n                                >\n                                    {lastImageIndex === index && restCountImages > 0 && (\n                                        <div\n                                            className={cn('last-image-preview')}\n                                            data-test='snippet-gallery-last-photo'\n                                        >\n                                            Ещё {restCountImages} фото</div>\n                                    )}\n                                </ImageLazySeo>\n                            ) : (\n                                <NoPhoto isNewBuilding={isNewBuilding} key={index} />\n                            );\n                        })}\n                    </ImageLazyObserverProvider>\n                </div>\n\n                <div className={cn('badges')}>\n                    {renderBadges}\n                </div>\n\n                <div className={cn('special-events')}>\n                    {renderSpecialEvents}\n                </div>\n\n                <div className={cn('priorities')}>\n                    {renderVases}\n                </div>\n            </div>\n\n            {withSpace && (\n                <div className={cn('space', { borderBottom: showActionButtons })}>\n                    {images.length > 1 ? (\n                        <Dots\n                            size='s'\n                            length={images.length}\n                            carousel={7}\n                            selected={indexImage}\n                        />\n                    ) : null}\n                </div>\n            )}\n\n            {showActionButtons && (\n                <GalleryButtons\n                    handleOpenLayout={layoutImageSrc ? handleOpenLayout : undefined}\n                    handleOpenPanorama={handleOpenPanorama}\n                />\n            )}\n\n            {\n                (gotoBack || showShareButton || renderFavorite) ? (\n                    <div className={cn('circle-buttons-wrapper')} ref={circleButtonsWrapperRef}>\n                        <div className={cn('circle-buttons')} ref={circleButtonsRef}>\n                            {gotoBack && (\n                                <Button\n                                    circle\n                                    variant='primary-alt-bg'\n                                    size='s'\n                                    icon='chevron-left'\n                                    dataTest='offer-back'\n                                    shadow\n                                    onClick={gotoBack}\n                                />\n                            )}\n\n                            <div\n                                ref={circleRightButtonsRef}\n                                className={cn('circle-buttons-group', {\n                                    showBothButtons: showShareButton && Boolean(renderFavorite) })}\n                            >\n                                {showShareButton && <ShareButton isCircle onModalVisibilityChange={onShareModalVisibilityChange} />}\n                                {renderFavorite}\n                            </div>\n                        </div>\n                    </div>\n                ) : null\n            }\n        </div>\n    );\n};\n\nconst NoPhoto = ({ isNewBuilding }: { isNewBuilding?: boolean }) => {\n    return (<>\n        {isNewBuilding && (\n            <picture itemType='http://schema.org/ImageObject'>\n                <source\n                    srcSet={NO_PHOTO_SRC_SET}\n                />\n                <img\n                    className={cn('empty-nb')}\n                    crossOrigin='anonymous'\n                    alt='нет фотографии ЖК, заглушка'\n                    src={NO_PHOTO_SRC}\n                    loading='lazy'\n                />\n            </picture>\n        )}\n        {! isNewBuilding && (\n            <span className={cn('empty')}>\n                <Icon name='camera-crossed' size='xl' />\n            </span>\n        )}\n    </>);\n};\n","import throttle from 'lodash/throttle';\nimport { useRef, useEffect, useState, useCallback } from 'react';\n\nexport const useGetCurrentIndexImages = (length: number) => {\n    const [ indexImage, setIndex ] = useState(0);\n\n    const galleryRef = useRef<HTMLDivElement>(null);\n    const galleryImageRefs = useRef<(Element | null)[]>(Array(length).map(() => null));\n\n    const setChildRef = (ref: Element | null, index: number) => {\n        if (ref) galleryImageRefs.current[index] = ref;\n    };\n\n    // eslint-disable-next-line no-undef\n    const setCurrentIndex = useCallback((e: globalThis.Event) => {\n        e.stopPropagation();\n        e.preventDefault();\n\n        const childs = galleryImageRefs.current;\n        const rectParent = galleryRef.current?.getBoundingClientRect();\n\n        if (! rectParent || ! childs) return;\n\n        childs.forEach((child, index) => {\n            if (! child) return;\n\n            const childRectRight = child?.getBoundingClientRect().right;\n\n            const relativeChildPosRightSide = Number((childRectRight - rectParent.right).toFixed(0));\n\n            if (relativeChildPosRightSide >= -5 && relativeChildPosRightSide <= 5) {\n                setIndex(index);\n            }\n        });\n    });\n\n    useEffect(() => {\n        const parent = galleryRef.current;\n\n        if (! galleryImageRefs.current || ! parent) return;\n\n        const throttleHandleScroll = throttle(setCurrentIndex, 100) as EventListener;\n\n        parent.addEventListener('scroll', throttleHandleScroll);\n\n        return () => parent.removeEventListener('scroll', throttleHandleScroll);\n    }, [ galleryImageRefs ]);\n\n    return { setChildRef, galleryImageRefs, galleryRef, indexImage, setIndexImage: setIndex };\n};\n","import { useRef, useCallback, useEffect, MutableRefObject } from 'react';\n\ntype Timeout = ReturnType<typeof setTimeout>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function useDebouncedCallback<T extends(...args: any[]) => any>(\n    callback: T,\n    delay: number\n): [T, () => void] {\n    const maxWaitArgs: { current: any[] } = useRef([]);\n\n    const functionTimeoutHandler: MutableRefObject<Timeout|null> = useRef(null);\n    const isComponentUnmounted: { current: boolean } = useRef(false);\n\n    const debouncedFunction = useRef(callback);\n\n    debouncedFunction.current = callback;\n\n    const cancelDebouncedCallback: () => void = useCallback(() => {\n        clearTimeout(functionTimeoutHandler.current!);\n        maxWaitArgs.current = [];\n        functionTimeoutHandler.current = null;\n    }, []);\n\n    useEffect(\n        () => () => {\n            // для вызова callPending вне hook'а\n            isComponentUnmounted.current = true;\n        },\n        []\n    );\n\n    const debouncedCallback = useCallback(\n        // @ts-ignore\n        (...args) => {\n            maxWaitArgs.current = args;\n            clearTimeout(functionTimeoutHandler.current!);\n\n            functionTimeoutHandler.current = setTimeout(() => {\n                cancelDebouncedCallback();\n\n                if (! isComponentUnmounted.current) {\n                    debouncedFunction.current(...args);\n                }\n            }, delay);\n        },\n        [ delay, cancelDebouncedCallback, functionTimeoutHandler ]\n    );\n\n    // Вызов debouncedFunction в ручную, например при unmount не дожидаясь таймера\n    const callPending = useCallback(() => {\n        if (! functionTimeoutHandler.current) {\n            return;\n        }\n\n        debouncedFunction.current.apply(null, maxWaitArgs.current);\n        cancelDebouncedCallback();\n    }, [ functionTimeoutHandler, debouncedFunction, cancelDebouncedCallback ]);\n\n    return [ debouncedCallback as T, callPending ];\n}\n","/* eslint-env browser, node */\nimport React from 'react';\nimport { Idle, NotIdle } from 'idlejs';\n\nconst sessionStorage = typeof window === 'undefined' ? undefined : window.sessionStorage;\n\nconst modalsSelector = 'div[class^=Modal], div[class^=modal-module__container], div[class^=auth], div[class^=base-modal], .CustomerFeedbackDesktop, .FSGallery, body[class*=ymaps]';\n\ninterface IUseIdleParams {\n    rememberKey?: string;\n    idleOnTabChange?: boolean;\n    idleTimeout?: number;\n}\n\nexport const useIdle = (params: IUseIdleParams = {}) => {\n    const [ isIdle, setIsIdle ] = React.useState(false);\n    const idle = React.useMemo(() => new Idle(), []);\n    const windowIdle = React.useMemo(() => new NotIdle(), []);\n    const { idleOnTabChange = false, idleTimeout = 10, rememberKey } = params;\n\n    const isWatcherEnabled = React.useMemo(() => {\n        return rememberKey !== undefined ? sessionStorage?.getItem(rememberKey) === null : true;\n    }, [ ]);\n\n    const enableIdle = React.useCallback(() => {\n        const activeModals = document.querySelectorAll(modalsSelector);\n\n        if (! document.hasFocus()) return setIsIdle(false);\n\n        if (activeModals.length >= 1) return setIsIdle(false);\n\n        setIsIdle(true);\n    }, []);\n\n    const disableIdle = React.useCallback(() => {\n        if (rememberKey !== undefined) {\n            sessionStorage?.setItem(rememberKey, rememberKey);\n        }\n        idle.stop();\n        windowIdle.stop();\n        setIsIdle(false);\n    }, []);\n\n    const resetIdle = React.useCallback(() => {\n        setIsIdle(false);\n    }, []);\n\n    React.useEffect(() => {\n        if (isWatcherEnabled) {\n            idle\n                .whenNotInteractive()\n                .within(idleTimeout, 1000)\n                .do(enableIdle)\n                .start();\n        } else {\n            idle.stop();\n        }\n\n        if (isWatcherEnabled && idleOnTabChange) {\n            windowIdle\n                .when([ {\n                    events: [ 'blur' ],\n                    target: window\n\n                } ])\n                .within(1, 1000)\n                .do(enableIdle)\n                .start();\n        } else {\n            windowIdle.stop();\n        }\n\n        return () => {\n            idle.stop();\n            windowIdle.stop();\n        };\n    }, [ isWatcherEnabled, idleOnTabChange ]);\n\n    return {\n        isIdle,\n        disableIdle,\n        resetIdle\n    };\n};\n","import React from 'react';\nimport { useGql2Loader } from '@search/gql-client/src/useGql2';\nimport { graphql, useGqlContext } from '@search/gql-client/src';\n\nimport type {\n    useInitialPhoneQuery$data as useInitialPhoneQueryResponse,\n    useInitialPhoneQuery$variables as useInitialPhoneQueryVariables\n} from './__generated__/useInitialPhoneQuery.graphql';\n\nconst query = graphql`\n    query useInitialPhoneQuery {\n        userDetails {\n            phone\n        }\n    }\n`;\n\nfunction useUseInfoFetcher() {\n    const gql = useGqlContext();\n\n    return React.useCallback(\n        (vars: useInitialPhoneQueryVariables = {}, opts?: { signal?: AbortSignal }) => gql.client<\n            useInitialPhoneQueryVariables,\n            useInitialPhoneQueryResponse\n        >(query, vars, opts)\n            .then(response => {\n                return response;\n            }),\n        [ gql ]\n    );\n}\n\nexport function useInitialPhone() {\n    const load = useGql2Loader(useUseInfoFetcher(), { cachePrefix: 'UserDetailsPhone' });\n    const data = load({});\n\n    return data?.data?.userDetails?.phone ?? '';\n}\n","import { TouchEvent, MouseEvent, useCallback, useState } from 'react';\n\ntype SwipeStateType = {\n    touchStart: number;\n    touchEnd: number;\n    isSwipe: boolean;\n};\n\nconst MIN_SWIPE_DIST = 60;\n\nexport const useSwiper = ({\n    onSwipeLeft,\n    onSwipeRight\n}: {\n    onSwipeLeft: (e?: MouseEvent) => void;\n    onSwipeRight: (e?: MouseEvent) => void;\n}): {\n    handleTouchStart?: (e: TouchEvent) => void;\n    handleTouchMove?: (e: TouchEvent) => void;\n    handleTouchEnd?: () => void;\n} => {\n    const [ state, setState ] = useState<SwipeStateType>({\n        touchStart: 0,\n        touchEnd: 0,\n        isSwipe: false\n    });\n\n    const handleTouchStart = useCallback((e: TouchEvent) => {\n        const { clientX } = e.targetTouches[0];\n\n        setState(prevState => ({\n            ...prevState,\n            touchStart: clientX\n        }));\n    }, []);\n\n    const handleTouchMove = useCallback((e: TouchEvent) => {\n        const { clientX } = e.targetTouches[0];\n\n        setState(prevState => ({\n            ...prevState,\n            isSwipe: true,\n            touchEnd: clientX\n        }));\n    }, []);\n\n    const handleTouchEnd = useCallback(() => {\n        if (! state.isSwipe) {\n            return;\n        }\n\n        const dist = state.touchStart - state.touchEnd;\n\n        if (dist > MIN_SWIPE_DIST) {\n            onSwipeLeft();\n        }\n\n        if (dist < -MIN_SWIPE_DIST) {\n            onSwipeRight();\n        }\n\n        setState(prevState => ({\n            ...prevState,\n            isSwipe: false\n        }));\n    }, [ state, onSwipeLeft, onSwipeRight ]);\n\n    return {\n        handleTouchStart,\n        handleTouchMove,\n        handleTouchEnd\n    };\n};\n","/* global window, document */\nimport { useEffect } from 'react';\n\n/**\n * Passing --vh custom property to root\n */\nexport const useVHProperty = () => {\n    useEffect(() => {\n        const setVHProperty = () => {\n            if (typeof window === 'undefined' || typeof document === 'undefined') return;\n\n            const vh = window.innerHeight * 0.01;\n\n            document.documentElement.style.setProperty('--vh', `${vh}px`);\n        };\n\n        setVHProperty();\n\n        window.addEventListener('resize', setVHProperty);\n\n        return () => {\n            window.removeEventListener('resize', setVHProperty);\n        };\n    }, []);\n};\n","import { OfferRoute } from '@search/offer-search-routes/src/offerRoute';\nimport { Router } from '@search/router/src/Router';\nimport { RouterContext } from '@search/offer-search-routes/src/RouterProvider';\nimport { DealType, NewBuilding, RealtyObjectType, Rooms } from '@search/filter-enums/enums';\n\nexport interface IOfferRouteParams {\n    offerId: string;\n    dealType: DealType;\n    categoryType: RealtyObjectType;\n    newBuilding: NewBuilding;\n    room?: Rooms;\n    region?: number;\n}\n\nexport const makeOfferUrl = (\n    router: Router<RouterContext>,\n    routeParams: IOfferRouteParams\n): string | null => {\n    const { region } = routeParams;\n\n    if (region) {\n        return new OfferRoute({\n            context: {\n                ...router.context,\n                rootRegions: undefined\n                // @todo Надо грузить clasified root regions\n                // и передавать его, только если в нем есть регион с id из routeParams.region\n                // иначе - передавать в rootRegions undefined, но в таком случае будет редирект на урл с регионом\n            },\n            location: router.location\n        }).url(routeParams);\n    }\n\n    return null;\n};\n","export const ESCAPE = 'Escape';\nexport const ENTER = 'Enter';\nexport const ARROW_UP = 'ArrowUp';\nexport const ARROW_RIGHT = 'ArrowRight';\nexport const ARROW_DOWN = 'ArrowDown';\nexport const ARROW_LEFT = 'ArrowLeft';\n","import './styles.css';\n\nimport React, { useCallback, useEffect, useState } from 'react';\nimport classname from '@search/classname/src';\nimport { Typography } from '@vtblife/uikit';\n\nimport { ApplicationIdEnum, MortgagePurpose } from '@search/graphql-typings';\nimport {\n    getMinimalBanksMortgageEconomyPercent,\n    minimalBanksMortgageParamsFromOffer,\n    useMinimalBanksMortgageOverall,\n    UseMinimalBanksMortgageStateParams\n} from '../../../common/components/MinimalBanksMortgage/useMinimalBanksMortageState';\nimport { Mortgage2StarterModal } from '../../../common/components/MinimalBanksMortgage/mortgage2/starter/Mortgage2StarterModal';\n\nconst cn = classname.bind(null, 'MinimalBanksMortgageSnippetDesktop');\n\nexport function MinimalBanksMortgageSnippetDesktop(\n    {\n        className,\n        gtm,\n        ...stateParams\n    }: {\n        className?: string;\n        gtm?: string;\n        ownAmount: number;\n        url: string;\n    } & UseMinimalBanksMortgageStateParams\n) {\n    const { economyFormatted } = getMinimalBanksMortgageEconomyPercent();\n\n    const [ isModalOpen, toggleModal ] = useState<boolean>(false);\n    const openModal = useCallback(() => toggleModal(true), []);\n    const closeModal = useCallback(() => toggleModal(false), []);\n\n    return (\n        <div className={cn(undefined, undefined, className)}>\n            <Typography\n                bold\n                onClick={openModal}\n                variant='primary-alone'\n                className={cn('link')}\n            >\n                Рассчитать ипотеку\n            </Typography>\n            <Typography\n                variant='secondary-alone'\n                className={cn('promo')}\n            >\n                Сэкономьте до&nbsp;{economyFormatted} на&nbsp;ставке вместе с&nbsp;«Метром квадратным»\n            </Typography>\n            {\n                isModalOpen ? (\n                    <MortgageModal\n                        {...stateParams}\n                        onClose={closeModal}\n                    />\n                ) : null\n            }\n        </div>\n    );\n}\n\nexport function MortgageModal({\n    url: snippetURL,\n    onClose,\n    ...stateParams\n}: {\n    ownAmount: number;\n    url?: string;\n    onClose: () => void;\n} & UseMinimalBanksMortgageStateParams) {\n    const mortgageParams = minimalBanksMortgageParamsFromOffer(stateParams);\n    const {\n        minimalBanksMortgageOffers,\n        url: calculatorUrl\n    } = useMinimalBanksMortgageOverall(mortgageParams);\n\n    useEffect(() => {\n        if (minimalBanksMortgageOffers?.length === 0) {\n            window.open(calculatorUrl, '_blank');\n            onClose();\n        }\n    }, [ calculatorUrl, minimalBanksMortgageOffers, onClose ]);\n\n    return minimalBanksMortgageOffers?.length ? (\n        <Mortgage2StarterModal\n            withoutAuth\n            isNewVibe\n            alwaysFromWord\n            purpose={MortgagePurpose.Primary}\n            locationPlacement='сниппет'\n            offerUrl={snippetURL}\n            gtmSendData={{\n                event: 'nb_ib_form',\n                action: 'send',\n                page_type: 'serp',\n            }}\n            gtmShowData={{\n                event: 'nb_ib_form',\n                action: 'open',\n                page_type: 'serp',\n            }}\n            withoutShowContainer\n            applicationId={ApplicationIdEnum.NewBuildingsDesktop}\n            onClose={onClose}\n            realtyType='ProfOfferFlat'\n            mortgageRegionId={stateParams.mortgageRegionId}\n            propertyCost={stateParams.propertyCost}\n            ownAmount={stateParams.ownAmount}\n            term={stateParams.term}\n            isPreferentialNbCondition\n            showMoreBankIcons\n            isDefaultSelectedOffer\n            mortgageOffers={minimalBanksMortgageOffers}\n        />\n    ) : null;\n}\n","import React from 'react';\n\nimport { Link, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { NativeDate, NewBuildingNews } from '@search/graphql-typings';\nimport { ImageLazySeo } from '../../../../domain/image/lazy/ImageLazySeo';\nimport { NO_PHOTO_SRC, NO_PHOTO_SRC_SET } from '../../../../domain/newbuilding/libs/constants';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'NewsTinyCard');\n\n// eslint-disable-next-line max-len\nexport type NewsTinyItem = Readonly<Omit<NewBuildingNews, 'id' | 'slug' | 'date' | 'subCategories' | 'tags' | 'viewsCount' | 'readTime'>> & { date: Pick<NativeDate, 'formattedShort'> };\n\nexport const NewsTinyCard = ({\n    news,\n    isMobile\n}: {\n    news: NewsTinyItem;\n    isMobile?: boolean;\n}) => (\n    <article className={cn(null, { mobile: isMobile })}>\n        <Link\n            href={news.link}\n            text={false}\n            target='blank'\n        >\n            <div className={cn('imageWrapper')}>\n                <ImageLazySeo\n                    loadingLazy='native'\n                    src={news.images[0] ?? NO_PHOTO_SRC}\n                    srcSet={news.images[0] ? undefined : NO_PHOTO_SRC_SET}\n                    className={cn('image')}\n                    alt={news.title}\n                />\n            </div>\n            <Typography\n                variant='secondary-alone'\n                color='secondary'\n                className={cn('info')}\n            >\n                {news.date.formattedShort}\n                {news.categories[0]?.label ? <>\n                    <span className={cn('info-separator')}>•</span>\n                    {news.categories[0]?.label}\n                </> : null}\n            </Typography>\n\n            <Typography\n                tag='h4'\n                title={news.title}\n                className={cn('title')}\n                bold\n            >\n                {news.title}\n            </Typography>\n        </Link>\n    </article>\n);\n\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport { NewsTinyItem, NewsTinyCard } from '../../../common/components/NewsTinyCard';\nimport Slider from '../../../common/components/Slider';\n\nimport './styles.css';\n\ninterface INewBuildingNews {\n    heading: React.ReactNode;\n    news: NewsTinyItem[];\n    onClickNewsItem?: () => void;\n}\n\nconst cn = classname.bind(null, 'NewBuildingNews');\n\nexport const NewBuildingNews: React.FC<INewBuildingNews> = ({ heading, news, onClickNewsItem }) => (\n    <div className={cn()}>\n        {heading}\n        <div className={cn('content')}>\n            <Slider contentClassName={cn('sliderContent')}>\n                {news.map(item => (\n                    <div\n                        className={cn('item')}\n                        key={item.link}\n                        onClick={onClickNewsItem}\n                    >\n                        <NewsTinyCard\n                            news={item}\n                        />\n                    </div>\n                ))}\n            </Slider>\n        </div>\n    </div>\n);\n\n","import classname from '@search/classname/src';\n\nimport { graphql } from '@search/gql-client/src';\n\nexport type {\n    NewBuildingPromoBannerQuery,\n    NewBuildingPromoBannerQuery$variables as NewBuildingPromoBannerQueryVariables,\n    NewBuildingPromoBannerQuery$data as NewBuildingPromoBannerQueryResponse\n} from './__generated__/NewBuildingPromoBannerQuery.graphql';\n\nexport const cn = classname.bind(null, 'NewBuildingPromoBanner');\n\nexport const query = graphql`\n    query NewBuildingPromoBannerQuery($id: Int!) {\n        newBuilding(id: $id) {\n            gallery {\n                main {\n                    medium\n                    large\n                }\n                images(limit: 1) {\n                    medium\n                }\n            }\n            title {\n                nominative\n            }\n            priceMin(promo: true)\n            routeParams {\n                id\n                name\n                type\n                region\n                regionId\n                subRegion\n            }\n            routes(type: [ METRO ]) {\n                ...on RouteMetro {\n                    station {\n                        name\n                    }\n                }\n            }\n        }\n    }\n`;\n\nexport interface IProps {\n    view: 'offer' | 'nb';\n    id: number;\n    disclaimerList: ReadonlyArray<string>;\n    developerName: string;\n    developerLogo?: string;\n    dataGTM?: {\n        click?: string;\n        phoneClick?: string;\n    };\n}\n","import React, { FunctionComponent } from 'react';\n\nimport { Button, Link, Typography } from '@vtblife/uikit';\nimport { List, ListItem } from '@search/vtbeco-frontend-core/domain/newbuilding/components/common/List';\n\nimport Paper from '@search/vtbeco-ui/src/components/Paper';\n\nimport { formatRange } from '@search/helpers/src/formatNumber';\n\nimport { useGql } from '@search/gql-client/src';\nimport { useGtmOnVisible } from '../../../../domain/google/useGtmOnVisible';\nimport type { DeveloperPromoEventResult } from '../../../../domain/newbuilding/developer-promo/analytics';\nimport { useClassifiedOfferDataLayerPush } from '../../../../domain/offer/analytics/ClassifiedOfferGtmContext';\n\nimport { getNewBuildingLink } from '../../../selectors/get_new_building_link';\nimport {\n    cn, query, IProps,\n    NewBuildingPromoBannerQueryVariables, NewBuildingPromoBannerQueryResponse\n} from '../../../common/components/NewBuildingPromoBanner';\nimport Image from '../../../common/components/Image';\n\nimport './styles.css';\n\nconst NewBuildingPromoBanner: FunctionComponent<IProps & {\n    gtmClickData?: { event: string } | DeveloperPromoEventResult;\n    gtmShowData?: { event: string } | DeveloperPromoEventResult;\n    erid: string;\n}> = ({\n    view,\n    id,\n    developerName,\n    disclaimerList,\n    developerLogo,\n    dataGTM = {},\n    gtmClickData,\n    gtmShowData,\n    erid\n}) => {\n    const res = useGql<NewBuildingPromoBannerQueryVariables, NewBuildingPromoBannerQueryResponse>(query, { id });\n    const dataLayerPush = useClassifiedOfferDataLayerPush();\n\n    const containerRef = React.useRef<HTMLDivElement>(null);\n\n    const onVisible = React.useCallback(() => {\n        gtmShowData && dataLayerPush(gtmShowData);\n    }, [ gtmShowData, dataLayerPush ]);\n\n    useGtmOnVisible({ containerRef, onVisible });\n\n    const newBuilding = res.data?.newBuilding;\n\n    const mainImg = newBuilding?.gallery?.main?.medium;\n    const firstImg = newBuilding?.gallery?.images?.[0]?.medium;\n\n    const { priceMin, routes } = { ...newBuilding };\n\n    const metroName = routes && routes[0]?.station?.name;\n\n    const formattedPriceMin = priceMin ? `${formatRange(priceMin, null, {\n        billionsAsString: true\n    })} ₽` : null;\n\n    const formattedMetroName = (metroName && metroName.length > 0) ? `метро «${metroName}»` : null;\n\n    const listItems = [ formattedPriceMin, formattedMetroName ].filter(Boolean);\n\n    const link = newBuilding ? getNewBuildingLink({\n        id: newBuilding.routeParams.id,\n        type: newBuilding.routeParams.type,\n        name: newBuilding.routeParams.name,\n        regionId: newBuilding.routeParams.regionId,\n        region: newBuilding.routeParams.region,\n        subRegion: newBuilding.routeParams.subRegion\n    }) : '';\n\n    return (\n        <Paper\n            role='button'\n            dataTest='new-building-promo-banner-click'\n            className={cn(null, { view })}\n            onClick={() => gtmClickData && dataLayerPush(gtmClickData)}\n            ref={containerRef}\n        >\n            <div className={cn('badgeWrapper')}>\n                <Typography\n                    variant='small-alone'\n                    color='secondary'\n                >\n                    Реклама\n                </Typography>\n            </div>\n            <div className={cn('gallery')}>\n                {mainImg && (<div\n                    className={cn('image')}\n                    style={{ background: `url(${mainImg}` }}\n                />)}\n                {firstImg && (<div\n                    key={firstImg}\n                    className={cn('image')}\n                    style={{ background: `url(${firstImg}` }}\n                />)}\n            </div>\n            <div className={cn('main')}>\n                <Typography\n                    variant='h3'\n                    color={res.loading ? 'minor' : undefined}\n                >\n                    {newBuilding?.title.nominative ?? '___'}\n                </Typography>\n                { listItems.length ? (\n                    <List\n                        className={cn('info')}\n                        separator={\n                            <Typography\n                                tag='span'\n                                color='blue'\n                                bold\n                            >\n                                •\n                            </Typography>\n                        }\n                    >\n                        {listItems.map((item, index) => (\n                            <ListItem key={index}>\n                                <Typography\n                                    color='blue'\n                                    tag='span'\n                                    bold\n                                >\n                                    {item}\n                                </Typography>\n                            </ListItem>\n                        ))}\n                    </List>\n                ) : null }\n                <div className={cn('extra')}>\n                    <div className={cn('button')}>\n                        <Button\n                            variant='secondary'\n                            fullWidth\n                            size='s'\n                        >\n                            Смотреть квартиры\n                        </Button>\n                    </div>\n                    <div className={cn('disclaimer')}>\n                        {\n                            disclaimerList.map((disclaimer, idx) => (\n                                <Typography\n                                    key={idx}\n                                    variant='tiny-alone'\n                                    color='minor'\n                                >\n                                    <div dangerouslySetInnerHTML={{\n                                        __html: disclaimer\n                                    }} />\n                                </Typography>\n                            ))\n                        }\n                    </div>\n                </div>\n            </div>\n            <Image\n                className={cn('developerLogo', {\n                    [developerName]: true\n                })}\n                url={developerLogo}\n            />\n            <Link\n                dataTest='new-building-promo-banner-link-click'\n                href={! newBuilding ? '#' : `${link}?erid=${erid}`}\n                gtm={dataGTM.click}\n                target='blank'\n            />\n        </Paper>\n    );\n};\n\nexport default NewBuildingPromoBanner;\n","import { regionMapper } from '@search/offer-search-routes/src/mappers/regions';\nimport { SusaninRoute } from '@search/router/src';\n\nexport const getNewBuildingLink = (props: {\n    id: number;\n    type: string;\n    name: string;\n    regionId: number;\n    region: number | string;\n    subRegion?: string | null;\n    relativeUrl?: boolean;\n} | {\n    id?: undefined;\n    slug?: string;\n    subRegion?: string | null;\n    regionId: number;\n    region: number | string;\n    relativeUrl?: boolean;\n}) => {\n    const parts: string[] = [];\n\n    if (props.subRegion) parts.push(props.subRegion);\n    if (props.id !== undefined) parts.push(`${props.type}-${props.name}-${props.id}`);\n    else {\n        if (props.slug) parts.push(props.slug);\n    }\n\n    const route = new SusaninRoute({\n        context: {\n            preferRelativeUrl: props?.relativeUrl,\n            onlyRelativeUrl: props?.relativeUrl\n        }\n    });\n    const regionId = typeof props.region === 'number' ? props.region : props.regionId;\n    const rec = route.regionParams(regionId);\n    let regionSlug = typeof props.region === 'string' ? props.region : regionMapper.typesMap[\n        props.region as keyof typeof regionMapper.Type\n    ] ?? rec.region;\n\n    if (route.isDomainOnlySlug(regionId)) regionSlug = '';\n\n    return `${rec.origin ?? ''}/${regionSlug ? `${regionSlug}/` : ''\n    }novostroyki/${parts.length ? `${parts.join('/')}/` : ''}`;\n};\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport './styles.css';\n\nconst cn = classname.bind(null, 'NavButtons');\n\nexport type ArrowDirection = 'left' | 'right';\n\ninterface IPropsButtonArrow {\n    direction: ArrowDirection;\n}\n\nconst Arrow = ({\n    direction\n}: IPropsButtonArrow) => (\n    <div className={cn('arrow', { direction })}>\n        <svg width='24' height='24' viewBox='0 0 24 24' fill='none'>\n            <path\n                fillRule='evenodd'\n                clipRule='evenodd'\n                // eslint-disable-next-line max-len\n                d='M14.6026 19.2746C15.0013 19.6568 15.6477 19.6568 16.0464 19.2746L16.2648 19.0652C16.6636 18.6831 16.6636 18.0635 16.2648 17.6813L10.3377 12L16.2648 6.31874C16.6635 5.93657 16.6635 5.31695 16.2648 4.93479L16.0464 4.72541C15.6477 4.34324 15.0012 4.34324 14.6025 4.72541L7.96303 11.0895C7.95981 11.0925 7.9566 11.0955 7.95341 11.0986L7.73497 11.308C7.57531 11.461 7.47958 11.6521 7.44779 11.8508C7.40014 12.1483 7.49586 12.4629 7.73494 12.6921L7.95339 12.9014C7.95712 12.905 7.96088 12.9086 7.96466 12.9121L14.6026 19.2746Z'\n                fill='white'\n            />\n        </svg>\n    </div>\n);\n\ninterface IPropsNavButtons {\n    handleClickArrow: (type: ArrowDirection) => void;\n    isLastImage: boolean;\n    isFirstImage: boolean;\n    isActive?: boolean;\n    isClSnippet?: boolean;\n}\n\nconst NavButtons = ({ handleClickArrow, isLastImage, isFirstImage, isActive, isClSnippet }: IPropsNavButtons) => {\n    const handleClickArrowByType = (arrowType: ArrowDirection) => (event: React.MouseEvent) => {\n        event.preventDefault();\n        event.stopPropagation();\n        handleClickArrow(arrowType);\n    };\n\n    return (\n        <div className={cn(undefined, { active: isActive })}>\n            {! isFirstImage && (\n                <button\n                    className={cn('left-btn', { clSnippet: isClSnippet })}\n                    onClick={handleClickArrowByType('left')}\n                    data-test='desktop-snippet-gallery-arrow-left'\n                >\n                    <Arrow direction='left' />\n                </button>\n            )}\n            {! isLastImage && (\n                <button\n                    className={cn('right-btn', { clSnippet: isClSnippet })}\n                    onClick={handleClickArrowByType('right')}\n                    data-test='desktop-snippet-gallery-arrow-right'\n                >\n                    <Arrow direction='right' />\n                </button>\n            )}\n        </div>\n    );\n};\n\nexport default NavButtons;\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport { ImageLazySeo } from '../../../../../../../domain/image/lazy/ImageLazySeo';\nimport { ImageAttributesTypeEnum } from '../../../../../../../enums';\nimport './styles.css';\n\nimport { IImage } from '../index';\n\nconst cn = classname.bind(null, 'GalleryPreview');\n\ninterface IProps extends IImage {\n    originPath?: string;\n    /**\n     * @deprecated baseUrl + originPath\n     */\n    src?: string;\n    /**\n     * @deprecated baseUrl + originPath\n     */\n    src2x?: string;\n    size: 'full' | 'average' | 'minimum' | 'small' | 'least' | 'contain';\n    isFrozen?: boolean;\n    isLast?: boolean;\n    isFirst?: boolean;\n    attributesType?: keyof typeof ImageAttributesTypeEnum | null;\n    restCount: number;\n    itemScope?: boolean;\n    imageDataset?: Record<string, string>;\n    /**\n     * @default 280\n     */\n    resizeImageWidth?: number;\n    /**\n     * @default 210\n     */\n    resizeImageHeight?: number;\n}\n\nfunction GalleryPreview({\n    originPath,\n    src2x,\n    description,\n    size,\n    isFrozen,\n    attributesType,\n    isFirst,\n    isLast,\n    restCount,\n    itemScope,\n    imageDataset,\n    resizeImageWidth = 560,\n    resizeImageHeight = 420\n}: IProps) {\n    return (<>\n        <ImageLazySeo\n            itemScope={itemScope}\n            dataSet={imageDataset}\n            loadingLazy={isFirst ? 'native' : 'io'}\n            className={cn('image', {\n                size,\n                frozen: isFrozen,\n                layout: attributesType === ImageAttributesTypeEnum.LAYOUT\n            })}\n            originPath={originPath}\n            srcWidth={resizeImageWidth}\n            srcHeight={resizeImageHeight}\n            src={src2x}\n            alt={description}\n            title={description}\n        />\n        {isLast && restCount > 0 && (\n            <div\n                className={cn('last-image')}\n                data-test='snippet-gallery-last-photo'\n            >\n                Ещё {restCount} фото\n            </div>\n        )}\n    </>);\n}\n\nexport default GalleryPreview;\n","import React from 'react';\nimport classname from '@search/classname/src';\nimport './styles.css';\nimport { ImageLazySeo } from '../../../../../../../domain/image/lazy/ImageLazySeo';\nimport { IThumbnail } from '../index';\n\nconst cn = classname.bind(null, 'ThumbnailSnippet');\n\ninterface IProps extends IThumbnail {\n    src?: string;\n    baseUrl?: string;\n    originPath?: string;\n    handleSetActiveImageIndex?: () => void;\n    isLast?: boolean;\n    restCount: number;\n    isFrozen?: boolean;\n    withLazyLoad?: boolean;\n}\n\nconst ThumbnailSnippet: React.FC<IProps> = ({\n    src,\n    originPath,\n    handleSetActiveImageIndex = () => { },\n    isLast = false,\n    restCount,\n    isFrozen,\n    withLazyLoad,\n    description\n}) => (\n    <div\n        className={cn()}\n        onMouseEnter={handleSetActiveImageIndex}\n    >\n        <ImageLazySeo\n            // В хроме будет нативный lazy, который нормально предзагружается\n            // В сафари - будет фолбэк до жадной загрузки\n            // withLazyLoad - true только у первого снипета\n            itemProp='thumbnail'\n            loadingLazy={withLazyLoad ? 'native' : undefined}\n            className={cn('item', { frozen: isFrozen })}\n            src={src}\n            srcWidth={90}\n            srcHeight={60}\n            originPath={originPath}\n            alt={description}\n            title={description}\n        />\n        {isLast && (restCount > 0) && (\n            <div className={cn('last')}>\n                +{restCount}\n            </div>\n        )}\n    </div>\n);\n\nexport default ThumbnailSnippet;\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport classname from '@search/classname/src';\nimport Icon from '@vtblife/uikit-icons';\nimport { ImageAttributesTypeEnum } from '../../../../../../enums';\nimport GalleryPreview from './GalleryPreview';\nimport ThumbnailSnippet from './ThumbnailSnippet';\nimport NavButtons, { ArrowDirection } from './NavButtons';\nimport './styles.css';\n\nconst cn = classname.bind(null, 'GallerySnippet');\n\nexport interface IImage {\n    id: string | number;\n    originPath?: string;\n    src?: string;\n    src2x?: string;\n    description: string;\n    attributesType?: keyof typeof ImageAttributesTypeEnum | null;\n}\n\nexport interface IThumbnail extends IImage {\n    preview?: string;\n    preview2x?: string;\n}\n\nexport interface IGallerySnippet {\n    className?: string;\n    pictures: IImage[];\n    onClick?: () => void;\n    onActiveImageChange?: (index: number) => void;\n    isFrozen?: boolean;\n    isVisited?: boolean;\n    withLazyLoad?: boolean;\n    counterEnabled?: boolean;\n    maxPicturesCount?: number;\n    isActive?: boolean;\n    isClSnippet?: boolean;\n    miniImagesEnabled?: boolean;\n    relativeSize?: boolean;\n    imageDataset?: Record<string, string>;\n    previewSize?: 'full' | 'average' | 'below-average' | 'minimum' | 'small' |'least';\n}\n\nconst GallerySnippet: React.FC<IGallerySnippet> = React.memo(({\n    className,\n    children,\n    pictures,\n    onClick,\n    onActiveImageChange,\n    isFrozen,\n    isVisited,\n    withLazyLoad,\n    counterEnabled = false,\n    maxPicturesCount = 4,\n    isActive = false,\n    miniImagesEnabled = true,\n    relativeSize = false,\n    imageDataset,\n    previewSize,\n    isClSnippet\n}) => {\n    const mainRef = useRef<HTMLDivElement | null>(null);\n    const [ activeImageIndex, setActiveImageIndex ] = useState(0);\n    const hasThumbs = pictures.length > 1;\n    const visiblePictures = pictures.slice(0, maxPicturesCount);\n    const lastImageIndex = visiblePictures.length - 1;\n    const restPicturesCount = pictures.length - visiblePictures.length;\n\n    const handleClickArrow = (arrowDirection: ArrowDirection) => {\n        if (arrowDirection === 'left') {\n            // Если эта первая фотография и мы нажимаем влево –  показываем последнее фото\n            const newActiveImageIndex = activeImageIndex === 0 ? lastImageIndex : activeImageIndex - 1;\n\n            setActiveImageIndex(newActiveImageIndex);\n        } else {\n            // Если эта последняя фотография и мы нажимаем вправо –  показываем первое фото\n            const newActiveImageIndex = activeImageIndex === lastImageIndex ? 0 : activeImageIndex + 1;\n\n            setActiveImageIndex(newActiveImageIndex);\n        }\n    };\n\n    const handleSetActiveImageIndex = useCallback((index: number) => () => setActiveImageIndex(index), []);\n    const resetActiveImageIndex = useCallback(() => setActiveImageIndex(0), []);\n\n    useEffect(() => {\n        onActiveImageChange && onActiveImageChange(activeImageIndex);\n    }, [ activeImageIndex, onActiveImageChange ]);\n\n    if (! visiblePictures.length) {\n        return (\n            <div className={cn('empty', { relativeSize })}>\n                <Icon\n                    name='camera-crossed'\n                    size='xl'\n                />\n            </div>\n        );\n    }\n\n    const activeImage = visiblePictures[activeImageIndex] || null;\n    const isLastImage = activeImageIndex === lastImageIndex;\n    const size = previewSize ?? (hasThumbs ? 'minimum' : 'average');\n\n    return (\n        <div\n            ref={mainRef}\n            className={cn(null, { visited: isVisited }, className)}\n            onClick={onClick}\n            onMouseLeave={resetActiveImageIndex}\n        >\n            <div className={cn('preview', { isActive })}>\n                {hasThumbs && (\n                    <NavButtons\n                        isActive={isActive}\n                        isLastImage={isLastImage}\n                        isFirstImage={activeImageIndex === 0}\n                        handleClickArrow={handleClickArrow}\n                        isClSnippet={isClSnippet}\n                    />\n                )}\n                {counterEnabled && pictures.length > 0 ? (\n                    <div className={cn('counter')}>\n                        {activeImageIndex + 1} / {pictures.length}\n                    </div>\n                ) : null}\n                <GalleryPreview\n                    {...activeImage}\n                    itemScope\n                    isLast={isLastImage}\n                    isFirst={activeImageIndex === 0}\n                    restCount={restPicturesCount}\n                    size={size}\n                    isFrozen={isFrozen}\n                    imageDataset={imageDataset}\n                />\n            </div>\n\n            {miniImagesEnabled && visiblePictures.length > 1 && (\n                <div className={cn('list')}>\n                    {visiblePictures.map(\n                        (thumbnail, index) => (\n                            <ThumbnailSnippet\n                                {...thumbnail}\n                                withLazyLoad={withLazyLoad}\n                                key={`${thumbnail.id}-${index}`}\n                                isLast={index === maxPicturesCount - 1}\n                                restCount={restPicturesCount}\n                                handleSetActiveImageIndex={handleSetActiveImageIndex(index)}\n                                isFrozen={isFrozen}\n                            />\n                        )\n                    )}\n                </div>\n            )}\n\n            {children}\n        </div>\n    );\n});\n\nexport default GallerySnippet;\n","import React, { useCallback, ReactNode } from 'react';\nimport Grid from '@vtblife/uikit-grid';\n\nimport { SizeEnum, ModeEnum, Maybe } from '@search/vtbeco-ui/src/types';\n\nimport { ICheckboxProps } from '@search/vtbeco-ui/src/components/controls/Checkbox';\nimport { ICheckboxGroupProps } from '@search/vtbeco-ui/src/components/controls/CheckboxGroup';\n\nexport interface ICheckboxGroupModificationProps {\n    withoutGrid?: boolean;\n    classNameGroup?: string;\n}\n\nexport const CheckboxGroup2: React.FunctionComponent<\n    ICheckboxGroupProps & { colRestriction?: number; isFilter?: boolean } & ICheckboxGroupModificationProps\n> = ({\n    name,\n    value,\n    children,\n    disabled,\n    onChange,\n    mode = ModeEnum.CHECK,\n    size = SizeEnum.S,\n    colRestriction,\n    withoutGrid,\n    classNameGroup,\n    isFilter = false\n}) => {\n    const handleChildCheck = useCallback((\n        checked: boolean,\n        childProps: { name: Maybe<string>; value: Maybe<string | number | readonly string[]>}\n    ) => {\n        let newValue: string | null | string[] = [];\n        const childValue: string = childProps.value as string;\n\n        switch (true) {\n            case (checked && ModeEnum.CHECK === mode):\n                // @ts-ignore\n                newValue = [].concat(value).filter(a => a === 0 || Boolean(a)).concat(childValue);\n                break;\n            case (checked && ModeEnum.RADIO_CHECK === mode):\n            case (checked && ModeEnum.RADIO === mode):\n                newValue = childValue;\n                break;\n            case (! checked && ModeEnum.RADIO === mode):\n                newValue = value;\n                break;\n            case (! checked && ModeEnum.RADIO_CHECK === mode):\n                newValue = null;\n                break;\n            case (! checked && ModeEnum.CHECK === mode):\n                // @ts-ignore\n                newValue = [].concat(value).filter(item => item !== childValue);\n                break;\n            default:\n                newValue = [];\n        }\n\n        onChange(newValue);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ onChange, disabled, value ]);\n\n    const handleChildCheckFilter = useCallback((childValue?: string) => (checked: boolean) => {\n        if (! childValue) {\n            return;\n        }\n\n        let newValue: string | null | string[] = [];\n\n        switch (true) {\n            case (checked && ModeEnum.CHECK === mode):\n                const filteredValue = [ ...value ].filter(a => a !== childValue);\n\n                newValue = [ ...filteredValue, childValue ];\n                break;\n            case (checked && ModeEnum.RADIO_CHECK === mode):\n            case (checked && ModeEnum.RADIO === mode):\n                newValue = [ childValue ];\n                break;\n            case (! checked && ModeEnum.RADIO === mode):\n                newValue = value;\n                break;\n            case (! checked && ModeEnum.RADIO_CHECK === mode):\n            case (! checked && ModeEnum.CHECK === mode):\n                newValue = [ ...value ].filter(a => a !== childValue);\n                break;\n            default:\n                newValue = [];\n        }\n\n        onChange(newValue);\n    }, [ onChange, disabled, value ]);\n\n    const renderChildren = (<>\n        {\n            // @ts-ignore\n            React.Children.map(children, (child: React.ReactElement<ICheckboxProps>): ReactNode => {\n                const checkedValue = isFilter ? child.props.name : child.props.value as string;\n\n                // eslint-disable-next-line\n                const checked = value && checkedValue !== undefined ? value.includes(checkedValue) : false;\n\n                const elemProps = isFilter ? {\n                    ...child.props,\n                    value: checked,\n                    disabled: disabled ?? child.props.disabled,\n                    onChange: handleChildCheckFilter(child.props.name),\n                    radio: mode === ModeEnum.RADIO\n                } : {\n                    ...child.props,\n                    name: `${name ?? ''}-${String(child.props.value ?? '')}`,\n                    checked,\n                    disabled: disabled ?? child.props.disabled,\n                    size: size ?? child.props.size,\n                    onCheck: handleChildCheck\n                };\n                const elem = (\n                    React.cloneElement(child, elemProps as ICheckboxProps)\n                );\n\n                return (\n                    withoutGrid ? <>{elem}</> : <Grid.Cell>{elem}</Grid.Cell>\n                );\n            })\n        }\n    </>);\n\n    if (! children?.length) {\n        return null;\n    }\n\n    return (\n        withoutGrid ? (\n            <div className={classNameGroup}>\n                {renderChildren}\n            </div>\n        ) : (\n            <Grid\n                cols={colRestriction ?? children?.length}\n                variables={{\n                    '--row-gap-xs': '20px',\n                    '--row-gap-s': '20px',\n                    '--row-gap-m': '20px',\n                    '--row-gap-l': '20px',\n                    '--row-gap-xl': '20px',\n                    '--column-gap-xs': '20px',\n                    '--column-gap-s': '20px',\n                    '--column-gap-m': '20px',\n                    '--column-gap-l': '20px',\n                    '--column-gap-xl': '20px'\n                }}\n            >\n                {renderChildren}\n            </Grid>\n        )\n    );\n};\n","import React from 'react';\nimport { forwardRef, ReactNode, memo, ReactChild, MouseEventHandler } from 'react';\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport type FilterSelectButtonBorderSide = 'square' | 'rounded_square' | 'square_rounded';\nexport type FilterSelectSize = 'm' | 'l' | 'xl';\n\ninterface FilterSelectButtonProps {\n    dataTest?: string;\n    children: ReactChild | undefined;\n    icon?: ReactNode;\n    focused?: boolean;\n    className?: string;\n    size?: FilterSelectSize;\n    side?: FilterSelectButtonBorderSide;\n    onClick?: MouseEventHandler<HTMLButtonElement>;\n    style?: object;\n}\n\nconst cnFilterSelectButton = classname.bind(null, 'FilterSelectButton');\n\nexport const FilterSelectButton = memo(\n    forwardRef<HTMLButtonElement, FilterSelectButtonProps>(({\n        focused,\n        side,\n        icon,\n        size,\n        className,\n        dataTest,\n        ...props\n    }, ref) => {\n        return (\n            <button\n                {...props}\n                ref={ref}\n                className={cnFilterSelectButton(null, {\n                    side,\n                    size,\n                    focused\n                }, className)}\n                data-test={dataTest}\n            >\n                <span className={cnFilterSelectButton('text')}>\n                    {props.children}\n                </span>\n                {icon}\n            </button>\n        );\n    })\n);\n","import React, { useCallback } from 'react';\nimport { NumberInput, Group } from '@vtblife/uikit';\n\nimport { IRange, RangeValue } from '../../../types/IRange';\n\nexport enum NumberFormats {\n    /**\n     * С разделителями (пробелы)\n     */\n    Default = 'DEFAULT',\n    /**\n     * Без разделителей\n     */\n    OrdinalNumber = 'ORDINAL_NUMBER',\n}\n\nexport interface IRangeInputProps {\n    size?: 's' | 'm' | 'l';\n    valueFrom: number|null;\n    valueTo: number|null;\n    type?: 'text' | 'number';\n    unit?: string;\n    fromPostfix?: string;\n    className?: string;\n    onChange: (range: IRange<RangeValue>) => void;\n    fromLabel?: string;\n    toLabel?: string;\n    focusFrom?: (e: React.SyntheticEvent) => void;\n    focusTo?: (e: React.SyntheticEvent) => void;\n    format?: NumberFormats;\n    nameFrom?: string;\n    nameTo?: string;\n    max?: number;\n    disabled?: boolean;\n}\n\nexport const RangeInput: React.FC<IRangeInputProps> = ({\n    size = 'm',\n    valueFrom,\n    valueTo,\n    unit,\n    fromPostfix,\n    fromLabel = 'от',\n    toLabel = 'до',\n    focusFrom = () => {},\n    focusTo = () => {},\n    onChange,\n    format = NumberFormats.Default,\n    nameFrom = 'from',\n    nameTo = 'to',\n    max = 1_000_000_000_000,\n    disabled = false\n}) => {\n    const formatOnChange = useCallback((value: string | null | number) => {\n        const v = Number((value ?? 0).toString().replace(/\\s/g, ''));\n\n        return (v !== 0 && ! isNaN(v)) ? v : null;\n    }, [ ]);\n\n    const handleChangeRangeFrom = useCallback(\n        (value: null | number) => {\n            onChange({\n                from: formatOnChange(value),\n                to: formatOnChange(valueTo)\n            });\n        },\n        [ valueTo, onChange, formatOnChange ]\n    );\n\n    const handleChangeRangeTo = useCallback(\n        (value: null | number) => {\n            onChange({\n                from: formatOnChange(valueFrom),\n                to: formatOnChange(value)\n            });\n        },\n        [ valueFrom, onChange, formatOnChange ]\n    );\n\n    return (\n        <Group size={size}>\n            <NumberInput\n                size={size}\n                type='text'\n                separator={format === NumberFormats.Default}\n                name={nameFrom}\n                placeholder={fromLabel}\n                postfix={fromPostfix}\n                onFocus={focusFrom}\n                inputMode='numeric'\n                value={valueFrom ?? undefined}\n                onChange={handleChangeRangeFrom}\n                max={max}\n                disabled={disabled}\n            />\n            <NumberInput\n                size={size}\n                name={nameTo}\n                type='text'\n                separator={format === NumberFormats.Default}\n                placeholder={toLabel}\n                postfix={unit}\n                onFocus={focusTo}\n                inputMode='numeric'\n                value={valueTo ?? undefined}\n                onChange={handleChangeRangeTo}\n                max={max}\n                disabled={disabled}\n            />\n        </Group>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { IRangeInputProps, RangeInput } from '../NewRangeInput/RangeInput';\nimport { INumberRange } from '../../../types/IRange';\n\ninterface INumberInputRangeProps extends Omit<IRangeInputProps, 'value' | 'onChange' | 'valueFrom' | 'valueTo'> {\n    value?: INumberRange;\n    onChange: (value: INumberRange) => void;\n    disabled?: boolean;\n}\n\nexport const NumberInputRange: React.FC<INumberInputRangeProps> = ({\n    value,\n    onChange,\n    disabled = false,\n    ...rangeInputProps\n}) => {\n    const handleChange = useCallback(({ from, to }: INumberRange) => {\n        onChange({\n            from,\n            to\n        });\n    }, [ onChange ]);\n\n    return (\n        <RangeInput\n            valueFrom={value ? value.from : null}\n            valueTo={value ? value.to : null}\n            onChange={handleChange}\n            disabled={disabled}\n            {...rangeInputProps}\n        />\n    );\n};\n","import React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport './Filter.css';\n\nconst cn = classname.bind(null, 'Filter');\n\ninterface IProps {\n    className?: string;\n    filterTitle?: string;\n}\n\nexport const Filter: React.FC<IProps> = ({ className, filterTitle, children }) => (\n    <div className={className}>\n        <div className={cn('filter-title')}>\n            <Typography\n                variant='secondary-alone'\n                color='secondary'\n            >\n                {filterTitle}\n            </Typography>\n        </div>\n        <div>\n            {children}\n        </div>\n    </div>\n);\n","import React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport './MobileFilter.css';\n\nconst cn = classname.bind(null, 'MobileFilter');\n\ninterface IProps {\n    filterTitle?: string;\n    className?: string;\n}\n\nfunction MobileFilterTitle({ children }: { children: React.ReactChild }) {\n    return (\n        <Typography\n            variant='secondary-alone'\n            color='secondary'\n            className={`col-xs-12 ${cn('filter-title')}`}\n        >\n            {children}\n        </Typography>\n    );\n}\n\nconst MobileFilter: React.FC<IProps> = ({ filterTitle, children, className }) => {\n    return (\n        <>\n            {filterTitle && (<MobileFilterTitle>{filterTitle}</MobileFilterTitle>)}\n            <div className={className}>\n                {children}\n            </div>\n        </>\n    );\n};\n\nexport default MobileFilter;\n","import './MobileFilter2.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MobileFilter2');\n\ninterface IProps {\n    filterTitle?: string | React.ReactNode;\n    className?: string;\n    childrenClassName?: string;\n    dataTestId?: string;\n    desktopTitleGap?: boolean;\n}\n\nexport const MobileFilter2: React.FC<IProps> = ({\n    filterTitle,\n    children,\n    className,\n    desktopTitleGap,\n    dataTestId = null,\n    childrenClassName\n}) => {\n    return filterTitle ? (\n        <div className={className} data-testid={dataTestId}>\n            {filterTitle && (\n                <Typography\n                    variant='secondary-alone'\n                    color='secondary'\n                    className={cn('filter-title', { desktopTitleGap }, className)}\n                >\n                    {filterTitle}\n                </Typography>\n            )}\n            <div className={childrenClassName}>\n                {children}\n            </div>\n        </div>\n    ) : (\n        <div className={childrenClassName ?? className} data-testid={dataTestId}>\n            {children}\n        </div>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\nimport { IsApartmentsOptions } from '@search/filter-enums/enums/IsApartmentsOptions';\n\nimport { ApartmentFilter } from '../../../models/Filter';\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../common/CheckboxGroup2';\n\ninterface IApartmentFilterProps {\n    filter: ApartmentFilter;\n    handleChange: (filter: ApartmentFilter) => void;\n}\n\nconst apartmentsMapping: Record<string, string> = {\n    [IsApartmentsOptions.APARTMENTS_ONLY]: 'Апартаменты',\n    [IsApartmentsOptions.NO_APARTMENTS]: 'Без апартаментов'\n};\n\nconst apartmentEnumeration: IsApartmentsOptions[] = [\n    IsApartmentsOptions.APARTMENTS_ONLY,\n    IsApartmentsOptions.NO_APARTMENTS\n];\n\nexport const DesktopApartmentFilterView: React.FC<IApartmentFilterProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        handleChange(new ApartmentFilter(val));\n    }, [ handleChange ]);\n\n    const component = apartmentEnumeration.map(apartment => {\n        return (\n            <Checkbox\n                variant='filter'\n                key={apartment}\n                name={String(apartment)}\n                block\n            >\n                {apartmentsMapping[apartment]}\n            </Checkbox>\n        );\n    });\n\n    return (\n        <Filter2 filterTitle='Апартаменты'>\n            <CheckboxGroup2\n                mode='radio-check'\n                name='apartment'\n                onChange={onChange}\n                value={[ filter.isApartment ].map(elem => String(elem))}\n                isFilter\n            >\n                {component}\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { AreaFilter } from '../../../models/Filter';\nimport { INumberRange } from '../../../types/IRange';\nimport { MobileFilter2 } from '../../filter/MobileFilter2';\n\ninterface IAreaFilterProps extends IFilterAvailableProps {\n    filter: AreaFilter;\n    handleChange: (value: AreaFilter) => void;\n    isMobile?: boolean;\n}\n\nexport const AreaFilterView: React.FC<IAreaFilterProps> = ({\n    filter,\n    handleChange,\n    withoutTitle,\n    isMobile\n}) => {\n    const handleAreaChange = useCallback((value: INumberRange) => {\n        handleChange(new AreaFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter2 desktopTitleGap={! isMobile} filterTitle={withoutTitle ? undefined : 'Площадь'} dataTestId='AreaFilterView'>\n            <NumberInputRange\n                size={Size.Small}\n                unit='м²'\n                fromPostfix='м²'\n                value={filter.value}\n                onChange={handleAreaChange}\n                nameFrom='areaFrom'\n                nameTo='areaTo'\n                max={100_000}\n            />\n        </MobileFilter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\n\nimport { Bathroom } from '@search/filter-enums/enums/Bathroom';\n\nimport { BathroomFilter } from '../../../models/Filter';\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../common/CheckboxGroup2';\n\ntype BathroomEnumForUi = Exclude<Bathroom, Bathroom.UNKNOWN>;\ninterface IBathroomFilterProps {\n    filter: BathroomFilter;\n    handleChange: (value: BathroomFilter) => void;\n    several?: boolean;\n}\n\nconst bathroomMapping: Record<BathroomEnumForUi, string> = {\n    [Bathroom.COMBINED]: 'Совмещённый',\n    [Bathroom.PARTED]: 'Раздельный',\n    [Bathroom.SEVERAL]: 'Несколько'\n};\n\nconst bathroomEnumeration: BathroomEnumForUi[] = [\n    Bathroom.COMBINED,\n    Bathroom.PARTED\n];\n\nexport const BathroomFilterView: React.FC<IBathroomFilterProps> = ({\n    filter,\n    handleChange,\n    several = false\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new BathroomFilter(value));\n    }, [ handleChange ]);\n    const component = bathroomEnumeration.map(bathroom => {\n        return (\n            <Checkbox\n                variant='filter'\n                key={bathroom}\n                name={bathroom}\n                block\n            >\n                {bathroomMapping[bathroom]}\n            </Checkbox>\n        );\n    });\n\n    several && component.push(\n        <Checkbox\n            variant='filter'\n            key={Bathroom.SEVERAL}\n            value={Bathroom.SEVERAL}\n            block\n        >\n            {bathroomMapping[Bathroom.SEVERAL]}\n        </Checkbox>\n    );\n\n    return (\n        <Filter2 filterTitle='Санузел'>\n            <CheckboxGroup2\n                mode='check'\n                onChange={onChange}\n                name='bathroom'\n                value={filter.value as unknown as string[]}\n                isFilter\n            >\n                {component}\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\nimport { CeilingHeight } from '@search/filter-enums/enums/CeilingHeight';\n\nimport { CellHeightFilter } from '../../../models/Filter';\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../common/CheckboxGroup2';\n\ninterface ICeilHeightFilterProps {\n    filter: CellHeightFilter;\n    handleChange: (value: CellHeightFilter) => void;\n}\n\nconst ceilHeightEnumeration = [\n    { title: '2,5 м', value: CeilingHeight.FROM_2_5 },\n    { title: '2,7 м', value: CeilingHeight.FROM_2_7 },\n    { title: '3 м', value: CeilingHeight.FROM_3 },\n    { title: '4 м', value: CeilingHeight.FROM_4 }\n];\n\nexport const CeilHeightFilterView: React.FC<ICeilHeightFilterProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new CellHeightFilter(Number(value)));\n    }, [ handleChange ]);\n\n    const component = ceilHeightEnumeration.map((height, i) => {\n        return (\n            <Checkbox\n                variant='filter'\n                key={height.value}\n                name={height.value}\n                block\n            >\n                от {height.title}\n            </Checkbox>\n        );\n    });\n    const value = (filter.value) ? [ filter.value ] : [];\n\n    return (\n        <Filter2 filterTitle='Высота потолков'>\n            <CheckboxGroup2\n                mode='radio-check'\n                onChange={onChange}\n                name='ceilHeight'\n                value={value}\n                isFilter\n            >\n                {component}\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\nimport CheckboxGroup from '@search/vtbeco-ui/src/components/controls/CheckboxGroup';\nimport Checkbox from '@search/vtbeco-ui/src/components/controls/Checkbox';\n\nexport type MultiSelectValue = string[] | number[] | null;\n\nexport interface MultiSelectOption<Value> {\n    label: string;\n    value: Value;\n    className?: string;\n    disabled?: boolean;\n    description?: string;\n}\n\nexport function MultiSelect<Value, Option extends MultiSelectOption<Value>>({\n    value,\n    name,\n    className,\n    dataTest,\n    options,\n    handleChange: onChange\n}: {\n    value?: Value[];\n    name: string;\n    dataTest?: string;\n    className?: string;\n    options: Option[];\n    handleChange: (value: Value[], oldValue?: Value[]) => void;\n}) {\n    const handleChange = useCallback((newValue: Value[] | null) => {\n        if (newValue === null) {\n            return;\n        }\n\n        onChange(newValue, value);\n    }, [ onChange, value ]);\n\n    const component =\n        options.map(({\n            label,\n            value: optionValue,\n            className: optionClassname,\n            description,\n            disabled,\n            ...rest\n        }) => {\n            return (<Checkbox\n                width='max'\n                disabled={disabled}\n                type='button'\n                view='primary'\n                tone='secondary'\n                key={String(optionValue)}\n\n                // @ts-ignore\n                value={optionValue}\n                className={optionClassname}\n                {...rest}\n            >\n                {label}\n            </Checkbox>);\n        });\n\n    return (\n        <CheckboxGroup\n            className={className}\n            dataTest={dataTest}\n            mode='check'\n            // @ts-ignore\n            onChange={handleChange}\n            name={name}\n            // @ts-ignore\n            value={value}>\n            {component}\n        </CheckboxGroup>\n    );\n}\n","import React, { useCallback } from 'react';\nimport CheckboxGroup from '@search/vtbeco-ui/src/components/controls/CheckboxGroup';\nimport Checkbox from '@search/vtbeco-ui/src/components/controls/Checkbox';\n\nexport type RadioValue = string | number | null | undefined;\n\nexport interface RadioOption {\n    label: string;\n    value: RadioValue;\n    className?: string;\n    disabled?: boolean;\n}\n\ninterface RadioSelectProps {\n    value: RadioValue | null;\n    name: string;\n    className?: string;\n    options: RadioOption[];\n    allowNull?: boolean;\n    handleChange: (value: RadioValue, oldValue: RadioValue) => void;\n}\n\nexport const RadioSelect: React.FC<RadioSelectProps> = ({\n    value,\n    name,\n    className,\n    options,\n    allowNull = false,\n    handleChange: onChange\n}) => {\n    const handleChange = useCallback((newValue: string[] | string | number | null) => {\n        if (! allowNull && newValue === null) {\n            return;\n        }\n\n        onChange(newValue as RadioValue, value);\n    }, [ onChange, value ]);\n    const component =\n        options.map(({\n            label,\n            value: optionValue,\n            className: optionClassname,\n            disabled\n        }) => {\n            return (\n                <Checkbox\n                    className={optionClassname}\n                    width='max'\n                    disabled={disabled}\n                    type='button'\n                    view='primary'\n                    tone='secondary'\n                    // @ts-ignore\n                    key={optionValue}\n                    // @ts-ignore\n                    value={optionValue}\n                >\n                    {label}\n                </Checkbox>\n            );\n        });\n\n    return (\n        <CheckboxGroup\n            className={className}\n            mode='radio-check'\n            onChange={handleChange}\n            name={name}\n            // @ts-ignore\n            value={[ value ]}>\n            {component}\n        </CheckboxGroup>\n    );\n};\n","import React, { useCallback } from 'react';\nimport upperFirst from 'lodash/upperFirst';\n\nimport { NumberInput, Typography } from '@vtblife/uikit';\nimport { Dropdown, Size } from '@vtblife/uikit/legacy';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\nimport { INumberRange } from '@search/vtbeco-frontend-core/view/filters/types/IRange';\nimport { formatRange } from '@search/helpers/src/formatNumber';\n\nimport {\n    IFilter, AreaFilter, LivingAreaFilter, KitchenAreaFilter\n} from '../../../../models/Filter';\n\nimport { FilterSelectButton } from '../../../common/FilterSelect';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\nimport './DesktopAreaFilterView.css';\n\nconst cn = classname.bind(null, 'DesktopAreaFilterView');\n\nconst formatAreaRange = (\n    { from, to }: INumberRange,\n    prefix: string = ''\n) => {\n    const range = formatRange(from, to);\n\n    return range ? `${prefix}${range} м²` : range;\n};\n\nconst makeTitle = (\n    totalArea: INumberRange,\n    livingArea: INumberRange,\n    kitchenArea: INumberRange\n) => {\n    const labels = [];\n    const totalAreaString = formatAreaRange(totalArea);\n\n    if (totalAreaString) {\n        labels.push(totalAreaString);\n    }\n\n    const livingAreaString = formatAreaRange(livingArea, 'жилая ');\n\n    if (livingAreaString) {\n        labels.push(livingAreaString);\n    }\n\n    const kitchenAreaString = formatAreaRange(kitchenArea, 'кухня ');\n\n    if (kitchenAreaString) {\n        labels.push(kitchenAreaString);\n    }\n\n    const title = labels.join(', ');\n\n    if (totalAreaString) {\n        return title;\n    }\n\n    if (livingAreaString || kitchenAreaString) {\n        return upperFirst(title);\n    }\n\n    return 'Площадь';\n};\n\ninterface IDesktopAreaFilterViewProps {\n    totalAreaFilter: AreaFilter;\n    livingAreaFilter: LivingAreaFilter;\n    kitchenAreaFilter: KitchenAreaFilter;\n    onChange: (filter: IFilter[]) => void;\n}\n\nexport const DesktopAreaFilterView: React.FC<IDesktopAreaFilterViewProps> = ({\n    totalAreaFilter,\n    livingAreaFilter,\n    kitchenAreaFilter,\n    onChange\n}) => {\n    const { value: totalArea } = totalAreaFilter;\n    const { value: livingArea } = livingAreaFilter;\n    const { value: kitchenArea } = kitchenAreaFilter;\n\n    const handleTotalAreaChange = useCallback((total: INumberRange) => onChange([\n        new AreaFilter(total)\n    ]), [ onChange ]);\n\n    const handleLivingAreaChange = useCallback((living: INumberRange) => onChange([\n        new LivingAreaFilter(living)\n    ]), [ onChange ]);\n\n    const handleKitchenAreaChange = useCallback((kitchenFrom: number) => onChange([\n        new KitchenAreaFilter({\n            from: kitchenFrom,\n            to: null\n        })\n    ]), [ onChange ]);\n\n    const handleReset = useCallback(() => onChange([\n        new AreaFilter(),\n        new LivingAreaFilter(),\n        new KitchenAreaFilter()\n    ]), [ onChange ]);\n\n    return (\n        <Dropdown renderTrigger={\n            ({ isOpen, handleToggle, triggerRef }) => (\n                <FilterSelectButton\n                    size='l'\n                    side='square'\n                    ref={triggerRef}\n                    onClick={handleToggle}\n                    focused={isOpen}\n                    icon={<Icon name={isOpen ? 'chevron-up' : 'chevron-down'} size='s' />}\n                    style={{ position: 'relative' }}\n                >\n                    <div className={cn('selectTitle')}>\n                        {makeTitle(totalArea, livingArea, kitchenArea)}\n                    </div>\n                </FilterSelectButton>\n            )\n        }>\n            <div className={cn('popup')}>\n                <div\n                    onClick={handleReset}\n                    className={cn('reset')}\n                >\n                    <Typography\n                        tag='span'\n                        className={cn('resetLink')}\n                    >\n                        Сбросить\n                    </Typography>\n                </div>\n                <Typography\n                    variant='primary'\n                    className={cn('title', { name: 'total' })}\n                >\n                    Площадь\n                </Typography>\n                <div className={cn('filter', { name: 'total' })}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        unit='м²'\n                        value={totalArea}\n                        onChange={handleTotalAreaChange}\n                        max={100_000}\n                    />\n                </div>\n                <Typography\n                    variant='primary'\n                    className={cn('title', { name: 'living' })}\n                >\n                    Жилая\n                </Typography>\n                <div className={cn('filter', { name: 'living' })}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        unit='м²'\n                        value={livingArea}\n                        onChange={handleLivingAreaChange}\n                        max={100_000}\n                    />\n                </div>\n                <Typography\n                    variant='primary'\n                    className={cn('title', { name: 'kitchen' })}\n                >\n                    Кухня\n                </Typography>\n                <div className={cn('filter', { name: 'kitchen' })}>\n                    <NumberInput\n                        value={kitchenArea.from ?? undefined}\n                        postfix='м²'\n                        onChange={handleKitchenAreaChange}\n                        size={Size.Small}\n                        name='kitchenAreaFrom'\n                        max={100_000}\n                        type='text'\n                        placeholder='от'\n                    />\n                </div>\n            </div>\n        </Dropdown>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport classname from '@search/classname/src';\nimport { Checkbox } from '@vtblife/uikit';\nimport { BalconyOptions } from '@search/filter-enums/enums/BalconyOptions';\n\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { BalconyFilter } from '../../../../models/Filter';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst cn = classname.bind(null, 'DesktopBalconyFilterView');\n\ninterface IBalconyFilterProps {\n    filter: BalconyFilter;\n    handleChange: (filter: BalconyFilter) => void;\n}\n\nexport const DesktopBalconyFilterView: React.FC<IBalconyFilterProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            handleChange(new BalconyFilter());\n        }\n        if (Array.isArray(val)) {\n            const value = val.includes(BalconyOptions.HAS_ANY);\n\n            if (value) {\n                handleChange(new BalconyFilter(BalconyOptions.HAS_ANY));\n            } else {\n                handleChange(new BalconyFilter());\n            }\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Балкон/лоджия'>\n            <CheckboxGroup2\n                mode='check'\n                onChange={onChange}\n                name='balcony'\n                className={cn('checkbox-group')}\n                value={[ filter.hasBalcony ]}\n                isFilter\n            >\n                {\n                    [ <Checkbox\n                        variant='filter'\n                        key={'balcony'}\n                        name={BalconyOptions.HAS_ANY}\n                        block\n                    >\n                        Балкон\n                    </Checkbox> ]\n\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Button } from '@vtblife/uikit';\n\nimport { FilterSelectButton } from '../../../common/FilterSelect';\n\ninterface IDesktopBuildingsFilterViewProps {\n    standalone?: boolean;\n    showBuildingPicker: () => void;\n}\n\nexport const DesktopBuildingsFilterView: React.FC<IDesktopBuildingsFilterViewProps> = ({\n    standalone: isStandalone = false,\n    showBuildingPicker\n}) => {\n    const handleClick = useCallback(showBuildingPicker, [ showBuildingPicker ]);\n\n    if (isStandalone) {\n        return (\n            <Button\n                variant='secondary'\n                icon='map'\n                onClick={handleClick}\n            >\n                Выбрать корпус\n            </Button>\n        );\n    }\n\n    return (\n        <FilterSelectButton\n            size='l'\n            side='square'\n            onClick={handleClick}\n            style={{ position: 'relative' }}\n        >\n            Выбрать корпус\n        </FilterSelectButton>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { quarters } from '@search/helpers/src/quarters';\nimport { Commissioning, Quarter } from '@search/filter-enums/enums';\n\nimport { CommissioningFilter } from '../../../../models/Filter';\nimport { SlimSelect } from '../../../../../common/components/SlimSelect/SlimSelect';\n\nconst defaultOptions = [\n    {\n        value: Commissioning.UNKNOWN,\n        label: 'Любой'\n    },\n    {\n        value: Commissioning.COMMISSIONED,\n        label: 'Сдан'\n    },\n    {\n        value: Commissioning.IN_PROGRESS,\n        label: 'Строится'\n    },\n    ...quarters()\n        .map(({ quarter, year }) => ({\n            value: `${Quarter[quarter]}_${year}`,\n            label: `До ${quarter} кв. ${year}`\n        }))\n];\n\ninterface IDesktopCommissioningFilterViewProps {\n    filter: CommissioningFilter;\n    onChange: (filter: CommissioningFilter) => void;\n    options?: { value: string; label: string }[];\n}\n\nexport const DesktopCommissioningFilterView: React.FC<IDesktopCommissioningFilterViewProps> = ({\n    filter,\n    onChange,\n    options = defaultOptions\n}) => {\n    let { commissioning } = filter;\n\n    const handleChange = useCallback(\n        (val: string) => {\n            onChange(new CommissioningFilter(val));\n        },\n        [ onChange ]\n    );\n\n    if (! options.some(({ value }) => value === commissioning)) {\n        commissioning = Commissioning.UNKNOWN;\n    }\n\n    return (\n        <SlimSelect\n            forcePlaceholder={commissioning === Commissioning.UNKNOWN}\n            placeholder='Срок сдачи'\n            size='s'\n            options={options}\n            value={commissioning}\n            onChange={handleChange}\n            height={400}\n            dataTest='commissioning'\n            adaptivePlacement={false}\n            adaptiveHeight={false}\n        />\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { CommissioningListFilter } from '../../../../models/Filter';\nimport { SlimMultiSelect } from '../../../../../common/components/SlimSelect/SlimMultiSelect';\n\ninterface IDesktopCommissioningListFilterViewProps {\n    filter: CommissioningListFilter;\n    onChange: (filter: CommissioningListFilter) => void;\n    options: { value: string; label: string }[];\n}\n\nexport const DesktopCommissioningListFilterView: React.FC<IDesktopCommissioningListFilterViewProps> = ({\n    filter,\n    onChange,\n    options\n}) => {\n    const { commissioningList } = filter;\n\n    const handleChange = useCallback(\n        (val: string[]) => {\n            onChange(new CommissioningListFilter(val));\n        },\n        [ onChange ]\n    );\n\n    return (\n        <SlimMultiSelect\n            dataTest='commissioning'\n            placeholder='Срок сдачи'\n            forcePlaceholder={commissioningList.length === 0}\n            size='s'\n            options={options}\n            value={commissioningList}\n            onChange={handleChange}\n            height={400}\n            adaptivePlacement={false}\n            adaptiveHeight={false}\n        />\n    );\n};\n","import React, { useCallback } from 'react';\nimport { FinishingBuildingEnum, SelectFinishingFlatOption } from '@search/graphql-typings';\n\nimport { FinishingFlatFilter } from '../../../../models/Filter';\nimport { SlimMultiSelect } from '../../../../../common/components/SlimSelect/SlimMultiSelect';\n\ninterface IProps {\n    filter: FinishingFlatFilter;\n    onChange: (filter: FinishingFlatFilter) => void;\n    options: SelectFinishingFlatOption[];\n}\n\n/**\n * Фильтр \"Отделка\" в разделе \"Квартиры и корпуса\" на карточке ЖК\n * */\nexport const DesktopFinishingFlatTypeFilterView: React.FC<IProps> = ({\n    filter,\n    onChange,\n    options\n}) => {\n    const handleChange = useCallback((newValue: FinishingBuildingEnum[]) => onChange(\n        new FinishingFlatFilter({\n            finishingType: newValue\n        })\n    ), [ onChange ]);\n\n    const { finishingType } = filter.value;\n\n    return (\n        <SlimMultiSelect<FinishingBuildingEnum>\n            placeholder='Отделка'\n            forcePlaceholder={finishingType.length === 0}\n            size='s'\n            options={options}\n            value={finishingType}\n            onChange={handleChange}\n            dataTest='finishingFlat'\n            adaptivePlacement={false}\n            adaptiveHeight={false}\n        />\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { FinishingEnum, FinishingTypeEnum } from '@search/graphql-typings';\n\nimport { FinishingTypeFilter, allWithFinishingValues } from '../../../../models/Filter';\nimport { SlimMultiSelect } from '../../../../../common/components/SlimSelect/SlimMultiSelect';\n\nconst SELECT_OPTIONS = [\n    {\n        value: FinishingTypeEnum.WithoutFinishing,\n        label: 'Без отделки'\n    },\n    {\n        value: FinishingTypeEnum.PreFinishing,\n        label: 'Предчистовая'\n    },\n    {\n        value: FinishingTypeEnum.Fine,\n        label: 'Чистовая'\n    },\n    {\n        value: FinishingTypeEnum.WithFurniture,\n        label: 'С мебелью'\n    },\n];\n\ninterface IProps {\n    filter: FinishingTypeFilter;\n    onChange: (filter: FinishingTypeFilter) => void;\n}\n\n/**\n * Фильтр \"Тип отделки\"\n* */\nexport const DesktopFinishingTypeFilterView: React.FC<IProps> = ({\n    filter,\n    onChange\n}) => {\n    const { finishingType } = filter.value;\n\n    const handleChange = useCallback((values: FinishingTypeEnum[]) => {\n        const hasAllAvailableValues = new Set([ ...values, ...allWithFinishingValues ]).size === allWithFinishingValues.length && values.length === allWithFinishingValues.length;\n\n        onChange(new FinishingTypeFilter({\n            hasFinishing: hasAllAvailableValues ? FinishingEnum.Available : undefined,\n            finishingType: values\n        }));\n    }, [ onChange ]);\n\n    return (\n        <SlimMultiSelect\n            placeholder='Тип отделки'\n            dataTest='finishingType'\n            size='s'\n            options={SELECT_OPTIONS}\n            value={finishingType}\n            onChange={handleChange}\n            adaptivePlacement={false}\n            adaptiveHeight={false}\n        />\n    );\n};\n","import React, { useCallback } from 'react';\nimport upperFirst from 'lodash/upperFirst';\n\nimport { Dropdown, Typography } from '@vtblife/uikit';\nimport { Checkbox, Size } from '@vtblife/uikit/legacy';\n\nimport classname from '@search/classname/src';\nimport { FloorConstraints } from '@search/filter-enums/enums';\nimport { INumberRange } from '@search/vtbeco-frontend-core/view/filters/types/IRange';\n\nimport { formatRange } from '@search/helpers/src/formatNumber';\n\nimport { FloorFilter } from '../../../../models/Filter';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\nimport './DesktopFloorFilterView.css';\n\nconst cn = classname.bind(null, 'DesktopFloorFilterView');\n\nconst floorConstraintsPrefixes = {\n    [FloorConstraints.UNKNOWN]: null,\n    [FloorConstraints.ONLY]: 'только',\n    [FloorConstraints.EXCLUDE]: 'не'\n};\n\nconst makeTitle = (\n    { from, to }: INumberRange,\n    first: FloorConstraints,\n    last: FloorConstraints\n): string => {\n    const labels = [];\n    const rangeString = formatRange(from, to);\n\n    if (rangeString) {\n        labels.push(rangeString);\n    }\n\n    const lastPrefix = floorConstraintsPrefixes[last];\n\n    if (lastPrefix) {\n        labels.push(`${lastPrefix} последний`);\n    }\n\n    const firstPrefix = floorConstraintsPrefixes[first];\n\n    if (firstPrefix) {\n        labels.push(`${firstPrefix} первый`);\n    }\n\n    const title = labels.join(', ');\n\n    if (rangeString) {\n        return `Этаж ${title}`;\n    }\n\n    if (firstPrefix || lastPrefix) {\n        return `${upperFirst(title)} этаж`;\n    }\n\n    return 'Этаж';\n};\n\ninterface IDesktopAreaFilterViewProps {\n    filter: FloorFilter;\n    onChange: (filter: FloorFilter) => void;\n}\n\nexport const DesktopFloorFilterView: React.FC<IDesktopAreaFilterViewProps> = ({\n    filter,\n    onChange\n}) => {\n    const { range, first, last } = filter;\n\n    const handleRangeChange = useCallback((value: INumberRange) => onChange(\n        new FloorFilter(value, first, last)\n    ), [ onChange, first, last ]);\n\n    const handleLastOnlyChange = useCallback((checked: boolean) => onChange(\n        new FloorFilter(range, first, checked ? FloorConstraints.ONLY : FloorConstraints.UNKNOWN)\n    ), [ onChange, range, first ]);\n\n    const handleLastExcludeChange = useCallback((checked: boolean) => onChange(\n        new FloorFilter(range, first, checked ? FloorConstraints.EXCLUDE : FloorConstraints.UNKNOWN)\n    ), [ onChange, range, first ]);\n\n    const handleFirstExcludeChange = useCallback((checked: boolean) => onChange(\n        new FloorFilter(range, checked ? FloorConstraints.EXCLUDE : FloorConstraints.UNKNOWN, last)\n    ), [ onChange, range, last ]);\n\n    const handleReset = useCallback(() => onChange(\n        new FloorFilter()\n    ), [ onChange ]);\n\n    return (<Dropdown>\n        <Dropdown.Control\n            arrow\n            size='s'\n        >{makeTitle(range, first, last)}</Dropdown.Control>\n\n        <Dropdown.Content placement='local'>\n            <div className={cn('popup')}>\n                <div\n                    onClick={handleReset}\n                    className={cn('reset')}\n                >\n                    <Typography\n                        tag='span'\n                        className={cn('resetLink')}\n                    >\n                        Сбросить\n                    </Typography>\n                </div>\n                <div className={cn('range')}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        value={range}\n                        onChange={handleRangeChange}\n                        max={1_000}\n                    />\n                </div>\n                {[\n                    {\n                        title: 'Последний',\n                        name: 'only-last',\n                        checked: last === FloorConstraints.ONLY,\n                        handleChange: handleLastOnlyChange\n                    },\n                    {\n                        title: 'Не последний',\n                        name: 'exclude-last',\n                        checked: last === FloorConstraints.EXCLUDE,\n                        handleChange: handleLastExcludeChange\n                    },\n                    {\n                        title: 'Не первый',\n                        name: 'exclude-first',\n                        checked: first === FloorConstraints.EXCLUDE,\n                        handleChange: handleFirstExcludeChange\n                    }\n                ].map(({ title, name, checked, handleChange }) => (\n                    <div\n                        key={name}\n                        className={cn('constraint')}\n                    >\n                        <Checkbox\n                            name={name}\n                            checked={checked}\n                            onChange={handleChange}\n                        >\n                            {title}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div>\n        </Dropdown.Content>\n    </Dropdown>);\n};\n","import React, { useCallback, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport {\n    TipTypeEnum,\n    RootRegionsApplicationEnum,\n    SuggestTypeEnum\n} from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\n\nimport classname from '@search/classname/src';\nimport Input from '@search/vtbeco-ui/src/components/controls/Input';\n\nimport { voidFunction } from '@search/helpers/src/voidFunction';\nimport { regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport type { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport type { UseToggleChainResult } from '@search/vtbeco-frontend-core/view/common/components/Price/popper/useToggleChain';\n\nimport type { GeoBaseStore } from '../../../../../../domain/geo/GeoBase';\nimport type { AddQueryDisplayValue, ExtendedTip, QueryDisplayValue } from '../../../../../common/hooks/useQueryDisplayValues';\nimport { GeoSuggest, correctAndBroadenRegionId } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport type { SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\n\nimport {\n    Filters,\n    GeoFilter,\n    TransportLimitFilter,\n    NewBuildingDataFilter,\n    RegionFilter,\n    DeveloperFilter\n} from '../../../../models/Filter';\nimport type { IFilter } from '../../../../models/Filter';\n\nimport { GeoSelector, TabsEnum as GeoSelectorTabsEnum } from './GeoSelector';\nimport { FilterTagList } from './FilterTagList/FilterTagList';\nimport './DesktopGeoFiltersView.css';\n\nconst cn = classname.bind(null, 'DesktopGeoFiltersView');\n\nexport interface IDesktopGeoFilterViewProps {\n    rootRegionsApp: RootRegionsApplicationEnum;\n    filters: FilterCollection;\n    onChange: (filters: IFilter[]) => void;\n    onSubmit?: () => void;\n    count: number;\n    showNewBuildingsGroup?: boolean;\n    startWithNewBuildings?: boolean;\n    addQueryDisplayValue?: AddQueryDisplayValue;\n    placeholder?: string;\n    placeholderWithNewBuildings?: string;\n    geoStore: GeoBaseStore;\n    limit?: number;\n    inputSize?: Size.Small | Size.Large;\n    inputBorderSide?: 'square' | 'rounded_square' | 'square_rounded';\n    isVertical?: boolean;\n    filterTitle?: string;\n    tips?: QueryDisplayValue[];\n    removeTips?: (tips: ExtendedTip[]) => void;\n    suggestTypes?: SuggestTypeEnum[];\n    className?: string;\n    spySuggest?: UseToggleChainResult;\n}\n\nexport const DesktopGeoFiltersView: React.FC<IDesktopGeoFilterViewProps> = ({\n    geoStore,\n    filters,\n    onChange,\n    onSubmit = voidFunction,\n    count,\n    rootRegionsApp,\n    suggestTypes,\n    limit,\n    showNewBuildingsGroup,\n    startWithNewBuildings,\n    addQueryDisplayValue,\n    placeholder = 'Введите город, метро, район, адрес',\n    placeholderWithNewBuildings = 'Введите город, метро, район, адрес, ЖК',\n    inputSize = Size.Large,\n    inputBorderSide,\n    isVertical = false,\n    filterTitle,\n    tips,\n    removeTips,\n    className,\n    spySuggest\n}) => {\n    const geoFilter = filters.get<GeoFilter>(Filters.geo);\n    const transportLimitFilter = filters.get<TransportLimitFilter>(Filters.transportLimit);\n    const regionId = filters.get<RegionFilter>(Filters.region).region;\n\n    const { stations: metro } = geoStore;\n\n    /** District в збс, новостройки не поддерживают byRegion */\n    const districts = geoStore.districts.byRegion ? geoStore.districts.byRegion() : geoStore.districts;\n\n    // eslint-disable-next-line complexity\n    const handleChange = useCallback((suggestion: SuggestionType) => {\n        const suggestionRegionId = suggestion?.__typename === 'SuggestItemDeveloper' ?\n            undefined :\n            suggestion?.data.regionId;\n\n        const newRegionId = suggestionRegionId && regionId !== suggestionRegionId ? suggestionRegionId : undefined;\n\n        const filterGeoIds: Set<number> = new Set<number>(newRegionId ? [] : geoFilter.geoIds);\n        const filterMetroIds: number[] = newRegionId ? [] : [ ...geoFilter.metroIds ];\n        const filterDistrictIds: number[] = newRegionId ? [] : [ ...geoFilter.districtIds ];\n        const filterAddressIds: number[] = newRegionId ? [] : [ ...geoFilter.addressIds ];\n        const filterNewBuildingIds: number[] = newRegionId ? [] : [ ...geoFilter.newBuildingIds ];\n        let newBuildingData;\n        let developerId;\n\n        switch (suggestion.__typename) {\n            case SuggestItemTypeEnum.NewBuilding: {\n                const { id } = suggestion.data;\n\n                if (! filterNewBuildingIds.includes(id)) {\n                    filterNewBuildingIds.push(id);\n                }\n\n                const { newBuilding } = suggestion;\n\n                if (newBuilding) {\n                    const {\n                        id: newBuildingId,\n                        type: newBuildingType,\n                        name: newBuildingName,\n                        title: newBuildingTitle\n                    } = newBuilding;\n\n                    addQueryDisplayValue && addQueryDisplayValue('newBuildings', {\n                        id: newBuildingId,\n                        title: newBuildingTitle?.nominative,\n                        type: TipTypeEnum.NewBuilding\n                    });\n\n                    newBuildingData = {\n                        type: newBuildingType,\n                        name: newBuildingName,\n                        id: newBuildingId\n                    };\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Developer: {\n                const { developer } = suggestion;\n\n                if (developer) {\n                    const { id } = developer;\n\n                    developerId = id;\n\n                    addQueryDisplayValue && addQueryDisplayValue('developers', {\n                        id,\n                        title: developer.title,\n                        type: TipTypeEnum.Developer\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Metro: {\n                const {\n                    label,\n                    data: { id }\n                } = suggestion;\n\n                if (! filterMetroIds.includes(id)) {\n                    filterMetroIds.push(id);\n                    filterGeoIds.add(id);\n\n                    addQueryDisplayValue && addQueryDisplayValue('metros', {\n                        id,\n                        title: label,\n                        type: TipTypeEnum.Metro\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.District: {\n                const { district } = suggestion;\n                const { id } = suggestion.data;\n\n                if (! filterDistrictIds.includes(id)) {\n                    filterDistrictIds.push(id);\n                    filterGeoIds.add(id);\n\n                    addQueryDisplayValue && addQueryDisplayValue('addresses', {\n                        id: district.id,\n                        kind: district.kind,\n                        translit: district.translit,\n                        title: district.displayName,\n                        type: TipTypeEnum.District\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Address: {\n                const {\n                    address,\n                    data: { id }\n                } = suggestion;\n\n                if (! filterAddressIds.includes(id)) {\n                    filterAddressIds.push(id);\n                    filterGeoIds.add(id);\n\n                    addQueryDisplayValue && addQueryDisplayValue('addresses', {\n                        id: address.id,\n                        kind: address.kind,\n                        translit: address.translit,\n                        title: address.displayName,\n                        type: TipTypeEnum.Address\n                    });\n                }\n\n                break;\n            }\n\n            default:\n                return;\n        }\n\n        const newFilters: IFilter[] = [\n            new GeoFilter(\n                filterGeoIds,\n                filterMetroIds,\n                filterDistrictIds,\n                filterAddressIds,\n                filterNewBuildingIds\n            ),\n            new NewBuildingDataFilter(newBuildingData)\n        ];\n\n        if (newRegionId) {\n            newFilters.push(\n                new RegionFilter(newRegionId)\n            );\n        }\n\n        if (developerId) {\n            newFilters.push(\n                new DeveloperFilter(developerId)\n            );\n        }\n\n        onChange(newFilters);\n    }, [\n        geoFilter.geoIds,\n        geoFilter.districtIds,\n        geoFilter.addressIds,\n        geoFilter.metroIds,\n        geoFilter.newBuildingIds,\n        onChange,\n        regionId,\n        addQueryDisplayValue\n    ]);\n\n    const [ geoSelectorActiveTab, setGeoSelectorActiveTab ] = useState<GeoSelectorTabsEnum | null>(null);\n\n    const handleGeoSelectorClose = useCallback(() => {\n        setGeoSelectorActiveTab(null);\n    }, [ setGeoSelectorActiveTab ]);\n\n    const handleGeoSelectorSubmit = useCallback(() => {\n        handleGeoSelectorClose();\n        onSubmit();\n    }, [ onSubmit, handleGeoSelectorClose ]);\n\n    const handleMetroClick = useCallback(() => {\n        setGeoSelectorActiveTab(GeoSelectorTabsEnum.metro);\n    }, [ setGeoSelectorActiveTab ]);\n\n    const handleDistrictClick = useCallback(() => {\n        setGeoSelectorActiveTab(GeoSelectorTabsEnum.district);\n    }, [ setGeoSelectorActiveTab ]);\n\n    const handleGeoSelectorChange = useCallback(data => {\n        const changedFilters = [];\n\n        if (data.metroIds || data.districtIds) {\n            const geoIds = new Set(geoFilter.geoIds);\n            const metroIds = new Set(geoFilter.metroIds);\n            const districtIds = new Set(geoFilter.districtIds);\n\n            if (data.metroIds) {\n                if (data.metroIds.diff.selected) {\n                    data.metroIds.diff.selected.forEach((id: number) => {\n                        metroIds.add(id);\n                        geoIds.add(id);\n                    });\n                }\n\n                if (data.metroIds.diff.deselected) {\n                    data.metroIds.diff.deselected.forEach((id: number) => {\n                        metroIds.delete(id);\n                        geoIds.delete(id);\n                    });\n                }\n            }\n\n            if (data.districtIds) {\n                if (data.districtIds.diff.selected) {\n                    data.districtIds.diff.selected.forEach((id: number) => {\n                        districtIds.add(id);\n                        geoIds.add(id);\n                    });\n                }\n\n                if (data.districtIds.diff.deselected) {\n                    data.districtIds.diff.deselected.forEach((id: number) => {\n                        districtIds.delete(id);\n                        geoIds.delete(id);\n                    });\n                }\n            }\n\n            const metroIdList = Array.from(metroIds);\n            const districtIdList = Array.from(districtIds);\n            const ids: {\n                type: SuggestItemTypeEnum;\n                idList: number[];\n            }[] = [\n                {\n                    type: SuggestItemTypeEnum.Metro,\n                    idList: metroIdList\n                },\n                {\n                    type: SuggestItemTypeEnum.District,\n                    idList: districtIdList\n                }\n            ];\n\n            let newRegionId: number | undefined;\n\n            for (const { type, idList } of ids) {\n                for (const id of idList) {\n                    const broadenedRegionId = correctAndBroadenRegionId(id, type, regionId);\n\n                    if (broadenedRegionId !== regionId) {\n                        newRegionId = broadenedRegionId;\n\n                        break;\n                    }\n                }\n\n                if (newRegionId) {\n                    changedFilters.push(new RegionFilter(newRegionId));\n\n                    break;\n                }\n            }\n\n            changedFilters.push(new GeoFilter(\n                geoIds,\n                metroIdList,\n                districtIdList,\n                geoFilter.addressIds,\n                geoFilter.newBuildingIds\n            ));\n        }\n\n        onChange(changedFilters);\n    }, [ onChange, geoFilter, regionId ]);\n\n    const handleTransportLimitChange = useCallback((tranpostLimitFilter: TransportLimitFilter) => {\n        onChange([ tranpostLimitFilter ]);\n    }, [ onChange ]);\n\n    const hasMetro = regionsWithMetroEnumeration.has(regionId) && ! metro.isEmpty();\n    const hasDistricts = districts.isEmpty ? ! districts.isEmpty() : districts?.ids?.length;\n\n    return (\n        <>\n            {filterTitle && (\n                <Typography\n                    variant='secondary-alone'\n                    color='secondary'\n                    className={cn('filter-title')}\n                >\n                    {filterTitle}\n                </Typography>\n            )}\n            <div className={cn(null, undefined, className)}>\n                <GeoSuggest\n                    regionId={regionId}\n                    rootRegionsApp={rootRegionsApp}\n                    suggestTypes={suggestTypes}\n                    limit={limit}\n                    showNewBuildingsGroup={showNewBuildingsGroup && ! geoFilter.newBuildingIds.length}\n                    startWithNewBuildings={startWithNewBuildings}\n                    onGeoChange={handleChange}\n                    placeholder={placeholder}\n                    placeholderWithNewBuildings={placeholderWithNewBuildings}\n                    spySuggest={spySuggest}\n                    renderInput={(props, state, handlers) => {\n                        return (\n                            <Input\n                                size={inputSize}\n                                borderSide={inputBorderSide}\n                                width='max'\n                                className={cn('input', { vertical: isVertical })}\n                                name='filter-geo-input'\n                                onBlur={handlers.handleBlur}\n                                onFocus={handlers.handleFocus}\n                                onChange={handlers.handleInputChange}\n                                onKeyDown={handlers.handleInputKeyDown}\n                                value={state.label}\n                                placeholder={props.placeholder}\n                                title={props.placeholder}\n                                extraAfter={isVertical ? null : (\n                                    <>\n                                        {\n                                            hasMetro ? (\n                                                <span\n                                                    className={cn('extra')}\n                                                    onClick={handleMetroClick}\n                                                    data-test='filter-geo-metro-popup'\n                                                >\n                                                    Метро\n                                                </span>\n                                            ) : null\n                                        }\n                                        {\n                                            hasDistricts ? (\n                                                <span\n                                                    className={cn('extra')}\n                                                    onClick={handleDistrictClick}\n                                                    data-test='filter-geo-district-popup'\n                                                >\n                                                    Районы\n                                                </span>\n                                            ) : null\n                                        }\n                                    </>\n                                )}\n                            />\n                        );\n                    }}\n                />\n                {\n                    geoSelectorActiveTab === null ? null : (\n                        <GeoSelector\n                            count={count}\n                            regionId={regionId}\n                            geoFilter={geoFilter}\n                            metro={metro}\n                            districts={districts}\n                            activeTab={geoSelectorActiveTab}\n                            onChange={handleGeoSelectorChange}\n                            transportLimitFilter={transportLimitFilter}\n                            onChangeTransportLimitChange={handleTransportLimitChange}\n                            onTabChange={setGeoSelectorActiveTab}\n                            onClose={handleGeoSelectorClose}\n                            onSubmit={handleGeoSelectorSubmit}\n                        />\n                    )\n                }\n                {\n                    isVertical ? (\n                        <div className={cn('extra-links')}>\n                            <span className={cn('extra-links-text')}>Выбрать: </span>\n                            {hasMetro && (\n                                <span\n                                    className={cn('extra-link')}\n                                    onClick={handleMetroClick}\n                                    data-test='filter-geo-metro-popup'>\n                                    метро{hasDistricts ? ', ' : ''}\n                                </span>\n                            )}\n                            {hasDistricts && (\n                                <span\n                                    className={cn('extra-link')}\n                                    onClick={handleDistrictClick}\n                                    data-test='filter-geo-district-popup'\n                                >\n                                    районы\n                                </span>\n                            )}\n                        </div>\n                    ) : null\n                }\n                {\n                    tips?.length && removeTips ? (\n                        <FilterTagList\n                            tips={tips}\n                            filters={filters}\n                            openMetroModal={handleMetroClick}\n                            removeTips={removeTips}\n                        />\n                    ) : null\n                }\n            </div>\n        </>\n    );\n};\n","import React, { useCallback, useContext, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { RootRegionsApplicationEnum, SuggestTypeEnum, TipTypeEnum } from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\nimport Input from '@search/vtbeco-ui/src/components/controls/Input';\n\nimport { voidFunction } from '@search/helpers/src/voidFunction';\nimport type { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport type { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport type { UseToggleChainResult } from '@search/vtbeco-frontend-core/view/common/components/Price/popper/useToggleChain';\n\nimport type { GeoBaseStore } from '../../../../../../domain/geo/GeoBase';\nimport type {\n    AddQueryDisplayValue,\n    ExtendedTip,\n    QueryDisplayValue\n} from '../../../../../common/hooks/useQueryDisplayValues';\nimport type { SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport { correctAndBroadenRegionId, GeoSuggest } from '../../../../../common/components/GeoSuggest/GeoSuggest';\n\nimport type { IFilter } from '../../../../models/Filter';\nimport {\n    DeveloperFilter,\n    Filters,\n    GeoFilter,\n    NewBuildingDataFilter,\n    RegionFilter,\n    TransportLimitFilter\n} from '../../../../models/Filter';\n\nimport { GeoSelector, TabsEnum as GeoSelectorTabsEnum } from './GeoSelector';\nimport { FilterTagList2 } from './FilterTagList2/FilterTagList2';\nimport './DesktopGeoFiltersView.css';\n\nconst cn = classname.bind(null, 'DesktopGeoFiltersView');\n\nexport interface IDesktopGeoFilterViewProps {\n    rootRegionsApp: RootRegionsApplicationEnum;\n    filters: FilterCollection;\n    onChange: (filters: IFilter[]) => void;\n    onSubmit?: () => void;\n    count: number;\n    showNewBuildingsGroup?: boolean;\n    startWithNewBuildings?: boolean;\n    addQueryDisplayValue?: AddQueryDisplayValue;\n    placeholder?: string;\n    placeholderWithNewBuildings?: string;\n    geoStore: GeoBaseStore;\n    limit?: number;\n    inputSize?: Size.Small | Size.Large;\n    inputBorderSide?: 'square' | 'rounded_square' | 'square_rounded';\n    isVertical?: boolean;\n    filterTitle?: string;\n    tips?: QueryDisplayValue[];\n    removeTips?: (tips: ExtendedTip[]) => void;\n    suggestTypes?: SuggestTypeEnum[];\n    className?: string;\n    spySuggest?: UseToggleChainResult;\n    showMapArea?(): void;\n    clMap?: boolean;\n    isClGeoFilter?: boolean;\n}\n\nexport const DesktopGeoFiltersView2: React.FC<IDesktopGeoFilterViewProps> = ({\n    geoStore,\n    filters,\n    onChange,\n    onSubmit = voidFunction,\n    count,\n    rootRegionsApp,\n    suggestTypes,\n    limit,\n    showNewBuildingsGroup,\n    startWithNewBuildings,\n    addQueryDisplayValue,\n    placeholder = 'Введите город, метро, район, адрес',\n    placeholderWithNewBuildings = 'Введите город, метро, район, адрес, ЖК',\n    inputSize = Size.Large,\n    inputBorderSide,\n    isVertical = false,\n    filterTitle,\n    tips,\n    removeTips,\n    className,\n    spySuggest,\n    showMapArea,\n    clMap = false,\n    isClGeoFilter = false\n}) => {\n    const geoFilter = filters.get<GeoFilter>(Filters.geo);\n    const transportLimitFilter = filters.get<TransportLimitFilter>(Filters.transportLimit);\n    const regionId = filters.get<RegionFilter>(Filters.region).region;\n\n    const { stations: metro } = geoStore;\n\n    /** District в збс, новостройки не поддерживают byRegion */\n    const districts = geoStore.districts.byRegion ? geoStore.districts.byRegion() : geoStore.districts;\n\n    // eslint-disable-next-line complexity\n    const handleChange = useCallback((suggestion: SuggestionType) => {\n        let newRegionId: RegionIdEnum | undefined;\n\n        if (\n            suggestion?.data?.regionId &&\n            regionId !== suggestion?.data?.regionId\n        ) {\n            newRegionId = suggestion.data.regionId;\n        }\n\n        const filterGeoIds: Set<number> = new Set<number>(newRegionId ? [] : geoFilter.geoIds);\n        const filterMetroIds: number[] = newRegionId ? [] : [ ...geoFilter.metroIds ];\n        const filterDistrictIds: number[] = newRegionId ? [] : [ ...geoFilter.districtIds ];\n        const filterAddressIds: number[] = newRegionId ? [] : [ ...geoFilter.addressIds ];\n        const filterNewBuildingIds: number[] = newRegionId ? [] : [ ...geoFilter.newBuildingIds ];\n        let newBuildingData;\n        let developerId;\n\n        switch (suggestion.__typename) {\n            case SuggestItemTypeEnum.NewBuilding: {\n                const { id } = suggestion.data;\n\n                if (! filterNewBuildingIds.includes(id)) {\n                    filterNewBuildingIds.push(id);\n                }\n\n                const { newBuilding } = suggestion;\n\n                if (newBuilding) {\n                    const {\n                        id: newBuildingId,\n                        type: newBuildingType,\n                        name: newBuildingName,\n                        title: newBuildingTitle\n                    } = newBuilding;\n\n                    addQueryDisplayValue && addQueryDisplayValue('newBuildings', {\n                        id: newBuildingId,\n                        title: newBuildingTitle?.nominative,\n                        type: TipTypeEnum.NewBuilding\n                    });\n\n                    newBuildingData = {\n                        type: newBuildingType,\n                        name: newBuildingName,\n                        id: newBuildingId\n                    };\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Developer: {\n                const { developer } = suggestion;\n\n                if (developer) {\n                    const { id } = developer;\n\n                    developerId = id;\n\n                    addQueryDisplayValue && addQueryDisplayValue('developers', {\n                        id,\n                        title: developer.title,\n                        type: TipTypeEnum.Developer\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.District: {\n                const { district } = suggestion;\n                const { id, regionId } = suggestion.data;\n\n                if (! filterDistrictIds.includes(id)) {\n                    filterDistrictIds.push(id);\n                    filterGeoIds.add(id);\n\n                    addQueryDisplayValue && addQueryDisplayValue('districts', {\n                        id: district.id,\n                        title: district.displayName,\n                        type: TipTypeEnum.District,\n                        region: regionId ?? undefined,\n                        translit: district.translit,\n                        locative: district.locative,\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Metro: {\n                const {\n                    label,\n                    data: { id }\n                } = suggestion;\n\n                if (! filterMetroIds.includes(id)) {\n                    filterMetroIds.push(id);\n                    filterGeoIds.add(id);\n\n                    addQueryDisplayValue && addQueryDisplayValue('metros', {\n                        id,\n                        title: label,\n                        type: TipTypeEnum.Metro\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Address: {\n                const {\n                    address,\n                    data: { id, regionId }\n                } = suggestion;\n\n                if (! filterAddressIds.includes(id)) {\n                    filterAddressIds.push(id);\n                    filterGeoIds.add(id);\n\n                    addQueryDisplayValue && addQueryDisplayValue('addresses', {\n                        id: address.id,\n                        kind: address.kind,\n                        translit: address.translit,\n                        locative: address.locative,\n                        title: address.displayName,\n                        type: TipTypeEnum.Address,\n                        region: regionId ?? undefined\n                    });\n                }\n\n                break;\n            }\n\n            default:\n                return;\n        }\n\n        const newFilters: IFilter[] = [\n            new GeoFilter(\n                filterGeoIds,\n                filterMetroIds,\n                filterDistrictIds,\n                filterAddressIds,\n                filterNewBuildingIds\n            ),\n            new NewBuildingDataFilter(newBuildingData)\n        ];\n\n        if (newRegionId) {\n            newFilters.push(\n                new RegionFilter(newRegionId)\n            );\n        }\n\n        if (developerId) {\n            newFilters.push(\n                new DeveloperFilter(developerId)\n            );\n        }\n\n        onChange(newFilters);\n    }, [\n        geoFilter.geoIds,\n        geoFilter.districtIds,\n        geoFilter.addressIds,\n        geoFilter.metroIds,\n        geoFilter.newBuildingIds,\n        onChange,\n        regionId,\n        addQueryDisplayValue\n    ]);\n\n    const [ geoSelectorActiveTab, setGeoSelectorActiveTab ] = useState<GeoSelectorTabsEnum | null>(null);\n\n    const handleGeoSelectorClose = useCallback(() => {\n        setGeoSelectorActiveTab(null);\n    }, [ setGeoSelectorActiveTab ]);\n\n    const handleGeoSelectorSubmit = useCallback(() => {\n        handleGeoSelectorClose();\n        onSubmit();\n    }, [ onSubmit, handleGeoSelectorClose ]);\n\n    const handleMetroClick = useCallback(() => {\n        setGeoSelectorActiveTab(GeoSelectorTabsEnum.metro);\n    }, [ setGeoSelectorActiveTab ]);\n\n    const handleDistrictClick = useCallback(() => {\n        setGeoSelectorActiveTab(GeoSelectorTabsEnum.district);\n    }, [ setGeoSelectorActiveTab ]);\n\n    const handleGeoSelectorChange = useCallback(data => {\n        const changedFilters = [];\n\n        if (data.metroIds || data.districtIds) {\n            const geoIds = new Set(geoFilter.geoIds);\n            const metroIds = new Set(geoFilter.metroIds);\n            const districtIds = new Set(geoFilter.districtIds);\n\n            if (data.metroIds) {\n                if (data.metroIds.diff.selected) {\n                    data.metroIds.diff.selected.forEach((id: number) => {\n                        metroIds.add(id);\n                        geoIds.add(id);\n                    });\n                }\n\n                if (data.metroIds.diff.deselected) {\n                    data.metroIds.diff.deselected.forEach((id: number) => {\n                        metroIds.delete(id);\n                        geoIds.delete(id);\n                    });\n                }\n            }\n\n            if (data.districtIds) {\n                if (data.districtIds.diff.selected) {\n                    data.districtIds.diff.selected.forEach((id: number) => {\n                        districtIds.add(id);\n                        geoIds.add(id);\n                    });\n                }\n\n                if (data.districtIds.diff.deselected) {\n                    data.districtIds.diff.deselected.forEach((id: number) => {\n                        districtIds.delete(id);\n                        geoIds.delete(id);\n                    });\n                }\n            }\n\n            const metroIdList = Array.from(metroIds);\n            const districtIdList = Array.from(districtIds);\n            const ids: {\n                type: SuggestItemTypeEnum;\n                idList: number[];\n            }[] = [\n                {\n                    type: SuggestItemTypeEnum.Metro,\n                    idList: metroIdList\n                },\n                {\n                    type: SuggestItemTypeEnum.District,\n                    idList: districtIdList\n                }\n            ];\n\n            let newRegionId: number | undefined;\n\n            for (const { type, idList } of ids) {\n                for (const id of idList) {\n                    const broadenedRegionId = correctAndBroadenRegionId(id, type, regionId);\n\n                    if (broadenedRegionId !== regionId) {\n                        newRegionId = broadenedRegionId;\n\n                        break;\n                    }\n                }\n\n                if (newRegionId) {\n                    changedFilters.push(new RegionFilter(newRegionId));\n\n                    break;\n                }\n            }\n\n            changedFilters.push(new GeoFilter(\n                geoIds,\n                metroIdList,\n                districtIdList,\n                geoFilter.addressIds,\n                geoFilter.newBuildingIds\n            ));\n        }\n\n        onChange(changedFilters);\n    }, [ onChange, geoFilter, regionId ]);\n\n    const handleTransportLimitChange = useCallback((tranpostLimitFilter: TransportLimitFilter) => {\n        onChange([ tranpostLimitFilter ]);\n    }, [ onChange ]);\n\n    const hasMetro = regionsWithMetroEnumeration.has(regionId) && ! metro.isEmpty();\n    const hasDistricts = districts.isEmpty ? ! districts.isEmpty() : districts?.ids?.length;\n\n    const extraLinks = clMap ? (\n        <div className={cn('extra-links-cl')}>\n            {hasMetro && (\n                <div\n                    className={cn('metro')}\n                    data-test='filter-geo-metro-popup'\n                    onClick={handleMetroClick}\n                >\n                    <span className={cn('metro-icon')}>\n                        <svg xmlns='http://www.w3.org/2000/svg' width='24' height='24' fill='none'>\n                            <path\n                                d='M20.486 13.765 15.347 0 11 8.047 6.67 0 1.514 13.765H0v2.086h7.78v-2.086H6.617l1.126-3.427L11 16l3.256-5.662 1.126 3.427h-1.161v2.086H22v-2.086h-1.514Z'\n                                fill='#DD201C'\n                            />\n                        </svg>\n                    </span>\n                    <Typography className={cn('metro-text')} variant='secondary-alone' bold>\n                        Выбрать метро\n                    </Typography>\n                    {geoFilter.metroIds.length > 0 && (\n                        <div className={cn('metro-count')}>{geoFilter.metroIds.length}</div>\n                    )}\n                </div>\n            )}\n            {hasDistricts && (\n                <div\n                    className={cn('district')}\n                    data-test='filter-geo-district-popup'\n                    onClick={handleDistrictClick}\n                >\n                    <span className={cn('district-icon')}>\n                        <Icon name='m2-building-multiple' color='#6e6a81' size='m' />\n                    </span>\n                    <Typography className={cn('district-text')} variant='secondary-alone' bold>\n                        Выбрать район\n                    </Typography>\n                </div>\n            )}\n        </div>\n    ) : (\n        <div className={cn('extra-links')}>\n            <Typography tag='span' color='secondary'>Выбрать:&nbsp;</Typography>\n            {hasMetro && (\n                <Typography\n                    tag='span'\n                    color='blue'\n                    className={cn('extra-link')}\n                    onClick={handleMetroClick}\n                    data-test='filter-geo-metro-popup'>\n                    {hasDistricts ? 'метро, ' : 'метро'}\n                </Typography>\n            )}\n            {hasDistricts && (\n                <Typography\n                    tag='span'\n                    color='blue'\n                    className={cn('extra-link')}\n                    onClick={handleDistrictClick}\n                    data-test='filter-geo-district-popup'\n                >\n                    районы\n                </Typography>\n            )}\n        </div>\n    );\n\n    return (\n        <>\n            {filterTitle && (\n                <Typography\n                    color='black-250'\n                    variant='secondary-alone'\n                    className={cn('filter-title')}\n                >\n                    {filterTitle}\n                </Typography>\n            )}\n            <div className={cn(null, undefined, className)}>\n                <GeoSuggest\n                    regionId={regionId}\n                    rootRegionsApp={rootRegionsApp}\n                    suggestTypes={suggestTypes}\n                    limit={limit}\n                    showNewBuildingsGroup={showNewBuildingsGroup && ! geoFilter.newBuildingIds.length}\n                    startWithNewBuildings={startWithNewBuildings}\n                    selected={geoFilter.geoIds}\n                    onGeoChange={handleChange}\n                    placeholder={placeholder}\n                    placeholderWithNewBuildings={placeholderWithNewBuildings}\n                    spySuggest={spySuggest}\n                    renderInput={(props, state, handlers) => {\n                        return (\n                            <Input\n                                size={inputSize}\n                                borderSide={inputBorderSide}\n                                width='max'\n                                className={cn('input', { vertical: isVertical })}\n                                name='filter-geo-input'\n                                onBlur={handlers.handleBlur}\n                                onFocus={handlers.handleFocus}\n                                onChange={handlers.handleInputChange}\n                                onKeyDown={handlers.handleInputKeyDown}\n                                value={state.label}\n                                placeholder={props.placeholder}\n                                title={props.placeholder}\n                                extraAfter={isVertical ? null : (<>\n                                    { hasMetro ? (\n                                        <span\n                                            className={cn('extra')}\n                                            onClick={handleMetroClick}\n                                            data-test='filter-geo-metro-popup'\n                                        >\n                                            Метро\n                                        </span>\n                                    ) : null}\n                                    { hasDistricts ? (\n                                        <span\n                                            className={cn('extra')}\n                                            onClick={handleDistrictClick}\n                                            data-test='filter-geo-district-popup'\n                                        >\n                                            Районы\n                                        </span>\n                                    ) : null}\n                                    {isClGeoFilter ? <span\n                                        className={cn('extra')}\n                                        data-test='filter-geo-map-popup'\n                                        onClick={showMapArea}\n                                    >\n                                        Область на карте\n                                    </span> : null}\n                                </>)}\n                            />\n                        );\n                    }}\n                />\n                {\n                    geoSelectorActiveTab === null ? null : (\n                        <GeoSelector\n                            count={count}\n                            regionId={regionId}\n                            geoFilter={geoFilter}\n                            metro={metro}\n                            districts={districts}\n                            activeTab={geoSelectorActiveTab}\n                            onChange={handleGeoSelectorChange}\n                            transportLimitFilter={transportLimitFilter}\n                            onChangeTransportLimitChange={handleTransportLimitChange}\n                            onTabChange={setGeoSelectorActiveTab}\n                            onClose={handleGeoSelectorClose}\n                            onSubmit={handleGeoSelectorSubmit}\n                        />\n                    )\n                }\n                {\n                    isVertical && (hasMetro || hasDistricts) ? extraLinks : null\n                }\n                {\n                    tips?.length && removeTips ? (\n                        <FilterTagList2\n                            tips={tips}\n                            filters={filters}\n                            openMetroModal={handleMetroClick}\n                            removeTips={removeTips}\n                        />\n                    ) : null\n                }\n            </div>\n        </>\n    );\n};\n","import './FilterTagList.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\n\nimport { ClassifiedFilterCollection } from '../../../../../../../domain/offer/filters/ClassifiedFilterCollection';\nimport { NewbuildingFilterCollection } from '../../../../../../../domain/newbuilding/filters/NewbuildingFilterCollection';\nimport { MetroMark } from '../../../../../../common/components/GeoSuggest/MetroMark';\nimport { IconPedestrian } from '../../../../../../common/components/OfferRouteCard/IconPedestrian';\nimport { IconBus } from '../../../../../../common/components/OfferRouteCard/IconBus';\nimport { ExtendedTip, QueryDisplayValue } from '../../../../../../common/hooks/useQueryDisplayValues';\nimport { timeLimitLabel } from '../../../../../../tips/labels';\nimport { Filters, TransportLimitFilter } from '../../../../../models/Filter';\nimport { FilterTagListItem } from './FilterTagListItem';\n\nconst cn = classname.bind(null, 'FilterTagList');\n\nexport function FilterTagList({\n    filters,\n    tips,\n    removeTips,\n    openMetroModal\n}: {\n    removeTips(tips: ExtendedTip[]): void;\n    filters: ClassifiedFilterCollection | NewbuildingFilterCollection;\n    tips: QueryDisplayValue[];\n    openMetroModal: () => void;\n}) {\n    const transportType = filters.get<TransportLimitFilter>(Filters.transportLimit).transportType;\n    const timeLimit = filters.get<TransportLimitFilter>(Filters.transportLimit).timeLimit;\n\n    const [ expanded, setExpanded ] = React.useState(false);\n    const toggleExpanded = React.useCallback(() => {\n        setExpanded(prevState => ! prevState);\n    }, [ setExpanded ]);\n\n    const allTips: ExtendedTip[] = transportType && timeLimit ?\n        [\n            {\n                __typename: 'TipRouteMetro',\n                id: 'TipRouteMetro',\n                transportType: {\n                    value: transportType\n                },\n                timeLimit: {\n                    formatted: timeLimitLabel[timeLimit]!\n                }\n            },\n            ...tips\n        ] :\n        tips;\n\n    const maxVisible = 3;\n    const visibleTips = expanded ? allTips : allTips.slice(0, maxVisible);\n    const toggleExpandedDisabled = allTips.length <= maxVisible;\n\n    const deleteTip = React.useCallback((tip: ExtendedTip) => {\n        removeTips([ tip ]);\n    }, [ removeTips ]);\n\n    const resetAll = React.useCallback(() => {\n        removeTips(allTips);\n    }, [ removeTips, allTips ]);\n\n    return (\n        <div className={cn()}>\n            {visibleTips.map(tip => (\n                <FilterTagListItem\n                    id={`filter-tag-${tip.id}`}\n                    key={tip.id}\n                    onDelete={() => deleteTip(tip)}\n                    children={<TipContent tip={tip} />}\n                    openMetroModal={tip.__typename === 'TipRouteMetro' ? openMetroModal : undefined}\n                />\n            ))}\n            {\n                allTips.length === 0 ? null : (\n                    <div className={cn('links')}>\n                        <button\n                            data-test='filter-tag-more'\n                            className={cn('more', { disabled: toggleExpandedDisabled })}\n                            disabled={toggleExpandedDisabled}\n                            onClick={toggleExpanded}\n                        >\n                            {/* eslint-disable-next-line no-nested-ternary */}\n                            {toggleExpandedDisabled ? '' : (expanded ? 'Свернуть' : 'Показать еще')}\n                        </button>\n                        <button\n                            data-test='filter-tag-reset'\n                            className={cn('reset')}\n                            onClick={resetAll}\n                        >\n                            Сбросить все\n                        </button>\n                    </div>\n                )\n            }\n        </div>\n    );\n}\n\nfunction TransportTypeIcon({\n    transportType\n}: {\n    transportType: TransportType | null;\n}) {\n    switch (transportType) {\n        case TransportType.FOOT:\n            return <IconPedestrian color='currentColor' />;\n        default:\n            return <IconBus color='currentColor' />;\n    }\n}\n\nfunction TipContent({\n    tip\n}: {\n    tip: ExtendedTip;\n}) {\n    switch (tip.__typename) {\n        case 'TipRouteMetro':\n            return (\n                <>\n                    До метро&nbsp;\n                    <TransportTypeIcon transportType={tip.transportType.value} />\n                    &nbsp;{tip.timeLimit.formatted} мин.\n                </>\n            );\n        case 'TipMetroStation':\n            return (\n                <>\n                    {tip.allRoutesColors ? <MetroMark colors={tip.allRoutesColors} /> : 'м.'}\n                    {tip.title}\n                </>\n            );\n        default:\n            return <>{tip.title}</>;\n    }\n}\n","import './FilterTagListItem.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'FilterTagListItem');\n\nexport function FilterTagListItem({\n    id,\n    children,\n    isActive = false,\n    openMetroModal,\n    onDelete\n}: {\n    id: string;\n    onDelete: () => void;\n    children: React.ReactNode;\n    isActive?: boolean;\n    openMetroModal?: () => void;\n}) {\n    return (\n        <div\n            onClick={openMetroModal}\n            className={cn('item', { active: isActive, clickable: Boolean(openMetroModal) })}\n        >\n            <div className={cn('text')}>{children}</div>\n            <button\n                className={cn('delete')}\n                data-test={`${id}-delete`}\n                onClick={e => {\n                    e.stopPropagation();\n                    onDelete();\n                }}\n            >\n                <Icon name='times-circle' />\n            </button>\n        </div>\n    );\n}\n","import './FilterTagList2.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport { TransportType } from '@search/filter-enums/enums/TransportType';\n\nimport { ClassifiedFilterCollection } from '@search/vtbeco-frontend-core/domain/offer/filters/ClassifiedFilterCollection';\nimport { NewbuildingFilterCollection } from '@search/vtbeco-frontend-core/domain/newbuilding/filters/NewbuildingFilterCollection';\n\nimport { MetroMark } from '../../../../../../common/components/GeoSuggest/MetroMark';\nimport { IconPedestrian } from '../../../../../../common/components/OfferRouteCard/IconPedestrian';\nimport { IconBus } from '../../../../../../common/components/OfferRouteCard/IconBus';\nimport { ExtendedTip, QueryDisplayValue } from '../../../../../../common/hooks/useQueryDisplayValues';\nimport { timeLimitLabel } from '../../../../../../tips/labels';\nimport { Filters, TransportLimitFilter } from '../../../../../models/Filter';\n\nconst cn = classname.bind(null, 'FilterTagList2');\n\nexport function FilterTagList2({\n    filters,\n    tips,\n    removeTips,\n    openMetroModal\n}: {\n    removeTips(tips: ExtendedTip[]): void;\n    filters: ClassifiedFilterCollection | NewbuildingFilterCollection;\n    tips: QueryDisplayValue[];\n    openMetroModal: () => void;\n}) {\n    const transportType = filters.get<TransportLimitFilter>(Filters.transportLimit).transportType;\n    const timeLimit = filters.get<TransportLimitFilter>(Filters.transportLimit).timeLimit;\n\n    const [ expanded, setExpanded ] = React.useState(false);\n    const toggleExpanded = React.useCallback(() => {\n        setExpanded(prevState => ! prevState);\n    }, [ setExpanded ]);\n\n    const allTips: ExtendedTip[] = transportType && timeLimit ?\n        [\n            {\n                __typename: 'TipRouteMetro',\n                id: 'TipRouteMetro',\n                transportType: {\n                    value: transportType\n                },\n                timeLimit: {\n                    formatted: timeLimitLabel[timeLimit]!\n                }\n            },\n            ...tips\n        ] :\n        tips;\n\n    const maxVisible = 3;\n    const visibleTips = expanded ? allTips : allTips.slice(0, maxVisible);\n    const toggleExpandedDisabled = allTips.length <= maxVisible;\n\n    const deleteTip = React.useCallback((tip: ExtendedTip) => {\n        removeTips([ tip ]);\n    }, [ removeTips ]);\n\n    const resetAll = React.useCallback(() => {\n        removeTips(allTips);\n    }, [ removeTips, allTips ]);\n\n    return (\n        <div className={cn()}>\n            {visibleTips.map(tip => (\n                <FilterTagListItem2\n                    id={`filter-tag-${tip.id}`}\n                    key={tip.id}\n                    onDelete={() => deleteTip(tip)}\n                    children={<TipContent tip={tip} />}\n                    openMetroModal={tip.__typename === 'TipRouteMetro' ? openMetroModal : undefined}\n                />\n            ))}\n            {\n                allTips.length === 0 ? null : (\n                    <div className={cn('links')}>\n                        <Typography\n                            data-test='filter-tag-more'\n                            color='blue'\n                            className={cn('more')}\n                            // disabled={toggleExpandedDisabled}\n                            onClick={toggleExpanded}\n                        >\n                            {/* eslint-disable-next-line no-nested-ternary */}\n                            {toggleExpandedDisabled ? '' : (expanded ? 'Свернуть' : 'Показать еще')}\n                        </Typography>\n                        <Typography\n                            color='black-250'\n                            data-test='filter-tag-reset'\n                            className={cn('reset')}\n                            onClick={resetAll}\n                        >\n                            Сбросить все\n                        </Typography>\n                    </div>\n                )\n            }\n        </div>\n    );\n}\n\nfunction TransportTypeIcon({\n    transportType\n}: {\n    transportType: TransportType | null;\n}) {\n    switch (transportType) {\n        case TransportType.FOOT:\n            return <IconPedestrian color='currentColor' />;\n        default:\n            return <IconBus color='currentColor' />;\n    }\n}\n\nfunction TipContent({\n    tip\n}: {\n    tip: ExtendedTip;\n}) {\n    switch (tip.__typename) {\n        case 'TipRouteMetro':\n            return (<Typography color='blue'>\n                До метро&nbsp;\n                <TransportTypeIcon transportType={tip.transportType.value} />\n                &nbsp;{tip.timeLimit.formatted} мин.\n            </Typography>);\n        case 'TipMetroStation':\n            return (<div className={cn('tipMetro')}>\n                {tip.allRoutesColors ? <MetroMark colors={tip.allRoutesColors} /> : 'м.'}\n                {tip.title}\n            </div>);\n        default:\n            return <>{tip.title}</>;\n    }\n}\n\nexport function FilterTagListItem2({\n    id,\n    children,\n    openMetroModal,\n    onDelete,\n    view = 'default'\n}: {\n    id: string;\n    view?: 'ellipse' | 'default';\n    onDelete: () => void;\n    children: React.ReactNode;\n    openMetroModal?: () => void;\n}) {\n    return (\n        <div\n            onClick={openMetroModal}\n            className={cn('item', { clickable: Boolean(openMetroModal), view })}\n        >\n            <Typography color={view === 'ellipse' ? 'primary' : 'secondary'}>\n                {children}\n            </Typography>\n\n            <div\n                data-test={`${id}-delete`}\n                onClick={e => {\n                    e.stopPropagation();\n                    onDelete();\n                }}\n                className={cn('removeBtn')}\n            >\n                <Icon\n                    name='times-circle'\n                    color='#CCC9D9'\n                />\n            </div>\n        </div>\n    );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/ekb.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/kzn.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import type { ReactNode, ReactElement } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/msk.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/nnv.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/nsk.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/smr.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import type { ReactElement, ReactNode } from 'react';\nimport svg from '!!raw-loader!@search/metro/build/maps/spb.svg';\n\nexport default ({ children }: { children: (svg: ReactNode) => ReactElement }): ReactElement => {\n    return children(svg);\n};\n","import React, { useCallback } from 'react';\nimport { Select, Typography, useSelect } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { TimeLimit, TransportType } from '@search/filter-enums/enums';\n\nimport { TransportLimitFilter } from '../../../../models/Filter';\nimport { MobileFilter2 } from '../../../filter/MobileFilter2';\n\nimport './styles.css';\n\ninterface IMobileTransportLimitFilterViewProps {\n    filter: TransportLimitFilter;\n    onChange: (filter: TransportLimitFilter) => void;\n    isMobile?: boolean;\n    isTitle?: boolean;\n    containerClass?: string;\n    hiddenTimeOptionsWithoutTransportType?: boolean;\n    desktopTitleGap?: boolean;\n    isShort?: boolean;\n}\n\nconst cn = classname.bind(null, 'MobileTransportLimitFilterView');\n\nconst transportTypeOptions = [\n    {\n        value: TransportType.UNKNOWN,\n        label: 'Неважно'\n    },\n    {\n        value: TransportType.FOOT,\n        label: 'Пешком'\n    }, {\n        value: TransportType.PUBLIC_TRANSPORT,\n        label: 'На транспорте'\n    }\n];\n\nconst timeLimitOptions = [\n    {\n        value: TimeLimit.MAX_5_MINUTES,\n        label: '5 мин.'\n    },\n    {\n        value: TimeLimit.MAX_10_MINUTES,\n        label: '10 мин.'\n    },\n    {\n        value: TimeLimit.MAX_15_MINUTES,\n        label: '15 мин.'\n    },\n    {\n        value: TimeLimit.MAX_20_MINUTES,\n        label: '20 мин.'\n    },\n    {\n        value: TimeLimit.MAX_30_MINUTES,\n        label: '30 мин.'\n    },\n    {\n        value: TimeLimit.MAX_40_MINUTES,\n        label: '40 мин.'\n    },\n    {\n        value: TimeLimit.MAX_50_MINUTES,\n        label: '50 мин.'\n    },\n    {\n        value: TimeLimit.MAX_60_MINUTES,\n        label: '1 ч.'\n    }\n];\n\nconst timeLimitShortOptions = [\n    {\n        value: TimeLimit.MAX_5_MINUTES,\n        label: '5 мин.'\n    },\n    {\n        value: TimeLimit.MAX_10_MINUTES,\n        label: '10 мин.'\n    },\n    {\n        value: TimeLimit.MAX_15_MINUTES,\n        label: '15 мин.'\n    },\n    {\n        value: TimeLimit.MAX_20_MINUTES,\n        label: '20 мин.'\n    },\n    {\n        value: TimeLimit.MAX_30_MINUTES,\n        label: '30 мин.'\n    }\n];\n\nexport const MobileTransportLimitFilterView2: React.FC<IMobileTransportLimitFilterViewProps> = ({\n    filter,\n    onChange,\n    isTitle,\n    isMobile,\n    containerClass,\n    hiddenTimeOptionsWithoutTransportType,\n    desktopTitleGap,\n    isShort = false\n}) => {\n    const transportSelectChange = useCallback((value: TransportType) => {\n        let timeLimit = filter.timeLimit;\n\n        if (value === TransportType.UNKNOWN) timeLimit = TimeLimit.UNKNOWN;\n        else if (timeLimit === TimeLimit.UNKNOWN) timeLimit = TimeLimit.MAX_20_MINUTES;\n\n        onChange(new TransportLimitFilter(\n            timeLimit,\n            value\n        ));\n    }, [ filter.timeLimit, onChange ]);\n\n    const transportSelectOptions = transportTypeOptions.map(option => ({ value: option.value, text: option.label }));\n\n    const transportSelect = useSelect(\n        transportSelectChange,\n        {\n            selected: filter.transportType,\n            texts: transportSelectOptions\n        }\n    );\n\n    const timeLimitSelectChange = useCallback((value: TimeLimit) => {\n        const transportType = filter.transportType;\n\n        if (transportType === TransportType.UNKNOWN) return;\n\n        onChange(new TransportLimitFilter(\n            value,\n            transportType\n        ));\n    }, [ filter.transportType, onChange ]);\n\n    const timeLimitSelectOptions = (isShort ? timeLimitShortOptions : timeLimitOptions).map(option => ({\n        value: option.value,\n        text: option.label\n    }));\n\n    const timeLimitSelect = useSelect(\n        timeLimitSelectChange,\n        { selected: filter.timeLimit, texts: timeLimitSelectOptions }\n    );\n\n    return (<MobileFilter2\n        filterTitle={isTitle ? 'Время до метро' : undefined}\n        desktopTitleGap={desktopTitleGap}\n        childrenClassName={cn('container', {\n            mobile: isMobile\n        }, containerClass)}\n    >\n        <Select native={isMobile} mode='single' onChange={transportSelect.handleChange}>\n            <Select.Button size='s' dataTest='transportType-trigger'>\n                {filter.transportType === TransportType.UNKNOWN ? <Typography color='black-300'>Неважно</Typography> : transportSelect.selectedText}\n            </Select.Button>\n            <Select.Content>\n                {transportSelectOptions.map(option => (\n                    <Select.Option\n                        dataTest={`transportType-${option.value}`}\n                        key={option.value}\n                        value={option.value}\n                        selected={transportSelect.is(option.value)}\n                    >\n                        {option.text}\n                    </Select.Option>\n                ))}\n            </Select.Content>\n        </Select>\n        {hiddenTimeOptionsWithoutTransportType && filter.transportType === TransportType.UNKNOWN ? null : (\n            <Select native={isMobile} mode='single' onChange={timeLimitSelect.handleChange}>\n                <Select.Button\n                    dataTest='timeLimit-trigger'\n                    disabled={filter.transportType === TransportType.UNKNOWN}\n                    size='s'\n                >\n                    {filter.transportType === TransportType.UNKNOWN ? <Typography color='black-300'>Время</Typography> : timeLimitSelect.selectedText}\n                </Select.Button>\n                <Select.Content>\n                    {timeLimitSelectOptions.map(option => (\n                        <Select.Option\n                            key={option.value}\n                            dataTest={`timeLimit-${option.value}`}\n                            value={option.value}\n                            selected={timeLimitSelect.is(option.value)}\n                        >\n                            {option.text}\n                        </Select.Option>\n                    ))}\n                </Select.Content>\n            </Select>\n        )}\n    </MobileFilter2>);\n};\n","import React from 'react';\nimport { withScope, captureException } from '@sentry/browser';\n\nclass GeoErrorBoundary extends React.Component<{}, { hasError: boolean }> {\n    constructor(props: {} | Readonly<{}>) {\n        super(props);\n\n        this.state = { hasError: false };\n    }\n\n    static getDerivedStateFromError() {\n        return { hasError: true };\n    }\n\n    componentDidCatch(error: Error, errorInfo: unknown) {\n        withScope(scope => {\n            scope.setExtra('errors', error.name);\n            scope.setExtra('errorInfo', errorInfo);\n\n            captureException(error, {\n                tags: {\n                    section: 'GeoErrorBoundary'\n                }\n            });\n        });\n    }\n\n    render() {\n        if (this.state.hasError) {\n            return <div>Ошибка загрузки карты</div>;\n        }\n\n        return this.props.children;\n    }\n}\n\nexport default GeoErrorBoundary;\n","import React, { useState, useCallback, useMemo } from 'react';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\nimport Suggest from '@search/vtbeco-ui/src/components/controls/Suggest';\nimport { SizeEnum } from '@search/vtbeco-ui/src/types';\n\nimport latinToCyrillic from '@search/helpers/src/latinToCyrillic.json';\n\nimport { SubwayStationMark } from '../../../../../../../common/components/SubwayStation';\nimport { MetroStore, MetroStation } from '../../../../../../../../domain/geo/MetroStation';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'MetroSuggest');\n\ninterface IProps {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    onChange: (data: any) => void;\n    metro: MetroStore;\n    selected: Set<number>;\n    className?: string;\n}\n\nconst escapeRegExp = (string: string) => string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\nconst filterMetro = (text: string, metro: MetroStation[]) => {\n    text = text.trim().toLowerCase();\n\n    const textRegExp = new RegExp(escapeRegExp(text).replace(/е/g, '(е|ё)'));\n\n    const anotherTextLetters: string[] = [];\n\n    text.split('').forEach(letter => {\n        // @ts-ignore\n        anotherTextLetters.push(latinToCyrillic[letter] || letter);\n    });\n\n    const anotherText = anotherTextLetters.join('');\n    const anotherTextRegExp = new RegExp(escapeRegExp(anotherText).replace(/е/g, '(е|ё)'));\n\n    return metro\n        .filter(({ title }) => {\n            title = title.toLowerCase();\n\n            return textRegExp.test(title) || anotherTextRegExp.test(title);\n        });\n};\n\nconst metroTitleTrim = (title: string) => {\n    return title\n        // \"Площадь Александра Невского-1\" => \"Площадь Александра Невского\"\n        .replace(/-\\d$/, '')\n        // \"Мичуринский проспект (2021)\" => \"Мичуринский проспект\"\n        .replace(/ \\(\\d\\d\\d\\d\\)$/, '');\n};\n\nconst MetroSuggest: React.FC<IProps> = ({ onChange, selected, metro, className }) => {\n    const [ suggestion, setSuggestion ] = useState<{ label: string } | null>(null);\n\n    // TODO Нормализация с учётом схлопывания смежных станций, будет сделано на бекэнде\n    const metros = useMemo(() => {\n        const ret: MetroStation[] = [];\n\n        metro.sortedByTitle.forEach(station => {\n            const { interchangedStations, route } = station;\n            let isNeedToAdd = true;\n\n            // Станции линии \"Каховская\"\n            if (route.id === 86) {\n                return;\n            }\n\n            // Если среди станций пересадок есть станция с эквивалентным именем и меньшим по значению id,\n            // то такую станцию не добавляем в список\n            if (interchangedStations && interchangedStations.length) {\n                const { title } = station;\n                const trimmedStationTitle = metroTitleTrim(title);\n\n                interchangedStations.forEach(interchangedStation => {\n                    if (\n                        metroTitleTrim(interchangedStation.title) === trimmedStationTitle &&\n                        interchangedStation.id < station.id\n                    ) {\n                        isNeedToAdd = false;\n                    }\n                });\n            }\n\n            if (isNeedToAdd) {\n                ret.push(station);\n            }\n        });\n\n        return ret;\n    }, [ metro ]);\n\n    // @ts-ignore\n    // eslint-disable-next-line @typescript-eslint/no-shadow\n    const handleOnSelect = useCallback(suggestion => {\n        const id = suggestion.id;\n\n        onChange({\n            diff: {\n                [selected.has(id) ? 'deselected' : 'selected']: new Set([ id ])\n            }\n        });\n    }, [ onChange, selected ]);\n\n    const handleTextChange = useCallback((text: string) => {\n        setSuggestion({\n            label: text\n        });\n    }, [ setSuggestion ]);\n\n    const suggestions = useMemo(() => {\n        return filterMetro(suggestion && suggestion.label || '', metros);\n    }, [ suggestion, metros ]);\n\n    // @ts-ignore\n    // eslint-disable-next-line @typescript-eslint/no-shadow\n    const checkListShowing = useCallback(({ isFocus, suggestions }) => {\n        if (! isFocus) {\n            setSuggestion(prev => {\n                return prev && prev.label ? null : prev;\n            });\n        }\n\n        return isFocus && suggestions.length > 0;\n    }, [ setSuggestion ]);\n\n    return (\n        <div className={cn(null, undefined, className)}>\n            <Suggest\n                width='max'\n                size={SizeEnum.S}\n                inputSize={SizeEnum.S}\n                suggestions={suggestions}\n                renderList={({ suggestions: renderSuggestions }, { focusedIndex }, handlers) => (\n                    <div className={cn('list')}>\n                        <div className={cn('list-inner')}>\n                            { renderSuggestions.map((item, index) => (\n                                <div\n                                    key={index}\n                                    className={cn('list-item', { focused: focusedIndex === index })}\n                                    onMouseEnter={e => handlers.handleItemMouseEnter(e, index)}\n                                    onMouseDown={e => handlers.handleItemMouseDown(e, index)}\n                                >\n                                    <div className={cn('list-item-mark')}>\n                                        <SubwayStationMark colors={item.allRoutesColorsList} />\n                                    </div>\n                                    <div className={cn('list-item-text')}>\n                                        {\n                                            // \"Площадь Александра Невского-1\" => \"Площадь Александра Невского\"\n                                            item.title.replace(/-\\d$/, '')\n                                        }\n                                    </div>\n                                    <div className={cn('list-item-check')}>\n                                        {selected.has(item.id) ? (\n                                            <Icon name='check' />\n                                        ) : null}\n                                    </div>\n                                </div>\n                            )) }\n                        </div>\n                    </div>\n                )}\n                onSelect={handleOnSelect}\n                suggestion={suggestion}\n                placeholder='Найти станцию'\n                onTextChange={handleTextChange}\n                checkListShowing={checkListShowing}\n                renderEmptyList={() => {}}\n            />\n        </div>\n    );\n};\n\nexport default MetroSuggest;\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport type { DistrictGroup } from '../../../../../../helpers/districtHelper';\nimport type { ArrayElement } from '../../../../../../../../types/common';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'DistrictsTabGeoSelector');\n\ninterface IProps {\n    groups: DistrictGroup[];\n    selected: Set<number>;\n    onChange: (data: any) => void;\n}\n\nexport const DistrictsTab: React.FC<IProps> = ({\n    groups,\n    selected,\n    onChange\n}) => {\n    const handleCheckboxChange = useCallback((\n        checked: boolean,\n        id: ArrayElement<DistrictGroup['items']>['id'],\n        groupIndex: number,\n        groupId: DistrictGroup['id']\n    ) => {\n        let checkedDiff = new Set<number>();\n        let uncheckedDiff = new Set<number>();\n\n        if (! groupId) {\n            if (checked) {\n                checkedDiff.add(id);\n            } else {\n                uncheckedDiff.add(id);\n            }\n\n            onChange({\n                diff: {\n                    selected: checkedDiff,\n                    deselected: uncheckedDiff\n                }\n            });\n\n            return;\n        }\n\n        if (checked) {\n            const isGroupChecked = groups[groupIndex].items.every(item => selected.has(item.id) || item.id === id);\n\n            if (isGroupChecked) {\n                const selectedIdsFromGroup = groups[groupIndex].items\n                    .map(item => item.id)\n                    .filter(value => selected.has(value));\n\n                checkedDiff = new Set([ groupId ]);\n                uncheckedDiff = new Set([ id, ...selectedIdsFromGroup ]);\n            } else {\n                checkedDiff = new Set([ id ]);\n            }\n        } else {\n            if (selected.has(groupId)) {\n                const otherGroupIds = groups[groupIndex].items\n                    .filter(item => item.id !== id)\n                    .map(item => item.id);\n\n                checkedDiff = new Set(otherGroupIds);\n                uncheckedDiff = new Set([ groupId, id ]);\n            } else {\n                uncheckedDiff = new Set([ id ]);\n            }\n        }\n\n        onChange({\n            diff: {\n                selected: checkedDiff,\n                deselected: uncheckedDiff\n            }\n        });\n    }, [ groups, onChange, selected ]);\n\n    const handleCheckboxGroupChange = useCallback((\n        checked: boolean,\n        groupIndex: number,\n        groupId: DistrictGroup['id']\n    ) => {\n        let checkedDiff = new Set<number>();\n        let uncheckedDiff = new Set<number>();\n\n        const groupIds = groups[groupIndex].items.map(item => item.id);\n\n        if (checked) {\n            checkedDiff = new Set(groupId ? [ groupId ] : groupIds);\n        } else {\n            uncheckedDiff = new Set(groupId && selected.has(groupId) ? [ groupId ] : groupIds);\n        }\n\n        onChange({\n            diff: {\n                selected: checkedDiff,\n                deselected: uncheckedDiff\n            }\n        });\n    }, [ groups, onChange, selected ]);\n\n    return (\n        <div className={cn()}>\n            {groups.map((group, groupIdx) => {\n                const { title, items, id: groupId } = group;\n\n                const isGroupIdChecked = groupId && selected.has(groupId);\n                const isGroupChecked = isGroupIdChecked || items.every(item => selected.has(item.id));\n                const isGroupItemChecked = ! isGroupChecked ? items.some(item => selected.has(item.id)) : false;\n\n                return (\n                    <div className={cn('group')} key={title}>\n                        <Checkbox\n                            name='districtGroupId'\n                            value={isGroupChecked || isGroupItemChecked}\n                            indeterminate={isGroupItemChecked}\n                            onChange={newValue => handleCheckboxGroupChange(newValue, groupIdx, groupId)}\n                        >\n                            <b>{ title }</b>\n                        </Checkbox>\n                        <div className={cn('list')}>\n                            {items.map(item => (\n                                <div className={cn('item', { isIntracity: item?.isIntracity })} key={item.id}>\n                                    <Checkbox\n                                        key={item.id}\n                                        name='districtId'\n                                        value={isGroupIdChecked || selected.has(item.id)}\n                                        onChange={\n                                            newValue => handleCheckboxChange(newValue, item.id, groupIdx, groupId)\n                                        }\n                                    >\n                                        {item.title}\n                                    </Checkbox>\n                                </div>\n                            ))}\n                        </div>\n                    </div>\n                );\n            })}\n        </div>\n    );\n};\n","import './styles.css';\n\nimport React, { useCallback, useMemo, Suspense } from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport { Tabs as DSTabs, Checkbox, Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { useKeyPress } from '@search/hooks/src/useKeyPress';\nimport { Modal, ModalClosedBy } from '@search/vtbeco-ui/src/components/Modal';\nimport MetroMapSelector from '@search/metro/src/view/components/MetroMapSelector';\nimport { formatNumber } from '@search/helpers/src/formatNumber';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\nimport { RegionIdEnum, AdditionalRegionWithMetroIdEnum } from '@search/filter-enums/enums/Region';\n\nimport { MobileTransportLimitFilterView2 } from '../../../mobile/transportLimit/MobileTransportLimitFilterView2';\nimport { FilterTagListItem2 } from '../FilterTagList2/FilterTagList2';\nimport type { GeoFilter, TransportLimitFilter } from '../../../../../models/Filter';\nimport { getDistrictCount, groupDistricts } from '../../../../../helpers/districtHelper';\nimport type { DistrictStore } from '../../../../../../../domain/geo/District';\nimport type { MetroStore } from '../../../../../../../domain/geo/MetroStation';\nimport { ESCAPE } from '../../../../../../constants/keycode';\nimport { DistrictControl } from '../../../../../../common/components/DistrictControl';\nimport GeoErrorBoundary from './GeoErrorBoundary';\n\nimport MetroSuggest from './MetroSuggest';\nimport { DistrictsTab } from './DistricsTab';\n\nconst metroMapMskSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapMsk'));\nconst metroMapSpbSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapSpb'));\nconst metroMapKznSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapKzn'));\nconst metroMapEkbSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapEkb'));\nconst metroMapNskSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapNsk'));\nconst metroMapNnvSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapNnv'));\nconst metroMapSmrSvg = React.lazy(() => import('./LazySvgMap/LazySvgMapSmr'));\n\nconst cn = classname.bind(null, 'GeoSelector');\n\n// TODO: Добавить соответствующий признак в данные (RS-1965)\nconst STATIONS_IN_RING_MSK = [\n    156, 215, 214, 213, 179, 79, 77, 76, 75, 74, 73, 154, 282, 281,\n    280, 279, 278, 314, 313, 312, 152, 180, 178, 177, 159, 31, 28,\n    25, 24, 22, 21, 19, 18, 151, 14567, 126, 14568, 124, 123, 129, 161, 162, 254, 128\n];\n\nexport enum TabsEnum {\n    metro,\n    district\n}\n\ninterface IProps {\n    count: number;\n    regionId: RegionIdEnum | AdditionalRegionWithMetroIdEnum;\n    activeTab: TabsEnum;\n    metro: MetroStore;\n    districts: DistrictStore;\n    geoFilter: GeoFilter;\n    onTabChange: (tab: TabsEnum) => void;\n    onClose: () => void;\n    onSubmit: () => void;\n    onChange: (data: any) => void;\n    transportLimitFilter: TransportLimitFilter;\n    onChangeTransportLimitChange: (tranpostLimitFilter: TransportLimitFilter) => void;\n}\n\nexport const GeoSelector: React.FC<IProps> = React.memo(({\n    count,\n    regionId,\n    activeTab,\n    metro,\n    districts,\n    onTabChange,\n    onClose,\n    onChange,\n    onSubmit,\n    geoFilter,\n    transportLimitFilter,\n    onChangeTransportLimitChange\n}) => {\n    const allowedTabs = [];\n    const isMetroTab = activeTab === TabsEnum.metro;\n\n    const isKeyPressed = useKeyPress(ESCAPE);\n\n    if (isKeyPressed) {\n        onClose();\n    }\n\n    if (! districts.isEmpty()) {\n        allowedTabs.push(TabsEnum.district);\n    }\n\n    const value = useMemo(() => ({\n        metroIds: new Set(geoFilter.metroIds),\n        districtIds: new Set(geoFilter.districtIds)\n    }), [ geoFilter ]);\n\n    const districtGroups = useMemo(() => groupDistricts({\n        districts: districts.items,\n        regionId: regionId as RegionIdEnum\n    }), [ districts, regionId ]);\n\n    const districtCount = useMemo(\n        () => getDistrictCount([ ...value.districtIds ], districtGroups),\n        [ value.districtIds, districtGroups ]\n    );\n\n    const handleModalRequestClose = useCallback((closeBy: ModalClosedBy) => {\n        if (closeBy !== ModalClosedBy.ClickOutside) {\n            onClose();\n        }\n    }, [ onClose ]);\n\n    const handleSelectedRemove = useCallback(() => {\n        onChange({\n            [isMetroTab ? 'metroIds' : 'districtIds']: {\n                diff: {\n                    deselected: new Set(isMetroTab ? value.metroIds : value.districtIds)\n                }\n            }\n        });\n    }, [ onChange, isMetroTab, value ]);\n\n    const handleMetroChange = useCallback(data => {\n        onChange({\n            metroIds: data\n        });\n    }, [ onChange ]);\n\n    const handleDistrictsChange = useCallback(data => {\n        onChange({\n            districtIds: data\n        });\n    }, [ onChange ]);\n\n    const [ metroMapSvg, isMetroMapSvgVertical ] = useMemo<\n        [] |\n        [ typeof metroMapMskSvg ] |\n        [ typeof metroMapMskSvg, boolean ]\n    >(() => {\n        switch (regionId) {\n            case RegionIdEnum.MSK:\n            case RegionIdEnum.MSK_OBL:\n            case RegionIdEnum.MSK_AND_MSK_OBL:\n                return [ metroMapMskSvg ];\n\n            case RegionIdEnum.SPB:\n            case RegionIdEnum.SPB_AND_LEN_OBL:\n            case RegionIdEnum.LEN_OBL:\n                return [ metroMapSpbSvg ];\n\n            case AdditionalRegionWithMetroIdEnum.KZN:\n                return [ metroMapKznSvg, true ];\n\n            case AdditionalRegionWithMetroIdEnum.EKB:\n                return [ metroMapEkbSvg, true ];\n\n            case AdditionalRegionWithMetroIdEnum.NSK:\n                return [ metroMapNskSvg, true ];\n\n            case AdditionalRegionWithMetroIdEnum.NNV:\n                return [ metroMapNnvSvg, true ];\n\n            case AdditionalRegionWithMetroIdEnum.SMR:\n                return [ metroMapSmrSvg, true ];\n\n            default:\n                return [];\n        }\n    }, [ regionId ]);\n\n    const isMskOrObl = useMemo(() => {\n        return (\n            regionId === RegionIdEnum.MSK_AND_MSK_OBL ||\n            regionId === RegionIdEnum.MSK_OBL ||\n            regionId === RegionIdEnum.MSK\n        );\n    }, [ regionId ]);\n\n    if (metroMapSvg) {\n        allowedTabs.push(TabsEnum.metro);\n    }\n\n    const isMetroInRingSelected = STATIONS_IN_RING_MSK.every(id => value.metroIds.has(id));\n\n    const handleMetroInRingCheck = useCallback(() => {\n        onChange({\n            metroIds: {\n                diff: {\n                    [isMetroInRingSelected ? 'deselected' : 'selected']: new Set(STATIONS_IN_RING_MSK)\n                }\n            }\n        });\n    }, [ onChange, isMetroInRingSelected ]);\n\n    let selectedText;\n\n    if (isMetroTab) {\n        if (value.metroIds.size) {\n            selectedText = `${value.metroIds.size} ${declensionByNumber(value.metroIds.size, [\n                'станция', 'станции', 'станций'\n            ])}`;\n        }\n    } else {\n        if (districtCount) {\n            selectedText = `${districtCount} ${declensionByNumber(districtCount, [\n                'район', 'района', 'районов'\n            ])}`;\n        }\n    }\n\n    const tabs = useMemo<[TabsEnum, string, boolean][]>(() => ([\n        [ TabsEnum.metro, 'Метро', value.metroIds.size > 0 ],\n        [ TabsEnum.district, 'Район', value.districtIds.size > 0 ]\n    ]), [ value.metroIds.size, value.districtIds.size ]);\n\n    const MetroSvgComponent = metroMapSvg;\n\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const showDistrictControl = regionId === RegionIdEnum.SPB || regionId === RegionIdEnum.MSK;\n\n    return (\n        <Modal\n            dataTest='filter-geo-modal'\n            borderRadius='none'\n            onRequestClose={handleModalRequestClose}\n            contentClassName={cn('modal')}\n        >\n            <div className={cn()}>\n                <div className={cn('content', { displayedDistricts: ! isMetroTab })}>\n                    <div className={cn('metro-map-selector')} style={{ display: isMetroTab ? undefined : 'none' }}>\n                        {\n                            MetroSvgComponent ? (\n                                <GeoErrorBoundary>\n                                    <Suspense fallback=''>\n                                        <MetroSvgComponent>\n                                            {\n                                                svg =>\n                                                    <MetroMapSelector\n                                                        svg={svg}\n                                                        vertical={isMetroMapSvgVertical}\n                                                        selected={value.metroIds}\n                                                        onChange={handleMetroChange}\n                                                    />\n                                            }\n                                        </MetroSvgComponent>\n                                    </Suspense>\n                                </GeoErrorBoundary>\n                            ) : null\n                        }\n                    </div>\n                    {isMetroTab ? null : (\n                        <DistrictsTab\n                            groups={districtGroups}\n                            selected={value.districtIds}\n                            onChange={handleDistrictsChange}\n                        />\n                    )}\n                </div>\n\n                <div className={cn('filters')}>\n                    <div className={cn('tabs-container')}>\n                        <Tabs\n                            tabs={tabs}\n                            activeTab={activeTab}\n                            onChange={onTabChange}\n                            allowedTabs={allowedTabs}\n                        />\n                    </div>\n\n                    {showDistrictControl || isMetroTab ? (\n                        <div className={cn('grid-row-standart')}>\n                            {isMetroTab ? (<>\n                                <MetroSuggest\n                                    metro={metro}\n                                    selected={value.metroIds}\n                                    onChange={handleMetroChange}\n                                    className={cn('metroSuggest')}\n                                />\n                                {isMskOrObl ? (\n                                    <Checkbox\n                                        value={isMetroInRingSelected}\n                                        onChange={handleMetroInRingCheck}\n                                    >\n                                        Станции внутри кольца\n                                    </Checkbox>\n                                ) : null}\n                                <MobileTransportLimitFilterView2\n                                    filter={transportLimitFilter}\n                                    isTitle\n                                    onChange={onChangeTransportLimitChange}\n                                    containerClass={cn('grid-transportLimit')}\n                                    desktopTitleGap\n                                />\n                            </>) : null}\n                            {showDistrictControl && ! isMetroTab ? (\n                                <DistrictControl\n                                    regionId={regionId}\n                                    onChange={handleDistrictsChange}\n                                    selectedDistricts={value.districtIds}\n                                />\n                            ) : null}\n                        </div>\n                    ) : null}\n                    <div className={cn('bottom-block')}>\n                        {selectedText ? (\n                            <FilterTagListItem2\n                                view='ellipse'\n                                id='geo-modal-suggest'\n                                onDelete={handleSelectedRemove}\n                            >\n                                {selectedText}\n                            </FilterTagListItem2>\n                        ) : null}\n                        <Button\n                            fullWidth\n                            onClick={onSubmit}\n                        >\n                            {`Показать${count ? ' ' + formatNumber(count) : ''}`}\n                        </Button>\n                    </div>\n                </div>\n                <div className={cn('close')} onClick={onClose}>\n                    <Icon name='times' />\n                </div>\n            </div>\n        </Modal>\n    );\n});\n\ninterface ITabsProps {\n    tabs: [TabsEnum, string, boolean][];\n    activeTab: TabsEnum;\n    onChange: (activeTab: TabsEnum) => void;\n    allowedTabs: TabsEnum[];\n}\n\nconst Tabs: React.FC<ITabsProps> = React.memo(({ activeTab, onChange, allowedTabs, tabs }) => {\n    return (\n        <DSTabs variant='text' size='s' onChange={onChange} f>\n            {\n                tabs.filter(([ type ]) => allowedTabs.includes(type as TabsEnum))\n                    .map((item: [TabsEnum, string, boolean]) => {\n                        const isActive = item[0] === activeTab;\n\n                        return (\n                            <DSTabs.Option\n                                active={item[0] === activeTab}\n                                key={item[0]}\n                                data-test={`filter-geo-selector-tab-${item[0]}`}\n                                value={item[0]}\n                            >\n                                {item[1]}\n                                {item[2] && ! isActive ? (\n                                    <span className={cn('tab-text-mark')} />\n                                ) : null}\n                            </DSTabs.Option>\n                        );\n                    })\n            }\n        </DSTabs>\n    );\n});\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\n\nimport { Accreditation } from '@search/filter-enums/enums';\n\nimport { AccreditationFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n    [ Accreditation.ACCREDITED_BY_VTB, 'Аккредитовано ВТБ' ]\n];\n\ninterface IProps {\n    filter: AccreditationFilter;\n    handleChange: (filter: AccreditationFilter) => void;\n}\n\nexport const DesktopAccreditationFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new AccreditationFilter(val));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Аккредитация'>\n            <CheckboxGroup2\n                mode='check'\n                name='accreditation'\n                onChange={onChange}\n                value={filter.accreditation}\n                colRestriction={2}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { BuildingClass } from '@search/filter-enums/enums';\n\nimport { BuildingClassFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n    [ BuildingClass.ECONOMY, 'Эконом' ],\n    [ BuildingClass.COMFORT, 'Комфорт' ],\n    [ BuildingClass.COMFORT_PLUS, 'Комфорт+' ],\n    [ BuildingClass.BUSINESS, 'Бизнес' ],\n    [ BuildingClass.ELITE, 'Элитный' ]\n];\n\ninterface IProps {\n    filter: BuildingClassFilter;\n    handleChange: (filter: BuildingClassFilter) => void;\n}\n\nexport const DesktopBuildingClassFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new BuildingClassFilter(val));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Класс ЖК'>\n            <CheckboxGroup2\n                mode='check'\n                name='buildingClass'\n                onChange={onChange}\n                value={filter.buildingClass}\n                colRestriction={3}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\nimport Grid from '@vtblife/uikit-grid';\nimport { Checkbox, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport { ClosedSalesFilter } from '../../../../models/Filter';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nimport './DesktopClosedSalesFilterView.css';\n\ninterface IProps {\n    filter: ClosedSalesFilter;\n    handleChange: (filter: ClosedSalesFilter) => void;\n}\n\nconst cn = classname.bind(null, 'DesktopClosedSalesFilterView');\n\nconst TRUE = 'TRUE';\n\nexport const DesktopClosedSalesFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new ClosedSalesFilter(\n                val.includes(TRUE)\n            ));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <div className={cn()}>\n            <Grid\n                cols={2}\n                variables={{\n                    '--row-gap-xs': '20px',\n                    '--row-gap-s': '20px',\n                    '--row-gap-m': '20px',\n                    '--row-gap-l': '20px',\n                    '--row-gap-xl': '20px',\n                    '--column-gap-xs': '20px',\n                    '--column-gap-s': '20px',\n                    '--column-gap-m': '20px',\n                    '--column-gap-l': '20px',\n                    '--column-gap-xl': '20px'\n                }}\n            >\n                <Grid.Cell>\n                    <CheckboxGroup2\n                        mode='check'\n                        name='closedSales'\n                        onChange={onChange}\n                        value={filter.includingClosedSales ? [ TRUE ] : []}\n                        isFilter\n                    >\n                        {[\n                            <Checkbox\n                                variant='filter'\n                                key='closedSales-checkbox'\n                                name={TRUE}\n                                block\n                            >\n                                С закрытыми продажами\n                            </Checkbox>\n                        ]}\n                    </CheckboxGroup2>\n                </Grid.Cell>\n                <Grid.Cell>\n                    <Typography\n                        variant='tiny-alone'\n                        color='minor'\n                        className={cn('explanation')}\n                    >\n                        Новостройки, в которых все квартиры от застройщика проданы или продажи временно приостановлены\n                    </Typography>\n                </Grid.Cell>\n            </Grid>\n        </div>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { NewBuildingDeal } from '@search/filter-enums/enums';\n\nimport { NewBuildingDealFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n    [ NewBuildingDeal.LAW_214, '214 ФЗ' ],\n    [ NewBuildingDeal.ESCROW, 'Эскроу-счета' ]\n];\n\ninterface IProps {\n    filter: NewBuildingDealFilter;\n    handleChange: (filter: NewBuildingDealFilter) => void;\n}\n\nexport const DesktopNewBuildingDealFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new NewBuildingDealFilter(val));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Сделка'>\n            <CheckboxGroup2\n                mode='check'\n                name='newBuildingDeal'\n                onChange={onChange}\n                value={filter.deal}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { PaymentType } from '@search/filter-enums/enums';\n\nimport { PaymentTypeFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n    [ PaymentType.ARMY_MORTGAGE, 'Военная ипотека' ],\n    [ PaymentType.INSTALLMENT, 'Рассрочка' ],\n    [ PaymentType.MOTHER_CAPITAL, 'Материнский капитал' ]\n];\n\ninterface IProps {\n    filter: PaymentTypeFilter;\n    handleChange: (filter: PaymentTypeFilter) => void;\n}\n\nexport const DesktopPaymentTypeFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new PaymentTypeFilter(val));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Покупка'>\n            <CheckboxGroup2\n                mode='check'\n                name='paymentType'\n                onChange={onChange}\n                value={filter.type}\n                colRestriction={2}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport { Position } from '@search/filter-enums/enums';\n\nimport { PositionFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n    [ Position.STANDALONE, 'Одиночное здание' ]\n];\n\nconst cn = classname.bind(null, 'DesktopPositionFilterView');\n\ninterface IProps {\n    filter: PositionFilter;\n    handleChange: (filter: PositionFilter) => void;\n}\n\nexport const DesktopPositionFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback((val: string | string[] | null) => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new PositionFilter(val as Position[]));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2\n            className='DesktopPositionFilterView'\n            filterTitle='Размер ЖК'\n        >\n            <CheckboxGroup2\n                mode='check'\n                name='position'\n                onChange={onChange}\n                value={filter.position}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { Safety } from '@search/filter-enums/enums';\n\nimport { SafetyFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst ITEMS = [\n    [ Safety.GUARDED_AREA, 'Охрана' ],\n    [ Safety.CONCIERGE, 'Консьерж' ],\n    [ Safety.CLOSED_AREA, 'Закр. территория' ],\n];\n\ninterface IProps {\n    filter: SafetyFilter;\n    handleChange: (filter: SafetyFilter) => void;\n}\n\nexport const DesktopSafetyFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback((val: string | number | string[] | null) => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new SafetyFilter(val as Safety[]));\n        }\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Безопасность'>\n            <CheckboxGroup2\n                mode='check'\n                name='safety'\n                onChange={onChange}\n                value={filter.safety}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\n\nimport { ParkingFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IParkingFilterProps {\n    filter: ParkingFilter;\n    handleChange: (filter: ParkingFilter) => void;\n}\n\nenum Parking {\n    Closed = 1,\n    Underground = 2,\n    Opened = 3\n}\n\nconst parkingEnumeration = [\n    Parking.Closed,\n    Parking.Underground,\n    Parking.Opened\n];\n\nconst parkingMapping = {\n    [Parking.Closed]: 'Закрытая',\n    [Parking.Underground]: 'Подземная',\n    [Parking.Opened]: 'Открытая'\n} as const;\n\nexport const DesktopParkingFilterView: React.FC<IParkingFilterProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new ParkingFilter(val.map(elem => Number(elem))));\n        }\n    }, [ handleChange ]);\n\n    const component = parkingEnumeration.map(parking => {\n        return (\n            <Checkbox\n                variant='filter'\n                key={parking}\n                name={String(parking)}\n                block\n            >\n                {parkingMapping[parking]}\n            </Checkbox>\n        );\n    });\n\n    return (\n        <Filter2 filterTitle='Парковка'>\n            <CheckboxGroup2\n                mode='check'\n                name='parkingEnumeration'\n                onChange={onChange}\n                value={filter.parkings.map(elem => String(elem))}\n                isFilter\n            >\n                {component}\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import { AreaUnit } from '@search/filter-enums/enums';\n\nexport const priceTypeShortMapping = {\n    [AreaUnit.UNKNOWN]: 'за всё',\n    [AreaUnit.METER]: 'за м²',\n    [AreaUnit.ARE]: 'за сот.',\n    [AreaUnit.MORTGAGE_PAYMENT]: 'Платёж до'\n} as const;\n\nexport const priceTypeMapping = {\n    [AreaUnit.UNKNOWN]: 'За всё',\n    [AreaUnit.METER]: 'За м²',\n    [AreaUnit.ARE]: 'За сотку',\n    [AreaUnit.MORTGAGE_PAYMENT]: 'Платёж по ипотеке'\n} as const;\n\n","import React, { useCallback, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\nimport { AreaUnit } from '@search/filter-enums/enums/AreaUnit';\nimport { abbreviateNumber, formatLocaleNumber } from '@search/helpers/src/formatNumber';\n\nimport { NumberInputRange } from '../NewNumberInputRange/NumberInputRange';\nimport type { INumberRange } from '../../../types/IRange';\n\nimport { priceTypeMapping } from './priceTypeMapping';\nimport './PriceInput.css';\n\nconst cn = classname.bind(null, 'PriceInput');\n\ninterface IPriceInputProps {\n    className?: string;\n    isShowPriceType?: boolean;\n    isShowReset?: boolean;\n    range: INumberRange;\n    priceType?: AreaUnit;\n    priceTypes?: AreaUnit[];\n    pricePreset?: INumberRange[];\n    handlePriceType: (priceType: AreaUnit) => void;\n    handleChange: (value: INumberRange) => void;\n    handleFrom: (value: number | null) => void;\n    handleTo: (value: number | null) => void;\n    handleReset?: () => void;\n    mortgageInput?: React.ReactNode;\n}\n\ntype FocusPosition = 'from' | 'to';\n\nexport const PriceInput: React.FC<IPriceInputProps> = ({\n    className,\n    isShowReset = false,\n    range,\n    pricePreset = [],\n    priceTypes = [ AreaUnit.UNKNOWN ],\n    priceType = AreaUnit.UNKNOWN,\n    handlePriceType,\n    handleChange,\n    handleFrom,\n    handleTo,\n    handleReset = function() {},\n    mortgageInput\n}) => {\n    const [ focusPosition, updateFocusPosition ] = useState<FocusPosition>('to');\n    const isShowPriceType = ! (priceTypes.length === 1 && priceTypes[0] === AreaUnit.UNKNOWN);\n\n    const handleFocusMin = useCallback(() => {\n        updateFocusPosition('from');\n    }, []);\n\n    const handleFocusMax = useCallback(() => {\n        updateFocusPosition('to');\n    }, []);\n\n    return (\n        <div className={cn('popup-container', undefined, className)}>\n            <div className={cn('toolbar')}>\n                <div className={cn('price-types')}>\n                    { isShowPriceType && priceTypes.map(type => (\n                        <Typography\n                            key={type.toString()}\n                            className={cn('price-type-item', { active: type === priceType, mortgagePayment: type === AreaUnit.MORTGAGE_PAYMENT })}\n                            data-test={`price-type-${type}`}\n                            onClick={() => handlePriceType(type)}\n                        >\n                            {\n                                // @ts-ignore\n                                priceTypeMapping[type]\n                            }\n                            {type === AreaUnit.MORTGAGE_PAYMENT ? (\n                                <span className={cn('circle')}>&#9679;</span>\n                            ) : null}\n                        </Typography>\n                    ))}\n                </div>\n                {isShowReset && (\n                    <Typography\n                        tag='span'\n                        onClick={handleReset}\n                        className={cn('reset')}\n                        data-test='price-reset'\n                    >\n                        Сбросить\n                    </Typography>\n                )}\n            </div>\n            {priceType === AreaUnit.MORTGAGE_PAYMENT ? mortgageInput : <>\n                <NumberInputRange\n                    size='s'\n                    unit='₽'\n                    value={range}\n                    onChange={handleChange}\n                    focusFrom={handleFocusMin}\n                    focusTo={handleFocusMax}\n                    nameFrom='priceFrom'\n                    nameTo='priceTo'\n                />\n                <div className={cn('price-presets')}>\n                    {\n                        pricePreset.map(item => {\n                            const { value: fromValue, type: fromType } = abbreviateNumber(item.from, { thousandsAsNumber: true });\n                            const { value: toValue, type: toType } = abbreviateNumber(item.to, { thousandsAsNumber: true });\n\n                            return (\n                                <div\n                                    key={item.from!.toString()}\n                                    className={cn('predefined-prices')}\n                                    data-test='price-preset'\n                                >\n                                    <div\n                                        className={cn('price-item', { focus: focusPosition === 'from', active: range.from === item.from })}\n                                        data-test={`price-preset-from-${item.from}`}\n                                        onClick={() => {\n                                            if (focusPosition === 'from') {\n                                                handleFrom(item.from);\n                                                updateFocusPosition('to');\n                                            }\n                                        }}\n                                    >\n                                        {\n                                            focusPosition === 'from' && `${formatLocaleNumber(fromValue!)} ${fromType}`\n                                        }\n                                    </div>\n                                    <div\n                                        className={cn('price-item', { focus: focusPosition === 'to', active: range.to === item.to })}\n                                        data-test={`price-preset-to-${item.to}`}\n                                        onClick={() => {\n                                            if (focusPosition === 'to') {\n                                                handleTo(item.to);\n                                            }\n                                        }}\n                                    >\n                                        {\n                                            focusPosition === 'to' && `${formatLocaleNumber(toValue!)} ${toType}`\n                                        }\n                                    </div>\n                                </div>\n                            );\n                        })\n                    }\n                </div>\n            </>}\n        </div>\n    );\n};\n","import { formatPrice } from '@search/helpers/src/formatPrice';\nimport { Currency } from '@search/filter-enums/enums/Currency';\n\nexport const MINIMAL_MORTGAGE_PAYMENT = 15000;\nexport const minMortgagePaymentFormatted = formatPrice({\n    value: MINIMAL_MORTGAGE_PAYMENT * 100,\n    currency: Currency.RUB,\n});\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { Checkbox, Dropdown, useDropdown, NumberInput, Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\n// @ts-ignore\nimport classname from '@search/classname/src';\n// @ts-ignore\nimport { AreaUnit } from '@search/filter-enums/enums/AreaUnit';\n// @ts-ignore\nimport { formatNumber, formatRange } from '@search/helpers/src/formatNumber';\nimport { PredefinedPrice } from '../../../../types/PredefinedPrice';\nimport { MortgagePaymentFilter, PriceFilter } from '../../../../models/Filter';\nimport { PriceInput } from '../../../common/PriceInput/PriceInput';\nimport { priceTypeShortMapping } from '../../../common/PriceInput/priceTypeMapping';\nimport { FilterSelectButton, FilterSelectButtonBorderSide } from '../../../common/FilterSelect';\nimport { MINIMAL_MORTGAGE_PAYMENT, minMortgagePaymentFormatted } from '../../../../helpers/contants';\nimport { INumberRange } from '../../../../types/IRange';\n\nimport './DesktopPriceFilterView.css';\n\nconst cn = classname.bind(null, 'DesktopPriceFilterView');\n\ninterface IMortgagePaymentInput {\n    preset?: number[];\n    onChange: (filter: PriceFilter | MortgagePaymentFilter) => void;\n    filter: MortgagePaymentFilter;\n    priceFilter?: PriceFilter;\n    mobile?: boolean;\n    handlePriceType?: (priceType: AreaUnit) => void;\n    toggle?: (update?: boolean) => void;\n}\n\ninterface IDesktopPriceFilterViewProps {\n    filter: PriceFilter;\n    mortgagePaymentFilter?: MortgagePaymentFilter;\n    priceTypes?: AreaUnit[];\n    pricePreset?: PredefinedPrice[] | number[];\n    onChange: (filter: PriceFilter | MortgagePaymentFilter) => void;\n    updateFewFilters?: (filters: (PriceFilter | MortgagePaymentFilter)[]) => void;\n    isLarge?: boolean;\n    inputBorderSide?: FilterSelectButtonBorderSide;\n}\n\nfunction getAreaUnitPlaceholder(filter: PriceFilter, priceTypes: AreaUnit[]) {\n    const { from, to } = filter.value;\n    const priceType = filter.priceType;\n\n    if (priceTypes.length === 1 && priceTypes[0] === AreaUnit.UNKNOWN) {\n        return '';\n    }\n\n    if (priceTypes.length > 1 && (from || to)) {\n        // @ts-ignore\n        return priceTypeShortMapping[priceType];\n    }\n\n    return '';\n}\n\nexport const DesktopPriceFilterView : React.FC<IDesktopPriceFilterViewProps> = props => {\n    return (\n        <Dropdown>\n            <DesktopPriceFilterViewWithoutDropdown {...props} />\n        </Dropdown>\n    );\n};\n\nconst DesktopPriceFilterViewWithoutDropdown: React.FC<IDesktopPriceFilterViewProps> = ({\n    filter,\n    mortgagePaymentFilter,\n    pricePreset = [],\n    priceTypes = [ AreaUnit.UNKNOWN ],\n    onChange,\n    isLarge,\n    inputBorderSide = 'square',\n    updateFewFilters,\n}) => {\n    const { toggle, opened, registerControl } = useDropdown();\n    const control = useRef<HTMLButtonElement | null>(null);\n\n    useEffect(() => {\n        registerControl(control.current as HTMLElement);\n    }, [ registerControl ]);\n\n    const handleChange = useCallback((value: INumberRange) => {\n        if (mortgagePaymentFilter) {\n            onChange(new MortgagePaymentFilter());\n        }\n        onChange(new PriceFilter(filter.priceType, value));\n    }, [ filter.priceType, onChange, mortgagePaymentFilter ]);\n    const handleChangeMortgagePayment = useCallback((newFilter: MortgagePaymentFilter | PriceFilter) => {\n        if (newFilter instanceof MortgagePaymentFilter && newFilter.payment && updateFewFilters) {\n            updateFewFilters([ new PriceFilter(filter.priceType, { from: null, to: null }), newFilter ]);\n        } else {\n            onChange(newFilter);\n        }\n    }, [ filter.priceType, onChange, updateFewFilters ]);\n\n    const handleFrom = useCallback((value: INumberRange['from']) => {\n        onChange(new PriceFilter(filter.priceType, { from: value, to: filter.value.to }));\n    }, [ filter.priceType, onChange, filter.value.to ]);\n\n    const handleTo = useCallback((value: INumberRange['to']) => {\n        toggle();\n        onChange(new PriceFilter(filter.priceType, { from: filter.value.from, to: value }));\n    }, [ filter.priceType, onChange, filter.value.from, toggle ]);\n\n    const handlePriceType = useCallback((value: AreaUnit) => {\n        onChange(new PriceFilter(value, filter.value));\n    }, [ onChange, filter ]);\n\n    const handleReset = useCallback(() => {\n        if (mortgagePaymentFilter) onChange(new MortgagePaymentFilter(null));\n        onChange(new PriceFilter(filter.priceType, { from: null, to: null }));\n        toggle();\n    }, [ filter.priceType, onChange, toggle ]);\n\n    const { from, to } = filter.value;\n\n    const placeholder = formatRange(\n        from,\n        to\n    );\n\n    const areaUnitPlaceholder = getAreaUnitPlaceholder(filter, priceTypes);\n\n    const mortgageInput = mortgagePaymentFilter ? (<MortgagePaymentInput\n        filter={mortgagePaymentFilter}\n        priceFilter={filter}\n        preset={pricePreset as number[]}\n        onChange={handleChangeMortgagePayment}\n        handlePriceType={handlePriceType}\n        toggle={toggle}\n    />) : null;\n\n    return (\n        <div className={cn()}>\n            <FilterSelectButton\n                size={isLarge ? 'l' : 'm'}\n                dataTest='price-trigger'\n                side={inputBorderSide}\n                ref={control}\n                // @ts-ignore\n                onClick={toggle}\n                focused={opened}\n                className={cn('trigger')}\n                icon={<Icon name={opened ? 'chevron-up' : 'chevron-down'} size='s' />}\n            >\n                {filter.priceType === AreaUnit.MORTGAGE_PAYMENT && mortgagePaymentFilter ? <span style={{ marginRight: 4 }}>\n                    {mortgagePaymentFilter.payment ? `Платёж до ${formatNumber(mortgagePaymentFilter.payment)}₽ / мес.` : 'Платёж'}\n                </span> : (\n                    <>\n                        <span style={{ marginRight: 4 }}>{placeholder ? `${placeholder} ₽` : 'Цена'}</span>\n                        <span>{areaUnitPlaceholder}</span>\n                    </>\n                )}\n            </FilterSelectButton>\n            <Dropdown.Content adaptivePlacement={false}>\n                <PriceInput\n                    isShowReset\n                    handleReset={handleReset}\n                    range={filter.value}\n                    priceType={filter.priceType}\n                    priceTypes={priceTypes}\n                    // @ts-ignore\n                    pricePreset={pricePreset}\n                    handlePriceType={handlePriceType}\n                    handleChange={handleChange}\n                    handleFrom={handleFrom}\n                    handleTo={handleTo}\n                    mortgageInput={mortgageInput}\n                />\n            </Dropdown.Content>\n        </div>\n    );\n};\n\nexport const MortgagePaymentInput: React.FC<IMortgagePaymentInput> = ({\n    preset,\n    filter,\n    onChange,\n    mobile = false,\n    handlePriceType,\n    toggle\n}) => {\n    const handleChange = useCallback((payment: number) => {\n        if (isNaN(payment)) {\n            onChange(new MortgagePaymentFilter());\n            handlePriceType?.(AreaUnit.UNKNOWN);\n        } else {\n            onChange(new MortgagePaymentFilter(payment));\n        }\n    }, [ onChange, handlePriceType ]);\n\n    return (\n        <div className={cn('filter.payment')}>\n            <NumberInput\n                value={filter.payment ?? undefined}\n                onChange={handleChange}\n                error={Boolean(filter.payment && filter.payment < MINIMAL_MORTGAGE_PAYMENT)}\n                size='s'\n                placeholder='до'\n                postfix='₽ / мес.'\n            />\n            {filter.payment && filter.payment < MINIMAL_MORTGAGE_PAYMENT ? (\n                <Typography color='link-alt-bg-hover' variant='secondary-alone' className={cn('error')}>\n                    Минимальный платёж по&nbsp;ипотеке в&nbsp;вашем регионе&nbsp;&mdash; {minMortgagePaymentFormatted}&nbsp;₽/мес.\n                </Typography>) :\n                null\n            }\n            {! mobile ? <div className={cn('presets')}>\n                {preset?.map(value => (\n                    <div key={value}>\n                        <Checkbox\n                            variant='filter'\n                            value={filter.payment === value}\n                            onChange={(v) => {\n                                toggle?.();\n                                if (v) handleChange(value);\n                            }}\n                            block\n                        >\n                            {formatNumber(value)}\n                        </Checkbox>\n                    </div>\n                ))}\n            </div> : null}\n        </div>\n    );\n};\n","import React, { useCallback, useMemo, useState } from 'react';\n\nimport { Select, Dropdown, useSelect } from '@vtblife/uikit';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { useGeoUserRegion } from '@search/geo/src/useGeoUserRegion';\nimport {\n    getFilteredFlatRegionSelectOptions,\n    getSelectedOptionLabel\n} from '../../../../helpers/regionHelper';\nimport defaultRegionSelectOptions from '../../../../../../dict/filters/regions';\nimport { RegionFilter } from '../../../../../filters/models/Filter';\nimport {\n    RenderRegionSelectUikitContent,\n    OptionTypeRegionFilter, GroupedOptions,\n    MIN_OPTIONS_NUMBER_WITH_INPUT\n} from '../../region/RenderRegionSelectUikitContent';\n\ninterface IProps {\n    filter: RegionFilter;\n    options?: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[];\n    onChange: (filter: RegionFilter) => void;\n    emptyText?: React.ReactNode;\n}\n\nconst defaultOptions = defaultRegionSelectOptions.map(option => ({\n    ...option,\n    value: String(option.value)\n}));\n\nexport const DesktopRegionFilterView: React.FC<IProps> = ({\n    filter,\n    options = defaultOptions,\n    onChange,\n    emptyText\n}) => {\n    const [ searchInputValue, setSearchInputValue ] = useState('');\n    const resetSearchInputValue = useCallback(() => setSearchInputValue(''), []);\n    const { setRegionId } = useGeoUserRegion();\n    const value = String(filter.region || RegionIdEnum.MSK_AND_MSK_OBL);\n\n    const { is, handleChange: handleSelectChange } = useSelect(\n        (newValue: string) => {\n            const parsedValue = parseInt(newValue, 10) as RegionIdEnum;\n\n            setRegionId(parsedValue);\n            onChange(new RegionFilter(parsedValue));\n        },\n        { selected: value }\n    );\n\n    const title = useMemo(\n        () => getSelectedOptionLabel(value, options),\n        [ value, options ]\n    );\n\n    let currentOptions = options;\n\n    if (searchInputValue.length) {\n        currentOptions = getFilteredFlatRegionSelectOptions(searchInputValue, options);\n    }\n\n    return (\n        <Select\n            onChange={handleSelectChange}\n            dataTest='region'\n            onToggle={() => {\n                resetSearchInputValue();\n            }}\n        >\n            <Dropdown.Control arrow size='s' dataTest='region-trigger'>{title}</Dropdown.Control>\n            <Select.Content\n                height={310}\n                adaptiveHeight={false}\n                adaptivePlacement={false}\n                placement='local'\n            >\n                <RenderRegionSelectUikitContent\n                    is={is}\n                    searchInputValue={searchInputValue}\n                    emptyText={emptyText}\n                    setSearchInputValue={setSearchInputValue}\n                    showInput={options.length >= MIN_OPTIONS_NUMBER_WITH_INPUT}\n                    options={currentOptions}\n                />\n            </Select.Content>\n        </Select>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Select, useMultipleSelect } from '@vtblife/uikit';\nimport { SelectMode, OptionType, SelectProps } from '@vtblife/uikit/legacy';\nimport { Rooms } from '@search/filter-enums/enums/Rooms';\nimport { RoomFilter } from '../../../../models/Filter';\n\ninterface IProps {\n    filter: RoomFilter;\n    onChange: (filter: RoomFilter) => void;\n    isLarge?: boolean;\n}\n\nconst SELECT_OPTIONS: OptionType<Rooms>[] = [\n    { label: 'Студия', value: Rooms.STUDIO },\n    { label: '1 комната', value: Rooms.ROOM_1 },\n    { label: '2 комнаты', value: Rooms.ROOM_2 },\n    { label: '3 комнаты', value: Rooms.ROOM_3 },\n    { label: '4 комнаты', value: Rooms.ROOM_4 },\n    { label: '5+ комнат', value: Rooms.ROOM_5_AND_MORE },\n    { label: 'Свободная планировка', value: Rooms.OPEN_PLAN }\n];\n\ntype Mutable<T> = {\n    -readonly[P in keyof T]: T[P]\n};\n\nexport const DesktopRoomsTypeFilterView: React.FC<IProps> = ({\n    filter,\n    onChange\n}) => {\n    const currentValues = new Set<Rooms>(filter.rooms);\n\n    const handleChange = useCallback<NonNullable<SelectProps<OptionType<Rooms>, SelectMode.Multiple>['onChange']>>(\n        val => {\n            onChange(new RoomFilter(val as Mutable<typeof val>));\n        },\n        [ onChange ]\n    );\n\n    const {\n        handleChange: handleChangeSelect,\n        is\n    } = useMultipleSelect<Rooms>(\n        handleChange,\n        {\n            selected: filter.rooms\n        }\n    );\n\n    return (\n        <Select mode='multiple' onChange={handleChangeSelect}>\n            <Select.Button dataTest='rooms-trigger'>\n                {currentValues.size > 0 ?\n                    renderCustomTitle(SELECT_OPTIONS.filter(({ value }) => currentValues.has(value))) :\n                    'Комнат'\n                }\n            </Select.Button>\n            <Select.Content adaptivePlacement={false}>\n                {SELECT_OPTIONS.map(({ value, label }) => (\n                    <Select.Option\n                        key={value}\n                        selected={is(value)}\n                        value={value}\n                    >{label}</Select.Option>\n                ))}\n            </Select.Content>\n        </Select>\n    );\n};\n\nexport const renderCustomTitle = (selectedOptions: OptionType<Rooms>[]) => {\n    const parsedValues = selectedOptions.map(({ value, ...rest }) => ({\n        value: Number(value) as Rooms,\n        ...rest\n    }));\n\n    if (parsedValues.length === 1) {\n        const [ room ] = parsedValues;\n\n        return room.value === Rooms.OPEN_PLAN ? 'Своб. план.' : room.label;\n    }\n\n    return parsedValues\n        .reduce<(Pick<OptionType, 'index'> & { customlabel: string })[]>(\n            (acc, opt, index, array) => {\n                let customlabel = opt.label;\n\n                if (opt.value === Rooms.STUDIO) customlabel = 'Ст.';\n                if (opt.value === Rooms.OPEN_PLAN) customlabel = 'св. пл.';\n                if ([\n                    Rooms.ROOM_1,\n                    Rooms.ROOM_2,\n                    Rooms.ROOM_3,\n                    Rooms.ROOM_4,\n                    Rooms.ROOM_5_AND_MORE\n                ].includes(opt.value)) {\n                    const [ count ] = opt.label.split(' ');\n                    const postFix = array.length < 3 ? ' комн.' : ' к.';\n\n                    customlabel = `${count}${array.length === index + 1 ? postFix : ''}`;\n                }\n\n                acc = [\n                    ...acc,\n                    {\n                        index: opt.index,\n                        customlabel\n                    }\n                ];\n\n                return acc;\n            }, [])\n        .sort((a, b) => a.index! - b.index!)\n        .map(opt => opt.customlabel)\n        .join(', ');\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { FlatsSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { FlatsSpecialEventsFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IDesktopFlatsSpecialEventsFilterViewProps {\n    filter: FlatsSpecialEventsFilter;\n    handleChange: (value: FlatsSpecialEventsFilter) => void;\n}\n\nconst ITEMS = [\n    [ FlatsSpecialEvent.FLAT_DISCOUNT, 'Скидка' ],\n    [ FlatsSpecialEvent.FLAT_INSTALLMENT_PLAN, 'Рассрочка' ],\n    [ FlatsSpecialEvent.FLAT_SALES_START, 'Старт продаж' ]\n];\n\nexport const DesktopFlatsSpecialEventsFilterView: React.FC<IDesktopFlatsSpecialEventsFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new FlatsSpecialEventsFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Квартиры'>\n            <CheckboxGroup2\n                mode='check'\n                name='flatsSpecialEvents'\n                onChange={onChange}\n                value={filter.value}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { MiscSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { MiscSpecialEventsFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IDesktopMiscSpecialEventsFilterViewProps {\n    filter: MiscSpecialEventsFilter;\n    handleChange: (value: MiscSpecialEventsFilter) => void;\n}\n\nconst ITEMS = [\n    [ MiscSpecialEvent.PROMO, 'Акция' ],\n    [ MiscSpecialEvent.GIFT, 'Подарок' ]\n];\n\nexport const DesktopMiscSpecialEventsFilterView: React.FC<IDesktopMiscSpecialEventsFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new MiscSpecialEventsFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Другое'>\n            <CheckboxGroup2\n                mode='check'\n                name='miscSpecialEvents'\n                onChange={onChange}\n                value={filter.value}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { OtherSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { OtherSpecialEventsFilter } from '../../../../models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\ninterface IDesktopOtherSpecialEventsFilterViewProps {\n    filter: OtherSpecialEventsFilter;\n    handleChange: (value: OtherSpecialEventsFilter) => void;\n}\n\nconst ITEMS = [\n    [ OtherSpecialEvent.OTHER_DISCOUNT, 'Скидка' ],\n    [ OtherSpecialEvent.OTHER_INSTALLMENT_PLAN, 'Рассрочка' ],\n    [ OtherSpecialEvent.OTHER_SALES_START, 'Старт продаж' ]\n];\n\nexport const DesktopOtherSpecialEventsFilterView: React.FC<IDesktopOtherSpecialEventsFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new OtherSpecialEventsFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Паркинг, кладовки'>\n            <CheckboxGroup2\n                mode='check'\n                name='otherSpecialEvents'\n                onChange={onChange}\n                value={filter.value}\n                isFilter\n            >\n                {\n                    ITEMS.map(([ value, label ]) => (\n                        <Checkbox\n                            variant='filter'\n                            key={value}\n                            name={value}\n                            block\n                        >\n                            {label}\n                        </Checkbox>\n                    ))\n                }\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Checkbox } from '@vtblife/uikit';\nimport { WallsType } from '@search/filter-enums/enums/WallsType';\n\nimport { WallsTypeFilter } from '../../../../../filters/models/Filter';\nimport { Filter2 } from '../../../new_filter/Filter2';\nimport { CheckboxGroup2 } from '../../../common/CheckboxGroup2';\n\nconst wallsEnumeration = [\n    WallsType.MONOLITH,\n    WallsType.PANEL,\n    WallsType.BRICK,\n    WallsType.BRICK_MONOLITH,\n    WallsType.BLOCK\n];\n\nconst wallsEnumerationWithWood = [\n    ...wallsEnumeration,\n    WallsType.WOOD\n];\n\nconst wallsMapping = {\n    [WallsType.MONOLITH]: 'Монолит',\n    [WallsType.PANEL]: 'Панель',\n    [WallsType.BRICK]: 'Кирпич',\n    [WallsType.BRICK_MONOLITH]: 'Кирпич-монолит',\n    [WallsType.BLOCK]: 'Блок',\n    [WallsType.WOOD]: 'Дерево'\n};\n\ninterface IWallsFilterProps {\n    withWood?: boolean;\n    filter: WallsTypeFilter;\n    handleChange: (filter: WallsTypeFilter) => void;\n}\n\nexport const DesktopWallsFilterView: React.FC<IWallsFilterProps> = ({\n    withWood = true,\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(val => {\n        if (val === null) {\n            return;\n        }\n\n        if (Array.isArray(val)) {\n            handleChange(new WallsTypeFilter(val));\n        }\n    }, [ handleChange ]);\n\n    const component = (withWood ? wallsEnumerationWithWood : wallsEnumeration).map(wall => {\n        return (\n            <Checkbox\n                variant='filter'\n                key={wall}\n                name={String(wall)}\n                block\n            >\n                {wallsMapping[wall]}\n            </Checkbox>\n        );\n    });\n\n    return (\n        <Filter2 filterTitle='Материал стен'>\n            <CheckboxGroup2\n                mode='check'\n                name='walls'\n                onChange={onChange}\n                value={filter.walls.map(elem => String(elem))}\n                colRestriction={3}\n                isFilter\n            >\n                {component}\n            </CheckboxGroup2>\n        </Filter2>\n    );\n};\n","/* eslint-disable no-shadow */\nimport React, { useCallback } from 'react';\n\nimport { Checkbox } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport classname from '@search/classname/src';\nimport { FloorConstraints } from '@search/filter-enums/enums/FloorConstraints';\n\nimport { FloorFilter } from '../../../models/Filter';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { Filter2, IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { CheckboxGroup2, ICheckboxGroupModificationProps } from '../../common/CheckboxGroup2';\n\nimport './FloorFilter.css';\n\nconst cn = classname.bind(null, 'FloorFilter');\n\ninterface IFloorFilterProps extends IFilterAvailableProps, ICheckboxGroupModificationProps {\n    filter: FloorFilter;\n    handleChange: (value: FloorFilter) => void;\n    renderFloorTotalFilter?: React.ReactElement;\n    classNameSubGroup?: string;\n}\n\nenum Floors {\n    NotFirst = 1,\n    NotLast = 2,\n    Last = 3\n}\n\nconst floorOptions = [ {\n    label: 'Не первый',\n    value: Floors.NotFirst\n}, {\n    label: 'Не последний',\n    value: Floors.NotLast\n}, {\n    label: 'Последний',\n    value: Floors.Last\n} ];\n\nexport const FloorFilterView: React.FC<IFloorFilterProps> = ({\n    filter,\n    handleChange,\n    renderFloorTotalFilter,\n    withoutTitle,\n    withoutGrid,\n    classNameGroup\n}) => {\n    const value = getValue(filter);\n    const valueSet = new Set(value);\n    const onChangeCtx = { filter, handleChange, valueSet };\n    const onChangeCtxRef = React.useRef(onChangeCtx);\n\n    onChangeCtxRef.current = onChangeCtx;\n\n    const onChange = useCallback((values: Floors[]) => {\n        const { filter, handleChange, valueSet } = onChangeCtxRef.current;\n\n        let newValue: Floors | undefined;\n        let isFirstSeen = false;\n        let isLastSeen = false;\n\n        values.forEach(val => {\n            const isNew = ! valueSet.has(val);\n\n            if (isNew) newValue = val;\n        });\n\n        let last: FloorConstraints = FloorConstraints.UNKNOWN;\n        let first: FloorConstraints = FloorConstraints.UNKNOWN;\n\n        if (newValue !== undefined) {\n            values.unshift(newValue);\n        }\n\n        values.forEach(newValue => {\n            if (! isFirstSeen && newValue === Floors.NotFirst) {\n                isFirstSeen = true;\n                first = FloorConstraints.EXCLUDE;\n            }\n            if (! isLastSeen && (newValue === Floors.NotLast || newValue === Floors.Last)) {\n                isLastSeen = true;\n                if (newValue === Floors.NotLast) last = FloorConstraints.EXCLUDE;\n                if (newValue === Floors.Last) last = FloorConstraints.ONLY;\n            }\n        });\n        handleChange(new FloorFilter(filter.range, first, last));\n    }, [ ]);\n\n    const handleRangeChange = useCallback(value => {\n        handleChange(new FloorFilter(value, filter.first, filter.last));\n    }, [ filter, handleChange ]);\n\n    const renderCheckboxGroup = (\n        <CheckboxGroup2\n            mode='check'\n            onChange={onChange}\n            name='floor'\n            value={value}\n            withoutGrid={withoutGrid}\n            classNameGroup={classNameGroup}\n            isFilter\n        >\n            {floorOptions.map(({ value: floorValue, label }) => (\n                <Checkbox\n                    variant='filter'\n                    name={floorValue}\n                    key={floorValue}\n                    block\n                >\n                    {label}\n                </Checkbox>\n            ))}\n        </CheckboxGroup2>\n    );\n\n    const renderFloorFilter = (\n        <Filter2\n            filterTitle={withoutTitle ? undefined : 'Этаж'}\n        >\n            <NumberInputRange\n                size={Size.Small}\n                fromLabel='от'\n                toLabel='до'\n                value={filter.range}\n                onChange={handleRangeChange}\n                max={1_000}\n                nameFrom='floorFrom'\n                nameTo='floorTo'\n            />\n        </Filter2>\n    );\n\n    return (<>\n        <div className={cn('group')}>\n            {renderFloorFilter}\n            {renderFloorTotalFilter}\n        </div>\n        {renderCheckboxGroup}\n    </>);\n};\n\nfunction getValue(filter: FloorFilter): Floors[] {\n    const result = [];\n\n    if (FloorConstraints.EXCLUDE === filter.first) {\n        result.push(Floors.NotFirst);\n    }\n    if (FloorConstraints.EXCLUDE === filter.last) {\n        result.push(Floors.NotLast);\n    }\n    if (FloorConstraints.ONLY === filter.last) {\n        result.push(Floors.Last);\n    }\n\n    return result;\n}\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { FloorsTotalFilter } from '../../../models/Filter';\nimport { INumberRange } from '../../../types/IRange';\nimport { MobileFilter2 } from '../../filter/MobileFilter2';\n\ninterface IFloorsTotalFilterViewProps extends IFilterAvailableProps {\n    filter: FloorsTotalFilter;\n    handleChange: (value: FloorsTotalFilter) => void;\n    isMobile?: boolean;\n}\n\nexport const FloorsTotalFilterView: React.FC<IFloorsTotalFilterViewProps> = ({\n    filter,\n    handleChange,\n    withoutTitle,\n    isMobile\n}) => {\n    const onChange = useCallback((value: INumberRange) => {\n        handleChange(new FloorsTotalFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter2 desktopTitleGap={! isMobile} filterTitle={withoutTitle ? undefined : 'Этажей в доме'}>\n            <NumberInputRange\n                size={Size.Small}\n                fromLabel='от'\n                toLabel='до'\n                value={filter.range}\n                onChange={onChange}\n                max={1_000}\n                nameFrom='floorsTotalFrom'\n                nameTo='floorsTotalTo'\n            ></NumberInputRange>\n        </MobileFilter2>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { NumberInput } from '@vtblife/uikit';\n\nimport { IFilterAvailableProps } from '../../new_filter/Filter2';\nimport { KitchenAreaFilter } from '../../../models/Filter';\nimport { MobileFilter2 } from '../../filter/MobileFilter2';\n\ninterface IKitchenAreaFilterProps extends IFilterAvailableProps {\n    filter: KitchenAreaFilter;\n    handleChange: (value: KitchenAreaFilter) => void;\n    withPlaceholder?: boolean;\n    isMobile?: boolean;\n}\n\nexport const KitchenAreaFromFilterView: React.FC<IKitchenAreaFilterProps> = ({\n    filter,\n    handleChange,\n    withoutTitle,\n    withPlaceholder,\n    isMobile\n}) => {\n    const onChange = useCallback((value: number | null | string) => {\n        const minValue = value === null || value === undefined || isNaN(value) || value === '' ?\n            null :\n            Number(value.toString().replace(/\\s/, ''));\n\n        handleChange(new KitchenAreaFilter({ from: minValue, to: null }));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter2 desktopTitleGap={! isMobile} filterTitle={withoutTitle ? undefined : 'Площадь кухни'}>\n            <NumberInput\n                value={filter.value.from ?? undefined}\n                postfix='м²'\n                placeholder={withPlaceholder ? 'Кухня от' : 'от'}\n                onChange={onChange}\n                max={100_000}\n                name='kitchenAreaFrom'\n                size='s'\n            />\n        </MobileFilter2>\n    );\n};\n\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport { Filter2 } from '../../new_filter/Filter2';\nimport { NumberInputRange } from '../../common/NewNumberInputRange/NumberInputRange';\nimport { LivingAreaFilter } from '../../../models/Filter';\nimport { INumberRange } from '../../../types/IRange';\n\ninterface ILivingAreaFilterProps {\n    filter: LivingAreaFilter;\n    handleChange: (value: LivingAreaFilter) => void;\n}\n\nexport const LivingAreaFilterView: React.FC<ILivingAreaFilterProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback((value: INumberRange) => {\n        handleChange(new LivingAreaFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <Filter2 filterTitle='Жилая'>\n            <NumberInputRange\n                size={Size.Small}\n                unit='м²'\n                value={filter.value}\n                onChange={onChange}\n                nameFrom='livingAreaFrom'\n                nameTo='livingAreaTo'\n                max={100_000}\n            ></NumberInputRange>\n        </Filter2>\n    );\n};\n\n","import React, { useCallback } from 'react';\n\nimport { Accreditation } from '@search/filter-enums/enums';\nimport { AccreditationFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: Accreditation.ACCREDITED_BY_VTB,\n    label: 'Аккредитовано ВТБ',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n    filter: AccreditationFilter;\n    handleChange: (filter: AccreditationFilter) => void;\n}\n\nexport const MobileAccreditationFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new AccreditationFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Аккредитация'\n        >\n            <MultiSelect\n                name='accreditation'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.accreditation}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { IsApartmentsOptions } from '@search/filter-enums/enums';\nimport { ApartmentFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\n\ninterface IMobileApartmentFilterViewProps {\n    filter: ApartmentFilter;\n    handleChange: (filter: ApartmentFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n    value: IsApartmentsOptions.APARTMENTS_ONLY,\n    label: 'Апартаменты',\n    className: 'col-xs-12 filter-item-gap'\n},\n{\n    value: IsApartmentsOptions.NO_APARTMENTS,\n    label: 'Без апартаментов',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileApartmentFilterView: React.FC<IMobileApartmentFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        value = (value === null) ? IsApartmentsOptions.UNKNOWN : value;\n        handleChange(new ApartmentFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Апартаменты'\n        >\n            <RadioSelect\n                allowNull\n                name='apartment'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.isApartment || null}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { BalconyOptions } from '@search/filter-enums/enums';\nimport { BalconyFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\n\ninterface IMobileBalconyFilterViewProps {\n    filter: BalconyFilter;\n    handleChange: (filter: BalconyFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n    value: BalconyOptions.HAS_ANY,\n    label: 'Балкон',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileBalconyFilterView: React.FC<IMobileBalconyFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new BalconyFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Балкон/лоджия'\n        >\n            <RadioSelect\n                allowNull\n                name='balcony'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.hasBalcony}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Bathroom } from '@search/filter-enums/enums';\nimport { BathroomFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileBathroomFilterViewProps {\n    filter: BathroomFilter;\n    handleChange: (filter: BathroomFilter) => void;\n    hasSeveral?: boolean;\n}\n\nconst selectOptions: MultiSelectOption[] = [\n    {\n        value: Bathroom.COMBINED,\n        label: 'Совмещённый',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: Bathroom.PARTED,\n        label: 'Раздельный',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\nconst selectOptionsWithSeveral: MultiSelectOption[] = [\n    ...selectOptions,\n    {\n        value: Bathroom.SEVERAL,\n        label: 'Несколько',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\nexport const MobileBathroomFilterView: React.FC<IMobileBathroomFilterViewProps> = ({\n    filter,\n    handleChange,\n    hasSeveral = true\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new BathroomFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Санузел'\n        >\n            <MultiSelect\n                name='bathroom'\n                className='container container__clamp'\n                options={hasSeveral ? selectOptionsWithSeveral : selectOptions}\n                value={filter.value}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { BuildingClass } from '@search/filter-enums/enums';\nimport { BuildingClassFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: BuildingClass.ECONOMY,\n    label: 'Эконом',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: BuildingClass.COMFORT,\n    label: 'Комфорт',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: BuildingClass.COMFORT_PLUS,\n    label: 'Комфорт+',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: BuildingClass.BUSINESS,\n    label: 'Бизнес',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: BuildingClass.ELITE,\n    label: 'Элитное',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n    filter: BuildingClassFilter;\n    handleChange: (filter: BuildingClassFilter) => void;\n}\n\nexport const MobileBuildingClassFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new BuildingClassFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Класс ЖК'\n        >\n            <MultiSelect\n                name='buildingClass'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.buildingClass}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { CeilingHeight } from '@search/filter-enums/enums';\nimport { CellHeightFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\n\ninterface IMobileCeilHeightFilterViewProps {\n    filter: CellHeightFilter;\n    handleChange: (filter: CellHeightFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n    value: CeilingHeight.FROM_2_5,\n    label: 'от 2,5 м',\n    className: 'col-xs-6 filter-item-gap'\n}, {\n    value: CeilingHeight.FROM_2_7,\n    label: 'от 2,7 м',\n    className: 'col-xs-6 filter-item-gap'\n}, {\n    value: CeilingHeight.FROM_3,\n    label: 'от 3 м',\n    className: 'col-xs-6 filter-item-gap'\n}, {\n    value: CeilingHeight.FROM_4,\n    label: 'от 4 м',\n    className: 'col-xs-6 filter-item-gap'\n} ];\n\nexport const MobileCeilHeightFilterView: React.FC<IMobileCeilHeightFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new CellHeightFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Высота потолков'\n        >\n            <RadioSelect\n                allowNull\n                name='cellHeight'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.value}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport { ClosedSalesFilter } from '../../../../models/Filter';\nimport { RadioOption, RadioSelect } from '../../common/RadioSelect';\n\nimport './MobileClosedSalesFilterView.css';\n\ninterface IProps {\n    filter: ClosedSalesFilter;\n    handleChange: (filter: ClosedSalesFilter) => void;\n}\n\nconst cn = classname.bind(null, 'MobileClosedSalesFilterView');\n\nconst TRUE = 'TRUE';\n\nconst selectOptions: RadioOption[] = [ {\n    value: TRUE,\n    label: 'С закрытыми продажами',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileClosedSalesFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new ClosedSalesFilter(Boolean(value)));\n    }, [ handleChange ]);\n\n    return (\n        <div className={cn()}>\n            <RadioSelect\n                allowNull\n                name='closedSales'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.includingClosedSales ? TRUE : null}\n                handleChange={onChange}\n            />\n            <Typography\n                variant='tiny-alone'\n                color='minor'\n                className={cn('explanation')}\n            >\n                Новостройки, в которых все квартиры от застройщика проданы или продажи временно приостановлены\n            </Typography>\n        </div>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { PlainSelect as Select, PlainSelectOption } from '@vtblife/uikit';\nimport { Commissioning, Quarter } from '@search/filter-enums/enums';\n\nimport { quarters } from '@search/helpers/src/quarters';\nimport { CommissioningFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\n\ninterface IMobileCommissioningFilterViewProps {\n    filter: CommissioningFilter;\n    onChange: (filter: CommissioningFilter) => void;\n    options?: PlainSelectOption[];\n    onMap?: boolean;\n}\n\nconst defaultOptions: PlainSelectOption[] = [\n    {\n        value: Commissioning.UNKNOWN,\n        text: 'Любой срок сдачи'\n    },\n    {\n        value: Commissioning.COMMISSIONED,\n        text: 'Сдан'\n    },\n    {\n        value: Commissioning.IN_PROGRESS,\n        text: 'Строится'\n    },\n    ...quarters()\n        .map(({ quarter, year }) => ({\n            value: `${Quarter[quarter]}_${year}`,\n            text: `До ${quarter} кв. ${year}`\n        }))\n];\n\nexport const MobileCommissioningFilterView: React.FC<IMobileCommissioningFilterViewProps> = ({\n    filter,\n    onChange,\n    options = defaultOptions,\n    onMap\n}) => {\n    const handleChange = useCallback(\n        (val: string) => onChange(new CommissioningFilter(val)),\n        [ onChange ]\n    );\n\n    let { commissioning } = filter;\n\n    if (! options.some(({ value }) => value === commissioning)) {\n        commissioning = Commissioning.UNKNOWN;\n    }\n\n    return (\n        <MobileFilter>\n            <div className='container'>\n                <div className='col-xs-12'>\n                    <Select\n                        name='commissioning'\n                        dataTest='commissioning'\n                        size='s'\n                        value={commissioning}\n                        options={options}\n                        onChange={v => handleChange(v as string)}\n                        height={onMap ? 400 : undefined}\n                        native={! onMap}\n                    />\n                </div>\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback, useState } from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport {\n    SuggestTypeEnum,\n    SuggestItemDeveloper\n} from '@search/graphql-typings';\nimport {\n    graphql,\n    useGqlContext\n} from '@search/gql-client/src';\n\nimport classname from '@search/classname/src';\nimport { Highlight } from '@search/vtbeco-ui/src/components/controls/Highlight/Highlight';\nimport Suggest from '@search/vtbeco-ui/src/components/controls/Suggest';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\n\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\n\nimport useDebouncedCallback from '../../../../../common/hooks/useDebouncedCallback';\n\nimport type {\n    MobileDeveloperSuggestModalQuery$data as MobileDeveloperSuggestModalQueryResponse,\n    MobileDeveloperSuggestModalQuery$variables as MobileDeveloperSuggestModalQueryVariables\n} from './__generated__/MobileDeveloperSuggestModalQuery.graphql';\n\nimport './MobileDeveloperSuggestModal.css';\n\nconst cn = classname.bind(null, 'MobileDeveloperSuggestModal');\n\nconst QUERY = graphql`\n    query MobileDeveloperSuggestModalQuery($text: String! $suggestTypes: [SuggestTypeEnum!]) {\n        suggest(text: $text suggestTypes: $suggestTypes) {\n            __typename\n\n            ... on SuggestItemDeveloper {\n                label\n                data {\n                    id\n                    scope\n                }\n                developer {\n                    title\n                    id\n                }\n            }\n        }\n    }\n`;\n\ninterface IMobileDeveloperSuggestModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n    hide: () => void;\n    onChange: (value?: SuggestItemDeveloper) => void;\n    value?: SuggestItemDeveloper;\n    placeholder: string;\n}\n\nconst MobileDeveloperSuggestModal: React.FC<IMobileDeveloperSuggestModalProps> = ({\n    hide,\n    onChange,\n    value,\n    placeholder,\n    uikitZIndexEnabled\n}) => {\n    const gql = useGqlContext();\n\n    const handleSelect = useCallback((val?: SuggestItemDeveloper) => {\n        onChange(val);\n        val && hide();\n    }, [ hide, onChange ]);\n\n    const handleClear = useCallback(() => {\n        onChange();\n    }, [ onChange ]);\n\n    const [ suggestions, setSuggestions ] = useState<SuggestItemDeveloper[]>([]);\n\n    const [ debouncedSuggest ] = useDebouncedCallback(\n        (text: string) => {\n            gql.execute<MobileDeveloperSuggestModalQueryVariables, MobileDeveloperSuggestModalQueryResponse>(\n                QUERY, {\n                    text,\n                    suggestTypes: [ SuggestTypeEnum.Developer ]\n                })\n                .then(data => {\n                    if (data.data) {\n                        setSuggestions(data?.data?.suggest || []);\n                    } else {\n                        setSuggestions([]);\n                    }\n                }).catch(() => setSuggestions([]));\n        },\n        300\n    );\n\n    const fetchSuggestions = (text: string) => {\n        debouncedSuggest(text);\n    };\n\n    return (\n        <Modal\n            size={ModalSize.FULL_L}\n            borderRadius={BorderRadius.none}\n            uikitZIndexEnabled={uikitZIndexEnabled}\n            fullScreen\n        >\n            <ModalHeading\n                text='Застройщик'\n                onClose={hide}\n            />\n            <div className={cn('select')}>\n                <Suggest\n                    autoFocus\n                    clear\n                    width='max'\n                    size='xxl'\n                    inputSize={Size.Small}\n                    onClear={handleClear}\n                    borderOut={false}\n                    placeholder={placeholder}\n                    suggestion={value}\n                    suggestions={suggestions}\n                    fetchSuggestions={fetchSuggestions}\n                    renderList={(props, { focusedIndex, label }, handlers) => (\n                        <div className={cn('suggest')}>\n                            {\n                                suggestions.map((suggestion, i) => (\n                                    <div\n                                        key={i}\n                                        className={cn('suggestion', {\n                                            highlighted: i === focusedIndex\n                                        })}\n                                        onMouseDown={e => handlers.handleItemMouseDown(e, i)}\n                                        onMouseEnter={e => handlers.handleItemMouseDown(e, i)}\n                                    >\n                                        <div>\n                                            <Highlight\n                                                text={suggestion.label || ''}\n                                                highlight={label || ''}\n                                            />\n                                            {\n                                                suggestion?.data?.scope ? (\n                                                    <Typography\n                                                        variant='small-alone'\n                                                        color='secondary'\n                                                    >\n                                                        {suggestion.data.scope}\n                                                    </Typography>\n                                                ) : null\n                                            }\n                                        </div>\n                                    </div>\n                                ))\n                            }\n                        </div>\n                    )}\n                    renderEmptyList={({ emptyText }) => (\n                        <div className={cn('empty')}>\n                            {emptyText}\n                        </div>\n                    )}\n                    onSelect={handleSelect}\n                    clearOnSelect={false}\n                />\n            </div>\n        </Modal>\n    );\n};\n\nexport default MobileDeveloperSuggestModal;\n","import React, { MouseEvent, useCallback } from 'react';\nimport {\n    SuggestItemDeveloper\n} from '@search/graphql-typings';\nimport { Input, Size } from '@vtblife/uikit/legacy';\nimport { useModal } from '@search/vtbeco-ui/src/components/Modal';\n\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport MobileDeveloperSuggestModal from './MobileDeveloperSuggestModal';\n\nimport './MobileDeveloperFilterView.css';\n\nexport interface IProps {\n    onChange: (value?: SuggestItemDeveloper) => void;\n    value?: SuggestItemDeveloper;\n    placeholder?: string;\n    uikitModalZIndexEnabled?: boolean;\n}\n\nexport const MobileDeveloperFilterView: React.FC<IProps> = ({\n    value,\n    onChange,\n    placeholder = 'Название компании',\n    uikitModalZIndexEnabled\n}) => {\n    const { on: showSuggest, off: hideSuggest, visible: isSuggestVisible } = useModal();\n\n    const handleSuggestOpen = useCallback(() => showSuggest(), [ showSuggest ]);\n\n    const handleClear = useCallback((e: MouseEvent<HTMLDivElement>) => {\n        e.stopPropagation();\n\n        onChange();\n    }, [ onChange ]);\n\n    return (\n        <MobileFilter filterTitle='Застройщик'>\n            <div\n                className={'container'}\n                onClick={handleSuggestOpen}\n            >\n                <div className={'col-xs-12 MobileDeveloperFilterView__input'}>\n                    <Input\n                        hasClear\n                        fullWidth\n                        placeholder={placeholder}\n                        value={value?.label}\n                        size={Size.Small}\n                    />\n                    {\n                        value?.label ? (\n                            <div\n                                className='MobileDeveloperFilterView__clear'\n                                onClick={handleClear}\n                            />\n                        ) : null\n                    }\n                </div>\n            </div>\n            {\n                isSuggestVisible ? (\n                    <MobileDeveloperSuggestModal\n                        hide={hideSuggest}\n                        value={value}\n                        onChange={onChange}\n                        placeholder={placeholder}\n                        uikitZIndexEnabled={uikitModalZIndexEnabled}\n                    />\n                ) : null\n            }\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { FinishingEnum, FinishingTypeEnum } from '@search/graphql-typings';\n\nimport { FinishingTypeFilter, allWithFinishingValues } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst SELECT_OPTIONS: MultiSelectOption<FinishingTypeEnum>[] = [\n    {\n        value: FinishingTypeEnum.WithoutFinishing,\n        label: 'Без отделки',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: FinishingTypeEnum.PreFinishing,\n        label: 'Предчистовая',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: FinishingTypeEnum.Fine,\n        label: 'Чистовая',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: FinishingTypeEnum.WithFurniture,\n        label: 'С мебелью',\n        className: 'col-xs-12 filter-item-gap'\n    },\n];\n\ninterface IProps {\n    filter: FinishingTypeFilter;\n    onChange: (filter: FinishingTypeFilter) => void;\n}\n\n/**\n * Фильтр \"Тип отделки\"\n * */\nexport const MobileFinishingTypeFilterView: React.FC<IProps> = ({\n    filter,\n    onChange\n}) => {\n    const handleChange = useCallback(values => {\n        const hasAllAvailableValues = new Set([ ...values, ...allWithFinishingValues ]).size === allWithFinishingValues.length && values.length === allWithFinishingValues.length;\n\n        onChange(new FinishingTypeFilter({\n            hasFinishing: hasAllAvailableValues ? FinishingEnum.Available : undefined,\n            finishingType: values\n        }));\n    }, [ onChange ]\n    );\n\n    const { finishingType } = filter.value;\n\n    return (\n        <MobileFilter\n            filterTitle='Тип отделки'\n        >\n            <MultiSelect\n                name='finishingType'\n                className='container container__clamp'\n                options={SELECT_OPTIONS}\n                value={finishingType}\n                handleChange={handleChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { FloorConstraints } from '@search/filter-enums/enums';\n\nimport { FloorFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\nimport { MultiSelect } from '../../common/MultiSelect';\n\ninterface IMobileFloorFilterViewProps {\n    filter: FloorFilter;\n    handleChange: (filter: FloorFilter) => void;\n}\n\nenum Floors {\n    NotFirst = 1,\n    NotLast = 2,\n    Last = 3\n}\n\nfunction getFirst(added: Floors[], removed: Floors[]) {\n    if (removed.includes(Floors.NotFirst)) {\n        return FloorConstraints.UNKNOWN;\n    } else if (added.includes(Floors.NotFirst)) {\n        return FloorConstraints.EXCLUDE;\n    }\n    return null;\n}\n\nfunction getLast(added: Floors[], removed: Floors[]) {\n    if (removed.includes(Floors.NotLast) || removed.includes(Floors.Last)) {\n        return FloorConstraints.UNKNOWN;\n    } else if (added.includes(Floors.NotLast)) {\n        return FloorConstraints.EXCLUDE;\n    } else if (added.includes(Floors.Last)) {\n        return FloorConstraints.ONLY;\n    }\n\n    return null;\n}\n\nconst selectOptions = [\n    {\n        label: 'Не первый',\n        value: Floors.NotFirst,\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        label: 'Не последний',\n        value: Floors.NotLast,\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        label: 'Последний',\n        value: Floors.Last,\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\nexport const MobileFloorFilterView: React.FC<IMobileFloorFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const value = getValue(filter);\n    const onChange = useCallback(newValue => {\n        handleChange(new FloorFilter(newValue, filter.first, filter.last));\n    }, [ filter, handleChange ]);\n\n    const onChangeFloor = useCallback((newValue: Floors[], oldValue: Floors[]) => {\n        const added = newValue.filter(x => ! oldValue.includes(x));\n        const removed = oldValue.filter(x => ! newValue.includes(x));\n\n        const first = getFirst(added, removed);\n        const firstValue = (first === null || first === undefined) ? filter.first : first;\n\n        const last = getLast(added, removed);\n        const lastValue = (last === null || last === undefined) ? filter.last : last;\n\n        handleChange(new FloorFilter(filter.range, firstValue, lastValue));\n    }, [ value, handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Этаж'\n        >\n            <div className='container'>\n                <div className={'col-xs-12 filter-item-gap'}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        value={filter.range}\n                        onChange={onChange}\n                        max={1_000}\n                        nameFrom='floorFrom'\n                        nameTo='floorTo'\n                    />\n                </div>\n            </div>\n            <MultiSelect\n                className='container container__clamp'\n                name='floor'\n                options={selectOptions}\n                value={value}\n                // @ts-ignore\n                handleChange={onChangeFloor}\n            />\n        </MobileFilter>\n    );\n};\n\nfunction getValue(filter: FloorFilter): Floors[] {\n    const result = [];\n\n    if (FloorConstraints.EXCLUDE === filter.first) {\n        result.push(Floors.NotFirst);\n    }\n    if (FloorConstraints.EXCLUDE === filter.last) {\n        result.push(Floors.NotLast);\n    }\n    if (FloorConstraints.ONLY === filter.last) {\n        result.push(Floors.Last);\n    }\n\n    return result;\n}\n\n","import React, { useCallback } from 'react';\n\nimport { Size } from '@vtblife/uikit/legacy';\nimport { FloorsTotalFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\nimport '../MobileCommon.css';\n\ninterface IMobileFloorsTotalFilterViewProps {\n    filter: FloorsTotalFilter;\n    handleChange: (value: FloorsTotalFilter) => void;\n}\n\nexport const MobileFloorsTotalFilterView: React.FC<IMobileFloorsTotalFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new FloorsTotalFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Этажей в доме'\n        >\n            <div className='container'>\n                <div className={'col-xs-12'}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        value={filter.range}\n                        onChange={onChange}\n                        nameFrom='floorsTotalFrom'\n                        nameTo='floorsTotalTo'\n                        max={1_000}\n                    />\n                </div>\n            </div>\n        </MobileFilter>\n    );\n};\n","import './MetroMark2.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'MetroMark2');\n\nexport function MetroMark2Item({ color, children }: { color: string; children?: React.ReactNode }) {\n    return (\n        <span\n            style={{ backgroundColor: color }}\n            className={cn('line')}\n        >{children ?? colorsToNameMapOut[color]}</span>\n    );\n}\n\nexport function MetroMark2({ colors }: {\n    colors: readonly string[];\n}) {\n    return (\n        <span className={cn()}>\n            {\n                colors.slice(0).reverse().map((color, index) => (\n                    <MetroMark2Item\n                        key={index}\n                        color={color}\n                    />\n                ))\n            }\n        </span>\n    );\n}\n\nconst colorsToNameMapOut: Record<string, string> = {\n    '#EA7D27': '6',\n    '#4baf4f': '1',\n    '#bac8e8': '12',\n    '#943f90': '5',\n    '#0572b9': '2',\n    '#FBCD24': '8',\n    '#d68ab1': '15',\n    '#d14a43': '14',\n    '#BED12E': '10',\n    '#DD201C': '1',\n    '#F7A600': 'D1',\n    '#925233': '5',\n    '#41BCEF': '4',\n    '#adacac': '9',\n    '#E94282': 'D2',\n    '#89cdcf': '11',\n    '#e42518': '1',\n    '#986000': '6',\n    '#f07e23': '4',\n    '#f03d2f': '1',\n    '#23a12c': '2',\n    '#0042a5': '2'\n};\n","import './MetroSelect.css';\n\nimport React from 'react';\nimport { Input, Collapse, Tabs, Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\n\nimport { MetroMark2, MetroMark2Item } from '../MetroMark2/MetroMark2';\nimport {\n    MetroAlphabetGroup,\n    MetroRouteGroup,\n    MetroStation,\n    MetroStore\n} from '../../../../../../../domain/geo/MetroStation';\n\nimport {\n    useMetroSelect,\n    UseMetroSelectProps,\n    useMetroSelectRouteGroup\n} from './useMetroSelect';\n\nconst cn = classname.bind(null, 'MetroSelect');\n\ninterface MetroSelectProps extends UseMetroSelectProps {\n    /** Станции метро */\n    metros: MetroStore;\n\n    className?: string;\n}\n\nexport const MetroSelect: React.FC<MetroSelectProps> = props => {\n    const {\n        groupByAlphabet,\n        groupByLine,\n        isGrouppedByLine,\n        checkStations,\n        isStationChecked\n    } = useMetroSelect(props);\n\n    const [ search, setSearchRaw ] = React.useState('');\n    const setSearch = React.useCallback((next: string) => {\n        setSearchRaw(next);\n    }, []);\n    const resetSearch = React.useCallback(() => setSearch(''), []);\n\n    const groupedByAlphabet = isGrouppedByLine ? [] : props.metros.groupedByAlphabet.map(grp => {\n        const stations = grp.stations.filter(station => station.title.toLocaleUpperCase().includes(search.toLocaleUpperCase()));\n\n        return { ...grp, stations };\n    }).filter(item => item.stations.length !== 0);\n\n    const groupedByRoute = ! isGrouppedByLine ? [] : props.metros.groupedByRoute.map(grp => {\n        const stations = grp.stations.filter(station => station.title.toLocaleUpperCase().includes(search.toLocaleUpperCase()));\n\n        return { ...grp, stations };\n    }).filter(item => item.stations.length !== 0);\n\n    return (\n        <div className={cn()}>\n            <div className={cn('filter')}>\n                <Input\n                    size={Size.Small}\n                    value={search}\n                    onChange={setSearch}\n                    onReset={resetSearch}\n                    type='search'\n                    placeholder='Название станции'\n                >\n                    <Input.Content placement='start'>\n                        <Icon name='magnifier' />\n                    </Input.Content>\n                </Input>\n                <Tabs size='s' variant='text' onChange={v => v === 'by-alpha' ? groupByAlphabet() : groupByLine()} justified>\n                    <Tabs.Option value='by-alpha' active={! isGrouppedByLine}>По алфавиту</Tabs.Option>\n                    <Tabs.Option value='by-line' active={isGrouppedByLine}>По линиям</Tabs.Option>\n                </Tabs>\n            </div>\n            {groupedByRoute.length > 0 && ! search && (<Collapse variant='line'>\n                {groupedByRoute.map(group => (\n                    <RouteGroup\n                        key={group.route.id}\n                        group={group}\n                        isStationChecked={isStationChecked}\n                        checkStations={checkStations}\n                    />\n                ))}\n            </Collapse>)}\n            {groupedByRoute.length > 0 && search && (<div className={cn('groups')}>\n                {groupedByRoute.map(group => (\n                    <AlphaGroup\n                        key={group.route.id}\n                        group={group}\n                        isStationChecked={isStationChecked}\n                        checkStations={checkStations}\n                    />\n                ))}\n            </div>)}\n            {groupedByAlphabet.length > 0 && (<div className={cn('groups')}>\n                {groupedByAlphabet.map(group => (\n                    <AlphaGroup\n                        key={group.letter}\n                        group={group}\n                        isStationChecked={isStationChecked}\n                        checkStations={checkStations}\n                    />\n                ))}\n            </div>)}\n        </div>\n    );\n};\n\nfunction RouteGroup({\n    group,\n    isStationChecked,\n    checkStations\n}: {\n    group: MetroRouteGroup;\n    checkStations: (station: readonly MetroStation[], checked: boolean) => void;\n    isStationChecked: (station: MetroStation) => boolean;\n}) {\n    const { allChecked, checkAllInGroup } = useMetroSelectRouteGroup(\n        group.stations,\n        checkStations,\n        isStationChecked\n    );\n\n    const checkedInGroup = group.stations.filter(station => isStationChecked(station)).length;\n\n    return (\n        <Collapse.Item key={group.id}>\n            <Collapse.Title>\n                <div className={cn('route-title')}>\n                    <MetroMark2Item color={group.route.color} />{group.route.title\n                        .replace(/ (линия|диаметр)$/, '')\n                    }\n                    {checkedInGroup > 0 && (\n                        <div className={cn('route-count')}></div>\n                    )}\n                </div>\n            </Collapse.Title>\n            <div className={cn('route')}>\n                <Item\n                    onClick={checkAllInGroup}\n                    checked={allChecked}\n                ><div className={cn('all-stations')}>Все станции</div></Item>\n                {group.stations.map((station, index) => (\n                    <Item\n                        key={station.id}\n                        checked={isStationChecked(station)}\n                        onClick={(next) => checkStations([ station ], next)}\n                    >\n                        {/* <RouteIcon\n                            color={group.route.color}\n                            isFirst={index === 0}\n                            isLast={index === group.stations.length - 1}\n                        /> */}\n                        <div className={cn('all-stations')}>\n                            <Typography variant='primary'>{station.title}</Typography>\n                            <MetroMark2\n                                colors={station.allRoutesColorsList.filter(color => color !== group.route.color)}\n                            />\n                        </div>\n                    </Item>\n                ))}\n            </div>\n        </Collapse.Item>\n    );\n}\n\nfunction AlphaGroup({\n    group,\n    isStationChecked,\n    checkStations\n}: {\n    group: MetroAlphabetGroup;\n    checkStations: (station: readonly MetroStation[], checked: boolean) => void;\n    isStationChecked: (station: MetroStation) => boolean;\n}) {\n    return (\n        <div className={cn('alpha')}>\n            {group.letter && (<div className={cn('alpha-title')}>{group.letter}</div>)}\n            <div className={cn('items')}>\n                {group.stations.map(station => (\n                    <Item\n                        key={station.id}\n                        checked={isStationChecked(station)}\n                        onClick={checked => checkStations([ station ], checked)}\n                    >\n                        <Typography variant='primary'>{station.title}</Typography>\n                        <MetroMark2 colors={station.allRoutesColorsList} />\n                    </Item>\n                ))}\n            </div>\n        </div>\n    );\n}\n\nfunction Item({ children, checked, onClick }: {\n    children?: React.ReactNode;\n    checked?: boolean;\n    onClick?(checked: boolean, e: React.MouseEvent): void;\n}) {\n    return (\n        <div\n            role='button'\n            className={cn('station', { checked })}\n            onClick={onClick?.bind(null, ! checked)}\n        >\n            {children}\n            {checked && (\n                <div className={cn('check')}>\n                    <Icon name='check' />\n                </div>\n            )}\n        </div>\n    );\n}\n\nfunction RouteIcon({ color, isFirst, isLast }: {\n    color: string;\n    isLast?: boolean;\n    isFirst?: boolean;\n}) {\n    return (\n        <div style={{ color, lineHeight: 0, width: '20px' }}>\n            <svg width='12' height='52' viewBox='0 0 12 52' fill='none' xmlns='http://www.w3.org/2000/svg'>\n                {! isFirst && (<path\n                    clipRule='evenodd'\n                    fill='currentColor'\n                    fillRule='evenodd'\n                    strokeWidth={0.73}\n                    d='m 4.5,22.610739 2e-5,-22.615407 H 7.5 l -2e-5,22.615407 z'\n                />)}\n                {! isLast && (<path\n                    clipRule='evenodd'\n                    fill='currentColor'\n                    fillRule='evenodd'\n                    strokeWidth={0.73}\n                    d='m 4.5136962,51.995639 2e-5,-22.681184 h 2.99998 l -2e-5,22.681184 z'\n                />)}\n                <circle\n                    fill='white'\n                    stroke='currentColor'\n                    strokeWidth={3}\n                    r='4.5'\n                    cy='26'\n                    cx='6'\n                />\n            </svg>\n        </div>\n    );\n}\n\n","import React from 'react';\nimport type { MetroStation } from '../../../../../../../domain/geo/MetroStation';\n\nexport interface UseMetroSelectProps {\n    /**\n     * Массив выбранных станций\n     */\n    checked: readonly number[];\n\n    /**\n     * Изначально группировать по линиям, а не по алфавиту\n     */\n    groupByLineInitial?: boolean;\n\n    onChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n}\n\nexport function useMetroSelect({\n    onChange,\n    checked,\n    groupByLineInitial\n}: UseMetroSelectProps) {\n    const checkSet = React.useMemo(() => new Set(checked), [ checked ]);\n\n    const checkStations = React.useCallback(\n        (stations: readonly MetroStation[], check: boolean) => {\n            const uncheckedDiff = new Set<number>();\n            const checkedDiff: number[] = [];\n\n            for (const station of stations) {\n                if (check) checkedDiff.push(station.id);\n                else uncheckedDiff.add(station.id);\n            }\n\n            onChange(checkedDiff, uncheckedDiff);\n        },\n        [ onChange ]\n    );\n\n    const isStationChecked = React.useCallback(\n        (station: MetroStation) => checkSet.has(station.id),\n        [ checkSet ]\n    );\n\n    const [ isGrouppedByLine, setIsGrouupedByLine ] = React.useState(\n        groupByLineInitial || false\n    );\n\n    const groupByAlphabetAction = React.useCallback(() => {\n        setIsGrouupedByLine(false);\n    }, []);\n\n    const groupByLineAction = React.useCallback(() => {\n        setIsGrouupedByLine(true);\n    }, []);\n\n    const stationsSelected = checkSet.size;\n\n    const reset = React.useCallback(() => {\n        onChange([], checkSet);\n    }, [ checkSet ]);\n\n    return {\n        stationsSelected,\n        reset,\n        isStationChecked,\n        checkStations,\n        groupByAlphabet: groupByAlphabetAction,\n        groupByLine: groupByLineAction,\n        isGrouppedByLine\n    };\n}\n\nexport function useMetroSelectRouteGroup(\n    stations: readonly MetroStation[],\n    checkStations: (station: readonly MetroStation[], checked: boolean) => void,\n    isStationChecked: (station: MetroStation) => boolean\n) {\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const allChecked = stations.every(station => isStationChecked(station));\n    const checkAllInGroup = React.useCallback(() => {\n        checkStations(stations, ! allChecked);\n    }, [ stations, checkStations, allChecked ]);\n\n    return { allChecked, checkAllInGroup };\n}\n","import './MetroModal.css';\n\nimport React from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\nimport { MetroStore } from '../../../../../../domain/geo/MetroStation';\n\nimport { MetroSelect } from './MetroSelect/MetroSelect';\n\nconst cn = classname.bind(null, 'MetroModal');\n\ninterface IMetroModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n    hide: () => void;\n    checkedIds: number[];\n    store: MetroStore;\n    handleChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n    onReset: () => void;\n    onSubmit: () => void;\n}\n\nexport const MetroModal: React.FC<IMetroModalProps> = ({\n    hide: metroOff,\n    checkedIds: checkedMetroIds,\n    store: stations,\n    handleChange,\n    onReset,\n    onSubmit: onMetroSubmit,\n    uikitZIndexEnabled\n}) => {\n    return (\n        <Modal\n            size={ModalSize.FULL_L}\n            borderRadius={BorderRadius.none}\n            uikitZIndexEnabled={uikitZIndexEnabled}\n            fullScreen\n        >\n            <ModalHeading\n                text='Метро'\n                reset={onReset}\n                activeCount={checkedMetroIds.length}\n                onClose={metroOff}\n                withDeclension={false}\n            />\n            <div className={cn('select')}>\n                <MetroSelect\n                    metros={stations}\n                    checked={checkedMetroIds}\n                    onChange={handleChange}\n                />\n            </div>\n            <div className={cn('submit')}>\n                <Button\n                    fullWidth\n                    size='s'\n                    onClick={onMetroSubmit}\n                >\n                    {checkedMetroIds.length ? `Выбрать ${checkedMetroIds.length} ${\n                        declensionByNumber(checkedMetroIds.length, [ 'станцию', 'станции', 'станций' ])\n                    }` : 'Сохранить'}\n                </Button>\n            </div>\n        </Modal>\n\n    );\n};\n","import React from 'react';\nimport { RootRegionsApplicationEnum, SuggestTypeEnum } from '@search/graphql-typings';\nimport classname from '@search/classname/src';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\n\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\nimport { SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport { GeoSuggest } from '../../../../../common/components/GeoSuggest/GeoSuggest';\n\nimport './SuggestModal.css';\n\nconst cn = classname.bind(null, 'SuggestModal');\n\ninterface ISuggestModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n    regionId: number;\n    rootRegionsApp: RootRegionsApplicationEnum;\n    hide: () => void;\n    handleChange: (ids: SuggestionType) => void;\n    onInputToggleFocus?: (disabled: boolean) => void;\n    showNewBuildingsGroup?: boolean;\n    startWithNewBuildings?: boolean;\n    placeholder: string;\n    placeholderWithNewBuildings: string;\n    limit?: number;\n    suggestTypes?: SuggestTypeEnum[];\n    selected?: Set<number>;\n}\n\nexport const SuggestModal: React.FC<ISuggestModalProps> = ({\n    hide,\n    regionId,\n    handleChange,\n    onInputToggleFocus,\n    rootRegionsApp,\n    suggestTypes,\n    limit,\n    showNewBuildingsGroup,\n    startWithNewBuildings,\n    placeholder,\n    placeholderWithNewBuildings,\n    uikitZIndexEnabled,\n    selected\n}) => {\n    return (\n        <Modal\n            size={ModalSize.FULL_L}\n            borderRadius={BorderRadius.none}\n            uikitZIndexEnabled={uikitZIndexEnabled}\n            fullScreen\n        >\n            <ModalHeading\n                text='Поиск ЖК или адреса'\n                onClose={hide}\n            />\n            <div className={cn('select')}>\n                <GeoSuggest\n                    autoFocus\n                    clear\n                    listBorderOut\n                    regionId={regionId}\n                    rootRegionsApp={rootRegionsApp}\n                    suggestTypes={suggestTypes}\n                    limit={limit}\n                    borderOut={false}\n                    onGeoChange={handleChange}\n                    onInputToggleFocus={onInputToggleFocus}\n                    showNewBuildingsGroup={showNewBuildingsGroup}\n                    startWithNewBuildings={startWithNewBuildings}\n                    placeholder={placeholder}\n                    placeholderWithNewBuildings={placeholderWithNewBuildings}\n                    selected={selected}\n                />\n            </div>\n        </Modal>\n    );\n};\n","import './DistrictSelectItem.css';\n\nimport React from 'react';\nimport Icon from '@vtblife/uikit-icons';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport type { DistrictGroup } from '../../../../../../../helpers/districtHelper';\nimport type { ArrayElement } from '../../../../../../../../../types';\n\ninterface DistrictSelectItemProps {\n    district: ArrayElement<DistrictGroup['items']>;\n    checked: boolean;\n    onCheck: (checked: boolean) => void;\n}\n\nconst cnStation = classname.bind(null, 'DistrictSelect__Item');\n\nexport const DistrictSelectItem: React.FC<DistrictSelectItemProps> = ({\n    district,\n    checked,\n    onCheck\n}) => {\n    return (\n        <div\n            role='button'\n            className={cnStation(null, { checked })}\n            onClick={() => onCheck(! checked)}\n        >\n            <Typography\n                bold={district.isIntracity}\n                variant='primary'\n                color={checked ? 'blue-500' : 'primary'}\n            >\n                {district.title}\n            </Typography>\n            {checked ? <Icon name='check' /> : null}\n        </div>\n    );\n};\n","import './DistrictSelectGroup.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport classname from '@search/classname/src';\ninterface DistrictSelectGroupProps {\n    title: string;\n    checked: boolean;\n    onCheck: (checked: boolean) => void;\n}\n\nconst cnStation = classname.bind(null, 'DistrictSelect__Item');\n\nexport const DistrictSelectGroup: React.FC<DistrictSelectGroupProps> = ({\n    title,\n    checked,\n    onCheck\n}) => {\n    return (\n        <div\n            role='button'\n            className={cnStation('group', { checked })}\n            onClick={() => onCheck(! checked)}\n        >\n            <Typography variant='promo-h4' responsive bold>\n                {title}\n            </Typography>\n            {checked ? <Icon name='check' /> : null}\n        </div>\n    );\n};\n","import './DistrictSelect.css';\n\nimport React from 'react';\n\nimport classname from '@search/classname/src';\n\nimport { DistrictControl } from '../../../../../../common/components/DistrictControl';\nimport type { DistrictGroup } from '../../../../../helpers/districtHelper';\n\nimport { useDistrictSelect } from './useDistrictSelect';\nimport { DistrictSelectItem } from './components/DistrictSelectItem';\nimport { DistrictSelectGroup } from './components/DistrictSelectGroup';\n\nconst cn = classname.bind(null, 'DistrictSelect');\n\nexport interface DistrictSelectProps {\n    groups: DistrictGroup[];\n    checked: readonly number[];\n    onChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n    regionId: number;\n    limit?: Limit;\n    className?: string;\n}\n\nexport enum Limit {\n    noLimit,\n    hasLimit\n}\n\nexport const DistrictSelect: React.FC<DistrictSelectProps> = ({\n    groups,\n    checked,\n    onChange,\n    limit = Limit.hasLimit,\n    className,\n    regionId\n}) => {\n    const {\n        isChecked,\n        checkSet: selectedDistricts,\n        checkGroup,\n        checkItem\n    } = useDistrictSelect({\n        checked,\n        onChange,\n        groups\n    });\n\n    return (\n        <div className={cn(null, { limit: limit === Limit.hasLimit ? 'limited' : 'unlimited' }, className)}>\n            <DistrictControl\n                className={cn('controls')}\n                regionId={regionId}\n                onChange={newValues => {\n                    onChange(newValues.diff.selected, new Set(newValues.diff.deselected));\n                }}\n                selectedDistricts={selectedDistricts}\n            />\n            <div className={cn((limit === Limit.hasLimit) ? 'items-limited' : 'items-unlimited')}>\n                {groups.map((group, groupIdx, arr) => {\n                    const { items, id: groupId } = group;\n\n                    const isGroupIdChecked = groupId && isChecked(groupId);\n                    const isGroupChecked = isGroupIdChecked || items.every(item => isChecked(item.id));\n\n                    return (\n                        <div key={group.title}>\n                            <DistrictSelectGroup\n                                title={group.title}\n                                checked={isGroupChecked}\n                                onCheck={newIsChecked => checkGroup(newIsChecked, groupIdx, groupId)}\n                            />\n\n                            {items.map(district => (\n                                <DistrictSelectItem\n                                    key={district.id}\n                                    district={district}\n                                    checked={isGroupIdChecked || isChecked(district.id)}\n                                    onCheck={newIsChecked => checkItem(newIsChecked, district.id, groupIdx, groupId)}\n                                />\n                            ))}\n\n                            {arr.length - 1 !== groupIdx ? (\n                                <div className={cn('groupSeparator')} />\n                            ) : null}\n                        </div>\n                    );\n                })}\n            </div>\n        </div>\n    );\n};\n","import React from 'react';\n\nimport type { ArrayElement } from '../../../../../../../types/common';\nimport type { DistrictGroup } from '../../../../../helpers/districtHelper';\n\nimport type { DistrictSelectProps } from './DistrictSelect';\n\ninterface UseDistrictSelectProps extends Pick<DistrictSelectProps, 'checked' | 'onChange'>{\n    groups: DistrictGroup[];\n}\n\nexport function useDistrictSelect({\n    checked: selected,\n    onChange,\n    groups\n}: UseDistrictSelectProps) {\n    const checkSet = React.useMemo(() => new Set(selected), [ selected ]);\n\n    const isChecked = React.useCallback(\n        (id: number) => checkSet.has(id),\n        [ checkSet ]\n    );\n\n    const checkGroup = React.useCallback((\n        checked: boolean,\n        groupIndex: number,\n        groupId: DistrictGroup['id']\n    ) => {\n        let uncheckedDiff = new Set<number>();\n        let checkedDiff: number[] = [];\n\n        const groupIds = groups[groupIndex].items.map(item => item.id);\n\n        if (checked) {\n            checkedDiff = groupId ? [ groupId ] : groupIds;\n        } else {\n            uncheckedDiff = new Set(groupId && isChecked(groupId) ? [ groupId ] : groupIds);\n        }\n\n        onChange(checkedDiff, uncheckedDiff);\n    }, [ groups, onChange, isChecked ]);\n\n    const checkItem = React.useCallback((\n        checked: boolean,\n        id: ArrayElement<DistrictGroup['items']>['id'],\n        groupIndex: number,\n        groupId: DistrictGroup['id']\n    ) => {\n        let uncheckedDiff = new Set<number>();\n        let checkedDiff: number[] = [];\n\n        if (! groupId) {\n            if (checked) {\n                checkedDiff.push(id);\n            } else {\n                uncheckedDiff.add(id);\n            }\n\n            onChange(checkedDiff, uncheckedDiff);\n\n            return;\n        }\n\n        if (checked) {\n            const isGroupChecked = groups[groupIndex].items.every(item => isChecked(item.id) || item.id === id);\n\n            if (isGroupChecked) {\n                const selectedIdsFromGroup = groups[groupIndex].items\n                    .map(item => item.id)\n                    .filter(value => isChecked(value));\n\n                checkedDiff = [ groupId ];\n                uncheckedDiff = new Set([ id, ...selectedIdsFromGroup ]);\n            } else {\n                checkedDiff = [ id ];\n            }\n        } else {\n            if (isChecked(groupId)) {\n                const otherGroupIds = groups[groupIndex].items\n                    .filter(item => item.id !== id)\n                    .map(item => item.id);\n\n                checkedDiff = otherGroupIds;\n                uncheckedDiff = new Set([ groupId, id ]);\n            } else {\n                uncheckedDiff = new Set([ id ]);\n            }\n        }\n\n        onChange(checkedDiff, uncheckedDiff);\n    }, [ groups, onChange, isChecked ]);\n\n    return { checkItem, checkGroup, isChecked, checkSet };\n}\n","import './DistrictModal.css';\n\nimport React, { useMemo } from 'react';\nimport { Button } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { Modal, ModalProps, ModalSize } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\n\nimport { ModalHeading } from '../../../../../mobile/components/ModalHeading';\nimport type { DistrictStore } from '../../../../../../domain/geo/District';\nimport { getDistrictCount, groupDistricts } from '../../../../helpers/districtHelper';\n\nimport { Limit, DistrictSelect } from './DistrictSelect/DistrictSelect';\n\nconst cn = classname.bind(null, 'DistrictModal');\n\ninterface IDistrictModalProps extends Pick<ModalProps, 'uikitZIndexEnabled'> {\n    hide: () => void;\n    checkedIds: number[];\n    districts: DistrictStore;\n    handleChange(checkedDiff: number[], uncheckedDiff: Set<number>): void;\n    onReset: () => void;\n    onSubmit: () => void;\n    regionId: number;\n}\n\nexport const DistrictModal: React.FC<IDistrictModalProps> = ({\n    hide,\n    checkedIds,\n    districts,\n    handleChange,\n    onReset,\n    onSubmit,\n    regionId,\n    uikitZIndexEnabled\n}) => {\n    const districtGroups = useMemo(() => groupDistricts({\n        districts: districts.items,\n        regionId\n    }), [ districts, regionId ]);\n\n    const districtCount = useMemo(\n        () => getDistrictCount(checkedIds, districtGroups),\n        [ checkedIds, districtGroups ]\n    );\n\n    return (\n        <Modal\n            size={ModalSize.FULL_L}\n            borderRadius={BorderRadius.none}\n            uikitZIndexEnabled={uikitZIndexEnabled}\n            fullScreen\n        >\n            <ModalHeading\n                text='Район'\n                activeCount={districtCount}\n                onClose={hide}\n            />\n            <DistrictSelect\n                regionId={regionId}\n                groups={districtGroups}\n                checked={checkedIds}\n                limit={Limit.noLimit}\n                onChange={handleChange}\n            />\n            <div className={cn('clear')}>\n                <Button\n                    fullWidth\n                    size='s'\n                    variant='secondary'\n                    onClick={onReset}\n                >\n                    Сбросить районы\n                </Button>\n            </div>\n            <div className={cn('submit')}>\n                <Button\n                    fullWidth\n                    size='s'\n                    onClick={onSubmit}\n                >\n                    Сохранить\n                </Button>\n            </div>\n        </Modal>\n\n    );\n};\n","import React, { ReactNode } from 'react';\nimport { TipTypeEnum } from '@search/graphql-typings';\n\nimport classname from '@search/classname/src';\n\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\n\nimport { MetroStation } from '../../../../../../../domain/geo/MetroStation';\nimport { District } from '../../../../../../../domain/geo/District';\nimport { Address } from '../../../../../../../domain/geo/Address';\n\nimport { MetroMark } from '../../../../../../common/components/GeoSuggest/MetroMark';\n\nimport { FilteredItem, isQueryDisplayValue, isGeoDistrictsGroupItem } from '../MobileGeoFilterView';\n\nimport './GeoTagItem.css';\n\nconst cn = classname.bind(null, 'GeoTagItem');\n\ninterface IGeoTagItemProps {\n    item: FilteredItem;\n    handleRemove: (item: FilteredItem) => void;\n}\n\nexport const GeoTagItem: React.FC<IGeoTagItemProps> = ({\n    item,\n    handleRemove\n}) => {\n    let component: ReactNode | null = null;\n\n    if (isGeoDistrictsGroupItem(item)) {\n        component = item.title;\n    } else if (isQueryDisplayValue(item)) {\n        if (item.type === TipTypeEnum.NewBuilding) {\n            component = item.title || 'Жилой комплекс';\n        }\n\n        if (item.type === TipTypeEnum.Address) {\n            component = item.title;\n        }\n    } else {\n        if (item.kind === GeoKind.METRO) {\n            const metroItem = item as MetroStation;\n\n            component = (\n                <>\n                    <span className={cn('marks')}>\n                        <MetroMark\n                            colors={metroItem.allRoutesColorsList}\n                        />\n                    </span>\n                    <span className={cn('title')}>\n                        {metroItem.title}\n                    </span>\n                </>\n            );\n        } else if (item.kind === GeoKind.DISTRICT || item.kind === GeoKind.LOCALITY) {\n            const districtItem = item as District;\n\n            component = districtItem.title;\n        } else {\n            const addressItem = item as Address;\n\n            component = addressItem.displayName || addressItem.mainName;\n        }\n    }\n\n    return (\n        <div\n            className={`${cn('flex')} ${cn('item')} container`}\n            key={item.id}\n        >\n            <div className={cn('flex', undefined, 'col-xs-11')}>\n                {component}\n            </div>\n            <div\n                className={cn('icon', undefined, 'col-xs-1')}\n                onClick={() => handleRemove(item)}\n            >\n                <svg width='12' height='14' viewBox='0 0 12 14' fill='none' xmlns='http://www.w3.org/2000/svg'>\n                    {/* eslint-disable-next-line max-len */}\n                    <path fillRule='evenodd' clipRule='evenodd' d='M4.52778 1C4.31317 1 4.1225 1.13695 4.05397 1.34032L3.93422 1.69565H8.06578L7.94603 1.34032C7.8775 1.13695 7.68683 1 7.47222 1H4.52778ZM9.12103 1.69565L8.89367 1.02097C8.68806 0.41086 8.11604 0 7.47222 0H4.52778C3.88396 0 3.31194 0.410859 3.10633 1.02097L2.87897 1.69565H0V2.69565H0.679334L1.43134 12.6134C1.49065 13.3956 2.14261 14 2.92705 14H8.81029C9.58029 14 10.2252 13.417 10.3027 12.6509L11.3091 2.69565H12V1.69565H9.12103ZM10.304 2.69565H1.6822L2.42848 12.5378C2.44825 12.7985 2.66557 13 2.92705 13H8.81029C9.06695 13 9.28193 12.8057 9.30775 12.5503L10.304 2.69565ZM3.5 11.5V4H4.5V11.5H3.5ZM5.5 11.5V4H6.5V11.5H5.5ZM7.5 11.5V4H8.5V11.5H7.5Z' fill='#B6B9C9' />\n                </svg>\n            </div>\n        </div>\n    );\n};\n","import React from 'react';\n\nimport { GeoTagItem } from './taglist/GeoTagItem';\nimport { FilteredItem } from './MobileGeoFilterView';\n\ninterface IGeoTagListProps {\n    items: FilteredItem[];\n    handleRemove: (item: FilteredItem) => void;\n}\n\nexport const GeoTagList: React.FC<IGeoTagListProps> = ({\n    items,\n    handleRemove\n}) => {\n    return (\n        <>\n            {\n                items.map(item => (\n                    <GeoTagItem\n                        key={item.id}\n                        item={item}\n                        handleRemove={handleRemove}\n                    />\n                ))\n            }\n        </>\n    );\n};\n","import React from 'react';\n\nimport { ModalHeading } from '../../../../../../mobile/components/ModalHeading';\n\nimport { GeoTagList } from '../GeoTagList';\nimport { FilteredItem } from '../MobileGeoFilterView';\n\ninterface IFullGeoTagListProps {\n    items: FilteredItem[];\n    handleRemove: (item: FilteredItem) => void;\n    fullGeoTagOff?: () => void;\n    dataTest?: string;\n}\n\nexport const FullGeoTagList: React.FC<IFullGeoTagListProps> = ({\n    items,\n    dataTest,\n    handleRemove,\n    fullGeoTagOff\n}) => {\n    return (\n        <>\n            <ModalHeading\n                text='Адреса'\n                dataTest={dataTest ? `${dataTest}-heading` : undefined}\n                onClose={fullGeoTagOff}\n            />\n            <div>\n                <GeoTagList\n                    items={items}\n                    handleRemove={handleRemove}\n                />\n            </div>\n        </>\n    );\n};\n","/* eslint-disable max-len */\nimport React, { useMemo } from 'react';\nimport classname from '@search/classname/src';\nimport { Modal, ModalSize, useModal } from '@search/vtbeco-ui/src/components/Modal';\nimport { BorderRadius } from '@search/vtbeco-ui/src/components/Paper';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport { GeoFilter } from '../../../../../models/Filter';\nimport { GeoBaseStore } from '../../../../../../../domain/geo/GeoBase';\nimport { GeoTagList } from '../GeoTagList';\nimport { FilteredItem } from '../MobileGeoFilterView';\nimport { QueryDisplayValues } from '../../../../../../common/hooks/useQueryDisplayValues';\nimport { groupDistricts } from '../../../../../helpers/districtHelper';\nimport { FullGeoTagList } from './FullGeoTagList';\n\nimport './PreviewGeoTagList.css';\n\nconst cn = classname.bind(null, 'PreviewGeoTagList');\n\nfunction notUndefined<T>(x: T | undefined): x is T {\n    return x !== undefined;\n}\n\ninterface IPreviewGeoTagListProps {\n    filter: GeoFilter;\n    regionId: RegionIdEnum;\n    store: GeoBaseStore;\n    handleRemove: (item: FilteredItem) => void;\n    queryDisplayValues?: QueryDisplayValues;\n}\n\nexport const PreviewGeoTagList: React.FC<IPreviewGeoTagListProps> = ({\n    filter,\n    store,\n    handleRemove,\n    queryDisplayValues,\n    regionId\n}) => {\n    const { on: fullGeoTagOn, off: fullGeoTagOff, visible: isFullGeoTagVisible } = useModal();\n\n    const geoObjects = useMemo(() => {\n        const districtIdsSet = new Set(filter.districtIds);\n\n        const groupedDistricts = groupDistricts({\n            regionId,\n            districts: store.districts.items\n        }).filter(group => group.items.every(item => districtIdsSet.has(Number(item.id))));\n\n        const nextGeoObjects: FilteredItem[] = groupedDistricts\n            .map(({ items, title }) => {\n                const districtIds: number[] = [];\n\n                items.forEach(({ id }) => {\n                    const numberedId = Number(id);\n\n                    districtIds.push(numberedId);\n                    districtIdsSet.delete(numberedId);\n                });\n\n                return {\n                    title,\n                    districtIds,\n                    id: `group-${title}`,\n                    kind: 'districts-group'\n                };\n            });\n\n        const ids = [\n            ...filter.metroIds,\n            ...Array.from(districtIdsSet),\n            ...filter.addressIds\n        ];\n\n        nextGeoObjects.push(\n            ...ids.map(id => {\n                const d = store.districts.get(id);\n\n                if (d) {\n                    return d;\n                }\n\n                const m = store.stations.get(id);\n\n                if (m) {\n                    return m;\n                }\n\n                const a = queryDisplayValues?.addresses && queryDisplayValues?.addresses[id];\n\n                if (a) {\n                    return a;\n                }\n\n                return;\n            }).filter(notUndefined)\n        );\n\n        return nextGeoObjects;\n    }, [\n        regionId, store,\n        filter.districtIds, filter.addressIds, filter.metroIds,\n        queryDisplayValues\n    ]);\n\n    let slicedItems = geoObjects.slice(0, 3);\n    let items = geoObjects;\n\n    if (filter.newBuildingIds.length) {\n        const newBuildingItems = filter.newBuildingIds.map(id =>\n            queryDisplayValues?.newBuildings && queryDisplayValues?.newBuildings[id]\n        ).filter(notUndefined);\n\n        if (newBuildingItems.length) {\n            slicedItems = [\n                ...newBuildingItems,\n                ...slicedItems\n            ];\n\n            items = [\n                ...newBuildingItems,\n                ...items\n            ];\n        }\n    }\n\n    return (\n        <div className={cn(null, { withoutMargin: Boolean(slicedItems.length <= 0) })}>\n            <GeoTagList\n                items={slicedItems}\n                handleRemove={handleRemove}\n            />\n            {slicedItems.length > 0 && <div\n                className={`${cn('flex')} ${cn('item')} container`}\n                onClick={fullGeoTagOn}\n                data-test='filter-geo-show-all'\n            >\n                <div className={`${cn('flex')} ${cn('addresses')} col-xs-11`}>\n                    Все выбранные адреса\n                </div>\n                <div\n                    className={cn('icon', undefined, 'col-xs-1')}\n                >\n                    {items.length}\n                </div>\n            </div>\n            }\n            {isFullGeoTagVisible && (\n                <Modal\n                    size={ModalSize.FULL_L}\n                    borderRadius={BorderRadius.none}\n                    fullScreen\n                >\n                    <FullGeoTagList\n                        items={items}\n                        handleRemove={handleRemove}\n                        fullGeoTagOff={fullGeoTagOff}\n                    />\n                </Modal>\n            )}\n        </div>\n    );\n};\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React, { Fragment, useCallback } from 'react';\n\nimport { RootRegionsApplicationEnum, SuggestTypeEnum, TipTypeEnum } from '@search/graphql-typings';\nimport { SuggestItemTypeEnum } from '@search/graphql-gateway/typings';\n\nimport { Input, Size } from '@vtblife/uikit/legacy';\n\nimport { useModal } from '@search/vtbeco-ui/src/components/Modal';\nimport classname from '@search/classname/src';\n\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport { RegionIdEnum, regionsWithMetroEnumeration } from '@search/filter-enums/enums/Region';\nimport { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\n\nimport { Address } from '@search/vtbeco-frontend-core/domain/geo/Address';\nimport { GeoBaseStore, GeoFilteredItem, GeoId } from '@search/vtbeco-frontend-core/domain/geo/GeoBase';\nimport { correctAndBroadenRegionId, SuggestionType } from '../../../../../common/components/GeoSuggest/GeoSuggest';\nimport {\n    Filters,\n    GeoFilter,\n    NewBuildingDataFilter,\n    IFilter,\n    RegionFilter,\n    DeveloperFilter\n} from '../../../../models/Filter';\nimport {\n    AddQueryDisplayValue,\n    QueryDisplayValue,\n    QueryDisplayValues\n} from '../../../../../common/hooks/useQueryDisplayValues';\nimport { dataLayerPush } from '../../../../../../domain/google/dataLayerPush';\n\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { TipItem } from '../../../../../tips/OffersSearchTips';\nimport { FilterTagList } from '../../desktop/geo/FilterTagList/FilterTagList';\n\nimport { MetroModal } from './MetroModal';\nimport { SuggestModal } from './SuggestModal';\nimport { DistrictModal } from './DistrictModal';\nimport { PreviewGeoTagList } from './taglist/PreviewGeoTagList';\n\nimport './MobileGeoFilterView.css';\n\ntype GeoDistrictsGroupItem = {\n    id: string;\n    __typename?: undefined;\n    title: string;\n    districtIds: number[];\n    kind: 'districts-group';\n}\n\nexport function isGeoDistrictsGroupItem(item: FilteredItem): item is GeoDistrictsGroupItem {\n    return (item as GeoDistrictsGroupItem).kind === 'districts-group';\n}\n\nexport type FilteredItem = GeoFilteredItem | QueryDisplayValue | GeoDistrictsGroupItem;\n\ninterface IMobileGeoFilterViewProps {\n    geoStore: GeoBaseStore;\n    filters: FilterCollection;\n    rootRegionsApp: RootRegionsApplicationEnum;\n    onChange: (filter: IFilter[]) => void;\n    onInputToggleFocus?: (disabled: boolean) => void;\n    showNewBuildingsGroup?: boolean;\n    startWithNewBuildings?: boolean;\n    queryDisplayValues?: QueryDisplayValues;\n    addQueryDisplayValue?: AddQueryDisplayValue;\n    title?: string;\n    titleWithNewBuildings?: string;\n    placeholder?: string;\n    placeholderWithNewBuildings?: string;\n    limit?: number;\n    tips?: QueryDisplayValue[];\n    removeTips?: (tips: TipItem[]) => void;\n    suggestTypes?: SuggestTypeEnum[];\n    oldFilters?: boolean;\n    uikitModalZIndexEnabled?: boolean;\n}\n\nconst cn = classname.bind(null, 'MobileGeoFilterView');\n\nexport function isQueryDisplayValue(\n    item: FilteredItem\n): item is QueryDisplayValue {\n    return (item as QueryDisplayValue).type !== undefined;\n}\n\nexport const MobileGeoFilterView: React.FC<IMobileGeoFilterViewProps> = ({\n    rootRegionsApp,\n    suggestTypes,\n    limit,\n    geoStore: geoStoreProp,\n    filters,\n    onChange,\n    onInputToggleFocus,\n    showNewBuildingsGroup,\n    startWithNewBuildings,\n    queryDisplayValues,\n    addQueryDisplayValue,\n    title = 'Город, метро, район, адрес',\n    titleWithNewBuildings = 'ЖК, город, метро, район, адрес',\n    placeholder = 'Введите город, метро, район, адрес',\n    placeholderWithNewBuildings = 'Введите город, метро, район, адрес, ЖК',\n    tips,\n    removeTips,\n    oldFilters,\n    uikitModalZIndexEnabled\n}) => {\n    const filter = filters.get(Filters.geo) as GeoFilter;\n    const regionId = (filters.get(Filters.region) as RegionFilter).region;\n    const geoStore = geoStoreProp;\n    const { geoIds } = filter;\n    const { on: districtOn, off: districtOff, visible: isDistrictVisible } = useModal();\n    const { on: metroOn, off: metroOff, visible: isMetroVisible } = useModal();\n    const { on: suggestOn, off: suggestOff, visible: isSuggestVisible } = useModal();\n    /** District в збс, новостройки не поддерживают byRegion */\n    const districts = geoStore.districts.byRegion ? geoStore.districts.byRegion(regionId) : geoStore.districts;\n\n    const splitIds = useCallback((newGeoIds: Set<number>) => {\n        const tipIds = Array.from(newGeoIds);\n        const districtIds = tipIds.filter(id => geoStore.districts.has(id));\n        const metroIds = tipIds.filter(id => geoStore.stations.has(id));\n\n        return { tipIds, districtIds, metroIds };\n    }, [ geoStore.districts, geoStore.stations ]);\n\n    const { districtIds, metroIds } = splitIds(geoIds);\n\n    const handleMetroDistrictChange = useCallback((checkedDiff: GeoId[], uncheckedDiff: Set<GeoId>) => {\n        const newGeoIds = new Set<number>(filter.geoIds);\n\n        uncheckedDiff.forEach(id => newGeoIds.delete(id));\n        for (const id of checkedDiff) newGeoIds.add(id);\n\n        const splitted = splitIds(newGeoIds);\n        const {\n            metroIds: metroIdList,\n            districtIds: districtIdList\n        } = splitted;\n        const ids: {\n            type: SuggestItemTypeEnum;\n            idList: number[];\n        }[] = [\n            {\n                type: SuggestItemTypeEnum.Metro,\n                idList: metroIdList\n            },\n            {\n                type: SuggestItemTypeEnum.District,\n                idList: districtIdList\n            }\n        ];\n\n        let newRegionId: number | undefined;\n\n        for (const { type, idList } of ids) {\n            for (const id of idList) {\n                const broadenedRegionId = correctAndBroadenRegionId(id, type, regionId);\n\n                if (broadenedRegionId !== regionId) {\n                    newRegionId = broadenedRegionId;\n\n                    break;\n                }\n            }\n\n            if (newRegionId) {\n                break;\n            }\n        }\n\n        const newGeoFilter = new GeoFilter(\n            newGeoIds,\n            metroIdList,\n            districtIdList,\n            filter.addressIds,\n            filter.newBuildingIds\n        );\n\n        onChange(newRegionId ? [\n            new RegionFilter(newRegionId),\n            newGeoFilter\n        ] : [\n            newGeoFilter\n        ]);\n    }, [\n        splitIds,\n        onChange,\n        filter.geoIds,\n        filter.addressIds,\n        filter.newBuildingIds,\n        regionId\n    ]);\n\n    const onResetMetro = useCallback(() => {\n        const newGeoIds = new Set<number>();\n\n        filter.geoIds.forEach(id => {\n            if (! geoStore.stations.has(id)) newGeoIds.add(id);\n        });\n\n        const splitted = splitIds(newGeoIds);\n\n        onChange([\n            new GeoFilter(\n                newGeoIds,\n                splitted.metroIds,\n                splitted.districtIds,\n                filter.addressIds,\n                filter.newBuildingIds\n            )\n        ]);\n        metroOff();\n    }, [\n        filter.geoIds,\n        filter.addressIds,\n        filter.newBuildingIds,\n        splitIds,\n        onChange,\n        metroOff,\n        geoStore.stations\n    ]);\n\n    const onResetDistrict = useCallback(() => {\n        const newGeoIds = new Set<number>();\n\n        filter.geoIds.forEach(id => {\n            if (! geoStore.districts.has(id)) newGeoIds.add(id);\n        });\n\n        const splitted = splitIds(newGeoIds);\n\n        onChange([\n            new GeoFilter(\n                newGeoIds,\n                splitted.metroIds,\n                splitted.districtIds,\n                filter.addressIds,\n                filter.newBuildingIds\n            )\n        ]);\n        districtOff();\n    }, [\n        filter.geoIds,\n        filter.addressIds,\n        filter.newBuildingIds,\n        splitIds,\n        onChange,\n        districtOff,\n        geoStore.districts\n    ]);\n\n    const onMetroSubmit = useCallback(() => {\n        metroOff();\n    }, [ metroOff ]);\n\n    const onDistrictSubmit = useCallback(() => {\n        districtOff();\n    }, [ districtOff ]);\n\n    const handleRemoveItem = useCallback((item: FilteredItem) => {\n        const id = item.id as Exclude<FilteredItem, GeoDistrictsGroupItem>['id']; // to Number type for ignore errors in cases with string id;\n        const newGeoIds = new Set(filter.geoIds);\n        const newDistrictIds = new Set(filter.districtIds);\n\n        let newMetroIds = filter.metroIds;\n        let newAddressIds = filter.addressIds;\n        let newNewBuildingIds = filter.newBuildingIds;\n\n        if (isGeoDistrictsGroupItem(item)) {\n            item.districtIds.forEach(districtId => {\n                newGeoIds.delete(districtId);\n                newDistrictIds.delete(districtId);\n            });\n        } else if (isQueryDisplayValue(item)) {\n            if (item.type === TipTypeEnum.NewBuilding) {\n                newNewBuildingIds = newNewBuildingIds.filter(newBuildingId => newBuildingId !== id);\n            }\n\n            if (item.type === TipTypeEnum.Address) {\n                newAddressIds = newAddressIds.filter(addressId => addressId !== id);\n            }\n\n            newGeoIds.delete(id);\n        } else {\n            newGeoIds.delete(id);\n\n            if (item.kind === GeoKind.METRO) {\n                newMetroIds = newMetroIds.filter(metroId => metroId !== id);\n            } else if (item.kind === GeoKind.DISTRICT || item.kind === GeoKind.LOCALITY) {\n                newDistrictIds.delete(id);\n            } else {\n                newAddressIds = newAddressIds.filter(addressId => addressId !== id);\n            }\n        }\n\n        onChange([\n            new GeoFilter(newGeoIds, newMetroIds, Array.from(newDistrictIds), newAddressIds, newNewBuildingIds)\n        ]);\n    }, [ filter, onChange ]);\n\n    // eslint-disable-next-line complexity\n    const onSuggestChange = useCallback((suggestion: SuggestionType) => {\n        let newRegionId: RegionIdEnum | undefined;\n\n        if (\n            suggestion!.data &&\n            suggestion.data.regionId &&\n            regionId !== suggestion!.data.regionId\n        ) {\n            newRegionId = suggestion.data.regionId;\n        }\n\n        const filterGeoIds: Set<number> = new Set<number>(newRegionId ? [] : filter.geoIds);\n        const filterMetroIds: number[] = newRegionId ? [] : [ ...filter.metroIds ];\n        const filterDistrictIds: number[] = newRegionId ? [] : [ ...filter.districtIds ];\n        const filterAddressIds: number[] = newRegionId ? [] : [ ...filter.addressIds ];\n        const filterNewBuildingIds: number[] = newRegionId ? [] : [ ...filter.newBuildingIds ];\n        let newBuildingData;\n        let developerId;\n\n        switch (suggestion.__typename) {\n            case SuggestItemTypeEnum.NewBuilding: {\n                const { id } = suggestion.data;\n\n                if (! filterNewBuildingIds.includes(id)) {\n                    filterNewBuildingIds.push(id);\n\n                    const { newBuilding } = suggestion;\n\n                    if (newBuilding) {\n                        const {\n                            id: newBuildingId,\n                            type: newBuildingType,\n                            name: newBuildingName,\n                            title: newBuildingTitle\n                        } = newBuilding;\n\n                        addQueryDisplayValue && addQueryDisplayValue('newBuildings', {\n                            id: newBuildingId,\n                            title: newBuildingTitle?.nominative,\n                            type: TipTypeEnum.NewBuilding\n                        });\n\n                        newBuildingData = {\n                            type: newBuildingType,\n                            name: newBuildingName,\n                            id: newBuildingId\n                        };\n                    }\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Developer: {\n                const { developer } = suggestion;\n\n                if (developer) {\n                    const { id } = developer;\n\n                    developerId = id;\n\n                    addQueryDisplayValue && addQueryDisplayValue('developers', {\n                        id,\n                        title: developer.title,\n                        type: TipTypeEnum.Developer\n                    });\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.District: {\n                const { id } = suggestion.data;\n\n                if (! filterDistrictIds.includes(id)) {\n                    filterDistrictIds.push(id);\n                    filterGeoIds.add(id);\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Metro: {\n                const { id } = suggestion.data;\n\n                if (! filterMetroIds.includes(id)) {\n                    filterMetroIds.push(id);\n                    filterGeoIds.add(id);\n                }\n\n                break;\n            }\n\n            case SuggestItemTypeEnum.Address: {\n                const { id } = suggestion.data;\n\n                if (! filterAddressIds.includes(id)) {\n                    filterAddressIds.push(id);\n                    filterGeoIds.add(id);\n\n                    if (\n                        suggestion.address\n                    ) {\n                        // Для обратной совместимости с текущими tips, перейти потом на displayValues\n                        geoStore.addresses.add({\n                            ...suggestion.address,\n                            kind: GeoKind.STREET_ADDRESS\n                        } as Address);\n\n                        addQueryDisplayValue && addQueryDisplayValue('addresses', {\n                            id: suggestion.address.id,\n                            kind: suggestion.address.kind,\n                            translit: suggestion.address.translit,\n                            title: suggestion.address.displayName,\n                            type: TipTypeEnum.Address\n                        });\n                    }\n                }\n\n                break;\n            }\n\n            default:\n                return;\n        }\n\n        const newFilters: IFilter[] = [\n            new GeoFilter(\n                filterGeoIds,\n                filterMetroIds,\n                filterDistrictIds,\n                filterAddressIds,\n                filterNewBuildingIds\n            ),\n            new NewBuildingDataFilter(newBuildingData)\n        ];\n\n        if (newRegionId) {\n            newFilters.push(\n                new RegionFilter(newRegionId)\n            );\n        }\n\n        if (developerId) {\n            newFilters.push(\n                new DeveloperFilter(developerId)\n            );\n        }\n\n        onChange(newFilters);\n        suggestOff();\n    }, [\n        filter.geoIds,\n        filter.districtIds,\n        filter.addressIds,\n        filter.metroIds,\n        filter.newBuildingIds,\n        onChange,\n        regionId,\n        geoStore,\n        suggestOff,\n        addQueryDisplayValue\n    ]);\n\n    const shouldHaveNewBuildings = showNewBuildingsGroup && ! filter.newBuildingIds.length;\n    const hasMetro = regionsWithMetroEnumeration.has(regionId) && ! geoStore.stations.isEmpty();\n    const hasDistricts = geoStore?.districts?.ids?.length;\n\n    return (\n        <MobileFilter\n            filterTitle={shouldHaveNewBuildings ? titleWithNewBuildings : title}\n            className={cn('', { oldFilters })}\n        >\n            <div className={'GeoSuggest'} onClick={() => suggestOn()}>\n                <div className={'col-xs-12'} data-test='filter-geo-suggest'>\n                    <Input\n                        fullWidth\n                        size={Size.Small}\n                        name='filter-geo-input'\n                        // Баг ui-kit, пустое значение превращается в 'undefined'\n                        value=''\n                        placeholder={\n                            shouldHaveNewBuildings ?\n                                placeholderWithNewBuildings :\n                                placeholder\n                        }\n                    />\n                </div>\n            </div>\n            <div className={`container ${cn('choose')}`}>\n                {\n                    (hasMetro || hasDistricts) ? (\n                        <span\n                            className={cn('choose-geo-item')}\n                        >\n                            Выбрать:&nbsp;\n                        </span>\n                    ) : null\n                }\n                {\n                    hasMetro ? (\n                        <Fragment>\n                            <span\n                                className={cn('geo-item')}\n                                onClick={() => {\n                                    metroOn();\n                                    dataLayerPush({ event: 'classified_filter_metro' });\n                                }}\n                                data-test='filter-geo-metro-popup'\n                            >\n                                метро\n                            </span>\n                            { hasDistricts ? <span>, &nbsp;</span> : null }\n                        </Fragment>\n                    ) : null\n                }\n                {\n                    hasDistricts ? (\n                        <span\n                            className={cn('geo-item')}\n                            data-test='filter-geo-district-popup'\n                            onClick={() => {\n                                districtOn();\n                                dataLayerPush({ event: 'classified_filter_district' });\n                            }}\n                        >\n                            районы\n                        </span>\n                    ) : null\n                }\n            </div>\n            {\n                tips ? (\n                    <FilterTagList\n                        tips={tips}\n                        filters={filters}\n                        openMetroModal={metroOn}\n                        removeTips={removeTips}\n                    />\n                ) : (\n                    <PreviewGeoTagList\n                        filter={filter}\n                        store={geoStore}\n                        regionId={regionId}\n                        handleRemove={handleRemoveItem}\n                        queryDisplayValues={queryDisplayValues}\n                    />\n                )\n            }\n            {\n                isSuggestVisible ? (\n                    <SuggestModal\n                        regionId={regionId}\n                        hide={suggestOff}\n                        rootRegionsApp={rootRegionsApp}\n                        limit={limit}\n                        onInputToggleFocus={onInputToggleFocus}\n                        handleChange={onSuggestChange}\n                        showNewBuildingsGroup={shouldHaveNewBuildings}\n                        startWithNewBuildings={startWithNewBuildings}\n                        placeholder={placeholder}\n                        placeholderWithNewBuildings={placeholderWithNewBuildings}\n                        suggestTypes={suggestTypes}\n                        uikitZIndexEnabled={uikitModalZIndexEnabled}\n                    />\n                ) : null\n            }\n            {\n                isDistrictVisible ? (\n                    <DistrictModal\n                        regionId={regionId}\n                        hide={districtOff}\n                        checkedIds={districtIds}\n                        districts={districts}\n                        handleChange={handleMetroDistrictChange}\n                        onReset={onResetDistrict}\n                        onSubmit={onDistrictSubmit}\n                        uikitZIndexEnabled={uikitModalZIndexEnabled}\n                    />\n                ) : null\n            }\n            {\n                isMetroVisible ? (\n                    <MetroModal\n                        hide={metroOff}\n                        checkedIds={metroIds}\n                        store={geoStore.stations}\n                        handleChange={handleMetroDistrictChange}\n                        onReset={onResetMetro}\n                        onSubmit={onMetroSubmit}\n                        uikitZIndexEnabled={uikitModalZIndexEnabled}\n                    />\n                ) : null\n            }\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { NumberInput } from '@vtblife/uikit';\n\nimport { useEnterBlur } from '@search/hooks/src/useEnterBlur';\nimport { KitchenAreaFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport '../MobileCommon.css';\n\ninterface IMobileKitchenAreaFilterViewProps {\n    filter: KitchenAreaFilter;\n    handleChange: (filter: KitchenAreaFilter) => void;\n}\n\nexport const MobileKitchenAreaFilterView: React.FC<IMobileKitchenAreaFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback((value: number) => {\n        handleChange(new KitchenAreaFilter({ from: Number(value) || null, to: null }));\n    }, [ handleChange ]);\n\n    const onKeyPressEnterBlur = useEnterBlur();\n\n    return (\n        <MobileFilter\n            filterTitle='Кухня'\n        >\n            <div className='container'>\n                <div className={'col-xs-12'}>\n                    <NumberInput\n                        value={filter.value.from ?? undefined}\n                        postfix={'м²'}\n                        onChange={onChange}\n                        onKeyPress={onKeyPressEnterBlur}\n                        max={100_000}\n                        name='kitchenAreaFrom'\n                        placeholder='от'\n                    />\n                </div>\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { LivingAreaFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\ninterface IMobileLivingAreaFilterViewProps {\n    filter: LivingAreaFilter;\n    handleChange: (filter: LivingAreaFilter) => void;\n}\n\nexport const MobileLivingAreaFilterView: React.FC<IMobileLivingAreaFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new LivingAreaFilter(value));\n    }, [ filter, handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Жилая'\n        >\n            <div className='container'>\n                <div className={'col-xs-12'}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        unit='м²'\n                        value={filter.value}\n                        onChange={onChange}\n                        max={100_000}\n                        nameFrom='livingAreaFrom'\n                        nameTo='livingAreaTo'\n                    />\n                </div>\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { NewBuildingDeal } from '@search/filter-enums/enums';\n\nimport { NewBuildingDealFilter } from '../../../../models/Filter';\n\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: NewBuildingDeal.LAW_214,\n    label: '214 ФЗ',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: NewBuildingDeal.ESCROW,\n    label: 'Эскроу-счета',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n    filter: NewBuildingDealFilter;\n    handleChange: (filter: NewBuildingDealFilter) => void;\n}\n\nexport const MobileNewBuildingDealFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new NewBuildingDealFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Сделка'\n        >\n            <MultiSelect\n                name='newBuildingDeal'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.deal}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport classname from '@search/classname/src';\n\nimport { M2PRO_OPTIONS, M2ProEnum } from '../../../../../../domain/newbuilding/libs/constants';\nimport { NotOnlyM2ProFilter } from '../../../../models/Filter';\nimport { RadioSelect, RadioValue } from '../../common/RadioSelect';\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport '../MobileCommon.css';\nimport './MobileNotOnlyM2ProFilterView.css';\n\nconst cn = classname.bind(null, 'MobileNotOnlyM2ProFilterView');\n\nconst M2PRO_OPTIONS_MOBILE = [\n    M2PRO_OPTIONS[M2ProEnum.M2Pro],\n    {\n        ...M2PRO_OPTIONS[M2ProEnum.All],\n        className: cn('option')\n    }\n];\n\nexport const MobileNotOnlyM2ProFilterView = ({\n    filter,\n    handleChange\n}: {\n    filter: NotOnlyM2ProFilter;\n    handleChange: (filter: NotOnlyM2ProFilter) => void;\n}) => {\n    const { notOnlyM2Pro } = filter;\n    const m2ProSelectedOption = M2PRO_OPTIONS_MOBILE.find(item => item.value === (\n        notOnlyM2Pro ? M2ProEnum.All : M2ProEnum.M2Pro\n    ))!;\n    const handleM2ProChange = useCallback((m2ProValue: RadioValue) => handleChange(\n        new NotOnlyM2ProFilter(m2ProValue === M2ProEnum.All)\n    ), [ handleChange ]);\n\n    return (\n        <MobileFilter filterTitle='Сортировка ЖК'>\n            <div className='container'>\n                <RadioSelect\n                    name='M2Pro'\n                    options={M2PRO_OPTIONS_MOBILE}\n                    value={m2ProSelectedOption.value}\n                    handleChange={handleM2ProChange}\n                    className={cn('checkboxGroup')}\n                />\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { ParkingType } from '@search/filter-enums/enums';\nimport { ParkingFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileParkingFilterViewProps {\n    filter: ParkingFilter;\n    handleChange: (filter: ParkingFilter) => void;\n}\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: ParkingType.CLOSED,\n    label: 'Закрытая',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: ParkingType.UNDERGROUND,\n    label: 'Подземная',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: ParkingType.OPEN,\n    label: 'Открытая',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileParkingFilterView: React.FC<IMobileParkingFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new ParkingFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Парковка'\n        >\n            <MultiSelect\n                name='parkingEnumeration'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.parkings}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { PaymentType } from '@search/filter-enums/enums';\n\nimport { PaymentTypeFilter } from '../../../../models/Filter';\n\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [\n    {\n        value: PaymentType.ARMY_MORTGAGE,\n        label: 'Военная ипотека',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: PaymentType.INSTALLMENT,\n        label: 'Рассрочка',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: PaymentType.MOTHER_CAPITAL,\n        label: 'Материнский капитал',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\ninterface IProps {\n    filter: PaymentTypeFilter;\n    handleChange: (filter: PaymentTypeFilter) => void;\n}\n\nexport const MobilePaymentTypeFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new PaymentTypeFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Покупка'\n        >\n            <MultiSelect\n                name='paymentType'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.type}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n\n","import React, { useCallback } from 'react';\n\nimport { Position } from '@search/filter-enums/enums';\nimport { PositionFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: Position.STANDALONE,\n    label: 'Одиночное здание',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\ninterface IProps {\n    filter: PositionFilter;\n    handleChange: (filter: PositionFilter) => void;\n}\n\nexport const MobilePositionFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new PositionFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Размер ЖК'\n        >\n            <MultiSelect\n                name='position'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.position}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { AreaUnit } from '@search/filter-enums/enums';\n\nimport { RadioSelect, RadioOption } from '../../common/RadioSelect';\nimport { PriceFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\ninterface IMobilePriceFilterViewProps {\n    filter: PriceFilter;\n    priceTypes?: AreaUnit[];\n    handleChange: (filter: PriceFilter) => void;\n}\n\nconst selectOptions: RadioOption[] = [ {\n    value: AreaUnit.UNKNOWN,\n    label: 'За всё',\n    className: 'col-xs-6'\n}, {\n    value: AreaUnit.METER,\n    label: 'За м²',\n    className: 'col-xs-6'\n}, {\n    value: AreaUnit.ARE,\n    label: 'За сотку',\n    className: 'col-xs-6'\n} ];\n\nexport const MobilePriceFilterView: React.FC<IMobilePriceFilterViewProps> = ({\n    filter,\n    priceTypes = [ AreaUnit.UNKNOWN, AreaUnit.METER ],\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new PriceFilter(filter.priceType, value));\n    }, [ filter, handleChange ]);\n\n    const onChangePriceType = useCallback(value => {\n        handleChange(new PriceFilter(value, filter.value));\n    }, [ filter, handleChange ]);\n\n    const filteredOptions = selectOptions.filter(item => {\n        // @ts-ignore\n        return priceTypes.includes(item.value);\n    });\n\n    return (\n        <MobileFilter\n            filterTitle='Цена'\n        >\n            <div className='container'>\n                <div className={'col-xs-12 filter-item-gap'}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        unit='₽'\n                        value={filter.value}\n                        onChange={onChange}\n                        nameFrom='priceFrom'\n                        nameTo='priceTo'\n                    />\n                </div>\n                {\n                    filteredOptions.length > 1 ? (\n                        <RadioSelect\n                            name='Price'\n                            options={filteredOptions}\n                            value={filter.priceType}\n                            handleChange={onChangePriceType}\n                        />\n                    ) : null\n                }\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback, useMemo, useState } from 'react';\n\nimport { Select, useSelect } from '@vtblife/uikit';\n\nimport { useGeoUserRegion } from '@search/geo/src/useGeoUserRegion';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\nimport classname from '@search/classname/src';\n\nimport defaultRegionSelectOptions from '../../../../../../dict/filters/regions';\n\nimport {\n    getFilteredFlatRegionSelectOptions,\n    getSelectedOptionLabel\n} from '../../../../helpers/regionHelper';\nimport { RegionFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport {\n    RenderRegionSelectUikitContent,\n    MIN_OPTIONS_NUMBER_WITH_INPUT,\n    OptionTypeRegionFilter, GroupedOptions,\n} from '../../region/RenderRegionSelectUikitContent';\n\nimport '../MobileCommon.css';\n\ninterface IMobileRegionFilterViewProps {\n    filter: RegionFilter;\n    onChange: (filter: RegionFilter) => void;\n    options?: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[];\n    isDesktop?: boolean;\n    native?: boolean;\n    onMap?: boolean;\n}\n\nconst cn = classname.bind(null, 'MobileRegionFilterView');\n\nconst defaultOptions = defaultRegionSelectOptions.map(option => ({\n    ...option,\n    value: String(option.value)\n}));\n\nexport const MobileRegionFilterView: React.FC<IMobileRegionFilterViewProps> = ({\n    filter,\n    onChange,\n    isDesktop,\n    options = defaultOptions,\n    native,\n    onMap,\n}) => {\n    const { setRegionId } = useGeoUserRegion();\n    const handleChange = useCallback((newValue: string) => {\n        const parsedValue = parseInt(newValue, 10) as RegionIdEnum;\n\n        setRegionId(parsedValue);\n        onChange(new RegionFilter(parsedValue));\n    }, [ onChange, setRegionId ]);\n\n    const [ searchInputValue, setSearchInputValue ] = useState('');\n    const resetSearchInputValue = useCallback(() => setSearchInputValue(''), []);\n\n    const value = String(filter.region || RegionIdEnum.MSK_AND_MSK_OBL);\n\n    const title = useMemo(\n        () => getSelectedOptionLabel(value, options),\n        [ value, options ]\n    );\n\n    let currentOptions = options;\n\n    if (searchInputValue) {\n        currentOptions = getFilteredFlatRegionSelectOptions(searchInputValue, options);\n    }\n\n    const linearOptionsList = getFilteredFlatRegionSelectOptions(searchInputValue, options);\n    const prepared = linearOptionsList.map(option => ({ value: option.value, text: option.label }));\n\n    const { handleChange: handleSelectChange, is, selectedText } = useSelect(\n        handleChange,\n        { selected: value, texts: prepared }\n    );\n\n    const [ filterValue, setFilterValue ] = React.useState('');\n    const updateFilterValue = React.useCallback((v: string) => {\n        setFilterValue(v);\n    }, []);\n    const filterValueNormalized = filterValue.toLowerCase().replace('ё', 'е');\n\n    const filtered = linearOptionsList.filter(option => ! filterValueNormalized ||\n        option.label.toLowerCase().replace('ё', 'е').includes(filterValueNormalized)\n    );\n\n    if (isDesktop && ! native) {\n        return (\n            <Select\n                mode='single'\n                dataTest='region'\n                onChange={handleSelectChange}\n                onToggle={() => {\n                    resetSearchInputValue();\n                }}\n            >\n                <Select.Button size='s'>{selectedText}</Select.Button>\n                <Select.Content placement='local' height={400}>\n                    <Select.Search value={filterValue} onChange={updateFilterValue} />\n                    {filtered.map((option, index, all) => (\n                        <Select.Option\n                            dataTest={`region-${option.value}`}\n                            disabled={option.disabled}\n                            key={option.value}\n                            value={option.value}\n                            selected={is(option.value)}\n                            divider={all[index + 1]?.isParent}\n                        >\n                            {option.isParent ? <b>{option.label}</b> : option.label}\n                        </Select.Option>\n                    ))}\n                </Select.Content>\n            </Select>\n        );\n    }\n\n    return (\n        <MobileFilter className={cn()}>\n            <div className='container'>\n                <div className='col-xs-12'>\n                    <Select\n                        mode='single'\n                        dataTest='region'\n                        onChange={handleSelectChange}\n                        onToggle={() => {\n                            resetSearchInputValue();\n                        }}\n                    >\n                        <Select.Button size='s'>{title}</Select.Button>\n                        <Select.Content\n                            adaptiveHeight={true}\n                            adaptivePlacement={false}\n                            placement='local'\n                        >\n                            <RenderRegionSelectUikitContent\n                                is={is}\n                                searchInputValue={searchInputValue}\n                                setSearchInputValue={setSearchInputValue}\n                                showInput={options.length >= MIN_OPTIONS_NUMBER_WITH_INPUT}\n                                options={currentOptions}\n                                isMobile={! onMap}\n                            />\n                        </Select.Content>\n                    </Select>\n                </div>\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Rooms } from '@search/filter-enums/enums';\n\nimport { RoomFilter } from '../../../../../filters/models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileRoomFilterViewProps {\n    filter: RoomFilter;\n    handleChange: (filter: RoomFilter) => void;\n}\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: Rooms.STUDIO,\n    label: 'Студия',\n    className: 'col-xs-6 filter-item-gap'\n},\n{\n    value: Rooms.ROOM_1,\n    label: '1',\n    className: 'col-xs-3 filter-item-gap'\n},\n{\n    value: Rooms.ROOM_2,\n    label: '2',\n    className: 'col-xs-3 filter-item-gap'\n},\n{\n    value: Rooms.ROOM_3,\n    label: '3',\n    className: 'col-xs-3 filter-item-gap'\n},\n{\n    value: Rooms.ROOM_4,\n    label: '4',\n    className: 'col-xs-3 filter-item-gap'\n},\n{\n    value: Rooms.ROOM_5_AND_MORE,\n    label: '5 и более',\n    className: 'col-xs-6 filter-item-gap'\n},\n{\n    value: Rooms.OPEN_PLAN,\n    label: 'Свободная планировка',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileRoomFilterView: React.FC<IMobileRoomFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new RoomFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Количество комнат'\n        >\n            <MultiSelect\n                name='rooms'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.rooms}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Safety } from '@search/filter-enums/enums';\nimport { SafetyFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\nconst selectOptions: MultiSelectOption[] = [\n    {\n        value: Safety.GUARDED_AREA,\n        label: 'Охрана',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: Safety.CONCIERGE,\n        label: 'Консьерж',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: Safety.CLOSED_AREA,\n        label: 'Закр. территория',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\ninterface IProps {\n    filter: SafetyFilter;\n    handleChange: (filter: SafetyFilter) => void;\n}\n\nexport const MobileSafetyFilterView: React.FC<IProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new SafetyFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Безопасность'\n        >\n            <MultiSelect\n                name='safety'\n                className='container container__clamp'\n                options={selectOptions}\n                value={filter.safety}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n\n","import React, { useCallback } from 'react';\n\nimport { FlatsSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { FlatsSpecialEventsFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect } from '../../common/MultiSelect';\nimport type { MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileFlatsSpecialEventsFilterViewProps {\n    filter: FlatsSpecialEventsFilter;\n    onChange: (value: FlatsSpecialEventsFilter) => void;\n}\n\nconst SELECT_OPTIONS: MultiSelectOption<FlatsSpecialEvent>[] = [\n    {\n        value: FlatsSpecialEvent.FLAT_DISCOUNT,\n        label: 'Скидка',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: FlatsSpecialEvent.FLAT_INSTALLMENT_PLAN,\n        label: 'Рассрочка',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: FlatsSpecialEvent.FLAT_SALES_START,\n        label: 'Старт продаж',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\nexport const MobileFlatsSpecialEventsFilterView: React.FC<IMobileFlatsSpecialEventsFilterViewProps> = ({\n    filter,\n    onChange\n}) => {\n    const handleChange = useCallback(value => {\n        onChange(new FlatsSpecialEventsFilter(value));\n    }, [ onChange ]);\n\n    return (\n        <MobileFilter filterTitle='Квартиры'>\n            <MultiSelect\n                name='flatsSpecialEvents'\n                options={SELECT_OPTIONS}\n                value={filter.value}\n                handleChange={handleChange}\n                className='container container__clamp'\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { MiscSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { MiscSpecialEventsFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect } from '../../common/MultiSelect';\nimport type { MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileMiscSpecialEventsFilterViewProps {\n    filter: MiscSpecialEventsFilter;\n    onChange: (value: MiscSpecialEventsFilter) => void;\n}\n\nconst SELECT_OPTIONS: MultiSelectOption<MiscSpecialEvent>[] = [\n    {\n        value: MiscSpecialEvent.PROMO,\n        label: 'Акция',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: MiscSpecialEvent.GIFT,\n        label: 'Подарок',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\nexport const MobileMiscSpecialEventsFilterView: React.FC<IMobileMiscSpecialEventsFilterViewProps> = ({\n    filter,\n    onChange\n}) => {\n    const handleChange = useCallback(value => {\n        onChange(new MiscSpecialEventsFilter(value));\n    }, [ onChange ]);\n\n    return (\n        <MobileFilter filterTitle='Другое'>\n            <MultiSelect\n                name='miscSpecialEvents'\n                options={SELECT_OPTIONS}\n                value={filter.value}\n                handleChange={handleChange}\n                className='container container__clamp'\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { OtherSpecialEvent } from '@search/filter-enums/enums/SpecialEvents';\n\nimport { OtherSpecialEventsFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport { MultiSelect } from '../../common/MultiSelect';\nimport type { MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileOtherSpecialEventsFilterViewProps {\n    filter: OtherSpecialEventsFilter;\n    onChange: (value: OtherSpecialEventsFilter) => void;\n}\n\nconst SELECT_OPTIONS: MultiSelectOption<OtherSpecialEvent>[] = [\n    {\n        value: OtherSpecialEvent.OTHER_DISCOUNT,\n        label: 'Скидка',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: OtherSpecialEvent.OTHER_INSTALLMENT_PLAN,\n        label: 'Рассрочка',\n        className: 'col-xs-12 filter-item-gap'\n    },\n    {\n        value: OtherSpecialEvent.OTHER_SALES_START,\n        label: 'Старт продаж',\n        className: 'col-xs-12 filter-item-gap'\n    }\n];\n\nexport const MobileOtherSpecialEventsFilterView: React.FC<IMobileOtherSpecialEventsFilterViewProps> = ({\n    filter,\n    onChange\n}) => {\n    const handleChange = useCallback(value => {\n        onChange(new OtherSpecialEventsFilter(value));\n    }, [ onChange ]);\n\n    return (\n        <MobileFilter filterTitle='Паркинг, кладовки'>\n            <MultiSelect\n                name='otherSpecialEvents'\n                options={SELECT_OPTIONS}\n                value={filter.value}\n                handleChange={handleChange}\n                className='container container__clamp'\n            />\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\n\nimport { Size } from '@vtblife/uikit/legacy';\nimport { AreaFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { NumberInputRange } from '../../../common/NewNumberInputRange/NumberInputRange';\n\ninterface IMobileTotalAreaFilterViewProps {\n    filter: AreaFilter;\n    handleChange: (filter: AreaFilter) => void;\n}\n\nexport const MobileTotalAreaFilterView: React.FC<IMobileTotalAreaFilterViewProps> = ({\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new AreaFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Площадь'\n        >\n            <div className='container'>\n                <div className={'col-xs-12'}>\n                    <NumberInputRange\n                        size={Size.Small}\n                        unit='м²'\n                        value={filter.value}\n                        onChange={onChange}\n                        max={100_000}\n                        nameFrom='areaFrom'\n                        nameTo='areaTo'\n                    />\n                </div>\n            </div>\n        </MobileFilter>\n    );\n};\n","import React, { useCallback } from 'react';\nimport { Select, useSelect } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\nimport { TimeLimit, TransportType } from '@search/filter-enums/enums';\n\nimport { TransportLimitFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\n\nimport '../MobileCommon.css';\nimport './styles.css';\n\ninterface IMobileTransportLimitFilterViewProps {\n    filter: TransportLimitFilter;\n    onChange: (filter: TransportLimitFilter) => void;\n    isMobile?: boolean;\n    isTitle?: boolean;\n    containerClass?: string;\n}\n\nconst cn = classname.bind(null, 'MobileTransportLimitFilterView');\n\nconst transportTypeOptions = [\n    {\n        value: TransportType.UNKNOWN,\n        label: 'Неважно'\n    },\n    {\n        value: TransportType.FOOT,\n        label: 'Пешком'\n    }, {\n        value: TransportType.PUBLIC_TRANSPORT,\n        label: 'На транспорте'\n    }\n];\n\nconst timeLimitOptions = [\n    {\n        value: TimeLimit.MAX_5_MINUTES,\n        label: '5 мин.'\n    },\n    {\n        value: TimeLimit.MAX_10_MINUTES,\n        label: '10 мин.'\n    },\n    {\n        value: TimeLimit.MAX_15_MINUTES,\n        label: '15 мин.'\n    },\n    {\n        value: TimeLimit.MAX_20_MINUTES,\n        label: '20 мин.'\n    },\n    {\n        value: TimeLimit.MAX_30_MINUTES,\n        label: '30 мин.'\n    },\n    {\n        value: TimeLimit.MAX_40_MINUTES,\n        label: '40 мин.'\n    },\n    {\n        value: TimeLimit.MAX_50_MINUTES,\n        label: '50 мин.'\n    },\n    {\n        value: TimeLimit.MAX_60_MINUTES,\n        label: '1 ч.'\n    }\n];\n\nexport const MobileTransportLimitFilterView: React.FC<IMobileTransportLimitFilterViewProps> = ({\n    filter,\n    onChange,\n    isTitle,\n    isMobile,\n    containerClass\n}) => {\n    const transportSelectChange = useCallback((value: TransportType) => {\n        let timeLimit = filter.timeLimit;\n\n        if (value === TransportType.UNKNOWN) timeLimit = TimeLimit.UNKNOWN;\n        else if (timeLimit === TimeLimit.UNKNOWN) timeLimit = TimeLimit.MAX_20_MINUTES;\n\n        onChange(new TransportLimitFilter(\n            timeLimit,\n            value\n        ));\n    }, [ filter.timeLimit, onChange ]);\n\n    const transportSelectOptions = transportTypeOptions.map(option => ({ value: option.value, text: option.label }));\n\n    const transportSelect = useSelect(\n        transportSelectChange,\n        {\n            selected: filter.transportType,\n            texts: transportSelectOptions\n        }\n    );\n\n    const timeLimitSelectChange = useCallback((value: TimeLimit) => {\n        const transportType = filter.transportType;\n\n        if (transportType === TransportType.UNKNOWN) return;\n\n        onChange(new TransportLimitFilter(\n            value,\n            transportType\n        ));\n    }, [ filter.transportType, onChange ]);\n\n    const timeLimitSelectOptions = timeLimitOptions.map(option => ({\n        value: option.value,\n        text: option.label\n    }));\n\n    const timeLimitSelect = useSelect(\n        timeLimitSelectChange,\n        { selected: filter.timeLimit, texts: timeLimitSelectOptions }\n    );\n\n    return (<MobileFilter\n        filterTitle={isTitle ? 'Время до метро' : undefined}\n        className={cn('container', undefined, containerClass)}\n    >\n        <Select native={isMobile} mode='single' onChange={transportSelect.handleChange}>\n            <Select.Button size='s' dataTest='transportType-trigger'>{transportSelect.selectedText}</Select.Button>\n            <Select.Content>\n                {transportSelectOptions.map(option => (\n                    <Select.Option\n                        dataTest={`transportType-${option.value}`}\n                        key={option.value}\n                        value={option.value}\n                        selected={transportSelect.is(option.value)}\n                    >\n                        {option.text}\n                    </Select.Option>\n                ))}\n            </Select.Content>\n        </Select>\n        <Select native={isMobile} mode='single' onChange={timeLimitSelect.handleChange}>\n            <Select.Button\n                dataTest='timeLimit-trigger'\n                disabled={filter.transportType === TransportType.UNKNOWN}\n                size='s'\n            >{timeLimitSelect.selectedText}</Select.Button>\n            <Select.Content>\n                {timeLimitSelectOptions.map(option => (\n                    <Select.Option\n                        key={option.value}\n                        dataTest={`timeLimit-${option.value}`}\n                        value={option.value}\n                        selected={timeLimitSelect.is(option.value)}\n                    >\n                        {option.text}\n                    </Select.Option>\n                ))}\n            </Select.Content>\n        </Select>\n    </MobileFilter>);\n};\n","import React, { useCallback } from 'react';\nimport { WallsType } from '@search/filter-enums/enums';\nimport { WallsTypeFilter } from '../../../../models/Filter';\nimport MobileFilter from '../../../filter/MobileFilter';\nimport '../MobileCommon.css';\nimport { MultiSelect, MultiSelectOption } from '../../common/MultiSelect';\n\ninterface IMobileWallsFilterViewProps {\n    withWood?: boolean;\n    filter: WallsTypeFilter;\n    handleChange: (filter: WallsTypeFilter) => void;\n}\n\nconst selectOptions: MultiSelectOption[] = [ {\n    value: WallsType.MONOLITH,\n    label: 'Монолит',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: WallsType.PANEL,\n    label: 'Панель',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: WallsType.BRICK,\n    label: 'Кирпич',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: WallsType.BRICK_MONOLITH,\n    label: 'Кирпич-монолит',\n    className: 'col-xs-12 filter-item-gap'\n}, {\n    value: WallsType.BLOCK,\n    label: 'Блок',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nconst selectOptionsWithWood: MultiSelectOption[] = [ ...selectOptions, {\n    value: WallsType.WOOD,\n    label: 'Дерево',\n    className: 'col-xs-12 filter-item-gap'\n} ];\n\nexport const MobileWallsFilterView: React.FC<IMobileWallsFilterViewProps> = ({\n    withWood = true,\n    filter,\n    handleChange\n}) => {\n    const onChange = useCallback(value => {\n        handleChange(new WallsTypeFilter(value));\n    }, [ handleChange ]);\n\n    return (\n        <MobileFilter\n            filterTitle='Материал стен'\n        >\n            <MultiSelect\n                name='walls'\n                className='container container__clamp'\n                options={withWood ? selectOptionsWithWood : selectOptions}\n                value={filter.walls}\n                handleChange={onChange}\n            />\n        </MobileFilter>\n    );\n};\n","import React, { Dispatch, SetStateAction, useCallback } from 'react';\nimport { Select, Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport './RenderRegionSelectUikitContent.css';\n\nexport const MIN_OPTIONS_NUMBER_WITH_INPUT = 10;\n\nfunction isGroupedOption<Option extends OptionType>(\n    option: SelectOption<Option>,\n) {\n    return option.options !== undefined;\n}\n\ntype OptionType<Value extends string | number = string> = {\n    options?: undefined;\n    value: Value;\n    label: string;\n    disabled?: boolean;\n    index?: number;\n}\n\nexport interface OptionTypeRegionFilter extends OptionType<string> {\n    fullName: string;\n    isParent?: boolean;\n}\n\ntype SelectOption<Option extends OptionType> = GroupedOptions<Option> | Option;\n\nexport type GroupedOptions<Option extends OptionType> = {\n    label?: string;\n    options: Option[];\n};\n\nconst cn = classname.bind(null, 'RegionSelectUikitContent');\n\nconst FlatOptionList = ({ options, isBoldParentOption, is, lastIndex }: {\n    options: OptionTypeRegionFilter[];\n    isBoldParentOption?: boolean;\n    is: (check: string) => boolean;\n    lastIndex?: number;\n}) => (\n    <Select.Group>\n        {options.map((option, i) => {\n            return (\n                <Select.Option\n                    value={option.value}\n                    key={`${option.value}`}\n                    selected={is(option.value)}\n                >\n                    {\n                        ! isGroupedOption(option) && option.isParent && isBoldParentOption ?\n                            <b>{option.label}</b> :\n                            <>{option.label}</>\n                    }\n                </Select.Option>\n            );\n        })}\n    </Select.Group>\n);\n\nconst FilteredOptionList = ({\n    options,\n    emptyText = 'Нет похожих регионов с новостройками',\n    is,\n}: {\n    emptyText?: React.ReactNode;\n    options: OptionTypeRegionFilter[];\n    is: (check: string) => boolean;\n}) => (\n    options.length ? (\n        <FlatOptionList is={is} options={options} />\n    ) : (\n        <Typography\n            color='minor'\n            className={cn('not-found')}\n        >\n            {emptyText}\n        </Typography>\n    )\n);\n\nconst GroupedOptionList = ({ options, is }: {\n    options: GroupedOptions<OptionTypeRegionFilter>[];\n    is: (check: string) => boolean;\n}) => (\n    <>\n        {options.map((option, index) => (\n            <FlatOptionList\n                key={index}\n                is={is}\n                options={option.options}\n                isBoldParentOption\n                lastIndex={option.options.length - 1}\n            />\n        ))}\n    </>\n);\n\ninterface IRenderRegionSelectCustomMenu {\n    options: SelectOption<OptionTypeRegionFilter>[];\n    is: (check: string) => boolean;\n\n    searchInputValue: string;\n    setSearchInputValue: Dispatch<SetStateAction<string>>;\n    isMobile?: boolean;\n    isNative?: boolean;\n    showInput?: boolean;\n    emptyText?: React.ReactNode;\n}\n\nexport const RenderRegionSelectUikitContent: React.FC<IRenderRegionSelectCustomMenu> = ({\n    options,\n    is,\n    searchInputValue,\n    setSearchInputValue,\n    isMobile,\n    isNative,\n    showInput,\n    emptyText,\n}: IRenderRegionSelectCustomMenu) => {\n    if (isNative) {\n        return (\n            <GroupedOptionList\n                options={options as GroupedOptions<OptionTypeRegionFilter>[]}\n                is={is}\n            />\n        );\n    }\n\n    return (\n        <div className={cn(null, { full: isMobile })}>\n            {showInput && (\n                <Select.Search\n                    placeholder='Введите регион'\n                    size='s'\n                    name='region'\n                    value={searchInputValue}\n                    onChange={setSearchInputValue}\n                />\n            )}\n            <>\n                {options.length && isGroupedOption(options[0]) ? (\n                    <GroupedOptionList\n                        options={options as GroupedOptions<OptionTypeRegionFilter>[]}\n                        is={is}\n                    />\n                ) : (\n                    <FilteredOptionList\n                        options={options as OptionTypeRegionFilter[]}\n                        emptyText={emptyText}\n                        is={is}\n                    />\n                )}\n            </>\n        </div>\n    );\n};\n\n","import './Filter2.css';\n\nimport React from 'react';\nimport { Typography } from '@vtblife/uikit';\nimport classname from '@search/classname/src';\n\nconst cn = classname.bind(null, 'Filter2');\n\nexport interface IFilterAvailableProps {\n    withoutTitle?: boolean;\n}\n\ninterface IProps {\n    className?: string;\n    filterTitle?: string;\n}\n\nexport const Filter2: React.FC<IProps> = ({ className, filterTitle, children }) => (\n    filterTitle ? (\n        <div className={className}>\n            {filterTitle ? (\n                <Typography\n                    variant='secondary-alone'\n                    color='secondary'\n                    className={cn('filter-title')}\n                >\n                    {filterTitle}\n                </Typography>\n            ) : null}\n            <div>\n                {children}\n            </div>\n        </div>\n    ) : <>{children}</>\n);\n","import sortBy from 'lodash/sortBy';\n\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport type { District } from '../../../domain/geo/District';\n\nexport type DistrictGroup = {\n    id?: number;\n    title: string;\n    items: ({\n        id: number;\n        title: string;\n        isIntracity?: boolean;\n    })[];\n}\n\ntype GroupMskDistrictsParams = {\n    districts?: District[];\n    regionId: RegionIdEnum;\n}\n\nconst prepareTitle = (title: string) => {\n    return title.replace(/(район|округ|городской|административный|посёлок)/g, '');\n};\n\nconst splitListByParentId = (list: District[] | undefined, parentId: number) => {\n    const ret: [ DistrictGroup['items'], DistrictGroup['items'] ] = [ [], [] ];\n\n    list?.forEach(item => {\n        ret[item.narrowRegionId === parentId ? 0 : 1].push(item);\n    });\n\n    return ret;\n};\n\nconst sortDistricts = (districts: DistrictGroup['items']): DistrictGroup['items'] => {\n    return districts.sort((a, b) => {\n        const titleA = a.title.trim();\n        const titleB = b.title.trim();\n\n        // if (titleA === titleB) return 0;\n\n        return titleA > titleB ? 1 : -1;\n    });\n};\n\nconst prepareList = (list?: DistrictGroup['items']): DistrictGroup['items'] => {\n    const ret: DistrictGroup['items'] = [];\n\n    list?.forEach(item => {\n        ret.push({\n            id: item.id,\n            isIntracity: item.isIntracity ?? false,\n            title: prepareTitle(item.title)\n        });\n    });\n\n    return sortDistricts(ret);\n};\n\nconst groupMskDistricts = ({ districts, regionId }: GroupMskDistrictsParams): DistrictGroup[] => {\n    const districtsMap = new Map<number | string, DistrictGroup>();\n\n    districts?.forEach(district => {\n        if (district.parentId === RegionIdEnum.MSK) {\n            let districtGroup = districtsMap.get(district.id);\n\n            if (! districtGroup) {\n                districtGroup = {\n                    id: district.id,\n                    title: district.title,\n                    items: []\n                };\n\n                districtsMap.set(district.id, districtGroup);\n            }\n        }\n    });\n\n    if (regionId === RegionIdEnum.MSK_AND_MSK_OBL) {\n        const mskOblGroup = {\n            title: 'Районы Московской области',\n            items: []\n        };\n\n        districtsMap.set('mskObl', mskOblGroup);\n    }\n\n    districts?.forEach(district => {\n        if (district.parentId === RegionIdEnum.MSK_OBL) {\n            const districtGroup = districtsMap.get('mskObl');\n\n            districtGroup?.items.push({\n                id: district.id,\n                title: prepareTitle(district.title)\n            });\n        }\n\n        if (district.parentId !== RegionIdEnum.MSK && district.parentId !== RegionIdEnum.MSK_OBL) {\n            const districtGroup = districtsMap.get(district.parentId);\n\n            districtGroup?.items.push({\n                id: district.id,\n                title: prepareTitle(district.title)\n            });\n        }\n    });\n\n    return sortBy(Array.from(districtsMap.values()), o => {\n        const sortedNestedDistricts = { ...o, items: sortDistricts(o.items) };\n\n        return sortedNestedDistricts.title === 'Районы Московской области' ? false : sortedNestedDistricts.title;\n    });\n};\n\nexport const groupDistricts = ({ districts, regionId }: GroupMskDistrictsParams): DistrictGroup[] => {\n    if ((districts?.length ?? 0) <= 0) return [];\n\n    switch (regionId) {\n        case RegionIdEnum.MSK_AND_MSK_OBL: {\n            return groupMskDistricts({ districts, regionId });\n        }\n\n        case RegionIdEnum.MSK_OBL: {\n            return [\n                {\n                    title: 'Районы Московской области',\n                    items: prepareList(districts)\n                }\n            ];\n        }\n\n        case RegionIdEnum.MSK: {\n            return groupMskDistricts({ districts, regionId });\n        }\n\n        case RegionIdEnum.SPB_AND_LEN_OBL: {\n            const splited = splitListByParentId(districts, 444);\n\n            return [\n                {\n                    title: 'Районы Санкт-Петербурга',\n                    items: prepareList(splited[0])\n                },\n                {\n                    title: 'Районы Ленинградской области',\n                    items: prepareList(splited[1])\n                }\n            ];\n        }\n\n        case RegionIdEnum.LEN_OBL: {\n            return [\n                {\n                    title: 'Районы Ленинградской области',\n                    items: prepareList(districts)\n                }\n            ];\n        }\n\n        case RegionIdEnum.SPB: {\n            return [\n                {\n                    title: 'Районы Санкт-Петербурга',\n                    items: prepareList(districts)\n                }\n            ];\n        }\n\n        default:\n            return [\n                {\n                    title: 'Районы',\n                    items: prepareList(districts)\n                }\n            ];\n    }\n};\n\nexport const getDistrictCount = (districtIds: Array<number>, groups: Array<DistrictGroup>) => (\n    districtIds.reduce((count, districtId) => (\n        count + (groups.find(group => group.id === districtId)?.items.length ?? 1)\n    ), 0)\n);\n","import { PredefinedPrice } from '../types/PredefinedPrice';\n\nexport const sellFlatPricesPerAllSquareMsk: PredefinedPrice[] = [ {\n    from: 1000000,\n    to: 2500000\n}, {\n    from: 2500000,\n    to: 3000000\n}, {\n    from: 3000000,\n    to: 4000000\n}, {\n    from: 4000000,\n    to: 5000000\n}, {\n    from: 5000000,\n    to: 8000000\n}, {\n    from: 8000000,\n    to: 10000000\n}, {\n    from: 10000000,\n    to: 15000000\n}, {\n    from: 15000000,\n    to: 20000000\n}, {\n    from: 20000000,\n    to: 50000000\n}, {\n    from: 50000000,\n    to: 100000000\n} ];\n\nexport const sellFlatPricesPerAllSquareSpb: PredefinedPrice[] = [ {\n    from: 1000000,\n    to: 2000000\n}, {\n    from: 2000000,\n    to: 3000000\n}, {\n    from: 3000000,\n    to: 4000000\n}, {\n    from: 4000000,\n    to: 5000000\n}, {\n    from: 5000000,\n    to: 6000000\n}, {\n    from: 6000000,\n    to: 8000000\n}, {\n    from: 8000000,\n    to: 10000000\n}, {\n    from: 10000000,\n    to: 15000000\n}, {\n    from: 15000000,\n    to: 30000000\n}, {\n    from: 30000000,\n    to: 50000000\n} ];\n\nexport const sellFlatPricesPerAllSquare: PredefinedPrice[] = [ {\n    from: 1000000,\n    to: 5000000\n}, {\n    from: 2000000,\n    to: 7500000\n}, {\n    from: 3000000,\n    to: 10000000\n}, {\n    from: 4000000,\n    to: 15000000\n}, {\n    from: 5000000,\n    to: 20000000\n}, {\n    from: 10000000,\n    to: 30000000\n}, {\n    from: 15000000,\n    to: 40000000\n}, {\n    from: 20000000,\n    to: 50000000\n}, {\n    from: 30000000,\n    to: 75000000\n}, {\n    from: 50000000,\n    to: 100000000\n} ];\n\nexport const sellFlatPricesPerMeterMskMo: PredefinedPrice[] = [ {\n    from: 30000,\n    to: 50000\n}, {\n    from: 50000,\n    to: 75000\n}, {\n    from: 75000,\n    to: 100000\n}, {\n    from: 100000,\n    to: 150000\n}, {\n    from: 150000,\n    to: 200000\n}, {\n    from: 200000,\n    to: 250000\n}, {\n    from: 250000,\n    to: 300000\n}, {\n    from: 300000,\n    to: 400000\n}, {\n    from: 400000,\n    to: 500000\n}, {\n    from: 500000,\n    to: 800000\n} ];\n\nexport const sellFlatPricesPerMeterSpbLo: PredefinedPrice[] = [ {\n    from: 20000,\n    to: 40000\n}, {\n    from: 40000,\n    to: 60000\n}, {\n    from: 60000,\n    to: 80000\n}, {\n    from: 80000,\n    to: 100000\n}, {\n    from: 100000,\n    to: 120000\n}, {\n    from: 120000,\n    to: 150000\n}, {\n    from: 150000,\n    to: 200000\n}, {\n    from: 200000,\n    to: 250000\n}, {\n    from: 250000,\n    to: 350000\n}, {\n    from: 350000,\n    to: 500000\n} ];\n\nexport const rentFlatPricesMsk: PredefinedPrice[] = [ {\n    from: 10000,\n    to: 15000\n}, {\n    from: 15000,\n    to: 20000\n}, {\n    from: 20000,\n    to: 25000\n}, {\n    from: 25000,\n    to: 30000\n}, {\n    from: 30000,\n    to: 40000\n}, {\n    from: 40000,\n    to: 50000\n}, {\n    from: 50000,\n    to: 60000\n}, {\n    from: 60000,\n    to: 80000\n}, {\n    from: 80000,\n    to: 100000\n}, {\n    from: 100000,\n    to: 150000\n} ];\n\nexport const rentFlatPricesSpb: PredefinedPrice[] = [ {\n    from: 10000,\n    to: 15000\n}, {\n    from: 15000,\n    to: 20000\n}, {\n    from: 20000,\n    to: 25000\n}, {\n    from: 25000,\n    to: 30000\n}, {\n    from: 30000,\n    to: 35000\n}, {\n    from: 35000,\n    to: 40000\n}, {\n    from: 40000,\n    to: 50000\n}, {\n    from: 50000,\n    to: 60000\n}, {\n    from: 60000,\n    to: 80000\n}, {\n    from: 80000,\n    to: 120000\n} ];\n\nexport const rentFlatPrices: PredefinedPrice[] = [ {\n    from: 10000,\n    to: 30000\n}, {\n    from: 15000,\n    to: 35000\n}, {\n    from: 20000,\n    to: 40000\n}, {\n    from: 25000,\n    to: 45000\n}, {\n    from: 30000,\n    to: 50000\n}, {\n    from: 35000,\n    to: 60000\n}, {\n    from: 40000,\n    to: 70000\n}, {\n    from: 45000,\n    to: 80000\n}, {\n    from: 50000,\n    to: 90000\n}, {\n    from: 55000,\n    to: 100000\n} ];\n\nexport const mortgagePaymentMskAndSpb = [ 35000, 50000, 70000, 90000, 120000, 150000 ];\n\nexport const mortgagePaymentRegions = [ 25000, 35000, 50000, 70000, 90000, 120000, 150000 ];\n\n/**\n * Вычисляет стоимость объекта по ежемесячному платежу и годовой ставке\n * Формула для вычисления: s = p * (x/y), где x = (1+r)^n - 1, y = r * (1+r)^n\n * p - ежемесячный платеж, r - ежемесячная процентная ставка, n - срок кредита в месяцах (по умолчанию 360 = 30 лет)\n * @param {number} [p] ежемесячный платеж\n * @returns {number}\n */\nexport const priceByMortgagePayment = (p: number, rate: number = 10.5) => {\n    // процентная ставка в год\n    const r = rate / 12 / 100;\n    const n = 360;\n    const x = Math.pow(1 + r, n) - 1;\n    const y = r * Math.pow(1 + r, n);\n    const s = p * (x / y);\n    // Учтем первоначальный взнос 20%\n    const l = s / 0.8;\n\n    // Округлим до порядков десятков тысяч\n    return Math.trunc(l / 10000) * 10000;\n};\n\n/**\n * Вычисляет приблизительный платеж объекта по стоимости и годовой ставке\n * Формула для вычисления: p = s / (x/y), где x = (1+r)^n - 1, y = r * (1+r)^n\n * Просто разворот формулы выше\n * p - ежемесячный платеж, r - ежемесячная процентная ставка, n - срок кредита в месяцах (по умолчанию 360 = 30 лет)\n * @param {number} [s] стоимость объекта\n * @returns {number}\n */\nexport const mortgagePaymentByPrice = (s: number, rate: number = 10.5) => {\n    const r = rate / 12 / 100;\n    const n = 360;\n    const x = Math.pow(1 + r, n) - 1;\n    const y = r * Math.pow(1 + r, n);\n\n    // Учтем первоначальный взнос 20%\n    return Math.trunc((s * 0.8) / (x / y));\n};\n","import { GroupedOptions, isGroupedOption } from '@vtblife/uikit/legacy';\nimport type { OptionTypeRegionFilter } from '../../filters/components/filter_types/region/RenderRegionSelectUikitContent';\n\nconst filterFlatOptionsBySubstr = (options: OptionTypeRegionFilter[], substr: string): OptionTypeRegionFilter[] => {\n    const needle = substr.toLowerCase().replace('ё', 'е');\n\n    return options.filter(\n        ({ fullName }) => fullName.toLowerCase().replace('ё', 'е').indexOf(needle) + 1\n    );\n};\n\nexport function getFlatOptions(\n    options: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[]\n): OptionTypeRegionFilter[] {\n    if (options.length && isGroupedOption(options[0])) {\n        return (options as GroupedOptions<OptionTypeRegionFilter>[]).reduce(\n            (res: OptionTypeRegionFilter[], option) => [ ...res, ...option.options ],\n            []\n        );\n    }\n\n    return options as OptionTypeRegionFilter[];\n}\n\nexport function getFilteredFlatRegionSelectOptions(\n    searchInputValue: string | undefined,\n    options: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[]\n): OptionTypeRegionFilter[] {\n    const flatOptions = getFlatOptions(options);\n\n    return searchInputValue ? filterFlatOptionsBySubstr(flatOptions, searchInputValue) : flatOptions;\n}\n\nexport function getSelectedOptionLabel(\n    value: string,\n    options: OptionTypeRegionFilter[] | GroupedOptions<OptionTypeRegionFilter>[]\n): string {\n    const flatOptions = getFlatOptions(options);\n\n    return flatOptions.find(option => option.value === value)?.label || '';\n}\n","import {\n    WindowsDirectionSearchOffersEnum,\n    FinishingTypeEnum\n} from '@search/graphql-typings';\nimport { YMapBounds } from '@search/ymap/src/bounds';\nimport { YMapVector } from '@search/ymap/src/Vector';\nimport {\n    Accreditation,\n    AreaUnit,\n    AuthorTypeOptionsWithRealtor,\n    BalconyOptions,\n    BankPledgeOptions,\n    Bathroom,\n    BathroomLocationOptions,\n    BuildingClass,\n    CeilingHeight,\n    Commissioning,\n    CommissionType,\n    DealType,\n    DepositType,\n    ElectricityOptions,\n    FloorConstraints,\n    FurnitureOption,\n    GasOptions,\n    HeatingOptions,\n    HouseCategory,\n    InfrastructureOptions,\n    IsApartmentsOptions,\n    LandStatus,\n    LayoutImageOptions,\n    LiftOptions,\n    LivingFacilitiesOption,\n    LivingTenantOption,\n    NearbyOptions,\n    NewBuilding,\n    NewBuildingDeal,\n    ParkingType,\n    PaymentType,\n    PhotoOptions,\n    Position,\n    PrepaymentType,\n    RealtyObjectType,\n    Renovation,\n    RenovationProgram,\n    Rooms,\n    RoomsOfferedOptions,\n    Safety,\n    SellType,\n    SewerageOptions,\n    TimeLimit,\n    TransportType,\n    WallsType,\n    WaterOptions,\n    FlatsSpecialEvent,\n    OtherSpecialEvent,\n    MiscSpecialEvent,\n    BuildEpoch,\n    OnlineView,\n    FinishingTypeOption\n} from '@search/filter-enums/enums';\nimport { RegionIdEnum } from '@search/filter-enums/enums/Region';\n\nimport type { INumberRange } from '../types/IRange';\nimport type { IFinishing, FinishingParams, FinishingBuilding, FinishingBuildingParams } from '../types/IFinishing';\n\nexport enum Filters {\n    dealType = 'dealType',\n    categoryType = 'categoryType',\n    rooms = 'rooms',\n    newBuilding = 'newBuilding',\n    price = 'price',\n    region = 'region',\n    totalArea = 'totalArea',\n    livingArea = 'livingArea',\n    kitchenArea = 'kitchenArea',\n    floor = 'floor',\n    floorsTotal = 'floorsTotal',\n    builtYear = 'builtYear',\n    cellHeight = 'cellHeight',\n    renovation = 'renovation',\n    bathroom = 'bathroom',\n    transportLimit = 'transportLimit',\n    windowsDirection = 'windowsDirection',\n    geo = 'geo',\n    livingFacility = 'livingFacility',\n    furniture = 'furniture',\n    livingTenantOptions = 'livingTenantOptions',\n    rentConditions = 'rentConditions',\n    rentPrepayment = 'rentPrepayment',\n    walls = 'walls',\n    parkings = 'parkings',\n    author = 'author',\n    userId = 'userId',\n    sellType = 'sellType',\n    infrastructure = 'infrastructure',\n    balcony = 'balcony',\n    photoOptions = 'photoOptions',\n    layoutImageOptions = 'layoutImageOptions',\n    apartments = 'apartments',\n    position = 'position',\n    commissioning = 'commissioning',\n    commissioningList = 'commissioningList',\n    finishingType = 'finishingType',\n    finishingFlat = 'finishingFlat',\n    safety = 'safety',\n    developer = 'developer',\n    buildingClass = 'buildingClass',\n    accreditation = 'accreditation',\n    newBuildingDeal = 'newBuildingDeal',\n    paymentType = 'paymentType',\n    roomsInOffer = 'roomsInOffer',\n    landStatus = 'landStatus',\n    landArea = 'landArea',\n    supplyOptions = 'supplyOptions',\n    houseCategory = 'houseCategory',\n    houseArea = 'houseArea',\n    bathroomLocation = 'bathroomLocation',\n    heating = 'heating',\n    mapBounds = 'mapBounds',\n    bankPledgeOptions = 'bankPledgeOptions',\n    seoMortgageAllowed = 'seoMortgageAllowed',\n    buildings = 'buildings',\n    closedSales = 'closedSales',\n    newBuildingData = 'newBuildingData',\n    selectedNewBuilding = 'selectedNewBuilding',\n    showHighlighted = 'showHighlighted',\n    flatsSpecialEvents = 'flatsSpecialEvents',\n    otherSpecialEvents = 'otherSpecialEvents',\n    miscSpecialEvents = 'miscSpecialEvents',\n    renovationProgram = 'renovationProgram',\n    nearbyOptions = 'nearbyOptions',\n    sellerOrganizationName = 'sellerOrganizationName',\n    buildEpoch = 'buildEpoch',\n    onlineView = 'onlineView',\n    notOnlyM2Pro = 'notOnlyM2Pro',\n    mortgagePayment = 'mortgagePayment',\n    hasLift = 'hasLift'\n}\n\n// FIXME Add correct Id generation, if there's will be two filter collections\nexport type FilterId = Filters\n\nexport abstract class IFilter {\n    abstract id: FilterId;\n    abstract isDefault(): boolean;\n    create(): IFilter {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        return new (this.constructor as any)();\n    }\n}\n\nexport class MapBoundsFilter extends IFilter {\n    id: FilterId = Filters.mapBounds;\n\n    constructor(\n        readonly bounds?: YMapBounds,\n        readonly polygon: readonly YMapVector[] = [],\n        readonly geohash?: string\n    ) {\n        super();\n        this.bounds = bounds;\n        this.polygon = polygon;\n        this.geohash = geohash;\n    }\n\n    isDefault() {\n        return this.bounds === undefined && this.polygon.length === 0 && this.geohash === undefined;\n    }\n\n    hasPolygon() {\n        return this.polygon.length !== 0;\n    }\n}\n\nexport class DealTypeFilter extends IFilter {\n    id: FilterId = Filters.dealType;\n    constructor(\n        readonly dealType: DealType = DealType.SELL\n    ) {\n        super();\n        this.dealType = dealType;\n    }\n    isDefault() {\n        return this.dealType === DealType.SELL;\n    }\n}\n\nexport class CategoryTypeFilter extends IFilter {\n    id: FilterId = Filters.categoryType;\n    constructor(\n        readonly categoryType: RealtyObjectType = RealtyObjectType.FLAT\n    ) {\n        super();\n        this.categoryType = categoryType;\n    }\n    isDefault(): boolean {\n        return RealtyObjectType.FLAT === this.categoryType;\n    }\n}\n\nexport class NewBuildingFilter extends IFilter {\n    id: FilterId;\n    newBuilding: NewBuilding[];\n    constructor(\n        newBuilding?: NewBuilding[]\n    ) {\n        super();\n        this.id = Filters.newBuilding;\n        this.newBuilding = ! newBuilding || newBuilding.length === 2 ? [] : newBuilding;\n    }\n    isDefault(): boolean {\n        return this.newBuilding.length === 0 || (this.newBuilding.length === 2 &&\n            this.newBuilding.includes(NewBuilding.NEW) &&\n            this.newBuilding.includes(NewBuilding.SECOND));\n    }\n}\n\nexport class RoomFilter extends IFilter {\n    id: FilterId;\n    rooms: readonly Rooms[];\n    constructor(rooms?: readonly Rooms[]) {\n        super();\n        this.id = Filters.rooms;\n        this.rooms = rooms || [ ];\n    }\n    isDefault(): boolean {\n        return this.rooms.length === 0;\n    }\n}\n\nexport class PriceFilter extends IFilter {\n    isDefault(): boolean {\n        const isDefaultValue = this.value.from === null && this.value.to === null;\n\n        return isDefaultValue;\n    }\n    id: FilterId;\n    priceType: AreaUnit;\n    value: INumberRange\n    constructor(priceType?: AreaUnit, value?: INumberRange) {\n        super();\n        this.id = Filters.price;\n        this.priceType = priceType || AreaUnit.UNKNOWN;\n        this.value = { from: value?.from || null, to: value?.to || null };\n    }\n}\n\nexport class RegionFilter extends IFilter {\n    id: FilterId = Filters.region;\n    region: RegionIdEnum;\n\n    constructor(region?: RegionIdEnum) {\n        super();\n        this.region = region !== undefined ? region : RegionIdEnum.MSK;\n    }\n\n    isDefault(): boolean {\n        return this.region === RegionIdEnum.MSK;\n    }\n}\n\nexport class AreaFilter extends IFilter {\n    isDefault(): boolean {\n        return this.value.from === null && this.value.to === null;\n    }\n    id: FilterId;\n    value: INumberRange;\n    constructor(value?: INumberRange) {\n        super();\n        this.id = Filters.totalArea;\n        this.value = value || { from: null, to: null };\n    }\n}\n\nexport class MortgagePaymentFilter extends IFilter {\n    id: FilterId = Filters.mortgagePayment;\n    payment: number | null;\n    isDefault(): boolean {\n        return this.payment === null;\n    }\n    constructor(payment?: number | null) {\n        super();\n        this.payment = payment ?? null;\n    }\n}\n\nexport class LivingAreaFilter extends IFilter {\n    isDefault(): boolean {\n        return this.value.from === null && this.value.to === null;\n    }\n    id: FilterId;\n    value: INumberRange;\n    constructor(value?: INumberRange) {\n        super();\n        this.id = Filters.livingArea;\n        this.value = value || { from: null, to: null };\n    }\n}\n\nexport class KitchenAreaFilter extends IFilter {\n    isDefault(): boolean {\n        return this.value.from === null && this.value.to === null;\n    }\n    id: FilterId;\n    value: INumberRange;\n    constructor(value?: INumberRange) {\n        super();\n        this.id = Filters.kitchenArea;\n        this.value = value || { from: null, to: null };\n    }\n}\n\nexport class YearBuildingFilter extends IFilter {\n    isDefault(): boolean {\n        return this.value.from === null && this.value.to === null;\n    }\n    id: FilterId;\n    value: INumberRange;\n    constructor(value?: INumberRange) {\n        super();\n        this.id = Filters.builtYear;\n        this.value = value || { from: null, to: null };\n    }\n}\n\nexport class FloorFilter extends IFilter {\n    isDefault(): boolean {\n        const isDefaultRange = this.range.from === null && this.range.to === null;\n        const isDefaultEdge =\n            this.last === FloorConstraints.UNKNOWN &&\n            this.first === FloorConstraints.UNKNOWN;\n\n        return isDefaultEdge && isDefaultRange;\n    }\n    id: FilterId;\n    range: INumberRange;\n    last: FloorConstraints;\n    first: FloorConstraints;\n    constructor(range?: INumberRange, first?: FloorConstraints, last?: FloorConstraints) {\n        super();\n        this.id = Filters.floor;\n        this.range = range || { from: null, to: null };\n        this.last = last || FloorConstraints.UNKNOWN;\n        this.first = first || FloorConstraints.UNKNOWN;\n    }\n}\n\nexport class CellHeightFilter extends IFilter {\n    isDefault(): boolean {\n        return this.value === CeilingHeight.UNKNOWN;\n    }\n    id: FilterId;\n    readonly value: CeilingHeight;\n    constructor(value?: CeilingHeight) {\n        super();\n        this.id = Filters.cellHeight;\n        this.value = value || CeilingHeight.UNKNOWN;\n    }\n}\n\nexport class FlatsSpecialEventsFilter extends IFilter {\n    id: FilterId = Filters.flatsSpecialEvents;\n    value: FlatsSpecialEvent[];\n\n    constructor(value?: FlatsSpecialEvent[]) {\n        super();\n        this.value = value || [];\n    }\n\n    isDefault() {\n        return this.value.length === 0;\n    }\n}\n\nexport class OtherSpecialEventsFilter extends IFilter {\n    id: FilterId = Filters.otherSpecialEvents;\n    value: OtherSpecialEvent[];\n\n    constructor(value?: OtherSpecialEvent[]) {\n        super();\n        this.value = value || [];\n    }\n\n    isDefault() {\n        return this.value.length === 0;\n    }\n}\n\nexport class MiscSpecialEventsFilter extends IFilter {\n    id: FilterId = Filters.miscSpecialEvents;\n    value: MiscSpecialEvent[];\n\n    constructor(value?: MiscSpecialEvent[]) {\n        super();\n        this.value = value || [];\n    }\n\n    isDefault() {\n        return this.value.length === 0;\n    }\n}\n\nexport class RenovationFilter extends IFilter {\n    isDefault(): boolean {\n        return this.value.length === 0;\n    }\n    id: FilterId;\n    value: Renovation[];\n    constructor(value?: Renovation[]) {\n        super();\n        this.id = Filters.renovation;\n        this.value = value || [];\n    }\n}\n\nexport class FinishingFilter extends IFilter {\n    id: FilterId = Filters.finishingType;\n    finishingType: FinishingTypeOption[];\n\n    constructor(\n        finishingType: FinishingTypeOption[] = []\n    ) {\n        super();\n        this.finishingType = finishingType;\n    }\n\n    isDefault(): boolean {\n        return this.finishingType.length === 0;\n    }\n}\n\nexport class BathroomFilter extends IFilter {\n    id: FilterId;\n    value: Bathroom[];\n\n    constructor(value?: Bathroom[]) {\n        super();\n\n        this.id = Filters.bathroom;\n        this.value = value || [];\n    }\n\n    isDefault(): boolean {\n        return this.value.length === 0;\n    }\n}\n\nexport class TransportLimitFilter extends IFilter {\n    id: FilterId = Filters.transportLimit;\n\n    timeLimit: TimeLimit;\n    transportType: TransportType;\n\n    constructor(\n        timeLimit?: TimeLimit,\n        transportType?: TransportType\n    ) {\n        super();\n        this.timeLimit = timeLimit || TimeLimit.UNKNOWN;\n        this.transportType = transportType || TransportType.UNKNOWN;\n    }\n\n    isDefault(): boolean {\n        return this.transportType === TransportType.UNKNOWN && this.timeLimit === TimeLimit.UNKNOWN;\n    }\n}\n\nexport class FloorsTotalFilter extends IFilter {\n    isDefault(): boolean {\n        return this.range.from === null && this.range.to === null;\n    }\n    id: FilterId = Filters.floorsTotal;\n    range: INumberRange;\n    constructor(range?: INumberRange) {\n        super();\n        this.range = range || { from: null, to: null };\n    }\n}\n\nexport class GeoFilter extends IFilter {\n    id: FilterId = Filters.geo;\n    geoIds: Set<number>;\n    metroIds: number[];\n    districtIds: number[];\n    addressIds: number[];\n    newBuildingIds: number[];\n\n    constructor(\n        // deprecated. Used only for tags\n        geoIds = new Set<number>(),\n        metroIds: number[] = [],\n        districtIds: number[] = [],\n        addressIds: number[] = [],\n        newBuildingIds: number[] = []\n    ) {\n        super();\n        this.geoIds = geoIds;\n        this.metroIds = metroIds;\n        this.districtIds = districtIds;\n        this.addressIds = addressIds;\n        this.newBuildingIds = newBuildingIds;\n    }\n\n    add(geo: { id: number; kind: string }) {\n        if (this.geoIds.has(geo.id)) return;\n\n        this.geoIds.add(geo.id);\n        if (this.districtIds.includes(geo.id)) return;\n        if (this.addressIds.includes(geo.id)) return;\n        if (geo.kind === 'DISTRICT') {\n            this.districtIds.push(geo.id);\n        } else this.addressIds.push(geo.id);\n    }\n\n    isDefault(): boolean {\n        return this.metroIds.length === 0 &&\n        this.districtIds.length === 0 &&\n        this.addressIds.length === 0 &&\n        this.newBuildingIds.length === 0;\n    }\n}\n\nexport class NewBuildingDataFilter extends IFilter {\n    id: FilterId = Filters.newBuildingData;\n\n    newBuilding?: {\n        type: string;\n        name: string;\n        id: number;\n    };\n\n    constructor(\n        newBuilding?: {\n            type: string;\n            name: string;\n            id: number;\n        }\n    ) {\n        super();\n\n        this.newBuilding = newBuilding;\n    }\n\n    isDefault(): boolean {\n        return this.newBuilding === undefined;\n    }\n}\n\nexport class LivingFacilityFilter extends IFilter {\n    id: FilterId = Filters.livingFacility;\n    facilities: LivingFacilitiesOption[];\n\n    constructor(\n        facilities: LivingFacilitiesOption[] = []\n    ) {\n        super();\n        this.facilities = facilities;\n    }\n\n    isDefault(): boolean {\n        return this.facilities.length === 0;\n    }\n}\n\nexport class FurnitureFilter extends IFilter {\n    id: FilterId = Filters.furniture;\n    furnitures: FurnitureOption[];\n\n    constructor(\n        furnitures: FurnitureOption[] = []\n    ) {\n        super();\n        this.furnitures = furnitures;\n    }\n\n    isDefault(): boolean {\n        return this.furnitures.length === 0;\n    }\n}\n\nexport class LivingTenantOptionFilter extends IFilter {\n    id: FilterId = Filters.livingTenantOptions;\n    livingTenantOptions: LivingTenantOption[]\n\n    constructor(\n        livingTenantOptions: LivingTenantOption[] = []\n    ) {\n        super();\n        this.livingTenantOptions = livingTenantOptions;\n    }\n\n    isDefault(): boolean {\n        return this.livingTenantOptions.length === 0;\n    }\n}\n\nexport class RentPrepaymentFilter extends IFilter {\n    id: FilterId = Filters.rentPrepayment;\n    prePaymentType: PrepaymentType | null;\n\n    constructor(\n        prePaymentType?: PrepaymentType\n    ) {\n        super();\n        this.prePaymentType = prePaymentType || null;\n    }\n\n    isDefault(): boolean {\n        return this.prePaymentType === null;\n    }\n}\n\nexport class RentConditionsFilter extends IFilter {\n    id: FilterId = Filters.rentConditions;\n\n    utilitiesIncluded: boolean;\n    depositType: DepositType;\n    commisionType: CommissionType;\n\n    constructor(\n        utilitiesIncluded = false,\n        depositType = DepositType.UNKNOWN,\n        commisionType = CommissionType.UNKNOWN\n    ) {\n        super();\n        this.utilitiesIncluded = utilitiesIncluded;\n        this.depositType = depositType;\n        this.commisionType = commisionType;\n    }\n\n    isDefault(): boolean {\n        return ! this.utilitiesIncluded && this.depositType === DepositType.UNKNOWN &&\n            this.commisionType === CommissionType.UNKNOWN;\n    }\n}\n\nexport class WallsTypeFilter extends IFilter {\n    id: FilterId = Filters.walls;\n\n    walls: WallsType[];\n\n    constructor(walls?: WallsType[]) {\n        super();\n        this.walls = walls || [];\n    }\n\n    isDefault(): boolean {\n        return this.walls.length === 0;\n    }\n}\n\nexport class ParkingFilter extends IFilter {\n    id: FilterId = Filters.parkings;\n\n    parkings: ParkingType[];\n\n    constructor(parkings?: ParkingType[]) {\n        super();\n        this.parkings = parkings || [];\n    }\n\n    isDefault(): boolean {\n        return this.parkings.length === 0;\n    }\n}\n\nexport class InfrastructureFilter extends IFilter {\n    id: FilterId = Filters.infrastructure;\n    infrastructure: InfrastructureOptions[];\n\n    hasLift: LiftOptions;\n\n    constructor(\n        infrastructure?: InfrastructureOptions[],\n        hasLift?: LiftOptions\n    ) {\n        super();\n        this.infrastructure = infrastructure || [];\n        this.hasLift = hasLift || LiftOptions.UNKNOWN;\n    }\n\n    isDefault(): boolean {\n        return this.infrastructure.length === 0 &&\n        this.hasLift === LiftOptions.UNKNOWN;\n    }\n}\n\nexport class BalconyFilter extends IFilter {\n    id: FilterId = Filters.balcony;\n\n    hasBalcony: BalconyOptions;\n\n    constructor(\n        hasBalcony?: BalconyOptions\n    ) {\n        super();\n        this.hasBalcony = hasBalcony || BalconyOptions.UNKNOWN;\n    }\n\n    isDefault(): boolean {\n        return this.hasBalcony === BalconyOptions.UNKNOWN;\n    }\n}\n\nexport class RenovationProgramFilter extends IFilter {\n    id: FilterId = Filters.renovationProgram;\n\n    willRenovation: RenovationProgram\n\n    constructor(\n        willRenovation?: RenovationProgram\n    ) {\n        super();\n        this.willRenovation = willRenovation || RenovationProgram.UNKNOWN;\n    }\n\n    isDefault() {\n        return this.willRenovation === RenovationProgram.UNKNOWN;\n    }\n}\n\nexport class NearbySchoolFilter extends IFilter {\n    id: FilterId = Filters.nearbyOptions;\n\n    hasNearbySchool: NearbyOptions;\n\n    constructor(\n        hasNearbySchool?: NearbyOptions\n    ) {\n        super();\n        this.hasNearbySchool = hasNearbySchool || NearbyOptions.UNKNOWN;\n    }\n\n    isDefault(): boolean {\n        return this.hasNearbySchool === NearbyOptions.UNKNOWN;\n    }\n}\n\nexport class PhotoOptionsFilter extends IFilter {\n    id: FilterId = Filters.photoOptions;\n\n    photoOption: PhotoOptions\n\n    constructor(\n        photoOption?: PhotoOptions\n    ) {\n        super();\n        this.photoOption = photoOption || PhotoOptions.UNKNOWN;\n    }\n\n    isDefault() {\n        return this.photoOption === PhotoOptions.UNKNOWN;\n    }\n}\n\nexport class LayoutImageOptionsFilter extends IFilter {\n    id: FilterId = Filters.layoutImageOptions;\n\n    constructor(\n        readonly layoutImageOption: LayoutImageOptions[] = []\n    ) {\n        super();\n        this.layoutImageOption = layoutImageOption || [];\n    }\n\n    isDefault() {\n        return this.layoutImageOption.length === 0;\n    }\n}\n\nexport class BankPledgeOptionsFilter extends IFilter {\n    id: FilterId = Filters.bankPledgeOptions;\n\n    bankPledgeOption: BankPledgeOptions | null;\n\n    constructor(bankPledgeOption: BankPledgeOptions | null = null) {\n        super();\n        this.bankPledgeOption = bankPledgeOption;\n    }\n\n    isDefault() {\n        return this.bankPledgeOption === null;\n    }\n}\n\nexport class SeoMortgageAllowedFilter extends IFilter {\n    id: FilterId = Filters.seoMortgageAllowed;\n\n    constructor(readonly isAllowed = false) {\n        super();\n        this.isAllowed = isAllowed;\n    }\n\n    isDefault() {\n        return ! this.isAllowed;\n    }\n}\n\nexport class ApartmentFilter extends IFilter {\n    id: FilterId = Filters.apartments;\n\n    isApartment: IsApartmentsOptions;\n\n    constructor(\n        isApartment?: IsApartmentsOptions\n    ) {\n        super();\n        this.isApartment = isApartment || IsApartmentsOptions.UNKNOWN;\n    }\n\n    isDefault(): boolean {\n        return this.isApartment === IsApartmentsOptions.UNKNOWN;\n    }\n}\n\nexport class PositionFilter extends IFilter {\n    id: FilterId = Filters.position;\n\n    position: Position[];\n\n    constructor(\n        position?: Position[]\n    ) {\n        super();\n        this.position = position || [];\n    }\n\n    isDefault(): boolean {\n        return this.position.length === 0;\n    }\n}\n\nexport class AuthorFilter extends IFilter {\n    id: FilterId = Filters.author;\n\n    author: AuthorTypeOptionsWithRealtor[];\n\n    constructor(author?: AuthorTypeOptionsWithRealtor[]) {\n        super();\n        this.author = author || [];\n    }\n\n    isDefault(): boolean {\n        return this.author.length === 0;\n    }\n}\n\nexport class UserIdFilter extends IFilter {\n    id: FilterId = Filters.userId;\n\n    userId: string | undefined;\n\n    constructor(userId?: string) {\n        super();\n        this.userId = userId || undefined;\n    }\n\n    isDefault(): boolean {\n        return this.userId === undefined;\n    }\n}\n\nexport class SellTypeFilter extends IFilter {\n    id: FilterId = Filters.sellType;\n\n    sellType: SellType[];\n\n    constructor(sellType?: SellType[]) {\n        super();\n        this.sellType = sellType || [];\n    }\n\n    isDefault(): boolean {\n        return this.sellType.length === 0;\n    }\n}\n\nexport class CommissioningFilter extends IFilter {\n    id: FilterId = Filters.commissioning;\n    commissioning: Commissioning | string;\n\n    constructor(commissioning?: Commissioning | string) {\n        super();\n        this.commissioning = commissioning || Commissioning.UNKNOWN;\n    }\n    isDefault() {\n        return this.commissioning === Commissioning.UNKNOWN;\n    }\n}\n\nexport class CommissioningListFilter extends IFilter {\n    id: FilterId = Filters.commissioningList;\n    commissioningList: (Commissioning | string)[];\n\n    constructor(commissioningList: (Commissioning | string)[] = []) {\n        super();\n\n        this.commissioningList = commissioningList;\n    }\n\n    isDefault() {\n        return this.commissioningList.length === 0;\n    }\n}\n\nexport const allWithFinishingValues = [ FinishingTypeEnum.Fine, FinishingTypeEnum.PreFinishing, FinishingTypeEnum.WithFurniture ];\nexport class FinishingTypeFilter extends IFilter {\n    id: FilterId = Filters.finishingType;\n    value: IFinishing;\n\n    constructor(value?: FinishingParams) {\n        super();\n        this.value = {\n            hasFinishing: value?.hasFinishing,\n            finishingType: value?.finishingType ?? []\n        };\n    }\n\n    isDefault(): boolean {\n        const { hasFinishing, finishingType } = this.value;\n\n        return (\n            hasFinishing === undefined && finishingType.length === 0\n        );\n    }\n}\n\nexport class FinishingFlatFilter extends IFilter {\n    id: FilterId = Filters.finishingFlat;\n    value: FinishingBuilding;\n\n    constructor(value?: FinishingBuildingParams) {\n        super();\n        this.value = {\n            hasFinishing: value?.hasFinishing,\n            finishingType: value?.finishingType ?? []\n        };\n    }\n\n    isDefault(): boolean {\n        const { hasFinishing, finishingType } = this.value;\n\n        return (\n            hasFinishing === undefined && finishingType.length === 0\n        );\n    }\n}\n\nexport class SafetyFilter extends IFilter {\n    id: FilterId = Filters.safety;\n    safety: Safety[];\n\n    constructor(\n        safety?: Safety[]\n    ) {\n        super();\n        this.safety = safety || [];\n    }\n\n    isDefault(): boolean {\n        return this.safety.length === 0;\n    }\n}\n\nexport class DeveloperFilter extends IFilter {\n    id: FilterId = Filters.developer;\n\n    developerId?: number;\n\n    constructor(\n        developerId?: number\n    ) {\n        super();\n        this.developerId = developerId;\n    }\n\n    isDefault(): boolean {\n        return typeof this.developerId !== 'number';\n    }\n}\n\nexport class BuildingClassFilter extends IFilter {\n    id: FilterId = Filters.buildingClass;\n    buildingClass: BuildingClass[];\n\n    constructor(\n        buildingClass?: BuildingClass[]\n    ) {\n        super();\n        this.buildingClass = buildingClass || [];\n    }\n\n    isDefault(): boolean {\n        return this.buildingClass.length === 0;\n    }\n}\n\nexport class AccreditationFilter extends IFilter {\n    id: FilterId = Filters.accreditation;\n    accreditation: Accreditation[];\n\n    constructor(\n        accreditation?: Accreditation[]\n    ) {\n        super();\n        this.accreditation = accreditation || [];\n    }\n\n    isDefault(): boolean {\n        return this.accreditation.length === 0;\n    }\n}\n\nexport class NewBuildingDealFilter extends IFilter {\n    id: FilterId = Filters.newBuildingDeal;\n    deal: NewBuildingDeal[];\n\n    constructor(\n        deal?: NewBuildingDeal[]\n    ) {\n        super();\n        this.deal = deal || [];\n    }\n\n    isDefault(): boolean {\n        return this.deal.length === 0;\n    }\n}\n\nexport class PaymentTypeFilter extends IFilter {\n    id: FilterId = Filters.paymentType;\n    type: PaymentType[];\n\n    constructor(\n        type?: PaymentType[]\n    ) {\n        super();\n        this.type = type || [];\n    }\n\n    isDefault(): boolean {\n        return this.type.length === 0;\n    }\n}\n\nexport class RoomsInOfferFilter extends IFilter {\n    id: FilterId = Filters.roomsInOffer;\n    roomsInOffer: RoomsOfferedOptions[];\n\n    constructor(roomsInOffer: RoomsOfferedOptions[] = []) {\n        super();\n        this.roomsInOffer = roomsInOffer;\n    }\n\n    isDefault(): boolean {\n        return this.roomsInOffer.length === 0;\n    }\n}\n\nexport class LandStatusFilter extends IFilter {\n    id: FilterId = Filters.landStatus;\n    landStatuses: LandStatus[];\n\n    constructor(landStatuses: LandStatus[] = []) {\n        super();\n        this.landStatuses = landStatuses;\n    }\n\n    isDefault(): boolean {\n        return this.landStatuses.length === 0;\n    }\n}\n\nexport class LandAreaFilter extends IFilter {\n    id: FilterId = Filters.landArea;\n    isDefault(): boolean {\n        return this.value.from === null && this.value.to === null;\n    }\n    value: INumberRange;\n    constructor(value?: INumberRange) {\n        super();\n        this.value = value || { from: null, to: null };\n    }\n}\n\nexport class SupplyOptionsFilter extends IFilter {\n    id: FilterId = Filters.supplyOptions;\n\n    isDefault(): boolean {\n        return this.gas.length === 0 &&\n            this.water.length === 0 &&\n            this.electricity.length === 0 &&\n            this.sewerage.length === 0;\n    }\n\n    gas: GasOptions[];\n    water: WaterOptions[];\n    electricity: ElectricityOptions[];\n    sewerage: SewerageOptions[];\n\n    constructor(\n        gas: GasOptions[] = [],\n        water: WaterOptions[] = [],\n        electricity: ElectricityOptions[] = [],\n        sewerage: SewerageOptions[] = []\n    ) {\n        super();\n        this.gas = gas;\n        this.water = water;\n        this.electricity = electricity;\n        this.sewerage = sewerage;\n    }\n}\n\nexport class HouseCategoryFilter extends IFilter {\n    id = Filters.houseCategory;\n    categories: HouseCategory[];\n    isDefault(): boolean {\n        return this.categories.length === 0;\n    }\n\n    constructor(\n        categories: HouseCategory[] = []\n    ) {\n        super();\n        this.categories = categories;\n    }\n}\n\nexport class HouseAreaFilter extends IFilter {\n    id: FilterId = Filters.houseArea;\n    isDefault(): boolean {\n        return this.value.from === null && this.value.to === null;\n    }\n    value: INumberRange;\n    constructor(value?: INumberRange) {\n        super();\n        this.value = value || { from: null, to: null };\n    }\n}\n\nexport class BathroomLocationFilter extends IFilter {\n    id: FilterId = Filters.bathroomLocation;\n\n    locations: BathroomLocationOptions[];\n\n    isDefault() {\n        return this.locations.length === 0;\n    }\n\n    constructor(locations: BathroomLocationOptions[] = []) {\n        super();\n        this.locations = locations;\n    }\n}\n\nexport class HeatingFilter extends IFilter {\n    id: FilterId = Filters.heating;\n\n    heating: HeatingOptions[];\n\n    isDefault() {\n        return this.heating.length === 0;\n    }\n\n    constructor(heating: HeatingOptions[] = []) {\n        super();\n        this.heating = heating;\n    }\n}\n\nexport class BuildingsFilter extends IFilter {\n    id: FilterId = Filters.buildings;\n    buildings: number[];\n\n    constructor(\n        buildings?: number[]\n    ) {\n        super();\n        this.buildings = buildings || [];\n    }\n\n    isDefault() {\n        return this.buildings.length === 0;\n    }\n}\n\nexport class ClosedSalesFilter extends IFilter {\n    id: FilterId = Filters.closedSales;\n    includingClosedSales: boolean;\n\n    constructor(includingClosedSales: boolean = false) {\n        super();\n        this.includingClosedSales = includingClosedSales;\n    }\n\n    isDefault() {\n        return ! this.includingClosedSales;\n    }\n}\n\nexport class SelectedNewBuildingFilter extends IFilter {\n    id: FilterId = Filters.selectedNewBuilding;\n    selectedNewBuildingId?: number;\n\n    constructor(selectedNewBuildingId?: number) {\n        super();\n        this.selectedNewBuildingId = selectedNewBuildingId;\n    }\n\n    isDefault(): boolean {\n        return typeof this.selectedNewBuildingId !== 'number';\n    }\n}\n\nexport class ShowHighlightedFilter extends IFilter {\n    id: FilterId = Filters.showHighlighted;\n    shouldShowHighlighted: boolean;\n\n    constructor(shouldShowHighlighted: boolean = false) {\n        super();\n        this.shouldShowHighlighted = shouldShowHighlighted;\n    }\n\n    isDefault(): boolean {\n        return ! this.shouldShowHighlighted;\n    }\n}\n\nexport class WindowsDirectionFilter extends IFilter {\n    id: FilterId;\n    value: WindowsDirectionSearchOffersEnum[];\n\n    constructor(value: WindowsDirectionSearchOffersEnum[] = []) {\n        super();\n        this.id = Filters.windowsDirection;\n        this.value = value;\n    }\n\n    isDefault() {\n        return this.value.length === 0;\n    }\n}\n\nexport class SellerOrganizationNameFilter extends IFilter {\n    id: FilterId = Filters.sellerOrganizationName;\n\n    constructor(public sellerOrganizationName?: string) {\n        super();\n    }\n\n    isDefault() {\n        return ! this.sellerOrganizationName;\n    }\n}\n\nexport class BuildEpochFilter extends IFilter {\n    id: FilterId = Filters.buildEpoch;\n\n    buildEpoch: BuildEpoch[];\n\n    constructor(buildEpoch?: BuildEpoch[]) {\n        super();\n        this.buildEpoch = buildEpoch || [];\n    }\n\n    isDefault(): boolean {\n        return this.buildEpoch.length === 0;\n    }\n}\n\nexport class OnlineViewFilter extends IFilter {\n    id: FilterId = Filters.onlineView;\n    onlineView: OnlineView;\n\n    constructor(onlineView?: OnlineView) {\n        super();\n        this.onlineView = onlineView || OnlineView.UNKNOWN;\n    }\n\n    isDefault(): boolean {\n        return this.onlineView === OnlineView.UNKNOWN;\n    }\n}\n\nexport class NotOnlyM2ProFilter extends IFilter {\n    id: FilterId = Filters.notOnlyM2Pro;\n    notOnlyM2Pro: boolean;\n\n    constructor(notOnlyM2Pro?: boolean) {\n        super();\n        this.notOnlyM2Pro = notOnlyM2Pro ?? false;\n    }\n\n    isDefault(): boolean {\n        return ! this.notOnlyM2Pro;\n    }\n}\n","import { IFilter, FilterId, Filters, MapBoundsFilter, InfrastructureFilter } from './Filter';\n\nexport class FilterCollection {\n    constructor(filters?: Map<FilterId, IFilter>) {\n        this._filters = filters || new Map();\n    }\n    reset() {\n        const values = this._filters.values();\n\n        for (const value of values) {\n            if (! value) continue;\n            if (value.id === Filters.region) continue;\n            if (value.id === Filters.categoryType) continue;\n            if (value.id === Filters.dealType) continue;\n            if (value.isDefault()) continue;\n\n            this._filters.set(value.id, value.create());\n        }\n\n        return this.rebuild();\n    }\n    rebuild() {\n        return new FilterCollection(this._filters);\n    }\n    readonly _filters: Map<FilterId, IFilter>;\n    update(filter: IFilter) {\n        // Need to preserve filter update order - last updated filter is last in Array.from(this._filters.values())\n        this._filters.delete(filter.id);\n        this._filters.set(filter.id, filter);\n        return this.rebuild();\n    }\n    getFilters() {\n        return this._filters;\n    }\n    get<K extends IFilter>(id: FilterId) {\n        return this._filters.get(id) as K;\n    }\n    remove(filter?: IFilter) {\n        if (! filter) return this;\n\n        this._filters.set(filter.id, filter.create());\n        return this.rebuild();\n    }\n    getCountActiveFilters(ids?: Filters[]): number {\n        const values = this._filters.values();\n\n        let counter = 0;\n\n        for (const value of values) {\n            if (! value) continue;\n            if (value.id === Filters.categoryType) continue;\n            if (value.id === Filters.dealType) continue;\n            if (value.id === Filters.region) continue;\n            if (value.isDefault()) continue;\n            if (ids?.includes(value.id)) continue;\n            if (value.id === Filters.infrastructure) {\n                counter += (value as InfrastructureFilter).infrastructure.length;\n                if ((value as InfrastructureFilter).hasLift) counter++;\n                continue;\n            }\n            counter++;\n        }\n\n        return counter;\n    }\n}\n","import './styles.css';\n\nimport React from 'react';\n\nimport Icon from '@vtblife/uikit-icons';\nimport { Typography } from '@vtblife/uikit';\nimport { Size } from '@vtblife/uikit/legacy';\n\nimport classname from '@search/classname/src';\nimport { declensionByNumber } from '@search/helpers/src/declensionByNumber';\n\nconst cn = classname.bind(null, 'ModalHeading');\n\ninterface IProps {\n    text: string;\n    icon?: React.ReactNode;\n    activeCount?: number;\n    reset?: () => void;\n    onClose?: () => void;\n    dataTest?: string;\n    className?: string;\n    withDeclension?: boolean;\n}\n\nexport const ModalHeading = ({\n    icon,\n    text,\n    activeCount,\n    reset,\n    onClose,\n    dataTest,\n    className,\n    withDeclension = true\n}: IProps) => (\n    <div className={cn(null, undefined, className)}>\n        <ModalHeadingInner\n            icon={icon}\n            text={text}\n            activeCount={activeCount}\n            reset={reset}\n            dataTest={dataTest}\n            withDeclension={withDeclension}\n        />\n        <div\n            onClick={onClose}\n            className={cn('close')}\n            data-test={dataTest ? `${dataTest}-close` : undefined}\n        >\n            <Icon\n                name='times'\n                size={Size.Small}\n            />\n        </div>\n    </div>\n);\n\nexport const ModalHeadingInner = ({\n    icon,\n    text,\n    activeCount,\n    reset,\n    dataTest,\n    withDeclension = true\n}: IProps) => (\n    <div className={cn('inner')}>\n        {icon}\n        {text}\n        {\n            // eslint-disable-next-line no-nested-ternary\n            activeCount ? (\n                reset ? (<>\n                    <div className={cn('counter')}>{activeCount}</div>\n                    <Typography\n                        tag='span'\n                        onClick={reset}\n                        className={cn('reset')}\n                        data-test={dataTest ? `${dataTest}-reset` : undefined}\n                    >\n                        Сбросить\n                    </Typography>\n                </>) : (\n                    <Typography\n                        tag='span'\n                        color='black-400'\n                        className={cn('text-counter')}\n                    >\n                        {activeCount}&nbsp;\n                        {\n                            withDeclension ?\n                                declensionByNumber(activeCount, [ 'выбран', 'выбрано', 'выбрано' ]) :\n                                'выбрано'\n                        }\n                    </Typography>\n                )\n            ) : null\n        }\n    </div>\n);\n","import React from 'react';\nimport { FunctionComponent, RefObject, useCallback, useEffect, useRef } from 'react';\n\nimport throttle from 'lodash/throttle';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cn = classname.bind(null, 'StickyPhoneWrapper');\n\nexport const StickyPhoneWrapper: FunctionComponent<{\n    className?: string;\n    bottomOffset?: number;\n    safeAreaBottom?: number;\n    anchor?: RefObject<HTMLElement>;\n    hasBackground?: boolean;\n    showBeforeScrolling?: boolean;\n}> = ({\n    children,\n    className,\n    anchor,\n    bottomOffset = 16,\n    safeAreaBottom = 12,\n    hasBackground = false,\n    showBeforeScrolling = false\n}) => {\n    const wrapperRef = useRef<HTMLDivElement>(null);\n    const ref = useRef<HTMLDivElement>(null);\n\n    const handleScroll = useCallback(() => {\n        const anchorRect = anchor?.current?.getBoundingClientRect();\n\n        const viewPortHeight = window.innerHeight;\n\n        if (ref.current && anchorRect && wrapperRef.current) {\n            const currentRect = ref.current.getBoundingClientRect();\n\n            const isHideAnchor = (anchorRect.bottom - viewPortHeight - anchorRect.height) <= 0;\n\n            if (! isHideAnchor) {\n                ref.current.style.position = 'fixed';\n\n                if (hasBackground) {\n                    ref.current.style.paddingBottom = `calc(${bottomOffset}px + env(safe-area-inset-bottom, ${safeAreaBottom}px))`;\n                    ref.current.style.bottom = '0';\n                } else {\n                    ref.current.style.bottom = `calc(${bottomOffset}px + env(safe-area-inset-bottom, ${safeAreaBottom}px))`;\n                }\n            } else {\n                ref.current.style.bottom = `-${currentRect.height}px`;\n            }\n        }\n    }, [ anchor, bottomOffset, safeAreaBottom, hasBackground ]);\n\n    useEffect(() => {\n        if (anchor) {\n            if (showBeforeScrolling) {\n                handleScroll();\n            }\n\n            const throttledHandleScroll = throttle(handleScroll, 100);\n\n            window.addEventListener('scroll', throttledHandleScroll);\n\n            return () => {\n                window.removeEventListener('scroll', throttledHandleScroll);\n            };\n        }\n    }, [ anchor, handleScroll ]);\n\n    return (\n        <div ref={wrapperRef}>\n            <div\n                ref={ref}\n                className={cn(null, { fixed: ! anchor, hasBackground }, className)}\n            >\n                {children}\n            </div>\n        </div>\n    );\n};\n","import React from 'react';\n\nimport './styles.css';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface FiltersFormTipsProps {\n\n}\n\nconst FiltersFormTips: React.FunctionComponent<FiltersFormTipsProps> = ({ children }) => {\n    return (<div className='FiltersFormTips'>\n        {children}\n    </div>);\n};\n\nexport default FiltersFormTips;\n","import React from 'react';\nimport Icon, { IIconProps } from '../Icon';\n\nimport './styles.css';\n\ninterface IIconClose extends IIconProps {\n    type?: 'close';\n}\n\nexport default (props: IIconClose): React.ReactElement => React.cloneElement(<Icon />, { type: 'close', ...props });\n","import React, { ReactNode } from 'react';\n// @ts-ignore\nimport Button from '@search/vtbeco-ui/src/components/controls/Button';\n// @ts-ignore\nimport IconClose from '@search/vtbeco-ui/src/components/controls/IconClose';\n// @ts-ignore\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nexport interface IFiltersFormTip {\n    children: ReactNode;\n\n    /**\n     * Обработчик удаления подсказки\n     * @param name\n     */\n    onRemove: () => void;\n    enabled: boolean;\n    onWhiteBackground?: boolean;\n    mortgageTip?: boolean;\n}\n\nconst cn = classname.bind(null, 'FiltersFormTip');\n\nconst FiltersFormTip: React.FC<IFiltersFormTip> = ({\n    children,\n    onRemove,\n    mortgageTip = false,\n    onWhiteBackground: onWhite = true\n}) => {\n    const handleClickRemove = () => {\n        onRemove();\n    };\n\n    return (\n        <div className={cn(null, { onWhite, mortgageTip })}>\n            <span className={cn('label')}>\n                {children}\n            </span>\n            <Button\n                view='clear'\n                onClick={handleClickRemove}\n                iconLeft={<IconClose />}\n                className={cn('remove')}\n            />\n        </div>\n    );\n};\n\nexport default FiltersFormTip;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AuthorTypeOptions, LayoutImageOptions, PhotoOptions } from '@search/filter-enums/enums';\nimport { IRange } from '@search/vtbeco-frontend-core/view/filters/types/IRange';\nimport { formatRange } from '@search/helpers/src/formatNumber';\nimport {\n    ApartmentFilter,\n    AreaFilter,\n    AuthorFilter,\n    CellHeightFilter,\n    Filters,\n    FloorFilter,\n    FloorsTotalFilter,\n    KitchenAreaFilter,\n    LayoutImageOptionsFilter,\n    LivingAreaFilter,\n    PhotoOptionsFilter,\n    TransportLimitFilter,\n    YearBuildingFilter,\n    SellerOrganizationNameFilter,\n    MortgagePaymentFilter\n} from '../filters/models/Filter';\nimport { priceByMortgagePayment } from '../filters/helpers/priceHelper';\nimport {\n    apartmentsLabels,\n    authorLabels,\n    ceilingHeightLabels,\n    floorConstraintsLabels,\n    timeLimitLabel,\n    transportTypeLabel\n} from './labels';\n\nexport const extraFiltersIds: Filters[] = [\n    Filters.bathroomLocation,\n    Filters.heating,\n    Filters.supplyOptions,\n    Filters.landArea,\n    Filters.houseArea,\n    Filters.mapBounds,\n    Filters.geo,\n    Filters.totalArea,\n    Filters.livingArea,\n    Filters.kitchenArea,\n    Filters.floor,\n    Filters.floorsTotal,\n    Filters.cellHeight,\n    Filters.renovation,\n    Filters.bathroom,\n    Filters.balcony,\n    Filters.developer,\n    Filters.buildingClass,\n    Filters.builtYear,\n    Filters.parkings,\n    Filters.walls,\n    Filters.apartments,\n    Filters.position,\n    Filters.infrastructure,\n    Filters.safety,\n    Filters.accreditation,\n    Filters.newBuildingDeal,\n    Filters.paymentType,\n    Filters.author,\n    Filters.photoOptions,\n    Filters.layoutImageOptions,\n    Filters.livingFacility,\n    Filters.sellType,\n    Filters.furniture,\n    Filters.livingTenantOptions,\n    Filters.rentConditions,\n    Filters.rentPrepayment,\n    Filters.bankPledgeOptions,\n    Filters.seoMortgageAllowed,\n    Filters.closedSales,\n    Filters.buildings,\n    Filters.windowsDirection,\n    Filters.transportLimit,\n    Filters.flatsSpecialEvents,\n    Filters.otherSpecialEvents,\n    Filters.miscSpecialEvents,\n    Filters.nearbyOptions,\n    Filters.renovationProgram,\n    Filters.sellerOrganizationName,\n    Filters.buildEpoch,\n    Filters.onlineView,\n    Filters.mortgagePayment,\n    Filters.finishingType,\n    Filters.commissioning\n];\n\nexport const buildRangeLabel = (\n    value: IRange<number | null>,\n    title: string,\n    unit = ''\n) => {\n    if (value === null) {\n        return null;\n    }\n    const spacedUnit = unit ? ` ${unit}` : unit;\n\n    if (value.from && value.to) {\n        return `${title}: от ${value.from}${spacedUnit} до ${value.to}${spacedUnit}`;\n    } else if (value.from && ! value.to) {\n        return `${title}: от ${value.from}${spacedUnit}`;\n    } else if (! value.from && value.to) {\n        return `${title}: до ${value.to}${spacedUnit}`;\n    }\n\n    return null;\n};\n\nconst getTransportLimitTip = (filter: TransportLimitFilter) => {\n    const { transportType, timeLimit } = filter;\n\n    if (transportType && timeLimit) {\n        return `До метро ${timeLimitLabel[timeLimit]} мин. ${transportTypeLabel[transportType]}`;\n    }\n\n    return null;\n};\n\nconst getFloorLabelTip = (filter: FloorFilter) => {\n    const { range, last, first } = filter;\n    const labels = [ buildRangeLabel(range, 'Этаж в доме') ];\n\n    if (last) {\n        labels.push(`${floorConstraintsLabels[last]} последний`);\n    }\n\n    if (first) {\n        labels.push(`${floorConstraintsLabels[first]} первый`);\n    }\n\n    return labels.join(', ');\n};\n\nconst getMortgagePriceTip = (filter: MortgagePaymentFilter) => {\n    if (filter.payment) {\n        return `С таким платежом вы сможете купить квартиру ${formatRange(null, priceByMortgagePayment(filter.payment))}.`;\n    }\n\n    return null;\n};\nconst getCeilingHeightLabelTip = (filter: CellHeightFilter) =>\n    ceilingHeightLabels[filter.value];\n\nconst getAreaLabelTip = (filter: AreaFilter) =>\n    buildRangeLabel(filter.value, 'Общая площадь', 'м²');\n\nconst getLivingLabelTip = (filter: LivingAreaFilter) =>\n    buildRangeLabel(filter.value, 'Жилая площадь', 'м²');\n\nconst getKitchenLabelTip = (filter: KitchenAreaFilter) =>\n    buildRangeLabel(filter.value, 'Площадь кухни', 'м²');\n\nconst getFloorsTotalLabelTip = (filter: FloorsTotalFilter) =>\n    buildRangeLabel(filter.range, 'Этажей в доме');\n\nconst getYearBuildingLabelTip = (filter: YearBuildingFilter) =>\n    buildRangeLabel(filter.value, 'Год постройки', 'г.');\n\nconst getApartmentsLabelTip = (filter: ApartmentFilter) =>\n    apartmentsLabels[filter.isApartment];\n\nconst getAuthorTypeTip = (filter: AuthorFilter) => {\n    const check = (v: number) => {\n        return (! isNaN(v) && (v in AuthorTypeOptions));\n    };\n    const result = [];\n\n    for (const i of filter.author) {\n        if (check(Number(i))) {\n            result.push(\n                authorLabels[Number(i)]\n            );\n        }\n    }\n    return result.join(', ');\n};\n\nconst getPhotoTypeTip = (filter: PhotoOptionsFilter) => filter.photoOption === PhotoOptions.WITH_PHOTO ?\n    'Только с фото' :\n    null;\n\nconst getLayoutImageTypeTip = (filter: LayoutImageOptionsFilter) =>\n    filter.layoutImageOption.find(option => option === LayoutImageOptions.HAS_ANY) ?\n        'С планировкой' : null;\n\nconst getSellerOrganizationName = (filter: SellerOrganizationNameFilter) => {\n    return filter.sellerOrganizationName ? `${filter.sellerOrganizationName}` : null;\n};\n\nconst getBankPledgeTip = () => 'В залоге';\n\nconst getNearbySchoolTip = () => 'Рядом хорошая школа';\n\nconst getRenovationProgramTip = () => 'Дом под реновацию';\n\nconst getClosedSalesTip = () => 'С закрытыми продажами';\n\nconst getOnlineViewTip = () => 'Онлайн-просмотр';\n\n// eslint-disable-next-line complexity\nexport const serializeToTips = (id: Filters, filter: any) => {\n    switch (id) {\n        case Filters.photoOptions: {\n            return getPhotoTypeTip(filter as PhotoOptionsFilter);\n        }\n        case Filters.layoutImageOptions: {\n            return getLayoutImageTypeTip(filter as LayoutImageOptionsFilter);\n        }\n        case Filters.seoMortgageAllowed: {\n            return 'В ипотеку';\n        }\n        case Filters.bankPledgeOptions: {\n            return getBankPledgeTip();\n        }\n        case Filters.renovationProgram: {\n            return getRenovationProgramTip();\n        }\n        case Filters.nearbyOptions: {\n            return getNearbySchoolTip();\n        }\n        case Filters.author: {\n            return getAuthorTypeTip(filter as AuthorFilter);\n        }\n        case Filters.transportLimit: {\n            return getTransportLimitTip(filter as TransportLimitFilter);\n        }\n        case Filters.floor: {\n            return getFloorLabelTip(filter as FloorFilter);\n        }\n        case Filters.cellHeight: {\n            return getCeilingHeightLabelTip(filter as CellHeightFilter);\n        }\n        case Filters.totalArea: {\n            return getAreaLabelTip(filter as AreaFilter);\n        }\n        case Filters.livingArea: {\n            return getLivingLabelTip(filter as LivingAreaFilter);\n        }\n        case Filters.kitchenArea: {\n            return getKitchenLabelTip(filter as KitchenAreaFilter);\n        }\n        case Filters.floorsTotal: {\n            return getFloorsTotalLabelTip(filter as FloorsTotalFilter);\n        }\n        case Filters.builtYear: {\n            return getYearBuildingLabelTip(filter as YearBuildingFilter);\n        }\n        case Filters.apartments: {\n            return getApartmentsLabelTip(filter as ApartmentFilter);\n        }\n        case Filters.closedSales: {\n            return getClosedSalesTip();\n        }\n        case Filters.sellerOrganizationName: {\n            return getSellerOrganizationName(filter as SellerOrganizationNameFilter);\n        }\n        case Filters.onlineView: {\n            return getOnlineViewTip();\n        }\n        case Filters.mortgagePayment: {\n            return getMortgagePriceTip(filter as MortgagePaymentFilter);\n        }\n        default: {\n            return null;\n        }\n    }\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable complexity */\nimport React, {\n    useEffect,\n    useState,\n    Fragment\n} from 'react';\n\nimport { Typography } from '@vtblife/uikit';\nimport Icon from '@vtblife/uikit-icons';\n\nimport { GeoKind } from '@search/filter-enums/enums/GeoKind';\nimport classname from '@search/classname/src';\nimport {\n    DealType,\n    RoomsOfferedOptions,\n    LandStatus,\n    GasOptions,\n    ElectricityOptions,\n    SewerageOptions,\n    WaterOptions,\n    HeatingOptions,\n    BathroomLocationOptions,\n    Rooms,\n    LivingFacilitiesOption,\n    PrepaymentType,\n    CommissionType,\n    DepositType,\n    FurnitureOption,\n    LivingTenantOption,\n    FinishingTypeOption,\n    Commissioning,\n    Quarter\n} from '@search/filter-enums/enums';\nimport { RealtyObjectType } from '@search/filter-enums/enums/RealtyObjectType';\nimport { FilterCollection } from '@search/vtbeco-frontend-core/view/filters/models/FilterCollection';\nimport { WindowsDirectionSearchOffersEnum } from '@search/graphql-typings';\n\nimport type { QueryDisplayValues } from '../../common/hooks/useQueryDisplayValues';\nimport type { MetroStation } from '../../../domain/geo/MetroStation';\nimport { MetroMark } from '../../common/components/GeoSuggest/MetroMark';\nimport FiltersFormTips from '../../desktop/components/FiltersForm/FiltersFormTips';\nimport FiltersFormTip from '../../desktop/components/FiltersForm/FiltersFormTips/FiltersFormTip';\nimport { groupDistricts } from '../../filters/helpers/districtHelper';\nimport {\n    AccreditationFilter,\n    BathroomFilter,\n    BalconyFilter,\n    BuildingClassFilter,\n    NewBuildingDealFilter,\n    DeveloperFilter,\n    ClosedSalesFilter,\n    Filters,\n    GeoFilter,\n    IFilter,\n    InfrastructureFilter,\n    SafetyFilter,\n    ParkingFilter,\n    PositionFilter,\n    RenovationFilter,\n    PaymentTypeFilter,\n    WallsTypeFilter,\n    MapBoundsFilter,\n    RoomsInOfferFilter,\n    DealTypeFilter,\n    LandStatusFilter,\n    CategoryTypeFilter,\n    RoomFilter,\n    LandAreaFilter,\n    SupplyOptionsFilter,\n    HeatingFilter,\n    BathroomLocationFilter,\n    HouseAreaFilter,\n    FloorsTotalFilter,\n    LivingFacilityFilter,\n    RentPrepaymentFilter,\n    RentConditionsFilter,\n    FurnitureFilter,\n    LivingTenantOptionFilter,\n    SellTypeFilter,\n    BuildingsFilter,\n    AuthorFilter,\n    WindowsDirectionFilter,\n    RegionFilter,\n    FlatsSpecialEventsFilter,\n    OtherSpecialEventsFilter,\n    MiscSpecialEventsFilter,\n    BuildEpochFilter,\n    MortgagePaymentFilter,\n    FinishingFilter,\n    CommissioningFilter\n} from '../../filters/models/Filter';\n\nimport { extraFiltersIds, serializeToTips, buildRangeLabel } from '../serializeToTips';\nimport {\n    accreditationLabels,\n    positionLabels,\n    bathroomLabels,\n    balconyLabels,\n    buildingClassLabels,\n    newBuildingDealLabels,\n    infrastructureLabels,\n    safetyLabels,\n    parkingLabels,\n    renovationLabels,\n    paymentTypeLabels,\n    wallsLabels,\n    saleTypeLabels,\n    authorLabels,\n    flatsSpecialEventsLabels,\n    otherSpecialEventsLabels,\n    miscSpecialEventsLabels,\n    buildEpochLabels\n} from '../labels';\n\nimport './style.css';\nimport type { GeoBaseStore } from '../../../domain/geo/GeoBase';\n\ntype Id = typeof extraFiltersIds[number];\n\nexport type TipItemBase = {\n    id: number;\n    __typename?: 'TipRouteMetro';\n    geoId?: number;\n}\n\nexport type TipItem = {\n    type?: any;\n    id: Id;\n    kind?: GeoKind | Filters | 'METRO';\n    partial?: boolean;\n    title: string | null;\n    geoId?: number;\n} | {\n    kind: 'district-group';\n    title: string;\n    id: string;\n    districts: TipItemBase[];\n};\n\ninterface ITipProps {\n    removeTip: (tip: TipItem) => void;\n    tip: TipItem;\n    enabled?: boolean;\n    onWhiteBackground: boolean;\n    openMortgagePaymentSearchModal?: () => void;\n}\n\ntype QuarterType = keyof typeof Quarter;\n\nconst MIN_TIPS_COUNT = 3;\nconst TIP_CLASS = 'FiltersFormTip';\nconst cn = classname.bind(null, TIP_CLASS);\nconst cnButton = classname.bind(null, cn('TipButton'));\n\nconst Tip = ({\n    tip,\n    removeTip,\n    enabled = true,\n    onWhiteBackground,\n    openMortgagePaymentSearchModal\n}: ITipProps) => {\n    let content;\n\n    if (tip.kind === GeoKind.METRO) {\n        const metroTip = tip as MetroStation;\n\n        content = (\n            <>\n                {\n                    metroTip.allRoutesColorsList ? (\n                        <MetroMark\n                            colors={metroTip.allRoutesColorsList}\n                            className={cn('mark')}\n                        />\n                    ) : (\n                        <Typography variant='secondary-alone'>{'м. '}</Typography>\n                    )\n                }\n                <Typography\n                    variant='secondary-alone'\n                    className={cn('metro')}\n                >\n                    {metroTip.title}\n                </Typography>\n            </>\n        );\n    } else if (tip.id === Filters.mortgagePayment) {\n        content = (\n            <Typography variant='secondary-alone' onClick={openMortgagePaymentSearchModal}>\n                {tip.title}\n                <span style={{ color: '#3216B5' }}>&nbsp;Расчёт →</span>\n            </Typography>\n        );\n    } else {\n        content = (\n            <Typography variant='secondary-alone'>\n                {tip.title}\n            </Typography>\n        );\n    }\n\n    return (\n        <FiltersFormTip\n            key={tip.id}\n            onRemove={() => enabled ? removeTip(tip) : undefined}\n            enabled={enabled}\n            onWhiteBackground={onWhiteBackground}\n            mortgageTip={tip.id === Filters.mortgagePayment}\n        >\n            {content}\n        </FiltersFormTip>\n    );\n};\n\ntype IProps = {\n    filters: FilterCollection;\n    updateFilter: (filter: IFilter) => void;\n    removeFilter: (filter: IFilter) => void;\n    expandFilter: (state: boolean) => void | undefined;\n    removeGeo?: (tip: TipItemBase[]) => void;\n    onUpdateLength?: (length: number) => void;\n    reset?: () => void;\n    customFilterBehavior?: {\n        developer: {\n            reset: () => void;\n        };\n    };\n    onWhiteBackground?: boolean;\n    classNamesNewFilters?: {\n        firstLineTipsOnly: string;\n        allTips: string;\n        tipsButtons: string;\n    };\n    loading?: boolean;\n    tipsExpanded?: boolean;\n    openMortgagePaymentSearchModal?: () => void;\n} & ({\n    shouldIgnoreGeoIds?: boolean;\n    geoStore?: any;\n    tips?: undefined;\n    queryDisplayValues?: QueryDisplayValues;\n} | { tips: ReturnType<typeof getTipsCollection> })\n\nfunction getDealForRoom(dealTypeFilter: DealTypeFilter) {\n    if (dealTypeFilter.dealType === DealType.SELL) {\n        return 'на продажу';\n    } else if (dealTypeFilter.dealType === DealType.RENT) {\n        return 'в аренду';\n    }\n}\n\nconst roomsInOffer = {\n    [RoomsOfferedOptions.ROOM_1]: '1',\n    [RoomsOfferedOptions.ROOM_2]: '2',\n    [RoomsOfferedOptions.ROOM_3]: '3',\n    [RoomsOfferedOptions.ROOM_4_AND_MORE]: '4+'\n};\n\nconst roomInOfferWithText = {\n    [RoomsOfferedOptions.ROOM_1]: '1 комната',\n    [RoomsOfferedOptions.ROOM_2]: '2 комнаты',\n    [RoomsOfferedOptions.ROOM_3]: '3 комнаты',\n    [RoomsOfferedOptions.ROOM_4_AND_MORE]: '4+ комнат'\n};\n\nconst roomForSale = {\n    [Rooms.ROOM_1]: '1',\n    [Rooms.ROOM_2]: '2',\n    [Rooms.ROOM_3]: '3',\n    [Rooms.ROOM_4]: '4',\n    [Rooms.ROOM_5_AND_MORE]: '5+'\n};\n\nconst roomWithText = {\n    [Rooms.ROOM_1]: '1 комната',\n    [Rooms.ROOM_2]: '2 комнаты',\n    [Rooms.ROOM_3]: '3 комнаты',\n    [Rooms.ROOM_4]: '4 комнаты',\n    [Rooms.ROOM_5_AND_MORE]: '5+ комнат'\n};\n\nfunction getRoomsInOfferTips(\n    roomsInOfferFilter: RoomsInOfferFilter | undefined,\n    dealTypeFilter: DealTypeFilter\n) {\n    const rooms = roomsInOfferFilter?.roomsInOffer ?? [];\n\n    if (rooms.length === 0) {\n        return null;\n    }\n\n    const roomsInOfferText = rooms.map(room => roomsInOffer[room]).join(', ');\n    const roomsText = rooms.length === 1 ? roomInOfferWithText[rooms[0]] : `${roomsInOfferText} комнат`;\n    const dealTypeText = getDealForRoom(dealTypeFilter);\n\n    return `${roomsText} ${dealTypeText}`;\n}\n\nfunction getAtRealtyType(realtyType?: RealtyObjectType) {\n    if (\n        realtyType === RealtyObjectType.FLAT ||\n        realtyType === RealtyObjectType.ROOM\n    ) {\n        return 'в квартире';\n    } else if (\n        realtyType === RealtyObjectType.HOUSE\n    ) {\n        return 'в доме';\n    }\n\n    return '';\n}\n\nconst livingFacilityMapping = {\n    [LivingFacilitiesOption.INTERNET]: 'Интернет',\n    [LivingFacilitiesOption.WASHING_MACHINE]: 'Стиральная машина',\n    [LivingFacilitiesOption.FRIDGE]: 'Холодильник',\n    [LivingFacilitiesOption.DISHWASHER]: 'Посудомоечная машина',\n    [LivingFacilitiesOption.AIR_CONDITIONER]: 'Кондиционер',\n    [LivingFacilitiesOption.TV]: 'Телевизор'\n};\n\nfunction getLivingFacilityTip(\n    facility: LivingFacilitiesOption\n): string | undefined {\n    return livingFacilityMapping[facility];\n}\n\nfunction getRoomsTips(\n    roomFilter: RoomFilter | undefined,\n    realtyObjectFilter: CategoryTypeFilter | undefined\n) {\n    const rooms = roomFilter?.rooms ?? [];\n\n    if (rooms.length === 0) {\n        return null;\n    }\n\n    const roomsCountText = rooms.map(room => roomForSale[room]).join(', ');\n    let roomsText = rooms.length === 1 ? roomWithText[rooms[0]] : `${roomsCountText} комнат`;\n    const atRealtyTypeText = getAtRealtyType(realtyObjectFilter?.categoryType);\n\n    // roomsText maybe absent, if bot/robot will come with wrong url (/moskva/nedvizhimost/snyat-dom/svobodnaya-planirovka/rayon-lianozovo/s-vodoj/)\n    if (realtyObjectFilter?.categoryType === RealtyObjectType.HOUSE && roomsText) {\n        roomsText = roomsText.replace('4, 5+', '4+');\n    }\n\n    return `${roomsText} ${atRealtyTypeText}`;\n}\n\nconst getLandAreaLabelTip = (filter: LandAreaFilter) =>\n    buildRangeLabel(filter.value, 'Площадь участка', 'сот.');\n\nconst getHouseAreaLabelTip = (filter: HouseAreaFilter) =>\n    buildRangeLabel(filter.value, 'Площадь дома', 'м²');\n\nconst landStatus = {\n    [LandStatus.IZHS]: 'ИЖС',\n    [LandStatus.SNT]: 'СНТ',\n    [LandStatus.DNP]: 'ДНП',\n    [LandStatus.AGRICULTURAL]: 'ЛПХ'\n};\n\nfunction getLandStatusTips(filter: LandStatusFilter) {\n    const statuses = filter.landStatuses\n        .map(status => landStatus[status])\n        .filter(a => a);\n\n    if (statuses.length === 0) {\n        return null;\n    }\n\n    return `Статус участка: ${statuses.join(', ')}`;\n}\n\nfunction getSupplyOptionsTip(supplyOptionsFilter: SupplyOptionsFilter, heatingFilter?: HeatingFilter) {\n    const result: string[] = [];\n\n    if (supplyOptionsFilter.gas.includes(GasOptions.HAS_ANY)) {\n        result.push('газ');\n    }\n\n    if (supplyOptionsFilter.electricity.includes(ElectricityOptions.HAS_ANY)) {\n        result.push('электричество');\n    }\n\n    if (supplyOptionsFilter.sewerage.includes(SewerageOptions.HAS_ANY)) {\n        result.push('канализация');\n    }\n\n    if (supplyOptionsFilter.water.includes(WaterOptions.HAS_ANY)) {\n        result.push('вода');\n    }\n\n    if (heatingFilter && heatingFilter.heating.includes(HeatingOptions.HAS_ANY)) {\n        result.push('отопление');\n    }\n\n    if (result.length === 0) {\n        return null;\n    }\n\n    const resultText = result.join(', ');\n\n    return `Коммуникации: ${resultText}`;\n}\n\nfunction getWindowsDirectionLabel(filter: WindowsDirectionFilter) {\n    const result: string[] = [];\n\n    if (filter.value.includes(WindowsDirectionSearchOffersEnum.Rear)) {\n        result.push('во двор');\n    }\n\n    if (filter.value.includes(WindowsDirectionSearchOffersEnum.Front)) {\n        result.push('на улицу');\n    }\n\n    const resultText = result.join(' и ');\n\n    return `Вид из ок${result.length > 1 ? 'он' : 'на'}: ${resultText}`;\n}\n\nfunction getHeatingTip(filter: HeatingFilter) {\n    if (filter.heating.includes(HeatingOptions.HAS_ANY)) {\n        return 'Отопление: есть';\n    }\n\n    return null;\n}\n\nfunction getBathroomLocationTip(filter: BathroomLocationFilter) {\n    if (filter.locations.includes(BathroomLocationOptions.INSIDE)) {\n        return 'Санузел в доме';\n    }\n\n    return null;\n}\n\nfunction getFloorsTotalTip(filter: FloorsTotalFilter) {\n    return buildRangeLabel(filter.range, 'Этажей в доме', 'эт.');\n}\n\nfunction getExtraFilterIds(filters: FilterCollection) {\n    const result = [ ...extraFiltersIds ];\n    const realtyTypeFilter = filters.get(Filters.categoryType) as CategoryTypeFilter;\n    const categoryType = realtyTypeFilter?.categoryType;\n\n    if (\n        categoryType === RealtyObjectType.ROOM\n    ) {\n        result.push(Filters.rooms);\n        result.push(Filters.roomsInOffer);\n    }\n    if (categoryType === RealtyObjectType.HOUSE) {\n        result.push(Filters.rooms);\n        result.push(Filters.landStatus);\n    }\n\n    return result;\n}\n\nfunction getPrepaymentTip(filter: RentPrepaymentFilter) {\n    const prepaymentType = filter.prePaymentType;\n\n    if (prepaymentType === PrepaymentType.NO_PREPAYMENT) {\n        return 'Без предоплаты';\n    } else if (prepaymentType === PrepaymentType.UP_TO_1_PRICE) {\n        return 'Предоплата до 1 месяца';\n    } else if (prepaymentType === PrepaymentType.UP_TO_2_PRICE) {\n        return 'Предоплата до 2 месяцев';\n    } else if (prepaymentType === PrepaymentType.UP_TO_3_PRICE) {\n        return 'Предоплата до 3 месяцев';\n    }\n\n    return null;\n}\n\nfunction getRentConditionsTip(filter: RentConditionsFilter) {\n    const result: any[] = [];\n\n    if (filter.commisionType === CommissionType.NO_CLIENT_COMMISSION) {\n        result.push({\n            id: Filters.rentConditions + filter.commisionType as Id,\n            type: 'commisionType',\n            kind: Filters.rentConditions,\n            title: 'Без комиссии'\n        });\n    }\n\n    if (filter.depositType === DepositType.NO_DEPOSIT) {\n        result.push({\n            id: Filters.rentConditions + 'depositType' as Id,\n            type: 'depositType',\n            kind: Filters.rentConditions,\n            title: 'Без залога'\n        });\n    }\n\n    if (filter.utilitiesIncluded === true) {\n        result.push({\n            id: Filters.rentConditions + 'utilitiesIncluded' as Id,\n            type: 'utilitiesIncluded',\n            kind: Filters.rentConditions,\n            title: 'КУ Включены'\n        });\n    }\n\n    return result;\n}\n\nfunction getFurnitureTip(filter: FurnitureFilter) {\n    const result: any[] = [];\n    const furnitures = filter.furnitures;\n\n    furnitures.forEach(furniture => {\n        if (furniture === FurnitureOption.ALL) {\n            result.push({\n                id: Filters.furniture + String(furniture) as Id,\n                type: furniture,\n                kind: Filters.furniture,\n                title: 'С мебелью'\n            });\n        } else if (furniture === FurnitureOption.KITCHEN) {\n            result.push({\n                id: Filters.furniture + String(furniture) as Id,\n                type: furniture,\n                kind: Filters.furniture,\n                title: 'Мебель на кухне'\n            });\n        } else if (furniture === FurnitureOption.NO) {\n            result.push({\n                id: Filters.furniture + String(furniture) as Id,\n                type: furniture,\n                kind: Filters.furniture,\n                title: 'Без мебели'\n            });\n        }\n    });\n\n    return result;\n}\n\nfunction getFinishingTip(filter: FinishingFilter) {\n    const result: any[] = [];\n    const finishingTypes = filter.finishingType;\n\n    finishingTypes.forEach(type => {\n        if (type === FinishingTypeOption.WITHOUT_FINISHING) {\n            result.push({\n                id: Filters.finishingType + String(type) as Id,\n                type,\n                kind: Filters.finishingType,\n                title: 'Отделка: Без отделки'\n            });\n        } else if (type === FinishingTypeOption.FINE) {\n            result.push({\n                id: Filters.finishingType + String(type) as Id,\n                type,\n                kind: Filters.finishingType,\n                title: 'Отделка: Чистовая'\n            });\n        } else if (type === FinishingTypeOption.PRE_FINISHING) {\n            result.push({\n                id: Filters.finishingType + String(type) as Id,\n                type,\n                kind: Filters.finishingType,\n                title: 'Отделка: Предчистовая'\n            });\n        } else if (type === FinishingTypeOption.WITH_FURNITURE) {\n            result.push({\n                id: Filters.finishingType + String(type) as Id,\n                type,\n                kind: Filters.finishingType,\n                title: 'Отделка: C мебелью'\n            });\n        }\n    });\n\n    return result;\n}\n\nfunction getCommissioningTip(filter: CommissioningFilter) {\n    const commissioning = filter.commissioning;\n\n    let tip = 'Срок сдачи: ';\n\n    switch (commissioning) {\n        case (Commissioning.COMMISSIONED): {\n            tip += 'Сдан';\n            break;\n        }\n        case (Commissioning.IN_PROGRESS): {\n            tip += 'Строится';\n            break;\n        }\n        case (Commissioning.UNKNOWN): {\n            return;\n        }\n        default: {\n            if (! commissioning) {\n                return;\n            }\n\n            const yearArr = commissioning.split('_');\n            const quarter: QuarterType = yearArr[0] as QuarterType;\n            const year = yearArr[1];\n\n            tip += `До ${Quarter[quarter]} кв. ${year}`;\n            break;\n        }\n    }\n\n    return ({\n        id: Filters.commissioning,\n        type: tip,\n        kind: Filters.commissioning,\n        title: tip\n    });\n}\n\nfunction getLivingTenantOptionsTip(filter: LivingTenantOptionFilter) {\n    const result: any[] = [];\n    const livingOptions = filter.livingTenantOptions;\n\n    livingOptions.forEach(livingOption => {\n        if (livingOption === LivingTenantOption.CHILDREN_ALLOWED) {\n            result.push({\n                id: Filters.livingTenantOptions + String(livingOption) as Id,\n                type: livingOption,\n                kind: Filters.livingTenantOptions,\n                title: 'Можно с детьми'\n            });\n        } else if (livingOption === LivingTenantOption.PETS_ALLOWED) {\n            result.push({\n                id: Filters.livingTenantOptions + String(livingOption) as Id,\n                type: livingOption,\n                kind: Filters.livingTenantOptions,\n                title: 'Можно с животными'\n            });\n        }\n    });\n\n    return result;\n}\n\nexport function getTipsCollection({\n    geoStore,\n    filters,\n    queryDisplayValues,\n    shouldIgnoreGeoIds = false\n}: {\n    geoStore?: GeoBaseStore;\n    filters: FilterCollection;\n    queryDisplayValues?: QueryDisplayValues;\n    shouldIgnoreGeoIds?: boolean;\n}) {\n    const filterKeys = Array.from(filters.getFilters().keys());\n\n    const bathroomFilter = filters.get(Filters.bathroom) as BathroomFilter;\n    const balconyFilter = filters.get(Filters.balcony) as BalconyFilter;\n    const renovationFilter = filters.get(Filters.renovation) as RenovationFilter;\n    const developerFilter = filters.get(Filters.developer) as DeveloperFilter;\n    const closedSalesFilter = filters.get(Filters.closedSales) as ClosedSalesFilter;\n    const buildingClassFilter = filters.get(Filters.buildingClass) as BuildingClassFilter;\n    const parkingFilter = filters.get(Filters.parkings) as ParkingFilter;\n    const wallsTypeFilter = filters.get(Filters.walls) as WallsTypeFilter;\n    const infrastructureFilter = filters.get(Filters.infrastructure) as InfrastructureFilter;\n    const safetyFilter = filters.get(Filters.safety) as SafetyFilter;\n    const positionFilter = filters.get(Filters.position) as PositionFilter;\n    const accreditationFilter = filters.get(Filters.accreditation) as AccreditationFilter;\n    const newBuildingDealFilter = filters.get(Filters.newBuildingDeal) as NewBuildingDealFilter;\n    const paymentTypeFilter = filters.get(Filters.paymentType) as PaymentTypeFilter;\n    const livingTenantOptionFilter = filters.get(Filters.livingTenantOptions) as LivingTenantOptionFilter;\n    const rentConditionsFilter = filters.get(Filters.rentConditions) as RentConditionsFilter;\n    const furnitureFilter = filters.get(Filters.furniture) as FurnitureFilter;\n    const mapBoundsFilter = filters.get(Filters.mapBounds) as MapBoundsFilter;\n    const sellTypeFilter = filters.get(Filters.sellType) as SellTypeFilter;\n    const buildingsFilter = filters.get(Filters.buildings) as BuildingsFilter;\n    const authorFilter = filters.get(Filters.author) as AuthorFilter;\n    const livingFacilityFilter = filters.get(Filters.livingFacility) as LivingFacilityFilter;\n    const flatsSpecialEventsFilter = filters.get(Filters.flatsSpecialEvents) as FlatsSpecialEventsFilter;\n    const otherSpecialEventsFilter = filters.get(Filters.otherSpecialEvents) as OtherSpecialEventsFilter;\n    const miscSpecialEventsFilter = filters.get(Filters.miscSpecialEvents) as MiscSpecialEventsFilter;\n    const buildEpochFilter = filters.get(Filters.buildEpoch) as BuildEpochFilter;\n    const finishingFilter = filters.get(Filters.finishingType) as FinishingFilter;\n\n    const tipsCollection: TipItem[] = [];\n\n    for (const key of getExtraFilterIds(filters)) {\n        if (\n            key === Filters.timeLimit ||\n            ! filterKeys.includes(key as any)\n        ) {\n            continue;\n        }\n\n        const filter = filters.get(key);\n\n        if (! filter || filter.isDefault()) {\n            continue;\n        }\n\n        const realtyTypeFilter = filters.get(Filters.categoryType) as CategoryTypeFilter;\n        const dealTypeFilter = filters.get(Filters.dealType) as DealTypeFilter;\n\n        switch (key) {\n            case Filters.floorsTotal: {\n                const title = getFloorsTotalTip(filter as FloorsTotalFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        id: Filters.floorsTotal,\n                        title\n                    });\n                }\n                break;\n            }\n            case Filters.rooms: {\n                const title = getRoomsTips(filter as RoomFilter, realtyTypeFilter);\n\n                const isRoomOrHome = (\n                    realtyTypeFilter.categoryType === RealtyObjectType.ROOM ||\n                    realtyTypeFilter.categoryType === RealtyObjectType.HOUSE\n                );\n\n                if (title !== null && isRoomOrHome) {\n                    tipsCollection.push({\n                        id: Filters.rooms,\n                        title\n                    });\n                }\n\n                break;\n            }\n            case Filters.roomsInOffer: {\n                const roomsInOfferFilter = filters.get(Filters.roomsInOffer) as RoomsInOfferFilter;\n\n                const title = getRoomsInOfferTips(roomsInOfferFilter, dealTypeFilter);\n\n                if (title !== null && realtyTypeFilter.categoryType === RealtyObjectType.ROOM) {\n                    tipsCollection.push({\n                        id: Filters.roomsInOffer,\n                        title\n                    });\n                }\n\n                break;\n            }\n            case Filters.landStatus: {\n                const title = getLandStatusTips(filter as LandStatusFilter);\n                const isHome = realtyTypeFilter.categoryType === RealtyObjectType.HOUSE;\n\n                if (title !== null && isHome) {\n                    tipsCollection.push({\n                        id: Filters.landStatus,\n                        title\n                    });\n                }\n                break;\n            }\n            case Filters.landArea: {\n                const title = getLandAreaLabelTip(filter as LandAreaFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        id: Filters.landArea,\n                        title\n                    });\n                }\n                break;\n            }\n            case Filters.supplyOptions: {\n                const title = getSupplyOptionsTip(filter as SupplyOptionsFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        id: Filters.supplyOptions,\n                        title\n                    });\n                }\n                break;\n            }\n            case Filters.houseArea: {\n                const title = getHouseAreaLabelTip(filter as HouseAreaFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        title,\n                        id: Filters.houseArea,\n                        kind: Filters.houseArea\n                    });\n                }\n                break;\n            }\n            case Filters.bathroomLocation: {\n                const title = getBathroomLocationTip(filter as BathroomLocationFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        id: Filters.bathroomLocation,\n                        title\n                    });\n                }\n                break;\n            }\n\n            case Filters.heating: {\n                const title = getHeatingTip(filter as HeatingFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        id: Filters.heating,\n                        title\n                    });\n                }\n                break;\n            }\n\n            case Filters.mapBounds: {\n                let titleMapFilter = '';\n\n                if (mapBoundsFilter.hasPolygon()) titleMapFilter = 'Выделенная область';\n                if (mapBoundsFilter.bounds) titleMapFilter = 'Видимая область';\n                if (mapBoundsFilter.geohash) titleMapFilter = 'Область на карте';\n\n                tipsCollection.push({\n                    id: Filters.mapBounds,\n                    title: titleMapFilter\n                });\n                break;\n            }\n\n            case Filters.rentPrepayment: {\n                const title = getPrepaymentTip(filter as RentPrepaymentFilter);\n\n                if (title !== null) {\n                    tipsCollection.push({\n                        id: Filters.rentPrepayment,\n                        title\n                    });\n                }\n                break;\n            }\n\n            case Filters.rentConditions: {\n                const options = getRentConditionsTip(filter as RentConditionsFilter);\n\n                options.forEach(option => {\n                    tipsCollection.push(option);\n                });\n\n                break;\n            }\n\n            case Filters.furniture: {\n                const options = getFurnitureTip(filter as FurnitureFilter);\n\n                options.forEach(option => {\n                    tipsCollection.push(option);\n                });\n\n                break;\n            }\n\n            case Filters.finishingType: {\n                const options = getFinishingTip(filter as FinishingFilter);\n\n                options.forEach(option => {\n                    tipsCollection.push(option);\n                });\n\n                break;\n            }\n\n            case Filters.commissioning: {\n                const tip = getCommissioningTip(filter as CommissioningFilter);\n\n                if (tip) {\n                    tipsCollection.push(tip);\n                }\n\n                break;\n            }\n\n            case Filters.livingTenantOptions: {\n                const options = getLivingTenantOptionsTip(filter as LivingTenantOptionFilter);\n\n                options.forEach(option => {\n                    tipsCollection.push(option);\n                });\n\n                break;\n            }\n\n            case Filters.author:\n                for (const author of authorFilter.author) {\n                    tipsCollection.push({\n                        kind: Filters.author,\n                        type: author,\n                        id: Filters.author + String(author) as Id,\n                        title: authorLabels[author]\n                    });\n                }\n\n                break;\n            case Filters.floor:\n                let floorLabel = serializeToTips(filter.id, filter);\n\n                if (floorLabel) {\n                    const re = new RegExp(/^,/gm);\n\n                    floorLabel = re.test(floorLabel) ?\n                        floorLabel.toLowerCase().replace(re, 'Этаж: ') :\n                        floorLabel.substr(0, 1) + floorLabel.substr(1).toLowerCase();\n\n                    tipsCollection.push({\n                        id: Filters.floor,\n                        title: floorLabel\n                    } as TipItem);\n                }\n\n                break;\n            case Filters.transportLimit:\n                const transportTypeLabel = serializeToTips(\n                    Filters.transportLimit,\n                    filters.get(Filters.transportLimit)\n                );\n\n                if (transportTypeLabel) {\n                    tipsCollection.push({\n                        id: Filters.transportLimit,\n                        title: transportTypeLabel\n                    });\n                }\n\n                break;\n            case Filters.livingFacility:\n                const facilities = livingFacilityFilter.facilities;\n\n                for (const facility of facilities) {\n                    const tip = getLivingFacilityTip(facility);\n\n                    if (tip) {\n                        tipsCollection.push({\n                            id: Filters.livingFacility,\n                            title: tip,\n                            type: facility,\n                            kind: Filters.livingFacility\n                        });\n                    }\n                }\n\n                break;\n            case Filters.geo:\n                const geoFilter = filters.get(Filters.geo) as GeoFilter;\n                const newBuildings = queryDisplayValues?.newBuildings || {};\n\n                for (const id of geoFilter.newBuildingIds) {\n                    tipsCollection.push({\n                        id: 'geo',\n                        kind: 'newBuilding',\n                        title: newBuildings[id] ?\n                            newBuildings[id]?.title :\n                            'Жилой комплекс',\n                        geoId: id\n                    });\n                }\n\n                [ ...new Set(geoFilter.addressIds) ].forEach(id => {\n                    const geoObject = geoStore?.addresses.get(id);\n\n                    if (geoObject) {\n                        const geoName =\n                            geoObject.displayName ||\n                            geoObject.mainName;\n\n                        tipsCollection.push({\n                            id: 'geo',\n                            kind: geoObject.kind,\n                            title: geoName,\n                            geoId: geoObject.id\n                        });\n                    } else if (queryDisplayValues?.addresses && queryDisplayValues?.addresses[id]) { // Поддержка двойственного поведения на сервисе\n                        const addressObj = queryDisplayValues?.addresses[id];\n\n                        tipsCollection.push({\n                            id: 'geo',\n                            kind: GeoKind.STREET,\n                            title: addressObj && addressObj.title ? addressObj.title : 'Улица',\n                            geoId: id\n                        });\n                    }\n                });\n\n                const idsSet = new Set(geoFilter.districtIds);\n                const districtsGeo = geoStore?.districts.items;\n                const districtGroups = districtsGeo ?\n                    groupDistricts({\n                        districts: districtsGeo.filter(item => item.id !== 390),\n                        regionId: (filters.get(Filters.region) as RegionFilter).region\n                    }).filter(group => group.items.every(item => idsSet.has(Number(item.id)))) :\n                    [];\n\n                for (const group of districtGroups) {\n                    const districts: TipItemBase[] = [];\n\n                    for (const item of group.items) {\n                        const numberedId = Number(item.id);\n\n                        districts.push({ id: numberedId });\n                        idsSet.delete(numberedId);\n                    }\n                    tipsCollection.push({\n                        id: `group-${group.title}`,\n                        kind: 'district-group',\n                        title: group.title,\n                        districts\n                    });\n                }\n\n                for (const id of Array.from(idsSet)) {\n                    const geo = geoStore?.districts.get(id) ?? queryDisplayValues?.addresses?.[id];\n                    let geoTitle = geo?.title ?? '';\n\n                    // округ у Королёва оставляем, чтобы отличать от города Королёв в типсах\n                    if (geoTitle.includes('Королёв') && geo?.kind === GeoKind.DISTRICT) geoTitle = geoTitle.trim();\n                    else geoTitle = geoTitle.replace('городской округ', '').trim();\n\n                    if (geo) {\n                        tipsCollection.push({\n                            id: 'geo',\n                            kind: geo.kind,\n                            title: geoTitle,\n                            geoId: geo.id\n                        });\n                    } else if (queryDisplayValues?.districts && queryDisplayValues?.districts[id]) {\n                        const districtObj = queryDisplayValues?.districts[id];\n\n                        tipsCollection.push({\n                            id: 'geo',\n                            kind: GeoKind.DISTRICT,\n                            title: districtObj && districtObj.title ? districtObj.title : 'Район',\n                            geoId: id\n                        });\n                    }\n                }\n\n                const groupsAndStations = geoStore?.stations\n                    .findRouteByStations([ ...new Set((filter as GeoFilter).metroIds) ]);\n\n                if (groupsAndStations) {\n                    const { groups, stations } = groupsAndStations;\n\n                    if (shouldIgnoreGeoIds) {\n                        for (const station of stations ?? []) {\n                            tipsCollection.push(station);\n                        }\n                    }\n\n                    if (groups.length) {\n                        for (const group of groups) {\n                            tipsCollection.push({\n                                id: group.route.id,\n                                kind: group.route.kind,\n                                title: group.route.title,\n                                stations: group.stations\n                            });\n                        }\n\n                        if (! shouldIgnoreGeoIds) {\n                            for (const station of stations ?? []) {\n                                tipsCollection.push(station);\n                            }\n                        }\n                    } else {\n                        const geoTips = geoStore?.getByIds([ ...geoFilter.geoIds ]) as unknown as TipItem[];\n\n                        for (const geoTip of geoTips) {\n                            if (\n                                geoTip.kind === GeoKind.METRO ||\n                                geoTip.kind === 'METRO'\n                            ) {\n                                tipsCollection.push(geoTip);\n                            }\n                        }\n                    }\n                }\n\n                break;\n            case Filters.bathroom:\n                for (const bathroomType of bathroomFilter.value) {\n                    tipsCollection.push({\n                        kind: Filters.bathroom,\n                        type: bathroomType,\n                        id: Filters.bathroom + String(bathroomType) as Id,\n                        title: bathroomLabels[bathroomType]\n                    });\n                }\n\n                break;\n            case Filters.sellType:\n                for (const sellType of sellTypeFilter.sellType) {\n                    tipsCollection.push({\n                        kind: Filters.sellType,\n                        type: sellType,\n                        id: Filters.sellType + String(sellType) as Id,\n                        title: saleTypeLabels[sellType]\n                    });\n                }\n\n                break;\n            case Filters.balcony:\n                if (balconyFilter.hasBalcony) {\n                    tipsCollection.push({\n                        kind: Filters.balcony,\n                        type: balconyFilter.hasBalcony,\n                        id: Filters.balcony + String(balconyFilter.hasBalcony) as Id,\n                        title: balconyLabels[balconyFilter.hasBalcony]\n                    });\n                }\n\n                break;\n            case Filters.buildEpoch:\n                for (const buildEpoch of buildEpochFilter.buildEpoch) {\n                    tipsCollection.push({\n                        kind: Filters.buildEpoch,\n                        type: buildEpoch,\n                        id: Filters.buildEpoch + String(buildEpoch) as Id,\n                        title: buildEpochLabels[buildEpoch]\n                    });\n                }\n\n                break;\n            case Filters.renovation:\n                for (const renovationType of renovationFilter.value) {\n                    tipsCollection.push({\n                        kind: Filters.renovation,\n                        type: renovationType,\n                        id: Filters.renovation + String(renovationType) as Id,\n                        title: renovationLabels[renovationType]\n                    });\n                }\n\n                break;\n            case Filters.developer:\n                const { developerId } = developerFilter;\n\n                if (developerId) {\n                    const developers = queryDisplayValues?.developers || {};\n\n                    tipsCollection.push({\n                        kind: Filters.developer,\n                        id: Filters.developer + String(developerId) as Id,\n                        title: developers[developerId] ?\n                            `Застройщик ${developers[developerId].title}` :\n                            'Застройщик'\n                    });\n                }\n\n                break;\n            case Filters.buildingClass:\n                for (const buildingClass of buildingClassFilter.buildingClass) {\n                    tipsCollection.push({\n                        kind: Filters.buildingClass,\n                        type: buildingClass,\n                        id: Filters.buildingClass + String(buildingClass) as Id,\n                        title: buildingClassLabels[buildingClass]\n                    });\n                }\n\n                break;\n            case Filters.parkings:\n                for (const parking of parkingFilter.parkings) {\n                    tipsCollection.push({\n                        kind: Filters.parkings,\n                        type: parking,\n                        id: Filters.parkings + String(parking) as Id,\n                        title: parkingLabels[parking]\n                    });\n                }\n\n                break;\n            case Filters.walls:\n                for (const walls of wallsTypeFilter.walls) {\n                    tipsCollection.push({\n                        kind: Filters.walls,\n                        type: walls,\n                        id: Filters.walls + String(walls) as Id,\n                        title: `Материал стен: ${wallsLabels[walls]}`\n                    });\n                }\n\n                break;\n            case Filters.infrastructure:\n                for (const infrastructure of infrastructureFilter.infrastructure) {\n                    tipsCollection.push({\n                        kind: Filters.infrastructure,\n                        type: infrastructure,\n                        id: Filters.infrastructure + String(infrastructure) as Id,\n                        title: infrastructureLabels[infrastructure]\n                    });\n                }\n\n                if (infrastructureFilter.hasLift) {\n                    tipsCollection.push({\n                        kind: Filters.infrastructure,\n                        id: 'hasLift' as Id,\n                        title: 'Лифт'\n                    });\n                }\n\n                break;\n            case Filters.safety:\n                for (const safety of safetyFilter.safety) {\n                    tipsCollection.push({\n                        kind: Filters.safety,\n                        type: safety,\n                        id: Filters.safety + String(safety) as Id,\n                        title: safetyLabels[safety]\n                    });\n                }\n\n                break;\n            case Filters.position:\n                for (const position of positionFilter.position) {\n                    tipsCollection.push({\n                        kind: Filters.position,\n                        type: position,\n                        id: Filters.position + String(positionFilter) as Id,\n                        title: positionLabels[position]\n                    });\n                }\n\n                break;\n            case Filters.accreditation:\n                for (const accreditation of accreditationFilter.accreditation) {\n                    tipsCollection.push({\n                        kind: Filters.accreditation,\n                        type: accreditation,\n                        id: Filters.accreditation + String(accreditation) as Id,\n                        title: accreditationLabels[accreditation]\n                    });\n                }\n\n                break;\n            case Filters.newBuildingDeal:\n                for (const deal of newBuildingDealFilter.deal) {\n                    tipsCollection.push({\n                        kind: Filters.newBuildingDeal,\n                        type: deal,\n                        id: Filters.newBuildingDeal + String(deal) as Id,\n                        title: newBuildingDealLabels[deal]\n                    });\n                }\n\n                break;\n            case Filters.paymentType:\n                for (const type of paymentTypeFilter.type) {\n                    tipsCollection.push({\n                        kind: Filters.paymentType,\n                        type,\n                        id: Filters.paymentType + String(type) as Id,\n                        title: paymentTypeLabels[type]\n                    });\n                }\n\n                break;\n            case Filters.closedSales: {\n                const label = serializeToTips(filter.id, filter);\n\n                tipsCollection.push({\n                    kind: Filters.closedSales,\n                    type: closedSalesFilter.includingClosedSales,\n                    id: Filters.closedSales,\n                    title: label\n                });\n            }\n\n                break;\n            case Filters.buildings:\n                const { buildings: buildingIds } = buildingsFilter;\n\n                if (buildingIds.length) {\n                    const buildings = queryDisplayValues?.buildings || {};\n\n                    for (const buildingId of buildingIds) {\n                        tipsCollection.push({\n                            kind: Filters.buildings,\n                            type: buildingId,\n                            id: `${Filters.buildings}${buildingId}` as Id,\n                            title: buildings[buildingId]?.title || 'Корпус'\n                        });\n                    }\n                }\n\n                break;\n            case Filters.windowsDirection: {\n                if ((filter as WindowsDirectionFilter).value.length) {\n                    const title = getWindowsDirectionLabel(filter as WindowsDirectionFilter);\n\n                    tipsCollection.push({\n                        title,\n                        id: Filters.windowsDirection\n                    });\n                }\n\n                break;\n            }\n            case Filters.flatsSpecialEvents:\n                for (const value of flatsSpecialEventsFilter.value) {\n                    tipsCollection.push({\n                        kind: Filters.flatsSpecialEvents,\n                        type: value,\n                        id: Filters.flatsSpecialEvents + String(value) as Id,\n                        title: `Квартиры: ${flatsSpecialEventsLabels[value]}`\n                    });\n                }\n\n                break;\n            case Filters.otherSpecialEvents:\n                for (const value of otherSpecialEventsFilter.value) {\n                    tipsCollection.push({\n                        kind: Filters.otherSpecialEvents,\n                        type: value,\n                        id: Filters.otherSpecialEvents + String(value) as Id,\n                        title: `Паркинг, кладовки: ${otherSpecialEventsLabels[value]}`\n                    });\n                }\n\n                break;\n            case Filters.miscSpecialEvents:\n                for (const value of miscSpecialEventsFilter.value) {\n                    tipsCollection.push({\n                        kind: Filters.miscSpecialEvents,\n                        type: value,\n                        id: Filters.miscSpecialEvents + String(value) as Id,\n                        title: miscSpecialEventsLabels[value]\n                    });\n                }\n\n                break;\n            default:\n                const label = serializeToTips(filter.id, filter);\n\n                if (label) {\n                    tipsCollection.push({\n                        id: key,\n                        kind: key,\n                        title: label\n                    } as TipItem);\n                }\n        }\n    }\n\n    return {\n        tipsCollection,\n        bathroomFilter,\n        renovationFilter,\n        buildingClassFilter,\n        parkingFilter,\n        wallsTypeFilter,\n        infrastructureFilter,\n        safetyFilter,\n        positionFilter,\n        accreditationFilter,\n        newBuildingDealFilter,\n        paymentTypeFilter,\n        livingTenantOptionFilter,\n        rentConditionsFilter,\n        furnitureFilter,\n        sellTypeFilter,\n        buildingsFilter,\n        authorFilter,\n        livingFacilityFilter,\n        flatsSpecialEventsFilter,\n        otherSpecialEventsFilter,\n        miscSpecialEventsFilter,\n        buildEpochFilter,\n        finishingFilter\n    };\n}\n\nexport const OffersSearchTips = ({\n    reset,\n    loading,\n    filters,\n    updateFilter,\n    removeFilter,\n    expandFilter,\n    removeGeo,\n    customFilterBehavior,\n    onUpdateLength = () => {},\n    onWhiteBackground = true,\n    classNamesNewFilters,\n    tipsExpanded,\n    openMortgagePaymentSearchModal,\n    ...props\n}: IProps) => {\n    const [ tipsIndex, setTipsIndex ] = useState(0);\n    const [ expandButton, setExpandButton ] = useState(false);\n    const [ expandTipsMode, setExpandTipsMode ] = useState(false);\n    const {\n        tipsCollection,\n        bathroomFilter,\n        renovationFilter,\n        buildingClassFilter,\n        parkingFilter,\n        wallsTypeFilter,\n        infrastructureFilter,\n        safetyFilter,\n        positionFilter,\n        accreditationFilter,\n        newBuildingDealFilter,\n        paymentTypeFilter,\n        livingTenantOptionFilter,\n        rentConditionsFilter,\n        furnitureFilter,\n        sellTypeFilter,\n        buildingsFilter,\n        authorFilter,\n        livingFacilityFilter,\n        flatsSpecialEventsFilter,\n        otherSpecialEventsFilter,\n        miscSpecialEventsFilter,\n        buildEpochFilter,\n        finishingFilter\n    } = props.tips ?? getTipsCollection({\n        shouldIgnoreGeoIds: props.shouldIgnoreGeoIds,\n        geoStore: props.geoStore,\n        filters,\n        queryDisplayValues: props.queryDisplayValues\n    });\n\n    const handleRemoveTip = (tip: TipItem) => {\n        if (tip.id === 'geo') {\n            removeGeo?.([ tip ]);\n\n            return;\n        }\n\n        switch (tip.kind) {\n            case GeoKind.ROUTE:\n                removeGeo?.(tip.stations);\n\n                break;\n            case GeoKind.METRO:\n                removeGeo?.([ tip ]);\n\n                break;\n\n            case 'district-group':\n                removeGeo?.(tip.districts);\n                break;\n\n            case GeoKind.DISTRICT:\n                removeGeo?.([ tip ]);\n\n                break;\n\n            case Filters.livingFacility:\n                const { facilities: livingFacilities } = livingFacilityFilter;\n\n                const index = livingFacilities.indexOf(tip.type);\n\n                if (index > -1) {\n                    livingFacilities.splice(index, 1);\n                }\n\n                updateFilter(\n                    new LivingFacilityFilter(livingFacilities)\n                );\n                break;\n            case Filters.rooms:\n                updateFilter(\n                    new RoomFilter()\n                );\n                break;\n            case Filters.roomsInOffer:\n                updateFilter(\n                    new RoomsInOfferFilter()\n                );\n                break;\n            case Filters.landStatus:\n                updateFilter(\n                    new LandStatusFilter()\n                );\n                break;\n            case Filters.landArea:\n                updateFilter(\n                    new LandAreaFilter()\n                );\n                break;\n            case Filters.supplyOptions:\n                updateFilter(\n                    new SupplyOptionsFilter()\n                );\n                break;\n            case Filters.houseArea:\n                updateFilter(\n                    new HouseAreaFilter()\n                );\n                break;\n            case Filters.bathroomLocation:\n                updateFilter(\n                    new BathroomLocationFilter()\n                );\n                break;\n            case Filters.heating:\n                updateFilter(\n                    new HeatingFilter()\n                );\n                break;\n            case Filters.bathroom:\n                updateFilter(\n                    new BathroomFilter(bathroomFilter.value.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.sellType:\n                updateFilter(\n                    new SellTypeFilter(sellTypeFilter.sellType.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.author:\n                updateFilter(new AuthorFilter(authorFilter.author.filter(item => item !== tip.type)));\n\n                break;\n\n            case Filters.buildEpoch:\n                updateFilter(new BuildEpochFilter(buildEpochFilter.buildEpoch?.filter(item => item !== tip.type)) ?? []);\n\n                break;\n\n            case Filters.balcony:\n                updateFilter(new BalconyFilter());\n\n                break;\n            case Filters.livingTenantOptions:\n                updateFilter(\n                    new LivingTenantOptionFilter(\n                        livingTenantOptionFilter.livingTenantOptions\n                            .filter(item => item !== tip.type)\n                    )\n                );\n\n                break;\n            case Filters.rentConditions: {\n                // eslint-disable-next-line max-len\n                const utilitiesIncluded = tip.type === 'utilitiesIncluded' ? false : rentConditionsFilter.utilitiesIncluded;\n                const depositType = tip.type === 'depositType' ? DepositType.UNKNOWN : rentConditionsFilter.depositType;\n                // eslint-disable-next-line max-len\n                const commisionType = tip.type === 'commisionType' ? CommissionType.UNKNOWN : rentConditionsFilter.commisionType;\n\n                updateFilter(\n                    new RentConditionsFilter(\n                        utilitiesIncluded,\n                        depositType,\n                        commisionType\n                    )\n                );\n\n                break;\n            }\n\n            case Filters.furniture: {\n                updateFilter(\n                    new FurnitureFilter(\n                        furnitureFilter.furnitures.filter(item => item !== tip.type)\n                    )\n                );\n                break;\n            }\n\n            case Filters.finishingType: {\n                updateFilter(\n                    new FinishingFilter(\n                        finishingFilter.finishingType.filter(item => item !== tip.type)\n                    )\n                );\n                break;\n            }\n\n            case Filters.commissioning: {\n                updateFilter(new CommissioningFilter(Commissioning.UNKNOWN));\n                break;\n            }\n\n            case Filters.renovation:\n                updateFilter(\n                    new RenovationFilter(renovationFilter.value.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.developer:\n                if (customFilterBehavior && customFilterBehavior.developer) {\n                    customFilterBehavior.developer.reset();\n                } else {\n                    updateFilter(new DeveloperFilter());\n                }\n\n                break;\n            case Filters.buildingClass:\n                updateFilter(\n                    new BuildingClassFilter(buildingClassFilter.buildingClass.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.parkings:\n                updateFilter(\n                    new ParkingFilter(parkingFilter.parkings.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.walls:\n                updateFilter(\n                    new WallsTypeFilter(wallsTypeFilter.walls.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.infrastructure: {\n                const newFilter = tip?.id === Filters.hasLift ?\n                    new InfrastructureFilter(infrastructureFilter.infrastructure) :\n                    new InfrastructureFilter(infrastructureFilter.infrastructure.filter(item => item !== tip.type), infrastructureFilter.hasLift);\n\n                updateFilter(newFilter);\n\n                break;\n            }\n            case Filters.safety:\n                updateFilter(\n                    new SafetyFilter(safetyFilter.safety.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.position:\n                updateFilter(\n                    new PositionFilter(positionFilter.position.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.accreditation:\n                updateFilter(\n                    new AccreditationFilter(accreditationFilter.accreditation.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.newBuildingDeal:\n                updateFilter(\n                    new NewBuildingDealFilter(newBuildingDealFilter.deal.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.paymentType:\n                updateFilter(\n                    new PaymentTypeFilter(paymentTypeFilter.type.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.closedSales:\n                updateFilter(\n                    new ClosedSalesFilter()\n                );\n\n                break;\n            case Filters.buildings: {\n                updateFilter(\n                    new BuildingsFilter(\n                        buildingsFilter.buildings.filter(item => item !== tip.type)\n                    )\n                );\n\n                break;\n            }\n            case Filters.flatsSpecialEvents:\n                updateFilter(\n                    new FlatsSpecialEventsFilter(flatsSpecialEventsFilter.value.filter(item => item !== tip.type))\n                );\n\n                break;\n            case Filters.otherSpecialEvents: {\n                updateFilter(\n                    new OtherSpecialEventsFilter(otherSpecialEventsFilter.value.filter(item => item !== tip.type))\n                );\n\n                break;\n            }\n            case Filters.miscSpecialEvents: {\n                updateFilter(\n                    new MiscSpecialEventsFilter(miscSpecialEventsFilter.value.filter(item => item !== tip.type))\n                );\n\n                break;\n            }\n            default:\n                removeFilter(filters.get(Filters[tip.id]));\n        }\n    };\n    const expandTipsToggle = () => {\n        setExpandTipsMode(prev => ! prev);\n    };\n    const getTipsIndexInfo = () => {\n        const container = document.getElementsByClassName(TIP_CLASS); // eslint-disable-line\n        const result = {\n            index: 0,\n            size: container.length,\n            state: false,\n            line: 0,\n            arr: []\n        };\n        let position = 0;\n\n        for (let i = 0; i < container.length; i++) {\n            const x: number = container[i].getBoundingClientRect().left;\n\n            if (x < position) {\n                result.index = i;\n                result.state = true;\n                break;\n            }\n            result.line++;\n            position = x;\n        }\n\n        return result;\n    };\n\n    useEffect(() => {\n        const info = getTipsIndexInfo();\n\n        setTipsIndex(info.line);\n        if (info.state) {\n            setExpandButton(true);\n        } else {\n            setExpandButton(false);\n            setExpandTipsMode(false);\n        }\n\n        const value = tipsCollection.length - tipsIndex;\n\n        if (value < 0) {\n            setExpandTipsMode(false);\n        }\n    }, [ tipsCollection, expandButton, tipsIndex ]);\n\n    useEffect(() => {\n        if (tipsExpanded === false) setExpandTipsMode(false);\n    }, [ tipsExpanded ]);\n\n    useEffect(() => {\n        onUpdateLength(tipsCollection.length);\n    }, [ tipsCollection.length, onUpdateLength ]);\n\n    useEffect(() => {\n        expandFilter && expandFilter(expandTipsMode);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ expandTipsMode ]);\n\n    return (\n        <Fragment>\n            {\n                (expandTipsMode) ? (\n                    <div className={cn('all-tips', undefined, classNamesNewFilters?.allTips)}>\n                        <FiltersFormTips>\n                            {\n                                tipsCollection.map((tip, index) => (<Tip\n                                    enabled={! loading}\n                                    key={index + '_' + tip.id}\n                                    tip={tip}\n                                    removeTip={handleRemoveTip}\n                                    onWhiteBackground={onWhiteBackground}\n                                    openMortgagePaymentSearchModal={openMortgagePaymentSearchModal}\n                                />))\n                            }\n                        </FiltersFormTips>\n                    </div>\n                ) : null\n            }\n            {\n                (! expandTipsMode) ? (\n                    <div className={cn('first-line-tips-only', undefined, classNamesNewFilters?.firstLineTipsOnly)}>\n                        <FiltersFormTips>\n                            {\n                                tipsCollection.map((tip, index) => (<Tip\n                                    enabled={! loading}\n                                    key={index + '_' + tip.id}\n                                    tip={tip}\n                                    removeTip={handleRemoveTip}\n                                    onWhiteBackground={onWhiteBackground}\n                                    openMortgagePaymentSearchModal={openMortgagePaymentSearchModal}\n                                />))\n                            }\n                        </FiltersFormTips>\n                    </div>\n                ) : null\n            }\n            <div\n                className={cn('tipButtons', undefined, classNamesNewFilters?.tipsButtons)}\n                data-test='filter-tipButtons'\n            >\n                {\n                    reset && tipsCollection.length >= MIN_TIPS_COUNT ? (\n                        <TipButton\n                            onClick={reset}\n                            className={cn('resetTipButton', { hiddenExpandButton: ! expandButton })}\n                            type='discard'\n                            onWhiteBackground={onWhiteBackground}\n                        >\n                            <Typography\n                                variant='secondary-alone'\n                                className={cn('resetButton')}\n                            >\n                                Сбросить\n                            </Typography>\n                        </TipButton>\n                    ) : null\n                }\n                {\n                    expandButton ? (\n                        <TipButton\n                            onClick={expandTipsToggle}\n                            type='expand'\n                            onWhiteBackground={onWhiteBackground}\n                        >\n                            <Typography\n                                variant='secondary-alone'\n                                className={cnButton('more')}\n                            >\n                                {`Ещё ${\n                                    tipsCollection.length - tipsIndex > 0 ?\n                                        tipsCollection.length - tipsIndex :\n                                        ''\n                                } `}\n                                <Icon\n                                    name={expandTipsMode ? 'chevron-up' : 'chevron-down'}\n                                    size='s'\n                                />\n                            </Typography>\n                        </TipButton>\n                    ) : null\n                }\n            </div>\n        </Fragment>\n    );\n};\n\nfunction TipButton({\n    onClick,\n    children,\n    type,\n    onWhiteBackground: onWhite,\n    className\n}: {\n    onClick: () => void;\n    children: React.ReactChild;\n    type: string;\n    onWhiteBackground: boolean;\n    className?: string;\n}) {\n    return (\n        <button\n            className={cnButton(type, { onWhite }, className)}\n            onClick={onClick}\n        >\n            {children}\n        </button>\n    );\n}\n","import {\n    FloorConstraints,\n    TimeLimit,\n    TransportType as TransportTypeEnum,\n    BalconyOptions as BalconyOptionsEnum,\n    Bathroom as BathroomEnum,\n    Renovation as RenovationEnum,\n    CeilingHeight as CeilingHeightEnum\n} from '@search/filter-enums/enums';\n\nimport {\n    BuildingClass,\n    ParkingType,\n    IsApartmentsOptions,\n    WallsType,\n    InfrastructureOptions,\n    Safety,\n    NewBuildingDeal,\n    PaymentType,\n    Accreditation,\n    Position,\n    SellType,\n    AuthorTypeOptionsWithRealtor,\n    FlatsSpecialEvent,\n    OtherSpecialEvent,\n    MiscSpecialEvent,\n    BuildEpoch\n} from '@search/filter-enums/enums';\n\nexport const ceilingHeightLabels: Record<CeilingHeightEnum, string | null> = {\n    [CeilingHeightEnum.UNKNOWN]: null,\n    [CeilingHeightEnum.FROM_2_5]: 'Высота потолков от 2,5 м',\n    [CeilingHeightEnum.FROM_2_7]: 'Высота потолков от 2,7 м',\n    [CeilingHeightEnum.FROM_3]: 'Высота потолков от 3 м',\n    [CeilingHeightEnum.FROM_4]: 'Высота потолков от 4 м'\n};\n\nexport const renovationLabels: Record<RenovationEnum, string | null> = {\n    [RenovationEnum.UNKNOWN]: null,\n    [RenovationEnum.EURO]: 'Евроремонт',\n    [RenovationEnum.COSMETIC]: 'Косметический ремонт',\n    [RenovationEnum.DESIGNED]: 'Дизайнерский ремонт',\n    [RenovationEnum.NEED]: 'Нужен ремонт',\n    [RenovationEnum.NONE]: 'Без ремонта'\n};\n\nexport const bathroomLabels: Record<BathroomEnum, string | null> = {\n    [BathroomEnum.UNKNOWN]: null,\n    [BathroomEnum.COMBINED]: 'Совмещённый санузел',\n    [BathroomEnum.PARTED]: 'Раздельный санузел',\n    [BathroomEnum.SEVERAL]: 'Несколько санузлов'\n};\n\nexport const balconyLabels: Record<BalconyOptionsEnum, string | null> = {\n    [BalconyOptionsEnum.UNKNOWN]: null,\n    [BalconyOptionsEnum.HAS_ANY]: 'Балкон/Лоджия'\n};\n\nexport const floorConstraintsLabels: Record<FloorConstraints, string | null> = {\n    [FloorConstraints.UNKNOWN]: null,\n    [FloorConstraints.ONLY]: 'Только',\n    [FloorConstraints.EXCLUDE]: 'Не'\n};\n\nexport const timeLimitLabel: Record<TimeLimit, string | null> = {\n    [TimeLimit.UNKNOWN]: null,\n    [TimeLimit.MAX_5_MINUTES]: '5',\n    [TimeLimit.MAX_10_MINUTES]: '10',\n    [TimeLimit.MAX_15_MINUTES]: '15',\n    [TimeLimit.MAX_20_MINUTES]: '20',\n    [TimeLimit.MAX_25_MINUTES]: '25',\n    [TimeLimit.MAX_30_MINUTES]: '30',\n    [TimeLimit.MAX_40_MINUTES]: '40',\n    [TimeLimit.MAX_50_MINUTES]: '50',\n    [TimeLimit.MAX_60_MINUTES]: '60'\n};\n\nexport const transportTypeLabel: Record<TransportTypeEnum, string | null> = {\n    [TransportTypeEnum.UNKNOWN]: null,\n    [TransportTypeEnum.PUBLIC_TRANSPORT]: 'на\\u00A0транспорте',\n    [TransportTypeEnum.FOOT]: 'пешком'\n};\n\nexport const buildingClassLabels: Record<BuildingClass, string> = {\n    [BuildingClass.ECONOMY]: 'Эконом',\n    [BuildingClass.COMFORT]: 'Комфорт',\n    [BuildingClass.COMFORT_PLUS]: 'Комфорт+',\n    [BuildingClass.BUSINESS]: 'Бизнес',\n    [BuildingClass.ELITE]: 'Элитный'\n};\n\nexport const parkingLabels: Record<ParkingType, string | null> = {\n    [ParkingType.UNKNOWN]: null,\n    [ParkingType.CLOSED]: 'Закрытая парковка',\n    [ParkingType.UNDERGROUND]: 'Подземная парковка',\n    [ParkingType.OPEN]: 'Открытая парковка'\n};\n\nexport const wallsLabels: Record<WallsType, string | null> = {\n    [WallsType.UNKNOWN]: null,\n    [WallsType.MONOLITH]: 'монолит',\n    [WallsType.PANEL]: 'панель',\n    [WallsType.BRICK]: 'кирпич',\n    [WallsType.BRICK_MONOLITH]: 'кирпич-монолит',\n    [WallsType.BLOCK]: 'блок',\n    [WallsType.WOOD]: 'дерево'\n};\n\nexport const apartmentsLabels: Record<IsApartmentsOptions, string | null> = {\n    [IsApartmentsOptions.UNKNOWN]: null,\n    [IsApartmentsOptions.APARTMENTS_ONLY]: 'Апартаменты',\n    [IsApartmentsOptions.NO_APARTMENTS]: 'Без апартаментов'\n};\n\nexport const infrastructureLabels: Record<InfrastructureOptions, string | null> = {\n    [InfrastructureOptions.UNKNOWN]: null,\n    [InfrastructureOptions.CONCIERGE]: 'Консьерж',\n    [InfrastructureOptions.CLOSED_AREA]: 'Закрытая территория'\n};\n\nexport const safetyLabels: Record<Safety, string> = {\n    [Safety.CONCIERGE]: 'Консьерж',\n    [Safety.CLOSED_AREA]: 'Закрытая территория',\n    [Safety.GUARDED_AREA]: 'Охрана'\n};\n\nexport const positionLabels: Record<Position, string> = {\n    [Position.STANDALONE]: 'Одиночное здание'\n};\n\nexport const accreditationLabels: Record<Accreditation, string> = {\n    [Accreditation.ACCREDITED_BY_VTB]: 'Аккредитовано ВТБ'\n};\n\nexport const newBuildingDealLabels: Record<NewBuildingDeal, string> = {\n    [NewBuildingDeal.LAW_214]: '214 ФЗ',\n    [NewBuildingDeal.ESCROW]: 'Эскроу-счета'\n};\n\nexport const paymentTypeLabels: Record<PaymentType, string> = {\n    [PaymentType.ARMY_MORTGAGE]: 'Военная ипотека',\n    [PaymentType.INSTALLMENT]: 'Рассрочка',\n    [PaymentType.MOTHER_CAPITAL]: 'Материнский капитал'\n};\n\nexport const authorLabels = {\n    [AuthorTypeOptionsWithRealtor.UNKNOWN]: null,\n    [AuthorTypeOptionsWithRealtor.OWNER]: 'Собственник',\n    [AuthorTypeOptionsWithRealtor.DEVELOPER]: 'Застройщик',\n    [AuthorTypeOptionsWithRealtor.AGENCY]: 'Агентство',\n    [AuthorTypeOptionsWithRealtor.PARTNER]: 'Офф. Партнёр',\n    [AuthorTypeOptionsWithRealtor.REALTOR]: 'Мои объявления',\n    [AuthorTypeOptionsWithRealtor.PIT]: 'Имущественные торги'\n};\n\nexport const saleTypeLabels = {\n    [SellType.UNKNOWN]: null,\n    [SellType.SECONDARY]: 'Прямая продажа',\n    [SellType.ALTERNATIVE]: 'Альтернативная продажа',\n    [SellType.PRIMARY]: 'От застройщика',\n    [SellType.SECONDARY_PRIMARY]: 'Прямая продажа',\n    [SellType.PRIMARY_REASSIGNMENT]: 'Переуступка'\n};\n\nexport const flatsSpecialEventsLabels: Record<FlatsSpecialEvent, string> = {\n    [FlatsSpecialEvent.FLAT_DISCOUNT]: 'скидка',\n    [FlatsSpecialEvent.FLAT_INSTALLMENT_PLAN]: 'рассрочка',\n    [FlatsSpecialEvent.FLAT_SALES_START]: 'старт продаж'\n};\n\nexport const otherSpecialEventsLabels: Record<OtherSpecialEvent, string> = {\n    [OtherSpecialEvent.OTHER_DISCOUNT]: 'скидка',\n    [OtherSpecialEvent.OTHER_INSTALLMENT_PLAN]: 'рассрочка',\n    [OtherSpecialEvent.OTHER_SALES_START]: 'старт продаж'\n};\n\nexport const miscSpecialEventsLabels: Record<MiscSpecialEvent, string> = {\n    [MiscSpecialEvent.PROMO]: 'Акция',\n    [MiscSpecialEvent.GIFT]: 'Подарок'\n};\n\nexport const buildEpochLabels: Record<BuildEpoch, string | null> = {\n    [BuildEpoch.UNKNOWN]: null,\n    [BuildEpoch.STALIN]: 'Сталинка',\n    [BuildEpoch.BREZHNEV]: 'Брежневка',\n    [BuildEpoch.KHRUSHCHEV]: 'Хрущевка'\n};\n","import React, { useMemo } from 'react';\nimport { Typography } from '@vtblife/uikit';\n\nimport classname from '@search/classname/src';\n\nimport './styles.css';\n\nconst cnBreadcrumb = classname.bind(null, 'Breadcrumb');\n\nexport interface BreadcrumbSection {\n    /** Уникальный ключ */\n    key?: string;\n    /** Контент в отображении */\n    content: React.ReactNode;\n    /** Ссылка ведущая к секции */\n    href: string;\n    /** свойство target у тега a\n     * @default \"_self\"\n    */\n    target?: '_blank' | '_self' | '_parent' | '_top';\n    /** Активная секция\n     * @default \"false\"\n    */\n    active?: boolean;\n    /** Контент в отображении, может быть с иконками/смайлами */\n    contentSeo?: React.ReactNode;\n}\n\nexport default function Breadcrumb(\n    {\n        allClickable = false,\n        sections,\n        onClick,\n        regionModalSelect,\n        className: classNameProp,\n        withoutSeoMarkup = false\n    }: {\n        allClickable?: boolean;\n        regionModalSelect?: boolean;\n        sections: readonly BreadcrumbSection[];\n        onClick?(\n            event: React.MouseEvent<HTMLAnchorElement>,\n            href: string,\n            section: BreadcrumbSection\n        ): void;\n        className?: string;\n        withoutSeoMarkup?: boolean;\n    }\n) {\n    const schema = useMemo(() => {\n        return {\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            '@context': 'https://schema.org',\n            // eslint-disable-next-line @typescript-eslint/naming-convention\n            '@type': 'BreadcrumbList',\n            itemListElement: sections.map((section, idx) => ({\n                // eslint-disable-next-line @typescript-eslint/naming-convention\n                '@type': 'ListItem',\n                position: idx + 1,\n                item: {\n                    // eslint-disable-next-line @typescript-eslint/naming-convention\n                    '@id': section.href,\n                    name: section.contentSeo ?? section.content\n                }\n            }))\n        };\n    }, [ sections ]);\n\n    return (<>\n        <script\n            type='application/ld+json'\n            dangerouslySetInnerHTML={! withoutSeoMarkup ? {\n                /* eslint-disable-next-line @typescript-eslint/naming-convention */\n                __html: JSON.stringify(schema)\n            } : undefined}\n        />\n        <ol className={cnBreadcrumb(null, { regionModalSelect }, classNameProp)}>\n            {sections.map((section, index) => {\n                const isLastElement = allClickable ? false : index === sections.length - 1;\n                const {\n                    content: text,\n                    href,\n                    key = href ?? index,\n                    target = '_self'\n                } = section;\n\n                return (\n                    <React.Fragment key={key}>\n                        {index > 0 ?\n                            <li\n                                aria-hidden='true'\n                                className={cnBreadcrumb('section', { separator: true })}\n                            >\n                                {'›'}\n                            </li> :\n                            null\n                        }\n                        {isLastElement ? (\n                            <li\n                                className={cnBreadcrumb('section', { active: true })}\n                            >\n                                <span className={cnBreadcrumb('anchor', { active: true })}>\n                                    <Typography\n                                        variant='small'\n                                        className={cnBreadcrumb('text')}\n                                    >{text}</Typography>\n                                </span>\n                            </li>\n                        ) : (\n                            <li className={cnBreadcrumb('section')}>\n                                <a\n                                    className={cnBreadcrumb('anchor')}\n                                    target={target}\n                                    href={href}\n                                    onClick={e => onClick?.(e, href, section)}\n                                >\n                                    <Typography\n                                        variant='small'\n                                        className={cnBreadcrumb('text')}\n                                    >{text}</Typography>\n                                </a>\n                            </li>\n                        )}\n                    </React.Fragment>\n                );\n            })}\n        </ol>\n    </>);\n}\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React, {\n    useRef,\n    FunctionComponent,\n    useLayoutEffect,\n    createContext,\n    useState,\n    useContext,\n    useCallback,\n    memo,\n    ReactNode,\n    useMemo\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport classname from '@search/classname/src';\n\nimport './Modal.css';\nimport Paper, { BorderRadius } from '../Paper';\nimport { SizeEnum } from '../../types';\n\nexport enum ModalSize {\n    FULL_M = 'full_m',\n    FULL_S = 'full_s',\n    FULL_L = 'full_l',\n    S = 's',\n    M = 'm',\n    XL = 'xl',\n    L = 'l',\n}\n\nexport interface ModalProps extends React.HTMLAttributes<HTMLElement> {\n    coverRef?: React.LegacyRef<HTMLDivElement> | null;\n\n    alignLeft?: boolean;\n\n    /**\n     * Сработает при нажатии на кнопку закрытия, по клику на пространство вне модалки, по нажатию esc\n     */\n    onRequestClose?: (closedBy: ModalClosedBy) => void;\n\n    /**\n     * Показывать кнопку закрытия\n     * @default true\n     */\n    showCloseButton?: boolean;\n    height?: ModalSize;\n    fullScreen?: boolean;\n    width?: ModalSize;\n    /**\n     * Переводить ли фокус на последний интерактивный элемент в модалке после ее появления\n     * @default false\n     */\n    focusLast?: boolean;\n\n    /**\n     * Размер модалки по горизонтали\n     * MarginSize задает размер отступов от верха и низа видимой части окна\n     *\n     * @default SizeEnum.M\n     **/\n   size?: ModalSize;\n\n    /**\n     * Размер радиуса бордера. none - 0px, m - 4px, l - 8px\n     * @default SizeEnum.L\n     */\n    borderRadius?: BorderRadius.none | SizeEnum.M | SizeEnum.L | 'none';\n\n    children?: ReactNode;\n\n    contentClassName?: string;\n\n    dataTest?: string;\n\n    withScroll?: boolean;\n\n    withoutScroll?: boolean;\n\n    /**\n     * Размер иконки закрытия\n     * @default { widht: 18, height: 18 }\n     */\n    closeIconSize?: { width: number; height: number };\n\n    stylesCloseIcon?: React.CSSProperties;\n\n    /**\n     * Убрать белый паддинг у Modal__body элемента\n     * @default false\n     */\n    withoutBodyPadding?: boolean;\n\n    /**\n     * Фикс для небольшого отступа снизу из-за табличных стилей.\n     * Встречался в панораме, при выключении padding у элемента Modal__body (withoutBodyPadding)\n     * @default false\n     */\n    offTableCSS?: boolean;\n\n    /**\n     * Включает z-index = 10001, чтобы стать выше, чем фуллскрин режим Я.Карт\n     * @default false\n     */\n    hugePriorityZIndexEnabled?: boolean;\n\n    /**\n     * Включает актуальное значение z-index из uikit для модального окна --l-modal (1050)\n     */\n    uikitZIndexEnabled?: boolean;\n}\n\nexport const cnModal = classname.bind(null, 'Modal');\n\nexport enum ModalClosedBy {\n    ClickOutside = 'ClickOutside',\n    CloseButton = 'CloseButton',\n    Esc = 'Esc'\n}\n\n// const overflowClass = 'Modal__overflow';\n\n// lock body scroll hook\nexport function useLockBodyScroll() {\n    useLayoutEffect(() => {\n        if (! window || ! document) return;\n\n        const body = document.body;\n        const originalOverflowX = body.style.overflowX;\n        const originalOverflowY = body.style.overflowY;\n\n        // Удалить, после перехода на общий body scroll lock.\n        // https://gitlab.m2.ru/vtblife/frontend/root/-/blob/master/src/common-modules/layout-components/header/header.tsx\n        const handler = setInterval(() => {\n            if (body.style.overflowY === 'initial') {\n                body.style.overflowY = 'hidden';\n            }\n        }, 500);\n\n        body.style.overflowX = 'hidden';\n        body.style.overflowY = 'hidden';\n\n        return () => {\n            clearInterval(handler);\n            body.style.overflowX = originalOverflowX;\n            body.style.overflowY = originalOverflowY;\n        };\n    }, [ ]);\n}\n\n/*\n * Modal dialog\n *\n * @example Simple demo\n *\n * ```tsx\n * function ModalDemoSimple() {\n *   const modal = useModal()\n *\n *   return <div>\n *     {modal.visible\n *         ? null\n *         : <button onClick={modal.on}>Show modal</button>\n *     }\n *     {modal.visible ? <Modal onRequestClose={modal.off}>Modal Text</Modal> : null}\n *   </div>\n * }\n * ```\n *\n * @example Contexted demo\n *\n * ```tsx\n * // ModalDemoContextedRoot.tsx\n * function ModalDemoContextedRoot() {\n *\n *     return <ModalProvider>\n *         <ModalDemoContextedFirst/>\n *     </ModalProvider>\n * }\n *\n * // ModalDemoContextedFirst.tsx\n * function ModalDemoContextedFirst() {\n *     const modal = createModal(() => (\n *         <Modal onRequestClose={modal.hide}>\n *             Controlled modal: <button onClick={modal.hide}>Close</button>\n *         </Modal>\n *     ))\n *     return <div>\n *         <button onClick={modal.hide}>Show modal</button>\n *     </div>\n * }\n * ```\n *\n * @see https://assortment.io/posts/accessible-modal-component-react-portals-part-1\n * @see https://gist.github.com/danethurber/a586dbc9097e2e5696719c390a00c683\n * @see https://github.com/mpontus/react-modal-hook\n */\nexport const Modal = ({\n    coverRef = null,\n    contentClassName,\n    className,\n    size = ModalSize.M,\n    alignLeft = false,\n    height,\n    width,\n    fullScreen = false,\n    borderRadius = SizeEnum.L,\n    showCloseButton,\n    onRequestClose,\n    children,\n    dataTest,\n    withScroll = false,\n    withoutScroll = false,\n    withoutBodyPadding = false,\n    offTableCSS = false,\n    closeIconSize = { width: 18, height: 18 },\n    stylesCloseIcon,\n    onScroll: handleScroll,\n    title,\n    hugePriorityZIndexEnabled,\n    uikitZIndexEnabled\n}: ModalProps) => {\n    const asideRef = useRef<HTMLDivElement>(null);\n    const ref = useRef<HTMLDivElement>(null);\n\n    // @todo Переделать https://jira.cloud.vtblife.ru/browse/RS-463\n    // useFocusLock(focusLast ? ref : undefined);\n    useLockBodyScroll();\n    // useKeyUp('Escape', onRequestClose);\n    // useOnClickOutside(ref, onRequestClose);\n\n    const onCloseButton = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n        if (onRequestClose) e.preventDefault();\n\n        onRequestClose?.(ModalClosedBy.CloseButton);\n    }, [ onRequestClose ]);\n\n    const clickOnAside = (e: React.SyntheticEvent) => {\n        if (e.target !== asideRef.current) return;\n        if (onRequestClose) {\n            e.preventDefault();\n            e.stopPropagation();\n        }\n\n        onRequestClose?.(ModalClosedBy.ClickOutside);\n    };\n\n    const sizeClass = (height && width) ? { width, height } : { size };\n\n    return createPortal(\n        <div\n            ref={coverRef}\n            onScroll={handleScroll}\n            className={cnModal('cover', {\n                'with-scroll': withScroll,\n                'without-scroll': withoutScroll,\n                'max-z-index': hugePriorityZIndexEnabled,\n                'uikit-z-index': uikitZIndexEnabled\n            })}\n        >\n            <div className={cnModal('table', { offTableCSS })}>\n                <div className={cnModal('cell', { ...sizeClass, offTableCSS })} onClick={clickOnAside} ref={asideRef}>\n                    <Paper\n                        className={cnModal('content', {\n                            ...sizeClass,\n                            withoutBodyPadding\n                        }, contentClassName)}\n                        borderRadius={borderRadius}\n                        ref={ref}\n                    >\n                        {showCloseButton ? <button\n                            data-test={dataTest ? `${dataTest}-close` : undefined}\n                            className={cnModal('close')}\n                            onClick={onCloseButton}\n                            style={stylesCloseIcon}\n                        >\n                            <span className='u-hide-visually'>Close</span>\n                            <svg className={cnModal('icon')} {...closeIconSize} fill='none' viewBox='0 0 18 18'>\n                                <path\n                                    stroke='#1B2233'\n                                    strokeOpacity='0.92'\n                                    strokeWidth='1.5'\n                                    d='M1 1.00001L17 17M17 1L1 17'\n                                />\n                            </svg>\n                        </button> :\n                            null}\n                        <div className={cnModal(\n                            'body',\n                            { full: fullScreen, alignLeft, withoutBodyPadding },\n                            className\n                        )}>\n                            {title ? <div className={cnModal('title')}>{title}</div> : null}\n                            {children}\n                        </div>\n                    </Paper>\n                </div>\n            </div>\n        </div>\n        ,\n        document.body\n    );\n};\n\nexport const useModal = (visibleDefault = false) => {\n    const [ visible, setVisible ] = useState(visibleDefault);\n\n    return {\n        visible,\n        on: useCallback(() => setVisible(true), []),\n        off: useCallback(() => setVisible(false), []),\n        setVisible\n    };\n};\n\nconst ModalContext = createContext({\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    show: (modal: React.ReactNode) => {},\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    hide: (modal: React.ReactNode) => {}\n});\n\nconst ModalRenderer = memo(({ component }: {component: () => ReactNode}) => <>{component()}</>);\n\nlet componentId = 0;\n\nexport function createModal(createFn: () => React.ReactNode) {\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    const id = useMemo(() => String(++componentId), []);\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    const component = useMemo(() => <ModalRenderer key={id} component={createFn} />, [ createFn, id ]);\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    const context = useContext(ModalContext);\n\n    // eslint-disable-next-line react-hooks/rules-of-hooks\n    return useMemo(() => ({\n        show: () => context.show(component),\n        hide: () => context.hide(component)\n    }), [ context, component ]);\n}\n\nexport const ModalProvider: FunctionComponent<{children: React.ReactNode}> = ({ children }) => {\n    const [ modals, setModals ] = useState(new Set<React.ReactNode>());\n\n    const show = useCallback((modal: React.ReactNode) => {\n        if (modals.has(modal)) return;\n        modals.add(modal);\n\n        setModals(new Set(modals));\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    const hide = useCallback((modal: React.ReactNode) => {\n        modals.delete(modal);\n        setModals(new Set(modals));\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const context = useMemo(() => ({ show, hide }), []);\n\n    return (<ModalContext.Provider value={context}>\n        {children}\n        <>{Array.from(modals)}</>\n    </ModalContext.Provider>);\n};\n","import React, { Ref, HTMLAttributes, forwardRef } from 'react';\nimport cn from '@search/classname/src';\nimport './styles.css';\nimport { SizeEnum } from '../../types';\n\nconst cnPaper = cn.bind(null, 'Paper');\n\nexport interface IPaperProps extends HTMLAttributes<HTMLDivElement> {\n    /**\n    * Высота в Z-координаты компонента для визаулизации тени\n    * @default \"s\"\n    **/\n    elevation?: 's' | 'm' | 'l' | 'xl' | 'xxl';\n    /**\n    * Цвет тени\n    * @default \"gray\"\n    **/\n    shadowСolor?: 'gray' | 'green' | 'red' | 'blue';\n    /**\n    * Свойство обнуляет border-radius\n    * @deprecated use borderRadius: BorderRadius.none\n    * @default false\n    **/\n    square?: boolean;\n\n    /**\n     * Размер радиуса бордера.\n     * @default SizeEnum.M\n     */\n    borderRadius?: BorderRadius.none | SizeEnum.M | SizeEnum.L | 'none';\n\n    dataTest?: string;\n\n    id?: string;\n}\n\nexport enum BorderRadius {\n    none = 'none'\n}\n\n/**\n * @todo forwardRef is not supported in storybook without export const: https://github.com/storybookjs/storybook/issues/7933\n */\nexport const Paper = forwardRef(({\n    elevation = 's',\n    shadowСolor = 'gray',\n    square = false,\n    className,\n    dataTest,\n    borderRadius = SizeEnum.M,\n    ...rest\n}: IPaperProps, ref: Ref<HTMLDivElement>) => {\n    const mods = `${shadowСolor}_${elevation}`;\n\n    return (\n        <div\n            {...rest}\n            data-test={dataTest}\n            ref={ref}\n            /* eslint-disable-next-line @typescript-eslint/naming-convention */\n            className={cnPaper(null, { elevation: mods, square, 'border-radius': borderRadius }, className)}\n        />\n    );\n});\n\nexport default Paper;\n","import React, {\n    Fragment,\n    useCallback,\n    MouseEvent,\n    RefObject,\n    ReactNode,\n    HTMLAttributes,\n    DetailedHTMLFactory\n} from 'react';\nimport classname from '@search/classname/src';\nimport useControl from '@search/hooks/src/useControl';\n\nimport {\n    Tone,\n    Size,\n    View,\n    Width,\n    ToneEnum,\n    SizeEnum,\n    ViewEnum,\n    Height\n} from '../../../types';\n\nimport './Button.css';\nimport './ButtonSize/ButtonSize.css';\n\nexport type ContainerElement =\n    | HTMLButtonElement\n    | HTMLLinkElement;\n\ntype ReactButtonElement =\n    DetailedHTMLFactory<HTMLAttributes<ContainerElement>, ContainerElement>;\n\n// @ts-ignore\nexport interface IButtonProps extends HTMLAttributes<ContainerElement> {\n    /**\n     * Тип кнопки.\n     * @default 'button'\n     */\n    type?: 'submit' | 'link' | 'button' | 'rest';\n\n    /**\n     *  Кнопка отключена | включена\n     */\n    disabled?: boolean;\n\n    /**\n     * Кнопка в фокусе\n     */\n    focused?: boolean;\n\n    /**\n     * Сотсояние натажтия\n     */\n    pressed?: boolean;\n\n    /**\n     * Зажатость кнопки (используется в CheckboxGroup)\n     */\n    checked?: boolean;\n\n    /**\n     * Ширина кнопки\n     */\n    width?: Width;\n\n    height?: Height;\n\n    /**\n     * Размер кнопки\n     */\n    size?: Size;\n\n    /**\n     * Заглавная первая буква\n     */\n    capitalize?: boolean;\n\n    /**\n     * Вид кнопки\n     */\n    view?: View | 'filter';\n\n    /**\n     * Тон кнопки (цвет)\n     */\n    tone?: Tone;\n\n    /**\n     * Дополнительный контент после `children`.\n     */\n    contentAfter?: ReactNode;\n\n    /**\n     * Дополнительный контент перед `children`.\n     */\n    contentBefore?: ReactNode;\n\n    /**\n     *  Иконка слева.\n     */\n    iconLeft?: ReactNode;\n\n    /**\n     *  Иконка справа.\n     */\n    iconRight?: ReactNode;\n\n    /**\n     * Ссылка на рутовый DOM элемент компонента.\n     */\n    innerRef?: RefObject<ContainerElement>;\n\n    square?: boolean;\n\n    /**\n     * Предотвращаем событие по умолчанию\n     */\n    prevent?: boolean;\n\n    onClick?: (e: MouseEvent<ContainerElement>, state?: object) => void;\n\n    href?: string;\n\n    target?: string;\n\n    name?: string;\n}\n\nconst cnButton = classname.bind(null, 'Button');\n\nconst Button: React.FunctionComponent<IButtonProps> = ({\n    type = 'button',\n    width,\n    height,\n    checked,\n    className,\n    onBlur,\n    onFocus,\n    onMouseDown,\n    onMouseUp,\n    innerRef,\n    children = false,\n    pressed = false,\n    focused = false,\n    disabled = false,\n    capitalize = false,\n    iconLeft,\n    iconRight,\n    contentBefore,\n    contentAfter,\n    size = SizeEnum.S,\n    tone = ToneEnum.SECONDARY,\n    view = ViewEnum.PRIMARY,\n    square = false,\n    prevent,\n    ...props\n}) => {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const TagName = (type === 'link' ? 'a' : 'button' as any) as ReactButtonElement;\n    const [ buttonState, controlHandlers ] = useControl({ disabled, focused, pressed }, {\n        onBlur,\n        onFocus,\n        onMouseUp,\n        onMouseDown\n    }, { disabled, focused });\n    const handleClick = useCallback((event: React.MouseEvent<ContainerElement>) => {\n        if (! disabled) {\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            if (prevent) {\n                event.preventDefault();\n            }\n\n            // @ts-ignore\n            // eslint-disable-next-line\n            props.onClick && props.onClick(event, { ...buttonState, ...props });\n        }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ props.onClick, disabled ]);\n\n    return (\n        // @ts-ignore\n        <TagName\n            {...props}\n            // @ts-ignore\n            type={type}\n            ref={innerRef}\n            role={props.role}\n            onClick={handleClick}\n            disabled={buttonState.disabled}\n            onBlur={controlHandlers.handleBlur}\n            onFocus={controlHandlers.handleFocus}\n            onMouseUp={controlHandlers.handleMouseUp}\n            onMouseDown={controlHandlers.handleMouseDown}\n            onMouseLeave={controlHandlers.handleMouseLeave}\n            onMouseEnter={controlHandlers.handleMouseEnter}\n            className={cnButton(null, { ...buttonState, size, view, tone, width, height, checked, square }, className)}>\n            <Fragment>\n                {contentBefore}\n                {iconLeft}\n                {\n                    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n                    children ?\n                        <span className={cnButton('text', { capitalize })}>\n                            {children}\n                        </span> : null\n                }\n                {iconRight}\n                {contentAfter}\n            </Fragment>\n        </TagName>\n    );\n};\n\nexport default Button;\n","import React, { RefObject, InputHTMLAttributes } from 'react';\n\nimport { cnCheckbox } from '../';\n\nimport './styles.css';\n\nexport interface ICheckboxControlProps extends InputHTMLAttributes<HTMLInputElement> {\n    /**\n     * Ссылка на DOM элемент нативного инпута.\n     */\n    controlRef?: RefObject<HTMLInputElement>;\n}\n\nexport const CheckboxControl: React.FunctionComponent<ICheckboxControlProps> = ({ controlRef, className, ...props }) =>\n    <input\n        {...props}\n        ref={controlRef}\n        type='checkbox'\n        name={props.name}\n        value={props.value}\n        onChange={props.onChange}\n        className={cnCheckbox('control', {}, className)} />;\n","import React, { RefObject, useCallback } from 'react';\n\nimport classname from '@search/classname/src';\nimport useControl from '@search/hooks/src/useControl';\nimport Button from '../Button';\nimport {\n    Size,\n    View,\n    Tone,\n    SizeEnum,\n    ViewEnum,\n    ToneEnum,\n    Maybe\n} from '../../../types';\n\nimport { ICheckboxControlProps, CheckboxControl } from './CheckboxControl/CheckboxControl';\n\nimport './Checkbox.css';\n\nexport type CheckboxControlProps = Omit<ICheckboxControlProps, 'size'>;\n\nexport interface ICheckboxProps extends CheckboxControlProps {\n    /**\n     * Ссылка на корневой DOM-элемент компонента.\n     */\n    innerRef?: RefObject<HTMLLabelElement>;\n\n    /**\n     * Ссылка на DOM элемент нативного инпута.\n     */\n    controlRef?: RefObject<HTMLInputElement>;\n\n    /**\n     * Вид элемента\n     */\n    view?: View;\n\n    /**\n     * Цветовое решение\n     */\n    tone?: Tone;\n\n    /**\n     * Размер контрола\n     */\n    size?: Size;\n\n    /**\n     * Состояние переключателя: включен или выключен\n     */\n    checked?: boolean;\n\n    /**\n     * Тип отображения\n     */\n    type?: 'button' | 'checkbox';\n\n    square?: boolean;\n\n    onCheck?: (\n        checked: boolean,\n        props: { name: Maybe<string>; value: Maybe<string | number | readonly string[]>;\n    }) => void;\n}\n\nexport const cnCheckbox = classname.bind(null, 'Checkbox');\n\nconst Checkbox = ({\n    name,\n    type,\n    square = false,\n    className,\n    value = '',\n    innerRef,\n    checked = false,\n    disabled = false,\n    autoComplete = 'off',\n    size = SizeEnum.S,\n    view = ViewEnum.PRIMARY,\n    tone = ToneEnum.PRIMARY,\n    ...props\n}: ICheckboxProps): React.ReactElement => {\n    const [ buttonState, controlHandlers ] = useControl({ disabled, focused: false }, props, { disabled });\n\n    const handleChange = useCallback(() => {\n        if (disabled) {\n            return;\n        }\n\n        // eslint-disable-next-line\n        props.onCheck && props.onCheck(! checked, { name, value });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ name, value, disabled, checked, props.onCheck ]);\n\n    const handleButtonClick = useCallback(() => {\n        // eslint-disable-next-line\n        props.onCheck && props.onCheck(! checked, { name, value });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ name, value, disabled, checked, props.onCheck ]);\n\n    if (type === 'button') {\n        return (\n            <label\n                ref={innerRef}\n                className={cnCheckbox(null, { ...buttonState, checked, tone, size, view, type }, className)}>\n                {checked &&\n                // eslint-disable-next-line\n                <input type='hidden' name={name} value={value} disabled={disabled}/>\n                }\n                <Button\n                    type='button'\n                    width='max'\n                    name={name}\n                    size={size}\n                    view={view}\n                    tone={tone}\n                    square={square}\n                    disabled={disabled}\n                    checked={checked}\n                    onFocus={controlHandlers.handleFocus}\n                    onMouseUp={controlHandlers.handleMouseUp}\n                    onMouseDown={controlHandlers.handleMouseDown}\n                    onMouseLeave={controlHandlers.handleMouseLeave}\n                    onMouseEnter={controlHandlers.handleMouseEnter}\n                    onClick={handleButtonClick}>\n                    {props.children}\n                </Button>\n            </label>\n\n        );\n    }\n\n    return (\n        <label\n            htmlFor={name}\n            ref={innerRef}\n            onMouseUp={controlHandlers.handleMouseUp}\n            onMouseDown={controlHandlers.handleMouseDown}\n            onMouseEnter={controlHandlers.handleMouseEnter}\n            onMouseLeave={controlHandlers.handleMouseLeave}\n            className={cnCheckbox(null, { ...buttonState, disabled, checked, tone, size, view }, className)}>\n            <span className={cnCheckbox('box')}>\n                <CheckboxControl\n                    id={name}\n                    name={name}\n                    value={value}\n                    controlRef={props.controlRef}\n                    checked={checked}\n                    disabled={disabled}\n                    onChange={handleChange}\n                    autoComplete={autoComplete}\n                />\n                <span className={cnCheckbox('tick')} />\n            </span>\n            <span\n                role='presentation'\n                className={cnCheckbox('text')}>\n                {props.children}\n            </span>\n        </label>\n    );\n};\n\nexport default Checkbox;\n","import React, { useCallback, ReactNode } from 'react';\n\nimport classname from '@search/classname/src';\nimport {\n    Size,\n    Mode,\n    SizeEnum,\n    ModeEnum,\n    Maybe\n} from '../../../types';\n\nimport { ICheckboxProps } from '../Checkbox';\n\nimport './styles.css';\n\n// FIXME Move to string[] only value\nexport interface ICheckboxGroupProps {\n    /**\n     * Режим работы контрола\n     */\n    mode?: Mode;\n\n    /**\n     * Размер будет прокинут всем детям\n     */\n    size?: Size;\n\n    /**\n     * Значения контролы\n     */\n    value: string[];\n\n    children?: ReactNode[];\n\n    onChange: (value: string | number | string[] | null) => void;\n    className?: string;\n\n    name?: string;\n\n    /**\n     * Отключен или нет\n     */\n    disabled?: boolean;\n\n    dataTest?: string;\n}\n\nexport const cnCheckboxGroup = classname.bind(null, 'CheckboxGroup');\n\nconst CheckboxGroup: React.FunctionComponent<ICheckboxGroupProps> = ({\n    name,\n    value,\n    children,\n    disabled,\n    onChange,\n    dataTest,\n    mode = ModeEnum.CHECK,\n    size = SizeEnum.S,\n    className\n}) => {\n    const handleChildCheck = useCallback((\n        checked: boolean,\n        childProps: { name: Maybe<string>; value: Maybe<string | number | readonly string[]>}\n    ) => {\n        let newValue: string | null | string[] = [];\n        const childValue: string = childProps.value as string;\n\n        switch (true) {\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            case (checked && ModeEnum.CHECK === mode):\n                // @ts-ignore\n                newValue = [].concat(value).filter(a => a === 0 || Boolean(a)).concat(childValue);\n\n                break;\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            case (checked && ModeEnum.RADIO_CHECK === mode):\n            // eslint-disable-next-line\n            case (checked && ModeEnum.RADIO === mode):\n                newValue = childValue;\n\n                break;\n            // eslint-disable-next-line\n            case (! checked && ModeEnum.RADIO === mode):\n                newValue = value;\n\n                break;\n            // eslint-disable-next-line\n            case (! checked && ModeEnum.RADIO_CHECK === mode):\n                newValue = null;\n\n                break;\n            // eslint-disable-next-line\n            case (! checked && ModeEnum.CHECK === mode):\n                // @ts-ignore\n                newValue = [].concat(value).filter(item => item !== childValue);\n                break;\n            default:\n                newValue = [];\n        }\n\n        // @ts-ignore\n        onChange(newValue);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ onChange, disabled, value ]);\n\n    return (\n        <span\n            data-test={dataTest ?? name}\n            className={cnCheckboxGroup(null, {}, className)}>\n            {\n                // @ts-ignore\n                React.Children.map(children, (child: React.ReactElement<ICheckboxProps>): ReactNode => {\n                    // eslint-disable-next-line\n                    const checked = value && value.indexOf(child.props.value as string) !== -1;\n\n                    return React.cloneElement(child, {\n                        ...child.props,\n                        name: `${name ?? ''}-${String(child.props.value ?? '')}`,\n                        checked,\n                        // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n                        disabled: disabled ?? child.props.disabled,\n                        // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n                        size: size ?? child.props.size,\n                        onCheck: handleChildCheck\n                    } as ICheckboxProps);\n                })\n            }\n        </span>\n    );\n};\n\nexport default CheckboxGroup;\n","import React from 'react';\n\ninterface IHighlightProps {\n  text: string;\n  highlight?: string;\n}\n\nfunction escapeRegExp(str: string) {\n    return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // $& means the whole matched string\n}\n\nexport const Highlight: React.FC<IHighlightProps> = ({\n    text, highlight = ''\n}) => {\n    const tokens = highlight.toLowerCase().split(' ');\n\n    let result = '';\n\n    for (let i = 0; i < tokens.length; i++) {\n        const token = tokens[i];\n\n        result += `(${token})${(i === tokens.length - 1) ? '' : '|'}`;\n    }\n\n    const sanitizedRegexp = escapeRegExp(result);\n\n    const parts = text.split(new RegExp(sanitizedRegexp, 'gi')).filter(part => part !== undefined && part !== '');\n\n    return (<span> { parts.map((part, i) =>\n        // eslint-disable-next-line @typescript-eslint/prefer-includes\n        <span key={i} style={tokens.indexOf(part.toLowerCase()) !== -1 ? { fontWeight: 'bold' } : {}}>\n            { part }\n        </span>)\n    } </span>);\n};\n","import React, { CSSProperties, HTMLAttributes } from 'react';\nimport classname from '@search/classname/src';\n\nimport './Icon.css';\n\nexport interface IIconProps extends HTMLAttributes<HTMLSpanElement> {\n    /**\n     * Тип иконки\n     */\n    type?: string;\n\n    /**\n     * Размер иконки\n     */\n    size?: 'xs' | 's' | 'm' | 'l';\n\n    /**\n     * Стили иконки\n     *\n     * @default {}\n     */\n    style?: CSSProperties;\n\n    /**\n     * Адрес иконки\n     */\n    url?: string;\n\n    /**\n     * Цвет иконки\n     */\n    color?: string;\n}\n\nexport const cnIcon = classname.bind(null, 'Icon');\n\nconst Icon = ({\n    size,\n    url,\n    type,\n    style = {},\n    children,\n    color,\n    ...props\n}: IIconProps): React.ReactElement => {\n    const className = cnIcon(null, { size, type, color }, props.className);\n\n    if (url !== undefined) {\n        style.backgroundImage = `url('${url}')`;\n    }\n\n    return (\n        <span\n            {...props}\n            aria-hidden\n            className={className}\n            style={style}\n        >\n            {children}\n        </span>\n    );\n};\n\nexport default Icon;\n","import React, { InputHTMLAttributes, Ref } from 'react';\n\nimport { cnInput } from '../Input';\n\nimport './InputControl.css';\n\nexport type IInputControlProps = InputHTMLAttributes<HTMLInputElement>;\n\nconst InputControl = React.forwardRef((props: IInputControlProps, ref: Ref<HTMLInputElement>) => (\n    <input\n        {...props}\n        ref={ref}\n        autoCorrect='off'\n        autoComplete='off'\n        className={cnInput('control')} />\n));\n\nexport { InputControl };\n","/* eslint-disable max-len */\nimport React, { RefObject, useState, useRef, FormEvent, useEffect, ReactNode, MutableRefObject } from 'react';\nimport NumberFormat, { NumberFormatProps } from 'react-number-format';\nimport useHoverable from '@search/hooks/src/useHoverable';\nimport useFocusable from '@search/hooks/src/useFocusable';\n\nimport classname from '@search/classname/src';\nimport mergeRefs from '../../../lib/mergeRefs';\n\nimport {\n    InputControl,\n    IInputControlProps\n} from './InputControl/InputControl';\n\nimport './input.css';\n\nexport type InputMode = 'number' | 'text' | 'mask';\n\ninterface IInputProps extends Omit<IInputControlProps, 'onChange' | 'size'> {\n\n    /**\n     * Ссылка на корневой DOM-элемент компонента.\n     */\n    innerRef?: RefObject<HTMLElement>;\n\n    /**\n     * Ссылка на DOM элемент нативного инпута.\n     */\n    controlRef?: MutableRefObject<HTMLInputElement>;\n\n    onChange?: (value: string, opts: object) => void;\n\n    /**\n     * Дополнительный контент до инпута\n     */\n    extraBefore?: ReactNode;\n\n    /**\n     * Дополнительный контент после инпута\n     */\n    extraAfter?: ReactNode;\n\n    mode?: InputMode;\n\n    size?: string;\n\n    width?: string;\n\n    borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n    clear?: boolean;\n\n    borderOut?: boolean;\n\n    maskProps?: Omit<NumberFormatProps, 'value' | 'onChange'>;\n}\n\nexport const cnInput = classname.bind(null, 'Input');\n\nconst Input = ({\n    autoComplete = 'off',\n    className,\n    name,\n    value = '',\n    disabled,\n    width,\n    size = 's',\n    innerRef,\n    controlRef,\n    extraAfter,\n    extraBefore,\n    mode,\n    maskProps,\n    borderOut = false,\n    borderSide,\n    clear = false,\n    ...props\n}: IInputProps): React.ReactElement => {\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const [ hovered, hoverRef ] = useHoverable();\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    const [ focused, focusRef ] = useFocusable();\n    const inputRef = useRef<HTMLElement>();\n\n    const [ currentValue, setValue ] = useState(value);\n\n    useEffect(() => {\n        if (currentValue !== value) {\n            setValue(value);\n        }\n    }, [ value, currentValue ]);\n\n    /*\n     * Изменение значения в поле\n     * @param value\n     */\n    const changeValue = (val: string) => {\n        setValue(val);\n        // eslint-disable-next-line\n        props.onChange && props.onChange(val, { name });\n    };\n\n    const handleClear = () => {\n        changeValue('');\n    };\n\n    /*\n     * Событие на изменение значения для \"простого\" поля\n     * @param e\n     */\n    const handleChange = (e: FormEvent<HTMLInputElement>) => {\n        changeValue(e.currentTarget.value);\n    };\n\n    /*\n     * Событие на изменение значения для поля с \"маской\"\n     * @param e\n     */\n    const handleChangeWithMask = (e: FormEvent<HTMLInputElement>) => {\n        const target = e.target as HTMLInputElement;\n        const newValue = target.value.replace(/\\s/gm, '');\n\n        changeValue(newValue);\n    };\n\n    return (\n        <span\n            ref={innerRef}\n            className={cnInput(null, { hovered, focused, disabled, size, width }, className)}>\n            {\n                // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n                extraBefore ?\n                    <span className={cnInput('extra-before')}>\n                        {extraBefore}\n                    </span> : null\n            }\n            {mode === 'mask' ?\n                (\n                    <NumberFormat\n                        type='tel'\n                        thousandSeparator={' '}\n                        decimalSeparator={false}\n                        isNumericString\n                        {...maskProps}\n                        onBlur={props.onBlur}\n                        placeholder={props.placeholder}\n                        className={cnInput('control')}\n                        name={name}\n                        getInputRef={mergeRefs(inputRef, controlRef, hoverRef, focusRef)}\n                        disabled={disabled}\n                        // @ts-ignore\n                        value={currentValue}\n                        onChange={handleChangeWithMask}\n                        autoComplete={autoComplete}\n                    />\n                ) :\n                (\n                    <InputControl\n                        {...props}\n                        name={name}\n                        value={currentValue}\n                        type={mode}\n                        ref={mergeRefs(inputRef, controlRef, hoverRef, focusRef)}\n                        disabled={disabled}\n                        onChange={handleChange}\n                        autoComplete={autoComplete}\n                    />\n                )}\n            {\n                clear && currentValue !== '' && currentValue !== undefined && (\n                    // eslint-disable-next-line\n                    <span className={cnInput('clear-button')} onClick={handleClear}>\n                        <svg width='10' height='10' viewBox='0 0 10 10' fill='none' xmlns='http://www.w3.org/2000/svg'>\n                            <path fillRule='evenodd' clipRule='evenodd' d='M5.00004 5.70714L9.14648 9.85359L9.85359 9.14648L5.70714 5.00004L9.85359 0.853592L9.14648 0.146485L5.00004 4.29293L0.853591 0.146484L0.146484 0.853591L4.29293 5.00004L0.146484 9.14648L0.853591 9.85359L5.00004 5.70714Z' fill='#1F212E' />\n                        </svg>\n                    </span>\n                )\n            }\n            {\n                // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n                extraAfter &&\n                    // eslint-disable-next-line\n                    (<span className={cnInput('extra-after')}>\n                        {extraAfter}\n                    </span>)\n            }\n            <span className={cnInput('box', { borderSide, borderOut })} />\n        </span>\n    );\n};\n\nexport default Input;\n","/* eslint-env browser */\nimport { RefObject } from 'react';\nimport { AnchorDimensions, PopupDimensions, ViewportDimensions, Position, TailDimensions } from './types';\n\n/*\n * Вычисляет размеры анкора.\n *\n * @param anchorRef Ссылка на DOM элемент анкора.\n */\nexport const getAnchorDimensions = (anchorRef?: RefObject<HTMLElement>): AnchorDimensions => {\n    const dimensions = {\n        left: 0,\n        top: 0,\n        height: 0,\n        width: 0\n    };\n\n    if (anchorRef !== undefined && anchorRef.current !== null) {\n        const { offsetWidth, offsetHeight } = anchorRef.current;\n        const { left, top } = anchorRef.current.getBoundingClientRect();\n\n        dimensions.left = left + window.pageXOffset;\n        dimensions.top = top + window.pageYOffset;\n        dimensions.height = offsetHeight;\n        dimensions.width = offsetWidth;\n    }\n\n    return dimensions;\n};\n\n/*\n * Вычисляет размеры попапа.\n * @param popupRef Ссылка на DOM элемент попапа.\n */\nexport const getPopupDimensions = (popupRef?: RefObject<HTMLElement | undefined>): PopupDimensions => {\n    const dimensions = {\n        area: 0,\n        height: 0,\n        width: 0,\n        popupHeight: 0,\n        popupWidth: 0\n    };\n\n    if (popupRef !== undefined && popupRef.current !== null && popupRef.current !== undefined) {\n        const { clientWidth, clientHeight } = popupRef.current;\n        const { width, height } = popupRef.current.getBoundingClientRect();\n\n        dimensions.area = clientWidth * clientHeight;\n        // Погрешность расчета при рендеринге ie11\n        dimensions.height = Math.round(height);\n        // Погрешность при расчете offsetWidth при рендеринге в chrome\n        dimensions.width = Math.round(width);\n        dimensions.popupHeight = clientHeight;\n        dimensions.popupWidth = clientWidth;\n    }\n\n    return dimensions;\n};\n\n/*\n * Вычисляет размеры окна.\n */\nexport const getViewportDimensions = (): ViewportDimensions => {\n    return {\n        top: window.pageYOffset,\n        left: window.pageXOffset,\n        bottom: window.pageYOffset + window.innerHeight,\n        right: window.pageXOffset + window.innerWidth\n    };\n};\n\n/*\n * Вычисляет размеры области.\n *\n * @param scopeRef Ссылка на DOM элемент области.\n */\nexport const getScopeDimensions = (scopeRef?: RefObject<HTMLElement>): Position => {\n    const dimensions = { top: 0, left: 0 };\n\n    if (scopeRef !== undefined && scopeRef.current !== null) {\n        const { left, top } = scopeRef.current.getBoundingClientRect();\n\n        dimensions.top = top; // - (scopeRef.current.scrollTop + top);\n        dimensions.left = left; // - (scopeRef.current.scrollLeft + left);\n    }\n\n    return dimensions;\n};\n\n/*\n * Вычисляет размеры хвостика.\n *\n * tailRef Ссылка на DOM элемент хвостика.\n */\nexport const getTailDimensions = (tailRef?: RefObject<HTMLElement>): TailDimensions => {\n    const dimensions = { size: 0 };\n\n    if (tailRef && tailRef.current) {\n        dimensions.size = tailRef.current.offsetWidth;\n    }\n\n    return dimensions;\n};\n","import { checkMainDirection, checkSecondaryDirection } from './utils';\nimport { AnchorDimensions, PopupDimensions, TailDimensions } from './types';\n\n/*\n * Вычисляет координаты попапа для заданного направления.\n *\n * @param direction Текущее направление в котором раскрыт попап\n * @param anchorDimensions Размеры анкора\n * @param popupDimensions Размеры попапа\n * @param offsets Отступы\n */\nexport const getPopupPosition = (\n    direction: string,\n    anchorDimensions: AnchorDimensions,\n    popupDimensions: PopupDimensions,\n    offsets = {\n        secondary: 0,\n        main: 0\n    }\n): {\n    left: number;\n    top: number;\n} => {\n    const position = { left: 0, top: 0 };\n\n    if (checkMainDirection(direction, 'bottom')) {\n        position.top = anchorDimensions.top + anchorDimensions.height + offsets.main;\n    } else if (checkMainDirection(direction, 'top')) {\n        position.top = anchorDimensions.top - popupDimensions.height - offsets.main;\n    } else if (checkMainDirection(direction, 'left')) {\n        position.left = anchorDimensions.left - popupDimensions.width - offsets.main;\n    } else if (checkMainDirection(direction, 'right')) {\n        position.left = anchorDimensions.left + anchorDimensions.width + offsets.main;\n    }\n\n    if (checkSecondaryDirection(direction, 'right')) {\n        position.left = anchorDimensions.left + anchorDimensions.width - popupDimensions.width - offsets.secondary;\n    } else if (checkSecondaryDirection(direction, 'left')) {\n        position.left = anchorDimensions.left + offsets.secondary;\n    } else if (checkSecondaryDirection(direction, 'bottom')) {\n        position.top = anchorDimensions.top + anchorDimensions.height - popupDimensions.height - offsets.secondary;\n    } else if (checkSecondaryDirection(direction, 'top')) {\n        position.top = anchorDimensions.top + offsets.secondary;\n    } else if (checkSecondaryDirection(direction, 'center')) {\n        if (checkMainDirection(direction, 'top', 'bottom')) {\n            position.left = anchorDimensions.left + (anchorDimensions.width / 2) - (popupDimensions.width / 2);\n        } else if (checkMainDirection(direction, 'left', 'right')) {\n            position.top = anchorDimensions.top + (anchorDimensions.height / 2) - (popupDimensions.height / 2);\n        }\n    }\n\n    return position;\n};\n\n/*\n * Вычисляет координаты хвостика для заданного направления.\n *\n * @param direction Текущее направление в котором раскрыт попап\n * @param anchorDimensions Размеры анкора\n * @param popupDimensions Размеры попапа\n * @param tailDimensions Размеры хвостика\n * @param offsets Отступы\n */\nexport const getTailPosition = (\n    direction: string,\n    anchorDimensions: AnchorDimensions,\n    popupDimensions: PopupDimensions,\n    tailDimensions: TailDimensions,\n    offsets = {\n        tail: 0\n    }\n): {\n    left: number;\n    top: number;\n} => {\n    const position = { left: 0, top: 0 };\n    const halfSizeOfTail = tailDimensions.size / 2;\n\n    if (checkMainDirection(direction, 'bottom')) {\n        position.top = -halfSizeOfTail;\n    } else if (checkMainDirection(direction, 'top')) {\n        position.top = Math.floor(popupDimensions.popupHeight - halfSizeOfTail);\n    } else if (checkMainDirection(direction, 'left')) {\n        position.left = Math.floor(popupDimensions.popupWidth - halfSizeOfTail);\n    } else if (checkMainDirection(direction, 'right')) {\n        position.left = -halfSizeOfTail;\n    }\n\n    if (checkSecondaryDirection(direction, 'right')) {\n        position.left = (\n            popupDimensions.popupWidth -\n            Math.ceil(Math.min(popupDimensions.popupWidth, anchorDimensions.width) / 2) -\n            halfSizeOfTail - offsets.tail\n        );\n    } else if (checkSecondaryDirection(direction, 'left')) {\n        position.left = Math.ceil(Math.min(popupDimensions.popupWidth, anchorDimensions.width) / 2) -\n            halfSizeOfTail + offsets.tail;\n    } else if (checkSecondaryDirection(direction, 'bottom')) {\n        position.top = (\n            popupDimensions.popupHeight -\n            Math.ceil(Math.min(popupDimensions.popupHeight, anchorDimensions.height) / 2) -\n            halfSizeOfTail - offsets.tail);\n    } else if (checkSecondaryDirection(direction, 'top')) {\n        position.top = Math.ceil(Math.min(popupDimensions.popupHeight, anchorDimensions.height) / 2) -\n        halfSizeOfTail + offsets.tail;\n    } else if (checkSecondaryDirection(direction, 'center')) {\n        if (checkMainDirection(direction, 'top', 'bottom')) {\n            position.left = Math.ceil(popupDimensions.popupWidth / 2) - halfSizeOfTail + offsets.tail;\n        } else {\n            position.top = Math.ceil(popupDimensions.popupHeight / 2) - halfSizeOfTail + offsets.tail;\n        }\n    }\n\n    return position;\n};\n","import { PopupDimensions, ViewportDimensions, Position } from './types';\n\n/*\n * Вычисляет коэффициент пересечения доступной площади для открытия попапа и собственной площади попапа.\n *\n * @param popupPosition\n * @param viewportDimensions\n * @param popupDimensions\n * @param offsets\n */\nexport const getViewportFactor = (\n    popupPosition: Position,\n    viewportDimensions: ViewportDimensions,\n    popupDimensions: PopupDimensions,\n    offsets = {\n        viewport: 0\n    }\n): number => {\n    let viewportFactor = 0;\n    const intersectionLeft = Math.max(popupPosition.left, viewportDimensions.left + offsets.viewport);\n    const intersectionRight = Math.min(\n        popupPosition.left + popupDimensions.width,\n        viewportDimensions.right - offsets.viewport\n    );\n    const intersectionTop = Math.max(\n        popupPosition.top,\n        viewportDimensions.top + offsets.viewport\n    );\n    const intersectionBottom = Math.min(\n        popupPosition.top + popupDimensions.height,\n        viewportDimensions.bottom - offsets.viewport\n    );\n\n    if (intersectionLeft < intersectionRight && intersectionTop < intersectionBottom) {\n        viewportFactor = (intersectionRight - intersectionLeft) *\n        (intersectionBottom - intersectionTop) / popupDimensions.area;\n    }\n\n    return viewportFactor;\n};\n","export const checkMainDirection = (\n    direction: string,\n    mainFirstDirection: string,\n    mainSecondDirection?: string\n) => (\n    direction.indexOf(mainFirstDirection) === 0 || (mainSecondDirection && direction.indexOf(mainSecondDirection) === 0)\n);\n\nexport const checkSecondaryDirection = (\n    direction: string,\n    secondaryDirection: string\n) => (\n    direction.indexOf('-' + secondaryDirection) > 0\n);\n","/* eslint-disable @typescript-eslint/naming-convention */\nexport enum KEY_CODE {\n    UP = 38,\n    DOWN = 40,\n    ENTER = 13,\n    TAB = 9,\n    ESC = 27\n}\n","import React, { useCallback, useState, useMemo, useEffect, KeyboardEvent } from 'react';\nimport { KEY_CODE } from '../../../enums';\n\nexport interface IUseSuggestionListState {\n    focusedIndex: number | null;\n}\n\nexport interface IUseSuggestionListHandlers {\n    handleInputKeyDown: (event: KeyboardEvent) => void;\n    handleItemMouseDown: (event: React.MouseEvent, index: number) => void;\n    handleItemMouseEnter: (event: React.MouseEvent, index: number) => void;\n}\n\nfunction useSuggestionList <Suggestion>(\n    { suggestions, isListOpened }: { isListOpened: boolean; suggestions: Suggestion[] },\n    onSelect: (item: Suggestion) => void\n): { focusedIndex: number | null; suggestionHandlers: IUseSuggestionListHandlers } {\n    const suggestionsLength = useMemo(() => suggestions.length, [ suggestions ]);\n\n    const [ state, setFocusedItem ] = useState<IUseSuggestionListState>({ focusedIndex: null });\n\n    const handleInputKeyDown = useCallback((event: React.KeyboardEvent) => {\n        switch (event.keyCode) {\n            case KEY_CODE.UP:\n                event.preventDefault();\n                event.stopPropagation();\n\n                setFocusedItem(({ focusedIndex, ...rest }) => ({\n                    ...rest,\n                    focusedIndex: focusedIndex ? focusedIndex - 1 : suggestionsLength - 1\n                }));\n\n                break;\n            case KEY_CODE.DOWN:\n                event.preventDefault();\n                event.stopPropagation();\n\n                setFocusedItem(({ focusedIndex, ...rest }) => ({\n                    ...rest,\n                    focusedIndex: focusedIndex === null || focusedIndex === suggestionsLength - 1 ? 0 : focusedIndex + 1\n                }));\n\n                break;\n\n            case KEY_CODE.ENTER:\n                if (suggestionsLength && state.focusedIndex !== null) {\n                    event.preventDefault();\n                    event.stopPropagation();\n\n                    onSelect(suggestions[state.focusedIndex]);\n\n                    setFocusedItem(prevState => ({\n                        ...prevState,\n                        focusedIndex: null\n                    }));\n                } else {\n                    setFocusedItem(prevState => ({\n                        ...prevState,\n                        focusedIndex: null\n                    }));\n                }\n\n                break;\n\n            default:\n                break;\n        }\n\n        // onKeyDown(event);\n    }, [ suggestions, state ]);\n\n    const handleItemMouseDown = useCallback((event: React.MouseEvent, index: number) => {\n        event.stopPropagation();\n        event.preventDefault();\n\n        onSelect(suggestions[index]);\n\n        setFocusedItem(prevState => ({\n            ...prevState,\n            focusedIndex: null\n        }));\n    }, [ suggestions, state ]);\n\n    const handleItemMouseEnter = useCallback((_: React.MouseEvent, index: number) => {\n        setFocusedItem(prevState => ({\n            ...prevState,\n            focusedIndex: index\n        }));\n    }, []);\n\n    useEffect(() => {\n        if (! isListOpened) {\n            setFocusedItem(prevState => ({\n                ...prevState,\n                focusedIndex: null\n            }));\n        }\n    }, [ isListOpened ]);\n\n    return {\n        ...state,\n        suggestionHandlers: {\n            handleInputKeyDown,\n            handleItemMouseDown,\n            handleItemMouseEnter\n        }\n    };\n}\n\nexport default useSuggestionList;\n","import React, { ReactNode, RefObject, useCallback, useEffect, useState } from 'react';\nimport { Size } from '@vtblife/uikit/legacy';\nimport { Input } from '@vtblife/uikit/dist/components/input/legacy/input';\nimport cn from '@search/classname/src';\nimport useControl, { IUseControlReturnedHandlers } from '@search/hooks/src/useControl';\n\nimport useSuggestionList, { IUseSuggestionListState } from './useSuggestionList';\n\nimport './styles.css';\n\nexport interface ISuggestion {\n    label: string;\n    type?: string;\n}\n\ninterface ICheckIsOpen <Suggestion extends ISuggestion> {\n    /**\n     * Признак фокуса на списке\n     */\n    isFocus: boolean;\n    /**\n     * Введенный текст\n     */\n    label: string;\n    /**\n     * Выбранные элемент из списка\n     */\n    suggestion?: Suggestion;\n\n    /**\n     * Набор подсказок\n     */\n    suggestions?: Suggestion[];\n}\n\nexport interface IInitialSuggestState<Suggestion extends ISuggestion> {\n    /**\n     * Введенный текст\n     */\n    label: string;\n\n    /**\n     * Состояние списка, открыт или нет\n     */\n    isListOpened: boolean;\n\n    /**\n     * Обьект выбранной подсказки\n     */\n    suggestion?: Suggestion;\n}\n\nexport interface ISuggestProps<Suggestion extends ISuggestion = ISuggestion> {\n    /**\n     * Ссылка на рутовый DOM элемент компонента.\n     */\n    innerRef?: RefObject<HTMLDivElement>;\n\n    /**\n     * Кастомный ренедер инпута\n     */\n    renderInput?: (\n        props: {\n            inputRef?: RefObject<HTMLSpanElement | HTMLInputElement>;\n            borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n            inputSize?: Size;\n            placeholder?: string;\n            onInputToggleFocus?: (disabled: boolean) => void;\n            label?: string;\n            disabled?: boolean;\n            borderOut?: boolean;\n            clear?: boolean;\n            isError?: boolean;\n            autoFocus?: boolean;\n            focused?: boolean;\n        },\n        state: IInitialSuggestState<Suggestion>,\n        handlers: IUseControlReturnedHandlers & {\n            handleInputChange: (text: string) => void;\n            handleInputKeyDown: (e: React.KeyboardEvent) => void;\n        }\n    ) => ReactNode;\n\n    /**\n     * Кастомный ренедер списка\n     */\n    renderList?: (props: {\n        suggestions: Suggestion[];\n        renderItemLabel: (suggestion: Suggestion) => ReactNode;\n    }, suggestionState: IUseSuggestionListState & { label?: string }, handlers: {\n        handleItemMouseDown: (event: React.MouseEvent, index: number) => void;\n        handleItemMouseEnter: (event: React.MouseEvent, index: number) => void;\n    }) => ReactNode;\n\n    /**\n     * Обработчик пустого инпута\n     */\n    onClear?: () => void;\n\n    /**\n     * Кастомный ренедер пустого списка\n     */\n    renderEmptyList?: (props: {emptyText?: string}) => void;\n\n    /**\n     * Коллбэк получения данных\n     */\n    fetchSuggestions?: (text: string) => void;\n\n    /**\n     * Обработчик изменения текста в инпуте\n     * @param text\n     */\n    onTextChange?: (text: string) => void;\n\n    /**\n     * Обработчик потери фокуса в input\n     */\n    onBlur?: (e:React.FocusEvent<HTMLInputElement>) => void;\n\n    /**\n     * Обработчик получения фокуса в input\n     */\n    onFocus?: (e:React.FocusEvent<HTMLInputElement>) => void;\n\n    /**\n     * Кастомный ренедер элемента списка подсказок\n     */\n    renderItemLabel?: (suggestion: Suggestion) => React.ReactNode;\n\n    width?: 'max';\n\n    borderSide?: 'square' | 'rounded_square' | 'square_rounded';\n\n    inputSize?: Size;\n\n    /**\n     * Коллбэк выбора значения\n     * @param suggestion\n     */\n    onSelect: (suggestion: Suggestion) => void;\n\n    /**\n     * Очищать состояние саджеста после выбора значения\n     */\n    clearOnSelect?: boolean;\n\n    /**\n     * Кнопка для очищения input\n     */\n    clear?: boolean;\n\n    /**\n     * Ошибка ?\n     */\n    isError?: boolean;\n\n    /**\n     * Выбранные элемент из списка\n     */\n    suggestion?: Suggestion;\n\n    borderOut?: boolean;\n\n    /**\n     * Набор подсказок\n     */\n    suggestions?: Suggestion[];\n\n    /**\n     * Состояние саджеста\n     */\n    disabled?: boolean;\n\n    /**\n     * Вспомогательный текст внутри компонента. Отображается, когда значение не выбрано\n     */\n    placeholder?: string;\n\n    /**\n     * Label внутри компонента. Отображается всегда\n     */\n    label?: string;\n\n    /**\n     * Размер\n     */\n    size?: Size;\n\n    /**\n     * Автофокус для input\n     */\n    autoFocus?: boolean;\n\n    /**\n     * Текст для пустого списка\n     */\n    emptyText?: string;\n\n    /**\n     * Класс миксин\n     */\n    className?: string;\n\n    /**\n     * Обработчик проверки отрисовки списка\n     */\n    checkListShowing?: (state: ICheckIsOpen<Suggestion>) => boolean;\n\n    /**\n     * Обработчик фокуса и блюра на поле Suggest (дизейбл формы для фикса бага на iOS Safari)\n     */\n    onInputToggleFocus?: (disabled: boolean) => void;\n\n    onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n}\n\nexport const cnSuggest = cn.bind(null, 'Suggest');\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst DEFAULT_SUGGESTIONS: any[] = [];\n\nconst renderInputDefault: ISuggestProps['renderInput'] = (suggestProps, state, handlers) => {\n    const onFocus = suggestProps.onInputToggleFocus ? () => {\n        suggestProps.onInputToggleFocus?.(true);\n    } : handlers.handleFocus;\n\n    const onBlur = suggestProps.onInputToggleFocus ? () => {\n        suggestProps.onInputToggleFocus?.(false);\n    } : handlers.handleBlur;\n\n    return (\n        <Input\n            autoFocus={suggestProps.autoFocus}\n            // @ts-ignore\n            size={suggestProps.inputSize} // eslint-disable-line\n            value={state.label}\n            onBlur={onBlur}\n            onFocus={onFocus}\n            name='suggest-input'\n            onChange={handlers.handleInputChange}\n            onKeyDown={handlers.handleInputKeyDown}\n            placeholder={suggestProps.placeholder}\n            label={suggestProps.label}\n            hasClear={suggestProps.clear}\n            isError={suggestProps.isError}\n            className={cnSuggest('input')}\n            disabled={suggestProps.disabled}\n        />\n    );\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst renderListDefault: ISuggestProps<any>['renderList'] = (suggestProps, state, handlers) =>\n    <ul className={cnSuggest('list')}>\n        {suggestProps.suggestions.map((suggestion, index) => {\n            return (\n                <li\n                    key={index}\n                    onMouseEnter={e => handlers.handleItemMouseEnter(e, index)}\n                    onMouseDown={e => handlers.handleItemMouseDown(e, index)}\n                    className={cnSuggest('list-item', { focused: state.focusedIndex === index })}>\n                    {suggestProps.renderItemLabel(suggestion)}\n                </li>\n            );\n        })}\n    </ul>;\n\nconst renderEmptyListDefault: ISuggestProps['renderEmptyList'] = ({ emptyText }) => {\n    return (\n        <div className={cnSuggest('list', { empty: true })}>\n            {emptyText}\n        </div>\n    );\n};\n\nconst renderItemLabelDefault: ISuggestProps['renderItemLabel'] = suggestion => suggestion.label;\n\nconst Suggest = <Suggestion extends ISuggestion>({\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    size = Size.Medium,\n    borderSide,\n    borderOut = false,\n    onInputToggleFocus,\n    inputSize,\n    width,\n    className,\n    innerRef,\n    disabled,\n    onSelect,\n    renderInput = renderInputDefault,\n    renderList = renderListDefault,\n    renderItemLabel = renderItemLabelDefault,\n    renderEmptyList = renderEmptyListDefault,\n    clearOnSelect = false,\n    autoFocus = false,\n    suggestions = DEFAULT_SUGGESTIONS as Suggestion[],\n    suggestion,\n    onClear,\n    onTextChange,\n    onFocus,\n    onBlur,\n    fetchSuggestions,\n    onClick,\n    placeholder,\n    label,\n    emptyText = 'Ничего не найдено',\n    clear = false,\n    isError = false,\n    checkListShowing\n}: ISuggestProps<Suggestion>) => {\n    const [ state, setState ] = useState<IInitialSuggestState<Suggestion>>({\n        label: suggestion ? suggestion.label : '',\n        isListOpened: false\n    });\n\n    const handleSelectItem = useCallback((selectedItem: Suggestion) => {\n        if (selectedItem) {\n            setState(prevState => {\n                const newState = { ...prevState };\n\n                if (clearOnSelect) {\n                    newState.label = '';\n                } else if (suggestion === undefined) {\n                    // Устанавливаем значение, если саджест неуправляемый извне\n                    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n                    newState.label = selectedItem.label;\n                    newState.suggestion = selectedItem;\n                }\n\n                return ({\n                    ...newState,\n                    isListOpened: false\n                });\n            });\n        }\n\n        onSelect && onSelect(selectedItem);\n    }, [ clearOnSelect, onSelect, suggestion ]);\n\n    const { suggestionHandlers, focusedIndex } = useSuggestionList<Suggestion>({\n        suggestions,\n        isListOpened: state.isListOpened\n    }, handleSelectItem);\n\n    const [ controlState, controlHandlers ] = useControl({ disabled, focused: autoFocus }, {\n        onBlur,\n        onFocus\n    }, { disabled });\n\n    const handleInputChange = useCallback((text: string) => {\n        onTextChange && onTextChange(text);\n\n        setState(prevState => {\n            if (text !== state.label) {\n                fetchSuggestions && fetchSuggestions(text);\n            }\n\n            return ({\n                ...prevState,\n                label: text,\n                suggestion: undefined,\n                isListOpened: Boolean(text)\n            });\n        });\n\n        if (! text) {\n            onClear && onClear();\n        }\n    }, [ onTextChange, state.label, fetchSuggestions, onClear ]);\n\n    useEffect(() => {\n        // Если инпут потерял фокус, то закрываем список\n        if (! controlState.focused) {\n            const trimmedText = state?.label?.trim();\n\n            setState(prevState => {\n                return ({ ...prevState, label: trimmedText, isListOpened: false });\n            });\n        } else {\n            // Если инпут в фокусе\n            setState(prevState => {\n                const isListOpened = Boolean(prevState.label && ! prevState.suggestion);\n\n                return ({\n                    ...prevState,\n                    isListOpened\n                });\n            });\n        }\n    }, [ controlState.focused, suggestions, state?.label ]);\n\n    useEffect(() => {\n        if (suggestion) {\n            setState(prevState => {\n                return ({\n                    ...prevState,\n                    label: suggestion ? suggestion.label : '',\n                    suggestion\n                });\n            });\n        } else if (! suggestion) {\n            setState(prevState => {\n                return ({\n                    ...prevState,\n                    label: '',\n                    suggestion: undefined\n                });\n            });\n        }\n    }, [ suggestion ]);\n\n    const isShowEmptyList = state.isListOpened && ! suggestions.length && Boolean(state.label);\n    let isShowList = suggestions.length > 0 && state.isListOpened;\n\n    if (checkListShowing) {\n        isShowList = checkListShowing({\n            isFocus: Boolean(controlState.focused),\n            label: state.label,\n            suggestion,\n            suggestions\n        });\n    }\n\n    return (\n        <div\n            data-test='filter-geo-suggest'\n            ref={innerRef}\n            onClick={onClick}\n            className={cnSuggest(null, { size, width }, className)}>\n            {\n                renderInput(\n                    {\n                        borderOut,\n                        borderSide,\n                        inputSize,\n                        placeholder,\n                        label,\n                        disabled,\n                        clear,\n                        autoFocus,\n                        isError,\n                        focused: controlState.focused,\n                        onInputToggleFocus\n                    },\n                    state,\n                    {\n                        ...controlHandlers,\n                        handleInputChange,\n                        handleInputKeyDown: suggestionHandlers.handleInputKeyDown\n                    })\n            }\n            {\n                isShowList && renderList({\n                    suggestions,\n                    renderItemLabel\n                }, {\n                    label: state.label,\n                    focusedIndex\n                }, {\n                    handleItemMouseDown: suggestionHandlers.handleItemMouseDown,\n                    handleItemMouseEnter: suggestionHandlers.handleItemMouseEnter\n                })\n            }\n            {\n                isShowEmptyList && renderEmptyList({ emptyText })\n            }\n        </div>\n    );\n};\n\nexport default Suggest;\n","import React, { HTMLAttributes, RefObject } from 'react';\n\nimport { cnPopup } from '../Popup';\nimport './PopupTail.css';\n\nexport interface IPopupTailProps extends HTMLAttributes<HTMLDivElement> {\n    /**\n     * Ссылка на хвостик.\n     */\n    innerRef?: RefObject<HTMLDivElement>;\n}\n\nexport const PopupTail = ({\n    className,\n    innerRef,\n    ...props\n}: IPopupTailProps): React.ReactElement => (\n    <div\n        {...props}\n        className={cnPopup('tail', undefined, className)}\n        ref={innerRef}\n    />\n);\n","import React, {\n    useRef,\n    useState,\n    useEffect,\n    RefObject,\n    HTMLAttributes,\n    FunctionComponent,\n    MutableRefObject\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport classname from '@search/classname/src';\nimport mergeRefs from '../../../lib/mergeRefs';\nimport {\n    Size,\n    View,\n    Tone,\n    SizeEnum,\n    ToneEnum,\n    ViewEnum\n} from '../../../types';\n\nimport {\n    Offset,\n    Direction,\n    DrawingParams\n} from './types';\n\nimport { PopupTail } from './PopupTail';\n\nimport { getViewportFactor } from './getViewportFactor';\nimport { getPopupPosition, getTailPosition } from './getPosition';\nimport {\n    getTailDimensions,\n    getPopupDimensions,\n    getScopeDimensions,\n    getAnchorDimensions,\n    getViewportDimensions\n} from './getDimensions';\n\nimport './Popup.css';\n\nconst VIEWPORT_ACCURACY_FACTOR = 0.99;\n\nexport const cnPopup = classname.bind(null, 'Popup');\n\nexport interface IPopupProps extends HTMLAttributes<HTMLDivElement> {\n    /**\n     * Элемент, относительно которого необходимо позиционировать попап.\n     */\n    anchor: RefObject<HTMLElement>;\n\n    /**\n     * Ссылка на DOM элемент попапа.\n     */\n    innerRef?: MutableRefObject<HTMLDivElement | undefined> | undefined;\n\n    /**\n     * Видимость попапа.\n     */\n    visible?: boolean;\n\n    /**\n     * Наличие хвостика у попапа.\n     */\n    hasTail?: boolean;\n\n    /**\n     * Направления раскрытия блока.\n     *\n     * @default ['bottom-left', 'bottom-center', 'bottom-right', 'top-left', 'top-center', 'top-right', 'right-top', 'right-center', 'right-bottom', 'left-top', 'left-center', 'left-bottom']\n     */\n    directions?: Direction[];\n\n    /**\n     * Цвет попапа\n     */\n    tone?: Tone;\n\n    /**\n     * Вид попапа\n     */\n    view?: View;\n\n    /**\n     * Рамер попапа\n     */\n    size?: Size;\n\n    /**\n     * Отступ попапа относительно основного направления.\n     *\n     * @default 0\n     */\n    mainOffset?: number;\n\n    /**\n     * Отступ попапа относительно второстепенного направления.\n     *\n     * @default 0\n     */\n    secondaryOffset?: number;\n\n    /**\n     * Отступ хвостика от края попапа.\n     *\n     * @default 0\n     */\n    tailOffset?: number;\n\n    /**\n     * Отступ от края окна браузера.\n     *\n     * @default 0\n     */\n    viewportOffset?: number;\n}\n\nconst getDrawingParams = (\n    anchor: RefObject<HTMLElement>,\n    popupRef: RefObject<HTMLDivElement | undefined>,\n    directions: Direction[],\n    hasTail: boolean,\n    tailRef: RefObject<HTMLElement>,\n    offsets: Offset\n): DrawingParams => {\n    const anchorDimensions = getAnchorDimensions(anchor);\n    const popupDimensions = getPopupDimensions(popupRef);\n    const viewportDimensions = getViewportDimensions();\n    const scopeDimensions = getScopeDimensions({ current: document.body });\n\n    let viewportFactor = 0;\n\n    const params: DrawingParams = {\n        direction: 'bottom-left',\n        popupPosition: { top: 0, left: 0 },\n        tailPosition: { top: 0, left: 0 }\n    };\n\n    for (const nextDirection of directions) {\n        const popupPosition = getPopupPosition(nextDirection, anchorDimensions, popupDimensions, offsets);\n        const nextViewportFactor = getViewportFactor(popupPosition, viewportDimensions, popupDimensions, offsets);\n\n        if (nextViewportFactor >= viewportFactor) {\n            params.popupPosition = {\n                top: popupPosition.top - (scopeDimensions.top + window.pageYOffset),\n                left: popupPosition.left - (scopeDimensions.left + window.pageXOffset)\n            };\n\n            params.direction = nextDirection;\n\n            viewportFactor = nextViewportFactor;\n        }\n\n        if (viewportFactor > VIEWPORT_ACCURACY_FACTOR) {\n            break;\n        }\n    }\n\n    if (hasTail) {\n        const tailDimensions = getTailDimensions(tailRef);\n\n        params.tailPosition = getTailPosition(\n            params.direction,\n            anchorDimensions,\n            popupDimensions,\n            tailDimensions,\n            offsets\n        );\n    }\n\n    return params;\n};\n\nconst getOffsets = ({\n    mainOffset,\n    secondaryOffset,\n    tailOffset,\n    viewportOffset\n}: {\n    mainOffset: number;\n    secondaryOffset: number;\n    tailOffset: number;\n    viewportOffset: number;\n}, tailRef: RefObject<HTMLElement>): Offset => {\n    const tailDimensions = getTailDimensions(tailRef);\n    const computedMainOffset =\n        (mainOffset >= 0 && tailDimensions.size > 0) ?\n            Math.max(mainOffset, Math.round(tailDimensions.size * Math.SQRT1_2)) :\n            mainOffset;\n\n    return {\n        main: computedMainOffset,\n        secondary: secondaryOffset,\n        tail: tailOffset,\n        viewport: viewportOffset\n    };\n};\n\nconst Popup: FunctionComponent<IPopupProps> = ({\n    anchor,\n    className,\n    visible = true,\n    hasTail = false,\n    size = SizeEnum.M,\n    tone = ToneEnum.LIGHT,\n    view = ViewEnum.PRIMARY,\n    directions = [\n        'bottom-center'\n    ],\n    innerRef,\n    secondaryOffset = 0,\n    mainOffset = 0,\n    tailOffset = 0,\n    viewportOffset = 0,\n    ...props\n}) => {\n    const [ direction, setDirection ] = useState(directions[0]);\n\n    const timerRef = useRef<number>(0);\n\n    /**\n     * Контейнер с ссылкой на DOM элемент попапа\n     */\n    const popupRef = useRef<HTMLDivElement>();\n\n    /**\n     * Контейнер с ссылкой на DOM элемент хвостика\n     */\n    const tailRef = useRef<HTMLDivElement>(null);\n\n    const updateRefsPosition = () => {\n        if (timerRef.current === 0) {\n            if (popupRef.current !== null) {\n                if (popupRef.current && ! popupRef.current.style.top) {\n                    // При первом рендеринге попап появляется, но у него ещё нету координат,\n                    popupRef.current.style.top = '-9999px';\n                }\n            }\n        }\n\n        window.clearTimeout(timerRef.current);\n\n        timerRef.current = window.setTimeout(() => {\n            const offsets = getOffsets({\n                mainOffset,\n                tailOffset,\n                secondaryOffset,\n                viewportOffset\n            }, tailRef);\n            const params = getDrawingParams(anchor, popupRef, directions, hasTail, tailRef, offsets);\n\n            if (popupRef.current !== null && popupRef.current !== undefined) {\n                popupRef.current.style.top = `${params.popupPosition!.top}px`;\n                popupRef.current.style.left = `${params.popupPosition!.left}px`;\n                popupRef.current.style.visibility = 'visible';\n            }\n\n            if (tailRef.current !== null) {\n                tailRef.current.style.top = `${params.tailPosition!.top}px`;\n                tailRef.current.style.left = `${params.tailPosition!.left}px`;\n            }\n\n            setDirection(params.direction);\n        }, 0);\n    };\n\n    useEffect(() => {\n        updateRefsPosition();\n\n        if (visible) {\n            window.addEventListener('scroll', updateRefsPosition);\n            window.addEventListener('resize', updateRefsPosition);\n        } else {\n            window.removeEventListener('scroll', updateRefsPosition);\n            window.removeEventListener('resize', updateRefsPosition);\n        }\n\n        return () => {\n            window.clearTimeout(timerRef.current);\n\n            window.removeEventListener('scroll', updateRefsPosition);\n            window.removeEventListener('resize', updateRefsPosition);\n        };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [ visible, anchor.current, directions ]);\n\n    if (! visible) {\n        return null;\n    }\n\n    return (\n        createPortal(\n            <div\n                style={props.style}\n                ref={mergeRefs(popupRef, innerRef)}\n                className={cnPopup(null, { visible, view, tone, direction, size }, className)}>\n                {props.children}\n                {\n                    hasTail ? <PopupTail innerRef={tailRef} /> : null\n                }\n            </div>,\n            document.body\n        )\n    );\n};\n\nexport default Popup;\n","import React, {\n    useRef,\n    RefObject,\n    HTMLAttributes,\n    FunctionComponent,\n    MutableRefObject\n} from 'react';\nimport classname from '@search/classname/src';\nimport mergeRefs from '../../../lib/mergeRefs';\nimport {\n    Size,\n    View,\n    Tone,\n    SizeEnum,\n    ToneEnum,\n    ViewEnum\n} from '../../../types';\n\nimport { PopupTail } from '../Popup/PopupTail';\n\nimport {\n    Direction\n} from '../Popup/types';\n\nimport './InlinePopup.css';\n\nexport const cnPopup = classname.bind(null, 'InlinePopup');\n\nexport interface InlinePopupProps extends HTMLAttributes<HTMLDivElement> {\n    /**\n     * Элемент, относительно которого необходимо позиционировать попап.\n     */\n    anchor: RefObject<HTMLElement>;\n\n    /**\n     * Ссылка на DOM элемент попапа.\n     */\n    innerRef?: MutableRefObject<HTMLDivElement | undefined> | undefined;\n\n    /**\n     * Видимость попапа.\n     */\n    visible?: boolean;\n\n    /**\n     * Наличие хвостика у попапа.\n     */\n    hasTail?: boolean;\n\n    /**\n     * Направления раскрытия блока.\n     * Пока реализовано только bottom-center'\n     *\n     * @default 'bottom-center'\n     */\n    direction?: Direction;\n\n    /**\n     * Цвет попапа\n     */\n    tone?: Tone;\n\n    /**\n     * Вид попапа\n     */\n    view?: View;\n\n    /**\n     * Рамер попапа\n     */\n    size?: Size;\n\n    /**\n     * Отступ попапа относительно основного направления.\n     *\n     * @default 0\n     */\n    mainOffset?: number;\n\n    /**\n     * Отступ попапа относительно второстепенного направления.\n     *\n     * @default 0\n     */\n    secondaryOffset?: number;\n\n    /**\n     * Отступ хвостика от края попапа.\n     *\n     * @default 0\n     */\n    tailOffset?: number;\n\n    /**\n     * Отступ от края окна браузера.\n     *\n     * @default 0\n     */\n    viewportOffset?: number;\n}\n\nconst InlinePopup: FunctionComponent<InlinePopupProps> = ({\n    anchor,\n    className,\n    visible = true,\n    hasTail = false,\n    size = SizeEnum.M,\n    tone = ToneEnum.LIGHT,\n    view = ViewEnum.PRIMARY,\n    direction = 'bottom-center',\n    innerRef,\n    ...props\n}) => {\n    /**\n     * Контейнер с ссылкой на DOM элемент попапа\n     */\n    const popupRef = useRef<HTMLDivElement>();\n\n    /**\n     * Контейнер с ссылкой на DOM элемент хвостика\n     */\n    const tailRef = useRef<HTMLDivElement>(null);\n\n    if (! visible) {\n        return null;\n    }\n\n    return (\n        <div\n            style={props.style}\n            ref={mergeRefs(popupRef, innerRef)}\n            className={cnPopup(null, { visible, view, tone, direction, size }, className)}>\n            {props.children}\n            {\n                hasTail ? <PopupTail innerRef={tailRef} /> : null\n            }\n        </div>\n    );\n};\n\nexport default InlinePopup;\n","/* eslint-disable @typescript-eslint/naming-convention */\nimport React, { Fragment, useState, useCallback, useRef, RefObject, useEffect } from 'react';\nimport classname from '@search/classname/src';\nimport { useOnClickOutside } from '@search/hooks/src/useOnClickOutside';\nimport Popup, { IPopupProps } from '../Popup';\nimport InlinePopup from '../InlinePopup';\nimport { SizeEnum, ToneEnum, ViewEnum } from '../../../types';\n\nexport type TriggerElement = HTMLDivElement | HTMLButtonElement | HTMLLinkElement;\n\nimport './styles.css';\n\nconst cnTooltip = classname.bind(null, 'Tooltip');\n\ninterface ITooltipHandlers {\n    isVisible: boolean;\n    handleShow: () => void;\n    handleClose: () => void;\n    handleToggle: () => void;\n    triggerRef: RefObject<TriggerElement>;\n}\n\nexport interface ITooltipProps extends Omit<IPopupProps, 'anchor'> {\n    /**\n     * Видимость tooltip\n     */\n    visible?: boolean;\n\n    /**\n     * Рендер контента\n     * @param opts\n     */\n    renderContent: (opts: {handleClose(): void}) => React.ReactNode;\n\n    /**\n     * Рендер триггера\n     * @param opts\n     */\n    renderTrigger: (opts: ITooltipHandlers) => React.ReactNode;\n\n    /**\n     * коллбэк закрытия тултипа\n     */\n    onHide?: () => void;\n\n    /**\n     * Инлайновый тултип\n     */\n    inline?: boolean;\n}\n\nconst Tooltip = ({\n    hasTail,\n    directions,\n    size = SizeEnum.M,\n    tone = ToneEnum.LIGHT,\n    view = ViewEnum.CLEAR,\n    visible = false,\n    renderContent,\n    renderTrigger,\n    className,\n    mainOffset = 4,\n    onHide,\n    inline = false\n}: ITooltipProps) => {\n    const [ currentVisible, setVisible ] = useState<boolean>(visible);\n    const triggerRef = useRef<TriggerElement>(null);\n    const contentRef = useRef<HTMLDivElement>();\n\n    const handleClickOutside = useCallback(() => {\n        setVisible(false);\n\n        if (onHide) {\n            onHide();\n        }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    useOnClickOutside([ contentRef, triggerRef ], handleClickOutside, currentVisible);\n\n    const handleShow = useCallback(() => {\n        setVisible(true);\n    }, []);\n\n    const handleClose = useCallback(() => {\n        setVisible(false);\n\n        if (onHide) {\n            onHide();\n        }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    const handleToggle = useCallback(() => setVisible((prevState: boolean) => ! prevState), []);\n\n    useEffect(() => {\n        setVisible(visible);\n    }, [ visible ]);\n\n    const popupContent = inline ? (\n        <InlinePopup\n            mainOffset={mainOffset}\n            size={size}\n            tone={tone}\n            view={view}\n            innerRef={contentRef}\n            hasTail={hasTail}\n            anchor={triggerRef}\n            className={cnTooltip(null, { size, view, tone }, className)}\n            direction={directions ? directions[0] : undefined}\n            visible={currentVisible}\n        >\n            <div className={cnTooltip('content')}>\n                {renderContent({ handleClose })}\n            </div>\n        </InlinePopup>\n    ) : (\n        <Popup\n            mainOffset={mainOffset}\n            size={size}\n            tone={tone}\n            view={view}\n            innerRef={contentRef}\n            hasTail={hasTail}\n            anchor={triggerRef}\n            className={cnTooltip(null, { size, view, tone }, className)}\n            directions={directions}\n            visible={currentVisible}\n        >\n            <div className={cnTooltip('content')}>\n                {renderContent({ handleClose })}\n            </div>\n        </Popup>\n    );\n\n    return inline ? (\n        <div className={cnTooltip('wrap')}>\n            {\n                renderTrigger({ isVisible: currentVisible, handleShow, handleClose, handleToggle, triggerRef })\n            }\n            {\n                currentVisible ? popupContent : null\n            }\n        </div>\n    ) : (\n        <Fragment>\n            {\n                renderTrigger({ isVisible: currentVisible, handleShow, handleClose, handleToggle, triggerRef })\n            }\n            {\n                currentVisible ? popupContent : null\n            }\n        </Fragment>\n    );\n};\n\nexport default Tooltip;\n","import { RefObject, MutableRefObject } from 'react';\n\nexport const mergeRefs = <TElement extends HTMLElement>(\n    source?: MutableRefObject<HTMLElement | undefined>,\n    ...targets: (MutableRefObject<HTMLElement | undefined> | undefined)[]\n) => {\n    if (typeof requestAnimationFrame !== 'undefined') {\n        /* eslint-env browser */\n        requestAnimationFrame(() => {\n            targets.forEach(target => {\n                if (source && target) {\n                    target.current = source.current;\n                }\n            });\n        });\n    }\n\n    return source as RefObject<TElement>;\n};\n\nexport default mergeRefs;\n","export enum SizeEnum {\n    XS = 'xs',\n    S = 's',\n    M = 'm',\n    L = 'l',\n    XL = 'xl',\n    XXL = 'xxl',\n    XXXL = 'xxxl',\n    XXXXL = 'xxxxl'\n}\n\nexport type Size = 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' | 'xxxl' | 'xxxxl';\n","export enum ToneEnum {\n    GREY = 'grey',\n    BLUE = 'blue',\n    LIGHT = 'light',\n    DARK = 'dark',\n    PRIMARY = 'primary',\n    SECONDARY = 'secondary'\n}\n\nexport type Tone = 'grey' | 'blue' | 'dark' | 'primary' | 'secondary' | 'light';\n","export enum ViewEnum {\n    PRIMARY = 'primary',\n    SECONDARY = 'secondary',\n    CLEAR = 'clear',\n    OUTLINED = 'outlined'\n}\n\nexport type View = 'primary' | 'secondary' | 'clear' | 'outlined';\n","export enum ModeEnum {\n    RADIO = 'radio',\n    RADIO_CHECK = 'radio-check',\n    CHECK = 'check'\n}\n\nexport enum InputModeEnum {\n    number = 'number'\n}\n\nexport type Mode = 'radio' | 'radio-check' | 'check';\n"],"names":["SuggestItemTypeEnum","View","InspectionStatusEnum","DeveloperAppLandingType","s","developerId","developerLandingMapper","developerName","DeveloperAppLandingSeoType","origin","developerNameSeo","developerAppLandingMapper","developerAppLandingDefaults","DeveloperAppLandingRoute","SusaninRoute","displayName","metadata","config","pattern","p","this","patternHost","conditions","super","defaults","fromQuery","toQuery","DeveloperLandingType","DeveloperLandingSeoType","developerLandingDefaults","DeveloperLandingRoute","DeveloperType","id","name","region","pageNumber","DeveloperSeoType","developerDefaults","DeveloperRoute","NewBuildingRoute","params","seoParams","regionId","defaultRegion","undefined","Number","strToNum","parsedParams","result","regionParams","translit","String","numToStr","DeveloperSearchType","DeveloperSearchSeoType","developerSearchDefaults","DeveloperSearchRoute","NewBuildingCardCommonParams","commissioningDate","finishingFlat","floorMin","floorMax","floorFirst","floorLast","bathroom","rooms","roomMapper","priceMin","priceMax","priceType","totalAreaRangeMin","totalAreaRangeMax","livingAreaRangeMin","livingAreaRangeMax","kitchenAreaRangeMin","buildingId","pageSize","sort","from","NewBuildingCardCommonSeoParams","newBuildingCardCommonDefaults","NewBuildingOffersSortEnum","fromCommonQuery","Array","isArray","map","toCommonQuery","NewBuildingCardType","subRegion","type","newBuildingTypeMapper","NewBuildingCardSeoType","newBuildingCardDefaults","NewBuildingCardRoute","regionSlugSimple","context","rootRegions","getById","NewBuildingConstructionCommonParams","NewBuildingConstructionCommonSeoParams","NewBuildingConstructionType","NewBuildingConstructionSeoType","newBuildingConstructionDefaults","NewBuildingConstructionRoute","NewBuildingQuizType","NewBuildingQuizSeoType","NewBuildingQuizRoute","ROSSIYA","regionSlugHost","parentId","narrowRegion","regionSlug","getByTranslitName","hostParts","regionSlugPath","countrySlugPath","getSlugFromGeo","countrySlugId","slug","getGeoFromSlug","NewBuildingSearchMapRoute","NewBuildingSearchRoute","commissioningSeo","roomSeo","euroPlanningSeo","hasFinishingSeo","finishingTypeSeo","buildingClassSeo","wallsTypeSeo","floorLastSeo","ceilingHeightSeo","kitchenAreaRangeMinSeo","law214Seo","escrowSeo","armyMortgageSeo","motherCapitalSeo","installmentSeo","closedAreaSeo","conciergeSeo","balconySeo","apartmentsSeo","parkingSeo","flatsSpecialEventsSeo","priceMaxSeo","pricePerMeterMaxSeo","cheapSeo","closeToMetroSeo","metroSeo","rayon","okrug","geoSlugSeo","city","NewBuildingSearchParams","excludeLong","excludeLat","NewBuildingSearchSeoParams","NewBuildingSearchMapTileRoute","WLNewBuildingSearchRoute","seo","parseFloat","commissioning","addressId","metroId","districtId","newBuildingId","transportType","maxMinutes","wallsType","wallsTypeMapper","parking","parkingMapper","floorsTotalMin","floorsTotalMax","floorLastMapper","ceilingHeight","balcony","buildingClass","buildingClassMapper","hasFinishing","finishingMapper","finishingType","finishingTypeMapper","standalone","apartments","apartmentsMapper","concierge","closedArea","guardedArea","accreditedByVTB","law214","escrow","armyMortgage","installment","motherCapital","closedSales","selectedNewBuildingId","flatsSpecialEvents","otherSpecialEvents","miscSpecialEvents","notOnlyM2Pro","geoSlug","mapBounds","bounds","min","x","y","max","polygon","z","showHighlighted","NewBuildingSearchType","euroPlanningMapper","closeToMetroMapper","priceMaxMapper","cheapMapper","priceTypeSeo","pricePerMeterMaxMapper","kitchenAreaRangeMinMapper","ceilingHeightMapper","balconyMapper","conciergeMapper","closedAreaMapper","law214Mapper","escrowMapper","armyMortgageMapper","installmentMapper","motherCapitalMapper","flatsSpecialEventMapper","lx","ly","rx","ry","pol","NewBuildingSearchSeoType","fillGeoSeo","geoIds","isCloseToMetro","length","geoId","cityMapper","getCityMapperByRegion","seoFromTypeOptional","districtMapper","getDistrictMapperByRegion","mskRayonMapper","rayonOrOkrug","addGeo","geoArray","getGeoNumber","geo","searchDefaults","NewBuildingSortEnum","mskCityMapper","spbCityMapper","newBuildingTypes","raw","indexOf","split","year","quarter","quarterNumber","parseInt","quarterMapper","Object","values","CommissioningEnum","includes","commissioningMapper","kitchen","finishingTypeFromHasFinishing","FinishingTypeEnum","sOtdelkoySeoValue","concat","YES","apartmentsOnlySeoStr","IsApartmentsOptionsString","ParkingTypeString","AreaUnitEnum","toIds","mskDistrictIds","Boolean","hasBounds","some","coord","yMapVectorUnpack","metroMapper","getMetroMapperByRegion","kind","seoResult","queryResult","totalSegments","join","finishingTypeDeduplicated","Set","finishingSeoTag","FinishingEnum","slugNumber","slugSource","toString","yMapVectorPack","RegionIdEnum","ret","regionRet","convertParamsToGQLFilters","ClassifiedRoute","byId","bySlug","regGeo","regionMapper","regionIdDefault","createRouterProvider","RouterProvider","useRouter","parkingsMapper","SeoMapper","UNKNOWN","CLOSED","UNDERGROUND","OPEN","livingTenantMapper","CHILDREN_ALLOWED","PETS_ALLOWED","sortOffersMapper","date","timeToMetro","room","floor","totalArea","price","date_asc","timeToMetro_desc","room_desc","floor_desc","totalArea_desc","price_desc","priceSqMeter","priceSqMeter_desc","distanceToCityCenter","updateDate_desc","updateDate","windowsDirectionMapper","BOTH","REAR","FRONT","seoSeg1","seoSeg2","seoSegPrice","geoSlug1","geoSlug2","renovation","renovationMapper","renovationSegment","metroIds","metroSegment","metroBranch","newSegment","newBuildingMapper","newBuilding","bankPledgeOptionsSegment","bankPledgeMapper","bankPledgeOptions","houseCategory","houseCategorySegment","cotedjSegment","roomsInOffer","addresses","geohash","districtIds","newBuildingIds","newBuildingType","newBuildingName","dealType","dealTypeMapper","categoryType","categoryTypeMapper","totalAreaMin","totalAreaMax","landAreaMin","landAreaMax","houseAreaMin","houseAreaMax","bathroomLocation","mortgagePayment","priceMaxSegment","priceUnit","livingAreaMin","livingAreaMax","kitchenAreaMin","kitchenAreaMax","seoSegBuildEpoch","builtYearMin","builtYearMax","last","first","cellHeight","bathroomMapper","bathroomSegment","landStatus","landStatusSegment","heating","gas","water","electricity","sewerage","communications","timeLimit","transport","transportTimeLimit","nearMetroSegment","livingFacility","livingFacilityMapper","furniture","furnitureMapper","livingTenantOptions","utilitiesIncluded","depositType","commisionType","rentPrepayment","rentPrepaymentSegment","walls","wallsMapper","parkings","parkingsSegment","author","authorTypeMapper","userId","authorSegment","sellType","sellTypeMapper","photoOptions","layoutImageOptions","layoutImageMapper","renovationProgram","nearbyOptions","sellerOrganizationName","infrastructure","hasLift","seoMortgageAllowed","seoMortgageAllowedSegment","windowsDirection","buildEpoch","buildEpochMapper","onlineView","selectedOffers","citySegment","segments","isGetEmpty","tagCount","mskMetroBranchMapper","geoSlugs","tile","utm_source","utm_medium","utm_campaign","utm_content","utm_term","DealType","RealtyObjectType","floorArr","areArr","SearchSeoChpuMapper","SeoChpuMapper","extraTagWeight","Map","tagsIntersection","ctx","isFlat","isRent","isHouse","isLand","isApartments","isEuroLayout","Rooms","euroKitchenArea","isLastFloor","isChpuDeposite","renovacziya","evroodnushka","evrodvushka","evrotreshka","malogabaritnaya","apartamenty","cottage","returnParams","reduce","prev","cur","generateFloorMap","generateAreChpuMap","odnoetazhnyj","dvuhetazhnyj","trekhetazhnyj","chpuKeys","keys","chpuMap","PhoneCallType","offerId","PhoneCallSeoType","PhoneCallRoute","e","message","middlewareUrl","sid","uid","oid","dedupeValues","o","key","match","add","unknown","AuthorTypeOptionsWithRealtor","owner","agency","developer","partner","realtor","pit","kvartiru","komnatu","uchastok","dom","usadba","kupit","snyat","new","NewBuilding","second","Renovation","euro","cosmeticheskii","disainerskii","studiya","SellType","secondary_primary","secondary","primary_reassignment","primary","alternative","MONOLITH","BRICK_MONOLITH","BRICK","PANEL","BLOCK","WOOD","INTERNET","WASHING_MACHINE","FRIDGE","DISHWASHER","AIR_CONDITIONER","TV","NO","KITCHEN","ALL","notInPledge","HAS_ANY","stalin","brezhnev","khrushchev","WITHOUT_FINISHING","PRE_FINISHING","FINE","WITH_FURNITURE","studii","FIRST","SECOND","THIRD","FOURTH","FinishingFlatEnum","chistovaya","biznes","BuildingClass","komfort","ekonom","elitnyy","kirpichnye","WallsTypeString","monolitnye","panelnye","blochnye","FloorConstraintsString","sdan","stroitsya","lyuboy","zhk","kvartal","loft","mfk","rezidentsiya","mikroraion","samolet","deshevyye","CeilingHeightString","evrodvushki","evrotreshki","FlatsSpecialEventString","zamoskvoretskaya","solncevskaya","sokolnicheskaya","mck","mskOblCity","balashikha","dubna","aprelevka","bronnitsy","vidnoe","volokolamsk","voskresensk","vysokovsk","golitsyno","dedovsk","dzerzhinskiy","dmitrov","dolgoprudniy","domodedovo","drezna","egorevsk","zhukovskiy","zvenigorod","ivanteevka","istra","kashira","klin","kolomna","korolyov","kotelniki","krasnoarmeysk","krasnogorsk","krasnozavodsk","krasnoznamensk","kubinka","lobnya","lukhovitsy","lytkarino","lyubertsy","mozhaisk","mytischi","noginsk","odintsovo","ozyory","podolsk","protvino","pushkino","puschino","ramenskoe","reutov","ruza","serpukhov","solnechnogorsk","stupino","taldom","fryazino","khimki","khotkovo","chekhov","shatura","schyolkovo","elektrogorsk","elektrostal","yakhroma","mskCity","mskOblCityIds","mskCityIds","mskOblDistrict","mskSpecialDistricts","mskDistrict","mskDistrictMapper","mskOblDistrictIds","mskOblMetroStation","myakinino","mskMetroStation","aeroport","akademicheskaya","alekseevskaya","altufevo","aminevskaya","andronovka","anikeevka","annino","arbatskaya","arbatskaya2","aviamotornaya","aviamotornaya2","avtozavodskaya","avtozavodskaya2","babushkinskaya","bagrationovskaya","bakovka","balakovka","baltiiskaya","barrikadnaya","baumanskaya","begovaya","belokamennaya","belomorskaya","belorusskaya","belorusskaya2","belyaevo","beskudnikovo","bibirevo","bittsa","borisovo","borovitskaya","bratislavskaya","butirskaya","butovo","chekhovskaya","cherkizovskaya","chertanovskaya","chkalovskaya","davidkovo","degunino","depo","dinamo","dmitrovskaya","dmitrovskaya2","dobrininskaya","dolgoprudnaya","domodedovskaya","dostoevskaya","dubrovka","dubrovka2","elektrozavodskaya","fili","fili2","fiztekh","fonvizinskaya","frunzenskaya","govorovo","grazhdanskaya","izmailovo","izmailovskaya","kakhovskaya","kalanchyovskaya","kalitniki","kaluzhskaya","kantemirovskaya","kashirskaya","khlebnikovo","khoroshyovo","khoroshyovskaya","khovrino","kievskaya","kolomenskaya","kommunarka","komsomolskaya","konkovo","koptevo","kosino","kozhukhovskaya","krasnogorskaya","krasnogvardeiskaya","krasnopresnenskaya","krasnoselskaya","krilatskoe","krimskaya","kropotkinskaya","kubanskaya","kuntsevskaya","kuntsevskaya2","kurskaya","kutuzovskaya","kuzminki","lefortovo","lesoparkovaya","lianozovo","lianozovo2","likhobori","lokomotiv","lubyanka","lukhmanovskaya","luzhniki","lyublino","marino","mark","marksistskaya","mayakovskaya","medvedkovo","mendeleevskaya","mezhdunarodnaya","minskaya","mitino","mnyovniki","molodyozhnaya","moskvoreche","nagatinskaya","nagornaya","nakhabino","nekrasovka","nemchinovka","nizhegorodskaya","novatorskaya","novodachnaya","novogireevo","novokhokhlovskaya","novokosino","novokuznetskaya","novoperedelkino","novoslobodskaya","novoyasenevskaya","okruzhnaya","okruzhnaya2","okruzhnaya3","okskaya","oktyabrskaya","olkhovaya","opalikha","orekhovo","ostafevo","otradnoe","ozyornaya","panfilovskaya","partizanskaya","paveletskaya","pavshino","pechatniki","penyagino","pererva","perovo","pervomaiskaya","pikhtino","pionerskaya","planernaya","pokrovskoe","polezhaevskaya","polyanka","novomoskovskaya","prazhskaya","profsoyuznaya","prokshino","proletarskaya","pushkinskaya","ramenki","rasskazovka","rimskaya","rizhskaya","rostokino","rumyantsevo","salarevo","savyolovskaya","savyolovskaya2","seligerskaya","semyonovskaya","serpukhovskaya","setun","sevastopolskaya","shabolovskaya","shcherbinka","shchukinskaya","shchyolkovskaya","shelepikha","sheremetevskaya","shipilovskaya","silikatnaya","skhodnenskaya","skolkovo","smolenskaya","smolenskaya2","sokol","sokolniki","solntsevo","spartak","sportivnaya","stakhanovskaya","streshnevo","strogino","studencheskaya","sukharevskaya","sviblovo","taganskaya","teatralnaya","tekhnopark","tekstilshchiki","terekhovo","testovskaya","timiryazevskaya","timiryazevskaya2","tretyakovskaya","trikotazhnaya","troparyovo","trubnaya","tsaritsino","tsaritsino2","tsska","tulskaya","turgenevskaya","tushinskaya","tushinskaya2","tverskaya","ugreshskaya","universitet","varshavskaya","vdnkh","vikhino","vistavochnaya","vladikino","vnukovo","vodniki","voikovskaya","volokolamskaya","volokolamskaya2","volzhskaya","voroncovskaya","voroncovskaya2","yasenevo","yuzhnaya","zhulebino","zil","zorge","zyablikovo","zyuzino","mskMetroMapper","mskOblMetroIds","mskMetroIds","mskOblRayon","mskRayon","bogorodskoe","golovinskiy","brateevo","filyovskiy_park","taganskiy","meschanskiy","ostankinskiy","cheryomushki","beskudnikovskiy","chertanovo_severnoe","marina_roscha","khoroshyovskiy","veshnyaki","vostochnoe_izmailovo","savyolki","yuzhnoe_medvedkovo","preobrazhenskoe","basmannyi","severnoe_izmailovo","presnenskiy","severnoe_tushino","tekstilschiki","severnoe_medvedkovo","babushkinskiy","alekseevskiy","akademicheskiy","chertanovo_yuzhnoe","severnoe_butovo","yuzhnoe_butovo","altufevskiy","biryulyovo_vostochnoe","vostochnyi","kurkino","losinoostrovskiy","kotlovka","lomonosovskiy","molzhaninovskiy","nizhegorodskiy","matushkino","staroe_kryukovo","metrogorodok","krasnoselskiy","khamovniki","zamoskvoreche","prospekt_vernadskogo","kuntsevo","sokolinaya_gora","yakimanka","schukino","ryazanskiy","gagarinskiy","savyolovskiy","timiryazevskiy","biryulyovo_zapadnoe","golyanovo","dmitrovskiy","donskoi","marfino","mozhaiskiy","kryukovo","silino","arbat","tverskoi","danilovskiy","levoberezhnyi","voikovskiy","dorogomilovo","yuzhnoe_tushino","yuzhnoportovyi","obruchevskiy","tyopliy_stan","nagornyi","chertanovo_tsentralnoe","zapadnoe_degunino","butyrskiy","begovoi","vostochnoe_degunino","ivanovskoe","kapotnya","severnyi","yaroslavskiy","mskOblRayonIds","mskRayonIds","ekbMetroMapper","uralmash","geologicheskaya","botanicheskaya","mashinostroitelei","uralskaya","kznMetroMapper","aviastroitelnaya","yashlek","ametevo","gorki","dubravnaya","kremlyovskaya","nskMetroMapper","sibirskaya","gagarinskaya","zaeltsovskaya","samaraMetroMapper","bezimyanka","moskovskaya","kirovskaya","yungorodok","rossiiskaya","pobeda","sovetskaya","alabinskaya","nnMetroMapper","gorkovskaya","burevestnik","leninskaya","burnakovskaya","kanavinskaya","strelka","zarechnaya","moskva","isMskWide","isSpbWide","spbMetroMapper","regionMetroSlugMapper","spbDistrictMapper","lenOblCity","spbInnerTowns","kolpino","kronshtadt","zelenogorsk","sestroretsk","lomonosov","petergof","pavlovsk","pushkin","spbCity","pargolovo","levashovo","pontonniy","sapyorniy","metallostroi","beloostrov","komarovo","molodyozhnoe","pesochniy","repino","serovo","smolyachkovo","solnechnoe","ushkovo","strelna","lisiy_nos","shushary","aleksandrovskaya","tyarlevo","lenOblCityIds","spbCityIds","lenOblDistrict","boksitogorskii","volosovskii","volkhovskii","vsevolozhskii","viborgskii_lo","gatchinskii","kingiseppskii","kirishskii","kirovskii_lo","lodeinopolskii","lomonosovskii","luzhskii","podporozhskii","priozerskii","slantsevskii","sosnovoborskii","tikhvinskii","tosnenskii","spbDistrict","admiralteiskii","vasileostrovskii","viborgskii","kalininskii","kirovskii","kolpinskii","krasnogvardeiskii","krasnoselskii","kronshtadtskii","kurortnii","moskovskii","nevskii","petrogradskii","petrodvortsovii","primorskii","pushkinskii","frunzenskii","tsentralnii","lenOblDistrictIds","spbDistrictIds","lenOblMetroStation","devyatkino","spbMetroStation","avtovo","admiralteiskaya","bukharestskaya","vasileostrovskaya","vladimirskaya","volkovskaya","viborgskaya","dunaiskaya","elizarovskaya","zvenigorodskaya","zvyozdnaya","kupchino","ladozhskaya","lesnaya","lomonosovskaya","narvskaya","novokrestovskaya","zenit","novocherkasskaya","obukhovo","ozerki","parnas","petrogradskaya","politekhnicheskaya","primorskaya","ribatskoe","sadovaya","spasskaya","udelnaya","chernishevskaya","elektrosila","putylovskaya","lenOblMetroIds","spbMetroIds","OfferSeoType","slugAndId","offerDefaults","slugRegExp","RegExp","OfferRoute","extraPatterns","groups","SchemaTypeError","deal","house","land","studio","multiroom","openplan","BuildEpochSeoMatcher","mapCached","entries","stalinka","khrushchevka","brezhnevka","matchAll","_isFirstMatch","seg","variants","isSegAlreadyPushed","push","$","PriceSeoMatcher","msk","spb","province","deshevye","nedorogo","elitnye","dachu","find","reg","regionTranslit","fullName","label","value","getGtmLabel","window","Sentry","isPresent","t","titleSorter","a","b","title","CopyObject","copy","changed","next","constructor","mutation","graphql","useCallbackEmail","gql","useGqlContext","useCallback","vars","opts","client","AddressStore","items","get","getGql","__typename","mainName","TipTypeEnum","item","set","remove","delete","DistrictStore","ids","_sorted","byRegionDistricts","titleShort","has","sortedByTitle","filter","byRegion","filtered","addDistrict","district","isEmpty","GeoKind","Error","shortDisplayName","locativeName","locativeDisplayName","cityInTitle","word","locativeWord","startsWith","substring","endsWith","cityIn","textPrefixIn","narrowRegionId","isIntracity","geoProtoDistrict","RouteStore","route","body","color","colorHex","geoProtoRoute","MetroStore","routes","_entities","_noInterchanged","entities","allRoutesColors","allRoutesColorsList","sorted","station","createMetroStation","findRouteByStations","stationIds","groupedByRoute","idSet","fullGroups","group","equalStations","stations","stationId","stationsMap","stationGroup","groupedByAlphabet","noInterchanged","letter","aggregate","charCodeAt","forEach","processed","interchangedStations","interchanged","metroStationNoIntercharged","routeId","replace","metro","interchangeStationsIds","interchangeStationsIdsList","coordinates","geoProtoMetroStationRaw","stationMap","routeMap","processedStations","stationRaw","interchangedStation","geoKindFromGqlKind","GeoBaseStore","districts","store","lines","locative","line","geoBaseStoreFromGql","address","getByIds","useGeoTips","qv","filters","geoFilter","Filters","developerFilter","addressIds","React","metros","newBuildings","developers","dataLayerPush","data","dataLayer","googleOptimizeConfigDefault","GoogleOptimizeContext","GoogleOptimizeProvider","children","Provider","GtmOnVisibleContext","it","IntersectionTrigger","threshold","useGtmOnVisibleContext","useGtmOnVisible","containerRef","onVisible","el","current","imageLazyOptionsDefault","defaultMockSrc","isBrowserSupportsLazy","HTMLImageElement","prototype","rootMargin","ImageLazyObserverContext","useImageLazyObserver","ImageLazyObserverProvider","rootRef","parent","useIntersectionTrigger","useImageLazy","loadingLazy","ref","src","srcSet","mockSrc","ll","loading","mock","realRef","setCount","imgRef","extRef","subRef","real","cn","classname","ImageLazySeo","dataSet","noLocalItemScope","itemProp","itemScope","width","height","srcWidth","srcHeight","originPath","metaName","className","imgClassName","imgProps","toLowerCase","getSrcSet","useImageLazySrcSet","calc","itemType","crossOrigin","content","defaultData","defaultProvider","img","ImageLazySrcSetContext","useClImageLazySrcSetUrl","baseUrl","scale","isHiDpi","URLSearchParams","location","search","ImageLazySrcSetProvide","scales","getUrl","url","imageSliderActiveItemRestoreItem","scrollIntoView","imageSliderCrossSwipeAnimateDefault","isVertical","touchShift","shiftAbs","Math","abs","dims","getBoundingClientRect","right","left","bottom","top","opacity","style","transform","toFixed","ImageSlider","crossSwipeAnimate","itemClassName","containerCrossSwipeEnabled","onCrossSwipeFwd","onCrossSwipeBack","restoreItemKey","onActiveItem","noOverflow","itemRefs","setItem","useImageSliderItems","restoreItem","savedRef","onScroll","parentRect","parentFirst","parentLast","parentCenter","round","targetKey","targetChild","child","childRect","childFirst","childLast","preventDefault","useImageSliderActiveItem","touchPosStartRef","touchShiftEndRef","getItemElement","onTouchStart","event","touches","clientX","clientY","onTouchEnd","onTouchMove","shift","isActionTriggered","useImageSliderCross","vertical","overflow","index","bind","deferQueue","deferTick","deferQueueRun","cb","pop","props","ioCache","elementOptions","isNative","IntersectionObserver","io","root","observerCallback","update","disconnect","size","observer","entry","target","isIntersecting","onInvisible","unobserve","clear","Promise","resolve","then","observe","visibleRoot","setVisibleRoot","itRef","NewBuildingAnalytics","cnCustomTypography","CustomTypography","level","tag","bold","lineThrough","noWrap","align","classNameProp","rest","Component","useMemo","icons","FOOT","fill","xmlns","d","fillOpacity","PUBLIC_TRANSPORT","fillRule","clipRule","IconTransport","Icon","ImageBanner","targetLink","image","view","gtm","gtmClickData","gtmShowData","gtmAdditionalClickData","useClassifiedOfferDataLayerPush","handleClick","href","onClick","alt","cnList","List","separator","layout","ListItem","dataGtm","placementId","format","onShow","defaultProps","desktopImageUrl","urls","MetroRoute","onDarkBackground","withoutTransport","searchUrl","timeMinutes","hasSearchUrl","backgroundColor","text","variant","isUrl","DEFAULT_BUTTON_TEXT","SNIPPET_PHONE_QUERY","SnippetPhone","onPhoneEventPush","phoneParams","render","isMobile","onMap","calltouchId","buttonProps","useState","formattedNumber","isReplaceable","phoneFromGql","setPhoneFromGql","originalPhone","setOriginalPhone","buttonData","setButtonData","phoneParamsRef","useRef","useEffect","isEqual","load","useManualGql","makeCall","phoneURL","open","prevState","newBuildingPhone","original","useCalltouchReplacement","ctId","calltouchPhone","hasTriedReplace","replaceError","phone","formatPhone","skipSymbols","separateLast","replaceable","replaced","commonButtonProps","DATA_GTM","fullWidth","FilterCollapser","activeCount","collapsed","resetRaw","reset","toggle","stopPropagation","Size","useFilterCollapser","initCollapsed","clearSelected","setCollapsed","toggleCollapsed","close","SnippetContext","SnippetProviderContext","isOpenMap","state","setState","toggleMap","openMap","closeMap","DeveloperToRegionMap","mortgage","getDeveloperBannerGtmData","developerWithPromoName","page_type","pageType","commonFields","keySpecProject","theme","ensureArray","ensureNumericArray","deserializers","handler","CommissioningFilter","FinishingTypeFilter","RegionFilter","RoomFilter","PriceFilter","Area","to","TransportLimitFilter","TimeLimit","TransportType","parsedMetroIds","parsedDistrictIds","parsedAddressIds","parsedNewBuildingIds","GeoFilter","AreaFilter","LivingAreaFilter","KitchenAreaFilter","FloorFilter","FloorConstraints","CellHeightFilter","CeilingHeight","BathroomFilter","Bathroom","BalconyFilter","BalconyOptions","ParkingFilter","ParkingType","WallsTypeFilter","WallsType","ApartmentFilter","IsApartments","PositionFilter","Position","SafetyFilter","Safety","DeveloperFilter","FloorsTotalFilter","BuildingClassFilter","AccreditationFilter","Accreditation","NewBuildingDealFilter","NewBuildingDeal","PaymentTypeFilter","PaymentType","CommissioningListFilter","BuildingsFilter","FinishingFlatFilter","ClosedSalesFilter","ShowHighlightedFilter","MapBoundsFilter","SelectedNewBuildingFilter","FlatsSpecialEventsFilter","FlatsSpecialEvents","OtherSpecialEventsFilter","OtherSpecialEvents","MiscSpecialEventsFilter","MiscSpecialEvents","NotOnlyM2ProFilter","newbuildingFilterDeserializer","deserialize","parsedQuery","filterName","hasFilter","parsedObject","NewbuildingFilterCollection","FilterCollection","rebuild","_filters","newbuildingFilterFactory","create","getInitialFilters","initialFilters","getInitialAdditionalFilters","resetGeo","getFilters","getInitialOfferBuildingsFilters","getInitialOfferFilters","serializers","val","range","hasBalcony","isApartment","position","safety","accreditation","commissioningList","buildings","includingClosedSales","shouldShowHighlighted","addValue","destructObjects","filteredValue","subValues","subKey","newbuildingFilterSerializer","serialize","stringValue","enumValue","METER","FloorConstraintsEnum","ONLY","EXCLUDE","RoomsEnum","STUDIO","ROOM_1","ROOM_2","ROOM_3","ROOM_4","ROOM_5_AND_MORE","OPEN_PLAN","TransportTypeEnum","TimeLimitEnum","MAX_5_MINUTES","MAX_10_MINUTES","MAX_15_MINUTES","MAX_20_MINUTES","MAX_25_MINUTES","MAX_30_MINUTES","MAX_40_MINUTES","MAX_50_MINUTES","MAX_60_MINUTES","CeilingHeightEnum","FROM_2_5","FROM_2_7","FROM_3","FROM_4","BathroomEnum","COMBINED","PARTED","BalconyOptionsEnum","ParkingTypeEnum","WallsTypeEnum","IsApartmentsEnum","NO_APARTMENTS","APARTMENTS_ONLY","PositionEnum","SafetyEnum","BuildingClassEnum","ECONOMY","COMFORT","COMFORT_PLUS","BUSINESS","ELITE","NewBuildingDealEnum","AccreditationEnum","PaymentTypeEnum","FlatsSpecialEventEnum","OtherSpecialEventEnum","OtherSpecialEventString","MiscSpecialEventEnum","MiscSpecialEventString","i","convertDynamicReplacementError","v","DynamicReplacementErrorEnum","replacementData","setReplacementData","longRequestTimeout","setLongRequestTimeout","replacementDataRef","setFailedReplacementData","launchDynamicReplacement","modId","subpoolName","setTimeout","ct","callback","success","phoneNumber","slice","errorType","subPoolNames","clearTimeout","CalltouchError","JSON","stringify","cause","callTouchId","code","toJSON","calltouchReplacementFetch","async","addCallTouchScript","reject","timer","newPhone","VTB_IPOTEKA_LINK","STATIC_URL","NO_PHOTO_SRC","NO_PHOTO_SRC_SET","CURRENT_YEAR","Date","getFullYear","M2ProEnum","M2PRO_OPTIONS","All","buttonLabel","M2Pro","SORT_OPTIONS","OFFERS_SORT_OPTIONS","developerLandingDataGTM","isRegionSection","rootRegion","buildRegionMap","regions","buildFlatRegion","isParent","RootRegions","regionsIdMap","regionsFlat","slugs","SlugMapper","regionsEnumeration","newSlug","legacySlugToNew","getFlatList","getRegions","getRegionsLikeOptions","options","addGeoSlug","getGeoSlug","ClassifiedAnalytics","AnalyticsFromTags","contextDefault","ownerId","ClassifiedOfferGtmContext","offerRegionToMortgage","boRegion","backofficeRegionRepository","OfferYMapDesktopSwitchContainer","dark","OfferYMapDesktopSwitchLink","active","icon","dataTest","onClickRaw","OfferYMapDesktopSwitch","listUrl","mapUrl","OfferYMapDesktop","errorCatcherWrap","tileUrl","tipsVisible","tipsExpanded","handleClickList","setBounds","setPolygon","selectedArea","displaySwitcher","displayArea","isDrawAreaVisible","controlAlign","toggleDrawArea","altLayout","hasSidebar","saveSearch","showInfrastructure","setShowInfrastructure","renderCustomerFeedback","renderMortgageButton","margin","moving","setMoving","trigger","topLeft","bottomRight","isScrollZoomEnabled","onMouseUp","onMouseDown","hAlign","vAlign","hasSave","checked","onChange","shadow","handleDrawEnd","YMapClickPane","resetSelected","useYMapPane","events","win","SeoSearchUtm","storage","utmParams","hasValues","getItem","parse","localStorage","LandStatus","HouseType","RegionEnum","CategoryType","PriceUnitEnum","NewBuildingTypeEnum","SortEnum","NewBuildingSortingEnum","BuildingStatusEnum","QuarterEnum","NewBuildingClassEnum","GeoKindEnum","ImageAttributesTypeEnum","initCookieModalHack","cookieName","cookiesRejectedLSKey","styleId","userAuthorizationStateStyleId","document","querySelector","userAuthorizationStateStyle","user","__INITIAL_STATE__","userStore","styleTextNode","userAuthorizationStateStyleTextNode","__shouldUseChatStub","hostname","__isCookieModalVisible","cookie","decodeURIComponent","__isUserAuthorized","isAuthenticated","__hideCookiesModal","hideCookiesModal","updateCss","css","textContent","createTextNode","appendChild","updateUserInfoCss","run","err","console","error","DefaultBadge","textClassName","GalleryBadge","NewBuildingClassBadge","newBuildingClass","class","noBottomMargin","PreferentialMortgageBadge","Badge","before","IconPercent","rightIndent","anchorRef","BadgeBox","MortgageOfferIcon","pseudoCount","offer","staticPath","useStaticPathConfig","mul","imgUrl","iconMortgageFamily","iconMortgagePreferential","WorkingHours","mobile","workingHoursRange","setStartHoursRange","setEndHoursRange","startHourValues","endHourValues","native","start","disabled","selected","end","CalltouchCallbackError","sendCalltouchCallbackRequest","routeKey","fields","hours","tags","unitId","scheduleTime","resultDate","setHours","setMinutes","setSeconds","untilDate","setDate","getDate","toLocaleString","timeZone","time","reverse","getScheduleTime","res","rej","requestCallback","makeRequestCallback","ctw","createRequest","responseData","DEFAULT_REQUEST_ERROR_MESSAGE","INIT_REQUEST_DATA","status","STATUS","errorMessage","CallbackModal","startHour","endHour","offerLink","extra","subjectExtra","emailSender","gtmSendClick","onSendEventPush","gtmShowModal","renderTrigger","btnWrapperClass","callbackUnitId","newBuildingRanking","isNewBuilding","onClose","enableInnerText360","hasNoText","withoutIconOnButton","buttonSize","useWorkingHours","rawWorkingHoursRange","initialPhone","useInitialPhone","setPhoneNumber","requestData","setRequestData","useToggleValue","handleToggleModal","handleToggleTogVal","isOpenModal","isToggleValue","isFirstShowModal","sendGtmFirstShowModal","sendCallBackRequest","pathUniqSuffix","useCallbackRequest","sendRequest","makeSendCallBackRequest","isCallbackRequestCreated","normalizeCallbackUrl","createEmailCallback","emailMessageId","isLimitExceeded","callbackRequestId","REQUEST_THROTTLE_TIMEOUT","REQUEST_THROTTLE_COUNT","catch","isResolvedData","applicationContext","useApplicationContext","isClassifiedApp","ApplicationIdEnum","buttons","zIndex","opened","swipeToClose","scrollable","skipParenthesis","hasClear","inputMode","CoreSvgSpriteIcon","viewBoxWidth","viewBoxHeight","otherProps","viewBox","OpenButtonBlue","handleCloseOpenBtn","handleOpen","rounded","OpenButtonBlueBanner","isVisible","setVisible","hasTimerWorked","setTimerWorked","footerElement","getElementById","viewportHeight","innerHeight","handleScroll","footerTop","throttledHandleScroll","throttle","addEventListener","removeEventListener","timeoutId","OpenButtonDefault","isSticky","CustomerFeedbackOpenButton","applicationId","rect","visibility","throttleHandleScroll","customerFeedbackMutation","initialFormState","usability","details","customText","infoFullness","extraFeatures","searchSuccess","comment","contact","ACTIONS","reducer","action","USABILITY_UPDATE","payload","USABILITY_DETAILS_UPDATE","isCheck","USABILITY_DETAILS_RESET","USABILITY_CUSTOM_TEXT_UPDATE","INFO_FULLNESS_UPDATE","INFO_FULLNESS_DETAILS_UPDATE","INFO_FULLNESS_DETAILS_RESET","INFO_FULLNESS_CUSTOM_TEXT_UPDATE","EXTRA_FEATURES_UPDATE","EXTRA_FEATURES_RESET","SEARCH_SUCCESS_UPDATE","COMMENT_UPDATE","CONTACT_UPDATE","SET_INITIAL_FORM_DATA","QUESTION","FeedbackOption","USABILITY_OPTIONS","INFO_FULLNESS_OPTIONS","SEARCH_SUCCESS_OPTIONS","UsabilityDetail","InfoFullnessDetail","ExtraFeature","USABILITY_DETAILS_OPTIONS","LACK_FILTER","DIFFICULTLY","FEW_OFFERS","INACCURATE_SEARCH","SLOW_LOADING","OTHER","INFO_FULLNESS_DETAILS_OPTIONS","STREET_PANORAMA","AREA_GENERAL_PLAN","PARKING_SCHEME","MORE_PHOTO","PROJECT_BOOKLETS","EXTRA_FEATURES_OPTIONS","WINDOW_VIEW","FLOOR_PLAN","FINISHING_TYPE","REPAIR_COST","VIRTUAL_TOURS","FURNITURE_PLAN","ERROR_MESSAGE","buildCustomerFeedbackVars","usabilityText","infoFullnessText","rating","CustomerFeedbackModalNewBuildings","modalIsOpen","handleCloseModalExternal","handleCloseModal","handleFinishedFeedback","disableFeedbackReappearance","useReducer","dispatch","requestStatus","setRequestStatus","sendCustomerFeedback","useSendCustomerFeedback","handleSendCustomerFeedback","alert","SuccessModalContent","PrimaryModalContent","isLoading","radio","placeholder","rows","isUsabilityDetailsModalOpen","setUsabilityDetailsModalOpen","isInfoFullnessModalOpen","setInfoFullnessModalOpen","isExtraFeaturesModalOpen","setExtraFeaturesModalOpen","handleOpenUsabilityDetailsModal","handleCloseUsabilityDetailsModal","handleOpenInfoFullnessModal","handleCloseInfoFullnessModal","handleOpenExtraFeaturesModal","handleCloseExtraFeaturesModal","UsabilityDetailsModal","isOpen","handleClose","InfoFullnessModal","ExtraFeaturesModal","extraFeaturesSelectedText","mode","buildSurveyLink","userIdQuery","yMetricaId","CustomerFeedbackAnketologModal","auth","useM2AuthContext","cookies","useCookies","link","survey","setSurvey","CustomerFeedbackModal","useKeyCancel","onCancel","handlers","Escape","onKeyUp","CL_LOCAL_STORAGE_KEY","NB_LOCAL_STORAGE_KEY","LOCAL_STORAGE_KEY_MAP","CustomerFeedback","modalOpenEvent","setModalIsOpen","openBtnIsVisible","setOpenBtnIsVisible","handleOpenModal","currentDate","lastOpening","dateToShowBtn","useCustomerFeedbackExternalState","SPB_CENTER_DISTRICTS","SPBCenterDistricts","selectedDistricts","every","selectSPBCenterDistricts","diff","deselected","NEW_MOSCOW_DISTRICT","EXCEPT_NEW_MOSCOW_DISTRICTS","NewMoscowDistricts","isNewMoscowSelected","isExceptNewMoscowSelected","intersectExpectNewMoscowDistricts","selectNewMoscowDistricts","selectExceptNewMoscowDistricts","DistrictControl","districtsSelectButton","BasicErrorContext","setError","useBasicError","BasicErrorProvider","closeModal","modal","UseAuthClosedError","UseAuthError","closeOnOverlayClick","favoritesUrl","useLkLinks","isOpenLimitModal","FavoriteModalsContext","useFavoritesModal","FavoritesModalProvider","setParentError","setChildError","downloadOfferPdf","form","createElement","method","submit","ClassifiedFilterCollection","getDealTypeFilter","getCategoryTypeFilter","getPriceFilter","getRegionFilter","getNewBuildingFilter","getMapBoundsFilter","getMortgagePurpose","isActiveFilterHouseAllowedMortgage","MortgagePurpose","getSellerOrganizationName","categories","category","HouseCategory","isOnlySecond","isOnlyNewBuildings","isFlatFilterActive","isLandFilterActive","isHouseFilterActive","isRoomFilterActive","isRentFilterActive","isSellFilterActive","isPricePerAllSquare","AreaUnit","isPricePerMeterSquare","isMortgagePayment","isRegionMsk","isRegionMskMo","isRegionMo","isRegionMskOrMo","isRegionSpb","isRegionSpbLO","isRegionLo","isRegionSpbOrLo","isNewBuildingShown","isBankPledgeOptionActive","isSellFlatFilterActive","isFlatOrRoomFilterActive","isFloorTotalFilterShownNotHouse","isLandOrHouseFilterActive","isSellRoomFilterActive","isSellFlatOrRoomFilterActive","isWindowsDirectionFilterShownInRent","isRentFlatOrRoomFilterActive","hasMetroInRegion","regionsWithMetroEnumeration","isRenovationProgramFilterActive","isNearbySchoolFilterActive","isOnlineViewFilterActive","filterCreator","DealTypeFilter","CategoryTypeFilter","MortgagePaymentFilter","YearBuildingFilter","RenovationFilter","NewBuildingFilter","NewBuildingDataFilter","AuthorFilter","SellTypeFilter","InfrastructureFilter","PhotoOptionsFilter","LayoutImageOptionsFilter","LivingFacilityFilter","FurnitureFilter","LivingTenantOptionFilter","RentPrepaymentFilter","RentConditionsFilter","RoomsInOfferFilter","LandStatusFilter","LandAreaFilter","SupplyOptionsFilter","HouseCategoryFilter","HouseAreaFilter","HeatingFilter","BankPledgeOptionsFilter","SeoMortgageAllowedFilter","WindowsDirectionFilter","NearbySchoolFilter","RenovationProgramFilter","SellerOrganizationNameFilter","BuildEpochFilter","OnlineViewFilter","FinishingFilter","sellFlatMetadata","filterIds","persistIds","rentFlatMetadata","sellLandMetadata","sellHouseMetadata","sellRoomMetadata","rentRoomMetadata","rentHouseMetadata","createOrUpdateFilters","getRelevantFilterMetadata","isChangeSegment","filterList","newFilter","gettingFilter","filterMap","dealTypeFilter","realtyTypeFilter","realtyType","getAdditionalFilterIds","exceptIds","clearAdditionalFilters","favoritesMutation","useFavoritesMutationSafe","authScheduler","favoritesMutationCb","execute","fe","editFavoritePersonal2","firstError","BaseError","useFavoritesMutation","register","argsById","args","arg","history","favoritedIds","useRefState","initialState","deps","refresh","setAll","newState","useFavoritesButtonState","isFavoriteInitial","isFavorite","noteTextInitial","eventAddId","organizationName","forceFavoriteUpdate","isProf","isProfessional","currentRoleType","favoritesMutationSafe","isSaving","setIsSaving","pendingArgs","favorite","noteText","favoriteString","sessionStorage","depsObj","depsRef","updateFavorite","req","favoriteToggle","isNoteEditing","setNoteEditing","noteEditOpen","noteEditClose","handleDownloadPdf","noteSave","note","finally","noteDelete","setIsFavorite","query","FooterMenuItemComponent","path","useGql","footer","rawMiddleLinks","middleLinks","downloadAppQrCode","socialLinks","buildLink","absoluteUrl","cdn","topLinks","links","column","middle","menuItemComponent","directions","directionAlias","up","down","createPopper","popperGenerator","defaultModifiers","preventOverflow","offsetModifier","arrowModifier","hideModifier","arrow","padding","offset","adaptiveDirection","$container","direction","enabled","phase","fn","placement","$control","$tooltip","box","getElementSize","getWindowSize","control","tooltip","cleft","cright","ctop","cbottom","xmin","xmax","ymin","ymax","controlWithin","possibleDirections","realDirection","dir","fit","elements","reference","popper","defaultContainer","usePopper","container","triggerElement","hide","popperRefs","onClickOutside","refs","isEnabled","listener","contains","containerElement","init","tooltipElement","destroy","modifiers","boundary","SuggestPopup","popupElement","createPortal","offsetWidth","TYPE_MAP","SuggestItemMetro","SuggestItemAddress","SuggestItemDistrict","SuggestItemNewBuilding","SuggestItemDeveloper","QUERY","mskGeoIds","mskOblGeoIds","spbGeoIds","lenOblGeoIds","correctAndBroadenRegionId","currentRegionId","GeoSuggest","rootRegionsApp","RootRegionsApplicationEnum","onGeoChange","renderInput","onInputToggleFocus","autoFocus","borderOut","listBorderOut","showNewBuildingsGroup","startWithNewBuildings","placeholderWithNewBuildings","limit","suggestTypes","spySuggest","suggestionsByGroup","suggestions","setSuggestions","debouncedSuggest","useDebouncedCallback","userRegionId","suggest","groupBy","groupedItems","setSuggestion","suggestion","newSuggestion","correctSuggestion","newRegionId","renderList","focusedIndex","realIndex","ent","currentIndex","handleItemMouseDown","highlight","onMouseEnter","handleItemMouseEnter","scope","Fragment","metroStation","MetroMark","colors","Highlight","renderSuggestItem","Suggest","inputSize","show","suggestionState","renderEmptyList","emptyText","onSelect","clearOnSelect","fetchSuggestions","cnMetroMark","POSSIBLE_ACTIVE_PARTNERS_SET","headerQuery","useHeaderLoader","useGql2Loader","useHeaderFetcher","cachePrefix","authTrack","developerPromoRegionId","isFullWidth","isBordered","dataRaw","headerLoader","dataRef","router","developerWithPromoNameByRegion","resultPartner","getDeveloperPromoName","partners","fromEntries","header","onPartnerClick","partnerName","dataObj","section","currentRole","dropdownMenu","dropDownItem","subDropdownItem","isColored","cdnUrl","loginPaths","pathname","activePartner","authorizedItems","sidebar","roleType","logoutPath","encodeURIComponent","currentUrl","personalButtons","today","currentMonthStart","UTC","getMonth","nextMonthEnd","seoLdEventScript","actionName","actionNamePrefix","imageUrl","description","startDate","endDate","latitude","longitude","organizer","obj","toISOString","streetAddress","addressLocality","addressRegion","performer","Image","refImg","Tag","attrs","backgroundImage","onload","onerror","onLoad","onLoadVerticalImage","onError","MinimalBanksMortgageEconomy","underline","dotted","useTooltip","registerControl","PROPERTY_COST_MIN","PROPERTY_COST_MAX","PROPERTY_COST_STEP","OWN_AMOUNT_STEP","TERM_MIN","TERM_MAX","calculateFactoredRange","relativeValue","minFactor","maxFactor","minRelativeValue","maxRelativeValue","correctRelativeValue","getRangedValue","calculateOwnAmount","factor","useBankMortgageForm","ownAmountFromPropertyCost","formState","setFormState","calculatedFormValues","propertyCost","ownAmountMin","ownAmountMax","percent","ownAmount","step","labelFrom","formatNumber","labelTo","term","handleFieldChange","isNaN","formErrors","MinimalBanksMortgageOffersQuery","useMinimalBanksMortgageOffersLoader","response","useMinimalBanksMortgageOffersFetcher","useMinimalBanksMortgageOffersSliced","purpose","isPreferentialNbCondition","defaultVisibleOffers","formData","setFormDataRaw","isFormChangedRef","wrapperSetFormDataRaw","setFormData","fakeLoadingRaw","setFakeLoading","minimalBanksMortgageOffersLoad","isPreferential","errors","offersFull","minimalBanksMortgageOffers","offers","bestMortgageOffer","mortgage2BestOfferFromOffers","fakeLoading","handle","totalCost","totalCostFormatted","formatPrice","displayCurrency","noFractional","currency","Currency","offersOrMocks","fakeOffers","useMinimalBanksMortgageEconomy","isFormChanged","Source","UNKNOWN_SOURCE","WEB_LK","MOBILE_APP","BANKI_RU","COMFORT_SEARCH_M2","SRAVNI_RU","WEB_LANDING","NOVOSTROIKY","ZBS","MortgageAppSourceContext","useMortgageAppSource","MortgageAppSourceProvider","source","MortgageGovernmentDisclaimer","isAccent","isLongDescr","descriptionText","mainText","isImportant","splitOnRows","accent","MortgageGovernmentDisclaimerModal","onSuccess","additionalPrograms","withoutAccent","btnText","closable","inner","desc","MortgagePurposeEnum","defaultBanksTotal","defaultMortgageRateNbFormatted","formatLocaleNumber","defaultMortgageRateSecondFormatted","declensionYear","declensionByNumber","declensionHour","declensionMinute","minutes","declensionBankNominative","banksTotal","declensionBankGenitive","MortgageField","gap","titleProps","descriptionProps","resetFont","minimalBanksMortgageUrlCreate","initialSource","normalize","hash","fullUrl","Mortgage2FieldControls","Mortgage2FieldDescription","Mortgage2FieldTitle","Mortgage2Field","space","titleSize","titleAccent","descriptionAccent","Mortgage2FieldPercent","minimalPercentOld","minimalPercent","isFrom","MortgageContactFields","domain","showCallbackHours","sendQueryOnEnter","onBlur","setNameTouched","onKeyPress","nameInputValid","setName","isFormSyncing","setPhoneTouched","phoneInputValid","setPhone","Mortgage2IconWrap","isLandscapeOrientation","mortgage2ContactsFormSendMutation","useMortgage2ContactsFormSend","getSubjectAppName","appId","getRealtyObjectTypeGql","RealtyObjectEnum","offerUrl","mortgage2ParamsFromClasified","estimatedPriceByRegion","CurrencyEnum","getTotalPrice","estimatePrice","mortgageRegionId","Mortgage2StarterModal","isDefaultSelectedOffer","showMoreBankIcons","initialGovernmentMortgage","governmentMortgage","isNewVibe","alwaysFromWord","selectedMortgageOffer","mortgageOffers","isPreferentialOffer","MortgageOfferType","userInfo","useUserDetailsLoader","userInfoLoad","getGovernmentMortgage","useMortgage2Request","userDetails","userProfile","person","isFirstOpen","withoutShowContainer","gtmShowId","isModalOpened","setIsModalOpened","banksIcons","bankId","isTitlePercentAccent","shouldVTBDiscountLogic","VTB_ID","fromWord","default","payment","renderFieldNodes","minimalPaymentDiscountFormatted","minimalPaymentFormatted","propertyCostFormatted","realtyTypeFormattedLocative","ownAmountFormatted","banksInfo","timeFromBanksFormatted","textVariant","sendQuery","withoutAuth","isFormSended","Mortgage2SuccessContent","subtitle","withoutGridWrapper","upperContent","gridContent","xs","m","Mortgage2IconSuccess","cols","acc","minimalPaymentItem","minimalPaymentDiscount","minimalPayment","minimalPaymentAcc","textVariants","mortgageBannerTextVariantDefault","random","responseTimeVariants","fieldText","mortgageBannerMinutesVariantDefault","showPreferential","gtmSendId","gtmSendData","mortgageBannerMinutesVariant","mortgageBannerTextVariant","locationPlacement","withoutForm","discounts","mortgage2ContactsFormSend","useMortgage2UserForm","setFormAllTouched","setFormSended","setFormIsSending","setFormResetSendingsFields","isNameValid","isNameRequired","isPhoneValid","minimalPercentDefault","offerForPercent","minimalPercentWithDiscount","minimalPercentDiscount","waitAuth","userDetailsFetcher","useUserDetailsFetcher","userFioPhone","updateUserDetails","nameArr","surname","patronymic","primaryPhone","number","isClApp","isNbApp","isZbsApp","sourceMortgage","utm","resolveResultPromise","place","minimalBanksMortgageUrl","mobilePhone","fio","assign","URL","inputs","searchParams","k","innerHTML","windowOpen","rejectedResultPromise","optionalMortgage2ContactsFormSend","userDataFromPromise","list","subject","startCallbackHour","endCallbackHour","withGA","withoutBackofficeEmail","optionalWaitAuth","authInfo","openOrAuth","continueAfterLogin","dataUserDetails","preparedUserDetails","responseTimeFormatted","responseDescriptionFormatted","banksTotalFormattedGenitive","isFormSending","sendingError","isPhoneTouched","isNameTouched","Mortgage2ConsultModal","sendGtmId","userDetailsLoad","MortgageOfferSkeleton","BankMortgageOffers","gtmCommonClick","isAlternativeBg","selectMortgageOffer","equalPercent","minimalPercentDiscountFormatted","minimalPercentFormatted","typed","discount","PriceHoverControl","useDropdownHover","cnMrtgBuyOrDie","MortgageBuyOrDieResultCard","isProfitable","isOverLimit","texts","resultText","isOpenDisclaimer","setIsOpenDisclaimer","openDislaimer","closeDislaimer","positioning","MortgageBuyOrDieReason","RISE_PRICE_RATE","calcMortgageRate","mortgagePercent","calcFormula","futureCost","invoice","currentCost","rate","numeratorNumeratora","denominatorNumeratora","log","calcMonthPaymentMap","formatMonths","monthsFloat","timeYears","trunc","timeMonths","ceil","getDeclensionMonths","calcAccPeriod","initialRateRise","currentRateRise","currentPropertyCost","propertyCostPeriod","isFirstYear","currentPropertyCostRise","periodPaymentsWithRise","countYearsWithRise","periodPaymentsWithRiseInYears","LIMIT_ACC_YEARS","riseInPrice","calculateBuyOrDie","initialPayment","comfortInvoice","rent","cost","calculatedDieMonths","calculatedDieFinalCost","isOverLimitAcc","calculatedBuyMonths","priceMortgage","priceAcc","inWords","timeMortgage","timeAcc","typeProfitable","REQUIRED_FIELD_TEXT","validateComfortInvoice","touched","isError","mortgagePaymentWithCurrentInvoice","years","sumCredit","stupidKey","mortgageRate","countMonths","pow","calcMonthPayment","validateOwnAmount","validateRent","regionsEnumerationDie","mapRegionToSelect","MortgageBuyOrDieFormField","ROOM_OPTIONS","MortgageBuyOrDieModalForm","onCalculate","setForm","setOwnAmount","newValue","setPropertyCost","setRent","setComfortInvoice","setRoomType","roomType","regionsSelect","useSelect","option","formTouched","setFormTouched","validateForm","isFinalValidate","formValues","validateFormFields","formValidMessages","setFormValidMessages","setRentTouched","setPropertyCostTouched","setOwnAmountTouched","setComfortInvoiceTouched","handleValidToCalculate","isValidFormFields","handleChange","selectedText","is","postfix","hint","RENT_BUY_OR_ACC_KEY","COMFORT_INVOICE_BUY_OR_ACC_KEY","convertRoomForAssign","typeProfitableTextReasons","buy","die","MortgageBuyOrDieModal","modalView","setModalView","setTypeProfitable","calculatedData","setCalculatedData","getLocalStorageLastValue","handleCalculate","calculatedTypeProfitable","calculatedResult","scrollTo","handleBackToForm","handleSubmitMortgageReq","actionText","MortgageBuyOrDieTrigger","mortgageBuyOrDieImg","formatYear","FORM_ID","BanksMortgageCalculatorFields","hidden","readOnly","grid","logarithmic","contentAfter","hideNoteSpace","formatter","ArrowButton","isDisabledToHide","ArrowButtonPair","onArrowClick","isLeftEdge","isRightEdge","dataTestPrefix","ArrowButtonPop","findInvizibleNearestChilds","cr","parentElement","childs","childNodes","r","CardScroller","controls","isLeftMask","isRightMask","isBottomMargin","autoWidth","onContainerScroll","isLeftMargin","leftMargin","BanksMortgageOffersScroller","isControls","setIsLeftEdge","setIsRightEdge","arrowDirection","nearest","inline","behavior","block","scrollLeft","scrollWidth","isScrollNeeded","setIsScrollNeeded","useArrowButton","MortgageCondition","onChangeDiscount","discountType","textStyleCheckbox","MortgageDiscountConditions","discountTypes","maxMortgageDiscountFormatted","DiscountCalcEnum","NoOffersBanner","NoOffersImg","Mortgage3Calc","areButtonsHidden","gtmStarterModalSendedId","gtmShowMoreClick","buyOrDieMode","mortgageDemandLink","mortgageOfferFormData","minimalMortgagePaymentSendData","minimalMortgageRate","isSendModalOpened","isConsultModalOpened","senderState","setSenderState","isPreferentialSelectedOffer","isStupidModalOpened","setIsStupidModalOpened","isCalcBuyOrDieModalOpened","setIsCalcBuyOrDieModalOpened","openBuyOrDieModal","closeBuyOrDieModal","openStupidModalByBuyOrDie","closeStupidModal","formUrl","useGovernmentMortgage","useChangeDiscount","isShowAdditionalDiscounts","minimalIncome","firstNatureOfferMinimalPayment","parseAndFormatNumber","sendModalClose","consultModalClose","willNeedSendDiscountsVTB","initialBestMortgageOffer","isMrtgDisclaimerModalOpened","setIsMrtgDisclaimerModalOpened","handleSubmitRequest","MortgageStupidModal","isSendBuyDieAnalytics","withDiscount","isGovernmentDebtExceeds","isGovernmentPercentPoor","governmentMaxDebt","activeDiscountTypes","setActiveDiscountTypes","debt","mortgageOfferDiscountify","mortgageOfferSort","familyOffer","itOffer","emptyOffer","governmentMinPercent","discountPercent","monthPercent","denominator","calculatePayment","lastValueStr","lastValue","MortgageFieldsBuilder","gridFields","contactFields","actions","prefixNodes","renderCustomFirstGrid","prices","useStupidMortgage","isModalGovernmentOpened","setIsModalGovernmentOpened","bankLogos","minimalBanksMortgageParamsFromOffer","getMinimalBanksMortgageEconomyPercent","economy","MAX_ECONOMY","economyFormatted","maxEconomyFormatted","variables","useMinimalBanksMortgageOverall","allMinimalPayment","allMinimalPaymentFormatted","IconBus","IconPedestrian","innerWidth","$element","QRCodeTrigger","qrFgColor","qrCodeValue","fgColor","QRCodePhoneButton","renderButton","buttonVariant","dropdownContainer","Slider","totalItems","onIndexChange","contentClassName","navClassName","isNavHidden","onSetMaxItems","setIndex","maxItems","setMaxItems","slidesTotal","maxIndex","handleSetMaxItems","handleResize","clientWidth","documentElement","throttledHandleResize","handleShift","newIndex","onSwipeLeft","onSwipeRight","useSwiper","handleTouchEnd","handleTouchMove","handleTouchStart","SlimMultiSelect","forcePlaceholder","adaptiveHeight","adaptivePlacement","useMultipleSelect","capitalize","SlimSelect","cnSubwayStationMark","SubwayStationMark","cnSubwayStation","SubwayStation","noClickable","textBold","textColor","hour","padStart","withoutStartValues","filterHours","withoutOffset","setWorkingHouseRange","getSelectValues","startValue","endValue","VTBCoreYMapDesktop","center","noZoom","noPlacemark","zoom","useChangedMargin","small","point","VTBCoreYMapProvider","apiKey","staticApiKey","staticApiUrl","PoiKindToIconName","PoiKindEnum","PoiKindToImageName","PoiHintWrapper","CorePoiHint","specialization","noctidial","iconName","YMapPOI","isSelected","layerPriority","hintLayout","renderToStaticMarkup","IconClose","stroke","strokeOpacity","strokeWidth","LoadingSpinner","staticLoader","PictureWrapper","isAltView","Picture","isLayout","Arrow","HeroPictureWrapper","renderArrow","handlePrev","handleNext","renderLoader","DirectionArrow","HeroPicture","countText","offerTitle","figcaptionPosition","figcaptionPositionColor","withCount","urlErrorImage","cache","setCache","setRenderLoader","hero","setInterval","clearInterval","Mortgage2IconM2","Gallery","starterBanner","repairBanner","srcImages","initialIndexSrcImage","isOpenRepairForm","FigcaptionPosition","FigcaptionPositionColor","clickByCenter","withDuplicateSearchButton","hideThumbnails","isMortgage","isRepair","firstItem","lastItem","initialItem","mortgageRec","repairRec","indexPositionMortgageBanner","preview","imgRec","attributesType","totalImages","getImgRec","setHeroRaw","changeHero","focus","handlePrevClick","handleNextClick","thumbnailsWrapRef","upKey","useKeyPress","ARROW_UP","rightKey","ARROW_RIGHT","downKey","ARROW_DOWN","leftKey","ARROW_LEFT","wrapEl","thumbEl","thumbRect","wrapRect","thumbWidth","WIDTH_THUMBNAIL","OFFSET_THUMBNAIL","withTopTitle","paddingTop","PADDED_PREVIEW","rec","HEIGHT_THUMBNAIL","isActive","modalNode","FSGallery","belowModal","esc","ESCAPE","base","classList","classes","removeChild","ReactDOM","SizeThumbnail","M","L","ButtonTwoState","tooltipText","tooltipAsText","tooltipDirection","dataAttrs","onlyIconStyle","paddingSize","noTooltip","iconColor","normalVariant","normalColor","button","isBlack","ShareButton","gtmShare","isCircle","textPlacement","preferNativeShare","onModalVisibilityChange","isModal","setIsModal","shareUrl","isNativeShare","navigator","share","analyticsPush","fullId","nativeShare","useShareLinksNative","showModal","tt","soc_sources","onShare","circle","FavoritesButton","GalleryButtons","handleOpenPanorama","handleOpenLayout","GalleryMobile2","pictures","isVisited","layoutImageSrc","layoutImageIndex","imageDataset","renderBadges","renderSpecialEvents","renderVases","anchorHidingCircleButtons","isOfferCard","withDots","withSpace","withSpaceProp","noSlider","noSliderProps","maxPicturesCount","hovered","withNavButtons","relativeHeight","hideActionsButtons","isFirstOffer","isFavoriteActive","onFavoriteClick","renderFavoriteProp","renderFavorite","showShareButton","onShareModalVisibilityChange","gotoBack","images","restCountImages","indexImage","galleryRef","galleryImageRefs","setCurrentIndex","rectParent","childRectRight","relativeChildPosRightSide","setChildRef","setIndexImage","useGetCurrentIndexImages","layoutImageRef","circleButtonsRef","circleRightButtonsRef","circleButtonsWrapperRef","observerCircleButtonsSticky","intersectionRatio","observerCircleButtonsShow","isAnchorVisibleOrScrollThrough","boundingClientRect","display","galleryWidth","handleClickArrow","lastImageIndex","showNavButtons","showActionButtons","renderFavoriteInner","mainSrc","visited","withActionButtons","NavButtons","isLastImage","isFirstImage","ImageLazy","NoPhoto","imageSrc","setRefProps","borderBottom","Dots","carousel","showBothButtons","delay","maxWaitArgs","functionTimeoutHandler","isComponentUnmounted","debouncedFunction","cancelDebouncedCallback","debouncedCallback","apply","useIdle","isIdle","setIsIdle","idle","Idle","windowIdle","NotIdle","idleOnTabChange","idleTimeout","rememberKey","isWatcherEnabled","enableIdle","activeModals","querySelectorAll","hasFocus","disableIdle","stop","resetIdle","whenNotInteractive","within","do","when","useUseInfoFetcher","touchStart","touchEnd","isSwipe","targetTouches","dist","useVHProperty","setVHProperty","vh","setProperty","makeOfferUrl","routeParams","MinimalBanksMortgageSnippetDesktop","stateParams","isModalOpen","toggleModal","openModal","MortgageModal","snippetURL","mortgageParams","calculatorUrl","NewsTinyCard","news","Link","formattedShort","NewBuildingNews","heading","onClickNewsItem","disclaimerList","developerLogo","dataGTM","erid","mainImg","gallery","main","medium","firstImg","metroName","listItems","formatRange","billionsAsString","parts","preferRelativeUrl","relativeUrl","onlyRelativeUrl","isDomainOnlySlug","getNewBuildingLink","Paper","role","background","nominative","disclaimer","idx","dangerouslySetInnerHTML","__html","click","isClSnippet","handleClickArrowByType","arrowType","clSnippet","src2x","isFrozen","isFirst","isLast","restCount","resizeImageWidth","resizeImageHeight","frozen","handleSetActiveImageIndex","withLazyLoad","onActiveImageChange","counterEnabled","miniImagesEnabled","relativeSize","previewSize","mainRef","activeImageIndex","setActiveImageIndex","hasThumbs","visiblePictures","restPicturesCount","resetActiveImageIndex","activeImage","onMouseLeave","thumbnail","CheckboxGroup2","ModeEnum","SizeEnum","colRestriction","withoutGrid","classNameGroup","isFilter","handleChildCheck","childProps","childValue","handleChildCheckFilter","renderChildren","checkedValue","elemProps","onCheck","elem","cnFilterSelectButton","FilterSelectButton","memo","forwardRef","focused","side","NumberFormats","RangeInput","valueFrom","valueTo","unit","fromPostfix","fromLabel","toLabel","focusFrom","focusTo","Default","nameFrom","nameTo","formatOnChange","handleChangeRangeFrom","handleChangeRangeTo","onFocus","NumberInputRange","rangeInputProps","Filter","filterTitle","MobileFilterTitle","MobileFilter","MobileFilter2","desktopTitleGap","dataTestId","childrenClassName","apartmentsMapping","IsApartmentsOptions","apartmentEnumeration","DesktopApartmentFilterView","component","apartment","AreaFilterView","withoutTitle","handleAreaChange","bathroomMapping","bathroomEnumeration","BathroomFilterView","several","ceilHeightEnumeration","CeilHeightFilterView","MultiSelect","optionValue","optionClassname","tone","RadioSelect","allowNull","formatAreaRange","prefix","DesktopAreaFilterView","totalAreaFilter","livingAreaFilter","kitchenAreaFilter","livingArea","kitchenArea","handleTotalAreaChange","total","handleLivingAreaChange","living","handleKitchenAreaChange","kitchenFrom","handleReset","handleToggle","triggerRef","labels","totalAreaString","livingAreaString","kitchenAreaString","upperFirst","makeTitle","DesktopBalconyFilterView","DesktopBuildingsFilterView","isStandalone","showBuildingPicker","defaultOptions","Commissioning","quarters","Quarter","DesktopCommissioningFilterView","DesktopCommissioningListFilterView","DesktopFinishingFlatTypeFilterView","SELECT_OPTIONS","DesktopFinishingTypeFilterView","hasAllAvailableValues","allWithFinishingValues","floorConstraintsPrefixes","DesktopFloorFilterView","handleRangeChange","handleLastOnlyChange","handleLastExcludeChange","handleFirstExcludeChange","rangeString","lastPrefix","firstPrefix","DesktopGeoFiltersView","geoStore","onSubmit","voidFunction","count","addQueryDisplayValue","inputBorderSide","tips","removeTips","transportLimitFilter","suggestionRegionId","filterGeoIds","filterMetroIds","filterDistrictIds","filterAddressIds","filterNewBuildingIds","newBuildingData","newBuildingTitle","newFilters","geoSelectorActiveTab","setGeoSelectorActiveTab","handleGeoSelectorClose","handleGeoSelectorSubmit","handleMetroClick","GeoSelectorTabsEnum","handleDistrictClick","handleGeoSelectorChange","changedFilters","metroIdList","districtIdList","idList","broadenedRegionId","handleTransportLimitChange","tranpostLimitFilter","hasMetro","hasDistricts","borderSide","handleBlur","handleFocus","handleInputChange","onKeyDown","handleInputKeyDown","extraAfter","activeTab","onChangeTransportLimitChange","onTabChange","openMetroModal","DesktopGeoFiltersView2","showMapArea","clMap","isClGeoFilter","extraLinks","FilterTagList","expanded","setExpanded","toggleExpanded","allTips","formatted","timeLimitLabel","visibleTips","toggleExpandedDisabled","deleteTip","tip","resetAll","onDelete","TipContent","TransportTypeIcon","FilterTagListItem","clickable","FilterTagList2","FilterTagListItem2","svg","transportTypeOptions","timeLimitOptions","timeLimitShortOptions","MobileTransportLimitFilterView2","isTitle","containerClass","hiddenTimeOptionsWithoutTransportType","isShort","transportSelectChange","transportSelectOptions","transportSelect","timeLimitSelectChange","timeLimitSelectOptions","timeLimitSelect","GeoErrorBoundary","hasError","componentDidCatch","errorInfo","withScope","setExtra","captureException","escapeRegExp","string","metroTitleTrim","isNeedToAdd","trimmedStationTitle","handleOnSelect","handleTextChange","trim","textRegExp","anotherTextLetters","latinToCyrillic","anotherText","anotherTextRegExp","test","filterMetro","checkListShowing","isFocus","renderSuggestions","onTextChange","DistrictsTab","handleCheckboxChange","groupIndex","groupId","checkedDiff","uncheckedDiff","selectedIdsFromGroup","otherGroupIds","handleCheckboxGroupChange","groupIds","groupIdx","isGroupIdChecked","isGroupChecked","isGroupItemChecked","indeterminate","metroMapMskSvg","metroMapSpbSvg","metroMapKznSvg","metroMapEkbSvg","metroMapNskSvg","metroMapNnvSvg","metroMapSmrSvg","STATIONS_IN_RING_MSK","TabsEnum","GeoSelector","allowedTabs","isMetroTab","districtGroups","groupDistricts","districtCount","getDistrictCount","handleModalRequestClose","closeBy","ModalClosedBy","handleSelectedRemove","handleMetroChange","handleDistrictsChange","AdditionalRegionWithMetroIdEnum","metroMapSvg","isMetroMapSvgVertical","isMskOrObl","isMetroInRingSelected","handleMetroInRingCheck","tabs","MetroSvgComponent","showDistrictControl","Modal","borderRadius","onRequestClose","displayedDistricts","Suspense","fallback","MetroMapSelector","Tabs","f","ITEMS","DesktopAccreditationFilterView","DesktopBuildingClassFilterView","TRUE","DesktopClosedSalesFilterView","DesktopNewBuildingDealFilterView","DesktopPaymentTypeFilterView","DesktopPositionFilterView","DesktopSafetyFilterView","Parking","parkingEnumeration","Closed","Underground","Opened","parkingMapping","DesktopParkingFilterView","priceTypeShortMapping","priceTypeMapping","PriceInput","isShowReset","pricePreset","priceTypes","handlePriceType","handleFrom","handleTo","mortgageInput","focusPosition","updateFocusPosition","isShowPriceType","handleFocusMin","handleFocusMax","abbreviateNumber","thousandsAsNumber","fromValue","fromType","toValue","toType","MINIMAL_MORTGAGE_PAYMENT","minMortgagePaymentFormatted","DesktopPriceFilterView","DesktopPriceFilterViewWithoutDropdown","mortgagePaymentFilter","isLarge","updateFewFilters","useDropdown","handleChangeMortgagePayment","areaUnitPlaceholder","getAreaUnitPlaceholder","MortgagePaymentInput","priceFilter","preset","FilterSelect","marginRight","defaultRegionSelectOptions","DesktopRegionFilterView","searchInputValue","setSearchInputValue","resetSearchInputValue","setRegionId","useGeoUserRegion","parsedValue","handleSelectChange","getSelectedOptionLabel","currentOptions","getFilteredFlatRegionSelectOptions","onToggle","showInput","MIN_OPTIONS_NUMBER_WITH_INPUT","DesktopRoomsTypeFilterView","currentValues","handleChangeSelect","renderCustomTitle","selectedOptions","parsedValues","opt","array","customlabel","postFix","FlatsSpecialEvent","DesktopFlatsSpecialEventsFilterView","MiscSpecialEvent","DesktopMiscSpecialEventsFilterView","OtherSpecialEvent","DesktopOtherSpecialEventsFilterView","wallsEnumeration","wallsEnumerationWithWood","wallsMapping","DesktopWallsFilterView","withWood","wall","Floors","floorOptions","NotFirst","NotLast","Last","FloorFilterView","renderFloorTotalFilter","getValue","valueSet","onChangeCtx","onChangeCtxRef","isFirstSeen","isLastSeen","unshift","renderCheckboxGroup","floorValue","renderFloorFilter","FloorsTotalFilterView","KitchenAreaFromFilterView","withPlaceholder","minValue","LivingAreaFilterView","selectOptions","MobileAccreditationFilterView","MobileApartmentFilterView","MobileBalconyFilterView","selectOptionsWithSeveral","MobileBathroomFilterView","hasSeveral","MobileBuildingClassFilterView","MobileCeilHeightFilterView","MobileClosedSalesFilterView","MobileCommissioningFilterView","uikitZIndexEnabled","handleSelect","handleClear","SuggestTypeEnum","ModalSize","BorderRadius","fullScreen","ModalHeading","onClear","highlighted","MobileDeveloperFilterView","uikitModalZIndexEnabled","useModal","showSuggest","on","hideSuggest","off","isSuggestVisible","visible","handleSuggestOpen","I","MobileFinishingTypeFilterView","MobileFloorFilterView","onChangeFloor","oldValue","added","removed","getFirst","firstValue","getLast","MobileFloorsTotalFilterView","MetroMark2Item","colorsToNameMapOut","MetroMark2","MetroSelect","groupByLineInitial","checkSet","checkStations","check","isStationChecked","isGrouppedByLine","setIsGrouupedByLine","groupByAlphabetAction","groupByLineAction","stationsSelected","groupByAlphabet","groupByLine","useMetroSelect","setSearchRaw","setSearch","resetSearch","grp","toLocaleUpperCase","onReset","justified","RouteGroup","AlphaGroup","allChecked","checkAllInGroup","useMetroSelectRouteGroup","checkedInGroup","Item","MetroModal","metroOff","checkedMetroIds","checkedIds","onMetroSubmit","withDeclension","SuggestModal","cnStation","DistrictSelectItem","DistrictSelectGroup","responsive","Limit","DistrictSelect","hasLimit","isChecked","checkGroup","checkItem","useDistrictSelect","newValues","arr","newIsChecked","DistrictModal","noLimit","GeoTagItem","handleRemove","isGeoDistrictsGroupItem","isQueryDisplayValue","metroItem","addressItem","GeoTagList","FullGeoTagList","fullGeoTagOff","notUndefined","PreviewGeoTagList","queryDisplayValues","fullGeoTagOn","isFullGeoTagVisible","geoObjects","districtIdsSet","nextGeoObjects","numberedId","slicedItems","newBuildingItems","withoutMargin","MobileGeoFilterView","geoStoreProp","titleWithNewBuildings","oldFilters","districtOn","districtOff","isDistrictVisible","metroOn","isMetroVisible","suggestOn","suggestOff","splitIds","newGeoIds","tipIds","handleMetroDistrictChange","splitted","newGeoFilter","onResetMetro","onResetDistrict","onDistrictSubmit","handleRemoveItem","newDistrictIds","newMetroIds","newAddressIds","newNewBuildingIds","onSuggestChange","shouldHaveNewBuildings","MobileKitchenAreaFilterView","onKeyPressEnterBlur","useEnterBlur","MobileLivingAreaFilterView","MobileNewBuildingDealFilterView","M2PRO_OPTIONS_MOBILE","MobileNotOnlyM2ProFilterView","m2ProSelectedOption","handleM2ProChange","m2ProValue","MobileParkingFilterView","MobilePaymentTypeFilterView","MobilePositionFilterView","MobilePriceFilterView","onChangePriceType","filteredOptions","MobileRegionFilterView","isDesktop","linearOptionsList","prepared","filterValue","setFilterValue","updateFilterValue","filterValueNormalized","all","divider","MobileRoomFilterView","MobileSafetyFilterView","MobileFlatsSpecialEventsFilterView","MobileMiscSpecialEventsFilterView","MobileOtherSpecialEventsFilterView","MobileTotalAreaFilterView","MobileTransportLimitFilterView","selectOptionsWithWood","MobileWallsFilterView","isGroupedOption","FlatOptionList","isBoldParentOption","lastIndex","FilteredOptionList","GroupedOptionList","RenderRegionSelectUikitContent","full","Filter2","prepareTitle","sortDistricts","prepareList","groupMskDistricts","districtsMap","districtGroup","mskOblGroup","sortBy","sortedNestedDistricts","splited","splitListByParentId","sellFlatPricesPerAllSquareMsk","sellFlatPricesPerAllSquareSpb","sellFlatPricesPerMeterMskMo","sellFlatPricesPerMeterSpbLo","priceByMortgagePayment","l","getFlatOptions","flatOptions","substr","needle","filterFlatOptionsBySubstr","IFilter","isDefault","hasPolygon","builtYear","isDefaultRange","transportLimit","floorsTotal","facilities","furnitures","prePaymentType","DepositType","CommissionType","rentConditions","LiftOptions","willRenovation","RenovationProgram","hasNearbySchool","NearbyOptions","photoOption","PhotoOptions","layoutImageOption","bankPledgeOption","isAllowed","newBuildingDeal","paymentType","landStatuses","landArea","supplyOptions","houseArea","BathroomLocationFilter","locations","selectedNewBuilding","OnlineView","getCountActiveFilters","counter","ModalHeadingInner","StickyPhoneWrapper","anchor","bottomOffset","safeAreaBottom","hasBackground","showBeforeScrolling","wrapperRef","anchorRect","viewPortHeight","currentRect","paddingBottom","fixed","onRemove","mortgageTip","onWhiteBackground","onWhite","Button","iconLeft","extraFiltersIds","buildRangeLabel","spacedUnit","serializeToTips","getPhotoTypeTip","LayoutImageOptions","getLayoutImageTypeTip","AuthorTypeOptions","authorLabels","getAuthorTypeTip","transportTypeLabel","getTransportLimitTip","floorConstraintsLabels","getFloorLabelTip","ceilingHeightLabels","getCeilingHeightLabelTip","getAreaLabelTip","getLivingLabelTip","getKitchenLabelTip","getFloorsTotalLabelTip","getYearBuildingLabelTip","apartmentsLabels","getApartmentsLabelTip","getMortgagePriceTip","TIP_CLASS","cnButton","Tip","removeTip","openMortgagePaymentSearchModal","metroTip","RoomsOfferedOptions","roomInOfferWithText","roomForSale","roomWithText","getRoomsInOfferTips","roomsInOfferFilter","roomsInOfferText","roomsText","dealTypeText","getDealForRoom","livingFacilityMapping","LivingFacilitiesOption","getLivingFacilityTip","facility","getRoomsTips","roomFilter","realtyObjectFilter","roomsCountText","atRealtyTypeText","getLandAreaLabelTip","getHouseAreaLabelTip","getLandStatusTips","statuses","getSupplyOptionsTip","supplyOptionsFilter","heatingFilter","GasOptions","ElectricityOptions","SewerageOptions","WaterOptions","HeatingOptions","getWindowsDirectionLabel","WindowsDirectionSearchOffersEnum","getHeatingTip","getBathroomLocationTip","BathroomLocationOptions","getFloorsTotalTip","getPrepaymentTip","prepaymentType","PrepaymentType","getRentConditionsTip","getFurnitureTip","FurnitureOption","getFinishingTip","FinishingTypeOption","getCommissioningTip","yearArr","getLivingTenantOptionsTip","livingOption","LivingTenantOption","getTipsCollection","shouldIgnoreGeoIds","filterKeys","bathroomFilter","balconyFilter","renovationFilter","closedSalesFilter","buildingClassFilter","parkingFilter","wallsTypeFilter","infrastructureFilter","safetyFilter","positionFilter","accreditationFilter","newBuildingDealFilter","paymentTypeFilter","livingTenantOptionFilter","rentConditionsFilter","furnitureFilter","mapBoundsFilter","sellTypeFilter","buildingsFilter","authorFilter","livingFacilityFilter","flatsSpecialEventsFilter","otherSpecialEventsFilter","miscSpecialEventsFilter","buildEpochFilter","finishingFilter","tipsCollection","getExtraFilterIds","isRoomOrHome","isHome","titleMapFilter","floorLabel","re","geoObject","geoName","addressObj","idsSet","districtsGeo","geoTitle","districtObj","groupsAndStations","geoTip","bathroomType","bathroomLabels","saleTypeLabels","balconyLabels","buildEpochLabels","renovationType","renovationLabels","buildingClassLabels","parkingLabels","wallsLabels","infrastructureLabels","safetyLabels","positionLabels","accreditationLabels","newBuildingDealLabels","paymentTypeLabels","buildingIds","flatsSpecialEventsLabels","otherSpecialEventsLabels","miscSpecialEventsLabels","OffersSearchTips","updateFilter","removeFilter","expandFilter","removeGeo","customFilterBehavior","onUpdateLength","classNamesNewFilters","tipsIndex","setTipsIndex","expandButton","setExpandButton","expandTipsMode","setExpandTipsMode","handleRemoveTip","livingFacilities","splice","info","getElementsByClassName","getTipsIndexInfo","firstLineTipsOnly","tipsButtons","TipButton","hiddenExpandButton","RenovationEnum","InfrastructureOptions","BuildEpoch","cnBreadcrumb","Breadcrumb","allClickable","sections","regionModalSelect","withoutSeoMarkup","schema","itemListElement","contentSeo","isLastElement","cnModal","coverRef","alignLeft","showCloseButton","withScroll","withoutScroll","withoutBodyPadding","offTableCSS","closeIconSize","stylesCloseIcon","hugePriorityZIndexEnabled","asideRef","useLayoutEffect","originalOverflowX","overflowX","originalOverflowY","overflowY","onCloseButton","CloseButton","sizeClass","ClickOutside","visibleDefault","cnPaper","elevation","shadowСolor","square","mods","innerRef","pressed","iconRight","contentBefore","ToneEnum","ViewEnum","prevent","TagName","useControl","buttonState","controlHandlers","handleMouseUp","handleMouseDown","handleMouseLeave","handleMouseEnter","CheckboxControl","controlRef","cnCheckbox","autoComplete","handleButtonClick","htmlFor","cnCheckboxGroup","tokens","sanitizedRegexp","part","fontWeight","cnIcon","InputControl","autoCorrect","cnInput","extraBefore","maskProps","useHoverable","hoverRef","useFocusable","focusRef","inputRef","currentValue","setValue","changeValue","thousandSeparator","decimalSeparator","isNumericString","getInputRef","mergeRefs","currentTarget","getAnchorDimensions","dimensions","offsetHeight","pageXOffset","pageYOffset","getPopupDimensions","popupRef","area","popupHeight","popupWidth","clientHeight","getViewportDimensions","getScopeDimensions","scopeRef","getTailDimensions","tailRef","getPopupPosition","anchorDimensions","popupDimensions","offsets","checkMainDirection","checkSecondaryDirection","getTailPosition","tailDimensions","tail","halfSizeOfTail","getViewportFactor","popupPosition","viewportDimensions","viewport","viewportFactor","intersectionLeft","intersectionRight","intersectionTop","intersectionBottom","mainFirstDirection","mainSecondDirection","secondaryDirection","KEY_CODE","isListOpened","suggestionsLength","setFocusedItem","keyCode","UP","DOWN","ENTER","_","suggestionHandlers","cnSuggest","DEFAULT_SUGGESTIONS","renderInputDefault","suggestProps","renderListDefault","renderItemLabel","renderEmptyListDefault","empty","renderItemLabelDefault","handleSelectItem","selectedItem","useSuggestionList","controlState","trimmedText","isShowEmptyList","isShowList","PopupTail","cnPopup","hasTail","secondaryOffset","mainOffset","tailOffset","viewportOffset","setDirection","timerRef","updateRefsPosition","SQRT1_2","getOffsets","scopeDimensions","tailPosition","nextDirection","nextViewportFactor","getDrawingParams","cnTooltip","renderContent","onHide","currentVisible","contentRef","handleClickOutside","useOnClickOutside","handleShow","popupContent","targets","requestAnimationFrame","InputModeEnum"],"sourceRoot":""}