From da0982b5ff2f94c8781c5cffbcdab784e325b996 Mon Sep 17 00:00:00 2001
From: SrIzan10 <66965250+SrIzan10@users.noreply.github.com>
Date: Fri, 17 Nov 2023 19:29:30 +0100
Subject: [PATCH] feat: switch to nextjs (#7)
* feat: switch to nextjs
* chore: move everyting to main dir
* fix: blogpostgen
* chore: dot?
* chore: remove blogposts
* fix: everything
* chore: why
* chore: move to public
* chore: fetch
* chore: remove slash
* chore: aedfa
* feat: defenitive nextjs move
---
.eslintrc.cjs | 14 -
.eslintrc.json | 3 +
.gitignore | 55 +-
.idea/.gitignore | 5 +
.idea/discord.xml | 7 +
.idea/mainwebsite.iml | 12 +
.idea/modules.xml | 8 +
.idea/vcs.xml | 6 +
.vscode/settings.json | 3 +
README.md | 2 +-
index.html | 14 -
next.config.js | 2 +
package.json | 58 +-
public/blog/atom.xml | 198 +
public/blog/feed.json | 38 +
public/blog/rss.xml | 191 +
public/collab-highres.webp | Bin 3319356 -> 0 bytes
public/vite.svg | 1 -
src/app/(pages)/(root)/page.tsx | 27 +
.../(pages)/blog/[id]/page.tsx} | 58 +-
src/app/(pages)/blog/page.tsx | 30 +
.../(pages)/collab/page.tsx} | 4 +-
.../_components}/BlogNavBar.tsx | 15 +-
.../_components}/BlogPostCard.tsx | 8 +-
src/app/_components/BlogRssDial.tsx | 44 +
.../EmotionRootStyleRegistry.tsx | 56 +
src/app/_components/ThemeRegistry/theme.ts | 36 +
src/{css => app/_css}/Blog.css | 0
src/{css => app/_css}/BlogNavBar.css | 0
src/{css => app/_css}/BlogPost.css | 14 +-
src/{css => app/_css}/BlogPostCard.css | 0
src/{css/App.css => app/_css/Root.css} | 8 +-
src/{css/index.css => app/globals.css} | 3 +
src/app/layout.tsx | 28 +
src/blog/.idea/.gitignore | 3 +
src/blog/.idea/blog.iml | 8 +
src/blog/.idea/discord.xml | 7 +
src/blog/.idea/modules.xml | 8 +
src/blog/.idea/vcs.xml | 6 +
src/blogPostGenerator.js | 2 +-
src/components/AnalyticsNotice.tsx | 84 -
src/main.tsx | 53 -
src/pages/App.tsx | 30 -
src/pages/Blog.tsx | 66 -
src/vite-env.d.ts | 1 -
tsconfig.json | 37 +-
tsconfig.node.json | 10 -
vercel.json | 5 -
vite.config.ts | 10 -
yarn.lock | 3635 ++++++++++-------
50 files changed, 2928 insertions(+), 1985 deletions(-)
delete mode 100644 .eslintrc.cjs
create mode 100644 .eslintrc.json
create mode 100644 .idea/.gitignore
create mode 100644 .idea/discord.xml
create mode 100644 .idea/mainwebsite.iml
create mode 100644 .idea/modules.xml
create mode 100644 .idea/vcs.xml
create mode 100644 .vscode/settings.json
delete mode 100644 index.html
create mode 100644 next.config.js
create mode 100644 public/blog/atom.xml
create mode 100644 public/blog/feed.json
create mode 100644 public/blog/rss.xml
delete mode 100644 public/collab-highres.webp
delete mode 100644 public/vite.svg
create mode 100644 src/app/(pages)/(root)/page.tsx
rename src/{components/BlogPost.tsx => app/(pages)/blog/[id]/page.tsx} (67%)
create mode 100644 src/app/(pages)/blog/page.tsx
rename src/{pages/Collab.tsx => app/(pages)/collab/page.tsx} (90%)
rename src/{components => app/_components}/BlogNavBar.tsx (72%)
rename src/{components => app/_components}/BlogPostCard.tsx (87%)
create mode 100644 src/app/_components/BlogRssDial.tsx
create mode 100644 src/app/_components/ThemeRegistry/EmotionRootStyleRegistry.tsx
create mode 100644 src/app/_components/ThemeRegistry/theme.ts
rename src/{css => app/_css}/Blog.css (100%)
rename src/{css => app/_css}/BlogNavBar.css (100%)
rename src/{css => app/_css}/BlogPost.css (63%)
rename src/{css => app/_css}/BlogPostCard.css (100%)
rename src/{css/App.css => app/_css/Root.css} (82%)
rename src/{css/index.css => app/globals.css} (84%)
create mode 100644 src/app/layout.tsx
create mode 100644 src/blog/.idea/.gitignore
create mode 100644 src/blog/.idea/blog.iml
create mode 100644 src/blog/.idea/discord.xml
create mode 100644 src/blog/.idea/modules.xml
create mode 100644 src/blog/.idea/vcs.xml
delete mode 100644 src/components/AnalyticsNotice.tsx
delete mode 100644 src/main.tsx
delete mode 100644 src/pages/App.tsx
delete mode 100644 src/pages/Blog.tsx
delete mode 100644 src/vite-env.d.ts
delete mode 100644 tsconfig.node.json
delete mode 100644 vercel.json
delete mode 100644 vite.config.ts
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
deleted file mode 100644
index 4020bcb..0000000
--- a/.eslintrc.cjs
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = {
- env: { browser: true, es2020: true },
- extends: [
- 'eslint:recommended',
- 'plugin:@typescript-eslint/recommended',
- 'plugin:react-hooks/recommended',
- ],
- parser: '@typescript-eslint/parser',
- parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
- plugins: ['react-refresh'],
- rules: {
- 'react-refresh/only-export-components': 'warn',
- },
-}
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..bffb357
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/.gitignore b/.gitignore
index 78523e4..92ecd67 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,29 +1,38 @@
-# Logs
-logs
-*.log
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+.yarn/install-state.gz
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
-pnpm-debug.log*
-lerna-debug.log*
-node_modules
-dist
-dist-ssr
-*.local
+# local env files
+.env*.local
-# Editor directories and files
-.vscode/*
-!.vscode/extensions.json
-.idea
-.DS_Store
-*.suo
-*.ntvs*
-*.njsproj
-*.sln
-*.sw?
+# vercel
+.vercel
-# various stuff
-blogPosts.json
-public/blog/*.xml
-public/blog/feed.json
\ No newline at end of file
+# typescript
+*.tsbuildinfo
+next-env.d.ts
+
+blogPosts.json
\ No newline at end of file
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..b58b603
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,5 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/discord.xml b/.idea/discord.xml
new file mode 100644
index 0000000..d8e9561
--- /dev/null
+++ b/.idea/discord.xml
@@ -0,0 +1,7 @@
+
+
So, the last few months I've been migrating services from my good old Raspberry Pi into my new HP server and the last service I migrated was MongoDB.
+I've been using MongoDB for a while now and I've been using it for a few things, like my discord bots, webhooks-ui and probably other projects I don't remember right now.
+So, let's get started!
+My database instance is on Docker with a replica set of 1 node (itself) so Prisma works.
+My idea is to add the HP server as a secondary replica and then promote it to be the primary one, but I don't know if that will work, so we need to test some stuff.
+I first created 2 docker containers on my main Ryzen machine's WSL Ubuntu instance.
+I created a docker-compose.yml file with the following content:
version: "3.8"
+services:
+ mongo1:
+ image: mongo:4.4.17-rc0-focal
+ container_name: mongo1
+ restart: always
+ ports:
+ - 27017:27017
+ volumes:
+ - ./mongo1:/data/db
+ command: mongod --replSet mongoset
+ networks:
+ - mongo
+ mongo2:
+ image: mongo:4.4.17-rc0-focal
+ container_name: mongo2
+ restart: always
+ ports:
+ - 27018:27017
+ volumes:
+ - ./mongo2:/data/db
+ command: mongod --replSet mongoset
+ networks:
+ - mongo
+networks:
+ mongo:
+
+and ran it with docker compose up -d.
I went to connect with MongoDB Compass and it didn't work for some reason. I asked GPT and nothing. It looks like it accepted the connection but it won't connect, so I installed mongosh and tried to connect with that.
$ mongosh mongodb://localhost:27017
+
+...and it worked! That didn't make any sense, but okay, we can work with it.
+I then connected to the mongo1 instance and ran the following commands:
> rs.initiate()
+
+and it worked, but only that same database connected. Before adding the second database to the replica, I went ahead and pinged it from the first container (just to check if the network configuration worked):
+docker exec mongo1 sh -c "rm /bin/ping;apt update;apt install inetutils-ping -y;ping mongo2"
+
+I removed /bin/ping because I tried to transfer the binary from WSL to the container but it still needed some libraries and I didn't want to bother, so I just installed the package.
+It worked, so I went ahead and added the second database to the replica set:
+> rs.add("mongo2")
+
+After waiting for it, the second database connected and everything was working fine. Let's create a collection and some documents on the primary replica (mongo1):
+> use test
+> db.createCollection("test")
+> db.test.insertOne({ name: "test" })
+
+and then, let's check if it's on the second replica (mongo2):
+$ mongosh mongodb://localhost:27017
+
+> use test
+> db.getMongo().setReadPref("secondaryPreferred")
+> db.test.find()
+
+and, yeah, that worked.
+I don't really know if ORMs will read when connecting to the second replica, but for now it's fine as the main plan is on track.
So, to promote I connected to the primary replica (mongo1) and ran the following command:
> rs.stepDown()
+
+And that worked! Woo! The second replica is now the primary one. We can now start drum rolls please:
+This is it. We're doing it.
+I went ahead and created a new docker-compose file on my server with the following content:
+version: "3.8"
+services:
+ mongo:
+ image: mongo:4.4.17-rc0-focal
+ container_name: mongodb
+ restart: unless-stopped
+ ports:
+ - 27017:27017
+ volumes:
+ - ./mongo:/data/db
+ command: mongod --replSet rs0
+
+After deploying the stack, I connected using mongosh to the primary db and ran the following command:
+> rs.add("ip")
+
+and after waiting for a while it looked like it worked. I then connected to the new database and ran the following command to check if the replica cloned fine:
+> db.getMongo().setReadPref("secondaryPreferred")
+
+and let's just let the results speak for themselves:
+rs0 [direct: secondary] test> show dbs
+# author's note: some dbs are redacted for privacy reasons
+admin 80.00 KiB
+api 80.00 KiB
+ava 40.00 KiB
+bask 168.00 KiB
+config 144.00 KiB
+local 348.00 KiB
+vinci 428.00 KiB
+rs0 [direct: secondary] test> use vinci
+switched to db vinci
+rs0 [direct: secondary] vinci> show tables
+afk
+birthdays
+chatgpt
+giveaways-enters
+giveaways-message
+padyama
+suggestions
+twitter
+warns
+youtube
+rs0 [direct: secondary] vinci> db.afk.find()
+[
+ {
+ _id: ObjectId("sadfsad fsadfsdf"),
+ id: 'redacted',
+ reason: 'redacted',
+ __v: 0
+ },
+ {
+ _id: ObjectId("asdfsadfadf"),
+ id: 'redacted',
+ reason: 'readacted',
+ __v: 0
+ }
+]
+rs0 [direct: secondary] vinci>
+
+Nice. let's now try to write something to the database from Vinci:
That just worked and we can see it on the secondary replica:
rs0 [direct: secondary] vinci> db.afk.find({ id: '703974042700611634' })
+[
+ {
+ _id: ObjectId("6550eccc6154a8c9030fe76a"),
+ id: '703974042700611634',
+ reason: 'test',
+ __v: 0
+ }
+]
+
+Let's now edit all .envs and change the database url to the new secondary one. For this I checked all dbs that I have and then go from top to bottom editing the secrets.
+After that was done I needed to deploy all changes. I went ahead and created too many tabs on my terminal and ran the all deployment commands on each tab. At the same time.
I really hope that doesn't make my server run out of ram, because I'm really short on that.
After executing all the commands I rs.stepDown()'ed the primary Raspberry Pi replica and, as expected, the HP Server took over.
The last command of the day:
+> rs.remove("ip")
+
+...SIKE! I needed to check the logs of the containers to see if everything was working fine. The api and vinci to be exact.
This is because api runs Prisma and vinci runs the now defunct in my stack, mongoose.
Luckily enough, both were fine, so I was free. Yay!
+Welp, that was a lot of work. I'm glad it's over. I got my HP server on July and it's now November and I just finished migrating.
Could I have done it in less time? Yes.
Was I lazy? Also yes.
So that answers all your questions.
+I hope you enjoyed this my first blog post, and thankfully it was a big one.
This took 3 hours in total, but at the end of the day, it was worth it.
I'll see you in the next one!
+]]>This is probably the last time I'm going to make a blog. I've made a few in the past, but I've never really stuck to them. I'm hoping that this time will be different.
This one was made entirely from scratch using React and Markdown, initially trying to use MDX, but it was a pain to set up, and it didn't end up working in the end.
I'm hoping to post about my projects, and maybe some other stuff too. I'm not sure yet, but I'll figure it out as I go along.
Anyways, thank you for reading. I hope you enjoyed my UX/UI for this one!
PD: I need some help for making the blog text look good and readable, so hit me up on my Discord if you have any ideas.
+]]>So, the last few months I've been migrating services from my good old Raspberry Pi into my new HP server and the last service I migrated was MongoDB.
\nI've been using MongoDB for a while now and I've been using it for a few things, like my discord bots, webhooks-ui and probably other projects I don't remember right now.
\nSo, let's get started!
\nMy database instance is on Docker with a replica set of 1 node (itself) so Prisma works.
\nMy idea is to add the HP server as a secondary replica and then promote it to be the primary one, but I don't know if that will work, so we need to test some stuff.
\nI first created 2 docker containers on my main Ryzen machine's WSL Ubuntu instance.
\nI created a docker-compose.yml file with the following content:
version: "3.8"\nservices:\n mongo1:\n image: mongo:4.4.17-rc0-focal\n container_name: mongo1\n restart: always\n ports:\n - 27017:27017\n volumes:\n - ./mongo1:/data/db\n command: mongod --replSet mongoset\n networks:\n - mongo\n mongo2:\n image: mongo:4.4.17-rc0-focal\n container_name: mongo2\n restart: always\n ports:\n - 27018:27017\n volumes:\n - ./mongo2:/data/db\n command: mongod --replSet mongoset\n networks:\n - mongo\nnetworks:\n mongo:\n\nand ran it with docker compose up -d.
I went to connect with MongoDB Compass and it didn't work for some reason. I asked GPT and nothing. It looks like it accepted the connection but it won't connect, so I installed mongosh and tried to connect with that.
$ mongosh mongodb://localhost:27017\n\n...and it worked! That didn't make any sense, but okay, we can work with it.
\nI then connected to the mongo1 instance and ran the following commands:
> rs.initiate()\n\nand it worked, but only that same database connected. Before adding the second database to the replica, I went ahead and pinged it from the first container (just to check if the network configuration worked):
\ndocker exec mongo1 sh -c "rm /bin/ping;apt update;apt install inetutils-ping -y;ping mongo2"\n\nI removed /bin/ping because I tried to transfer the binary from WSL to the container but it still needed some libraries and I didn't want to bother, so I just installed the package.
\nIt worked, so I went ahead and added the second database to the replica set:
\n> rs.add("mongo2")\n\nAfter waiting for it, the second database connected and everything was working fine. Let's create a collection and some documents on the primary replica (mongo1):
\n> use test\n> db.createCollection("test")\n> db.test.insertOne({ name: "test" })\n\nand then, let's check if it's on the second replica (mongo2):
\n$ mongosh mongodb://localhost:27017\n\n> use test\n> db.getMongo().setReadPref("secondaryPreferred")\n> db.test.find()\n\nand, yeah, that worked.
\nI don't really know if ORMs will read when connecting to the second replica, but for now it's fine as the main plan is on track.
So, to promote I connected to the primary replica (mongo1) and ran the following command:
> rs.stepDown()\n\nAnd that worked! Woo! The second replica is now the primary one. We can now start drum rolls please:
\nThis is it. We're doing it.
\nI went ahead and created a new docker-compose file on my server with the following content:
\nversion: "3.8"\nservices:\n mongo:\n image: mongo:4.4.17-rc0-focal\n container_name: mongodb\n restart: unless-stopped\n ports:\n - 27017:27017\n volumes:\n - ./mongo:/data/db\n command: mongod --replSet rs0\n\nAfter deploying the stack, I connected using mongosh to the primary db and ran the following command:
\n> rs.add("ip")\n\nand after waiting for a while it looked like it worked. I then connected to the new database and ran the following command to check if the replica cloned fine:
\n> db.getMongo().setReadPref("secondaryPreferred")\n\nand let's just let the results speak for themselves:
\nrs0 [direct: secondary] test> show dbs\n# author's note: some dbs are redacted for privacy reasons \nadmin 80.00 KiB\napi 80.00 KiB\nava 40.00 KiB\nbask 168.00 KiB\nconfig 144.00 KiB\nlocal 348.00 KiB\nvinci 428.00 KiB\nrs0 [direct: secondary] test> use vinci\nswitched to db vinci\nrs0 [direct: secondary] vinci> show tables\nafk\nbirthdays\nchatgpt\ngiveaways-enters\ngiveaways-message\npadyama\nsuggestions\ntwitter\nwarns\nyoutube\nrs0 [direct: secondary] vinci> db.afk.find()\n[\n {\n _id: ObjectId("sadfsad fsadfsdf"),\n id: 'redacted',\n reason: 'redacted',\n __v: 0\n },\n {\n _id: ObjectId("asdfsadfadf"),\n id: 'redacted',\n reason: 'readacted',\n __v: 0\n }\n]\nrs0 [direct: secondary] vinci>\n\nNice. let's now try to write something to the database from Vinci:
That just worked and we can see it on the secondary replica:
rs0 [direct: secondary] vinci> db.afk.find({ id: '703974042700611634' })\n[\n {\n _id: ObjectId("6550eccc6154a8c9030fe76a"),\n id: '703974042700611634',\n reason: 'test',\n __v: 0\n }\n]\n\nLet's now edit all .envs and change the database url to the new secondary one. For this I checked all dbs that I have and then go from top to bottom editing the secrets.
\nAfter that was done I needed to deploy all changes. I went ahead and created too many tabs on my terminal and ran the all deployment commands on each tab. At the same time.
I really hope that doesn't make my server run out of ram, because I'm really short on that.
After executing all the commands I rs.stepDown()'ed the primary Raspberry Pi replica and, as expected, the HP Server took over.
The last command of the day:
\n> rs.remove("ip")\n\n...SIKE! I needed to check the logs of the containers to see if everything was working fine. The api and vinci to be exact.
This is because api runs Prisma and vinci runs the now defunct in my stack, mongoose.
Luckily enough, both were fine, so I was free. Yay!
\nWelp, that was a lot of work. I'm glad it's over. I got my HP server on July and it's now November and I just finished migrating.
Could I have done it in less time? Yes.
Was I lazy? Also yes.
So that answers all your questions.
\nI hope you enjoyed this my first blog post, and thankfully it was a big one.
This took 3 hours in total, but at the end of the day, it was worth it.
I'll see you in the next one!
\n", + "url": "https://srizan.dev/blog/2", + "title": "My tales of MongoDB migration", + "summary": "Here I ramble about the last service migration I did, MongoDB, and all the difficulties that came with it.", + "date_modified": "2023-11-11T23:00:00.000Z", + "author": { + "name": "Sr Izan", + "url": "https://srizan.dev" + } + }, + { + "id": "https://srizan.dev/blog/1", + "content_html": "This is probably the last time I'm going to make a blog. I've made a few in the past, but I've never really stuck to them. I'm hoping that this time will be different.
This one was made entirely from scratch using React and Markdown, initially trying to use MDX, but it was a pain to set up, and it didn't end up working in the end.
I'm hoping to post about my projects, and maybe some other stuff too. I'm not sure yet, but I'll figure it out as I go along.
Anyways, thank you for reading. I hope you enjoyed my UX/UI for this one!
PD: I need some help for making the blog text look good and readable, so hit me up on my Discord if you have any ideas.
\n", + "url": "https://srizan.dev/blog/1", + "title": "Welcome to my new blog!", + "summary": "This post welcomes you to my new blog", + "date_modified": "2023-08-19T22:00:00.000Z", + "author": { + "name": "Sr Izan", + "url": "https://srizan.dev" + } + } + ] +} \ No newline at end of file diff --git a/public/blog/rss.xml b/public/blog/rss.xml new file mode 100644 index 0000000..e1c284a --- /dev/null +++ b/public/blog/rss.xml @@ -0,0 +1,191 @@ + +So, the last few months I've been migrating services from my good old Raspberry Pi into my new HP server and the last service I migrated was MongoDB.
+I've been using MongoDB for a while now and I've been using it for a few things, like my discord bots, webhooks-ui and probably other projects I don't remember right now.
+So, let's get started!
+My database instance is on Docker with a replica set of 1 node (itself) so Prisma works.
+My idea is to add the HP server as a secondary replica and then promote it to be the primary one, but I don't know if that will work, so we need to test some stuff.
+I first created 2 docker containers on my main Ryzen machine's WSL Ubuntu instance.
+I created a docker-compose.yml file with the following content:
version: "3.8"
+services:
+ mongo1:
+ image: mongo:4.4.17-rc0-focal
+ container_name: mongo1
+ restart: always
+ ports:
+ - 27017:27017
+ volumes:
+ - ./mongo1:/data/db
+ command: mongod --replSet mongoset
+ networks:
+ - mongo
+ mongo2:
+ image: mongo:4.4.17-rc0-focal
+ container_name: mongo2
+ restart: always
+ ports:
+ - 27018:27017
+ volumes:
+ - ./mongo2:/data/db
+ command: mongod --replSet mongoset
+ networks:
+ - mongo
+networks:
+ mongo:
+
+and ran it with docker compose up -d.
I went to connect with MongoDB Compass and it didn't work for some reason. I asked GPT and nothing. It looks like it accepted the connection but it won't connect, so I installed mongosh and tried to connect with that.
$ mongosh mongodb://localhost:27017
+
+...and it worked! That didn't make any sense, but okay, we can work with it.
+I then connected to the mongo1 instance and ran the following commands:
> rs.initiate()
+
+and it worked, but only that same database connected. Before adding the second database to the replica, I went ahead and pinged it from the first container (just to check if the network configuration worked):
+docker exec mongo1 sh -c "rm /bin/ping;apt update;apt install inetutils-ping -y;ping mongo2"
+
+I removed /bin/ping because I tried to transfer the binary from WSL to the container but it still needed some libraries and I didn't want to bother, so I just installed the package.
+It worked, so I went ahead and added the second database to the replica set:
+> rs.add("mongo2")
+
+After waiting for it, the second database connected and everything was working fine. Let's create a collection and some documents on the primary replica (mongo1):
+> use test
+> db.createCollection("test")
+> db.test.insertOne({ name: "test" })
+
+and then, let's check if it's on the second replica (mongo2):
+$ mongosh mongodb://localhost:27017
+
+> use test
+> db.getMongo().setReadPref("secondaryPreferred")
+> db.test.find()
+
+and, yeah, that worked.
+I don't really know if ORMs will read when connecting to the second replica, but for now it's fine as the main plan is on track.
So, to promote I connected to the primary replica (mongo1) and ran the following command:
> rs.stepDown()
+
+And that worked! Woo! The second replica is now the primary one. We can now start drum rolls please:
+This is it. We're doing it.
+I went ahead and created a new docker-compose file on my server with the following content:
+version: "3.8"
+services:
+ mongo:
+ image: mongo:4.4.17-rc0-focal
+ container_name: mongodb
+ restart: unless-stopped
+ ports:
+ - 27017:27017
+ volumes:
+ - ./mongo:/data/db
+ command: mongod --replSet rs0
+
+After deploying the stack, I connected using mongosh to the primary db and ran the following command:
+> rs.add("ip")
+
+and after waiting for a while it looked like it worked. I then connected to the new database and ran the following command to check if the replica cloned fine:
+> db.getMongo().setReadPref("secondaryPreferred")
+
+and let's just let the results speak for themselves:
+rs0 [direct: secondary] test> show dbs
+# author's note: some dbs are redacted for privacy reasons
+admin 80.00 KiB
+api 80.00 KiB
+ava 40.00 KiB
+bask 168.00 KiB
+config 144.00 KiB
+local 348.00 KiB
+vinci 428.00 KiB
+rs0 [direct: secondary] test> use vinci
+switched to db vinci
+rs0 [direct: secondary] vinci> show tables
+afk
+birthdays
+chatgpt
+giveaways-enters
+giveaways-message
+padyama
+suggestions
+twitter
+warns
+youtube
+rs0 [direct: secondary] vinci> db.afk.find()
+[
+ {
+ _id: ObjectId("sadfsad fsadfsdf"),
+ id: 'redacted',
+ reason: 'redacted',
+ __v: 0
+ },
+ {
+ _id: ObjectId("asdfsadfadf"),
+ id: 'redacted',
+ reason: 'readacted',
+ __v: 0
+ }
+]
+rs0 [direct: secondary] vinci>
+
+Nice. let's now try to write something to the database from Vinci:
That just worked and we can see it on the secondary replica:
rs0 [direct: secondary] vinci> db.afk.find({ id: '703974042700611634' })
+[
+ {
+ _id: ObjectId("6550eccc6154a8c9030fe76a"),
+ id: '703974042700611634',
+ reason: 'test',
+ __v: 0
+ }
+]
+
+Let's now edit all .envs and change the database url to the new secondary one. For this I checked all dbs that I have and then go from top to bottom editing the secrets.
+After that was done I needed to deploy all changes. I went ahead and created too many tabs on my terminal and ran the all deployment commands on each tab. At the same time.
I really hope that doesn't make my server run out of ram, because I'm really short on that.
After executing all the commands I rs.stepDown()'ed the primary Raspberry Pi replica and, as expected, the HP Server took over.
The last command of the day:
+> rs.remove("ip")
+
+...SIKE! I needed to check the logs of the containers to see if everything was working fine. The api and vinci to be exact.
This is because api runs Prisma and vinci runs the now defunct in my stack, mongoose.
Luckily enough, both were fine, so I was free. Yay!
+Welp, that was a lot of work. I'm glad it's over. I got my HP server on July and it's now November and I just finished migrating.
Could I have done it in less time? Yes.
Was I lazy? Also yes.
So that answers all your questions.
+I hope you enjoyed this my first blog post, and thankfully it was a big one.
This took 3 hours in total, but at the end of the day, it was worth it.
I'll see you in the next one!
+]]>This is probably the last time I'm going to make a blog. I've made a few in the past, but I've never really stuck to them. I'm hoping that this time will be different.
This one was made entirely from scratch using React and Markdown, initially trying to use MDX, but it was a pain to set up, and it didn't end up working in the end.
I'm hoping to post about my projects, and maybe some other stuff too. I'm not sure yet, but I'll figure it out as I go along.
Anyways, thank you for reading. I hope you enjoyed my UX/UI for this one!
PD: I need some help for making the blog text look good and readable, so hit me up on my Discord if you have any ideas.
+]]>V0QnGkl{r(~zNBcG`g3Zd>^^E=n#jh2;i8pe#M4EYx6%M%Z9LrRuGeDN)&W|`E2}5ba|}?R7!BK- zs8$~7L;J>~i9{wzFjgs|DWYm#5Hx@SyTXLsgwq#DY@{R>r^hMDoly-ONF;=Yg$)0^ zGT)IXiiYonoMK8E8VmEH2pXbhxquYWbzFk=q!;UAzosxNz@G7t$ehxcnVEGE0!V?k zlSY>%#jVqshAVj}QN|m`0FK+HS``@bmg}n9?lxZB87$D%7_o!a8TKG{fch M8h{Ww=4E%?-I-}iHLY}cvEHWUZl8w+g`vR)(6VW0Iu-+< ^KCYrg>o=PZI z-`m@p_`u0I7f<4d6(!~lEq0T{n1IsUf_Su> el%4EJ{$89RG4)vhEbU9NG+%q 8%ofY?~txN5*O(J)a*waI;K@3nGXkU zZm&sVlL;*JVe1r@jPZ_maB&81ci7t5!)G^nEn4Ze4Z!LGSi4xeAUJpc4)QXBBp~-c z8~TIvKf-tQEQfOZkztN6&7PhoL)G-6ftARZ9$!?CZ>V$`YeHZ$M2^vJvdHeDflU50 zm!cOW)zb$hbxD>p_{5NQlM(^qJkXehARjUtP|lmceTtQiMbbdYE(peekVFpSt#bc` z)x%yA$4R=kGoqC#BfBoJBdkxzS-u5g{K&mdVoao=x3+>aDN4`~abOb)A<@c_0OsL) zC>98u1nmi{0pEi-HW6A8Sp!~B`go35GPC&57a~k*6NHB)AR*l1TSS|A7!J$@Sdu{O zv>#(z_7G4u4TNF3tDG;y2ctGIAYw1(f) 1+(Cthu-Iy8R zb6EYx6g=A}hRY1a(yz`UNOC)}`4eb{65_x@gJf;*v~MF=00_zH8(lq!^&xB!ZS7F1 zeo^xx*H70nLI*pbgt8Vy;>2**hwfDq7=9;7Ec1X%ij%^W)yFSl2p6-Z?_tRoa~ilJ z$u#D?1dA}y7>Fujn@@>mQIEu%s1Jwv7~sM3Q-9VU;yV2xkzL-KFLgExPkXRk 9jk6QiR+ ze@@V-mkCde(0NOU8ZZrndm@TLUj=Bbk-89y?7ix(#%)H{DI7RgZT19o)?1yGoekjN zh=OgXrYEZE!Y8?RjP6F?c_StY|9lY)2m#!)Pn=+p?TKXOZwK}NjVfa&pRn A0%KOm31Fk->bNX5%t7#=?yx<#7_p@d#WJ|H@gxB zAC$boae)N@fv 9}Y{XmOlYP1)&f;Q njkD#$Fq =JN Tr8+k~u=}=yIJRF NQyXFMeKLX_ zCLF_J!(TpsnuCYI{)i0Gx(1IV%#P$e<%I(uO7w-R<3i({K!_Mu0C-a2SGOf*&Fz9n z*8#lT^#OK(R9B_-nvBHI%W09Jz^}Dx7G@%JD^xn!4nlI|wK=5(0uZClSNO?b&~@+} z>#2QcB{X`{dY)+08QFzm#v^Do!e}RsLcUzx6M$&0cLHgY6*7EX}q?AY&xL`aPDu?jOAf8X) zk$sGR3Uu)kV896y8}ML2S=e6?twgBiqgeCn?gSLL?DW?0fdEA`{1yHw84U+zM3Es7 z+0)eWv;RFM@1~?M !f0WL-r=0f@9LPUeNdK&K_iWB}j;vxxsTYMj&~l&NKfM>RfqKgC97 z`TgrPaO!Yg`pXw%!nzUVDes`o(@8b}7O5%uzojT@wTGmfp5+5JhnO)l8G{16@uQDu z0B|+5Tnk8F2&h}=I`@7OU>bE+JV8pA16Rc~E5G`^QORT~#r27g3FV6op_>i}>Y)kA z`)p1BLT5(n!tWOqrc{?pxBtfZojL%>7UlZzAt2!qcdSb69X!7#P@x0I=Z2 zjBm)pP(8^f2tkrl6K{fx4KsyI(a^d@5>;c0gb$H;0(+!Wkgf~G^<{@xIT=^Ul;1!! z=`ykXQ^T_v7zH8=&)1ZSdE!Puv%ibk>e})}0AI6Kw{%?qz)~qe07f86y;HU00m@q@ z@8nUe+3$Q6cHsoBG(W&<5d`&8^wL@S&S}G;F(81z%mGMSa4_Iq{`P+vo1hIL$683W z2d&hlgg_8U26zQ)0AMHSRHNg_(121a`A;`;$WFJ~$X&eoco$i)q|)=)<-LQs1h$rG zyZdE-p35;SgORo+RQJ-95eeP)bZ|}6c^2Tq8v=n+n8CYtg}|ycf<>4S9yp0&ex ?Wv?Suz63Lww=2rR9i 0BKnYN}59D2m#39LZOq*v5(TBCMG*B#n!9SFeb!)4*{SA=RZvjv}CSF!-3 znGy75EnT8bj1# %3=_KH?4tsENk z8EeW!>TP5LI oC;aEZp+r1{7-N^vI|~Zs3kAT&PqjUzrht z1SXdi< zjIbfVnzexR4@{(0v|Uj^Shn=>p cR^CA4%r|4|Vqc|1)EZ!N`0NGnq0z$jFp2-G~_aj5OP-(QZ-7V5Ey&QlZ2! z=;KnENZLrNY`fotbW@2DF` GYD;eAlFR&$-@hJ@wyo8E=5x+@pZELqdcNP$ zPBHoM8@|!$U=^WM>KcV~k+an`0M#i@AJBAm(A5~I3#F6@vT;@_3uiC1DkND`qFrbX z-mc`f^>girnpl cs_s%YV?1jwXLP972r5U3@=N}ya2-taEgFT zd#1LazRJo;14Q|{kN~H#EM*@-%C+5LKCDmv@_6!uu4v1pbJOs?MDhfruPNtFeTvr) z;_d<2>TZ-(u?`dhLlOeQ^yr6KL{K_Rd2M9acsPhP$!cEwC6W5m6Cx#B9ZUA} %0hnj|<=% zm4L9_AW$_}+4FlFb|cC{m;(OvE5>vhHf8CBA6}Fdeu|^URFrXk0xYlYPJcSNBH}g? z3Z;RtCg79-&Zxc@F!Ubk?Hr|e>jJ_%5(@x2@b`_8YI+$;1%@EQRIAiKej3@nlSLx{ zF3ogre4qf0{5UzG%f4TAVruG}z48RO7ew0j5(AwNIXSO?H6PC0VzX|~f@uCF9QRy7 z N1j23aZPPwOlb3V20&{dRabT`YZfJq-?dz z1xhr)6^g0^M-oOzP|r@2sYzW(el%7MkJCn=*04TPbNto86RioeVIfZ8XcK>SY>jhR z@KpnhSH- ^7Td%A*p8noJpTqk^83XY=D8P4BAjsEisv z*2a{)Joa`Eji6j#{h#^pm7v4DlRDr_RojQqPJILo-+&4+=^ZHyf3!jgD%)K9p|%ue z6r5AlqfJ}@NJ>Bmvz59+eS_Py7$zH_i*FF`(oo$cCGg2|!GZ s8hLm3?W_aLWH_wS2Bl( zQ+fEj(4b6+=cMU>a&1ZapuK2DKUQsYuBUHSW38HE|HJ=M2lL;}y<6@jbSvcFXqq;1 zrG$Q7SkRulBp2qBa(yXuO&F4lKqxXv hE}mFD-fC#f zFwJnm%x~!<7mcNX@qSP;l)Aw9 ;=>xg2x4QjtUOVlfe)P0ty{@PrOHZWbcpIuM)KU%|hzEkJ_ocH~L{c?{w3kz} zPE7MFdM*8Ez9HVv6w4-X0g@q8gG)ci13}spY9lD)#Q)XI0z_^x*2!Sp`H+AAgmFAU z%mSwCENcy=L C(GCG+Ku1A)+~RY+M9oAE|=N zWVI6rD`!ZOjMY- 4kOM3O~KCYG;X= y@zYc(z9G3UxsJUp zT@oGWW%J(m@sj-7RL8jX%N0Y7bH_1JQ5IBaU*!!~empcIS-S~V8jn?b9}$4OwNb|! zi1CCV=c-3Z)J4_%+K!9#VZC~7B0%6}Ph@{j1_g^;(y|BFI&Y-x#HhIPZFz#aG)%4L zc#T%~BQY&LRPo*qCgl&j$kIT$nzzFAJ>2 RdGEr-=^azsy8%P($?T~h8vg9qR|mAn7?vO&uw!wMg0*Zc!~8y{+7s5 z{D{u>afi6kZ>K(oz8;&bFFLe$Of|Iszo8f# e|j3LbrrO?1}T@R!R;z7+yD3>&csFj?gCm)-F<5u mb4J#@h*rf>-&dvI zw{PFGBEKp;NZK(taOrd8b%Y@gl KL9a$XP(`HhD@Vc_gkV#fMd)uo=G zxg+WIF9E~*PV~gk8Q;Zm6V-A5ZRs5esyg|1W8Cz*kT^?Kl6~y-l=HhSyYo{fd>`na z`I+#hvGtL)r j}6<@UW+N%FhMKTBqCE2adg%o)$N~^`0|{uph|Jji{$;fSH<^PrfsA-<;^Z zjZxFpBi*}sEZ+3~TrzzRkD8hhzKE2^lNIpEu(ZRj9LcUOGth)apc#7DVJ=_wBI=%M zqJO}7F1 ;dV|SJn-l4FAgz;<(XJ_vb R%up*@Y97FB)ti^l1h56+th zYLC1~ifI}j_l@aqyl}cd^%h#DWbw9=k_ohEKT3ulJsE5Al3>Dg99ObxxQ_NZTDAC> z@aaL1`>KY)f!C4Cc3#Y{`Y_w@zv$_} +4AD$EVpL=WmTgKgUhicUG-!>G-36M`aq* z9^zM`!>WRXdf!ACe5hqm? !P zZRh!64wM%$`;>F_x&N@cuVL|?1-F%RuZ`Qshh5&N(iW IGL=-PZn zS 2U+S!E}5oQ(8)mkHz(rw zj 7!r>ox0*uWbrpROBM$o4$42(k(x z=zQhK`?X;c6nM7^2VDMgC$L5H_tZ`Fzu0S77Tcn`7Y4>V%NXakhyR%FxH+`QdON0l z1AaPqrQuP?tn7+t8O LJ-hBrBvEdD@t{#*uL%h^unGSi?-yeYsimcCBA3dguz0S} z_9D=DIA!-HHZ8ozEu!k=P@F9`*L=Ol LUtiwduoYMBJs+v1~|?ZHEc3q!{ivq@zme=z+4Jd0Bn=FiYq~01DYAMK8cvu z>9+*&6;mw(6zaLT1R}x!SS?;I7f8Ib_srPzkGEE+O8S2|uAlAl{ZgU2J%YOhm>VN% zBr{iV<(~$J$J_R>EzYtR?$48MXPp1rdns?nd`@E_-(FZzyiQw+Q@}om{cVLybk5lZ z(oRhGkFE%mTmmz4$#29sypo}!PXn~_-`!mdTz0?>hOOeFshmZQQ_ge8+G80ZbGv%t zR*h6ujXw7MnW^gRvaacT&T2fpaY;2!BLW&yn8hZDCZLz338Z!~P{2!`U{N5ztO|Sm zEcA5HZW3xP>_1>Fid&jJ6w||(M7v@VshT%DhDl 7Fm zTkP$M1Ta%M%_mid9H+j2I`w_g+5IyEb#Z%}F5*qbW9LtGbgz{l!6nUYWd&?vV}aih zJqxrT3)gF2R*)s#UI=fr6etPqyn8@B!zJra7ad{N-^VxdvyA>vt=E$~YYZ{Z3>~A# zCvtu}yiXO2qAau2PRAG5mloQIzL=&0DvMZ<0uQCTyL1POw&*I`pQD;o&EBuGY5v|Z z*B d zXL8>{3v?&U8Q6u`Gs>P6>N*vJKG&Nz`?6zfVtntgA&xfslRGjOM|36CgiFJ2okvq& z?87LoUqn$BIj2B;B93|z4dkX0Z!TT#H@G0#@p;GWg}T@KD$c0dq*Lz)zv!#s%2Heb zh& pvi_QOyuiHBPktiTLTK#yuy@U2rgo5-?pr=kgBN>W}x&*W63&E=@hkyh1Q{^q!` z>s6DX>2W90sAJF6piOc+RQiYnzh3$Ff&i1l{nHSbvur+5>nqD<#|6nPe@Du12&gCk*%gf7$Wqwer`tl(?T7!9p#=2%)+ c6hJM}g0M@iGPjs8%FDj@E;^K9LTEyfHovRuX{MU#j$ z(juJ=@V2p-*qxQ>=^ G~MN1zF4PgkcZ zS*WX+o~%^=JnQw~(%IOlnYF6((Qz|{8?gm%w4t!TPU6>@1A^4Wlmy9EeY6b6Fp5 Nex)n zvh1u7!mDMdaxvjnV7b|`<8`KQwzd8Qt|e=j-6ZnXY2uz9I|cD<5xQ(UG%>PL4U|DC zE~Lwv3Hy6Hx8x2w<-{N9s>}27sX1+D%S7L+B;38wQHnRM$zg!bp8BNl=ih&n57&J9 zZEgEb+MfuUxMAM#GL`FG*zi{4CewP%*hb#-Smwv*Rg=4zCIVo(nW$q0WnAvZZ%r#3 z^<3pU_Q6-RodsA5EresICaz}iYw Yc)7ON=TKZs&+I_b)NGIQ zMmLFI4 du@)i= I-ZFSV*` _`A-CoIR5v4 z@SLZnK{w}{I`pIvcTy)9uLC|l(j6fym}ioW)TqJawP&>D5!806hVQT|R I%_po)Ry>37Tt2=4Mg5UH1R0MH2w2|5L5z z2B6p
x8D6@}kX~{7Z8g~CnWD?@5(oYQg%>`&t)k--5(| W3)TOxE>+jfTqq!F zQE|S93^SV#qrb`a!DDsjfci}qyc+Md_>lNcI<*PYm!thN9*hY4^ZdGLC2fq*Ti(6o z$@mQ`3`g!cZb`qZC_4pU)k3DzTLS$&TBegmMsA$lVstNRx}lq7n!x7D6riZicq22c z>+RgLX6gAFVxwN;X?4j+coZX^ok&xZvJ#+O&Bve{<#va_r_&9+$$8)!%~faxRy1s~ zPf6=;7 }`ug69R+3{|7&b9zp;Y_UTz6IQGwlPu20YhXaaxpHO2_ zqp0=AUUnNArAedua;!B9bS~Yl-nn8$m{_GQk8 Zo+oh$?2A#}4ex(+Q{ z5o^?&AF1%&6YXlak}BhbFe|TGpE%MtD#Ut?_t@p;`z)_1jpX4z(qoFswv0eRIk*xy zW2|e`5!?|QzWc{mWGSHDrqf(Ve9)Y~?v1K(#E9wF7gdu4DVOZKJdD(#t1yPWCu&kc zvJO1hZ3J3QaI!XlEC6f*0h#`Qbai_eL4-bj5q#WG6mge*fB2zy2 }!PY9)R)!rR8EO77Y;M_t iaHC_i04@h#eVR4h GQB23|63HZC_c0h#+y4G*n z3|EfVWglgE27IUb5Yce_&-@DCN~DE30N5o!2AW{fZZMZ~S<#lV!2!P)$E%Q99b5PL z$=>*&enL8X4Oh967}-3x>yC`m_6!2Eqc7@x=T`6S>OOmRWbdQ7BoElpLNSH3#jWLb zGS`S&7jwS3e};O ofkLv_@xjR>w~;V2g&P_AC>p5jEQ^>8^Ozb~>w~RQ!1BD3 zMajFY0pQJ6OXg$$Y?BiVZL%%2a_m0+FU!$xn=s`ytMl4?uA1RqeSrp;j$fTGf0W7~ z(rVOPx6->m*n7C4ue__4Odj#T>gt}u$MxNOxtd&KH+Q(K)3tdJne6Ge={Q*x7gl)+ zPv4 PdeVv>2y(Zf}kMS a?M@AC6eGy$nvuXQ<@_e6}Y3eDXn^8HIbXn=YyrU>q8R7 z?3@4q?qG5$B_MO^Sp7;wZhAR|A~!|5uSx!wwfVdr5`LH{A_}eG)+VC9$r=}oujgG? zgGFxF8ES~+ZKPqf^@Z7Ff7u3!_gZN(AExtLK=Lh>BsW IfXAH mS)y0XxE`>X$*FLg>r zd7MXncQK%(Ar>AyH~BnRvwgX6KTKIN^+e0gA$-3nM_WLogVs#rEm3d7rD%Xmfc7G+ zvyQ~}st?P7R3}^A;K6Q}_&&2p38v9DSX#6=S+}_A itf+ Q<=F%tUY;#{s)VJ1#MfHV!g;xU2j`>z= zi^QvLxuF$$wn%9PPb3JlUGt^UHCeqBC6?kL+G-B4Cb#T4GW+y?Rqkw~?p*im)wM?! znZhT8lq2HRtO>&oF8w7Dz&1MkoC_&g+j{{yLze0CPaXjnW BG LHA_=B~9I#*eyKuf7y zluM1Ip)A~;=n`z;;&oY_#f82jcb{y-7ehuh3L3?RAZ|-+E~Q}X_R50t#Ki*{7DB lmLMT$&| ~M{<3qX14oC zerbqqe|hO;XrAvnlc$@CTWb1zaxuqIa?1S=#v{l4il0vd#dzSoh>GWpC)-tYYTfGb zU8l(r8#&ri0BNt9{4>)xE=gfc#!O?jd1b5LA?VVSx;`o4bgTHm-BLSv+ln>UU_o5f|=j(qp8pCL;IAGa^QZwad=m`)36$t5f_^{PhEDd zv!|yY{1R+)`*G9Ann=Fbzbky8`TpzJ3KV_s>+gnv(q}A`ltC@msi7+r9~Mi)je*2F ztPS5{80&bl!=q)Qk_JfzLuvRTi1 u$Ja!>jlQ;+1o2>RGC>+> zZ)aETuwV&;of?_7>xwnHfy5_)e|&Sme)Z;ptgSXscY2bVL=bC=40gXw-&Y7!4YqUt zn&kNk+Ryzt_U_q0hn7{oeO!-k#j(SqZt%dRDy9}PEiKxkAKCjl#68OQHSz8EU(b#2 z-DB2O5lh d1LXjQElOuUeEPl zSZwQfM;Ydwn0|?xMj95+!zuB8b_~A6%aAUmg7~ 72SSmrp|1VQ}}h;tDei8W!gno=f{t;Lrp7Ve;v_cyb*?&K>p`MFq{ zTN;kY*+sxBeh4J8k6YAqa#*1~-zL6I^m>T<-nDjpcsZmxV3n_`uA0=a)Lc^tYxu&f zvDdLH>ZdN5gkmwVkK$$ pH980ZKPv0u8xB^y zzaU7QXPw)=g!R;w#SqDS77RXNM8%wT&yNw^I7Z8 @<$;W*FjH4b-O49{$J|Vb zdI>a!q1+P+HV 1apHl&V3stEDR}n0tDH=id7)kMA~^5$N$D@%LODd z2E1UKFKp87z%Fyg v#_IqrsA7OIzNX3Vk=)u9$%1>v;#y$u8o~j8y?ObmndobI#W%_&O!KU2g zlDOWmxo53yG6Hj-+TdH*U`&(ub&AVxF+((T;WUpGMy$iIxJDaOsjP4f2TSc3)$=+t zg-vhkcwY3>+lpw5XUbF$GYkY_?9l~)l}dyKA|ge3=@fs++cBwSUs@I{kqhbwyrRVt z2nJ;bB7}@vi1Y#Sm%G6}q*;qbfZ1UI^ec&5L9Q3H_~0~!VLc-s<)~ZjrJk6Fv8pWx$@`p4T>8}~3*zNohA zaHv~d9G)J)yluCm|1wS5$0sjIZw-IAn2As7>z7gFg8KN70R6#=;3WXdK4nzO#0$K- zyu|j3)A~!qy=iAF$EsV&@`cddl0yI)qY+ke(h{~BJoRva)ltIfgYNNg2@fUv*}-p7 zG~ fq^Fyb3>i&as@ZW1H!M5_UD}T86=p?Q zcpUb9w(&d;`z6M~KNU;I#1BRW4MMo?9HR4b8UF6V$*!;sbqJS|zIXx1KB|BKm5iwy z#T^D9+1csgipJFjf@}gt0yIH&Cksf~Bm(4`@x-FjY~YnFQ_~GFKU^whQj2UQx98m! zF9{SNl1(GeL!`=lI|6PVII$^u_imJCRHHq@OHG8v(&68gw8KOiV#$C5R&=0H3RPMx zYmwWe&=%m6zxn8rnT{c!m$A}9-s^UD) ?iRWQM zX~gP3U{exxL+( UrkT*Mp_9 zd4A8IyoY@mqAj)56DgbT2YQDMlafDIFAnAaV5=<~i6zu LP>E6`*JZ;zGhi zI4FHZF?(RY#6wIc??82_TcE70sOG{JK#ejoFY(fRev7AhHVCo+Tf}WaQ?s^1j|{d` zAQq@cL2t3A@Ojn_VOGW>=t2hUFd*(*ORD>~rEz$$`hG{oP|@u1JICm& z9uB_Mlq%mc8{_2=JzESKPuEn#zRy>+t3%Yp3@uRVCN75*5gm%H+es+P51MYjtn$(a zu>I?>UF^EpIinEhB^aA&=rW6BYRWQ0s<~E{UJzvJCBF!>9%>NH3wmQM&~9_+aNf}C z>osZ+SQV0ye4`HTz%Hck8dQ}a4~p%bqfdVgfVsh$r-Y)@p;R^IK8Rx-oAGCyv5u@s zf(@wsHWb{WhEyM>@Pjy(hq3P#kCoRiCK05R0yc-Gwwcsh#U%v+K8rv^;p|<=Y~oZ% zf+xEaXHHumRvaiV_adto`QV(xJ>(+wAdn$|PXxK*|9fj$o&_X+kWsvQ3MC^G{|(lO zLMsF+$jd6`&Ur#J{sDVr>i(?L^gzk;e~m@0_5B7K_{(Hpw0H<&LnBVb1V!-B?fj0p zIThmvodLd<(&(*~Yc@w6k>+hw(*=tB;b*63|5Y>u!N!>;xb-H%Kl-1k^=9-1l^r@^ z11~$KUcY*r^O`DMD4@YBLjmU-RdA`|Mk(ZP`0N69YMKklFcDx2q?uhWH-aLs>dWag z*+Lkqb?9{rAWktY$c69QiU30=R;!H|SzcTgE;5fiZyXvEJ2-nY^W&H2$19^B**MvF zH0-)Ca(zqO$vEea6R$C!+Msq$i ZAc}u#4}-qJc!%0S$*>z EO`EWo1nV4+ezq^L4PBtR*P8Y3gJW z07RI87L!1>E&z4oEgj%(%W%(+{F5 tJ4Tl7+?vIWQKO% zDq6XMFriONjECcDmT+>3QAC;)ny%;m(zApMXBB?VDut~sv=Ygi&Zp+46gf`26;FI< z4b83S`f&Mt=7`?KWzEa{Seg5;> z&i*|0>!)`Np6h^*Lhqa<%qu@6skmGXMO&V+N}0)@$lT6vR6FS3+|rRt5N-ok05Z za2RVZ58OZqnu5- YNnY~}M*EDJS9SM2sZ5qBfzx#!}ePNBX--JhdW+nd77?&50q zZN}!DN~>PR{%kU4dJ9mfF^3og->$^Kp4C-&%to?Ty)WSb0CE@d;y3`YS)-bKYR;pP z`XQgV59LEmBPTspYG3e;JyX*irS_0c`kZ6N#b?XW$41A}r9Yz*I5*LcEgLs1BLj zNq5ky&x`qSV~bG@t7A&@?2;%xAk)0zwX!)Eo3~C`deMdO28SCAdacX!O0Z^YcM1GB zle3X8Y|czfkMvI-_IdehZR=W(Y+WrFw&b{X0nD^VrpCf!2UiZH=~?DS=YJj;aSHpb zD@@s`7>}NtV-7`3JKA43IBmdcEM3zUrETo1)_FHj8cMBM{2|HyfnA1!iK6W5WbAbH z%v p8|ZwWQSBv$rrVE!@C`)gYEDV*M1Rp2tX_0^REVQE)bkr1Lcw^4Sr{9rkdO@ zBl^q$)Sc_9Gd1`i#QhK9KNQF~!8-!fZgR71Mk6c^pTpT2KS`1{u4s37abYlaqObR~ z-pKgV@$=!P77=}Bqvs7R+9zX1V;x?sbxu5^ z`D7D4{ic3$^0NJ!1=S2E1yL(L#a|_ vy~f;7$;t^ta! z{R^~j&_u9Zp;{Z3{=)bSigGuE^_KjCiXgely7Ra<32IW1HmYDDCG+pH8)g`PZfgYZ z)k&2*Nz%^$T83f{8J3lHrWyNoOfECJA4=^YfcQ{82e4#4#}Ajb?I`lnIo!4w|9pr5 zCdZeOi&qSdZiE1E{_df;(y7tK8A*y%qGn1)#^1ln6InEYrQixX0he1|hAzhV4Ht}` ztd3=?^A{}mO4Woy2@A$8n9vmNhKCU<_#P0lN`u0g76!c%5h{E};g4R?D@nv8G`Q}- zJ!KJwc8>; GhecFV_kJs%0B3f!VD(kuS`gb@KfyUU&2eO?R$fD$v@_>9Y=@-LDc6}G_4>L z>JUT(jn?Xzn)?lP>y7%!!S~SE_ ~@reCn-J0vw>SclV?D4GmivaISE}nX`Tz`3uP=clHm%RnnqQF0y!5BIKcK_ z_{-A+74}05taj7a|5aPd2Q4g!5Wda)b8t0$fj&@Q#;HOG{#P~;fi7^BB+b4o`2g;8 zQ0*8CzB1XV1 RO_DYuNT)XbP;)fqu;|O-Izssq9+VOY7tQk;S2O3= zxYk<4d#L<#{udx8Vi#=zDN+bFI}+0ELLbq|7oUQ+<1?>Ip6>$McpEJMp{XB)eTfS| z=a!JrQ>R;s*E+SU;wQ8t9`5z4T-m-BHrgnDPLt!F7}0PO$<-V+H_&`QXiTMS?$rlG z5;&8o_S7w%(|G#Q`RcEHNrt)^BYX3Cm^`0dcJUwtY#^rZWMvVN18)IX(UG7_z*dJL z$ifvH{+>+`2hZ%?)qmIJYm*TO>(SY~JdHwypbjxW2s*_yJJ|W+)Op+H!s`iL?Vghr zvw?xXD}n#}B6keR(hd5e?iBXR@-&=|WxLeUh{Kxm%Lixqgb?L^B>!GJds=lOPAxm- z1 GLstY%oxR21!abVv1ObuHul6wi10i>IypTdfF=Pg~aGw zoqnfy$L$oM3M~p8zC`&t-7`8m(lr?nJ7rruwA(pa#g`+>%=1X&-|oH7l75!^;ckx2 zzwUSmW0apaZ1sRmH}OYLA&hLAfG=CUl9w=hKVQMxV1?`!K$vtsvOy?rBYa&VnJ2Lu zm9dRrAc4e%eF{anUVc4n;H-M%`OL;TUiIf2zK?A2k4p&E`v^V{7IgyMhq1#KV6N V*)o#ldlk`jx^!I%YM;0P9)5fwy93;}xlamxLGu4y*=ujG<*?UM7ZLo-g!=T{t zf7qaL7rqT4+#-+I(Z6Vd%~|I}^R9FdB7oJarsGxE5tbp7~!^d2I(D& z)N(I@K!ksm?WdzNYb!i`lrY>Jn6DZT3z%UD?;LC?UJ5H6{t}JmWh+oQj*sTERwVq} zx5-U=i8j}=Y$*np6FgM=I@kSVcDhD)j@RC?4NIq{8Ds nm^4OtWI;Ui6Z+rf z!-Ji04F)5jqqR}<=QnlQM4W$e@pDIgXjKK!3ixUauIYP=6eTT G+6t6# z#WaSPE^gj0CGf`jZ01J0j?8o#kf=4s8JHe|TW-fuy;2TZ&}RYjYDoL?;aAlW+I3+6 z8H>)`a>jwaL~46+XBNzXN@1`N9e~@w(KHpy`aMxW(+ksxmj^9aV1Nij5^r<28g3$N zW-}F$#4vAwdlZb4>JpFf@McXuCRWHIOBZn$WeecXrG(PbDdlv9Pu%#(z~F3E8RuQB zHI|B^Xek8ay49LT-wUm8{xX~S>8yGx&;epQyCs8HAINwYgKAJ#DxFbmd1_WOdU#M* zdWu1Wb2+(fM6dyZl%D38$Y+xk9M^}F;{9ld?Mqn8p>ElJWef-*8zi~Ix<(7`TB|5e z0@TBRntzhMqO8-F7-^XBXoVqzv<)TNRjNMz=+qiBPNyZJhggXyvK5KiOPBn0e*4b- z79|7%m7-IBJ=5g+pdAxvZ|7rbW;{zZMFRWDe*fw=w7pZ1tXxufgThA4h_u}T!d4bB z9xUih2~@8O4!7V@%~D~56!k5oICwM8A|V9PD2GIPJ!q+j?p`b(0a0#Y&VYWTo`? 9NJZc%2i$R?xA}po&^zZ^vL4jPD8nB$oINb1TYTxsNu^JY8zSM8 zXQ*QhfS3N~BYfVtr)qbmubjK7A~%*{R-QsAd=U}e@2_b6R)x5&zXUn7Wyhkc)-8Cj zBo!jKr2-PDJ~tHsb1oYE*J7z0Pv59auyUpR(E(2cFqC!;26a@99g2bS3CjBg+6iP# zPjK0`QG6|n2=vMT46tKx3Qu*lT#Zg1Fa5B?C>Ks#^r9;MtGj}`;@rwyvG9&w?#L-4 ze#2>*=X(K$-XaoUlK><(5WfnpKlwBi@Cw *lPk|Rq@-O*SVBEpcEmp z&hA;zsn3FvX$^Ry1N_vuR4B`ud^K)yICjF?KVAIa&mWmr*qG?f!qa54g9kE9{iQAv z8bO+WHa1sb_;gYACzwRSD{iG&z2-nJ*>^G5a%`=PEh4UH*0QtfLe2t1m=A1)Lm$vR zloTA`#|m*|YZ!%pDLl=z)6LLqn}Ogmy=z_Z?W(e>vd8fIMJlSz20#-|X4~e)PwPz0 zGbEyRm4{OoI}%uH!&+`#BKYWNn8eH)0@DkGuJuvhS}#O8nZc2fIEAIyWFXMWa>p_G z04Bi1a^o~673IPHVNMNz-32nH^661Ev}j&bsUFUQQ-nm>-wgz!ij@(Ig7WspoZyMg zH8hAsI8h<%7|Vim%_|WlHgaw2Oc&I{A*qH1xak%tJ)rLM9g)vfF%B!zY;Ex802gp5 zl#z?<)Ld2dg%711*l|_!ea81BS!rKCFxc8M !>JQ*Nm3b;{zEC(P$6%CT9iAT^2y=a^wz3RPUTL9|4U71a9BVjg zfj&R6`TbAnqTunXe)N0!r0bK%cxU-23jFEt@^!}&9c;hkxKogffnBWr{bs2*0-KYT zZ^h)6*>KXRAssU3{^&!hoN!sH7=`xcYr7tEUd8O~F+=ats*w=qmnD|Ib>(v-JA9pv zt3Jm*zdv-_wxc9`Rx`$>T^a=Dl=c@?HBtF5Mk3nV>sn$K59L$eD|sl3Xa~J!kU@5L zPZYZXu_lA0t>jS@EA^ge^5?m94S<+|o^QE5SG95Y7k8i0aZsFf2%o10{l#z$M>;Im zUCldFcE|$>sEm@BAV|mk%+lOb9xX-D;3ihYyYj#HQ_S4b2UzIvHL^E1!w(Rmqc&FB zwa>*%$JZWttR_=yUs0|`XM!>+ky|5`Z5}uX#b%V4Ye~*%l0x39?$l`bGBtd^L^^~-)@~sHpSE~7ut|v} zx>FS9j1TvtEb8dqhVf9}GKWQs_jVs#Af?5-NW8vrNMxuO!(k+1jVN*S^r_j;&fI&d zxwGw+-}<9A?6o6F!-jHaPf~~DXU=Qq7LQEdZ;7ZlJu%X^OVwT9GIn;Z{P-iHyhGJI z5I5eJ-x47{ka6_kN+?PJRGlxUK#Y$R83;6-<$iWw92Fye^>fe9v~tB7U#ER_dE;t~ z=2&p5=WFs}hl#}w$L#3SALeRa+zPlL%LK~ZGyuy`B1ol3>9=uPZ9I_zrxF ho*j;6aiz7)PB@?mYBOn@1JcUVl{{_C@|mHDbWk5yOoCyx*7=Dh@znAtbe z^v=^=!0FQr?pv`t=Ag>)dW53&dCQ*mdSkWXs*aesf%7X=-Rt3G4!FgG%Dpha!bn7- zKS2i_zS31ar|?sWznogUHn=0>R=_}|^YF75v*d^`OpS@WfclZwBjS1;<8c#aOj&@e zr`#_t>`_}R6RbeFMpB5}H;{nqRl#N2ArfLHPK52qzX`4f)s}CB$rqyB&nt7k{B#Ts zBsBu*E^y|!9W7paCNo03NbGSLDC%@v0BEBD#X>-nDs-elrND!Nk?065%8QSErGThX z)sYju{h;l`g0SiR(_?RkY&uI#jxjH^e&6>+Ln9}o?d(PkCJ7FThI<<~lp5`UBPFRU z9)pxf^RE5nOLHWFaAZGEd()bICa@<%ajfI~=tC#%pAzmK^4Mugd*75u&~H!=US*6Y z+1ZYV9Dg}?p}X_JL7d_i((0!7=w*0pHP<40^(4^{+jLIScO-e`hs Bvn&ab~(Oq=YbyEU(RK4y^gj9(~ZB*!0o_>1#FpZ;mBz5@^U^ufuTA8soa5ODuT z-v1n1w|m8z*_}Gzje3QP`mtV1k6$?S`>UNc@g*B5W*K40@mxdRo{5u#K2=-79D0s+ zHjazMIvay(4!S61U;KQQSl-+8=XBFC=Emlj#SdT9diFVPk&SG4H&z$9_cuM>-K8&T zud@<8K9(1!y_)fJiZtqZn(*!T =oS+iG&=bItD?DG&Zz=rO71 zyTov%?s$Dq0QcujLV4D9I#pPB{kmjW=)m;d{Q3iOuKSy7)g*F!s(<{`rzytb1*gsw ztodc-&$fo6D$@V%|9klS3AY^@+Xny4E2X4V9})hY D9N(D=Qwy8RY!?zujH@CuJ{Ry7QwgJl@u=H{Hhj5aRqt z>)>zWQ_t4%el~boQZgi;nH`&RyZguM{Z&u7)H@t{^6(G)w Zr;Ybc(G*mi+$Olf8qajH20u!gh}~C z-NnLk+rND;|39j}I-se(eSf1<8VMz*fPj>gq% xVZN4HGO8BSU^Bu!0;aXTDOXhZKJoB%_&>F49Jn)S%R z|5^)0pHzp<=QWQYE2u0T<`EDp1Z0Y}I!gNp-8w&f@^RmAEG_J&O5nw>@T`wdST0d~ zf@#9+Qqno}lYi}>Y`QXTgy2;)5s-n?@Cd&A5;B83x}@=4Qn9a*YcWXVg(4I>x46Al zaZ`ut@hu}@FkyL1g@sTqc}xFa9Vpl&YD=ahEG}%0oM8@Apn+=U2WvWg58;Mfw7HCo zD*ZrhO;1CF9MS%B-jNg4GDf00vUpL1`v9XGMLl6lUY!VH1LJR@EvoSp<2ephW`Fl^ zep*HdSj+S%K{oj&awvqwa(|(UO=kbsR_u>Hyp?tqQs5Sg%Qcc0Dap_K_Y1N@v<{&o zO#hp==Ew!1a<=rF`Hy;tZaT2guOJ*#^L1^WH)@V9DmLuP$KCkAU{rbWkd&L-Ba!^@ zh5f17=L0C%c)-=62CNkDu`w~XCBNJ*uaM8hAS9w)AU=dfqrchI)YYt7hvbB9k0lm# ze}a(=fLrDxx(4Dsr%>gM$+t$rB~76cQc|WP>opf1W^^T%=qu>-++3%%89>o-#mHn% z%GJY@k{M0|5U1&o0bt2dQPLA91Uh9mHBcd+`wEwF*h;e%4X17rgdA;mf~~wL?0ob? z=Q%|F;Zf@u&Qg{I3 2PyoZgwA2)cKN# z$kPVKHzA1lSroBg`a)s@HZ22~hJI6p&Ctxu3rR-mrV zX%_G^RC+V5M}6gq@S~EbUbd6~&Po`DSr-9m!3yM;KrbyaB(qbdkxo7MI(7^F8QruR z(iriWKrFR?$=p)iSL1V2^7Bxv|Hqh^lHdYoLxXK_uNHy?`1?xk?8t=a#mJ<=Yt9~2 zGKnr@nl$bLkH;YYvw9m*@=JAA&@sQ}b)%|#ifdDmgOT&?EE+}-R)bC 3eu_)}L{~EN&Ph+K;;q$$g(xQ+Y zLW_N&r0uJ){{@C|5A69+lT?)0*QoZ2m Q?bZOZX|LF=`06W`i_`wD^6T$-zuZ0;e|_KaAQ+ODMDT@JKjt)w@-iQ z3SWuTs_g$9&Sm6$Pe$B(U--~D3_lqe+&bdaNEMO<(FH6M^Bu&e0e+OnU|lII#P zV7?`3pSQ|A>K5r32rJh6qPmD{x(Jwr#{pV-^^EX(8;@T92s{wr+)$jU?KB>|_wNsQ zV}m-*2m*7fYvB({2hIMkZ`TtD-*WM089F*|Vf8T1TW-v> an7aW?} zm(q59Ehrsg^=B1k-hY=_vHgT|I3|q9U;c(}=%T(JH|PF2w$}RdMAaBQ2E_mwMV?R*PL)a&j{J z2gH-r|7N_yvWtzzuqU{Ck+Gk=@BDEL2({67kMO3O`;$^`_jtjmoW}S$l#qXp$V2`l zdbS<0-6O)A4OA5@UZTW(f+h-G;AG`)gTj2=U$^tA4D}seWXW+^70uq~2pA6eH9i}l ztvwKvnvpDFI?k3y2fk-SqWYWnudCbPJqh#5 D}P61GSm?2@1ikeiESB71uWmj zJYT^SVa-c~-PLB6_O6Es1Nm_x+XKd6PW&2-DD*QONQ?1N<@D zkqW-z5Pq(!#;FUW!_t*!Ex9WB^A!gW9bh+65OB;~6s%|PXI==l^O2)Z{J)`hEAtmE z3&U=A#@KMpKd37g_Ydkq%4=z8ncV53%X}T&_bJP2h!-urD&8k0yn<9wmomEyQFnH7 zdi*lvb5jGdB&Hwt;LS%i8;xE@M}FY$x{Q96(;*kg^QJ8-+4<*x@Rly?+hR+?(N;YW z^dTUSNgZQ7Y66R9G}`qp@57*A<^U?AmdWPNcXeN;r|AJ=>@o3SME$HRbR{HK_=ePv zDIMMAY<-WqLSHj8f3fi()DJBLk1nH9so^$0qAo%*{t*U%0nsJXfp~A90DDUk(rMH* z>RV3eHH%F&Q@-L;7PY@y{Yaus R )88RP9%O9NfBw)SmsZPp%x8bm Orn894y zj};QU(kFjH7+SYT+<$sYcZVWSHvb0EOidqscE~oVhR8QzoB!U@xO8%}4^N12dIQ9x ze-pLt_mFKI-S(G2!%Q7j5U2pwH6iMeb%~oOUjj(VfT{BXd-O3=JE7r7^IYubiXR zS+WHTJ %c`@P(1HHz(xrGHi`3cJYOd!YEQo1;lHk; z-a9fvFRlAG7o+*yw;7P*^>p_M1P}b}HzjC_KvNbdNVe{-(=YOeo)7@&=|0*v_Zv~E z!4V!Tl2ySt?=Yq{VA~ewA^(5}hsup9alSjdeQX <}B@Kje{`kY+Z&jAJlk6OXhzW^!`!VIf1*$<@W#3f=)hH z3+{qIXwKcpHDICy&MH8`)G 3qAsmQ5{Q^VO*w2C3FDh7RB@Y5NSm9Gqr}>W* zV8EW3^p}vvVZ20H)UzI?kUZHR#n%42+cL>;RoLB$b4>< ;;m{*9t+Ek2x4~8o zj0F(Q%O_SX5`h;8_BPJ#6o137@HG>OOZok_;{V4|eUxOpk2~(h>6&_DPy#?up7v8g zAR9uAv>@jGhfnDC(S@2~Qc`1d%Q!j!TRvj@T~Sd|5C!bwT0>&jJ;Z=WjV!u??ynz1 z>V9L!&dH${1jiMZZKje>vAEew#kZ%}w+K*MBztb&Ul;D@V;$ev8^!O9kFmV#40rrv#;BZBk1P)rq9aO> zw-3&a{N}!&MWr+_glQD*#%)=D$uRn-I_b`s$vRjpuvv$SSbP{CRpd5T5<6wjy|J!Z zBocSwgHJL!;`8P3gP;CU1sV&BHUo zs)6}uarlkc%wQ*f;+HD&|3J($Y}@WQ5E2<6 +%q(n#n&H#Gu* z0EvZ%bL%T2rZF`CxP$m~8l|5Mu=qI~lQA)_Jr128i6qsgArLIZrM4oUqvIY2O0fjb zZ%DE*yy_22s7eOX93;A7b#v_e%fV9MjTuE?5K|~oU7eEE_%E{p0XVx=e0%8q`B|(9 zaI72<@47O3;&Yh8UVdsd1azS~9Y9_2t2hkf%YV4coNQaSo9&0(RhbXS+Xk#xxi;{Q z8vI4_^LAYMRAxz3W`p)j;9sAqj?z3tN1hWR8XXKRUsB=!CFdp;urmAt%i%^&4c!^h zOlO44p|v`Y^L#jcHg0-k(W+=@yzf;!^oL=9XyK$Zf)692ioDd3Y-MFj8!Ic7vvtnB z=E}Y8xYF_(pkm@u{F2$TI(IZ$v0)Ryq&21HU;lL)Am6V0w{5l%aHk{n2}TYoC|DD) zoccG*EB)T_^+YY^wv5DH29fEeVCR*rssEz{eM`Td8G1w)$~v0S{V&e#DXY35#9C4j zf3CJQ8&Z@koqP)aXOj;63DNlEo=*U&_D$Lh0ThaWe6@e35{wbm&*S9-GV1lP6*@ej zCjhe^(xy^##F~MG*r14^5 n~0juXjga2zAN)_9LsJ=^}m&w%;GP z=|~Phx@v1eGLXnc0Vq^?mF^+H+s}sgplnjQ0y&ZEH*eO6MjTWfSOB>n;@%Bwnh1<~ ztL5%K5s(YRByhsA3R>ve)sBMen<>1Xe!&tF&KM|(G`ZxLN5b${TLF@M11RE<_S zh;kIIv OATXo5EON9Ss;r z`CaJrdh3vjlFEx?EtNQ7Y~Ym@%>nl1hXo~klG 3y7@G*@C!=K2UH zw~D&O_CBH*D61Fnq9=Ox;2OY?BJ7oBi|}S>v~9=2q7&4; xW3!)mGVnPJmmE_$cJ3K)s0Z?PlFQD5uNw2d8 z9PS*Tfs{3i4R%;nTG(oM1hrn7UHQ2FvjnaBtZ9mXQ}p$Fvy9;L{u}yrN|IY92oYPV z^;y*d|A~H-$exMY^~cUwZLwbZmW+^lg4UI-tJ^Iz0Q&w%8*03kkn @&CV~M#wgBMcIGj zGRNd0_3d;}n2qv&IShbO)v!NMN{(DW-JCVR5(lVrP-rt*bF@F|64FPCws585CK|1G z>5>b-IZH5?th8Tj@$~+GlcvbJ)kf3g>BhJN-+#FX>uxqO&n}I9YUBN6nJ>$K?hD}G zyD2of6yU~mXMxctm(Kbgl-mI!iWWz~c{4hZm-0Yu`Fki*Z~=ccFR;t4TGVcu^q zI=Y62;`Oa|@N+g_%rwl*zn7N$FESgCSZ`$gVg5b1mZonS{~Oh#m1L{&nu>@|7lfh- z$N46g>r%p<`kHD)uqGJh3|bt&sRjWPEznDE9Ve^)5qmB4+?HZ0>vk>-yX$LTW;6aM zfb(!3cfRm0sc{iyXh}1%-f*n&Gfu$jpv zL^hEJKh(;X>oG^fR5jq80f`oO0cyoD0o!m(iuqQW9@<1tuP}<{l0e8XSJ$S5A6=qR z!aMKW|DY&{Q*s!#5^e1~xuPPuF##PJws5$Ff|UY-cqV>^U~YDAymLShn9FqXIVILg z61b|lRpYa)sI$O;e^W+%h0E*67#-J%=@rcM5vm+0RJC%`AViu9S)Xo)tpsEC-B;Wa zJPrZrLRua}1=)@G5Czg1C{aEF(w8R&0pX1;+rO|J2mf|0KbDcnLa^FntzwlZQVVnd ze12DBT + z&X95Dxv5CI`OW2kK-@dL?C-<|?n#NO&9k$!H$F3eH2S8-!z%=lPlV+Z?*DLBNcg(S zG5(JmAr7Ji**=G8IB7V^(2hywY-?_=&GpQIyW)Z3g|oS(+S?{h!KmYEptJzI+FY-^ zoDR;T6N5;=&E>T*HKnjp*1QkoTNv82OD9>q(lP;*xD3APMD$v@*Ks~mjf*lKMa_A^ zZ02MzDF4|6bxA1*Z8|bUa;Zml|D1Z;hj1O(J^ao3)!;OtUxoUQ;*bT7^Ai%DQ_~6R zF$Ei0fEI*7jiO*mAVhwqjpUYM R`O3xJUh)F0~Nd4^6wM zIv9W|zv08%ijhsPwIO~`h`NN7x>T1H-3;jJh%{Ps$5={=RZ7bLnxB@_+or6KgM=23 z=um J&z2BHRuqJdiGNKdoeC8wn)tdl3O)96($usbGG+* NSv4o`Q|A|25mG9ZjW`JiyqcbOb79a!tB!XX&lS{GFk z?D^RRKAG;u(@6jTUzq{`uoO-QVPbT{mF0=F)IH!Hky2SM?Pzq3!w%c*c=1j1=nu=F zK>VD?tE?xpJ5d-~na$;CVw;^Y~8m3*IcZjFZW1+!Z1zbykvwriN!F#ZjTa zLoonCsJ_xv5{7O-A+Ii8dQI`Nz#`Au `g78O(U G!6%F`ZsDvVs zEA0V~C5&`93^v)E?^YMA-ac}+oAk+^44zLUE68gG>S)s_n+FX?5)O-VuM7AGj_OiW zpuP5qYI?ju#t)&5B2(WMYaB*jN<2Mu0`8`SxOR2&uz6mL{WH0DoCwrQ;+o5)e5eV7 z7Xlp{d}CZ6y3OL(T?lfKMO w@dj DYYBM^FRoS(tmGH! I3ED+(>q z2eCoaO_Y@28iuz*wl`Yyiu3~Z&JR2>D0iEzFEivI17Cdkq7eG2>}y0a%J{13{wIWV#ZgMFTd1ejt6uIAvP&t#+Y{!Qhwu( zz>SZcpy4OhzFOB@$X;j%1<7S`3T8ZCNE61D{V6TDVLlc5xgmIS7vjZ=W?VgNAOo}j z@4bw)GS??ox~IhB2C;!oNiID?v}D`_;;U2*yE76ALn3>=Jsi0gNGHwetQCr_@e0M_ zG@W#D7b}{;BrskD(|xx1>=5q#5CpIu$QQ^zA9j_LeX+Zt*Zjm^UqxR^NP3XrOwG05 z6m*p9c-#oX)Yi?S9#z!&Us4&tH|KH}R>89RJ}X5m+Il&1^i6CvRF^w*ntFt 3)yKAC;e9R#bJ{-*DXsvK9F8Ve=5E<`frO*;gs$7%X@Bf?b z$5)RO_Xz}4?l!J(+@bToq|ss|x2-kY-~QW6pce24bad0Y)4oWhd7hOY>1>EW$pb~= zVSIRAR7obXNm~O^lDUoquVz>7l7CvgyI|-Lf6XG>Z ;A|5!hRXDAadMfFQcx=FxPm&$iJxb$w_t8tc7>eig<-Qa4 ziOEj?G?KhA3E^fsQbw1x>1ZcVIv&kg3#|bS0aJf^8(_ox=XCS5?|6>XRbtqZLLnp# zszQN7Tmb0(XdT^T=V{Ha-f0Mh;{W6%7zBfQ%I# l4PwU?tI0C_o`o&UuXV3QIDX~U@*9@W`jGYXZ}pVlhTCt; z?_DR2rZe=u$5HwsP&F?X94{sCo2skMx6>H>Ed@q(SFaKxd?UJZshG%&Sj=(#>sBNG z$}=Abk^2hOKL9GHo1pof>+sDRm7G6I7tP^=si<40r`6mougkHULYZT#bEZ#cLh@41 zy5mqz!po9Ddk30(hvaCQbhY&G1&RHpP$t8bp{!ahZwAK$ |wh;y-;cg0MIV zABmcabrI5uNoX&)W)h(Y2rqz^uT_Vu+YZ@Drd}p#IK2sX;!8-vsx-IYDJVa|>R{cy zz>7v-?+MW mF8Q~FZuyvZaNs{=`b&>N>M0=g(?z~!S|x9}PM z-=Lj&&S(p9LKCi
W)g0XTc9UiWt==p{vZ?2A52$=CHTn;4+=WW^S6M5xzr z2eQZZHF9_NY{_kvdl 7A^YYFXWs*1nANL)YOXYT{h}#}!rqrr_nD zLEkI>r_F;nHuL?(-d_C}F>uV`9S*xTD^|%2P8znT6?qI$vp{URWBLEgZ~M*-U5UrT zR#_3mjmK Uqi6a1f|O!me{}s($q>Tf z8(iVHFlvMoz@e?+WuyC3=E(i=dhvIEEaZC>X1md1=sP`qTlK_WAffSSia_W{xk>W2 zaNEiw?AhPgt1IFVzH#Ijc2a|!&wS$i-#K}F4?Q~k0&Ojw0a|ZhTV^8lncp0bDciz< z778M>QYl6T6F$W%tu&Vi4#Jxe{QQORR@?sNh|KA%dBfvMe2>b$_l3*F2XBXVpeo1y zWygkv?ZME}{^k}ND4=rJM69ZVxQ!Sdw6H3CW2|P|UGtp!yHs4Dd^_hdjkt10YO6x1 zYI*n6<0tn{$0R^Jk2UB%wIon)-1d6NyjFDse)m=IBNh8+u#+^odLqpU@BsHO;d{Nz z`Q7<^fuF}jDHT8(!!K!y;r+ !Vjuu7EB{jkOh-TXjWGNR^o zt@rjM1FU2kbMr}tU9(xLtCT181WRzg+LRrdt)%-G#qihqrIV$JPv3u<=`+t3&%C|= zgSP+PfTvlp>GHkz?ckA@Mz7{bxZiS8^oSQDUT)ev<5YxW`rll(FQ0?3v3N|_F0>Tq zo5{De?h{{#+V9mjsYGMOm=lRZ2kEe9chBb)BKqyKa96QMH1|nsuNB1kNu{#lsy-HB zf3MN_h0VO#q-ONO`@tuFX+9F#h33`r681K*5&Dv~>_G$I9e%=4#AgATAS;3C8}y)5 zAqI6zN)1=H71UlZ#o^`sa}}Ven(|2aVrZ((;Pz`L+!bR`@#Wg)UrMx@!PXLfIIp0S zl*-F(fw&<#sVSAM#Hl_!aP%xO`NhtjN75yQ@$1A-4}MQE)f2Pwt ;OOl5cWZ@0RgN#RJ~}wO(+?PRT0hyK$TYT- z8dI#gylYYXP(OheRJ|f_<}K>4ZTMOH`D@Vh>QPvjgA~_D2nO?dA_=Z7#INRB*FDTL zf!{8XyEB7GDYauOl_jfb Exd$F@fOYT3!>v$OI2@1X4@nOlu8H3oeS~bxzax4JBbd) z%PanPr*dm|i*xX=CI_JJx_wMoVU+j<^7Ov!qusYo&e!$qgU+8Gsq~+(&Yd^SpBELS zR&0zPyv9UK;2#9VAW+jxD@XHS)qB^UkT*r zO2fE{?EMVL#)VGx)r&DYO$g`JFVdtx<1JuRzcuji`BF^l oi5_dh84irHWhvJ|7JX{VhyZ+0zUo^$%_DPb&c}60q zP{jfrX_CU~GdtH9DDl@b;n3Zm3UpSjyG4!!$fa&0&LK;;6p-+*tn7N|3g2_jV255w z(PBCfm#oh9>martzl!N%G#M@#xCB8ty?&kB&0gIQKz}n+^4?4F8I)@+gN`b$@)?5q zi>s^!tV)HiGd;fUae1jUkhNa0{)XqBa8)=NOgRR>X~O@ODKR*TcV?_8bc`NM>bP9- zSh}o3rRLdGQJ;9z4+ij;`{rLmg?f=|k*$Sep0+m2B6WrB>ZWdx;me`eVX+TO$QGAL zu!a%q5wD7$3Z|(qMA3)}tO4pqSnH{Eqrkhq#6kP4(r+GUq9bE}_Y}Qf&Yv3~_)-)d zb0Zm}AA%sGgyAw6?5?`ey||sOvW(-Hbli;iho2vBy@#6Yh951tcwPTB{HxEErmv^Z z@H;X8@L7lIMfA(PCQadh&p|w#F=AhdT817yERyx9`B5Z}6%ecou||Xj_CNme`S`r? z#EgFMNQ;R`Dw_-Q{X Z 2K1g`_F9HgY-{V=s_9T*(%zX-vZC(8&ZgXh*NX=ZtH>W2M-!Aq{Nnl zi^Bu)M?dkNOhj_4V0)jzDA&YU)8}E|icUlA*B9RryGYwYIg}$)yXfRy>GZ3GX~V98 zp5KDgwo4Iy5F6)(!UJ1w1?oBG8hHLlEt@EDr+gO*5BsHa)9<>%+nKknBuL^o-8JFf zpg`SfwS;y~ENy{hwNsE8S0M9X#=(BFyS4sZJsJ-27fUBSIfN3^gck4Cxm #=Mgj;PUv6^j8_;|s5wlJ7=FMJE ze{N> K4|mfo z1h;boHnaG{$lS?xRQhaZ5TLH0p+SL{m+HYfrJFw^zK|EB92`41707s=X4p&cNt>Ud z@ZSt(&&x`D^jHSik#BDp=U8B*e)ju*jaW7US>3EqT0ed szvPqh zK?hRjNfONOsWbCWBrw+{u(j93s8VL=7a^J6FBNj|p$Ffou&=1PYJrJ9KGHV;zXPXz z`Z_smcnlA_NYW0IfP+kSe;vKp^6=V!GWXs~%T-KMr$5T%^@CSj5D<@Nn#DwoQepm6 zsmrUPxdn~l0no95RTPX5KJyVOlbb*BpkN rt(k~5x-W2ky_u}zuflKuUMI$S%$4`=&u{V^Pn*x8iy6kPLs687Yev$XM z9b}Tn W`N>AqrW-HHlWB!Auv z e0V2nT&`?q3`j&;eYzuFnnxt44Oeo0M_qU8Ex0?cV6jD< zO?ydhMR-_s+hk)&natLNYl( RrL_Y(snwo7?ixI}u``?K@+V_DEONR?6)9 zvFYhM<-^9Nt!QB~9?)BIavk}0FESl(r`z@tq|bRN$QCntKG6x<%RCDcquzI}qmLmy zb}vJ@DE(s2fEBa6d=nTxGZ#29%#Y8Rr1e#NzOZ$6mYG-38LS-AdBK#-)NWOl%4Vr- z (vZ&=!JikK=rS_JwzAzu;EZ$|`F-LCWf!5|KbbK|d*9 zfaPga?@-crZ`M8}!dN7hZ@0f1nQS!#xyuOFERQWX-3peq{+%n=?=KT}-XJ?B7c7zU zQ+o@jXSV0iCfj>#To|uU4TN>bkIM o zgq;@5;C!>=EN+mcSZtFCOj2DWpWK!GruxLYU*k~O-DVYTb;4-yzVY|mhln+Bf%mTC zWEgK~51N*lz4QWPNOe;7%H?NFo=>6p+uun-PZP&QrlYmeb&e=^(tYL*0%dcKFOu`> zq%MN&%xjh*&$r2Eepp;NxZ`$|T-^bh86qXqr+8`B+j@Asa}qVdVKBs;zeug*GT>dG zi$A3IYDfKS)hYhj`s*`T>6PXlXzJ7AU39)qiJljT{Q}O6cIFMBA!~;sxInDAxjf|2 zL|;>lP0K5 (6O%FeI!u1{Q<2Vo@#Eenl_oQ}au zWR~iJ@GMhSw`a6^bKrQ9+IMMK8 44rwYSZfGGQ;jl zd1<%9bV9|BA?J 2msmsTJ=+Zc1JDQC<;yMorSUqk!^)R_CzQQ7Y-S5mUKcWQJhH6<=SflflxsV08Uww!?`CJh%+&q5*VXUwj@ zE+5FkcNnJRczT3QTN&z4K2ZG1bT<~y+=CqE8;l5LO|=ycwGvEDajWJG?vjtP9%ieq zd$*go))Rw?iCP(kj150tLueG#9=w`S$3=%FOpTWEvfR(1&Q-clEHHYbaOD+_Wt9|U zINI}cumQpT5&HFwj@v7qFfz818QOqe?f9BteX0+ 7SKZ9h3`A_IjsgByL7DwXHNNWe3XI%dpn`stMN%OvZm~@y6B+hYjxDBJvvqlkkvt z$LP{zT&~?7ed4)7_T@vRx6Y42op>b nDanMb}pT+l1FuU=#&;j@AjGb05Wzy}v1Gt-1*iu-V z+;x?kTGHP@*G}BGt=!Rp{v5CM+qoZyzIyy=CF|_XqQVS>Y(0ICamC~Q*OyEpM)NLC zJGa=KMN$x^N|wb1cLepKf19`yq(dI$?fIWZ?Dg$m%pMZoev)GUJMy~fRkJX@<;j|e zWnB{mOXBpRr0#8bljXZR*0M2~(H_PJE7hz**Nf8% 0k5=h~W?8PJ54=Ky)M{r3}xnv4lU&VyyFB8ND$|t!ndtp&Ux^Qx0S_dQNO$ z-b(!J(G>yW*xF0<$(@*OAM2yBK$|{uO+l^T2m{1r&%U|ad{sAiI8+(Zj)J%G4H0_2 z=fgn<$F+MFs4{cmpUz?SDo+e+Cvl#Q7jsiV?5(339A3nZa3O67vuiZ@OP QKI?W zVRO&S?|p;S90N_xCxzWJuI%+lh%foYTcR~g14vT+AoTe`7*noSf_~REeO-{GeGg=r z>7oPCT;^4b5WHpxvKV~Nf4|);M38QWC_6BJa xBwM8o{|QGPZ2q0i!f6xK2SSh& z3xY_!_sTvPzusr*yRGyjVi6x#nRl7t$u0N0nig62YZm=jX-aOr|Iz+xJzWT%+lk`N zl}(w@&}xcu875fUbW$FP1X6;w=nQHvJhbk3`b~P=xuhBfTBT~}OO#} T zoPp;Cv)+f#Bwsoeu6i$B;t*V#{$nhVgv9jS+{X^4PF)CJ@+|*%(2FFabc%seey_mN zQ_kH10pi~zs@<_O_B+p7n?e-vk%9G2cBJoC!{o&dT!vq}IN^d8wyMHenON!lR a-_h?#P?_LLQ^{&lvhtt-tB;e+-0YLli&FA;NBot3oUI`f#&B@&h}fqm^J4oo_lL4 zba@IaD%Rf4IkLf5or8G|`<^SBq94R_&&FFeS~e_xLbBX8m3z4K dZ=6X84j+j&(TAv1-~Zsxt 9L#&^~$2N;(9SsT|9g5QP zgLEB%$A(>1&spiI%zxQj#S03Rp6;Fo1@`;Ramdca+T2sqyEjm(fVH>xlWmd4KA!t* zXs%7TW*%dmiuQHC$ y7U9NMJqbQjq37Dj6tnBXZr`7i@sEcZ=wF9Uqqcm<@zMjSmc@Q>3 zU{Efo%=Ek4Y+>`oTZ`i+sbSB0p{$8(ZUOS?^l?ISG<9a3v?S$2mqw~{AHhYci-%yj zcD(g)3?blR?7Pxd>8^`+#DLh$(P4ONeWSwd>akYS;rk4HsXgGYykRXtO3RgV=kf$r zOaA-PtcjZLZ^;q|Hu%?9o#%)}I8@Kt$$9m?LNKn{zVskJ#@>DBSm@Z@a6bxMpX*XA zreK8Xkm%@~9L{95WHFZA<7Gx8- sAe zYv+kfi@rmJVm*p?%S*-m%Ef` K~(IS_>g)up$(6sq-a!L+>ecPKIJ z4JI!>_sJglA}Ob`S_mYn`s9@pb_z%BIUU2(W}u%*slr!2*w}lhffefvw~oX!FR8G{ zBd{qh&FH+v)~Bb+6 J&@bcqqpg)8B^K_d;IYW8ncgb#