From 41b7d4b608d3fbf9a273622f9fd5d1e4a475144d Mon Sep 17 00:00:00 2001
From: alexZ7000 <78627928+alexZ7000@users.noreply.github.com>
Date: Mon, 26 Aug 2024 21:18:42 -0300
Subject: [PATCH] basic setup
---
.env.examples | 1 +
.github/workflows/CI.yml | 46 ++--
README.md | 2 +-
__tests__/example-page.spec.tsx | 8 +-
index.html | 5 +-
package-lock.json | 117 ++++++++--
package.json | 5 +-
public/react-git-logo-black.png | Bin 0 -> 117331 bytes
public/react-git-logo-white.png | Bin 0 -> 110824 bytes
public/vite.svg | 1 -
.../integrations/modules/Github/GetUser.ts | 38 +++
.../modules/Github/GetUserOrganizations.ts | 39 ++++
.../modules/Github/GetUserRepo.ts | 42 ++++
src/@clean/shared/domain/enums/.keep | 0
.../shared/domain/enums/UserStatusEnum.ts | 4 +
src/App.tsx | 25 +-
src/app/assets/react-git-logo-black.png | Bin 0 -> 117331 bytes
src/app/assets/react-git-logo-white.png | Bin 0 -> 110824 bytes
src/app/assets/warning.png | Bin 0 -> 25511 bytes
src/app/utils/constants/.keep | 0
src/app/utils/constants/NavbarProperties.ts | 14 ++
src/app/utils/functions/ThemeDetector.ts | 18 ++
src/app/utils/interfaces/.keep | 0
src/app/utils/interfaces/IGithubUser.ts | 34 +++
.../interfaces/IGithubUserOrganizations.ts | 14 ++
.../interfaces/IGithubUserRepositories.ts | 100 ++++++++
.../IGithubUserSpecificRepository.ts | 216 ++++++++++++++++++
src/app/web/components/.keep | 0
.../web/components/Generic/ModernInput.tsx | 42 ++++
src/app/web/components/Generic/Navbar.tsx | 36 +++
.../web/components/Generic/ToastContainer.tsx | 14 ++
src/app/web/components/Home/SearchUser.tsx | 83 +++++++
src/app/web/routes/index.tsx | 29 ++-
src/app/web/screens/Error404.tsx | 18 ++
src/app/web/screens/ExamplePage.tsx | 3 -
src/app/web/screens/Home.tsx | 9 +
src/app/web/screens/Loading.tsx | 23 ++
.../web/screens/ShowRepositories.tsx} | 0
src/index.css | 72 ++++++
tsconfig.app.json | 2 +-
vite.config.ts | 2 +-
41 files changed, 1005 insertions(+), 57 deletions(-)
create mode 100644 public/react-git-logo-black.png
create mode 100644 public/react-git-logo-white.png
delete mode 100644 public/vite.svg
create mode 100644 src/@clean/integrations/modules/Github/GetUser.ts
create mode 100644 src/@clean/integrations/modules/Github/GetUserOrganizations.ts
create mode 100644 src/@clean/integrations/modules/Github/GetUserRepo.ts
delete mode 100644 src/@clean/shared/domain/enums/.keep
create mode 100644 src/@clean/shared/domain/enums/UserStatusEnum.ts
create mode 100644 src/app/assets/react-git-logo-black.png
create mode 100644 src/app/assets/react-git-logo-white.png
create mode 100644 src/app/assets/warning.png
delete mode 100644 src/app/utils/constants/.keep
create mode 100644 src/app/utils/constants/NavbarProperties.ts
create mode 100644 src/app/utils/functions/ThemeDetector.ts
delete mode 100644 src/app/utils/interfaces/.keep
create mode 100644 src/app/utils/interfaces/IGithubUser.ts
create mode 100644 src/app/utils/interfaces/IGithubUserOrganizations.ts
create mode 100644 src/app/utils/interfaces/IGithubUserRepositories.ts
create mode 100644 src/app/utils/interfaces/IGithubUserSpecificRepository.ts
delete mode 100644 src/app/web/components/.keep
create mode 100644 src/app/web/components/Generic/ModernInput.tsx
create mode 100644 src/app/web/components/Generic/Navbar.tsx
create mode 100644 src/app/web/components/Generic/ToastContainer.tsx
create mode 100644 src/app/web/components/Home/SearchUser.tsx
create mode 100644 src/app/web/screens/Error404.tsx
delete mode 100644 src/app/web/screens/ExamplePage.tsx
create mode 100644 src/app/web/screens/Home.tsx
create mode 100644 src/app/web/screens/Loading.tsx
rename src/{@clean/integrations/modules/.keep => app/web/screens/ShowRepositories.tsx} (100%)
diff --git a/.env.examples b/.env.examples
index e69de29..ec2852e 100644
--- a/.env.examples
+++ b/.env.examples
@@ -0,0 +1 @@
+VITE_ENDPOINT_URL=
\ No newline at end of file
diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml
index 54d9723..ec8fc79 100644
--- a/.github/workflows/CI.yml
+++ b/.github/workflows/CI.yml
@@ -1,34 +1,34 @@
name: CI
on:
- push:
- branches:
- - main
- pull_request:
- branches:
- - main
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
jobs:
- build:
- runs-on: ubuntu-latest
+ build:
+ runs-on: ubuntu-latest
- steps:
- - name: Checkout repository
- uses: actions/checkout@v3
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
- - name: Set up Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '20.11.0'
+ - name: Set up Node.js
+ uses: actions/setup-node@v3
+ with:
+ node-version: "20.11.0"
- - name: Install dependencies
- run: npm ci
+ - name: Install dependencies
+ run: npm ci
- - name: Run linter
- run: npm run lint:fix
+ - name: Run linter
+ run: npm run lint:fix
- - name: Run tests
- run: npm run test
+ - name: Run tests
+ run: npm run test
- - name: Build project
- run: npm run build
+ - name: Build project
+ run: npm run build
diff --git a/README.md b/README.md
index e4ac585..4d3f6ba 100644
--- a/README.md
+++ b/README.md
@@ -22,4 +22,4 @@ In root folder run this command
npm install
```
-Template made in NodeJS: 20.11.0
\ No newline at end of file
+Template made in NodeJS: 20.11.0
diff --git a/__tests__/example-page.spec.tsx b/__tests__/example-page.spec.tsx
index 9f20389..1f69893 100644
--- a/__tests__/example-page.spec.tsx
+++ b/__tests__/example-page.spec.tsx
@@ -1,9 +1,3 @@
-import { render, screen } from "@testing-library/react";
-import ExamplePage from "../src/app/web/screens/ExamplePage";
-
describe("ExamplePage", () => {
- it("should render correctly", () => {
- render();
- expect(screen.getByText("Hello world!"));
- });
+ it("should render correctly", () => {});
});
diff --git a/index.html b/index.html
index fca97ce..39cc3cd 100644
--- a/index.html
+++ b/index.html
@@ -1,8 +1,7 @@
-
-
+
+
-
Clean React Template
diff --git a/package-lock.json b/package-lock.json
index 26822fb..03ab4fa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,8 +8,11 @@
"name": "clean-react-template",
"version": "0.0.0",
"dependencies": {
+ "axios": "^1.7.5",
"react": "^18.3.1",
- "react-dom": "^18.3.1"
+ "react-dom": "^18.3.1",
+ "react-hot-toast": "^2.4.1",
+ "react-router-dom": "^6.26.1"
},
"devDependencies": {
"@babel/preset-env": "^7.25.3",
@@ -3208,6 +3211,14 @@
"url": "https://opencollective.com/unts"
}
},
+ "node_modules/@remix-run/router": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.1.tgz",
+ "integrity": "sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.20.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.20.0.tgz",
@@ -4564,8 +4575,7 @@
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/autoprefixer": {
"version": "10.4.20",
@@ -4619,6 +4629,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/axios": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz",
+ "integrity": "sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
"node_modules/babel-jest": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
@@ -5876,7 +5896,6 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -6079,8 +6098,7 @@
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
- "dev": true
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/currently-unhandled": {
"version": "0.4.1",
@@ -6435,7 +6453,6 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
"engines": {
"node": ">=0.4.0"
}
@@ -8053,6 +8070,25 @@
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
"node_modules/for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
@@ -8082,7 +8118,6 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dev": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
@@ -8534,6 +8569,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/goober": {
+ "version": "2.1.14",
+ "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz",
+ "integrity": "sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==",
+ "peerDependencies": {
+ "csstype": "^3.0.10"
+ }
+ },
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -11528,9 +11571,9 @@
}
},
"node_modules/micromatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
- "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"dependencies": {
"braces": "^3.0.3",
@@ -11553,7 +11596,6 @@
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
"dependencies": {
"mime-db": "1.52.0"
},
@@ -11565,7 +11607,6 @@
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -12869,6 +12910,11 @@
"integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
"dev": true
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
"node_modules/pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
@@ -12979,12 +13025,57 @@
"react": "^18.3.1"
}
},
+ "node_modules/react-hot-toast": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz",
+ "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==",
+ "dependencies": {
+ "goober": "^2.1.10"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=16",
+ "react-dom": ">=16"
+ }
+ },
"node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
"dev": true
},
+ "node_modules/react-router": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.1.tgz",
+ "integrity": "sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==",
+ "dependencies": {
+ "@remix-run/router": "1.19.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.1.tgz",
+ "integrity": "sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==",
+ "dependencies": {
+ "@remix-run/router": "1.19.1",
+ "react-router": "6.26.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
"node_modules/react-shallow-renderer": {
"version": "16.15.0",
"resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
diff --git a/package.json b/package.json
index b1f34a8..6f7d778 100644
--- a/package.json
+++ b/package.json
@@ -15,8 +15,11 @@
"prepare": "husky"
},
"dependencies": {
+ "axios": "^1.7.5",
"react": "^18.3.1",
- "react-dom": "^18.3.1"
+ "react-dom": "^18.3.1",
+ "react-hot-toast": "^2.4.1",
+ "react-router-dom": "^6.26.1"
},
"devDependencies": {
"@babel/preset-env": "^7.25.3",
diff --git a/public/react-git-logo-black.png b/public/react-git-logo-black.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d56be6be894d8d4301376262edb2a43e3d9895b
GIT binary patch
literal 117331
zcmY(r1z1$y*EURpbaxIQozfv7-C!Wnp@4LEBVB?bB8{XpNOzZ%ba!_-AocFS-~ala
z?_47zGw1BH_S$>ZeXm2fhMGJUIypKV92}OSg3NO`IK*w(KQt8ZiR$<9b@2AcUg3=s
z92_S->>s>)j)W^5eBYj;jMPi_l>G%aZ^C!0D97g2M`mMQIE)PEi;)?8QnKu!%v$>w
z`?qCK$Fz;c)!U(x*Mt~pgtD?4^|+R_9~ZB4t<#ri=;%ItR;{QMZMgQn&8T>{xsW=O
z1WkgbLWu~`bI=?y+UAgHArR<_R4PO3LPT~)Q)Ipb;UZ`2BS)4{!{r2Q2t=YiNCXcL
z&w~^Z_681QcHv+X;e;-(vbNx`hvRP`ygmZvj*N_NAgVJ20y(8cfxW>FG9$@EGzxui
zT0Z?G4)`gGxsAW7`1Rj~dR_i%GBV>-1~!b~DqTm6PDi%bCF7=;|GsX6eGNMp5HYu@
zTeZNbG(CvIKnM>w#QM-OTY2yu+#V7bga7~D5=v{p!}M_fcvRsKW8p91VPOis?gD^Tx!PmtjyA6T-Vf{J#<rXxY4{{(`>!=pIUbjXoEhzGgv^gj$D{T&|m
zHVoAqd^B^Ku)N2%@t<-|tuVKrMqu$jh$eFv3=dnH-U0U&@D7LKoZkIO7%%SEajObA
z;kMQPa7~-!-<7-HxPlD~S=s)rYuu8FBoxtF_Mb{leK5Dd`G=i_x!`SF9&_6_@IvaJ
zI7?tV$iu`5^ClTylac9!ZMk(@6&-M9#j;hv)KtH+xKZlI2OabZ@?>1oh5Wa_X<>tgrsJTVRWG4%Y>+%t9AMAG~qK*wGk$au=0<`o`>AkU>U;^FyEW{Ag0p6yE04LjyeXOsWGA<*xf
z%LBy1=u*Raqun*YWFhA)8I{CR4-*4B)W=%NT!HBj`QPt{`C^9dq5Pcnyj!9T2lreAG2a_ULcziY)hXc~eVuAcB@qlz5DgCTw|3x5ggy}w$M
zMFr9>brAx;Mp(vxwq5iF>E9XPq$Va!3=w*rj5X?iYcwv3@9JPK1C+Zm!cT0}9gd=1V|3=e1I-XaQSx*Na!Kc{*5$juDFo5+DN(z3h*n9k>0tG*;b^>S*
z3_8;H;KN}WnT^Wd9(RrdI&Ip3kxqZwWGNlq}9;IIuG7HQq4EqyI@B*K!u;j}2CZ
z+ScLUeHfk+KEwtv=uKiQvU7C-3OV>LOYL}B0bHHv%?_?kKzcYoYv_bhQ6``jRoW{3
zYTJBc2Q~|E+(gErIHU75GDype!{bE3MC}Ph6tQ~zZ$;K6yoE9lF?Rxjb(8;{pA?Jg
z>|f4NW^eVd&T%cLK`;kRnBhJV4~EmrK-QADYAnh`!nd^n@$i$o0R!Ze#up!`Gz|fx
zMgXQUyekR`bXc%}4|~lH^m!AK4lLj~!lVCvO(21>4QER6a4y~zL;`agPTF&M`O8CE
zaH{T0uGK&kmY#HjDJ_DBEJlq68zYbg)p=422+7P{HVKT2<_1VErjLwm`~E>)r!KzK
zBk*#955GW8k>PPiSTv5GV*>l5MhXw>jYYE5!1_2msH2?m-;E%KM6_Vlod2^5VT_Ci
z{iE2vgP?1R!2#2~`U!^tn}^I@_>?&aZiXOwrZpqL*YN(E<~KMX`I@fLverMz#o@`H
z!y}!Wn|p&XB|68z4C98;m;KcO{4ZYqladIYdW3B0{~IC@4hIYYPQ0Q@n?)cN6vvCR
zGnGVb9ZR}jBYqeaQfKk%C3$hChJ
zrC%3^@`D(QAc+{q{!a)G3`Ea#?rv~m>`DR17Zv`1v!nQ_{&)7eFlG+ZNy9dYobbQ(
z-^Iy1xCaqYq)nL%*vg(eCq3j;9CQ1&dn~Dg4ainv4|kLq2OH70
zq5XYqexpVN9Bo!5SF$%n&5xgifpArFh|xNT-+9p5`8^GL-kSz3;Y}x;rPkQLD>JrDpn*2TO<|RvWh&A
zwspt3x=4BSv~kcZXvSL3$@B@Fq;o{sG)GwyhegF#-84Ia?{#%#W|3sk7mxY)_%jRY
z9t~m*T2%10%};;m?v@+>wmUjLjTG61kUW8&*Xzm_&x1of@>z*LN)GX-4hJR*V%GQX
znNt)QQ+t^jX!atq)7IG9?5g>trSk9IF&1gDf!DWhzwCvq(^#0}Vl`M_a)*!_^O5tg
zJCSCYWEqW9;Nla9v>~EGSOri#qp8t>)b^`->$t|%Nuwhp{`(y>%xqlpFH8yg`;{Hm
z6|jG>vKjMEctL~k@PMg3;u*T4x1DI#WF;K2?KSp6;=_3^rqLMR3`>8_|B}Z>!Vv?yx=gKR^G&%sgh{1p21}yq?&tjIuIZEG(?v!9iIA18P=QR-N{`pOBb1
ztFe(1jJmqq>@)3mj2p8_DfQ-kQfGQpmo8lmjAvxtnW3@wW=
zndayyS}dBp^Gm+=j&@usqTuB+4N@$*4c9?-}M*iTXQ*3K>MT`WGfP{vgd2j@$
z_LK=tgPAZ-Z1L_Yt)IEt>cIBa>sq3i<0w^}DFQ-?-4j09{FslQKeH|q?;;n4Pe3p$
zHy5Sq)kJ<#iQKzaj6VtsHDA36UTufG)Y8hxEGX#V#aC=sZCDt|l;$yRf0*)j`PgSB
zCJ=lA0z67e%$(;tUtEMz)wJ1(KPM)B&&opB*myNvV}}zFp;Yb##ikT>#mvdcv3-*$
zv5MDSlbxMwvK|&k%HxRC9Yq~9{_~}btSlWJ9lTDl)^8V4N^C+RqVKh}q@u3-tuY6p
z#~rZ}S@~s>zb~FIuij4P(PWa1F!qdP0oNejXTc3&6~Whxivz|D9H*p(yAUwwtgI|t
zB5HV33$*r*j=6R>4Gr8tHD|-AR12!9y^F;=X4`iH$;Rc{U`eibf0;f
z66{*-jgDx<{@AsAsr5RuZ`^-&R%d*Cy!EZ6r0hH7A3q9#-2^plDDwJD6a*Fd~Cy{0BvKLC-f2{7a)^7WKY^U6L
z=c;x!f{oi|mJfImMMF-(a&7kfl9KK}2Xp1N3nJF@m-I0-!vPbP7p|jXG4g0!1V~5}
zK|J7mcKr&Z%3+bp14v?xZlBkHWz}kLW{3M$s^4l5&Z4PCp6^L<)6xQfG5k@v{MNX1
zU*h_QmDzs?mZyCzfRdS+85R{GWAY4=rT#O5sk57oofpBu!2t~i$Bx21TC8KmKBGF9
zIOknXe(?`EMGvxmWhG4=&6xJ~XD?rA!PaylAtArGQ2O0FB5T(eUsdt#P1@Wk3Wq;4
z=4*fVUYl(GN~*BpIEw7=SF)b{`DkylxFZB>>3eoInpx${T-Pa@pRnN-KAxn#2De-^
zSuipNu~Azfa__HS=LL~^;#Vu7G{>9ii>4B`j?`
z#mA-=YNgg6XA7VhX}C)TP#7hS&Rut6bv|=MFC{P1dqh-|yNF6=Gx=h;A#J$RVZ#|22Yp7f9>L<9i44^qq
z30(N_q(4Pe(!|KN(!4l{ISoG0Nr$*MXj8i^w@NjhuPR?I-$GXiJ@$w$*zG%nTm3mj
z#f+{9>TFf3l%kKrz&83o%g0AJT3)W8s@9!Bw?oQp1o!**?~mWU?M}VEcw}K=A?fS;
z^fYFRjteS;P5JagU?9TF%CyB6qpC$S)~aN%Z*zLbQ%2KRB2DmQi-&xYC=uqx`3nj>njmF$+y}<#OYp~Lx!GDAFF=*P+KcxM>1dq
zTDrEd4$sKYwISc2|&kV?h}SmxdxV
zlCzOinM)_)WUZ%i>y2o-&mUoGuX7wB`)yiUe`xNDJkpT{cL1a6x@VjUF3xA6q+$n!
zVzy<#BXZjx8)Y*v(g|}A0b#>pBIH!8F{9+ZlPD`VnhGRqYH5Z1_`&));d3Uf1P-#S
zY_D*95ZD;23ToK9ySt70D)Ab7?npRKFX0Xw_tb#P_Ns4Rx_9eq{I&D;I9^AY)7chyW)xeF#>^2wn$|^)xpuXLlHVtn`|{E|i)$7UQq{H&AbsCD
zRwUoQXKDVs%hq@{BvEEH#d&EmdE5pW2thM4nuXJII#AMc9+g#4Rt{3iIdv_6dvv_g
zad~UwW^(Jc2gjW~RshrP7x;xapk1ctcB-0$#(bpQmcK|0e{*08W
zhFYwJQLMFB^PTh4Po0KVU6AO3G~@GUS|%n`FX(>Pq@l0WjU7rhR_g>?Xm$HY>hG~nJ5g!8!}j;B-=MgV5i1JFz)6XS549X4=($Y1`ufB?
z2KcH(--SlxfiE2Lnu>UEA?K3a{)>Zbq$3+2P+9y&lQ{}-k+O4hAy4Vx5mB)^d*kTi
z;?e@*zRN@S`CnD=;@2s^c|+!Uv=|L;^7de`9eksqsS~nR=dq8#g$UMl6@#nWaOnyI
z