{"id":6492,"date":"2026-02-21T22:28:06","date_gmt":"2026-02-21T22:28:06","guid":{"rendered":"https:\/\/www.mediation-help.com\/?page_id=6492"},"modified":"2026-06-08T09:01:10","modified_gmt":"2026-06-08T09:01:10","slug":"mediatory","status":"publish","type":"page","link":"https:\/\/www.mediation-help.com\/en\/mediatory\/","title":{"rendered":"Register of specialists"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"6492\" class=\"elementor elementor-6492\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-89f4b91 e-flex e-con-boxed e-con e-parent\" data-id=\"89f4b91\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d27e22a elementor-widget elementor-widget-html\" data-id=\"d27e22a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t\r\n<style>\r\n  #mh-catalog.mh2{\r\n    max-width: 1320px;\r\n    margin: 0 auto;\r\n    padding: 22px 16px 46px;\r\n    color: var(--e-global-color-text);\r\n    font-family: inherit;\r\n  }\r\n\r\n  .mh2__head{\r\n    margin-bottom: 18px;\r\n  }\r\n\r\n  .mh2__kicker{\r\n    display:inline-flex;\r\n    align-items:center;\r\n    gap:8px;\r\n    color: rgba(14,36,72,.65);\r\n    font-weight: 800;\r\n    letter-spacing: .08em;\r\n    font-size: 12px;\r\n    text-transform: uppercase;\r\n    margin-bottom: 10px;\r\n  }\r\n\r\n  .mh2__title{\r\n    margin:0 0 14px;\r\n    color: var(--e-global-color-primary);\r\n    font-weight: 900;\r\n    letter-spacing: -0.02em;\r\n    line-height: 1.05;\r\n    font-size: clamp(28px, 4vw, 44px);\r\n  }\r\n\r\n  .mh2__tabs{\r\n    display:flex;\r\n    gap:10px;\r\n    flex-wrap:wrap;\r\n    margin-bottom: 6px;\r\n  }\r\n\r\n  .mh2__tab{\r\n    min-height: 42px;\r\n    padding: 10px 16px;\r\n    border-radius: 999px;\r\n    border: 1px solid rgba(14,36,72,.12);\r\n    background: var(--e-global-color-d9712f5);\r\n    color: var(--e-global-color-primary);\r\n    font-weight: 900;\r\n    font-size: 13px;\r\n    cursor: pointer;\r\n    transition: .18s ease;\r\n  }\r\n\r\n  .mh2__tab:hover{\r\n    transform: translateY(-1px);\r\n    box-shadow: 0 8px 18px rgba(14,36,72,.08);\r\n  }\r\n\r\n  .mh2__tab.is-active{\r\n    background: var(--e-global-color-primary);\r\n    color: #fff;\r\n    border-color: var(--e-global-color-primary);\r\n  }\r\n\r\n  .mh2__search{\r\n    position: relative;\r\n    background: var(--e-global-color-2dae0d9);\r\n    border: 1px solid rgba(14,36,72,.10);\r\n    border-radius: 14px;\r\n    padding: 10px 12px;\r\n    width: 100%;\r\n    margin-bottom: 18px;\r\n  }\r\n\r\n  .mh2__search input{\r\n    width:100%;\r\n    border:0;\r\n    outline:0;\r\n    background: transparent;\r\n    font-size: 15px;\r\n    padding-inline: 28px;\r\n    color: var(--e-global-color-text);\r\n  }\r\n\r\n  .mh2__searchIcon{\r\n    position:absolute;\r\n    left:14px;\r\n    top:19px;\r\n    transform: translateY(-50%);\r\n    color: rgba(14,36,72,.55);\r\n    pointer-events:none;\r\n    font-size: 30px;\r\n  }\r\n\r\n  .mh2__layout{\r\n    display:grid;\r\n    grid-template-columns: 320px 1fr;\r\n    gap: 18px;\r\n    align-items: start;\r\n  }\r\n\r\n  .mh2__filtersCard{\r\n    background: var(--e-global-color-d9712f5);\r\n    border: 1px solid rgba(14,36,72,.10);\r\n    border-radius: 16px;\r\n    box-shadow: 0 10px 28px rgba(14,36,72,.06);\r\n    padding: 14px 12px 12px;\r\n  }\r\n  \r\n  .mh2__filters {\r\n      position: sticky;\r\n      top: 124px;\r\n      max-height: calc(100vh - 140px);\r\n      overflow: hidden;\r\n    }\r\n    \r\n.mh2__filtersCard {\r\n  max-height: calc(100vh - 140px);\r\n  overflow-y: auto;\r\n  overscroll-behavior: contain;\r\n\r\n  \/* Firefox *\/\r\n  scrollbar-width: none;\r\n\r\n  \/* IE \/ \u0441\u0442\u0430\u0440\u0438\u0439 Edge *\/\r\n  -ms-overflow-style: none;\r\n}\r\n\r\n\/* Chrome \/ Safari \/ Edge *\/\r\n.mh2__filtersCard::-webkit-scrollbar {\r\n  display: none;\r\n}\r\n\r\n  .mh2__filtersTitle{\r\n    display:flex;\r\n    align-items:center;\r\n    gap:10px;\r\n    font-weight: 900;\r\n    color: var(--e-global-color-primary);\r\n    font-size: 14px;\r\n    padding: 6px 6px 10px;\r\n  }\r\n\r\n  .mh2__filtersIcon{\r\n    width:25px;\r\n    height:25px;\r\n    border-radius: 10px;\r\n    display:inline-flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n    background: var(--e-global-color-8b315e3);\r\n    border: 1px solid rgba(14,36,72,.08);\r\n    color: rgba(14,36,72,.8);\r\n    font-weight: 900;\r\n    font-size:20px;\r\n  }\r\n\r\n  .mh2__acc{\r\n    border-top: 1px solid rgba(14,36,72,.08);\r\n    padding: 10px 6px;\r\n  }\r\n\r\n  .mh2__acc:first-of-type{\r\n    border-top: 0;\r\n  }\r\n\r\n  .mh2__accSum{\r\n    list-style:none;\r\n    cursor:pointer;\r\n    font-weight: 800;\r\n    color: var(--e-global-color-primary);\r\n    font-size: 13px;\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:space-between;\r\n    gap:10px;\r\n  }\r\n\r\n  .mh2__accSum::-webkit-details-marker{\r\n    display:none;\r\n  }\r\n\r\n  .mh2__accSum:after{\r\n    content:\"\u25be\";\r\n    color: rgba(14,36,72,.55);\r\n    font-weight: 900;\r\n    transform: translateY(-1px);\r\n  }\r\n\r\n  details[open] > .mh2__accSum:after{\r\n    content:\"\u25b4\";\r\n  }\r\n\r\n  .mh2__list{\r\n    padding-top: 10px;\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap: 8px;\r\n    max-height: 240px;\r\n    overflow:auto;\r\n    padding-right: 4px;\r\n  }\r\n\r\n  .mh2__list::-webkit-scrollbar{\r\n    width:8px;\r\n  }\r\n\r\n  .mh2__list::-webkit-scrollbar-thumb{\r\n    background: rgba(14,36,72,.14);\r\n    border-radius: 999px;\r\n  }\r\n\r\n  .mh2__item{\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:space-between;\r\n    gap:10px;\r\n    padding: 6px 8px;\r\n    border-radius: 10px;\r\n    transition: background .15s ease;\r\n  }\r\n\r\n  .mh2__item:hover{\r\n    background: rgba(14,36,72,.03);\r\n  }\r\n\r\n  .mh2__left{\r\n    display:inline-flex;\r\n    align-items:center;\r\n    gap:8px;\r\n    font-size: 13px;\r\n    color: var(--mh-text);\r\n  }\r\n\r\n  .mh2__left input{\r\n    width:16px;\r\n    height:16px;\r\n    accent-color: var(--e-global-color-primary);\r\n  }\r\n\r\n  .mh2__cnt{\r\n    font-size: 12px;\r\n    color: rgba(14,36,72,.6);\r\n    white-space: nowrap;\r\n  }\r\n\r\n  .mh2__foot{\r\n    margin-top: 8px;\r\n    border-top: 1px solid rgba(14,36,72,.08);\r\n    padding-top: 12px;\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap: 10px;\r\n  }\r\n\r\n  .mh2__count{\r\n    display:flex;\r\n    align-items:baseline;\r\n    justify-content:space-between;\r\n    padding: 0 6px;\r\n  }\r\n\r\n  .mh2__countLabel{\r\n    font-size: 12px;\r\n    color: rgba(14,36,72,.65);\r\n    font-weight: 800;\r\n    letter-spacing: .02em;\r\n  }\r\n\r\n  .mh2__countNum{\r\n    font-size: 20px;\r\n    font-weight: 900;\r\n    color: var(--e-global-color-primary);\r\n  }\r\n\r\n  .mh2__btnReset{\r\n    height: 40px;\r\n    border-radius: 999px;\r\n    border: 1px solid rgba(14,36,72,.14);\r\n    background: var(--e-global-color-8b315e3);\r\n    color: var(--e-global-color-primary);\r\n    font-weight: 900;\r\n    cursor: pointer;\r\n  }\r\n\r\n  .mh2__btnReset:hover{\r\n    box-shadow: 0 8px 18px rgba(14,36,72,.08);\r\n  }\r\n\r\n  .mh2__grid{\r\n    display:grid;\r\n    grid-template-columns: repeat(3, minmax(0, 1fr));\r\n    gap: 16px;\r\n    align-items: stretch;\r\n  }\r\n\r\n  .mh2__card{\r\n    background: var(--e-global-color-d9712f5);\r\n    border: 1px solid rgba(14,36,72,.08);\r\n    border-radius: 18px;\r\n    overflow: hidden;\r\n    box-shadow: 0 12px 30px rgba(14,36,72,.07);\r\n    display:flex;\r\n    flex-direction:column;\r\n    height: 100%;\r\n    transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;\r\n  }\r\n\r\n  .mh2__card:hover{\r\n    transform: translateY(-2px);\r\n    box-shadow: 0 16px 34px rgba(14,36,72,.10);\r\n    border-color: rgba(14,36,72,.12);\r\n  }\r\n\r\n  .mh2__img{\r\n    position: relative;\r\n    aspect-ratio: 1 \/ 1;\r\n    background: #EEF1F4;\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:center;\r\n    overflow:hidden;\r\n  }\r\n\r\n  .mh2__img img{\r\n    width:100%;\r\n    height:100%;\r\n    object-fit: cover;\r\n    display:block;\r\n  }\r\n\r\n  .mh2__ph{\r\n    width: 34px;\r\n    height: 34px;\r\n    opacity: .55;\r\n  }\r\n\r\n  .mh2__img::after{\r\n    content:\"\";\r\n    position:absolute;\r\n    inset:0;\r\n    background: linear-gradient(\r\n      to top,\r\n      rgba(14,36,72,.82) 0%,\r\n      rgba(14,36,72,.44) 42%,\r\n      rgba(14,36,72,0) 74%\r\n    );\r\n    opacity: 0;\r\n    transition: opacity .24s ease;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .mh2__hoverPanel{\r\n    position:absolute;\r\n    left:14px;\r\n    right:14px;\r\n    bottom:14px;\r\n    z-index:3;\r\n    transform: translateY(18px);\r\n    opacity: 0;\r\n    transition: transform .24s ease, opacity .24s ease;\r\n    pointer-events:none;\r\n  }\r\n\r\n  .mh2__hoverTitle{\r\n    font-size: 11px;\r\n    font-weight: 800;\r\n    letter-spacing: .06em;\r\n    text-transform: uppercase;\r\n    color: rgba(255,255,255,.78);\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  .mh2__hoverList{\r\n    margin: 0;\r\n    padding-left: 18px;\r\n    display: grid;\r\n    gap: 4px;\r\n  }\r\n\r\n  .mh2__hoverItem{\r\n    color: #fff;\r\n    font-size: 13px;\r\n    line-height: 1.35;\r\n    font-weight: 600;\r\n  }\r\n\r\n  .mh2__card:hover .mh2__img::after,\r\n  .mh2__card:focus-within .mh2__img::after{\r\n    opacity: 1;\r\n  }\r\n\r\n  .mh2__card:hover .mh2__hoverPanel,\r\n  .mh2__card:focus-within .mh2__hoverPanel{\r\n    opacity: 1;\r\n    transform: translateY(0);\r\n  }\r\n\r\n  .mh2__body{\r\n    padding: 12px 14px 14px;\r\n    display:flex;\r\n    flex-direction:column;\r\nflex-grow: 1;\r\n  }\r\n\r\n  .mh2__bottom{\r\n     flex-grow: 1;\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap: 10px;\r\n  }\r\n\r\n  .mh2__role{\r\n    display:inline-flex;\r\n    align-items:center;\r\n    width: fit-content;\r\n    min-height: 28px;\r\n    padding: 4px 10px;\r\n    border-radius: 999px;\r\n    background: rgba(14,36,72,.05);\r\n    border: 1px solid rgba(14,36,72,.10);\r\n    color: var(--e-global-color-primary);\r\n    font-size: 11px;\r\n    font-weight: 900;\r\n    letter-spacing: .02em;\r\n  }\r\n\r\n  .mh2__name{\r\n    margin:0;\r\n    color: var(--e-global-color-primary);\r\n    font-weight: 900;\r\n    font-size: 15px;\r\n    line-height: 1.35;\r\n    min-height: 42px;\r\n  }\r\n\r\n  .mh2__nameLink{\r\n    color: inherit;\r\n    text-decoration: none;\r\n  }\r\n\r\n  .mh2__modeLine{\r\n    font-size: 12px;\r\n    line-height: 1.3;\r\n    color: var(--e-global-color-primary);\r\n    font-weight: 700;\r\n    opacity: .82;\r\n    margin-top: auto;\r\n  }\r\n\r\n  .mh2__chips{\r\n    display:flex;\r\n    align-items:center;\r\n    justify-content:space-between;\r\n    gap: 8px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .mh2__chip{\r\n    display:inline-flex;\r\n    align-items:center;\r\n    min-height: 30px;\r\n    padding: 5px 11px;\r\n    border-radius: 999px;\r\n    font-size: 11px;\r\n    font-weight: 800;\r\n    white-space: nowrap;\r\n    letter-spacing: .01em;\r\n  }\r\n\r\n  .mh2__chip--exp{\r\n    color: var(--e-global-color-secondary);\r\n    background: rgba(14,36,72,.04);\r\n    border: 1px solid rgba(14,36,72,.10);\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n  }\r\n\r\n  .mh2__chip--price{\r\n    color: var(--e-global-color-secondary);\r\n    background: rgba(14,36,72,.04);\r\n    border: 1px solid rgba(14,36,72,.10);\r\n    padding-left: 10px;\r\n    padding-right: 10px;\r\n  }\r\n\r\n  .mh2__priceScale{\r\n    display:inline-flex;\r\n    align-items:center;\r\n    gap: 2px;\r\n    line-height: 1;\r\n  }\r\n\r\n  .mh2__priceSymbol{\r\n    font-size: 13px;\r\n    font-weight: 900;\r\n    color: rgba(14,36,72,.18);\r\n    transition: color .18s ease;\r\n  }\r\n\r\n  .mh2__priceSymbol.is-on{\r\n    color: var(--e-global-color-secondary);\r\n  }\r\n\r\n  .mh2__priceSymbol--unknown{\r\n    color: rgba(14,36,72,.18);\r\n  }\r\n\r\n  .mh2__empty{\r\n    margin-top: 12px;\r\n    background: var(--e-global-color-2dae0d9);\r\n    border: 1px dashed rgba(14,36,72,.22);\r\n    border-radius: 14px;\r\n    padding: 14px;\r\n    color: var(--e-global-color-primary);\r\n    font-weight: 800;\r\n  }\r\n\r\n  .mh2__locGroup{\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap:6px;\r\n  }\r\n\r\n  .mh2__locCountryRow{\r\n    display:flex;\r\n    align-items:center;\r\n    gap:8px;\r\n  }\r\n\r\n  .mh2__item--country{\r\n    flex:1 1 auto;\r\n  }\r\n\r\n  .mh2__locToggle{\r\n    flex: 0 0 auto;\r\n    width: 22px;\r\n    height: 22px;\r\n    padding: 0;\r\n    border: 1px solid rgba(14,36,72,.10);\r\n    background: #fff;\r\n    border-radius: 6px;\r\n    cursor: pointer;\r\n    color: rgba(14,36,72,.7);\r\n    font-size: 11px;\r\n    line-height: 1;\r\n    font-weight: 900;\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }\r\n\r\n  .mh2__locChildren{\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap:6px;\r\n    margin-left:22px;\r\n    padding-left:10px;\r\n    border-left:1px solid rgba(14,36,72,.08);\r\n  }\r\n\r\n  .mh2__locRegionGroup{\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap:4px;\r\n  }\r\n\r\n  .mh2__locRegionRow{\r\n    display:flex;\r\n    align-items:center;\r\n    gap:8px;\r\n  }\r\n\r\n  .mh2__item--region{\r\n    flex:1 1 auto;\r\n  }\r\n\r\n  .mh2__locCities{\r\n    display:flex;\r\n    flex-direction:column;\r\n    gap:4px;\r\n    margin-left:22px;\r\n    padding-left:10px;\r\n    border-left:1px solid rgba(14,36,72,.08);\r\n  }\r\n\r\n  .mh2__locCities--direct{\r\n    margin-left:0;\r\n    padding-left:0;\r\n    border-left:0;\r\n  }\r\n\r\n  .mh2__item--city{\r\n    padding-top:4px;\r\n    padding-bottom:4px;\r\n  }\r\n\r\n  @media (max-width: 1180px){\r\n    .mh2__layout{\r\n      grid-template-columns: 320px 1fr;\r\n    }\r\n\r\n    .mh2__grid{\r\n      grid-template-columns: repeat(2, minmax(0, 1fr));\r\n    }\r\n  }\r\n\r\n  @media (max-width: 860px){\r\n    .mh2__layout{\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .mh2__filters{\r\n      position: static;\r\n    }\r\n\r\n    .mh2__grid{\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .mh2__search{\r\n      max-width: 100%;\r\n    }\r\n\r\n    .mh2__hoverPanel{\r\n      left: 12px;\r\n      right: 12px;\r\n      bottom: 12px;\r\n    }\r\n\r\n    .mh2__hoverItem{\r\n      font-size: 12px;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<div id=\"mh-catalog\" class=\"mh2\">\r\n  <div class=\"mh2__head\">\r\n    <div class=\"mh2__kicker\">\u041a\u0410\u0422\u0410\u041b\u041e\u0413 \u0424\u0410\u0425\u0406\u0412\u0426\u0406\u0412<\/div>\r\n    <h1 class=\"mh2__title\">\u0417\u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0445\u0456\u0432\u0446\u044f \u2014 \u0437\u0440\u0443\u0447\u043d\u043e, \u044f\u043a \u043d\u0456\u043a\u043e\u043b\u0438.<\/h1>\r\n\r\n    <div class=\"mh2__tabs\" id=\"mh2-tabs\">\r\n      <button class=\"mh2__tab is-active\" type=\"button\" data-kind=\"mediator\">\u041c\u0435\u0434\u0456\u0430\u0442\u043e\u0440\u0438<\/button>\r\n      <button class=\"mh2__tab\" type=\"button\" data-kind=\"lawyer\">\u0410\u0434\u0432\u043e\u043a\u0430\u0442\u0438<\/button>\r\n      <button class=\"mh2__tab\" type=\"button\" data-kind=\"notary\">\u041d\u043e\u0442\u0430\u0440\u0456\u0443\u0441\u0438<\/button>\r\n      <button class=\"mh2__tab\" type=\"button\" data-kind=\"translator\">\u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0430\u0447\u0456<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"mh2__layout\">\r\n    <aside class=\"mh2__filters\">\r\n      <div class=\"mh2__filtersCard\">\r\n        <div class=\"mh2__filtersTitle\">\r\n          <span class=\"mh2__filtersIcon\" aria-hidden=\"true\">\r\n            <svg height=\"21\" viewBox=\"0 0 24 24\" width=\"21\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\r\n              <path d=\"m4 7a1 1 0 0 1 1-1h14a1 1 0 1 1 0 2h-14a1 1 0 0 1 -1-1zm2 5a1 1 0 0 1 1-1h10a1 1 0 1 1 0 2h-10a1 1 0 0 1 -1-1zm2 5a1 1 0 0 1 1-1h6a1 1 0 1 1 0 2h-6a1 1 0 0 1 -1-1z\"\/>\r\n            <\/svg>\r\n          <\/span>\r\n          \u0424\u0456\u043b\u044c\u0442\u0440\u0438\r\n        <\/div>\r\n\r\n        <div id=\"mh2-filters-dynamic\"><\/div>\r\n\r\n        <div class=\"mh2__foot\">\r\n          <div class=\"mh2__count\">\r\n            <div class=\"mh2__countLabel\">\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0444\u0430\u0445\u0456\u0432\u0446\u0456\u0432<\/div>\r\n            <div id=\"mh2-count\" class=\"mh2__countNum\">0<\/div>\r\n          <\/div>\r\n\r\n          <button id=\"mh2-reset\" class=\"mh2__btnReset\" type=\"button\">\u0421\u043a\u0438\u043d\u0443\u0442\u0438 \u0444\u0456\u043b\u044c\u0442\u0440\u0438<\/button>\r\n        <\/div>\r\n      <\/div>\r\n    <\/aside>\r\n\r\n    <main class=\"mh2__gridWrap\">\r\n      <div class=\"mh2__search\">\r\n        <span class=\"mh2__searchIcon\" aria-hidden=\"true\">\u2315<\/span>\r\n        <input id=\"mh2-search\" type=\"text\" placeholder=\"\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u0456\u043c\u02bc\u044f\u043c...\" \/>\r\n      <\/div>\r\n\r\n      <div id=\"mh2-grid\" class=\"mh2__grid\"><\/div>\r\n\r\n      <div id=\"mh2-empty\" class=\"mh2__empty\" style=\"display:none;\">\r\n        \u041d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0437\u0430 \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u043c\u0438 \u0444\u0456\u043b\u044c\u0442\u0440\u0430\u043c\u0438\r\n      <\/div>\r\n    <\/main>\r\n  <\/div>\r\n<\/div>\r\n\r\n<script>\r\n(function () {\r\n  const REST_BASE = `${window.location.origin}\/wp-json\/mh\/v1\/registry`;\r\n\r\n  const IS_EN = \/^\\\/en(?:\\\/|$)\/.test(window.location.pathname);\r\n  const LOCALE = IS_EN ? 'en' : 'uk';\r\n\r\n  const TEXT = {\r\n    uk: {\r\n      kicker: '\u041a\u0410\u0422\u0410\u041b\u041e\u0413 \u0424\u0410\u0425\u0406\u0412\u0426\u0406\u0412',\r\n      title: '\u0417\u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0445\u0456\u0432\u0446\u044f \u2014 \u0437\u0440\u0443\u0447\u043d\u043e, \u044f\u043a \u043d\u0456\u043a\u043e\u043b\u0438.',\r\n      filters: '\u0424\u0456\u043b\u044c\u0442\u0440\u0438',\r\n      countLabel: '\u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0444\u0430\u0445\u0456\u0432\u0446\u0456\u0432',\r\n      reset: '\u0421\u043a\u0438\u043d\u0443\u0442\u0438 \u0444\u0456\u043b\u044c\u0442\u0440\u0438',\r\n      empty: '\u041d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0437\u0430 \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u043c\u0438 \u0444\u0456\u043b\u044c\u0442\u0440\u0430\u043c\u0438',\r\n      noData: '${esc(TXT.noData)}',\r\n      loadingSectionError: '\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u0446\u044c\u043e\u0433\u043e \u0440\u043e\u0437\u0434\u0456\u043b\u0443.',\r\n      loadingCatalogError: '\u041f\u043e\u043c\u0438\u043b\u043a\u0430 \u0437\u0430\u0432\u0430\u043d\u0442\u0430\u0436\u0435\u043d\u043d\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0443. \u041f\u0435\u0440\u0435\u0432\u0456\u0440 REST endpoint mh\/v1\/registry.',\r\n      specialistFallback: '\u0424\u0430\u0445\u0456\u0432\u0435\u0446\u044c',\r\n      yes: '\u0422\u0430\u043a',\r\n      no: '\u041d\u0456',\r\n      paid: '\u041f\u043b\u0430\u0442\u043d\u043e',\r\n      free: '\u0411\u0435\u0437\u043e\u043f\u043b\u0430\u0442\u043d\u043e',\r\n      donation: '\u0417\u0430 \u0434\u043e\u043d\u0430\u0442',\r\n      freeOrDonation: '\u041c\u043e\u0436\u043b\u0438\u0432\u0456\u0441\u0442\u044c \u0431\u0435\u0437\u043e\u043f\u043b\u0430\u0442\u043d\u043e \u0447\u0438 \u0437\u0430 \u0434\u043e\u043d\u0430\u0442',\r\n      firstIntroFree: '\u041f\u0435\u0440\u0448\u0430 \u0406\u041e\u0417\u041c \u0431\u0435\u0437\u043f\u043b\u0430\u0442\u043d\u0430',\r\n      priceUnknown: '\u0412\u0430\u0440\u0442\u0456\u0441\u0442\u044c \u043d\u0435 \u0432\u043a\u0430\u0437\u0430\u043d\u0430',\r\n      priceAria: level => `\u0420\u0456\u0432\u0435\u043d\u044c \u0432\u0430\u0440\u0442\u043e\u0441\u0442\u0456: ${level} \u0437 4`,\r\n      experiencePrefix: '\u0414\u043e\u0441\u0432\u0456\u0434:',\r\n      experienceMissing: '\u0414\u043e\u0441\u0432\u0456\u0434 \u043d\u0435 \u0432\u043a\u0430\u0437\u0430\u043d\u0438\u0439',\r\n      providedFreeLegalAid: '\u041d\u0430\u0434\u0430\u0454 \u0411\u041f\u0414',\r\n      ukraine: '\u0423\u043a\u0440\u0430\u0457\u043d\u0430',\r\n      otherLocations: '\u0406\u043d\u0448\u0456 \u043b\u043e\u043a\u0430\u0446\u0456\u0457',\r\n      hover: {\r\n        specializations: '\u0421\u043f\u0435\u0446\u0456\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u0457',\r\n        translationTypes: '\u0422\u0438\u043f\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0443',\r\n        profile: '\u041f\u0440\u043e\u0444\u0456\u043b\u044c',\r\n        locations: '\u041b\u043e\u043a\u0430\u0446\u0456\u0457',\r\n        languages: '\u0420\u043e\u0431\u043e\u0447\u0456 \u043c\u043e\u0432\u0438'\r\n      }\r\n    },\r\n    en: {\r\n      kicker: 'SPECIALIST CATALOG',\r\n      title: 'Find a specialist \u2014 easier than ever.',\r\n      filters: 'Filters',\r\n      countLabel: 'Specialists',\r\n      reset: 'Reset filters',\r\n      empty: 'No specialists found for the selected filters',\r\n      noData: 'No data',\r\n      loadingSectionError: 'Failed to load this section.',\r\n      loadingCatalogError: 'Failed to load the catalog. Check the REST endpoint mh\/v1\/registry.',\r\n      specialistFallback: 'Specialist',\r\n      yes: 'Yes',\r\n      no: 'No',\r\n      paid: 'Paid',\r\n      free: 'Free',\r\n      donation: 'Donation-based',\r\n      freeOrDonation: 'Free or donation-based option available',\r\n      firstIntroFree: 'First introductory meeting is free',\r\n      priceUnknown: 'Price not specified',\r\n      priceAria: level => `Price level: ${level} of 4`,\r\n      experiencePrefix: 'Experience:',\r\n      experienceMissing: 'Experience not specified',\r\n      providedFreeLegalAid: 'Provides free legal aid',\r\n      ukraine: 'Ukraine',\r\n      otherLocations: 'Other locations',\r\n      hover: {\r\n        specializations: 'Specializations',\r\n        translationTypes: 'Translation types',\r\n        profile: 'Profile',\r\n        locations: 'Locations',\r\n        languages: 'Working languages'\r\n      }\r\n    }\r\n  };\r\n\r\n  const TXT = TEXT[LOCALE];\r\n\r\n  const META = {\r\n    firstName: 'first_name',\r\n    firstNameEn: 'first_name_en',\r\n    lastName: 'last_name',\r\n    lastNameEn: 'last_name_en',\r\n    patronymic: 'middle_name',\r\n\r\n    country: 'location_country',\r\n    region: 'location_region',\r\n    city: 'location_city',\r\n    street: 'location_street',\r\n    locations: 'locations',\r\n    locationsJson: 'locations_json',\r\n\r\n    mode: 'work_formats',\r\n    spec: 'specializations',\r\n    lang: 'working_languages',\r\n    pay: 'payment_options',\r\n\r\n    experience: 'practice_start_date',\r\n    priceFrom: 'hourly_rate',\r\n\r\n    gender: 'gender',\r\n    military: 'is_war_veteran',\r\n    signLanguage: 'knows_sign_language',\r\n    benefits: 'reduced_fee_options',\r\n    uozm: 'intro_meeting_options',\r\n\r\n    associations: 'associations',\r\n    education: 'professional_education',\r\n\r\n    translationType: 'translation_type',\r\n    qualificationIssueDate: 'qualification_issue_date',\r\n    qualificationNumber: 'qualification_number',\r\n    memberships: 'memberships',\r\n\r\n    lawyerPracticeForm: 'lawyer_practice_form',\r\n    providesFreeLegalAid: 'provides_free_legal_aid',\r\n    registeredCouncil: 'registered_council',\r\n    issuingCouncil: 'issuing_council',\r\n    lawyerRegistryLink: 'lawyer_registry_link',\r\n\r\n    notaryRegisterLink: 'notary_register_link'\r\n  };\r\n\r\n  \/*\r\n   * \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0456 \u0444\u0456\u043b\u044c\u0442\u0440\u0438 \u0437\u0430 \u0442\u0438\u043f\u043e\u043c \u0444\u0430\u0445\u0456\u0432\u0446\u044f.\r\n   *\r\n   * \u041c\u0435\u0434\u0456\u0430\u0442\u043e\u0440: \u0444\u0456\u043b\u044c\u0442\u0440\u0443\u0454\u043c\u043e \u0437\u0430 \u043c\u0435\u0434\u0456\u0430\u0442\u043e\u0440\u0441\u044c\u043a\u0438\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0430\u043d\u043a\u0435\u0442\u0438.\r\n   * \u0410\u0434\u0432\u043e\u043a\u0430\u0442: \u0444\u0456\u043b\u044c\u0442\u0440\u0443\u0454\u043c\u043e \u0437\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c, \u043b\u043e\u043a\u0430\u0446\u0456\u0454\u044e, \u043e\u043f\u043b\u0430\u0442\u043e\u044e, \u043c\u043e\u0432\u0430\u043c\u0438, \u0441\u0442\u0430\u0442\u0442\u044e, \u0432\u0435\u0442\u0435\u0440\u0430\u043d\u0441\u0442\u0432\u043e\u043c, \u0436\u0435\u0441\u0442\u043e\u0432\u043e\u044e \u043c\u043e\u0432\u043e\u044e, \u0444\u043e\u0440\u043c\u043e\u044e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438, \u0411\u041f\u0414, \u0434\u043e\u0441\u0432\u0456\u0434\u043e\u043c.\r\n   * \u041d\u043e\u0442\u0430\u0440\u0456\u0443\u0441: \u0442\u0456\u043b\u044c\u043a\u0438 \u043f\u043e\u043b\u044f, \u044f\u043a\u0456 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0454 \u0432 \u043d\u043e\u0442\u0430\u0440\u0456\u0430\u043b\u044c\u043d\u0456\u0439 \u0430\u043d\u043a\u0435\u0442\u0456 \u0439 \u043c\u0430\u044e\u0442\u044c \u0441\u0435\u043d\u0441 \u0434\u043b\u044f \u043f\u043e\u0448\u0443\u043a\u0443.\r\n   * \u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0430\u0447: \u0444\u043e\u0440\u043c\u0430\u0442, \u043b\u043e\u043a\u0430\u0446\u0456\u044f, \u043e\u043f\u043b\u0430\u0442\u0430, \u043c\u043e\u0432\u0438, \u0441\u0442\u0430\u0442\u044c, \u0436\u0435\u0441\u0442\u043e\u0432\u0430 \u043c\u043e\u0432\u0430, \u0442\u0438\u043f \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0443, \u0434\u043e\u0441\u0432\u0456\u0434.\r\n   *\/\r\n  const PAYMENT_FILTER_BLOCK = ['paymentTerms', 'hourlyCost', 'introMeetingPay'];\r\n\r\n  const TAB_CONFIG = {\r\n    mediator: {\r\n      label: IS_EN ? 'Mediators' : '\u041c\u0435\u0434\u0456\u0430\u0442\u043e\u0440\u0438',\r\n      searchPlaceholder: IS_EN ? 'Search mediator by name...' : '\u041f\u043e\u0448\u0443\u043a \u043c\u0435\u0434\u0456\u0430\u0442\u043e\u0440\u0430 \u0437\u0430 \u0456\u043c\u02bc\u044f\u043c...',\r\n      filters: [\r\n        'spec',\r\n        'mode',\r\n        'location',\r\n        'lang',\r\n        'signLanguage',\r\n        'military',\r\n        'mediatorAssociationMember',\r\n        'exp',\r\n        ...PAYMENT_FILTER_BLOCK,\r\n        'gender'\r\n      ]\r\n    },\r\n\r\n    lawyer: {\r\n      label: IS_EN ? 'Lawyers' : '\u0410\u0434\u0432\u043e\u043a\u0430\u0442\u0438',\r\n      searchPlaceholder: IS_EN ? 'Search lawyer by name...' : '\u041f\u043e\u0448\u0443\u043a \u0430\u0434\u0432\u043e\u043a\u0430\u0442\u0430 \u0437\u0430 \u0456\u043c\u02bc\u044f\u043c...',\r\n      filters: [\r\n        'mode',\r\n        'location',\r\n        'lang',\r\n        'signLanguage',\r\n        'military',\r\n        'lawyerPracticeForm',\r\n        'exp',\r\n        'paymentTerms',\r\n        'hourlyCost',\r\n        'gender'\r\n      ]\r\n    },\r\n\r\n    notary: {\r\n      label: IS_EN ? 'Notaries' : '\u041d\u043e\u0442\u0430\u0440\u0456\u0443\u0441\u0438',\r\n      searchPlaceholder: IS_EN ? 'Search notary by name...' : '\u041f\u043e\u0448\u0443\u043a \u043d\u043e\u0442\u0430\u0440\u0456\u0443\u0441\u0430 \u0437\u0430 \u0456\u043c\u02bc\u044f\u043c...',\r\n      filters: [\r\n        'location',\r\n        'military',\r\n        'signLanguage',\r\n        'gender'\r\n      ]\r\n    },\r\n\r\n    translator: {\r\n      label: IS_EN ? 'Translators' : '\u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0430\u0447\u0456',\r\n      searchPlaceholder: IS_EN ? 'Search translator by name...' : '\u041f\u043e\u0448\u0443\u043a \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0430\u0447\u0430 \u0437\u0430 \u0456\u043c\u02bc\u044f\u043c...',\r\n      filters: [\r\n        'mode',\r\n        'location',\r\n        'lang',\r\n        'signLanguage',\r\n        'military',\r\n        'translationType',\r\n        'exp',\r\n        'paymentTerms',\r\n        'hourlyCost',\r\n        'gender'\r\n      ]\r\n    }\r\n  };\r\n\r\n  const DICTS = {\r\n    profileKind: {\r\n      mediator: IS_EN ? 'Mediator' : '\u041c\u0435\u0434\u0456\u0430\u0442\u043e\u0440',\r\n      notary: IS_EN ? 'Notary' : '\u041d\u043e\u0442\u0430\u0440\u0456\u0443\u0441',\r\n      lawyer: IS_EN ? 'Lawyer' : '\u0410\u0434\u0432\u043e\u043a\u0430\u0442',\r\n      translator: IS_EN ? 'Translator' : '\u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0430\u0447'\r\n    },\r\n\r\n    gender: {\r\n      male: IS_EN ? 'Male' : '\u0427\u043e\u043b\u043e\u0432\u0456\u043a',\r\n      female: IS_EN ? 'Female' : '\u0416\u0456\u043d\u043a\u0430',\r\n      other: IS_EN ? 'Other' : '\u0406\u043d\u0448\u0435',\r\n      not_specified: '',\r\n\r\n      \u0447\u043e\u043b\u043e\u0432\u0456\u043a: IS_EN ? 'Male' : '\u0427\u043e\u043b\u043e\u0432\u0456\u043a',\r\n      \u0436\u0456\u043d\u043a\u0430: IS_EN ? 'Female' : '\u0416\u0456\u043d\u043a\u0430',\r\n      \u0456\u043d\u0448\u0435: IS_EN ? 'Other' : '\u0406\u043d\u0448\u0435',\r\n\r\n      \u0447\u043e\u043b\u043e\u0432\u0456\u0447\u0430: IS_EN ? 'Male' : '\u0427\u043e\u043b\u043e\u0432\u0456\u043a',\r\n      \u0436\u0456\u043d\u043e\u0447\u0430: IS_EN ? 'Female' : '\u0416\u0456\u043d\u043a\u0430',\r\n      \u0456\u043d\u0448\u0430: IS_EN ? 'Other' : '\u0406\u043d\u0448\u0435'\r\n    },\r\n\r\n    yesNo: {\r\n      yes: TXT.yes,\r\n      no: TXT.no,\r\n      true: TXT.yes,\r\n      false: TXT.no,\r\n      on: TXT.yes,\r\n      off: TXT.no,\r\n      '1': TXT.yes,\r\n      '0': TXT.no,\r\n      \u0442\u0430\u043a: TXT.yes,\r\n      \u043d\u0456: TXT.no\r\n    },\r\n\r\n    languages: {\r\n      ukrainian: IS_EN ? 'Ukrainian' : '\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430',\r\n      \u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430: IS_EN ? 'Ukrainian' : '\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430',\r\n      english: IS_EN ? 'English' : '\u0410\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      \u0430\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0430: IS_EN ? 'English' : '\u0410\u043d\u0433\u043b\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      polish: IS_EN ? 'Polish' : '\u041f\u043e\u043b\u044c\u0441\u044c\u043a\u0430',\r\n      \u043f\u043e\u043b\u044c\u0441\u044c\u043a\u0430: IS_EN ? 'Polish' : '\u041f\u043e\u043b\u044c\u0441\u044c\u043a\u0430',\r\n      german: IS_EN ? 'German' : '\u041d\u0456\u043c\u0435\u0446\u044c\u043a\u0430',\r\n      \u043d\u0456\u043c\u0435\u0446\u044c\u043a\u0430: IS_EN ? 'German' : '\u041d\u0456\u043c\u0435\u0446\u044c\u043a\u0430',\r\n      french: IS_EN ? 'French' : '\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0430',\r\n      \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0430: IS_EN ? 'French' : '\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u044c\u043a\u0430',\r\n      spanish: IS_EN ? 'Spanish' : '\u0406\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u0430',\r\n      \u0456\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u0430: IS_EN ? 'Spanish' : '\u0406\u0441\u043f\u0430\u043d\u0441\u044c\u043a\u0430',\r\n      italian: IS_EN ? 'Italian' : '\u0406\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      \u0456\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430: IS_EN ? 'Italian' : '\u0406\u0442\u0430\u043b\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      portuguese: IS_EN ? 'Portuguese' : '\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u0430',\r\n      \u043f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u0430: IS_EN ? 'Portuguese' : '\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u044c\u043a\u0430',\r\n      czech: IS_EN ? 'Czech' : '\u0427\u0435\u0441\u044c\u043a\u0430',\r\n      \u0447\u0435\u0441\u044c\u043a\u0430: IS_EN ? 'Czech' : '\u0427\u0435\u0441\u044c\u043a\u0430',\r\n      slovak: IS_EN ? 'Slovak' : '\u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430',\r\n      \u0441\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430: IS_EN ? 'Slovak' : '\u0421\u043b\u043e\u0432\u0430\u0446\u044c\u043a\u0430',\r\n      hungarian: IS_EN ? 'Hungarian' : '\u0423\u0433\u043e\u0440\u0441\u044c\u043a\u0430',\r\n      \u0443\u0433\u043e\u0440\u0441\u044c\u043a\u0430: IS_EN ? 'Hungarian' : '\u0423\u0433\u043e\u0440\u0441\u044c\u043a\u0430',\r\n      romanian: IS_EN ? 'Romanian' : '\u0420\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0430',\r\n      \u0440\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0430: IS_EN ? 'Romanian' : '\u0420\u0443\u043c\u0443\u043d\u0441\u044c\u043a\u0430',\r\n      bulgarian: IS_EN ? 'Bulgarian' : '\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0430',\r\n      \u0431\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0430: IS_EN ? 'Bulgarian' : '\u0411\u043e\u043b\u0433\u0430\u0440\u0441\u044c\u043a\u0430',\r\n      latvian: IS_EN ? 'Latvian' : '\u041b\u0430\u0442\u0432\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      \u043b\u0430\u0442\u0432\u0456\u0439\u0441\u044c\u043a\u0430: IS_EN ? 'Latvian' : '\u041b\u0430\u0442\u0432\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      lithuanian: IS_EN ? 'Lithuanian' : '\u041b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0430',\r\n      \u043b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0430: IS_EN ? 'Lithuanian' : '\u041b\u0438\u0442\u043e\u0432\u0441\u044c\u043a\u0430',\r\n      estonian: IS_EN ? 'Estonian' : '\u0415\u0441\u0442\u043e\u043d\u0441\u044c\u043a\u0430',\r\n      \u0435\u0441\u0442\u043e\u043d\u0441\u044c\u043a\u0430: IS_EN ? 'Estonian' : '\u0415\u0441\u0442\u043e\u043d\u0441\u044c\u043a\u0430',\r\n      dutch: IS_EN ? 'Dutch' : '\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430',\r\n      \u043d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430: IS_EN ? 'Dutch' : '\u041d\u0456\u0434\u0435\u0440\u043b\u0430\u043d\u0434\u0441\u044c\u043a\u0430',\r\n      russian: IS_EN ? 'Russian' : '\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      \u0440\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0430: IS_EN ? 'Russian' : '\u0420\u043e\u0441\u0456\u0439\u0441\u044c\u043a\u0430',\r\n      serbian: IS_EN ? 'Serbian' : '\u0421\u0435\u0440\u0431\u0441\u044c\u043a\u0430',\r\n      \u0441\u0435\u0440\u0431\u0441\u044c\u043a\u0430: IS_EN ? 'Serbian' : '\u0421\u0435\u0440\u0431\u0441\u044c\u043a\u0430',\r\n      other: IS_EN ? 'Other' : '\u0406\u043d\u0448\u0456',\r\n      \u0456\u043d\u0448\u0456: IS_EN ? 'Other' : '\u0406\u043d\u0448\u0456'\r\n    },\r\n\r\n    mode: {\r\n      online: IS_EN ? 'Online' : '\u041e\u043d\u043b\u0430\u0439\u043d',\r\n      offline: IS_EN ? 'Offline' : '\u041e\u0444\u043b\u0430\u0439\u043d',\r\n      \u043e\u043d\u043b\u0430\u0439\u043d: IS_EN ? 'Online' : '\u041e\u043d\u043b\u0430\u0439\u043d',\r\n      \u043e\u0444\u043b\u0430\u0439\u043d: IS_EN ? 'Offline' : '\u041e\u0444\u043b\u0430\u0439\u043d'\r\n    },\r\n\r\n    specialization: {\r\n      mikk: IS_EN ? 'International child-related disputes (MiKK)' : '\u041c\u0456\u0436\u043d\u0430\u0440\u043e\u0434\u043d\u0456 \u0441\u043f\u043e\u0440\u0438 \u0449\u043e\u0434\u043e \u0434\u0456\u0442\u0435\u0439 (\u041c\u0456\u041a\u041a)',\r\n      family: IS_EN ? 'Family disputes' : '\u0421\u0456\u043c\u0435\u0439\u043d\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      inheritance: IS_EN ? 'Inheritance disputes' : '\u0421\u043f\u0430\u0434\u043a\u043e\u0432\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      property: IS_EN ? 'Property disputes' : '\u041c\u0430\u0439\u043d\u043e\u0432\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      earth: IS_EN ? 'Land disputes' : '\u0417\u0435\u043c\u0435\u043b\u044c\u043d\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      administrative: IS_EN ? 'Administrative disputes' : '\u0410\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      commercial: IS_EN ? 'Commercial disputes' : '\u041a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      labor: IS_EN ? 'Labor disputes' : '\u0422\u0440\u0443\u0434\u043e\u0432\u0456 \u0441\u043f\u043e\u0440\u0438',\r\n      intellectual: IS_EN ? 'Intellectual property disputes' : '\u0421\u043f\u043e\u0440\u0438 \u0443 \u0441\u0444\u0435\u0440\u0456 \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0457 \u0432\u043b\u0430\u0441\u043d\u043e\u0441\u0442\u0456',\r\n      children: IS_EN ? 'Disputes involving children' : '\u0421\u043f\u043e\u0440\u0438 \u0437\u0430 \u0443\u0447\u0430\u0441\u0442\u044e \u0434\u0456\u0442\u0435\u0439',\r\n      restorative: IS_EN ? 'Restorative justice' : '\u0412\u0456\u0434\u043d\u043e\u0432\u043d\u0435 \u043f\u0440\u0430\u0432\u043e\u0441\u0443\u0434\u0434\u044f',\r\n      restructuring: IS_EN ? 'Restructuring and bankruptcy' : '\u0420\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0437\u0430\u0446\u0456\u044f \u0442\u0430 \u0431\u0430\u043d\u043a\u0440\u0443\u0442\u0441\u0442\u0432\u043e',\r\n      other: IS_EN ? 'Other conflicts\/disputes' : '\u0406\u043d\u0448\u0456 \u043a\u043e\u043d\u0444\u043b\u0456\u043a\u0442\u0438\/\u0441\u043f\u043e\u0440\u0438'\r\n    },\r\n\r\n    translationType: {\r\n      written: IS_EN ? 'Written translation' : '\u041f\u0438\u0441\u044c\u043c\u043e\u0432\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      oral: IS_EN ? 'Oral interpreting' : '\u0423\u0441\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      interpreting: IS_EN ? 'Oral interpreting' : '\u0423\u0441\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      consecutive: IS_EN ? 'Consecutive interpreting' : '\u041f\u043e\u0441\u043b\u0456\u0434\u043e\u0432\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      simultaneous: IS_EN ? 'Simultaneous interpreting' : '\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      sworn: IS_EN ? 'Sworn translation' : '\u041f\u0440\u0438\u0441\u044f\u0436\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      legal: IS_EN ? 'Legal translation' : '\u042e\u0440\u0438\u0434\u0438\u0447\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      medical: IS_EN ? 'Medical translation' : '\u041c\u0435\u0434\u0438\u0447\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      technical: IS_EN ? 'Technical translation' : '\u0422\u0435\u0445\u043d\u0456\u0447\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      audiovisual: IS_EN ? 'Audiovisual translation' : '\u0410\u0443\u0434\u0456\u043e\u0432\u0456\u0437\u0443\u0430\u043b\u044c\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      remote: IS_EN ? 'Remote interpreting' : '\u0414\u0438\u0441\u0442\u0430\u043d\u0446\u0456\u0439\u043d\u0438\u0439 \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434',\r\n      sign: IS_EN ? 'Sign language' : '\u0416\u0435\u0441\u0442\u043e\u0432\u0430 \u043c\u043e\u0432\u0430',\r\n      chuchotage: IS_EN ? 'Whispered interpreting' : '\u0428\u0443\u0448\u0443\u0442\u0430\u0436',\r\n      other: IS_EN ? 'Other' : '\u0406\u043d\u0448\u0435'\r\n    },\r\n\r\n    lawyerPracticeForm: {\r\n      individual: IS_EN ? 'Individual practice' : '\u0406\u043d\u0434\u0438\u0432\u0456\u0434\u0443\u0430\u043b\u044c\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430',\r\n      bureau: IS_EN ? 'Law office' : '\u0410\u0434\u0432\u043e\u043a\u0430\u0442\u0441\u044c\u043a\u0435 \u0431\u044e\u0440\u043e',\r\n      association: IS_EN ? 'Law association' : '\u0410\u0434\u0432\u043e\u043a\u0430\u0442\u0441\u044c\u043a\u0435 \u043e\u0431\u02bc\u0454\u0434\u043d\u0430\u043d\u043d\u044f'\r\n    }\r\n  };\r\n\r\n  const EXP_BANDS = {\r\n    '<1': IS_EN ? '<1 year' : '<1 \u0440\u043e\u043a\u0443',\r\n    '1-5': IS_EN ? '1\u20135 years' : '1\u20135 \u0440\u043e\u043a\u0456\u0432',\r\n    '5-15': IS_EN ? '5\u201315 years' : '5\u201315 \u0440\u043e\u043a\u0456\u0432',\r\n    '15+': IS_EN ? '15+ years' : '15+ \u0440\u043e\u043a\u0456\u0432'\r\n  };\r\n\r\n  const PRICE_BANDS = {\r\n    1: IS_EN ? 'up to 1000 \u20b4\/hour' : '\u0434\u043e 1000 \u20b4\/\u0433\u043e\u0434',\r\n    2: IS_EN ? '1000\u20133000 \u20b4\/hour' : '1000\u20133000 \u20b4\/\u0433\u043e\u0434',\r\n    3: IS_EN ? '3000\u20135000 \u20b4\/hour' : '3000\u20135000 \u20b4\/\u0433\u043e\u0434',\r\n    4: IS_EN ? '5000+ \u20b4\/hour' : '5000+ \u20b4\/\u0433\u043e\u0434'\r\n  };\r\n\r\n  const FILTER_DEFS = {\r\n    spec: {\r\n      title: IS_EN ? 'Specialization' : '\u0421\u043f\u0435\u0446\u0456\u0430\u043b\u0456\u0437\u0430\u0446\u0456\u044f',\r\n      getValues: p => p.specs,\r\n      sort: 'alpha'\r\n    },\r\n\r\n    mode: {\r\n      title: IS_EN ? 'Work format' : '\u0424\u043e\u0440\u043c\u0430\u0442 \u0440\u043e\u0431\u043e\u0442\u0438',\r\n      getValues: p => p.modes,\r\n      sort: 'alpha'\r\n    },\r\n\r\n    location: {\r\n      title: IS_EN ? 'Location' : '\u041b\u043e\u043a\u0430\u0446\u0456\u044f',\r\n      getValues: p => p.locationTokens,\r\n      sort: 'alpha'\r\n    },\r\n\r\n    paymentTerms: {\r\n      title: IS_EN ? 'Payment terms' : '\u0423\u043c\u043e\u0432\u0438 \u043e\u043f\u043b\u0430\u0442\u0438',\r\n      getValues: p => p.paymentTerms,\r\n      sort: 'custom',\r\n      customSort: [TXT.paid, TXT.freeOrDonation]\r\n    },\r\n\r\n    hourlyCost: {\r\n      title: IS_EN ? 'Hourly rate' : '\u0412\u0430\u0440\u0442\u0456\u0441\u0442\u044c \u0433\u043e\u0434\u0438\u043d\u0438',\r\n      getValues: p => p.priceBand ? [p.priceBand] : [],\r\n      sort: 'custom',\r\n      customSort: [PRICE_BANDS[1], PRICE_BANDS[2], PRICE_BANDS[3], PRICE_BANDS[4]]\r\n    },\r\n\r\n    introMeetingPay: {\r\n      title: IS_EN ? 'Introductory meeting terms' : '\u0423\u043c\u043e\u0432\u0438 \u043e\u043f\u043b\u0430\u0442\u0438 \u0406\u041e\u0417\u041c',\r\n      getValues: p => p.introMeetingPays,\r\n      sort: 'custom',\r\n      customSort: [TXT.paid, TXT.free]\r\n    },\r\n\r\n    pay: {\r\n      title: IS_EN ? 'Payment terms' : '\u0423\u043c\u043e\u0432\u0438 \u043e\u043f\u043b\u0430\u0442\u0438',\r\n      getValues: p => p.pays,\r\n      sort: 'alpha'\r\n    },\r\n\r\n    lang: {\r\n      title: IS_EN ? 'Working languages' : '\u0420\u043e\u0431\u043e\u0447\u0456 \u043c\u043e\u0432\u0438',\r\n      getValues: p => p.langs,\r\n      sort: 'alpha'\r\n    },\r\n\r\n    gender: {\r\n      title: IS_EN ? 'Gender' : '\u0421\u0442\u0430\u0442\u044c \/ \u0413\u0435\u043d\u0434\u0435\u0440',\r\n      getValues: p => p.gender ? [p.gender] : [],\r\n      sort: 'custom',\r\n      customSort: IS_EN ? ['Female', 'Male', 'Other'] : ['\u0416\u0456\u043d\u043a\u0430', '\u0427\u043e\u043b\u043e\u0432\u0456\u043a', '\u0406\u043d\u0448\u0435']\r\n    },\r\n\r\n    military: {\r\n      title: IS_EN ? 'War veteran' : '\u0412\u0435\u0442\u0435\u0440\u0430\u043d \u0432\u0456\u0439\u043d\u0438',\r\n      getValues: p => p.military ? [p.military] : [],\r\n      sort: 'custom',\r\n      customSort: [TXT.yes, TXT.no],\r\n      includeZeroOptions: [TXT.yes, TXT.no]\r\n    },\r\n\r\n    signLanguage: {\r\n      title: IS_EN ? 'Sign language knowledge' : '\u0417\u043d\u0430\u043d\u043d\u044f \u0436\u0435\u0441\u0442\u043e\u0432\u043e\u0457 \u043c\u043e\u0432\u0438',\r\n      getValues: p => p.signLanguage ? [p.signLanguage] : [],\r\n      sort: 'custom',\r\n      customSort: [TXT.yes, TXT.no],\r\n      includeZeroOptions: [TXT.yes, TXT.no]\r\n    },\r\n\r\n    mediatorAssociationMember: {\r\n      title: IS_EN ? 'Membership in a mediator association' : '\u0427\u043b\u0435\u043d\u0441\u0442\u0432\u043e \u0432 \u043e\u0431\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u0456 \u043c\u0435\u0434\u0456\u0430\u0442\u043e\u0440\u0456\u0432',\r\n      getValues: p => p.mediatorAssociationMember ? [p.mediatorAssociationMember] : [],\r\n      sort: 'custom',\r\n      customSort: [TXT.yes, TXT.no],\r\n      includeZeroOptions: [TXT.yes, TXT.no]\r\n    },\r\n\r\n    exp: {\r\n      title: IS_EN ? 'Experience' : '\u0414\u043e\u0441\u0432\u0456\u0434',\r\n      getValues: p => p.experience ? [p.experience] : [],\r\n      sort: 'custom',\r\n      customSort: [EXP_BANDS['<1'], EXP_BANDS['1-5'], EXP_BANDS['5-15'], EXP_BANDS['15+']]\r\n    },\r\n\r\n    translationType: {\r\n      title: IS_EN ? 'Translation type' : '\u0422\u0438\u043f \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0443',\r\n      getValues: p => p.translationTypes,\r\n      sort: 'alpha'\r\n    },\r\n\r\n    lawyerPracticeForm: {\r\n      title: IS_EN ? 'Practice form' : '\u0424\u043e\u0440\u043c\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438',\r\n      getValues: p => p.lawyerPracticeForm ? [p.lawyerPracticeForm] : [],\r\n      sort: 'custom',\r\n      customSort: [\r\n        DICTS.lawyerPracticeForm.individual,\r\n        DICTS.lawyerPracticeForm.bureau,\r\n        DICTS.lawyerPracticeForm.association\r\n      ]\r\n    },\r\n\r\n    freeLegalAid: {\r\n      title: IS_EN ? 'Free legal aid' : '\u0411\u0435\u0437\u043e\u043f\u043b\u0430\u0442\u043d\u0430 \u043f\u0440\u0430\u0432\u043e\u0432\u0430 \u0434\u043e\u043f\u043e\u043c\u043e\u0433\u0430',\r\n      getValues: p => p.freeLegalAid ? [p.freeLegalAid] : [],\r\n      sort: 'custom',\r\n      customSort: [TXT.yes, TXT.no],\r\n      includeZeroOptions: [TXT.yes, TXT.no]\r\n    }\r\n  };\r\n\r\n  const state = {\r\n    cache: {},\r\n    base: [],\r\n    all: [],\r\n    filtered: [],\r\n    q: '',\r\n    hourKey: '',\r\n    activeKind: 'mediator',\r\n    sel: Object.fromEntries(Object.keys(FILTER_DEFS).map(key => [key, new Set()]))\r\n  };\r\n\r\n  const els = {\r\n    tabs: document.getElementById('mh2-tabs'),\r\n    search: document.getElementById('mh2-search'),\r\n    grid: document.getElementById('mh2-grid'),\r\n    empty: document.getElementById('mh2-empty'),\r\n    count: document.getElementById('mh2-count'),\r\n    reset: document.getElementById('mh2-reset'),\r\n    filtersDynamic: document.getElementById('mh2-filters-dynamic')\r\n  };\r\n\r\n  function esc(s) {\r\n    return String(s ?? '')\r\n      .replaceAll('&', '&amp;')\r\n      .replaceAll('<', '&lt;')\r\n      .replaceAll('>', '&gt;')\r\n      .replaceAll('\"', '&quot;')\r\n      .replaceAll(\"'\", '&#039;');\r\n  }\r\n\r\n  function asArray(v) {\r\n    if (v === null || v === undefined || v === '') return [];\r\n\r\n    if (Array.isArray(v)) {\r\n      return v.map(x => String(x).trim()).filter(Boolean);\r\n    }\r\n\r\n    if (typeof v === 'object') {\r\n      return Object.values(v).map(x => String(x).trim()).filter(Boolean);\r\n    }\r\n\r\n    const s = String(v).trim();\r\n\r\n    if (!s) return [];\r\n\r\n    if (s.startsWith('[') || s.startsWith('{')) {\r\n      try {\r\n        return asArray(JSON.parse(s));\r\n      } catch (_) {}\r\n    }\r\n\r\n    if (\/^a:\\d+:\\{\/.test(s)) {\r\n      const out = [];\r\n      const re = \/s:\\d+:\"(.*?)\";\/g;\r\n      let m;\r\n\r\n      while ((m = re.exec(s)) !== null) {\r\n        const val = (m[1] || '').trim();\r\n        if (val) out.push(val);\r\n      }\r\n\r\n      return out;\r\n    }\r\n\r\n    return s.split(\/[;,]\/).map(x => x.trim()).filter(Boolean);\r\n  }\r\n\r\n  function cleanValue(x) {\r\n    const v = String(x || '').trim();\r\n\r\n    if (!v) return '';\r\n    if (v === '-' || v === '\u2014' || v === '\u2013') return '';\r\n\r\n    return v;\r\n  }\r\n\r\n  function normalizeOtherKey(value) {\r\n    return String(value || '')\r\n      .toLowerCase()\r\n      .replace(\/[\u2019'`]\/g, '')\r\n      .replace(\/\\s+\/g, ' ')\r\n      .trim();\r\n  }\r\n\r\n  function isOtherLikeLabel(value) {\r\n    const key = normalizeOtherKey(value);\r\n\r\n    return (\r\n      key === 'other' ||\r\n      key === 'others' ||\r\n      key === '\u0456\u043d\u0448\u0435' ||\r\n      key === '\u0456\u043d\u0448\u0456' ||\r\n      key.startsWith('\u0456\u043d\u0448 ') ||\r\n      key.startsWith('\u0456\u043d\u0448\u0456 ') ||\r\n      key.startsWith('\u0456\u043d\u0448\u0435 ') ||\r\n      key.startsWith('other ') ||\r\n      key.startsWith('\u0456\u043d\u0448\u0456 \u043a\u043e\u043d\u0444\u043b\u0456\u043a\u0442\u0438') ||\r\n      key.startsWith('\u0456\u043d\u0448\u0456 \u043b\u043e\u043a\u0430\u0446\u0456\u0457')\r\n    );\r\n  }\r\n\r\n  function compareLabels(a, b, options = {}) {\r\n    const aa = String(a || '').trim();\r\n    const bb = String(b || '').trim();\r\n\r\n    if (options.ukraineFirst) {\r\n      if (aa === TXT.ukraine && bb !== TXT.ukraine) return -1;\r\n      if (bb === TXT.ukraine && aa !== TXT.ukraine) return 1;\r\n    }\r\n\r\n    const aOther = isOtherLikeLabel(aa);\r\n    const bOther = isOtherLikeLabel(bb);\r\n\r\n    if (aOther !== bOther) return aOther ? 1 : -1;\r\n\r\n    return aa.localeCompare(bb, IS_EN ? 'en' : 'uk');\r\n  }\r\n\r\n  function sortLabels(values, options = {}) {\r\n    return [...values].sort((a, b) => compareLabels(a, b, options));\r\n  }\r\n\r\n  function mapLabel(dictName, value) {\r\n    const raw = String(value ?? '').trim();\r\n\r\n    if (!raw) return '';\r\n\r\n    const key = raw.toLowerCase();\r\n\r\n    return DICTS[dictName]?.[key] || DICTS[dictName]?.[raw] || raw;\r\n  }\r\n\r\n  function normalizeBooleanLabel(value, emptyAsNo = false) {\r\n    const raw = String(value ?? '').trim().toLowerCase();\r\n\r\n    if (!raw) return emptyAsNo ? TXT.no : '';\r\n\r\n    if (['1', 'true', 'yes', '\u0442\u0430\u043a', 'on'].includes(raw)) return TXT.yes;\r\n    if (['0', 'false', 'no', '\u043d\u0456', 'off'].includes(raw)) return TXT.no;\r\n\r\n    return mapLabel('yesNo', raw) || raw;\r\n  }\r\n\r\n  function normalizeMediatorAssociationMember(value) {\r\n    const items = asArray(value)\r\n      .map(x => String(x).trim().toLowerCase())\r\n      .filter(Boolean);\r\n\r\n    if (!items.length) return TXT.no;\r\n\r\n    const real = items.filter(x => {\r\n      return (\r\n        x !== 'none' &&\r\n        x !== '\u043d\u0456' &&\r\n        x !== 'no' &&\r\n        x !== '0' &&\r\n        x !== 'false' &&\r\n        x !== '\u043d\u0435 \u0454 \u0447\u043b\u0435\u043d\u043e\u043c \u0436\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u02bc\u0454\u0434\u043d\u0430\u043d\u043d\u044f' &&\r\n        x !== '\u043d\u0435 \u0454 \u0447\u043b\u0435\u043d\u043e\u043c \u0436\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u2019\u0454\u0434\u043d\u0430\u043d\u043d\u044f'\r\n      );\r\n    });\r\n\r\n    return real.length ? TXT.yes : TXT.no;\r\n  }\r\n\r\n  function normalizeMode(v) {\r\n    return sortLabels([...new Set(\r\n      asArray(v)\r\n        .map(x => mapLabel('mode', x))\r\n        .filter(Boolean)\r\n    )]);\r\n  }\r\n\r\n  function normalizeSpecializationLabel(value) {\r\n    const raw = String(value ?? '').trim();\r\n\r\n    if (!raw) return '';\r\n\r\n    const key = raw.toLowerCase().replace('mikk', '\u043c\u0456\u043a\u043a');\r\n\r\n    const aliases = {\r\n      mikk: 'mikk',\r\n      \u043c\u0456\u043a\u043a: 'mikk',\r\n      '\u043c\u0456\u0436\u043d\u0430\u0440\u043e\u0434\u043d\u0456 \u0441\u043f\u043e\u0440\u0438 \u0449\u043e\u0434\u043e \u0434\u0456\u0442\u0435\u0439 (\u043c\u0456\u043a\u043a)': 'mikk',\r\n      family: 'family',\r\n      '\u0441\u0456\u043c\u0435\u0439\u043d\u0456 \u0441\u043f\u043e\u0440\u0438': 'family',\r\n      inheritance: 'inheritance',\r\n      '\u0441\u043f\u0430\u0434\u043a\u043e\u0432\u0456 \u0441\u043f\u043e\u0440\u0438': 'inheritance',\r\n      property: 'property',\r\n      '\u043c\u0430\u0439\u043d\u043e\u0432\u0456 \u0441\u043f\u043e\u0440\u0438': 'property',\r\n      earth: 'earth',\r\n      '\u0437\u0435\u043c\u0435\u043b\u044c\u043d\u0456 \u0441\u043f\u043e\u0440\u0438': 'earth',\r\n      administrative: 'administrative',\r\n      '\u0430\u0434\u043c\u0456\u043d\u0456\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u0456 \u0441\u043f\u043e\u0440\u0438': 'administrative',\r\n      commercial: 'commercial',\r\n      '\u043a\u043e\u043c\u0435\u0440\u0446\u0456\u0439\u043d\u0456 \u0441\u043f\u043e\u0440\u0438': 'commercial',\r\n      labor: 'labor',\r\n      '\u0442\u0440\u0443\u0434\u043e\u0432\u0456 \u0441\u043f\u043e\u0440\u0438': 'labor',\r\n      intellectual: 'intellectual',\r\n      '\u0441\u043f\u043e\u0440\u0438 \u0443 \u0441\u0444\u0435\u0440\u0456 \u0456\u043d\u0442\u0435\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0457 \u0432\u043b\u0430\u0441\u043d\u043e\u0441\u0442\u0456': 'intellectual',\r\n      children: 'children',\r\n      '\u0441\u043f\u043e\u0440\u0438 \u0437\u0430 \u0443\u0447\u0430\u0441\u0442\u044e \u0434\u0456\u0442\u0435\u0439': 'children',\r\n      restorative: 'restorative',\r\n      '\u0432\u0456\u0434\u043d\u043e\u0432\u043d\u0435 \u043f\u0440\u0430\u0432\u043e\u0441\u0443\u0434\u0434\u044f': 'restorative',\r\n      restructuring: 'restructuring',\r\n      '\u0440\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0437\u0430\u0446\u0456\u044f \u0442\u0430 \u0431\u0430\u043d\u043a\u0440\u0443\u0442\u0441\u0442\u0432\u043e': 'restructuring',\r\n      other: 'other',\r\n      '\u0456\u043d\u0448\u0456 \u043a\u043e\u043d\u0444\u043b\u0456\u043a\u0442\u0438\/\u0441\u043f\u043e\u0440\u0438': 'other'\r\n    };\r\n\r\n    const dictKey = aliases[key] || key;\r\n    const mapped = mapLabel('specialization', dictKey);\r\n\r\n    return mapped !== dictKey ? mapped : raw.charAt(0).toUpperCase() + raw.slice(1);\r\n  }\r\n\r\n  function parseSpecializations(v) {\r\n    return sortLabels([...new Set(\r\n      asArray(v)\r\n        .map(normalizeSpecializationLabel)\r\n        .filter(Boolean)\r\n    )]);\r\n  }\r\n\r\n  function normalizeLanguages(v) {\r\n    return sortLabels([...new Set(\r\n      asArray(v)\r\n        .map(x => mapLabel('languages', x))\r\n        .filter(Boolean)\r\n    )]);\r\n  }\r\n\r\n  function normalizeTranslationTypes(v) {\r\n    return sortLabels([...new Set(\r\n      asArray(v)\r\n        .map(x => mapLabel('translationType', x))\r\n        .filter(Boolean)\r\n    )]);\r\n  }\r\n\r\n  function normalizeLawyerPracticeForm(v) {\r\n    const raw = String(v ?? '').trim();\r\n\r\n    if (!raw) return '';\r\n\r\n    const key = raw.toLowerCase();\r\n\r\n    return DICTS.lawyerPracticeForm[key] || raw;\r\n  }\r\n\r\n  function normalizePaymentTerms(meta) {\r\n      const paymentValues = asArray(meta[META.pay])\r\n        .map(x => String(x).trim().toLowerCase());\r\n    \r\n      const benefitValues = asArray(meta[META.benefits])\r\n        .map(x => String(x).trim().toLowerCase());\r\n    \r\n      const tags = [];\r\n    \r\n      if (paymentValues.some(v => ['hourly', 'mediation', 'meeting', 'paid'].includes(v))) {\r\n        tags.push(TXT.paid);\r\n      }\r\n    \r\n      if (benefitValues.includes('free') || benefitValues.includes('donation')) {\r\n        tags.push(TXT.freeOrDonation);\r\n      }\r\n    \r\n      return [...new Set(tags)];\r\n    }\r\n\r\n  function normalizeIntroMeetingPay(meta) {\r\n    const values = asArray(meta[META.uozm])\r\n      .map(x => String(x).trim().toLowerCase());\r\n\r\n    const tags = [];\r\n\r\n    if (values.includes('paid')) tags.push(TXT.paid);\r\n    if (values.includes('free')) tags.push(TXT.free);\r\n\r\n    return [...new Set(tags)];\r\n  }\r\n\r\n  function buildPaymentTags(meta) {\r\n    const paymentValues = asArray(meta[META.pay]).map(x => String(x).trim().toLowerCase());\r\n    const benefitValues = asArray(meta[META.benefits]).map(x => String(x).trim().toLowerCase());\r\n    const introValues = asArray(meta[META.uozm]).map(x => String(x).trim().toLowerCase());\r\n    const hourlyRate = cleanValue(meta[META.priceFrom]);\r\n\r\n    const tags = [];\r\n\r\n    if (\r\n      paymentValues.some(v => ['hourly', 'mediation', 'meeting', 'paid'].includes(v)) ||\r\n      (!!hourlyRate && Number(priceBandToLevel(hourlyRate)) > 0)\r\n    ) {\r\n      tags.push(TXT.paid);\r\n    }\r\n\r\n    if (benefitValues.includes('donation')) tags.push(TXT.donation);\r\n    if (benefitValues.includes('free')) tags.push(TXT.free);\r\n    if (introValues.includes('free')) tags.push(TXT.firstIntroFree);\r\n\r\n    return sortLabels([...new Set(tags)]);\r\n  }\r\n\r\n  function parseDateFlexible(value) {\r\n    const raw = String(value ?? '').trim();\r\n\r\n    if (!raw) return null;\r\n\r\n    if (\/^\\d{4}-\\d{2}-\\d{2}$\/.test(raw)) {\r\n      const d = new Date(`${raw}T00:00:00`);\r\n      return Number.isNaN(d.getTime()) ? null : d;\r\n    }\r\n\r\n    if (\/^\\d{2}\\.\\d{2}\\.\\d{4}$\/.test(raw)) {\r\n      const [dd, mm, yyyy] = raw.split('.');\r\n      const d = new Date(`${yyyy}-${mm}-${dd}T00:00:00`);\r\n      return Number.isNaN(d.getTime()) ? null : d;\r\n    }\r\n\r\n    if (\/^\\d{4}-\\d{2}$\/.test(raw)) {\r\n      const d = new Date(`${raw}-01T00:00:00`);\r\n      return Number.isNaN(d.getTime()) ? null : d;\r\n    }\r\n\r\n    if (\/^\\d{8}$\/.test(raw)) {\r\n      const yyyy = raw.slice(0, 4);\r\n      const mm = raw.slice(4, 6);\r\n      const dd = raw.slice(6, 8);\r\n      const d = new Date(`${yyyy}-${mm}-${dd}T00:00:00`);\r\n      return Number.isNaN(d.getTime()) ? null : d;\r\n    }\r\n\r\n    const d = new Date(raw);\r\n\r\n    return Number.isNaN(d.getTime()) ? null : d;\r\n  }\r\n\r\n  function normalizeExperience(v) {\r\n    const s = String(v ?? '').trim();\r\n\r\n    if (!s) return '';\r\n\r\n    if (s === '<1') return EXP_BANDS['<1'];\r\n    if (s === '1-5') return EXP_BANDS['1-5'];\r\n    if (s === '5-15') return EXP_BANDS['5-15'];\r\n    if (s === '15+') return EXP_BANDS['15+'];\r\n\r\n    const start = parseDateFlexible(s);\r\n\r\n    if (!start) return '';\r\n\r\n    const years = (Date.now() - start.getTime()) \/ (365.25 * 24 * 60 * 60 * 1000);\r\n\r\n    if (years < 1) return EXP_BANDS['<1'];\r\n    if (years < 5) return EXP_BANDS['1-5'];\r\n    if (years < 15) return EXP_BANDS['5-15'];\r\n\r\n    return EXP_BANDS['15+'];\r\n  }\r\n\r\n  function normalizePriceBand(v) {\r\n    const level = priceBandToLevel(v);\r\n\r\n    if (!level) return '';\r\n    if (level === 1) return PRICE_BANDS[1];\r\n    if (level === 2) return PRICE_BANDS[2];\r\n    if (level === 3) return PRICE_BANDS[3];\r\n\r\n    return PRICE_BANDS[4];\r\n  }\r\n\r\n  function priceBandToLevel(v) {\r\n    const s = String(v ?? '').trim();\r\n\r\n    if (!s) return 0;\r\n\r\n    if (s === '<1000') return 1;\r\n    if (s === '1000-3000') return 2;\r\n    if (s === '3000-5000') return 3;\r\n    if (s === '5000+') return 4;\r\n\r\n    const n = Number(String(s).replace(\/\\s\/g, '').replace(',', '.').replace(\/[^\\d.]\/g, ''));\r\n\r\n    if (!Number.isFinite(n)) return 0;\r\n\r\n    if (n < 1000) return 1;\r\n    if (n <= 3000) return 2;\r\n    if (n <= 5000) return 3;\r\n\r\n    return 4;\r\n  }\r\n\r\n  function parseLocations(meta) {\r\n    const locationsRaw = meta[META.locations];\r\n\r\n    if (Array.isArray(locationsRaw) && locationsRaw.length) {\r\n      return locationsRaw\r\n        .map(loc => ({\r\n          country: cleanValue(loc?.country),\r\n          region: cleanValue(loc?.region),\r\n          city: cleanValue(loc?.city),\r\n          street: cleanValue(loc?.street)\r\n        }))\r\n        .filter(x => x.country || x.region || x.city || x.street);\r\n    }\r\n\r\n    if (typeof locationsRaw === 'string' && cleanValue(locationsRaw)) {\r\n      try {\r\n        const parsed = JSON.parse(locationsRaw);\r\n\r\n        if (Array.isArray(parsed)) {\r\n          return parsed\r\n            .map(loc => ({\r\n              country: cleanValue(loc?.country),\r\n              region: cleanValue(loc?.region),\r\n              city: cleanValue(loc?.city),\r\n              street: cleanValue(loc?.street)\r\n            }))\r\n            .filter(x => x.country || x.region || x.city || x.street);\r\n        }\r\n      } catch (_) {}\r\n    }\r\n\r\n    const jsonRaw = cleanValue(meta[META.locationsJson]);\r\n\r\n    if (jsonRaw) {\r\n      try {\r\n        const parsed = JSON.parse(jsonRaw);\r\n\r\n        if (Array.isArray(parsed)) {\r\n          return parsed\r\n            .map(loc => ({\r\n              country: cleanValue(loc?.country),\r\n              region: cleanValue(loc?.region),\r\n              city: cleanValue(loc?.city),\r\n              street: cleanValue(loc?.street)\r\n            }))\r\n            .filter(x => x.country || x.region || x.city || x.street);\r\n        }\r\n      } catch (_) {}\r\n    }\r\n\r\n    const country = cleanValue(meta[META.country]);\r\n    const region = cleanValue(meta[META.region]);\r\n    const city = cleanValue(meta[META.city]);\r\n    const street = cleanValue(meta[META.street]);\r\n\r\n    if (country || region || city || street) {\r\n      return [{ country, region, city, street }];\r\n    }\r\n\r\n    return [];\r\n  }\r\n\r\n  function isUkraineCountry(value) {\r\n    const key = String(value || '').trim().toLowerCase();\r\n    return key === '\u0443\u043a\u0440\u0430\u0457\u043d\u0430' || key === 'ukraine';\r\n  }\r\n\r\n  function localizeCountryLabel(value) {\r\n    const raw = cleanValue(value);\r\n    if (!raw) return '';\r\n    if (isUkraineCountry(raw)) return TXT.ukraine;\r\n    if (normalizeOtherKey(raw).startsWith('\u0456\u043d\u0448\u0456 \u043b\u043e\u043a\u0430\u0446\u0456\u0457') || normalizeOtherKey(raw).startsWith('other locations')) return TXT.otherLocations;\r\n    return raw;\r\n  }\r\n\r\n  function buildLocationData(locations) {\r\n    const countries = [];\r\n    const regionsByCountry = {};\r\n    const citiesByCountry = {};\r\n    const citiesByCountryRegion = {};\r\n    const tokens = [];\r\n\r\n    (locations || []).forEach(loc => {\r\n      const country = localizeCountryLabel(cleanValue(loc.country)) || TXT.otherLocations;\r\n      const region = cleanValue(loc.region);\r\n      const city = cleanValue(loc.city);\r\n\r\n      countries.push(country);\r\n      tokens.push(`country::${country}`);\r\n\r\n      if (isUkraineCountry(country) && region) {\r\n        if (!regionsByCountry[country]) regionsByCountry[country] = [];\r\n        regionsByCountry[country].push(region);\r\n        tokens.push(`region::${country}::${region}`);\r\n      }\r\n\r\n      if (city) {\r\n        if (isUkraineCountry(country) && region) {\r\n          if (!citiesByCountryRegion[country]) citiesByCountryRegion[country] = {};\r\n          if (!citiesByCountryRegion[country][region]) citiesByCountryRegion[country][region] = [];\r\n\r\n          citiesByCountryRegion[country][region].push(city);\r\n          tokens.push(`city::${country}::${region}::${city}`);\r\n        } else {\r\n          if (!citiesByCountry[country]) citiesByCountry[country] = [];\r\n\r\n          citiesByCountry[country].push(city);\r\n          tokens.push(`city::${country}::${city}`);\r\n        }\r\n      }\r\n    });\r\n\r\n    return {\r\n      countries: sortLabels([...new Set(countries)], { ukraineFirst: true }),\r\n\r\n      regionsByCountry: Object.fromEntries(\r\n        Object.entries(regionsByCountry).map(([country, regions]) => [\r\n          country,\r\n          sortLabels([...new Set(regions)])\r\n        ])\r\n      ),\r\n\r\n      citiesByCountry: Object.fromEntries(\r\n        Object.entries(citiesByCountry).map(([country, cities]) => [\r\n          country,\r\n          sortLabels([...new Set(cities)])\r\n        ])\r\n      ),\r\n\r\n      citiesByCountryRegion: Object.fromEntries(\r\n        Object.entries(citiesByCountryRegion).map(([country, regionMap]) => [\r\n          country,\r\n          Object.fromEntries(\r\n            Object.entries(regionMap).map(([region, cities]) => [\r\n              region,\r\n              sortLabels([...new Set(cities)])\r\n            ])\r\n          )\r\n        ])\r\n      ),\r\n\r\n      tokens: [...new Set(tokens)]\r\n    };\r\n  }\r\n\r\n  function locationToLabel(loc) {\r\n    return [loc.city, loc.region, loc.country]\r\n      .map(cleanValue)\r\n      .filter(Boolean)\r\n      .join(', ');\r\n  }\r\n\r\n  function uniqueLocationLabels(locations) {\r\n    return sortLabels(\r\n      [...new Set((locations || []).map(locationToLabel).filter(Boolean))],\r\n      { ukraineFirst: true }\r\n    );\r\n  }\r\n\r\n  function mapProfile(item) {\r\n    const meta = item.meta || {};\r\n    const locations = parseLocations(meta);\r\n    const locationData = buildLocationData(locations);\r\n\r\n    const profileKind = item.profile_kind || meta.profile_kind || 'mediator';\r\n    const profileKindLabel = mapLabel('profileKind', profileKind) || item.profile_kind_label || TXT.specialistFallback;\r\n\r\n    const nameEnFromMeta = [meta[META.firstNameEn], meta[META                   .lastNameEn]]\r\n          .map(cleanValue)\r\n          .filter(Boolean)\r\n          .join(' ');\r\n        \r\n        const name = IS_EN\r\n          ? (cleanValue(item.name_en) || nameEnFromMeta || cleanValue(item.name) || cleanValue(item.title))\r\n          : (cleanValue(item.name) || cleanValue(item.title));\r\n\r\n    return {\r\n      id: item.id,\r\n      profileKind,\r\n      profileKindLabel,\r\n      link: item.link || '#',\r\n      name,\r\n      image: item.img || item.image || '',\r\n\r\n      modes: normalizeMode(meta[META.mode]),\r\n      specs: parseSpecializations(meta[META.spec]),\r\n      langs: normalizeLanguages(meta[META.lang]),\r\n\r\n      pays: buildPaymentTags(meta),\r\n      paymentTerms: normalizePaymentTerms(meta),\r\n      introMeetingPays: normalizeIntroMeetingPay(meta),\r\n\r\n      gender: mapLabel('gender', meta[META.gender]),\r\n\r\n      \/*\r\n       * \u0412\u0430\u0436\u043b\u0438\u0432\u043e:\r\n       * unchecked checkbox \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454 meta \u0432\u0437\u0430\u0433\u0430\u043b\u0456.\r\n       * \u0414\u043b\u044f \u0444\u0456\u043b\u044c\u0442\u0440\u0456\u0432 \u0446\u0435 \u043c\u0430\u0454 \u0442\u0440\u0430\u043a\u0442\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u044f\u043a \u201c\u041d\u0456\u201d.\r\n       *\/\r\n      military: normalizeBooleanLabel(meta[META.military], true),\r\n      signLanguage: normalizeBooleanLabel(meta[META.signLanguage], true),\r\n\r\n      mediatorAssociationMember: normalizeMediatorAssociationMember(meta[META.associations]),\r\n\r\n      experience: normalizeExperience(meta[META.experience]),\r\n      priceBand: normalizePriceBand(meta[META.priceFrom]),\r\n      priceLevel: priceBandToLevel(meta[META.priceFrom]),\r\n\r\n      translationTypes: normalizeTranslationTypes(meta[META.translationType]),\r\n      lawyerPracticeForm: normalizeLawyerPracticeForm(meta[META.lawyerPracticeForm]),\r\n      freeLegalAid: normalizeBooleanLabel(meta[META.providesFreeLegalAid], true),\r\n\r\n      locations,\r\n      countries: locationData.countries,\r\n      regionsByCountry: locationData.regionsByCountry,\r\n      citiesByCountry: locationData.citiesByCountry,\r\n      citiesByCountryRegion: locationData.citiesByCountryRegion,\r\n      locationTokens: locationData.tokens,\r\n      locationLabels: uniqueLocationLabels(locations),\r\n\r\n      notaryRegisterLink: cleanValue(meta[META.notaryRegisterLink]),\r\n      lawyerRegistryLink: cleanValue(meta[META.lawyerRegistryLink]),\r\n\r\n      _meta: meta,\r\n\r\n      _searchText: [\r\n        item.name,\r\n        item.title,\r\n        item.name_en,\r\n        meta.first_name,\r\n        meta.last_name,\r\n        meta.middle_name,\r\n        meta.first_name_en,\r\n        meta.last_name_en\r\n      ].filter(Boolean).join(' ').toLowerCase()\r\n    };\r\n  }\r\n\r\n  async function fetchByKind(kind) {\r\n    if (state.cache[kind]) return state.cache[kind];\r\n\r\n    const url = `${REST_BASE}?profile_kind=${encodeURIComponent(kind)}`;\r\n    const res = await fetch(url, { credentials: 'same-origin' });\r\n\r\n    if (!res.ok) throw new Error(`REST fetch failed: ${kind}`);\r\n\r\n    const data = await res.json();\r\n    const items = Array.isArray(data.items) ? data.items : [];\r\n\r\n    state.cache[kind] = items;\r\n\r\n    return items;\r\n  }\r\n\r\n  function renderPriceScale(level) {\r\n    const safe = Math.max(0, Math.min(4, Number(level) || 0));\r\n\r\n    if (!safe) {\r\n      return `\r\n        <span class=\"mh2__chip mh2__chip--price\" aria-label=\"${esc(TXT.priceUnknown)}\">\r\n          <span class=\"mh2__priceScale mh2__priceScale--unknown\">\r\n            ${[1, 2, 3, 4].map(() => `<span class=\"mh2__priceSymbol mh2__priceSymbol--unknown\">?<\/span>`).join('')}\r\n          <\/span>\r\n        <\/span>\r\n      `;\r\n    }\r\n\r\n    return `\r\n      <span class=\"mh2__chip mh2__chip--price\" aria-label=\"${esc(TXT.priceAria(safe))}\">\r\n        <span class=\"mh2__priceScale\">\r\n          ${[1, 2, 3, 4].map(i => `<span class=\"mh2__priceSymbol ${i <= safe ? 'is-on' : ''}\">\u20b4<\/span>`).join('')}\r\n        <\/span>\r\n      <\/span>\r\n    `;\r\n  }\r\n\r\n  function getCardMetaLine(p) {\r\n    if (p.profileKind === 'mediator') {\r\n      return p.modes.length ? p.modes.join(', ') : '';\r\n    }\r\n\r\n    if (p.profileKind === 'translator') {\r\n      if (p.translationTypes.length) return p.translationTypes.join(', ');\r\n      if (p.modes.length) return p.modes.join(', ');\r\n      return '';\r\n    }\r\n\r\n    if (p.profileKind === 'lawyer') {\r\n      const parts = [\r\n        p.lawyerPracticeForm,\r\n        p.modes.length ? p.modes.join(', ') : ''\r\n      ].filter(Boolean);\r\n\r\n      return parts.join(' \u00b7 ');\r\n    }\r\n\r\n    if (p.profileKind === 'notary') {\r\n      if (p.locationLabels.length) return p.locationLabels.slice(0, 2).join(' \u00b7 ');\r\n      return '';\r\n    }\r\n\r\n    return '';\r\n  }\r\n\r\n  function getHoverContent(p) {\r\n    if (p.profileKind === 'mediator' && p.specs.length) {\r\n      return {\r\n        title: TXT.hover.specializations,\r\n        items: p.specs.slice(0, 5)\r\n      };\r\n    }\r\n\r\n    if (p.profileKind === 'translator' && p.translationTypes.length) {\r\n      return {\r\n        title: TXT.hover.translationTypes,\r\n        items: p.translationTypes.slice(0, 5)\r\n      };\r\n    }\r\n\r\n    if (p.profileKind === 'lawyer') {\r\n      const items = [\r\n        p.lawyerPracticeForm,\r\n        p.freeLegalAid === TXT.yes ? TXT.providedFreeLegalAid : ''\r\n      ].filter(Boolean);\r\n\r\n      if (items.length) {\r\n        return {\r\n          title: TXT.hover.profile,\r\n          items\r\n        };\r\n      }\r\n    }\r\n\r\n    if (p.profileKind === 'notary' && p.locationLabels.length) {\r\n      return {\r\n        title: TXT.hover.locations,\r\n        items: p.locationLabels.slice(0, 5)\r\n      };\r\n    }\r\n\r\n    if (p.langs.length) {\r\n      return {\r\n        title: TXT.hover.languages,\r\n        items: p.langs.slice(0, 5)\r\n      };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function phIcon() {\r\n    return `\r\n      <svg class=\"mh2__ph\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\r\n        <path d=\"M4 17V7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2Z\" stroke=\"currentColor\" stroke-width=\"1.6\"\/>\r\n        <path d=\"M8 13l2-2 3 3 2-2 3 3\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\r\n        <path d=\"M9 9.2a1 1 0 1 0 0 .2\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"round\"\/>\r\n      <\/svg>\r\n    `;\r\n  }\r\n\r\n  function renderCards() {\r\n    els.grid.innerHTML = state.filtered.map(p => {\r\n      const img = p.image\r\n        ? `<img decoding=\"async\" src=\"${esc(p.image)}\" alt=\"${esc(p.name)}\">`\r\n        : phIcon();\r\n\r\n      const hover = getHoverContent(p);\r\n\r\n      const hoverHtml = hover ? `\r\n        <div class=\"mh2__hoverPanel\">\r\n          <div class=\"mh2__hoverTitle\">${esc(hover.title)}<\/div>\r\n          <ul class=\"mh2__hoverList\">\r\n            ${hover.items.map(s => `<li class=\"mh2__hoverItem\">${esc(s)}<\/li>`).join('')}\r\n          <\/ul>\r\n        <\/div>\r\n      ` : '';\r\n\r\n      const metaLine = getCardMetaLine(p);\r\n\r\n      \/*\r\n       * \u0427\u0438\u043f\u0438 \u0434\u043e\u0441\u0432\u0456\u0434\u0443\/\u0446\u0456\u043d\u0438 \u0437\u0430\u0440\u0430\u0437 \u043f\u0440\u0438\u0445\u043e\u0432\u0430\u043d\u0456, \u044f\u043a \u0443 \u0432\u0430\u0448\u0456\u0439 \u0432\u0435\u0440\u0441\u0456\u0457.\r\n       * \u042f\u043a\u0449\u043e \u0442\u0440\u0435\u0431\u0430 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0438 \u2014 \u0437\u043c\u0456\u043d\u0456\u0442\u044c false \u043d\u0430 true.\r\n       *\/\r\n      const showBottomChips = false;\r\n\r\n      const experienceChip = showBottomChips\r\n        ? (\r\n          p.experience\r\n            ? `<span class=\"mh2__chip mh2__chip--exp\">${esc(TXT.experiencePrefix)} ${esc(p.experience)}<\/span>`\r\n            : `<span class=\"mh2__chip mh2__chip--exp\">${esc(TXT.experienceMissing)}<\/span>`\r\n        )\r\n        : '';\r\n\r\n      const showPrice = showBottomChips && p.profileKind !== 'notary';\r\n\r\n      const chips = [\r\n        experienceChip,\r\n        showPrice ? renderPriceScale(p.priceLevel) : ''\r\n      ].join('');\r\n\r\n      return `\r\n        <article class=\"mh2__card\">\r\n          <a class=\"mh2__img\" href=\"${esc(p.link)}\">\r\n            ${img}\r\n            ${hoverHtml}\r\n          <\/a>\r\n\r\n          <div class=\"mh2__body\">\r\n            <div class=\"mh2__bottom\">\r\n              <h3 class=\"mh2__name\">\r\n                <a class=\"mh2__nameLink\" href=\"${esc(p.link)}\">${esc(p.name)}<\/a>\r\n              <\/h3>\r\n\r\n              ${metaLine ? `<div class=\"mh2__modeLine\">${esc(metaLine)}<\/div>` : ''}\r\n\r\n              <div class=\"mh2__chips\">${chips}<\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/article>\r\n      `;\r\n    }).join('');\r\n  }\r\n\r\n  function hasAny(set) {\r\n    return set && set.size > 0;\r\n  }\r\n\r\n  function matchSetAny(values, selectedSet) {\r\n    if (!hasAny(selectedSet)) return true;\r\n\r\n    for (const v of (values || [])) {\r\n      if (selectedSet.has(v)) return true;\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  function matchLocation(p, selectedSet) {\r\n    if (!selectedSet || selectedSet.size === 0) return true;\r\n\r\n    const tokens = new Set(p.locationTokens || []);\r\n\r\n    return [...selectedSet].some(token => tokens.has(token));\r\n  }\r\n\r\n  function getFacetCounts(getValues) {\r\n    const map = new Map();\r\n\r\n    state.all.forEach(p => {\r\n      const uniqueValues = [...new Set(\r\n        (getValues(p) || []).map(cleanValue).filter(Boolean)\r\n      )];\r\n\r\n      uniqueValues.forEach(v => {\r\n        map.set(v, (map.get(v) || 0) + 1);\r\n      });\r\n    });\r\n\r\n    return map;\r\n  }\r\n\r\n  function sortFacetItems(items, cfg) {\r\n    if (cfg.sort === 'custom' && Array.isArray(cfg.customSort)) {\r\n      const orderMap = new Map(cfg.customSort.map((v, i) => [v, i]));\r\n\r\n      return items.sort((a, b) => {\r\n        const ai = orderMap.has(a.label) ? orderMap.get(a.label) : 999;\r\n        const bi = orderMap.has(b.label) ? orderMap.get(b.label) : 999;\r\n\r\n        if (ai !== bi) return ai - bi;\r\n\r\n        return compareLabels(a.label, b.label);\r\n      });\r\n    }\r\n\r\n    return items.sort((a, b) => compareLabels(a.label, b.label));\r\n  }\r\n\r\n  function renderFacet(container, items, facetName, cfg = {}) {\r\n    const keepZero = new Set((cfg.includeZeroOptions || []).map(String));\r\n\r\n    const clean = items\r\n      .map(it => ({\r\n        ...it,\r\n        label: String(it.label || '').trim(),\r\n        value: String(it.value || '').trim()\r\n      }))\r\n      .filter(it => it.label && it.value)\r\n      .filter(it => it.count > 0 || keepZero.has(it.label));\r\n\r\n    if (!clean.length) {\r\n      container.innerHTML = `\r\n        <div style=\"color:rgba(14,36,72,.6);font-size:12px;padding:2px 2px 8px;\">\r\n          ${esc(TXT.noData)}\r\n        <\/div>\r\n      `;\r\n      return;\r\n    }\r\n\r\n    container.innerHTML = clean.map(it => `\r\n      <label class=\"mh2__item\">\r\n        <span class=\"mh2__left\">\r\n          <input type=\"checkbox\" data-f=\"${facetName}\" value=\"${esc(it.value)}\">\r\n          <span>${esc(it.label)}<\/span>\r\n        <\/span>\r\n        <span class=\"mh2__cnt\">(${it.count})<\/span>\r\n      <\/label>\r\n    `).join('');\r\n\r\n    container.querySelectorAll('input[type=\"checkbox\"]').forEach(cb => {\r\n      if (state.sel[facetName].has(cb.value)) cb.checked = true;\r\n\r\n      cb.addEventListener('change', () => {\r\n        const f = cb.getAttribute('data-f');\r\n        const set = state.sel[f];\r\n\r\n        if (cb.checked) set.add(cb.value);\r\n        else set.delete(cb.value);\r\n\r\n        apply();\r\n      });\r\n    });\r\n  }\r\n\r\n  function renderLocationFacet(container) {\r\n    const countryCounts = new Map();\r\n    const regionCountsByCountry = new Map();\r\n    const cityCountsByCountry = new Map();\r\n    const cityCountsByCountryRegion = new Map();\r\n\r\n    state.all.forEach(p => {\r\n      (p.countries || []).forEach(country => {\r\n        countryCounts.set(country, (countryCounts.get(country) || 0) + 1);\r\n      });\r\n\r\n      Object.entries(p.regionsByCountry || {}).forEach(([country, regions]) => {\r\n        if (!regionCountsByCountry.has(country)) regionCountsByCountry.set(country, new Map());\r\n\r\n        const regionMap = regionCountsByCountry.get(country);\r\n\r\n        [...new Set(regions)].forEach(region => {\r\n          regionMap.set(region, (regionMap.get(region) || 0) + 1);\r\n        });\r\n      });\r\n\r\n      Object.entries(p.citiesByCountry || {}).forEach(([country, cities]) => {\r\n        if (!cityCountsByCountry.has(country)) cityCountsByCountry.set(country, new Map());\r\n\r\n        const cityMap = cityCountsByCountry.get(country);\r\n\r\n        [...new Set(cities)].forEach(city => {\r\n          cityMap.set(city, (cityMap.get(city) || 0) + 1);\r\n        });\r\n      });\r\n\r\n      Object.entries(p.citiesByCountryRegion || {}).forEach(([country, regionMapRaw]) => {\r\n        if (!cityCountsByCountryRegion.has(country)) cityCountsByCountryRegion.set(country, new Map());\r\n\r\n        const countryMap = cityCountsByCountryRegion.get(country);\r\n\r\n        Object.entries(regionMapRaw).forEach(([region, cities]) => {\r\n          if (!countryMap.has(region)) countryMap.set(region, new Map());\r\n\r\n          const cityMap = countryMap.get(region);\r\n\r\n          [...new Set(cities)].forEach(city => {\r\n            cityMap.set(city, (cityMap.get(city) || 0) + 1);\r\n          });\r\n        });\r\n      });\r\n    });\r\n\r\n    const countries = [...countryCounts.entries()]\r\n      .map(([country, count]) => ({ country, count }))\r\n      .sort((a, b) => compareLabels(a.country, b.country, { ukraineFirst: true }));\r\n\r\n    container.innerHTML = countries.map(({ country, count }) => {\r\n      const countryToken = `country::${country}`;\r\n      const regionMap = regionCountsByCountry.get(country) || new Map();\r\n      const directCityMap = cityCountsByCountry.get(country) || new Map();\r\n      const regionCityMap = cityCountsByCountryRegion.get(country) || new Map();\r\n\r\n      const regions = [...regionMap.entries()]\r\n        .map(([region, regionCount]) => ({ region, regionCount }))\r\n        .sort((a, b) => compareLabels(a.region, b.region));\r\n\r\n      const directCities = [...directCityMap.entries()]\r\n        .map(([city, cityCount]) => ({ city, cityCount }))\r\n        .sort((a, b) => compareLabels(a.city, b.city));\r\n\r\n      const hasChildren = regions.length > 0 || directCities.length > 0;\r\n      const isCountryOpen = shouldOpenCountryGroup(country);\r\n\r\n      return `\r\n        <div class=\"mh2__locGroup\">\r\n          <div class=\"mh2__locCountryRow\">\r\n            <label class=\"mh2__item mh2__item--country\">\r\n              <span class=\"mh2__left\">\r\n                <input type=\"checkbox\" data-f=\"location\" value=\"${esc(countryToken)}\">\r\n                <span>${esc(country)}<\/span>\r\n              <\/span>\r\n              <span class=\"mh2__cnt\">(${count})<\/span>\r\n            <\/label>\r\n\r\n            ${hasChildren ? `\r\n              <button class=\"mh2__locToggle\" type=\"button\" data-country=\"${esc(country)}\" aria-expanded=\"${isCountryOpen ? 'true' : 'false'}\">\r\n                ${isCountryOpen ? '\u25b4' : '\u25be'}\r\n              <\/button>\r\n            ` : ''}\r\n          <\/div>\r\n\r\n          ${hasChildren ? `\r\n            <div class=\"mh2__locChildren\" data-country-wrap=\"${esc(country)}\" style=\"display:${isCountryOpen ? 'flex' : 'none'};\">\r\n              ${regions.map(({ region, regionCount }) => {\r\n                const regionToken = `region::${country}::${region}`;\r\n                const regionCitiesMap = regionCityMap.get(region) || new Map();\r\n\r\n                const regionCities = [...regionCitiesMap.entries()]\r\n                  .map(([city, cityCount]) => ({ city, cityCount }))\r\n                  .sort((a, b) => compareLabels(a.city, b.city));\r\n\r\n                const hasRegionChildren = regionCities.length > 0;\r\n                const isRegionOpen = shouldOpenRegionGroup(country, region);\r\n\r\n                return `\r\n                  <div class=\"mh2__locRegionGroup\">\r\n                    <div class=\"mh2__locRegionRow\">\r\n                      <label class=\"mh2__item mh2__item--region\">\r\n                        <span class=\"mh2__left\">\r\n                          <input type=\"checkbox\" data-f=\"location\" value=\"${esc(regionToken)}\">\r\n                          <span>${esc(region)}<\/span>\r\n                        <\/span>\r\n                        <span class=\"mh2__cnt\">(${regionCount})<\/span>\r\n                      <\/label>\r\n\r\n                      ${hasRegionChildren ? `\r\n                        <button class=\"mh2__locToggle\" type=\"button\" data-region=\"${esc(`${country}||${region}`)}\" aria-expanded=\"${isRegionOpen ? 'true' : 'false'}\">\r\n                          ${isRegionOpen ? '\u25b4' : '\u25be'}\r\n                        <\/button>\r\n                      ` : ''}\r\n                    <\/div>\r\n\r\n                    ${hasRegionChildren ? `\r\n                      <div class=\"mh2__locCities\" data-region-wrap=\"${esc(`${country}||${region}`)}\" style=\"display:${isRegionOpen ? 'flex' : 'none'};\">\r\n                        ${regionCities.map(({ city, cityCount }) => {\r\n                          const cityToken = `city::${country}::${region}::${city}`;\r\n\r\n                          return `\r\n                            <label class=\"mh2__item mh2__item--city\">\r\n                              <span class=\"mh2__left\">\r\n                                <input type=\"checkbox\" data-f=\"location\" value=\"${esc(cityToken)}\">\r\n                                <span>${esc(city)}<\/span>\r\n                              <\/span>\r\n                              <span class=\"mh2__cnt\">(${cityCount})<\/span>\r\n                            <\/label>\r\n                          `;\r\n                        }).join('')}\r\n                      <\/div>\r\n                    ` : ''}\r\n                  <\/div>\r\n                `;\r\n              }).join('')}\r\n\r\n              ${directCities.length ? `\r\n                <div class=\"mh2__locCities mh2__locCities--direct\" style=\"display:flex;\">\r\n                  ${directCities.map(({ city, cityCount }) => {\r\n                    const cityToken = `city::${country}::${city}`;\r\n\r\n                    return `\r\n                      <label class=\"mh2__item mh2__item--city\">\r\n                        <span class=\"mh2__left\">\r\n                          <input type=\"checkbox\" data-f=\"location\" value=\"${esc(cityToken)}\">\r\n                          <span>${esc(city)}<\/span>\r\n                        <\/span>\r\n                        <span class=\"mh2__cnt\">(${cityCount})<\/span>\r\n                      <\/label>\r\n                    `;\r\n                  }).join('')}\r\n                <\/div>\r\n              ` : ''}\r\n            <\/div>\r\n          ` : ''}\r\n        <\/div>\r\n      `;\r\n    }).join('');\r\n\r\n    container.querySelectorAll('input[type=\"checkbox\"]').forEach(cb => {\r\n      if (state.sel.location.has(cb.value)) cb.checked = true;\r\n\r\n      cb.addEventListener('change', () => {\r\n        const set = state.sel.location;\r\n\r\n        if (cb.checked) set.add(cb.value);\r\n        else set.delete(cb.value);\r\n\r\n        apply();\r\n      });\r\n    });\r\n\r\n    container.querySelectorAll('.mh2__locToggle[data-country]').forEach(btn => {\r\n      btn.addEventListener('click', () => {\r\n        const country = btn.getAttribute('data-country');\r\n        const wrap = container.querySelector(`[data-country-wrap=\"${CSS.escape(country)}\"]`);\r\n\r\n        if (!wrap) return;\r\n\r\n        const isOpen = wrap.style.display !== 'none';\r\n\r\n        wrap.style.display = isOpen ? 'none' : 'flex';\r\n        btn.setAttribute('aria-expanded', isOpen ? 'false' : 'true');\r\n        btn.textContent = isOpen ? '\u25be' : '\u25b4';\r\n      });\r\n    });\r\n\r\n    container.querySelectorAll('.mh2__locToggle[data-region]').forEach(btn => {\r\n      btn.addEventListener('click', () => {\r\n        const regionKey = btn.getAttribute('data-region');\r\n        const wrap = container.querySelector(`[data-region-wrap=\"${CSS.escape(regionKey)}\"]`);\r\n\r\n        if (!wrap) return;\r\n\r\n        const isOpen = wrap.style.display !== 'none';\r\n\r\n        wrap.style.display = isOpen ? 'none' : 'flex';\r\n        btn.setAttribute('aria-expanded', isOpen ? 'false' : 'true');\r\n        btn.textContent = isOpen ? '\u25be' : '\u25b4';\r\n      });\r\n    });\r\n  }\r\n\r\n  function parseLocationToken(token) {\r\n    const parts = String(token || '').split('::').filter(Boolean);\r\n\r\n    if (!parts.length) return null;\r\n\r\n    if (parts[0] === 'country' && parts[1]) {\r\n      return {\r\n        level: 'country',\r\n        country: parts[1]\r\n      };\r\n    }\r\n\r\n    if (parts[0] === 'region' && parts[1] && parts[2]) {\r\n      return {\r\n        level: 'region',\r\n        country: parts[1],\r\n        region: parts[2]\r\n      };\r\n    }\r\n\r\n    if (parts[0] === 'city' && parts[1] && parts[2] && parts[3]) {\r\n      return {\r\n        level: 'city-region',\r\n        country: parts[1],\r\n        region: parts[2],\r\n        city: parts[3]\r\n      };\r\n    }\r\n\r\n    if (parts[0] === 'city' && parts[1] && parts[2]) {\r\n      return {\r\n        level: 'city-country',\r\n        country: parts[1],\r\n        city: parts[2]\r\n      };\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  function shouldOpenLocationFacet() {\r\n    return state.sel.location && state.sel.location.size > 0;\r\n  }\r\n\r\n  function shouldOpenCountryGroup(country) {\r\n    const selected = [...state.sel.location];\r\n\r\n    return selected.some(token => {\r\n      const parsed = parseLocationToken(token);\r\n      return parsed && parsed.country === country;\r\n    });\r\n  }\r\n\r\n  function shouldOpenRegionGroup(country, region) {\r\n    const selected = [...state.sel.location];\r\n\r\n    return selected.some(token => {\r\n      const parsed = parseLocationToken(token);\r\n      return parsed && parsed.country === country && parsed.region === region;\r\n    });\r\n  }\r\n\r\n  function renderFilterShell() {\r\n    const filterKeys = TAB_CONFIG[state.activeKind].filters;\r\n    const openLocation = shouldOpenLocationFacet();\r\n\r\n    els.filtersDynamic.innerHTML = filterKeys.map((key, index) => {\r\n      const def = FILTER_DEFS[key];\r\n\r\n      const isOpen = openLocation\r\n        ? key === 'location'\r\n        : index === 0;\r\n\r\n      return `\r\n        <details class=\"mh2__acc\" ${isOpen ? 'open' : ''}>\r\n          <summary class=\"mh2__accSum\">${esc(def.title)}<\/summary>\r\n          <div id=\"mh2-filter-${esc(key)}\" class=\"mh2__list\"><\/div>\r\n        <\/details>\r\n      `;\r\n    }).join('');\r\n\r\n    bindAccordion();\r\n  }\r\n\r\n  function buildFacets() {\r\n    renderFilterShell();\r\n\r\n    const filterKeys = TAB_CONFIG[state.activeKind].filters;\r\n\r\n    filterKeys.forEach(facetKey => {\r\n      const cfg = FILTER_DEFS[facetKey];\r\n      const container = document.getElementById(`mh2-filter-${facetKey}`);\r\n\r\n      if (!container) return;\r\n\r\n      if (facetKey === 'location') {\r\n        renderLocationFacet(container);\r\n        return;\r\n      }\r\n\r\n      const counts = getFacetCounts(cfg.getValues);\r\n\r\n      (cfg.includeZeroOptions || []).forEach(label => {\r\n        if (!counts.has(label)) counts.set(label, 0);\r\n      });\r\n\r\n      const items = [...counts.entries()].map(([value, count]) => ({\r\n        label: value,\r\n        value,\r\n        count\r\n      }));\r\n\r\n      renderFacet(container, sortFacetItems(items, cfg), facetKey, cfg);\r\n    });\r\n  }\r\n\r\n  function apply() {\r\n    const q = state.q.trim().toLowerCase();\r\n    const activeFilters = TAB_CONFIG[state.activeKind].filters;\r\n\r\n    state.filtered = state.all.filter(p => {\r\n      const matchQ = !q || (p._searchText || '').includes(q);\r\n\r\n      const matchFilters = activeFilters.every(facetKey => {\r\n        const cfg = FILTER_DEFS[facetKey];\r\n\r\n        if (facetKey === 'location') {\r\n          return matchLocation(p, state.sel.location);\r\n        }\r\n\r\n        return matchSetAny(cfg.getValues(p), state.sel[facetKey]);\r\n      });\r\n\r\n      return matchQ && matchFilters;\r\n    });\r\n\r\n    renderCards();\r\n\r\n    els.count.textContent = String(state.filtered.length);\r\n    els.empty.style.display = state.filtered.length ? 'none' : 'block';\r\n  }\r\n\r\n  function clearSelectionsAndSearch() {\r\n    state.q = '';\r\n\r\n    Object.values(state.sel).forEach(set => set.clear());\r\n\r\n    if (els.search) {\r\n      els.search.value = '';\r\n    }\r\n  }\r\n\r\n  function resetAll() {\r\n    clearSelectionsAndSearch();\r\n    buildFacets();\r\n    apply();\r\n  }\r\n\r\n  function bindAccordion() {\r\n    const accs = [...document.querySelectorAll('#mh-catalog .mh2__acc')];\r\n\r\n    accs.forEach(acc => {\r\n      acc.addEventListener('toggle', () => {\r\n        if (!acc.open) return;\r\n\r\n        accs.forEach(other => {\r\n          if (other !== acc) other.open = false;\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  function pad2(n) {\r\n    return String(n).padStart(2, '0');\r\n  }\r\n\r\n  function getHourKey(date = new Date()) {\r\n    return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}-${pad2(date.getHours())}`;\r\n  }\r\n\r\n  function hashString(str) {\r\n    let h = 1779033703 ^ str.length;\r\n\r\n    for (let i = 0; i < str.length; i++) {\r\n      h = Math.imul(h ^ str.charCodeAt(i), 3432918353);\r\n      h = (h << 13) | (h >>> 19);\r\n    }\r\n\r\n    h = Math.imul(h ^ (h >>> 16), 2246822507);\r\n    h = Math.imul(h ^ (h >>> 13), 3266489909);\r\n\r\n    return (h ^ (h >>> 16)) >>> 0;\r\n  }\r\n\r\n  function mulberry32(a) {\r\n    return function () {\r\n      let t = a += 0x6D2B79F5;\r\n\r\n      t = Math.imul(t ^ (t >>> 15), t | 1);\r\n      t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\r\n\r\n      return ((t ^ (t >>> 14)) >>> 0) \/ 4294967296;\r\n    };\r\n  }\r\n\r\n  function deterministicShuffle(list, seedString) {\r\n    const out = list.slice();\r\n    const rand = mulberry32(hashString(seedString));\r\n\r\n    for (let i = out.length - 1; i > 0; i--) {\r\n      const j = Math.floor(rand() * (i + 1));\r\n      [out[i], out[j]] = [out[j], out[i]];\r\n    }\r\n\r\n    return out;\r\n  }\r\n\r\n  function refreshHourlyOrder(force = false) {\r\n    const nextHourKey = getHourKey();\r\n\r\n    if (!force && state.hourKey === nextHourKey) return;\r\n\r\n    state.hourKey = nextHourKey;\r\n    state.all = deterministicShuffle(state.base, `mh2-${state.activeKind}-${nextHourKey}`);\r\n\r\n    apply();\r\n  }\r\n\r\n  function startHourlyShuffleWatcher() {\r\n    setInterval(() => {\r\n      refreshHourlyOrder();\r\n    }, 60 * 1000);\r\n  }\r\n\r\n  async function switchTab(kind) {\r\n    state.activeKind = kind;\r\n\r\n    document.querySelectorAll('#mh2-tabs .mh2__tab').forEach(btn => {\r\n      btn.classList.toggle('is-active', btn.dataset.kind === kind);\r\n    });\r\n\r\n    clearSelectionsAndSearch();\r\n\r\n    if (els.search) {\r\n      els.search.placeholder = TAB_CONFIG[kind].searchPlaceholder;\r\n    }\r\n\r\n    const raw = await fetchByKind(kind);\r\n\r\n    state.base = raw.map(mapProfile);\r\n\r\n    const nextHourKey = getHourKey();\r\n\r\n    state.hourKey = nextHourKey;\r\n    state.all = deterministicShuffle(state.base, `mh2-${state.activeKind}-${nextHourKey}`);\r\n\r\n    buildFacets();\r\n    apply();\r\n  }\r\n\r\n  function localizeStaticDom() {\r\n    const root = document.getElementById('mh-catalog');\r\n    if (!root) return;\r\n\r\n    const kicker = root.querySelector('.mh2__kicker');\r\n    if (kicker) kicker.textContent = TXT.kicker;\r\n\r\n    const title = root.querySelector('.mh2__title');\r\n    if (title) title.textContent = TXT.title;\r\n\r\n    const filtersTitle = root.querySelector('.mh2__filtersTitle');\r\n    if (filtersTitle) {\r\n      const icon = filtersTitle.querySelector('.mh2__filtersIcon');\r\n      filtersTitle.textContent = '';\r\n      if (icon) filtersTitle.appendChild(icon);\r\n      filtersTitle.append(document.createTextNode(' ' + TXT.filters));\r\n    }\r\n\r\n    const countLabel = root.querySelector('.mh2__countLabel');\r\n    if (countLabel) countLabel.textContent = TXT.countLabel;\r\n\r\n    if (els.reset) els.reset.textContent = TXT.reset;\r\n    if (els.empty) els.empty.textContent = TXT.empty;\r\n\r\n    root.querySelectorAll('#mh2-tabs .mh2__tab').forEach(btn => {\r\n      const kind = btn.dataset.kind;\r\n      if (kind && TAB_CONFIG[kind]) btn.textContent = TAB_CONFIG[kind].label;\r\n    });\r\n\r\n    if (els.search) {\r\n      els.search.placeholder = TAB_CONFIG[state.activeKind]?.searchPlaceholder || (IS_EN ? 'Search by name...' : '\u041f\u043e\u0448\u0443\u043a \u0437\u0430 \u0456\u043c\u02bc\u044f\u043c...');\r\n    }\r\n  }\r\n\r\n  function bind() {\r\n    els.search.addEventListener('input', e => {\r\n      state.q = e.target.value || '';\r\n      apply();\r\n    });\r\n\r\n    els.reset.addEventListener('click', resetAll);\r\n\r\n    els.tabs.querySelectorAll('.mh2__tab').forEach(btn => {\r\n      btn.addEventListener('click', async () => {\r\n        const kind = btn.dataset.kind;\r\n\r\n        if (!kind || kind === state.activeKind) return;\r\n\r\n        try {\r\n          await switchTab(kind);\r\n        } catch (err) {\r\n          console.error(err);\r\n          els.empty.style.display = 'block';\r\n          els.empty.textContent = TXT.loadingSectionError;\r\n        }\r\n      });\r\n    });\r\n  }\r\n\r\n  function getInitialParamsFromUrl() {\r\n    const params = new URLSearchParams(window.location.search);\r\n\r\n    const kindRaw = (params.get('kind') || '').trim();\r\n    const locationRaw = (params.get('location') || '').trim();\r\n    const qRaw = (params.get('q') || '').trim();\r\n\r\n    return {\r\n      kind: TAB_CONFIG[kindRaw] ? kindRaw : 'mediator',\r\n      location: locationRaw,\r\n      q: qRaw\r\n    };\r\n  }\r\n\r\n  function applyParamsToStateFromUrl() {\r\n    const { location, q } = getInitialParamsFromUrl();\r\n\r\n    Object.values(state.sel).forEach(set => set.clear());\r\n\r\n    state.q = '';\r\n\r\n    if (location) {\r\n      state.sel.location.add(location);\r\n    }\r\n\r\n    if (q) {\r\n      state.q = q;\r\n\r\n      if (els.search) {\r\n        els.search.value = q;\r\n      }\r\n    } else if (els.search) {\r\n      els.search.value = '';\r\n    }\r\n  }\r\n\r\n  async function init() {\r\n    localizeStaticDom();\r\n    bind();\r\n\r\n    const { kind } = getInitialParamsFromUrl();\r\n\r\n    await switchTab(kind);\r\n\r\n    applyParamsToStateFromUrl();\r\n    buildFacets();\r\n    apply();\r\n\r\n    startHourlyShuffleWatcher();\r\n  }\r\n\r\n  init().catch(err => {\r\n    console.error(err);\r\n    els.empty.style.display = 'block';\r\n    els.empty.textContent = TXT.loadingCatalogError;\r\n  });\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u041a\u0410\u0422\u0410\u041b\u041e\u0413 \u0424\u0410\u0425\u0406\u0412\u0426\u0406\u0412 \u0417\u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0445\u0456\u0432\u0446\u044f \u2014 \u0437\u0440\u0443\u0447\u043d\u043e, \u044f\u043a \u043d\u0456\u043a\u043e\u043b\u0438. \u041c\u0435\u0434\u0456\u0430\u0442\u043e\u0440\u0438 \u0410\u0434\u0432\u043e\u043a\u0430\u0442\u0438 \u041d\u043e\u0442\u0430\u0440\u0456\u0443\u0441\u0438 \u041f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0430\u0447\u0456 \u0424\u0456\u043b\u044c\u0442\u0440\u0438 \u041a\u0456\u043b\u044c\u043a\u0456\u0441\u0442\u044c \u0444\u0430\u0445\u0456\u0432\u0446\u0456\u0432 0 \u0421\u043a\u0438\u043d\u0443\u0442\u0438 \u0444\u0456\u043b\u044c\u0442\u0440\u0438 \u2315 \u041d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0437\u0430 \u0432\u0438\u0431\u0440\u0430\u043d\u0438\u043c\u0438 \u0444\u0456\u043b\u044c\u0442\u0440\u0430\u043c\u0438<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6492","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/pages\/6492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/comments?post=6492"}],"version-history":[{"count":160,"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/pages\/6492\/revisions"}],"predecessor-version":[{"id":12556,"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/pages\/6492\/revisions\/12556"}],"wp:attachment":[{"href":"https:\/\/www.mediation-help.com\/en\/wp-json\/wp\/v2\/media?parent=6492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}