Релиз целиком: вход по ссылке, агрегат студий/типов/18+, малая int8-модель

- src/fetch.py: загрузка по URL (allowlist трекеров, защита от SSRF, cp1251)
- src/release.py: агрегат релиза, студии из заголовка раздачи (ПМ (LostFilm))
- predict --url, POST /predict {"url"}; ответ расширен, tracks сохранён
- export_onnx --quantize: tiny2 int8 29 МБ, parity 99.2-100%
- тесты (52 ok), docs/plan.md, docs; target/ убран из git

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
DenozordecandClaude Sonnet 5.5 committed 2026-10-27 17:02:04 +07:00
1 parent 98e4031037
commit 8cbd800ec7
2473 files changed
+424 -6060

No files matched your search

+3
View File
@@ -18,3 +18,6 @@ reports/*.png
# служебное ZCode
.zcode/
# rust build
target/
+23
View File
@@ -20,6 +20,29 @@ python -m src.predict --file page.txt --out result.json --model models/base
HTML распознаётся по содержимому, так что `--html` и `--file`
взаимозаменяемы.
## Ссылка на раздачу и агрегат релиза
```bash
python -m src.predict --url https://rutracker.org/forum/viewtopic.php?t=123
python -m src.predict --url https://kinozal.tv/details.php?id=1 --cookie "uid=..; pass=.."
```
Поддерживаются только rutracker / kinozal / nnm-club (allowlist доменов,
редиректы за его пределы запрещены). Для `--html`, `--file` и `--url` ответ —
агрегат релиза: к `tracks` добавлены
| Поле | Описание |
|---|---|
| `studios` | уникальные `{studio, translation_type, is_18plus}` |
| `translation_types` | отсортированный список типов релиза |
| `is_18plus` | `true`, если 18+ хотя бы у одной дорожки |
| `title` | заголовок раздачи (если найден в HTML) |
| `tracker` | только для `--url` |
Дорожки дедуплицируются по (тип, студия). Студии из заголовка раздачи вида
`ПМ (LostFilm)`, которых нет в описании, добавляются с `source: "title"`
(у остальных `source: "page"`). `--text` по-прежнему возвращает только `tracks`.
## Python API
```python
+24 -1
View File
@@ -24,7 +24,9 @@ python -m src.service --model models/best --port 8000
API:
* `GET /health` → `{"status": "ok", "model": "...", "device": "...", "classes": [...]}`
* `POST /predict` — ровно одно из полей:
* `POST /predict` — ровно одно из полей (`url` принимает опциональный `cookie`;
ответ для `html`/`url` — агрегат релиза, см. docs/inference.md):
* `{"url": "https://rutracker.org/forum/viewtopic.php?t=…"}` → страница загружается сервисом;
* `{"text": "Перевод: Дублированный | MovieDalen"}` → одна дорожка;
* `{"html": "<html>…вся страница…"}` → все дорожки релиза.
@@ -105,6 +107,22 @@ $b = [Text.Encoding]::UTF8.GetBytes((@{ text = "Перевод: Дублиров
Ответ сервис отдаёт с `charset=utf-8`, поэтому кириллица в ответе
корректно декодируется и в PS 5.1.
### grabber (PHP)
kinozal требует авторизации, поэтому grabber скачивает страницу сам
(`KinozalClient`) и отправляет сервису готовый HTML:
```php
$ch = curl_init('http://dub-ai:8000/predict');
curl_setopt_array($ch, [
CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode(['html' => $html], JSON_UNESCAPED_UNICODE),
]);
$release = json_decode(curl_exec($ch), true);
// $release['studios'], $release['translation_types'], $release['is_18plus']
```
## Путь Б: ONNX без Python
Экспорт (из корня проекта, после обучения):
@@ -113,6 +131,11 @@ $b = [Text.Encoding]::UTF8.GetBytes((@{ text = "Перевод: Дублиров
python -m src.export_onnx # -> models/best-onnx/ + reports/onnx_parity.md
```
Для встраивания — малая модель: `python -m src.export_onnx --model models/tiny2
--quantize` кладёт в `models/tiny2-onnx/` ещё и `model.int8.onnx` (29 МБ вместо
~440 МБ у base; parity с PyTorch: тип 99.8%, спан 99.2%, 18+ 100% —
`reports/onnx_parity_tiny2_int8.md`).
Состав `models/best-onnx/`: `model.onnx` (входы `input_ids`,
`attention_mask`, `token_type_ids` int64 [B, seq]; выходы `type_logits`
[B, 14], `bio_logits` [B, seq, 3], `age_logits` [B, 2]), `tokenizer.json`
+78
View File
@@ -0,0 +1,78 @@
# План доработки: модель озвучки для grabber
## Цель
По ссылке на раздачу (rutracker / kinozal / nnm-club) или её HTML определить
**на уровне релиза**: какие дорожки озвучки есть, кто их сделал (студия /
переводчик), какого они типа (дубляж, многоголосый, …) и есть ли 18+.
Модель должна быть маленькой и встраиваемой в grabber.
## Что уже есть (анализ)
* Multi-task RuBERT (тип 14 классов + BIO-спан автора + 18+), 3742 строки,
joint exact 0.946 (base) / 0.915 (tiny2); ONNX-экспорт с parity 100%;
FastAPI-сервис; клиенты Rust/TS/PowerShell; тесты и документация.
* grabber (`C:\Users\shats\Dev\grabber`) — **PHP 8.1 + Docker**, интеграции
Radarr/Sonarr/qBittorrent/Prowlarr; студии с kinozal разбирает регулярками
(`KinozalReleaseParser.php`, `ProwlarrReleaseEnricher.php`), идёт Rust-порт.
Естественный путь интеграции — **HTTP-сервис** (PHP ходит curl-ом), ONNX
нужен для Rust-порта.
## Пробелы относительно задачи
| # | Пробел | Решение |
|---|---|---|
| 1 | Нет входа «по ссылке» (только `text`/`html`) | `url` в CLI, сервисе, API: fetch (таймаут, UA, cp1251), определение трекера по домену |
| 2 | Ответ — плоский список дорожек | Агрегат релиза: дедуп дорожек, уникальные студии с типами, `is_18plus` релиза; поле `tracks` не ломаем |
| 3 | Заголовок раздачи (`/ ПМ (LostFilm) /`) не используется | fallback-парсинг title, если дорожек 0 или студии нет в дорожках |
| 4 | kinozal: авторы грузятся JS | при работе по URL запросить вкладку озвучки напрямую (эндпоинт — из `data/samples/kinozal*.html`, не угадывать) |
| 5 | «Маленькая» модель: best = base (~440 МБ) | tiny2 (30M) + ONNX + int8-квантизация; решение по цифрам parity/размера |
| 6 | Precision 0.83 на rutracker | разобрать ложные срабатывания e2e — скорее всего регулярки сегментации |
| 7 | В git закоммичен `examples/rust/*/target/` | `.gitignore` + удалить из индекса |
## Порядок работ
1. **Baseline**: tests + e2e на текущих моделях (цифры в конец документа).
2. **URL + агрегат релиза** (`src/fetch.py`, `src/release.py`, эндпоинт
`POST /predict` с `url`, CLI `--url`).
3. **Title-fallback** в `html_extract.py`.
4. **kinozal-вкладка** (если эндпоинт найден в сэмплах).
5. **Разбор false-positives** сегментации.
6. **tiny2 + int8 ONNX**, замер размера/parity.
7. **Тесты** на каждый пункт, обновление docs/README.
8. `.gitignore` + чистка `target/`.
## Критерии готовности
* `python -m src.predict --url <ссылка>` печатает агрегат релиза;
* e2e precision/recall не хуже baseline;
* малая модель < ~40 МБ (int8), parity ≥ 99%;
* тесты зелёные, docs обновлены.
## Baseline
Модель `models/best` (ruBert-base), `tests/e2e_check.py`:
* rutracker: precision 0.826 / recall 0.984 (n=290);
* kinozal: 0.107 / 0.107 (n=28) — в текстовых дампах нет авторов (JS), потолок данных;
* smoke вне датасета: тип 9/10, автор 5/10, 18+ 10/10;
* `tests/run_tests.py`: 34 ok.
## Статус
| Шаг | Состояние |
|---|---|
| 1 baseline | сделано |
| 2 URL + агрегат релиза | сделано: `src/fetch.py`, `src/release.py`, `--url`, `POST /predict {"url"}` |
| 3 title-fallback | сделано (`ПМ (LostFilm)` → дорожка с `source: "title"`); работает для HTML, у текстовых дампов заголовка нет |
| 4 kinozal-вкладка | **не сделано** в сервисе: страница релиза требует авторизации, а `get_srv_details.php?id=…&pagesd=N` уже вызывает `KinozalClient.php` в grabber. Рекомендация: grabber скачивает вкладку сам и шлёт `{"html": …}` |
| 5 false-positives сегментации | **не сделано** (precision rutracker 0.826 — отдельный разбор) |
| 6 tiny2 + int8 | сделано: 29.3 МБ, parity 99.8% тип / 99.2% спан / 100% 18+ (`reports/onnx_parity_tiny2_int8.md`) |
| 7 тесты | `run_tests.py`: 52 ok (URL allowlist/SSRF, декодирование, title, агрегат) |
| 8 `target/` | сделано |
## Открытые вопросы
* Подтвердить, что grabber (PHP) интегрируется по HTTP (рекомендуется), а
Rust-порт — через ONNX int8 (`models/tiny2-onnx/model.int8.onnx`).
* Качество tiny2 против base по e2e на страницах не мерили — только parity.
@@ -1 +0,0 @@
{"rustc_fingerprint":7970462395228975776,"outputs":{"5414958869613609987":{"success":true,"status":"","code":0,"stdout":"rustc 1.99.1 (58cf8f9c3 2026-10-13)\nbinary: rustc\ncommit-hash: 58cf8f9c35b355199727627d07ae34a4e2846d67\ncommit-date: 2026-10-13\nhost: x86_64-pc-windows-msvc\nrelease: 1.99.1\nLLVM version: 23.1.1\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___.exe\nlib___.rlib\n___.dll\n___.dll\n___.lib\n___.dll\nC:\\Users\\shats\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\npacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"msvc\"\ntarget_family=\"windows\"\ntarget_feature=\"cmpxchg16b\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"128\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"windows\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"pc\"\nwindows\n","stderr":""}},"successes":{}}
@@ -1,3 +0,0 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[\"portable-atomic\"]","target":14411119108718288063,"profile":11926785003450549200,"path":15437344850296186914,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\atomic-waker-7b3560d00d4ed6f2\\dep-lib-atomic_waker","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
655868317cf46c27
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\", \"simd-unsafe\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"simd-unsafe\", \"std\"]","target":2839635746193839168,"profile":11926785003450549200,"path":9020867275284855952,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\base64-0c1493c90532fa22\\dep-lib-base64","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
4d921b0c722dd0df
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":13060062996227388079,"profile":11926785003450549200,"path":5400602453988895566,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\base64-1f9f5300156d97b2\\dep-lib-base64","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":11926785003450549200,"path":16114404642494873844,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\bitflags-a43b09208d5f229d\\dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
b08fe31fa5e5afb1
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"extra-platforms\", \"serde\", \"std\"]","target":11402411492164584411,"profile":13803630499540410774,"path":269383349828324711,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\bytes-0093e1a3fc7eeafd\\dep-lib-bytes","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
6fa7e93772b7ff9c
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":11926785003450549200,"path":10143533043765886058,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\cfg-if-16ed30e64ce9445d\\dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"default\"]","declared_features":"[\"assume_has_cpuid\", \"default\", \"unstable_has_cpuid\"]","target":17972183751247369142,"profile":11926785003450549200,"path":12324910305890283330,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\core_detect-d0630f0e7ba1bbdf\\dep-lib-core_detect","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[\"default\", \"std\"]","target":12413876779241186693,"profile":11528375766455597691,"path":15071275717405914738,"deps":[[8711674966389384079,"syn",false,16998617828401175482],[8949245912927223590,"quote",false,2284452398892263811],[16346726298725429545,"proc_macro2",false,2605834041257247042]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\displaydoc-e066844dda3689c5\\dep-lib-displaydoc","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[]","target":17199653020811307546,"profile":7333259681545804295,"path":4942398508502643691,"deps":[[6557439603276904804,"serde",false,3369963491482195019],[8160210889872729633,"serde_json",false,1576611365769530959],[17325453097244291330,"reqwest",false,579781000494991354],[17866805608252134857,"tokio",false,3363011720640985393]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\dub-ai-client-871214fa50c66b2e\\dep-bin-dub-ai-client","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1,2 +0,0 @@
{"$message_type":"diagnostic","message":"fields `studio_confidence` and `age_confidence` are never read","code":{"code":"dead_code","explanation":null},"level":"warning","spans":[{"file_name":"src\\main.rs","byte_start":344,"byte_end":349,"line_start":11,"line_end":11,"column_start":8,"column_end":13,"is_primary":false,"text":[{"text":"struct Track {","highlight_start":8,"highlight_end":13}],"label":"fields in this struct","suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src\\main.rs","byte_start":590,"byte_end":607,"line_start":21,"line_end":21,"column_start":5,"column_end":22,"is_primary":true,"text":[{"text":" studio_confidence: Option<f32>,","highlight_start":5,"highlight_end":22}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null},{"file_name":"src\\main.rs","byte_start":691,"byte_end":705,"line_start":25,"line_end":25,"column_start":5,"column_end":19,"is_primary":true,"text":[{"text":" age_confidence: Option<f32>,","highlight_start":5,"highlight_end":19}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"`Track` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis","code":null,"level":"note","spans":[],"children":[],"rendered":null},{"message":"`#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default","code":null,"level":"note","spans":[],"children":[],"rendered":null}],"rendered":"\u001b[1m\u001b[93mwarning\u001b[0m\u001b[1m\u001b[97m: fields `studio_confidence` and `age_confidence` are never read\u001b[0m\n \u001b[1m\u001b[96m--> \u001b[0msrc\\main.rs:21:5\n \u001b[1m\u001b[96m|\u001b[0m\n\u001b[1m\u001b[96m11\u001b[0m \u001b[1m\u001b[96m|\u001b[0m struct Track {\n \u001b[1m\u001b[96m|\u001b[0m \u001b[1m\u001b[96m-----\u001b[0m \u001b[1m\u001b[96mfields in this struct\u001b[0m\n\u001b[1m\u001b[96m...\u001b[0m\n\u001b[1m\u001b[96m21\u001b[0m \u001b[1m\u001b[96m|\u001b[0m studio_confidence: Option<f32>,\n \u001b[1m\u001b[96m|\u001b[0m \u001b[1m\u001b[93m^^^^^^^^^^^^^^^^^\u001b[0m\n\u001b[1m\u001b[96m...\u001b[0m\n\u001b[1m\u001b[96m25\u001b[0m \u001b[1m\u001b[96m|\u001b[0m age_confidence: Option<f32>,\n \u001b[1m\u001b[96m|\u001b[0m \u001b[1m\u001b[93m^^^^^^^^^^^^^^\u001b[0m\n \u001b[1m\u001b[96m|\u001b[0m\n \u001b[1m\u001b[96m= \u001b[0m\u001b[1m\u001b[97mnote\u001b[0m: `Track` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis\n \u001b[1m\u001b[96m= \u001b[0m\u001b[1m\u001b[97mnote\u001b[0m: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default\n\n"}
{"$message_type":"diagnostic","message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"\u001b[1m\u001b[93mwarning\u001b[0m\u001b[1m\u001b[97m: 1 warning emitted\u001b[0m\n\n"}
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\"]","declared_features":"[\"alloc\", \"any_all_workaround\", \"default\", \"fast-big5-hanzi-encode\", \"fast-gb-hanzi-encode\", \"fast-hangul-encode\", \"fast-hanja-encode\", \"fast-kanji-encode\", \"fast-legacy-encode\", \"less-slow-big5-hanzi-encode\", \"less-slow-gb-hanzi-encode\", \"less-slow-kanji-encode\", \"rustversion\", \"serde\", \"simd-accel\", \"std\"]","target":2835126046236718539,"profile":15841811363426343083,"path":17955236711579281284,"deps":[[16991438365634268121,"rustversion",false,15780388177985828633]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\encoding_rs-0fbaa38980ae242a\\dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[9744478607420497417,"build_script_build",false,7961988810917634854]],"local":[{"Precalculated":"0.8.42"}],"rustflags":[],"config":0,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\"]","declared_features":"[\"alloc\", \"any_all_workaround\", \"default\", \"fast-big5-hanzi-encode\", \"fast-gb-hanzi-encode\", \"fast-hangul-encode\", \"fast-hanja-encode\", \"fast-kanji-encode\", \"fast-legacy-encode\", \"less-slow-big5-hanzi-encode\", \"less-slow-gb-hanzi-encode\", \"less-slow-kanji-encode\", \"rustversion\", \"serde\", \"simd-accel\", \"std\"]","target":4358056773361645002,"profile":9487358224401111788,"path":6598145419974035352,"deps":[[1680466948137670546,"core_detect",false,17528874072145724690],[8067010153367330186,"simdutf8",false,6242062317375175351],[9744478607420497417,"build_script_build",false,7784613851424663655],[9761119895162726673,"multiversion_no_op",false,3770696745714437812],[15358414700195712381,"scopeguard",false,13228339415109281],[15482175856213997617,"cfg_if",false,11312962490170189679]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\encoding_rs-83db48d3c8f55138\\dep-lib-encoding_rs","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[]","target":1524667692659508025,"profile":11926785003450549200,"path":14519975565327695204,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\equivalent-819e878cc4e3056c\\dep-lib-equivalent","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
745980067f280d03
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":10248144769085601448,"profile":11926785003450549200,"path":10592821397316436443,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\fnv-5ffe144f4827c15c\\dep-lib-fnv","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":6496257856677244489,"profile":11926785003450549200,"path":15671257368099774279,"deps":[[6803352382179706244,"percent_encoding",false,15644218495632574111]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\form_urlencoded-49613a97fc194bab\\dep-lib-form_urlencoded","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"cfg-target-has-atomic\", \"default\", \"futures-sink\", \"sink\", \"std\", \"unstable\"]","target":13634065851578929263,"profile":4519785431182092625,"path":14327443759679533177,"deps":[[704993722384941283,"futures_core",false,16532318803028127307]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\futures-channel-51f8c22bb0e6bc1f\\dep-lib-futures_channel","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"cfg-target-has-atomic\", \"default\", \"portable-atomic\", \"std\", \"unstable\"]","target":9453135960607436725,"profile":4519785431182092625,"path":12945321947294131093,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\futures-core-2af69a2985631efe\\dep-lib-futures_core","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"std\"]","target":10827111567014737887,"profile":4519785431182092625,"path":14660796853505974264,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\futures-sink-fbd6312df15d92be\\dep-lib-futures_sink","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\"]","declared_features":"[\"alloc\", \"cfg-target-has-atomic\", \"default\", \"std\", \"unstable\"]","target":13518091470260541623,"profile":4519785431182092625,"path":13940394440841783915,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\futures-task-47eb5eb1ae7fa67f\\dep-lib-futures_task","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"alloc\", \"slab\"]","declared_features":"[\"alloc\", \"async-await\", \"async-await-macro\", \"bilock\", \"cfg-target-has-atomic\", \"channel\", \"compat\", \"default\", \"futures-channel\", \"futures-io\", \"futures-macro\", \"futures-sink\", \"futures_01\", \"io\", \"io-compat\", \"libc\", \"memchr\", \"portable-atomic\", \"portable-atomic-alloc\", \"portable-atomic-util\", \"portable_atomic_crate\", \"sink\", \"slab\", \"spin\", \"std\", \"tokio-io\", \"unstable\", \"write-all-vectored\"]","target":1788798584831431502,"profile":4519785431182092625,"path":11773549162727411751,"deps":[[704993722384941283,"futures_core",false,16532318803028127307],[2251399859588827949,"pin_project_lite",false,17410757276303177492],[13380492747606082248,"futures_task",false,13679572169377987714],[14895711841936801505,"slab",false,13372054274224375361]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\futures-util-ae06c6e2cc5fb86b\\dep-lib-futures_util","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
d820d9eaf0e24243
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[\"stream\", \"unstable\"]","target":15216351499943135959,"profile":9487358224401111788,"path":7567799093550827964,"deps":[[704993722384941283,"futures_core",false,16532318803028127307],[1074848931188612602,"atomic_waker",false,9615989359851228348],[1345404220202658316,"fnv",false,219876482846054772],[8468608609134601547,"tokio_util",false,6574430374328150199],[11926622812581095017,"bytes",false,12803704763004981168],[12328341851100645683,"http",false,11919713297229388579],[14757622794040968908,"tracing",false,12322811840451766055],[14895711841936801505,"slab",false,13372054274224375361],[17160231598511002166,"futures_sink",false,10931016100611574855],[17847581527163928910,"indexmap",false,16653544059122852426],[17866805608252134857,"tokio",false,3363011720640985393]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\h2-832b9abbadac88b6\\dep-lib-h2","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[]","declared_features":"[\"alloc\", \"allocator-api2\", \"core\", \"default\", \"default-hasher\", \"equivalent\", \"inline-more\", \"nightly\", \"raw-entry\", \"rayon\", \"rustc-dep-of-std\", \"rustc-internal-api\", \"serde\"]","target":7848994504142944354,"profile":176757869063742370,"path":15219562153987653055,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\hashbrown-f6ad043362481a48\\dep-lib-hashbrown","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -1 +0,0 @@
This file has an mtime of when this was started.
@@ -1 +0,0 @@
239bdb2917546ba5
@@ -1 +0,0 @@
{"rustc":222933465615791797,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":4766512060560342653,"profile":11926785003450549200,"path":716854220130639180,"deps":[[5532778797167691009,"itoa",false,2234445186326701640],[11926622812581095017,"bytes",false,12803704763004981168]],"local":[{"CheckDepInfo":{"dep_info":"debug\\.fingerprint\\http-7cdf48ccde47db85\\dep-lib-http","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
Loaded 100 of 2473 files, more files were not shown because too many files have changed in this diff. Show more