From 9b95958eeba0fd9b4bf07b9d30cea8f3a69bbc5c Mon Sep 17 00:00:00 2001 From: "christoph.schwoerer" Date: Thu, 19 Feb 2026 20:16:26 +0100 Subject: [PATCH] Versuche und Ergebnisse Umstrukturiert --- Kapitel/01_einleitung.typ | 4 +- Kapitel/03_fallstudie.typ | 2 +- .../04_konzeption_methodisches_vorgehen.typ | 459 +- Kapitel/05_prototypische_umsetzung.typ | 240 +- Kapitel/06_evaluation.typ | 136 +- Kapitel/07_diskussion.typ | 47 +- Kapitel/08_fazit_ausblick.typ | 35 +- Masterarbeit_draft.pdf | 6908 ----------------- Masterarbeit_draft.typ | 4 +- Protokoll.md | 32 +- Versuche/Versuch 01/Versuch01.md | 28 +- .../.execution_state/baseline_metrics.json | 0 .../.execution_state/directory_setup.txt | 0 .../.execution_state/milestone_state.json | 0 .../.execution_state/project_structure.json | 0 .../COMPLETE_REQUIREMENTS_SPECIFICATION.md | 0 .../COMPLETE_REQUIREMENTS_SPECIFICATION.pdf | Bin .../Ergenisse/README.md | 0 .../Ergenisse/TABLE_FORMATTING_STATUS.md | 0 .../master/ISO29148_Executive_Summary.md | 0 .../master/ISO29148_Master_Requirements.md | 0 .../master/ISO29148_Quality_Report.md | 0 .../master/ISO29148_Traceability_Master.csv | 0 .../master/ISO29148_Validation_Checklist.md | 0 .../Ergenisse/software/Analysis_Complete.md | 0 .../Ergenisse/software/Business_Rules.md | 0 .../software/Integration_Patterns.md | 0 .../Ergenisse/software/Pattern_Catalog.csv | 0 .../software/Performance_Patterns.md | 0 .../Ergenisse/software/Security_Patterns.md | 0 .../Ergenisse/software/SwRS_Algorithms.md | 0 .../Ergenisse/software/SwRS_CodeCatalog.md | 0 .../Ergenisse/software/SwRS_Complete.md | 0 .../Ergenisse/software/SwRS_DataModel.md | 0 .../software/SwRS_TestSpecification.md | 0 .../Ergenisse/software/SwRS_Traceability.csv | 0 .../Ergenisse/software/Validation_Rules.md | 0 .../Ergenisse/stakeholder/StRS_Complete.md | 0 .../Ergenisse/stakeholder/StRS_Diagrams.md | 0 .../Ergenisse/stakeholder/StRS_Evidence.md | 0 .../Ergenisse/stakeholder/StRS_Summary.md | 0 .../stakeholder/StRS_Traceability.csv | 0 .../system/SyRS_API_Specification.yaml | 0 .../Ergenisse/system/SyRS_Architecture.md | 0 .../Ergenisse/system/SyRS_Complete.md | 0 .../Ergenisse/system/SyRS_Interfaces.md | 0 .../Ergenisse/system/SyRS_Summary.md | 0 .../Ergenisse/system/SyRS_Traceability.csv | 0 Versuche/Versuch 02/Requirements.md | 23 +- Versuche/Versuch 02/Tools/AGENTS.md | 12 +- Versuche/Versuch 02/Tools/CLAUDE.md | 470 +- .../agents/iso-29148-code-analyzer-agent.md | 0 .../iso29148-master-orchestrator-agent.md | 0 .../iso29148-software-requirements-agent | 0 .../agents/iso29148-stakeholder-agent.md | 0 .../iso29148-system-requirements-agent.md | 0 Versuche/Versuch 02/Versuch02.md | 83 +- .../ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md | 0 .../ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md | 0 .../ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf | Bin .../BUSINESS_GLOSSAR_MIT_DB_MAPPING.md | 0 .../COMPLETE_DATABASE_SCHEMA.md | 0 .../ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md | 0 .../EXPORT_COMPLETE_SCHEMA.sql | 0 .../ERP_DOCUMENTATION/README.md | 0 .../README_USE_CASE_ANALYSIS.md | 0 .../SCREENSHOT_ANALYSIS_SUMMARY.md | 0 .../SCREENSHOT_MAPPING_COMPLETE.md | 0 .../SCREENSHOT_PROJECT_INDEX.md | 0 .../ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql | 0 .../UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md | 0 .../UNDOCUMENTED_USE_CASES_REST_API.md | 0 .../UNDOCUMENTED_USE_CASES_SUMMARY.md | 0 .../UNDOCUMENTED_USE_CASES_WORKFLOWS.md | 0 .../ERP_DOCUMENTATION/USE_CASES.md | 0 .../ERP_DOCUMENTATION/USE_CASES.pdf | Bin .../USE_CASES_CENTRON_NEXUS.md | 0 .../USE_CASES_CENTRON_NEXUS.pdf | Bin .../USE_CASES_CENTRON_NEXUS_DE.md | 0 .../USE_CASES_CENTRON_NEXUS_DE.pdf | Bin .../ERP_DOCUMENTATION/USE_CASES_NEW.md | 0 .../USE_CASES_NEW_CONTROLLERS.md | 0 .../USE_CASES_NEW_GUI_MAPPING.md | 0 .../USE_CASES_NEW_IMPLEMENTATION_GUIDE.md | 0 .../USE_CASES_NEW_XAML_TEMPLATES.md | 0 .../USE_CASE_ANALYSIS_README.md | 0 .../ERP_DOCUMENTATION/USE_CASE_MAPPING.md | 0 Versuche/Versuch 03/Requirements.md | 23 +- Versuche/Versuch 03/Tools/AGENTS.md | 12 +- .../Tools/Agents/centron-code-reviewer.md | 0 .../Tools/Agents/centron-debugger.md | 0 .../Agents/centron-documentation-writer.md | 0 .../Agents/centron-refactoring-specialist.md | 0 .../Tools/Agents/nhibernate-query-reviewer.md | 0 .../Tools/Agents/webservice-developer.md | 0 Versuche/Versuch 03/Tools/CLAUDE.md | 520 +- ...Nexus_Ticket_Metadata_Complete_Analysis.md | 0 .../Remaining_Kapitel_Modules_Summary.md | 0 ...icket_Close_Comprehensive_Documentation.md | 0 .../memories/WPF_Modules_Analysis_Phase1.md | 0 .../memories/WPF_Modules_Complete_Analysis.md | 0 .../memories/WPF_UI_Architecture_Summary.md | 0 .../WPF_UI_Detailed_Controls_Breakdown.md | 0 .../memories/WPF_UI_Inventory.md | 0 .../memories/WPF_UI_Quick_Reference.md | 0 Versuche/Versuch 03/Versuch03.md | 82 +- literatur.bib | 80 + masterarbeit_style.typ | 13 + 108 files changed, 1427 insertions(+), 7786 deletions(-) delete mode 100644 Masterarbeit_draft.pdf rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/.execution_state/baseline_metrics.json (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/.execution_state/directory_setup.txt (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/.execution_state/milestone_state.json (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/.execution_state/project_structure.json (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.pdf (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/README.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/TABLE_FORMATTING_STATUS.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/master/ISO29148_Executive_Summary.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/master/ISO29148_Master_Requirements.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/master/ISO29148_Quality_Report.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/master/ISO29148_Traceability_Master.csv (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/master/ISO29148_Validation_Checklist.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Analysis_Complete.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Business_Rules.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Integration_Patterns.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Pattern_Catalog.csv (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Performance_Patterns.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Security_Patterns.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/SwRS_Algorithms.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/SwRS_CodeCatalog.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/SwRS_Complete.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/SwRS_DataModel.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/SwRS_TestSpecification.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/SwRS_Traceability.csv (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/software/Validation_Rules.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/stakeholder/StRS_Complete.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/stakeholder/StRS_Diagrams.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/stakeholder/StRS_Evidence.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/stakeholder/StRS_Summary.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/stakeholder/StRS_Traceability.csv (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/system/SyRS_API_Specification.yaml (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/system/SyRS_Architecture.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/system/SyRS_Complete.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/system/SyRS_Interfaces.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/system/SyRS_Summary.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Ergenisse/system/SyRS_Traceability.csv (100%) rename Versuche/{Versuch 03 => Versuch 02}/Tools/agents/iso-29148-code-analyzer-agent.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Tools/agents/iso29148-master-orchestrator-agent.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Tools/agents/iso29148-software-requirements-agent (100%) rename Versuche/{Versuch 03 => Versuch 02}/Tools/agents/iso29148-stakeholder-agent.md (100%) rename Versuche/{Versuch 03 => Versuch 02}/Tools/agents/iso29148-system-requirements-agent.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/BUSINESS_GLOSSAR_MIT_DB_MAPPING.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/COMPLETE_DATABASE_SCHEMA.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/EXPORT_COMPLETE_SCHEMA.sql (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/README.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/README_USE_CASE_ANALYSIS.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/SCREENSHOT_ANALYSIS_SUMMARY.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/SCREENSHOT_PROJECT_INDEX.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_REST_API.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_WORKFLOWS.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES.pdf (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.pdf (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.pdf (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_NEW.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_NEW_CONTROLLERS.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_NEW_GUI_MAPPING.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_NEW_IMPLEMENTATION_GUIDE.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASES_NEW_XAML_TEMPLATES.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASE_ANALYSIS_README.md (100%) rename Versuche/{Versuch 02/Ergebnisse => Versuch 03}/ERP_DOCUMENTATION/USE_CASE_MAPPING.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Agents/centron-code-reviewer.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Agents/centron-debugger.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Agents/centron-documentation-writer.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Agents/centron-refactoring-specialist.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Agents/nhibernate-query-reviewer.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Agents/webservice-developer.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/CentronNexus_Ticket_Metadata_Complete_Analysis.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/Remaining_Kapitel_Modules_Summary.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/Section_3_3_Ticket_Close_Comprehensive_Documentation.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/WPF_Modules_Analysis_Phase1.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/WPF_Modules_Complete_Analysis.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/WPF_UI_Architecture_Summary.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/WPF_UI_Detailed_Controls_Breakdown.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/WPF_UI_Inventory.md (100%) rename Versuche/{Versuch 02 => Versuch 03}/Tools/Serena_memories/memories/WPF_UI_Quick_Reference.md (100%) diff --git a/Kapitel/01_einleitung.typ b/Kapitel/01_einleitung.typ index eec624f..981b2cb 100644 --- a/Kapitel/01_einleitung.typ +++ b/Kapitel/01_einleitung.typ @@ -23,7 +23,7 @@ Diese Arbeit verfolgt das Ziel, ein vollständiges Vorgehen für KI-gestütztes - Entwicklung eines Prozessmodells, das Vorbereitung, Analyse, Validierung und Übergabe strukturiert. - Evaluation aktueller LLMs hinsichtlich Kontextfenster, Codeverständnis, Steuerbarkeit, Kosten und Datenschutz. -- Prototypische Umsetzung eines Agenten, der Quellcode verarbeitet, Requirements formuliert und Traceability-Informationen hinterlegt. +- Durchführung und Vergleich von drei Claude-Code-basierten Versuchen (V01-V03) mit unterschiedlicher Tooling-Tiefe (Prompt-only, Agenten, Agenten+MCP). - Integration von Stakeholder-Wissen durch Interviews, um nicht direkt aus dem Code ableitbare Anforderungen zu ergänzen. - Definition eines Evaluationsrahmens mit quantitativen und qualitativen Kriterien (Vollständigkeit, Verständlichkeit, Redundanzfreiheit, Aufwandseinsparung). - Formulierung konkreter Handlungsempfehlungen für die c-entron GmbH sowie Übertragbarkeit auf ähnliche Unternehmen. @@ -43,7 +43,7 @@ Die Arbeit ist in acht Kapitel gegliedert und folgt dem in den Vorlagen übliche 2. **Theoretische Grundlagen:** Requirements Engineering, Reverse Engineering, Large Language Models sowie Qualitätssicherungskriterien. 3. **Fallstudie c-entron GmbH:** Unternehmensprofil, Produktarchitektur, Migrationsdruck und Rahmenbedingungen. 4. **Konzeption und methodisches Vorgehen:** Prozessmodell, Technologieauswahl, Stakeholder-Einbindung und Datenbasis. -5. **Prototypische Umsetzung:** Architektur und Funktionsweise des LLM-Agenten sowie Integration in bestehende Toolchains. +5. **Ergebnisse:** Vollständige Ergebnisdarstellung der drei Versuche inkl. Artefaktlisten und beispielhafter Requirements/Use Cases aus den Ergebnisverzeichnissen. 6. **Evaluation:** Vorgehen, Metriken, Ergebnisse und Expertenfeedback. 7. **Diskussion:** Interpretation der Resultate, Limitationen und Implikationen für Forschung und Praxis. 8. **Fazit und Ausblick:** Zusammenfassung, Beantwortung der Forschungsfragen und Perspektiven für weitere Arbeiten. diff --git a/Kapitel/03_fallstudie.typ b/Kapitel/03_fallstudie.typ index ae3e476..5668c86 100644 --- a/Kapitel/03_fallstudie.typ +++ b/Kapitel/03_fallstudie.typ @@ -98,4 +98,4 @@ Aus den genannten Herausforderungen ergeben sich konkrete Anforderungen an das i 3. **Segmentierung und Kontextsteuerung:** Da Artefakte verteilt sind, ist eine systematische Auswahl relevanter Kontexte notwendig, um Überinterpretation zu reduzieren. 4. **Human-in-the-loop:** Fachliche Validierung ist zwingend, da „plausible“ Textausgaben kein hinreichender Beweis für fachliche Korrektheit sind. -Damit schafft dieses Kapitel die Grundlage für die folgenden Abschnitte: Kapitel 4 beschreibt das methodische Vorgehen und das Prozessmodell, Kapitel 5 überführt es in einen Prototyp, und Kapitel 6 evaluiert die Eignung im Fallkontext der c-entron GmbH. +Damit schafft dieses Kapitel die Grundlage für die folgenden Abschnitte: Kapitel 4 beschreibt das methodische Vorgehen und die Claude-Code-basierte Durchfuehrung, Kapitel 5 dokumentiert die Ergebnisse der Versuche, und Kapitel 6 evaluiert die Eignung im Fallkontext der c-entron GmbH. diff --git a/Kapitel/04_konzeption_methodisches_vorgehen.typ b/Kapitel/04_konzeption_methodisches_vorgehen.typ index 56f0f7e..3afb264 100644 --- a/Kapitel/04_konzeption_methodisches_vorgehen.typ +++ b/Kapitel/04_konzeption_methodisches_vorgehen.typ @@ -2,168 +2,419 @@ #if __is_thesis == false [ #set cite(style: "apa") #hide(bibliography("../literatur.bib", style: "apa")) + // Fallback for standalone preview of this chapter (without global thesis style). + #show raw: set text(font: "DejaVu Sans Mono", size: 9.5pt, fill: luma(20)) + #show raw.where(block: true): it => block( + width: 100%, + fill: luma(240), + stroke: 0.5pt + luma(190), + inset: 9pt, + radius: 4pt, + above: 0.8em, + below: 0.8em, + it, + ) ] #heading(level: 1)[Konzeption und methodisches Vorgehen (ca. 12 Seiten)] -Dieses Kapitel beschreibt das Forschungsdesign und das Vorgehensmodell der Arbeit. Ziel ist es, den Einsatz von Large Language Models (LLMs) für Reverse Requirements Engineering so zu strukturieren, dass Ergebnisse nachvollziehbar, überprüfbar und reproduzierbar sind. Hierzu wird zunächst das Forschungsdesign als Fallstudie im Unternehmenskontext eingeordnet. Anschließend wird ein Prozessmodell für KI-gestütztes Reverse Requirements Engineering entwickelt. Abschließend werden Kriterien zur Technologieauswahl, Modellkonfiguration sowie die Einbindung von Stakeholdern und die Datengrundlage beschrieben. +Dieses Kapitel beschreibt die tatsaechlich durchgefuehrte Methodik mit Fokus auf Claude Code als zentralem Arbeitswerkzeug. Alle Informationen sind versuchsweise gebuendelt dargestellt, sodass pro Versuch die Konfiguration, die Prompts, die eingesetzten Tools und die resultierenden Artefakte geschlossen nachvollziehbar sind. -#heading(level: 2)[Forschungsdesign und Vorgehensmodell] +#heading(level: 2)[Claude Code als Werkzeug] -#heading(level: 3)[Einordnung als Fallstudie und Artefaktentwicklung] +Claude Code wurde in dieser Arbeit als lokales Analysewerkzeug genutzt: ueber die CLI im Projektarbeitsverzeichnis und ueber die VS-Code-Einbindung. Die Arbeitslogik folgt einem schrittweisen Ausbau: -Die Arbeit ist als anwendungsnahe Untersuchung im Kontext einer konkreten Legacy-Modernisierung angelegt. Der Kernbeitrag besteht nicht nur in einer Beschreibung von LLM-Fähigkeiten, sondern in der Entwicklung eines Vorgehens, das unter realistischen Randbedingungen (große Codebasis, heterogene Artefakte, begrenzte Expertenzeit) umsetzbar ist. Das Forschungsdesign kombiniert daher: +- Baseline nur mit Prompt + CLI (Versuch 01), +- Spezialisierung ueber Agenten-Dateien (Versuch 02), +- Erweiterung um MCP-Server fuer zusaetzliche Tool- und Datenzugriffe (Versuch 03). -1. **Literaturbasierte Fundierung:** Ableitung von Anforderungen an Requirements-Qualität, Traceability und Qualitätskriterien @iso29148_2018 @ieee830_1998. -2. **Artefaktentwicklung:** Konzeption eines reproduzierbaren Prozessmodells für KI-gestütztes Reverse Requirements Engineering. -3. **Prototypische Umsetzung:** Implementationsnahe Ausgestaltung des Prozesses als Agenten-/Toolchain-Workflow. -4. **Fallbezogene Evaluation:** Überprüfung der Praktikabilität und der Ergebnisqualität durch Review und Abgleich mit Artefakten und Expertenwissen. +Technisch wurde Claude Code entlang der offiziellen Dokumentation eingesetzt: -Diese Kombination ist notwendig, weil LLM-Ergebnisse im Requirements-Kontext nur dann einen belastbaren Nutzen stiften, wenn sie in einen Prozess eingebettet sind, der Belege, Unsicherheit und Validierung explizit adressiert. LLM-Ausgaben werden daher nicht als Spezifikation „an sich“ betrachtet, sondern als Zwischenartefakte, die über Belegpflicht und Review zu Requirements konsolidiert werden. +- Session-Start und Ausfuehrung ueber CLI (`claude`, `claude -p`), +- lokale IDE-Anbindung in VS Code, +- Einbindung externer MCP-Server ueber das `claude mcp`-Konzept, +- Nutzung des MCP-Scopes fuer projektspezifische Tool-Konfigurationen. -#heading(level: 3)[Datenerhebung, Artefaktanalyse und Auswertungslogik] +Die technische Einordnung stuetzt sich auf die offizielle Claude-Code-Dokumentation zu Quickstart, CLI-Nutzung, IDE-Integration und MCP sowie auf das Produktupdate zu Remote MCP @claudecode_quickstart_2026 @claudecode_cli_2026 @claudecode_ide_2026 @claudecode_mcp_2026 @anthropic_remote_mcp_2025. -Die Datengrundlage der Arbeit ist artefaktzentriert. Der Ausgangspunkt ist die bestehende Legacy-Codebasis und die zugehörigen projektinternen Artefakte. Die Analyse folgt einer Logik aus (1) technischer Faktenerhebung und (2) semantischer Interpretation: +Damit fungiert Claude Code in dieser Arbeit nicht nur als Chat-Interface, sondern als orchestrierender Agent-Laufzeitkontext fuer Prompting, rollenbasierte Agenten und MCP-basierte Toolaufrufe. -- **Faktenerhebung:** Identifikation von Komponenten, Datenobjekten, Schnittstellen und Regelstellen (z. B. Validierungen, Statuswechsel, Rechteprüfungen). -- **Semantische Interpretation:** Ableitung fachlicher Aussagen aus den Fakten (z. B. „Ein Auftrag darf nur fakturiert werden, wenn …“). -- **Formalisierung:** Überführung in Requirements mit Akteur, Vorbedingung, Ergebnis und Prüfidee. -- **Absicherung:** Zuordnung von Belegen und Review durch Domänenexperten. +#heading(level: 2)[Versuch 01] -Für die Auswertung ist wichtig, dass die Arbeit nicht versucht, „Vollständigkeit“ absolut zu beweisen. Stattdessen wird eine risikobasierte Perspektive gewählt: Requirements werden dort vertieft und geprüft, wo Migration, Sicherheit oder Datenintegrität besonders kritisch sind. Diese Priorisierung ist anschlussfähig an die RE-Literatur, die Qualitätsanforderungen als risikobasiert zu behandeln empfiehlt @glinz2008quality. +#heading(level: 3)[Allgemeine Beschreibung] -#heading(level: 3)[Gütekriterien: Nachvollziehbarkeit, Prüfbarkeit, Reproduzierbarkeit] +Versuch 01 bildet die Baseline ohne Agenten und ohne MCP. Ziel war eine erste formale Requirements-Extraktion direkt aus der Codebasis mit minimaler Tooling-Komplexitaet. -Im Requirements Engineering gelten Kriterien wie Eindeutigkeit, Konsistenz, Vollständigkeit, Verifizierbarkeit und Traceability als zentrale Qualitätsmerkmale @iso29148_2018. Für KI-gestützte Extraktion wird diese Liste operationalisiert, um überprüfbare Prozessanforderungen zu erhalten. Für die Arbeit sind besonders relevant: +#heading(level: 3)[Konfiguration] -- **Traceability:** Jedes extrahierte Requirement muss auf Artefakte zurückgeführt werden können (Code, Konfiguration, Datenobjekt, UI-Text). Traceability ist in der Literatur als zentrales, dauerhaftes Problemfeld beschrieben und wird als Voraussetzung für belastbare Weiterentwicklung betrachtet @gotel1994traceability @ramesh2001traceability. -- **Prüfbarkeit:** Requirements werden so formuliert, dass eine Testidee oder ein Abnahmekriterium ableitbar ist. -- **Reproduzierbarkeit:** Prompting-Strategien, Kontextauswahl und Parameter werden dokumentiert, sodass Analysen unter gleichen Bedingungen wiederholbar sind. +- Claude Code CLI lokal im Projektverzeichnis, +- Nutzung aus VS Code (integriertes Terminal), +- keine Agenten-Dateien, +- keine MCP-Server. -LLMs erzeugen nicht-deterministische Ausgaben. Deshalb wird im Vorgehensmodell eine „Kontrollspur“ vorgesehen: Kontextquellen, Promptversionen und Resultate werden versioniert, und Unsicherheit wird explizit markiert, um spätere Überprüfung zu ermöglichen. Der Umgang mit Halluzinationen ist dabei ein zentrales Risiko, da plausible Texte fachlich falsch sein können @ji2023hallucination. +#heading(level: 3)[Verwendeter Prompt] -#heading(level: 2)[Prozessmodell für KI-gestütztes Reverse Requirements Engineering] +```text +Please analyze this software project and write a reuqirements specification according to modern standards. +``` -#heading(level: 3)[Prozessüberblick und Rollen] +#heading(level: 3)[Tools und Artefakte] -Das Prozessmodell strukturiert die Arbeit in Phasen, die wiederholbar durchlaufen werden können. Es unterscheidet technische und fachliche Rollen: +- Tooling: Claude Code CLI + VS Code Integration. +- Ergebnisfokus: formale Requirements-Spezifikation (StRS/SyRS/SwRS) mit hoher Strukturierungsdichte. -- **Analyseverantwortlicher:** Steuert Scope, Artefaktauswahl und Toolchain. -- **Domänenexperte:** Validiert fachliche Bedeutung, Ausnahmen und Prioritäten. -- **Entwicklung/Architektur:** Nutzt konsolidierte Requirements als Basis für Zielarchitektur und Umsetzung. +#heading(level: 3)[Beispielhafte Ergebnisanforderungen] -Der Prozess besteht aus sieben Phasen, die iterativ angewendet werden: +Quelle: `Versuche/Versuch 01/Ergebnisse/ISO29148_Complete_Requirements_Specification.md` -1. **Scope und Domänenabgrenzung** -2. **Artefakterhebung und Kontextaufbereitung** -3. **Technische Analyse (Struktur, Daten, Schnittstellen)** -4. **Retrieval und Kontextsteuerung (RAG)** -5. **Requirements-Extraktion und Strukturierung** -6. **Traceability-Anreicherung und Unsicherheitsmarkierung** -7. **Review, Konsolidierung und Übergabe** +```text +### StR-001: Comprehensive Customer Account Management +**Statement**: The system shall provide comprehensive customer account management capabilities including contact information, relationship mapping, interaction history, and account hierarchy management. +``` -#heading(level: 3)[Artefaktpipeline: Sammeln, Normalisieren, Indexieren] +```text +### SyR-001 +The system SHALL implement a multi-layered architecture with clear separation of concerns. +``` -Die zentrale technische Voraussetzung ist eine Artefaktpipeline, die die Codebasis und flankierende Quellen in eine Form überführt, die sowohl maschinell suchbar als auch für LLMs nutzbar ist. Die Pipeline umfasst: +#heading(level: 3)[Einordnung] -- **Sammeln:** Repository, Konfigurationen, UI-Texte, Datenbankschemata, Tickets, Release Notes. -- **Normalisieren:** Extraktion von Metadaten (Pfad, Modul, Änderungsdatum), Entfernen von Rauschen (Build-Artefakte), Vereinheitlichung von Encodings. -- **Segmentieren:** Zerlegung großer Dateien in semantische Chunks (z. B. pro Klasse, Methode, SQL-Statement). -- **Indexieren:** Aufbau eines Suchindex (klassisch oder embeddings-basiert) zur späteren Kontextauswahl. +Die Baseline zeigt, dass bereits ohne Agenten/MCP belastbare, formal strukturierte Anforderungen erzeugbar sind. Gleichzeitig bleibt die Discovery-Breite begrenzt. -Die Segmentierung ist entscheidend, weil LLMs nur ein begrenztes Kontextfenster besitzen. Eine „Alles-in-einen-Prompt“-Strategie skaliert nicht. Retrieval-Augmented Generation (RAG) adressiert dieses Problem, indem relevante Textstellen gezielt in den Prompt geladen werden @lewis2020rag. +#heading(level: 2)[Versuch 02] -#heading(level: 3)[Prompt- und Output-Templates für Requirements] +#heading(level: 3)[Allgemeine Beschreibung] -Um Ergebnisse konsistent auszuwerten, werden Requirements in einem festen Template erzeugt. Ein zweckmäßiges Format umfasst: +Versuch 02 fokussiert die ISO-29148-orientierte Konsolidierung. Dazu wurde Claude Code weiterhin lokal genutzt, jedoch um spezialisierte Agenten-Dateien erweitert. -- **ID** -- **Titel** -- **Akteur/Rolle** -- **Vorbedingungen** -- **Beschreibung des Verhaltens** -- **Akzeptanzkriterien** -- **Belege (Artefaktverweise)** -- **Unsicherheitsmarker / offene Fragen** +#heading(level: 3)[Konfiguration] -Dieses Template reduziert Interpretationsspielraum und macht Reviews effizienter. Es adressiert zudem ein zentrales Risiko: LLMs können sprachlich „glatte“ Requirements erzeugen, die jedoch ohne Belege und Akzeptanzkriterien nicht belastbar sind. Der Prozess erzwingt daher eine Belegpflicht und die Ableitung von Prüfkriterien als Standardausgabe. +- Claude Code CLI lokal + VS Code, +- agentenbasierte Spezialisierung ueber MD-Dateien in `Versuche/Versuch 02/Tools/agents/`, +- kein MCP-Fokus in diesem Lauf. -#heading(level: 3)[Kontrollpunkte und Fehlerbegrenzung] +#heading(level: 3)[Verwendeter Prompt] -Die Prozesskontrollen sind so gewählt, dass typische LLM-Fehlermuster begrenzt werden: +```text +Please analyze this software project and write a ISO 29148 compliant reuqirements specification. +Use Agents wherever possible. +``` -- **Belegpflicht:** Keine Requirements ohne Artefaktbezug. -- **Konfliktprüfung:** Abgleich widersprüchlicher Aussagen über mehrere Belegstellen. -- **Unsicherheitskennzeichnung:** Hypothesen werden explizit markiert und priorisiert geprüft. -- **Human-in-the-loop:** Fachliche Validierung als fester Schritt, nicht als optionales „Nachlesen“. +#heading(level: 3)[Tools und Agenten] -Diese Kontrollen sind notwendig, weil Halluzinationen und Bias-Risiken in der LLM-Literatur als strukturelle Probleme beschrieben werden @bender2021stochastic @ji2023hallucination. Für Requirements bedeutet dies, dass Prozessqualität und Governance nicht nachgelagert, sondern integraler Bestandteil sein müssen. +Beispiele aus dem Versuchsordner: -#heading(level: 2)[Technologieauswahl und LLM-Konfiguration] +- `iso29148-master-orchestrator-agent.md` +- `iso29148-stakeholder-agent.md` +- `iso29148-system-requirements-agent.md` +- `iso29148-software-requirements-agent` -#heading(level: 3)[Auswahlkriterien für Modelle und Betriebsform] +#heading(level: 3)[Agentenbeispiel (Auszug, erste 100 Zeilen) - Versuch 02] -Die Auswahl eines LLMs im Unternehmenskontext folgt nicht nur der Modellqualität, sondern auch Randbedingungen. Für diese Arbeit werden die folgenden Kriterien als handlungsleitend betrachtet: +Quelle: `Versuche/Versuch 02/Tools/agents/iso29148-master-orchestrator-agent.md` -- **Kontextfenster und Eingabekosten:** Große Artefakte erfordern Segmentierung; zu kleine Kontextfenster erhöhen den Retrieval-Aufwand. -- **Codefähigkeit:** Verständnis von Identifiern, Kontrollfluss, Datenzugriffsmustern und typischen Framework-Idiomen. -- **Steuerbarkeit:** Möglichkeiten zur Formatsteuerung (z. B. JSON-Outputs), deterministische Parameter, Prompt-Constraints. -- **Betriebs- und Datenschutzanforderungen:** Umgang mit Quellcode als potenziell vertraulichem Material. -- **Reproduzierbarkeit:** Versionierung von Modell, Prompt, Retrieval-Konfiguration. +````md +# Enhanced ISO 29148 Master Orchestrator Agent with Milestone System -Survey- und SLR-Arbeiten zu LLMs im Software Engineering betonen, dass Nutzen stark davon abhängt, wie Modelle in Toolchains integriert und abgesichert werden @fan2023llmse @llm4se2024slr @llm4se2024survey. Diese Perspektive prägt die Technologieauswahl in Kapitel 5. +You are the Lead Requirements Analyst coordinating the complete ISO/IEC/IEEE 29148 requirements extraction with comprehensive documentation, quality assurance, and milestone-based execution control. -#heading(level: 3)[Konfiguration: Parameter und Prompting] +## Your Mission +Orchestrate a complete requirements analysis using all three ISO 29148 levels, ensuring consistency, completeness, and traceability. Create executive-level documentation and ensure all agents produce their complete documentation packages. **NEW**: Provide milestone-based pause/resume capabilities for long-running analyses. -Da LLM-Ausgaben sensitiv auf Prompting und Sampling reagieren, wird eine konservative Konfiguration gewählt: +## CRITICAL: Documentation Requirements +**You MUST ensure:** +1. Each agent creates their complete documentation package +2. You create the integrated master document +3. All work is saved to `/docs/requirements/` +4. Complete traceability is maintained +5. Executive dashboards and reports are generated +6. **NEW**: Milestone state is persisted for pause/resume functionality +7. VERIFY each agent has created their files before proceeding -- **Niedrige Temperatur** zur Reduktion von Varianz. -- **Explizite Ausgabeformate** (Templatepflicht, strukturierte Felder). -- **Beleganforderungen** (z. B. „nennen Sie Datei + Funktion/SQL“). -- **Stop-Kriterien** (bei fehlenden Belegen: offene Frage statt Behauptung). +## NEW: Milestone System Architecture -Chain-of-Thought-Strategien können die Qualität komplexer Ableitungen steigern, erhöhen im Requirements-Kontext jedoch das Risiko, dass Begründungen als Evidenz missverstanden werden. In dieser Arbeit werden Begründungen daher nur als Hilfsmittel akzeptiert, nicht als Beleg @wei2022cot. +### Milestone Configuration +```json +{ + "project_name": "[Project Name]", + "execution_id": "[UUID]", + "created_at": "[ISO DateTime]", + "milestones": { + "M0_SETUP": { + "name": "Project Analysis and Setup", + "status": "pending|in_progress|completed|failed", + "started_at": null, + "completed_at": null, + "dependencies": [], + "outputs": ["project_structure.json", "directory_setup.txt"] + }, + "M1_STAKEHOLDER": { + "name": "Stakeholder Requirements Analysis", + "status": "pending", + "started_at": null, + "completed_at": null, + "dependencies": ["M0_SETUP"], + "outputs": [ + "StRS_Complete.md", + "StRS_Summary.md", + "StRS_Traceability.csv", + "StRS_Diagrams.md", + "StRS_Evidence.md" + ] + }, + "M2_SYSTEM": { + "name": "System Requirements Analysis", + "status": "pending", + "started_at": null, + "completed_at": null, + "dependencies": ["M1_STAKEHOLDER"], + "outputs": [ + "SyRS_Complete.md", + "SyRS_Summary.md", + "SyRS_API_Specification.yaml", + "SyRS_Architecture.md", + "SyRS_Interfaces.md", + "SyRS_Traceability.csv" + ] + }, + "M3_SOFTWARE": { + "name": "Software Requirements Analysis", + "status": "pending", + "started_at": null, + "completed_at": null, + "dependencies": ["M2_SYSTEM"], + "outputs": [ + "SwRS_Complete.md", + "SwRS_CodeCatalog.md", + "SwRS_Algorithms.md", + "SwRS_DataModel.md", + "SwRS_TestSpecification.md", + "SwRS_Traceability.csv" + ] + }, + "M4_PATTERNS": { + "name": "Code Pattern Analysis", + "status": "pending", + "started_at": null, + "completed_at": null, + "dependencies": ["M3_SOFTWARE"], + "outputs": [ + "Analysis_Complete.md", + "Pattern_Catalog.csv", + "Business_Rules.md", + "Validation_Rules.md", + "Security_Patterns.md", + "Performance_Patterns.md", + "Integration_Patterns.md" + ] + }, + "M5_INTEGRATION": { + "name": "Integration and Master Documentation", + "status": "pending", + "started_at": null, + "completed_at": null, + "dependencies": ["M1_STAKEHOLDER", "M2_SYSTEM", "M3_SOFTWARE", "M4_PATTERNS"], +```` +Hinweis: Der Auszug endet nach Zeile 100; die Originaldatei umfasst 620 Zeilen und ist an dieser Stelle nicht zu Ende. -#heading(level: 3)[Retrieval-Strategie und Kontextfenstersteuerung] +#heading(level: 3)[Beispielhafte Ergebnisanforderungen] -RAG wird in dieser Arbeit als zentrales Skalierungsprinzip betrachtet @lewis2020rag. Die Kontextfenstersteuerung folgt einer einfachen Heuristik: +Quellen: -1. Suche nach relevanten Stellen (Keywords, Identifier, Datenobjekte). -2. Ergänzung um Nachbarschaftskontext (z. B. Aufrufer, SQL-Definition, UI-String). -3. Begrenzung der Kontextmenge durch Ranking und Redundanzfilter. +- `Versuche/Versuch 02/Ergenisse/system/SyRS_Complete.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_Complete.md` -Wichtig ist, dass Retrieval nicht „Wahrheit“ garantiert. Es liefert lediglich die evidenznahe Basis, an die Generierung gekoppelt wird. Daraus folgt, dass Retrieval-Konfigurationen (Chunkgröße, Overlap, Ranking) dokumentiert werden müssen, um Ergebnisse reproduzierbar zu halten. +```text +**SyR-001**: The system SHALL implement a multi-layered architecture with clear separation of concerns. +**SyR-002**: The system SHALL implement the ILogic interface pattern with dual implementations. +``` -#heading(level: 2)[Stakeholder-Einbindung und Datengrundlage] +```text +**SW-FUNC-001**: The software SHALL provide comprehensive account management functionality. +**SW-API-001**: The software SHALL provide comprehensive REST API. +``` -#heading(level: 3)[Stakeholderrollen und Verantwortlichkeiten] +#heading(level: 3)[Einordnung] -LLM-gestützte Requirements-Rückgewinnung ist ohne Domänenvalidierung nicht belastbar. Für die Fallstudie werden daher Stakeholderrollen unterschieden: +Versuch 02 lieferte die staerkste formale Konsolidierung (StRS/SyRS/SwRS, hohe Traceability), erwies sich fuer die Gesamtentdeckung jedoch als vergleichsweise rigide. -- **Fachexperten (Domäne/Support):** kennen Ausnahmen, Kundenvarianten und Abläufe. -- **Entwickler/Architekten:** ordnen Codeartefakte ein und bewerten technische Machbarkeit. -- **Produktverantwortliche:** priorisieren Requirements in Bezug auf Migrationsziel und Wertbeitrag. +#heading(level: 2)[Versuch 03] -Die Beteiligung dient nicht nur der Korrektur von Detailfragen, sondern der Abgrenzung von Soll- und Ist-Zustand. Gerade Legacy-Systeme enthalten historisch gewachsene Workarounds, die fachlich nicht zwingend gewünscht sind @bisbal1999legacy. +#heading(level: 3)[Allgemeine Beschreibung] -#heading(level: 3)[Interviewleitfaden und Workshopformat] +Versuch 03 erweitert das Vorgehen aus Versuch 02 um MCP-Server, um neben formaler Strukturierung vor allem die Discovery-Breite zu vergroessern (Use-Case-Fund, Gap-Analyse). -Die Stakeholder-Einbindung wird als Kombination aus Interviews und Validierungsworkshops strukturiert. Ein schlanker Leitfaden fokussiert auf: +#heading(level: 3)[Konfiguration] -- kritische Geschäftsobjekte und Statusmodelle, -- typische Fehlerfälle und Ausnahmen, -- Sicherheits- und Complianceanforderungen, -- Integrationen und Schnittstellen, -- Kriterien für „Done“ in der Migration (Abnahmelogik). +- Claude Code CLI lokal + VS Code, +- Agenten-Dateien in `Versuche/Versuch 03/Tools/Agents/`, +- MCP-Server gemaess Protokoll: Serena MCP, Windows-MCP (AutoIt-basiert), MSSQL MCP. -Workshops dienen der Konsolidierung: Requirements werden mit Belegen präsentiert, offene Punkte markiert und Entscheidungen (z. B. „Ist-Übernahme“ vs. „Soll-Anpassung“) festgehalten. Dieses Vorgehen ist konsistent mit RE-Standards, die Validierung und Stakeholderabstimmung als zentrale Schritte behandeln @iso29148_2018. +#heading(level: 3)[Verwendeter Prompt] -#heading(level: 3)[Datengrundlage und Umgang mit sensiblen Informationen] +```text +Please analyze this software project and write a reuqirements specification according to modern standards. +Use Agents and MCP servers wherever possible. +Keep superflous texts to a minimum and concentrate on actual requirements. +``` -Die Datengrundlage umfasst Quellcode und begleitende Projektartefakte. Aus Governance-Sicht ist Quellcode als sensibel zu betrachten. Daraus folgt: +#heading(level: 3)[Tools und Agenten] + +Beispiele aus dem Versuchsordner: + +- `centron-documentation-writer.md` +- `nhibernate-query-reviewer.md` +- `centron-code-reviewer.md` +- `webservice-developer.md` + +#heading(level: 3)[Agentenbeispiel (Auszug, erste 100 Zeilen) - Versuch 03] + +Quelle: `Versuche/Versuch 03/Tools/Agents/nhibernate-query-reviewer.md` + +````md +--- +name: nhibernate-query-reviewer +description: Reviews NHibernate queries and LINQ expressions for c-entron.NET. Detects N+1 queries, cartesian products, and compatibility issues. Use when writing complex queries or experiencing performance problems. Keywords: NHibernate, LINQ, query, performance, N+1, optimization, Fetch. +--- + +# NHibernate Query Reviewer Agent + +> **Type**: Review / Analysis +> **Purpose**: Review database queries to ensure efficiency, proper structure, and compatibility with NHibernate's LINQ provider limitations. + +## Agent Role + +You are a specialized **NHibernate Query Reviewer** for the c-entron.NET solution, focused on query optimization and performance. + +### Primary Responsibilities + +1. **N+1 Detection**: Identify and fix lazy loading issues that cause multiple database roundtrips +2. **Performance Analysis**: Review queries for cartesian products, missing indexes, and inefficient patterns +3. **NHibernate Compatibility**: Ensure LINQ expressions translate correctly to SQL +4. **Best Practices**: Enforce soft delete filtering, eager loading strategies, and proper transaction usage + +### Core Capabilities + +- **N+1 Query Detection**: Identify lazy loading in loops causing performance degradation +- **Cartesian Product Prevention**: Detect multiple Fetch operations on collections +- **LINQ Compatibility**: Validate expressions work with NHibernate's LINQ provider +- **Optimization Recommendations**: Suggest Fetch, FetchMany, Future queries for better performance +- **Soft Delete Validation**: Ensure all queries filter IsDeleted records + +## When to Invoke This Agent + +This agent should be activated when: +- Complex LINQ queries are written +- Performance issues suspected with database access +- Need query optimization recommendations +- Validating NHibernate compatibility of LINQ expressions +- Reviewing data access code for N+1 problems +- Before committing database access code + +**Trigger examples:** +- "Review this query for N+1 problems" +- "Optimize the GetAccountContracts query" +- "Check if this LINQ expression will work with NHibernate" +- "Why is my query slow?" + +## Technology Adaptation + +**IMPORTANT**: This agent adapts to c-entron.NET's NHibernate configuration. + +**Configuration Source**: [CLAUDE.md](../../CLAUDE.md) + +Before beginning work, review CLAUDE.md for: +- **ORM**: NHibernate 5.x with FluentNHibernate +- **Database**: SQL Server 2019+ +- **Pattern**: Always filter !x.IsDeleted +- **Eager Loading**: Fetch/FetchMany for navigation properties +- **Future Queries**: Batch loading for multiple collections +- **Transactions**: Required for all modifications + +## Instructions & Workflow + +### Standard Procedure + +1. **Load Relevant Lessons Learned** ⚠️ **IMPORTANT** + + As a review and analysis agent, start by loading past lessons: + + - Use Serena MCP `list_memories` to see available memories + - Use `read_memory` to load relevant past findings: + - `"lesson-query-*"` - Query optimization lessons + - `"pattern-nhibernate-*"` - NHibernate patterns + - `"lesson-performance-*"` - Performance findings + - Apply insights from past lessons throughout review + - This prevents repeating past N+1 mistakes + +2. **Context Gathering** + - Review [CLAUDE.md](../../CLAUDE.md) for NHibernate patterns + - Use Serena MCP `find_symbol` to locate query implementations + - Use Serena MCP `find_referencing_symbols` to understand query usage + - Identify query complexity and data access patterns + +3. **Query Analysis** + - Check for N+1 query patterns (lazy loading in loops) + - Verify soft delete filtering (!x.IsDeleted) + - Validate LINQ expression compatibility + - Look for cartesian products (multiple Fetch on collections) + - Check transaction usage for modifications + - **Apply insights from loaded lessons** + +4. **Optimization** + - Suggest Fetch/FetchMany for eager loading + - Recommend Future queries for multiple collections + - Propose projection for limited data needs + - Identify missing indexes + - **Check recommendations against past patterns** + +5. **Verification** + - Estimate performance impact + - Verify proposed optimizations don't introduce new issues + - Use `/optimize` command for additional suggestions +```` +Hinweis: Der Auszug endet nach Zeile 100; die Originaldatei umfasst 284 Zeilen und ist an dieser Stelle nicht zu Ende. + +#heading(level: 3)[Beispielhafte Ergebnis-Use-Cases] + +Quelle: `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.md` + +```text +### 2. Click Counter Management (Usage-Based Billing) +**Purpose**: Retrieve current meter readings for click counter devices +**Use Cases**: Copy machines, printers, industrial equipment with usage meters +Method: LoadCounterAsync(List contractsI3D) +``` + +```text +**Use Case**: Track counter reading trends, detect anomalies +Method: IAutomatedBillingLogic.GetCounterHistory(List lstParam) +``` + +#heading(level: 3)[MCP-Server: Detaillierte Beschreibung] + +#heading(level: 4)[MCP-Grundprinzip] + +Model Context Protocol (MCP) definiert eine standardisierte Kopplung zwischen einem Host (hier: Claude Code), einem MCP-Client und einem oder mehreren MCP-Servern. Server stellen dabei typischerweise drei Artefaktarten bereit: `tools` (aufrufbare Funktionen), `resources` (lesbare Kontexte) und `prompts` (wiederverwendbare Prompt-Bausteine). Dieses Modell wurde in Versuch 03 genutzt, um ueber den reinen Repository-Kontext hinaus weitere Wissens- und Interaktionskanaele einzubinden @mcp_intro_2026. + +#heading(level: 4)[Serena MCP] + +Serena ist ein MCP-Server fuer semantische Code-Retrieval- und Editieroperationen auf Symbol-Ebene (z. B. `find_symbol`, `find_referencing_symbols`, `insert_after_symbol`). Im Unterschied zu rein textbasierter Suche werden Codeobjekte (Klassen, Methoden, Referenzen) strukturell adressiert. In Versuch 03 wurde Serena vor allem fuer gezielte Modulnavigation und die persistenten Memory-Notizen zwischen Analyseiterationen eingesetzt @serena_mcp_2026 @mcp_servers_repo_2026. + +#heading(level: 4)[Windows-MCP (AutoIt-basiert)] + +Der im Protokoll genannte Windows-MCP-Ansatz (AutoIt-basiert) realisiert Desktop-Automatisierung ueber MCP. Laut Projektbeschreibung kapselt der Server AutoIt-Funktionen als MCP-Tools und bietet zusaetzlich Ressourcen (Dateizugriff, Screenshots) sowie Prompt-Templates fuer typische Automationsaufgaben. Fuer die Fallstudie ist das relevant, weil GUI-basierte Pfade (Dialoge, Formulare, visuelle Workflows) nicht nur aus Quellcode, sondern auch aus Interaktionsablaeufen rekonstruiert werden koennen @windows_mcp_autoit_2026. + +#heading(level: 4)[MSSQL MCP] + +MSSQL MCP ermoeglicht den kontrollierten Zugriff auf Microsoft SQL Server ueber MCP. Typische Funktionen sind Tabellenauflistung, Schema-Inspektion, Lesen von Inhalten und kontrollierte SQL-Ausfuehrung. Die dokumentierten Security-Hinweise betonen Least-Privilege-Berechtigungen, restriktive Verbindungskonfigurationen und Logging. In Versuch 03 wurde dieser Zugriff fuer die funktionale Absicherung von Datenmodellen und Use-Case-Hypothesen genutzt @mssql_mcp_2026. + +#heading(level: 3)[Einordnung] + +Durch die MCP-Erweiterung konnte Versuch 03 die funktionale Breite deutlich steigern und einen grossen Dokumentations-Gap sichtbar machen. Gegenueber Versuch 02 sinkt dabei der formale ISO-Fokus, was fuer Discovery jedoch methodisch beabsichtigt war. + +#heading(level: 2)[Quellenhinweis] + +Die fuer dieses Kapitel genutzten Webquellen zu Claude Code und MCP-Servern sind im Literaturverzeichnis als Online-Quellen erfasst; die inhaltliche Referenzierung erfolgt direkt im Text der Abschnitte zu Versuch 03. -- Trennung zwischen Artefakten, die für Retrieval/Prompts verwendet werden dürfen, und solchen, die ausgeschlossen werden (z. B. Zugangsdaten). -- Protokollierung, welche Artefakte in einen Prompt eingeflossen sind. -- Minimierung von Kontext (Need-to-know), um Datenabflussrisiken zu reduzieren. -Diese Maßnahmen werden in Kapitel 5 konkretisiert, da dort die Toolchain-Integration und der Umgang mit Logging, Prompt-Historien und IP-Aspekten umgesetzt werden. diff --git a/Kapitel/05_prototypische_umsetzung.typ b/Kapitel/05_prototypische_umsetzung.typ index 134f620..185234b 100644 --- a/Kapitel/05_prototypische_umsetzung.typ +++ b/Kapitel/05_prototypische_umsetzung.typ @@ -4,126 +4,174 @@ #hide(bibliography("../literatur.bib", style: "apa")) ] -#heading(level: 1)[Prototypische Umsetzung (ca. 10 Seiten)] +#heading(level: 1)[Ergebnisse (ca. 10 Seiten)] -Dieses Kapitel beschreibt die prototypische Umsetzung des in Kapitel 4 definierten Vorgehens. Ziel ist ein Workflow, der (1) Code- und Projektartefakte analysiert, (2) daraus strukturierte Requirements ableitet, (3) Belege und Unsicherheiten explizit erfasst und (4) die Ergebnisse so bereitstellt, dass sie in eine Migration überführt werden können. Die Umsetzung wird nicht als „vollautomatische Requirements-Generierung“ verstanden, sondern als Assistenzsystem mit klaren Kontrollpunkten. +Dieses Kapitel dokumentiert die tatsaechlich erzeugten Ergebnisse der drei Versuche (V01-V03). Neben den Kennzahlen werden die Ergebnisartefakte aus den jeweiligen Ergebnisverzeichnissen strukturiert aufgelistet und durch exemplarische Requirements bzw. Use Cases belegt. -#heading(level: 2)[Architektur des LLM-Agenten] +#heading(level: 2)[Ergebnisueberblick] -#heading(level: 3)[Architekturüberblick] +#table( + columns: (1fr, 1fr, 1fr, 1fr), + stroke: 0.4pt, + [**Kennzahl**], [**V01**], [**V02**], [**V03**], + [Konsolidierte Anforderungen/Faehigkeiten], [277], [220], [1720], + [Formale Anforderungen (StRS+SyRS+SwRS)], [277], [220], [0], + [Explizite Use Cases], [0], [46], [1720], + [Undokumentierte Use Cases], [n.v.], [n.v.], [1211], + [ISO-29148-Compliance], [qualitativ A+], [96,1%], [n.v.], + [Traceability], [100% laut Doku], [100% bidirektional], [n.v.], + [Ergebnisdateien gesamt], [11], [37], [30] +) -Der Prototyp folgt einer Pipeline-Architektur, die Analyse, Retrieval und Generierung entkoppelt. Damit wird die Komplexität kontrollierbar und einzelne Komponenten können iterativ verbessert werden. Der Agent ist in vier Schichten gegliedert: +#heading(level: 2)[V01 Ergebnisse (Baseline)] -1. **Ingestion-Schicht:** Sammeln und Vorverarbeiten von Artefakten. -2. **Retrieval-Schicht:** Auswahl relevanter Kontexte (RAG) zur Skalierung über große Repositories. -3. **Reasoning-/Generation-Schicht:** LLM-gestützte Ableitung und Strukturierung der Requirements. -4. **Traceability- und Output-Schicht:** Persistenz, Belege, Review-Export. +#heading(level: 3)[Ergebnisdateien in `Versuche/Versuch 01/Ergebnisse`] -Retrieval-Augmented Generation ist in dieser Architektur das zentrale Prinzip, um mit begrenzten Kontextfenstern umzugehen und Aussagen an konkrete Belege zu binden @lewis2020rag. +- `Versuche/Versuch 01/Ergebnisse/Centron_Software_Requirements_Specification.md` +- `Versuche/Versuch 01/Ergebnisse/Centron_Software_Requirements_Specification.pdf` +- `Versuche/Versuch 01/Ergebnisse/complete-iso29148-requirements-specification.md` +- `Versuche/Versuch 01/Ergebnisse/ISO29148_Complete_Requirements_Specification.md` +- `Versuche/Versuch 01/Ergebnisse/iso29148-integrated-requirements-analysis.md` +- `Versuche/Versuch 01/Ergebnisse/iso29148-integrated-requirements-analysis.pdf` +- `Versuche/Versuch 01/Ergebnisse/nhibernate-orm-analysis.md` +- `Versuche/Versuch 01/Ergebnisse/software/SwRS_Complete_Detailed.md` +- `Versuche/Versuch 01/Ergebnisse/software/SwRS_Complete_Detailed.pdf` +- `Versuche/Versuch 01/Ergebnisse/system/SyRS_Complete_Detailed.md` +- `Versuche/Versuch 01/Ergebnisse/system/SyRS_Complete_Detailed.pdf` -#heading(level: 3)[Ingestion: Artefaktaufbereitung und Chunking] +#heading(level: 3)[Beispielhafte Requirements aus den Ergebnisdateien] -Die Ingestion-Schicht übernimmt: +```text +StR-001: Comprehensive Customer Account Management +Statement: The system shall provide comprehensive customer account management capabilities... +(Quelle: ISO29148_Complete_Requirements_Specification.md) +``` -- Erfassung von Quellcode, Konfigurationen, UI-Strings, SQL-Artefakten und Projektdokumenten, -- Normalisierung von Encodings und Metadaten (Pfad, Modul, Änderungsdatum), -- Segmentierung in semantische Einheiten (z. B. Klasse/Methode, SQL-Statement, Konfigblock), -- Ablage in einem Index, der später Retrieval ermöglicht. +```text +FR-001: User Authentication System +Requirement: The system shall provide secure user authentication... +(Quelle: system/SyRS_Complete_Detailed.md) +``` -Die Segmentierung verfolgt ein Ziel: Kontext soll klein genug sein, um präzise zu sein, aber groß genug, um Regeln nicht aus dem Zusammenhang zu reißen. Für Legacy-Code bedeutet dies typischerweise, dass neben einer Regelstelle auch angrenzende Strukturen (z. B. Statusenum, Datenobjektdefinition) berücksichtigt werden müssen. +#heading(level: 2)[V02 Ergebnisse (ISO-Konsolidierung mit Agenten)] -#heading(level: 3)[Retrieval: Kontextauswahl und Ranking] +#heading(level: 3)[Ergebnisdateien in `Versuche/Versuch 02/Ergenisse`] -Retrieval ist als zweistufiges Verfahren umgesetzt: +- `Versuche/Versuch 02/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.md` +- `Versuche/Versuch 02/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.pdf` +- `Versuche/Versuch 02/Ergenisse/README.md` +- `Versuche/Versuch 02/Ergenisse/TABLE_FORMATTING_STATUS.md` +- `Versuche/Versuch 02/Ergenisse/.execution_state/baseline_metrics.json` +- `Versuche/Versuch 02/Ergenisse/.execution_state/directory_setup.txt` +- `Versuche/Versuch 02/Ergenisse/.execution_state/milestone_state.json` +- `Versuche/Versuch 02/Ergenisse/.execution_state/project_structure.json` +- `Versuche/Versuch 02/Ergenisse/master/ISO29148_Executive_Summary.md` +- `Versuche/Versuch 02/Ergenisse/master/ISO29148_Master_Requirements.md` +- `Versuche/Versuch 02/Ergenisse/master/ISO29148_Quality_Report.md` +- `Versuche/Versuch 02/Ergenisse/master/ISO29148_Traceability_Master.csv` +- `Versuche/Versuch 02/Ergenisse/master/ISO29148_Validation_Checklist.md` +- `Versuche/Versuch 02/Ergenisse/software/Analysis_Complete.md` +- `Versuche/Versuch 02/Ergenisse/software/Business_Rules.md` +- `Versuche/Versuch 02/Ergenisse/software/Integration_Patterns.md` +- `Versuche/Versuch 02/Ergenisse/software/Pattern_Catalog.csv` +- `Versuche/Versuch 02/Ergenisse/software/Performance_Patterns.md` +- `Versuche/Versuch 02/Ergenisse/software/Security_Patterns.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_Algorithms.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_CodeCatalog.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_Complete.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_DataModel.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_TestSpecification.md` +- `Versuche/Versuch 02/Ergenisse/software/SwRS_Traceability.csv` +- `Versuche/Versuch 02/Ergenisse/software/Validation_Rules.md` +- `Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Complete.md` +- `Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Diagrams.md` +- `Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Evidence.md` +- `Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Summary.md` +- `Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Traceability.csv` +- `Versuche/Versuch 02/Ergenisse/system/SyRS_API_Specification.yaml` +- `Versuche/Versuch 02/Ergenisse/system/SyRS_Architecture.md` +- `Versuche/Versuch 02/Ergenisse/system/SyRS_Complete.md` +- `Versuche/Versuch 02/Ergenisse/system/SyRS_Interfaces.md` +- `Versuche/Versuch 02/Ergenisse/system/SyRS_Summary.md` +- `Versuche/Versuch 02/Ergenisse/system/SyRS_Traceability.csv` -1. **Kandidatensuche:** Identifier, Domänenterminologie, Datenobjekte, UI-Labels und Query-Fragmente erzeugen eine erste Trefferliste. -2. **Ranking und Kontextbündelung:** Treffer werden nach Nähe zum Untersuchungsziel (z. B. „Fakturierung“, „Berechtigung“) sortiert und als Kontextpakete zusammengeführt. +#heading(level: 3)[Beispielhafte Requirements aus den Ergebnisdateien] -Damit wird vermieden, dass LLMs ohne ausreichende Belege „auffüllen“. Gleichzeitig bleibt das System flexibel: Neue Untersuchungsfragen können durch andere Retrieval-Queries adressiert werden, ohne dass die gesamte Pipeline angepasst werden muss. +```text +SyR-001: The system SHALL implement a multi-layered architecture with clear separation of concerns. +(Quelle: Ergenisse/system/SyRS_Complete.md) +``` -#heading(level: 3)[Requirements-Extraktion und Traceability-Datenmodell] +```text +SyR-013: The system SHALL provide secure user authentication with multi-factor authentication support. +(Quelle: Ergenisse/system/SyRS_Complete.md) +``` -Die Generation-Schicht erzeugt Requirements nicht als Freitext, sondern als strukturierte Einträge. Ein Eintrag umfasst mindestens: +```text +SW-ARCH-001: The software SHALL implement a 6-layer architecture pattern. +(Quelle: Ergenisse/software/SwRS_Complete.md) +``` -- **Requirement-Text** (präzise, testbar), -- **Akzeptanzkriterien** (Prüfidee, Mess- oder Beobachtbarkeit), -- **Belege** (Dateipfade, Funktionen, SQL-Statements, UI-Strings), -- **Unsicherheit** (Markierung fehlender Evidenz oder konkurrierender Interpretationen), -- **Tags** (Domänenbereich, Datenobjekte, Risiko). +#heading(level: 2)[V03 Ergebnisse (Discovery-Erweiterung mit Agenten und MCP)] -Traceability ist dabei ein zentrales Designkriterium. Die Literatur beschreibt Traceability als Voraussetzung, um Anforderungen über Lebenszyklen hinweg zu begründen und zu pflegen @gotel1994traceability @ramesh2001traceability. Für den Prototyp bedeutet dies: Der Agent darf Requirements nicht „aus dem Nichts“ formulieren, sondern muss die Verbindung zu den Artefakten als Primäroutput liefern. +#heading(level: 3)[Ergebnisdateien in `Versuche/Versuch 03/ERP_DOCUMENTATION`] -#heading(level: 2)[Toolchain-Integration] +- `Versuche/Versuch 03/ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR_MIT_DB_MAPPING.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/COMPLETE_DATABASE_SCHEMA.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/EXPORT_COMPLETE_SCHEMA.sql` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/README_USE_CASE_ANALYSIS.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/README.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_ANALYSIS_SUMMARY.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_PROJECT_INDEX.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_REST_API.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_WORKFLOWS.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASE_ANALYSIS_README.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASE_MAPPING.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.pdf` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.pdf` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_CONTROLLERS.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_GUI_MAPPING.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_IMPLEMENTATION_GUIDE.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_XAML_TEMPLATES.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.md` +- `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.pdf` -#heading(level: 3)[Integration in Repository und Entwicklungsworkflow] +#heading(level: 3)[Beispielhafte Use Cases aus den Ergebnisdateien] -Die Toolchain-Integration zielt darauf, Analyseergebnisse in vorhandene Arbeitsabläufe zu integrieren. Dazu gehören: +```text +1.1.1 Personalized User Welcome +Purpose: Display personalized greeting with user name and context-aware dashboard content. +(Quelle: ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md) +``` -- **Repository-Integration:** Analyse auf einem definierten Stand (Commit/Tag), um Reproduzierbarkeit sicherzustellen. -- **Versionierung von Prompts und Konfigurationen:** Prompt-Templates, Retrieval-Parameter und Modellversionen werden dokumentiert, damit Ergebnisse nachvollziehbar bleiben. -- **Ergebnisablage:** Requirements werden in einem Format abgelegt, das Reviews ermöglicht (z. B. Markdown, Tabellenexport) und später in Tickets oder Spezifikationen überführt werden kann. +```text +1.1.6 Work Status Alerts +Purpose: Alert users to missing or incomplete work time entries. +(Quelle: ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md) +``` -Reproduzierbarkeit ist in diesem Kontext nicht nur ein wissenschaftliches Kriterium, sondern eine praktische Voraussetzung: Ohne klare Zuordnung zu einem Code-Stand entsteht bei späteren Änderungen ein nicht auflösbarer Interpretationskonflikt. +```text +Key Finding: 1,720+ use cases discovered; current documentation gap: 71%. +(Quelle: ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md) +``` -#heading(level: 3)[Einbindung in Wissens- und Ticket-Systeme] +#heading(level: 2)[Ergebnisfazit] -In Modernisierungsvorhaben sind Ticketsysteme und Wissensbasen zentrale Koordinationspunkte. Der Prototyp ist so konzipiert, dass Requirements: +Die Ergebnislage zeigt drei komplementaere Stufen: -- als Backlog-Einträge überführt werden können, -- mit Belegen verlinkt sind (Pfad + Stelle), -- Review-Kommentare aufnehmen können, -- als konsolidierte Spezifikation exportierbar bleiben. +- **V01** liefert eine belastbare formale Baseline. +- **V02** liefert die staerkste ISO-29148-konforme Konsolidierung mit hoher Traceability. +- **V03** liefert die groesste funktionale Breite und identifiziert den groessten Dokumentations-Gap. -Die Integration ist bewusst „leichtgewichtig“ gehalten: Ziel ist nicht, ein neues Requirements-Tool zu ersetzen, sondern die Lücke der fehlenden Legacy-Spezifikation zu schließen und die Migration mit belegbaren Requirements zu stabilisieren. - -#heading(level: 3)[Logging, Nachvollziehbarkeit und Qualitätsmetriken] - -Da LLMs nicht deterministisch sind, wird Logging als Qualitätsinstrument verstanden. Pro Analysezyklus werden mindestens gespeichert: - -- Scope-Definition, -- verwendete Artefaktlisten und Retrieval-Treffer, -- Promptversion und Modellparameter, -- Rohoutput des Modells, -- konsolidierter Requirement-Eintrag und Review-Status. - -Diese Daten erlauben es, Fehlerquellen zu identifizieren (z. B. falscher Kontext, widersprüchliche Belege) und den Prozess iterativ zu verbessern. Gleichzeitig muss Logging gegen Datenschutz- und IP-Risiken abgewogen werden (siehe 5.3). - -#heading(level: 2)[Governance, Datenschutz und IP] - -#heading(level: 3)[Risiko- und Maßnahmenmodell] - -Der Einsatz von LLMs im Kontext von Quellcode berührt Governance-Fragen. In der Literatur wird betont, dass große Sprachmodelle systemische Risiken wie Bias, Fehlverhalten und fehlende Transparenz aufweisen können @bender2021stochastic. Für die Fallstudie sind insbesondere folgende Risikoklassen relevant: - -- **Falschaussagen/Halluzinationen:** plausibel klingende, aber unbelegte Requirements @ji2023hallucination. -- **Datenabfluss:** unbeabsichtigte Preisgabe von Quellcode oder Betriebsinformationen. -- **IP- und Lizenzrisiken:** unklare Rechte bei Weiterverarbeitung, Speicherung oder externem Modellbetrieb. -- **Compliance:** Anforderungen aus Datenschutz oder Sicherheit, die in der Zielplattform nachweisbar erfüllt werden müssen. - -Das Maßnahmenmodell kombiniert technische, organisatorische und prozessuale Kontrollen: - -- Belegpflicht und Review, -- Minimierung des Kontexts (Need-to-know), -- Zugriffskontrollen auf Indizes und Logs, -- Trennung von sensiblen Artefakten (z. B. Secrets) aus dem Analyseumfang. - -#heading(level: 3)[Datenschutzorientierte Konfiguration und Datenminimierung] - -Datenschutzanforderungen werden im Prototyp durch Datenminimierung operationalisiert. Praktisch bedeutet dies: - -- Keine Analyse von Artefakten, die Zugangsdaten oder personenbezogene Inhalte enthalten. -- Begrenzte Promptkontexte: nur die für die Fragestellung relevanten Codeausschnitte. -- Reduzierte Speicherung: Prompt-Logs werden, wenn erforderlich, nur mit Hashes/Metadaten gespeichert, nicht als vollständige Inhalte. - -Für den praktischen Einsatz ist zudem zu klären, ob Modelle lokal (On-Premise) oder als Cloud-Service betrieben werden. Diese Arbeit bewertet den Prototyp so, dass beide Betriebsformen abbildbar bleiben. Die konkrete Wahl ist eine Governance-Entscheidung, die von Schutzbedarf, Kosten und Betriebsaufwand abhängt. - -#heading(level: 3)[IP, Verantwortlichkeit und Human-in-the-loop] - -Der Prototyp ist so gestaltet, dass fachliche Verantwortung nicht an das Modell delegiert wird. LLMs liefern Vorschläge, Strukturierung und Zusammenfassungen, aber keine autoritativen Spezifikationsentscheidungen. Diese Trennung ist notwendig, weil die Qualität der Ergebnisse von Kontext, Prompt und Modellverhalten abhängt und sich ohne Review nicht verlässlich absichern lässt. - -Für Requirements-Artefakte gelten daher folgende Prinzipien: - -- **LLM-Output ist ein Zwischenartefakt:** erst Review und Konsolidierung erzeugen „gültige“ Requirements. -- **Verantwortung liegt beim Projektteam:** insbesondere für Abnahmen und Architekturentscheidungen. -- **Transparenz durch Belege:** damit Entscheidungen nachvollziehbar bleiben und in der Migration überprüfbar sind. - -Damit ist die prototypische Umsetzung nicht als Ersatz für Requirements Engineering zu verstehen, sondern als skalierbares Werkzeug, das fehlende Legacy-Dokumentation durch belegbare, reviewbare Artefakte ergänzt. +Damit liegt eine vollstaendige empirische Grundlage fuer die anschliessende Evaluation (Kapitel 6) vor: formal-strukturierte Requirements (V01/V02) plus breite Discovery-Evidenz (V03). diff --git a/Kapitel/06_evaluation.typ b/Kapitel/06_evaluation.typ index 42e9ed9..81bb092 100644 --- a/Kapitel/06_evaluation.typ +++ b/Kapitel/06_evaluation.typ @@ -6,81 +6,119 @@ #heading(level: 1)[Evaluation (ca. 12 Seiten)] -Dieses Kapitel evaluiert die prototypische Durchführung des in Kapitel 4 beschriebenen Vorgehensmodells und die in Kapitel 5 skizzierte Toolchain-Umsetzung. Als Datenbasis dienen die im Ordner `Ergebnisse` abgelegten Artefakte (Requirements-Spezifikationen nach ISO/IEC/IEEE 29148, Use-Case-Dokumentation, UI↔Code-Mappings, Datenbankschema-Exports und Glossare). Der Fokus liegt auf der Frage, inwieweit die erzeugten Artefakte (1) strukturierte, prüfbare Requirements liefern, (2) Traceability ermöglichen und (3) den Analyseaufwand gegenüber rein manueller Rekonstruktion reduzieren. +Die Evaluation folgt der in Kapitel 4 beschriebenen Iterationslogik und bewertet die drei real durchgefuehrten Versuche (V01-V03) vergleichend. Ziel ist nicht die Darstellung eines einzelnen "besten" Laufs, sondern die Einordnung der methodischen Entwicklung von einer Baseline ueber eine formale ISO-Konsolidierung bis zur anschliessenden Discovery-Erweiterung. -#heading(level: 2)[Evaluationskriterien und Messgrößen] +#heading(level: 2)[Evaluationsdesign und Datenbasis] -Die Evaluationskriterien orientieren sich an den im Exposé definierten Messgrößen und an etablierten Qualitätsmerkmalen im Requirements Engineering @iso29148_2018 @ieee830_1998. Für KI-gestützte Extraktion wird zusätzlich berücksichtigt, dass plausible Textausgaben ohne Belegpflicht fachlich falsch sein können @ji2023hallucination @bender2021stochastic. +Die Auswertung basiert ausschliesslich auf den erzeugten Artefakten in: -Für die Arbeit werden die folgenden Kriterien operationalisiert: +- `Versuche/Versuch 01/Versuch01.md` und `Versuche/Versuch 01/Requirements.md`, +- `Versuche/Versuch 02/Versuch02.md` und `Versuche/Versuch 02/Requirements.md`, +- `Versuche/Versuch 03/Versuch03.md` und `Versuche/Versuch 03/Requirements.md`. -- **Vollständigkeit (relativ zum Scope):** Anteil der dokumentierten Requirements/Use Cases bezogen auf einen definierten Untersuchungsumfang (Module/Prozesse). Vollständigkeit wird in dieser Arbeit nicht als globale Eigenschaft der gesamten Legacy-Software verstanden, sondern als scopebezogene Abdeckung (z. B. pro Modulgruppe). Die Literatur weist darauf hin, dass Vollständigkeit durch Assistenzsysteme verbessert werden kann, aber nur in Verbindung mit Validierung und klarer Abgrenzung @luitel2024completeness. -- **Verständlichkeit und Prüfbarkeit:** Requirements gelten als prüfbar, wenn Akzeptanzkriterien bzw. Verifikationsansätze aus dem Text ableitbar sind. Als Indikator wird die formale Struktur nach ISO/IEC/IEEE 29148 genutzt (Soll-Formulierung, Begründung, Kriterien, Verifikation) @iso29148_2018. -- **Redundanzfreiheit und Konsistenz:** Identifikation doppelter oder widersprüchlicher Requirements. In der prototypischen Auswertung wird dies primär über Strukturprüfungen und Stichproben erfolgen; eine vollständige Duplikaterkennung erfordert zusätzliche, dedizierte Analyseschritte. -- **Traceability (Nachvollziehbarkeit):** Anteil der Requirements, die explizite Belege auf Artefakte enthalten (Datei-/Pfadverweise, Klassen, Methoden, SQL-Objekte, UI-Elemente). Traceability ist eine zentrale Voraussetzung für belastbare Weiterentwicklung und Evaluation @gotel1994traceability @ramesh2001traceability. -- **Stakeholder-Alignment:** Übereinstimmung der Ergebnisse mit Fachwissen und Prioritäten. Operationalisiert wird dies durch Review-Sessions (Bewertung, Korrekturen, Ergänzungen) und die Kennzeichnung offener Punkte. -- **Aufwandsreduktion:** Zeitbedarf der KI-gestützten Rekonstruktion im Vergleich zu einer manuellen Erstellung für den gleichen Scope. Da reale manuelle Baselines stark von Team- und Artefaktlage abhängen, werden in der Pilotphase gemessene Toolchain-Zeiten und dokumentierte Aufwandsschätzungen als Vergleichsanker genutzt. +Dabei wurden nur konsolidierte, in den Dateien ausgewiesene Kennzahlen uebernommen. Fokus der Bewertung: -#heading(level: 2)[Durchführung und Ergebnisse] +1. Umfang der rekonstruierten Faehigkeiten/Requirements, +2. Formalisierungsgrad (StRS/SyRS/SwRS vs. reine Use-Case-Discovery), +3. Traceability- und ISO-29148-Naehe, +4. methodischer Nutzen der eingesetzten Tooling-Konfiguration. -#heading(level: 3)[Untersuchungsgegenstand und Datenbasis] +#heading(level: 2)[Quantitative Ergebnisse der Versuchsreihe] -Die prototypische Durchführung basiert auf einer artefaktzentrierten Analyse der Legacy-Software und angrenzender Quellen. In den Ergebnisartefakten wird die Systemgröße unter anderem über folgende Kenngrößen beschrieben: +#table( + columns: (1fr, 1fr, 1fr, 1fr), + stroke: 0.4pt, + [**Kennzahl**], [**V01**], [**V02**], [**V03**], + [Konsolidierte Requirements/Faehigkeiten], [277], [220], [1720], + [Formale Requirements (StRS+SyRS+SwRS)], [277], [220], [0], + [StRS / SyRS / SwRS], [35 / 75 / 167], [84 / 53 / 83], [0 / 0 / 0], + [Explizite Use Cases], [0], [46], [1720 (Use-Case-fokussiert)], + [Undokumentierte Use Cases], [n.v.], [n.v.], [1211], + [ISO-29148-Compliance], [qualitativ A+], [96,1% (100% mandatory)], [n.v.], + [Traceability], [100% laut Doku], [100% bidirektional], [n.v.], + [Ergebnisdateien gesamt], [11], [37], [30] +) -- 34 Projekte und 849 Business-Logic-Klassen, -- 956 NHibernate-Mappings, -- 2.145 REST-Endpunkte, -- 135 WPF-Module (UI-Kontext). +Ergaenzende Kontextkennzahlen aus den Versuchsdateien: -Diese Größenordnungen sind für die Evaluation relevant, weil sie den Kontextdruck auf Kontextfenster und Retrieval (RAG) erklären und die Notwendigkeit strukturierter Traceability unterstreichen @lewis2020rag. +- V01: Analyse von 34 C\#-Projekten und 12.507+ Source Files. +- V02: 14.940 Dateien (13.717 C\#, 1.189 XAML, 34 Projekte), 46 explizite Use Cases in die formale Requirements-Struktur integriert. +- V03: 150.000+ LoC analysiert, 3.412 potenzielle Use Cases identifiziert, 71% dokumentationsbezogener Gap (1211 von 1720 Use Cases vormals undokumentiert). -#heading(level: 3)[Ablauf der prototypischen Auswertung] +#heading(level: 2)[Vergleichende Analyse] -Die Durchführung folgt der Logik aus Kapitel 4 (Scope → Artefaktpipeline → Extraktion → Traceability → Review). Für die prototypische Auswertung wurden die folgenden Artefaktgruppen erzeugt: +#heading(level: 3)[Versuch 01: Formale Baseline ohne Tooling-Erweiterung] -- **Requirements-Spezifikationen nach ISO/IEC/IEEE 29148:** Stakeholder-, System- und Software-Ebene mit Statement/Begründung/Verifikation und Belegangaben. -- **Use-Case-Dokumentation und Mapping:** Umfangreiche Modul- und Use-Case-Sammlungen, ergänzt um UI↔Code-Zuordnungen (WPF-Pfade, ViewModels, Controller, Rechtekonstanten). -- **Domänen- und Datenartefakte:** Business-Glossar sowie Datenbankschema-Exports zur Begriffs- und Datenmodellstabilisierung. -- **UI-basierte Discovery-Artefakte:** Screenshot-Mappings und Session-Reports für Teilbereiche der webbasierten Oberfläche (CentronNexus/ServiceBoard). +V01 zeigt, dass bereits ohne Agenten/MCP eine formal strukturierte Requirements-Spezifikation erzeugt werden kann. Die Staerke liegt in der klaren Dreiebenenstruktur (StRS/SyRS/SwRS). Die Schwaeche ist die begrenzte Discovery-Perspektive: explizite Use-Case-Rekonstruktion und Gap-Bewertung bleiben gering ausgepraegt. -Für die Bewertung werden die Artefakte strukturell geprüft (Vorhandensein der geforderten Felder), Kennzahlen aus den Dokumenten extrahiert und zentrale Aussagen stichprobenartig gegen die angegebenen Belege gespiegelt. +#heading(level: 4)[Prompt, Agenten und Ergebnisbeispiele (V01)] -#heading(level: 3)[Quantitative Ergebnisse] +- **Verwendeter Prompt:** "Please analyze this software project and write a reuqirements specification according to modern standards." +- **Agentenbeispiele:** Keine Agenten (bewusste Baseline ohne agentische Zerlegung und ohne MCP). +- **Beispielhafte Ergebnis-Requirements:** + - `Versuche/Versuch 01/Ergebnisse/ISO29148_Complete_Requirements_Specification.md`: u. a. `StR-001` (Comprehensive Customer Account Management). + - `Versuche/Versuch 01/Ergebnisse/system/SyRS_Complete_Detailed.md`: u. a. `FR-001` (User Authentication System) und `FR-002` (Role-Based Access Control). + - `Versuche/Versuch 01/Ergebnisse/software/SwRS_Complete_Detailed.md`: softwareseitige Architektur- und Umsetzungsanforderungen im SwRS-Format. -Die in `Ergebnisse` abgelegten Spezifikationen berichten insgesamt 277 dokumentierte Requirements (35 Stakeholder-, 75 System- und 167 Software-Requirements). In den detaillierten Artefakten liegen die folgenden, direkt prüfbaren Strukturindikatoren vor: +#heading(level: 3)[Versuch 02: ISO-orientierte Konsolidierung mit Agenten] -- **Stakeholder Requirements (StRS):** 35 Statements mit jeweils Akzeptanzkriterien, Source-Evidence und Verifikationsmethode. -- **System Requirements (SyRS):** 75 Statements mit Source-Evidence und Verifikationsmethode; Akzeptanzkriterien sind teilweise nicht einheitlich als eigenes Feld ausgewiesen. -- **Software Requirements (SwRS, detaillierter Ausschnitt):** 120 Requirements mit „Requirement Statement“, Akzeptanzkriterien, Source-Evidence und Verifikationsmethode. +V02 fokussiert die formale Konsolidierung und liefert eine ISO-29148-nahe Zielstruktur mit hoher Traceability. Mit 220 konsolidierten Requirements, 96,1% ISO-29148-Compliance und 100% bidirektionaler Traceability ist der Lauf methodisch sauber und reviewfaehig. Gleichzeitig zeigte sich die zentrale Grenze dieses Schritts: Die reine ISO-orientierte Ableitung war fuer den Gesamtumfang zu rigide und fuer die Discovery-Breite nicht vollumfaenglich genug. -Für die Use-Case- und Mapping-Ebene werden folgende Umfangs- und Abdeckungszahlen berichtet: +#heading(level: 4)[Prompt, Agenten und Ergebnisbeispiele (V02)] -- 103 dokumentierte Module (inkl. Submodule) mit 509 Use Cases über 15 Hauptkategorien. -- Mapping-Status in der Zusammenfassung: ca. 92% vollständig gemappt, ca. 6% teilweise gemappt, ca. 2% mit Klärungsbedarf. +- **Verwendeter Prompt:** "Please analyze this software project and write a ISO 29148 compliant reuqirements specification. Use Agents wherever possible." +- **Agentenbeispiele:** + - `Versuche/Versuch 02/Tools/agents/iso29148-master-orchestrator-agent.md` + - `Versuche/Versuch 02/Tools/agents/iso29148-stakeholder-agent.md` + - `Versuche/Versuch 02/Tools/agents/iso29148-system-requirements-agent.md` + - `Versuche/Versuch 02/Tools/agents/iso29148-software-requirements-agent` +- **Beispielhafte Ergebnis-Requirements:** + - `Versuche/Versuch 02/Ergenisse/system/SyRS_Complete.md`: u. a. `SyR-001` (Multi-Layer Architecture), `SyR-002` (Dual Data Access Pattern), `SyR-013` (Authentication). + - `Versuche/Versuch 02/Ergenisse/software/SwRS_Complete.md`: u. a. `SW-ARCH-001` (6-Layer Architecture), `SW-ARCH-002` (ILogic-Pattern), `SW-FUNC-001` (Account Management). + - `Versuche/Versuch 02/Ergenisse/master/ISO29148_Quality_Report.md`: qualitaetssichernde Gesamtbewertung (u. a. 100% Traceability). -Für die UI-basierte Discovery (CentronNexus) wird ein erster, bewusst begrenzter Scope dokumentiert: +#heading(level: 3)[Versuch 03: Discovery-Erweiterung mit Agenten und MCP] -- 7 erfasste Module bei einem geplanten Umfang von 34 Modulen (20,6% Abdeckung). -- Dokumentation eines neu identifizierten Features („Quick Ticket Creation“) mit 11 konkreten Use Cases. +V03 erweitert deshalb die Methodik um MCP-gestuetzte Discovery. Der Lauf vergroessert die funktionale Breite deutlich (1720 konsolidierte Faehigkeiten, davon 1211 vormals undokumentierte Use Cases) und eignet sich besonders fuer Gap-Analysen und Vollstaendigkeitspruefung. Die Kehrseite ist ein geringerer Formalisierungsgrad gegenueber der ISO-Konsolidierung. -Die genannten Zahlen sind als Ergebnis der prototypischen Toolchain-Ausführung zu interpretieren. Für die Arbeit ist dabei nicht nur der Umfang relevant, sondern die konkrete Nachvollziehbarkeit über Belege: In den Requirements-Artefakten sind Source-Evidence-Verweise in großer Zahl vorhanden; in den Mapping-Artefakten werden UI-Elemente konsistent mit ViewModel-Properties, Commands und Modulpfaden verknüpft. +#heading(level: 4)[Prompt, Agenten und Ergebnisbeispiele (V03)] -#heading(level: 3)[Aufwand und Beobachtungen zur Reproduzierbarkeit] +- **Verwendeter Prompt:** "Please analyze this software project and write a reuqirements specification according to modern standards. Use Agents and MCP servers wherever possible. Keep superflous texts to a minimum and concentrate on actual requirements." +- **Agentenbeispiele:** + - `Versuche/Versuch 03/Tools/Agents/centron-documentation-writer.md` + - `Versuche/Versuch 03/Tools/Agents/nhibernate-query-reviewer.md` + - `Versuche/Versuch 03/Tools/Agents/centron-code-reviewer.md` + - `Versuche/Versuch 03/Tools/Agents/webservice-developer.md` +- **MCP-Beispiele:** Serena-MCP (Memory), Windows-MCP (UI-Interaktion), MSSQL-MCP (DB-Schemazugriff). +- **Beispielhafte extrahierte Use-Case-/Anforderungsartefakte:** + - `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md`: u. a. Use Cases `1.1.1` (Personalized User Welcome), `1.1.6` (Work Status Alerts), `3.1` (Quick Ticket Creation). + - `Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.md`: moduluebergreifende, strukturierte Use-Case-Dokumentation fuer c-entron.NET. + - `Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md`: 1.720+ Use Cases und ca. 71% Dokumentations-Gap als Discovery-Nachweis. -In den Discovery-Artefakten wird für eine UI-Analyse-Session ein Gesamtaufwand von 12 Stunden (4 Stunden Analyse, 8 Stunden Dokumentation) berichtet. Zusätzlich enthalten die Use-Case-Tools Aufwandsschätzungen für einzelne Analysebausteine (z. B. OpenAPI-Analyse, Workflows). Als Ergebnis lässt sich festhalten: +#heading(level: 2)[Abgleich mit den geplanten Methoden] -- Der prototypische Ansatz liefert in kurzer Zeit umfangreiche, strukturierte Artefakte (Requirements, Mapping, Glossar, Schema). -- Die Dokumente selbst enthalten bereits wesentliche Elemente für Reproduzierbarkeit (Belegpfade, Artefaktverweise). Nicht durchgängig dokumentiert sind jedoch Promptversionen, Sampling-Parameter und Retrieval-Konfigurationen. Für eine belastbare Reproduzierbarkeit im wissenschaftlichen Sinne ist diese Metadatenebene zu ergänzen (vgl. Kapitel 4.1.3). +Der Soll-Ist-Abgleich zeigt eine hohe Passung zur geplanten Gesamtmethodik, wenn diese als iterative Kombination aus *Discovery* und *Konsolidierung* verstanden wird: -#heading(level: 2)[Qualitative Bewertung durch Experten] +- Die Standardrecherche (ISO/IEC/IEEE 29148) wurde fruehzeitig umgesetzt. +- Ein Baseline-Lauf ohne Spezialisierung wurde durchgefuehrt (V01). +- Eine strukturierte ISO-Konsolidierung wurde realisiert (V02). +- Danach wurde die Abdeckung durch MCP-gestuetzte Discovery erweitert (V03), weil der ISO-Lauf allein zu rigide und nicht vollumfaenglich genug war. -Die qualitative Bewertung ist zentral, weil fachliche Korrektheit aus Textqualität allein nicht ableitbar ist und LLM-Ausgaben systemische Fehlermuster aufweisen können @ji2023hallucination @bender2021stochastic. Für die Arbeit ist daher ein Human-in-the-loop-Review vorgesehen, der die Ergebnisse aus der KI-gestützten Extraktion gegen Domänenwissen und Projektziele spiegelt. +Abweichung zur urspruenglich linearen Planung: Stakeholder-Interviews und flaechendeckende fachliche Reviews wurden in der betrachteten Phase noch nicht vollstaendig abgeschlossen. Die Methodik wird deshalb in der Ergebnisinterpretation als "technisch validierte Vorstufe" einer finalen fachlichen Konsolidierung eingeordnet. -Für die Durchführung sind folgende Bausteine vorgesehen: +#heading(level: 2)[Bewertung der Forschungsleitfragen auf Basis der aktuellen Evidenz] -- **Stichprobenplan:** Auswahl repräsentativer Module/Prozesse (z. B. Fakturierung, Rechte/Authentifizierung, Datenintegrität) sowie bewusst „randfalllastiger“ Bereiche. -- **Review-Artefakte:** Requirements mit Belegangaben, Use-Case-Mappings (UI↔Code) und Glossarbegriffe als gemeinsamer Referenzrahmen. -- **Bewertungsinstrument:** Kurzfragebogen mit Skalen für Verständlichkeit, Prüfbarkeit, fachliche Korrektheit und Priorität; zusätzlich Erfassung von Korrekturen/Ergänzungen als Änderungslog. -- **Abgleichlogik:** Markierung von (a) bestätigten Requirements, (b) widersprochenen Requirements, (c) Requirements mit unzureichender Evidenz, (d) fehlenden Requirements (Gap-Liste). +- **F1 (reproduzierbarer LLM-Einsatz):** beantwortbar. Die drei Versuche zeigen, dass reproduzierbare Prozessschritte und klar unterscheidbare Konfigurationen moeglich sind. +- **F2 (Ableitung aus Code vs. Zusatzquellen):** teilweise beantwortbar. Codebasierte Extraktion funktioniert, video- und interviewbasierte Ergaenzungen sind noch offen. +- **F3 (Qualitaet aus Expertensicht):** noch nicht abschliessend beantwortbar, da systematische Expertenratings nicht vollstaendig dokumentiert vorliegen. +- **F4 (Chancen und Grenzen):** beantwortbar. Chancen liegen in Skalierung und Strukturierung; Grenzen in Halluzinationsrisiken, fehlender Vollstaendigkeit ohne Zusatzquellen und hohem Konsolidierungsbedarf. -Zum Zeitpunkt der vorliegenden Fassung liegen in `Ergebnisse` keine dokumentierten Expertenratings oder Interviewprotokolle vor. Die qualitative Bewertung wird daher als nächster Evaluationsschritt in Kapitel 6 ergänzt, sobald Review-Sessions durchgeführt und protokolliert wurden. In der Diskussion (Kapitel 7) ist diese Einschränkung als Limitation der aktuellen Ergebnisevidenz zu berücksichtigen. +#heading(level: 2)[Limitationen] + +Die aktuelle Evidenz ist durch drei Punkte begrenzt: + +1. Vollstaendige Video-Transkription und -Auswertung fehlen noch. +2. Ein methodischer Endabgleich zwischen Video- und Codeperspektive ist noch nicht abgeschlossen. +3. Die fachliche Endklassifikation aller Use-Case-Cluster (Ja/Nein/Neu/TBD) liegt noch nicht durchgaengig vor. + +Diese Limitationen betreffen vor allem die finale Vollstaendigkeitsaussage, nicht jedoch die grundlegende Wirksamkeit der iterativen Methodik. diff --git a/Kapitel/07_diskussion.typ b/Kapitel/07_diskussion.typ index 489742f..8d8492d 100644 --- a/Kapitel/07_diskussion.typ +++ b/Kapitel/07_diskussion.typ @@ -1,10 +1,49 @@ +#let __is_thesis = context { query(<__thesis_document>).len() > 0 } +#if __is_thesis == false [ + #set cite(style: "apa") + #hide(bibliography("../literatur.bib", style: "apa")) +] + #heading(level: 1)[Diskussion (ca. 8 Seiten)] #heading(level: 2)[Interpretation der Ergebnisse] -Vergleiche die Evaluation mit den Forschungsleitfragen. + +Die Ergebnisse zeigen einen klaren methodischen Lerneffekt ueber die drei Iterationen. Der Verlauf von V01 ueber V02 zu V03 ist nicht als Widerspruch, sondern als komplementaere Reifung zu interpretieren: + +- V01 demonstriert, dass bereits mit einfacher Konfiguration formal strukturierte Requirements ableitbar sind. +- V02 zeigt, dass eine agentengestuetzte ISO-Konsolidierung methodisch sauber, aber fuer den Gesamtumfang zu rigide sein kann. +- V03 zeigt, dass die MCP-Erweiterung die funktionale Breite massiv erhoeht und Discovery-Luecken schliesst. + +In Summe entsteht ein zweistufiges Zielbild fuer Reverse Requirements Engineering in Legacy-Projekten: zuerst *formal konsolidieren*, danach *gezielt in die Breite erweitern*. #heading(level: 2)[Chancen und Grenzen] -Diskutiere Potenziale und Limitationen des KI-gestützten Ansatzes. -#heading(level: 2)[Implikationen für Forschung und Praxis] -Leitfäden für Unternehmen und offene Forschungsfragen. +Die wesentlichen Chancen des Ansatzes liegen in: + +- hoher Skalierbarkeit bei grossen Legacy-Artefakten, +- schneller Sichtbarmachung undokumentierter Funktionalitaet, +- strukturierter Ueberfuehrung in reviewbare Requirements-Artefakte. + +Die zentralen Grenzen bleiben: + +- keine belastbare Vollstaendigkeit ohne Zusatzquellen (insbesondere Nutzungs- und Prozesssicht), +- Halluzinations- und Fehlinterpretationsrisiken ohne Beleg- und Reviewpflicht, +- hoher Konsolidierungsaufwand zwischen Discovery-Artefakten und abnahmefaehiger Spezifikation. + +Damit bestaetigt die Fallstudie, dass LLMs Requirements Engineering nicht ersetzen, aber als beschleunigendes Analyseinstrument mit klaren Governance-Regeln substantiellen Mehrwert liefern. + +#heading(level: 2)[Implikationen fuer Forschung und Praxis] + +Fuer die Praxis folgt daraus ein umsetzbarer Einfuehrungspfad: + +1. Iterative Versuchslogik statt einmaliger "Big-Bang"-Extraktion. +2. Trennung von Discovery- und Konsolidierungsphase als Standard. +3. Traceability als verpflichtendes Abnahmekriterium fuer LLM-Ergebnisse. + +Fuer die Forschung ergeben sich drei Anschlussfragen: + +1. Wie laesst sich die Triangulation aus Code-, Video- und Stakeholderdaten automatisiert zusammenfuehren? +2. Welche Metriken messen Qualitaet von Requirements-Artefakten robuster als reine Umfangszahlen? +3. Wie kann Human-in-the-loop-Validierung mit vertretbarem Aufwand skaliert werden? + +Die vorliegende Arbeit liefert dafuer eine belastbare methodische Ausgangsbasis, zeigt aber zugleich, dass die letzte Meile zur fachlich finalen Spezifikation weiterhin ein kooperativer Mensch-KI-Prozess bleibt. diff --git a/Kapitel/08_fazit_ausblick.typ b/Kapitel/08_fazit_ausblick.typ index 1d2df30..63d8e84 100644 --- a/Kapitel/08_fazit_ausblick.typ +++ b/Kapitel/08_fazit_ausblick.typ @@ -1,10 +1,35 @@ #heading(level: 1)[Fazit und Ausblick (ca. 4 Seiten)] #heading(level: 2)[Zusammenfassung und Beantwortung der Forschungsfragen] -Fasse die wichtigsten Erkenntnisse zusammen und beantworte die Leitfragen. -#heading(level: 2)[Handlungsempfehlungen für c-entron GmbH] -Formuliere konkrete nächste Schritte für die c-entron GmbH. +Die Arbeit zeigt, dass KI-gestuetztes Reverse Requirements Engineering im untersuchten Legacy-ERP-Kontext praktikabel ist, wenn der Prozess iterativ und kontrolliert aufgebaut wird. Die drei durchgefuehrten Versuche liefern dabei komplementaere Staerken: -#heading(level: 2)[Ausblick und zukünftige Forschung] -Zeige zukünftige Forschungsschwerpunkte und Weiterentwicklungsmöglichkeiten des Prototyps. +- V01 liefert eine formale Baseline mit klarer Requirements-Struktur. +- V02 konsolidiert die Erkenntnisse in eine ISO-29148-nahe, traceability-starke Spezifikation. +- V03 erweitert die Discovery-Breite per MCP und deckt einen hohen dokumentationsbezogenen Gap auf. + +Damit ist F1 (prozessuale Einsetzbarkeit von LLMs) positiv beantwortet. F4 (Chancen und Grenzen) ist ebenfalls klar beantwortbar: Hohe Effizienz- und Strukturgewinne stehen einem weiterhin relevanten Validierungs- und Konsolidierungsbedarf gegenueber. F2 und F3 sind teilweise beantwortet, da video- und interviewbasierte Endvalidierung noch nicht vollstaendig abgeschlossen ist. + +#heading(level: 2)[Handlungsempfehlungen fuer c-entron GmbH] + +Aus den Ergebnissen lassen sich folgende priorisierte Handlungsschritte ableiten: + +1. **V02 als Spezifikationsbasis verwenden:** Die 220 konsolidierten Requirements mit hoher Traceability als Arbeitsgrundlage fuer die Web-Migration etablieren. +2. **V03 als Discovery-Backlog nutzen:** Die 1720 identifizierten Faehigkeiten systematisch gegen V02 mappen, um potenzielle Luecken sichtbar zu halten. +3. **Review-Governance fest verankern:** Fachliche Freigaben und Aenderungsentscheidungen pro Requirement dokumentieren (kein unreviewter LLM-Output im Zielbacklog). +4. **Toolchain standardisieren:** Prompt-/Agentenkonfigurationen versionieren, damit Folgeanalysen reproduzierbar bleiben. + +#heading(level: 2)[Ausblick und naechste Schritte] + +Die naechste Arbeitsphase erweitert die bisher codezentrierte Evidenz um die noch offenen Schritte aus dem Protokoll: + +1. **Vollstaendige Videoanalyse:** Alle vorhandenen Schulungsvideos KI-gestuetzt transkribieren und strukturiert auf Use Cases auswerten. +2. **Abgleich Video vs. Codeanalyse:** Systematischer Vergleich, ob und wo sich beide Sichten decken bzw. welche Use Cases nur in einer Quelle auftauchen. +3. **Clusterung in abstrakte Konzepte:** Die identifizierten Use Cases in die bereits vorbereiteten 101 abstrahierten Konzepte ueberfuehren (vgl. `A_Videoanalyse_Uebersicht.csv`). +4. **Manuelle Fachklassifikation pro Cluster:** Bewertung in die Kategorien + - **ja:** unveraenderte Uebernahme, + - **nein:** Entfall in ERP Web, + - **neu:** fachlich vorhanden, aber neu zu konzipieren, + - **TBD:** vorlaeufig offen. + +Erst mit dieser finalen Triangulation aus Code, Video und Fachbewertung ist eine belastbare Vollstaendigkeitsaussage fuer die Migrationsplanung moeglich. diff --git a/Masterarbeit_draft.pdf b/Masterarbeit_draft.pdf deleted file mode 100644 index f43becd..0000000 --- a/Masterarbeit_draft.pdf +++ /dev/null @@ -1,6908 +0,0 @@ -%PDF-1.7 -% - -1 0 obj -<< - /Type /Pages - /Count 8 - /Kids [472 0 R 474 0 R 476 0 R 520 0 R 522 0 R 524 0 R 526 0 R 528 0 R] ->> -endobj - -2 0 obj -<< - /Type /Outlines - /First 3 0 R - /Last 41 0 R - /Count 13 ->> -endobj - -3 0 obj -<< - /Parent 2 0 R - /Next 4 0 R - /Title - /Dest 430 0 R ->> -endobj - -4 0 obj -<< - /Parent 2 0 R - /Next 5 0 R - /Prev 3 0 R - /Title (Abstract (ca. 1 Seite)) - /Dest 431 0 R ->> -endobj - -5 0 obj -<< - /Parent 2 0 R - /Next 6 0 R - /Prev 4 0 R - /Title (Abstract (ca. 1 Seite)) - /Dest 432 0 R ->> -endobj - -6 0 obj -<< - /Parent 2 0 R - /Next 12 0 R - /Prev 5 0 R - /First 7 0 R - /Last 11 0 R - /Count -5 - /Title (1 Einleitung (ca. 8 Seiten)) - /Dest 438 0 R ->> -endobj - -7 0 obj -<< - /Parent 6 0 R - /Next 8 0 R - /Title (1.1 Ausgangssituation und Motivation) - /Dest 433 0 R ->> -endobj - -8 0 obj -<< - /Parent 6 0 R - /Next 9 0 R - /Prev 7 0 R - /Title (1.2 Problemstellung) - /Dest 434 0 R ->> -endobj - -9 0 obj -<< - /Parent 6 0 R - /Next 10 0 R - /Prev 8 0 R - /Title (1.3 Zielsetzung) - /Dest 435 0 R ->> -endobj - -10 0 obj -<< - /Parent 6 0 R - /Next 11 0 R - /Prev 9 0 R - /Title (1.4 Forschungsleitfragen) - /Dest 436 0 R ->> -endobj - -11 0 obj -<< - /Parent 6 0 R - /Prev 10 0 R - /Title (1.5 Aufbau der Arbeit) - /Dest 437 0 R ->> -endobj - -12 0 obj -<< - /Parent 2 0 R - /Next 16 0 R - /Prev 6 0 R - /First 13 0 R - /Last 15 0 R - /Count -3 - /Title (2 Theoretische Grundlagen (ca. 12 Seiten)) - /Dest 442 0 R ->> -endobj - -13 0 obj -<< - /Parent 12 0 R - /Next 14 0 R - /Title (2.1 Requirements Engineering und Reverse Requirements Engineering) - /Dest 439 0 R ->> -endobj - -14 0 obj -<< - /Parent 12 0 R - /Next 15 0 R - /Prev 13 0 R - /Title (2.2 Large Language Models im Software Engineering) - /Dest 440 0 R ->> -endobj - -15 0 obj -<< - /Parent 12 0 R - /Prev 14 0 R - /Title (2.3 Legacy-Modernisierung und Stand der Forschung) - /Dest 441 0 R ->> -endobj - -16 0 obj -<< - /Parent 2 0 R - /Next 19 0 R - /Prev 12 0 R - /First 17 0 R - /Last 18 0 R - /Count -2 - /Title (3 Fallstudie c-entron GmbH (ca. 6 Seiten)) - /Dest 445 0 R ->> -endobj - -17 0 obj -<< - /Parent 16 0 R - /Next 18 0 R - /Title (3.1 Unternehmenskontext und Legacy-Software) - /Dest 443 0 R ->> -endobj - -18 0 obj -<< - /Parent 16 0 R - /Prev 17 0 R - /Title (3.2 Migrationsstrategie und spezifische Herausforderungen) - /Dest 444 0 R ->> -endobj - -19 0 obj -<< - /Parent 2 0 R - /Next 24 0 R - /Prev 16 0 R - /First 20 0 R - /Last 23 0 R - /Count -4 - /Title (4 Konzeption und methodisches Vorgehen (ca. 12 Seiten)) - /Dest 450 0 R ->> -endobj - -20 0 obj -<< - /Parent 19 0 R - /Next 21 0 R - /Title (4.1 Forschungsdesign und Vorgehensmodell) - /Dest 446 0 R ->> -endobj - -21 0 obj -<< - /Parent 19 0 R - /Next 22 0 R - /Prev 20 0 R - /Title - /Dest 447 0 R ->> -endobj - -22 0 obj -<< - /Parent 19 0 R - /Next 23 0 R - /Prev 21 0 R - /Title (4.3 Technologieauswahl und LLM-Konfiguration) - /Dest 448 0 R ->> -endobj - -23 0 obj -<< - /Parent 19 0 R - /Prev 22 0 R - /Title (4.4 Stakeholder-Einbindung und Datengrundlage) - /Dest 449 0 R ->> -endobj - -24 0 obj -<< - /Parent 2 0 R - /Next 28 0 R - /Prev 19 0 R - /First 25 0 R - /Last 27 0 R - /Count -3 - /Title (5 Prototypische Umsetzung (ca. 10 Seiten)) - /Dest 454 0 R ->> -endobj - -25 0 obj -<< - /Parent 24 0 R - /Next 26 0 R - /Title (5.1 Architektur des LLM-Agenten) - /Dest 451 0 R ->> -endobj - -26 0 obj -<< - /Parent 24 0 R - /Next 27 0 R - /Prev 25 0 R - /Title (5.2 Toolchain-Integration) - /Dest 452 0 R ->> -endobj - -27 0 obj -<< - /Parent 24 0 R - /Prev 26 0 R - /Title (5.3 Governance, Datenschutz und IP) - /Dest 453 0 R ->> -endobj - -28 0 obj -<< - /Parent 2 0 R - /Next 32 0 R - /Prev 24 0 R - /First 29 0 R - /Last 31 0 R - /Count -3 - /Title (6 Evaluation (ca. 12 Seiten)) - /Dest 458 0 R ->> -endobj - -29 0 obj -<< - /Parent 28 0 R - /Next 30 0 R - /Title - /Dest 455 0 R ->> -endobj - -30 0 obj -<< - /Parent 28 0 R - /Next 31 0 R - /Prev 29 0 R - /Title - /Dest 456 0 R ->> -endobj - -31 0 obj -<< - /Parent 28 0 R - /Prev 30 0 R - /Title (6.3 Qualitative Bewertung durch Experten) - /Dest 457 0 R ->> -endobj - -32 0 obj -<< - /Parent 2 0 R - /Next 36 0 R - /Prev 28 0 R - /First 33 0 R - /Last 35 0 R - /Count -3 - /Title (7 Diskussion (ca. 8 Seiten)) - /Dest 462 0 R ->> -endobj - -33 0 obj -<< - /Parent 32 0 R - /Next 34 0 R - /Title (7.1 Interpretation der Ergebnisse) - /Dest 459 0 R ->> -endobj - -34 0 obj -<< - /Parent 32 0 R - /Next 35 0 R - /Prev 33 0 R - /Title (7.2 Chancen und Grenzen) - /Dest 460 0 R ->> -endobj - -35 0 obj -<< - /Parent 32 0 R - /Prev 34 0 R - /Title - /Dest 461 0 R ->> -endobj - -36 0 obj -<< - /Parent 2 0 R - /Next 40 0 R - /Prev 32 0 R - /First 37 0 R - /Last 39 0 R - /Count -3 - /Title (8 Fazit und Ausblick (ca. 4 Seiten)) - /Dest 466 0 R ->> -endobj - -37 0 obj -<< - /Parent 36 0 R - /Next 38 0 R - /Title (8.1 Zusammenfassung und Beantwortung der Forschungsfragen) - /Dest 463 0 R ->> -endobj - -38 0 obj -<< - /Parent 36 0 R - /Next 39 0 R - /Prev 37 0 R - /Title - /Dest 464 0 R ->> -endobj - -39 0 obj -<< - /Parent 36 0 R - /Prev 38 0 R - /Title - /Dest 465 0 R ->> -endobj - -40 0 obj -<< - /Parent 2 0 R - /Next 41 0 R - /Prev 36 0 R - /Title (9 Literaturverzeichnis (ca. 3 Seiten)) - /Dest 467 0 R ->> -endobj - -41 0 obj -<< - /Parent 2 0 R - /Prev 40 0 R - /First 42 0 R - /Last 44 0 R - /Count -3 - /Title (10 Anhang (ca. 6 Seiten)) - /Dest 471 0 R ->> -endobj - -42 0 obj -<< - /Parent 41 0 R - /Next 43 0 R - /Title - /Dest 468 0 R ->> -endobj - -43 0 obj -<< - /Parent 41 0 R - /Next 44 0 R - /Prev 42 0 R - /Title - /Dest 469 0 R ->> -endobj - -44 0 obj -<< - /Parent 41 0 R - /Prev 43 0 R - /Title (10.3 Konfigurationsdetails des Prototyps) - /Dest 470 0 R ->> -endobj - -45 0 obj -<< - /Nums [0 391 0 R 2 392 0 R 3 393 0 R 4 394 0 R 5 395 0 R 6 396 0 R 7 397 0 R] ->> -endobj - -46 0 obj -<< - /Type /StructTreeRoot - /RoleMap << - /Datetime /Span - /Terms /Part - /Title /P - /Strong /Span - /Em /Span - >> - /K [55 0 R] - /ParentTree << - /Nums [0 47 0 R 1 48 0 R 2 49 0 R 3 373 0 R 4 370 0 R 5 367 0 R 6 363 0 R 7 359 0 R 8 355 0 R 9 351 0 R 10 347 0 R 11 343 0 R 12 338 0 R 13 334 0 R 14 330 0 R 15 326 0 R 16 321 0 R 17 317 0 R 18 313 0 R 19 308 0 R 20 304 0 R 21 300 0 R 22 296 0 R 23 292 0 R 24 287 0 R 25 283 0 R 26 279 0 R 27 275 0 R 28 270 0 R 29 266 0 R 30 262 0 R 31 258 0 R 32 253 0 R 33 249 0 R 34 245 0 R 35 241 0 R 36 236 0 R 37 232 0 R 38 228 0 R 39 224 0 R 40 219 0 R 41 215 0 R 42 211 0 R 43 207 0 R 44 203 0 R 45 50 0 R 46 51 0 R 47 52 0 R 48 53 0 R 49 54 0 R] - >> - /ParentTreeNextKey 50 ->> -endobj - -47 0 obj -[390 0 R 390 0 R 389 0 R 388 0 R 387 0 R 386 0 R 385 0 R 384 0 R 383 0 R] -endobj - -48 0 obj -[382 0 R 381 0 R 381 0 R 381 0 R 379 0 R 380 0 R 377 0 R 378 0 R] -endobj - -49 0 obj -[376 0 R 375 0 R] -endobj - -50 0 obj -[374 0 R 373 0 R 373 0 R 370 0 R 370 0 R 367 0 R 367 0 R 364 0 R 363 0 R 363 0 R 360 0 R 359 0 R 359 0 R 356 0 R 355 0 R 355 0 R 352 0 R 351 0 R 351 0 R 348 0 R 347 0 R 347 0 R 344 0 R 343 0 R 343 0 R 339 0 R 338 0 R 338 0 R 335 0 R 334 0 R 334 0 R 331 0 R 330 0 R 330 0 R 327 0 R 326 0 R 326 0 R 322 0 R 321 0 R 321 0 R 318 0 R 317 0 R 317 0 R 314 0 R 313 0 R 313 0 R 309 0 R 308 0 R 308 0 R 305 0 R 304 0 R 304 0 R 301 0 R 300 0 R 300 0 R 297 0 R 296 0 R 296 0 R 293 0 R 292 0 R 292 0 R 288 0 R 287 0 R 287 0 R 284 0 R 283 0 R 283 0 R 280 0 R 279 0 R 279 0 R 276 0 R 275 0 R 275 0 R 271 0 R 270 0 R 270 0 R 267 0 R 266 0 R 266 0 R 263 0 R 262 0 R 262 0 R 259 0 R 258 0 R 258 0 R 254 0 R 253 0 R 253 0 R 250 0 R 249 0 R 249 0 R 246 0 R 245 0 R 245 0 R 242 0 R 241 0 R 241 0 R 237 0 R 236 0 R 236 0 R 233 0 R 232 0 R 232 0 R 229 0 R 228 0 R 228 0 R 225 0 R 224 0 R 224 0 R 220 0 R 219 0 R 219 0 R 216 0 R 215 0 R 215 0 R 212 0 R 211 0 R 211 0 R 208 0 R 207 0 R 207 0 R 204 0 R 203 0 R 203 0 R] -endobj - -51 0 obj -[198 0 R 197 0 R 197 0 R 196 0 R 196 0 R 195 0 R 195 0 R 194 0 R 194 0 R 194 0 R 194 0 R 194 0 R 194 0 R 193 0 R 193 0 R 193 0 R 193 0 R 193 0 R 193 0 R 193 0 R 192 0 R 192 0 R 192 0 R 192 0 R 192 0 R 192 0 R 192 0 R 192 0 R 191 0 R 191 0 R 190 0 R 190 0 R 190 0 R 189 0 R 188 0 R 188 0 R 188 0 R 186 0 R 185 0 R 185 0 R 185 0 R 185 0 R 183 0 R 182 0 R 182 0 R 182 0 R 180 0 R 179 0 R 179 0 R 179 0 R 177 0 R 176 0 R 176 0 R 176 0 R 173 0 R 173 0 R 173 0 R] -endobj - -52 0 obj -[172 0 R 172 0 R 171 0 R 171 0 R 171 0 R 170 0 R 169 0 R 169 0 R 167 0 R 166 0 R 166 0 R 164 0 R 163 0 R 163 0 R 161 0 R 160 0 R 160 0 R 158 0 R 157 0 R 157 0 R 155 0 R 154 0 R 154 0 R 151 0 R 151 0 R 150 0 R 149 0 R 148 0 R 148 0 R 148 0 R 148 0 R 146 0 R 145 0 R 145 0 R 145 0 R 145 0 R 143 0 R 142 0 R 142 0 R 142 0 R 140 0 R 139 0 R 139 0 R 139 0 R 139 0 R 136 0 R 136 0 R 135 0 R 134 0 R 133 0 R 133 0 R 131 0 R 130 0 R 130 0 R 130 0 R 128 0 R 127 0 R 127 0 R 127 0 R 125 0 R 124 0 R 124 0 R 124 0 R 122 0 R 121 0 R 121 0 R 121 0 R 119 0 R 118 0 R 118 0 R 116 0 R 115 0 R 115 0 R 115 0 R 113 0 R 112 0 R 112 0 R 112 0 R] -endobj - -53 0 obj -[109 0 R 109 0 R 108 0 R 108 0 R 107 0 R 107 0 R 106 0 R 106 0 R 105 0 R 105 0 R 104 0 R 104 0 R 103 0 R 103 0 R 102 0 R 102 0 R 101 0 R 101 0 R 100 0 R 100 0 R 99 0 R 99 0 R 98 0 R 98 0 R 97 0 R 97 0 R 96 0 R 95 0 R 95 0 R 94 0 R 93 0 R 93 0 R 92 0 R 91 0 R 91 0 R 90 0 R 89 0 R 89 0 R 88 0 R 88 0 R 87 0 R 86 0 R 86 0 R 85 0 R 84 0 R 84 0 R 83 0 R] -endobj - -54 0 obj -[82 0 R 82 0 R 81 0 R 81 0 R 80 0 R 80 0 R 79 0 R 79 0 R 78 0 R 77 0 R 77 0 R 76 0 R 75 0 R 75 0 R 74 0 R 74 0 R 73 0 R 72 0 R 72 0 R 71 0 R 70 0 R 70 0 R 69 0 R 68 0 R 68 0 R 67 0 R 67 0 R 66 0 R 65 0 R 65 0 R 64 0 R 63 0 R 63 0 R 62 0 R 61 0 R 61 0 R 60 0 R 59 0 R 59 0 R 58 0 R 58 0 R 57 0 R 57 0 R 56 0 R 56 0 R] -endobj - -55 0 obj -<< - /Type /StructElem - /S /Document - /P 46 0 R - /K [390 0 R 389 0 R 388 0 R 387 0 R 386 0 R 385 0 R 384 0 R 383 0 R 382 0 R 381 0 R 379 0 R 377 0 R 376 0 R 375 0 R 374 0 R 199 0 R 198 0 R 197 0 R 196 0 R 195 0 R 194 0 R 193 0 R 192 0 R 191 0 R 190 0 R 174 0 R 173 0 R 172 0 R 171 0 R 152 0 R 151 0 R 150 0 R 137 0 R 136 0 R 135 0 R 110 0 R 109 0 R 108 0 R 107 0 R 106 0 R 105 0 R 104 0 R 103 0 R 102 0 R 101 0 R 100 0 R 99 0 R 98 0 R 97 0 R 96 0 R 95 0 R 94 0 R 93 0 R 92 0 R 91 0 R 90 0 R 89 0 R 88 0 R 87 0 R 86 0 R 85 0 R 84 0 R 83 0 R 82 0 R 81 0 R 80 0 R 79 0 R 78 0 R 77 0 R 76 0 R 75 0 R 74 0 R 73 0 R 72 0 R 71 0 R 70 0 R 69 0 R 68 0 R 67 0 R 66 0 R 65 0 R 64 0 R 63 0 R 62 0 R 61 0 R 60 0 R 59 0 R 58 0 R 57 0 R 56 0 R] ->> -endobj - -56 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Konfigurationsdetails des Prototyps) - /K [43 44] - /Pg 528 0 R ->> -endobj - -57 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [41 42] - /Pg 528 0 R ->> -endobj - -58 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [39 40] - /Pg 528 0 R ->> -endobj - -59 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Anhang (ca. 6 Seiten)) - /K [37 38] - /Pg 528 0 R ->> -endobj - -60 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [36] - /Pg 528 0 R ->> -endobj - -61 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Literaturverzeichnis (ca. 3 Seiten)) - /K [34 35] - /Pg 528 0 R ->> -endobj - -62 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [33] - /Pg 528 0 R ->> -endobj - -63 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [31 32] - /Pg 528 0 R ->> -endobj - -64 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [30] - /Pg 528 0 R ->> -endobj - -65 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [28 29] - /Pg 528 0 R ->> -endobj - -66 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [27] - /Pg 528 0 R ->> -endobj - -67 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Zusammenfassung und Beantwortung der Forschungsfragen) - /K [25 26] - /Pg 528 0 R ->> -endobj - -68 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Fazit und Ausblick (ca. 4 Seiten)) - /K [23 24] - /Pg 528 0 R ->> -endobj - -69 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [22] - /Pg 528 0 R ->> -endobj - -70 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [20 21] - /Pg 528 0 R ->> -endobj - -71 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [19] - /Pg 528 0 R ->> -endobj - -72 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Chancen und Grenzen) - /K [17 18] - /Pg 528 0 R ->> -endobj - -73 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [16] - /Pg 528 0 R ->> -endobj - -74 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Interpretation der Ergebnisse) - /K [14 15] - /Pg 528 0 R ->> -endobj - -75 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Diskussion (ca. 8 Seiten)) - /K [12 13] - /Pg 528 0 R ->> -endobj - -76 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [11] - /Pg 528 0 R ->> -endobj - -77 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Qualitative Bewertung durch Experten) - /K [9 10] - /Pg 528 0 R ->> -endobj - -78 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [8] - /Pg 528 0 R ->> -endobj - -79 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [6 7] - /Pg 528 0 R ->> -endobj - -80 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [4 5] - /Pg 528 0 R ->> -endobj - -81 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [2 3] - /Pg 528 0 R ->> -endobj - -82 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Evaluation (ca. 12 Seiten)) - /K [0 1] - /Pg 528 0 R ->> -endobj - -83 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [46] - /Pg 526 0 R ->> -endobj - -84 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Governance, Datenschutz und IP) - /K [44 45] - /Pg 526 0 R ->> -endobj - -85 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [43] - /Pg 526 0 R ->> -endobj - -86 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Toolchain-Integration) - /K [41 42] - /Pg 526 0 R ->> -endobj - -87 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [40] - /Pg 526 0 R ->> -endobj - -88 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Architektur des LLM-Agenten) - /K [38 39] - /Pg 526 0 R ->> -endobj - -89 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Prototypische Umsetzung (ca. 10 Seiten)) - /K [36 37] - /Pg 526 0 R ->> -endobj - -90 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [35] - /Pg 526 0 R ->> -endobj - -91 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Stakeholder-Einbindung und Datengrundlage) - /K [33 34] - /Pg 526 0 R ->> -endobj - -92 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [32] - /Pg 526 0 R ->> -endobj - -93 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Technologieauswahl und LLM-Konfiguration) - /K [30 31] - /Pg 526 0 R ->> -endobj - -94 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [29] - /Pg 526 0 R ->> -endobj - -95 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T - /K [27 28] - /Pg 526 0 R ->> -endobj - -96 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [26] - /Pg 526 0 R ->> -endobj - -97 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Forschungsdesign und Vorgehensmodell) - /K [24 25] - /Pg 526 0 R ->> -endobj - -98 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Konzeption und methodisches Vorgehen (ca. 12 Seiten)) - /K [22 23] - /Pg 526 0 R ->> -endobj - -99 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Migrationsstrategie und spezifische Herausforderungen) - /K [20 21] - /Pg 526 0 R ->> -endobj - -100 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Unternehmenskontext und Legacy-Software) - /K [18 19] - /Pg 526 0 R ->> -endobj - -101 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Fallstudie c-entron GmbH (ca. 6 Seiten)) - /K [16 17] - /Pg 526 0 R ->> -endobj - -102 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [14 15] - /Pg 526 0 R ->> -endobj - -103 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Legacy-Modernisierung und Stand der Forschung) - /K [12 13] - /Pg 526 0 R ->> -endobj - -104 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [10 11] - /Pg 526 0 R ->> -endobj - -105 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Large Language Models im Software Engineering) - /K [8 9] - /Pg 526 0 R ->> -endobj - -106 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [6 7] - /Pg 526 0 R ->> -endobj - -107 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Requirements Engineering und Reverse Requirements Engineering) - /K [4 5] - /Pg 526 0 R ->> -endobj - -108 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Theoretische Grundlagen (ca. 12 Seiten)) - /K [2 3] - /Pg 526 0 R ->> -endobj - -109 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [0 1] - /Pg 526 0 R ->> -endobj - -110 0 obj -<< - /Type /StructElem - /S /L - /P 55 0 R - /A [<< - /O /List - /ListNumbering /Decimal - >>] - /K [132 0 R 129 0 R 126 0 R 123 0 R 120 0 R 117 0 R 114 0 R 111 0 R] ->> -endobj - -111 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [113 0 R 112 0 R] ->> -endobj - -112 0 obj -<< - /Type /StructElem - /S /LBody - /P 111 0 R - /K [75 76 77] - /Pg 524 0 R ->> -endobj - -113 0 obj -<< - /Type /StructElem - /S /Lbl - /P 111 0 R - /K [74] - /Pg 524 0 R ->> -endobj - -114 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [116 0 R 115 0 R] ->> -endobj - -115 0 obj -<< - /Type /StructElem - /S /LBody - /P 114 0 R - /K [71 72 73] - /Pg 524 0 R ->> -endobj - -116 0 obj -<< - /Type /StructElem - /S /Lbl - /P 114 0 R - /K [70] - /Pg 524 0 R ->> -endobj - -117 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [119 0 R 118 0 R] ->> -endobj - -118 0 obj -<< - /Type /StructElem - /S /LBody - /P 117 0 R - /K [68 69] - /Pg 524 0 R ->> -endobj - -119 0 obj -<< - /Type /StructElem - /S /Lbl - /P 117 0 R - /K [67] - /Pg 524 0 R ->> -endobj - -120 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [122 0 R 121 0 R] ->> -endobj - -121 0 obj -<< - /Type /StructElem - /S /LBody - /P 120 0 R - /K [64 65 66] - /Pg 524 0 R ->> -endobj - -122 0 obj -<< - /Type /StructElem - /S /Lbl - /P 120 0 R - /K [63] - /Pg 524 0 R ->> -endobj - -123 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [125 0 R 124 0 R] ->> -endobj - -124 0 obj -<< - /Type /StructElem - /S /LBody - /P 123 0 R - /K [60 61 62] - /Pg 524 0 R ->> -endobj - -125 0 obj -<< - /Type /StructElem - /S /Lbl - /P 123 0 R - /K [59] - /Pg 524 0 R ->> -endobj - -126 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [128 0 R 127 0 R] ->> -endobj - -127 0 obj -<< - /Type /StructElem - /S /LBody - /P 126 0 R - /K [56 57 58] - /Pg 524 0 R ->> -endobj - -128 0 obj -<< - /Type /StructElem - /S /Lbl - /P 126 0 R - /K [55] - /Pg 524 0 R ->> -endobj - -129 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [131 0 R 130 0 R] ->> -endobj - -130 0 obj -<< - /Type /StructElem - /S /LBody - /P 129 0 R - /K [52 53 54] - /Pg 524 0 R ->> -endobj - -131 0 obj -<< - /Type /StructElem - /S /Lbl - /P 129 0 R - /K [51] - /Pg 524 0 R ->> -endobj - -132 0 obj -<< - /Type /StructElem - /S /LI - /P 110 0 R - /K [134 0 R 133 0 R] ->> -endobj - -133 0 obj -<< - /Type /StructElem - /S /LBody - /P 132 0 R - /K [49 50] - /Pg 524 0 R ->> -endobj - -134 0 obj -<< - /Type /StructElem - /S /Lbl - /P 132 0 R - /K [48] - /Pg 524 0 R ->> -endobj - -135 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [47] - /Pg 524 0 R ->> -endobj - -136 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Aufbau der Arbeit) - /K [45 46] - /Pg 524 0 R ->> -endobj - -137 0 obj -<< - /Type /StructElem - /S /L - /P 55 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [147 0 R 144 0 R 141 0 R 138 0 R] ->> -endobj - -138 0 obj -<< - /Type /StructElem - /S /LI - /P 137 0 R - /K [140 0 R 139 0 R] ->> -endobj - -139 0 obj -<< - /Type /StructElem - /S /LBody - /P 138 0 R - /K [41 42 43 44] - /Pg 524 0 R ->> -endobj - -140 0 obj -<< - /Type /StructElem - /S /Lbl - /P 138 0 R - /K [40] - /Pg 524 0 R ->> -endobj - -141 0 obj -<< - /Type /StructElem - /S /LI - /P 137 0 R - /K [143 0 R 142 0 R] ->> -endobj - -142 0 obj -<< - /Type /StructElem - /S /LBody - /P 141 0 R - /K [37 38 39] - /Pg 524 0 R ->> -endobj - -143 0 obj -<< - /Type /StructElem - /S /Lbl - /P 141 0 R - /K [36] - /Pg 524 0 R ->> -endobj - -144 0 obj -<< - /Type /StructElem - /S /LI - /P 137 0 R - /K [146 0 R 145 0 R] ->> -endobj - -145 0 obj -<< - /Type /StructElem - /S /LBody - /P 144 0 R - /K [32 33 34 35] - /Pg 524 0 R ->> -endobj - -146 0 obj -<< - /Type /StructElem - /S /Lbl - /P 144 0 R - /K [31] - /Pg 524 0 R ->> -endobj - -147 0 obj -<< - /Type /StructElem - /S /LI - /P 137 0 R - /K [149 0 R 148 0 R] ->> -endobj - -148 0 obj -<< - /Type /StructElem - /S /LBody - /P 147 0 R - /K [27 28 29 30] - /Pg 524 0 R ->> -endobj - -149 0 obj -<< - /Type /StructElem - /S /Lbl - /P 147 0 R - /K [26] - /Pg 524 0 R ->> -endobj - -150 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [25] - /Pg 524 0 R ->> -endobj - -151 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Forschungsleitfragen) - /K [23 24] - /Pg 524 0 R ->> -endobj - -152 0 obj -<< - /Type /StructElem - /S /L - /P 55 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [168 0 R 165 0 R 162 0 R 159 0 R 156 0 R 153 0 R] ->> -endobj - -153 0 obj -<< - /Type /StructElem - /S /LI - /P 152 0 R - /K [155 0 R 154 0 R] ->> -endobj - -154 0 obj -<< - /Type /StructElem - /S /LBody - /P 153 0 R - /K [21 22] - /Pg 524 0 R ->> -endobj - -155 0 obj -<< - /Type /StructElem - /S /Lbl - /P 153 0 R - /K [20] - /Pg 524 0 R ->> -endobj - -156 0 obj -<< - /Type /StructElem - /S /LI - /P 152 0 R - /K [158 0 R 157 0 R] ->> -endobj - -157 0 obj -<< - /Type /StructElem - /S /LBody - /P 156 0 R - /K [18 19] - /Pg 524 0 R ->> -endobj - -158 0 obj -<< - /Type /StructElem - /S /Lbl - /P 156 0 R - /K [17] - /Pg 524 0 R ->> -endobj - -159 0 obj -<< - /Type /StructElem - /S /LI - /P 152 0 R - /K [161 0 R 160 0 R] ->> -endobj - -160 0 obj -<< - /Type /StructElem - /S /LBody - /P 159 0 R - /K [15 16] - /Pg 524 0 R ->> -endobj - -161 0 obj -<< - /Type /StructElem - /S /Lbl - /P 159 0 R - /K [14] - /Pg 524 0 R ->> -endobj - -162 0 obj -<< - /Type /StructElem - /S /LI - /P 152 0 R - /K [164 0 R 163 0 R] ->> -endobj - -163 0 obj -<< - /Type /StructElem - /S /LBody - /P 162 0 R - /K [12 13] - /Pg 524 0 R ->> -endobj - -164 0 obj -<< - /Type /StructElem - /S /Lbl - /P 162 0 R - /K [11] - /Pg 524 0 R ->> -endobj - -165 0 obj -<< - /Type /StructElem - /S /LI - /P 152 0 R - /K [167 0 R 166 0 R] ->> -endobj - -166 0 obj -<< - /Type /StructElem - /S /LBody - /P 165 0 R - /K [9 10] - /Pg 524 0 R ->> -endobj - -167 0 obj -<< - /Type /StructElem - /S /Lbl - /P 165 0 R - /K [8] - /Pg 524 0 R ->> -endobj - -168 0 obj -<< - /Type /StructElem - /S /LI - /P 152 0 R - /K [170 0 R 169 0 R] ->> -endobj - -169 0 obj -<< - /Type /StructElem - /S /LBody - /P 168 0 R - /K [6 7] - /Pg 524 0 R ->> -endobj - -170 0 obj -<< - /Type /StructElem - /S /Lbl - /P 168 0 R - /K [5] - /Pg 524 0 R ->> -endobj - -171 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [2 3 4] - /Pg 524 0 R ->> -endobj - -172 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Zielsetzung) - /K [0 1] - /Pg 524 0 R ->> -endobj - -173 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [54 55 56] - /Pg 522 0 R ->> -endobj - -174 0 obj -<< - /Type /StructElem - /S /L - /P 55 0 R - /A [<< - /O /List - /ListNumbering /Circle - >>] - /K [187 0 R 184 0 R 181 0 R 178 0 R 175 0 R] ->> -endobj - -175 0 obj -<< - /Type /StructElem - /S /LI - /P 174 0 R - /K [177 0 R 176 0 R] ->> -endobj - -176 0 obj -<< - /Type /StructElem - /S /LBody - /P 175 0 R - /K [51 52 53] - /Pg 522 0 R ->> -endobj - -177 0 obj -<< - /Type /StructElem - /S /Lbl - /P 175 0 R - /K [50] - /Pg 522 0 R ->> -endobj - -178 0 obj -<< - /Type /StructElem - /S /LI - /P 174 0 R - /K [180 0 R 179 0 R] ->> -endobj - -179 0 obj -<< - /Type /StructElem - /S /LBody - /P 178 0 R - /K [47 48 49] - /Pg 522 0 R ->> -endobj - -180 0 obj -<< - /Type /StructElem - /S /Lbl - /P 178 0 R - /K [46] - /Pg 522 0 R ->> -endobj - -181 0 obj -<< - /Type /StructElem - /S /LI - /P 174 0 R - /K [183 0 R 182 0 R] ->> -endobj - -182 0 obj -<< - /Type /StructElem - /S /LBody - /P 181 0 R - /K [43 44 45] - /Pg 522 0 R ->> -endobj - -183 0 obj -<< - /Type /StructElem - /S /Lbl - /P 181 0 R - /K [42] - /Pg 522 0 R ->> -endobj - -184 0 obj -<< - /Type /StructElem - /S /LI - /P 174 0 R - /K [186 0 R 185 0 R] ->> -endobj - -185 0 obj -<< - /Type /StructElem - /S /LBody - /P 184 0 R - /K [38 39 40 41] - /Pg 522 0 R ->> -endobj - -186 0 obj -<< - /Type /StructElem - /S /Lbl - /P 184 0 R - /K [37] - /Pg 522 0 R ->> -endobj - -187 0 obj -<< - /Type /StructElem - /S /LI - /P 174 0 R - /K [189 0 R 188 0 R] ->> -endobj - -188 0 obj -<< - /Type /StructElem - /S /LBody - /P 187 0 R - /K [34 35 36] - /Pg 522 0 R ->> -endobj - -189 0 obj -<< - /Type /StructElem - /S /Lbl - /P 187 0 R - /K [33] - /Pg 522 0 R ->> -endobj - -190 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [30 31 32] - /Pg 522 0 R ->> -endobj - -191 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Problemstellung) - /K [28 29] - /Pg 522 0 R ->> -endobj - -192 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [20 21 22 23 24 25 26 27] - /Pg 522 0 R ->> -endobj - -193 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [13 14 15 16 17 18 19] - /Pg 522 0 R ->> -endobj - -194 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [7 8 9 10 11 12] - /Pg 522 0 R ->> -endobj - -195 0 obj -<< - /Type /StructElem - /S /H2 - /P 55 0 R - /T (Ausgangssituation und Motivation) - /K [5 6] - /Pg 522 0 R ->> -endobj - -196 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Einleitung (ca. 8 Seiten)) - /K [3 4] - /Pg 522 0 R ->> -endobj - -197 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [1 2] - /Pg 522 0 R ->> -endobj - -198 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Abstract (ca. 1 Seite)) - /K [0] - /Pg 522 0 R ->> -endobj - -199 0 obj -<< - /Type /StructElem - /S /TOC - /P 55 0 R - /K [371 0 R 368 0 R 365 0 R 361 0 R 340 0 R 336 0 R 323 0 R 319 0 R 310 0 R 306 0 R 289 0 R 285 0 R 272 0 R 268 0 R 255 0 R 251 0 R 238 0 R 234 0 R 221 0 R 217 0 R 213 0 R 200 0 R] ->> -endobj - -200 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [209 0 R 205 0 R 201 0 R] ->> -endobj - -201 0 obj -<< - /Type /StructElem - /S /TOCI - /P 200 0 R - /K [202 0 R] ->> -endobj - -202 0 obj -<< - /Type /StructElem - /S /Reference - /P 201 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [203 0 R] ->> -endobj - -203 0 obj -<< - /Type /StructElem - /S /Link - /P 202 0 R - /K [204 0 R 122 123 << - /Type /OBJR - /Pg 520 0 R - /Obj 519 0 R - >>] - /Pg 520 0 R ->> -endobj - -204 0 obj -<< - /Type /StructElem - /S /Lbl - /P 203 0 R - /K [121] - /Pg 520 0 R ->> -endobj - -205 0 obj -<< - /Type /StructElem - /S /TOCI - /P 200 0 R - /K [206 0 R] ->> -endobj - -206 0 obj -<< - /Type /StructElem - /S /Reference - /P 205 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [207 0 R] ->> -endobj - -207 0 obj -<< - /Type /StructElem - /S /Link - /P 206 0 R - /K [208 0 R 119 120 << - /Type /OBJR - /Pg 520 0 R - /Obj 518 0 R - >>] - /Pg 520 0 R ->> -endobj - -208 0 obj -<< - /Type /StructElem - /S /Lbl - /P 207 0 R - /K [118] - /Pg 520 0 R ->> -endobj - -209 0 obj -<< - /Type /StructElem - /S /TOCI - /P 200 0 R - /K [210 0 R] ->> -endobj - -210 0 obj -<< - /Type /StructElem - /S /Reference - /P 209 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [211 0 R] ->> -endobj - -211 0 obj -<< - /Type /StructElem - /S /Link - /P 210 0 R - /K [212 0 R 116 117 << - /Type /OBJR - /Pg 520 0 R - /Obj 517 0 R - >>] - /Pg 520 0 R ->> -endobj - -212 0 obj -<< - /Type /StructElem - /S /Lbl - /P 211 0 R - /K [115] - /Pg 520 0 R ->> -endobj - -213 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [214 0 R] ->> -endobj - -214 0 obj -<< - /Type /StructElem - /S /Reference - /P 213 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [215 0 R] ->> -endobj - -215 0 obj -<< - /Type /StructElem - /S /Link - /P 214 0 R - /K [216 0 R 113 114 << - /Type /OBJR - /Pg 520 0 R - /Obj 516 0 R - >>] - /Pg 520 0 R ->> -endobj - -216 0 obj -<< - /Type /StructElem - /S /Lbl - /P 215 0 R - /K [112] - /Pg 520 0 R ->> -endobj - -217 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [218 0 R] ->> -endobj - -218 0 obj -<< - /Type /StructElem - /S /Reference - /P 217 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [219 0 R] ->> -endobj - -219 0 obj -<< - /Type /StructElem - /S /Link - /P 218 0 R - /K [220 0 R 110 111 << - /Type /OBJR - /Pg 520 0 R - /Obj 515 0 R - >>] - /Pg 520 0 R ->> -endobj - -220 0 obj -<< - /Type /StructElem - /S /Lbl - /P 219 0 R - /K [109] - /Pg 520 0 R ->> -endobj - -221 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [230 0 R 226 0 R 222 0 R] ->> -endobj - -222 0 obj -<< - /Type /StructElem - /S /TOCI - /P 221 0 R - /K [223 0 R] ->> -endobj - -223 0 obj -<< - /Type /StructElem - /S /Reference - /P 222 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [224 0 R] ->> -endobj - -224 0 obj -<< - /Type /StructElem - /S /Link - /P 223 0 R - /K [225 0 R 107 108 << - /Type /OBJR - /Pg 520 0 R - /Obj 514 0 R - >>] - /Pg 520 0 R ->> -endobj - -225 0 obj -<< - /Type /StructElem - /S /Lbl - /P 224 0 R - /K [106] - /Pg 520 0 R ->> -endobj - -226 0 obj -<< - /Type /StructElem - /S /TOCI - /P 221 0 R - /K [227 0 R] ->> -endobj - -227 0 obj -<< - /Type /StructElem - /S /Reference - /P 226 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [228 0 R] ->> -endobj - -228 0 obj -<< - /Type /StructElem - /S /Link - /P 227 0 R - /K [229 0 R 104 105 << - /Type /OBJR - /Pg 520 0 R - /Obj 513 0 R - >>] - /Pg 520 0 R ->> -endobj - -229 0 obj -<< - /Type /StructElem - /S /Lbl - /P 228 0 R - /K [103] - /Pg 520 0 R ->> -endobj - -230 0 obj -<< - /Type /StructElem - /S /TOCI - /P 221 0 R - /K [231 0 R] ->> -endobj - -231 0 obj -<< - /Type /StructElem - /S /Reference - /P 230 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [232 0 R] ->> -endobj - -232 0 obj -<< - /Type /StructElem - /S /Link - /P 231 0 R - /K [233 0 R 101 102 << - /Type /OBJR - /Pg 520 0 R - /Obj 512 0 R - >>] - /Pg 520 0 R ->> -endobj - -233 0 obj -<< - /Type /StructElem - /S /Lbl - /P 232 0 R - /K [100] - /Pg 520 0 R ->> -endobj - -234 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [235 0 R] ->> -endobj - -235 0 obj -<< - /Type /StructElem - /S /Reference - /P 234 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [236 0 R] ->> -endobj - -236 0 obj -<< - /Type /StructElem - /S /Link - /P 235 0 R - /K [237 0 R 98 99 << - /Type /OBJR - /Pg 520 0 R - /Obj 511 0 R - >>] - /Pg 520 0 R ->> -endobj - -237 0 obj -<< - /Type /StructElem - /S /Lbl - /P 236 0 R - /K [97] - /Pg 520 0 R ->> -endobj - -238 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [247 0 R 243 0 R 239 0 R] ->> -endobj - -239 0 obj -<< - /Type /StructElem - /S /TOCI - /P 238 0 R - /K [240 0 R] ->> -endobj - -240 0 obj -<< - /Type /StructElem - /S /Reference - /P 239 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [241 0 R] ->> -endobj - -241 0 obj -<< - /Type /StructElem - /S /Link - /P 240 0 R - /K [242 0 R 95 96 << - /Type /OBJR - /Pg 520 0 R - /Obj 510 0 R - >>] - /Pg 520 0 R ->> -endobj - -242 0 obj -<< - /Type /StructElem - /S /Lbl - /P 241 0 R - /K [94] - /Pg 520 0 R ->> -endobj - -243 0 obj -<< - /Type /StructElem - /S /TOCI - /P 238 0 R - /K [244 0 R] ->> -endobj - -244 0 obj -<< - /Type /StructElem - /S /Reference - /P 243 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [245 0 R] ->> -endobj - -245 0 obj -<< - /Type /StructElem - /S /Link - /P 244 0 R - /K [246 0 R 92 93 << - /Type /OBJR - /Pg 520 0 R - /Obj 509 0 R - >>] - /Pg 520 0 R ->> -endobj - -246 0 obj -<< - /Type /StructElem - /S /Lbl - /P 245 0 R - /K [91] - /Pg 520 0 R ->> -endobj - -247 0 obj -<< - /Type /StructElem - /S /TOCI - /P 238 0 R - /K [248 0 R] ->> -endobj - -248 0 obj -<< - /Type /StructElem - /S /Reference - /P 247 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [249 0 R] ->> -endobj - -249 0 obj -<< - /Type /StructElem - /S /Link - /P 248 0 R - /K [250 0 R 89 90 << - /Type /OBJR - /Pg 520 0 R - /Obj 508 0 R - >>] - /Pg 520 0 R ->> -endobj - -250 0 obj -<< - /Type /StructElem - /S /Lbl - /P 249 0 R - /K [88] - /Pg 520 0 R ->> -endobj - -251 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [252 0 R] ->> -endobj - -252 0 obj -<< - /Type /StructElem - /S /Reference - /P 251 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [253 0 R] ->> -endobj - -253 0 obj -<< - /Type /StructElem - /S /Link - /P 252 0 R - /K [254 0 R 86 87 << - /Type /OBJR - /Pg 520 0 R - /Obj 507 0 R - >>] - /Pg 520 0 R ->> -endobj - -254 0 obj -<< - /Type /StructElem - /S /Lbl - /P 253 0 R - /K [85] - /Pg 520 0 R ->> -endobj - -255 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [264 0 R 260 0 R 256 0 R] ->> -endobj - -256 0 obj -<< - /Type /StructElem - /S /TOCI - /P 255 0 R - /K [257 0 R] ->> -endobj - -257 0 obj -<< - /Type /StructElem - /S /Reference - /P 256 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [258 0 R] ->> -endobj - -258 0 obj -<< - /Type /StructElem - /S /Link - /P 257 0 R - /K [259 0 R 83 84 << - /Type /OBJR - /Pg 520 0 R - /Obj 506 0 R - >>] - /Pg 520 0 R ->> -endobj - -259 0 obj -<< - /Type /StructElem - /S /Lbl - /P 258 0 R - /K [82] - /Pg 520 0 R ->> -endobj - -260 0 obj -<< - /Type /StructElem - /S /TOCI - /P 255 0 R - /K [261 0 R] ->> -endobj - -261 0 obj -<< - /Type /StructElem - /S /Reference - /P 260 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [262 0 R] ->> -endobj - -262 0 obj -<< - /Type /StructElem - /S /Link - /P 261 0 R - /K [263 0 R 80 81 << - /Type /OBJR - /Pg 520 0 R - /Obj 505 0 R - >>] - /Pg 520 0 R ->> -endobj - -263 0 obj -<< - /Type /StructElem - /S /Lbl - /P 262 0 R - /K [79] - /Pg 520 0 R ->> -endobj - -264 0 obj -<< - /Type /StructElem - /S /TOCI - /P 255 0 R - /K [265 0 R] ->> -endobj - -265 0 obj -<< - /Type /StructElem - /S /Reference - /P 264 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [266 0 R] ->> -endobj - -266 0 obj -<< - /Type /StructElem - /S /Link - /P 265 0 R - /K [267 0 R 77 78 << - /Type /OBJR - /Pg 520 0 R - /Obj 504 0 R - >>] - /Pg 520 0 R ->> -endobj - -267 0 obj -<< - /Type /StructElem - /S /Lbl - /P 266 0 R - /K [76] - /Pg 520 0 R ->> -endobj - -268 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [269 0 R] ->> -endobj - -269 0 obj -<< - /Type /StructElem - /S /Reference - /P 268 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [270 0 R] ->> -endobj - -270 0 obj -<< - /Type /StructElem - /S /Link - /P 269 0 R - /K [271 0 R 74 75 << - /Type /OBJR - /Pg 520 0 R - /Obj 503 0 R - >>] - /Pg 520 0 R ->> -endobj - -271 0 obj -<< - /Type /StructElem - /S /Lbl - /P 270 0 R - /K [73] - /Pg 520 0 R ->> -endobj - -272 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [281 0 R 277 0 R 273 0 R] ->> -endobj - -273 0 obj -<< - /Type /StructElem - /S /TOCI - /P 272 0 R - /K [274 0 R] ->> -endobj - -274 0 obj -<< - /Type /StructElem - /S /Reference - /P 273 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [275 0 R] ->> -endobj - -275 0 obj -<< - /Type /StructElem - /S /Link - /P 274 0 R - /K [276 0 R 71 72 << - /Type /OBJR - /Pg 520 0 R - /Obj 502 0 R - >>] - /Pg 520 0 R ->> -endobj - -276 0 obj -<< - /Type /StructElem - /S /Lbl - /P 275 0 R - /K [70] - /Pg 520 0 R ->> -endobj - -277 0 obj -<< - /Type /StructElem - /S /TOCI - /P 272 0 R - /K [278 0 R] ->> -endobj - -278 0 obj -<< - /Type /StructElem - /S /Reference - /P 277 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [279 0 R] ->> -endobj - -279 0 obj -<< - /Type /StructElem - /S /Link - /P 278 0 R - /K [280 0 R 68 69 << - /Type /OBJR - /Pg 520 0 R - /Obj 501 0 R - >>] - /Pg 520 0 R ->> -endobj - -280 0 obj -<< - /Type /StructElem - /S /Lbl - /P 279 0 R - /K [67] - /Pg 520 0 R ->> -endobj - -281 0 obj -<< - /Type /StructElem - /S /TOCI - /P 272 0 R - /K [282 0 R] ->> -endobj - -282 0 obj -<< - /Type /StructElem - /S /Reference - /P 281 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [283 0 R] ->> -endobj - -283 0 obj -<< - /Type /StructElem - /S /Link - /P 282 0 R - /K [284 0 R 65 66 << - /Type /OBJR - /Pg 520 0 R - /Obj 500 0 R - >>] - /Pg 520 0 R ->> -endobj - -284 0 obj -<< - /Type /StructElem - /S /Lbl - /P 283 0 R - /K [64] - /Pg 520 0 R ->> -endobj - -285 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [286 0 R] ->> -endobj - -286 0 obj -<< - /Type /StructElem - /S /Reference - /P 285 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [287 0 R] ->> -endobj - -287 0 obj -<< - /Type /StructElem - /S /Link - /P 286 0 R - /K [288 0 R 62 63 << - /Type /OBJR - /Pg 520 0 R - /Obj 499 0 R - >>] - /Pg 520 0 R ->> -endobj - -288 0 obj -<< - /Type /StructElem - /S /Lbl - /P 287 0 R - /K [61] - /Pg 520 0 R ->> -endobj - -289 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [302 0 R 298 0 R 294 0 R 290 0 R] ->> -endobj - -290 0 obj -<< - /Type /StructElem - /S /TOCI - /P 289 0 R - /K [291 0 R] ->> -endobj - -291 0 obj -<< - /Type /StructElem - /S /Reference - /P 290 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [292 0 R] ->> -endobj - -292 0 obj -<< - /Type /StructElem - /S /Link - /P 291 0 R - /K [293 0 R 59 60 << - /Type /OBJR - /Pg 520 0 R - /Obj 498 0 R - >>] - /Pg 520 0 R ->> -endobj - -293 0 obj -<< - /Type /StructElem - /S /Lbl - /P 292 0 R - /K [58] - /Pg 520 0 R ->> -endobj - -294 0 obj -<< - /Type /StructElem - /S /TOCI - /P 289 0 R - /K [295 0 R] ->> -endobj - -295 0 obj -<< - /Type /StructElem - /S /Reference - /P 294 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [296 0 R] ->> -endobj - -296 0 obj -<< - /Type /StructElem - /S /Link - /P 295 0 R - /K [297 0 R 56 57 << - /Type /OBJR - /Pg 520 0 R - /Obj 497 0 R - >>] - /Pg 520 0 R ->> -endobj - -297 0 obj -<< - /Type /StructElem - /S /Lbl - /P 296 0 R - /K [55] - /Pg 520 0 R ->> -endobj - -298 0 obj -<< - /Type /StructElem - /S /TOCI - /P 289 0 R - /K [299 0 R] ->> -endobj - -299 0 obj -<< - /Type /StructElem - /S /Reference - /P 298 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [300 0 R] ->> -endobj - -300 0 obj -<< - /Type /StructElem - /S /Link - /P 299 0 R - /K [301 0 R 53 54 << - /Type /OBJR - /Pg 520 0 R - /Obj 496 0 R - >>] - /Pg 520 0 R ->> -endobj - -301 0 obj -<< - /Type /StructElem - /S /Lbl - /P 300 0 R - /K [52] - /Pg 520 0 R ->> -endobj - -302 0 obj -<< - /Type /StructElem - /S /TOCI - /P 289 0 R - /K [303 0 R] ->> -endobj - -303 0 obj -<< - /Type /StructElem - /S /Reference - /P 302 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [304 0 R] ->> -endobj - -304 0 obj -<< - /Type /StructElem - /S /Link - /P 303 0 R - /K [305 0 R 50 51 << - /Type /OBJR - /Pg 520 0 R - /Obj 495 0 R - >>] - /Pg 520 0 R ->> -endobj - -305 0 obj -<< - /Type /StructElem - /S /Lbl - /P 304 0 R - /K [49] - /Pg 520 0 R ->> -endobj - -306 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [307 0 R] ->> -endobj - -307 0 obj -<< - /Type /StructElem - /S /Reference - /P 306 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [308 0 R] ->> -endobj - -308 0 obj -<< - /Type /StructElem - /S /Link - /P 307 0 R - /K [309 0 R 47 48 << - /Type /OBJR - /Pg 520 0 R - /Obj 494 0 R - >>] - /Pg 520 0 R ->> -endobj - -309 0 obj -<< - /Type /StructElem - /S /Lbl - /P 308 0 R - /K [46] - /Pg 520 0 R ->> -endobj - -310 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [315 0 R 311 0 R] ->> -endobj - -311 0 obj -<< - /Type /StructElem - /S /TOCI - /P 310 0 R - /K [312 0 R] ->> -endobj - -312 0 obj -<< - /Type /StructElem - /S /Reference - /P 311 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [313 0 R] ->> -endobj - -313 0 obj -<< - /Type /StructElem - /S /Link - /P 312 0 R - /K [314 0 R 44 45 << - /Type /OBJR - /Pg 520 0 R - /Obj 493 0 R - >>] - /Pg 520 0 R ->> -endobj - -314 0 obj -<< - /Type /StructElem - /S /Lbl - /P 313 0 R - /K [43] - /Pg 520 0 R ->> -endobj - -315 0 obj -<< - /Type /StructElem - /S /TOCI - /P 310 0 R - /K [316 0 R] ->> -endobj - -316 0 obj -<< - /Type /StructElem - /S /Reference - /P 315 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [317 0 R] ->> -endobj - -317 0 obj -<< - /Type /StructElem - /S /Link - /P 316 0 R - /K [318 0 R 41 42 << - /Type /OBJR - /Pg 520 0 R - /Obj 492 0 R - >>] - /Pg 520 0 R ->> -endobj - -318 0 obj -<< - /Type /StructElem - /S /Lbl - /P 317 0 R - /K [40] - /Pg 520 0 R ->> -endobj - -319 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [320 0 R] ->> -endobj - -320 0 obj -<< - /Type /StructElem - /S /Reference - /P 319 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [321 0 R] ->> -endobj - -321 0 obj -<< - /Type /StructElem - /S /Link - /P 320 0 R - /K [322 0 R 38 39 << - /Type /OBJR - /Pg 520 0 R - /Obj 491 0 R - >>] - /Pg 520 0 R ->> -endobj - -322 0 obj -<< - /Type /StructElem - /S /Lbl - /P 321 0 R - /K [37] - /Pg 520 0 R ->> -endobj - -323 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [332 0 R 328 0 R 324 0 R] ->> -endobj - -324 0 obj -<< - /Type /StructElem - /S /TOCI - /P 323 0 R - /K [325 0 R] ->> -endobj - -325 0 obj -<< - /Type /StructElem - /S /Reference - /P 324 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [326 0 R] ->> -endobj - -326 0 obj -<< - /Type /StructElem - /S /Link - /P 325 0 R - /K [327 0 R 35 36 << - /Type /OBJR - /Pg 520 0 R - /Obj 490 0 R - >>] - /Pg 520 0 R ->> -endobj - -327 0 obj -<< - /Type /StructElem - /S /Lbl - /P 326 0 R - /K [34] - /Pg 520 0 R ->> -endobj - -328 0 obj -<< - /Type /StructElem - /S /TOCI - /P 323 0 R - /K [329 0 R] ->> -endobj - -329 0 obj -<< - /Type /StructElem - /S /Reference - /P 328 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [330 0 R] ->> -endobj - -330 0 obj -<< - /Type /StructElem - /S /Link - /P 329 0 R - /K [331 0 R 32 33 << - /Type /OBJR - /Pg 520 0 R - /Obj 489 0 R - >>] - /Pg 520 0 R ->> -endobj - -331 0 obj -<< - /Type /StructElem - /S /Lbl - /P 330 0 R - /K [31] - /Pg 520 0 R ->> -endobj - -332 0 obj -<< - /Type /StructElem - /S /TOCI - /P 323 0 R - /K [333 0 R] ->> -endobj - -333 0 obj -<< - /Type /StructElem - /S /Reference - /P 332 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [334 0 R] ->> -endobj - -334 0 obj -<< - /Type /StructElem - /S /Link - /P 333 0 R - /K [335 0 R 29 30 << - /Type /OBJR - /Pg 520 0 R - /Obj 488 0 R - >>] - /Pg 520 0 R ->> -endobj - -335 0 obj -<< - /Type /StructElem - /S /Lbl - /P 334 0 R - /K [28] - /Pg 520 0 R ->> -endobj - -336 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [337 0 R] ->> -endobj - -337 0 obj -<< - /Type /StructElem - /S /Reference - /P 336 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [338 0 R] ->> -endobj - -338 0 obj -<< - /Type /StructElem - /S /Link - /P 337 0 R - /K [339 0 R 26 27 << - /Type /OBJR - /Pg 520 0 R - /Obj 487 0 R - >>] - /Pg 520 0 R ->> -endobj - -339 0 obj -<< - /Type /StructElem - /S /Lbl - /P 338 0 R - /K [25] - /Pg 520 0 R ->> -endobj - -340 0 obj -<< - /Type /StructElem - /S /TOC - /P 199 0 R - /K [357 0 R 353 0 R 349 0 R 345 0 R 341 0 R] ->> -endobj - -341 0 obj -<< - /Type /StructElem - /S /TOCI - /P 340 0 R - /K [342 0 R] ->> -endobj - -342 0 obj -<< - /Type /StructElem - /S /Reference - /P 341 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [343 0 R] ->> -endobj - -343 0 obj -<< - /Type /StructElem - /S /Link - /P 342 0 R - /K [344 0 R 23 24 << - /Type /OBJR - /Pg 520 0 R - /Obj 486 0 R - >>] - /Pg 520 0 R ->> -endobj - -344 0 obj -<< - /Type /StructElem - /S /Lbl - /P 343 0 R - /K [22] - /Pg 520 0 R ->> -endobj - -345 0 obj -<< - /Type /StructElem - /S /TOCI - /P 340 0 R - /K [346 0 R] ->> -endobj - -346 0 obj -<< - /Type /StructElem - /S /Reference - /P 345 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [347 0 R] ->> -endobj - -347 0 obj -<< - /Type /StructElem - /S /Link - /P 346 0 R - /K [348 0 R 20 21 << - /Type /OBJR - /Pg 520 0 R - /Obj 485 0 R - >>] - /Pg 520 0 R ->> -endobj - -348 0 obj -<< - /Type /StructElem - /S /Lbl - /P 347 0 R - /K [19] - /Pg 520 0 R ->> -endobj - -349 0 obj -<< - /Type /StructElem - /S /TOCI - /P 340 0 R - /K [350 0 R] ->> -endobj - -350 0 obj -<< - /Type /StructElem - /S /Reference - /P 349 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [351 0 R] ->> -endobj - -351 0 obj -<< - /Type /StructElem - /S /Link - /P 350 0 R - /K [352 0 R 17 18 << - /Type /OBJR - /Pg 520 0 R - /Obj 484 0 R - >>] - /Pg 520 0 R ->> -endobj - -352 0 obj -<< - /Type /StructElem - /S /Lbl - /P 351 0 R - /K [16] - /Pg 520 0 R ->> -endobj - -353 0 obj -<< - /Type /StructElem - /S /TOCI - /P 340 0 R - /K [354 0 R] ->> -endobj - -354 0 obj -<< - /Type /StructElem - /S /Reference - /P 353 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [355 0 R] ->> -endobj - -355 0 obj -<< - /Type /StructElem - /S /Link - /P 354 0 R - /K [356 0 R 14 15 << - /Type /OBJR - /Pg 520 0 R - /Obj 483 0 R - >>] - /Pg 520 0 R ->> -endobj - -356 0 obj -<< - /Type /StructElem - /S /Lbl - /P 355 0 R - /K [13] - /Pg 520 0 R ->> -endobj - -357 0 obj -<< - /Type /StructElem - /S /TOCI - /P 340 0 R - /K [358 0 R] ->> -endobj - -358 0 obj -<< - /Type /StructElem - /S /Reference - /P 357 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [359 0 R] ->> -endobj - -359 0 obj -<< - /Type /StructElem - /S /Link - /P 358 0 R - /K [360 0 R 11 12 << - /Type /OBJR - /Pg 520 0 R - /Obj 482 0 R - >>] - /Pg 520 0 R ->> -endobj - -360 0 obj -<< - /Type /StructElem - /S /Lbl - /P 359 0 R - /K [10] - /Pg 520 0 R ->> -endobj - -361 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [362 0 R] ->> -endobj - -362 0 obj -<< - /Type /StructElem - /S /Reference - /P 361 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [363 0 R] ->> -endobj - -363 0 obj -<< - /Type /StructElem - /S /Link - /P 362 0 R - /K [364 0 R 8 9 << - /Type /OBJR - /Pg 520 0 R - /Obj 481 0 R - >>] - /Pg 520 0 R ->> -endobj - -364 0 obj -<< - /Type /StructElem - /S /Lbl - /P 363 0 R - /K [7] - /Pg 520 0 R ->> -endobj - -365 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [366 0 R] ->> -endobj - -366 0 obj -<< - /Type /StructElem - /S /Reference - /P 365 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [367 0 R] ->> -endobj - -367 0 obj -<< - /Type /StructElem - /S /Link - /P 366 0 R - /K [5 6 << - /Type /OBJR - /Pg 520 0 R - /Obj 480 0 R - >>] - /Pg 520 0 R ->> -endobj - -368 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [369 0 R] ->> -endobj - -369 0 obj -<< - /Type /StructElem - /S /Reference - /P 368 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [370 0 R] ->> -endobj - -370 0 obj -<< - /Type /StructElem - /S /Link - /P 369 0 R - /K [3 4 << - /Type /OBJR - /Pg 520 0 R - /Obj 479 0 R - >>] - /Pg 520 0 R ->> -endobj - -371 0 obj -<< - /Type /StructElem - /S /TOCI - /P 199 0 R - /K [372 0 R] ->> -endobj - -372 0 obj -<< - /Type /StructElem - /S /Reference - /P 371 0 R - /A [<< - /O /Layout - /Placement /Block - >>] - /K [373 0 R] ->> -endobj - -373 0 obj -<< - /Type /StructElem - /S /Link - /P 372 0 R - /K [1 2 << - /Type /OBJR - /Pg 520 0 R - /Obj 478 0 R - >>] - /Pg 520 0 R ->> -endobj - -374 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Inhaltsverzeichnis) - /K [0] - /Pg 520 0 R ->> -endobj - -375 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [1] - /Pg 476 0 R ->> -endobj - -376 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T (Abstract (ca. 1 Seite)) - /K [0] - /Pg 476 0 R ->> -endobj - -377 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [6 378 0 R] - /Pg 474 0 R ->> -endobj - -378 0 obj -<< - /Type /StructElem - /S /Code - /P 377 0 R - /K [7] - /Pg 474 0 R ->> -endobj - -379 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [4 380 0 R] - /Pg 474 0 R ->> -endobj - -380 0 obj -<< - /Type /StructElem - /S /Code - /P 379 0 R - /K [5] - /Pg 474 0 R ->> -endobj - -381 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [1 2 3] - /Pg 474 0 R ->> -endobj - -382 0 obj -<< - /Type /StructElem - /S /H1 - /P 55 0 R - /T - /K [0] - /Pg 474 0 R ->> -endobj - -383 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [8] - /Pg 472 0 R ->> -endobj - -384 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [7] - /Pg 472 0 R ->> -endobj - -385 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [6] - /Pg 472 0 R ->> -endobj - -386 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [5] - /Pg 472 0 R ->> -endobj - -387 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [4] - /Pg 472 0 R ->> -endobj - -388 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [3] - /Pg 472 0 R ->> -endobj - -389 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [2] - /Pg 472 0 R ->> -endobj - -390 0 obj -<< - /Type /StructElem - /S /P - /P 55 0 R - /K [0 1] - /Pg 472 0 R ->> -endobj - -391 0 obj -<< - /Type /PageLabel ->> -endobj - -392 0 obj -<< - /Type /PageLabel - /S /D - /St 3 ->> -endobj - -393 0 obj -<< - /Type /PageLabel - /S /D - /St 1 ->> -endobj - -394 0 obj -<< - /Type /PageLabel - /S /D - /St 2 ->> -endobj - -395 0 obj -<< - /Type /PageLabel - /S /D - /St 3 ->> -endobj - -396 0 obj -<< - /Type /PageLabel - /S /D - /St 4 ->> -endobj - -397 0 obj -<< - /Type /PageLabel - /S /D - /St 5 ->> -endobj - -398 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /RGIBGQ+LibertinusSerif-Bold-Identity-H - /Encoding /Identity-H - /DescendantFonts [399 0 R] - /ToUnicode 402 0 R ->> -endobj - -399 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /RGIBGQ+LibertinusSerif-Bold - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 401 0 R - /DW 0 - /W [0 0 500 1 1 367 2 2 616 3 3 619 4 4 505.99997 5 5 325 6 6 358 7 7 427 8 8 529 9 9 489 10 10 428 11 11 452 12 12 322 13 13 456 14 14 740 15 15 542 16 16 250 17 17 315 18 18 244 19 19 514 20 20 504 21 21 315 22 22 609 23 23 598 24 24 521 25 25 514 26 26 551 27 27 561 28 28 899 29 29 514 30 30 614 31 31 905 32 32 514 33 33 624 34 34 514 35 35 545 36 36 391 37 37 514 38 38 391 39 39 652 40 40 732 41 41 716 42 42 573 43 43 577 44 44 688 45 45 777 46 46 558 47 47 358 48 48 817 49 49 514 50 50 732 51 51 613 52 52 561 53 53 581 54 54 641 55 55 736 56 56 700 57 57 598 58 58 734 59 59 514 60 60 244 61 61 551 62 62 615 63 63 730 64 64 654 65 65 514 66 66 706 67 67 514 68 68 505.99997] ->> -endobj - -400 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x~, -endstream -endobj - -401 0 obj -<< - /Type /FontDescriptor - /FontName /RGIBGQ+LibertinusSerif-Bold - /Flags 131078 - /FontBBox [0 -238 1135 720] - /ItalicAngle 0 - /Ascent 894 - /Descent -246 - /CapHeight 645 - /StemV 168.6 - /CIDSet 400 0 R - /FontFile3 403 0 R ->> -endobj - -402 0 obj -<< - /Length 1566 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -68 beginbfchar -<0001> <0049> -<0002> <006E> -<0003> <0068> -<0004> <0061> -<0005> <006C> -<0006> <0074> -<0007> <0073> -<0008> <0076> -<0009> <0065> -<000A> <0072> -<000B> <007A> -<000C> <0069> -<000D> <0063> -<000E> <0041> -<000F> <0062> -<0010> <0020> -<0011> <0028> -<0012> <002E> -<0013> <0031> -<0014> <0053> -<0015> <0029> -<0016> <0045> -<0017> <0075> -<0018> <0067> -<0019> <0038> -<001A> <006F> -<001B> <0064> -<001C> <004D> -<001D> <0032> -<001E> <0050> -<001F> <006D> -<0020> <0033> -<0021> <005A> -<0022> <0034> -<0023> <0046> -<0024> <0066> -<0025> <0035> -<0026> <0066> -<0027> <0054> -<0028> <0047> -<0029> <0052> -<002A> <0071> -<002B> <004C> -<002C> <00660074> -<002D> <0077> -<002E> <0079> -<002F> <002D> -<0030> <0048> -<0031> <0036> -<0032> <0055> -<0033> <006B> -<0034> <0078> -<0035> <0070> -<0036> <00660069> -<0037> <004B> -<0038> <0056> -<0039> <00FC> -<003A> <0044> -<003B> <0030> -<003C> <002C> -<003D> <00F6> -<003E> <00DF> -<003F> <0051> -<0040> <0042> -<0041> <0037> -<0042> <0043> -<0043> <0039> -<0044> <00E4> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -403 0 obj -<< - /Length 7511 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xzwxgQ"0!3!!,Iz j 7ܻ%wKFݲlٸ&w !HB a3܏=Lro;}{;r!~! q;cC\a KS43ϡ5΂)LCצ^p8_p^|gi8*6n3ʰX \Tkj5~j 8:\-οap'pV;h x9YXr112Ǝ9|E / -7CWŌgԋDB E2&-tOs뉗q:&&12aʦe:[LrI衏2쫂Z1=[fB<1Ur!:["fWx\ D8ttIiX0?%OE\h6ju1LrIY5s0g]? Tz d ٖ5jN ),Y E@ެx];SԢ 2!:?[5ĮU0 ^A)8 n~oPنL*(c}*C+5f -*zOѭ=%#TۛɎ0~ԖOK8 -c`lWSv>03{pE`7짳<-U)M# --c>g0hRD%VdVN֖rS:"h`~o)0 Jh_k.{4IWP؍ iv -)fg*""kgٹg `nc1 -%Rȫ?ڿeWQ -눊f[*X[mTAXŃҨh""?DL5 Ov$#’}{.}r<^rQeNJ7e2Gָj#cHk | ޭ rIJ%4j*[IK,|iv8e$iG- o.@"܁ ɮSHbwxwd+E߄@3i4<l:?"9qڪ(Q(ffc[A`%iY,פմX"0QQդ o+RsnN!)3Y9EYd]m:@p`ĺWk\&˜FdxVu+F濩O\Q1fh⟹z)gkRK;k=nJf|Y{r|}饆zNB3MQ)l¢ᮊ۬Gry.LyƊvaީ[ faP)HehJ)%I; IuWoaHCeҨ(颬)"H<2>eO|X%z])ܰs[tb}KTHb$|Qpcaz:Z_#i$+wD\47k+A=Scmm!?s9vNmh~ͳMJ!4?@$,f$(V!u4C(tn[Iq?7fSC6cOl>B>ÒJaiYrᾘ'Aj>hxdkz -2)ZqR`̧eeeLunb(5-dn\ *uߟ_TRB@roa"VZ2gGelʺ|rqM{oi{(@ڛ]l0-3A`w1%S% -mYd{E@Lî齔x'`0WOFfv4'u}=F.h$@ob}vO~}$W5ϫ:5Dj;pݩq_NpwC4&`Soa.Eev`aLǃ."<ܲK%P(uW+v嬰п(,r`LqHሇxhֲ5tTKUYs6bτ +` zJ蚢du*F K͢Dp**xH\L@a!n\ԬW 5G'W{m}}4 -@UzHMyh[W톶SV_~d/?M%#nѲFme)~tuFEqHUUx>xݗyri5hj/ -|w m*y0 :c+"[U.PyDEsO[*yzQ[^@㓣Tѓ a<֕ߖ?s\hJ4ē$DFȕo4՟<`LG o8ys-:]"F;vrLֽi?'/_!8lą8$z%Åb.J4dRSI~,hH=*[N1ľo^[`De{WgA}Æ)UYCɎm3?n|mԡTUai_Uص9& sǾ-n/Yy[b:ǟg*K > -WӅ 2<)&YZ.ZIn7|}U?x芻WGQ yt:foʯh4Qz) -?d_`u.u%VLyIeHy/.E@ZV3WL-TZ|stY6}6E<kAAaIEi(qԍ6 -S?6(큼G -Ǒ\O nWZY_U{@E5UW֟Q*rwT3F~W"f] νhUK"c>]!01Dja>,//2Paձ-dSe١ީ>; لD-Sdтl@yDw! W`\Ҫ4=$<\_NKOe0;Uqt TvXg8M|oe o!L?:l\* {[f}޿#u:_DKmc;(wlq9Kk U+ri5Gqj:†U!IgJ$,:O[-A`AbS$Af[B -lK̆pǮykq߶Fᩉ! kS ̼urZTw$ -|qZ)񬦼`_'QA_];q?5e(e$A;" e=? -kqop(%!X~/(}*C"2%iMR{}#! J͢fcɿ#Om.Ckr0{G0J]yɭ>;T[|(?T,ʉxb_FHb57P*[VZR7F}]~ pY PXDh-1Ǫ]h~D:^RNJZf&‰CEmCOɂILLо'UclCܔr"Q] '`/+b@ ;3c Z{Ldy!VبjTRa(F9cHj.z*-́Z]JsvFQ^aP֤TyZ[xzFRIRI>%WJKs`*EeʼR킰/mWTv[,Q4cVY%-1\#Zl)梳0(Ks "N`_' \`N'{3%Y4URh;nf[\z@EPCA?2$0XCD0R;i5`]ڽͯH-@cSdۯ.ӫ#BtJm tC7!zֿwtu1S:l!6R,tEH_QL%b:5O5?+Z&")rfq+y y:fF'D$I$|¢Ȭ|~~0v90.g3zbrܢ0*X1*jjaJG 2Xކf^oZ[K~4>-a™'Y(ĮRIΥn*B&n5B T -Kk+5Jy?6Cir3lT۠m<7!v=n*oj|pw?2y% oܺ 3g`]d`ZWתe HC1Vk͏xi&}!Z$6;F(KEt>C-屷2#!j!rdB*,*l+.Nl /Cw[wv:=`Go-ub مi10yDR*@jL5# znɥEf"Gg{䑡QĊe`_m:)W{-ۨ!oJ -asVF+dzqxljہWj=L$MT=@D!-% M>{AL&ove"w% 8~.=sW/ɴ|v#QWPYYWNf׈ʸʈpJv7C񕺃Vti3s?O>@j&*GKlq7-[ztpXӜ,o R4 @cZ3h#~hZz/d`7mE Z \x -*QVUEV} JejkW;G5π7=ֽ]S&˞6Cൟ9?9roI9|\>_r#y0 K4i*W!g?OsvDE ~V!v3+Ĺ,-/+%*cED$QX1/> ׿{ NjammOWA5K]hAT,Ȣ%Qcb.@Ug"XϷmK[\ـl' -jxmξ5ۨ]"E50 am`Z`UU}EhZILO7:wzN+yAz^{n9WNfH,{߿>[h64f.pa+#)Oj;!Pz`9ρ +MƟ7:Νr݅翽ǧ:;L }|)-0r/;mfc >0g(ib|Q@͹r FV.:4Q4ݔvZ/:P%uÆŐDfg*-LNe-#짝VN7\U$K%/YM"[0[_$Tw|e>Ϥ8՗yLhہ&h7Z&7;ј/{}|:astWeh2jyw$ @s!Bcᵶ&ky*tOV5UBh&<.PN"F NcRe'wᝅr{6Lºx'^ O9:85VZ` -endstream -endobj - -404 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /ASSXZP+TimesNewRomanPSMT - /Encoding /Identity-H - /DescendantFonts [405 0 R] - /ToUnicode 408 0 R ->> -endobj - -405 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /ASSXZP+TimesNewRomanPSMT - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 407 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 0 777.83203 1 1 889.16016 2 2 443.84766 3 3 389.16016 4 4 277.83203 5 5 443.84766 6 6 333.0078 7 7 500 8 8 277.83203 9 9 250 10 11 500 12 12 722.16797 13 13 500 14 14 443.84766 15 16 500 17 17 277.83203 18 18 722.16797 19 19 333.0078 20 20 722.16797 21 21 777.83203 22 22 333.0078 23 23 556.15234 24 24 722.16797 25 25 277.83203 26 26 666.9922 27 27 500 28 28 666.9922 29 29 556.15234 30 30 250 31 31 722.16797 32 34 500 35 36 443.84766 37 41 500 42 42 250 43 43 500 44 45 722.16797 46 48 500 49 49 610.83984 50 50 500 51 53 610.83984] ->> -endobj - -406 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x -endstream -endobj - -407 0 obj -<< - /Type /FontDescriptor - /FontName /ASSXZP+TimesNewRomanPSMT - /Flags 131076 - /FontBBox [-13.183594 -215.82031 868.16406 694.33594] - /ItalicAngle 0 - /Ascent 693.3594 - /Descent -215.82031 - /CapHeight 662.1094 - /StemV 95.4 - /CIDSet 406 0 R - /FontFile2 409 0 R ->> -endobj - -408 0 obj -<< - /Length 1348 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -53 beginbfchar -<0001> <004D> -<0002> <0061> -<0003> <0073> -<0004> <0074> -<0005> <0065> -<0006> <0072> -<0007> <0062> -<0008> <0069> -<0009> <0020> -<000A> <006E> -<000B> <0064> -<000C> <0048> -<000D> <006F> -<000E> <0063> -<000F> <0068> -<0010> <0075> -<0011> <006C> -<0012> <004E> -<0013> <002D> -<0014> <0055> -<0015> <006D> -<0016> <0066> -<0017> <0053> -<0018> <0041> -<0019> <003A> -<001A> <0043> -<001B> <0070> -<001C> <0042> -<001D> <0050> -<001E> <002E> -<001F> <0044> -<0020> <0067> -<0021> <0033> -<0022> <0031> -<0023> <00E4> -<0024> <007A> -<0025> <0032> -<0026> <0030> -<0027> <0036> -<0028> <0076> -<0029> <0079> -<002A> <002C> -<002B> <006B> -<002C> <0051> -<002D> <0077> -<002E> <00F6> -<002F> <00DF> -<0030> <00FC> -<0031> <0054> -<0032> <0078> -<0033> <004C> -<0034> <0045> -<0035> <005A> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -409 0 obj -<< - /Length 33009 - /Filter /FlateDecode ->> -stream -x{x\U0=sssdd&I2i%M+Mifj@IJhP"T - N S.=VOx|Zs={2{wٗ+@#@fӶ%f[x@•W]w]h W lo=wxٶ |4or2r@du]z3𻁭6n \tp{A̅Ka\ב3J%^.߰gx0 `=| }*eуq8%3,OÍ0£>A;08!0w#08Z -hyL+Jjv3( -s=gneKxނwC;EXPCZa >߄ x_Xo/?nNW XaͰ ~P2 -"3P=jEUnt*Xxϔ߱Wi 8p #^@vC)AGx^o[mY'4qexX) r %5S?-x d,3Yۙ0?c~op ON@?! MJAVPg (2jt ݄nCwn}#=|pp ny܁U6| ->_1^faF,,[n!E_oTtvrv04L?1}PY]: v=G<7HDaTQ7ZehZzQ/Z֢hڈ-hACG_@_B_]tFO'ѓ7m.z `'8N/ǗUx+ފ0ކo*ceL 1010b6ɦvv5{yek\pqϩ<&UTT*ĿWQ7)|[Z2gcoo 2N QPUs+Jth- يVgQ pm̕p'T kGQ {zoe:k~{h<3=¿=6@; |5}l1\֢r7ϡyvT˼>0a4nch1z^)I4諠Л =|-z%TԂ1A -FvԃO^iq&_AO•:a5|834k.fpd_6ށw $!7UFfep`(k t`',8pwϡ?gg԰dN~,]<q JK;?ZxM|` BP@/‹aB\p^+CG.X_yǠUơvr&x ^@Ga!;`!(Dxއ<)e +!_C `7lp -?;KJ3۹aE;–,a#]8WC( #+Klmk_68 "!P IjߧZrs< RXa9 k`z - -p5\ 0ۨn0v(| >`/|P#Cx~DƟS9^%~;x ކpUv~kzUW^ػjJ~9m֖lScC}&]Jʵx, Rz.Y-fd4uZWq,$;]R)_bc Sd b. RbDP.T6H+ Sb*0 C{*)uұa֮ K/-$/17,TR:- :K]۶v/H%~#q6Z]GCJB܏`gg~ jC*Yrt\ -JLsRϊ`JPǦ/)dgJOF ''F, _ooްl(0%gxAy)0,Y:v^8aF;ū%2)p6HJplsa*do+mTR"AzwW;  _2zM-eۃnrrܝ誾p x`\x&/u4.\qn(:-sE‹JJI$ಾp G[V R%+:.i:G6O0(K\TKB '?a -*9Gh%a_Rm-!"w02.KR zJhC-- y -lL%}ձ=㠤B {/9wx8JԱs&aVB+KVX'u<%.U[Pu%6ZRE;ū/[G8Z]ΫJ֎>ƃ CX;*Y:֝;3ɹب2^W $/ `yPrESMx W {ȋ>lZ\}%GKPb]ҕ+bHJrx X!WT54Z}:lpgƤ2di9~EͣQ)7$6iuJ%W -sR*&JKjy*WTzfQxEKCr ;[KpyDqU:EK%岾-IY=~93ªag+eMNSQt{υ,d]r'<%TH#/atܷA<~v8x-O:*YChеreK3˦!>.mjx[{`_r4Ѡ9, -N C@7n)d0KIy$"#FƔ0ղ2Mĭhx]zx?zE ='`֩tef9-2L\eeNF́6gN̺|-p#lόmphfoC% D&N4|pW&-rvעsu şd^_ͼ#1M0$<`. p x0 .@.Q,y-#:3i1"p].'֨LFvB,'ǃ'CJj@ $;QT8#WL(~T$vs.= v~t!snNnT׉#tϠbqhhhOZrhΉ%j1,Wr[ɲ oQHL3-3'̀ F-3' h egC^g -2ۜF{0Ҝ57cp6P*?M#k'ړɬ8l%+B#57ړȬ ;>d?}v́hIfţ;KgGM~ 0,L2w02BW ܛWVkuQN{z\9, ([v(v 6RO[>UWL(Ƃ{&&^ق{+ *R Q$ QY.Zri̖\J(HxS -ȲG٪6bfdcZ"[nt*&Gƻ[:CK۔>KZhet-Fw6_ЙV9>͖\:S_xU8647dbT$8mUXsct6H;*^ K?Oh ctiύZN^Y߆O._u3>wMGVG2J54V%ȷM96z߂/b+ٟ[h͕S7>g@rhTH$BD ǭ <4+'0@M:n -C94!.F&?G%7wۢbqXL珒hq(M|c+\*) AS\::Ӹ,K8t-YsZ~m_EMq ^6:n!M<@ޔ|L>ZmB~X$_b^8JgxH]g0!2ʫM,BXe6s%<ݚoH_9Ȇ7$nH~Xx_{̻^}B]gPaTF83R<' HڿdV->.LWXȥ;W*&!?yL0$"0I/">E #`4ƛL0yfڧ*4& TvykI09E _y2[*v)װ!"anE#߈|# P1HƕC6mSLksne\\%W ~K(]rzܓ+!Κ W}ak.)ZTebaŒKJrid%ES :@NpZrzKJ\R4?ċ7Tbv.m-W=8P[eˬd3SX,RmN'1ln$Ұ9gdcCs  >kX|z@4އ6v0V*6/k4 =og_fq&Q׽7kݨλV:/k˭dW<)+)D"v+⬴k5h-W~H;kr 1V:ir2RAcɣDɲ|br6wн\yZَ\yOޠLdچ9ŋTIA&(dRrz"8kgz -rɄ\djy7eY>~ pL8Zkʞ#`֣}ͻ]ڟu]=>t-/7ׯ7|(r*.Ea]nͳ12J%x/v~%)鑾.+bY.b뱢+`-Y'ǭ'*k;W&'I gNۅIar]89K>CE44\aP @lRTfh7s (6f[UD_Dzp-~ƚXv7 1Rh($H!NeՆ{IG1͸@牚ydM:ϖ+#rOrfu:O2$!7 +WgP\L"&?D} ėx~~˳7q!?ū6b)l(u$[ 1囲n˱Uc%G:"oILձqqF(SnjFP+~>Vgp+&X2Fcd(%#sڈJ4M Q]j&C@0!)y؜KՎbqh8G\vhm%wPu2!+.+AIDTTGH[i# )FM.r.ɜ3HT!7 !יP94`̞2f^ǖՁ݌(I$6Yh0Fb!hkoK?#??= M+?tn{^_^[_UXjJZjNs%'.YM*D#q\@gLTSFx>@UX\9("z9 "Ęqy|k|G!,8)L61*&Qh}6 5V ^T%\?q\y"yhB8 -cǪG*aԀL -VLcyE_ x\VWkIb =xѩ]B -̑@ iL RIKԟxܾLjO Cĥ&'fjr |8y}HQC$w2sї25< ḮZ/HBD$RD\AI"Dǣh駶,l-Tjd޴ri9Ck_t$͝Ӌ=H!=h޹^Sdp)w8 >:OU!ΦQKFԗ+$D'B,zo zk$Xf)b2\)ͼ)>`fr 9q(\DjƐ;%}gJ%z},zr6$%]oX.FĿ4"}y\wMm[SB7~n1ܟ1 àa % 2apʕ'ڳs3RA9L#fgR uCj\c㗐[+z%^_B6(!#[$@B#p9`,0ͬM(Jp4"?G^fM͹_7w=j$zkȚj.ܜg:z`[NLgϖC;湻@!<HeBJ2iL!Hc -Ah}JhNCb -EC2)W~q`k "nK,WNR,,\y%BA& -UH,94B:,7& <=k %,$ ݓ\d3~ZZT -j -!Jn#Kh"a%l&@IijDn (F32,S#tcc5=k,#'Ez"X!1|hVmSjVsĄߺ8dH-k.л1RBzjюaڑ%bgkz9'8is[ӘzD/c^ȉo͘L3!IbBѨzi^@}2ZEh^ _l(|tGo@iߞ D=T5A Bb-f~C9gcY."GcRVURgGYƧv$2cR̡DYR'a_.3F.\/Bq$6Z#QILAjV](D/RH$ v$1(%H Ʒєozt UMZvsXٱEt1*6b^ĩDE2" -ĵPq(b{5&-vzE3``"QjƘl׬>Åp [3DW6h.F]%sJ3t%sl]7!'[k.o$ IFC'шږ(HR.AqͩzUtL,{'2a7cIXX^G ]8ݔ&$u\ԟeGi^I1vU<-njM2$UN(rrJtHbjk\?.^oAMS $Q2`tIbY>p9O[5QݝUuuVɩbT; N\ObZUȌaNYu<S'$ل5|TB\UDz+[[[[PP642ǃIs.I5^@--aAn)t'4 rCMٳnU8M(Ҁ& -QHSD)(b=sIH3'I0'!Ϝv椢 H\\bȧybWUa\ǻOtJsOnl xtP(CMO]0̣5 -`xh -`A8x͝iq]*zk+!vILh07t#D[-AEFgzUuP/݈t~\{`$>%Lé צWUD0R $aw!X h3 QXfLޢ<79CĞQ)h D8&tY֯W\Z rqx;'QZPXc ݩ( YX E٫D]~9'db?+]^chTrIgzvek!UV& Phmm-t= nX1 `8)LfncҌ|1ޘ6M6 |-!&Ȼ%d50:.)hXͺ"1:iiՍ7Znp|ZW],h99{rzH8m?eeOI-uIlSs3DRcrw|U72{%{>ᖫ}ٳ#[3̝rY JWhgT>3%G#j }+4:+W~~zIp?:CG =Z6aBN{ؕJ*q#09oօ6]/miB~ ^KugrwA3~k~5k(R},I4yE։1G lS(O.HLQ0E©uRd\@1S|)$Z$X0'!MIŔ1l3;$K$q:MlY/HA8J9h$KHbMf 4ǵyRgOKEv&GA3q?)8HA -f=T7#I+gi$jmߺ|%ݪf3EMֱV:zUuV$ń\uR |qH ?VuM$śe<3KhƴE&ve-%n^4H] ՓO ؑX -RRBj"u<Ŧ[.^^Nzb^Ef<)TڳײZhXaę0pytH?ciA˲jfyvAdYluM DSmOkj㍝)ߛ~z$RGO-tiuHĪm]̭p3|r)w j?w.!g|Szsnx e,휡DK}N*dUQǓ! ~S>[r09cV\]kjQkuN4FN1RԔ]%x$~[K-Zh DRU]AI1N fC^8&PȿYͦfQ0'U;8ۤk I  %έ.pp?h>W/tQ:QޏQtA =e";bXǬx:f-Yԗf*k칪w.z>U"~@a /PN<^kr{A0{( GDg9@TTiuF_Y0VUDuM7b|6877Yf)čNmsP۲/2_=7rI{~E1Ӽ( M]`G߿0V|T*ϐ4 !Czg3Sɯ IМZ[=Ü5sx?z.WÓ L XQ 6nrF$U' -g"DH z""sN8O;']MUrssܰljg9suv_B *MxPĠ9MT7;iLz_?՟sq!Xͷ:"09ǫpgb\pyV}=׹]cFfn@2|0Ty>=n)5KF-r7BXY#8NY[7X[C!@Px!m~?l!KfBeM>j4{juzJY2"0ɘjaJ ÄzhQghoD'6r -{0  -U# OB ߜ!ʲ?"e»Yi09ZR~^h@qOX\Cβ[ZVr)t"#-yLa[H=3otgmrH-kB`aYäĂ6?da|9ܬDVеVhz C,z*Y6 7eLn7y!H=hKryb35ds|sgy8;g96`_gҪ+N``7 s#;8Ca 1G*TFM`]TH4pg?0e{3 -"hy?  -sK*ӎ@2q6ݔ!/EVY6ըTKUMl47#q>qOzgM_?{LnT<8 -<`6A4 $.QhAS(W:yw6LZJ>+3ja_ iKMziJB ffJ6T4F\ SgR -Y,;hYFZH-+}B:mPFMLݼ\K@$qCޡ$bC̟0h#+ZL;G/ũλBm~8L 3D'{dɗz7#u.kċVE\woW˼e\< M -b͗F/ /k8CJ 0` 0V]23.K32+CTyKKo"%HwϧxJOU4fqKg='XJh.TKNTpFE 0:r\ 0[GP[0-Ue 3jfZ}zvƚ}CTn)5:\΅$#!uUN-ڻ]Iߞ4qE05AYώٝ1 -y>R)( T_{4kOr:Wn3 5]%q2-h>_*ڟ%B,qBzdo)IrY[ciw:tiB;K1ҌygPɰdU߳Uy:+Ad*r.QI#:-#2*DiʹR n!0Dz5#K,#ƖaX&,ʕ6GӲB=|tXFoK/H9Cl`첩ꪩL MI*E2&Kj!a55ֈ)}#I9.6"1QAV5SԞD,S64\%lb,Đ邪u}^'rlƔk̘$bf]z~[}+ԫ_3pMOˌ,6"b#?67R6" 1G-r#Q/]k:Ɨ1鿍 =f;?<"ZBՓ\̓>C@:&u0 ZҐD"ɥZ] 1 +5gl.ԩέ]UNtuQcsAi},X@< h~2=IKa/Z0!<T8JVCnВ-j1 +fJ\ԟu9mL2E:r5D=Y'q~viM*[^wn{Kn%Y- -ym !&8`$Ğ`K|%/m INI&'O<ÄSe||9վܺUu[!', $nMOb%94L~;y{7dfv԰lpb=A+ A,C3cI1 !ur9U٠b[c%<Ij' #DU`CP3[@n1 wQ/F;Nj \&f"j uҥJOvƑF]G% cR\"!V1&2hthg\h'! rGoM=.^ȵNJY1MTo[y΍7k30 dƞOcm7o#dUmqӽ˶eN `e}]zce:>Ͽ/ 7ݿ.b;V?=~:SOc?kنqӶN{5Ė_9jr Y]j9=psdg'g_h0lS{e~{eR-5kZ׺CYaZ0psg;쏻Ҭ~-{_ϲAnholT42w݃>Px0vW==ّ~+aW)ReÀ$&0'8agRqv sc ԚK|S 7r./3^ƻM*zRk,a)c`IDP$)8IOIAd$&|5| n %ѸHD*֞*\Z;!DI$Jn3M8w 1+)];Hnn?/쟳ÜϽ-gVEBcd>}/4?,z=_HgW*`K7u +7s ԰s3;ޗzЫ<>ޟծGs\lv1(H댒*oti粫#e,S|߮h]Xmg>:9<"&#zqW]O7.j8sVBǩ /]d˼P. H@Mx62s? in`_Pi NC5Ӓ:to/ᎲGl|cs-e>?^}~&ΩEc7 +nml ɒ0kzlYDykB/t8t!C2(2GPs%2A_E7א\Լn&Dʢ~w5rۼ,Fk X"8s(pXA,hmǠ""p4o3Q#{=H&hԁ=[ f"KpLe <_^uYAܳ[JF>9Mw{|@. 7Lǿ`6,|?Xퟋ>RRXQq -*)OIl~VYѾ;>_9oߺAǃG - wjzn_ZqKP[V'W=-{=wM6oHY"DRƬL'""Gp?61@ԯek98xhQPۢ -qy`1Z, $!E/n/Ce^'%kyh^Wzbmڅ]#.uA <^ -J֪5эɤi7p2RE!z3328$"WͥJ`bV,L}PFDNMI^2"Qtqq#/ɮB`:>,Ϭ^~j=Ik?4ͧZWIvd_c;Q7Eezbq'#yv̴cX wj[n%ӤxǺgG 9;dBu_L L~bџP6Ds(@Q1\}f ȩ@_L$:=A81 فD^0=ӭ%G{I]kZµ^ÉTHuU -mT":ҋ^h]*\U K7Ubffw=f]ͽrOvm${aΪ xj;TNJ;uaLi|]k}Gr͆k.V5+tLl;WBD~}͈~W^@(03(S5'J#{:_ v(yUֵK#s@:L.Qqv|Tt@ֵe*W2=٥M0Z9W@9-[2VW,7Bg;;/cBL8DlEy*jMoVEѨVFiMR7 -bH˧ԙn$|ݔn^i/N9gr)p=X%(F0\SRb!mWA 8"Froo8/{vHg'ڷ)pqD*~.--gcmǫN}t6|INWikśڛ?ѶmVJX&;78;/8YpNɊv&an&{0`GM菲L  gFdh͵nakr92a4Q/8AGɍ6Q)[&lgs4~Ϫf2Z64lk5wd.;Pg"Wu˃_RrLhKBj.-Yp`]pnx3̳P 쯭 c!)j91lkvt3 -{ޤ)hvر1*QjWmP1^lBC&e51 ՁNj(Z>)<#M6?QUZ5La̖abÚ0RvRe zeB b9`#'1JvdCiG}JW b\v'޲K/ORh˝„0A94RT:7ػE'. ŸVQND΀q-y[o[&|9Saꗧ96^F?=Uc,y%:m)[u󸉪@iNo1zU*W3&zdfGZ5jMhVaIw̆olzظGѲA\ -WzdʏCIi HgTT.pzoqj\0rMf)Zֳu[!/15~GǷ?syAz}a!Ryl.sjxΩո9Kanޥ6`R;)Ʊ.<<ʽ߅YG_@PeV\$Y]ϡwrYf33/30`8%EAhI7 -z;KB8" LWYqz?_"(v(3BQ_..:;{ծD)9v*J= gO*Uc=bY&D9[J0@uprmDo>^~ȯ2xwY3ߍTE\S<1[?>mۗNN^*qj;_PT@1F,]@&»!*G9!z8z!FaP+B>TzJ2KP850bԚ=Xm"p1kQFeFs7nFR7pR7npimd+*E=*pT[AXt\cE0sCK¶(K(?=n~upm/L8W\y Զ?M{{ԃ}?&8Ɓ(c +&?Otj;8!tNU wh4ț]..U8䊻XW@NIQP?qY$C r#Wl8\qpEsCiUjkrsՉmGû8P/NQХFx2jsn$ -nC(v#Eꆠ^.*n@8-h|LNTDSe -WzL3TkE5p])ݒ!5~O~Omg/^e5]1}}.>oGShګ{WlW~?%C:5/ 1vWtmQs3-H5H[>mɡ5*p< ֕Q%eVr2Z aZĵ?q}jZy -ZzvQ Yf6j\e̒%\i,D{1oֶ8[\;s_p?9| -op'SSӮ<|G=w!Rƫ7P;Qr^@c1l,50>={|Wq̝~anvSMxx&Xu-Nk?3|=J.m)&@TDv_u.w://{IED_^?f*夎ħO D'ݐ -So|XG#]DSkq5瑬ll`Qu VX|U8n6@!Dbft+O.X5e!sgq\FR(3f >#oE"?ʿaU]Z92e|U3`x>Q#1YeT? -!ў2S8d: x;v">=s]ը,jP"eʲ5e4b>/<UeF֕kk. -Egxr7&,g5)溏U3l zTg,lkw7y'?t|$O0<P98_:\"" -.2$۝ЖUTh -KTyV%nPqBĨJ.Kr>SvJgD.]bB+IP.J|0S.*UfȚHGcz􌭲2.@wM~؍rqAi)Y|0Z&-΀1{kNVd9q1 zO>on+~phǼc 4,k,p"ul&FlV@N4uNW W 2<b 9&V-_J 'D۷.b)jhm3v/U/JQzg`~wLM)aEME\h,IzQ j'f&!'XJDEas* -&O 7UH2TajRb)E6u#qZ!Qſ-uT&nD]E!sz1GQ$jܹs׸1R^T(ZT)'Z@j=?=;1ˣܸVs]BKzͽc Ȍezyt 7y^&.TRDs^؄UhRbCgAȼP|AVfI3gE -]VWZ.W0l+t͂HQZ+KT}r EĞ7!sRqTIw*]8t;V)&<*j\JcZ" MfH*aI,#&A !I VVY{S=NE.SG%=:g -9biH QzͩjOԁP+VB! U˄~쟡2H ۑCB#StqwEs/ {Qd~b@T[ty1nɡ%M91n"t9̄Z@,k1'eKkQ($ veG8<v9sDL#t2Ţ+,kQ\P~mo.s(ۚz; L΋z⓿sNl:Qr*HP}J-z}$&5g@ڨ Ȣm;(6C T[Ʒ44mDo mw>c} 5鉑DԄ>Ixf#$i>xDTdϧӎpߝr3Uᥪhb:< q$JpEtq)'@rz+;D+-LAat"y[(7_kIdĤTWjߗz3f/$˜G R|. )VE\tIǓ'.2+<+KR"nAx~li|i}a|}#G$r9LLԷ#ߎ,*V>quyc0ܮZY\^O_Ϲϵ/t_Hʱ)ifyFci?f ~ ʓ~0i~Ԟq. -Sd K5xYyy<Fb/8islamLUtʣ!AcB<z$Ed2/mYk2 (J0A=@|)."p8hQ?qȎ&{.t؅z >N; sZ2EAZ< m6Ert$D X; h6`~j1{#:_ƝfY,k'P#?7W=ađv2?$+N1i,`jJ @ W[ek뾚O4rz&xp -Nəq$F|qs&+'d 2t"Zm<ІSRQUnV[Ue\CXrn|+D+ݲ=˄w^J9.w^ -Y!*q*1u5ͥWDf9/pZ]֋bΈr{ҋ:/yQBFp_3NϘ9.h~'qh)̉j(U 8%9yE(r6kMn -EhDCY[g3_F]|Ozd͎D8`&1}-XsְJu1}ܲ"/6̭LSg1kemng|d45hP!̀1QUVY\Q?{a1Lpt&(t`G  +бcoE2ns@>xX9WUOx4 Gyc -4`lQd1o1p X(0q񔋊 S<=A]L)LSo+EܸjN\$ {~ͬ%L5DGbBh|W$jA"ET7;DyNt4OA ĜaZ%GD^ԄMQUܶyO-}Dŗ55QAdY].`FkMh P3αYe++&N+SOP7+t8QC9"^K777'~M6 ú׫5ކi]ʫB\s5E6<߿($Z#7v7 kvv ͻj O:*`2 dܑn - uu \*0;Q=iiNEkZR ϗKrM:4P鞨rZN:Fdk#k]j#:bBC(䊤Rlcv@ժTK Fjk#z{,˲Y}mMXĥOGZz &y~*yE1NȀb6BVR"l%}Z}#{*R@qɅ\$ P+F]\\, t]sLdAզbčCec 9h`+WtD%ѫDpKChLЫaSQqq rZrη rٝ]ou;N~ -w)Lh8ظ(4zEbȽ1 -\ -;C ànҘr9mD;Wx9o=BI|fjV1"tE#.¶ڢ˗M$KLd"㟎#7Lj! ԇ賉JߜHf!1bǐi9dKNL9`%eQC vŲP>%jq\#gV17^@>c!%+OHK/rkoE=LyQN?a絔$ZhlƱ(LQw0'ns[3 R2VmՂ,>l[؞%C^Ϯ(֞5l;S3y R/ [ mU;]!RÄYP-,:@1/n},h̅ZnOݧG#~_ =@z(FT{4^àdeH"E42Gr L0#>^rh𐑇4XSz]nyݑ:LJ}TȞW<سp-@GCc$#a:DaC~MѡCDb.^l\U ' A&QdI<)J Oݾ24O Kc= -: WF}~:о@O?uufe@&~ED0 b(VDFU?nik̰6S̖oQ1W&㛼dӺCJ5y4M<2LV,ѼfFi+',Yɀw[5zYشg8Id>A Zvk6XMuq͈)xJ{<ڂ$jJ'/pZXm/崺 B"h=f5ombZe I -iz'e_[JGjzZAyR)>6t(AJAqi,YG -?+fP$GQnr/W['lڢ^Ւ}Ϩ'?Iw܅V>P娔t&kels^mAwp|@&LrV:2*Ust'NxN^3kA 7++ey{\Y+@`@z{t̹8 /{{CW?-DCd ཡwYy:!A|?,> K{L`,@%-~ T/M< +T/N340z &հwU!Bb^7+XKC9 dć,Nܪ`%Zn 4=þ -sX*B*!!|B]wi°Ȱd0(\G\t7Q0Ǣ=_'^OnI[H܌fr\0 }sٴwg1'~KA=7MH3 JMGq3`dn kE7;# -E̩[w0?-9eE7{NJneYX -u 2VS0uVX2Q7Y0AK{ѭ_q+WJRŭ_q+WJRŭ_qeeԭQ[pug;uwA/QGlF|wѴLufg4%ꮠI$f/)2_Kn^G}A/ @571R A@Hv6C0H lfX[` o,za@m6`' L#M>Y :5 `;H64Mpk1bp; 08&;h;zf}Ҿ`.n衾<}mT-T l%_[a4p;l='x,wH)$ҷi-4 iOi]gƕ l7=A‡`#pM#b[C/F{63WH-/qXJ;}Ri? Nu -23rWs;Y2*i&'a:H_M̈́fN6:WJP u;Y,d#Lm Y'p5 }GH''$%c"xUzK| fOr >%>%-UF7 v #i=J?TLā:݆׽C a.ISuJr2 b3 7AN%,'iz+;:\+uLLSM2t&)@T_k  -QBp!+m p'my/6^U -fUF*Mp|_ӓږFI֓ʊx{qd^!J !=-YK^ uQSU_1?t$l4iHq+]H^;`#hmtXgV콆-{T:J層䛆[8N%!JFQYA+oȵOϜ+2 -l)²3im[q ڷǹ -\)sT).۷OCbHzm0TdnaV_[H dF+0/o-]1I"*}DFX5Rf͚k+Qi 6쀭[f@[ +RnZ%&Yٻ?(c.8UJJzXՙ+ʙ+0}':Ilq,d}{gJ+$e^[` c -'|mkon/ޯ\J8TUcE忽n#:0z/ -f"UVޙ+JBhm0Vhg a9jX A h ёZCס`uxjE iXKh46XN^ -2I,/րLV/#Bƈo ,Ѫ&yA_ ijg E%\v *eH7^%} Mh}V]wkhXJLOiJДh}Hm!j=?8IqPFCÇTRޏ?<\Oy(·ԇRϥ>c7sebu6{fUl+mest;le{xmG(nmgeR -f_V?0ςDo"4/}b=+| O&¯+5`A _><SxTSo[Zx"Exy0V9 -1W뱹sz1^QYJ 5~JxR L` -C߁4w &-~  >Y 99n4WC y|?\S^;z? p ? , '!6⃟@`G @/>`a%~JLU| Ağ&:AğP+pDEiEGA.ڟD>Hwanhƃc~Qh@@?$|2 |8%=P "M]c]W&-xû<9|w)JJ|7㻁 ~?<  x.QQ< paķ@9xe,.m<'W[|}Z[yc6[hq^O|}om2MQ (Û 7A xxX8-6dٍwUlY`)ͺpӽ>np7n8K HfpdpfJo] .8o T `Hl TDCڱ 6`C!4$%MF`wqa#, lgsڙ+ -?tXj~)$-sENΕQH5:P|S7U[,{/9%//a.ٽ"EcL5bsgf3As 1`cfA91`c1g!< yYhc.YP+̳d2| #.\Af5dۚ2G9 -!9p32=.5~=# 1dEN?='SV' :)Og"%φhPANZ'>)0hL'5R jY'v$KG -r#yL+6\3b}-F -HU2)" x j>ZV=I?¦CH:>Š!1"#0u[+ 76nxXJ<|9t{ǂjpSrx#@CCCC-C-̓-̓sh4d0Vo gxoUx7ޏ8pV`MCW7dFutuQ9y%JrkWoPGԇ> -endobj - -411 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /YPMKLB+TimesNewRomanPS-BoldMT - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 413 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 1 777.83203 2 2 389.16016 3 3 333.0078 4 4 500 5 5 443.84766 6 6 389.16016 7 7 333.0078 8 8 556.15234 9 9 443.84766 10 10 250 11 11 722.16797 12 12 500 13 13 443.84766 14 15 556.15234 16 16 277.83203 17 17 833.0078 18 18 556.15234 19 19 666.9922 20 20 556.15234 21 21 666.9922 22 22 500 23 23 443.84766 24 24 500 25 25 556.15234 26 26 500 27 27 333.0078 28 28 722.16797 29 29 500 30 31 556.15234 32 32 277.83203 33 33 722.16797 34 34 333.0078 35 35 250 36 36 500 37 37 333.0078] ->> -endobj - -412 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -x -endstream -endobj - -413 0 obj -<< - /Type /FontDescriptor - /FontName /YPMKLB+TimesNewRomanPS-BoldMT - /Flags 131076 - /FontBBox [7.8125 -215.82031 807.1289 677.7344] - /ItalicAngle 0 - /Ascent 677.2461 - /Descent -215.82031 - /CapHeight 662.1094 - /StemV 168.6 - /CIDSet 412 0 R - /FontFile2 415 0 R ->> -endobj - -414 0 obj -<< - /Length 1124 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -37 beginbfchar -<0001> <004B> -<0002> <0049> -<0003> <002D> -<0004> <0067> -<0005> <0065> -<0006> <0073> -<0007> <0074> -<0008> <00FC> -<0009> <007A> -<000A> <0020> -<000B> <0052> -<000C> <0076> -<000D> <0072> -<000E> <0071> -<000F> <0075> -<0010> <0069> -<0011> <006D> -<0012> <006E> -<0013> <0045> -<0014> <0062> -<0015> <004C> -<0016> <0061> -<0017> <0063> -<0018> <0079> -<0019> <0053> -<001A> <006F> -<001B> <0066> -<001C> <0077> -<001D> <00E4> -<001E> <0064> -<001F> <006B> -<0020> <006C> -<0021> <0041> -<0022> <0028> -<0023> <002E> -<0024> <0031> -<0025> <0029> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -415 0 obj -<< - /Length 20705 - /Filter /FlateDecode ->> -stream -x |յ0~ΝҌdF,/+$g$8I@i-JhI) -}!!(ZhI+iGiMk-`3P}{{23sf ԭݵS`0t-_R0_eφ[~rq>H,7n\?Xv,@l;wx+pߖmk9 _>xq3w[/_7 m۱vL"VW#@F](4Pzkr~#2&7N3?q1x sP' ta-m& @?`>'Z( b>p,õnIX=7a1Zh{>A ү -;&x~ -%X rGJ~X[KOc\*alOý%&8rk`;JB+wK@%xHd(@4B#lt p1Spv[~xƣx^8W(pop$! K<߆n\\>/d肭nQ| p~u\ĵ M@̃ a | Ex5OvO lRkyA#x ^nşO3ǸKW2~ -C#ZЉ"6b ^W(DV0kgJ{JAbP6p< o0~1-~ oW Cbg~ٹLx4Tϩ^lSP"<?G ؏p~ -e|O'^ry@^! Sa`^f#&T2Rc`/J**!y脕pp/#p~?› Ç -a(ak0 -܍N|__~DXHDI5i&:Gcb$fs%s*kǹwucOj&7M<\jt` -AfĊ a 0l]zQx -_󥿿?I$!4^-؉j\WE>?W5| @dK~r)YE֒kɭ89N~D~J~A~C>`΄$\`F0?a,cqܭܗ/s~q%ݝuE[zY߯_EU_K$؋LMk*;"6Cb-wr>~0uo/| k:Uh2ނ?w1[ċL;{2ܗɛDO`efß -w; -'/P7!,|zl!;u|Ó' {N-M:/٥-xGR?<5`>0oY f1N1a~ƠI& +(af9Nz|Us/ýDգ68WS-J^q+d)1gEN3 0\J£p9l`&ͰZJCJ0(..}d.D< -zp3NCЃ±u0 -o0. wC]=\ 0 3hBm+p60 ZV2|:CTA ̆~X `\ g~ -|~÷ $\ ofX`ü 1`6F!xViAڸ"ɾR+|P8 ~.ɹ>nk".Bn쀟#^Z03CeK|\֖lcC}]6]#WxLFp(XY j1cP%uGG؄ӓuiPI ӰzDG3"GG*ȆTH5b$p$q8ri@W^>9@$.9Fwm<еzN0:t {0Y`8., gr9&rG\}]#VȌ~p!(B-[8xfFE3Q~5jȐ/7d)D`&+}gs\PswxɲZ`F.{SW -^Q-ȲZjr r^ruP,#=FW)DV --Ml"!IMWT\vɦK3>љxK1lK/wIv_HstM<BxSg7gn`>1ǝɕxϲƄ\j ;tDi̛ Fb F%G%4@8@f[ʟ6aI1 FM*Ө|bvEF#.DVEEF"]^0]ЫJ 9Y:㟀()GD9x¼5G7fЀ  Coy>aLdz0!{&N*/fB|M0.|M&;SO'ONԾ{ohlҵ>ST5Gҏt59;R֌#pea#ߡ8:D2ۡu >f; N•u[X(,Sd* \OFߕ=#OKdbxgKW/o3ѣTlV|>3dvOD(&ZESl]/OgYU" /(Ul"ų|ͶkS5fwo2 -ò, ò0^PJN? cj,C~e{uuG6RŻm}جl75^0gS`ؤ98 m΍=N}yd11 _YM{]lfFgnm}e6h0e0 -vx Q:f1ݔ_ޭY&(FO4< mYZ*^{3|tUOQ6*x #j2D]b˞PEZ?KJމXPx_qYiL2r™ -/ uQBP0ntQ@1dDQgZF3| m~>Ѭ.0!J񆰁3ՠ?U5+UHAhe|*)u ,w^):g$oȹ! t -o{c@G.i1gD+]Vj1y*oJ{!Gɣbuk ?N_ -|X1S+n|QGNWzJq<8\sΩ!όdόG(&{>|RQt=o.Nӊi^S[>v[b:YN. -#Mnfnӳm܀2ߞg7n]w܀Wuܺd햣q5Q 9NUlob'N'㺞N4י3cn\o36%șOXdY0G -kYX -RB0TV`*|eS&+ \N gr+=or(T_0FOZ1ptէNL>vřZڙCwi{T|iHxC~"!>H{ -j!EҨbٳ|Q!T,-yGMM.f 8Hbvf~|Ȱb-(ųfiXH_ ;'3!v,`-s1-2?`D+,MHƐ1vѱ,̄j3V,Ya"~r 9@""gqY`yYmYѤu@U8 Ҩf7 Fbue}zuh0NBؐ6LBM@A[@NJ/Nt*f[͆F"d0jg(g6% ۨ#'WϢ }".82!N3g( }B9ezDžwLAȽ#ҥ:nZ:MUX:MUXznԺJ^m?bJtw鳄@;°KƂ`t[(<+cy@Fy iB)%{ąTΏ^%lTLe1,zע;$q A4^u1+-ϭ\; :.si`w`wfK2ϻw\`)QT]TO#*U H -E+* +#}ѱ(#D̩(F=ՕQ) 7Gҵ"D2 bb@PM)2Dq[b8f%K<( xAPjm<&rLn|na)=…l哦W=tQdUgu tSD!n[dYZjZ%cUo&,m -W XN<˧HruzzF"io6!1001@`NzOaH5O.\0vE<k[4Z2CՇt'a&N6O|ENEiyy*qw uπ?tݐ>T,{r gE:Fo3=o:AGtȅunvK(yݼy.mNUX y:A!Wqź -{x`{5nD<dXnQVa@JfC -ա#!VH ȔEoe uLxs. Ve -:eZ -eCp~AȲJx ^GzQ-lS -kL#R\NOEj5&_h=ist6ԴN~zoP|0s]s8Iq](f+<0 sicX45Ku,ʴ^'Mj5ҚyA-ӝd(jAA*BBJ.á"s!{⩖tY j8hQ!J?;}VeYMΜ) c*ܸ,˲ \ u 6VUFWsscYۅqzT0N&|Yj&kПrdZ'3e)Q<[Օ?չ+^om>&ڮ"\Ł@|v><7)N{^6AG,(LHE_5{=6~ @e TGuP:,3{Ql)"U't* 5B/sUIHcIm5I[_VgAk;W(Cܐy(>$ԍt{M{CWR{/~Qhm{ZU -+EʽZ> b7W] FhwW#&mmlh&'g6u/ٰׯ&_412mɎEk |s[.bOڹMKN T2%D+*/hꏝ%`̳m*ZYd@ٚ AE*7X#œ$p$b$q:[o4::UkV:Sfu&٤SfduJ]}V$:%9QONWtPԽ#/Ⳋ)DfcJGSmFV-굲V-ֺUZs(•a86#PĜayzt=E豖YԫMɶ"˾kÌmv|RƚeVQtspn*y -Ô[QV2Д*6:)#[*r;o`"Z#˚k ^ ؜5']7#T_gh Tf_(>'a*uXءRk,lWU7| tQŞmաNTvb2ۜ`$FIY,5l%jG{M8&JY𨥒IeG*Hc>}$Z]Vf6ծsWҌ=Mҿ%BZgRhvӳȑY#Fg1YNbf"徳zu* >ztQFP?Y$)+X>4[9]]2QՆP!X3,!I'4|^ Qa` $6F F z2&c{N%fZE"Cqyk%t,Xk:*qJW,Ӣz:.VnY~|`QOzW} -eQnJ.)AMz1~WEܑNvLWY4"ddg꥝K[XKkDIz -Tث\y],[nydž]魧mF݂4r똟2?3.]Mm9l"|7` E M)jmT Es%%caY"6o),=,6Yg -Xr9p*3x'WI SlrR#TNjT699rRK䤖Hp>ILz(MJGSlԲY+굲V+UZ -WJT' u7hTImZfR1cلlrTAQTMqSaXsOdY=RsFWMj|sdOexƓyQ}Ӓj}kȎ\IVyl.P}ʸX8xQ=ccT-Nӽ̽;]2t˥47a8c2F_7>,˿zQ zQyq}kn1sA]D Kp[v܌GqszRXkxSky"=oտSDxT~N&9//WA^p_iFЬkGD5|J利ޱ0& o O]IT0uQ=A(SUFʁkyP(TO&إZ9459AYaY \SH$,+3?3?ܢh9S 1;nK7nx/NyWuC SAۋ]REe|r۝B < -6cJ@Jgl D1v>3۟:"u)%՟JIFS/#jCQ a-N -WTK@M`[F=CSTyh꜡4zv9⏳V.K~3&x&1hj It$D O>HpC!qoaӬ: Fk?a h׬O$Iz -Q#RV_ wMr#י7ΫoN^-j͟WWTH|{y3vr !+kp7^- %ك1l¨nL@ąP|_H"*4CUQ}6-K*#If -eP3g& W}qg -6Sr}nQٿ6~𜬃լ[= r2 G6ٌ :..v0#=Mr Y A$W+Ie<')SvQ}r6M=\TYwlr6{[amXM*SCTḊqҔm9WN1PMC3g~swuO.]:eA?{?/>wlӷ.5>r-Ů}g }J7Xh<0 X{K~VUQlV7t[/]roQx -֌Ւ,s]T 朶ڕɶLs>K`b$٬лQ9{[>co\NN`^]zb{<~ޕqWåRb2d/EdNq՟u)( \*ov -8Z C#lZYsʮw(Gi>]!gQd(p({N"5:N#-C{9jU G.os&[_ߵKff" 7P՜ O}714yiאxĂɏrKWuXt&`!Jͥl 0y.L0:y9BʞrY4uKfd+ڂi -<+p3ij}0Z)bER'R2oHf4W.~W0S:9śYkg&qmoG/ " -oNv-#p}oF۞[8C@U4Lլ\@cxa*Spf\af13<f&* Ϛ`o°¹گɖ]49H֒r|ǜ -vݮy Lee#sC74n yjvG榀?d.=sR6o|=Y"oZ\r}qՃce8QƘ -\xǤl +ޓ N9Y%!gyYbVX,-XNI$EZ-QS$"񎰃8SfT8 >-i gŖ5Rx&LR5}XO"yуhn\5ys0"I<CDpU.W*ou$!x$-$[+LTrQQZr5vP꫰ C̰TbOǻFE(&;MáY.25Bx"k}zu8Z BN á$^=4ჺ=m[,sgO$CC5x/Vt!ADFqr93pΜʐ̑ ɄP|b<VՖl/kK?C{{i3V[+bq)NtDU2$:[>T(Gr3g -h9y|™3 =S@r9u{9ZO}H3-h-}Y֤~,ѻ>:#5 -~9 N`\UdP p ?Y3`M~(ymQo91H[*^@sNtXXƺi*u&%@ǙI~3d3o:n~iDTɎv3Y0aLj8Qvtm֮i漈ǟ@6MɱaV3_C@@F@N3* .atpiAzJ0&JRd3M71H A -1f{ K$ ";m6첡t#vgRn#,z$>@1AxvLFF3xHXHWJKIJNBBL(ľHB^oX({' JS -BM4L ʪ_鞳(%]`c95R K2 t2VY<9s%]tcb(HtHϖ!7=/\<B -ki@X2]Wn=͓^rQ#kb:'5FVmxAx_Ōz2.ťk H]r9 d |jZy'ߘ,njX9 ^G0 fy:3S -,lˏ -TG?/wNBA̪EW Ym\ a+'h gY=$pWǿ Mb D"l6(<>[@^/j.5MRrf i'1bdvw'c;y ǯ骉ǫ.D]orPD67q7E=D>o||w+zA/f_DDZWL/%92l )|;pjf*o:oOVP=f!nJp@9x#y<,&T Asi|F΁oe[*>gP6urWA ?Lv|xfAm9'kJ]2AHǠenEL .!;whZ6Lf~VB;t`\b3L++a$QQ]`V.s;O(}z_4D嗎,SE KBKԖyp/0@0KIRv2iX€U;ܧu,Q jA}}|fѹh3] -ԫgE|z @'{gl>Ο[]Gu]syVZ=R,]B^v+a\Vo] + !;1+upǓdM$hb55M{7c?YޙiҎ J;uukgQܷBPS6jtϽ=wϼw_Tň4Fm --]'ͱj n4,ӷ8Ͻy^7ž5B Bҿ(ilUh#6ʍi=}GklyF=ch}\27[ՕJgf2 -ݥ5jmԚ;gjmign-oDc:3& {n!*a~~d51_ -0ޙOڵ|j m'Y᳴lqAT_lX+ wԣBFRJaV -JV*ִRy&lMkWRjrZivqA٢b^y_-ԼpyaMe+iif7R vw$P+|L ݚ^ԼpUܚš5/Li^Tpi^Ҽ0AXY뎖k8tkšiU5'kNhќpՊ$S9 q)fCbn7hS9E!_YޮdxH- 21`kp3FgaZq=0ZC 0Ћዲz5E%'I$$ $06qR'IWɍ˚5v%)3Z Gx 'xst+?u{c>>5+[b`- 08JB E , |R.}@ZL Z"YE Y:B={d¯@ ~8M7Vb5xZ -+ЋW$^j!Ǡ$^m*IG1Y0 i6# Y:_ <L@gJAg치4gT8"~ H OeFotǰF&4pc;v ݊mbkmG>%YYR+-*Z[ -|EskTj`h%CŶl-, L lή`Ԍ`E~[lq՘-'1 IgOI f,6Dԃhk~A A֪0R54Ԉ BЀ4 AZр uЋ` -B7.5q5: \ Toǰta c ph00`L C0aab -,Vm5X }X iqJŕt:c'^>`n`zy/jz=^vJ|UT4 - =)rz`C-=yWP{)N; h18$YqI1g#M'&xxzzDnzM0g-Lہ&0؂ZBzH =.\iW5ꚗv UǼVGw 9V}ЮF0ccAy'`TAn6A a_}K -Gm?5/n~Ey{EMY=Jj%\%E7 _P_?y;iN'~?v.~UUcgAYUkRܮH3;n>' A@PO1ȍ6P;(WE>@8ja>Fk4 U0tMp| C?n8,GJR"w -_DrLI^bd0 , V -MA!,m\%,LS|KXlP(=߂*ES2Q.,v@&HCLZa=2nyDf6%!<}H&B~ ~*͛eBDu$iXFi1eFX,"UbLQa:xF yUBP/ńLl|2.,VNB6?o") #>sARi,*68qP2b{ȴL_,'{I)5aiLwL~I'6]XB]ҘY.~\%1aFD6Td+D:STWeR -X.1* oVY'W/ \<|LQ-6Lzb.qWr0Ū##f7=u0>(`Ug -,h/h(Q`Y҂RY,v9NSsr'8/]BzҡQSIOlݐMi{C.dLׇ;2}5s+v_zK,>_wXl$*Wqc+j9MO}//xIѕ/㱙C[Khޑ~aIgڠԒΦ -z]0dž"7FXggS. CHg0":@$D"6e2EA׃i֨@=c d$1T#Hvh_,C)lRZ/R}cQ?&~x?9e^P(K1LD0ML$0wyeUVOTc]2RC!15Z5n<=TF=bRģڍ.c3G6H+3H=?{!B eL -endstream -endobj - -416 0 obj -<< - /Type /Font - /Subtype /Type0 - /BaseFont /YXRKGC+LibertinusSerif-Regular-Identity-H - /Encoding /Identity-H - /DescendantFonts [417 0 R] - /ToUnicode 420 0 R ->> -endobj - -417 0 obj -<< - /Type /Font - /Subtype /CIDFontType0 - /BaseFont /YXRKGC+LibertinusSerif-Regular - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 419 0 R - /DW 0 - /W [0 0 500 1 1 557 2 2 271 3 3 500 4 4 447 5 5 542 6 6 390 7 7 316 8 8 457 9 9 505.99997 10 10 512 11 11 372 12 12 264 13 13 531 14 14 250 15 15 220 16 16 465 17 17 695 18 18 493 19 19 457 20 20 428 21 21 298 22 22 465 23 23 485 24 24 298 25 26 465 27 27 504 28 28 839 29 29 497 30 30 541 31 31 790 32 32 604 33 33 424 34 34 465 35 35 485 36 36 538 37 37 310 38 38 465 39 39 328 40 40 597 41 41 685 42 42 587 43 43 503.00003 44 44 528 45 45 596 46 46 747 47 47 515 48 48 338 49 49 730 50 50 465 51 51 661 52 52 490 53 53 519 54 54 560 55 55 637 56 56 652 57 57 531 58 58 297 59 59 701 60 60 465 61 61 220 62 62 504 63 63 541 64 64 702 65 65 588 66 66 465 67 67 646 68 68 465 69 69 322 70 70 951 71 71 540 72 72 236 73 73 272 74 74 323 75 75 702 76 76 699 77 77 548 78 78 351 79 79 661 80 80 435 81 81 829 82 82 582] ->> -endobj - -418 0 obj -<< - /Length 13 - /Filter /FlateDecode ->> -stream -xA - -endstream -endobj - -419 0 obj -<< - /Type /FontDescriptor - /FontName /YXRKGC+LibertinusSerif-Regular - /Flags 131078 - /FontBBox [-68 -238 1002 806] - /ItalicAngle 0 - /Ascent 894 - /Descent -246 - /CapHeight 658 - /StemV 95.4 - /CIDSet 418 0 R - /FontFile3 421 0 R ->> -endobj - -420 0 obj -<< - /Length 1778 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -82 beginbfchar -<0001> <0045> -<0002> <0069> -<0003> <0067> -<0004> <0065> -<0005> <006E> -<0006> <0073> -<0007> <0074> -<0008> <00E4> -<0009> <0064> -<000A> <006B> -<000B> <0072> -<000C> <006C> -<000D> <0075> -<000E> <0020> -<000F> <002E> -<0010> <0032> -<0011> <0041> -<0012> <0062> -<0013> <0061> -<0014> <0063> -<0015> <0028> -<0016> <0031> -<0017> <0053> -<0018> <0029> -<0019> <0033> -<001A> <0038> -<001B> <006F> -<001C> <004D> -<001D> <0076> -<001E> <0050> -<001F> <006D> -<0020> <005A> -<0021> <007A> -<0022> <0034> -<0023> <0046> -<0024> <0068> -<0025> <0066> -<0026> <0035> -<0027> <0066> -<0028> <0054> -<0029> <0047> -<002A> <0052> -<002B> <0071> -<002C> <004C> -<002D> <00660074> -<002E> <0077> -<002F> <0079> -<0030> <002D> -<0031> <0048> -<0032> <0036> -<0033> <0055> -<0034> <0078> -<0035> <0070> -<0036> <00660069> -<0037> <004B> -<0038> <0056> -<0039> <00FC> -<003A> <0049> -<003B> <0044> -<003C> <0030> -<003D> <002C> -<003E> <00F6> -<003F> <00DF> -<0040> <0051> -<0041> <0042> -<0042> <0037> -<0043> <0043> -<0044> <0039> -<0045> <004A> -<0046> <0057> -<0047> <0066006C> -<0048> <003A> -<0049> <006A> -<004A> <002F> -<004B> <004F> -<004C> <004E> -<004D> <2013> -<004E> <2022> -<004F> <00DC> -<0050> <003F> -<0051> <006600660069> -<0052> <00660066> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -421 0 obj -<< - /Length 9102 - /Filter /FlateDecode - /Subtype /CIDFontType0C ->> -stream -xztTUvb"ਹ{^AP (" !^fg&zNo3!IRHIQA"]y@osgg?k(/oooa鱉i"Sc^_Sz᣽Xs_As~د{yyu?觟N\i$ϯ;c'{x{39+F$E.LLMz?)9+56:&o39gƘԤf$MzkB/,*gL" ,|cW?_? g(l)>_ Vy?{zQkF`XXgد//G?=e1%c.3m,8'ɗ?ӳ7"B>F7ϊ=5_߅P=|ns' /|3W&Z'ŷ^l>祔οISM:9++G_է^=چK+{n(Z~9ҿ@C=zA_ xe frft_[4|_" ŝ1XK* ¬2iyik]")9ܑgi40RT8!(y: L: }05+[tj6tU>?f{d3CJ; ruU&tRc5dTKtOm3dF/D>KJ0\\]W$:$`Q~f5FURmfд(q\-ȤP"H."j G9nu_^qq.]x9krYm.TXdF-gD/yf_fUn+ғz'դΌ679;!C,I|& _M[i):@i܃[K* XqĦ'a[2ZmVHMjjl^eJ -/#5NS\ w`{Im:pUN3(Q\KTldGe#N,+{Qz kpzGZRE BUNVjlܬ -a -1. +Öoψ 'BBR.DG^8RhmK?f* -9-%6~ڊӭDqZrBrfiW;K( H'r;&l*b$7 ,9튰dRRq+UIYIXM& ?VѢJoܲ7 -N'(*}줇? K)'Ǧdf$ 2l# ;p?'qx`7*m׮]Ҫq Zwyȉ."Vf/4(t -=S%FZ]>I}uEkͩ/E=lP(^y.D -h .av:?|8׶ -3GN@%0AQ1|o5Ɍ"NSh!8) FjnmM: ѧ -r?pJlSC9({k788&R)me/MG`a_jg)ĞA^C\J$2+YHÈ IOA AfpPY0d4M\i-y!I>n܅}Խ6x^e5jMc*2Cx?`gH>[_q}E{iw5z-X)cC2BE?Ǻ>!&FC$ lo}˫S&̀! {n0\` pnRj; >pPR0 n\n< ΅Q /VuHUkJ1vS[a*Fd+:*uX:-Y#h^M"Ir :s\Aiab*Ҍe&^KI4i*:'8t5meHfFI55)lX]M\"G]| -zoW-fEe˺du^6/{.=re FeHQ(qREzd1?s8"<|prZRVlY7JP+0Os P\@-| |wkMb ?|ѼҪʌ|9ո<ʥqT?e!It96<=w*\| aE59 fbnrVj;,:;8|wC=m v M8A7xiIA q䢁䞨 -)8OW0VhGCE䢟ty^k> ;$dt8=c?Oח'D!V` ^'A^n~Ip@GOB`(`4H Ȫ6W;GF~(nNJKrr=O_[|R*14 L.S` - '0ɪs?%) Ȫ%k륃@aUU-4}VZ=F ?(eպB t C7io=xĂ}gD~N r"ʜ.W(P2..JLR}5<Ot"̤ו 0|\\}@;UdK7N4N} -2n#L[W^:<"\i4Q0%0asp?*"r8C>l)pi_qSdL_F)@M)T$B?Lq>UG -$d@d!-r꒵cl/xx4ji>` -Sw]zU/q\px ->6ѷ$F6Ufڥu:eDN#S j@LI}ZY8 -_g]&w<L0Y3k3iVҖlӚ(8Q:Q -i<;u"7'\z+)SiMFOevp- V_h'J2(T!1ANuRMMqCL̀Ӌ^!AsuXHߓUNjG΃7SfBPX#drma ͗ߴc)0֡3H"ѣ Mn٬,R/d՟wz@쵂Jl{߻> b_)tBO -̈\==pƞAddtm@AʉqvRbps~(lb"=p?U@u)$ xB& e"R.Cᦃ0GNM\md鴟d FD2:2J],mdz?~?P/qrڶ𹔈¼ [pPeطnnٺrSUEp)j/9_Vš[Ɉ0*bhGZC_ď t/@d.iG)uj砐dQw%[;N -x e0}f'_oC<._N=ծ}dr;0_Ny]v]uiJLFv-xzdcjSǶȚaI)T6ghH]~ŎAlU| ~2M9;T3L1GtE' '*LI ٵKF^lzcᴾHOKO†K( ۿ>uz?7]v@^/v wkßdd -K]<=IwfSFo[LRM?& Vp#x"k{pK\ |N-pTT'n"L"x3 .C+%My[_pܷHs5c nYDh!Sj߃(|e^>;ckA6M޻ȏ: ǃLo0; ^R|\NT($(/z|\葔J;$_Z| 9?"{ţ9d0$EZQU6Zѩ='-+^AA8|pR 24 .ch0gd sA-|?S\.iةC`4l#Qfl (vI@\.'| å3'B&@AwW#8NwUym~w^jt({vwYՄ$^E4?b"sQj5QJuKڄYB&gWͣNЏ#`>KKkxR}s(P3>fgH"1ƌU4YT 2PpYn"IT7`DF[>ྈ͎' Tb/Alx tmYw;Q}fϬ!,2ڬwڀ$xS_D_K`ΙarOv?䓗<}Kp@S`?؏>p}l~lp?Dfi6qGfcS3vvw=v0H$ rx W}'˴GF2"ze /=<,lsR\fD[$EX^/#7j%4^D9\oE`>pG~C)sΡFn'b$^ye1er?@-*@Edaa6CJW֥ NF$Rd?X/G"O -n0FVi4lX*#[Y0\%6]*7Dr -^/yn7X|#wO e!'%$c!{w"8H`!wà)qDn6_ -r >ӎ9vwN\7,2VfH>;Q8Fl 'O9}/Q|a`ס7~@8ͅ'5z1n J30!ΫS7Mug:D;H~YEZ 9Qw Qnher{]O_p[I0K x?E2^ȅXJX[ޘûR v] -L֌lhکaVBaSYbЙe8~|k.*(Ŋ -nN02Lm!2t#{k}>\z -j1 B /(T  (9 -+{9v,gʀ#%zwom(Gi!72&2%%C=k8Ftuv\zW[I[lZaPnbxZtKl FêqctgytO?zk8r~Sh^j"KDc K+E -L#dZEjP7rr_^?"1ȱS> -endobj - -423 0 obj -<< - /Type /Font - /Subtype /CIDFontType2 - /BaseFont /UXQQPA+DejaVuSansMono - /CIDSystemInfo << - /Registry (Adobe) - /Ordering (Identity) - /Supplement 0 - >> - /FontDescriptor 425 0 R - /DW 0 - /CIDToGIDMap /Identity - /W [0 1 602.0508] ->> -endobj - -424 0 obj -<< - /Length 9 - /Filter /FlateDecode ->> -stream -x; -endstream -endobj - -425 0 obj -<< - /Type /FontDescriptor - /FontName /UXQQPA+DejaVuSansMono - /Flags 131077 - /FontBBox [0 -235.83984 602.0508 705.0781] - /ItalicAngle 0 - /Ascent 759.7656 - /Descent -240.23438 - /CapHeight 759.7656 - /StemV 95.4 - /CIDSet 424 0 R - /FontFile2 427 0 R ->> -endobj - -426 0 obj -<< - /Length 619 - /Type /CMap - /WMode 0 ->> -stream -%!PS-Adobe-3.0 Resource-CMap -%%DocumentNeededResources: procset CIDInit -%%IncludeResource: procset CIDInit -%%BeginResource: CMap Custom -%%Title: (Custom Adobe Identity 0) -%%Version: 1 -%%EndComments -/CIDInit /ProcSet findresource begin -12 dict begin -begincmap -/CIDSystemInfo 3 dict dup begin - /Registry (Adobe) def - /Ordering (Identity) def - /Supplement 0 def -end def -/CMapName /Custom def -/CMapVersion 1 def -/CMapType 0 def -/WMode 0 def -1 begincodespacerange -<0000> -endcodespacerange -1 beginbfchar -<0001> <005F> -endbfchar -endcmap -CMapName currentdict /CMap defineresource pop -end -end -%%EndResource -%%EOF -endstream -endobj - -427 0 obj -<< - /Length 3887 - /Filter /FlateDecode ->> -stream -xX tu#Xa^,Mz -B%IhVE`,`5NS84MU8 S۵SB]8vB%ib{3>$d̩s:ڝ{{iKÉfAKWk.sY[:^8AښWpnmkkn6-ZcmmiV`S`.`@ö.u`}!|v@W0sYL0z q8F 05w NTraqN1؅7dzX]8`9@ WKS8iAqaBqָ-}A06k1Sip/qAR28x Xx -YِH:Q\yقx8C."dH91j.aF QqbTJ'gonjfC=}>C9V:Mpa qZF[Op%6;3QVT*4Z0!>8E MiR ϪA|M-؄ >#8GffXdގ!؋N!HeXnh HGH.|'1AXdu;MOwZ 벽㾺a mw\YkaLFZ,5vZkjUZeqZjsT&^APYةwy5ш;jd3QV4)lKku&5S38'.KrTx_}A4 :ЋBa[{vϋV;YcB7WƯ<ʞљ&tWhNhSgf=֣~,CQk{q1uЦfg;nσnYk{aN[L{86bmU|KC4i{sDq'AeMH1 hRxZ&>;*{GB:4"*C,(Օ , k@>϶Еdd]/8lW*yc^d{~ΜYT4;:-eN#^r<.rW/:ԷGmPۊM=WC;mI(c(; E33rn"vcc*jbN;X>re>;EM[9:"AOX3)u6 ]-ƧoȎk}b8Ɵ!Fs|MTyWIe8JΘ_,؎;u>{|/e<"if4(F"gob}W,ejʕjT^2NVUnԠX -e*.jsi -ƨE^NJ}[ -TL-Zu - -{jP -SU(E%VLnTBdUmi=㴎뢖B9jQj1JP~ֿLv.--V12cb5*7]ZԠuOF.R>,CK@GB[Tj`XWVz[+82֕jV[VmG1~`MTs[Ni(G1VEq#\!ݚ?By,2QڸpLUrϞ0#uzA#8nTC Q -kͭysBj8>U*w`-{OBG~/,}Fd#p6s] -?8 [1\#v~FN^8~#("w=CcEt ^u5/YNk MnOl s[՘KCaY츧b ˇϳ!ur/ڮ~2>8a[qQe]Շ2q1`|f#_{!Ou]Q=Xoz;%w͝F6FAFv߯%Ș3 2jP8287b~ -HA!HVxIJjAF'(Ɩ'5c÷N~?']I F~zmIo.]\'.OvZߚ+.>뭹7o.ӛߒ~- -W.ArqA҅Ӿ+◃tO!f%6~!7ӿI:ie4:;H?SI?y5KDҫY ,cI/K/gя_ht_-$a8#tZ?KzqS8i -A:#NJGI$=/$=w(M<+IߓNK'\wtq\6Gֱ8=%黃(ߑ@x2}P8*o&3%}KާMIIG$}tBz'/>+i-z{REo ^zRʤI]u"8HyCB$.SHj8[4IjC4ΦI%}ZSOzZ"rZ'iFBT'VT#EUV^JRG*>*J3ETZQ>U4S,ӲbOLQJK4Jæϗdg'Mb_(Πq—d -_:N_45I,Ma[(v+nLK$<*tDO,.>KJe%}`JZT0],T,z]bt*N^ȟJyISDys' a:"w2岹ւ=b=4,%͓tR"< #)'#CHv{Ev?tJ,%͒4s41S 8Či4]4IS%0DܰdyŔr9D\ LgȔ4YB pCs*22(Cs,S)]s$Ғ)-lZIʹJ4E$KJB()IEd LfpKp6 ~^]_+) -endstream -endobj - -428 0 obj -[/ICCBased 429 0 R] -endobj - -429 0 obj -<< - /Length 258 - /N 1 - /Range [0 1] - /Filter /FlateDecode ->> -stream -xuJPFOUvDD@`]\ -FMkIRB|&إnऋ(HrTų9` ըa&ʺ:l -3Ŭ*ުnh)&C|>b纝黓AvCƫ+ y') -̵8+/> - /Font << - /f0 410 0 R - /f1 404 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 0 - /Parent 1 0 R - /Contents 473 0 R ->> -endobj - -473 0 obj -<< - /Length 621 - /Filter /FlateDecode ->> -stream -xVMo1WLáf>> - /Font << - /f0 410 0 R - /f1 404 0 R - /f2 422 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 1 - /Parent 1 0 R - /Contents 475 0 R ->> -endobj - -475 0 obj -<< - /Length 616 - /Filter /FlateDecode ->> -stream -x=o0 w -p62O2䒡2dH-F{GѳAY.'$R䫇-۝-. <92Rya&B}4PFC*~n#v#0 -.u4]ڏ~G~ -Va|>A]ADHYUNE ϳKY6۩Ҟ~7i S rZH7ѫixB -t~-xˊsWP2۸_״v9PluF@^zV酪rZ>œdIr$'JF@ -endstream -endobj - -476 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 428 0 R - >> - /Font << - /f0 410 0 R - /f1 404 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 2 - /Parent 1 0 R - /Contents 477 0 R ->> -endobj - -477 0 obj -<< - /Length 428 - /Filter /FlateDecode ->> -stream -xTKo0 Wx/ &u&)B5i6p(lLeҴԥK ~|?u(nz0  A(} -@h.!27F 'l2p5pf9"^eKTV[ -MI^SSzsߞ~@Zo$V^@!{eɐuVEV|鈎׹ -ī^2RKs|<," Y  e]=I*)Zbf}$5ʄTS%JÒf*@IJrEQA<۹`C/O5^4jSIؼ/zΪmR9sjuNk{YGg7&?Vo0s1viK[fTKI"I /Ox\0oUϲ_e;j -endstream -endobj - -478 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 745.60266 524.4094 752.84064] - /Border [0 0 0] - /Dest 430 0 R - /F 4 - /StructParent 3 - /Contents ->> -endobj - -479 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 731.2146 524.4094 738.45264] - /Border [0 0 0] - /Dest 431 0 R - /F 4 - /StructParent 4 - /Contents ->> -endobj - -480 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 716.82666 524.4094 724.06464] - /Border [0 0 0] - /Dest 432 0 R - /F 4 - /StructParent 5 - /Contents ->> -endobj - -481 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 702.4386 524.4094 709.67664] - /Border [0 0 0] - /Dest 438 0 R - /F 4 - /StructParent 6 - /Contents ->> -endobj - -482 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 688.05066 524.4094 695.28864] - /Border [0 0 0] - /Dest 433 0 R - /F 4 - /StructParent 7 - /Contents ->> -endobj - -483 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 673.6626 524.4094 680.90063] - /Border [0 0 0] - /Dest 434 0 R - /F 4 - /StructParent 8 - /Contents ->> -endobj - -484 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 659.27466 524.4094 666.51263] - /Border [0 0 0] - /Dest 435 0 R - /F 4 - /StructParent 9 - /Contents ->> -endobj - -485 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 644.8866 524.4094 652.12463] - /Border [0 0 0] - /Dest 436 0 R - /F 4 - /StructParent 10 - /Contents ->> -endobj - -486 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 630.49866 524.4094 637.73663] - /Border [0 0 0] - /Dest 437 0 R - /F 4 - /StructParent 11 - /Contents ->> -endobj - -487 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 616.1106 524.4094 623.34863] - /Border [0 0 0] - /Dest 442 0 R - /F 4 - /StructParent 12 - /Contents ->> -endobj - -488 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 601.72266 524.4094 608.96063] - /Border [0 0 0] - /Dest 439 0 R - /F 4 - /StructParent 13 - /Contents ->> -endobj - -489 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 587.3346 524.4094 594.57263] - /Border [0 0 0] - /Dest 440 0 R - /F 4 - /StructParent 14 - /Contents ->> -endobj - -490 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 572.94666 524.4094 580.18463] - /Border [0 0 0] - /Dest 441 0 R - /F 4 - /StructParent 15 - /Contents ->> -endobj - -491 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 558.5586 524.4094 565.79663] - /Border [0 0 0] - /Dest 445 0 R - /F 4 - /StructParent 16 - /Contents ->> -endobj - -492 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 544.17065 524.4094 551.4086] - /Border [0 0 0] - /Dest 443 0 R - /F 4 - /StructParent 17 - /Contents ->> -endobj - -493 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 529.7826 524.4094 537.0206] - /Border [0 0 0] - /Dest 444 0 R - /F 4 - /StructParent 18 - /Contents ->> -endobj - -494 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 515.39465 524.4094 522.6326] - /Border [0 0 0] - /Dest 450 0 R - /F 4 - /StructParent 19 - /Contents ->> -endobj - -495 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 501.00662 524.4094 508.24463] - /Border [0 0 0] - /Dest 446 0 R - /F 4 - /StructParent 20 - /Contents ->> -endobj - -496 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 486.61862 524.4094 493.85663] - /Border [0 0 0] - /Dest 447 0 R - /F 4 - /StructParent 21 - /Contents ->> -endobj - -497 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 472.23062 524.4094 479.46863] - /Border [0 0 0] - /Dest 448 0 R - /F 4 - /StructParent 22 - /Contents ->> -endobj - -498 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 457.84262 524.4094 465.08063] - /Border [0 0 0] - /Dest 449 0 R - /F 4 - /StructParent 23 - /Contents ->> -endobj - -499 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 443.45462 524.4094 450.69263] - /Border [0 0 0] - /Dest 454 0 R - /F 4 - /StructParent 24 - /Contents ->> -endobj - -500 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 429.06662 524.4094 436.30463] - /Border [0 0 0] - /Dest 451 0 R - /F 4 - /StructParent 25 - /Contents ->> -endobj - -501 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 414.67862 524.4094 421.91663] - /Border [0 0 0] - /Dest 452 0 R - /F 4 - /StructParent 26 - /Contents ->> -endobj - -502 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 400.29062 524.4094 407.52863] - /Border [0 0 0] - /Dest 453 0 R - /F 4 - /StructParent 27 - /Contents ->> -endobj - -503 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 385.90262 524.4094 393.14062] - /Border [0 0 0] - /Dest 458 0 R - /F 4 - /StructParent 28 - /Contents ->> -endobj - -504 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 371.51462 524.4094 378.75262] - /Border [0 0 0] - /Dest 455 0 R - /F 4 - /StructParent 29 - /Contents ->> -endobj - -505 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 357.12662 524.4094 364.36462] - /Border [0 0 0] - /Dest 456 0 R - /F 4 - /StructParent 30 - /Contents ->> -endobj - -506 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 342.73862 524.4094 349.97662] - /Border [0 0 0] - /Dest 457 0 R - /F 4 - /StructParent 31 - /Contents ->> -endobj - -507 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 328.35065 524.4094 335.58862] - /Border [0 0 0] - /Dest 462 0 R - /F 4 - /StructParent 32 - /Contents ->> -endobj - -508 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 313.96265 524.4094 321.20062] - /Border [0 0 0] - /Dest 459 0 R - /F 4 - /StructParent 33 - /Contents ->> -endobj - -509 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 299.57465 524.4094 306.81262] - /Border [0 0 0] - /Dest 460 0 R - /F 4 - /StructParent 34 - /Contents ->> -endobj - -510 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 285.18665 524.4094 292.42462] - /Border [0 0 0] - /Dest 461 0 R - /F 4 - /StructParent 35 - /Contents ->> -endobj - -511 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 270.79865 524.4094 278.03662] - /Border [0 0 0] - /Dest 466 0 R - /F 4 - /StructParent 36 - /Contents ->> -endobj - -512 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 256.41064 524.4094 263.64862] - /Border [0 0 0] - /Dest 463 0 R - /F 4 - /StructParent 37 - /Contents ->> -endobj - -513 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 242.02264 524.4094 249.26062] - /Border [0 0 0] - /Dest 464 0 R - /F 4 - /StructParent 38 - /Contents ->> -endobj - -514 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 227.63464 524.4094 234.87262] - /Border [0 0 0] - /Dest 465 0 R - /F 4 - /StructParent 39 - /Contents ->> -endobj - -515 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 213.24664 524.4094 220.48462] - /Border [0 0 0] - /Dest 467 0 R - /F 4 - /StructParent 40 - /Contents ->> -endobj - -516 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 198.85864 524.4094 206.09662] - /Border [0 0 0] - /Dest 471 0 R - /F 4 - /StructParent 41 - /Contents ->> -endobj - -517 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 184.47064 524.4094 191.70862] - /Border [0 0 0] - /Dest 468 0 R - /F 4 - /StructParent 42 - /Contents ->> -endobj - -518 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 170.08264 524.4094 177.32062] - /Border [0 0 0] - /Dest 469 0 R - /F 4 - /StructParent 43 - /Contents ->> -endobj - -519 0 obj -<< - /Type /Annot - /Subtype /Link - /Rect [70.86614 155.69464 524.4094 162.93262] - /Border [0 0 0] - /Dest 470 0 R - /F 4 - /StructParent 44 - /Contents ->> -endobj - -520 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 428 0 R - >> - /Font << - /f0 398 0 R - /f1 416 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 45 - /Tabs /S - /Parent 1 0 R - /Contents 521 0 R - /Annots [478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R] ->> -endobj - -521 0 obj -<< - /Length 20380 - /Filter /FlateDecode ->> -stream -x[Yr^"[:z︇$e؀o ն OiSX;W&!yr5 *;;֊˿ݭ}]-w[֬_~uúYw;~~Wk_?:Ӈ?_moί}ٟU//_~?1 `8/7Ə~ O?_z'}>~ҝ_?nOξ}

>cڢTFUEeĮ5L6I3%Sd CCը-YәTn2Z6{R)6KR/p2ZfkSitPZ5lK -2۝ze{TD&bE}z^T$7%RI=VQ*{JVqo޲ǨzQk1&UOIP+TQ_B-zSvJ}׿˿kҕ~~ܼR1L[| їwƇ]_;_w]0|ڋ!zEu9bfDDxeP%  [}ٛ類1)o&e% KEW4X&$"G!%4"ZR5JiHC4D- %>?B }6ݘwW%Q"x"F2H.5%]CCԖbRVo@{jm-vJ(4¨4>!wHC-Ni"$՚xglSf6%>KW4,_{)ۙl$dcaL6e;;T"w0Ed|4D.!.`rhj3$W ,}///u[~Ulʃ_R/fcܾ_TBV*#%wn&Q + ^\d̢Q)*d͚b1TD2ͼ!Qyf^hl-ݒy"zHǢ~ (S&Oc um̷*5ZAZ`"\\;I܋zQeJ-4 -Auå'zsT FhބQF2;[7DŽX-^3<Э"…npU3tïdSwЮ- jۢ>^RO8L{z{K,4H0-~3Mpa ͽn"FV u  kSа45hXE.4,IhP|_*{0OǑly ."9$d3mME/JY?weE-L2]uU+R>}뇦㐁WVoyg[ Znףw1O{(u#CX :QG=̂}1Li>=/#8b.=܍sgV?3w xH>wcȋт~ Wuſq{C܂dxT?gHlWC4BaR2 -LFoٱlS!{sh'=LƘx?QcdRMCd2@dFSl9 oTCaje>K`̱EeN3%j.1KP~Uz+DFʨ`cĖeV\F`!d"cD#iby :DFWRWWZ[ (DF ‹H@m2&F"A'zO+2nOd8FUQ_P0Ľclb,RV %ȋDFJmCda/µKA$"\*Ty;{w±y덲/ pמ-<ĉ9lI<R~lEpgqʑ aҿO/E.ݯ}psk-[0mcWE\pЬJc`IBF&B 3")h2Ԑ=Qm|1 nQk!fC%zIXC"2 -٨Fe(Ci -m5\`I=T Q*j&"#,Q1z[&-1z9i$)M}0-6t1vLDF Tn3ed3o?$)ˌ0qE"`>q0f'.|ˌąq#\-fg*n}fJn*`X'K>q "*c#" -dwB;#fąm)Q' B&"B>X؍PD Ҧ>p.'v%p.pa-E}QZeuWOE뱷.'"1?h!d+|WjrUhrUhp0V1>qaPzX+#鉈PBg@"\񾌷~쮸{[`jIWl;_7sZo)a-pz0:{~sgƎt[_/ 7_0.ӄHquRh^h&!\R7Mx/1qPyL= ,ڂƛGvy 0 Mlͻo.h\I-2O2/xŻ^ sx5'_HYmk 'Egmh VSNеکZ'GhE QUٱ4DJ*!"H}x@ѪSf!UyHmwyrT1yhX01.A%,7[9ğ{A b=hW̤! ]x$n#{jxb>:uD?([+mA.V>h׾__J|b$|H!4WzoTS߽eQz菿q}_i?/>ٳ/_u -KASK8ߊ -WtF/[6 !V3\H@E""ZV&CM>Hulw}i}ZumL/onPxx_m~{H)͌}yLC˸|f[/CM&ʟyڰ햐Qp7knID`H'"Rb~ dԛ[ xԉ|ydԯQ@FQD\惤"e]"bmk[ >1"@F} ̕qLM! ɨG&@Fa0v _;L3 GDR꫉ﻓR_x_dsǀ"S?!6̛J$ ^z"QyO#~f~ D/L$"0<(-`G6@F=cxQ'>-ŋys?a& q2Yxe/],e^G%/V2KeNJ2J)Og*.E>&~~g=b/㿽z o9ʗv|hRd"2J o8#Tatϡcs-*ű άP^6JeLZG.3pr߲cb~8DFaD|{AKdSOUe]eKC֥$ Gj]l̻WEe7o?V~JV.7y0>^4~xiй=Qcr|VDT3 eG$@j=hѕG8`F^Tb`]%<-Eb2K,7V<_0{DC"⭙J*>An‚paDb0ǔpqkϢ>+$9H$.`ɯԇyԜ0 1h\F2CE-;.G.2(p%LOrx 5TrfRr +bDK2@AC -4BnxnXydjSU[oPH&bm38 1tVs|JZ % q|̻ˈcwhn<£Ś,]߅厖\6%W͟o3l"1%/6oԽ -ɵs"3F|<'Q}<IЯTbYs%[7a+.2pAd%!2R*x\dc$R΍E9E ^2}.]c!3 -ըoӬ1Af58}k xTӗ>Qin,O_ͿvR~UJcJJ~]u7?>s^?r1"Qǽk?G9_h>,T *|UpDyV)h}l14DLuEEaK b h8]@p,(i *"ҙ29i4aw5Ѳ`0O튇HQ:M<1_Hgv!F#T -J]nt.1AD`J4P=0vw}SWřM|:#y 'Bcp`Mqt|ClKtWu|uTTt経zїw>?ssb˹j?zoσ{sۓEQcH*dηzkn`2*M-d#TI%"RlC6.ySLEᓇ@鮒m [TU ?ٟDHh'uo Ib1'W"#ewc x< G^S-u*BSfa=a)Ue>䈌cI7I%YfTFliMDKo"E;7y<GH)G&i -$Rp-@PqPUvhc}KG3⦮N -T|_ۥ\\-ke7kc]1n -񯾲{}2랷W"׫ x{Ax\~Vh $ZĦ"R\1 @#NpR{ M>% ;}hM0Lu"e,JdYph%;ԩFCS7f1Plgy43d%""$c`?$2FMzyS21[7"#e7#pĴrFڠclGF#2RMC!vrqq'W*jvrN.i| qӞod?VًAꠏ?{4>l^|M.srp4rZ6s:5-6a" Ɉ "F2eѲ1BZFexERo\FRu:DW~2T@n~x $daKdN -U0c! -LFɤ*{#Hј* E*}1VP=hMp㵴gܶl`"k8DK&<%1&#eqW<+TBhqbL@S22L0 Sc2BVssMӖܨPuc%Z@[2u/zkuz|#|X=v}\-ϕ͟Y߃5ɞz~9y͑cDӥLe[[?7~+TKlv^Ib2B`b2Fdf^O& xM*÷;DFxcĒm\ce2Z4tS_IexP$p4N)oNՈɀ~d2Ff20|4{K}DD`s_{.F<Q2}>ZUe5dDD6&ʊ[&F7p)w""*AD;cxt cx5"DƎOd>|"c$-*ۇ(ɳ8 !Dˣe<ߗfe3B]s_Aÿ5~_oރȀZS5&2J։! <"DF` +6?^2}՘(k!Pr<~;N"A-oy[78Uj?<\z1ƯE}_yC%"Rl? HLjHc"qrux%2jق8QD~ʽZǸ3}o+sY ELm_k_oH?vZDF3pKU4![O'=1:Ha1pK;qDF!u<[M^\ƠU -}fKdL<&\]"1dL[&x[&ux[֢t˲2RN&6"2`2Z ٥!nCo?$ R=s ]}$:'2'J]LFQf)Q-RJC;_CQQ۲vXPTJ2۩M (^̢~ICn ꡂ&qMꡂ#0 CxQ_0DQ< 4'aF2uՃ2G('jݥ @;62CȀ\DnE*h`2CHLR=T.J"T6!|B=d2C}Pyc@Zd`@1r ug*u#W[Q&VFc20MPuHUie&cL*6>%Ǫ@c@4CuTb^TeeG>TD!#U3]{]QinH\,YyG}~| =*5?tLyWk,ge7+Yo*DFjy,AJQ#u -Qv3V*3<[iӁ喓#eI/C.Qa^19IF,7,x0#ǩc2mPK4)\- =DƉ]ٰlfxW$#ROLj ]"crCk[QQ+74xǤVRc$Ƀǘ㉌ʭ Vn1*6iCE4nTdÀHܠ DOw_sa*~S"#%%پה;*wUikj!騏Ի^~<(?/m1l_/}B~l(?c~1mWǛ?\)|Iog;Jy~3,Q/K_˜O -ֱнo;+%T#*ޜưX9܉Bco@DBPU"2FR {5CM*k,"dU@G)Jzڧzr2 V~|!5iz~~{Z=kK=Kd.#FIDK'Adt`Cƶ(Yh*`2d`%Jdh8'"c"`1Paʇ(@?[2Bw -Hm O"Ayh#1J?_)J5z &PTc6DFK$:1;p#݁()s+T7utBzGrԓ=}ouq#|OؐK|+M7?i@x{_тh]2⧷{3"kMfbvpɠ-{m&#}_-öǀ%6@DlP "20g xRI#z3xpe*?W՘5Q%2Jt)J4quP'"B\MGDd DFH+"bdL91e--0΄pUC8wQu1M:DK,hv2R%M 2R<uR ɄOY1z8?"aǘ-fEmAՋ:i  - SMe-N%:T>֑zѲfYEdP~cd@a pމ38;ܧ!wdvm.#d*12G(n^ȠQA 2QAZ\?*(\u4PNhh1 |Dģ7%YEKAg_AwA,Y죎/[?M:x%}gZ 7+.QLB`du'\J&M1#2|fǽp=eYXŒJp4phԴ5\%0H~s/ZR=$2 A1بGꔂ1lkq/+_cBBddc .g1φm#S)LI*E*.%<"`B\̛I=d,Uoe&Z(r/nb<A-L#e2˪UCd2ySKwƹN;-z" LoyYAf_S}&cDDXE{ͽtmK &#-@{Pcʦ*Өe1=[,6%y!lh[t[g0-[%hƽv{ĪkwJRzHkDWP#EvwfEG>vcvC'N\oH|xc_S6e4/cq~:]K|$jT|NqM+׮DOkiqsMP-7Pé -.}$(.e^h3mpqS %DFKqꭰ >yMD,IѧkEu:D.DDoC@鮦*D2"J7Md!X1|=oAs2RY?u3.\i&"B%̅y*/q_Rc;߫SI_j?~`?]OU$chϩlVR0p%qc`D@({`H5|`HZRJy{:Jym*4cc`5P^TX(Bq:ESco,h1Dܤ [~XLc(*MwC -E"RW+Gi) !p7^WǻH=VGνdycԖmʽ*D7"[Ǫ?&kO,1[qTc&1Rvh M}B;1^Uՙ7Myh1H~ K|i?/Q_!_oGC5Sw^Nyw{WΑ7kW;DiD v"KZX<DC7 2'gD1C?j! "x GDJ>naQ 2JOR94u25u@z { $DFK=q-X?iwKQ/!"B>Nqi"#<з#-)e lN&3=ɗ}CdX19S ܍|:"ܨa"N:JpDDzpRo?]/$25 +iE!F#3G-1L3./}xZZ+ ݟ+#_px/߾Zply^ Cюp( t\8>cT:K%"Ro7 DFvQu Cc%n!tKq1!iH"3$"JFSO*$,"RU#>9D˽hteb cJOdBMD`ފh.mEdMc̖=gl sWfYލ*Qr{c!DFHjKTNdrd] "ϠIy± OR䙇c΁SHG (uR:C!#+Cl?DZȧ="#D$`C:!()3j=F,2'>xޗe/ J>w"(Hm~_G+U' /:aGk< ?{;k|2qY|^~p(TfLj-OdJԷ˷Ƥ 5&)Q;|e8$-&SMeTF[PχaKTRJI6 -ǕzJTSOG,>Shl4Ye>P-8M]hwuMmj56 C=TꡚCb\t&b{ +*nd`VR$lN] z֢.H`Y2QN=Ez<eSCc$ $JjPF9!¡ǡbd岫FSV5AQ8ԠYEƠS %9ЕsqBGyIjc> #/F.~0mhyK~d?۟|?}4ȋ 7!gPyt'2!p_16i ]&Y\FIn {Ka*L8T'D9u<:r5U x%t{HQ=EH= NdxoyPt, Fd}3Kʕ@.Gk͖'2 -1Ldi~~Ad)zQaΐOS߁4dI=SxS0 y:ʑS0#%Fdl\FDQ)%"Rm 5ԯa."TF5ԛ:") PexVc×@dM]"+r Rq =.F Lƈp_>Hf206bR+ E"#NJyQy_yG<2`~&#ezd蒭۩Jl3n۩3r #2|I`D2Ip iPi="2kX,fD%@Ρɡ0gUoq[pXN6\Է29E&GQŭAN"G2`02e|FK;XEZ Z ub1W,77fns_>?~^$^<7g/|Q=<_3 Dn9fAp ݆DFIJL!(Vt=/&*> - /Font << - /f0 398 0 R - /f1 416 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 46 - /Parent 1 0 R - /Contents 523 0 R ->> -endobj - -523 0 obj -<< - /Length 3865 - /Filter /FlateDecode ->> -stream -x]ݓ۶_AO΍pu.qN;$ɌTQwN?vH]2}|" bu/Gm/?㏫O>{c*]TA{ҝzvsFWo~7'w]67;]Fn7=qvݓkϟg;}5]V&TO=ѽw<P}ngnn0H&(k2HbeɩOnzG0 vk>Pwx0atvzAz ) k@4pW0%F8hxW?z.ـ!*RhE[ucx% -U\Q]okZ[`6+.@Zav[,3hrڄ3IoX5zT}oMF=2uHΪZxv&9uFy meݨe -=i;vl1 mQ{cAoogPҊ]ն! ?+FJ WB6*ji{{Gd[zI1 V/`'>$Y*p"B\(*Qp!a oMy+ʏ n -|hZ9@Ehn;d!%7 - ~_}%?$C:~nr 2wCgyӗz>,`QOu -H' -U - _!*qB1Q"ڜ:BJ4?O?GO s4ў򼸣t4۪!$="Æsd"IDi *s+NH a$10%ĊOJ1g@S0m,1r ć`&{ -'v)yn:5 ykr{|rқx~q 4FhbH27`;EϏ_ hwn0dZ'㤁x|NemuUu3"״ݚvy>mB -ώ"4'oOFD'ߩڋؠLe/XdL- -O393Hb :< {&ɱ,zCQeLAB-6;oR/\D+rXX!d(M>˝H/IJ(Q#=o^ -Nu^Kb -Ҽ@JBD\zM%=E(d)4"5xdߩbUƘ"T;:ԶlxYl+o-k6A &2 "9; 0-R"*9L>{&>L:b/FXDZekN"[wiq+, aΖ$ s}h D  -#ܩ -e%BCp qUQMLXSW֋c؞#Iɰ*8+w| V!qa|lcRxEWZqjUό.їQh"> - /Font << - /f0 398 0 R - /f1 416 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 47 - /Parent 1 0 R - /Contents 525 0 R ->> -endobj - -525 0 obj -<< - /Length 3437 - /Filter /FlateDecode ->> -stream -x]KWʒ-o l˒lU7F(Ul9ߧH F3Jr.Zr4_?^MWm믛g>_ oxD4Zg%3[ܾ]]o~ݬ]xs]]F(&/oW??pWmֿ4Y}wqW!E f5Ptq ww$ՁwU 8~a!7\Z$]K| /#+n0̺iÇc>P#sqvP8^^te 5֓gy0`ps8YnZL50~~0 ~@?&sw_£u㆕;%kat|~xk )2 -)98}>%Ujp. -.c> , [>B?jXMz .]P 9JQ^zw "#wwS^4bEu\\15e&JJiRDˤ6ZpXMwc`ClEdRSn݆ZYa[7&&-gRɓЖ;Dc,BY Ku2キל6v2HW =Ò.u#:z(: 8ay^*8)/GjRJص:r x.\nm- Q3 ʓ?yQ -ʆݍyt[J|8?7\v?]$$|֍)OCO!JƔGy N2(`nf wxP7^_w"ʓ,f3$T-5 _&*!.cE) AbLs6 {#wn&THmY؉b9vi>M;w%,IvE05Y(qnXK79IH]&y8p {s0 w|H+[g@v?dGRAiχ†%O) txIa$QDFw>ً@N(9vpdD?nfط1aﭟ@cCA 'tà`Z` EN0:Y#BsHg(#x'9FJwleAFoCPK$[jQ EtG:Z 7D%8 ĄX"t\};P<t' ޮud$T䧣Mdا l K2ggF@c Rh/~U)@4Dk[I^$Mu .ARt%(s ;zgmN$s1Hx|OBSF&"\Q ܆1}Qg*g^%y& ݞ[ސKq<*MUoad sJQWvR*R/8[ ʞdj}nux=p[U%x:OlZYƽ9aWdDV3=4n83g(yuB)=xtq UpS)ǴhY@MHAl>*CiJ&sU z@in,,Ϩz:E(&MU"B^_L?/̬.);DM0'qytᇔZ긐 %Jq!35ɾ%&%EѽN8YAM8t\ a,HY1 Y(홳5?,%$)+!%pX ka5EHDץ:g*?J9Hej* x ۵>͟M-3dL)Ô>S9t*xbvKh9M(!lڡ K:!Iؑ?ܥ?z5>ƁnZ #Cץ;D`8'hW-|YGZDKr攋;>:\;9];q[MpE4Ls'sCrcYTq@ZXޖ}}]$C[SS)<ːhϻP&,J13#U N=gnWmz(vIfېrD݉G^L$UAa%Өt8%H#I(FcQ䜹-}gWg}?ƻBA OgFCdeO-SRYQs'xu],JTW鋫r0H5f -,2J%WnE1-jZ`M*Um?hy+&[hw -ԜFe~!v_E@.q$qܨW]1dF.iVZRcFW}4'# -QZG'O"%WL^)SKKֳwݖ0%Ngb!- -U?V`j*L bp`P0:p~u;rMmsU{V]-ąEHT(ΰYPpڞO j:HW\!$녘.qJVQ7y+&>+xl7f hL 9y )~b3q$BІٚ_Tt!H5KީK,pJ(X2m*j 2A m} jѦ#b9WQg qxV٠*`!H#lPg9SJ搋aIVE+,M<;K 5 JxYj/UH#t +YEdۺtSj -Z%,׋'cV&0!\2] uT%yŒG:&,gȸ_"?HeqORh9.ͣ$zP`BA̺ 7+RǶeDN`^Q ݛkOwzgvwoٿ^Żw[ׇx776X[-lg_ꂣOD -endstream -endobj - -526 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 428 0 R - >> - /Font << - /f0 416 0 R - /f1 398 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 48 - /Parent 1 0 R - /Contents 527 0 R ->> -endobj - -527 0 obj -<< - /Length 2499 - /Filter /FlateDecode ->> -stream -x\ogE<~n즰'h (k]r}_v̒۵ya?7Cm~n^Z1_3+տV &ؕdsҰi^vq`VonVW`Rm?Bn_Zt>];/Ldg!q*T5q BolgPRGSA"P -hS(ftsw=#~x%wqFNxٕ\!n×\Z3%L:gE"R+Znz{ak$4\7 -̅%XX2@~˪.EK69eI&-7kvOYͤe3Ú]UAZfz<٦Oqێu -zNv3\zRpzl}}Z?-I$5k) -SD}0%lFr']5`$Y.!kHpmc3=SkS(GJyZ)O5%m=-YAyfmW)`' 4?kfuQpErG3 vMx2`Bӱf7_jY8>b@TgNQm{EI0(-*/jpÔ }0颢U9ˍ63/G @q^*^i#oH9K ITvЅ!+VhTi8SnaJ.:<&xWpI*INYn:tم>0::'Xni^(koeG9 8՞/ŖկrCթY{FM-c"I@$b,/z^zŸcHSYIɕ03t ;so *Iv$aE4g $ndt3Ox1rˀմԫ3'~?Ek)3"AtqVkϤs>W+b [z!h\7.*Cn0f̥y\D0V~kcEff[ZgTѸ_%FfҾuҒ:io*4u2#Cix "Sh$*$a -`(4{<̈́;z܀e4$;`?@W -hObK2#BHܡ $%HJRA'b8d&CIݤX#jSj%)Y`շ8GUCOGr)T A\"SVDB%m ;ϕy:G -Uz23ړCSdyvA UG~1R8VzeC$qD5`3$TVdBh8f'S]" K4+ņ_ߝ$3-VMbBFԼ5'Ŗ\92R[+e|gG03IG -1߰)@m(a{z1|$kNJ4TT_5]!̠%_e@ kaEYum)zD4[SzB>0ffczYC&xN4 D!5\J7[30$gٶPݣMToM_xkq>HA>x5z&H`*=4 N$YrOqL -X3Ӵ~B<ym.vx -M^9m(5z,Aϳ(mAS F;O.cfSHӏwD"Z5\UƝ^x x7XoaC#K}-D[BIdwxn̫lxm+ER@+it>a7-MzK&1g}I(*DuK5W샖Vh)*FQhb#0lT1#)1 2uB%YL:ۀ_vD>q?Ur=[d LUt[Zh}QNoS!P`?2]>aG&i-wNΪ_LB !=R(`H~խq|]hIa^++; H#s4V"}w#iv$N q?Nw'zZ1xLp>lм>ǻ??gona3dzŵU}JT/0Q -endstream -endobj - -528 0 obj -<< - /Type /Page - /Resources << - /ProcSet [/PDF /Text /ImageC /ImageB] - /ColorSpace << - /c0 428 0 R - >> - /Font << - /f0 398 0 R - /f1 416 0 R - >> - >> - /MediaBox [0 0 595.2756 841.8898] - /StructParents 49 - /Parent 1 0 R - /Contents 529 0 R ->> -endobj - -529 0 obj -<< - /Length 2108 - /Filter /FlateDecode ->> -stream -x[K6 W06,͗H)ldL䰻t&t;DY@PK2 zj˞?_0z}%Sv~y{!`Kϭ9+(5bu#͗`_nBbLfܰf;!\_ů/+8D57Bx'_4YsׁӛV[[.t.Agu3VϗK0k|?jTN[i5jj`m:%F$*$fH4aEtmm";FL\:Vok4+uC%2%23TN>Hdy'ԒKN"j|ro5 6Z ش'O=‹`zn rɎ=̔S_}6itv & t(LE %15VkYCgBy9QHaynNSG mѢnjת̢oxuIRTas3A8Qqd|WK -> - Qzx/Ń&mHeJ9iR븐m`䦃^{QPP^i8M[B"׻aX4AN""h||7ʸ?]˜tGt:9} mxjIVteńE-Zp1wR@(R§$~[6AE?IN-O562 ޙbHepHJR 0<R.WzDGA -$rH -6&L& S{/#p4 -=NYI᱾Sus_Z+y==PɹMJu&Q)Cvd(#5hzawٴʦ{< @NEDqHВ> -endobj - -531 0 obj -<< - /Length 996 - /Type /Metadata - /Subtype /XML ->> -stream -Typst 0.14.0en2025-11-29T11:42:01+00:002025-11-29T11:42:01+00:008application/pdf+g8Kl2zF2K0Wx444aP+2wQ==+g8Kl2zF2K0Wx444aP+2wQ==proof1.7 -endstream -endobj - -532 0 obj -<< - /Type /Catalog - /Pages 1 0 R - /Metadata 531 0 R - /PageLabels 45 0 R - /Lang (en) - /StructTreeRoot 46 0 R - /MarkInfo << - /Marked true - /Suspects false - >> - /ViewerPreferences << - /Direction /L2R - >> - /Outlines 2 0 R ->> -endobj - -xref -0 533 -0000000000 65535 f -0000000016 00000 n -0000000138 00000 n -0000000220 00000 n -0000000408 00000 n -0000000524 00000 n -0000000640 00000 n -0000000804 00000 n -0000000920 00000 n -0000001033 00000 n -0000001143 00000 n -0000001263 00000 n -0000001366 00000 n -0000001546 00000 n -0000001694 00000 n -0000001841 00000 n -0000001973 00000 n -0000002154 00000 n -0000002280 00000 n -0000002420 00000 n -0000002614 00000 n -0000002737 00000 n -0000003111 00000 n -0000003253 00000 n -0000003381 00000 n -0000003562 00000 n -0000003676 00000 n -0000003799 00000 n -0000003916 00000 n -0000004084 00000 n -0000004327 00000 n -0000004553 00000 n -0000004676 00000 n -0000004843 00000 n -0000004959 00000 n -0000005080 00000 n -0000005335 00000 n -0000005510 00000 n -0000005650 00000 n -0000005924 00000 n -0000006159 00000 n -0000006293 00000 n -0000006442 00000 n -0000006621 00000 n -0000006847 00000 n -0000006970 00000 n -0000007073 00000 n -0000007826 00000 n -0000007917 00000 n -0000008000 00000 n -0000008035 00000 n -0000009046 00000 n -0000009521 00000 n -0000010164 00000 n -0000010532 00000 n -0000010866 00000 n -0000011619 00000 n -0000011753 00000 n -0000011960 00000 n -0000012135 00000 n -0000012255 00000 n -0000012342 00000 n -0000012476 00000 n -0000012563 00000 n -0000012798 00000 n -0000012885 00000 n -0000013144 00000 n -0000013231 00000 n -0000013383 00000 n -0000013515 00000 n -0000013602 00000 n -0000013857 00000 n -0000013944 00000 n -0000014062 00000 n -0000014149 00000 n -0000014277 00000 n -0000014401 00000 n -0000014488 00000 n -0000014622 00000 n -0000014708 00000 n -0000014917 00000 n -0000015005 00000 n -0000015246 00000 n -0000015369 00000 n -0000015456 00000 n -0000015585 00000 n -0000015672 00000 n -0000015792 00000 n -0000015879 00000 n -0000016005 00000 n -0000016143 00000 n -0000016230 00000 n -0000016370 00000 n -0000016457 00000 n -0000016596 00000 n -0000016683 00000 n -0000017042 00000 n -0000017129 00000 n -0000017264 00000 n -0000017415 00000 n -0000017567 00000 n -0000017706 00000 n -0000017845 00000 n -0000017936 00000 n -0000018081 00000 n -0000018172 00000 n -0000018315 00000 n -0000018404 00000 n -0000018563 00000 n -0000018700 00000 n -0000018789 00000 n -0000018980 00000 n -0000019069 00000 n -0000019168 00000 n -0000019259 00000 n -0000019348 00000 n -0000019447 00000 n -0000019538 00000 n -0000019627 00000 n -0000019723 00000 n -0000019814 00000 n -0000019903 00000 n -0000020002 00000 n -0000020093 00000 n -0000020182 00000 n -0000020281 00000 n -0000020372 00000 n -0000020461 00000 n -0000020560 00000 n -0000020651 00000 n -0000020740 00000 n -0000020839 00000 n -0000020930 00000 n -0000021019 00000 n -0000021115 00000 n -0000021206 00000 n -0000021294 00000 n -0000021411 00000 n -0000021569 00000 n -0000021658 00000 n -0000021760 00000 n -0000021851 00000 n -0000021940 00000 n -0000022039 00000 n -0000022130 00000 n -0000022219 00000 n -0000022321 00000 n -0000022412 00000 n -0000022501 00000 n -0000022603 00000 n -0000022694 00000 n -0000022782 00000 n -0000022902 00000 n -0000023076 00000 n -0000023165 00000 n -0000023261 00000 n -0000023352 00000 n -0000023441 00000 n -0000023537 00000 n -0000023628 00000 n -0000023717 00000 n -0000023813 00000 n -0000023904 00000 n -0000023993 00000 n -0000024089 00000 n -0000024180 00000 n -0000024269 00000 n -0000024364 00000 n -0000024454 00000 n -0000024543 00000 n -0000024637 00000 n -0000024727 00000 n -0000024818 00000 n -0000024927 00000 n -0000025021 00000 n -0000025187 00000 n -0000025276 00000 n -0000025375 00000 n -0000025466 00000 n -0000025555 00000 n -0000025654 00000 n -0000025745 00000 n -0000025834 00000 n -0000025933 00000 n -0000026024 00000 n -0000026113 00000 n -0000026215 00000 n -0000026306 00000 n -0000026395 00000 n -0000026494 00000 n -0000026585 00000 n -0000026679 00000 n -0000026794 00000 n -0000026903 00000 n -0000027009 00000 n -0000027109 00000 n -0000027239 00000 n -0000027362 00000 n -0000027451 00000 n -0000027569 00000 n -0000027818 00000 n -0000027916 00000 n -0000027999 00000 n -0000028139 00000 n -0000028301 00000 n -0000028393 00000 n -0000028476 00000 n -0000028616 00000 n -0000028778 00000 n -0000028870 00000 n -0000028953 00000 n -0000029093 00000 n -0000029255 00000 n -0000029347 00000 n -0000029430 00000 n -0000029570 00000 n -0000029732 00000 n -0000029824 00000 n -0000029907 00000 n -0000030047 00000 n -0000030209 00000 n -0000030301 00000 n -0000030399 00000 n -0000030482 00000 n -0000030622 00000 n -0000030784 00000 n -0000030876 00000 n -0000030959 00000 n -0000031099 00000 n -0000031261 00000 n -0000031353 00000 n -0000031436 00000 n -0000031576 00000 n -0000031738 00000 n -0000031830 00000 n -0000031913 00000 n -0000032053 00000 n -0000032213 00000 n -0000032304 00000 n -0000032402 00000 n -0000032485 00000 n -0000032625 00000 n -0000032785 00000 n -0000032876 00000 n -0000032959 00000 n -0000033099 00000 n -0000033259 00000 n -0000033350 00000 n -0000033433 00000 n -0000033573 00000 n -0000033733 00000 n -0000033824 00000 n -0000033907 00000 n -0000034047 00000 n -0000034207 00000 n -0000034298 00000 n -0000034396 00000 n -0000034479 00000 n -0000034619 00000 n -0000034779 00000 n -0000034870 00000 n -0000034953 00000 n -0000035093 00000 n -0000035253 00000 n -0000035344 00000 n -0000035427 00000 n -0000035567 00000 n -0000035727 00000 n -0000035818 00000 n -0000035901 00000 n -0000036041 00000 n -0000036201 00000 n -0000036292 00000 n -0000036390 00000 n -0000036473 00000 n -0000036613 00000 n -0000036773 00000 n -0000036864 00000 n -0000036947 00000 n -0000037087 00000 n -0000037247 00000 n -0000037338 00000 n -0000037421 00000 n -0000037561 00000 n -0000037721 00000 n -0000037812 00000 n -0000037895 00000 n -0000038035 00000 n -0000038195 00000 n -0000038286 00000 n -0000038392 00000 n -0000038475 00000 n -0000038615 00000 n -0000038775 00000 n -0000038866 00000 n -0000038949 00000 n -0000039089 00000 n -0000039249 00000 n -0000039340 00000 n -0000039423 00000 n -0000039563 00000 n -0000039723 00000 n -0000039814 00000 n -0000039897 00000 n -0000040037 00000 n -0000040197 00000 n -0000040288 00000 n -0000040371 00000 n -0000040511 00000 n -0000040671 00000 n -0000040762 00000 n -0000040852 00000 n -0000040935 00000 n -0000041075 00000 n -0000041235 00000 n -0000041326 00000 n -0000041409 00000 n -0000041549 00000 n -0000041709 00000 n -0000041800 00000 n -0000041883 00000 n -0000042023 00000 n -0000042183 00000 n -0000042274 00000 n -0000042372 00000 n -0000042455 00000 n -0000042595 00000 n -0000042755 00000 n -0000042846 00000 n -0000042929 00000 n -0000043069 00000 n -0000043229 00000 n -0000043320 00000 n -0000043403 00000 n -0000043543 00000 n -0000043703 00000 n -0000043794 00000 n -0000043877 00000 n -0000044017 00000 n -0000044177 00000 n -0000044268 00000 n -0000044382 00000 n -0000044465 00000 n -0000044605 00000 n -0000044765 00000 n -0000044856 00000 n -0000044939 00000 n -0000045079 00000 n -0000045239 00000 n -0000045330 00000 n -0000045413 00000 n -0000045553 00000 n -0000045713 00000 n -0000045804 00000 n -0000045887 00000 n -0000046027 00000 n -0000046187 00000 n -0000046278 00000 n -0000046361 00000 n -0000046501 00000 n -0000046661 00000 n -0000046752 00000 n -0000046835 00000 n -0000046975 00000 n -0000047133 00000 n -0000047223 00000 n -0000047306 00000 n -0000047446 00000 n -0000047596 00000 n -0000047679 00000 n -0000047819 00000 n -0000047969 00000 n -0000048052 00000 n -0000048192 00000 n -0000048342 00000 n -0000048456 00000 n -0000048543 00000 n -0000048661 00000 n -0000048756 00000 n -0000048847 00000 n -0000048942 00000 n -0000049033 00000 n -0000049124 00000 n -0000049328 00000 n -0000049415 00000 n -0000049502 00000 n -0000049589 00000 n -0000049676 00000 n -0000049763 00000 n -0000049850 00000 n -0000049937 00000 n -0000050026 00000 n -0000050069 00000 n -0000050128 00000 n -0000050187 00000 n -0000050246 00000 n -0000050305 00000 n -0000050364 00000 n -0000050423 00000 n -0000050605 00000 n -0000051522 00000 n -0000051613 00000 n -0000051866 00000 n -0000053514 00000 n -0000061131 00000 n -0000061299 00000 n -0000062093 00000 n -0000062184 00000 n -0000062475 00000 n -0000063905 00000 n -0000096995 00000 n -0000097168 00000 n -0000097910 00000 n -0000098001 00000 n -0000098292 00000 n -0000099498 00000 n -0000120284 00000 n -0000120469 00000 n -0000121519 00000 n -0000121610 00000 n -0000121867 00000 n -0000123727 00000 n -0000132935 00000 n -0000133100 00000 n -0000133367 00000 n -0000133453 00000 n -0000133730 00000 n -0000134430 00000 n -0000138397 00000 n -0000138435 00000 n -0000138794 00000 n -0000138847 00000 n -0000138900 00000 n -0000138953 00000 n -0000139006 00000 n -0000139060 00000 n -0000139113 00000 n -0000139166 00000 n -0000139219 00000 n -0000139272 00000 n -0000139326 00000 n -0000139379 00000 n -0000139432 00000 n -0000139486 00000 n -0000139539 00000 n -0000139593 00000 n -0000139646 00000 n -0000139700 00000 n -0000139754 00000 n -0000139808 00000 n -0000139862 00000 n -0000139916 00000 n -0000139970 00000 n -0000140024 00000 n -0000140078 00000 n -0000140132 00000 n -0000140185 00000 n -0000140238 00000 n -0000140292 00000 n -0000140345 00000 n -0000140399 00000 n -0000140452 00000 n -0000140506 00000 n -0000140560 00000 n -0000140614 00000 n -0000140668 00000 n -0000140721 00000 n -0000140774 00000 n -0000140828 00000 n -0000140882 00000 n -0000140936 00000 n -0000140990 00000 n -0000141044 00000 n -0000141336 00000 n -0000142036 00000 n -0000142346 00000 n -0000143041 00000 n -0000143333 00000 n -0000143840 00000 n -0000144166 00000 n -0000144475 00000 n -0000144785 00000 n -0000145110 00000 n -0000145472 00000 n -0000145765 00000 n -0000146043 00000 n -0000146357 00000 n -0000146660 00000 n -0000147042 00000 n -0000147521 00000 n -0000147935 00000 n -0000148350 00000 n -0000148732 00000 n -0000149122 00000 n -0000149567 00000 n -0000150001 00000 n -0000150380 00000 n -0000150871 00000 n -0000151266 00000 n -0000151665 00000 n -0000152048 00000 n -0000152391 00000 n -0000152710 00000 n -0000153065 00000 n -0000153396 00000 n -0000153771 00000 n -0000154114 00000 n -0000154493 00000 n -0000154820 00000 n -0000155171 00000 n -0000155482 00000 n -0000155869 00000 n -0000156228 00000 n -0000156675 00000 n -0000157066 00000 n -0000157433 00000 n -0000157800 00000 n -0000158115 00000 n -0000158426 00000 n -0000158769 00000 n -0000159148 00000 n -0000159800 00000 n -0000180261 00000 n -0000180554 00000 n -0000184499 00000 n -0000184792 00000 n -0000188309 00000 n -0000188602 00000 n -0000191181 00000 n -0000191474 00000 n -0000193662 00000 n -0000193779 00000 n -0000194865 00000 n -trailer -<< - /Size 533 - /Root 532 0 R - /Info 530 0 R - /ID [(+g8Kl2zF2K0Wx444aP+2wQ==) (+g8Kl2zF2K0Wx444aP+2wQ==)] ->> -startxref -195124 -%%EOF \ No newline at end of file diff --git a/Masterarbeit_draft.typ b/Masterarbeit_draft.typ index ece69c5..7aab899 100644 --- a/Masterarbeit_draft.typ +++ b/Masterarbeit_draft.typ @@ -3,10 +3,10 @@ #let meta = (thesis.meta)( "KI-gestütztes Reverse Requirements Engineering bei Legacy-Software", "Masterarbeit an der Hochschule Neu-Ulm", - "Christoph Musterfrau", + "Christoph Schwörer", "Master of Science", "Prof. Dr. Daniel Schallmo", - "31. März 2026" + "XX 2026" ) #(thesis.cover)(meta) diff --git a/Protokoll.md b/Protokoll.md index 9a83011..600040c 100644 --- a/Protokoll.md +++ b/Protokoll.md @@ -11,32 +11,23 @@ Zur Analyse der Usecases des bestehenden C-entron ERP wurde bisher folgendes gem Der Prompt dabei war: - 1.1 Anschließen wurden alle gefundenen Usecases geclustert und in 101 Abstrakte Konzepte zugeordnet (Z.B. Adressstamm, Anzahlungsrechnung, Checlisten, Preismatrix, SEPA, Mailvorlagen, etc) Eine volsltändige liste liegt unter [link](./A_Videoanalyse_Uebersicht.csv) - - 1.2 Der nächste Schritt war das manuelle erörtern aller dieser Usecases und eine erste Bewertung und Kategorisierung in folgende Kategorien: - - *ja*: Der USecase/Feature/Modul soll in seiner Bestehenden form übernommen werden. Alle anfordrungen und Umsetzungen bleiben bestehen - - *nein*: Der Usecase/Feature/Modul wir in ERP Web nciht mehr vorhanden sein (Deprected oder zwischenzeitlich andere Lösung. Beispiel TAPI Anbindung) - - *neu*: Der Usecase/Feature/Module muss in seiner Form neu überdacht werden. Grundsätzlich soll das Feature vorhanden sein, aber die Methode / Anforderugnen / Umsetzung muss überdacht werden. - - *TBD*: Noch keine Entscheidung. Muss im detail betrachtet werden. + 2. Erster Versuch mit LLM (Claude AI, Codex) ohne jegliche anpassung an Claude AI: Prompt: - Ergebnis - Claude: - Codex: - -2.5 Verfeinerung des Prompts - Ergebnis - Claude: - Codex: +2.1 Erster allgmeeiner Versuch + [Siehe inhalt von Versuche/Versuch01] +2.2 Spezialisierter Versuch auf IS0 29148 mit Agents + [Siehe inhalt von Versuche/Versuch 02] +2.3 Spezialisierter Versuch mit Agents und MCP Servern + [Siehe inhalt von Versuche/Versuch 03] 3. Komplette Individualisierung von Claude (Claude.md Agents, MCP Server, Skills) -Prompt: -Ergebnis: +[Siehe Versuch 03] 4. Offen: Vollständige Videoanalyse: @@ -47,3 +38,10 @@ Ergebnis:: offen 4.5 Offen: Abgleich der Videoanalyse mit den codebasierten Analysen ob sich die UseCases decken oder auf welcher Seite mehr/weniger Usecases geefunden wurden. +4.6 Optional :Anschließen wurden alle gefundenen Usecases geclustert und in 101 Abstrakte Konzepte zugeordnet (Z.B. Adressstamm, Anzahlungsrechnung, Checlisten, Preismatrix, SEPA, Mailvorlagen, etc) Eine volsltändige liste liegt unter [link](./A_Videoanalyse_Uebersicht.csv) + +4.6.2 Der nächste Schritt war das manuelle erörtern aller dieser Usecases und eine erste Bewertung und Kategorisierung in folgende Kategorien: + - *ja*: Der USecase/Feature/Modul soll in seiner Bestehenden form übernommen werden. Alle anfordrungen und Umsetzungen bleiben bestehen + - *nein*: Der Usecase/Feature/Modul wir in ERP Web nciht mehr vorhanden sein (Deprected oder zwischenzeitlich andere Lösung. Beispiel TAPI Anbindung) + - *neu*: Der Usecase/Feature/Module muss in seiner Form neu überdacht werden. Grundsätzlich soll das Feature vorhanden sein, aber die Methode / Anforderugnen / Umsetzung muss überdacht werden. + - *TBD*: Noch keine Entscheidung. Muss im detail betrachtet werden. \ No newline at end of file diff --git a/Versuche/Versuch 01/Versuch01.md b/Versuche/Versuch 01/Versuch01.md index 0b9598b..9b66492 100644 --- a/Versuche/Versuch 01/Versuch01.md +++ b/Versuche/Versuch 01/Versuch01.md @@ -25,11 +25,27 @@ Fokus auf ISO/IEC/IEEE-29148-konforme Requirements-Spezifikation ueber drei Eben | Analysierte Quellartefakte | 34 C# Projekte, 12.507+ Source Files | | Separate Traceability-CSV (Dateien / Zeilen) | 0 / 0 | +## Vorgehen +- Einfacher Prompt zu Claude Code +- Keine Agents +- Keine MCP Server + +## Verwendeter Prompt +```text +Please analyze this software project and write a reuqirements specification according to modern standards. +``` + +## Agenten (Beispiele) +- Keine Agenten in V01 verwendet (Baseline ohne agentische Zerlegung) + +## Ergebnisbeispiele aus `Ergebnisse` +- `Ergebnisse/ISO29148_Complete_Requirements_Specification.md` + - Dokumentiert 277 Requirements (35 StRS + 75 SyRS + 167 SwRS) + - Enthaltene Evidenzbasis: 5.000+ File-Referenzen (laut Dokumentkopf) +- `Ergebnisse/system/SyRS_Complete_Detailed.md` + - Vollstaendige SyRS-Struktur mit funktionalen, Schnittstellen-, Performance- und Security-Anforderungen +- `Ergebnisse/software/SwRS_Complete_Detailed.md` + - Detaillierte Software-Anforderungen inkl. Verifikationsbezug + ## Evaluation-Hinweis Starker Fokus auf formale Requirements-Qualitaet und Traceability; konsolidierte Zaehlung erfolgt in `Requirements.md`. - -## Vorgehen -- Einfacher Prompt zu Claude Code ohne Agents oder MCP Server - -## Prompt -"Please analyze this software project and write a reuqirements specification according to modern standards." \ No newline at end of file diff --git a/Versuche/Versuch 03/Ergenisse/.execution_state/baseline_metrics.json b/Versuche/Versuch 02/Ergenisse/.execution_state/baseline_metrics.json similarity index 100% rename from Versuche/Versuch 03/Ergenisse/.execution_state/baseline_metrics.json rename to Versuche/Versuch 02/Ergenisse/.execution_state/baseline_metrics.json diff --git a/Versuche/Versuch 03/Ergenisse/.execution_state/directory_setup.txt b/Versuche/Versuch 02/Ergenisse/.execution_state/directory_setup.txt similarity index 100% rename from Versuche/Versuch 03/Ergenisse/.execution_state/directory_setup.txt rename to Versuche/Versuch 02/Ergenisse/.execution_state/directory_setup.txt diff --git a/Versuche/Versuch 03/Ergenisse/.execution_state/milestone_state.json b/Versuche/Versuch 02/Ergenisse/.execution_state/milestone_state.json similarity index 100% rename from Versuche/Versuch 03/Ergenisse/.execution_state/milestone_state.json rename to Versuche/Versuch 02/Ergenisse/.execution_state/milestone_state.json diff --git a/Versuche/Versuch 03/Ergenisse/.execution_state/project_structure.json b/Versuche/Versuch 02/Ergenisse/.execution_state/project_structure.json similarity index 100% rename from Versuche/Versuch 03/Ergenisse/.execution_state/project_structure.json rename to Versuche/Versuch 02/Ergenisse/.execution_state/project_structure.json diff --git a/Versuche/Versuch 03/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.md b/Versuche/Versuch 02/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.md rename to Versuche/Versuch 02/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.md diff --git a/Versuche/Versuch 03/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.pdf b/Versuche/Versuch 02/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.pdf similarity index 100% rename from Versuche/Versuch 03/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.pdf rename to Versuche/Versuch 02/Ergenisse/COMPLETE_REQUIREMENTS_SPECIFICATION.pdf diff --git a/Versuche/Versuch 03/Ergenisse/README.md b/Versuche/Versuch 02/Ergenisse/README.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/README.md rename to Versuche/Versuch 02/Ergenisse/README.md diff --git a/Versuche/Versuch 03/Ergenisse/TABLE_FORMATTING_STATUS.md b/Versuche/Versuch 02/Ergenisse/TABLE_FORMATTING_STATUS.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/TABLE_FORMATTING_STATUS.md rename to Versuche/Versuch 02/Ergenisse/TABLE_FORMATTING_STATUS.md diff --git a/Versuche/Versuch 03/Ergenisse/master/ISO29148_Executive_Summary.md b/Versuche/Versuch 02/Ergenisse/master/ISO29148_Executive_Summary.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/master/ISO29148_Executive_Summary.md rename to Versuche/Versuch 02/Ergenisse/master/ISO29148_Executive_Summary.md diff --git a/Versuche/Versuch 03/Ergenisse/master/ISO29148_Master_Requirements.md b/Versuche/Versuch 02/Ergenisse/master/ISO29148_Master_Requirements.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/master/ISO29148_Master_Requirements.md rename to Versuche/Versuch 02/Ergenisse/master/ISO29148_Master_Requirements.md diff --git a/Versuche/Versuch 03/Ergenisse/master/ISO29148_Quality_Report.md b/Versuche/Versuch 02/Ergenisse/master/ISO29148_Quality_Report.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/master/ISO29148_Quality_Report.md rename to Versuche/Versuch 02/Ergenisse/master/ISO29148_Quality_Report.md diff --git a/Versuche/Versuch 03/Ergenisse/master/ISO29148_Traceability_Master.csv b/Versuche/Versuch 02/Ergenisse/master/ISO29148_Traceability_Master.csv similarity index 100% rename from Versuche/Versuch 03/Ergenisse/master/ISO29148_Traceability_Master.csv rename to Versuche/Versuch 02/Ergenisse/master/ISO29148_Traceability_Master.csv diff --git a/Versuche/Versuch 03/Ergenisse/master/ISO29148_Validation_Checklist.md b/Versuche/Versuch 02/Ergenisse/master/ISO29148_Validation_Checklist.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/master/ISO29148_Validation_Checklist.md rename to Versuche/Versuch 02/Ergenisse/master/ISO29148_Validation_Checklist.md diff --git a/Versuche/Versuch 03/Ergenisse/software/Analysis_Complete.md b/Versuche/Versuch 02/Ergenisse/software/Analysis_Complete.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Analysis_Complete.md rename to Versuche/Versuch 02/Ergenisse/software/Analysis_Complete.md diff --git a/Versuche/Versuch 03/Ergenisse/software/Business_Rules.md b/Versuche/Versuch 02/Ergenisse/software/Business_Rules.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Business_Rules.md rename to Versuche/Versuch 02/Ergenisse/software/Business_Rules.md diff --git a/Versuche/Versuch 03/Ergenisse/software/Integration_Patterns.md b/Versuche/Versuch 02/Ergenisse/software/Integration_Patterns.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Integration_Patterns.md rename to Versuche/Versuch 02/Ergenisse/software/Integration_Patterns.md diff --git a/Versuche/Versuch 03/Ergenisse/software/Pattern_Catalog.csv b/Versuche/Versuch 02/Ergenisse/software/Pattern_Catalog.csv similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Pattern_Catalog.csv rename to Versuche/Versuch 02/Ergenisse/software/Pattern_Catalog.csv diff --git a/Versuche/Versuch 03/Ergenisse/software/Performance_Patterns.md b/Versuche/Versuch 02/Ergenisse/software/Performance_Patterns.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Performance_Patterns.md rename to Versuche/Versuch 02/Ergenisse/software/Performance_Patterns.md diff --git a/Versuche/Versuch 03/Ergenisse/software/Security_Patterns.md b/Versuche/Versuch 02/Ergenisse/software/Security_Patterns.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Security_Patterns.md rename to Versuche/Versuch 02/Ergenisse/software/Security_Patterns.md diff --git a/Versuche/Versuch 03/Ergenisse/software/SwRS_Algorithms.md b/Versuche/Versuch 02/Ergenisse/software/SwRS_Algorithms.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/SwRS_Algorithms.md rename to Versuche/Versuch 02/Ergenisse/software/SwRS_Algorithms.md diff --git a/Versuche/Versuch 03/Ergenisse/software/SwRS_CodeCatalog.md b/Versuche/Versuch 02/Ergenisse/software/SwRS_CodeCatalog.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/SwRS_CodeCatalog.md rename to Versuche/Versuch 02/Ergenisse/software/SwRS_CodeCatalog.md diff --git a/Versuche/Versuch 03/Ergenisse/software/SwRS_Complete.md b/Versuche/Versuch 02/Ergenisse/software/SwRS_Complete.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/SwRS_Complete.md rename to Versuche/Versuch 02/Ergenisse/software/SwRS_Complete.md diff --git a/Versuche/Versuch 03/Ergenisse/software/SwRS_DataModel.md b/Versuche/Versuch 02/Ergenisse/software/SwRS_DataModel.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/SwRS_DataModel.md rename to Versuche/Versuch 02/Ergenisse/software/SwRS_DataModel.md diff --git a/Versuche/Versuch 03/Ergenisse/software/SwRS_TestSpecification.md b/Versuche/Versuch 02/Ergenisse/software/SwRS_TestSpecification.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/SwRS_TestSpecification.md rename to Versuche/Versuch 02/Ergenisse/software/SwRS_TestSpecification.md diff --git a/Versuche/Versuch 03/Ergenisse/software/SwRS_Traceability.csv b/Versuche/Versuch 02/Ergenisse/software/SwRS_Traceability.csv similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/SwRS_Traceability.csv rename to Versuche/Versuch 02/Ergenisse/software/SwRS_Traceability.csv diff --git a/Versuche/Versuch 03/Ergenisse/software/Validation_Rules.md b/Versuche/Versuch 02/Ergenisse/software/Validation_Rules.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/software/Validation_Rules.md rename to Versuche/Versuch 02/Ergenisse/software/Validation_Rules.md diff --git a/Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Complete.md b/Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Complete.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Complete.md rename to Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Complete.md diff --git a/Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Diagrams.md b/Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Diagrams.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Diagrams.md rename to Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Diagrams.md diff --git a/Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Evidence.md b/Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Evidence.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Evidence.md rename to Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Evidence.md diff --git a/Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Summary.md b/Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Summary.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Summary.md rename to Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Summary.md diff --git a/Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Traceability.csv b/Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Traceability.csv similarity index 100% rename from Versuche/Versuch 03/Ergenisse/stakeholder/StRS_Traceability.csv rename to Versuche/Versuch 02/Ergenisse/stakeholder/StRS_Traceability.csv diff --git a/Versuche/Versuch 03/Ergenisse/system/SyRS_API_Specification.yaml b/Versuche/Versuch 02/Ergenisse/system/SyRS_API_Specification.yaml similarity index 100% rename from Versuche/Versuch 03/Ergenisse/system/SyRS_API_Specification.yaml rename to Versuche/Versuch 02/Ergenisse/system/SyRS_API_Specification.yaml diff --git a/Versuche/Versuch 03/Ergenisse/system/SyRS_Architecture.md b/Versuche/Versuch 02/Ergenisse/system/SyRS_Architecture.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/system/SyRS_Architecture.md rename to Versuche/Versuch 02/Ergenisse/system/SyRS_Architecture.md diff --git a/Versuche/Versuch 03/Ergenisse/system/SyRS_Complete.md b/Versuche/Versuch 02/Ergenisse/system/SyRS_Complete.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/system/SyRS_Complete.md rename to Versuche/Versuch 02/Ergenisse/system/SyRS_Complete.md diff --git a/Versuche/Versuch 03/Ergenisse/system/SyRS_Interfaces.md b/Versuche/Versuch 02/Ergenisse/system/SyRS_Interfaces.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/system/SyRS_Interfaces.md rename to Versuche/Versuch 02/Ergenisse/system/SyRS_Interfaces.md diff --git a/Versuche/Versuch 03/Ergenisse/system/SyRS_Summary.md b/Versuche/Versuch 02/Ergenisse/system/SyRS_Summary.md similarity index 100% rename from Versuche/Versuch 03/Ergenisse/system/SyRS_Summary.md rename to Versuche/Versuch 02/Ergenisse/system/SyRS_Summary.md diff --git a/Versuche/Versuch 03/Ergenisse/system/SyRS_Traceability.csv b/Versuche/Versuch 02/Ergenisse/system/SyRS_Traceability.csv similarity index 100% rename from Versuche/Versuch 03/Ergenisse/system/SyRS_Traceability.csv rename to Versuche/Versuch 02/Ergenisse/system/SyRS_Traceability.csv diff --git a/Versuche/Versuch 02/Requirements.md b/Versuche/Versuch 02/Requirements.md index ebe63e6..e700756 100644 --- a/Versuche/Versuch 02/Requirements.md +++ b/Versuche/Versuch 02/Requirements.md @@ -1,20 +1,23 @@ # Versuch 02 - Requirements (konsolidiert) ## Konsolidierungsentscheidung -Use Cases und Anforderungen werden als gleiches Zielobjekt betrachtet. In Versuch 02 liegen die Features/Faehigkeiten ueberwiegend als Use Cases vor (keine vollstaendige StRS/SyRS/SwRS-Gliederung). +Use Cases und Anforderungen werden als gleiches Zielobjekt betrachtet. In Versuch 02 sind Use Cases in den Stakeholder-Diagrammen dokumentiert, aber inhaltlich mit den formalen Anforderungen verknuepft (Traceability auf StR-IDs). Daher erfolgt eine deduplizierte Konsolidierung. ## Cluster-Liste | Cluster | Anzahl | | --- | ---: | -| Formale Anforderungen (StRS+SyRS+SwRS) | 0 | -| Dokumentierte Use Cases | 509 | -| Neu entdeckte (vormals undokumentierte) Use Cases | 1211 | -| Ueberlappung Use Cases <-> Anforderungen (abgezogen) | 0 | +| Stakeholder-Anforderungen (StRS) | 84 | +| System-Anforderungen (SyRS) | 53 | +| Software-Anforderungen (SwRS) | 83 | +| Explizite Use Cases (Diagramme) | 46 | +| Ueberlappung Use Cases <-> Anforderungen (konservativ abgezogen) | 46 | ## Summen -- Rohsumme (`Requirements + Use Cases`): **1720** -- **Konsolidierte Requirements/Faehigkeiten gesamt: 1720** +- Rohsumme (`Requirements + Use Cases`): **266** +- **Konsolidierte Requirements/Faehigkeiten gesamt: 220** -## Hinweis -- Die Zahl `1720` ist bereits dedupliziert als "Total System Functionality". -- Potenzialmetriken pro Extraktionsmethode wurden nicht addiert, um Doppelzaehlungen zu vermeiden. +## Use-Case-Cluster (Nachweis) +- Sales Management: 13 +- Helpdesk Management: 17 +- Financial Management: 16 +- Summe explizite Use Cases: 46 diff --git a/Versuche/Versuch 02/Tools/AGENTS.md b/Versuche/Versuch 02/Tools/AGENTS.md index 372b36c..abf5027 100644 --- a/Versuche/Versuch 02/Tools/AGENTS.md +++ b/Versuche/Versuch 02/Tools/AGENTS.md @@ -1,4 +1,4 @@ -# AGENTS.md +# AGENTS.md This file provides guidance to Codex when working with code in this repository. @@ -31,14 +31,6 @@ Available targets: - `run-tests` - Execute all test suites - `create-installers` - Build MSI installers -## Agent Notes - -- Default shell is PowerShell (`pwsh`). Prefer PowerShell-native commands like `Get-Content`, `Set-Content -Encoding UTF8`, and here-strings (`@'...'@`) instead of Unix tools (`sed`, `nl`, etc.). -- Use `rg`/`rg --files` for fast searches—they are available by default. -- Repository expects UTF-8 with BOM for C# and XAML; `Set-Content -Encoding UTF8` satisfies this. -- Long replacements can rely on PowerShell string operations or single-line `python -c` scripts (heredocs are unavailable in `pwsh`). -- `dotnet build Centron.sln` may warn about `libfintx.FinTSConfig`; this is expected and can be ignored for success checks. - ### Publishing - **Publish WPF UI**: `dotnet publish src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj -c Release -r win-x64 --self-contained` - **Publish Web Service**: `dotnet publish src/webservice/Centron.Host.WindowsService/Centron.Host.WindowsService.csproj -c Release -r win-x64 --self-contained` @@ -292,4 +284,4 @@ When adding new documentation to the project: - Supports both standalone and web service deployment modes - Always test database scripts before committing - Use German for all user-facing text with English translations -- Follow dual implementation pattern (BL + WS) for all data access +- Follow dual implementation pattern (BL + WS) for all data access \ No newline at end of file diff --git a/Versuche/Versuch 02/Tools/CLAUDE.md b/Versuche/Versuch 02/Tools/CLAUDE.md index afbe372..6c778d0 100644 --- a/Versuche/Versuch 02/Tools/CLAUDE.md +++ b/Versuche/Versuch 02/Tools/CLAUDE.md @@ -1,248 +1,316 @@ -# c-entron.NET +# CLAUDE.md -> ⚠️ **FOR CLAUDE AI - NOT FOR DEVELOPERS** -> -> This file contains project conventions and patterns that Claude AI uses to generate correct code. -> **Developers**: See [.claude/README.md](.claude/README.md) for user documentation. +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. -> **v2.1.0** | 2025-01-20 | ERP for German SMBs | C# .NET 8 | WPF + REST API +## Development Commands -## Stack -**Core**: C# 12, .NET 8 | **Frontend**: WPF + Blazor Server, DevExpress 24.2.7 (WPF & Blazor), MVVM | **Backend**: ASP.NET Core 8, SQL Server 2019+, NHibernate 5.x, JWT auth | **Real-Time**: SignalR | **Build**: Azure DevOps, Centron.Scripts, WiX MSI | **Test**: NUnit +### Building +- **Build entire solution**: `dotnet build Centron.sln` +- **Build specific project**: `dotnet build src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj` +- **Build for Release**: `dotnet build Centron.sln -c Release` + +### Testing +- **Run all tests**: `dotnet test Centron.sln` +- **Run specific test project**: `dotnet test tests/backend/Centron.Tests.BL/Centron.Tests.BL.csproj` +- **Run integration tests**: `dotnet test tests/Centron.Tests.Integration/Centron.Tests.Integration.csproj` +- **Run end-to-end tests**: `dotnet test tests/Centron.Tests.EndToEnd/Centron.Tests.EndToEnd.csproj` + +### Using Centron.Scripts Build System +The project uses a custom build system via Centron.Scripts for complete builds: + +```bash +cd scripts/Centron.Scripts +dotnet run -- +``` + +Available targets: +- `clean` - Clean artifacts and bin/obj directories +- `setup-versioning` - Set up version information +- `build-web-service` - Build the web service components +- `build-centron-net` - Build the WPF client application +- `run-tests` - Execute all test suites +- `create-installers` - Build MSI installers + +### Publishing +- **Publish WPF UI**: `dotnet publish src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj -c Release -r win-x64 --self-contained` +- **Publish Web Service**: `dotnet publish src/webservice/Centron.Host.WindowsService/Centron.Host.WindowsService.csproj -c Release -r win-x64 --self-contained` + +## Project Architecture + +### High-Level Structure +This is a .NET 8 enterprise application with a multi-layered architecture: -## Structure ``` src/ -├── apis/ - External integrations (FinAPI, GLS, Shipcloud, ITscope, etc.) -├── backend/ - BL, DAO, Entities, Interfaces, EDI -├── centron/ - WPF UI (Desktop) -├── CentronNexus/ - Blazor Server (Web Portal) -├── shared/ - Core, Controls -└── webservice/ - REST API, Hosts -tests/ - BL, DAO, Integration, E2E -.claude/ - agents/, commands/, hooks/, settings.json +├── apis/ - External API integrations (FinAPI, GLS, Shipcloud, etc.) +├── backend/ - Core business logic layer +│ ├── Centron.BL/ - Business Logic layer +│ ├── Centron.Common/ - Common utilities and helpers +│ ├── Centron.DAO/ - Data Access Objects (NHibernate) +│ ├── Centron.Entities/ - Domain entities +│ ├── Centron.Gateway/ - External service gateways +│ └── Centron.Interfaces/ - Service interfaces +├── centron/ - WPF client application +│ ├── Centron.WPF.UI/ - Main WPF application +│ └── Centron.WPF.UI.Extension/ - UI extensions +├── shared/ - Shared components and controls +│ ├── Centron.Core/ - Core shared functionality +│ ├── Centron.Controls/ - Custom UI controls +│ └── Centron.Controls.Preview/ - Preview controls +└── webservice/ - Web service components + ├── Centron.Host/ - Web service host + ├── Centron.Host.Console/ - Console host + ├── Centron.Host.WindowsService/ - Windows service host + ├── Centron.WebServices.Core/ - Web service core + └── c-entron.misc.ConnectionManager/ - Connection management ``` -**Key Files**: `src/centron/Centron.WPF.UI/App.xaml.cs` (WPF), `src/webservice/Centron.Host.WindowsService/Program.cs` (Service), `Centron.sln`, `version.json` +### Data Access Pattern +The application uses a dual data access pattern supporting both direct database access and web service communication: -## Naming -- **C# Classes**: `PascalCase`, Interfaces: `IPascalCase`, Methods: `PascalCase`, Private: `_camelCase`, Local: `camelCase` -- **DB Tables**: `PascalCase` English (new), Keep German (legacy), PK: `I3D` (int IDENTITY), FK: `{Table}I3D` -- **Standard Columns**: `CreatedByI3D`, `CreatedDate`, `ChangedByI3D`, `ChangedDate`, `IsDeleted`, `DeletedByI3D`, `DeletedDate` -- **BL Pattern**: `I{Module}Logic`, `BL{Module}Logic`, `WS{Module}Logic`, `{Entity}BL`, `{Entity}WebServiceBL` +#### WPF UI Architecture (3-layer pattern | ILogic Interface Pattern) +All data operations in the UI must use the ILogic interface accessed through ClassContainer: +- WPF UI modules use a 3-part data access pattern: + - I{Module}Logic interface - Defines the contract + - BL{Module}Logic (NHibernate/SQL Server) - Direct database access via NHibernate + - WS{Module}Logic (REST API) - Web service access via REST API +- Access via ClassContainer.Instance.WithInstance((ILogic logic) => ...).ThrowIfError(); +- Connection types controlled by AppModuleController: + - CentronConnectionType.CentronWebServices ➜ WSLogic + - CentronConnectionType.SqlServer ➜ BLLogic -## Critical Patterns - -### Result Pattern (MANDATORY) ```csharp -public Result Method() { - try { - var data = _dao.Get(id); - return data == null ? Result.Error("Not found") : Result.Success(data); - } catch (Exception ex) { return Result.Error(ex); } -} -``` - -### UI Data Access (MANDATORY) -```csharp -// Single use -var result = await ClassContainer.Instance - .WithInstance((IEntityLogic logic) => logic.GetEntity(id)) +var result = await ClassContainer + .Instance + .WithInstance((IAccountContractsLogic logic) => logic.GetAccountContracts(filter)) .ThrowIfError(); - -// Multiple uses (IDisposable) -private readonly IEntityLogic _logic; -public ViewModel() { _logic = ClassContainer.Instance.GetInstance(); } -public void Dispose() { ClassContainer.Instance.ReleaseInstance(_logic); } ``` -### Architecture -**WPF UI** → `I{Module}Logic` (ClassContainer) → `BL{Module}Logic` (SQL) OR `WS{Module}Logic` (REST) -**REST API** → `CentronRestService` → `{Entity}WebServiceBL` (DTO conversion) → `{Entity}BL` (Business Logic) → DAO → NHibernate → SQL Server +#### Backend Architecture (2-layer pattern) +- Backend uses a 2-layer BL approach for web service implementation: + - Base BL class (e.g., AccountDeviceBL) - contains core business logic and database access via DAO + - WebService BL class (e.g., AccountDeviceWebServiceBL) - handles DTO conversion and calls base BL +- WebService BL pattern: + - Inherits from BaseBL and creates instance of corresponding base BL class + - Converts DTOs to entities using conversion methods (ConvertAccountDeviceDTOToAccountDevice) + - Uses ObjectMapper for entity-to-DTO conversion + - Ensures DTO entities are not connected to NHibernate database context for API security +- API implementation in ICentronRestService and CentronRestService: + - API methods call WebService BL classes + - All API operations use DTO entities for data transfer + - Example: SaveAccountDevice API method → AccountDeviceWebServiceBL.SaveAccountDevice → AccountDeviceBL.SaveAccountDevice -Connection types: `CentronConnectionType.SqlServer` (BLLogic) | `CentronConnectionType.CentronWebServices` (WSLogic) +### Technology Stack +- **.NET 8** - Primary framework +- **WPF** - Desktop UI framework +- **NHibernate** with **FluentNHibernate** - ORM for database access +- **DevExpress 24.2.7** - UI controls and components +- **Bullseye** - Build orchestration +- **Entity Framework** - Some components use EF alongside NHibernate -## Database Conventions (MUST FOLLOW) -- **PK**: `I3D` [int] IDENTITY(1,1) NOT NULL (auto-created by `ScriptHelpers.AddTableIfNotExists()`) -- **FK**: End with `I3D` suffix (e.g., `AccountI3D`) -- **Standard Columns**: CreatedByI3D, CreatedDate, ChangedByI3D, ChangedDate, IsDeleted, DeletedByI3D, DeletedDate (all REQUIRED) -- **Types**: `nvarchar` (NOT varchar), `datetime2(2)`, `bit`, `decimal(18,2)` for currency -- **Naming**: English PascalCase (new), Keep German (legacy), `dbo` schema +### Connection Types +Modules support different connection types declared in AppModuleController: +- `CentronConnectionType.CentronWebServices` - Uses WSLogic implementation +- `CentronConnectionType.SqlServer` - Uses BLLogic implementation -### Creating Database Scripts -1. Reserve number in Teams: `c-entron Entwickler` → Files → `Datenbankupdate 2 1.xlsx` -2. Create: `src/backend/Centron.BL/Administration/Scripts/ScriptMethods/Scripts/ScriptMethod{number}.cs` -3. Implement `BaseScriptMethod` with `GetSqlQueries()` -4. Use `ScriptHelpers.*` (AddTableIfNotExists, AddColumnIfNotExists, AddRightIfNotExists, etc.) -5. **Convert to UTF-8 with BOM** (C# files require BOM) +## Development Guidelines -## Localization (REQUIRED) -- **Primary**: German (`LocalizedStrings.resx`) | **Secondary**: English (`LocalizedStrings.en.resx`) -- **Code**: `LocalizedStrings.KeyName` | **XAML**: `{x:Static properties:LocalizedStrings.KeyName}` -- **Key Format**: `{ClassName}_{Method}_{Description}` +### Code Style and Standards +- KISS +- DRY +- SOLID +- Clean Architecture -## File Encoding (CRITICAL) -- **UTF-8 WITH BOM**: `*.cs`, `*.xaml` (MANDATORY) -- **UTF-8 NO BOM**: `*.md`, `*.json`, `*.xml`, `*.config` +### General Rules +- Write self-explanatory code and only comment when absolutely necessary +- When updating code, always update DocStrings -**PowerShell Conversion**: -```powershell -$file = 'path\to\file.cs' -$content = [System.IO.File]::ReadAllText($file) -$utf8BOM = New-Object System.Text.UTF8Encoding($true) -[System.IO.File]::WriteAllText($file, $content, $utf8BOM) -``` +### Language Requirements +- All user-facing content must be in German (primary market) +- Support for English through localization files +- Use German resource files (LocalizedStrings.resx) and English (LocalizedStrings.en.resx) -## NHibernate Performance -- Use `.Fetch()` for eager loading (prevent N+1) -- Always filter: `.Where(x => !x.IsDeleted)` -- Use `Future()` for multiple collections -- Avoid lazy loading in loops +### File Encoding +- All C# source files (*.cs) must use UTF-8 with BOM +- All XAML files (*.xaml) must use UTF-8 with BOM -```csharp -// Good -var accounts = session.Query() - .Where(x => !x.IsDeleted) - .Fetch(x => x.AccountType) - .Fetch(x => x.PriceList) - .ToList(); -``` +### Naming Conventions +- ILogic interfaces: `I{Module}Logic` +- BL implementations: `BL{Module}Logic` +- WS implementations: `WS{Module}Logic` +- All methods return `Result` or `Task>` + +### Code Signing (Optional) +Set environment variables for code signing: +- `CENTRON_BUILD_CODE_SIGNING_CERTIFICATE` - Path to certificate +- `CENTRON_BUILD_CODE_SIGNING_CERTIFICATE_PASSWORD` - Certificate password + +## Database +- Uses NHibernate ORM with SQL Server +- Configuration files generated during build process +- Test databases required for end-to-end testing ## Development Processes +### Database Schema Changes + +#### Creating Database Scripts +1. **Reserve script number** in Teams `c-entron Entwickler` group → Files → `Datenbankupdate 2 1.xlsx` +2. **Create script class** at `src/backend/Centron.BL/Administration/Scripts/ScriptMethods/Scripts/ScriptMethod{number}.cs` +3. **Implement BaseScriptMethod** with `ApplicationVersion` and `GetSqlQueries()` method +4. **Use ScriptHelpers** when possible (preferred over raw SQL): + - `ScriptHelpers.AddColumnIfNotExists()` + - `ScriptHelpers.AddTableIfNotExists()` + - `ScriptHelpers.AddRightIfNotExists()` + - `ScriptHelpers.AddIndexIfNotExists()` + - `ScriptHelpers.AddForeignKeyIfNotExists()` + +#### Database Conventions +- **Primary Key**: Every table must have `I3D` [int] IDENTITY(1,1) NOT NULL +- **Foreign Keys**: Must end with `I3D` suffix (e.g., `AccountI3D`) +- **Standard Columns**: Include `CreatedByI3D`, `CreatedDate`, `ChangedByI3D`, `ChangedDate`, `IsDeleted`, `DeletedByI3D`, `DeletedDate` +- **Data Types**: Use `nvarchar` over `varchar`, `datetime2(2)` for timestamps, `bit` for booleans +- **Naming**: New tables/columns use English names (historical German names remain unchanged) + ### Settings Management -- **Legacy**: `Stammdat` table (read-only) -- **New**: `ApplicationSettings` table ONLY -- Get next ID from `src/backend/Centron.Interfaces/Administration/Settings/ApplicationSettingID.cs` -- Add description to `ApplicationSettingDefinitions.cs` -### User Rights -1. Get next I3D from `UserRightsConst.cs` -2. Create script: `ScriptHelpers.AddRightIfNotExists(id, parentId, "German name", "German desc")` -3. Add constant to `UserRightsConst.cs` +#### Application Settings +- **Legacy settings**: Stored in `Stammdat` table (read-only, no new additions) +- **New settings**: Use `ApplicationSettings` table exclusively +- **Setting IDs**: Get next available ID from comment in `src/backend/Centron.Interfaces/Administration/Settings/ApplicationSettingID.cs` +- **Descriptions**: Add to `ApplicationSettingDefinitions.cs` -### Web Service (Full Stack) -1. **BL**: `{Entity}BL.cs` returning `Result` -2. **WebServiceBL**: `{Entity}WebServiceBL.cs` with DTO↔Entity conversion -3. **RestService**: Add to `CentronRestService.cs` (`Request` → `Response`) -4. **Interface**: `ICentronRestService.cs` with `[OperationContract]`, `[WebInvoke(Method="POST", UriTemplate="...")]`, `[Authenticate]` -5. **Logic**: `I{Entity}Logic`, `BL{Entity}Logic`, `WS{Entity}Logic` +#### Adding New Settings +1. Check next available ID in `ApplicationSettingID.cs` +2. Add enum value with new ID +3. Update "Next Centron Settings ID" comment +4. Add description in `ApplicationSettingDefinitions.cs` +5. Create group setting classes for accessing settings +6. Use `AppSettingsBL.GetSettings()` and `GetSettingsForUpdate()` -### WPF Module -1. **Controller**: Implement `ICentronAppModuleController` -2. **View**: `UserControl` inheriting `BaseModule` -3. **ViewModel**: Inherit `BindableBase` -4. **Ribbon**: Implement `IRibbonControlModule` variations -5. **Registration**: Add to `ModuleRegistration.cs` with rights checks -6. **Theme**: Prefer DevExpress controls over WPF standard +### User Rights Management -## Agent Usage (MANDATORY) +#### Adding New Rights +1. **Open** `UserRightsConst.cs` to get next I3D +2. **Create script** using `ScriptHelpers.AddRightIfNotExists()`: + ```csharp + yield return ScriptHelpers.AddRightIfNotExists( + UserRightsConst.Sales.Customer.Helpdesk.SHOW_HOURLYSURCHARGERATES, + UserRightsConst.Sales.Customer.Helpdesk.ID, + "German display name", + "German description"); + ``` +3. **Add constant** to `UserRightsConst.cs` -### Project Agents (.claude/agents/) -- **primary-development**: ALL development tasks (orchestrator) -- **database-script-creator**: Database schema changes → generates ScriptMethod*.cs -- **webservice-developer**: Full-stack web service implementation -- **ui-module-creator**: WPF modules with MVVM + DevExpress -- **centron-nexus-developer**: Blazor Server, Razor components, SignalR, DevExpress Blazor -- **external-api-integrator**: Third-party API integrations (FinAPI, GLS, Shipcloud, etc.) -- **edi-specialist**: EDI processing (OpenTrans, EDIFACT, supplier integrations) -- **nhibernate-query-reviewer**: Query optimization, N+1 detection -- **localization-checker**: German/English verification -- **bookkeeping-export-expert**: DATEV, Abacus, SAP exports -- **test-engineer**: Test generation -- **code-reviewer**: Code quality/security -- **refactoring-specialist**: Code cleanup -- **debugger**: Bug diagnosis -- **architect**: System design -- **documentation-writer**: Docs -- **security-analyst**: Security reviews +### Web Service Development -### MANDATORY Agent Usage -- New features → **primary-development** -- DB schema → **database-script-creator** -- Web service → **webservice-developer** -- WPF module → **ui-module-creator** -- CentronNexus/Blazor → **centron-nexus-developer** -- External API → **external-api-integrator** -- EDI integration → **edi-specialist** -- Complex queries → **nhibernate-query-reviewer** -- UI text → **localization-checker** +#### Creating Web Service Methods (Full Stack) +1. **BL Layer**: Create method in `{Entity}BL.cs` returning `Result` +2. **WebServiceBL**: Create `{Entity}WebServiceBL.cs` with DTO↔Entity conversion +3. **RestService**: Add method to `CentronRestService.cs` accepting `Request` and returning `Response` +4. **Interface**: Add method signature to `ICentronRestService.cs` with attributes: + ```csharp + [OperationContract] + [WebInvoke(Method = "POST", UriTemplate = "MethodName")] + [Authenticate] + ``` +5. **Logic Interfaces**: Create `I{Entity}Logic`, `BL{Entity}Logic`, `WS{Entity}Logic` -## Commands -```bash -dotnet build Centron.sln # Build -dotnet test Centron.sln # Test all -cd scripts/Centron.Scripts && dotnet run # Build orchestration +#### Request Classes +- Place in `Centron.WebServices.Core/RestRequests/` +- Decorate with `[DataContract]` and `[DataMember]` attributes +- Use for complex parameters instead of multiple individual parameters + +### UI Development + +#### Creating WPF Modules +1. **AppModuleController**: Implement `ICentronAppModuleController` +2. **View**: Create `UserControl` inheriting from `BaseModule` +3. **ViewModel**: Inherit from `BindableBase` +4. **Ribbon**: Implement `IRibbonControlModule` interface variations +5. **Registration**: Add to `ModuleRegistration.cs` with rights and feature checks + +#### Localization Requirements +- **Resource Files**: + - German (default): `LocalizedStrings.resx` + - English: `LocalizedStrings.en.resx` +- **XAML Usage**: `{x:Static properties:LocalizedStrings.KeyName}` +- **Code Usage**: Direct access via `LocalizedStrings.KeyName` +- **Key Format**: `{ClassName}_{MethodName}_{Description}` +- **Tool**: Use ResXManager Visual Studio extension + +### Accessing Data in Client Code + +#### Single Use +```csharp +var result = await ClassContainer.Instance + .WithInstance((IEntityLogic logic) => logic.GetEntity(id)) + .ThrowIfError(); ``` -**Targets**: clean, setup-versioning, build-web-service, build-centron-net, run-tests, create-installers +#### Multiple Uses (with proper disposal) +```csharp +public class ViewModel : IDisposable +{ + private readonly IEntityLogic _logic; -## Slash Commands -`/test`, `/review`, `/optimize`, `/implement`, `/explain`, `/analyze`, `/adr`, `/scaffold` + public ViewModel() + { + _logic = ClassContainer.Instance.GetInstance(); + } -## MCP Servers -**serena**: Semantic search, symbol manipulation | **context7**: Library docs | **fetch**: Web content | **sequential-thinking**: Problem decomposition | **memory**: Knowledge graph | **playwright**: Browser automation | **windows-mcp**: Windows interaction - -## Claude Instructions - -### Tooling Decision (REQUIRED at task start) -``` -🎯 Tooling Strategy Decision - -Task Analysis: [Brief description] - -Tooling Decisions: -- Agents: [name] / Not using - Reason: [justification] -- Slash Commands: [/command] / Not using - Reason: [justification] -- MCP Servers: [server:tool] / Not using - Reason: [justification] -- Approach: [strategy] + public void Dispose() + { + ClassContainer.Instance.ReleaseInstance(_logic); + } +} ``` -**When NOT to use agents**: Single file read, simple edit, 1-2 tool calls +## Documentation -### Task Summary (REQUIRED at end) -``` -📊 Task Completion Summary +### Creating Documentation +When adding new documentation to the project: -What Was Done: [description] +1. **Choose the right location** within the existing `docs/` structure: + - `docs/getting-started/` - Beginner guides and introductory material + - `docs/guides/development/` - Development task guides + - `docs/guides/database/` - Database-related guides + - `docs/guides/ui/` - UI development guides + - `docs/guides/services/` - Web services guides + - `docs/reference/architecture/` - Architecture specifications + - `docs/reference/database/` - Database reference documentation + - `docs/reference/receipts/` - Receipts system documentation + - `docs/reference/security/` - Security documentation + - `docs/operations/` - Operational procedures -Features Involved: -- Agents: [list or None - justification] -- Slash Commands: [list or None - justification] -- MCP Servers: [list or None - justification] -- Core Tools: [Read, Write, Edit, Glob, Grep, Bash, etc.] -- Files Modified: [list or None] -- Performance: [Parallel ops, extended thinking, or N/A] +2. **Name the file appropriately** using kebab-case (e.g., `actionprice-system.md`) -Efficiency Notes: [observations] -``` +3. **Create the file** with UTF-8 with BOM encoding, using proper Markdown format -### Checklist -✅ Provide tooling decisions at task start -✅ Use `Result` pattern -✅ Follow ILogic interface pattern -✅ German localization for UI text -✅ UTF-8 with BOM for C#/XAML -✅ DB conventions (I3D, FK, tracking columns) -✅ Run tests before commits -✅ Reference ticket numbers -✅ Use parallel tool calls -✅ Leverage agents/slash commands/MCP servers +4. **Update navigation** in `docs/README.md`: + - Add a new entry with a link to your documentation file + - Follow the existing pattern and place in appropriate section -## Common Tasks -1. **DB Table**: database-script-creator → ScriptMethod*.cs with conventions -2. **Web Service**: webservice-developer → BL → WebServiceBL → REST → Logic -3. **WPF Module**: ui-module-creator → View, ViewModel, Controller, Ribbon, Localization -4. **Query Optimization**: nhibernate-query-reviewer → N+1, indexes, soft delete +5. **Update the Solution File** (`Centron.sln`): + - Find the appropriate solution folder for your documentation directory + - Add your file to the `ProjectSection(SolutionItems)` section + - Use the pattern: `docs\path\to\your-file.md = docs\path\to\your-file.md` -## Critical Files -- `src/centron/Centron.WPF.UI/App.xaml.cs` - WPF entry -- `src/backend/Centron.BL/` - Business logic -- `src/backend/Centron.DAO/` - Data access -- `src/webservice/Centron.WebServices.Core/RestService/CentronRestService.cs` - REST API -- `src/backend/Centron.Interfaces/` - Service interfaces - -## Git -**Branch**: `master` (main) | **Types**: `feature/*`, `bugfix/*`, `hotfix/*` -**Commits**: `feat(module):`, `fix(module):`, `refactor(module):`, `docs:` + optional `(Ticket #12345)` +### Documentation Standards +- Use UTF-8 with BOM encoding for all documentation files +- Start with a `#` heading that clearly describes the content +- Use proper Markdown formatting for headings, lists, code blocks, etc. +- Include links to related documentation when appropriate +- For internal links, use relative paths to other documentation files +## Important Notes +- Project uses custom versioning via Nerdbank.GitVersioning +- Build artifacts placed in `/artifacts` directory +- Integration with Azure DevOps for CI/CD +- Automatic ticket integration with c-entron ticket system +- Supports both standalone and web service deployment modes +- Always test database scripts before committing +- Use German for all user-facing text with English translations +- Follow dual implementation pattern (BL + WS) for all data access +- When creating a script, do not override ApplicationVersion, MethodKind, or ScriptCollection. These are legacy properties. +- When creating a linq query for database access, beware of the limitations and capabilities of NHibernate (it is our OR-Mapper). \ No newline at end of file diff --git a/Versuche/Versuch 03/Tools/agents/iso-29148-code-analyzer-agent.md b/Versuche/Versuch 02/Tools/agents/iso-29148-code-analyzer-agent.md similarity index 100% rename from Versuche/Versuch 03/Tools/agents/iso-29148-code-analyzer-agent.md rename to Versuche/Versuch 02/Tools/agents/iso-29148-code-analyzer-agent.md diff --git a/Versuche/Versuch 03/Tools/agents/iso29148-master-orchestrator-agent.md b/Versuche/Versuch 02/Tools/agents/iso29148-master-orchestrator-agent.md similarity index 100% rename from Versuche/Versuch 03/Tools/agents/iso29148-master-orchestrator-agent.md rename to Versuche/Versuch 02/Tools/agents/iso29148-master-orchestrator-agent.md diff --git a/Versuche/Versuch 03/Tools/agents/iso29148-software-requirements-agent b/Versuche/Versuch 02/Tools/agents/iso29148-software-requirements-agent similarity index 100% rename from Versuche/Versuch 03/Tools/agents/iso29148-software-requirements-agent rename to Versuche/Versuch 02/Tools/agents/iso29148-software-requirements-agent diff --git a/Versuche/Versuch 03/Tools/agents/iso29148-stakeholder-agent.md b/Versuche/Versuch 02/Tools/agents/iso29148-stakeholder-agent.md similarity index 100% rename from Versuche/Versuch 03/Tools/agents/iso29148-stakeholder-agent.md rename to Versuche/Versuch 02/Tools/agents/iso29148-stakeholder-agent.md diff --git a/Versuche/Versuch 03/Tools/agents/iso29148-system-requirements-agent.md b/Versuche/Versuch 02/Tools/agents/iso29148-system-requirements-agent.md similarity index 100% rename from Versuche/Versuch 03/Tools/agents/iso29148-system-requirements-agent.md rename to Versuche/Versuch 02/Tools/agents/iso29148-system-requirements-agent.md diff --git a/Versuche/Versuch 02/Versuch02.md b/Versuche/Versuch 02/Versuch02.md index 2a64525..8087d34 100644 --- a/Versuche/Versuch 02/Versuch02.md +++ b/Versuche/Versuch 02/Versuch02.md @@ -1,45 +1,60 @@ # Versuch 02 - Kurzuebersicht ## Inhalt -Fokus auf Use-Case- und Modulanalyse (ERP-Dokumentation), inkl. Gap-Analyse zwischen dokumentierter und tatsaechlich entdeckter Funktionalitaet. Der Versuch liefert vor allem Umfangs-, Coverage- und Discovery-Kennzahlen statt klassischer StRS/SyRS/SwRS-Requirements. +Fokus auf konsolidierte End-to-End-Requirements-Spezifikation (StRS, SyRS, SwRS) mit hoher ISO-29148-Reife, Qualitaetsmetriken und separaten Traceability-Artefakten (CSV). Gegenueber Versuch 01 ist die Struktur noch staerker in Teilartefakte fuer Stakeholder/System/Software zerlegt. ## Kennzahlen (einheitliches Vergleichsformat) | Kennzahl | Wert | | --- | --- | -| Ergebnisdateien gesamt | 30 | -| Ergebnisdateitypen (MD/PDF/CSV/SQL/YAML/JSON/TXT) | 24 / 4 / 0 / 2 / 0 / 0 / 0 | -| Markdown-Zeilen gesamt | 21.882 | -| Anforderungen/Features gesamt (konsolidiert) | 1.720 (siehe `Requirements.md`) | -| Formale Anforderungen gesamt (StRS+SyRS+SwRS) | 0 | -| Stakeholder-Anforderungen (StRS) | 0 | -| System-Anforderungen (SyRS) | 0 | -| Software-Anforderungen (SwRS) | 0 | -| Use Cases gesamt (explizit) | 1.720 | -| Dokumentierte Use Cases | 509 | -| Undokumentierte Use Cases | 1.211 (71% Gap) | -| Ueberlappung Use Cases <-> Anforderungen (abgezogen) | 0 (bereits dedupliziert) | -| ISO-29148-Compliance | n.v. | -| Traceability-Abdeckung | n.v. (kein StRS->SyRS->SwRS-Nachweis) | -| Code Coverage | n.v. | -| Test Coverage | n.v. | -| Analysierte Quellartefakte | 150.000+ LoC analysiert; 3.412 potenzielle Use Cases | -| Separate Traceability-CSV (Dateien / Zeilen) | 0 / 0 | - -## Evaluation-Hinweis -Sehr stark fuer Funktions-/Use-Case-Discovery und Doku-Gap-Analyse; konsolidierte Zaehlung erfolgt in `Requirements.md`. +| Ergebnisdateien gesamt | 37 | +| Ergebnisdateitypen (MD/PDF/CSV/SQL/YAML/JSON/TXT) | 26 / 1 / 5 / 0 / 1 / 3 / 1 | +| Markdown-Zeilen gesamt | 15.625 | +| Anforderungen/Features gesamt (konsolidiert) | 220 (siehe `Requirements.md`) | +| Formale Anforderungen gesamt (StRS+SyRS+SwRS) | 220 | +| Stakeholder-Anforderungen (StRS) | 84 | +| System-Anforderungen (SyRS) | 53 | +| Software-Anforderungen (SwRS) | 83 | +| Use Cases gesamt (explizit) | 46 | +| Dokumentierte Use Cases | 46 | +| Undokumentierte Use Cases | n.v. | +| Ueberlappung Use Cases <-> Anforderungen (abgezogen) | 46 (konservativ) | +| ISO-29148-Compliance | 96,1% (100% mandatory) | +| Traceability-Abdeckung | 100% bidirektional | +| Code Coverage | 87,3% (laut Doku) | +| Test Coverage | 87,3% (laut Doku) | +| Analysierte Quellartefakte | 14.940 Dateien (13.717 C#, 1.189 XAML, 34 Projekte) | +| Separate Traceability-CSV (Dateien / Zeilen) | 4 / 327 | ## Vorgehen -- Erweiterter Prompt zu Claude Code -- Verwendung spezialisierter generischer Agenten für Claude Code. -- Verwendung von MCP Servern zur Verbesserung der LLM Performance - - Serena MCP zum Speichern von Memories - - Windows-MCP (Basierend auf AutoiT) um Auch das laufende Frontend mit in die Analyse Einzubeziehen - - MSSQL MCP mit Anbindung an die Datenbank um auch das DB Schema mit in die Analyse einzubinden - +- Erweiterter Prompt zu Claude Code +- Verwendung spezialisierter ISO-29148-Agents +- Kein MCP-Fokus (ISO-Konsolidierung vor Discovery-Erweiterung) -## Prompt -"Please analyze this software project and write a reuqirements specification according to modern standards. -Use Agents and MCP servers wherever possible. -Keep superflous texts to a minimum and concentrate on actual requirements. -" +## Verwendeter Prompt +```text +Please analyze this software project and write a ISO 29148 compliant reuqirements specification. +Use Agents wherever possible. +``` +## Agenten (Beispiele) +- `Tools/agents/iso29148-master-orchestrator-agent.md` + - Orchestrierung der Meilensteine und Integration der Teilartefakte +- `Tools/agents/iso29148-system-requirements-agent.md` + - Systemanforderungen (SyRS), Architektur- und Schnittstellenfokus +- `Tools/agents/iso29148-stakeholder-agent.md` + - Stakeholder-Anforderungen (StRS) und fachliche Perspektive +- `Tools/agents/iso29148-software-requirements-agent` + - Softwareanforderungen (SwRS) und Umsetzungsbezug + +## Ergebnisbeispiele aus `Ergenisse` +- `Ergenisse/master/ISO29148_Executive_Summary.md` + - 14.940 analysierte Dateien und 220+ Requirements (Executive-Ebene) +- `Ergenisse/master/ISO29148_Quality_Report.md` + - Gesamtscore 92,4%, Traceability 100%, ISO-29148 konforme Qualitaetsbewertung +- `Ergenisse/master/ISO29148_Traceability_Master.csv` + - Konsolidierte Nachverfolgbarkeit zwischen Requirement-Ebenen +- `Ergenisse/stakeholder/StRS_Complete.md`, `Ergenisse/system/SyRS_Complete.md`, `Ergenisse/software/SwRS_Complete.md` + - Vollstaendige Dreiebenen-Spezifikation + +## Evaluation-Hinweis +Sehr gut geeignet fuer vergleichende ISO-29148-Evaluation mit quantifizierter Qualitaets- und Traceability-Sicht; konsolidierte Zaehlung erfolgt in `Requirements.md`. diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf b/Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf rename to Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR.pdf diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/BUSINESS_GLOSSAR_MIT_DB_MAPPING.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR_MIT_DB_MAPPING.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/BUSINESS_GLOSSAR_MIT_DB_MAPPING.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/BUSINESS_GLOSSAR_MIT_DB_MAPPING.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/COMPLETE_DATABASE_SCHEMA.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/COMPLETE_DATABASE_SCHEMA.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/COMPLETE_DATABASE_SCHEMA.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/COMPLETE_DATABASE_SCHEMA.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/DOCUMENTATION_INDEX.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/EXPORT_COMPLETE_SCHEMA.sql b/Versuche/Versuch 03/ERP_DOCUMENTATION/EXPORT_COMPLETE_SCHEMA.sql similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/EXPORT_COMPLETE_SCHEMA.sql rename to Versuche/Versuch 03/ERP_DOCUMENTATION/EXPORT_COMPLETE_SCHEMA.sql diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/README.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/README.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/README.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/README.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/README_USE_CASE_ANALYSIS.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/README_USE_CASE_ANALYSIS.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/README_USE_CASE_ANALYSIS.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/README_USE_CASE_ANALYSIS.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SCREENSHOT_ANALYSIS_SUMMARY.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_ANALYSIS_SUMMARY.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SCREENSHOT_ANALYSIS_SUMMARY.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_ANALYSIS_SUMMARY.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SCREENSHOT_PROJECT_INDEX.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_PROJECT_INDEX.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SCREENSHOT_PROJECT_INDEX.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/SCREENSHOT_PROJECT_INDEX.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql b/Versuche/Versuch 03/ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql rename to Versuche/Versuch 03/ERP_DOCUMENTATION/SSMS_DB_SCHEMA.sql diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_DATABASE_MODELS.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_REST_API.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_REST_API.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_REST_API.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_REST_API.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_WORKFLOWS.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_WORKFLOWS.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_WORKFLOWS.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_WORKFLOWS.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES.pdf b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.pdf similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES.pdf rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES.pdf diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.pdf b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.pdf similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.pdf rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS.pdf diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.pdf b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.pdf similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.pdf rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_CENTRON_NEXUS_DE.pdf diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_CONTROLLERS.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_CONTROLLERS.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_CONTROLLERS.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_CONTROLLERS.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_GUI_MAPPING.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_GUI_MAPPING.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_GUI_MAPPING.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_GUI_MAPPING.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_IMPLEMENTATION_GUIDE.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_IMPLEMENTATION_GUIDE.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_IMPLEMENTATION_GUIDE.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_IMPLEMENTATION_GUIDE.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_XAML_TEMPLATES.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_XAML_TEMPLATES.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASES_NEW_XAML_TEMPLATES.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASES_NEW_XAML_TEMPLATES.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASE_ANALYSIS_README.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASE_ANALYSIS_README.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASE_ANALYSIS_README.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASE_ANALYSIS_README.md diff --git a/Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASE_MAPPING.md b/Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASE_MAPPING.md similarity index 100% rename from Versuche/Versuch 02/Ergebnisse/ERP_DOCUMENTATION/USE_CASE_MAPPING.md rename to Versuche/Versuch 03/ERP_DOCUMENTATION/USE_CASE_MAPPING.md diff --git a/Versuche/Versuch 03/Requirements.md b/Versuche/Versuch 03/Requirements.md index ab3a5f9..045d57b 100644 --- a/Versuche/Versuch 03/Requirements.md +++ b/Versuche/Versuch 03/Requirements.md @@ -1,23 +1,20 @@ # Versuch 03 - Requirements (konsolidiert) ## Konsolidierungsentscheidung -Use Cases und Anforderungen werden als gleiches Zielobjekt betrachtet. In Versuch 03 sind Use Cases in den Stakeholder-Diagrammen dokumentiert, aber inhaltlich mit den formalen Anforderungen verknuepft (Traceability auf StR-IDs). Daher erfolgt eine deduplizierte Konsolidierung. +Use Cases und Anforderungen werden als gleiches Zielobjekt betrachtet. In Versuch 03 liegen die Features/Faehigkeiten ueberwiegend als Use Cases vor (keine vollstaendige StRS/SyRS/SwRS-Gliederung). ## Cluster-Liste | Cluster | Anzahl | | --- | ---: | -| Stakeholder-Anforderungen (StRS) | 84 | -| System-Anforderungen (SyRS) | 53 | -| Software-Anforderungen (SwRS) | 83 | -| Explizite Use Cases (Diagramme) | 46 | -| Ueberlappung Use Cases <-> Anforderungen (konservativ abgezogen) | 46 | +| Formale Anforderungen (StRS+SyRS+SwRS) | 0 | +| Dokumentierte Use Cases | 509 | +| Neu entdeckte (vormals undokumentierte) Use Cases | 1211 | +| Ueberlappung Use Cases <-> Anforderungen (abgezogen) | 0 | ## Summen -- Rohsumme (`Requirements + Use Cases`): **266** -- **Konsolidierte Requirements/Faehigkeiten gesamt: 220** +- Rohsumme (`Requirements + Use Cases`): **1720** +- **Konsolidierte Requirements/Faehigkeiten gesamt: 1720** -## Use-Case-Cluster (Nachweis) -- Sales Management: 13 -- Helpdesk Management: 17 -- Financial Management: 16 -- Summe explizite Use Cases: 46 +## Hinweis +- Die Zahl `1720` ist bereits dedupliziert als "Total System Functionality". +- Potenzialmetriken pro Extraktionsmethode wurden nicht addiert, um Doppelzaehlungen zu vermeiden. diff --git a/Versuche/Versuch 03/Tools/AGENTS.md b/Versuche/Versuch 03/Tools/AGENTS.md index abf5027..372b36c 100644 --- a/Versuche/Versuch 03/Tools/AGENTS.md +++ b/Versuche/Versuch 03/Tools/AGENTS.md @@ -1,4 +1,4 @@ -# AGENTS.md +# AGENTS.md This file provides guidance to Codex when working with code in this repository. @@ -31,6 +31,14 @@ Available targets: - `run-tests` - Execute all test suites - `create-installers` - Build MSI installers +## Agent Notes + +- Default shell is PowerShell (`pwsh`). Prefer PowerShell-native commands like `Get-Content`, `Set-Content -Encoding UTF8`, and here-strings (`@'...'@`) instead of Unix tools (`sed`, `nl`, etc.). +- Use `rg`/`rg --files` for fast searches—they are available by default. +- Repository expects UTF-8 with BOM for C# and XAML; `Set-Content -Encoding UTF8` satisfies this. +- Long replacements can rely on PowerShell string operations or single-line `python -c` scripts (heredocs are unavailable in `pwsh`). +- `dotnet build Centron.sln` may warn about `libfintx.FinTSConfig`; this is expected and can be ignored for success checks. + ### Publishing - **Publish WPF UI**: `dotnet publish src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj -c Release -r win-x64 --self-contained` - **Publish Web Service**: `dotnet publish src/webservice/Centron.Host.WindowsService/Centron.Host.WindowsService.csproj -c Release -r win-x64 --self-contained` @@ -284,4 +292,4 @@ When adding new documentation to the project: - Supports both standalone and web service deployment modes - Always test database scripts before committing - Use German for all user-facing text with English translations -- Follow dual implementation pattern (BL + WS) for all data access \ No newline at end of file +- Follow dual implementation pattern (BL + WS) for all data access diff --git a/Versuche/Versuch 02/Tools/Agents/centron-code-reviewer.md b/Versuche/Versuch 03/Tools/Agents/centron-code-reviewer.md similarity index 100% rename from Versuche/Versuch 02/Tools/Agents/centron-code-reviewer.md rename to Versuche/Versuch 03/Tools/Agents/centron-code-reviewer.md diff --git a/Versuche/Versuch 02/Tools/Agents/centron-debugger.md b/Versuche/Versuch 03/Tools/Agents/centron-debugger.md similarity index 100% rename from Versuche/Versuch 02/Tools/Agents/centron-debugger.md rename to Versuche/Versuch 03/Tools/Agents/centron-debugger.md diff --git a/Versuche/Versuch 02/Tools/Agents/centron-documentation-writer.md b/Versuche/Versuch 03/Tools/Agents/centron-documentation-writer.md similarity index 100% rename from Versuche/Versuch 02/Tools/Agents/centron-documentation-writer.md rename to Versuche/Versuch 03/Tools/Agents/centron-documentation-writer.md diff --git a/Versuche/Versuch 02/Tools/Agents/centron-refactoring-specialist.md b/Versuche/Versuch 03/Tools/Agents/centron-refactoring-specialist.md similarity index 100% rename from Versuche/Versuch 02/Tools/Agents/centron-refactoring-specialist.md rename to Versuche/Versuch 03/Tools/Agents/centron-refactoring-specialist.md diff --git a/Versuche/Versuch 02/Tools/Agents/nhibernate-query-reviewer.md b/Versuche/Versuch 03/Tools/Agents/nhibernate-query-reviewer.md similarity index 100% rename from Versuche/Versuch 02/Tools/Agents/nhibernate-query-reviewer.md rename to Versuche/Versuch 03/Tools/Agents/nhibernate-query-reviewer.md diff --git a/Versuche/Versuch 02/Tools/Agents/webservice-developer.md b/Versuche/Versuch 03/Tools/Agents/webservice-developer.md similarity index 100% rename from Versuche/Versuch 02/Tools/Agents/webservice-developer.md rename to Versuche/Versuch 03/Tools/Agents/webservice-developer.md diff --git a/Versuche/Versuch 03/Tools/CLAUDE.md b/Versuche/Versuch 03/Tools/CLAUDE.md index 6c778d0..afbe372 100644 --- a/Versuche/Versuch 03/Tools/CLAUDE.md +++ b/Versuche/Versuch 03/Tools/CLAUDE.md @@ -1,316 +1,248 @@ -# CLAUDE.md +# c-entron.NET -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +> ⚠️ **FOR CLAUDE AI - NOT FOR DEVELOPERS** +> +> This file contains project conventions and patterns that Claude AI uses to generate correct code. +> **Developers**: See [.claude/README.md](.claude/README.md) for user documentation. -## Development Commands +> **v2.1.0** | 2025-01-20 | ERP for German SMBs | C# .NET 8 | WPF + REST API -### Building -- **Build entire solution**: `dotnet build Centron.sln` -- **Build specific project**: `dotnet build src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj` -- **Build for Release**: `dotnet build Centron.sln -c Release` - -### Testing -- **Run all tests**: `dotnet test Centron.sln` -- **Run specific test project**: `dotnet test tests/backend/Centron.Tests.BL/Centron.Tests.BL.csproj` -- **Run integration tests**: `dotnet test tests/Centron.Tests.Integration/Centron.Tests.Integration.csproj` -- **Run end-to-end tests**: `dotnet test tests/Centron.Tests.EndToEnd/Centron.Tests.EndToEnd.csproj` - -### Using Centron.Scripts Build System -The project uses a custom build system via Centron.Scripts for complete builds: - -```bash -cd scripts/Centron.Scripts -dotnet run -- -``` - -Available targets: -- `clean` - Clean artifacts and bin/obj directories -- `setup-versioning` - Set up version information -- `build-web-service` - Build the web service components -- `build-centron-net` - Build the WPF client application -- `run-tests` - Execute all test suites -- `create-installers` - Build MSI installers - -### Publishing -- **Publish WPF UI**: `dotnet publish src/centron/Centron.WPF.UI/Centron.WPF.UI.csproj -c Release -r win-x64 --self-contained` -- **Publish Web Service**: `dotnet publish src/webservice/Centron.Host.WindowsService/Centron.Host.WindowsService.csproj -c Release -r win-x64 --self-contained` - -## Project Architecture - -### High-Level Structure -This is a .NET 8 enterprise application with a multi-layered architecture: +## Stack +**Core**: C# 12, .NET 8 | **Frontend**: WPF + Blazor Server, DevExpress 24.2.7 (WPF & Blazor), MVVM | **Backend**: ASP.NET Core 8, SQL Server 2019+, NHibernate 5.x, JWT auth | **Real-Time**: SignalR | **Build**: Azure DevOps, Centron.Scripts, WiX MSI | **Test**: NUnit +## Structure ``` src/ -├── apis/ - External API integrations (FinAPI, GLS, Shipcloud, etc.) -├── backend/ - Core business logic layer -│ ├── Centron.BL/ - Business Logic layer -│ ├── Centron.Common/ - Common utilities and helpers -│ ├── Centron.DAO/ - Data Access Objects (NHibernate) -│ ├── Centron.Entities/ - Domain entities -│ ├── Centron.Gateway/ - External service gateways -│ └── Centron.Interfaces/ - Service interfaces -├── centron/ - WPF client application -│ ├── Centron.WPF.UI/ - Main WPF application -│ └── Centron.WPF.UI.Extension/ - UI extensions -├── shared/ - Shared components and controls -│ ├── Centron.Core/ - Core shared functionality -│ ├── Centron.Controls/ - Custom UI controls -│ └── Centron.Controls.Preview/ - Preview controls -└── webservice/ - Web service components - ├── Centron.Host/ - Web service host - ├── Centron.Host.Console/ - Console host - ├── Centron.Host.WindowsService/ - Windows service host - ├── Centron.WebServices.Core/ - Web service core - └── c-entron.misc.ConnectionManager/ - Connection management +├── apis/ - External integrations (FinAPI, GLS, Shipcloud, ITscope, etc.) +├── backend/ - BL, DAO, Entities, Interfaces, EDI +├── centron/ - WPF UI (Desktop) +├── CentronNexus/ - Blazor Server (Web Portal) +├── shared/ - Core, Controls +└── webservice/ - REST API, Hosts +tests/ - BL, DAO, Integration, E2E +.claude/ - agents/, commands/, hooks/, settings.json ``` -### Data Access Pattern -The application uses a dual data access pattern supporting both direct database access and web service communication: +**Key Files**: `src/centron/Centron.WPF.UI/App.xaml.cs` (WPF), `src/webservice/Centron.Host.WindowsService/Program.cs` (Service), `Centron.sln`, `version.json` -#### WPF UI Architecture (3-layer pattern | ILogic Interface Pattern) -All data operations in the UI must use the ILogic interface accessed through ClassContainer: -- WPF UI modules use a 3-part data access pattern: - - I{Module}Logic interface - Defines the contract - - BL{Module}Logic (NHibernate/SQL Server) - Direct database access via NHibernate - - WS{Module}Logic (REST API) - Web service access via REST API -- Access via ClassContainer.Instance.WithInstance((ILogic logic) => ...).ThrowIfError(); -- Connection types controlled by AppModuleController: - - CentronConnectionType.CentronWebServices ➜ WSLogic - - CentronConnectionType.SqlServer ➜ BLLogic +## Naming +- **C# Classes**: `PascalCase`, Interfaces: `IPascalCase`, Methods: `PascalCase`, Private: `_camelCase`, Local: `camelCase` +- **DB Tables**: `PascalCase` English (new), Keep German (legacy), PK: `I3D` (int IDENTITY), FK: `{Table}I3D` +- **Standard Columns**: `CreatedByI3D`, `CreatedDate`, `ChangedByI3D`, `ChangedDate`, `IsDeleted`, `DeletedByI3D`, `DeletedDate` +- **BL Pattern**: `I{Module}Logic`, `BL{Module}Logic`, `WS{Module}Logic`, `{Entity}BL`, `{Entity}WebServiceBL` +## Critical Patterns + +### Result Pattern (MANDATORY) ```csharp -var result = await ClassContainer - .Instance - .WithInstance((IAccountContractsLogic logic) => logic.GetAccountContracts(filter)) - .ThrowIfError(); -``` - -#### Backend Architecture (2-layer pattern) -- Backend uses a 2-layer BL approach for web service implementation: - - Base BL class (e.g., AccountDeviceBL) - contains core business logic and database access via DAO - - WebService BL class (e.g., AccountDeviceWebServiceBL) - handles DTO conversion and calls base BL -- WebService BL pattern: - - Inherits from BaseBL and creates instance of corresponding base BL class - - Converts DTOs to entities using conversion methods (ConvertAccountDeviceDTOToAccountDevice) - - Uses ObjectMapper for entity-to-DTO conversion - - Ensures DTO entities are not connected to NHibernate database context for API security -- API implementation in ICentronRestService and CentronRestService: - - API methods call WebService BL classes - - All API operations use DTO entities for data transfer - - Example: SaveAccountDevice API method → AccountDeviceWebServiceBL.SaveAccountDevice → AccountDeviceBL.SaveAccountDevice - -### Technology Stack -- **.NET 8** - Primary framework -- **WPF** - Desktop UI framework -- **NHibernate** with **FluentNHibernate** - ORM for database access -- **DevExpress 24.2.7** - UI controls and components -- **Bullseye** - Build orchestration -- **Entity Framework** - Some components use EF alongside NHibernate - -### Connection Types -Modules support different connection types declared in AppModuleController: -- `CentronConnectionType.CentronWebServices` - Uses WSLogic implementation -- `CentronConnectionType.SqlServer` - Uses BLLogic implementation - -## Development Guidelines - -### Code Style and Standards -- KISS -- DRY -- SOLID -- Clean Architecture - -### General Rules -- Write self-explanatory code and only comment when absolutely necessary -- When updating code, always update DocStrings - -### Language Requirements -- All user-facing content must be in German (primary market) -- Support for English through localization files -- Use German resource files (LocalizedStrings.resx) and English (LocalizedStrings.en.resx) - -### File Encoding -- All C# source files (*.cs) must use UTF-8 with BOM -- All XAML files (*.xaml) must use UTF-8 with BOM - -### Naming Conventions -- ILogic interfaces: `I{Module}Logic` -- BL implementations: `BL{Module}Logic` -- WS implementations: `WS{Module}Logic` -- All methods return `Result` or `Task>` - -### Code Signing (Optional) -Set environment variables for code signing: -- `CENTRON_BUILD_CODE_SIGNING_CERTIFICATE` - Path to certificate -- `CENTRON_BUILD_CODE_SIGNING_CERTIFICATE_PASSWORD` - Certificate password - -## Database -- Uses NHibernate ORM with SQL Server -- Configuration files generated during build process -- Test databases required for end-to-end testing - -## Development Processes - -### Database Schema Changes - -#### Creating Database Scripts -1. **Reserve script number** in Teams `c-entron Entwickler` group → Files → `Datenbankupdate 2 1.xlsx` -2. **Create script class** at `src/backend/Centron.BL/Administration/Scripts/ScriptMethods/Scripts/ScriptMethod{number}.cs` -3. **Implement BaseScriptMethod** with `ApplicationVersion` and `GetSqlQueries()` method -4. **Use ScriptHelpers** when possible (preferred over raw SQL): - - `ScriptHelpers.AddColumnIfNotExists()` - - `ScriptHelpers.AddTableIfNotExists()` - - `ScriptHelpers.AddRightIfNotExists()` - - `ScriptHelpers.AddIndexIfNotExists()` - - `ScriptHelpers.AddForeignKeyIfNotExists()` - -#### Database Conventions -- **Primary Key**: Every table must have `I3D` [int] IDENTITY(1,1) NOT NULL -- **Foreign Keys**: Must end with `I3D` suffix (e.g., `AccountI3D`) -- **Standard Columns**: Include `CreatedByI3D`, `CreatedDate`, `ChangedByI3D`, `ChangedDate`, `IsDeleted`, `DeletedByI3D`, `DeletedDate` -- **Data Types**: Use `nvarchar` over `varchar`, `datetime2(2)` for timestamps, `bit` for booleans -- **Naming**: New tables/columns use English names (historical German names remain unchanged) - -### Settings Management - -#### Application Settings -- **Legacy settings**: Stored in `Stammdat` table (read-only, no new additions) -- **New settings**: Use `ApplicationSettings` table exclusively -- **Setting IDs**: Get next available ID from comment in `src/backend/Centron.Interfaces/Administration/Settings/ApplicationSettingID.cs` -- **Descriptions**: Add to `ApplicationSettingDefinitions.cs` - -#### Adding New Settings -1. Check next available ID in `ApplicationSettingID.cs` -2. Add enum value with new ID -3. Update "Next Centron Settings ID" comment -4. Add description in `ApplicationSettingDefinitions.cs` -5. Create group setting classes for accessing settings -6. Use `AppSettingsBL.GetSettings()` and `GetSettingsForUpdate()` - -### User Rights Management - -#### Adding New Rights -1. **Open** `UserRightsConst.cs` to get next I3D -2. **Create script** using `ScriptHelpers.AddRightIfNotExists()`: - ```csharp - yield return ScriptHelpers.AddRightIfNotExists( - UserRightsConst.Sales.Customer.Helpdesk.SHOW_HOURLYSURCHARGERATES, - UserRightsConst.Sales.Customer.Helpdesk.ID, - "German display name", - "German description"); - ``` -3. **Add constant** to `UserRightsConst.cs` - -### Web Service Development - -#### Creating Web Service Methods (Full Stack) -1. **BL Layer**: Create method in `{Entity}BL.cs` returning `Result` -2. **WebServiceBL**: Create `{Entity}WebServiceBL.cs` with DTO↔Entity conversion -3. **RestService**: Add method to `CentronRestService.cs` accepting `Request` and returning `Response` -4. **Interface**: Add method signature to `ICentronRestService.cs` with attributes: - ```csharp - [OperationContract] - [WebInvoke(Method = "POST", UriTemplate = "MethodName")] - [Authenticate] - ``` -5. **Logic Interfaces**: Create `I{Entity}Logic`, `BL{Entity}Logic`, `WS{Entity}Logic` - -#### Request Classes -- Place in `Centron.WebServices.Core/RestRequests/` -- Decorate with `[DataContract]` and `[DataMember]` attributes -- Use for complex parameters instead of multiple individual parameters - -### UI Development - -#### Creating WPF Modules -1. **AppModuleController**: Implement `ICentronAppModuleController` -2. **View**: Create `UserControl` inheriting from `BaseModule` -3. **ViewModel**: Inherit from `BindableBase` -4. **Ribbon**: Implement `IRibbonControlModule` interface variations -5. **Registration**: Add to `ModuleRegistration.cs` with rights and feature checks - -#### Localization Requirements -- **Resource Files**: - - German (default): `LocalizedStrings.resx` - - English: `LocalizedStrings.en.resx` -- **XAML Usage**: `{x:Static properties:LocalizedStrings.KeyName}` -- **Code Usage**: Direct access via `LocalizedStrings.KeyName` -- **Key Format**: `{ClassName}_{MethodName}_{Description}` -- **Tool**: Use ResXManager Visual Studio extension - -### Accessing Data in Client Code - -#### Single Use -```csharp -var result = await ClassContainer.Instance - .WithInstance((IEntityLogic logic) => logic.GetEntity(id)) - .ThrowIfError(); -``` - -#### Multiple Uses (with proper disposal) -```csharp -public class ViewModel : IDisposable -{ - private readonly IEntityLogic _logic; - - public ViewModel() - { - _logic = ClassContainer.Instance.GetInstance(); - } - - public void Dispose() - { - ClassContainer.Instance.ReleaseInstance(_logic); - } +public Result Method() { + try { + var data = _dao.Get(id); + return data == null ? Result.Error("Not found") : Result.Success(data); + } catch (Exception ex) { return Result.Error(ex); } } ``` -## Documentation +### UI Data Access (MANDATORY) +```csharp +// Single use +var result = await ClassContainer.Instance + .WithInstance((IEntityLogic logic) => logic.GetEntity(id)) + .ThrowIfError(); -### Creating Documentation -When adding new documentation to the project: +// Multiple uses (IDisposable) +private readonly IEntityLogic _logic; +public ViewModel() { _logic = ClassContainer.Instance.GetInstance(); } +public void Dispose() { ClassContainer.Instance.ReleaseInstance(_logic); } +``` -1. **Choose the right location** within the existing `docs/` structure: - - `docs/getting-started/` - Beginner guides and introductory material - - `docs/guides/development/` - Development task guides - - `docs/guides/database/` - Database-related guides - - `docs/guides/ui/` - UI development guides - - `docs/guides/services/` - Web services guides - - `docs/reference/architecture/` - Architecture specifications - - `docs/reference/database/` - Database reference documentation - - `docs/reference/receipts/` - Receipts system documentation - - `docs/reference/security/` - Security documentation - - `docs/operations/` - Operational procedures +### Architecture +**WPF UI** → `I{Module}Logic` (ClassContainer) → `BL{Module}Logic` (SQL) OR `WS{Module}Logic` (REST) +**REST API** → `CentronRestService` → `{Entity}WebServiceBL` (DTO conversion) → `{Entity}BL` (Business Logic) → DAO → NHibernate → SQL Server -2. **Name the file appropriately** using kebab-case (e.g., `actionprice-system.md`) +Connection types: `CentronConnectionType.SqlServer` (BLLogic) | `CentronConnectionType.CentronWebServices` (WSLogic) -3. **Create the file** with UTF-8 with BOM encoding, using proper Markdown format +## Database Conventions (MUST FOLLOW) +- **PK**: `I3D` [int] IDENTITY(1,1) NOT NULL (auto-created by `ScriptHelpers.AddTableIfNotExists()`) +- **FK**: End with `I3D` suffix (e.g., `AccountI3D`) +- **Standard Columns**: CreatedByI3D, CreatedDate, ChangedByI3D, ChangedDate, IsDeleted, DeletedByI3D, DeletedDate (all REQUIRED) +- **Types**: `nvarchar` (NOT varchar), `datetime2(2)`, `bit`, `decimal(18,2)` for currency +- **Naming**: English PascalCase (new), Keep German (legacy), `dbo` schema -4. **Update navigation** in `docs/README.md`: - - Add a new entry with a link to your documentation file - - Follow the existing pattern and place in appropriate section +### Creating Database Scripts +1. Reserve number in Teams: `c-entron Entwickler` → Files → `Datenbankupdate 2 1.xlsx` +2. Create: `src/backend/Centron.BL/Administration/Scripts/ScriptMethods/Scripts/ScriptMethod{number}.cs` +3. Implement `BaseScriptMethod` with `GetSqlQueries()` +4. Use `ScriptHelpers.*` (AddTableIfNotExists, AddColumnIfNotExists, AddRightIfNotExists, etc.) +5. **Convert to UTF-8 with BOM** (C# files require BOM) -5. **Update the Solution File** (`Centron.sln`): - - Find the appropriate solution folder for your documentation directory - - Add your file to the `ProjectSection(SolutionItems)` section - - Use the pattern: `docs\path\to\your-file.md = docs\path\to\your-file.md` +## Localization (REQUIRED) +- **Primary**: German (`LocalizedStrings.resx`) | **Secondary**: English (`LocalizedStrings.en.resx`) +- **Code**: `LocalizedStrings.KeyName` | **XAML**: `{x:Static properties:LocalizedStrings.KeyName}` +- **Key Format**: `{ClassName}_{Method}_{Description}` -### Documentation Standards -- Use UTF-8 with BOM encoding for all documentation files -- Start with a `#` heading that clearly describes the content -- Use proper Markdown formatting for headings, lists, code blocks, etc. -- Include links to related documentation when appropriate -- For internal links, use relative paths to other documentation files +## File Encoding (CRITICAL) +- **UTF-8 WITH BOM**: `*.cs`, `*.xaml` (MANDATORY) +- **UTF-8 NO BOM**: `*.md`, `*.json`, `*.xml`, `*.config` + +**PowerShell Conversion**: +```powershell +$file = 'path\to\file.cs' +$content = [System.IO.File]::ReadAllText($file) +$utf8BOM = New-Object System.Text.UTF8Encoding($true) +[System.IO.File]::WriteAllText($file, $content, $utf8BOM) +``` + +## NHibernate Performance +- Use `.Fetch()` for eager loading (prevent N+1) +- Always filter: `.Where(x => !x.IsDeleted)` +- Use `Future()` for multiple collections +- Avoid lazy loading in loops + +```csharp +// Good +var accounts = session.Query() + .Where(x => !x.IsDeleted) + .Fetch(x => x.AccountType) + .Fetch(x => x.PriceList) + .ToList(); +``` + +## Development Processes + +### Settings Management +- **Legacy**: `Stammdat` table (read-only) +- **New**: `ApplicationSettings` table ONLY +- Get next ID from `src/backend/Centron.Interfaces/Administration/Settings/ApplicationSettingID.cs` +- Add description to `ApplicationSettingDefinitions.cs` + +### User Rights +1. Get next I3D from `UserRightsConst.cs` +2. Create script: `ScriptHelpers.AddRightIfNotExists(id, parentId, "German name", "German desc")` +3. Add constant to `UserRightsConst.cs` + +### Web Service (Full Stack) +1. **BL**: `{Entity}BL.cs` returning `Result` +2. **WebServiceBL**: `{Entity}WebServiceBL.cs` with DTO↔Entity conversion +3. **RestService**: Add to `CentronRestService.cs` (`Request` → `Response`) +4. **Interface**: `ICentronRestService.cs` with `[OperationContract]`, `[WebInvoke(Method="POST", UriTemplate="...")]`, `[Authenticate]` +5. **Logic**: `I{Entity}Logic`, `BL{Entity}Logic`, `WS{Entity}Logic` + +### WPF Module +1. **Controller**: Implement `ICentronAppModuleController` +2. **View**: `UserControl` inheriting `BaseModule` +3. **ViewModel**: Inherit `BindableBase` +4. **Ribbon**: Implement `IRibbonControlModule` variations +5. **Registration**: Add to `ModuleRegistration.cs` with rights checks +6. **Theme**: Prefer DevExpress controls over WPF standard + +## Agent Usage (MANDATORY) + +### Project Agents (.claude/agents/) +- **primary-development**: ALL development tasks (orchestrator) +- **database-script-creator**: Database schema changes → generates ScriptMethod*.cs +- **webservice-developer**: Full-stack web service implementation +- **ui-module-creator**: WPF modules with MVVM + DevExpress +- **centron-nexus-developer**: Blazor Server, Razor components, SignalR, DevExpress Blazor +- **external-api-integrator**: Third-party API integrations (FinAPI, GLS, Shipcloud, etc.) +- **edi-specialist**: EDI processing (OpenTrans, EDIFACT, supplier integrations) +- **nhibernate-query-reviewer**: Query optimization, N+1 detection +- **localization-checker**: German/English verification +- **bookkeeping-export-expert**: DATEV, Abacus, SAP exports +- **test-engineer**: Test generation +- **code-reviewer**: Code quality/security +- **refactoring-specialist**: Code cleanup +- **debugger**: Bug diagnosis +- **architect**: System design +- **documentation-writer**: Docs +- **security-analyst**: Security reviews + +### MANDATORY Agent Usage +- New features → **primary-development** +- DB schema → **database-script-creator** +- Web service → **webservice-developer** +- WPF module → **ui-module-creator** +- CentronNexus/Blazor → **centron-nexus-developer** +- External API → **external-api-integrator** +- EDI integration → **edi-specialist** +- Complex queries → **nhibernate-query-reviewer** +- UI text → **localization-checker** + +## Commands +```bash +dotnet build Centron.sln # Build +dotnet test Centron.sln # Test all +cd scripts/Centron.Scripts && dotnet run # Build orchestration +``` + +**Targets**: clean, setup-versioning, build-web-service, build-centron-net, run-tests, create-installers + +## Slash Commands +`/test`, `/review`, `/optimize`, `/implement`, `/explain`, `/analyze`, `/adr`, `/scaffold` + +## MCP Servers +**serena**: Semantic search, symbol manipulation | **context7**: Library docs | **fetch**: Web content | **sequential-thinking**: Problem decomposition | **memory**: Knowledge graph | **playwright**: Browser automation | **windows-mcp**: Windows interaction + +## Claude Instructions + +### Tooling Decision (REQUIRED at task start) +``` +🎯 Tooling Strategy Decision + +Task Analysis: [Brief description] + +Tooling Decisions: +- Agents: [name] / Not using - Reason: [justification] +- Slash Commands: [/command] / Not using - Reason: [justification] +- MCP Servers: [server:tool] / Not using - Reason: [justification] +- Approach: [strategy] +``` + +**When NOT to use agents**: Single file read, simple edit, 1-2 tool calls + +### Task Summary (REQUIRED at end) +``` +📊 Task Completion Summary + +What Was Done: [description] + +Features Involved: +- Agents: [list or None - justification] +- Slash Commands: [list or None - justification] +- MCP Servers: [list or None - justification] +- Core Tools: [Read, Write, Edit, Glob, Grep, Bash, etc.] +- Files Modified: [list or None] +- Performance: [Parallel ops, extended thinking, or N/A] + +Efficiency Notes: [observations] +``` + +### Checklist +✅ Provide tooling decisions at task start +✅ Use `Result` pattern +✅ Follow ILogic interface pattern +✅ German localization for UI text +✅ UTF-8 with BOM for C#/XAML +✅ DB conventions (I3D, FK, tracking columns) +✅ Run tests before commits +✅ Reference ticket numbers +✅ Use parallel tool calls +✅ Leverage agents/slash commands/MCP servers + +## Common Tasks +1. **DB Table**: database-script-creator → ScriptMethod*.cs with conventions +2. **Web Service**: webservice-developer → BL → WebServiceBL → REST → Logic +3. **WPF Module**: ui-module-creator → View, ViewModel, Controller, Ribbon, Localization +4. **Query Optimization**: nhibernate-query-reviewer → N+1, indexes, soft delete + +## Critical Files +- `src/centron/Centron.WPF.UI/App.xaml.cs` - WPF entry +- `src/backend/Centron.BL/` - Business logic +- `src/backend/Centron.DAO/` - Data access +- `src/webservice/Centron.WebServices.Core/RestService/CentronRestService.cs` - REST API +- `src/backend/Centron.Interfaces/` - Service interfaces + +## Git +**Branch**: `master` (main) | **Types**: `feature/*`, `bugfix/*`, `hotfix/*` +**Commits**: `feat(module):`, `fix(module):`, `refactor(module):`, `docs:` + optional `(Ticket #12345)` -## Important Notes -- Project uses custom versioning via Nerdbank.GitVersioning -- Build artifacts placed in `/artifacts` directory -- Integration with Azure DevOps for CI/CD -- Automatic ticket integration with c-entron ticket system -- Supports both standalone and web service deployment modes -- Always test database scripts before committing -- Use German for all user-facing text with English translations -- Follow dual implementation pattern (BL + WS) for all data access -- When creating a script, do not override ApplicationVersion, MethodKind, or ScriptCollection. These are legacy properties. -- When creating a linq query for database access, beware of the limitations and capabilities of NHibernate (it is our OR-Mapper). \ No newline at end of file diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/CentronNexus_Ticket_Metadata_Complete_Analysis.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/CentronNexus_Ticket_Metadata_Complete_Analysis.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/CentronNexus_Ticket_Metadata_Complete_Analysis.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/CentronNexus_Ticket_Metadata_Complete_Analysis.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/Remaining_Kapitel_Modules_Summary.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/Remaining_Kapitel_Modules_Summary.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/Remaining_Kapitel_Modules_Summary.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/Remaining_Kapitel_Modules_Summary.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/Section_3_3_Ticket_Close_Comprehensive_Documentation.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/Section_3_3_Ticket_Close_Comprehensive_Documentation.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/Section_3_3_Ticket_Close_Comprehensive_Documentation.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/Section_3_3_Ticket_Close_Comprehensive_Documentation.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_Modules_Analysis_Phase1.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_Modules_Analysis_Phase1.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_Modules_Analysis_Phase1.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_Modules_Analysis_Phase1.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_Modules_Complete_Analysis.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_Modules_Complete_Analysis.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_Modules_Complete_Analysis.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_Modules_Complete_Analysis.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Architecture_Summary.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Architecture_Summary.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Architecture_Summary.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Architecture_Summary.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Detailed_Controls_Breakdown.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Detailed_Controls_Breakdown.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Detailed_Controls_Breakdown.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Detailed_Controls_Breakdown.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Inventory.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Inventory.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Inventory.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Inventory.md diff --git a/Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Quick_Reference.md b/Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Quick_Reference.md similarity index 100% rename from Versuche/Versuch 02/Tools/Serena_memories/memories/WPF_UI_Quick_Reference.md rename to Versuche/Versuch 03/Tools/Serena_memories/memories/WPF_UI_Quick_Reference.md diff --git a/Versuche/Versuch 03/Versuch03.md b/Versuche/Versuch 03/Versuch03.md index 292c26a..9038d3f 100644 --- a/Versuche/Versuch 03/Versuch03.md +++ b/Versuche/Versuch 03/Versuch03.md @@ -1,38 +1,64 @@ # Versuch 03 - Kurzuebersicht ## Inhalt -Fokus auf konsolidierte End-to-End-Requirements-Spezifikation (StRS, SyRS, SwRS) mit hoher ISO-29148-Reife, Qualitaetsmetriken und separaten Traceability-Artefakten (CSV). Gegenueber Versuch 01 ist die Struktur noch staerker in Teilartefakte fuer Stakeholder/System/Software zerlegt. +Fokus auf Use-Case- und Modulanalyse (ERP-Dokumentation), inkl. Gap-Analyse zwischen dokumentierter und tatsaechlich entdeckter Funktionalitaet. Der Versuch liefert vor allem Umfangs-, Coverage- und Discovery-Kennzahlen statt klassischer StRS/SyRS/SwRS-Requirements. ## Kennzahlen (einheitliches Vergleichsformat) | Kennzahl | Wert | | --- | --- | -| Ergebnisdateien gesamt | 37 | -| Ergebnisdateitypen (MD/PDF/CSV/SQL/YAML/JSON/TXT) | 26 / 1 / 5 / 0 / 1 / 3 / 1 | -| Markdown-Zeilen gesamt | 15.625 | -| Anforderungen/Features gesamt (konsolidiert) | 220 (siehe `Requirements.md`) | -| Formale Anforderungen gesamt (StRS+SyRS+SwRS) | 220 | -| Stakeholder-Anforderungen (StRS) | 84 | -| System-Anforderungen (SyRS) | 53 | -| Software-Anforderungen (SwRS) | 83 | -| Use Cases gesamt (explizit) | 46 | -| Dokumentierte Use Cases | 46 | -| Undokumentierte Use Cases | n.v. | -| Ueberlappung Use Cases <-> Anforderungen (abgezogen) | 46 (konservativ) | -| ISO-29148-Compliance | 96,1% (100% mandatory) | -| Traceability-Abdeckung | 100% bidirektional | -| Code Coverage | 87,3% (laut Doku) | -| Test Coverage | 87,3% (laut Doku) | -| Analysierte Quellartefakte | 14.940 Dateien (13.717 C#, 1.189 XAML, 34 Projekte) | -| Separate Traceability-CSV (Dateien / Zeilen) | 4 / 327 | - -## Evaluation-Hinweis -Sehr gut geeignet fuer vergleichende ISO-29148-Evaluation mit quantifizierter Qualitaets- und Traceability-Sicht; konsolidierte Zaehlung erfolgt in `Requirements.md`. +| Ergebnisdateien gesamt | 30 | +| Ergebnisdateitypen (MD/PDF/CSV/SQL/YAML/JSON/TXT) | 24 / 4 / 0 / 2 / 0 / 0 / 0 | +| Markdown-Zeilen gesamt | 21.882 | +| Anforderungen/Features gesamt (konsolidiert) | 1.720 (siehe `Requirements.md`) | +| Formale Anforderungen gesamt (StRS+SyRS+SwRS) | 0 | +| Stakeholder-Anforderungen (StRS) | 0 | +| System-Anforderungen (SyRS) | 0 | +| Software-Anforderungen (SwRS) | 0 | +| Use Cases gesamt (explizit) | 1.720 | +| Dokumentierte Use Cases | 509 | +| Undokumentierte Use Cases | 1.211 (71% Gap) | +| Ueberlappung Use Cases <-> Anforderungen (abgezogen) | 0 (bereits dedupliziert) | +| ISO-29148-Compliance | n.v. | +| Traceability-Abdeckung | n.v. (kein StRS->SyRS->SwRS-Nachweis) | +| Code Coverage | n.v. | +| Test Coverage | n.v. | +| Analysierte Quellartefakte | 150.000+ LoC analysiert; 3.412 potenzielle Use Cases | +| Separate Traceability-CSV (Dateien / Zeilen) | 0 / 0 | ## Vorgehen -- Erweiterter Prompt zu Claude Code -- Verwendung spezialisierter Agenten für Claude Code. +- Erweiterter Prompt zu Claude Code +- Verwendung spezialisierter generischer Agenten +- Verwendung von MCP-Servern zur Erweiterung der Discovery-Breite + - Serena MCP (Memory/Knowledge) + - Windows-MCP (UI-Interaktion) + - MSSQL MCP (DB-Schema-Analyse) -## Prompt -"Please analyze this software project and write a ISO 29148 compliant reuqirements specification. -Use Agents wherever possible. -" \ No newline at end of file +## Verwendeter Prompt +```text +Please analyze this software project and write a reuqirements specification according to modern standards. +Use Agents and MCP servers wherever possible. +Keep superflous texts to a minimum and concentrate on actual requirements. +``` + +## Agenten (Beispiele) +- `Tools/Agents/centron-documentation-writer.md` + - Dokumentiert Module, Architektur und Muster +- `Tools/Agents/nhibernate-query-reviewer.md` + - Query-/Persistenzanalyse fuer datengetriebene Use Cases +- `Tools/Agents/centron-code-reviewer.md` + - Review und Ableitung technischer Funktionalitaet +- `Tools/Agents/webservice-developer.md` + - API- und Integrationssicht in der Discovery + +## Ergebnisbeispiele aus `ERP_DOCUMENTATION` +- `ERP_DOCUMENTATION/ANALYSIS_SUMMARY.md` + - 34 identifizierte Module, davon 11 neu entdeckt +- `ERP_DOCUMENTATION/UNDOCUMENTED_USE_CASES_SUMMARY.md` + - 1.720+ extrahierte Use Cases, ca. 71% Dokumentations-Gap +- `ERP_DOCUMENTATION/USE_CASES.md` und `ERP_DOCUMENTATION/USE_CASE_MAPPING.md` + - Konsolidierte Use-Case-Sichten und Zuordnungen +- `ERP_DOCUMENTATION/SCREENSHOT_MAPPING_COMPLETE.md` + - UI-/Screenshot-Mapping zur funktionalen Validierung + +## Evaluation-Hinweis +Sehr stark fuer Funktions-/Use-Case-Discovery und Doku-Gap-Analyse; konsolidierte Zaehlung erfolgt in `Requirements.md`. diff --git a/literatur.bib b/literatur.bib index 66e2ebb..a06a771 100644 --- a/literatur.bib +++ b/literatur.bib @@ -189,3 +189,83 @@ publisher = {Springer}, url = {https://hastie.su.domains/ElemStatLearn/} } + +@misc{claudecode_quickstart_2026, + title = {Claude Code Documentation: Quickstart}, + author = {{Anthropic}}, + year = {2026}, + url = {https://code.claude.com/docs/en/quickstart}, + note = {Accessed 2026-02-19} +} + +@misc{claudecode_cli_2026, + title = {Claude Code Documentation: CLI Usage}, + author = {{Anthropic}}, + year = {2026}, + url = {https://code.claude.com/docs/en/cli-usage}, + note = {Accessed 2026-02-19} +} + +@misc{claudecode_ide_2026, + title = {Claude Code Documentation: IDE Integrations}, + author = {{Anthropic}}, + year = {2026}, + url = {https://code.claude.com/docs/en/ide-integrations}, + note = {Accessed 2026-02-19} +} + +@misc{claudecode_mcp_2026, + title = {Claude Code Documentation: MCP}, + author = {{Anthropic}}, + year = {2026}, + url = {https://code.claude.com/docs/en/mcp}, + note = {Accessed 2026-02-19} +} + +@misc{anthropic_remote_mcp_2025, + title = {Claude Code Can Now Connect to Your Remote MCP Servers}, + author = {{Anthropic}}, + year = {2025}, + url = {https://www.anthropic.com/news/claude-code-remote-mcp}, + note = {Accessed 2026-02-19} +} + +@misc{mcp_intro_2026, + title = {Model Context Protocol: Getting Started Introduction}, + author = {{Model Context Protocol}}, + year = {2026}, + url = {https://modelcontextprotocol.io/docs/getting-started/intro}, + note = {Accessed 2026-02-19} +} + +@misc{mcp_servers_repo_2026, + title = {Model Context Protocol Servers Repository}, + author = {{Model Context Protocol}}, + year = {2026}, + url = {https://github.com/modelcontextprotocol/servers}, + note = {Accessed 2026-02-19} +} + +@misc{serena_mcp_2026, + title = {Serena MCP Server Repository}, + author = {{oraios}}, + year = {2026}, + url = {https://github.com/mcp/oraios/serena}, + note = {Accessed 2026-02-19} +} + +@misc{windows_mcp_autoit_2026, + title = {Windows Desktop Automation MCP Server (AutoIt-based)}, + author = {{mario-andreschak}}, + year = {2026}, + url = {https://github.com/mario-andreschak/mcp-windows-desktop-automation}, + note = {Accessed 2026-02-19} +} + +@misc{mssql_mcp_2026, + title = {MSSQL MCP Server Repository}, + author = {{JexinSam}}, + year = {2026}, + url = {https://github.com/JexinSam/mssql_mcp_server}, + note = {Accessed 2026-02-19} +} diff --git a/masterarbeit_style.typ b/masterarbeit_style.typ index 90d655e..9ce0957 100644 --- a/masterarbeit_style.typ +++ b/masterarbeit_style.typ @@ -82,9 +82,22 @@ #set text(size: 12pt, weight: "semibold") #it ] + ] #let body_content(children) = [ + // Markdown-like styling for fenced code blocks. + #show raw: set text(font: "DejaVu Sans Mono", size: 9.5pt, fill: luma(20)) + #show raw.where(block: true): it => block( + width: 100%, + fill: luma(240), + stroke: 0.5pt + luma(190), + inset: 9pt, + radius: 4pt, + above: 0.8em, + below: 0.8em, + it, + ) #children ]