From 07dfcec4ef96335f397a505c03101d5971293000 Mon Sep 17 00:00:00 2001 From: Philippe Torrel Date: Tue, 4 Aug 2026 21:09:04 +0200 Subject: [PATCH] --- 05_react/uebungen/uebungen-01-03-react.zip | Bin 0 -> 5608 bytes .../u01_hello-react/index.html | 38 + .../u01_hello-react/src/App.jsx | 0 .../u01_hello-react/src/index.jsx | 0 .../u02-03_mathfn-modul/assets/js/main.js | 4 + .../u02-03_mathfn-modul/assets/js/math.js | 13 + .../u02-03_mathfn-modul/esbuild.config.js | 14 + .../u02-03_mathfn-modul/index.html | 24 + .../u02-03_mathfn-modul/package.json | 18 + .../tag37/01_hello-world/index.html | 15 + .../tag37/01_hello-world/package-lock.json | 530 ++++ .../tag37/01_hello-world/package.json | 18 + .../tag37/01_hello-world/src/App.jsx | 23 + .../src/components/HelloWorld.jsx | 12 + .../tag37/01_hello-world/src/index.jsx | 15 + .../frontend_framework_komparator.tsx | 1186 ++++++++ .../tag37/02_gemini-spa-vergleich/index.html | 1121 +++++++ .../03_import-es6/assets/img/defer_async.png | Bin 0 -> 58933 bytes .../tag37/03_import-es6/assets/js/main.js | 18 + .../tag37/03_import-es6/assets/js/math.js | 8 + .../unterricht/tag37/03_import-es6/index.html | 28 + .../tag37/03_import-es6/package-lock.json | 660 +++++ .../tag37/03_import-es6/package.json | 18 + .../04_import-mit-bundler/assets/js/main.js | 15 + .../04_import-mit-bundler/assets/js/math.js | 8 + .../tag37/04_import-mit-bundler/index.html | 25 + .../04_import-mit-bundler/package-lock.json | 2600 +++++++++++++++++ .../tag37/04_import-mit-bundler/package.json | 21 + 28 files changed, 6432 insertions(+) create mode 100644 05_react/uebungen/uebungen-01-03-react.zip create mode 100644 05_react/uebungen/uebungen-01-03-react/u01_hello-react/index.html create mode 100644 05_react/uebungen/uebungen-01-03-react/u01_hello-react/src/App.jsx create mode 100644 05_react/uebungen/uebungen-01-03-react/u01_hello-react/src/index.jsx create mode 100644 05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/main.js create mode 100644 05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/math.js create mode 100644 05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/esbuild.config.js create mode 100644 05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/index.html create mode 100644 05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/package.json create mode 100644 05_react/unterricht/tag37/01_hello-world/index.html create mode 100644 05_react/unterricht/tag37/01_hello-world/package-lock.json create mode 100644 05_react/unterricht/tag37/01_hello-world/package.json create mode 100644 05_react/unterricht/tag37/01_hello-world/src/App.jsx create mode 100644 05_react/unterricht/tag37/01_hello-world/src/components/HelloWorld.jsx create mode 100644 05_react/unterricht/tag37/01_hello-world/src/index.jsx create mode 100644 05_react/unterricht/tag37/02_gemini-spa-vergleich/frontend_framework_komparator.tsx create mode 100644 05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html create mode 100644 05_react/unterricht/tag37/03_import-es6/assets/img/defer_async.png create mode 100644 05_react/unterricht/tag37/03_import-es6/assets/js/main.js create mode 100644 05_react/unterricht/tag37/03_import-es6/assets/js/math.js create mode 100644 05_react/unterricht/tag37/03_import-es6/index.html create mode 100644 05_react/unterricht/tag37/03_import-es6/package-lock.json create mode 100644 05_react/unterricht/tag37/03_import-es6/package.json create mode 100644 05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js create mode 100644 05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js create mode 100644 05_react/unterricht/tag37/04_import-mit-bundler/index.html create mode 100644 05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json create mode 100644 05_react/unterricht/tag37/04_import-mit-bundler/package.json diff --git a/05_react/uebungen/uebungen-01-03-react.zip b/05_react/uebungen/uebungen-01-03-react.zip new file mode 100644 index 0000000000000000000000000000000000000000..fe6477bb370fab814068d2c75959cbb5adc3ac76 GIT binary patch literal 5608 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 + + + + + Hello React + + + + +
+ + + + + + React: Hello React + + + + + +
+ +
+
+

Übung 1: Hello React!

+

+ Passe den Text in der App.jsx-Datei an, um eine andere Begrüßungsnachricht »Hello, React!« anzuzeigen. + Führe das Build-Skript erneut aus und aktualisiere die index.html-Datei im Browser, um die Änderungen zu + sehen. +

+
+
+ + + + diff --git a/05_react/uebungen/uebungen-01-03-react/u01_hello-react/src/App.jsx b/05_react/uebungen/uebungen-01-03-react/u01_hello-react/src/App.jsx new file mode 100644 index 0000000..e69de29 diff --git a/05_react/uebungen/uebungen-01-03-react/u01_hello-react/src/index.jsx b/05_react/uebungen/uebungen-01-03-react/u01_hello-react/src/index.jsx new file mode 100644 index 0000000..e69de29 diff --git a/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/main.js b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/main.js new file mode 100644 index 0000000..5e90095 --- /dev/null +++ b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/main.js @@ -0,0 +1,4 @@ +import { add, subtract } from './math'; + +console.log(add(1, 2)); // => 3; +console.log(subtract(3, 2)); //=> 1 diff --git a/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/math.js b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/math.js new file mode 100644 index 0000000..83981f6 --- /dev/null +++ b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/assets/js/math.js @@ -0,0 +1,13 @@ +// explizite Freigabe von Einheiten + +// math.js +export const add = (a, b) => a + b; +export const subtract = (a, b) => a - b; + +// Übung 2: Mathfunktionen als Modul + +// Programmiere zwei weitere Module, die jeweils eine Funktion multiply und divide enthalten. Importiere die Funktionen in der main.js-Datei und führe sie aus. + +// Übung 3: Exportieren Funktionen als Objekt + +// Anstatt die Funktionen add, subtract, multiply und divide benannt zu exportieren, exportiere sie als Standard-Export in einem Objekt. Importiere das Objekt in der main.js-Datei und führe die Funktionen aus. diff --git a/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/esbuild.config.js b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/esbuild.config.js new file mode 100644 index 0000000..93e258e --- /dev/null +++ b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/esbuild.config.js @@ -0,0 +1,14 @@ +// esbuild.config.js +// const esbuild = require('esbuild'); +import * as esbuild from 'esbuild'; +// https://esbuild.github.io/getting-started/#your-first-bundle + +esbuild + .build({ + entryPoints: ['assets/js/main.js'], + bundle: true, + outfile: 'dist/bundle.js', + minify: false, + sourcemap: true, + }) + .catch(() => process.exit(1)); diff --git a/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/index.html b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/index.html new file mode 100644 index 0000000..e397fe1 --- /dev/null +++ b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/index.html @@ -0,0 +1,24 @@ + + + + + + Module in JS mit Bundler + + + + +
+
+

Verwendung und Import von Modulen in JS MIT BUNDLER

+
+

Um die Modul-Schreibweise in JS zu verwenden, müssen folgende Punkte berücksichtigt werden:

+
    +
  • Eingebundene Module können ohne Dateiendung eingebunden werden.
  • +
+

Ergebnis

+

Die einzelnen Komponenten werden zur Kompilierzeit zu einer Datei zusammengefasst

+
+
+ + diff --git a/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/package.json b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/package.json new file mode 100644 index 0000000..c891cf7 --- /dev/null +++ b/05_react/uebungen/uebungen-01-03-react/u02-03_mathfn-modul/package.json @@ -0,0 +1,18 @@ +{ + "name": "02_modul-schreibweise", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "dev": "npx esbuild assets/js/main.js --bundle --watch --sourcemap --outfile=dist/bundle.js", + "server": "npx http-server -c-1 -p 3000" + }, + "keywords": [], + "author": "", + "license": "ISC", + "type": "module", + "devDependencies": { + "esbuild": "^0.27.0", + "http-server": "^14.1.1" + } +} diff --git a/05_react/unterricht/tag37/01_hello-world/index.html b/05_react/unterricht/tag37/01_hello-world/index.html new file mode 100644 index 0000000..d5c2bbc --- /dev/null +++ b/05_react/unterricht/tag37/01_hello-world/index.html @@ -0,0 +1,15 @@ + + + + + + Hello World with React + + + + +
+
+
+ + diff --git a/05_react/unterricht/tag37/01_hello-world/package-lock.json b/05_react/unterricht/tag37/01_hello-world/package-lock.json new file mode 100644 index 0000000..e4c4a97 --- /dev/null +++ b/05_react/unterricht/tag37/01_hello-world/package-lock.json @@ -0,0 +1,530 @@ +{ + "name": "01_hello-world", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "01_hello-world", + "version": "1.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "esbuild": "^0.28.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + } + } +} diff --git a/05_react/unterricht/tag37/01_hello-world/package.json b/05_react/unterricht/tag37/01_hello-world/package.json new file mode 100644 index 0000000..80a53e3 --- /dev/null +++ b/05_react/unterricht/tag37/01_hello-world/package.json @@ -0,0 +1,18 @@ +{ + "name": "01_hello-world", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "npx esbuild src/index.jsx --bundle --watch --outfile=dist/bundle.js --loader:.js=jsx" + }, + "keywords": [], + "type": "module", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8" + }, + "devDependencies": { + "esbuild": "^0.28.1" + } +} diff --git a/05_react/unterricht/tag37/01_hello-world/src/App.jsx b/05_react/unterricht/tag37/01_hello-world/src/App.jsx new file mode 100644 index 0000000..4486431 --- /dev/null +++ b/05_react/unterricht/tag37/01_hello-world/src/App.jsx @@ -0,0 +1,23 @@ +import React from 'react'; // Modul wird in node_modules gesucht (Funktioniert nur mit Bundler) +import HelloWorld from './components/HelloWorld'; + +// App Funktion wird durch JSX Rückgabe zu einer JSX-Komponente (bzw. zu einem eigenen Element) +// Wichtig: JSX-Komponenten müssen in CamelCase definieren werden (Anfangsbuchstabe groß). + +// classic function statement because of hoisting +function App() { + console.log('init App'); // JS logic + return ( + <> +
+

Hello World

+ + + + +
+ + ); // JSX - View +} + +export default App; diff --git a/05_react/unterricht/tag37/01_hello-world/src/components/HelloWorld.jsx b/05_react/unterricht/tag37/01_hello-world/src/components/HelloWorld.jsx new file mode 100644 index 0000000..fef34f3 --- /dev/null +++ b/05_react/unterricht/tag37/01_hello-world/src/components/HelloWorld.jsx @@ -0,0 +1,12 @@ +import React from 'react'; + +const HelloWorld = (props) => { + // const { } = props; + + return ( + <> +

Hello World!

+ + ); +}; +export default HelloWorld; diff --git a/05_react/unterricht/tag37/01_hello-world/src/index.jsx b/05_react/unterricht/tag37/01_hello-world/src/index.jsx new file mode 100644 index 0000000..bd95976 --- /dev/null +++ b/05_react/unterricht/tag37/01_hello-world/src/index.jsx @@ -0,0 +1,15 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +// import von Komponente +import App from './App'; + +// von React 1 bis 17 +// ReactDOM.render(

Hello World

, document.getElementById('root')); + +// seit React 18 - March 29, 2022 +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +); diff --git a/05_react/unterricht/tag37/02_gemini-spa-vergleich/frontend_framework_komparator.tsx b/05_react/unterricht/tag37/02_gemini-spa-vergleich/frontend_framework_komparator.tsx new file mode 100644 index 0000000..df04e08 --- /dev/null +++ b/05_react/unterricht/tag37/02_gemini-spa-vergleich/frontend_framework_komparator.tsx @@ -0,0 +1,1186 @@ +import React, { useState, useEffect, useRef, useMemo } from 'react'; +import { + Layers, + Home, + Table as TableIcon, + PieChart, + Building2, + Code2, + HelpCircle, + Download, + ArrowRight, + Globe, + Search, + Copy, + Check, + Sparkles, + Award, + ExternalLink, + ShieldCheck, + Rocket, + Zap, + Star, + FileSpreadsheet, + FileImage, + Cpu, + Flame, + CheckCircle2 +} from 'lucide-react'; + +const FRAMEWORKS = [ + { + id: 'react', + name: 'React', + creator: 'Meta', + color: '#61dafb', + bgLight: 'rgba(97, 218, 251, 0.1)', + borderColor: 'border-[#61dafb]', + textColor: 'text-[#61dafb]', + badgeBg: 'bg-[#61dafb]/10 text-[#61dafb]', + description: 'Komponentenbasierte UI-Bibliothek mit JSX & riesigem Ökosystem.', + type: 'UI-Bibliothek', + year: '2013 (Meta)', + dom: 'Virtual DOM', + learningCurve: 'Mittel (JSX, State Hooks)', + bundleSize: '42 kB', + bundleSizeNum: 42, + perfScore: 8.8, + enterprise: 'Sehr Hoch', + metaFrameworks: 'Next.js, Remix', + strengths: 'Riesiger Arbeitsmarkt, unendliche Bibliotheken, hohe Flexibilität', + radarData: { perf: 85, eco: 98, learn: 65, enterprise: 92, dx: 85, jobs: 99 } + }, + { + id: 'angular', + name: 'Angular', + creator: 'Google', + color: '#dd0031', + bgLight: 'rgba(221, 0, 49, 0.1)', + borderColor: 'border-[#dd0031]', + textColor: 'text-[#dd0031]', + badgeBg: 'bg-[#dd0031]/10 text-[#dd0031]', + description: 'Vollständiges Batterien-inklusive Application Framework mit TypeScript.', + type: 'Full Framework', + year: '2016 (Google)', + dom: 'Incremental DOM / Signals', + learningCurve: 'Steil (DI, RxJS, TS)', + bundleSize: '120 kB', + bundleSizeNum: 120, + perfScore: 8.2, + enterprise: 'Branchenstandard', + metaFrameworks: 'Analog, Angular SSR', + strengths: 'Klare Architekturmuster, ideal für Enterprise & Großteams', + radarData: { perf: 82, eco: 88, learn: 45, enterprise: 98, dx: 80, jobs: 85 } + }, + { + id: 'vue', + name: 'Vue.js', + creator: 'Community', + color: '#42b883', + bgLight: 'rgba(66, 184, 131, 0.1)', + borderColor: 'border-[#42b883]', + textColor: 'text-[#42b883]', + badgeBg: 'bg-[#42b883]/10 text-[#42b883]', + description: 'Progressives Framework mit sehr flacher Lernkurve & flexibler Syntax.', + type: 'Progressives Framework', + year: '2014 (Evan You)', + dom: 'Virtual DOM (Reactivity Engine)', + learningCurve: 'Einfach (HTML/CSS/JS)', + bundleSize: '34 kB', + bundleSizeNum: 34, + perfScore: 9.0, + enterprise: 'Hoch', + metaFrameworks: 'Nuxt.js', + strengths: 'Hervorragende Dokumentation, sanfte Lernkurve, flexible DX', + radarData: { perf: 90, eco: 85, learn: 90, enterprise: 85, dx: 92, jobs: 75 } + }, + { + id: 'svelte', + name: 'Svelte', + creator: 'Compiler', + color: '#ff3e00', + bgLight: 'rgba(255, 62, 0, 0.1)', + borderColor: 'border-[#ff3e00]', + textColor: 'text-[#ff3e00]', + badgeBg: 'bg-[#ff3e00]/10 text-[#ff3e00]', + description: 'Kein Virtual DOM. Compiliert direkt in hochoptimierten Vanillacode.', + type: 'Compiler Framework', + year: '2016 (Rich Harris)', + dom: 'Kein vDOM (Direct DOM Updates)', + learningCurve: 'Sehr Einfach', + bundleSize: '2.5 kB', + bundleSizeNum: 2.5, + perfScore: 9.8, + enterprise: 'Stetig Wachsend', + metaFrameworks: 'SvelteKit', + strengths: 'Extrem schnell, minimaler Code, kein Runtime-Boilerplate', + radarData: { perf: 98, eco: 70, learn: 95, enterprise: 72, dx: 96, jobs: 50 } + } +]; + +const REFERENCE_PROJECTS = [ + // REACT + { + id: 'ref-meta', + name: 'Meta (Facebook / Instagram)', + framework: 'react', + fwName: 'React', + description: 'Meta erfand React ursprünglich, um die hochdynamischen Feeds von Facebook & Instagram performant zu rendern.', + metric: '> 3 Milliarden aktive Nutzer', + tags: ['Social Media', 'Big Tech', 'Universal JS'], + link: 'https://react.dev' + }, + { + id: 'ref-netflix', + name: 'Netflix', + framework: 'react', + fwName: 'React', + description: 'Netflix nutzt React für die komplette TV- und Web-Benutzeroberfläche zur Optimierung der Startup-Zeit.', + metric: 'Schnellere Ladezeiten auf Smart-TVs', + tags: ['Streaming', 'High Traffic', 'Client-Side Render'], + link: 'https://netflix.com' + }, + { + id: 'ref-airbnb', + name: 'Airbnb', + framework: 'react', + fwName: 'React', + description: 'Pionier im Bereich Server-Side Rendering mit React für optimale SEO und blitzschnelle Buchungs-Flows.', + metric: 'Universal Rendering Architektur', + tags: ['Travel', 'Marketplace', 'Design System'], + link: 'https://airbnb.com' + }, + { + id: 'ref-uber', + name: 'Uber', + framework: 'react', + fwName: 'React', + description: 'Komplexe Echtzeit-Dashboards, Fahrten-Tracking und Web-Apps setzen auf React und maßgeschneiderte Hooks.', + metric: 'Echtzeit-Karten-Verarbeitung', + tags: ['Mobilität', 'Real-Time', 'Maps'], + link: 'https://uber.com' + }, + + // ANGULAR + { + id: 'ref-gcloud', + name: 'Google Cloud Console & Gmail', + framework: 'angular', + fwName: 'Angular', + description: 'Google nutzt Angular intern für hunderte hochkomplexe Enterprise-Tools wie die Google Cloud Console.', + metric: 'Maximale Typsicherheit & DI', + tags: ['Cloud', 'Enterprise', 'TypeScript'], + link: 'https://cloud.google.com' + }, + { + id: 'ref-db', + name: 'Deutsche Bank', + framework: 'angular', + fwName: 'Angular', + description: 'Setzt Angular für weltweit einheitliche, hochsichere Banking-Portale und Investment-Dashboards ein.', + metric: 'Strenge Enterprise Compliance', + tags: ['Fintech', 'Security', 'Large Scale'], + link: 'https://db.com' + }, + { + id: 'ref-msoffice', + name: 'Microsoft Office Web', + framework: 'angular', + fwName: 'Angular', + description: 'Teile von Office Online & Microsoft-Verwaltungsportalen nutzen Angulars strukturierte Modularität.', + metric: 'Konsistente Modulstrukturen', + tags: ['Productivity', 'SaaS', 'Enterprise'], + link: 'https://microsoft.com' + }, + { + id: 'ref-paypal', + name: 'PayPal Admin & Checkout', + framework: 'angular', + fwName: 'Angular', + description: 'PayPal vertraut auf Angular für komplexe Händler-Dashboards und weltweite Transaktionsabwicklungen.', + metric: 'Millionen tägliche Transaktionen', + tags: ['Payments', 'High-Security', 'Dashboards'], + link: 'https://paypal.com' + }, + + // VUE + { + id: 'ref-gitlab', + name: 'GitLab', + framework: 'vue', + fwName: 'Vue.js', + description: 'GitLab stellte seine komplette Benutzeroberfläche von jQuery auf Vue.js um, um die Entwicklungsgeschwindigkeit zu steigern.', + metric: 'Skalierbarer Open Source Core', + tags: ['DevTools', 'Open Source', 'Single File Components'], + link: 'https://gitlab.com' + }, + { + id: 'ref-nintendo', + name: 'Nintendo', + framework: 'vue', + fwName: 'Vue.js', + description: 'Mehrere offizielle Nintendo-Websites und MyNintendo-Accounts nutzen Vue.js für flüssige Benutzererfahrungen.', + metric: 'Hohe Interaktivität & Performance', + tags: ['Gaming', 'Consumer Web', 'Interactive'], + link: 'https://nintendo.com' + }, + { + id: 'ref-apple', + name: 'Apple Careers & Store', + framework: 'vue', + fwName: 'Vue.js', + description: 'Apple verwendet Vue.js für spezifische interaktive Webseiten, Stellenportale und interne Tools.', + metric: 'Sanfte Integration in Bestands-Websites', + tags: ['E-Commerce', 'Recruiting', 'Lightweight'], + link: 'https://apple.com' + }, + + // SVELTE + { + id: 'ref-nytimes', + name: 'The New York Times', + framework: 'svelte', + fwName: 'Svelte', + description: 'Pionier bei der Nutzung von Svelte für interaktive Datenjournalismus-Grafiken ohne schweres JS-Runtime-Bundle.', + metric: 'Minimalste Ladezeiten bei Grafiken', + tags: ['Data Journalism', 'Ultra Fast', 'Zero Runtime'], + link: 'https://nytimes.com' + }, + { + id: 'ref-spotify', + name: 'Spotify Showcase Web', + framework: 'svelte', + fwName: 'Svelte', + description: 'Spotify setzt Svelte für spezifische interaktive Web-Campaigns und leichtgewichtige Embedded Player ein.', + metric: 'Optimiert für Mobilgeräte & Embeds', + tags: ['Media', 'Interactive', 'Embedded'], + link: 'https://spotify.com' + }, + { + id: 'ref-cloudflare', + name: 'Cloudflare Dashboard', + framework: 'svelte', + fwName: 'Svelte', + description: 'Cloudflare modernisiert Teile seiner Entwickleroberflächen mit SvelteKit für reaktionsschnelle UI.', + metric: 'Extrem reaktionsschnelles Dashboard', + tags: ['Cloud', 'DevTools', 'SvelteKit'], + link: 'https://cloudflare.com' + } +]; + +const CODE_EXAMPLES = { + counter: { + title: '1. Interactive Counter', + react: `import React, { useState } from 'react'; + +export default function Counter() { + const [count, setCount] = useState(0); + + return ( +
+

