release(1.0): README + CHANGELOG + DATA-LICENSE (CC-BY-4.0)

- README.md: aktuelle Inhalte (16 BL + BT, alle Features), Doppel-Lizenz, Schnellstart, Statistiken
- CHANGELOG.md: vollstaendige 1.0-Notes mit Hinzugefuegt/Geaendert/Bekannte-Einschraenkungen/Sicherheit
- DATA-LICENSE: Creative-Commons-Attribution-4.0-International fuer Bewertungs-Daten/Reports
- LICENSE (MIT) bleibt unveraendert fuer den Quellcode

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dotty Dotter 2026-04-25 20:59:28 +02:00
parent b4fe3488e0
commit 20b33c7560
3 changed files with 273 additions and 117 deletions

100
CHANGELOG.md Normal file
View File

@ -0,0 +1,100 @@
# Changelog
Alle markanten Änderungen pro Release. Format an [Keep a Changelog](https://keepachangelog.com/de/1.1.0/) angelehnt, semantisches Versioning.
## [1.0.0] — 2026-04-21
Erstes konsolidiertes Release nach längerer 0.x-Entwicklungsphase. Live unter
<https://gwoe.toppyr.de/>.
### Hinzugefügt — Frontend (v2)
- **Komplettes Redesign** auf das ECOnGOOD Corporate Design (Manual Juni 2024) — Tokens-Datei, Avenir/Nunito-Sans-Stack, Phosphor-Icon-Set, Dark-Mode mit `data-theme`-Attribut (#114, #139)
- **AppShell** mit zwei-Spalten-Layout (Sidebar 230 px, Main), Drawer auf Mobile, Navigation in vier Gruppen LESEN/PRÜFEN/DATEN/ADMINISTRATION
- **Server-Side-Routing** für Antragsdetail (`/antrag/{drucksache}`), keine reine Client-Seite mehr
- **Login-Modal** in der Topbar mit Tabs Anmelden/Registrieren via Direct-Access-Grant — kein Keycloak-Redirect mehr (#129)
- **Keyboard-Shortcuts** j/k/Enter/Esc/?/⏎ im Listenmodus mit Help-Modal
- **Sort-Dropdown** mit acht Optionen (Score/Datum/Drs.-Nr./Titel je asc/desc), localStorage-persistiert
- **Antragsdetail vollständig** mit ScoreHero, Matrix-Mini 5×5 (klickbar mit Erklärungs-Modal), Programm-Treue-Tabelle pro Fraktion (auch ohne Zitate), §INS§/§DEL§-Redline-Parser, Versionshistorie, namentlichem Abstimmungsverhalten als Balken pro Fraktion (#106 Phase 1)
- **Bookmarks/Voting/Kommentare/Share/Re-Analyze** alle in v2-Detail integriert mit Auth-Modal-Fallback
- **Live-Landtag-Suche** als eigener Screen `/v2/landtag-suche`
- **Admin-Panel** mit drei Screens (Freischaltungen, Queue mit 5 s Auto-Refresh, Abos für alle User)
- **Open-Graph-Bilder** pro Antrag (1200×630 PNG, Playwright-gerendert, SHA-Cache) (#141)
### Hinzugefügt — Backend
- **16 Landesparlamente + Bundestag** als Adapter (BUND, NRW, BE, HH, BW, RP, LSA, MV, HB, HE, BY, SL, TH, BB, SN, SH; NI deferred wegen Login)
- **abgeordnetenwatch.de-Integration** Phase 1 für strukturierte Roll-Call-Votes — 28 977 BT-Votes in DB, Drucksachen-Match via 9 BL-spezifische URL-Patterns + Datum/Titel-Fallback (#106)
- **Drucksachen-Typen-Normalisierung** filtert Anträge/Gesetzentwürfe von Kleinen Anfragen etc. (#127)
- **Embeddings v3 → v4** Modell-Migration mit WRITE/READ-Pattern (ADR 0006)
- **DDD-Lightweight-Migration** Tag 1-4: `LlmBewerter`-Port, `QwenBewerter`-Adapter, drei Repositories (Antrag/Bewertung/Abonnement), Domain-Verhalten auf Pydantic-Modellen (ADR 0008, #136)
- **Mail-Digest** mit täglichem Cron 07:00, BL/Partei-Filter pro User-Abo (#124)
- **Monitoring-Scan** aller Adapter mit Kosten-Schätzung — Beobachtung ohne Auto-Fetch, Mail-Report mit „0-Kontext"-Hinweis (#135)
- **Merkliste server-seitig** mit Migration aus localStorage (#140)
- **Wahlprogramm-Auto-Download** halbautomatisch mit SHA-Gate, kuratierte URL-Liste, Admin-UI (#138)
- **Fehlende Wahlprogramme** automatisch im Assessment markiert + UI-Hinweis (#128)
- **Clustering** via Embedding-Nähe-Graph mit Bubble-Chart (#105)
- **Background-Queue** mit drei parallelen Workern, Graceful Shutdown 15 min, Job-Persistenz (#99)
- **Voting + Kommentare** mit Visibility-Modi (öffentlich/angemeldet/nur ich) (#94)
- **RSS/Atom-Feed** für neue Bewertungen (#125)
### Hinzugefügt — Tests & Doku
- **574 Tests, 13 skipped** — Unit-Suite < 2 s, plus Integration/E2E unter Markern
- **Bug-Regression-Tests** für fünf historische Fixes (PRAGMA-Cursor, JWT-azp, CDU-PDF, PFLICHT-FRAKTIONEN, NRW-Titel)
- **Live-Adapter-Tests** + Frontend-Cross-Validation + Citation-Substring-Tests (`pytest -m integration`)
- **Playwright-E2E-Tests** (`pytest -m e2e`)
- **Smoke-Test-Script** `scripts/smoke-test.sh` für Gesamt-Funktionsprüfung gegen Live-System
- **8 ADRs** dokumentiert, plus DDD-Bewertung (1 237 LOC) und Protokoll-Parser-v6-Machbarkeit (418 LOC)
- **Zugriffsrechte-Doc** mit 63 Routes × User-Status-Matrix
- **Doppel-Lizenz** Code MIT + Daten/Bewertungen CC-BY-4.0
### Geändert
- `/` zeigt jetzt v2-Frontend, classic unter `/classic` weiterhin erreichbar
- Auswertungen mit BL-Filter (#137 fix)
- Direkt-Verlinkbarkeit (`/antrag/{drs}`) als Permalinks ersetzen Query-Parameter (#132)
- Social-Media-Texte werden vom LLM erzeugt und in DB gespeichert (#133)
- v5-Prompt mit PFLICHT-FRAKTIONEN aller LT-Fraktionen, nicht nur Antragsteller+Regierung
- Citation-Binding server-seitig: Quellen-Label der Zitate werden gegen die tatsächlich abgerufenen Chunks rekonstruiert (ADR 0001)
- Mail-Digest-Template mit „0-Kontext"-Hinweis falls keine neuen Drucksachen seit letztem Scan
- Login als HttpOnly-Cookie + separate `rt`-Cookie für Refresh-Token (`/api/auth/logout`-Route für sauberen Cookie-Reset)
### Bekannte Einschränkungen
- **NI (Niedersachsen)** im Monitoring-Scan geskippt — NILAS-Portal ist Login-protected, HAR-Capture nötig (#22)
- **Saarland-Adapter** swallowt manche httpx-Exceptions tiefer im Code als der erste Fix-Layer (#142)
- **Drucksachen-Match in MV/BY/BB/TH/HH/SL** für abgeordnetenwatch-Polls noch lückenhaft — deren `field_intro`-HTML enthält keine PDF-Links, der Datum+Titel-Fallback hängt von vorheriger Indexierung ab
- **Plenarprotokoll-Parser v6** für nicht-namentliche Abstimmungen ist Phase 2, nicht in 1.0 (#106 follow-up)
- **DDD-Callsite-Migration** in `main.py` (~21 direkte Database-Aufrufe → Repository-Dependency-Injection) als Folge-PR offen (#136 follow-up)
### Sicherheit
- **Security-Headers** (CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy)
- **Rate-Limiting** auf teuren POST-Endpoints (10/min auf `/api/analyze-drucksache`)
- **Eingabe-Validatoren** (Drucksachen-Format-Regex, Such-Query-Längen-Cap)
- **JWT-Validation** über Keycloak JWKS, `azp`-Check statt `aud` für Public Clients (49c1b92)
### Statistik
- 11 789 LOC Python in `app/`
- 23 Module, 8 Templates-Verzeichnisse
- 71 produktive Bewertungen in der Live-DB
- 85 Wahlprogramme indexiert (Embeddings v4, ~50 000 Chunks)
- 28 977 abgeordnetenwatch-Votes
- 574 Tests, 0 Regressions
---
## [0.x] — Pre-Release-Phase
Frühere Iterationen. Siehe `git log` für Detail-Historie. Wesentliche Meilensteine:
- v3 → v4 Embedding-Migration (#123)
- Clustering + Force-Graph (#105, #108)
- Bookmarks + Kommentare (#94)
- Methodik-/Transparenz-Seite (#96)
- Keycloak SSO (#43)
- Multi-BL-Adapter (#22 Reihe, #72-#87)
[1.0.0]: https://repo.toppyr.de/tobias/gwoe-antragspruefer/releases/tag/v1.0.0

57
DATA-LICENSE Normal file
View File

@ -0,0 +1,57 @@
Datenrechte für GWÖ-Antragsprüfer
================================================================================
Copyright (c) 2026 Tobias Rödel und Mitwirkende
Dieses Werk umfasst alle vom GWÖ-Antragsprüfer **erzeugten** Inhalte:
- Bewertungen (Assessments) im JSON-Format
- GWÖ-Score-Werte und Matrix-Zuordnungen
- Begründungstexte und Empfehlungen
- Verbesserungsvorschläge im Redline-Format
- Themen-Tags, Stärken/Schwächen-Listen
- Aggregations-Tabellen und Auswertungs-Daten
- Generierte PDF-Berichte
Diese Inhalte sind lizenziert unter der
Creative Commons Attribution 4.0 International License (CC BY 4.0)
https://creativecommons.org/licenses/by/4.0/deed.de
Du darfst:
- Teilen — das Material in jedwedem Format oder Medium vervielfältigen und
weiterverbreiten
- Bearbeiten — das Material remixen, verändern und darauf aufbauen
und zwar für beliebige Zwecke, auch kommerziell.
Unter folgenden Bedingungen:
- Namensnennung — Du musst angemessene Urheber- und Rechteangaben machen,
einen Link zur Lizenz beifügen und angeben, ob Änderungen vorgenommen
wurden. Empfohlene Quellangabe:
"GWÖ-Antragsprüfer · gwoe.toppyr.de · CC BY 4.0"
- Keine weiteren Einschränkungen — Du darfst keine zusätzlichen Klauseln
oder technische Verfahren einsetzen, die anderen rechtlich irgendetwas
untersagen, was die Lizenz erlaubt.
================================================================================
NICHT von dieser Lizenz gedeckt:
- Quellcode des GWÖ-Antragsprüfers selbst — siehe LICENSE (MIT).
- Original-Antrags-PDFs und Plenarprotokolle der Landesparlamente und des
Bundestags — diese unterliegen den jeweiligen Veröffentlichungs-
Bedingungen ihrer Quellen. Sie werden vom Antragsprüfer ausschließlich
zur Bewertung referenziert, nicht weiterverbreitet.
- Wahlprogramme und Grundsatzprogramme der politischen Parteien — diese
sind urheberrechtlich geschützt und gehören den jeweiligen Parteien.
Indexierte Snippets werden im Rahmen des Zitatrechts (§ 51 UrhG)
zur Verifikation der Bewertungen genutzt.
- Logos und CD-Elemente der Gemeinwohl-Ökonomie / ECOnGOOD — diese
unterliegen den Markenrichtlinien der ECOnGOOD-Föderation.
================================================================================
Kontakt für Lizenzfragen: mail@tobiasroedel.de

233
README.md
View File

@ -4,145 +4,144 @@
![Python](https://img.shields.io/badge/Python-3.12-blue) ![Python](https://img.shields.io/badge/Python-3.12-blue)
![FastAPI](https://img.shields.io/badge/FastAPI-0.109-green) ![FastAPI](https://img.shields.io/badge/FastAPI-0.109-green)
![License](https://img.shields.io/badge/License-MIT-yellow) ![Code-License](https://img.shields.io/badge/Code-MIT-yellow)
![Data-License](https://img.shields.io/badge/Daten-CC--BY--4.0-blue)
![Version](https://img.shields.io/badge/Release-1.0.0-success)
## 🎯 Was ist das? Live unter <https://gwoe.toppyr.de/>.
Der GWÖ-Antragsprüfer analysiert Anträge aus Landesparlamenten (aktuell NRW) und bewertet sie nach den Kriterien der **Gemeinwohl-Ökonomie (GWÖ)**: ## Was macht das Tool?
- **GWÖ-Score (0-10)**: Wie gut entspricht der Antrag den GWÖ-Werten? Der GWÖ-Antragsprüfer analysiert Anträge aus deutschen Landesparlamenten und dem Bundestag und bewertet sie nach den Kriterien der **Gemeinwohl-Ökonomie (GWÖ)**:
- **Matrix-Zuordnung**: Welche Felder der GWÖ-Matrix werden adressiert?
- **Programmtreue**: Passt der Antrag zu Wahl- und Parteiprogrammen?
- **Verbesserungsvorschläge**: Konkrete Textänderungen mit GWÖ-Begründung
## ✨ Features - **GWÖ-Score (010)** — Wie gut entspricht der Antrag den GWÖ-Werten?
- **Matrix-Zuordnung** — Welche der 25 Felder der GWÖ-Matrix für Gemeinden werden adressiert?
- **Programm-Treue** — Passt der Antrag zum Wahl- und Grundsatzprogramm jeder Fraktion?
- **Verbesserungsvorschläge** — Konkrete Textänderungen mit GWÖ-Begründung im Redline-Format
- **Zitate mit Verifikation** — Belege aus den Wahl-/Grundsatzprogrammen, server-seitig gegen Original-Chunks geprüft (siehe ADR 0001)
- 🔍 **Landtag-Suche**: Direkte Anbindung an OPAL (NRW Parlamentsdokumentation) ## Aktive Datenquellen (Stand Release 1.0)
- 📊 **GWÖ-Matrix-Visualisierung**: 5×5-Tabelle mit Bewertungssymbolen
- 🏷️ **Tag-Wolke**: Filter nach Themen mit Multi-Select
- 🎯 **Partei-Filter**: Durchschnittswerte pro Fraktion
- 📄 **PDF-Export**: Professionelle Berichte im GWÖ-Design
- 🔒 **Security**: CSP, CORS, Rate Limiting
## 🚀 Schnellstart **16 Bundesländer + Bundestag** — alle aktiven Adapter:
| BL | Wahlperiode | Quelle |
|---|---|---|
| BUND | 21 (20252029) | bundestag.de DIP |
| BW | 17 (20212026) | PARLIS |
| BY | 19 (20232028) | Bayern Landtag |
| BE | 19 (20232026) | Berlin AGH |
| BB | 8 (20242029) | StarWeb |
| HB | 21 (20232027) | ParlDok |
| HH | 23 (20252029) | ParlDok |
| HE | 21 (20242029) | Hessen Landtag |
| MV | 8 (20212026) | ParlDok |
| NI | — | NILAS (login-protected, deferred) |
| NRW | 18 (20222027) | OPAL |
| RP | 18 (20212026) | StarWeb |
| LSA | 8 (20212026) | StarWeb |
| SL | 17 (20222027) | Umbraco |
| SN | 8 (20242029) | XML-Export |
| SH | 20 (20222027) | Schleswig-Holstein |
| TH | 8 (20242029) | StarWeb |
Plus **abgeordnetenwatch.de**-Integration für strukturierte namentliche Abstimmungen (alle 16 BL + BT).
## Features
### Frontend (v2, ECOnGOOD-CD)
- **Listenansicht** mit Score-Band-Filter, BL-Chip-Filter, Sort-Dropdown (8 Optionen), Live-Suche
- **Antragsdetail** mit ScoreHero, Matrix 5×5, Zitaten, Redline-Diff, Programm-Treue pro Fraktion, Versionshistorie, namentlichem Abstimmungsverhalten (wenn vorhanden)
- **Bookmark-Liste** (server-seitig pro User), **Kommentare**, **Voting**, **Share-Buttons** (Threads/X/Mastodon mit LLM-Texten), **Re-Analyze**
- **Auswertungen** mit BL×Partei-Matrix, Themen×Fraktion-Heatmap, Cluster-Bubble-Chart
- **Tag-Cloud**, **Cluster-Liste**, **Landtag-Live-Suche**, **Methodik**, **Quellen**
- **Admin-Panel** Freischaltungen / Queue / Abos / Wahlprogramme
- **Dark-Mode**, **Phosphor-Icons**, Avenir/Nunito-Sans, **Keyboard-Shortcuts** (j/k/Enter/Esc/?/⏎)
### Backend
- **FastAPI** + Jinja2 + Vanilla JS (kein Build-Tool)
- **SQLite** mit aiosqlite (Source of Truth)
- **Qwen-Plus** (DashScope) für die LLM-Bewertung — austauschbar via `LlmBewerter`-Port (ADR 0008)
- **Embeddings v4** für die Zitat-Verifikation (ADR 0006)
- **Keycloak SSO** mit Direct-Access-Grant (Login-Modal in der App, kein Redirect)
- **Background-Queue** mit 3 parallelen Workern + Graceful Shutdown
- **Daily-Digest-Mail** für Abonnent:innen
- **Monitoring-Scan** aller Adapter mit Kosten-Schätzung — Beobachtung ohne Auto-Fetch
- **OG-Cards** (Open-Graph-Bilder pro Antrag, Playwright-gerendert)
- **WeasyPrint** für PDF-Reports
### Tests
- **574 Tests, 13 skipped** — Unit + Integration + Property + Bug-Regression + DDD
- Live-Adapter-Tests gegen alle 17 Quellen (`pytest -m integration`)
- Citation-Substring-Verification gegen Original-PDFs
- E2E-Browser-Tests via Playwright (`pytest -m e2e`)
## Architektur
Detailliert in [`docs/`](docs/):
- [`docs/adr/`](docs/adr/) — Architecture Decision Records (8 ADRs)
- [`docs/analysen/ddd-bewertung.md`](docs/analysen/ddd-bewertung.md) — DDD-Analyse + Migrations-Roadmap
- [`docs/reference/zugriffsrechte.md`](docs/reference/zugriffsrechte.md) — 63 Routes × User-Status-Matrix
- [`docs/reference/api.md`](docs/reference/api.md) — API-Reference
DDD-Lightweight-Migration ist **Tag 1-4 abgeschlossen** (Ports, Adapter, Repositories, Domain-Verhalten — siehe ADR 0008). Callsite-Migration in `main.py` ist Folge-PR.
## Schnellstart
### Voraussetzungen ### Voraussetzungen
- Python 3.12+ - Docker + Docker Compose
- Docker & Docker Compose - Python 3.12 (für lokale Tests)
- DashScope API-Key (Qwen LLM) - DashScope API-Key (Qwen)
- Keycloak (optional, für Login)
### Installation ### Installation
```bash ```bash
# Repository klonen git clone https://repo.toppyr.de/tobias/gwoe-antragspruefer
git clone https://github.com/tobiasroedel/gwoe-antragspruefer.git cd gwoe-antragspruefer/webapp
cd gwoe-antragspruefer cp .env.example .env # API-Keys eintragen
docker compose up -d --build
# Environment-Variablen
cp .env.example .env
# DASHSCOPE_API_KEY eintragen
# Mit Docker starten
docker compose up -d
# Oder lokal entwickeln
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload
``` ```
Die App läuft auf http://localhost:8000 App auf <http://localhost:8000>.
## 📁 Projektstruktur ### Tests
```
webapp/
├── app/
│ ├── main.py # FastAPI-Endpoints
│ ├── analyzer.py # LLM-Analyse-Logik
│ ├── database.py # SQLite-Persistenz
│ ├── models.py # Pydantic-Modelle
│ ├── parlamente.py # Landtag-Adapter (OPAL)
│ ├── report.py # PDF-Generierung
│ ├── config.py # Settings
│ ├── kontext/ # GWÖ-Matrix, Wahlprogramme
│ ├── templates/ # Jinja2-HTML
│ └── static/ # CSS, JS, Assets
├── data/ # SQLite-DBs (Volume)
├── reports/ # Generierte PDFs (Volume)
├── docker-compose.yml
├── Dockerfile
└── requirements.txt
```
## 🔧 Konfiguration
### Environment-Variablen
| Variable | Beschreibung | Default |
|----------|--------------|---------|
| `DASHSCOPE_API_KEY` | Alibaba DashScope API-Key | (required) |
| `LLM_MODEL_DEFAULT` | Standard-Modell | `qwen-plus-latest` |
| `LLM_MODEL_PREMIUM` | Premium-Modell | `qwen-max` |
### Unterstützte Bundesländer
| Code | Name | Status |
|------|------|--------|
| NRW | Nordrhein-Westfalen | ✅ Aktiv |
| BY | Bayern | 🔜 Geplant |
| BW | Baden-Württemberg | 🔜 Geplant |
## 📊 API-Endpoints
| Methode | Pfad | Beschreibung |
|---------|------|--------------|
| GET | `/` | Web-UI |
| GET | `/api/assessments` | Alle Bewertungen |
| GET | `/api/assessment?drucksache=18/12345` | Einzelne Bewertung |
| POST | `/api/analyze-drucksache` | Neue Analyse starten |
| GET | `/api/search?q=Klima` | Interne Suche |
| GET | `/api/search-landtag?q=Klima` | Landtag-Suche |
| GET | `/api/assessment/pdf?drucksache=18/12345` | PDF-Download |
## 🧠 GWÖ-Prompt (v5)
Der Analyse-Prompt basiert auf:
- **GWÖ-Matrix 2.0 für Gemeinden** (Arbeitsbuch)
- **ECOnGOOD Corporate Design Manual 2024**
- **Wahlprogramme** der NRW-Landtagsparteien 2022
Ausgabe-Format:
- GWÖ-Score mit Matrix-Feldern und Symbolen (++/+/○//)
- Wahlprogramm- und Parteiprogrammtreue
- **Verbesserungsvorschläge im Redline-Format** (Original → Vorschlag → Begründung)
- Themen-Tags für Kategorisierung
## 🛠️ Entwicklung
```bash ```bash
# Tests ausführen python3 -m pytest tests/ -q # Unit-Suite (574 Tests, < 2 s)
pytest python3 -m pytest tests/ -m integration # Live-Adapter-Tests (langsam)
./scripts/smoke-test.sh # Gesamt-Funktionsprüfung gegen Live
# Linting
ruff check app/
# Type-Checking
mypy app/
``` ```
## 📝 Lizenz ### Deploy (Server)
MIT License - siehe [LICENSE](LICENSE) ```bash
./scripts/deploy.sh # mit Uptime-Kuma-Wartungsmodus
./scripts/run-digest.sh # Daily-Mail-Digest (Cron 07:00)
./scripts/run-monitoring-scan.sh # Monitoring-Scan (manuell oder Cron)
```
## 🙏 Credits ## Lizenz
- [Gemeinwohl-Ökonomie](https://econgood.org) - Matrix und Arbeitsbücher Zwei getrennte Lizenzen:
- [Alibaba DashScope](https://dashscope.aliyuncs.com) - Qwen LLM API
- [Landtag NRW](https://www.landtag.nrw.de) - OPAL-Dokumentation
--- - **Quellcode** — [MIT](LICENSE)
- **Bewertungs-Daten und -Berichte** (Assessments, Matrix-Zuordnungen, Verbesserungsvorschläge, Themen-Tags etc.) — [CC BY 4.0](DATA-LICENSE)
**Entwickelt von Tobias Rödel** · [tobiasroedel.de](https://tobiasroedel.de) Wahlprogramme und Antrags-PDFs der Parlamente unterliegen der jeweiligen Urheber-Lizenz der Quelle und werden hier nur zur Verifikation referenziert.
## Mitwirken
Issues unter <https://repo.toppyr.de/tobias/gwoe-antragspruefer>. Pull Requests willkommen — beachte ADR 0004 (Deployment-Workflow) und die Test-Konventionen in `pytest.ini`.
## Statistiken (Stand Release 1.0)
- 16 BL + Bundestag aktiv
- 85 Wahlprogramme indexiert (Embeddings v4)
- 71 produktive Bewertungen in der Live-DB
- 28 977 abgeordnetenwatch-Votes (BUND)
- 11 789 LOC Python in `app/`