- generic [active] [ref=f31e1]:
  - generic [ref=f31e3]:
    - generic [ref=f31e4]: YanProfile // Spec
    - generic [ref=f31e5]: v0.1 · 2026-08-17
  - generic [ref=f31e6]:
    - generic [ref=f31e7]:
      - generic [ref=f31e8]: Назначение
      - heading "Спецификация генератора браузерных профилей для работы с Яндексом" [level=2] [ref=f31e9]
      - paragraph [ref=f31e10]:
        - text: Архитектура системы, которая создаёт Chromium-профили, неотличимые от реальных пользователей при проверке скриптами антифрода Яндекса (
        - code [ref=f31e11]: tmgrdfrend.fp.js
        - text: ","
        - code [ref=f31e12]: watch_serp.js
        - text: ", SmartCaptcha). Документ покрывает все 60+ параметров фингерпринта, систему прокси, поведенческие модели и валидацию."
      - paragraph [ref=f31e14]:
        - strong [ref=f31e15]: "Источники анализа:"
        - text: реверс-инжиниринг
        - code [ref=f31e16]: tmgrdfrend.fp.js
        - text: (183 KB, 100+ параметров), анализатор pager-syzran.ru (60 проверок), мониторинг sosiska.top (версионирование скриптов), отчёт urlquery.net (сетевые запросы SmartCaptcha), архитектура Network/Monstro.
      - list [ref=f31e17]:
        - listitem [ref=f31e18]:
          - link "Архитектура" [ref=f31e19] [cursor=pointer]:
            - /url: "#arch"
        - listitem [ref=f31e20]:
          - link "Генерация" [ref=f31e21] [cursor=pointer]:
            - /url: "#generation"
        - listitem [ref=f31e22]:
          - link "Сбор снапшотов" [ref=f31e23] [cursor=pointer]:
            - /url: "#collector"
        - listitem [ref=f31e24]:
          - link "Фингерпринт" [ref=f31e25] [cursor=pointer]:
            - /url: "#fingerprint"
        - listitem [ref=f31e26]:
          - link "Navigator" [ref=f31e27] [cursor=pointer]:
            - /url: "#navigator"
        - listitem [ref=f31e28]:
          - link "Screen" [ref=f31e29] [cursor=pointer]:
            - /url: "#screen"
        - listitem [ref=f31e30]:
          - link "Canvas/WebGL" [ref=f31e31] [cursor=pointer]:
            - /url: "#canvas"
        - listitem [ref=f31e32]:
          - link "Audio" [ref=f31e33] [cursor=pointer]:
            - /url: "#audio"
        - listitem [ref=f31e34]:
          - link "Fonts" [ref=f31e35] [cursor=pointer]:
            - /url: "#fonts"
        - listitem [ref=f31e36]:
          - link "Media" [ref=f31e37] [cursor=pointer]:
            - /url: "#media"
        - listitem [ref=f31e38]:
          - link "Network/WebRTC" [ref=f31e39] [cursor=pointer]:
            - /url: "#network"
        - listitem [ref=f31e40]:
          - link "Anti-Automation" [ref=f31e41] [cursor=pointer]:
            - /url: "#automation"
        - listitem [ref=f31e42]:
          - link "Timezone" [ref=f31e43] [cursor=pointer]:
            - /url: "#timezone"
        - listitem [ref=f31e44]:
          - link "Proxy" [ref=f31e45] [cursor=pointer]:
            - /url: "#proxy"
        - listitem [ref=f31e46]:
          - link "Поведение" [ref=f31e47] [cursor=pointer]:
            - /url: "#behavior"
        - listitem [ref=f31e48]:
          - link "Валидация" [ref=f31e49] [cursor=pointer]:
            - /url: "#validation"
        - listitem [ref=f31e50]:
          - link "Pipeline" [ref=f31e51] [cursor=pointer]:
            - /url: "#pipeline"
    - generic [ref=f31e52]:
      - generic [ref=f31e53]: Раздел 1
      - heading "Архитектура системы" [level=2] [ref=f31e54]
      - paragraph [ref=f31e56]:
        - strong [ref=f31e57]: Ключевой принцип — шаблон + контролируемая мутация.
        - text: Мы НЕ клонируем отпечатки реальных пользователей. Если Яндекс увидит один и тот же fingerprint hash с двух разных IP — это ещё подозрительнее синтетики. Вместо этого база реальных снапшотов даёт нам
        - emphasis [ref=f31e58]: валидные комбинации параметров
        - text: ", а генератор создаёт на их основе уникальный профиль, которого раньше не существовало, но который выглядит так, будто мог бы существовать."
      - generic [ref=f31e59]: "Snapshot Collector Profile Generator Runtime Engine ┌────────────────────┐ ┌──────────────────────┐ ┌──────────────────────┐ │ Реальные машины │ │ Template Selector │ │ Chromium Fork │ │ (Win/Mac/Linux) │──собирает───▶│ выбор шаблона │──generates──▶│ (патченный бинарник) │ │ │ валидные │ │ уникальный │ │ │ Что собираем: │ комбинации │ Mutation Engine │ профиль │ Behavior Engine │ │ • GPU + extensions │ │ canvas/audio seed │ │ (ИИ-сценарии) │ │ • Шрифты по OS │ │ ±шрифты, viewport │ │ │ │ • Voices по OS │ │ уникальный hash │ │ Cookie/State Store │ │ • Screen + DPR │ │ │ │ (персистентный) │ │ • Plugins + MIME │ │ Proxy Binder │ │ │ │ • WebGL precision │ │ IP → geo → TZ │──binds──────▶│ WebRTC TURN │ └────────────────────┘ └──────────┬───────────┘ └──────────┬───────────┘ │ │ ▼ ▼ ┌──────────────────────┐ ┌──────────────────────┐ │ Consistency │ │ Runtime Validator │ │ Validator │ │ & Script Monitor │ │ │ │ │ │ Все параметры │ │ Trust Score ≥ 85 │ │ согласованы? │ │ перед каждым запуском│ │ Уникальность hash? │ │ Мониторинг fp.js │ └──────────────────────┘ └──────────────────────┘"
      - heading "Ключевые компоненты" [level=3] [ref=f31e61]
      - generic [ref=f31e62]:
        - generic [ref=f31e63]:
          - heading "Snapshot Collector" [level=4] [ref=f31e64]
          - paragraph [ref=f31e65]:
            - text: "Собирает с реальных машин (физических и облачных) валидные комбинации параметров: какой GPU идёт с какими WebGL extensions, какие шрифты стоят на конкретной OS, какие voices даёт Windows 11 vs macOS. Это не отпечатки для копирования — это"
            - strong [ref=f31e66]: эталоны валидных связок
            - text: .
        - generic [ref=f31e67]:
          - heading "Mutation Engine" [level=4] [ref=f31e68]
          - paragraph [ref=f31e69]:
            - text: "Берёт шаблон из базы и создаёт уникальный профиль: canvas seed (→ уникальный hash), audio seed, ±2-3 шрифта, рандомный viewport в реалистичном диапазоне. Результат — профиль,"
            - strong [ref=f31e70]: которого раньше не было
            - text: ", но все параметры внутренне согласованы."
        - generic [ref=f31e71]:
          - heading "Chromium Runtime" [level=4] [ref=f31e72]
          - paragraph [ref=f31e73]: Патченный Chromium с подменой параметров на уровне C++ (не JS-инъекция). Canvas noise, WebGL vendor/renderer, Audio — всё через нативные хуки в движке Blink/Skia.
        - generic [ref=f31e74]:
          - heading "Consistency Validator" [level=4] [ref=f31e75]
          - paragraph [ref=f31e76]: "Проверяет, что все параметры профиля согласованы: GPU ↔ Canvas hash, OS ↔ шрифты ↔ voices, TZ ↔ IP geo, UA ↔ platform. Также проверяет уникальность — два профиля не должны дать одинаковый fingerprint."
    - generic [ref=f31e77]:
      - generic [ref=f31e78]: Раздел 1.1
      - 'heading "Принцип генерации: шаблон + мутация" [level=2] [ref=f31e79]'
      - paragraph [ref=f31e80]: "Три подхода к созданию профилей — и почему работает только третий:"
      - table [ref=f31e82]:
        - rowgroup [ref=f31e83]:
          - row [ref=f31e84]:
            - columnheader "Подход" [ref=f31e85]
            - columnheader "Как работает" [ref=f31e86]
            - columnheader "Проблема" [ref=f31e87]
            - columnheader "Результат" [ref=f31e88]
        - rowgroup [ref=f31e89]:
          - row [ref=f31e90]:
            - cell "Рандом" [ref=f31e91]
            - cell "Случайная генерация каждого параметра отдельно" [ref=f31e93]
            - cell "Нарушение внутренних связей. Intel GPU + 0 расширений WebGL. Linux + шрифты Segoe UI" [ref=f31e94]
            - cell "Trust Score 20-40" [ref=f31e95]
          - row [ref=f31e96]:
            - cell "Клон" [ref=f31e97]
            - cell "Точное копирование отпечатка реального пользователя" [ref=f31e99]
            - 'cell "Дубликат fingerprint hash с другого IP. Яндекс видит: «этот отпечаток уже есть в Москве, а теперь появился в Новосибирске». Красный флаг" [ref=f31e100]'
            - cell "Детекция дубля" [ref=f31e101]
          - row [ref=f31e102]:
            - cell "Шаблон + мутация" [ref=f31e103]
            - cell "Берём реальную комбинацию параметров как шаблон, мутируем уникальные компоненты (canvas seed, audio seed, ±шрифты, viewport). Все связи сохранены, hash уникален" [ref=f31e105]
            - cell "—" [ref=f31e106]
            - cell "Trust Score 85-95" [ref=f31e107]
      - heading "Что берётся из шаблона (неизменяемое ядро)" [level=3] [ref=f31e108]
      - generic [ref=f31e109]:
        - paragraph [ref=f31e110]: "Эти параметры жёстко связаны друг с другом. Менять один без остальных нельзя — нарушится консистентность:"
        - list [ref=f31e111]:
          - listitem [ref=f31e112]:
            - strong [ref=f31e113]: OS + Platform
            - text: — Windows 11 / macOS 14 / Ubuntu 22 → определяет всё остальное
          - listitem [ref=f31e114]:
            - strong [ref=f31e115]: GPU Vendor + Renderer
            - text: — «Intel Inc.» + «ANGLE (Intel, UHD Graphics 630, ...)»
          - listitem [ref=f31e116]:
            - strong [ref=f31e117]: WebGL Extensions
            - text: — набор из 30-40 расширений, привязанный к конкретному GPU
          - listitem [ref=f31e118]:
            - strong [ref=f31e119]: WebGL Precision
            - text: — 12 типов точности шейдеров, зависят от GPU
          - listitem [ref=f31e120]:
            - strong [ref=f31e121]: Базовый набор шрифтов
            - text: — Segoe UI есть на Windows, но не на Linux
          - listitem [ref=f31e122]:
            - strong [ref=f31e123]: Speech Voices
            - text: — Microsoft David на Windows, но не на Mac
          - listitem [ref=f31e124]:
            - strong [ref=f31e125]: Math precision
            - text: — зависит от версии V8, одинаковая для одной версии Chrome
          - listitem [ref=f31e126]:
            - strong [ref=f31e127]: CPU ↔ RAM корреляция
            - text: — 2 ядра + 8GB = подозрительно
      - heading "Что мутируется (уникальная часть)" [level=3] [ref=f31e128]
      - generic [ref=f31e129]:
        - paragraph [ref=f31e130]: "Эти параметры делают каждый профиль уникальным, не нарушая связей:"
        - list [ref=f31e131]:
          - listitem [ref=f31e132]:
            - strong [ref=f31e133]: Canvas noise seed
            - text: "→ каждый профиль даёт уникальный canvas hash. Seed детерминированный: тот же профиль = тот же hash при каждом запуске"
          - listitem [ref=f31e134]:
            - strong [ref=f31e135]: Audio noise seed
            - text: → уникальная сумма сигнала AudioContext (диапазон 35-124)
          - listitem [ref=f31e136]:
            - strong [ref=f31e137]: Шрифты ±2-3
            - text: — из базового набора OS случайно удаляем или добавляем 2-3 редких шрифта. Пользователи устанавливают/удаляют шрифты
          - listitem [ref=f31e138]:
            - strong [ref=f31e139]: Screen / Viewport
            - text: "— innerWidth: 1200-1800, innerHeight: 700-1000 (в пределах screen). outerHeight = innerHeight + 80-120"
          - listitem [ref=f31e140]:
            - strong [ref=f31e141]: Color scheme
            - text: — light / dark (рандом, 60/40)
          - listitem [ref=f31e142]:
            - strong [ref=f31e143]: AdBlock
            - text: — да/нет (35% с адблоком)
          - listitem [ref=f31e144]:
            - strong [ref=f31e145]: Permissions mix
            - text: — 1-3 разрешения в "denied", остальные "prompt"
          - listitem [ref=f31e146]:
            - strong [ref=f31e147]: Media Devices
            - text: — 1-3 устройства, уникальные device ID (hash от profile seed)
          - listitem [ref=f31e148]:
            - strong [ref=f31e149]: Battery level
            - text: "— для \"ноутбука\": 0.4-1.0 (рандом)"
          - listitem [ref=f31e150]:
            - strong [ref=f31e151]: Network downlink
            - text: — 3-15 Mbps (рандом)
      - heading "Генерация за 5 шагов" [level=3] [ref=f31e152]
      - generic [ref=f31e153]:
        - generic [ref=f31e154]:
          - generic [ref=f31e155]: 1. Шаблон
          - generic [ref=f31e156]: Выбор из базы:«Win11 + UHD 630 + 1080p»
        - generic [ref=f31e157]: →
        - generic [ref=f31e158]:
          - generic [ref=f31e159]: 2. Мутация
          - generic [ref=f31e160]: Уникальные seeds,±шрифты, viewport
        - generic [ref=f31e161]: →
        - generic [ref=f31e162]:
          - generic [ref=f31e163]: 3. Привязка IP
          - generic [ref=f31e164]: Proxy → geo → TZ →language → locale
        - generic [ref=f31e165]: →
        - generic [ref=f31e166]:
          - generic [ref=f31e167]: 4. Валидация
          - generic [ref=f31e168]: Все связки ok?Hash уникален?
        - generic [ref=f31e169]: →
        - generic [ref=f31e170]:
          - generic [ref=f31e171]: 5. Профиль
          - generic [ref=f31e172]: JSON-конфиг дляChromium Runtime
      - 'heading "Пример: два профиля из одного шаблона" [level=3] [ref=f31e173]'
      - generic [ref=f31e174]: "// Шаблон: \"Win11-Intel-1080p\" // Ядро (одинаковое): { os: \"Windows\", platform: \"Win32\", gpuVendor: \"Intel Inc.\", gpuRenderer: \"ANGLE (Intel, Intel(R) UHD Graphics 630 ...)\", glExtensions: [\"GL_EXT_blend_minmax\", \"GL_EXT_color_buffer_half_float\", ...], // 35 шт. basefonts: [\"Arial\", \"Segoe UI\", \"Verdana\", \"Times New Roman\", ...], // 62 шт. voices: [\"Microsoft David\", \"Microsoft Zira\", \"Microsoft Mark\"], mathPrecision: { acos: 1.4473588658278522, sin: 0.8178819121159085, ... }, cores: 8, memory: 8, screen: { width: 1920, height: 1080, dpr: 1 }, } // Профиль A (мутация): // Профиль B (мутация): { { canvasSeed: \"a7f2e9...\", canvasSeed: \"3bc841...\", audioSeed: \"d4e1b3...\", audioSeed: \"f8a2c7...\", canvasHash: \"38b43122\", // ← уникальный canvasHash: \"7c1df890\", // ← другой audioSum: 101.66, // ← уникальный audioSum: 87.23, // ← другой fonts: basefonts + [\"Consolas\"] fonts: basefonts - [\"Georgia\"] - [\"Palatino Linotype\"], + [\"Cascadia Code\"], innerWidth: 1583, innerHeight: 847, innerWidth: 1412, innerHeight: 790, outerHeight: 939, outerHeight: 882, colorScheme: \"dark\", colorScheme: \"light\", adblock: true, adblock: false, permissions: { notifications: \"denied\" }, permissions: { camera: \"denied\" }, mediaDevices: [ mediaDevices: [ { kind: \"audioinput\", id: \"a1b2...\" }, { kind: \"audioinput\", id: \"x9y8...\" }, { kind: \"audiooutput\", id: \"c3d4...\" }, { kind: \"videoinput\", id: \"z7w6...\" }, ], { kind: \"audiooutput\", id: \"v5u4...\" }, battery: { level: 0.73, charging: false }, ], network: { downlink: 7.2 }, battery: { level: 1, charging: true }, } network: { downlink: 12.4 }, }"
    - generic [ref=f31e175]:
      - generic [ref=f31e176]: Раздел 1.2
      - heading "Модуль сбора снапшотов (Snapshot Collector)" [level=2] [ref=f31e177]
      - paragraph [ref=f31e178]: Для качественной генерации нужна база из 100+ реальных комбинаций параметров. Снапшоты собираются с реальных физических и облачных машин.
      - heading "Что собираем с каждой машины" [level=3] [ref=f31e179]
      - table [ref=f31e181]:
        - rowgroup [ref=f31e182]:
          - row [ref=f31e183]:
            - columnheader "Группа" [ref=f31e184]
            - columnheader "Параметры" [ref=f31e185]
            - columnheader "Как собираем" [ref=f31e186]
        - rowgroup [ref=f31e187]:
          - row [ref=f31e188]:
            - cell [ref=f31e189]:
              - strong [ref=f31e190]: OS
            - cell "Версия, билд, architecture, bitness" [ref=f31e191]
            - cell [ref=f31e192]:
              - code [ref=f31e193]: navigator.userAgentData.getHighEntropyValues()
          - row [ref=f31e194]:
            - cell [ref=f31e195]:
              - strong [ref=f31e196]: GPU
            - cell "Vendor, Renderer, WebGL version, extensions (полный список), precision (12 типов)" [ref=f31e197]
            - cell [ref=f31e198]:
              - text: "WebGL context:"
              - code [ref=f31e199]: getParameter(UNMASKED_VENDOR_WEBGL)
              - text: ","
              - code [ref=f31e200]: getSupportedExtensions()
              - text: ","
              - code [ref=f31e201]: getShaderPrecisionFormat()
          - row [ref=f31e202]:
            - cell [ref=f31e203]:
              - strong [ref=f31e204]: Screen
            - cell "width, height, availWidth, availHeight, colorDepth, DPR" [ref=f31e205]
            - cell [ref=f31e206]:
              - code [ref=f31e207]: screen.*
              - text: ","
              - code [ref=f31e208]: window.devicePixelRatio
          - row [ref=f31e209]:
            - cell [ref=f31e210]:
              - strong [ref=f31e211]: Fonts
            - cell "Полный список установленных шрифтов (100-200 кандидатов)" [ref=f31e212]
            - cell [ref=f31e213]:
              - text: Canvas
              - code [ref=f31e214]: measureText()
              - text: — проверяем каждый шрифт из списка, сравнивая с fallback
          - row [ref=f31e215]:
            - cell [ref=f31e216]:
              - strong [ref=f31e217]: Voices
            - cell [ref=f31e218]:
              - text: Список
              - code [ref=f31e219]: speechSynthesis
              - text: "голосов: name, lang, localService"
            - cell [ref=f31e220]:
              - code [ref=f31e221]: speechSynthesis.getVoices()
          - row [ref=f31e222]:
            - cell [ref=f31e223]:
              - strong [ref=f31e224]: Plugins
            - cell "Список плагинов и MIME types" [ref=f31e225]
            - cell [ref=f31e226]:
              - code [ref=f31e227]: navigator.plugins
              - text: ","
              - code [ref=f31e228]: navigator.mimeTypes
          - row [ref=f31e229]:
            - cell [ref=f31e230]:
              - strong [ref=f31e231]: Media
            - cell "Кодеки (canPlayType для h264/vp8/vp9/av1/h265/theora), Widevine" [ref=f31e232]
            - cell [ref=f31e233]:
              - code [ref=f31e234]: HTMLVideoElement.canPlayType()
              - text: ","
              - code [ref=f31e235]: navigator.requestMediaKeySystemAccess()
          - row [ref=f31e236]:
            - cell [ref=f31e237]:
              - strong [ref=f31e238]: Math
            - cell "Точность 16 функций (sin, cos, acos, tan, etc.), Float32 NaN byte" [ref=f31e239]
            - cell [ref=f31e240]:
              - text: Прямой вызов
              - code [ref=f31e241]: Math.*
              - text: с фиксированными аргументами
          - row [ref=f31e242]:
            - cell [ref=f31e243]:
              - strong [ref=f31e244]: CPU / RAM
            - cell "hardwareConcurrency, deviceMemory" [ref=f31e245]
            - cell [ref=f31e246]:
              - code [ref=f31e247]: navigator.*
          - row [ref=f31e248]:
            - cell [ref=f31e249]:
              - strong [ref=f31e250]: Window objects
            - cell "Наличие chrome, RTCPeerConnection, Notification, DeviceMotionEvent и др." [ref=f31e251]
            - cell [ref=f31e252]:
              - text: Проверка
              - code [ref=f31e253]: typeof window.X
      - heading "Источники снапшотов" [level=3] [ref=f31e254]
      - generic [ref=f31e255]:
        - generic [ref=f31e256]:
          - heading "Физические машины" [level=4] [ref=f31e257]
          - list [ref=f31e258]:
            - listitem [ref=f31e259]: Собственные компьютеры (Windows, Mac, Linux)
            - listitem [ref=f31e260]: Компьютеры знакомых/коллег (с разрешения)
            - listitem [ref=f31e261]: Б/у ноутбуки с разными GPU
            - listitem [ref=f31e262]: "Приоритет: разнообразие GPU + OS версий"
        - generic [ref=f31e263]:
          - heading "Облачные инстансы" [level=4] [ref=f31e264]
          - list [ref=f31e265]:
            - listitem [ref=f31e266]: AWS/GCP/Yandex Cloud с разными GPU
            - listitem [ref=f31e267]: Виртуалки на bare metal (не nested)
            - listitem [ref=f31e268]: "Важно: GPU passthrough для реальных значений WebGL"
            - listitem [ref=f31e269]: "Разные OS: Win10, Win11, macOS, Ubuntu, Fedora"
        - generic [ref=f31e270]:
          - heading "Краудсорсинг (опционально)" [level=4] [ref=f31e271]
          - list [ref=f31e272]:
            - listitem [ref=f31e273]: Web-страница со сбором (с согласия)
            - listitem [ref=f31e274]: Расширение-коллектор для Chrome
            - listitem [ref=f31e275]: "Анонимизация: только комбинации, без PII"
            - listitem [ref=f31e276]: "Цель: 500+ уникальных комбинаций"
      - heading "Формат снапшота в базе" [level=3] [ref=f31e277]
      - generic [ref=f31e278]: "// Пример записи в hardware DB { id: \"snap_001\", collected_at: \"2026-08-15\", source: \"physical\", // physical | cloud | crowdsource os: { name: \"Windows\", version: \"10.0.19045\", // Windows 10 22H2 platform: \"Win32\", architecture: \"x86\", bitness: \"64\", }, gpu: { vendor: \"NVIDIA Corporation\", renderer: \"ANGLE (NVIDIA, NVIDIA GeForce GTX 1660 SUPER Direct3D11 vs_5_0 ps_5_0, D3D11)\", webglVersion: \"WebGL 1.0 (OpenGL ES 2.0 Chromium)\", shadingVersion: \"WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)\", extensions: [ \"ANGLE_instanced_arrays\", \"EXT_blend_minmax\", \"EXT_clip_control\", \"EXT_color_buffer_half_float\", \"EXT_depth_clamp\", \"EXT_disjoint_timer_query\", // ... 38 total ], precision: { vertexShaderHighFloat: { rangeMin: 127, rangeMax: 127, precision: 23 }, vertexShaderMediumFloat: { rangeMin: 127, rangeMax: 127, precision: 23 }, // ... 12 types total }, }, screen: { width: 2560, height: 1440, dpr: 1, colorDepth: 24 }, cpu: { cores: 12, memory: 16 }, fonts: [\"Arial\", \"Arial Black\", \"Calibri\", \"Cambria\", \"Cascadia Code\", \"Comic Sans MS\", \"Consolas\", \"Constantia\", \"Corbel\", \"Courier New\", \"Ebrima\", \"Gabriola\", \"Georgia\", \"Impact\", \"Lucida Console\", \"Malgun Gothic\", \"Microsoft Sans Serif\", \"Palatino Linotype\", \"Segoe UI\", \"Segoe UI Symbol\", \"Tahoma\", \"Times New Roman\", \"Trebuchet MS\", \"Verdana\", \"Webdings\", \"Wingdings\"], // 26 detected voices: [ { name: \"Microsoft David - English (United States)\", lang: \"en-US\", local: true }, { name: \"Microsoft Zira - English (United States)\", lang: \"en-US\", local: true }, { name: \"Microsoft Irina - Russian (Russia)\", lang: \"ru-RU\", local: true }, ], codecs: { h264: \"probably\", vp8: \"probably\", vp9: \"probably\", av1: \"probably\", h265: \"\", theora: \"\" }, widevine: true, math: { acos: 1.4473588658278522, acosh: 691.4686750787736, asin: 0.12343746096704435, asinh: 0.881373587019543, atanh: 0.5493061443340549, atan: 0.4636476090008061, sin: 0.8178819121159085, sinh: 1.1752011936438014, cos: -0.8390715290095377, cosh: 1.5430806348152437, tan: -1.4214488238747245, tanh: 0.7615941559557649, exp: 2.718281828459045, expm1: 1.7182818284590453, log1p: 2.3978952727983707, powPI: 1.9275814160560206e-50, }, float32NanByte: 255, plugins: [\"PDF Viewer\", \"Chrome PDF Viewer\", \"Chromium PDF Viewer\", \"Microsoft Edge PDF Viewer\", \"WebKit built-in PDF\"], windowObjects: [\"chrome\", \"RTCPeerConnection\", \"Notification\", \"XPathResult\", \"DeviceMotionEvent\", \"Intl\"], }"
      - heading "Минимальное покрытие базы для старта" [level=3] [ref=f31e279]
      - table [ref=f31e281]:
        - rowgroup [ref=f31e282]:
          - row [ref=f31e283]:
            - columnheader "OS" [ref=f31e284]
            - columnheader "GPU Vendor" [ref=f31e285]
            - columnheader "Комбинаций" [ref=f31e286]
            - columnheader "Приоритет" [ref=f31e287]
        - rowgroup [ref=f31e288]:
          - row [ref=f31e289]:
            - cell "Windows 10" [ref=f31e290]
            - cell "Intel (UHD 620/630/770)" [ref=f31e291]
            - cell "5-8" [ref=f31e292]
            - cell "Высокий — самая частая комбинация в РФ" [ref=f31e293]:
              - generic [ref=f31e294]: Высокий
              - text: — самая частая комбинация в РФ
          - row [ref=f31e295]:
            - cell "Windows 10" [ref=f31e296]
            - cell "NVIDIA (GTX 1050-1660, RTX 3060)" [ref=f31e297]
            - cell "5-8" [ref=f31e298]
            - cell "Высокий" [ref=f31e299]
          - row [ref=f31e301]:
            - cell "Windows 11" [ref=f31e302]
            - cell "Intel (Iris Xe, UHD 770)" [ref=f31e303]
            - cell "5-8" [ref=f31e304]
            - cell "Высокий" [ref=f31e305]
          - row [ref=f31e307]:
            - cell "Windows 11" [ref=f31e308]
            - cell "NVIDIA (RTX 3060-4060)" [ref=f31e309]
            - cell "3-5" [ref=f31e310]
            - cell "Средний" [ref=f31e311]
          - row [ref=f31e313]:
            - cell "Windows 10/11" [ref=f31e314]
            - cell "AMD (RX 580, Vega)" [ref=f31e315]
            - cell "3-5" [ref=f31e316]
            - cell "Средний" [ref=f31e317]
          - row [ref=f31e319]:
            - cell "macOS 13-14" [ref=f31e320]
            - cell "Apple (M1/M2/M3)" [ref=f31e321]
            - cell "5-8" [ref=f31e322]
            - cell "Средний" [ref=f31e323]
          - row [ref=f31e325]:
            - cell "macOS 12-13" [ref=f31e326]
            - cell "Intel (Iris Plus/Pro)" [ref=f31e327]
            - cell "3-5" [ref=f31e328]
            - cell "Средний" [ref=f31e329]
          - row [ref=f31e331]:
            - cell "Ubuntu 22/24" [ref=f31e332]
            - cell "Intel / NVIDIA" [ref=f31e333]
            - cell "3-5" [ref=f31e334]
            - cell "Низкий — мало пользователей в РФ" [ref=f31e335]:
              - generic [ref=f31e336]: Низкий
              - text: — мало пользователей в РФ
      - paragraph [ref=f31e337]:
        - text: "Итого для MVP:"
        - strong [ref=f31e338]: 30-50 снапшотов
        - text: ". Для продакшена:"
        - strong [ref=f31e339]: 200+
        - text: .
    - generic [ref=f31e340]:
      - generic [ref=f31e341]: Раздел 2
      - heading "Полная карта параметров фингерпринта" [level=2] [ref=f31e342]
      - paragraph [ref=f31e343]:
        - text: На основе анализа
        - code [ref=f31e344]: tmgrdfrend.fp.js
        - text: — скрипта Яндекса, который собирает отпечаток браузера. Каждый параметр имеет критичность по степени влияния на Trust Score.
      - heading "Navigator & Hardware" [level=3] [ref=f31e345]
      - table [ref=f31e347]:
        - rowgroup [ref=f31e348]:
          - row [ref=f31e349]:
            - columnheader "Параметр" [ref=f31e350]
            - columnheader "Что проверяет Яндекс" [ref=f31e351]
            - columnheader "Критичность" [ref=f31e352]
            - columnheader "Стратегия подмены" [ref=f31e353]
        - rowgroup [ref=f31e354]:
          - row [ref=f31e355]:
            - cell [ref=f31e356]:
              - code [ref=f31e357]: navigator.userAgent
            - cell [ref=f31e358]:
              - text: Консистентность с
              - code [ref=f31e359]: userAgentData
              - text: ", версия Chrome, признаки Headless"
            - cell "CRITICAL" [ref=f31e360]
            - cell [ref=f31e361]:
              - text: Генерация на основе реальных UA-строк. Версия Chrome ±2 от текущей стабильной. Парсинг и кросс-валидация с
              - code [ref=f31e362]: brands
          - row [ref=f31e363]:
            - cell [ref=f31e364]:
              - code [ref=f31e365]: navigator.userAgentData
              - text: (High Entropy)
            - cell [ref=f31e366]:
              - code [ref=f31e367]: brands[]
              - text: ","
              - code [ref=f31e368]: platform
              - text: ","
              - code [ref=f31e369]: architecture
              - text: ","
              - code [ref=f31e370]: bitness
              - text: ","
              - code [ref=f31e371]: uaFullVersion
              - text: ","
              - code [ref=f31e372]: wow64
            - cell "CRITICAL" [ref=f31e373]
            - cell [ref=f31e374]:
              - text: C++ патч
              - code [ref=f31e375]: NavigatorUAData
              - text: . Brands без
              - code [ref=f31e376]: HeadlessChrome
              - text: . Синхронизация fullVersion с UA-строкой
          - row [ref=f31e377]:
            - cell [ref=f31e378]:
              - code [ref=f31e379]: navigator.platform
            - cell [ref=f31e380]:
              - text: Соответствие с OS в UA.
              - code [ref=f31e381]: Linux x86_64
              - text: /
              - code [ref=f31e382]: Win32
              - text: /
              - code [ref=f31e383]: MacIntel
            - cell "HIGH" [ref=f31e384]
            - cell [ref=f31e385]:
              - text: Зависит от профиля OS. Строгая связь с UA и
              - code [ref=f31e386]: userAgentData.platform
          - row [ref=f31e387]:
            - cell [ref=f31e388]:
              - code [ref=f31e389]: navigator.hardwareConcurrency
            - cell "Количество ядер CPU. 0 или 1 — подозрительно" [ref=f31e390]
            - cell "HIGH" [ref=f31e391]
            - cell [ref=f31e392]:
              - text: "Значения: 2, 4, 6, 8, 12, 16. Распределение по реальной статистике. Связано с"
              - code [ref=f31e393]: deviceMemory
          - row [ref=f31e394]:
            - cell [ref=f31e395]:
              - code [ref=f31e396]: navigator.deviceMemory
            - cell "Объём RAM в GB. Должен коррелировать с CPU" [ref=f31e397]
            - cell "HIGH" [ref=f31e398]
            - 'cell "Значения: 2, 4, 8. Корреляция: 2 ядра → 2-4 GB, 4+ ядер → 4-8 GB" [ref=f31e399]'
          - row [ref=f31e400]:
            - cell [ref=f31e401]:
              - code [ref=f31e402]: navigator.webdriver
            - cell [ref=f31e403]:
              - code [ref=f31e404]: "true"
              - text: = 100% бот
            - cell "CRITICAL" [ref=f31e405]
            - cell [ref=f31e406]:
              - text: "Патч на уровне C++: удаление флага из Blink. Не JS-override — проверяется через"
              - code [ref=f31e407]: Object.getOwnPropertyDescriptor
          - row [ref=f31e408]:
            - cell [ref=f31e409]:
              - code [ref=f31e410]: navigator.maxTouchPoints
            - cell "Desktop = 0, мобильные > 0" [ref=f31e411]
            - cell "MEDIUM" [ref=f31e412]
            - 'cell "Desktop: 0. Мобильный профиль: 5 или 10" [ref=f31e413]'
          - row [ref=f31e414]:
            - cell [ref=f31e415]:
              - code [ref=f31e416]: navigator.languages
            - cell "Массив языков. Должен совпадать с geo" [ref=f31e417]
            - cell "HIGH" [ref=f31e418]
            - cell [ref=f31e419]:
              - text: "Для РФ:"
              - code [ref=f31e420]: "[\"ru-RU\",\"ru\",\"en-US\",\"en\"]"
              - text: или
              - code [ref=f31e421]: "[\"ru\"]"
              - text: . Привязка к IP-геолокации
          - row [ref=f31e422]:
            - cell [ref=f31e423]:
              - code [ref=f31e424]: navigator.pdfViewerEnabled
            - cell "Наличие PDF-плагина" [ref=f31e425]
            - cell "LOW" [ref=f31e426]
            - cell [ref=f31e427]:
              - text: "Для Chrome:"
              - code [ref=f31e428]: "true"
              - text: (стандартное значение)
          - row [ref=f31e429]:
            - cell [ref=f31e430]:
              - code [ref=f31e431]: navigator.plugins
            - cell "Список плагинов. Пустой = подозрительно" [ref=f31e432]
            - cell "HIGH" [ref=f31e433]
            - 'cell "Стандартный набор Chrome: PDF Viewer, Chrome PDF Viewer, Chromium PDF Viewer, Native Client, Chrome PDF Plugin. 5 плагинов + соответствующие MIME-типы" [ref=f31e434]'
          - row [ref=f31e435]:
            - cell [ref=f31e436]:
              - code [ref=f31e437]: navigator.cookieEnabled
            - cell "Cookies включены" [ref=f31e438]
            - cell "MEDIUM" [ref=f31e439]
            - cell [ref=f31e440]:
              - text: Всегда
              - code [ref=f31e441]: "true"
          - row [ref=f31e442]:
            - cell [ref=f31e443]:
              - code [ref=f31e444]: navigator.vendor
            - cell [ref=f31e445]:
              - code [ref=f31e446]: "\"Google Inc.\""
              - text: для Chrome
            - cell "MEDIUM" [ref=f31e447]
            - cell "Фиксированное значение для Chrome-профиля" [ref=f31e448]
          - row [ref=f31e449]:
            - cell [ref=f31e450]:
              - code [ref=f31e451]: navigator.product
              - code [ref=f31e452]: navigator.productSub
            - cell [ref=f31e453]:
              - code [ref=f31e454]: "\"Gecko\""
              - text: /
              - code [ref=f31e455]: "\"20030107\""
              - text: — исторические значения
            - cell "LOW" [ref=f31e456]
            - cell "Фиксированные значения, не менять" [ref=f31e457]
      - heading "Screen & Display" [level=3] [ref=f31e458]
      - table [ref=f31e460]:
        - rowgroup [ref=f31e461]:
          - row [ref=f31e462]:
            - columnheader "Параметр" [ref=f31e463]
            - columnheader "Что проверяет Яндекс" [ref=f31e464]
            - columnheader "Критичность" [ref=f31e465]
            - columnheader "Стратегия подмены" [ref=f31e466]
        - rowgroup [ref=f31e467]:
          - row [ref=f31e468]:
            - cell [ref=f31e469]:
              - code [ref=f31e470]: screen.width/height
            - cell "Разрешение экрана. Нулевые значения = headless" [ref=f31e471]
            - cell "CRITICAL" [ref=f31e472]
            - 'cell "Из базы реальных разрешений: 1920x1080, 1366x768, 1440x900, 2560x1440, 1536x864. Распределение по статистике РФ" [ref=f31e473]'
          - row [ref=f31e474]:
            - cell [ref=f31e475]:
              - code [ref=f31e476]: screen.availWidth/Height
            - cell "Доступная область (минус панель задач)" [ref=f31e477]
            - cell "HIGH" [ref=f31e478]
            - 'cell "Windows: height - 40px (таскбар). Mac: height - 25px (меню). Linux: равно полному. Должно быть ≤ screen" [ref=f31e479]'
          - row [ref=f31e480]:
            - cell [ref=f31e481]:
              - code [ref=f31e482]: screen.colorDepth
              - code [ref=f31e483]: screen.pixelDepth
            - cell "Глубина цвета. Всегда 24 на десктопе" [ref=f31e484]
            - cell "MEDIUM" [ref=f31e485]
            - cell "24 для обоих значений. Всегда равны друг другу" [ref=f31e486]
          - row [ref=f31e487]:
            - cell [ref=f31e488]:
              - code [ref=f31e489]: window.devicePixelRatio
            - cell "DPR. 1 = обычный, 2 = Retina/HiDPI" [ref=f31e490]
            - cell "HIGH" [ref=f31e491]
            - cell "Должен коррелировать с экраном. 4K → DPR 1.5-2. 1080p → DPR 1. Mac → DPR 2" [ref=f31e492]
          - row [ref=f31e493]:
            - cell [ref=f31e494]:
              - code [ref=f31e495]: window.innerWidth/Height
              - code [ref=f31e496]: window.outerWidth/Height
            - cell "Размер viewport и окна. Outer > Inner" [ref=f31e497]
            - cell "HIGH" [ref=f31e498]
            - cell "Inner < availWidth. Outer = inner + хром браузера (~80-120px по высоте). Рандомизация в пределах реальных значений" [ref=f31e499]
          - row [ref=f31e500]:
            - cell [ref=f31e501]:
              - code [ref=f31e502]: screen.orientation
            - cell "Тип ориентации и угол" [ref=f31e503]
            - cell "LOW" [ref=f31e504]
            - cell [ref=f31e505]:
              - text: "Desktop:"
              - code [ref=f31e506]: "\"landscape-primary\""
              - text: ", angle: 0"
          - row [ref=f31e507]:
            - cell [ref=f31e508]:
              - code [ref=f31e509]: visualViewport
            - cell "Параметры визуального viewport" [ref=f31e510]
            - cell "MEDIUM" [ref=f31e511]
            - cell "width/height = innerWidth/Height. scale = 1. offsetLeft/Top = 0" [ref=f31e512]
      - heading "Canvas & WebGL" [level=3] [ref=f31e513]
      - table [ref=f31e515]:
        - rowgroup [ref=f31e516]:
          - row [ref=f31e517]:
            - columnheader "Параметр" [ref=f31e518]
            - columnheader "Что проверяет Яндекс" [ref=f31e519]
            - columnheader "Критичность" [ref=f31e520]
            - columnheader "Стратегия подмены" [ref=f31e521]
        - rowgroup [ref=f31e522]:
          - row [ref=f31e523]:
            - cell [ref=f31e524]:
              - code [ref=f31e525]: Canvas Fingerprint
            - cell "Hash отрисовки текста/графики. Headless даёт одинаковые результаты" [ref=f31e526]
            - cell "CRITICAL" [ref=f31e527]
            - cell [ref=f31e528]:
              - text: Noise injection на уровне Skia (C++ патч). Добавление шума к каждому пикселю при
              - code [ref=f31e529]: toDataURL()
              - text: . Шум должен быть детерминированным (seed от профиля) — тот же профиль = тот же hash
          - row [ref=f31e530]:
            - cell [ref=f31e531]:
              - code [ref=f31e532]: WebGL Vendor
            - cell "Производитель GPU. SwiftShader/Mesa = VM" [ref=f31e533]
            - cell "CRITICAL" [ref=f31e534]
            - cell [ref=f31e535]:
              - text: "Реальные значения:"
              - code [ref=f31e536]: "\"Intel Inc.\""
              - text: ","
              - code [ref=f31e537]: "\"NVIDIA Corporation\""
              - text: ","
              - code [ref=f31e538]: "\"ATI Technologies Inc.\""
              - text: . Связано с Renderer
          - row [ref=f31e539]:
            - cell [ref=f31e540]:
              - code [ref=f31e541]: WebGL Renderer
            - cell "Модель GPU. Должна соответствовать Vendor и OS" [ref=f31e542]
            - cell "CRITICAL" [ref=f31e543]
            - cell [ref=f31e544]:
              - text: "База реальных GPU:"
              - code [ref=f31e545]: "\"ANGLE (Intel, Intel(R) UHD Graphics 630, ...)\""
              - text: . Строго привязано к OS/Vendor
          - row [ref=f31e546]:
            - cell [ref=f31e547]:
              - code [ref=f31e548]: WebGL Extensions
            - cell "Количество и набор расширений" [ref=f31e549]
            - cell "HIGH" [ref=f31e550]
            - cell "30-40 расширений для реального GPU. Набор зависит от GPU модели. Хранить в базе привязанными к конкретным renderer'ам" [ref=f31e551]
          - row [ref=f31e552]:
            - cell [ref=f31e553]:
              - code [ref=f31e554]: WebGL Precision
            - cell "12 типов точности (vertex/fragment shaders)" [ref=f31e555]
            - cell "HIGH" [ref=f31e556]
            - cell "Зависит от GPU. Хранить связанными с renderer" [ref=f31e557]
          - row [ref=f31e558]:
            - cell [ref=f31e559]:
              - code [ref=f31e560]: WebGL Version
            - cell "Строка версии WebGL" [ref=f31e561]
            - cell "MEDIUM" [ref=f31e562]
            - cell [ref=f31e563]:
              - code [ref=f31e564]: "\"WebGL 1.0 (OpenGL ES 2.0 Chromium)\""
              - text: — стандартная для Chrome
          - row [ref=f31e565]:
            - cell [ref=f31e566]:
              - code [ref=f31e567]: WebGL Shading
            - cell "Версия языка шейдеров" [ref=f31e568]
            - cell "MEDIUM" [ref=f31e569]
            - cell [ref=f31e570]:
              - code [ref=f31e571]: "\"WebGL GLSL ES 1.0 (OpenGL ES GLSL ES 1.0 Chromium)\""
      - heading "Audio Fingerprint" [level=3] [ref=f31e572]
      - table [ref=f31e574]:
        - rowgroup [ref=f31e575]:
          - row [ref=f31e576]:
            - columnheader "Параметр" [ref=f31e577]
            - columnheader "Что проверяет Яндекс" [ref=f31e578]
            - columnheader "Критичность" [ref=f31e579]
            - columnheader "Стратегия подмены" [ref=f31e580]
        - rowgroup [ref=f31e581]:
          - row [ref=f31e582]:
            - cell [ref=f31e583]:
              - code [ref=f31e584]: AudioContext
              - text: fingerprint
            - cell "Сумма сигнала осциллятора. Нулевой результат = VM/headless" [ref=f31e585]
            - cell "CRITICAL" [ref=f31e586]
            - cell [ref=f31e587]:
              - text: Noise injection в
              - code [ref=f31e588]: OfflineAudioContext
              - text: . Сумма должна быть в диапазоне 35-124. Seed от профиля для стабильности
          - row [ref=f31e589]:
            - cell [ref=f31e590]:
              - code [ref=f31e591]: Audio Buffer
            - cell "Длина буфера обработки" [ref=f31e592]
            - cell "MEDIUM" [ref=f31e593]
            - 'cell "Стандартное значение: 4096 или 5000 сэмплов" [ref=f31e594]'
      - heading "Fonts" [level=3] [ref=f31e595]
      - table [ref=f31e597]:
        - rowgroup [ref=f31e598]:
          - row [ref=f31e599]:
            - columnheader "Параметр" [ref=f31e600]
            - columnheader "Что проверяет Яндекс" [ref=f31e601]
            - columnheader "Критичность" [ref=f31e602]
            - columnheader "Стратегия подмены" [ref=f31e603]
        - rowgroup [ref=f31e604]:
          - row [ref=f31e605]:
            - cell [ref=f31e606]:
              - code [ref=f31e607]: Font Detection
            - cell "Набор установленных шрифтов. Пустой = подозрительно" [ref=f31e608]
            - cell "HIGH" [ref=f31e609]
            - cell [ref=f31e610]:
              - text: Подмена через
              - code [ref=f31e611]: measureText()
              - text: "в Canvas API. Набор шрифтов привязан к OS. Windows: 50-100 шрифтов. Mac: 60-80. Linux: 20-40. Обязательные: Arial, Verdana, Times New Roman, Georgia, Courier New + OS-специфичные (Segoe UI для Win, SF для Mac)"
      - heading "Media & DRM" [level=3] [ref=f31e612]
      - table [ref=f31e614]:
        - rowgroup [ref=f31e615]:
          - row [ref=f31e616]:
            - columnheader "Параметр" [ref=f31e617]
            - columnheader "Что проверяет Яндекс" [ref=f31e618]
            - columnheader "Критичность" [ref=f31e619]
            - columnheader "Стратегия подмены" [ref=f31e620]
        - rowgroup [ref=f31e621]:
          - row [ref=f31e622]:
            - cell [ref=f31e623]:
              - code [ref=f31e624]: Video Codecs
            - cell "Поддержка h264, vp8, vp9, av1, h265, theora" [ref=f31e625]
            - cell "MEDIUM" [ref=f31e626]
            - 'cell "Chrome стандарт: h264=probably, vp8=probably, vp9=probably, av1=probably, h265=\"\", theora=\"\"" [ref=f31e627]'
          - row [ref=f31e628]:
            - cell [ref=f31e629]:
              - code [ref=f31e630]: Speech Synthesis
            - cell "Набор голосов. Пустой = подозрительно" [ref=f31e631]
            - cell "HIGH" [ref=f31e632]
            - cell [ref=f31e633]:
              - text: Подмена
              - code [ref=f31e634]: speechSynthesis.getVoices()
              - text: ". Windows: 3-5 голосов (Microsoft David, Zira). Mac: 20+ голосов. Linux: 0-2 (eSpeak). Привязка к OS"
          - row [ref=f31e635]:
            - cell [ref=f31e636]:
              - code [ref=f31e637]: Media Devices
            - cell "Список устройств (камеры, микрофоны). Пустой = подозрительно" [ref=f31e638]
            - cell "HIGH" [ref=f31e639]
            - 'cell "Генерация 1-3 устройств: audioinput, videoinput, audiooutput. Device ID — стабильный hash от профиля" [ref=f31e640]'
          - row [ref=f31e641]:
            - cell [ref=f31e642]:
              - code [ref=f31e643]: Widevine DRM
            - cell "Поддержка Widevine. Зависит от платформы" [ref=f31e644]
            - cell "MEDIUM" [ref=f31e645]
            - 'cell "Chrome desktop: поддерживается. Headless: обычно нет" [ref=f31e646]'
      - heading "Network & WebRTC" [level=3] [ref=f31e647]
      - table [ref=f31e649]:
        - rowgroup [ref=f31e650]:
          - row [ref=f31e651]:
            - columnheader "Параметр" [ref=f31e652]
            - columnheader "Что проверяет Яндекс" [ref=f31e653]
            - columnheader "Критичность" [ref=f31e654]
            - columnheader "Стратегия подмены" [ref=f31e655]
        - rowgroup [ref=f31e656]:
          - row [ref=f31e657]:
            - cell [ref=f31e658]:
              - code [ref=f31e659]: WebRTC IP Leak
            - cell "Утечка реального IP через STUN-запросы. Несоответствие IP прокси и WebRTC = бот" [ref=f31e660]
            - cell "CRITICAL" [ref=f31e661]
            - 'cell "3 режима: (1) Полная блокировка WebRTC. (2) Подмена IP через кастомный TURN-сервер. (3) Подмена SDP candidates на IP прокси. Предпочтительно: режим 2 или 3" [ref=f31e662]'
          - row [ref=f31e663]:
            - cell [ref=f31e664]:
              - code [ref=f31e665]: Network Information
            - cell [ref=f31e666]:
              - code [ref=f31e667]: effectiveType
              - text: ","
              - code [ref=f31e668]: downlink
              - text: ","
              - code [ref=f31e669]: rtt
              - text: ","
              - code [ref=f31e670]: saveData
            - cell "MEDIUM" [ref=f31e671]
            - 'cell "effectiveType: \"4g\". downlink: 5-10 Mbps (рандом). rtt: 50-150ms. saveData: false" [ref=f31e672]'
          - row [ref=f31e673]:
            - cell [ref=f31e674]:
              - code [ref=f31e675]: STUN Requests
            - cell "Запросы к STUN-серверам (Google). Детектируются IDS" [ref=f31e676]
            - cell "HIGH" [ref=f31e677]
            - cell "Подмена STUN-сервера или проксирование через собственный TURN" [ref=f31e678]
      - heading "Anti-Automation Detection" [level=3] [ref=f31e679]
      - table [ref=f31e681]:
        - rowgroup [ref=f31e682]:
          - row [ref=f31e683]:
            - columnheader "Параметр" [ref=f31e684]
            - columnheader "Что проверяет Яндекс" [ref=f31e685]
            - columnheader "Критичность" [ref=f31e686]
            - columnheader "Стратегия подмены" [ref=f31e687]
        - rowgroup [ref=f31e688]:
          - row [ref=f31e689]:
            - cell [ref=f31e690]:
              - code [ref=f31e691]: window.webdriver
              - code [ref=f31e692]: navigator.webdriver
            - cell "Наличие = автоматизация" [ref=f31e693]
            - cell "CRITICAL" [ref=f31e694]
            - cell "Удаление на уровне C++ в Blink. Delete/override в JS — детектируется через property descriptor" [ref=f31e695]
          - row [ref=f31e696]:
            - cell [ref=f31e697]:
              - code [ref=f31e698]: Phantom/Nightmare
              - text: detection
            - cell [ref=f31e699]:
              - code [ref=f31e700]: window._phantom
              - text: ","
              - code [ref=f31e701]: window.__nightmare
              - text: ","
              - code [ref=f31e702]: window.callPhantom
            - cell "CRITICAL" [ref=f31e703]
            - 'cell "Не должны существовать в window. Патч Chromium: не добавлять" [ref=f31e704]'
          - row [ref=f31e705]:
            - cell [ref=f31e706]:
              - code [ref=f31e707]: Selenium markers
            - cell [ref=f31e708]:
              - code [ref=f31e709]: document.$cdc_
              - text: ","
              - code [ref=f31e710]: $chrome_asyncScriptInfo
              - text: ","
              - code [ref=f31e711]: __selenium_unwrapped
            - cell "CRITICAL" [ref=f31e712]
            - cell [ref=f31e713]:
              - text: Полное удаление ChromeDriver-маркеров из исходников. Патч
              - code [ref=f31e714]: Runtime.enable
          - row [ref=f31e715]:
            - cell [ref=f31e716]:
              - code [ref=f31e717]: Playwright markers
            - cell [ref=f31e718]:
              - code [ref=f31e719]: __playwright
              - text: ","
              - code [ref=f31e720]: __pw_*
            - cell "CRITICAL" [ref=f31e721]
            - cell "Не использовать Playwright. Собственная CDP-обёртка" [ref=f31e722]
          - row [ref=f31e723]:
            - cell [ref=f31e724]:
              - code [ref=f31e725]: Puppeteer markers
            - cell [ref=f31e726]:
              - code [ref=f31e727]: __puppeteer_evaluation_script__
            - cell "CRITICAL" [ref=f31e728]
            - cell "Не использовать Puppeteer. Или патчить runtime" [ref=f31e729]
          - row [ref=f31e730]:
            - cell [ref=f31e731]:
              - code [ref=f31e732]: chrome object
            - cell [ref=f31e733]:
              - text: Наличие
              - code [ref=f31e734]: window.chrome
              - text: и его свойств. Headless Chrome = отсутствует или неполный
            - cell "CRITICAL" [ref=f31e735]
            - cell [ref=f31e736]:
              - text: Полная эмуляция объекта
              - code [ref=f31e737]: chrome
              - text: с
              - code [ref=f31e738]: runtime
              - text: ","
              - code [ref=f31e739]: loadTimes()
              - text: ","
              - code [ref=f31e740]: csi()
              - text: . Проверка в iframe
          - row [ref=f31e741]:
            - cell [ref=f31e742]:
              - code [ref=f31e743]: Prototype checks
            - cell [ref=f31e744]:
              - code [ref=f31e745]: HTMLElement.toString
              - text: ","
              - code [ref=f31e746]: Intl.DateTimeFormat.toString
              - text: — выявляют подделку нативных функций
            - cell "HIGH" [ref=f31e747]
            - cell [ref=f31e748]:
              - text: Все подменяемые функции должны возвращать
              - code [ref=f31e749]: "\"[object Function]\""
              - text: или
              - code [ref=f31e750]: "\"function ... { [native code] }\""
              - text: через
              - code [ref=f31e751]: toString()
              - text: . Патч на C++ уровне
          - row [ref=f31e752]:
            - cell [ref=f31e753]:
              - code [ref=f31e754]: eval.toString().length
            - cell [ref=f31e755]:
              - text: Длина строки
              - code [ref=f31e756]: eval.toString()
              - text: . Разная для разных движков
            - cell "MEDIUM" [ref=f31e757]
            - 'cell "Chrome: 33. Должно быть стабильным" [ref=f31e758]'
          - row [ref=f31e759]:
            - cell [ref=f31e760]:
              - code [ref=f31e761]: Error.stack
            - cell "Наличие и формат stack trace" [ref=f31e762]
            - cell "MEDIUM" [ref=f31e763]
            - cell "Должен быть доступен. Формат Chrome-specific" [ref=f31e764]
      - heading "Timezone, Locale & Geo" [level=3] [ref=f31e765]
      - table [ref=f31e767]:
        - rowgroup [ref=f31e768]:
          - row [ref=f31e769]:
            - columnheader "Параметр" [ref=f31e770]
            - columnheader "Что проверяет Яндекс" [ref=f31e771]
            - columnheader "Критичность" [ref=f31e772]
            - columnheader "Стратегия подмены" [ref=f31e773]
        - rowgroup [ref=f31e774]:
          - row [ref=f31e775]:
            - cell [ref=f31e776]:
              - code [ref=f31e777]: Intl.DateTimeFormat
              - text: timezone
            - cell "Таймзона. Несоответствие с IP = красный флаг" [ref=f31e778]
            - cell "CRITICAL" [ref=f31e779]
            - cell "Автоматическая привязка к геолокации прокси. Москва → Europe/Moscow, Новосибирск → Asia/Novosibirsk и т.д." [ref=f31e780]
          - row [ref=f31e781]:
            - cell [ref=f31e782]:
              - code [ref=f31e783]: Date.getTimezoneOffset()
            - cell "Смещение в минутах. Должно совпадать с TZ" [ref=f31e784]
            - cell "CRITICAL" [ref=f31e785]
            - cell "Автоматический расчёт из timezone. Europe/Moscow → -180" [ref=f31e786]
          - row [ref=f31e787]:
            - cell [ref=f31e788]:
              - code [ref=f31e789]: DST detection
            - cell "Сравнение offset января и июля для определения DST" [ref=f31e790]
            - cell "HIGH" [ref=f31e791]
            - 'cell "Россия: DST=false (отменён в 2014). Jan offset = Jul offset. Важно для корректности" [ref=f31e792]'
          - row [ref=f31e793]:
            - cell [ref=f31e794]:
              - code [ref=f31e795]: Locale (Intl)
            - cell "Формат чисел, дат. Должен совпадать с language" [ref=f31e796]
            - cell "HIGH" [ref=f31e797]
            - cell [ref=f31e798]:
              - text: "Для РФ:"
              - code [ref=f31e799]: "\"ru-RU\""
              - text: . Проверка через
              - code [ref=f31e800]: Intl.NumberFormat
      - heading "Прочие параметры" [level=3] [ref=f31e801]
      - table [ref=f31e803]:
        - rowgroup [ref=f31e804]:
          - row [ref=f31e805]:
            - columnheader "Параметр" [ref=f31e806]
            - columnheader "Что проверяет Яндекс" [ref=f31e807]
            - columnheader "Критичность" [ref=f31e808]
            - columnheader "Стратегия подмены" [ref=f31e809]
        - rowgroup [ref=f31e810]:
          - row [ref=f31e811]:
            - cell [ref=f31e812]:
              - code [ref=f31e813]: Math precision
            - cell "Точность 16 математических функций (sin, cos, tan, acos, asin, atan, etc.)" [ref=f31e814]
            - cell "HIGH" [ref=f31e815]
            - cell "Зависит от JS-движка и версии V8. Одинаковые для всех Chrome одной версии. Не подменять — использовать реальные значения" [ref=f31e816]
          - row [ref=f31e817]:
            - cell [ref=f31e818]:
              - code [ref=f31e819]: Float32 NaN byte
            - cell "Специфичное поведение NaN в Float32Array. Зависит от архитектуры CPU" [ref=f31e820]
            - cell "MEDIUM" [ref=f31e821]
            - 'cell "x86: byte[3] = 255 (или 127). ARM: может отличаться. Не менять для x86" [ref=f31e822]'
          - row [ref=f31e823]:
            - cell [ref=f31e824]:
              - code [ref=f31e825]: Performance.now()
            - cell "Точность таймера. Слишком высокая = headless" [ref=f31e826]
            - cell "HIGH" [ref=f31e827]
            - cell "Ограничить точность до 0.1-1ms (стандартная для Chrome с Site Isolation). Min delta > 0" [ref=f31e828]
          - row [ref=f31e829]:
            - cell [ref=f31e830]:
              - code [ref=f31e831]: JS Heap Memory
            - cell [ref=f31e832]:
              - code [ref=f31e833]: jsHeapSizeLimit
              - text: ","
              - code [ref=f31e834]: totalJSHeapSize
              - text: ","
              - code [ref=f31e835]: usedJSHeapSize
              - text: . Нулевые = подозрительно
            - cell "MEDIUM" [ref=f31e836]
            - 'cell "Limit: 2-4 GB. Total > Used. Реалистичные значения: 10-50 MB used" [ref=f31e837]'
          - row [ref=f31e838]:
            - cell [ref=f31e839]:
              - code [ref=f31e840]: Storage APIs
            - cell "localStorage, sessionStorage, indexedDB, cookies — все должны быть доступны" [ref=f31e841]
            - cell "HIGH" [ref=f31e842]
            - cell "Все = true. Блокировка = признак автоматизации" [ref=f31e843]
          - row [ref=f31e844]:
            - cell [ref=f31e845]:
              - code [ref=f31e846]: Permissions API
            - cell "Статус 17-24 разрешений. У реальных пользователей — mix состояний" [ref=f31e847]
            - cell "HIGH" [ref=f31e848]
            - cell "Большинство = \"prompt\". 1-2 = \"denied\" (notifications). Никогда все \"granted\"" [ref=f31e849]
          - row [ref=f31e850]:
            - cell [ref=f31e851]:
              - code [ref=f31e852]: Battery API
            - cell "Состояние батареи. Desktop = charging, level 1" [ref=f31e853]
            - cell "MEDIUM" [ref=f31e854]
            - 'cell "Desktop: charging=true, level=1, chargingTime=0. Ноутбук: level 0.5-1.0, рандом" [ref=f31e855]'
          - row [ref=f31e856]:
            - cell [ref=f31e857]:
              - code [ref=f31e858]: CSS Media Queries
            - cell "prefers-color-scheme, prefers-reduced-motion, color-gamut" [ref=f31e859]
            - cell "MEDIUM" [ref=f31e860]
            - 'cell "Рандомный выбор light/dark. Motion: no-preference. Gamut: srgb (или p3 для Mac)" [ref=f31e861]'
          - row [ref=f31e862]:
            - cell [ref=f31e863]:
              - code [ref=f31e864]: AdBlock detection
            - cell "Наличие блокировщика рекламы по 4 спискам" [ref=f31e865]
            - cell "MEDIUM" [ref=f31e866]
            - cell "30-40% профилей — с адблоком. Реалистичная пропорция. Установка uBlock Origin для части профилей" [ref=f31e867]
          - row [ref=f31e868]:
            - cell [ref=f31e869]:
              - code [ref=f31e870]: Window objects
            - cell "Наличие RTCPeerConnection, Notification, DeviceMotionEvent, Intl_DateTimeFormat" [ref=f31e871]
            - cell "MEDIUM" [ref=f31e872]
            - cell "Все стандартные API Chrome должны присутствовать" [ref=f31e873]
          - row [ref=f31e874]:
            - cell [ref=f31e875]:
              - code [ref=f31e876]: Notification API
            - cell "Permission status и constructor" [ref=f31e877]
            - cell "MEDIUM" [ref=f31e878]
            - 'cell "Permission: \"default\" или \"denied\". Constructor: нативный" [ref=f31e879]'
          - row [ref=f31e880]:
            - cell [ref=f31e881]:
              - code [ref=f31e882]: Document Rect
            - cell "Размеры корневого элемента через getBoundingClientRect" [ref=f31e883]
            - cell "MEDIUM" [ref=f31e884]
            - cell "Должны соответствовать innerWidth/Height" [ref=f31e885]
    - generic [ref=f31e886]:
      - generic [ref=f31e887]: Раздел 3
      - heading "Система прокси" [level=2] [ref=f31e888]
      - paragraph [ref=f31e890]:
        - strong [ref=f31e891]: "Принцип:"
        - text: IP — это первое, что проверяется. Все остальные параметры профиля привязываются к геолокации IP. Несоответствие timezone/language/geo с IP — главный красный флаг.
      - heading "Типы прокси по приоритету" [level=3] [ref=f31e892]
      - table [ref=f31e894]:
        - rowgroup [ref=f31e895]:
          - row [ref=f31e896]:
            - columnheader "Тип" [ref=f31e897]
            - columnheader "Trust Level" [ref=f31e898]
            - columnheader "Описание" [ref=f31e899]
            - columnheader "Применение" [ref=f31e900]
        - rowgroup [ref=f31e901]:
          - row [ref=f31e902]:
            - cell "Резидентные (ISP)" [ref=f31e903]
            - cell "Высокий" [ref=f31e904]
            - cell "IP реальных провайдеров (Ростелеком, Билайн, МТС, Мегафон). ASN домашних пользователей" [ref=f31e906]
            - cell "Основной тип. Привязка 1 IP → 1 профиль на длительный срок" [ref=f31e907]
          - row [ref=f31e908]:
            - cell "Мобильные" [ref=f31e909]
            - cell "Высокий" [ref=f31e910]
            - cell "IP мобильных операторов. Естественная ротация IP (CGNAT)" [ref=f31e912]
            - cell "Для мобильных профилей. Допускается смена IP в пределах оператора/региона" [ref=f31e913]
          - row [ref=f31e914]:
            - cell "Серверные (DC) РФ" [ref=f31e915]
            - cell "Средний" [ref=f31e916]
            - cell "IP дата-центров. Легко определяются по ASN" [ref=f31e918]
            - cell "Только для тестирования. Не для продакшена" [ref=f31e919]
          - row [ref=f31e920]:
            - cell "Публичные" [ref=f31e921]
            - cell "Низкий" [ref=f31e922]
            - cell "Общедоступные прокси. Забанены в базах" [ref=f31e924]
            - cell "Не использовать" [ref=f31e925]
      - heading "Архитектура прокси-пула" [level=3] [ref=f31e926]
      - generic [ref=f31e927]: "ProxyPool ├── providers/ │ ├── residential/ # Резидентные провайдеры │ │ ├── sticky sessions # Закреплённые IP за профилем │ │ └── geo targeting # Город/регион → конкретный exit node │ └── mobile/ # Мобильные провайдеры │ ├── rotation policy # Ротация по расписанию (каждые 4-8 часов) │ └── operator match # IP оператора ↔ профиль устройства ├── geo_resolver/ │ ├── ip → city # MaxMind GeoIP2 City │ ├── city → timezone # Mapping города → таймзона │ ├── city → language # Mapping города → предпочитаемый язык │ └── asn → isp_name # ASN → имя провайдера (для валидации) └── health_check/ ├── latency monitor # Проверка задержки каждые 5 мин ├── ban detection # Мониторинг капчи/блокировок └── ip reputation # Проверка IP в базах спам-листов"
      - heading "Правила привязки прокси к профилю" [level=3] [ref=f31e928]
      - generic [ref=f31e929]:
        - generic [ref=f31e930]:
          - heading "Geo Consistency" [level=4] [ref=f31e931]
          - list [ref=f31e932]:
            - listitem [ref=f31e933]: IP geo → timezone (автоматически)
            - listitem [ref=f31e934]: IP geo → navigator.language
            - listitem [ref=f31e935]: IP geo → Intl.DateTimeFormat
            - listitem [ref=f31e936]: IP ASN → не DC/VPN
        - generic [ref=f31e937]:
          - heading "Session Persistence" [level=4] [ref=f31e938]
          - list [ref=f31e939]:
            - listitem [ref=f31e940]: 1 IP ↔ 1 профиль (sticky)
            - listitem [ref=f31e941]: Ротация не чаще 1 раз / 4 часа
            - listitem [ref=f31e942]: При ротации — тот же город/ISP
            - listitem [ref=f31e943]: Cookie store привязан к профилю
        - generic [ref=f31e944]:
          - heading "WebRTC Sync" [level=4] [ref=f31e945]
          - list [ref=f31e946]:
            - listitem [ref=f31e947]: WebRTC IP = proxy IP
            - listitem [ref=f31e948]: Собственный TURN-сервер
            - listitem [ref=f31e949]: Блокировка STUN к Google
            - listitem [ref=f31e950]: SDP candidates = proxy IP
    - generic [ref=f31e951]:
      - generic [ref=f31e952]: Раздел 4
      - heading "Поведенческий движок" [level=2] [ref=f31e953]
      - paragraph [ref=f31e954]:
        - text: Яндекс анализирует поведение через
        - code [ref=f31e955]: watch_serp.js
        - text: "(108 KB, обновляется часто — 500 версий в архиве sosiska.top). Скрипт трекает: движения мыши, скролл, клики, время на странице, переходы, возвраты в выдачу."
      - heading "Модель поведения на SERP" [level=3] [ref=f31e956]
      - generic [ref=f31e957]:
        - generic [ref=f31e958]:
          - generic [ref=f31e959]: Ввод запроса
          - generic [ref=f31e960]: Посимвольный набор с ошибками и паузами
        - generic [ref=f31e961]: →
        - generic [ref=f31e962]:
          - generic [ref=f31e963]: Просмотр SERP
          - generic [ref=f31e964]: Скролл, чтение сниппетов, 3-15 сек
        - generic [ref=f31e965]: →
        - generic [ref=f31e966]:
          - generic [ref=f31e967]: Клик
          - generic [ref=f31e968]: Не первый результат, кривая Безье к ссылке
        - generic [ref=f31e969]: →
        - generic [ref=f31e970]:
          - generic [ref=f31e971]: На сайте
          - generic [ref=f31e972]: 30с-5мин, скролл, клики по внутренним
        - generic [ref=f31e973]: →
        - generic [ref=f31e974]:
          - generic [ref=f31e975]: Возврат?
          - generic [ref=f31e976]: Pogo-sticking или остаётся
      - heading "Компоненты движка" [level=3] [ref=f31e977]
      - heading "Mouse Movement" [level=4] [ref=f31e978]
      - generic [ref=f31e979]:
        - paragraph [ref=f31e980]: Движение мыши — основной сигнал. Прямые линии и телепортации = бот.
        - list [ref=f31e981]:
          - listitem [ref=f31e982]:
            - strong [ref=f31e983]: Кривые Безье
            - text: с 3-5 контрольными точками + гауссов шум (sigma 2-5px)
          - listitem [ref=f31e984]:
            - strong [ref=f31e985]: "Скорость:"
            - text: ускорение → постоянная → замедление (трапецоидальный профиль). 200-800ms на перемещение
          - listitem [ref=f31e986]:
            - strong [ref=f31e987]: "Микродвижения:"
            - text: дрожание в покое (amplitude 1-3px, freq 2-5Hz)
          - listitem [ref=f31e988]:
            - strong [ref=f31e989]: "Паузы:"
            - text: 50-300ms перед кликом (прицеливание). Больше пауз у "неуверенных" профилей
          - listitem [ref=f31e990]:
            - strong [ref=f31e991]: "Overshoot:"
            - text: 10-20% перемещений проходят мимо цели и возвращаются
          - listitem [ref=f31e992]:
            - strong [ref=f31e993]: "Heatmap:"
            - text: движения концентрируются в области контента, не по всему viewport
      - heading "Scroll Behavior" [level=4] [ref=f31e994]
      - list [ref=f31e996]:
        - listitem [ref=f31e997]:
          - strong [ref=f31e998]: "Паттерн:"
          - text: не линейный. Быстрый скролл → остановка → чтение → скролл
        - listitem [ref=f31e999]:
          - strong [ref=f31e1000]: "Шаг:"
          - text: 100-400px за свайп (колесо мыши). Touchpad — плавный с инерцией
        - listitem [ref=f31e1001]:
          - strong [ref=f31e1002]: "Обратный скролл:"
          - text: 5-15% времени — скролл вверх (возврат к прочитанному)
        - listitem [ref=f31e1003]:
          - strong [ref=f31e1004]: "Глубина:"
          - text: не до конца страницы. 40-80% длины = реалистично
      - heading "Typing Behavior" [level=4] [ref=f31e1005]
      - list [ref=f31e1007]:
        - listitem [ref=f31e1008]:
          - strong [ref=f31e1009]: "Скорость:"
          - text: 120-300ms между символами (зависит от "типа" пользователя)
        - listitem [ref=f31e1010]:
          - strong [ref=f31e1011]: "Паузы:"
          - text: 300-800ms перед новым словом
        - listitem [ref=f31e1012]:
          - strong [ref=f31e1013]: "Ошибки:"
          - text: 2-5% опечаток с коррекцией через Backspace
        - listitem [ref=f31e1014]:
          - strong [ref=f31e1015]: "Автокомплит:"
          - text: 30-50% запросов — выбор из подсказок (клик или стрелки + Enter)
      - heading "Session Patterns" [level=4] [ref=f31e1016]
      - list [ref=f31e1018]:
        - listitem [ref=f31e1019]:
          - strong [ref=f31e1020]: "Время сессии:"
          - text: 5-30 минут (Гамма-распределение, median 12 мин)
        - listitem [ref=f31e1021]:
          - strong [ref=f31e1022]: "Запросов за сессию:"
          - text: 1-5 поисковых запросов
        - listitem [ref=f31e1023]:
          - strong [ref=f31e1024]: "Глубина просмотра:"
          - text: 1-3 страницы выдачи (80% — только первая)
        - listitem [ref=f31e1025]:
          - strong [ref=f31e1026]: "Pogo-sticking:"
          - text: 20-40% — возврат в выдачу после клика (нормально)
        - listitem [ref=f31e1027]:
          - strong [ref=f31e1028]: "Dwell time:"
          - text: целевой сайт 30с-5мин, не-целевой 5-15с
        - listitem [ref=f31e1029]:
          - strong [ref=f31e1030]: "Время суток:"
          - text: распределение по часам (пик 10-14 и 19-22, спад 2-6 утра)
    - generic [ref=f31e1031]:
      - generic [ref=f31e1032]: Раздел 5
      - heading "Правила консистентности профиля" [level=2] [ref=f31e1033]
      - paragraph [ref=f31e1034]: Каждый параметр связан с другими. Изолированная подмена одного значения без обновления зависимых — главная причина детекции.
      - table [ref=f31e1036]:
        - rowgroup [ref=f31e1037]:
          - row [ref=f31e1038]:
            - columnheader "Связка" [ref=f31e1039]
            - columnheader "Правило" [ref=f31e1040]
            - columnheader "Пример нарушения" [ref=f31e1041]
        - rowgroup [ref=f31e1042]:
          - row [ref=f31e1043]:
            - cell [ref=f31e1044]:
              - code [ref=f31e1045]: UA ↔ userAgentData
            - cell "Версия Chrome в UA-строке = uaFullVersion. Brands не содержат HeadlessChrome" [ref=f31e1046]
            - 'cell "UA: Chrome/150, brands: Chrome/148" [ref=f31e1047]'
          - row [ref=f31e1048]:
            - cell [ref=f31e1049]:
              - code [ref=f31e1050]: UA ↔ platform
            - cell "OS в UA совпадает с navigator.platform и userAgentData.platform" [ref=f31e1051]
            - 'cell "UA: Windows NT 10.0, platform: Linux x86_64" [ref=f31e1052]'
          - row [ref=f31e1053]:
            - cell [ref=f31e1054]:
              - code [ref=f31e1055]: GPU ↔ Canvas hash
            - cell "Один и тот же GPU vendor/renderer даёт стабильный canvas. Разные GPU = разный hash" [ref=f31e1056]
            - cell "Intel GPU + canvas hash от NVIDIA" [ref=f31e1057]
          - row [ref=f31e1058]:
            - cell [ref=f31e1059]:
              - code [ref=f31e1060]: GPU ↔ WebGL extensions
            - cell "Набор расширений зависит от GPU модели" [ref=f31e1061]
            - cell "SwiftShader GPU + 40 расширений" [ref=f31e1062]
          - row [ref=f31e1063]:
            - cell [ref=f31e1064]:
              - code [ref=f31e1065]: OS ↔ Fonts
            - cell "Windows имеет Segoe UI, Mac — SF Pro, Linux — минимальный набор" [ref=f31e1066]
            - cell "Linux platform + 80 Windows-шрифтов" [ref=f31e1067]
          - row [ref=f31e1068]:
            - cell [ref=f31e1069]:
              - code [ref=f31e1070]: OS ↔ Voices
            - cell "speechSynthesis голоса зависят от OS" [ref=f31e1071]
            - cell "Linux + голоса Microsoft David" [ref=f31e1072]
          - row [ref=f31e1073]:
            - cell [ref=f31e1074]:
              - code [ref=f31e1075]: IP geo ↔ Timezone
            - cell "Строгое соответствие города IP и таймзоны" [ref=f31e1076]
            - 'cell "IP: Москва, TZ: Asia/Bangkok" [ref=f31e1077]'
          - row [ref=f31e1078]:
            - cell [ref=f31e1079]:
              - code [ref=f31e1080]: IP geo ↔ Language
            - cell "Язык должен соответствовать региону" [ref=f31e1081]
            - 'cell "IP: Россия, language: zh-CN" [ref=f31e1082]'
          - row [ref=f31e1083]:
            - cell [ref=f31e1084]:
              - code [ref=f31e1085]: Screen ↔ DPR ↔ Viewport
            - cell "innerWidth ≤ availWidth ≤ screen.width. DPR согласован" [ref=f31e1086]
            - cell "innerWidth > screen.width" [ref=f31e1087]
          - row [ref=f31e1088]:
            - cell [ref=f31e1089]:
              - code [ref=f31e1090]: CPU ↔ Memory
            - cell "hardwareConcurrency коррелирует с deviceMemory" [ref=f31e1091]
            - cell "16 ядер + 2GB RAM" [ref=f31e1092]
          - row [ref=f31e1093]:
            - cell [ref=f31e1094]:
              - code [ref=f31e1095]: Desktop ↔ Touch
            - 'cell "Десктоп: maxTouchPoints=0, нет touch events. Мобильный: >0" [ref=f31e1096]'
            - cell "Desktop UA + maxTouchPoints=5" [ref=f31e1097]
          - row [ref=f31e1098]:
            - cell [ref=f31e1099]:
              - code [ref=f31e1100]: WebRTC ↔ Proxy IP
            - cell "IP через WebRTC = IP прокси" [ref=f31e1101]
            - 'cell "Proxy: 195.x.x.x, WebRTC leak: 92.x.x.x" [ref=f31e1102]'
          - row [ref=f31e1103]:
            - cell [ref=f31e1104]:
              - code [ref=f31e1105]: DST ↔ Region
            - 'cell "Россия: DST=false с 2014. Jan offset = Jul offset" [ref=f31e1106]'
            - 'cell "TZ: Europe/Moscow, но DST=true" [ref=f31e1107]'
    - generic [ref=f31e1108]:
      - generic [ref=f31e1109]: Раздел 6
      - heading "Система валидации (Trust Score)" [level=2] [ref=f31e1110]
      - paragraph [ref=f31e1111]:
        - text: "Каждый профиль перед использованием проходит проверку. Целевой Trust Score: ≥ 85/100. Система воспроизводит логику"
        - code [ref=f31e1112]: tmgrdfrend.fp.js
        - text: .
      - heading "Веса параметров для Trust Score" [level=3] [ref=f31e1113]
      - table [ref=f31e1115]:
        - rowgroup [ref=f31e1116]:
          - row [ref=f31e1117]:
            - columnheader "Группа" [ref=f31e1118]
            - columnheader "Вес" [ref=f31e1119]
            - columnheader "Ключевые проверки" [ref=f31e1120]
        - rowgroup [ref=f31e1121]:
          - row [ref=f31e1122]:
            - cell "Automation Detection" [ref=f31e1123]
            - cell [ref=f31e1124]:
              - strong [ref=f31e1125]: 25%
            - cell "webdriver=false, отсутствие маркеров Selenium/Playwright/Puppeteer, chrome object полный" [ref=f31e1126]
          - row [ref=f31e1127]:
            - cell "Canvas + WebGL + Audio" [ref=f31e1128]
            - cell [ref=f31e1129]:
              - strong [ref=f31e1130]: 20%
            - cell "Уникальные хеши, реальный GPU vendor/renderer, audio сумма > 0" [ref=f31e1131]
          - row [ref=f31e1132]:
            - cell "Navigator Consistency" [ref=f31e1133]
            - cell [ref=f31e1134]:
              - strong [ref=f31e1135]: 15%
            - cell "UA ↔ userAgentData, plugins не пустые, platform ↔ OS" [ref=f31e1136]
          - row [ref=f31e1137]:
            - cell "Geo/TZ/Language" [ref=f31e1138]
            - cell [ref=f31e1139]:
              - strong [ref=f31e1140]: 15%
            - cell "IP ↔ timezone ↔ language ↔ locale. DST корректность" [ref=f31e1141]
          - row [ref=f31e1142]:
            - cell "Screen/Viewport" [ref=f31e1143]
            - cell [ref=f31e1144]:
              - strong [ref=f31e1145]: 10%
            - cell "Реалистичные размеры, inner < avail < screen, DPR корреляция" [ref=f31e1146]
          - row [ref=f31e1147]:
            - cell "Media/Fonts/Voices" [ref=f31e1148]
            - cell [ref=f31e1149]:
              - strong [ref=f31e1150]: 10%
            - cell "Шрифты ≥ 10, голоса > 0, media devices > 0" [ref=f31e1151]
          - row [ref=f31e1152]:
            - cell "Network/WebRTC" [ref=f31e1153]
            - cell [ref=f31e1154]:
              - strong [ref=f31e1155]: 5%
            - cell "Нет IP leak, Network API реалистичный" [ref=f31e1156]
      - heading "Пайплайн валидации" [level=3] [ref=f31e1157]
      - generic [ref=f31e1158]: "validate(profile) { score = 100 // CRITICAL checks (fail = score 0) if (profile.webdriver === true) → return 0 if (profile.ua contains \"HeadlessChrome\") → return 0 if (profile.brands contains \"Headless\") → return 0 if (profile.automationMarkers.length > 0) → return 0 // WEIGHTED checks if (!matchUAvsUAData(profile)) → score -= 15 if (!matchIPvsTimezone(profile)) → score -= 15 if (profile.plugins.length === 0) → score -= 10 if (profile.fonts.length === 0) → score -= 10 if (profile.voices.length === 0) → score -= 5 if (profile.mediaDevices === 0) → score -= 5 if (profile.webrtcIP !== proxyIP) → score -= 10 if (!matchOSvsFonts(profile)) → score -= 8 if (!matchGPUvsCanvas(profile)) → score -= 10 if (profile.audioSum === 0) → score -= 10 if (!matchScreenConsistency(prof)) → score -= 5 if (profile.batteryLevel === 0) → score -= 3 if (profile.performancePrecision < 0.01) → score -= 5 return max(0, score) }"
    - generic [ref=f31e1159]:
      - generic [ref=f31e1160]: Раздел 7
      - heading "Pipeline создания профиля" [level=2] [ref=f31e1161]
      - generic [ref=f31e1162]:
        - generic [ref=f31e1163]:
          - generic [ref=f31e1164]: 1. Select Proxy
          - generic [ref=f31e1165]: Выбор IP из пула, резолв geo
        - generic [ref=f31e1166]: →
        - generic [ref=f31e1167]:
          - generic [ref=f31e1168]: 2. Gen Hardware
          - generic [ref=f31e1169]: CPU, RAM, GPU, Screen из базы
        - generic [ref=f31e1170]: →
        - generic [ref=f31e1171]:
          - generic [ref=f31e1172]: 3. Gen Browser
          - generic [ref=f31e1173]: UA, plugins, fonts, voices
        - generic [ref=f31e1174]: →
        - generic [ref=f31e1175]:
          - generic [ref=f31e1176]: 4. Validate
          - generic [ref=f31e1177]: Trust Score ≥ 85
        - generic [ref=f31e1178]: →
        - generic [ref=f31e1179]:
          - generic [ref=f31e1180]: 5. Warm Up
          - generic [ref=f31e1181]: Прогрев cookies/history
      - heading "Детализация шагов" [level=3] [ref=f31e1182]
      - generic [ref=f31e1183]:
        - heading "Шаг 1. Выбор прокси и привязка гео" [level=4] [ref=f31e1184]
        - generic [ref=f31e1185]: "selectProxy(requirements) { proxy = pool.getSticky(requirements.region, requirements.isp) geo = geoResolver.resolve(proxy.ip) return { ip: proxy.ip, port: proxy.port, protocol: \"socks5\", city: geo.city, // \"Москва\" region: geo.region, // \"Московская область\" timezone: geo.timezone, // \"Europe/Moscow\" offset: geo.offset, // -180 isp: geo.isp, // \"Rostelecom\" asn: geo.asn, // AS12389 language: geo.language, // \"ru-RU\" } }"
      - generic [ref=f31e1186]:
        - heading "Шаг 2. Генерация железа (из базы реальных снапшотов)" [level=4] [ref=f31e1187]
        - generic [ref=f31e1188]: "generateHardware(os) { // Выбор из базы реальных комбинаций snapshot = hardwareDB.sample(os) // os: \"Windows\" | \"Mac\" | \"Linux\" return { cpu: snapshot.cores, // 4, 8, 12, 16 memory: snapshot.ram, // 4, 8 (GB) gpu: { vendor: snapshot.gpuVendor, // \"Intel Inc.\" renderer: snapshot.gpuRenderer, // \"ANGLE (Intel, UHD 630, ...)\" extensions: snapshot.glExtensions, // 35 extensions precision: snapshot.glPrecision, // 12 types }, screen: { width: snapshot.screenW, // 1920 height: snapshot.screenH, // 1080 dpr: snapshot.dpr, // 1 colorDepth: 24, }, } }"
      - generic [ref=f31e1189]:
        - heading "Шаг 3. Генерация браузерного профиля" [level=4] [ref=f31e1190]
        - generic [ref=f31e1191]: "generateBrowserProfile(proxy, hardware, os) { chromeVersion = getCurrentStableVersion() - random(0, 2) return { userAgent: buildUA(os, chromeVersion), userAgentData: buildUAData(os, chromeVersion), platform: platformForOS(os), plugins: standardChromePlugins(), fonts: fontsForOS(os), // 20-80 шрифтов voices: voicesForOS(os), // 0-20 голосов mediaDevices: generateDevices(1, 3), // 1-3 устройства canvas: { seed: randomSeed() }, // для noise injection audio: { seed: randomSeed() }, webrtc: { mode: \"proxy_ip\", turnServer: \"turn.our.server\" }, timezone: proxy.timezone, language: proxy.language, languages: [proxy.language, \"en-US\", \"en\"], locale: proxy.language, permissions: generatePermissions(), // mix prompt/denied battery: { charging: true, level: 1 }, network: { effectiveType: \"4g\", downlink: random(5,10) }, colorScheme: random([\"light\", \"dark\"]), adblock: random() < 0.35, // 35% с адблоком } }"
      - generic [ref=f31e1192]:
        - heading "Шаг 5. Прогрев профиля" [level=4] [ref=f31e1193]
        - paragraph [ref=f31e1194]: "Новый профиль без истории и cookies — подозрителен. Перед использованием в целевых задачах:"
        - list [ref=f31e1195]:
          - listitem [ref=f31e1196]:
            - strong [ref=f31e1197]: "День 1-2:"
            - text: Общий сёрфинг — Яндекс главная, новости, погода, карты. 2-3 сессии по 5-10 минут
          - listitem [ref=f31e1198]:
            - strong [ref=f31e1199]: "День 3-4:"
            - text: Поиск не-целевых запросов (рецепты, кино, новости). Накопление cookies Яндекс.Метрики
          - listitem [ref=f31e1200]:
            - strong [ref=f31e1201]: "День 5+:"
            - text: Начало работы с целевыми запросами. Постепенное увеличение активности
          - listitem [ref=f31e1202]:
            - strong [ref=f31e1203]: "Cookie store:"
            - text: Яндекс ставит
            - code [ref=f31e1204]: yandexuid
            - text: ","
            - code [ref=f31e1205]: i
            - text: ","
            - code [ref=f31e1206]: yp
            - text: ","
            - code [ref=f31e1207]: ys
            - text: — все должны накопиться естественно
          - listitem [ref=f31e1208]:
            - strong [ref=f31e1209]: "Периодичность:"
            - text: не каждый день. 3-5 дней в неделю, разное время
    - generic [ref=f31e1210]:
      - generic [ref=f31e1211]: Раздел 7.1
      - heading "Классы профилей и аутентификация" [level=2] [ref=f31e1212]
      - paragraph [ref=f31e1214]:
        - strong [ref=f31e1215]: Не все профили одинаково полезны.
        - text: Авторизованный профиль в Яндексе весит в 3-10 раз больше анонимного для ранжирования. Система поддерживает три класса с разным уровнем доверия и ценой создания.
      - heading "Три класса профилей" [level=3] [ref=f31e1216]
      - table [ref=f31e1217]:
        - rowgroup [ref=f31e1218]:
          - row [ref=f31e1219]:
            - columnheader "Параметр" [ref=f31e1220]
            - columnheader "Anonymous" [ref=f31e1221]
            - columnheader "Lite (рекомендуемый)" [ref=f31e1222]
            - columnheader "Full Account" [ref=f31e1223]
        - rowgroup [ref=f31e1224]:
          - row [ref=f31e1225]:
            - cell "Идентификация" [ref=f31e1226]
            - cell "Только cookies (yandexuid)" [ref=f31e1227]
            - cell "Яндекс ID через внешнюю почту" [ref=f31e1228]
            - cell "Яндекс ID + @yandex.ru + телефон" [ref=f31e1229]
          - row [ref=f31e1230]:
            - cell "Вес сигнала" [ref=f31e1231]
            - cell "1×" [ref=f31e1232]
            - cell "3-5×" [ref=f31e1233]
            - cell "5-10×" [ref=f31e1234]
          - row [ref=f31e1235]:
            - cell "Требования" [ref=f31e1236]
            - cell "Ничего" [ref=f31e1237]
            - cell "Email (Gmail и т.д.)" [ref=f31e1238]
            - cell "Email + телефон + логин" [ref=f31e1239]
          - row [ref=f31e1240]:
            - cell "Яндекс Почта" [ref=f31e1241]
            - cell "—" [ref=f31e1242]
            - cell "—" [ref=f31e1243]
            - cell "Есть (@yandex.ru)" [ref=f31e1244]
          - row [ref=f31e1245]:
            - cell "Яндекс Диск" [ref=f31e1246]
            - cell "—" [ref=f31e1247]
            - cell "—" [ref=f31e1248]
            - cell "Есть" [ref=f31e1249]
          - row [ref=f31e1250]:
            - cell "Отзывы/Карты" [ref=f31e1251]
            - cell "—" [ref=f31e1252]
            - cell "Можно оставлять" [ref=f31e1253]
            - cell "Можно оставлять" [ref=f31e1254]
          - row [ref=f31e1255]:
            - 'cell "Поиск: история" [ref=f31e1256]'
            - cell "Только в cookies" [ref=f31e1257]
            - cell "Привязана к ID" [ref=f31e1258]
            - cell "Привязана к ID" [ref=f31e1259]
          - row [ref=f31e1260]:
            - cell "Верификация" [ref=f31e1261]
            - cell "—" [ref=f31e1262]
            - cell "—" [ref=f31e1263]
            - cell "Опционально (Mobile ID/ЕСИА)" [ref=f31e1264]
          - row [ref=f31e1265]:
            - cell "Профили Яндекс ID" [ref=f31e1266]
            - cell "—" [ref=f31e1267]
            - cell "Один профиль" [ref=f31e1268]
            - cell "Объединение до 10 по телефону" [ref=f31e1269]
          - row [ref=f31e1270]:
            - cell "Стоимость создания" [ref=f31e1271]
            - cell "Бесплатно" [ref=f31e1272]
            - cell "~$0 (нужен только email)" [ref=f31e1273]
            - cell "$0.05-0.30 (SMS-верификация)" [ref=f31e1274]
          - row [ref=f31e1275]:
            - cell "Сложность автоматизации" [ref=f31e1276]
            - cell "Тривиально" [ref=f31e1277]
            - cell "Низкая" [ref=f31e1278]
            - cell "Средняя (нужен SMS-сервис)" [ref=f31e1279]
          - row [ref=f31e1280]:
            - cell "Риск бана" [ref=f31e1281]
            - cell "Легко пережить" [ref=f31e1282]
            - cell "Терпимо" [ref=f31e1283]
            - cell "Дорого" [ref=f31e1284]
          - row [ref=f31e1285]:
            - cell "Доля в пуле" [ref=f31e1286]
            - cell "40-50%" [ref=f31e1287]
            - cell [ref=f31e1288]:
              - strong [ref=f31e1289]: 40-50%
            - cell "5-15%" [ref=f31e1290]
      - 'heading "Lite-аккаунт: путь регистрации" [level=3] [ref=f31e1291]'
      - generic [ref=f31e1292]:
        - heading "Официальный путь «С любой почтой»" [level=4] [ref=f31e1293]
        - paragraph [ref=f31e1294]: Яндекс поддерживает упрощённую регистрацию с внешней почтой. Это создаёт полноценный Яндекс ID, который распознаётся на поиске.
        - generic [ref=f31e1295]: "createLiteAccount(persona) { email = emailPool.get() // Gmail/Outlook/Proton // 1. Открыть любой сервис Яндекса navigate(\"https://yandex.ru\") click(\"Войти\") // 2. Ввести внешний email как логин fill(loginField, email) // user+profile42@gmail.com click(\"Войти\") // 3. Получить код подтверждения code = emailPool.fetchCode(email) // код из письма fill(codeField, code) // 4. Указать имя и фамилию персоны fill(firstNameField, persona.firstName) // \"Алексей\" fill(lastNameField, persona.lastName) // \"Петров\" click(\"Далее\") // 5. Создать пароль fill(passwordField, generatePassword()) click(\"Далее\") // 6. Принять соглашение click(\"Зарегистрироваться\") // Результат: активный Яндекс ID // Логин для входа: внешний email // Доступ: расширенные возможности сервисов // НЕТ: @yandex.ru, Диск }"
      - generic [ref=f31e1296]:
        - heading "Важные ограничения и особенности" [level=4] [ref=f31e1297]
        - list [ref=f31e1298]:
          - listitem [ref=f31e1299]:
            - strong [ref=f31e1300]: "Социальный вход отключён:"
            - text: с 1 декабря 2023 регистрация через VK/Google/OK/Twitter заблокирована. Только восстановление старых аккаунтов
          - listitem [ref=f31e1301]:
            - strong [ref=f31e1302]: "Объединение профилей:"
            - text: если к Lite-аккаунту привязать телефон — он объединится со всеми профилями на этом телефоне. Никогда не привязывать один телефон к нескольким профилям
          - listitem [ref=f31e1303]:
            - strong [ref=f31e1304]: "Домены бизнес-почты:"
            - text: домены, подключённые к «Почта для бизнеса», нельзя использовать для Lite-регистрации
          - listitem [ref=f31e1305]:
            - strong [ref=f31e1306]: "Gmail + aliases:"
            - text: Gmail поддерживает
            - code [ref=f31e1307]: user+tag@gmail.com
            - text: — каждый alias получает почту на основной ящик. Один Gmail = практически неограниченное количество Lite-аккаунтов
          - listitem [ref=f31e1308]:
            - strong [ref=f31e1309]: "Апгрейд до Full:"
            - text: Lite-аккаунт можно в любой момент обновить до полного (логин + телефон). Пароль сохраняется
      - heading "Рекомендуемый состав пула" [level=3] [ref=f31e1310]
      - generic [ref=f31e1311]:
        - heading "Для проекта на 50-100 профилей" [level=4] [ref=f31e1312]
        - list [ref=f31e1313]:
          - listitem [ref=f31e1314]:
            - strong [ref=f31e1315]: 20-25 Anonymous
            - text: — дешёвые, расходные. Для объёмных сессий, разбавки. Быстрая замена при бане
          - listitem [ref=f31e1316]:
            - strong [ref=f31e1317]: 20-25 Lite
            - text: — основная рабочая сила. Авторизованы в Яндексе, оставляют следы в системе, их сигнал весит 3-5× больше. Создание почти бесплатное
          - listitem [ref=f31e1318]:
            - strong [ref=f31e1319]: 5-10 Full
            - text: — «тяжёлая артиллерия». Полный аккаунт @yandex.ru. Для работы с Картами, отзывами, глубокой интеграции с экосистемой. Самый дорогой сигнал
    - generic [ref=f31e1320]:
      - generic [ref=f31e1321]: Раздел 8
      - heading "Мониторинг и адаптация" [level=2] [ref=f31e1322]
      - paragraph [ref=f31e1324]:
        - strong [ref=f31e1325]: "Яндекс обновляет скрипты постоянно:"
        - code [ref=f31e1326]: watch_serp.js
        - text: меняется десятки раз в день (500 версий за месяцы).
        - code [ref=f31e1327]: tmgrdfrend.fp.js
        - text: — реже, но каждое обновление может добавить новые проверки. Необходим постоянный мониторинг.
      - heading "Что мониторить" [level=3] [ref=f31e1328]
      - generic [ref=f31e1329]:
        - generic [ref=f31e1330]:
          - heading "Script Versions" [level=4] [ref=f31e1331]
          - list [ref=f31e1332]:
            - listitem [ref=f31e1333]:
              - text: Хеш
              - code [ref=f31e1334]: tmgrdfrend.fp.js
              - text: каждую минуту
            - listitem [ref=f31e1335]:
              - text: Хеш
              - code [ref=f31e1336]: watch_serp.js
              - text: каждую минуту
            - listitem [ref=f31e1337]: При изменении — автоматический diff
            - listitem [ref=f31e1338]: Алерт если появились новые API-вызовы
        - generic [ref=f31e1339]:
          - heading "Captcha Rate" [level=4] [ref=f31e1340]
          - list [ref=f31e1341]:
            - listitem [ref=f31e1342]: "% сессий, получивших SmartCaptcha"
            - listitem [ref=f31e1343]: "Порог: < 5% = норма, > 15% = проблема"
            - listitem [ref=f31e1344]: Привязка к конкретным профилям
            - listitem [ref=f31e1345]: Автоматическая ротация проблемных
        - generic [ref=f31e1346]:
          - heading "Profile Health" [level=4] [ref=f31e1347]
          - list [ref=f31e1348]:
            - listitem [ref=f31e1349]: Trust Score каждого профиля
            - listitem [ref=f31e1350]: Успешность сессий (% завершённых)
            - listitem [ref=f31e1351]: Роботность в Метрике (если доступна)
            - listitem [ref=f31e1352]: Ротация профилей с score < 70
        - generic [ref=f31e1353]:
          - heading "Browser Updates" [level=4] [ref=f31e1354]
          - list [ref=f31e1355]:
            - listitem [ref=f31e1356]: Новые версии Chrome Stable
            - listitem [ref=f31e1357]: Обновление UA-строк в базе
            - listitem [ref=f31e1358]: Новые API браузера
            - listitem [ref=f31e1359]: Изменения в поведении Chromium
    - generic [ref=f31e1360]:
      - generic [ref=f31e1361]: Раздел 9
      - heading "Рекомендуемый технический стек" [level=2] [ref=f31e1362]
      - table [ref=f31e1364]:
        - rowgroup [ref=f31e1365]:
          - row [ref=f31e1366]:
            - columnheader "Компонент" [ref=f31e1367]
            - columnheader "Технология" [ref=f31e1368]
            - columnheader "Обоснование" [ref=f31e1369]
        - rowgroup [ref=f31e1370]:
          - row [ref=f31e1371]:
            - cell "Browser Engine" [ref=f31e1372]
            - cell "Chromium (собственная сборка)" [ref=f31e1373]
            - cell "Полный контроль. Патчи на уровне C++ для Canvas, WebGL, Audio, Navigator, WebRTC" [ref=f31e1374]
          - row [ref=f31e1375]:
            - cell "Profile Storage" [ref=f31e1376]
            - cell "SQLite + encrypted blobs" [ref=f31e1377]
            - cell "Каждый профиль = отдельный файл. Cookies, localStorage, history, cache отдельно" [ref=f31e1378]
          - row [ref=f31e1379]:
            - cell "Profile Generator" [ref=f31e1380]
            - cell "Node.js / Python" [ref=f31e1381]
            - cell "Генерация JSON-конфигов из базы реальных снапшотов. Валидация консистентности" [ref=f31e1382]
          - row [ref=f31e1383]:
            - cell "Hardware DB" [ref=f31e1384]
            - cell "PostgreSQL" [ref=f31e1385]
            - 'cell "База реальных комбинаций: GPU + Screen + Fonts + Voices. Регулярное пополнение" [ref=f31e1386]'
          - row [ref=f31e1387]:
            - cell "Behavior Engine" [ref=f31e1388]
            - cell "TypeScript (в браузере)" [ref=f31e1389]
            - cell "Mouse curves, scroll patterns, typing simulation. Выполняется внутри Chromium" [ref=f31e1390]
          - row [ref=f31e1391]:
            - cell "Proxy Manager" [ref=f31e1392]
            - cell "Go / Rust" [ref=f31e1393]
            - cell "Высокая производительность для управления пулом. Health checks, rotation, sticky sessions" [ref=f31e1394]
          - row [ref=f31e1395]:
            - cell "Script Monitor" [ref=f31e1396]
            - cell "Node.js + cron" [ref=f31e1397]
            - cell "Мониторинг изменений tmgrdfrend.fp.js и watch_serp.js. Diff + алерты" [ref=f31e1398]
          - row [ref=f31e1399]:
            - cell "Orchestrator" [ref=f31e1400]
            - cell "Python / Node.js" [ref=f31e1401]
            - cell "Управление множеством профилей. Расписание сессий, балансировка нагрузки" [ref=f31e1402]
          - row [ref=f31e1403]:
            - cell "API" [ref=f31e1404]
            - cell "REST + WebSocket" [ref=f31e1405]
            - cell "Управление профилями, статус сессий, мониторинг в реальном времени" [ref=f31e1406]
      - heading "Структура проекта" [level=3] [ref=f31e1407]
      - generic [ref=f31e1408]: "yanprofile/ ├── chromium-patches/ # Патчи для Chromium │ ├── navigator/ # webdriver, UA, platform, plugins │ ├── canvas/ # noise injection в Skia │ ├── webgl/ # vendor, renderer, extensions │ ├── audio/ # AudioContext fingerprint │ ├── webrtc/ # IP leak prevention │ └── misc/ # performance.now, battery, etc. ├── profile-generator/ # Генератор профилей │ ├── hardware-db/ # База реальных устройств │ ├── generators/ # Генераторы для каждой группы параметров │ ├── validators/ # Проверки консистентности │ └── templates/ # Шаблоны OS-специфичных профилей ├── behavior-engine/ # Поведенческий движок │ ├── mouse/ # Движение мыши (Безье + шум) │ ├── scroll/ # Паттерны скролла │ ├── typing/ # Набор текста с ошибками │ ├── scenarios/ # Готовые сценарии (SERP, сайт, etc.) │ └── timing/ # Распределение времени и пауз ├── proxy-manager/ # Управление прокси │ ├── pool/ # Пул прокси с health checks │ ├── geo-resolver/ # IP → город → timezone → language │ ├── webrtc-turn/ # TURN-сервер для WebRTC │ └── rotation/ # Политики ротации ├── script-monitor/ # Мониторинг скриптов Яндекса │ ├── watchers/ # tmgrdfrend.fp.js, watch_serp.js │ ├── diff-engine/ # Сравнение версий │ └── alerts/ # Уведомления об изменениях ├── orchestrator/ # Оркестратор сессий │ ├── scheduler/ # Расписание запусков │ ├── warmup/ # Прогрев профилей │ └── monitor/ # Мониторинг здоровья └── api/ # REST API ├── profiles/ # CRUD профилей ├── sessions/ # Управление сессиями └── dashboard/ # UI для мониторинга"
    - generic [ref=f31e1409]:
      - generic [ref=f31e1410]: Следующие шаги
      - heading "Roadmap реализации" [level=2] [ref=f31e1411]
      - table [ref=f31e1413]:
        - rowgroup [ref=f31e1414]:
          - row [ref=f31e1415]:
            - columnheader "Фаза" [ref=f31e1416]
            - columnheader "Задачи" [ref=f31e1417]
            - columnheader "Результат" [ref=f31e1418]
        - rowgroup [ref=f31e1419]:
          - row [ref=f31e1420]:
            - cell "Phase 1" [ref=f31e1421]
            - cell [ref=f31e1423]:
              - list [ref=f31e1424]:
                - listitem [ref=f31e1425]: Сборка патченного Chromium (webdriver, UA, canvas noise)
                - listitem [ref=f31e1426]: Генератор профилей с базовой валидацией
                - listitem [ref=f31e1427]: Интеграция с прокси (SOCKS5)
            - 'cell "MVP: 1 профиль проходит проверку pager-syzran.ru с Trust Score ≥ 80" [ref=f31e1428]'
          - row [ref=f31e1429]:
            - cell "Phase 2" [ref=f31e1430]
            - cell [ref=f31e1432]:
              - list [ref=f31e1433]:
                - listitem [ref=f31e1434]: WebGL/Audio fingerprint подмена
                - listitem [ref=f31e1435]: Font detection spoof
                - listitem [ref=f31e1436]: WebRTC IP sync через TURN
                - listitem [ref=f31e1437]: Hardware DB (100+ реальных снапшотов)
            - cell "Trust Score ≥ 90. Прохождение SmartCaptcha < 5%" [ref=f31e1438]
          - row [ref=f31e1439]:
            - cell "Phase 3" [ref=f31e1440]
            - cell [ref=f31e1442]:
              - list [ref=f31e1443]:
                - listitem [ref=f31e1444]: Behavior engine (мышь, скролл, набор)
                - listitem [ref=f31e1445]: Сценарии SERP-навигации
                - listitem [ref=f31e1446]: Система прогрева профилей
            - 'cell "Полный цикл: генерация → прогрев → работа" [ref=f31e1447]'
          - row [ref=f31e1448]:
            - cell "Phase 4" [ref=f31e1449]
            - cell [ref=f31e1451]:
              - list [ref=f31e1452]:
                - listitem [ref=f31e1453]: Мониторинг скриптов Яндекса
                - listitem [ref=f31e1454]: Оркестратор множества профилей
                - listitem [ref=f31e1455]: API и dashboard
                - listitem [ref=f31e1456]: Автоматическая адаптация к изменениям
            - cell "Продакшен-система с автообновлением" [ref=f31e1457]
    - generic [ref=f31e1458]: "YanProfile Spec v0.1 · На основе анализа tmgrdfrend.fp.js (md5: 081460f6), watch_serp.js (md5: 91bdb8de), pager-syzran.ru, sosiska.top, Network, Monstro · 2026-08-17"