Anzahl: {count}

+ +
+ ); +}`, + angular: `import { Component, signal } from '@angular/core'; + +@Component({ + selector: 'app-counter', + standalone: true, + template: \` +
+

Anzahl: {{ count() }}

+ +
+ \` +}) +export class CounterComponent { + count = signal(0); + + increment() { + this.count.update(n => n + 1); + } +}`, + vue: ` + +`, + svelte: ` + +
+

Anzahl: {count}

+ +
` + }, + fetch: { + title: '2. API Fetching', + react: `import React, { useState, useEffect } from 'react'; + +export default function UserList() { + const [users, setUsers] = useState([]); + + useEffect(() => { + fetch('/api/users') + .then(res => res.json()) + .then(data => setUsers(data)); + }, []); + + return ( +
    + {users.map(u =>
  • {u.name}
  • )} +
+ ); +}`, + angular: `import { Component, inject, OnInit } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'app-users', + template: \` +
    + @for (user of users; track user.id) { +
  • {{ user.name }}
  • + } +
+ \` +}) +export class UsersComponent implements OnInit { + private http = inject(HttpClient); + users: any[] = []; + + ngOnInit() { + this.http.get('/api/users').subscribe(data => this.users = data); + } +}`, + vue: ` + +`, + svelte: ` + +
    + {#each users as user} +
  • {user.name}
  • + {/each} +
` + } +}; + +export default function App() { + const [searchQuery, setSearchQuery] = useState(''); + const [selectedFramework, setSelectedFramework] = useState('all'); + const [activeCodeExample, setActiveCodeExample] = useState('counter'); + const [activeCodeFw, setActiveCodeFw] = useState('react'); + const [copied, setCopied] = useState(false); + const [quizChoice, setQuizChoice] = useState(null); + + // Canvas Refs for Rendering Charts & Downloading + const radarCanvasRef = useRef(null); + const barCanvasRef = useRef(null); + + const scrollToSection = (id) => { + const el = document.getElementById(id); + if (el) { + const headerOffset = 70; + const elementPosition = el.getBoundingClientRect().top; + const offsetPosition = elementPosition + window.pageYOffset - headerOffset; + window.scrollTo({ + top: offsetPosition, + behavior: 'smooth' + }); + } + }; + + useEffect(() => { + // 1. Draw Radar Chart + const radarCtx = radarCanvasRef.current?.getContext('2d'); + if (radarCtx && radarCanvasRef.current) { + const canvas = radarCanvasRef.current; + const width = canvas.width; + const height = canvas.height; + const centerX = width / 2; + const centerY = height / 2; + const radius = Math.min(centerX, centerY) - 40; + + radarCtx.clearRect(0, 0, width, height); + + const labels = ['Performance', 'Ökosystem', 'Lernkurve', 'Enterprise', 'DX', 'Jobmarkt']; + const numAxes = labels.length; + + // Draw Grid Rings + for (let level = 1; level <= 5; level++) { + const r = (radius / 5) * level; + radarCtx.beginPath(); + for (let i = 0; i < numAxes; i++) { + const angle = (Math.PI * 2 / numAxes) * i - Math.PI / 2; + const x = centerX + r * Math.cos(angle); + const y = centerY + r * Math.sin(angle); + if (i === 0) radarCtx.moveTo(x, y); + else radarCtx.lineTo(x, y); + } + radarCtx.closePath(); + radarCtx.strokeStyle = 'rgba(255, 255, 255, 0.1)'; + radarCtx.lineWidth = 1; + radarCtx.stroke(); + } + + // Draw Axis Lines & Labels + radarCtx.font = '11px Inter, sans-serif'; + radarCtx.fillStyle = '#94a3b8'; + radarCtx.textAlign = 'center'; + radarCtx.textBaseline = 'middle'; + + for (let i = 0; i < numAxes; i++) { + const angle = (Math.PI * 2 / numAxes) * i - Math.PI / 2; + const x = centerX + radius * Math.cos(angle); + const y = centerY + radius * Math.sin(angle); + + radarCtx.beginPath(); + radarCtx.moveTo(centerX, centerY); + radarCtx.lineTo(x, y); + radarCtx.strokeStyle = 'rgba(255, 255, 255, 0.15)'; + radarCtx.stroke(); + + // Label Position + const lx = centerX + (radius + 20) * Math.cos(angle); + const ly = centerY + (radius + 18) * Math.sin(angle); + radarCtx.fillText(labels[i], lx, ly); + } + + // Draw Framework Datasets + const fwDataList = [ + { key: 'react', color: 'rgba(97, 218, 251, 1)', fill: 'rgba(97, 218, 251, 0.2)', vals: [85, 98, 65, 92, 85, 99] }, + { key: 'angular', color: 'rgba(221, 0, 49, 1)', fill: 'rgba(221, 0, 49, 0.2)', vals: [82, 88, 45, 98, 80, 85] }, + { key: 'vue', color: 'rgba(66, 184, 131, 1)', fill: 'rgba(66, 184, 131, 0.2)', vals: [90, 85, 90, 85, 92, 75] }, + { key: 'svelte', color: 'rgba(255, 62, 0, 1)', fill: 'rgba(255, 62, 0, 0.2)', vals: [98, 70, 95, 72, 96, 50] } + ]; + + fwDataList.forEach(fw => { + radarCtx.beginPath(); + fw.vals.forEach((val, i) => { + const r = (radius * val) / 100; + const angle = (Math.PI * 2 / numAxes) * i - Math.PI / 2; + const x = centerX + r * Math.cos(angle); + const y = centerY + r * Math.sin(angle); + if (i === 0) radarCtx.moveTo(x, y); + else radarCtx.lineTo(x, y); + }); + radarCtx.closePath(); + radarCtx.fillStyle = fw.fill; + radarCtx.fill(); + radarCtx.strokeStyle = fw.color; + radarCtx.lineWidth = 2; + radarCtx.stroke(); + }); + } + + // 2. Draw Bar Chart (Bundle Sizes) + const barCtx = barCanvasRef.current?.getContext('2d'); + if (barCtx && barCanvasRef.current) { + const canvas = barCanvasRef.current; + const width = canvas.width; + const height = canvas.height; + barCtx.clearRect(0, 0, width, height); + + const paddingLeft = 60; + const paddingBottom = 40; + const paddingTop = 20; + const paddingRight = 20; + const graphWidth = width - paddingLeft - paddingRight; + const graphHeight = height - paddingTop - paddingBottom; + + const items = [ + { name: 'React', val: 42, color: '#61dafb' }, + { name: 'Angular', val: 120, color: '#dd0031' }, + { name: 'Vue.js', val: 34, color: '#42b883' }, + { name: 'Svelte', val: 2.5, color: '#ff3e00' } + ]; + + const maxVal = 140; + + // Y Axis Grid + barCtx.strokeStyle = 'rgba(255,255,255,0.1)'; + barCtx.lineWidth = 1; + barCtx.font = '10px Inter, sans-serif'; + barCtx.fillStyle = '#64748b'; + + for (let yVal = 0; yVal <= maxVal; yVal += 35) { + const y = paddingTop + graphHeight - (yVal / maxVal) * graphHeight; + barCtx.beginPath(); + barCtx.moveTo(paddingLeft, y); + barCtx.lineTo(width - paddingRight, y); + barCtx.stroke(); + barCtx.fillText(`${yVal} kB`, 15, y + 3); + } + + // Draw Bars + const barWidth = graphWidth / items.length - 25; + items.forEach((item, idx) => { + const barH = (item.val / maxVal) * graphHeight; + const x = paddingLeft + idx * (barWidth + 25) + 12; + const y = paddingTop + graphHeight - barH; + + // Rounded Top Bar + barCtx.fillStyle = item.color; + barCtx.beginPath(); + if (typeof barCtx.roundRect === 'function') { + barCtx.roundRect(x, y, barWidth, barH, [6, 6, 0, 0]); + } else { + barCtx.rect(x, y, barWidth, barH); + } + barCtx.fill(); + + // Label Value above Bar + barCtx.fillStyle = '#ffffff'; + barCtx.font = 'bold 11px Inter, sans-serif'; + barCtx.textAlign = 'center'; + barCtx.fillText(`${item.val} kB`, x + barWidth / 2, y - 6); + + // Label Name below Bar + barCtx.fillStyle = '#94a3b8'; + barCtx.font = '11px Inter, sans-serif'; + barCtx.fillText(item.name, x + barWidth / 2, height - 12); + }); + } + }, []); + + const filteredProjects = useMemo(() => { + return REFERENCE_PROJECTS.filter(p => { + const matchesFw = selectedFramework === 'all' || p.framework === selectedFramework; + const matchesQuery = p.name.toLowerCase().includes(searchQuery.toLowerCase()) || + p.description.toLowerCase().includes(searchQuery.toLowerCase()) || + p.tags.some(t => t.toLowerCase().includes(searchQuery.toLowerCase())); + return matchesFw && matchesQuery; + }); + }, [searchQuery, selectedFramework]); + + const handleCopyCode = () => { + const snippet = CODE_EXAMPLES[activeCodeExample][activeCodeFw]; + navigator.clipboard.writeText(snippet); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + const downloadChartImage = () => { + const exportCanvas = document.createElement('canvas'); + const width = 1100; + const height = 600; + exportCanvas.width = width; + exportCanvas.height = height; + const ctx = exportCanvas.getContext('2d'); + + // Background + ctx.fillStyle = '#0f172a'; + ctx.fillRect(0, 0, width, height); + + // Title + ctx.fillStyle = '#ffffff'; + ctx.font = 'bold 24px Inter, sans-serif'; + ctx.fillText('Frontend Framework Radar & Performance 2026', 40, 45); + + ctx.fillStyle = '#94a3b8'; + ctx.font = '14px Inter, sans-serif'; + ctx.fillText('Vergleich: React, Angular, Vue.js & Svelte', 40, 70); + + // Render Canvas Charts onto export canvas + if (radarCanvasRef.current && barCanvasRef.current) { + ctx.drawImage(radarCanvasRef.current, 40, 100, 480, 440); + ctx.drawImage(barCanvasRef.current, 560, 100, 500, 440); + } + + ctx.fillStyle = '#64748b'; + ctx.font = '12px Inter, sans-serif'; + ctx.fillText('Framework Radar SPA 2026', 40, 575); + + const imageURL = exportCanvas.toDataURL('image/png'); + const downloadLink = document.createElement('a'); + downloadLink.href = imageURL; + downloadLink.download = 'framework-vergleich-chart-2026.png'; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + }; + + const downloadCSV = () => { + const headers = ["Kriterium", "React", "Angular", "Vue.js", "Svelte"]; + const rows = [ + ["Typus", ...FRAMEWORKS.map(f => f.type)], + ["Erstveröffentlichung", ...FRAMEWORKS.map(f => f.year)], + ["DOM-Modell", ...FRAMEWORKS.map(f => f.dom)], + ["Lernkurve", ...FRAMEWORKS.map(f => f.learningCurve)], + ["Bundle Size (kB)", ...FRAMEWORKS.map(f => f.bundleSize)], + ["Performance Score", ...FRAMEWORKS.map(f => f.perfScore.toString())], + ["Enterprise Readiness", ...FRAMEWORKS.map(f => f.enterprise)], + ["Bekannte Meta-Frameworks", ...FRAMEWORKS.map(f => f.metaFrameworks)] + ]; + + const csvContent = "data:text/csv;charset=utf-8," + + [headers.join(","), ...rows.map(e => e.map(x => `"${x}"`).join(","))].join("\n"); + + const encodedUri = encodeURI(csvContent); + const link = document.createElement("a"); + link.setAttribute("href", encodedUri); + link.setAttribute("download", "framework_komparator_2026.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + }; + + return ( +
+ + {/* Navigation Bar */} +
+
+
scrollToSection('hero')}> +
+ +
+
+ + Framework Radar + + + React Edition + +
+
+ + + +
+ +
+
+
+ + {/* Main Content Area */} +
+ + {} +
+
+
+ +
+
+ React SPA Komparator +
+

+ React vs. Angular vs. Vue vs. Svelte +

+

+ Welches Frontend-Framework eignet sich am besten für deine nächste Anwendung? Vergleiche Systemarchitekturen, Performance, Ökosysteme und entdecke reale Referenzprojekte führender Tech-Unternehmen. +

+
+ + +
+
+ + {/* Quick Framework Cards */} +
+ {FRAMEWORKS.map(fw => ( +
{ + setSelectedFramework(fw.id); + scrollToSection('showcase'); + }} + className={`bg-slate-900/70 p-4 rounded-2xl border-t-2 ${fw.borderColor} border-x border-b border-slate-800/80 hover:border-slate-700 transition-all cursor-pointer hover:scale-[1.02] shadow-xl group`} + > +
+ + {fw.creator} + + +
+

{fw.name}

+

{fw.description}

+
+ ))} +
+
+ + {} +
+
+
+

+ Vergleichsmatrix +

+

Gegenüberstellung architektonischer Eigenschaften & Metriken.

+
+ +
+ +
+ + + + + {FRAMEWORKS.map(fw => ( + + ))} + + + + + + {FRAMEWORKS.map(fw => )} + + + + {FRAMEWORKS.map(fw => )} + + + + {FRAMEWORKS.map(fw => )} + + + + {FRAMEWORKS.map(fw => )} + + + + {FRAMEWORKS.map(fw => ( + + ))} + + + + {FRAMEWORKS.map(fw => ( + + ))} + + + + {FRAMEWORKS.map(fw => )} + + + + {FRAMEWORKS.map(fw => ( + + ))} + + + + {FRAMEWORKS.map(fw => )} + + +
Kriterium + {fw.name} +
Typus / Art{fw.type}
Erstveröffentlichung{fw.year}
DOM-Modell{fw.dom}
Lernkurve{fw.learningCurve}
Bundle Size (Minimal) + + {fw.bundleSize} + +
Performance Rating + + {fw.perfScore} / 10 +
Enterprise Readiness{fw.enterprise}
Meta-Frameworks + + {fw.metaFrameworks} + +
Hauptstärken{fw.strengths}
+
+
+ + {} +
+
+
+

+ Visualisierter Benchmark +

+

Radar-Vergleich und Paketgrößen-Analysen im Canvas.

+
+ +
+ +
+ {/* Canvas Radar Chart */} +
+
+

+ Stärken-Radar +

+

Direkter Vergleich von Performance, DX, Jobchancen und Lernkurve.

+
+
+ +
+
+ {FRAMEWORKS.map(fw => ( +
+ + {fw.name} +
+ ))} +
+
+ + {/* Canvas Bar Chart */} +
+
+

+ Paketgröße (Gzipped in kB) +

+

Minimales Initial-Bundle der Core-Laufzeitumgebung.

+
+
+ +
+

Geringeres Paketgewicht führt zu schnellerer Initialisierung auf mobilen Endgeräten.

+
+
+
+ + {} +
+
+
+

+ Bekannte Referenzprojekte +

+

Namhafte Plattformen und Apps, die diese Frameworks im Einsatz haben.

