Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 4 additions & 14 deletions angular.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,7 @@
"options": {
"karmaConfig": "projects/ngx-coding-components/karma.conf.js",
"tsConfig": "projects/ngx-coding-components/tsconfig.spec.json",
"polyfills": [
"zone.js",
"zone.js/testing"
]
"polyfills": []
}
}
}
Expand All @@ -59,9 +56,7 @@
"outputPath": "dist/coding-components-serve",
"index": "src/index.html",
"main": "src/main.ts",
"polyfills": [
"zone.js"
],
"polyfills": [],
"tsConfig": "tsconfig.app.json",
"preserveSymlinks": true,
"inlineStyleLanguage": "scss",
Expand Down Expand Up @@ -129,10 +124,7 @@
"test": {
"builder": "ngx-build-plus:karma",
"options": {
"polyfills": [
"zone.js",
"zone.js/testing"
],
"polyfills": [],
"tsConfig": "tsconfig.spec.json",
"inlineStyleLanguage": "scss",
"assets": [
Expand Down Expand Up @@ -174,9 +166,7 @@
"index": "projects/schemer/src/index.html",
"tsConfig": "projects/schemer/tsconfig.app.json",
"inlineStyleLanguage": "scss",
"polyfills": [
"zone.js"
],
"polyfills": [],
"assets": [
"projects/schemer/src/assets"
],
Expand Down
5 changes: 5 additions & 0 deletions docs/angular-21-migration-audit-2026-10-16.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Angular-21-Migration: Prüfung vom 16.10.2026

**Späterer Stand:** Dieser Bericht beschreibt die damalige Teilstufe. Die vollständige
Responses-ESM-/Zoneless-Umstellung ist in
[responses-esm-zoneless-2026-10-16.md](responses-esm-zoneless-2026-10-16.md)
dokumentiert.

**Urteil:** Die bestätigten Migrationsfehler sind im lokalen Prüfstand behoben.
Die unten aufgeführten Laufzeit-, Build- und Vertragstests bestehen. Dies ist
keine Aussage über ein bereits veröffentlichtes Release oder Deployment.
Expand Down
48 changes: 48 additions & 0 deletions docs/responses-esm-zoneless-2026-10-16.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
{
"date": "2026-10-16",
"status": "source_changes_for_pull_requests",
"versionBumps": false,
"responses": {
"installed": "5.3.1",
"installedNativeEsm": false,
"esmPullRequest": "https://github.com/iqb-berlin/responses/pull/138",
"esmSourceCommit": "8f77414",
"esmSourceBase": "565e7df",
"dependencyUpdatePendingRegularRelease": true
},
"htmlBytes": {
"publishedComparison": 4845727,
"currentBranchWithPublishedResponses": 4270157,
"previousLocalEsmIntegrationExperiment": 3846981
},
"currentSavingsBytes": 575570,
"currentSavingsPercent": 11.88,
"zone": {
"rootPackageAbsent": true,
"bundleInputAbsent": true,
"browserGlobalAbsent": true,
"angularOptionalPeerMetadataRetained": true
},
"tests": {
"responsesUnit": 366,
"responsesSolverPairs": 234,
"publishedReference": "5.3.1",
"goldenFixtures": 75,
"libraryUnit": 573,
"schemerUnit": 6,
"codebookContracts": 1287,
"developmentBrowser": 21,
"temporaryHtmlBrowser": 14
},
"lint": {
"errors": 0,
"existingWarnings": 20
},
"releaseCreated": false,
"releaseArtifactsCommitted": false,
"limits": [
"Remote CI must be checked separately",
"No merge, registry publication or deployment",
"No new local .NET, Word, Safari or Firefox acceptance"
]
}
150 changes: 150 additions & 0 deletions docs/responses-esm-zoneless-2026-10-16.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
# Responses ESM und vollständige Zoneless-Umstellung

Prüfstand vom 16.10.2026. Die Quelländerungen enthalten keine Versionsanhebung
und keine Release-Dateien. Die bestehenden Versionsfelder bleiben unverändert.

## Größe und getrennte Lieferwege

| Prüfstand | HTML-Größe |
| --- | ---: |
| Veröffentlichtes Schemer 2.9.0-alpha.2 als Vergleich | 4.845.727 B |
| Dieser Zweig mit WOFF2, vollständiger Zoneless-Umstellung und Responses 5.3.1 aus npm | **4.270.157 B** |
| Vorheriger lokaler Integrationsversuch mit zusätzlichem Responses-ESM-Build | 3.846.981 B |

Der aktuelle Zweig spart **575.570 B / 11,88 %**. Für die lokale HTML-Prüfung
wird ausschließlich eine temporäre Testdatei mit der Metadatenversion `0.0.0`
erzeugt. Sie ist kein Release-Artefakt und wird nicht eingecheckt.

Der ESM-Einstieg ist separat in [Responses PR #138](https://github.com/iqb-berlin/responses/pull/138)
implementiert. Der frühere Integrationsversuch erreichte insgesamt 20,61 %
Ersparnis gegenüber dem veröffentlichten Vergleichsstand. Dieser Wert ist ein
zusätzliches Messergebnis und beschreibt nicht den normalen Build dieses Zweigs.
Er enthält auch den aktuellen Responses-Quellstand auf Basis von `565e7df`.
Im damaligen Vergleich bei noch aktiver Zone sparte der ESM-Schritt 388.880 B.

coding-components installiert weiterhin das veröffentlichte Responses 5.3.1.
Ein Wechsel auf die neue ESM-Ausgabe benötigt deren spätere reguläre Freigabe
und eine anschließende Aktualisierung der Abhängigkeit. Es werden weder ein
vorläufiges Responses-Paket noch eine zusätzliche Alpha-Version vorausgesetzt.

## Responses: zusätzliche Modulform ohne eingeschränkten Solver

Die beiden Ausgaben werden aus denselben TypeScript-Engine-Quellen erzeugt.
`require` und klassische Unterpfade verwenden weiterhin die bisherigen
CommonJS-Dateien im Paketwurzelverzeichnis. `import` verwendet native ESM-Dateien
unter `esm/`. Die Ausgabe ergänzt explizite `.js`-Dateiendungen auch in den
Deklarationen, sodass NodeNext und Browser-Bundler ohne Sonderauflösung arbeiten.
Relative Verzeichnis-Einstiege wie `presentation` bleiben nutzbar.

Das ESM-Solver-Modul importiert `evaluate` aus dem vollständigen mathjs.
Funktionen, Konfiguration und Toleranzen bleiben erhalten. Die kleinere Ausgabe
`mathjs/number` wurde anhand von Gegenbeispielen verworfen: Schon
`sum([1,2,3])` und `abs(complex(3,4))` liefern damit nicht mehr dieselben gültigen
numerischen Ergebnisse. Der Ansatz entspricht der dokumentierten
[ESM-Bündelung von mathjs](https://mathjs.org/docs/custom_bundling.html).

Der Repository-Build von Responses basiert auf upstream `565e7df`; die ESM-Arbeit
ändert keine Dateien unter `src/`. Die ursprüngliche Responses-Unit-Suite
besteht mit ihrem gesperrten mathjs 15.1.0. Die frischen Consumer und der Schemer
verwenden mathjs 15.2.0, entsprechend dem bisherigen Schemer-Lockfile.

Die Paketprüfung installiert einen echten Tarball und zusätzlich das
veröffentlichte Responses 5.3.1 unter einem reinen Testalias. Sie prüft:

- ESM/CommonJS, öffentliche Exporte, Datei- und Verzeichnis-Unterpfade;
- TypeScript mit klassischer Node-Auflösung, NodeNext für ESM/CommonJS und Bundler;
- **234 Ableitungen** in beiden Modulformen und gegen veröffentlichtes 5.3.1:
108 Ergebnisse `VALUE_CHANGED`, 65 `INVALID`, 61 `DERIVE_ERROR`;
- ausdrücklich erwartete Summen, komplexe Zwischenwerte, Einheiten und BigNumber;
- **75 bestehende Kodier-Golden-Fälle**, einschließlich Textdarstellung und
unveränderter erwarteter Kodierergebnisse.

Diese Paketprüfungen bestehen auf **Node 18.20.8 und Node 22.23.1**. Die
unveränderte Engine-Suite besteht mit **366 Tests** und Coverage-Grenzen.

**Korrektur zur früheren Probe:** In den ursprünglichen 180 synthetischen
Ableitungen fehlte `sourceParameters.processing`. Dadurch verglich diese Probe
zunächst nur dieselben Fehlerpfade. Der reproduzierbare Analyseskript setzt das
Pflichtfeld jetzt und verlangt ausdrücklich erfolgreiche Auswertungen und
Fehlerfälle. Der korrigierte Lauf hat 69 `VALUE_CHANGED`, 50 `INVALID` und
61 `DERIVE_ERROR`. Die oben genannte neue Paketprüfung umfasst darüber hinaus
konkrete erwartete Werte und den unabhängigen veröffentlichten Vergleich.

Der zusätzliche Paketbuild und die Paketprüfungen liegen im Responses-PR.
Der ungenutzte direkte mathjs-12-Peer der Komponentenbibliothek ist entfernt;
Responses verwaltet seine mathjs-Abhängigkeit selbst.

## Zone.js: entfernte Anforderungen und geprüfte Aktualisierungswege

Beide App-Einstiegspunkte verwenden ausdrücklich `provideZonelessChangeDetection()`.
Zone.js-Imports, Polyfills für Build und Test, das ungenutzte Polyfills-Quellmodul,
direkte Abhängigkeit, installierter Lockfile-Paketeintrag und Bibliotheks-Peer
sind entfernt. Der HTML-Wrapper erwartet keine entfernte `polyfills.js` mehr.
Die Test-Initialisierung verwendet `BrowserTestingModule`/`platformBrowserTesting`.
Die drei `fakeAsync`-Fälle warten jetzt auf echte Observable- oder Timer-Ergebnisse.

| Bereich | Aktualisierungsweg und Nachweis |
| --- | --- |
| Studio/Verona-Start und spätere Host-Nachrichten | Variablen, Schema und Rolle im Wrapper sind Signals, die das Template liest. Native Nachrichten erscheinen ohne vorbereitenden Klick. Leere Listen entfernen die alte Ansicht. |
| Rollenwechsel | Eine ausdrückliche neue Rolle `super` hebt einen vorherigen Gastmodus auf. Eine Nachricht ohne neue Rolle erhält dagegen die bestehende Berechtigung. Beide Fälle laufen im Browser. |
| Schemer-Listen, Import, Dialogrückgaben, 300-ms-Debounce | `markForCheck()` an den asynchronen Grenzen und der zentralen Listenaktualisierung; bestehender `AsyncPipe` für die Auswahl bleibt erhalten. |
| Variablen-/Code-Editor und 500-ms-Debounce | Eigene Benachrichtigung nach verzögerten Änderungen sowie nach Bestätigung/Abbruch der Material-Dialoge. |
| Quell-, Array-/Fragment- und Verarbeitungsdialoge | Material-/Formularereignisse bleiben gebunden; Rückgaben benachrichtigen die zuständige Ansicht. Gültige Position 0 und leere Anweisungen bleiben zulässig. |
| Dateilisten und Antwortschema aus FileReader | Menü-Ausgaben benachrichtigen ihre gebundenen Besitzer; native Dateiimporte ersetzen die sichtbare Liste in Schemer und Demo. |
| Rich Text, Bild und Formel | Explizite Benachrichtigung nach Bildimport und Dialogrückgabe. Die vorhandene Tiptap-Direktive benachrichtigt bereits bei Inhalts-/Auswahländerungen. Native Auswahl aktualisiert die Format-Schaltfläche im echten Custom Element. |
| Verzögerte Variablenauswahl | Der 500-ms-Rückruf meldet die Änderung an Angular. Bestätigung wird ohne nachträglichen Klick oder erzwungene Test-Aktualisierung aktiv. |
| Solver-Cursor | Der verzögerte Rückruf verändert nur Fokus und DOM-Auswahl; die davor geänderten Formulardaten werden durch den gebundenen Menü-Listener gemeldet. |
| Codebook-Oberfläche | Eingaben über Angular-Inputs/`ngOnChanges`, gebundene Ereignisse und Material-Datenquelle; keine eigene native asynchrone Zustandsquelle. |
| Datei-/Verona-Dienste | Sie liefern Promise-/Observable-Ergebnisse. Die benutzenden Ansichten übernehmen die Benachrichtigung; der Nachrichtendienst behält den bestehenden Verona-Vertrag. |

Die Umstellung folgt den [Zoneless-Anforderungen von Angular](https://angular.dev/guide/zoneless):
Signals, `markForCheck()`, gebundene Ereignisse und `setInput()` melden Änderungen.
Die neuen Render-Tests verwenden `whenStable()` und erzwingen keine
`detectChanges()`-Aufrufe, um fehlende Benachrichtigungen nicht zu verdecken.

Im Lockfile bleiben ausschließlich Angulars **optionale Peer-Metadaten** zu
Zone.js stehen. Sie stammen aus dem Angular-Paket; es gibt keinen installierten
Zone.js-Paketeintrag. Ein frisches `npm ci`, die frische Bibliotheksinstallation,
die Bundle-Eingaben und die Browserprüfung bestätigen die tatsächliche Abwesenheit.

## Erfolgreiche lokale Prüfung

| Prüfung | Ergebnis |
| --- | --- |
| Responses | 366 Unit-Tests; frische Tarball-Consumer auf Node 18 und 22 einschließlich veröffentlichtem 5.3.1-Vergleich |
| Bibliothek | **573 Tests** mit Coverage, einschließlich drei zusätzlicher echter Zoneless-Renderfälle |
| Standalone-Schemer | **6 Tests** mit Coverage |
| Codebook-Generator und Verträge | **1.287 Tests** bestanden |
| Entwicklungsbuild | **21 Browserfälle**, einschließlich 320–1440 px und Container-Resizing |
| Temporäres HTML mit veröffentlichtem Responses 5.3.1 | **14 iframe-Fälle**, einschließlich der Originalvariablen aus dem lokalen Studio-Export und sechs Solver-Fällen |
| Native Demo/Elements, vorheriger Integrationsversuch | Kein `window.Zone`, alle elf Tags registriert; 20 Anfangsvariablen, Dateiimport, Format-Schaltfläche nach nativer Auswahl und Editor-Ausgabe geprüft; keine Laufzeitfehler |
| Builds | Bibliothek mit allen Einstiegspunkten, eigenständiger Schemer samt Verpackung und Demo/Elements erfolgreich |
| Weitere Gates | Lint ohne Fehler bei 20 bestehenden Warnungen; Schema- und Ajv-Prüfungen bestanden |
| Audit des vorherigen Integrationsversuchs | Repository und Consumer ohne hohe/kritische Befunde; ein niedriger KaTeX-Befund, beim Consumer zusätzlich ein moderater Tiptap-Befund. |

Die Browserläufe nutzen das installierte Chrome. `PLAYWRIGHT_CHANNEL=chrome`
wählt es im Repository aus; ohne diese Option bleibt der normale Chromium-Pfad
der CI erhalten. Beispiel für eine temporäre HTML-Testdatei:

```sh
PLAYWRIGHT_CHANNEL=chrome \
SCHEMER_ARTIFACT=/tmp/schemer-zoneless-test.html \
npm run test:schemer:responsive
```

## Grenzen und Auslieferungsstand

Die lokalen Prüfungen belegen keinen Merge, keine Registry-Veröffentlichung und
kein Deployment auf iqb-studio.de. Die entfernte CI ist gesondert an den PRs
zu prüfen. Der reale Studio-Vertrag wird lokal als iframe mit
Start-/Änderungsnachrichten geprüft; die produktive Aufgabe benötigt eine Anmeldung.
Die externen Studio-/Kodierbox-Anwendungen wurden nicht geändert.

Die .NET-Quellen in Responses wurden nicht verändert. Ihre Suite wurde mangels
lokalem .NET-SDK nicht erneut ausgeführt. Microsoft Word, Safari und Firefox
wurden für diesen Stand ebenfalls nicht erneut abgenommen. Die früheren
Host-/Word-Nachweise gelten weiterhin nur für ihre bezeichneten Artefakte.

Codebook bleibt im Bibliothekspaket enthalten. Ein zusätzlicher Codebook-Dialog
im Schemer und die neue Partial-Credit-Erweiterung für leere Teilantworten sind
weiterhin nicht Bestandteil dieser Änderungen.
110 changes: 110 additions & 0 deletions docs/schemer-bundle-size-2026-10-16.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# Schemer: Dateigröße und mathjs-Prüfung vom 16.10.2026

**Späterer Stand:** Dieser Bericht beschreibt die damalige Teilstufe. Die vollständige
Responses-ESM-/Zoneless-Umstellung ist in
[responses-esm-zoneless-2026-10-16.md](responses-esm-zoneless-2026-10-16.md)
dokumentiert.

## Umgesetzte Optimierung

Verglichen wird das unveränderte veröffentlichte `Schemer_v2.9.0-alpha.2`
(`7ce5cacb41a2e545160fabaa3bb28331933c208c`) mit demselben Produktionsbuild nach
zwei Änderungen: NunitoSans als WOFF2 und Zone.js ausschließlich über die
Angular-Polyfills. `provideZoneChangeDetection()` bleibt aktiv, damit unter
Angular 21 die Studio-Startnachricht und verzögerte Rückgaben sichtbar werden.

| Messung | Vorher | Nachher | Einsparung |
| --- | ---: | ---: | ---: |
| Gepacktes, eigenständiges HTML | 4.845.727 B | 4.327.681 B | **518.046 B / 10,69 %** |
| Hauptskript | 3.777.295 B | 3.741.547 B | 35.748 B |
| Eingebetteter Nunito-CSS-Block einschließlich Base64 | 759.244 B | 276.946 B | 482.298 B |
| Schriftdatei vor Base64 | 569.372 B | 207.636 B | 361.736 B |
| Gesamtes HTML mit gzip, rein lokale Vergleichsmessung | 1.431.181 B | 1.309.675 B | 121.506 B |

Die Schrift bleibt vollständig: 1.100 Glyphen, 939 Unicode-Zuordnungen,
identische Konturen und Metriken sowie unveränderte Achsen `wght`, `wdth`,
`opsz`, `YTLC`. Es wurde kein Zeichensatz oder Schriftstil entfernt. Die
TTF-Quelldatei bleibt im Demo unter `src/assets/fonts/` erhalten; die redundante
Schemer-Kopie wurde durch WOFF2 ersetzt. Ihre SHA-256 vor der Konvertierung:
`585d07756a7f5cca34de3e622a23f5e98d60efc96ac9c9e7c6bc251fea040854`.

Erzeugung mit Python, fontTools 4.67.0 und Brotli 1.2.0:

```python
from fontTools.ttLib import TTFont

font = TTFont('src/assets/fonts/NunitoSans-VariableFont_YTLC,opsz,wdth,wght.ttf',
recalcTimestamp=False)
font.flavor = 'woff2'
font.save('projects/schemer/src/assets/fonts/'
'NunitoSans-VariableFont_YTLC,opsz,wdth,wght.woff2')
```

## Lokale Prüfung

- Produktionsbuild mit `--stats-json` und vollständige HTML-Verpackung erfolgreich.
Der Build enthält Zone.js nur noch in `polyfills.js`, ohne zweite Kopie in `main.js`.
- Sechs Schemer-Unit-Tests mit Coverage bestanden; Projekt-Lint ohne Fehler,
weiterhin 20 bestehende Warnungen.
- 15 Browserfälle am Entwicklungsbuild und acht iframe-Fälle am gepackten HTML
bestanden, einschließlich der Originalvariablen aus dem bereitgestellten
Studio-Export. Studio-Start, spätere Nachrichten, verzögerte Rückgabe,
Rich Text mit Bild/Formel und Dialogabbrüche funktionieren.
- Zusätzlicher A/B-Browservergleich im frischen Chrome-Kontext: beide
Schriftdateien tatsächlich geladen; identische Textbreiten bei Gewicht
200/400/700/1000 für `ÄÖÜäöüß Größe 0123456789`. Die Screenshots der
eingebetteten Schemer-Oberfläche sind bytegleich.

Die Version wurde nicht angehoben. Das optimierte HTML ist ein lokaler
Prüfstand; das veröffentlichte alpha.2-Artefakt wurde nicht ersetzt.

## mathjs: gemessene Optionen

Installiert sind Responses 5.3.1 und mathjs 15.2.0. Der Browser erreicht mathjs
über `@iqb/responses/derive/derive-value.js`, das `require('mathjs')` verwendet
und daraus ausschließlich `evaluate` aufruft. Der CommonJS-Einstieg bindet
zahlreiche weitere Exporte ein. Die normale ESM-Ausgabe stellt weiterhin die
volle Ausdruckssprache zur Verfügung und lässt sich besser optimieren.

Die isolierten Messungen verwenden denselben esbuild 0.28.1 mit `bundle`,
`minify`, Browserplattform, ESM-Ausgabe und Ziel ES2022. Sie messen keine bereits
umgesetzte Ersparnis im vollständigen Angular-HTML:

| Isolierter Probe-Build | Größe |
| --- | ---: |
| mathjs, bisheriger CommonJS-Zugriff | 1.075.263 B |
| mathjs, ESM-Import von `evaluate` mit vollem Funktionsumfang | 669.432 B |
| mathjs/number | 377.727 B |
| Responses einschließlich bisherigem mathjs-Import | 1.132.292 B |
| Responses mit ausschließlich für den Versuch auf ESM umgeleitetem Math-Import | 747.973 B |

Im Responses-Versuch spart ESM **384.319 B / 33,94 %**. Die 35 direkten
Ausdrucksfälle liefern gleiche Ergebnisse und Fehler für CommonJS und ESM.
Die ursprüngliche Probe der 180 Ableitungen enthielt kein
`sourceParameters.processing` und verglich deshalb nur Fehlerpfade. Der
inzwischen korrigierte Analyseskript setzt das Pflichtfeld und verlangt
ausdrücklich sowohl erfolgreiche Ableitungen als auch Fehlerfälle. Geprüft werden Rechenfunktionen,
sehr kleine Zahlen, Rundung, bedingte Ausdrücke, Arrays, komplexe Zwischenwerte,
BigNumber/Brüche, Einheiten, Syntaxfehler, leere/nichtnumerische Quellwerte und
drei Antwortstatus. Dies ist eine gezielte Stichprobe, keine vollständige
Kompatibilitätsfreigabe einer neuen Responses-Ausgabe.

`mathjs/number` ist kein kompatibler Ersatz: Beispielsweise liefern
`sum([1,2,3])`, `mean([1,2,3])` und `abs(complex(3,4))` mit dem vollständigen
mathjs gültige numerische Ergebnisse, mit der reduzierten Ausgabe Fehler.
Auch bei ausschließlich numerischen SOLVER-Endergebnissen werden diese
Funktionen benötigt.

Reproduktion ohne Änderung installierter Pakete oder Produktionskonfiguration:

```sh
node scripts/analyze-mathjs-bundle.mjs
```

Der nächste saubere Schritt ist ein zusätzlicher ESM-Einstieg in Responses mit
ESM-Import von mathjs, bei weiter verfügbarem CommonJS-Einstieg für Node-Hosts.
Dazu gehören die dortigen Engine-Tests und ein erneuter Vergleich des gesamten
Schemer-Bundles. Die Math-Instanz, Toleranzen und unterstützten Funktionen
sollten dabei erhalten bleiben. Eine alleinige Importänderung in Schemer
behebt den `require` innerhalb des veröffentlichten Responses-Pakets nicht.
Der Produktionsimport bleibt in dieser Optimierung unverändert.
5 changes: 5 additions & 0 deletions docs/schemer-embedded-start-2026-10-16.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Schemer-Alpha: Basisvariablen im eingebetteten Betrieb

**Späterer Stand:** Dieser Bericht beschreibt die damalige Teilstufe. Die vollständige
Responses-ESM-/Zoneless-Umstellung ist in
[responses-esm-zoneless-2026-10-16.md](responses-esm-zoneless-2026-10-16.md)
dokumentiert.

## Fehler und Ursache

Das veröffentlichte Schemer-HTML 2.9.0-alpha.1 bleibt nach einer gültigen
Expand Down
Loading
Loading