+
+ + {/* Filter Controls */} +
+
+ + setSearchQuery(e.target.value)} + placeholder="Projekt oder Tag suchen..." + className="bg-slate-900 border border-slate-700 text-xs rounded-xl pl-9 pr-4 py-2.5 text-slate-200 focus:outline-none focus:border-indigo-500 w-48 sm:w-64" + /> +
+ +
+
+ + {/* Grid */} +
+ {filteredProjects.map((p) => { + const fwMeta = FRAMEWORKS.find(f => f.id === p.framework) || FRAMEWORKS[0]; + return ( +
+
+
+ + {p.fwName} + + +
+

{p.name}

+

{p.description}

+
+
+
+ + {p.metric} +
+
+ {p.tags.map((t, i) => ( + + #{t} + + ))} +
+ + Website besuchen + +
+
+ ); + })} +
+
+ + {} +
+
+

+ Live Syntax-Vergleich +

+

Direkte Gegenüberstellung typischer Code-Muster.

+
+ +
+ {/* Example Selection Tabs */} +
+ {Object.keys(CODE_EXAMPLES).map(key => ( + + ))} +
+ + {/* Framework Code Tabs */} +
+ {FRAMEWORKS.map(fw => ( + + ))} +
+ + {/* Code Display */} +
+ +
+                {CODE_EXAMPLES[activeCodeExample][activeCodeFw]}
+              
+
+
+
+ + {} +
+
+
+ + Entscheidungs-Assistent + +

Welches Framework passt zu deinem Projekt?

+

Wähle dein Hauptziel für eine präzise Empfehlung.

+
+ +
+ + + + + +
+ + {/* Result Display */} + {quizChoice && ( +
+ {quizChoice === 'enterprise' && ( + <> +
+ Empfehlung: Angular +
+

+ Für skalierbare Großprojekte mit vielen Entwicklern bietet Angular durch Out-of-the-Box Dependency Injection, erzwungenes TypeScript und klare Modulstrukturen die höchste Wartbarkeit. +

+ + )} + {quizChoice === 'mvp' && ( + <> +
+ Empfehlung: React oder Vue.js +
+

+ Für maximale Entwicklungsgeschwindigkeit profitieren Sie bei React vom weltweit größten Bibliotheks-Ökosystem und Entwickler-Pool. Vue.js bietet eine unvergleichlich sanfte Einarbeitung. +

+ + )} + {quizChoice === 'perf' && ( + <> +
+ Empfehlung: Svelte +
+

+ Da Svelte keinen Virtual DOM benötigt und den Code zur Buildzeit compiliert, ist es in puncto Ladezeit, Speicherverbrauch und minimalem JS-Footprint der Spitzenreiter. +

+ + )} + +
+ )} +
+
+ +
+ + {} +
+
+
+ + Frontend Framework Komparator SPA 2026 +
+
+ Entwickelt mit React & Tailwind CSS. +
+
+
+ +
+ ); +} \ No newline at end of file diff --git a/05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html b/05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html new file mode 100644 index 0000000..e5c020b --- /dev/null +++ b/05_react/unterricht/tag37/02_gemini-spa-vergleich/index.html @@ -0,0 +1,1121 @@ + + + + + + Frontend Framework Komparator 2026 | React, Angular, Vue & Svelte + + + + + + + + + + + + +
+
+
+
+ +
+
+ Framework Radar + 2026 Edition +
+
+ + + +
+ +
+
+
+ +
+ + +
+
+
+ +
+
+ Interaktive Frontend-Entscheidungshilfe +
+

+ React vs. Angular vs. Vue vs. Svelte +

+

+ Welches JavaScript-Framework passt am besten zu deinem nächsten Projekt? Vergleiche Systemarchitekturen, Performancewerte, Ökosysteme und entdecke reale Referenzprojekte weltbekannter Unternehmen. +

+
+ + +
+
+ + +
+ +
+
+ + Meta +
+

React

+

Komponentenbasierte UI-Bibliothek mit JSX & riesigem Ökosystem.

+
+ + +
+
+ + Google +
+

Angular

+

Vollständiges Batterien-inklusive Application Framework mit TypeScript.

+
+ + +
+
+ + Community +
+

Vue.js

+

Progressives Framework mit sehr flacher Lernkurve & flexibler Syntax.

+
+ + +
+
+ + Compiler +
+

Svelte

+

Kein Virtual DOM. Compiliert direkt in hochoptimierten Vanillacode.

+
+
+
+ + +
+
+
+

+ Vergleichsmatrix +

+

Detaillierter Gegenüberstellung relevanter Kennzahlen & Eigenschaften.

+
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Kriterium React Angular Vue.js Svelte
Typus / ArtUI BibliothekFull Application FrameworkProgressives FrameworkCompiler Framework
Erstveröffentlichung2013 (Meta)2016 (Google)2014 (Evan You)2016 (Rich Harris)
Arbeitsweise / DOMVirtual DOMIncremental DOM / Signal-DrivenVirtual DOM (Reactivity Engine)Kein vDOM (Direct DOM Updates)
LernkurveMittel (JSX, State)Steil (DI, RxJS, TS)Einfach (HTML/CSS/JS)Sehr Einfach
Bundle Size (Minimal gzip)~42 kB (React + DOM)~120 kB (Core + Runtime)~34 kB~2 kB (No Runtime)
Performance Score 8.8 / 10 8.2 / 10 9.0 / 10 9.8 / 10
Enterprise ReadinessSehr HochBranchenstandardHochStetig Wachsend
Bekannteste Meta-FrameworksNext.js, RemixAnalog, Angular SSRNuxt.jsSvelteKit
StärkenRiesiger Arbeitsmarkt, unendliche Bibliotheken, flexibelKlare Architekturmuster, hervorragend für GroßteamsHervorragende Dokumentation, sanfte UmstellungExtrem schnell, minimaler Code, kein Boilerplate
+
+
+ + +
+
+
+

+ Benchmark & Visualisierung +

+

Visuelle Gegenüberstellung in Radar- und Balkendiagrammen.

+
+ + +
+ + +
+ +
+
+
+

+ Stärken-Radar +

+ Metriken 0-100 +
+

Vergleich bezüglich Performance, Ökosystem, Lernkurve, DX (Developer Experience) und Skalierbarkeit.

+
+
+ +
+
+ + +
+
+
+

+ Paketgröße (Minimal Bundle in kB) +

+ Gzipped (kleiner ist besser) +
+

Typisches initiales Hello-World/Core Bundle-Gewicht für Web-Apps.

+
+
+ +
+
+
+
+ + +
+
+
+

+ Bekannte Referenzprojekte +

+

Welche namhaften Unternehmen und Plattformen setzen auf welches Framework?

+
+ + +
+
+ + +
+ +
+
+ + +
+ +
+
+ + +
+
+

+ Syntax-Vergleich +

+

Erlebe den Unterschied in der Syntax bei typischen Anwendungsfällen.

+
+ +
+ +
+ + +
+ + +
+ + + + +
+ + +
+ +
// Dynamic Code will load here
+
+
+
+ + +
+
+
+ Entscheidungshilfe +

Welches Framework passt zu deinem Projekt?

+

Beantworte 3 kurze Fragen und erhalte eine Empfehlung für dein Vorhaben.

+
+ +
+ +
+

1. Was für eine Art von Projekt entwickelst du?

+
+ + + +
+
+
+ + + +
+
+ +
+ + +
+
+
+ + Frontend Framework Komparator 2026 +
+
+ Erstellt für Entwickler, Architekten & Entscheidungsträger. +
+
+
+ + + +`, + svelte: ` + +
+

Anzahl: {count}

+ +
` + }, + fetch: { + react: `import React, { useState, useEffect } from 'react'; + +export default function UserList() { + const [users, setUsers] = useState([]); + + useEffect(() => { + fetch('/api/users') + .then(res => res.json()) + .then(data => setUsers(data)); + }, []); + + return ( +
    + {users.map(u =>
  • {u.name}
  • )} +
+ ); +}`, + angular: `import { Component, inject, OnInit } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'app-users', + template: \` +
    + @for (user of users; track user.id) { +
  • {{ user.name }}
  • + } +
+ \` +}) +export class UsersComponent implements OnInit { + private http = inject(HttpClient); + users: any[] = []; + + ngOnInit() { + this.http.get('/api/users').subscribe(data => this.users = data); + } +}`, + vue: ` + +`, + svelte: ` + +
    + {#each users as user} +
  • {user.name}
  • + {/each} +
` + } + }; + + let radarChartInstance, barChartInstance; + let currentSnippetType = 'counter'; + let currentSnippetFw = 'react'; + + window.onload = function() { + renderProjects(); + initCharts(); + updateCodeViewer(); + }; + + function initCharts() { + // Radar Chart Configuration + const radarCtx = document.getElementById('radarChart').getContext('2d'); + radarChartInstance = new Chart(radarCtx, { + type: 'radar', + data: { + labels: ['Performance', 'Ökosystem', 'Lernkurve (Einfachheit)', 'Enterprise Readiness', 'DX (Developer Experience)', 'Jobmarkt'], + datasets: [ + { + label: 'React', + data: [85, 98, 65, 92, 85, 99], + borderColor: '#61dafb', + backgroundColor: 'rgba(97, 218, 251, 0.15)', + borderWidth: 2, + pointBackgroundColor: '#61dafb' + }, + { + label: 'Angular', + data: [82, 88, 45, 98, 80, 85], + borderColor: '#dd0031', + backgroundColor: 'rgba(221, 0, 49, 0.15)', + borderWidth: 2, + pointBackgroundColor: '#dd0031' + }, + { + label: 'Vue.js', + data: [90, 85, 90, 85, 92, 75], + borderColor: '#42b883', + backgroundColor: 'rgba(66, 184, 131, 0.15)', + borderWidth: 2, + pointBackgroundColor: '#42b883' + }, + { + label: 'Svelte', + data: [98, 70, 95, 72, 96, 50], + borderColor: '#ff3e00', + backgroundColor: 'rgba(255, 62, 0, 0.15)', + borderWidth: 2, + pointBackgroundColor: '#ff3e00' + } + ] + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + r: { + angleLines: { color: 'rgba(255, 255, 255, 0.1)' }, + grid: { color: 'rgba(255, 255, 255, 0.1)' }, + pointLabels: { + color: '#94a3b8', + font: { size: 11, family: 'Inter' } + }, + ticks: { + color: '#64748b', + backdropColor: 'transparent', + min: 0, + max: 100 + } + } + }, + plugins: { + legend: { + labels: { color: '#f8fafc', font: { family: 'Inter' } } + } + } + } + }); + + // Bar Chart Configuration (Bundle Size) + const barCtx = document.getElementById('barChart').getContext('2d'); + barChartInstance = new Chart(barCtx, { + type: 'bar', + data: { + labels: ['React (Core + DOM)', 'Angular (Core Runtime)', 'Vue.js (Minified)', 'Svelte (Compiled Code)'], + datasets: [{ + label: 'Bundle Größe in kB (gzipped)', + data: [42, 120, 34, 2.5], + backgroundColor: [ + 'rgba(97, 218, 251, 0.8)', + 'rgba(221, 0, 49, 0.8)', + 'rgba(66, 184, 131, 0.8)', + 'rgba(255, 62, 0, 0.8)' + ], + borderColor: [ + '#61dafb', + '#dd0031', + '#42b883', + '#ff3e00' + ], + borderWidth: 1, + borderRadius: 8 + }] + }, + options: { + responsive: true, + maintainAspectRatio: false, + scales: { + y: { + beginAtZero: true, + grid: { color: 'rgba(255, 255, 255, 0.08)' }, + ticks: { color: '#94a3b8' } + }, + x: { + grid: { display: false }, + ticks: { color: '#94a3b8' } + } + }, + plugins: { + legend: { + labels: { color: '#f8fafc', font: { family: 'Inter' } } + } + } + } + }); + } + + function renderProjects() { + const grid = document.getElementById('projectsGrid'); + const fwFilter = document.getElementById('frameworkFilter').value; + const searchQuery = document.getElementById('projectSearch').value.toLowerCase(); + + grid.innerHTML = ''; + + const filtered = projectsData.filter(p => { + const matchesFw = (fwFilter === 'all' || p.framework === fwFilter); + const matchesSearch = p.name.toLowerCase().includes(searchQuery) || + p.description.toLowerCase().includes(searchQuery) || + p.tags.some(t => t.toLowerCase().includes(searchQuery)); + return matchesFw && matchesSearch; + }); + + if (filtered.length === 0) { + grid.innerHTML = ` +
+ +

Keine passenden Referenzprojekte gefunden.

+
+ `; + return; + } + + filtered.forEach(p => { + const card = document.createElement('div'); + card.className = "glass-card p-6 rounded-2xl border border-slate-800 hover:border-slate-700 transition-all flex flex-col justify-between group"; + card.innerHTML = ` +
+
+ + ${p.fwName} + + +
+

${p.name}

+

${p.description}

+
+
+
+ + ${p.metric} +
+
+ ${p.tags.map(t => `#${t}`).join('')} +
+ + Website besuchen + +
+ `; + grid.appendChild(card); + }); + } + + function filterProjects() { + renderProjects(); + } + + function filterByFramework(fw) { + document.getElementById('frameworkFilter').value = fw; + renderProjects(); + scrollToSection('showcase'); + } + + function scrollToSection(id) { + document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' }); + } + + // Code Viewer Controls + function switchSnippetExample(type) { + currentSnippetType = type; + document.querySelectorAll('.snippet-tab-btn').forEach(b => { + b.classList.remove('bg-indigo-600', 'text-white'); + b.classList.add('bg-slate-800', 'text-slate-300'); + }); + const activeBtn = document.getElementById(`btn-${type}`); + activeBtn.classList.remove('bg-slate-800', 'text-slate-300'); + activeBtn.classList.add('bg-indigo-600', 'text-white'); + updateCodeViewer(); + } + + function switchCodeFramework(fw) { + currentSnippetFw = fw; + document.querySelectorAll('.code-fw-btn').forEach(b => { + b.classList.remove('border-[#61dafb]', 'border-[#dd0031]', 'border-[#42b883]', 'border-[#ff3e00]', 'text-white'); + b.classList.add('border-transparent', 'text-slate-400'); + }); + const activeTab = document.getElementById(`code-tab-${fw}`); + activeTab.classList.remove('border-transparent', 'text-slate-400'); + activeTab.classList.add('text-white'); + + const colors = { react: 'border-[#61dafb]', angular: 'border-[#dd0031]', vue: 'border-[#42b883]', svelte: 'border-[#ff3e00]' }; + activeTab.classList.add(colors[fw]); + + updateCodeViewer(); + } + + function updateCodeViewer() { + const viewer = document.getElementById('codeViewer'); + const code = codeExamples[currentSnippetType][currentSnippetFw]; + viewer.textContent = code; + } + + function copyCode() { + const code = document.getElementById('codeViewer').textContent; + navigator.clipboard.writeText(code).then(() => { + const btn = event.currentTarget; + const orig = btn.innerHTML; + btn.innerHTML = ` Kopiert!`; + setTimeout(() => btn.innerHTML = orig, 2000); + }); + } + + // Quiz Logic + function selectQuizAnswer(step, choice) { + const resContainer = document.getElementById('quizResult'); + resContainer.classList.remove('hidden'); + + let title = ""; + let fw = ""; + let desc = ""; + let color = ""; + + if (choice === 'enterprise') { + title = "Empfehlung: Angular"; + fw = "Angular"; + color = "text-[#dd0031]"; + desc = "Für große Enterprise-Anwendungen und strukturierte Teams ist Angular ideal. Es bietet Out-of-the-box Depedency Injection, Typsicherheit durch TypeScript und klare Architekturvorgaben."; + } else if (choice === 'mvp') { + title = "Empfehlung: React oder Vue.js"; + fw = "React / Vue.js"; + color = "text-[#61dafb]"; + desc = "Für schnelle Markteinführungen und flexible Prototypen profitieren Sie bei React von einem gewaltigen Arbeitsmarkt & Ecosystem oder bei Vue.js von extrem rascher Einarbeitung."; + } else { + title = "Empfehlung: Svelte"; + fw = "Svelte"; + color = "text-[#ff3e00]"; + desc = "Für maximale Lade-Performance, Daten-Visualisierungen und minimalste Paketgrößen ist Svelte unschlagbar. Da es ohne Virtual DOM auskommt, compiliert es direkt in extrem schlanken JS-Code."; + } + + resContainer.innerHTML = ` +
+ +

${title}

+
+

${desc}

+
+ +
+ `; + resContainer.scrollIntoView({ behavior: 'smooth' }); + } + + // Download Radar & Bar Chart as Combined Image + function downloadChartImage() { + // Create offscreen canvas for rendering high-res export image + const exportCanvas = document.createElement('canvas'); + const width = 1200; + const height = 750; + exportCanvas.width = width; + exportCanvas.height = height; + const ctx = exportCanvas.getContext('2d'); + + // Draw Background + ctx.fillStyle = '#0f172a'; + ctx.fillRect(0, 0, width, height); + + // Draw Header Title + ctx.fillStyle = '#ffffff'; + ctx.font = 'bold 28px Inter, sans-serif'; + ctx.fillText('Frontend Framework Vergleich 2026', 50, 50); + + ctx.fillStyle = '#94a3b8'; + ctx.font = '14px Inter, sans-serif'; + ctx.fillText('React vs. Angular vs. Vue.js vs. Svelte — Radar & Paketgrößen Benchmark', 50, 75); + + // Draw Charts onto export canvas + const radarCanvas = document.getElementById('radarChart'); + const barCanvas = document.getElementById('barChart'); + + // Draw Radar Chart Image + ctx.drawImage(radarCanvas, 50, 110, 520, 550); + + // Draw Bar Chart Image + ctx.drawImage(barCanvas, 630, 110, 520, 550); + + // Footer / Watermark + ctx.fillStyle = '#64748b'; + ctx.font = '12px Inter, sans-serif'; + ctx.fillText('Generiert mit Framework Radar 2026', 50, 710); + + // Trigger Download + const imageURL = exportCanvas.toDataURL('image/png'); + const downloadLink = document.createElement('a'); + downloadLink.href = imageURL; + downloadLink.download = 'framework-vergleich-chart-2026.png'; + document.body.appendChild(downloadLink); + downloadLink.click(); + document.body.removeChild(downloadLink); + } + + // Download CSV Function + function downloadCSV() { + const csvData = [ + ["Kriterium", "React", "Angular", "Vue.js", "Svelte"], + ["Typus", "UI Bibliothek", "Full Framework", "Progressives Framework", "Compiler Framework"], + ["Erstveroeffentlichung", "2013 (Meta)", "2016 (Google)", "2014 (Community)", "2016 (Rich Harris)"], + ["DOM Typ", "Virtual DOM", "Incremental / Signals", "Virtual DOM", "Direct DOM (No vDOM)"], + ["Lernkurve", "Mittel", "Steil", "Einfach", "Sehr Einfach"], + ["Bundle Size (kB)", "42", "120", "34", "2.5"], + ["Performance Score", "8.8", "8.2", "9.0", "9.8"], + ["Enterprise Readiness", "Sehr Hoch", "Branchenstandard", "Hoch", "Wachsend"] + ]; + + let csvContent = "data:text/csv;charset=utf-8,"; + csvData.forEach(row => { + csvContent += row.map(e => `"${e}"`).join(",") + "\n"; + }); + + const encodedUri = encodeURI(csvContent); + const link = document.createElement("a"); + link.setAttribute("href", encodedUri); + link.setAttribute("download", "framework_vergleich_matrix.csv"); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + + + \ No newline at end of file diff --git a/05_react/unterricht/tag37/03_import-es6/assets/img/defer_async.png b/05_react/unterricht/tag37/03_import-es6/assets/img/defer_async.png new file mode 100644 index 0000000000000000000000000000000000000000..d7bf77957e7ce1d46772888fb1d85dc08261305e GIT binary patch literal 58933 zcmdSBWmH>j+cub%wiMbzvEoqNy|}f-HO1ZCArLG`TZ+3ow793ZOL3>T2MU4UZb85F ze(#z2@yxTnS!;gGn*7MlzGUyq&b_bmIF2)+pOj@@VUl110DxC=vXZI*z>^#R;4#Vb z$EcJHAm{-A_zaMf{Gjf+u(yoiqdvVXet+1=6E8=fI&5x4_2LNz73pBk-q+ul>@LMc z;Np;Lx2^?$!rGacx@+xhUAxk9`Emt=D}wOnMQ<@b;G;dpc-`^Sd_|%Tb%Fh?hep?U zlPdJ*uj9sU2wb=Y8;4Tk2kzh*kf^$rGI+b)g954*s1GN#_0S;8{YB?#(R0+PfQKpr zKbZj0H=Z8iKl*@CYz&QmiUB^Sp#RU05U>A|@Lx0jqw4>|lFlD=3TtQcg!VC_#$5-6 zas-;q(rOKEAu8D+0)aIoh#tQ;fZUij|1=Q6xIBG#X0Df}B*Lzd^>b^mc9ZwZufvpL zo9--dipIUK#=faS={OxEOW%yI4cDIiV%$J-``|~@^-H_v6S>fng~Z(&yWuaT5?^=a zq!*tN-D@k4YI(rGq|AS(E9ld7e65mBl3_coPF{nasShTY=CBNE(~rJ%tltu~V<$Q|o{MlBaDcQc>u&RhgIQF^^Xasa2|Fd3U6Z$T?+E2C-`p17lwtwrXtZe!67(UPi z@9T(Y3m46@cP)tBHq$+l7F7K8w~G=I=6s7p%{0A&{U?cIQz6l@E(hVY0e6!~rO2d5 zkl~>A?U}mpH8F|LDlc09t^v+>4e|AbbJB=L>?#(gZlY+qH-Oits0`zG#=4sk;HXZ# z?D|(6Vt}`sk5Ju~?atKK<0CmlpXYN@Z(B;S$1^7C`u9R9NyyDzbR$^J3=vXxu3z91 zWFQyOCD;(R@N~TwtA2eJM{1EgT{!`(>XwU=oPO~M(dh5=zw1#VK)4YYJL>dc9B;UK z(~IMJfSSVq*2c*dC!&i0!H_UtH|npbTIgS--+2PMMNn0U=v1PIozkAEeaidL#lC{$ z3WEke(Rqhvq#4Q$ln%mP^!pi{+lj8mI=k9Dv>N_*K>2;P`x%nle$f&?UmxOlKN5~j zzVjGhY>u(?+E`cky;ih&Y%h$ECvJ2>{x&q^_oMJo?((jyFo|#Vyq4>q<<7GzxvUX@ zt|jYsevVXzayb2qYG{7Ie3`H0M$yl!;j8Dz-_L#@3~CbdVgmpOB{+?V7+upsVk@+E zzut%vIpl0hqEa|aeA8iGHe+kV2;Bj@JdKT#?8UPPLb5ruhrMK(-PXLQRQ9g;bx9a& zLOq!ii}rT&m7STaaAK#P=Oh;26Y_Kn{JOZlQ1mXUrX|m@G5@wb%vT;_4~qm&Ws3+R zcPUp` zyngtLHZD1U%L#vi*z3xk!Yp@_DwN&oxHL!>OYfbqR96O@27~*an9zi4bV5H~Mc!}S zwFi?83+qq-peq3QW0WU$Gq#I?o}M8psM>M5QiIAeHbL2dGUggxc0T@DaJwnxGL%}_ zsF{X=URhBR^6dR^bIP8vRJ57{O=Sz!mXB-0%3$jL*KC5>k)}UEF0q5;NAr5(Y~|J( zUspJ9YO554YT|A}&?Qt(tC}ykK0iU({!^Lu?8ktJqLf0eAVXYI*e6i8Yc`P;YizLP zQIw#7zWne-eH!gyX`w zhLr6}0*mI9B-XI~_Wce?)wU=cqXk12@_WVk2++)7j-eYNp z7u1FWchd;|%0WkdG*4TYBzq>L+MB!A-SM|Pd!@_xaDfqDdD+z`smQ0|M<`oDy%qS) zEiIPY_XdaG`p+(Mh*onI%KDx_K%2Zv`11E+2f%$vaLYM><^GlM`2J$g^lboWEgyef z=VNVZJ((rjL*Ge@*^dzP`oUyFr6yd>GZ8yvXhy2y0^rg5ilPzz)Ht3vm+W2MWtqy^D)P|<{%Vv2$MHWpnV%DD~Nt9gy z%Z8hO>SjkC*be6mgz9h0;V(KBBxS0v8E9em$4eQU>zxK6Mda+2rWQ3fcWtOlXI&Zn z2}&8?>LH>cb2LH-WkoQ-vp$@GV$9jPb+YdQvVVT04;DMRqEu3n;V(C;_q*#g5g>g9 z=;-Hj$+0`o-@tabTv=hfH>ii{Ykbjd6c{!dX6WWu!CQ8+Eh|2ruj+Xydr*G`AoL%e zB$8<7h4jLQ5Mx=w5XJ9tOuEc3gxalrWV3wunNHu=#i@OJr0U)AIIiD(^Mip|D0?LE zN)#C4L0O`!O)Y_++STYM{5*5F+s*R`=Lg_S5 z%)MLonU6{)tz~RKFn;``#i0l-Xj++!QjHJ6!-2b^0Tou;Y&~fX?5H2CJ%&$RJnkCR zf|+9Uch*4@>9WjfL8?I!;qOw-ti%K@3d-~U>~d7|JKlIZT?7YUP>geNg-#}oW^n)6 zd0IUZr2i|$5Q~wR<9mWs?2{FrrMDYM?FB?jgijm2l zU)!}tZd5-D)Oz`JKC-QC4f zJCV1oiT|K}^EgW^vkw~6wzma=x2-)5(_Ax`8L{i<$nx3GRCJyKj(ul~-#Q2^1rU`iagdZ$>eBW3>#LO?0&?pl2Yy^LckLNB>pn zVg`6g!8(r96L%`#!y3HPkU1H4z@f1~$}PrW8N2MqljhmMh}&GGTE? zMjI^TVoj%M@xTgM50xx&csUGdRIbDvcXUsy80tbJ7~;|e?#7lwy|XfE@)U*yG_=+f zY)21Q#F(#gX&>vX0^!46=Fi_wwu)Rclzm!W$ewR|3oQ?QbHcBwGrYHR8J4CM6~o(h zn*EBOEj62nIPdgT3iobFLc~x7^nUbWgtEQz0xbgm1Rx+&RaFKQ)tTN+o|tslUEye2 zALWvXvi_vf^;-=%V`-st?Ww~S8hQcI>Zaa)6p@p{@OVJ!#U?E=2z3}3mw8J#nf+=V0MQNf=SK$>6rOWlLCBZ+XOZ_-0i%sVKA-T;$dv@MT4tz zbUoLw^6td%8=?nl6R|_LUDgrkv>|;xS~Tl%)4M zjI{EgC}S&Us@G1r`I;`cH2?M+$)YT=5F`7%Su<>7noUr7eejiwgSoh@hM_B%5j*YL zP)p-me7$yTp!sH^ zRSv$2A2)9yPVHi@J_%xPWxuudamYbS+cuDW{`%xXh%W>y=_#+-CaQ*fr=CLUd~bj4 z=5R+-KwV zZg14Rc1BiOWpFC4uj|M()yq7rTB0Q4%Y8MwI;Ptab(SIUgNY;uw-d*(qudTox^XP` zwW?8F5ZtHLZuS6ekq?R;4ZI&E_h9Rn{cYzfSu38xS6*SeomB6KJZnyrBpSc~a6a)n zuby}`6q0wDY&8`7CMdDLD5|pd4o~jz{)W`Zdp<&^;*qq^@T3$&UTB2XjQf)o!uzYa z-i(u|A@GLi=Vp!uVa!7dwl|kO9z>Bk41I4@2M}cz;yTe)Bw*D+N9LmA>d9316}cp` z8E*AV9#cCQxug;;A{I6%&Jf))?Lp!FmeJ1>7As z;(WUNeh1;&Fy&1;X z%8>5)lyeL*w`7IceM??rx`t)y&9V!zcm@6s_Zte(jDm6E&OX|FLwEAl8&((&05EE( znKbPx4*P6F#hv#12ft6*t;zmd1wX{*X0jo7ZZ7~eXuEMZA8AYvk;hQgdM96#^XrS= zO$wKxamgejxn@5OpaNZH)ZCM>^wrU4Y%Ml4Lw9I)I}OX>=>b9r1ZPY^JukNRtRli~ zze%mK&-XHOq#5^FqhnSsPs(!J-ssawHHj{XcbTG2AKZ#ExEBN_o5dsL8zj{&hp)k; zVv92mk>+N-c}AlAYW9eZi)hRj@{kJ;UX@Ale2L`2U$(U}vB+nRZC{EKh53JS+>fRy zPjgGHzQ03R%p}KU zvU$vu92%`hd6mr}Hecm3>3>1aSX^G|S@A<~J+S4%-DcN^;$3iXG+le8dDJJ%eg5U{ z!q%}m@L5*ng^3tZhjdZ}m&vDAFRo)epU6KR%f5v-ZNeKGG2}Dx;28;{iW}>7-AfXT z_EN^BZ14!KN~#Nv%6dSqq{aOhupBvWmt}M(rE^SmIJmb|KUPzkfWar{-gY`(An~fT zkSg}fF`17c2C3_)yl!HGPbNX)KM`gN&4UUvjH%~<*}#e+Ub>HNMAV^f1$yC8p~o+j zwQu)(>h;^_>|dvkHwoyFGDlMgHLSe~{XA@| z=qMy_C~4(5lcgZfTDxOdYIaP&p{AhaXzPzp>?NO{?%RrKVW;FOM+?nMeAdAUgvZdf z4*qwl_T5IR_FRSG=~XPE544f%Y22F)@4@B~beV`}AMv((o05S?-=asmgr?I8W&JX0 z!Ob2~+jl(dMh(`#GKkd*LukvQ1`;wa%)ADF4*Oa}g`LP-r~oeEsW)}yi}m|mTPa7w zXTv)Duxd~F9BC_A15bp)Y0|XDoAAL~#4gAF0Q6!QM9fX)I=+X$@s{L;yPvnVAhWcu zq_V|mN;{+Lw>PQ%KlQWR$OE6mu7H=Oh)>N;%XcmfJJJZJvxa$*g^nCV|(piQpVGYO{g)b42|(`;&1o&$tnXWajZu1)GsMYhu7o`>iQNi zbwrOp8)Iey$D50PLr4hFkjS|GTeo-1J!n(;(}HH}4eXQTr(w%z_z+k+0+F?yhmcIb zV0w{#)4o!|C6U*hHnHY(;fsV$A2v;rfS>Wr@1A9D5D-w`INUmSv8Yuv3)+oFBw%p4 zRAvqOobbzAaI>vP{eBuw2#mtSU%VR|iUzZ`z}B@21jK0M&I{dX`D3R=BV087LF{S*QnvDw0%X?552!4)BWa*ehso9O4P(OMWC#Ig6+1n+0vsI$u zuc76Lf3BvsgAAAOlOfV%=WzCY1aSVdD(X4M$T5p`(k2feQsROt)Wx#VH3G$xgxSHG z-j)lsvxYoOe8YHrmd8H@MSR3dM=b|$Q`ed$E%o}*q@-~PcM~&D8N(3OI@|jq++T0s z95+0hXc>qq-KPH1Sp`3)V;y68meJJ`JFt#WUE~|s9P>pC$Z_Sls4R+U=COw$LZ!1# zc647%!(SJ!Z>2C+1%$Iym+Z~g-o%q<@2kwzy1rCT9c*W~sDOAM3aO;>uxI;C=LE*% zQi~>TJD>C`;1aSLz7;FKwnQYMX_6oM=2qgn7m~4*`0|%(6gF|i@P$W*gVA#>L7r@Z zh`AAx60h&Nr|88y5;L2lbE=O6%iu1;TfhDD_}rr=$Ia8+@WdN~YIkKJ0U~tM z*&|h+O>pWxILepP8x(EOe0y!A^sCD>wm><&eM^}W4C?w4@WJ!PBQB@sWa2+1e9HXS zr7**d-hodlCxpMO#C=$_3Jap}R^1E7#e-95IfB9V9%J@vK72)MWU&aTlT;l9 z#+X|xW%11Acv>_K`=|u1!V?w31<#kAF;gVU*L*Gvj~?xVn>U_(5( zp~%ak#gm+`v*DO6rSJ$10(gtxJDI*jni(PqtC2x`peChwT)VH@$`Beeq>Sp#Ud4qY zFB0Y8%(Y&S4pOqmUYne(!v-fPw!>Fqf0$P=KMi*5z zLAfy`(`nhV3l*fvjpgUAiROGzMA1bE@kX%!W3Fp%Sy%+bQd%cR-GczDXz%zVA5 zLX~-&Si=(HNx}~)F(@Cng(ZJ?Zs`S~o-+E5Ve7qqwlKB)oSkby!1?rc`)0ALH>t}0 zgL%)|2NL2biRDgtNu>*tDFIhU0>QNTfR;Lc+Z^Rv+{XZcc2wUL(}mvadS1oKx^29Y zpw3~SU${vHO`68~9d!}mY^rDhLcErBipxLwxVbgSb|)zR@Y7^-WyHzXOz;2>$@vm$ zZpN^ZSsyA*)y&$x5T!hO6JraMrB>rQ|8$cR)Wr=-RB2t91S=<-;x$hO29C9X{A$Mg zRQ#>M7woE*{@V=O1Gaa27T|+J%394iqdS>a>co8d;3j(-8KX8z0(wvqiL5PD{PK zt`o6)jHMue?v@WvF@Q;=E!AVnQEilGKUb7mT7PsFY1N0;698J~ud#o&U3Y8o*W|zfWI%Ukok42cRQXt!Or;ASL z%kFv-J{c0e`(leb*_jTK=&S%!iVSRah0LnXtdmcm_B0wejE5JxGa&m7tosPS?r1kl z(v5B@(2~;dP-9o=jC0WsahLCQMdAJehw#|hUGUDP&|e0C;ussnRIt0x7|CZ};o9{z zFCfb=`18o^7{XyvF@%A~H;K4`#%>U;}wTJg+ z`-9$xRtppMYb(9NY1ID26&&Y(l%sUNx-yR*cs7;rbuAp+I|DflQc;TK;jmXkMZTO!B78(U-dN`^!;R>bI+5- zussd6mdyMm2$~%TA_{ixFs0sB+Rbgo25|jd)}KT0)?0Q6YXev-@;>0%z8VcpCrL-w zIa#oLL2vd2=b75izoYcJI=ULW?TFtflSmGcs7+R(?{5Em#uFnV`3y(3MyZZeM?y4n*h7%W)Vc0#pZ*i ze~lpUDBxU5>VmXND7cnJrzgM`Wc(Q)@RIV8-rcmtZ*)Js8d-C0qGxIBj>M5`#IG~-fl)_cmU7>d*kZ@hfS!-7!RLY(WMsNW&}4EU2C|n?Lk+Y zWq3yE*m$0B`R4WRxMfa{gXq=`E)6V{nY4rj9cXr>rmxa9?~lIJxTt`-evHBVzK{fK zJmisejNri6#U+&--$b`3qKDI?7^Iqr*Jl9ZhUXBrEx2f8mCLF)c~FZj{Y%;}uDGXL zY_6+s&0s9QET@Q2&7xJUuMenBmM(a6yc-!dI*zluH|X>+ASrueJgQMr&_geg2T@*^ z+ecSuII&L*;QylHH zNtaD-2*XE~?BebAlodbUBVkK(5doPQ^k+-3IT7OtJu|*HH^!n*-w%_jz(-h}7=+(a zOdHY4>>Zg%{3O6jy-j>brgZnM(;0w7M5oLb`Dop)vgZcrG6QcRlMM16^Ul{aT( zsuv6g?Hp6<`{)2^_G5R#2Cfd`-7*866<}}pt%ZP{1(_iBXey+)w?$VK2AsenJ{&J{ zt{u;50&pEFT1Wh_Ngl1)a5&mA9#^88w5KrNe6$vCYB@h5f72E}$Qk%@w%@EfS9(VE zW4WD<6ckC9l#mU7TtzI`lu>BdOV^urQsj$QdbY%2^|sx32W02z>m*E zoxJzbGU}KUu&hsGqrf8$?btKGaz5ps79=3*`H@=YI z!n<4ucJWs@voH4sq{W|PkyjWN`i);z{dB?QZBW*X*&D)rV@I=|7h|dQ%f;}vacPjz z!W8uJ<618^e})CiT0~^Fh^wh*S1<4s;uq@Tu$I6AmDQS2Ddrdzc5hKCc8BE;CxYBa zh$Z9k%5y^U*vc9XE2B`PmNgdkVf}#IFUezkR+7-UC~H3*5!NVDDWpF0@`!!mJUpS! zoVqv^&OKq_;z|&omr0k8Ip=YUaR^!eY4mRzMGB#OfqD9qP;^U7ihJJ&#~RlhddUL{t1f}5I?dV_Y?eOxG=RL93Oz2+2WuQB@2 zTD>f65o*rsQOwR)F~m95+ZCncUr!;Jqasf3ns|_vy?wKg889jSMo-jLykxQEzFDZU z*>O?-uBN=i4wiauc9%gX)VScq2^>u+oxaMtP6{))IOka4Fu0vt7jO9mQ%`I*JC!ja zU%p35hX;zI_nTL&LsIxu(lPv43g0! z`91)yqpKb8qAaln0jr=w?xG>|_3syGC}@=%4~#e-W}vN9;+MOb!gWqp_M|5i0R7h& zPh>u6`W9;-$@ADIpE+?Zqg(sV z=k5pIr?k0(t5G+8d=3j17~@oy0ieb`YmYc@htaNs&23v}+}UP^r4`Po+a5X)AoMa8 z4~pnPF7C$o_E)giREbOQ37$@@Kh95X=N*~sxKL{Ic2x8Mf{YZ zFmFr|IOS|L0CUK8AMwl?5bZZ>(TmM4;`fL@MLqA8qB^I8e!S5%@(@4SE*(f^x^Umv zu*}J%3;dly?*>#;nf094e z!c4bb)ibMqsRTP{Z#x?NJdFk5Od#4;@Wti7soC^c3PN-;DhV8xb&GQnXM4459v+(3 z5xgH3o^(sjNN91JKXDpKFVTVyT39JN`&1(B|QH) z!TFDfRq1{wO;YAQrs};TOy?;)r=)ALwG;*3z|PeoSg-CX96&!Y zzW;y_=F?dhSK+r&RZxyHoKoFph5 zq*mYPUM{DeCYv=YRz$c+);{H-sw^?;h&F&VCV(DG1a2coza6)W+A&-DWqn)QwCy7Q zWrP$q)vU~J@XlY~G-F)c`XnJWzEH9KG8p^razumDenm^yeGX4j6l$XA^YLFU$w5D1 zA&P9Djlqt^!@q5#HInk|q-iM1Y1z}RW?aTy*XU|7e0h{HvU9pZaGcq%FKk*_L4{x? zp2tj*^<*J!0Y24nK_Yxi=w5S*{JAm^e`5p633aqW<_wUVyYpZVudPqCre#>uMmJL~ zQ;+#3e0??vPf{>qG~*DyIcP~=Iux$2)6Y8h#k9$*f_X=f_sFz+o?-hNxm#HJTqh6( zJX|FVb@z4JB@_76-VgZuEqPYqXF>qZV$N&I6=Hyf7=P!ERYlZ-;pwd;UNLf!0iEQ@ zVZ`c&Hgb$)K83jZoD39_imfba8&XwhlV=*d^rL0TBrxP}49#whWOXu|bueTy!UgK8 zfY27tt!B26NY=asN;$T?rJ&gxpgq;Te*yv6aj7zO!$EBF6c=JNg5`!aZD+(np3V^5 z9dAS*o!wDpI6EW3FN2p0w;|^kK|DB?mi%T6->jYJMc8}Xjss`G;_Ha*oVbL8!CcaP z$_ifLes)Y(LI?OW|mEe($Q56!fEBA#n|*|2t2 zE^b-M*C^KWb}tE19*ngo9CNxsYA61>IAHtE%J6Pks+v7BQH-kJKBh*Vue$c#-t}Gp z;mSN*nZDe%WH+fg!c46VjFdbs+MLU3>7D zOE9xFon!0&b|3sn&q&D;?dIbl$Y1X?N#l)we0ue|6SOt*CyK+M;a^mlIiImn)2pr$ z@|!RBtG}%-zeizCQ|rKC6v)!5bJE)9*S3~6`YV-9VEy3o|q7!7Ly=?I0jR1RGPpd884DW1tdpT&ZH{7(y`^9V2a=VbP z91rV^>OY9tZRxKmRxsR%*+v(B7O+^#<_{KD`AMZ6$R6|ZgS)AN%hJJT@Dcu^}KmVAR)hwv78-vPj_YWI3ce0i4v#Wxq+*Szgpw#9>u+e zOpa^ZN#`v9fRS zl6N-cI?3j>{jzIfImsc}9BRvUup%gO_nH9zXT0w_!DY`0NSb~A`QS{UIqX#cO5*4lMWAlRZ#>TbCGerx280 zG)^&N>w4d*WMZ;eKP?p4)7Lsg`WHIf*G03%czycpSD{&3SbX43)2!|IWKG zJj%{^*#$&KZ}kL;;)CtlisJYwEZG95YO>1&%Q|m#1^azj)X@f%TJ>Wu<@9sIw*=G; zPS?^F<6{NPl=RtuxT7O48H-$vma_Mir9kW5(?py038J-B?&YYHs2yB7|6?Qlpm%yYd{ z!7MS!>^HMj2~RNdUB{Zf9tp_9-tTy9jMBkbu!;Z20WYPX$wbaPllQCYq(iUENSZ0% zbJF|)4VHRM=1YzHw89zZ^aVJm_)KBupw`zvS6IG8DN4C;;MM*P+#o$8S8}@nOCbGK z3Az>2fbVtXZ8wwF!&>1=x)2j=d86VL29NL-E$r1Jfblnr7XB4R-iu1o~IVT7hJ#}E$n3+lgIA) z+iZ3i@-yGFH^1=v^MPM-RRcZ3CCmkgVCHvHAksyd6UK}!5`Mj|Ll&4Iy7TSX~HSMWq}pZCN~+sd9%7fEaDGFWe#rrLB`s2&44LXH<# z)Xx)-MIPhQJBb#Ah=KiTI9ovLHq?l0cy_E#W^CUhTki_ng)145+)` z^?Y#fX=zIZO%E{hT!+buEpT{)KBpsaDM9fIHBDsh5le$pU!-$c?H7+*9}-zLV3(u! zd%a`~vmn$!^2{u~UDWj&Llo~CE7bZ!f9TF|DV0XLLmk9#E}6jTYzHYbj=4(yRl?7h z54T6EnO1TRh1Z!TPb0=s{E;<76-^*b(>xUiza3u>N?))W%5kdYt!wSOciVaoLy36O zlZKOxk*UN+XO32EOb&F*_1rc);af+iSf8n@Td1GzVOelBg!UVxg zok;jh=!q7siLlG;V^GYOALGWTof=nx{7B0vJsj^BOymkLJOO;hp=B9ba454hI%ulC|0C1+$qdCf6K>cxv=ptjuH_!KB0U`5 z_gCp1>T+83HgpSsLG6pl53>3r52#HE^x-BGvlJ1;-WX&1BDJBSU^eC84KhrINmjzI zx}PI`%I+X4e9W4AY_*AZ*yYPkf67PiFT;-R! zaH3|22%@R}{`%WhMf1VczeFq#p@H~%$*zA#=F=N@ACv^=K|gtRUc5{PG=@gZMSr|? z7cF*Mkdwc1>bhsb&=U+fNknUXCpcs4LOJl%9z=5a$}_+YMEX)3@o+csz+$#0WfsBHf{j|y&v_hdcfX_k*cd46WMd->&_z8M zKF7R2NacfhBasjF7p>`UhUKz^><%`FEd!#(-fk7>C6V>t~@JW+iG&4rtXE`7!_ zPFejz(wGH2t@EKgn>8wC#db@yuaNR)42#UJZab$1w2@3dholuN+Z zZLWe9d(+L1jjecGejDhf@6f-}s;>==?!bn}q8Eaa+G2vT{PsE;rkMWacWu^lBsGco zEnp5!Ng9;!lG9zHzJlSjL?%Ag`lP+3wsvSdCjG#Bl5t%Tv$r?apc(8Uy2P*E4j>Ht z&F{T`rr^qVbkyp3wFh2G{FaK>z8=fQ?hgs!wkr={#;Tt(ZDxg>Gk=?5xC`~Z% zJFaxnvkazDYofGw16lF8U1JO=f+4O;Mel61S*i(G?-UZK z!4~TcJ1uHWnRhV9NS3JfeAy^d=DSYtfK?ghAYw{Eym^fAYw3`8M!jq2%sgU^%k;%z zbq09YrHOEvnlfrPgC33xb6IhC*`v7a^MWPk+A;S$=_uk2^J1rbXCo-%L!QHr0&E>Q za59TuaNu;!(YLoJ&1roJYDl@u6Kkbm_ixI&K*WK-u@lTM%ZHBG?eA99lF~{-^l3zL zh5k(C=ogPaVPlyq!;=Mu(k{un6%5zj!S=-onchr{DZNUQl8RGV+LOACp_!VRV+K~u zZgupgWeGojBfS0l4r=!!N$4!kmI}C^GVX4ToPKLMK@zu)A{>`dN} z*Un{wTMVy7eE9%*wqn)2A;n?T#y(8RG1<*JJ)@XUP@2ka`+FdhYjy~|2R61JqAY!h zb|N(MI(F={QbpW_lZC3tB~IVGOnff0rOhA9akyW1d_Zy2IQe-u#zDSN?HIJJ;z!xq zZ-8)%9<%nQ! z<_`WYjcEHQs>};}5l*PO&#Xz&xvnq$a*}K;Fj7&e~KT_~XAgxc3A2N|j*KwU4@-+~hKkXNbt~uByBP=ei z&6>T_u7YRJ)DTC=dkA9r_fEV)ro@9+ycA~_Xm57p))y6YT^Fn`7u_Xd{MI~~T-wB3 z+PK&0cx1EQYdcxfaCS-h! zg2@B4p%%O1T~Wx9wiMuVfq8JYeLKEYJ|HKoJ#M;j_*U1&y?w(a3k4^Y;6eRuY+!29 zcU5IquQhxBl5{9PkkDMgOks4kIR)}vn=bJon6w}UN~ux==?wR_XuGLfR@~;=y~w=L zxzE-<7ZH?8pq$icNL`Rmr3$#5{qiqsLxHq^KGB76_N95zLNiKposDPs9ps;`MglbpBqH69cq zu2hj7K&ZrCe@Jg-a^a{nD$RTNI$N%dTH~4#;zZDF*fZ!IL714{Po1V8DVDU+sYc9w!wK1d`+yM!^#(D%r2S6R$n*x7?;rmYK=q|?c_&D5Au_gS4>F?vq%Cqu{Bz*k9Zr;l0q9cx7q=`B$UR+030nP6jPH!)H#fGO zblwDHeRL@ z(y2P?lB&n6@#VK|9muj~BC}OTYjl@Re`m?*_1usE01+UR6YX|*()(z31n>SBYOPL) zdRtL)Cn0yl$*_K$lEI!qav}&eoshpypgm>^u7T(JqeR;R?eoPC;D15@-@keBfHZUQ z_pkW*V2a}9>m55=UvYAy=<^05CNoKga+Fk!U}Ix>2GTHBy!%gp;QVXk{vR1?wl~Gu z5y64uCQl}FFt0ZmsfYYP4MjL$F8eN6zfkrCwWFYX6s~3{At8#7XDv6dn@h!OKMAgV zL0IRFy*fNJDSm@+E=xoY@yg}jywg}HR{rXr#X$IFe2_YANjyX+bT@>PoA_^C4UOMj z(ceO&w>>!|R>msI(OQ7X3b;XS7B z9XhN(L;m&>V2s~Ex&P=N5*2m!Pw?a4i;Jt|DzTEH9?vwDgJa?hSE18 z>~DurnhN5YwRR7fFB$=AumFhvYmL)nyy!rF`G@RAW&Cd=fBz#^_`fFn*Np$T$^X9O zZw9uKzr7eGkiPJgxeM!!b8)9G_3T76ME_A}?-)ZXvXRWR=9I(M(1@-VE|T<_aUYh^ zs+er0z%{26;~tg0y-X53ntZ?B1Cjps_Esa38tp|6gH@j5vq_eCV^fKs|)xk0^wjxIHB&_RAcN2JiA{e@<*xaZ#oEtU-j;6HZK% z-}I>FWyD8loq)XRBM^T=T$0)h$6IPFo@8t_(-AD=#s-hmgt^JVZQC8~qin-Ob! zSme4WzxS^;B;rkkq~~raB{cn-Aacn|1?yowBD82yOWg2sPhCsAb98IFL>E0x=>I6K zkKq)+TAKGEKJFz)8|M&mI%(#^o6(C1)zAr?3+BSw#V}t^5T0?$N2k9ndC8^s_}N*cPbC(E_vycp#x=hQ zbK51S|mKt$P}|Xh8Mk`xAA`%5!b96>?%>ypsjo}BjBbK^|+rdO+Ti2|IafF0Fjvf zzQ|fAD!>`JKa1XO-d5B{EkZ^hW}K=Ya2Ox^hp?ylOs+Tk#S4mIVw7oobI0P$h}`** zP7NTlL|#@(tW|=aSEcSnMGXg8f~f)$kXak`OdQq@<2Q??!HeUeE61dHcj=AFGFTCn zPd>-8IZJ%Lsy|6h^W%oi-I%gpOfFd*-RZbpK}&Zd*c+jeXLpsAGe52-VMwIt`IiAk ziZdQJHBp*ADbQalL?qyo;}OKV%?~Fu>{CJ){9D%j@}6L(5B2GHDeV-pskbK1dsI*O z>`)}2qIEw!(mANNnMONu(_(peSjpeTOLqp3NhkqQ1e!eo9sY=4~UdGH%AM29hvZxl3N483d z#WQh#_BcxjbMkPyJ%hbUO(Hf+75kVbrobIN{sdjMG+cwyCCP6`#3e(I)d24?O=Ol* z3UlN`63|oNbks2-Xg z?SV}?osRQ1u|BN}b6;K}@UGN3*0{mwyN}lQYFr)*-xkE?J^B3Q|ss_u@V4|`rOBX0giPDc>M z2aVUAJ7pGGAG5zTJk-W)PD)1{X`iP`S2-94@Oqc5z>_X5RT=gi^?Z#sSqG(W5z z2-Wh!vr8Ebn5Ji_(;qBpNy~T__;tM@`sRIWx_*7hmbHRye6w1V5{-qdA_j|hHgmNO zq~3H*MTpp~`-!h*{|gsfOA_stQWB2 z<2(H@`8QgX6+a1Uojoq;|nBosFMYwC>U&MWhx{eJc6nA)W=wO8$a5btXf*=MGB zH8y^>mMz@wx^8a#5TK*M%I{4`&V=7EGtgQZ1MSlH0#U@56r^bZMOWSJt8Xw zRPCgmX^2T(W`YknS<29Opm|F=<#}YJFmDN;Y+iyuc8!!+{-XWi!^n2#+2eKE*lv1D z>z6`@oo&RDix1}WO`)MHxnDj^3^)6LBbeRiSFSaZD`;cUlSGRMR~9|zT+B;{CX|=5 zjeMJx``pTvl7%Zc=6&zQ;K_WC%8+2;_ktV z6nA%uySo>6_W;2yIKc_w&-=aKxjN&&J2xk}$r#Db$j(@6&AHcn=CjS#r1vW2qY5w2 z`8)SNmaN1z3rpk-W*7xU~)g+EH1lfIF#9wgJ->MmmU(Ce@nZ# zoYczELXGU!-O4V=h`JO=(|wVe5b9mB{}nivGwGd-0ha#eVh2xNxSVN z_0bY>DRPd)3?>L=SUSb1D`%0OiO~Ux!DZ4BLbW+K&GD8X6*7&apgc4hpbZ?P6RO_w zRH5r<91e~>uIFM`Z_`dEp-vsTLni}N8ujm5bMk3@WpQ^u(A<;SiACsf{rb`|1Zq-g zZuY>}7-&lo$K{0mrv6T+^3&iknzHV_vC;P9u>K&E#3@@+yB)5pD(k3OKHSgp0~c*< z$#Wf64RZ`QO8LlD9e-?lFV^l;>glep#6!QUv0`F*lpWD`puLMU0u7YN-;V|T zfQ2Zw(qea3_V;eTUq@V~6e0VROuE~((D%ktGWhkY91JW*C;U73T=&VAZsxnaQ4-Oo zxXFl5eF6YEdC}D(vEd}g#dpqV=qI0-7KF(rajNn@acox@JsOx`jI76`B>bR2MnCO1 zm$}EDx0Kr*0}AbfVF`bb{m#Eww&zyjjj2Xg{yJY*(B6-ys14o zc?Ke9kEj|h2o;pZHX*SC$uz(t^LLVqEo@owD*=3sOyBi4@gH?2`4XwwI*iYZS!N%q z9JI9)3}&^vNw zI(u9zl!9bNwlp$RQ3Suzkr60W4pyq=!Y$QrX!-PkwSM%nR@59@vQns5;!X-^MFLG*sTABZQgUo3P}rKWb_l^Y1>3vjWZ79}6bCu8VE~vJvd1 z>39UYgJIG8UJXubo@HGZt+FyFycSNk;_Ph!GG+?#9~IXim3iFwmp>Y2&$N=ZIeO$- z^1)^W;La$Cg!KV5L=T$4m@nyzK|v)P&8 zi|yi%@QW_4mHhciSDG?{vL(l4Yjh23`=*-i-+qcB@1@^UoJ8$h0^fHAu9LPxU=c_B}9FBXf(86-x1fQ>uzbOjDsq_QJ{ZpA!An_W1WNFkwH(1fRDqn^9 zO;0fQ{5k47Kq$0Od@DNXIh@Smc}jf%J`-~~OuW8@@Bqxf<->$3l{yH!MP|C4;D&-C z#MRcyAm(xN!N>R)FBW-a3gxfi`@ZZ$FDIj)xjkKb_XhuD!};Z*0<4ucQdN2BP%uuW`D0=_>r%kQIKB}=<%+!`DjrcTT`A@5sNcFw<29r!G$Y$ zyZ^~?#w8-9R@&>=xwR+D_Zcc1+A&o*{ep-v0_>C`l_K*dES|V~yFSMh_O{|xQrr7Q zwE_O<7ELBD*x%0?Y|I?T$A*~E?gNLVJE#k3=tO^l3gijqV*QI``I{CMQU*NbJU%)l zN8Z1F;lx&!x}>+(9eZQxsM4GlP8av-M%tP?`L-;3pGHm#^pty~&Y}}1ATU}yf4Nb^ zLmvts1UhzJK6%=u(4w>_J&aIgpCXQza=bmmyhU@qyKg^GyPCFJ%)Tr5m+Wx%e4yre z7KzSpvrx;9u=__(!2e!`R|zGy*MXgaiBNMbT;uPqgBh z!v^tLDZ?GC3SG74(5<4?;Q?MCYX(gHWGt7J@HD3~yYAJxqhXi0W&8exJr-!d^QpnI zqw{%1&=(Hy{p#!GB=S=uoHfdB?3Pm)s!jXX6C-e7XN*iqLlzrkFf^pNUhZIUI@`6H+Q*@u6UH0#T`P{M!-y|adT zS!-|T2;oUtBDPI;Tb{BjIl7%qv83d#g{pjHn4wAf-op%=BoiuX=~=oKv$ zt&3&9OuCWX3)M%VYDYE5D&C@{08|D|Z2_S0bsyAEcc! zE=TgG-kq!BGCEjVQw(&w{_!?}xWsUfUknZO(s<{+Yc9z~0|U^K=LU8j z)_7c;xYbgoKkbd^*}U3Ea4xH4a6XZFukNXSgS%mD=QM|C(bV9ob8oIzxCT>Nb~^sq zNdawZMWo4!>oJp^L(|z>GG0LpuWQhuV{&C`ow=67W~|;L4Cr;EU|3RSSCG~uINJc4 z4{Cm&XkLam8nx4W@YK@lyLY0nqnGUp5SOE!hNvh&<5NekTI8-tbNW0-qnzvjHI2+!8LSrZNa(``~M`n z*7;dVyRfmP6?Mk_;KzgWkFE-RJTL682is>3D zwPdt!<6Z*imFRsgGU~qhSyGupsXJ2`JhN2glf9#F4)*m}WG9=`?#WxYR;y;rz80FX ztwna?{5?&8hQSF*lX*`?QfTH#d^60Dx5)@2nBd8iz0A=yMF9#dSVXg^l)-#%z}*HCCVr z(Kt_s+&j(Ybv_shg%*N;-&3nTgtBolrI#s90dJ4_lpwr{c)ENR>k~j8%aon9iAW=; z3pGz>;3SO-XEmB{Q>*J1@fQ02YNO_WP9TFX-5%rAB{#;V`M;zU%L%_KDM&3NJ3aLi2ZbprpoFj7=H7GNcdu$PyP|2NUn99`hdKH) zNY|Wa)KqAAMlDbwk@w56iLFK(dvy*==;tD~ejXVK4<9qudgJ`;Np{3=37eE=t7@JI z@52Y{gGdk6&!DBJm~R$fUYi6re!RMa4!?)6NBBjbT#km9k$`W1-cQN5M_=-DLSk;$ zz(Q6<^7!>K_&H{mJ1CBlowWg#N!KGO=6-ZP8uUHzokGjXE6ogENrFF2fJ~!DE0kTs zcnenez7{pDC#M&yQkxm~UGNuK{T4`Tv+iBPMv6G!MhB{6E3!C-;t7h{b2a#RK^sx%&)sDl_B~iqu={fCd~c{dOjqi z3i({Mjp9$TTE0E&KW$7Qa`kP$uA6NzI9~D_wlO^BQ&A2Iuy?U&GriTVA{Z3@YV>Ot zP3IuoZcRB9_Ng+#VwTO}6N}CmZ0(CKB<|txX$39Xo0Ega_I}`zbG4R*L%CvFd_1!Y zba}&Uc2xe(D5aMKq9PwUN@9{61Ad@_<4hsOdGSyh}s@g5vN%Zmy}8B`eyTzCVoS8`nv z3?%V7x)Bb7QqMr7UeU=VGoC)Udw*@cSB9-HH ztpyQuk^5TPtn;B@b_xqWUbh@(0C3lrvLHw<6`*@J*K1IhACYlnX6E5(8&?R0*>#-H z5fr6&Bs!|1t(3370L;xVblrks!SUOTUf-gN`dnI4(Mls^Cp7DRJW|Z5%uF}<*sOo@pG4U^<*mRSyLY;*@dRGkMFzMSU5vW#LOT)(?>#;QDj3at z*xD59NEn-9W%CUb@(EN&!P`x)qpzwx_nrZz$KJ|1HOt~C`~F}oE#doFOpyGCGgVWY zUunJDHiD*MSNZi1BZ|U`dK(Z2-AR6~Tn4*n&U>8GXTW@m(X=fM!Zk&p*zRk8ivebK zraUqF+GU(JX=p}C8mAU-b%mNyT}jbGG`TX6fG2%FwMH|QyIUhs!!hiJtlzm>MkP7@ zE1&rNasjygW9<=nrKj)T>C&MzU#=b8R`kn)b;}t%IK5^`*`-RXQomchA zQc2z)@rpHh9h532nEWpd4IM^})2FeO61&Y(9kx_J5W`gva+)pFmmCIat-GJ@UpFFx z{c_}Z(#P*;MvLk80OpBaBL%EaGI1o%BNtEcz!rJ2L0}7kc<)E;BfeeDJ&Zs>(P(`r z{eFczF+4#f#@=V-NuLNy6>Hq+jLzY5F4kLtM_FQ2p6Pp5;4@#FA-%Do?)jvudEb{r-RPi#A+{tM|?9V-ucNji*(_^o*gp%k9PpWe`(R zuPj_)O9|&KVCeFd8^xg-#D?x>9aS>7@6Tw#xe+LY&{_<7M6#K=e4N`T)$k+ZBBtpv zv1u=IqyU=8WI}T>{`ZNx1ikdL63Ekj{IXFg;rSOq#j0=s?GFM=smJ}kmeAt+?~Dca z%>{Uz@lbwCQgr~JG@n0|xm6g;FvfCt%PIeWGP=gXir_w=bN5wN#&Z%Nwf+Zmg3j^{ z560ygOkdrjHN%h5EFn$713KE*hdN^xhDXOw>Qb+fERutqqdp%EHl)%azGXrV-f>^c zTO`SfWo(IJJ;kim+go3OnyQlA9-0m>0>1Q&0`J8rOgB;<(z2Vk(@TBQR(2^C zs&PSaIOHS_A8-|))LcXRnqvufVB^nsZR}lV^jsS46q#S|FAYxg^#z3h7YXS6dGI2V zNxKE)WtN)t4dqtUL8nyHtiNDU29&$OXChxkK|kj?!85e+ay&*`w_BgsFctDkv3o}Y6J!G*nY%f9hze{ll$?Kyp7;)x6#ZD5BR zptH_n)~Qf9)$MuRItk&k*{P0?;N?<$s))#2qniR|!rhu^;UmG5ArMJ+Ll-lk$)^bb;MY*cg6oR?^(K5fDZtBR5piq79& z(%sA^@SSgUsl%qa=XwSm6@<-z{eVLI6xtVjM&YJ4Y^WR_N3&yn6u=FKC~kiSwtITF zs%pCPgzbyUWzUh5{6as47QcNLlC1=)886JI49BL}zR!i2XM(#BEZz=)!PNXT zx0RjdZ?C$J1ItxT(2D^g=Z@yIUz3)6F1%2Nl@duZ*5`ASLdB%jT5*7jgyb zUm*8PVL#=VK};0v(}s4myRcJ38YBDDQmNA$w}bSsGR zday2j$aMzXL`V%7Kf{CGuyP)VK}C32pJN*zD6ta}1b6aXF7l7&Dr6k}IHbO=Smbl)-@-*AWW>eQr{x#; z{sro$op$e9lr9}P>2H~r`8Sv~$Q~W4i|}4&_oo|bZg9OmUkWYb59IWGX>zd<;moQv zIo@s|e|(@tL3|)BpeIIVQRjK@1Bog2hxSTORFvL@b{<~xCi=6h3lW2Kzv#qhbA18n=;tM+c7+b-vl6EJh`Wf=K&>js$ocryZtJ7!bgWo16UMF)i$f*=PvWk(e-zXPU|hPG zi@uS*U$AzFd?<6jSNI)%@)9YK*Z7yjtSy55PTHgES@f!IGO8%73YjrudU3eKO9EPi(ew*&=>&xFq6DbXtrSe0EI`!1`g@MfJ&D<^k-M3@vsOqK1MD96}m zl)ZSd&3MRckl11p-f2hTac)&IDQHIGW~a=5SfQKP{kpV&rtGh#PMMdNQ;)zctq#)= z=!J16cJR-iH<|S{iKwQQ9Yi-laW}B6fE7Inyt=vYJ)?^q=?ex6D~I{^MManbWv1hN zJz6sPi+|iRijrjOB%@vUEY37EEl{Xxe?QbA^A8h}A%xaVN|;SrW@Z#@da7zw5EZWo zAx#>QY%7PuCmQk`SX88mTRG3yE~PgU*$VXFxoGCfGHAl<7tJ?2yCt<|T0lGtRO9WA zr41U7!2)a8DVDxIQU>yQw#gdRq*(_UBO@M&S#I9HsC<9*Uk3?ty!|I~A|L-(-N^s- zjsMr7|3CTU?=rmcQ9k&zB>DD_|2g#+x}*v4uCA_YqL2S^nnYwBYuOYjNE!lbB$o(& zkG_uN{10;U{|SEeMNEd|KYo|rj1ky>f*LCtn^jgjDYYZNU#gH=kk^>mn>LppSx{A!n8ocopYhn}8t0am|bXzsr)v?txR7ozKS1ZNRW&2;lN`!2oE^KJ>* z(ZJ-0=}98gw)zHQsb1splXNBo3a=9he0@(+K8X2Yhi;o+kKp;u&09STAV*8wny{7n zJOd8rparb=eCw4imU%rY^5@x`e3QX5tcRXxXNCKJCmST+jMnH-8+8Kr=g2_E>@%P9 zDZg#M-HJ}`(sqhHDpID=zbx{YdeAZc_wb4hEc3q}jX%6n zZ_=51ZCj;74+UWxgfrP!EVXbh<&L4A$^0MjnBH1Hd-VgtCR|5OD=Q}tuYFTonQ|RuS;s1J< zQdJ6`5YX}~;7URHYU@NHg7F>XO>?>8|J)D2{_Quew!-hs`VRj)V}2CA{ohxgzo)Px8ecgSJFhpnJ`jk*{1Gyd=G8|)Le zhl>!yg%rd#GUN1JiCzvz`}bkbHeaQq?Ih-%8v4FPTwB3(Se%{NYnj) z){5o_9yVPyyTy+@cv*(w`Xiu|8Qpz?l7MrL^Xn^vPxbE!vah~|u2#x=e=AvENQVm} z7&~7O63>GoX5QXZX3*ZcX^+Fx*^AKWD0J7py+KEQ#1Wq9 z-HaX8*uIt0 z^85c1gZ8M!ag9E8757Ri8v*{}QV5?{ld^sRf4^Z8FQ@e37+)DgMkphy+G*hQ#r}nB z@m?3wRXRJtydrI7Bo@H;B20p@u@IW4$W1`6pJ+2LMh4H`^vOK;l0lo)^gh zY`tpt67q@z=zzKNzcemC^JYl45LHTH(uf?zouZBBQbtv;*DNL1w1=5TOWZ>spJ>kX z&RNTWAAjwyg>C*rsQn9h+fr!VWKp7}mG^;h<}O`VnZ~ATc*ah2JaD{5!>f*C9_k0Z zI#y{@fY?+?H^5LNYv~UUwues^Tt_zuC$q0y52zUC88ZIabL6hsv9NLy6CZv~gUM$5maU5Q%iiO{_SD!k^s08(*|WHwpeHlK zuGZcE!9E0<1@wgraaglb2PShZ}}$Y7HYPLSm9WrBYjapHRTH$~K5rp50^6*W@!KH=9CT)lO9&jJs+G~?E`WTfH5uq15{yIV* zoU+-+-(nF=!Q&BIe{soIe|0wfJva1ApX)_>-y#X8fCsc)v*Jg&bXd_kOM1sQaYPNR zOrm>rD`c;|yoxB?dqeWsWpS${Yhv#iw1b$0W*9>=X5!8{m{`+`N3eB8qBxBl%XyR&)N=NGUETE6XS=RU4kx3ge z{OcsBC$B4+iy_ff!9`*Snt8+%gR5r8p2%X8g58(#=rqt9QrqW_Q3RQ==on~KZ!ZS= z^z%4{lNkraFeJmt=B$&uwoKNT{&~RkDMdbW0+*^`Vz?{;nesH=u$Tn;Wcc>btt zx65!@cl(X8hK(@d^C&3KK8%Q~CKZnD^P6U)LMm!l`^?Algqa3=e%SWf&gWsWP^B?NTRkch(3Lj63xIQ69IQbX&lMIrz zZWMHb?3vpZtYBdlYeK0%3m34VEjtZ4(zlAN+?fOYciQP0%&aP^nb}iy`zf7ijoS~eKFgv;pL-fV8H)np<1o3OD2)!tUa@R*)P^OB z=wf;x0c1V62^qzOU)O&~sFJ9XBnNsttYL{N91LoyujFQPMV%!h?OS%#l!?gwaRn$u z)bm|5a)5lG1WV^9IiLFyOOO7`^nLSsx+sPPW4Z|oO1YPYkZET)3{Q@0)1C2{y9g`^ ziLGkS42kU9g*K$Hp8|Xb*55NjE{%jH%V^jmrdWE814kwm@>|S2Dn`0K18z_dHuX(~ z_2K3_k%YEbT38Yd9d_w5%=4Z_oDJ{gHve|AU?hBHpNVrNxZw7e+|89KMNdxBXplvb zMZ^N=TT!2b6#mA_9AZMPhJGMjf7yM5tcW@I<3}!&ieqJ>D1|JN#Gf$=Eom@}s#6QK z{=!kA1$FJFPK`AgLLrWw$Sbl}-pUcqAIbprZVb{!^$O(l^RZbSKTq3CJF;l|-FzD@ z+_J4|rC*0!yQywdc^{QnS)UQz4Y_Hhgx|EIz$&m4`ffp0)lv`MxqcrDeF1k83tHCR zn6&d^`3eb8e$v8)MWNDY_Jbn1%r64bvkwEZH2pR+JcV2mGDX6kgYVfLuJsd>qFQ|n z)YYt4gG`(_&>jwNNLMhM+!>$y|Bfo)f3p2qVb~Q|<3Z^{`UC>y~3!Beb`Q ztMZor>@Y;UEp(~3_ff6{{o5RhMPJeip^U-?QI>67Y2yI%toNQGZ{2Y1LOv#Bq-Ix= zqCseX(6#;&FW$D3qSMuDP#!aVu;VpxH+ z+B5Z{J{j?eJBt~4nZ$g}3mTL3S&f$_d?!my@iK4Mq~g5O>+^HfRv&>tMMD9TKaQ?Z zS9Ao8Zdp8eA=wOLZPMC0+wMy7l|z|S&VSGiGmWhLj-HYQywM*nP4gA-3Ke42x9Y2F zDS_8yx5KY4wiE)SQ7v0eqv-I-atrqlcK1SxV8lXY@i&oO1_k5t22JdOYxBA}VS4;} zBMn72Nl$gEUI(4!B{*-|dSSN&lV>Ak@A=cDXXCgkfQbYPmbi@zQBNqmP1bybAlq{@ zVAT9>`G_`Bpuw@)yQpHI+1QouCh6)UHjlNAP~d!S+=2z2xZ@$#W;${n(+8wS(Ok~j@@WsDa=69R9a!of$ zD9Tjx@In9ARSiphof^BMTM?;&3e+>sqL*swQt6L;D{3u$|0x`b^iUQ64M9s#ChEPX z`kfaTV_=5Y(}*7lX<&lsx1DG!v4S)&J|Vw%8UULVMnS=jJuMECycJjJq+O{vy;1yY$`F}tRoD0OuZy`}Dq9=QEsoTh_ssX#m7?=KU;9TxJJ*eya5AwIX%9)}IzBhfN zN~0P#B{?@{I86RdGoNiHC!-w;v`v)WdjO@Hj*!_vHcj8w$lJd5sj%3zki%39!tm2} z*u?x|fs_fY)l-Y;8O#o3p?1xY^kipE8B3JI%6K7$t@lCcSIsg{eyiIU&iA1}@-U}l z9Glx7Uj0w$z=Re#KuqJm+RUUtz|R`S&_jKih&`iKg9 z8j|8PY%5V@%Mjh4uGVVl={tn{-d`(y9}v^3ONF9>kV;J}ac$L&_)4N`M$Kb25AP0& zYwW#;W(nth__aJfBF%=I#d5J^aDSqpN`rbC_bc;OtF=$62Nwso^;iGmKFIY6Jd*d< zml)fWA;}xaW>fnGu)O=ltL8`GCL3)nC}HxM;I7!Jf2b6BFSh-NZ`Uc{E$!shEH|(&y$j zJYTM{cjjkw-^nakr#(*Dl(1sWB)Ne}m~?xS?`7~?o@mF7)1!yx4RrH`pO1v9l5lVh znB?+8wAnl%tsBwb5@TzKljtta-RI`p1=bDHi?($7$u&|q$Vp48tUg*=Pxw}FaQiweiyR=aqE4ES+8vhvLBaP`9}o~92IJ8rh9uK?(K^|(HfnoxY6 zr8l2_p0OY;1vJ_LsGFY3`0RRoc9`4kXc^pzgRpvLQ3UiMlAFJ*tSBx^tit8><(=WB z8IxOg1y?L5YAfE++|P7<2NgoM%oz%lbs-e#vC1C2UvOGyG)FSUJiMJ!E+m;K{l9k1 zI|qr0;Anv@W;S%#(A$#b)o}iJJzbhuJ`nqhPi`T{mRdw5H9bN{9#?6gZW&$cVfzZ* zZV30@h%5G&h0PkEEb6l@O>8Hy0o5TM?W{X=L(*p$yh2dX@}wgKDsMkHV6+qT-BL|- z-l3=XoR0D303wtz<9i}hq3vooo|6pZu9nH-)OBe=wlGEX zrVPG@Wb~IMkICsYIH;J4B%JAQxF!*hb}Fv*d>#Kaz`>+6f|(B^)CQk28xV!Ka>&Xb zKk>x+9dyx7B(doWus&xl459B=gY>@>o4*Fp%TwVUg58j{ypjT~9ZSobI4xsI8Tp=f0QjKBm$yu%WKE{9QWdEqGPn1=sA2!e;VV`~wP$3&_?--sK~`)Z zgEADC7Vu$m)ag+puJuP^3=>{CvRWt1fyqw}o@f?arxO1=mOjTnDqiq)&kl_bCTmdv ze~XR#3z0nUIKY-HC9A!%6xcE%&h-_vp$qc8yH}PR{}Zx8_Ao6_w#U$_EntZAfHrM zm~fK;^ii+1v3vL{urZ3(2mni?!?I(p3a;rL2l!fH`MP{fH?oI3!$f*AGXpM%{dS2X z92T+*K;%C?ejn7-D9db`1j)!?lP2Is$k^Kn;GaL-J~yAi7KIIDJKJwY4N|+=$kx%x z916^uz%x}q&CYLvv?5L`dRq5*e>!D&WEA%1;T2$+3bp+eet3ViPR3b>D&(gNnb4|J z0(1mDe6%WARQq%W&k3J}en`jlMz#B~4HGwc;e(@^sX}U-^JzX_6NHb7N_bly1TSUc z(*a%9(|_BRru(hU=j}R?|0dv|+Nae!xT)b+l@rL1TXX_MH`G!ww-}LRkSHr{GzHtM z{=l<+5q|K(M&Ji@EO77B$tzBpYCzuEh8y_`)7kkeuie3tvdn7s!mduUe=q%}D$Rxo zdAimov3D??-wmF<>&h{^=W<$#(2;u6B@QQ+<^AG)npc|7G5KJ5L%Cblma5uCHnn^f zQibL{bMkh*+7~~_EaN7+4T}n!; zEJKEJ)=;EFHNJnDAK;`Um&8IlK+xo98hR#>v203cGe%{y>1&}1WzX4SUU7&a|zlkWV%&yGDyo_APAaH58HIu+6kl0 ziZIRlJw=Lcs}2;vH$){CbOIIL_0;fmCanq3Sl3& z8m=(1q+OaSL7C>I6kpYSiPiuTBK}@(7Xm8PJgYtN~StWQ&|YfQeG())EO`C}GJByM=k zO7D5tdVTaC(nh*!?{K0wq@x0{F{mTNr{}qK;0HD(BP-5e-}$c6eETSsJA)%!x)RI6 z3>{bU3xGlQYeSXuWb7=IPY0;>+4aA#aGfuCv_~{&;=gfyq^BF-Rc`AJU*_m+teE*m z(@D8Upd^Yzk1##&c(wMUrgHC#CE3 z%;RV3Z1{}#F6T>PHb+!rw*JW{*h(za4s9;+{VBj-G!F1j`7H4+yvbrS?W!-;D4zVxOTUm=5 z^5nm~;?Z6hj@Ohg`e)5aB&&Vm=lf+WjYqihXr*p_r>rJFA0e`Kfm4#o7(d55e%&&# zz%z*@cy(GMT1MSTyGCDP8Fho*RF?>9UdUqg-&q$@xACS`;~-z5V(!Z}79r zL4%J>l}@dzLakr6uHD&C8S*?%@{5e6sZopM5GeuA24*~{Bpuozbi6H1I(R(fOT{zd z87B1w5jVQD2rz$(O;Kol`;Q~|36D+v(dWa~11pAT_2Yt0q5U$jG;wm>hqtH(GCi0v zl@wL#&o8kvZ*tja;8u@=d^oiG`dtUDiK9v9R6_21{D=lnKe*PZpHFD%=Jtd<>WrS{ zB}*!0M5*jN(gYAjzNw^L$0;ON{hoqWdaX00#w+1&MJ-diKOQ1Ge?83Nw*D5a-f%r7 z#X9c|Atq8r$8G}&^E`!^UsXlm+3*ZdfZmCp31>IC+?Z)mg@udl~0 zAXXVq>t{4g@~tHAmYo#~rx>m^_nxg*m0ZS`{GHP4>^5d~{H7mRILxHi3$HY+&Uk+S zlb4jvpsHy6U6)z6yS6>tFJ_ytN+*piTG zF9e5-n*`swV9lcE2ezYEcB{yi@ZTecv+BNIw^$EBB`1}Mfu#kzYPqtzHlf|K8_U>E zWw)?*XFS6S1YeJH?bKU4$+!Ppbwd=XY|x`-Pz*|^W`@Ncq#nn5z9pifVXa+Bu7K^YhMDH zn?ni({^DhqEt*L@VIKRGWQ${H5BJSViAENk7Bf0z^4ioexXWq`Ywh+Fyn1HLI#96D zXp<5mH@NQ&O)JqI_giZgj}AI$wX&Lf*w{C9ogSD>SBQ<7em;;r;2=qDm{oyHiJQt| zd?{eno14r2d%U)`zavB8^y4W$UdFiN{D+AK^i@+TV0qr+BUAUI6>NuaMHJj7Yz51= z_}t?RK22qcMj2P9-?_(!ZQp&#%TzSi%pT1gTm!WJr()Ri3NP~p17w&9#njwor zm@a!LV9}D+on?#jh{0%`kozz*W1m1tt8+S;+-KYR%4&=j6)&s7(N86Cy^U=t(&yHr zKojtlTtwq5q+r0_Xi?Vps@`Wi-9R={^$5FY6~0T)l?LtdT6}ojCV1-R zYNw>)>$HU$5SaZJ+& zPcaGPIB~yhXzzFYMHb7|y0p3O{5Suk9dr>5KAzIT*()zkz};4x`2tUE4j~U*61mx= zyauTF6uX;ZrGImPtGvg_Rhe>dbw^}rHNZO5Fxb2 z&-m{46xjk(FP}_J;AZ4?SjhOZem}ka);;@VQpo#ZsnS^d8lim6I^&^hexIp&r&9jY zA$@6VSFDU8cHJ=Oxe$`1I=4EIpKgkag&jH~R;kJOY;K1l;`=d8s%M9L|3FR4-NX|1 zi{Pe>Nc}4vq0|j2bU_LT7c1dB+ZNK&6~n7%AXBa&N=$3fTMMupkUJv7trvax06az< zCk9JAz6Be+x&W;g_c%J5LF{|$ySd8yr*hBiK19d7FZHuq@E@6WN>&KTE#%w+IyheI zx#j2|R;?PhhFUH_i7$g0jOm);;cplAuJKqY`~l08_ls?uKrB4cg398iYqLL2h$(;`NTLSw z?cpJt*4X!?2bZKi803jbAX>Y_v$S@KmTpuLYge`85A3H3{O$Z+B$Gg>I@bEpgm1=4 z<_o90v#VG0fp(e=lr{@J9E{0@{j$dINAu)J1yVHZ;VHK;ruzmnvi7DIpK=ATlkT>g z2k5lljR^7I|Kd;CBHYJ`Q>2+!Et@@+CZj&Q5ZEoT2q|s14cKSQx`^w_{#&V7Gi|Fl zD|}a`@+hXVKG0OEZ8AolOC>}iB&wnu7bAras0X9~)(Xho`&Q@jAsu|Lo{C?x0_quu zJlhOE>Kq=5`trI_T09OCI%&WUVm;Y#a^DCeub{^>#79{&G9I_io?&^EPG_ySK0w^t z=?8Tq-HBQcf=m9BK!cc8bL_g9!?1(IP2anp)x%=F+q#nWv1=OXbe|gB z@J$~>yb*m;AY3)e4&$Nfm*{JFCR=@nXlg0d2k+=7Qe|~#HW>No-_C_zs9n4*%#Tld zp97(d^y*#x1r_;o#Z4pPiDLL}&tZAR3mD%p<-iY|2P$b2u@36GRNkeyh75q12ctAs z33Tkq^ErVJnQe86UAG4%+FYzWwM$Hq*@psEs&%Fh13V=bxD9e;0rF zAZG9d)pI7fAa(S28XL>x>+|lls&<%?%S9}HIx^D*NxppFDk@>S_y^BI4l_L<*I$SZ zH1M1sf7$k8QcufjhM3Iiw5@2sjVdpjBgkheKds&~9$EYxcXN5u;E~8MmDQztLY+D{ z_}$RS`ZC_ZaNVZ3@lj%K?j&NP#*&<9Q59Xmg8pXs7_XPo7Z+>Bo`o4z(k~;g`Qp-%kb}5n(POs&!c$@j#~-DZY3eg zES~Nj*PB>wvr&K=R4i(^PZC6eoqUG3CExr@Pyy4L%*4BoMLZsywO74Y`~ce0R<%=3#N(lc4*6Wy3{a9zw<9Tm8W@n!B6=Fd6hKygU8P;pVO0G7J~q{U=(?m4}25 z-77$oft{VwZ*R4K`e@#uz-CWJ>u3fdIUR!HDzh})KGuS$(p10yAImdar?`iVV zk7cHTjYTz_>~ltrYT6>C`0OoC%YGCI6|d+A+RVpTUqyd* zT@`TLR&2}VP_EG2csg-lM-IOOKXp>c_O(c#Z=|xC=T&zZ>&ofd%m?cjzF6%^3%HCA z^9_B>F;*ge*xt0h{>n1CpkpCWOZFS}i_sUn{0Q$q9xC~b|Jc*fHcmviV5<%!&Khwf zb*|(@mZ*nsX<7IJQ-|mJ3Usr0qDIpv1Y@Sx#4{tWwMwt)-QwX$!<{7?%%XdDCEuR_ z5yQfzJ5n5W|ow5(69vp zx}^3-&Xp(4+0p*u{nO(qJ<;uQ{;N&)g;+A>+)?aJ1N!8Cm_dTjjxmc%+OifEwPq=( zB#ezahkYGoVqrAr>=2?&G2z3gy$F7ALN2?38)s64)80A?)CNd9drRp*LfaPfA+-(H zYU&j7{^=m$K^d;v2G4`eX^xxhbAsy^ELOS=1l`+rQIE_Sf1@IlYtr>}ym61B^CJ~f z=}-82{8~7?{0-$zQ}9xae#)*_rrJsZ zy?9Rl19_4$fP9Q$MzJq5CpcOsmBaqgn!(E{F{8j3_z{GkI*c{t9#j&Glj_StVHs4M zA`9}8|7E+v*!8@eHPJkQg#!4E~NN%LGGuHaVo zJ|8wM>KUnw`s3bKH%04f{{pR@4_2zbt~_*OPA1YNT( zpYKoA#a&+-@*yE>iFB0qU%6Z8J61~s-$q9=(#v&lP6mb2$S{W9r9?UwyhW@@Za9eFbob06(O#Nb|f3 zB)%4li_jUI?H3t9!0I)S80@{u^<#mB&9~Lnp)OvXj}Mrdr@bvlmqyRGojJ^RGA<4h z_zuhUqRW()*V2gYsLL?kQ#5X-3_9@GvTgW`7$~@hWylrsy!)Z@6F$|2egAvS%lpo10JUa~KU?A5A=Evf1i*;qFo}`JirtI4n2xiMm`#)s` zEVWku70@j`6d9ryM*fJeCJ-S2vJ)iXewX_u){C;C81@`eEJ08Ar#8VfEStgolmL#~ zUT!$Rfm=)E{!7lN5gd4P!NBsyE8^GfgzC0%X0E+R+G9FH3)7DQUE^}gM!!RTEe$F0 z8)08XG;fyo;!AcP$QyxuVp100g+Y>R-itMhX|B`gUCU}f5Uszk-3P$JKj0k`MQ|kG zLr&51eFZiSa|T$P-Ve)+_|%{Kr(!5-yx?-zSp{*vUz99+>1_~D)#*sMD74IG9@JBr zU$i`Bmn(@$-EAu#Q!UZxo!YG8FCaeb=$mIQ+eyhl5~}v^$};eIT`Cuu%F`x6P1!y( zQoU43tN#wfxnKl4*9rO73$WTou#1H>7?s?_m*3d8^D6QMczO%pNO`3l$cjV8M zJr9H=gW*-OWB+2<_Otp59#utlMQr4}6w~DRjj*AfqpZ>_BB{8c$*YO{Qv0YADajsn zgoofLTro10g!M6ly2EUu)We0MeM&VcF(sbDK1hj-gnT{=$<5Jk3xix9Vn8?+FoJ!w z`ZvhhrqY^t{+^M!v<(Q2aiZ_xldCk$D!(Rg%*ax8hGS(+ksUC+Q_~u3 z@G7&)2ggcS-krOaQHDOeObDb0U7;dPO0Du^H6}icqoW^vqnhgk`5my~-630AMlCO` z>m>z*P^(eexB2c~PXfq(2ETiMi!)$T567>`1b5t6ES6fw($k8&F@wrK|EqJJL+td; z$kmkZ-icramO7dNR5kJ}ZBX3c^>t}0mx3mYz2l@YHJMZ5qSg=)w)L`*C7<<%V);0x zG=y4{K#kB0&6du1!w<1RSH}QsB~%`j*b( zbNb36c60sjR>Z!hVmKMhR+Lulkz8^HZG}U_L@YI6BGw1)xwVbC5;}UA{7kBS=V#rIPO>?ED*v~p`&vRwAOvaRz>gT-84K_uQ#S;z zrfqkGDBJehU%GjZgbWI$oK)PrG}ZXhS#eJS8U&H6US${ShXM<_o||Y%xbOlYS}*B$ zOSyJW?$f^|cx2F0Y<+xDVlAS4U+oaDY|ow&Tn{E*bUOzJ3J)$tbqDXuq6)htGr~}t z(>(&#+c>S{0r?gDS2az;ONpL^*M8#^d8_s;y!ieEQ4#6g5zA`RX$NrQKV zyz_TY^1QMi+w;xgPept@lCNjl-4T>vk#5c&Pfp(Y`sS}yolfur$~1s@lc9iETTg%; zfkpe%#s|dUoLKRm#X(FMYy-E3z)!pUQvoUJNV_T*n<7J=7MWWU4_d*fkj&<#h(O1; z=SrWr&gBEyrOg2L*;rP-6WO3BG{5=|vZJYAIeUo{9lwP-rcW`AGl2r`R}i$0SHn+S z+WDP)_J`6mPDAp1IexG6xYM|_hWk%&NHrSITj(4HSGk+U|60AvHBPd)=a2Pj?KN#9 z{t{)LV0<4Djitj#74t*>)hz4J zHTq)!t_m#%`x@=04)#h}v)~1r{}2_?Zh|d-*IUV5Nu;l5WUuIBT>rDW{h3|kj+Fz2 z-+%YC@~`_!j!zQNu~YWuad5(aV2n+M-qleP@;JxX=bhKS^~R}DvX&=#l2=dKKc%uA zJ|4k+!-WLSQ@YsyGnnlMhVoy*Ll#`h+<<K)?wXF&v3{gD>=dPw5(#H))83_Wx}n z{QqjD`~SM||Gl^F-^ILM@_*k2UyrVK0&+Zj_NS_52)#spZfb&PZm-O^qW8PPT?P=_ zU|d$o3w3#-hf-uN!JXLXf4D?*bT&a%XmJ*tPI;035cM~}Zo>?TW%l1Bi95#d;wB@T z-^%JEYF!E5bKIbAdMf(`FHN~f0>;Aj|}GR!%epDIY--u|L?c|Jv1%cIx6zt`SDX}XM|M_QTH#@-sOpA zWOJfN{I{Pdo~9bH^Zy|_Bn9&j=5}tPSWH`5a=#ALyS z6$1jz!{3n_{oHO!1i=2!_e&7SJSQo_RpiLoN3n>kIols6JpHn4Z+}V{db~q@xfL^rRy8Vu?p&^53N+n%EFonvc_fpgAB#pQQPJsH=&1IG7A~g@^yoVA^__ z=?fi~Nh`+x5FmlKGCGsnFwCQ_zbXTvcdoNisAMM@VVD|g|64i!hPxEC+2mBC+e8u= zmJE5a_ML5FRw?7O_1g8bKJoo+KoS49v+t`2DP{@b}N8X*pYFHm}>Z0hW(tZ2hUKvY$iet%$oS$*DBw*T@dXa1zvoE z)(o|eo6Pt~sP&W8=-_lK`So5;^~>Gx`XE#n`Mv!_^1qW}^!tBTM9LgrcrJ;l-2Rto zOfa5JbTv^ZDYLU6Zc+FV=D+g_+?n9fxQAHuTTakg4IZ=KlC97kH7_mSDTfEdkH)(= z4=`z6zdsWVvJd@}7(+5oOQ=_i^1n$2o}8!c><`d@-E~3cd9jad-fj+ zq?h0i}lr=(WqegvJyrcigRvre>-*sP$AAoaTn~&lm|3N%BCgnVt z9~BK|HW|rSjt*^>@&4IrohPy{3y16Wl5DA%>t{*rqo;RuHh{C!)(tut>lmfl@&ma` zc1+w;ZXu1*%lIfn=Nk-MRKjY-aT*wHD@6^GiTz4rm_ zy(vAK?ssyRFS+pT6<-v+pO7JjOYJqQD{{g49f4gY1dzW~yFbYRAG;Y>PWk#t^E^A3 zP5&Gp*o5k5`Tj(#MkArx0SNk_*C%oopG5Shl6wTRsN)wA>@bmvuj1vrA9w-7Hy+d# z*VG$24xJJg6h6Oy+_!@9H3N0qj$SgN)DV)mk7otKj0At`KBX)*S$f~cxjjv^-->#5 zD7IHvb~+Cbd(QxUXClLw^EGpqm-3j`u0ya4S>@=b#qc~m~cgM$L+5(wcEgI z_aUa1k^O;-N*g*`*pN|Woz`fpn^!(;XT)(aYLuccxG`;{@DzmItxxKsX{=g)0yoD~ z*esx%elc2ep-xg@=aXgs74Jm-^+WOp)dWhYC#`sg z$HNQ*Ck^HA80ZG6^V6NeC`AV)*^|Bx@+HaAxIjBweWs5_6}qVuz79a12mnPh>IQ2! zqcaoL<;V2X)8)rsl2g z9{ELr0gY;i7KkVtbHW-Y#U_OmOoz=y1;5fzUB11{9-scX#$0hlBTCrN`m!+V#tBwM zTMIjXaP_rw1XDkFF>mKg^!9Crp?tl5#0`pI59-xzeiRz*qb1R##(u7Dri#^Y{EGVv zE2ih5Y??jgl>RAJIose2aBRTi7phtkgpC+R9s5a~>*k&Cs%_`o*{oT0wsO#*FmvLtAVVu!~wZ{9It)?l*Fbyh-(_%4|rh zSR?#N+C~h(*$4WVP!seya|O9JDMsP-E=sOo z*aK1y{wkCvVs;^`o%FJtC1P+sRpm1N2nDaa-bBi;PMqd~CSQ4RH|R0mlt41O39PJr z(y^_4oNAqVy%m!>i|m}TM_CBJ;uURL8NZP)pWuGlNLa+w>?}*Lj3v+&a~*m=W#Oiz ztrkVH!~NFGu+xMwDL~?r?eI{avbS2qFT9Gf_x2K@aWj&Vw)gnI`~GaruuEaHd&n5twI)H0LqCVK7QagHTSk7ttfF8Ft+Fanf4T5B3}N>&^)^$u>P}c z7w9lbC4=WD!LF0o{@cO!^U%J``1<6+Wex-y+ZA}{Vk!&4gBR5~%zYe}D$|xe^oV44 zW^-LMEV3D!1}fe}UWp~CjpD?3DkY}#faL6^kq;T;9h~h2ZuQvDhx8m2NafVXd7Km^ zzIhr|vrEt18K;r`&IRKWUC6MR%IVfZDQ@`3s3YmKbQ?|07TqhPsG>Kre zwuI}%vRJW>Mw7z}6}=WNIp^jtU`R_*>isPKWkK!i)pJ+t7vc8(Lrlbw5a*bfXkmXb z29ZQFk8>n%n;x3aB)CP?sr_S!avg{rRK3SE(IgaL5l24X?cilQi*};q<62S5{Cj6B zlBrBzyqmC2tb6$&d{c@5Jak6dl4^82@iy%+WbnW(%@RW1*q5@^XO8d-u& zL8_&a)OO{iFWehNaL0J!%G6*$6NkNuJnLubR?pPN=EY>+0uR=Y>C1-O_l-giQq}Rm z>e1cyu_DT(0w#Pyg+h~&TY=@2Bh8iBp)sF~cD&%tz4Isfp=#EX36f7g3 zF4JY}w%gXbsu7w;*@HWe9kSPK9*E*Y6uU!QC~r+G3du7&{3~=Ly<>`&)OjLZediiZnp#Jjk@u8k(_DOBog z#;hJbwa8d2M8qu4vm^P`QwAA-R;*%--8zOB3%9CFFU)oY*%1OHO zWFEzCN@|gBD|W7VbOkwe9@mb`i!K~a+7?C;5F!U%`|Q!n#4E?UIkNq0D8~POu$HNd zSyUW1fGo%1I*nT>k=mdW_F1e}D#g+oPr+Iyg=|mm#XWpdH*rn#>%X!5Y=o5Mq$8w@iOLm`HthHx zR2>vo`ph(Y`uhkyQ{ZIK4@0v*y@iBW&~^f1Vf`myX_oRp-x08$WUjTbY+6brdq?oz zOHVygR(J-oGZvu>v?5CW!lB*T=4Mm!(|IQ6Q)G;J$xx+#QD095bxS?q4N6_;NS&amm!9&Y5n=Th1`7{ z^_-9J(?Ond+mO}i@tjKEXA;axTp=}Im6;WmXB|Mryicw`QSlK@p`hhVj$iSq;Y6bU z7GVH265+Rd=3326z7fOyQHG+5XBGoorTVxwH7Sf|RxGh#pkDaNw*@G7-JMU-60^V^ zk%9Fry{h9ilZ%7kRI$^!HN~t4@TZ)S>2P17S(e@^`i|QtHgrq4!zLx)K~U=!aK1T6YR|&d+px9z{G*Vy6GL zTEExXM}0#ZBjwfec2m(Q=c8P8+;BU;(9{!;_+*Ki1uD^Wma?VK7D3QjHDA63LR6LD zn~VhnoYupvVtv29-6QoPB?97pTPAtQ1bohwh*X<)Ni&S+MHylZ-X)omU%@e7qjRFH zM3yADVu>Dz(*!k2%0gyyY00~Kah0K$*}`!+WR}YgR1Eo~Vu4celb*2(Ujdli+Ex!X z`M;kmuc+J14e5%N$!*f~ve@bu@wZJw=T-8Fx@h^n5_DUQUKa|7e_kj=>P^CphQyX)`EH8>-d@5@Exs$dhR-T$6bn=WdwsX9|U>aZFUo2<@ewb!!I_dKAT zR&o0Y-xgHm!%5U>mGnHw%1w35JwHLzVnAQY1`79r4*PpCVQ&UYq~KlxmzM zOKYwlV<-Z=ZGndc+#+tU%xBqktueCYlL7+a||l zTwTm@pRHf0!sUV9eb-Uy^$kW)I<&*xlUJ zY0h%@3L)j{N?~Fur6X0Uiz6iMj0F*X#V$)5{ z%^?^!O!-~Hx8l3&v_de29Q|DS7%HH#4O47&2?~lp-I_Iyyqr>4a+d}r9AYPi#mN!~ z_XEV|8~O(B0xrk$#5bO`4a1aVSn+8Jm4B03Yt7?yXfb&flHrnXF{s%(ZWJX|wGCku zXtSF2q-8}dmwP`x<&4MR_@yOr0x7wV+e%2IzCO}tKXgW`zQ`-nJQ}spe2P$8MGK~0 zmdPiSn4OXBR#l_8nNnRTP_q7jRNRKT1$9Mifv7p}JM~kgDtHj}kH|Nb=e_P@lNA7u zgvljjQFc)cFKTD$r{dzAv3F$8or?@%paF~!=x;@d^EPOq=!F4t76k*d`8Pks9Jca& z=z-=FluXL%ZRJWG}TtO!lFg*w}3RR#~&9~DVJ{9UYtS=N5cXct?85k7% zLg-cO^oYp!e$JEgv6OPJ(^B3RN!(+6vwwAf+EwG13VCxWg*jtJq*`devXVUMM$yMg zquMZKq@YZiX0-rG=4{f0c^5|Y)=2uOT`A!qR1$d&%E8}6Ep-sqIfkMa`~9q#ZcORs zenC;_H*0_3Qb4oYaav4zR9j|b$1mSoo-FQQ7US))$Z`j@g}s#~|5H}&W@19sQr`R&2`u(*>Ugl5v$|bqDzx-E?xsL{h2+xCQ%&Vrm*L%W#Phk-Gz+7+YncrJJ zFvHiAI4aKFDx+9Am8Aj`=x6OQk3E9zy5hbMC<1m5j$5J6zPbICQS27QC!7hY*Zb%% z4(8-B!31uDyBYNP{Q}8)xATa_;d6kK#G#pi<3boC>^r51<;jp^X}wb)LMQ0C@AY%u zyA<$B=iXph^}QULGW)0z?>A~Oj_1@~$^jd&vj<%%_+`5-5g2qjb^|{T)C*fGYqI#* zz_&Bss!|`qI79c2$U05_TmL;?uVD4%`wi_$eDm80E)7M{n99DLTR8A9Ip8y{bw0j8 zP1&UexxD5VuI{ZL!}W`e;%(VfA`9fl{k!x`UVp4@os-HFp5ryUarvJmuX(b7jdXo; zO{IqmbH=BWm!}Cm_HEP(sut_{I9xf+9FBN_5k;|h8mQ`>M^Q|rp#n)CB})Ruqz$>w zrr5A2#(-YDmJ`Es5D(78Bo-D6I!%YWb$@vq=fK?ryVT_g9y=Vt#CFAovh>9z7l&y& z{3?(Qgy`6!yxelyleDe3bT#iaTL`CSF*fcIMJv` z#U&`d#JPYljz2pt{mL<9Ky5~!(qd#>^2*>cdyBfNM*}Gz4F~-h-zQp&eTFO3n|AsB zy19OD^ltk)|3<->)J5vsnU@2d(BsKyPR}2*z|A&&geQ-ETtf~A9l>%9qR^NQ)60?y zzH6mDxUzVjA$s?NFw)BJYjv1P<+KME=_~PB3ckpMhPg(WyoSE?QX+xatK8ishd4di z@#*Kw40yHPti&CD1Ge6&SU6A@~$q>02_B|WTCN`t9>Jm3-_>PvaWyP z3;fi4+-(xNp5x}H+wZ1M8|N4UBJS@l;QX{wbL|8_?00_`&>EE?_$Kj-Pa%R;Lyefp zT42z@_MnW{fivxEzieAZy9hf-?bI`y@1BfCq-1CHJ!kU+*=>AAv-WBcwXL2H(ow3n zT7Zft*+e>$hjB(z1Rw0(2)YR!?Le;a`142#TX?YY-bZ_L!eLo?zD{5+-Qmx1Y^4ne zT|$|et|(c+ctR+ab`ZwgoO#PiiCbu5-I@YU%t6}L^&E40Ly`G5i)$DHa`J$Lf5zJK+J{U z#Vm*%3GM7v`CV+qeNDJlVyeE1PQah8$J;+h8nG6NQFbX_x1m_KZ%X5z&dk(N^2`=<3*}xZqX}u*Eg(_y|u`s&g7_X&w`~{-DB~r5qxmEqq){UF~$kp z)xT=yJdUaYiuw5yWm^ro&R4XOP!1HCsj?x%JBqRO9DEEb>raSeZ6!(qV7`;c7}Wfa zU%qUNJ68>9^+{jqxp!Ku*QVHa+>cM>IxMGsCmf3g)}Jn2XpKKMnS{k=yYEyc(Hih^ z`+e3VfpR^K_Z45GAHZrno?^$m1{izAi9%!BUyjR5rCT4C8M#E|hA7YSVNR!uV10qD zdw;4%sdct|NNa33!9toQq*wLfKhW3CT{+=;X8dgESkB;Btl{(onw6)@R61 zVjkyMR+VdMwa0HhVuXhN*?fN@_}D^gNIFK-drFc0_54 z827u{)-l_(ly14%YvdAJ#BR->7%A|3mggYqmCLFH)K=B+NrNanHWd08k%oap_~{jL&sk0 zHXboy!odgj_$zkI6Cas*YnoJ1SV~F0N2Lg1qc(isz8lYMQuyldGLq5vos9) zh1zXAyo1qor=)z%;4LcdZ6UqAlnIha_Lo=*HdS#QDL4O}PNS8Zmk@;#(3Y!W0gQVe zpna{PHT^WK>rbNtFy}}})&UMgBKUrhyTcvikw3GoO~1qAiWng(1Ra4nG{cA}cDf(D zNk@c6@E8So+!}Ov&MK14NH2#wjuw#J@Q%mS4=JkgchF4A%8!ebS@lzc!*cK7>2pVbRBh9aX2xJ>)sIn#ca))9pvIqr~rGYiNJW;?SR$k%C&ZCyLrg1eR zU{?JnN*vW{hGU6WT3U`b#OQUkg`R?qoXxhYx~`f4q)HbSmyynHv$}h9tz@rv(@SKe zobKMk@?|3}Gy6A+R+J(Xp6@jBYYg=+Op>Bp8ErwdX@q2|p4U5l?oimO)4oyvc#0tmVp{t3bmd^^lEj;-N0(njodMzb2Wh+^ zYJdc#tpzsTK++?cqe3P-S4Sgmb=#S>A zyXqae4(iGSgb7JOqc>l#`DZDShIZHo;^seHYM8$?1sH%&%S}_c(`J|z03>GLHe8sN zBuK?INAM2de6&a$l|Z4J+U##757mjE;p1I9;1MmKY6? zaUI>szvK8pBLvHVGn4ni8u%8~v(4yoP5LY&Pt)TLP`ltDw$v9ZDw1R3@gX;=16cGo zzjd*SK(|jZC;qqn4LVnfXb(Z7*bi>IMfg%A4CnM`QXyJgJsZ=#iOL5Vdnfxh3XY@^ z)2-DLLUGEtF9Fn-y45U+bd`n0k7C>XbnNH*NtwaHbwK@xP~G!hLunXs3XKvUM0r?` zfn<*>`k`h`LmVw&zou!U#j2^pH_~JhV|~}%q4x6ExTah!%lQDwyhYvcj}kwGo#07c3M`SJzn^{54Q(Wg?TL##Y&ZA35ea@K6;rV z-pF99B}v4&I!!E)bv)#cQUa86Ert?K>Kw)hC*p#AJ=XC01}40pFa)fZM2`m&4^^>s#aTSJqr7R4-HKe1B$V5IAo-12iq+WlAfEsM zvjXY-H3wGPUd*W`b&IB@^BswANXfYu)WhR>f|%i!Q}hy>ohGcWQxDLZCrzsP4_L;} zQZCLWT697>EC96g*!5X?OMx->)G5($bc2#|qQMSi4JlwKB6rvgS1|Dm;R59m; zr!DfE3gsMq(jAQ5&d%K6OZyTL7A&n<)S~$tJWfJaB&PiI0gLTEvQOTK2Rt*CwK;>N47#cs~V!vKdA9&lW z3F5l^3e((oKHpWPjcI}B14V1?BoWe5OL4HRvzG^#Sez)1znG+)wa*I)vut>gw~Rtrjl)+zRN)lD=KRfN%f$D*(x!#xATefcKpy7-2>3$vFy6# zt*R;RwxMtb%#)J*kC!slu)3<))}bJ0qLw& zyyQ+{mzZnVXpNfsU?gzzB4DY&8jZhn`}Oa#MDPi{S0QGBR~+Z=bqtyBO-xIVXwA2+ z{C)$zQ0>s{z58<}F7WxY)-;sO$2Ih%wN^qB_$D_#BK|XT>M+Oq(id9wjYlR;3EMk= zKW&q68j=0W$BnE7(#ln!VYE+SnjdU8gU7-kz^y-}mi!M{>D=2GM8S5sX`zT4o~+6R z&J0WLNbjKBXzh|%U%ibbi3Tvj4FReG?9XBiYAd{qlxw*Rn*4gD=(mgLT}C9tk7WJp z(QPZ=|N3BhN~i~nTG>)Q&fcN=Ev(FTtr6qwuIt5>Db;FLd0-&2sXGvsKU<&7O>%U= z^k*Slh>`p?dU^&gfEhuuw3NP5*?H^F8?ziTJMX(VMDR-MZXRNPEP-+O6gnA40{Fb; z6c*|kqhR6OD#ODhmjvgRi=XFFOb&qYiaLX$aFao z2l|tE)qL3|pPYYse#(+It$;^azwpp3)&**2?u(P<)izxSXbGFx<7=nIlTFA!EI2#s zkpsge=sLkge>C~EV5{@<^b6-tFgYxFLr>#NChSu*Es(1l)bZgZrqkyI0?*RElC=+w z7WU|9^kKFw>Duq@QmmYp$Nxm67qToKW?D2(5Ho9yyJM1Drns$hYvWNiOsbR0nv)Z; z{lUchFQuTBzXDHp8?*2NieqN)1=iV+lvH^55 zuT)z(>+5T5L5-b%Qfr4)h{hIkhS z_(Bc5jv~rj_HW1X(pjG~Z6AJk?JA6?wG@5HO)?Dr+wel_Zp%Jp*%lf{uJAd66C)(@ zgZhT1=xtM#{m*Lq7}C}RtA&Z&Aq1amL23r11n_iB7uxo6aVf!!L)+OrplAC*zW<`7 zA(n*Cd3UnQ4bmQkne{g;4yQGxyK}mag;Kk4o>=J16q#}&p7$)H%^gAr@n^Kb47D}< zJB{cPav>7Toeg|~@v|C=jp?>0td>UUq!-tGcKraQ!j;Ymw13`=2p$VCDD5#nJ$D7) zFN#vqyg=7OcnmV~e~Jx^>$6%c0}mMGl=sLs;0fNW#*u?U9S`<-l8T6}bTce?pqry8 zhD+s1T5NAXllS9u3dJXZRCS+9TaTft1m=X2LZsj=39jJg1FXemY7+OmeFSW`pNzlr zc`()xXkIjNFCuid3vhz^>1pTqtz6IT-1q!X1&q@ecD^8QCJmBhtTCv+x=+EHVH*YPg<-m&Q&fW}r5;sD-T^CGcKR z#%@t2|Hu>Jj8qh}x0m`71)p=i4gB0$G>jbLYNSoAg30V7Odd5<=1dH|Vd{*|5qcKB zsfRc3*pnKc+}~Z?W72f#l|}f*WHwkIE^EmG+QJi2v1cnMSM`4XUSY!-cW(?hS@a2Cd*21##z3 zHb0V;hRZ(kowRS@yJI#=RM`j<-9~6_LBw7}CG6_Zh6FHMfBSioWhVUyyT}BMr`>PU zgvG+_U#mfJz-hb!_{ATw5-)y%3SilkWky zFi5kPu%wDeU;w=qo1KDzf3-9x8R!}VEKxzI)n4n>o=866^@#LjY3vU>Em%rIGSNkO zOdt|bq#y4sA9Ym2Oj+w9K*{b2y(G}D((RqAun?5mItkWn9NRCe7Jm4vA3y807lqQu zGppD3;98lqE|^EACO7FkmhzZ*#4i)=oQ;YzuQO%9(FrKAXx zO3p5EiA?I+A0uHNOTd0QKh>OTaL=E+uvVpz1)%nz3rEMzMa%^7ywo@2rwn=ZQvZ&)+g^`RdBYVJ7;T2S#XM3r`e> zK>lEd0wOz`x#fQcxN#?S=$$T1XoVD(^`_tpu=9zmJS&tky73Zy8H*-eORQ5~nScB| z6>{Z84pf}#^uB`kmH>q-Q;u@s7Ap}yc|P0xh?P$DbbXo;E0g247p}9u-fyaIzX|wL zeRmksUv8oPAc+nhpu}j`L}0 zCdnbl^91Ouul-7Tx!YIV45i^vgP&Oy#ybY*RHr9Z9dlSVKy44VM#7hWeedd+1%U8?%rVefpX9me zu!ymot~Ne;Ks-k{`H1X~xB(u8C0}M^IwWue5pWdYIg<&a00dY~r)^$DRTv+LZYZwC zi~&_0Oe-hqdwMN{gO%j_snZzUOc=+;kDy~AHi9HOw z9H~w{3^lu8dO4O(=fZj0Mx+SF??>v$^`TW&;DW!jfjtKw5YhlW3I8Q2S5?w zu`>9>dnPaE%=4gt+~r=8r%!@tdRfoca zmEQ>Xj^I)(rc>MHnbZ9w_Zz}Ppw3qKSn_rENiJTlpuU=w-Rq9?11B!PXR0fPh3v6n zj5035nYUyjl<5=?b%>i16;`%8xFEv6vQ$1hj3o`R@$NP|F=-N19pY z4&adC&MzuZnZE8J2V@J;-1BR)Pq8>rvnxF3rf;8neSGz~mP#z7)o(QV^8ob#_JhW7 zwHO-`T!`?=9<;yp5{M?xdZ-dK$Cln+8E9y0S3WNgRdy6%c)o$UY-0^pla^-k)v3}d zaD5wO;dhp}-jc>VS+ITDK00(AUGrENPhXdrmVLXG7RN)F($dluU__v9EoS?Eu-zfp zf!LBW1HS-p^xj8gojwsZ2y>smW=~~&kpq%U@=h+tGu5X$sCY`y4D}~$8Ta==x%~m_sGhvU_ zEZW;|Kq1WzuQcoV`rvSxGkBB>bPxN1U4)BA(e%U4@x`mtApM`8Rkn+N4&ajh$kr@~ zY%V`b!_xk)Hk%b0f0XpA({;ucdi11})S9m{&Kie|x#eu0mbT@=;1c0A8c;~YgH;IH zn>BqD^~o+vjfA;B+??Mpe7KCAtIIKl}CCno71P>rp<^bYSN;$VhL< zIJLWdaA9G}ypJd5L`N`Pi7A>L#JIk_nANKUjxY)gSkC`V@6k#)?vg2r40uQ0dGUUx z`5?(d_+{i5Y$s(6Tc(n<)MV+sk0CL;|4Y4V7iB`1_Bt!z-A0ObdVsUzct$LW(^2yx zK2}Co-}pg47Z#$MbY3v7pBOG*XJi5*%Dm;`DxQ9Z#*u2vO$+0#plUcc>g7y5aUteW zJ@?^DngaSlYcwgu_t-SBVq@bO2T#(l%e>Uo&gY9w-=amFFEmYQSe zbwHA7nH$B(TY4x?ucodJtghxHTxJnc7O}9*INBSsvt>{?-J_*|tVp zTK$dc22Bl@@qPEVsZ9)^*EX%o~d|zY8N{X`jpsh zsaD!K&%I&><#U!gcfyTKiZD)2RM+$2 zhqf}v!Z^Go`)MCVAjMu|VamNQMn)5xE3Ung3C1eZRdU*$GcQ%uzbh;|#a%Dft=W2A z<#9Gwgr=zEYovaZPeThayB#-Q<{P(gfOP7DUj~^Y6?9j^C7SvRXteFO@KhJ;y{>=l zSh5uP=qpr8P4wxzdychoA>hWKDGu)1&Qyn^yYT6{`?uA(P@7tebHz)knn#?=K#_0@ z9jMh+SI?#M7--z!LlPo-r~OGx9%?WP$|k=t7#@~qDe@HR>xm#$xMH2oy0|sZp}1-2 z#gyx&j%iBZyCK}6q*M?pH5wy*2;}6(f*^HN{Rtv!au7j_LHzq>3xrqR&XuEoTB)b^ z1#csbleDrXtlu^OoT4$Gzb5(`G&J;J+|}L264tH}jD41(Z-s?~MynvS)yM|Y;B`w} zXU*tU*z4{CM#(-f&(HTnB-Xz=8Sund+3)IqY-7nd>?TJGd0``9@RXgyruYDv2&qVap09Yqq;zQPnIIs4cDGO?+Zjl&KT{>Ejw`+GpaS}Y(%g17GabZe3)1Ji zBMb21=az7D-xv_n(y=|DZ!8Td;hWRJ;*NE(d|Vnxj(E>2K#?76>B5!>Ssqwy&C}TX z)8Z0DFc9OVoqho0*9-2BEn&RTg?IF90FUo zEg^UaI7_$;07HcVQe=Ksh11Z$HYR;eURvpp4f;c6I+huLK{x--jezyy4(5&j&({XcXXZtJ=uIlsE@Q!)roRN2)nq6CQ%W`QhRUl^WSm_b@8=-1;?0zJZN4vJwaB`R%)=yMrf&R%}+~J>UVM0nV&XU!vDu}!%pU_o| z{dB^Znp)}$V{QdF6B~j4RG*or_10Szn5{dh2P%!}O!$Hst4C)&yX3A*y=6v3onOAX ztWOkN_?a7mtBCx6>lIlUOmLQ)z5kte`Q{Cf_jUvJm@Oipwk3gJ3|Wv|TG9&OBsE`O zZOzWcPk-~zDA6Fa)mT0{k$^KYCY-9rQ7dYRUCv|0R>|WwMFqU`s|6pp)K>M6iqM^t zXg~VeY#+%xP_OQZ7bX^+lQJ@YQqgLNBC{L2qqX*PFb|()T~wxiPz3pB=|^1?G;ed~ z&h@LXf~=#bpbfjmB;lXOYZtol?r+`%gh$c(N9Kd`qu4nJpT7j};~7PsO?6SiMVP;; zxU7{x1xCvy zY%Gtv=qnW0GBHS>_zqT=*n*!6o~NWdb$?SsY}<67cUhtA`qE^i>(u$)&u>9yX}vD? zVvCQD*t7QU=;IQbAIB;q(Grtj+(fGC?;5D@D2CvvC@M0nAt!2)tW8urf699nah^{& zcl7;LN@K|>ncsV&bt*l!x`f&0Md`{F&}@4_33vd!&KW9ispS);bEv!42yO%c*2cTg z(6LbZ+)3?6-F&Srculut84t!Jx8cDS|9js4yE6mM<-fmwpY>*FLbo1%rIXFc)4r^* zqSJkL2MZ|mSC|K*uLD^eZ^eukar#%}&FFMB=WlD|5708VZ-neNPL~+QBo@{X$#h-d z`)0$*3kgfUs~sl?Z_`=$bf5TjSK!sg2CJE!GZyqOX$b3*6Ol&Vb3@-8PQ-AHG# z-?Vd%od&-$4<&sA|2dgE{H53pInm>RjKW9>vlqy0EDgtFqKpwK*+oCCQR+qmF(BypfM}p$7BSuNfnwKkx zrdi!}7EX1|mVEL( zU&;>t*E1tcIhdf3@Lv4W+~`GWYA!&Of^FI0OCc4z%5OD-p6Ky>wLM}&pI2&NwI4gR zI=6pOOU)x90_4zfcQg7~|120{GF`Xxu>$ytP9zI*S|=PVP7iQDxuH-!_n>*=xiO0) zvjO)kJeu8g@p(UBVmB1)z>E12W2Xg{S2EBKQg*RNWsRvu$SbPW*y$Ku4oSOMI}Y)5 zs$E8x&4ZUSJ<~4h1AK@Q?LWtknW7s@Z!e_)+s&(Koc3;selz)Wf>qo2m>T#TP768b z)hEUvZOHxn)r^urO6#O#!@$MKvH*9JPM{WDmj+x%^KeTfabO$<9!71}WFYZh)(Gn4 zTk=gc?6~@9YF0EZQFGDXc9QFP4?O?S(4*|=8GHa3Vsxo-|Bnxr+HsgD`qg1$rc&e$ zRW)lI5&`vqQpEliTFrHg9lo0q%|HJmcMl{`hI0TFuBE~9h#I!ZmX>zm<>fUoiKg?a zomeiZyK?+3)ZQ)|z<^6ujE#j#l@Ju-78tLyw}Tdk8Su_upMaymO)&Xm5*Ere9hp?u z==+9A8U4gtCE5iG=d6eQJwjSPy-;*KR8JTPIZq=&5u)qu^{LIBGB=oR$<`PT4~hnR1o+;12{@l6CQ{DOX+Ij>Bjf{yQ>cKGMk|g)NY~e3Hi?yhIte$# z4R`ak>1d+Sg5ikXU1qDqR1yWncLffyE_-%uh@9eoUi4uLnu3ZTh|A>vWH1(UKvu|-hlipB^wi+wEQOE%w zsjjAMQyODH?hAo;@D8y(xJ2oLcud0qPM zj@%q3)XM%I+^xJ$H1d$;h$^?A+gj!3K9i_Ce@C4}PZz)7l<(ikU^$q4JcGDa5yjQa zBLTt#3I*5>a-5>UiRti8H`W=~k4BeYndvdgy-^UrTJ+aJ0uBCTH2md@x7&Foh=YP* z^ZS#V<(BjGkc%D2@gxe7Om@L+Y?TP*QS@Yz33yU ztGo3JL`ysxNKh!bg)sCyDLLXin{UXU|M(!IYDl{Ae2IusGgzMsj_d>$8C(_114QR; z#`e<_fE_0yl4clSzbrQ4ogr{w1d=5doz(^HuIEfC6xAGTq5#vopvH#yNsZk z2)m;?D-866Zvc-~SGjeN6);e`B2|2kuh{#85fFD2mjrkA*HVF3H^+-xZw+)#8!uus zdi#=CXm#P@?CfD;bCyjp9b^snVDqxN>49e)ZLvgH9-M@SL6e54Z5p>()KM=tvN^bE zu&c2^y&s#K?>P*{Tv+eA+Yr+?+MQ;xg*2HoazdRuY-W#ikPeI+SMSW!oQ)1nc#5rO z*L>~kQ;fmNKqUL>xlV*rsgSRLFsVHcW}~^;1R@S9urIPscW2f|B{$P14PLcJ2`ACU zk(c`{U;4qsL`<7%KsfjqD|WL>c{Cgx zqC0VialiN_#ERNhwi-u;iaM`Eb(`bL1|7zha;XI*X?Wid|h>>#E8>bFJ$nldufE@~U4XySUFX zOlE2R=E3M;q;~cG`Q`TROw|2qAwKkJonO-=M?Kh2CxfXbr;Kkbyg&p>HS3hSnPT6E zU#Y_Z)N_xt)~GN2v?*cFuPJuD!7WzZ`--ig@i8KaEj%kLTR!iR_ADR!Ha^C2@ZjcX zuBL7x_P*R)-=1hZjug^H=IxzHFdkdJA@OQ_(gO8yG&ME#vMsVo6kq4{51hv#=c-k$ zFR9J`-dDZu&wp3%YQS@8SrJmZ-1M$7)&2f>Ht*#&`+VHKB4eQ^U>-e#xG8LQRrUPE zLUG*JLZ#YUngC*Sw{`-aT;;*!yTmB2-Hjum>9os%za#6e&bq1obe2BL%>NeS>i(2d zAk9y3&e=9wV8H_aQ?Akacc4)dQqc_wO%}b3miJ{4_)+UUS1%Z`o(FZ=>tEr@FLIJj z=$c>0K|t{kN5;n+fskhKY31_7L~(Y_(Yu54|ZQI?b1>RQb3on*@aC5vloL zh#^7Yh4$M|uVWypKvd4)?g&`EzS|ygT2*QAXLQ+;7;B?y=q_Zhac2^tQ)anK+0_VA za;~gk4#n(x(_*vleT3G`zLfV+Wqfj|?C5we;@y!d`OY9JbN=H%U)N)4Xn^}Kb@UYh z>z(6;ljf#H@2?rdNtN%C$%J{2ZNUQPz8~hv=v&9|MGRNTXqY!tFEd{n+@2 znXi}opBM=6EeXgLk^xqjG0PriKoplFY}$KzFZ^7|!#r_2H!6om`dDnIFbm_l)nHz( ziul%++oa{37!Fyw2MrgXsU3Gh+R&d$OFpg0DKb&;nX*T^z%hOq-}l!v<<|wcFPU+M znC}ur>eM?=x8a?k_D7hnS_i8!Z~SM~zHLHl;d1kCvyp5G%95^0vlE4AZso;ecm63Z z>b|7PqlhO<3ou-1Jxjo0gxFwG{`LyOdk26CsWp$8)SAt3IV}6*oe@VhsDKrI^+OMR z%0uAM#;-9IaxNW~6QcekUZ;gFu`f;94XK#PE?TbOkY`7pu8DiU*#NW5yySBYPBqq; z+r9A-ig#L)_rQt$*y76EH^b_4%b9Px zBN8(;-kd6igMCTDlF1zpmv>eLkbC^GZTbaPwVCjQbO5s$4dQsN#`Id*Y!>4Jp&lA& zjMq?%gSg$3LI(#(A*8AiZ(|@CXA5(l2`N`!8i@j{IpXb1*Qu(=ZAyhs2#@l_Zc-@5 zHAcF+tF|XRrVQOY#<_BEH!@+P`W2@J-4tu-9Hcc?=5K=fa1tLD%s}s^&LCHtRBsBr z^jU5_z^_UDKZ^;1=1)lZ13WI`0Zq%`!X6BdM?pp9VSv^eUhg3Ve5fJ#sn0NrRp*2O zzo}lssX=712ql%`a8g~SVUH=G&AAzpZG3)-gx2XUa<;);<2L* zi35xKUzW*MMcBY~7Ao=~uAX&J$f=<}93QMu^i%&(RG@lnOoLbCz2wNdG>)!B$CM)d z!!=!#xc%quwCJTDy%puW^V`~R_#IXqtPPa0RA8^% z9z1Gi2dg*6ZszsV=f6a1X(P&lqljhiRpiKUM2cPOoV_{|W&pP)8kwtnM`E04rPa5K z%=n*aG|Z&Rh-kbQ(h^VucWz@_1Wcsk;{C1OEongk8Il0rAXYZYKyz5g|7s8ay%x$#l#SQ=22h|Dn|s z=o2GBTvbm%=cT|e=%M;}Uw_GI@N<_KWqN<=dYS~=H>ZbMVVe%#vR~R{&p0!H{KNg1 zlu{LUiby0&v?%ICP>vAi>Jp7OrI!^@;#%kXIUUp{i6*Z3D(L$FFE$-~)m->q* ze9z7rU}qTTS%}{d++oT~#BO*{@=Y#`qZUoesz}(Rh&nxMHoWYMz0RU6GKvH0Z~Spx z>=4>#cCxvMDd+{nJNR0l;nh|I2I4ZEUvq~SXJ^2koAIv8`N~f^>|RxmMkuu2kt}I9 z=eXJh`&Jn*&Y@n?Nzo~_w!MP^S{`6RRCPX0rz7dX!VCv4*IH>_K7ae&}#mSC9lWYftimQFM7f`zLqjJ?{8ha{VuM;NbP+!wC9)wei#N)sJ~ zEh|yLP|R5$h2^?Iq1iL|>ov}JO5%jn=|f8OP%{nA`Ez= zs9QX0#7BnzP{FL-YM{$wWwBE%VJvn>Nl8fxl-miz=sHlRD_ji@rZulMRlCe=Qn9_A zyYOSSY^=PF2N)S}8I7YZKNRm<-)F1+{g&}?j%wC0gwy*{F%tVlC7w5OwEBVWp;4a8S$t4zF%K3yel{Ptz@}$1&>YgORw4=`kb-t7I{X1QLz%H3f1c*Kz%tELE z?}w?j8|3t5D=8{zFO0pdKkPk zi|-KDIV*M%Iwd1mAuHx#<+A6d!r(9mFyQ4YywqxL(0a*dBbvUU$z+!BiY}$;UG}|)5%MoR zNu)h4ebdRSzH6+V(inw3tVn`Mb3K&pe6G8X=OcyL`L;*~?n=89@keW-AM`2IG0O8N z7PG6m-!K!aKV)Y5saKO6WIECk6X5>kRbncg0wQa5DDf$HIKpe_)S@Bp4`yq81k*N* zI?ZE^!=gI?)60?Kp|xdG0~QJYRIzpQLB9JjofO`IKD%~0 zTC)!eZ}&+;p#Nl3I}k8FDt3KSpnIZXZajM%osqR|Mu^34!I_)l-wkY-WZZ8c}AyvfSDm-4$Cne+bh_uz8A?fz# zGSr+;Z^_o`K@F3+T=NI$0{A57-= zdya#=qBGLK-gCYPV#4=9pgJI+T2s>7^GRlG)ShJTg~yfPp=2u6Bk{{{3chw}kWqAc zgZYd^5#SaFZ_TwsHxHT$6Yql7g^lWt2DjD)|2yqi_D&-q^Z_H=`pd)@b$%a=pMH}j zBVl<)c!g+t^kr_?F2c<-rZq=v`sxSYX4i^wD8^Kah5xRTfM7};WLj~%K>%yeTH}Fp zg#2}X{}j-MUL)_2P^13Gp@R74E+zQ0ki+0xY5kf9pi3PDXHB-6#K&OvU0+I7dm9=k z^_zznbG2_+$hmz!p@LK|wP1R>U8lPYt^`i)PgCTU!K700i{2y@g=`d+m!CW2+JJ;+ zG~p*(FVM}8kI%YlVP(IAdWAk^KC_dz4vsbHnEFWB43p3d0tGz{9cOFf`6PbZ^;&ae zlT?bMv*_Ah!v{LAjN)TtipGN7RQ_Q1yUZp(;}b6uX;68Sr9&#j(u^6jRc5JG!^w1H z*HkYPs6yDnd+lz(X+o|wId7ys3At2eJCGn6T@AoJ^V>7JH7~h#(h-#!r3gJeT&A*m z1CB#mbPhy0t&d&TZ;?OX6+KWEwn;K|U=ronjbL`R3NF{DIF)57Cfx{r^Whj1L{+CM zI*P!!4%BuBr#z`oRQ?`eL_x$E&`vk11V%1!$& zbGM0*e#8dS-lbIN=K5F{WUb?Y3x9Fdz-iA-;IR-^BCnnE&ihR lzn@I}n^--ax<+HHq0wj-S09^+{*+tOin1y)#jlP1{|ngSic 3 +console.log(math.subtract(1, 2)); //=> -1 + +console.log(add(1, 2)); //=> 3 +console.log(subtract(1, 2)); //=> -1 + +$('h1').css({ color: 'tomato' }); +console.log(_.shuffle(_.range(1, 50)).slice(0, 6)); diff --git a/05_react/unterricht/tag37/03_import-es6/assets/js/math.js b/05_react/unterricht/tag37/03_import-es6/assets/js/math.js new file mode 100644 index 0000000..365790e --- /dev/null +++ b/05_react/unterricht/tag37/03_import-es6/assets/js/math.js @@ -0,0 +1,8 @@ +// explizite Freigabe von Einheiten +export const add = (a, b) => a + b; +export const subtract = (a, b) => a - b; + +export default { + add, + subtract, +}; diff --git a/05_react/unterricht/tag37/03_import-es6/index.html b/05_react/unterricht/tag37/03_import-es6/index.html new file mode 100644 index 0000000..205d3ee --- /dev/null +++ b/05_react/unterricht/tag37/03_import-es6/index.html @@ -0,0 +1,28 @@ + + + + + + Module in JS mit Bundler + + + + + +
+
+

Verwendung und Import von Modulen in JS (ES6) OHNE BUNDLER

+
+

Um die Modul-Schreibweise in JS zu verwenden, müssen folgende Punkte berücksichtigt werden:

+
    +
  • Script-Tag benötigt die Modulangabe mit "type=module"
  • +
  • Kommunikation läuft über das HTTP-Protokoll (HTTP-Kommunikation lokal über Server)
  • +
  • Eingebundene Module müssen mit Dateiendung (.js) angegeben werden.
  • +
+

Ergebnis

+

Die einzelnen Komponenten werden zur Laufzeit (Runtime) einzeln per HTTP-Request eingebunden

+ script Attribute +
+
+ + diff --git a/05_react/unterricht/tag37/03_import-es6/package-lock.json b/05_react/unterricht/tag37/03_import-es6/package-lock.json new file mode 100644 index 0000000..cc05949 --- /dev/null +++ b/05_react/unterricht/tag37/03_import-es6/package-lock.json @@ -0,0 +1,660 @@ +{ + "name": "03_import-es6", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "03_import-es6", + "version": "1.0.0", + "dependencies": { + "jquery": "^4.0.0", + "lodash": "^4.18.1" + }, + "devDependencies": { + "http-server": "^14.1.1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-server": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-auth": "^2.0.1", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.2.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy": "^1.18.1", + "mime": "^1.6.0", + "minimist": "^1.2.6", + "opener": "^1.5.1", + "portfinder": "^1.0.28", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^4.0.1" + }, + "bin": { + "http-server": "bin/http-server" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jquery": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", + "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/portfinder": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.38.tgz", + "integrity": "sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.6", + "debug": "^4.3.6" + }, + "engines": { + "node": ">= 10.12" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "dev": true, + "dependencies": { + "qs": "^6.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + } + } +} diff --git a/05_react/unterricht/tag37/03_import-es6/package.json b/05_react/unterricht/tag37/03_import-es6/package.json new file mode 100644 index 0000000..2eb9828 --- /dev/null +++ b/05_react/unterricht/tag37/03_import-es6/package.json @@ -0,0 +1,18 @@ +{ + "name": "03_import-es6", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "npx http-server -p 3000 -c-1" + }, + "keywords": [], + "type": "commonjs", + "devDependencies": { + "http-server": "^14.1.1" + }, + "dependencies": { + "jquery": "^4.0.0", + "lodash": "^4.18.1" + } +} diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js b/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js new file mode 100644 index 0000000..26de4be --- /dev/null +++ b/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/main.js @@ -0,0 +1,15 @@ +import math from './math'; // mit bundler keine dateiendung notwendig + +import $ from 'jquery'; // suche im node_modules und zusammenführen nur mit bundler +import _ from 'lodash'; + +import { add, subtract } from './math'; + +console.log(math.add(1, 2)); //=> 3 +console.log(math.subtract(1, 2)); //=> -1 + +console.log(add(1, 2)); //=> 3 +console.log(subtract(1, 2)); //=> -1 + +$('h1').css({ color: 'tomato' }); +console.log(_.shuffle(_.range(1, 50)).slice(0, 6)); diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js b/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js new file mode 100644 index 0000000..365790e --- /dev/null +++ b/05_react/unterricht/tag37/04_import-mit-bundler/assets/js/math.js @@ -0,0 +1,8 @@ +// explizite Freigabe von Einheiten +export const add = (a, b) => a + b; +export const subtract = (a, b) => a - b; + +export default { + add, + subtract, +}; diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/index.html b/05_react/unterricht/tag37/04_import-mit-bundler/index.html new file mode 100644 index 0000000..9760c55 --- /dev/null +++ b/05_react/unterricht/tag37/04_import-mit-bundler/index.html @@ -0,0 +1,25 @@ + + + + + + Module in JS mit Bundler + + + + + +
+
+

Verwendung und Import von Modulen in JS MIT BUNDLER

+
+

Um die Modul-Schreibweise in JS zu verwenden, müssen folgende Punkte berücksichtigt werden:

+
    +
  • Eingebundene Module können ohne Dateiendung eingebunden werden.
  • +
+

Ergebnis

+

Die einzelnen Komponenten werden zur Kompilierzeit zu einer Datei zusammengefasst

+
+
+ + diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json b/05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json new file mode 100644 index 0000000..27b7b82 --- /dev/null +++ b/05_react/unterricht/tag37/04_import-mit-bundler/package-lock.json @@ -0,0 +1,2600 @@ +{ + "name": "04_import-mit-bundler", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "04_import-mit-bundler", + "version": "1.0.0", + "dependencies": { + "jquery": "^4.0.0", + "lodash": "^4.18.1" + }, + "devDependencies": { + "esbuild": "^0.28.1", + "npm-run-all": "^4.1.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "is-callable": "^1.2.7", + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jquery": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-4.0.0.tgz", + "integrity": "sha512-TXCHVR3Lb6TZdtw1l3RTLf8RBWVGexdxL6AC8/e0xZKEpBflBsjh9/8LXw+dkNFuOyW9B7iB3O1sP7hS0Kiacg==", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/npm-run-all": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/own-keys": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", + "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shell-quote": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", + "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.padend": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", + "integrity": "sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + } + } +} diff --git a/05_react/unterricht/tag37/04_import-mit-bundler/package.json b/05_react/unterricht/tag37/04_import-mit-bundler/package.json new file mode 100644 index 0000000..b326e51 --- /dev/null +++ b/05_react/unterricht/tag37/04_import-mit-bundler/package.json @@ -0,0 +1,21 @@ +{ + "name": "04_import-mit-bundler", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "js": "npx esbuild assets/js/main.js --bundle --watch --outfile=dist/bundle.js", + "server": "npx http-server -c-1 -p 3000", + "start": "run-p server js" + }, + "keywords": [], + "type": "commonjs", + "devDependencies": { + "esbuild": "^0.28.1", + "npm-run-all": "^4.1.5" + }, + "dependencies": { + "jquery": "^4.0.0", + "lodash": "^4.18.1" + } +}