From 1ede987914259167ab6b69a6eb638742b231c480 Mon Sep 17 00:00:00 2001 From: Chris-1010 <122332721@umail.ucc.ie> Date: Tue, 21 Jan 2025 23:54:11 +0000 Subject: [PATCH] Fix: Imports on backend Fix: Connected Backend to Frontend over localhost --- backend/.flaskenv | 2 - backend/core/Dockerfile | 17 - backend/core/blueprints/__init__.py | 23 - backend/core/blueprints/authentication.py | 92 - backend/core/blueprints/main.py | 14 - backend/requirements.txt | 21 - frontend/src/App.css | 42 - frontend/src/assets/react.svg | 1 - frontend/src/pages/HomePage.tsx | 12 - web_server/.flaskenv | 2 +- .../{ => backend}/blueprints/__init__.py | 11 +- .../blueprints/authentication.py | 6 +- web_server/backend/blueprints/main.py | 42 + .../backend}/blueprints/stripe.py | 0 .../backend}/blueprints/utils.py | 0 .../backend}/database/database.py | 0 .../backend}/database/schema.sql | 0 {backend/core => web_server/backend}/forms.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 887 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1673 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 1365 -> 0 bytes .../__pycache__/app.cpython-310.pyc | Bin 562 -> 0 bytes .../authentication.cpython-310.pyc | Bin 2594 -> 0 bytes .../authentication.cpython-311.pyc | Bin 5120 -> 0 bytes .../authentication.cpython-312.pyc | Bin 4609 -> 0 bytes .../__pycache__/main.cpython-310.pyc | Bin 564 -> 0 bytes .../__pycache__/main.cpython-311.pyc | Bin 800 -> 0 bytes .../__pycache__/main.cpython-312.pyc | Bin 640 -> 0 bytes .../__pycache__/stripe.cpython-311.pyc | Bin 2457 -> 0 bytes .../__pycache__/stripe.cpython-312.pyc | Bin 2220 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 1293 -> 0 bytes .../__pycache__/utils.cpython-311.pyc | Bin 2018 -> 0 bytes .../__pycache__/utils.cpython-312.pyc | Bin 1765 -> 0 bytes web_server/blueprints/main.py | 14 - web_server/blueprints/stripe.py | 38 - web_server/blueprints/utils.py | 24 - .../__pycache__/database.cpython-311.pyc | Bin 2082 -> 0 bytes web_server/database/app.db | Bin 28672 -> 0 bytes web_server/database/database.py | 22 - web_server/database/requirements.txt | 1 - web_server/database/schema.sql | 36 - web_server/forms.py | 15 - .../frontend}/eslint.config.js | 0 {frontend => web_server/frontend}/index.html | 0 .../frontend}/package-lock.json | 0 .../frontend}/package.json | 1 + .../frontend}/postcss.config.js | 0 {frontend => web_server/frontend}/src/App.tsx | 0 .../frontend/src/assets/images/dance_game.png | Bin 0 -> 295434 bytes .../frontend/src/assets/images/elf.webp | Bin 0 -> 381486 bytes .../frontend/src/assets/images/monkey.png | Bin 0 -> 25370 bytes .../frontend/src/assets/images/surface.jpeg | Bin 0 -> 6813431 bytes .../frontend/src/assets/styles}/index.css | 7 +- .../src/components/Auth/LoginForm.tsx | 0 .../src/components/Auth/SignupForm.tsx | 0 .../src/components/Checkout/CheckoutForm.tsx | 0 .../src/components/Layout/BaseLayout.tsx | 0 .../src/components/Video/VideoPlayer.tsx | 0 .../frontend}/src/main.tsx | 2 +- .../frontend}/src/pages/CheckoutPage.tsx | 0 web_server/frontend/src/pages/HomePage.tsx | 73 + .../frontend}/src/pages/LoginPage.tsx | 0 .../frontend}/src/pages/NotFoundPage.tsx | 0 .../frontend}/src/pages/SignupPage.tsx | 0 .../frontend}/src/pages/VideoPage.tsx | 0 .../frontend}/src/vite-env.d.ts | 0 .../frontend}/tailwind.config.js | 8 +- .../frontend}/tsconfig.app.json | 0 .../frontend}/tsconfig.json | 0 .../frontend}/tsconfig.node.json | 0 .../frontend}/vite.config.ts | 0 web_server/package-lock.json | 31 + web_server/package.json | 5 + web_server/project_structure.txt | 178 + web_server/react-flask/.gitignore | 23 - web_server/react-flask/README.md | 70 - web_server/react-flask/package-lock.json | 17805 ---------------- web_server/react-flask/package.json | 41 - web_server/react-flask/public/favicon.ico | Bin 3870 -> 0 bytes web_server/react-flask/public/index.html | 43 - web_server/react-flask/public/logo192.png | Bin 5347 -> 0 bytes web_server/react-flask/public/logo512.png | Bin 9664 -> 0 bytes web_server/react-flask/public/manifest.json | 25 - web_server/react-flask/public/robots.txt | 3 - web_server/react-flask/src/App.css | 38 - web_server/react-flask/src/App.js | 25 - web_server/react-flask/src/App.test.js | 8 - web_server/react-flask/src/index.css | 13 - web_server/react-flask/src/index.js | 17 - web_server/react-flask/src/logo.svg | 1 - web_server/react-flask/src/reportWebVitals.js | 13 - web_server/react-flask/src/setupTests.js | 5 - web_server/requirements.txt | 1 + web_server/ui/static/checkout.js | 21 - web_server/ui/static/styles.css | 0 web_server/ui/templates/base.html | 14 - web_server/ui/templates/checkout.html | 15 - web_server/ui/templates/index.html | 5 - web_server/ui/templates/login.html | 19 - web_server/ui/templates/signup.html | 31 - web_server/ui/templates/video.html | 19 - 101 files changed, 354 insertions(+), 18641 deletions(-) delete mode 100644 backend/.flaskenv delete mode 100644 backend/core/Dockerfile delete mode 100644 backend/core/blueprints/__init__.py delete mode 100644 backend/core/blueprints/authentication.py delete mode 100644 backend/core/blueprints/main.py delete mode 100644 backend/requirements.txt delete mode 100644 frontend/src/App.css delete mode 100644 frontend/src/assets/react.svg delete mode 100644 frontend/src/pages/HomePage.tsx rename web_server/{ => backend}/blueprints/__init__.py (58%) rename web_server/{ => backend}/blueprints/authentication.py (95%) create mode 100644 web_server/backend/blueprints/main.py rename {backend/core => web_server/backend}/blueprints/stripe.py (100%) rename {backend/core => web_server/backend}/blueprints/utils.py (100%) rename {backend => web_server/backend}/database/database.py (100%) rename {backend => web_server/backend}/database/schema.sql (100%) rename {backend/core => web_server/backend}/forms.py (100%) delete mode 100644 web_server/blueprints/__pycache__/__init__.cpython-310.pyc delete mode 100644 web_server/blueprints/__pycache__/__init__.cpython-311.pyc delete mode 100644 web_server/blueprints/__pycache__/__init__.cpython-312.pyc delete mode 100644 web_server/blueprints/__pycache__/app.cpython-310.pyc delete mode 100644 web_server/blueprints/__pycache__/authentication.cpython-310.pyc delete mode 100644 web_server/blueprints/__pycache__/authentication.cpython-311.pyc delete mode 100644 web_server/blueprints/__pycache__/authentication.cpython-312.pyc delete mode 100644 web_server/blueprints/__pycache__/main.cpython-310.pyc delete mode 100644 web_server/blueprints/__pycache__/main.cpython-311.pyc delete mode 100644 web_server/blueprints/__pycache__/main.cpython-312.pyc delete mode 100644 web_server/blueprints/__pycache__/stripe.cpython-311.pyc delete mode 100644 web_server/blueprints/__pycache__/stripe.cpython-312.pyc delete mode 100644 web_server/blueprints/__pycache__/utils.cpython-310.pyc delete mode 100644 web_server/blueprints/__pycache__/utils.cpython-311.pyc delete mode 100644 web_server/blueprints/__pycache__/utils.cpython-312.pyc delete mode 100644 web_server/blueprints/main.py delete mode 100644 web_server/blueprints/stripe.py delete mode 100644 web_server/blueprints/utils.py delete mode 100644 web_server/database/__pycache__/database.cpython-311.pyc delete mode 100644 web_server/database/app.db delete mode 100644 web_server/database/database.py delete mode 100644 web_server/database/requirements.txt delete mode 100644 web_server/database/schema.sql delete mode 100644 web_server/forms.py rename {frontend => web_server/frontend}/eslint.config.js (100%) rename {frontend => web_server/frontend}/index.html (100%) rename {frontend => web_server/frontend}/package-lock.json (100%) rename {frontend => web_server/frontend}/package.json (95%) rename {frontend => web_server/frontend}/postcss.config.js (100%) rename {frontend => web_server/frontend}/src/App.tsx (100%) create mode 100644 web_server/frontend/src/assets/images/dance_game.png create mode 100644 web_server/frontend/src/assets/images/elf.webp create mode 100644 web_server/frontend/src/assets/images/monkey.png create mode 100644 web_server/frontend/src/assets/images/surface.jpeg rename {frontend/src => web_server/frontend/src/assets/styles}/index.css (94%) rename {frontend => web_server/frontend}/src/components/Auth/LoginForm.tsx (100%) rename {frontend => web_server/frontend}/src/components/Auth/SignupForm.tsx (100%) rename {frontend => web_server/frontend}/src/components/Checkout/CheckoutForm.tsx (100%) rename {frontend => web_server/frontend}/src/components/Layout/BaseLayout.tsx (100%) rename {frontend => web_server/frontend}/src/components/Video/VideoPlayer.tsx (100%) rename {frontend => web_server/frontend}/src/main.tsx (85%) rename {frontend => web_server/frontend}/src/pages/CheckoutPage.tsx (100%) create mode 100644 web_server/frontend/src/pages/HomePage.tsx rename {frontend => web_server/frontend}/src/pages/LoginPage.tsx (100%) rename {frontend => web_server/frontend}/src/pages/NotFoundPage.tsx (100%) rename {frontend => web_server/frontend}/src/pages/SignupPage.tsx (100%) rename {frontend => web_server/frontend}/src/pages/VideoPage.tsx (100%) rename {frontend => web_server/frontend}/src/vite-env.d.ts (100%) rename {frontend => web_server/frontend}/tailwind.config.js (59%) rename {frontend => web_server/frontend}/tsconfig.app.json (100%) rename {frontend => web_server/frontend}/tsconfig.json (100%) rename {frontend => web_server/frontend}/tsconfig.node.json (100%) rename {frontend => web_server/frontend}/vite.config.ts (100%) create mode 100644 web_server/package-lock.json create mode 100644 web_server/package.json create mode 100644 web_server/project_structure.txt delete mode 100644 web_server/react-flask/.gitignore delete mode 100644 web_server/react-flask/README.md delete mode 100644 web_server/react-flask/package-lock.json delete mode 100644 web_server/react-flask/package.json delete mode 100644 web_server/react-flask/public/favicon.ico delete mode 100644 web_server/react-flask/public/index.html delete mode 100644 web_server/react-flask/public/logo192.png delete mode 100644 web_server/react-flask/public/logo512.png delete mode 100644 web_server/react-flask/public/manifest.json delete mode 100644 web_server/react-flask/public/robots.txt delete mode 100644 web_server/react-flask/src/App.css delete mode 100644 web_server/react-flask/src/App.js delete mode 100644 web_server/react-flask/src/App.test.js delete mode 100644 web_server/react-flask/src/index.css delete mode 100644 web_server/react-flask/src/index.js delete mode 100644 web_server/react-flask/src/logo.svg delete mode 100644 web_server/react-flask/src/reportWebVitals.js delete mode 100644 web_server/react-flask/src/setupTests.js delete mode 100644 web_server/ui/static/checkout.js delete mode 100644 web_server/ui/static/styles.css delete mode 100644 web_server/ui/templates/base.html delete mode 100644 web_server/ui/templates/checkout.html delete mode 100644 web_server/ui/templates/index.html delete mode 100644 web_server/ui/templates/login.html delete mode 100644 web_server/ui/templates/signup.html delete mode 100644 web_server/ui/templates/video.html diff --git a/backend/.flaskenv b/backend/.flaskenv deleted file mode 100644 index d85c341..0000000 --- a/backend/.flaskenv +++ /dev/null @@ -1,2 +0,0 @@ -FLASK_APP=core.blueprints.__init__ -FLASK_DEBUG=True \ No newline at end of file diff --git a/backend/core/Dockerfile b/backend/core/Dockerfile deleted file mode 100644 index 83a7577..0000000 --- a/backend/core/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM python:3.10 - -# Set working directory -WORKDIR /core - -# Install dependencies -COPY requirements.txt requirements.txt -RUN pip install --no-cache-dir -r requirements.txt - -# Copy application code -COPY . . - -# Expose Flask's port -EXPOSE 5000 - -# Start the Flask app -CMD ["python", "app.py"] diff --git a/backend/core/blueprints/__init__.py b/backend/core/blueprints/__init__.py deleted file mode 100644 index 320dcde..0000000 --- a/backend/core/blueprints/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -from flask import Flask -from flask_session import Session -from core.blueprints.utils import logged_in_user - -def create_app(): - app = Flask(__name__, template_folder="../../ui/templates/", static_folder="../../ui/static") - app.config["SECRET_KEY"] = "" - app.config["SESSION_PERMANENT"] = False - app.config["SESSION_TYPE"] = "filesystem" - - Session(app) - app.before_request(logged_in_user) - - with app.app_context(): - from core.blueprints.authentication import auth_bp - from core.blueprints.main import main_bp - from core.blueprints.stripe import stripe_bp - - app.register_blueprint(auth_bp) - app.register_blueprint(main_bp) - app.register_blueprint(stripe_bp) - - return app \ No newline at end of file diff --git a/backend/core/blueprints/authentication.py b/backend/core/blueprints/authentication.py deleted file mode 100644 index fc2677f..0000000 --- a/backend/core/blueprints/authentication.py +++ /dev/null @@ -1,92 +0,0 @@ -from flask import Blueprint, render_template, session, request, url_for, redirect, g -from werkzeug.security import generate_password_hash, check_password_hash -from core.forms import SignupForm, LoginForm -from database.database import Database -from core.blueprints.utils import login_required - -auth_bp = Blueprint("auth", __name__) - -@auth_bp.route("/signup", methods=["GET", "POST"]) -def signup(): - form = SignupForm() - if form.validate_on_submit(): - # Retrieve data from the sign up form - username = form.username.data - email = form.email.data - password = form.password.data - password2 = form.password2.data - - # Store in database and hash to avoid exposing sensitive information - db = Database() - cursor = db.create_connection() - - # Check if user already exists to avoid duplicates - dup_email = cursor.execute("""SELECT * FROM users - WHERE email = ?;""", (email,)).fetchone() - dup_username = cursor.execute("""SELECT * FROM users - WHERE username = ?;""", (username,)).fetchone() - - if dup_email is not None: - form.email.errors.append("Email already taken.") - elif dup_username is not None: - form.username.errors.append("Username already taken.") - elif password != password2: - form.password.errors.append("Passwords must match.") - else: - cursor.execute("""INSERT INTO users (username, password, email, num_followers, isPartenered, bio) - VALUES (?, ?, ?, ?, ?, ?);""", (username, generate_password_hash(password), email, 0, 0, "This user does not have a Bio.")) - db.commit_data() - return redirect(url_for("auth.login")) - - - # Close connection to prevent data leaks - db.close_connection() - - return render_template("signup.html", form=form) - -@auth_bp.route("/login", methods=["GET", "POST"]) -def login(): - form = LoginForm() - if form.validate_on_submit(): - # Retrieve data from the login form - username = form.username.data - password = form.username.data - - # Compare with database - db = Database() - cursor = db.create_connection() - - # Check if user exists so only users who have signed up can login - user_exists = cursor.execute("""SELECT * FROM users - WHERE username = ?;""", (username,)).fetchone() - - if not user_exists: - form.username.errors.append("Incorrect username or password.") - db.close_connection() - - # Check is hashed passwords match to verify the user logging in - elif not check_password_hash(user_exists["password"], password): - form.username.errors.append("Incorrect username or password.") - db.close_connection() - - else: - # Create a new session to prevent users from exploiting horizontal access control - session.clear() - session["username"] = username - - # Return to previous page if applicable - next_page = request.args.get("next") - - # Otherwise return home - if not next_page: - next_page = url_for("app.index") - db.close_connection() - return redirect(next_page) - - return render_template("login.html", form=form) - -@auth_bp.route("/logout") -@login_required -def logout(): - session.clear() - return redirect(url_for("index")) \ No newline at end of file diff --git a/backend/core/blueprints/main.py b/backend/core/blueprints/main.py deleted file mode 100644 index 34472ac..0000000 --- a/backend/core/blueprints/main.py +++ /dev/null @@ -1,14 +0,0 @@ -from flask import render_template, Blueprint - -main_bp = Blueprint("app", __name__) - - -@main_bp.route('/') -def index(): - """ - Home page of the platform - - Contains a list of some of the streams that are currently live and the most popular categories. - """ - return render_template('index.html') - diff --git a/backend/requirements.txt b/backend/requirements.txt deleted file mode 100644 index 3b5b9c9..0000000 --- a/backend/requirements.txt +++ /dev/null @@ -1,21 +0,0 @@ -blinker==1.9.0 -cachelib==0.13.0 -certifi==2024.12.14 -charset-normalizer==3.4.1 -click==8.1.8 -colorama==0.4.6 -Flask==3.1.0 -Flask-Session==0.8.0 -Flask-WTF==1.2.2 -python-dotenv==1.0.1 -idna==3.10 -itsdangerous==2.2.0 -Jinja2==3.1.5 -MarkupSafe==3.0.2 -msgspec==0.19.0 -requests==2.32.3 -stripe==11.4.1 -typing_extensions==4.12.2 -urllib3==2.3.0 -Werkzeug==3.1.3 -WTForms==3.2.1 diff --git a/frontend/src/App.css b/frontend/src/App.css deleted file mode 100644 index b9d355d..0000000 --- a/frontend/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/frontend/src/assets/react.svg b/frontend/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/frontend/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx deleted file mode 100644 index 4e42fb0..0000000 --- a/frontend/src/pages/HomePage.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react'; - -const HomePage: React.FC = () => { - return ( -
This is the homepage of our project. Stay tuned for more updates!
-*2pme2LSXkD{# zO_#Zq%Qs%0{qEeV1-bUTZRuF}a{fyS>AFzvAAB)IA+0yKl^fx|pM7OQny4M2Den=> zLc=%LA6+jA9R;DIBpfaXhx38+uZ6y{cW>Ssfac*x!zDp12x3X-DhOTq?u)O5OJ#4< z;@*FFKiU@1|62I;;LQS|rbh2B*sa(PP5wt};5+1c@fXW!z5r~0zz zRNi`Ojcx$S+K-usKL#%>!5IRPU;7umLmwChT%)AFos{ep2J9Bg>u_+)#HjY3C1*)` zSZyt@wp(-7Bn^4DCMwq(#kLv-)NoY`G$7DE-eE-zH9RYA8yxUVI;aF$el9qmV*E^R zVYYHM*#g>~ 7tu|YCS zwKxn0z>|gtbRmjo5}K|VE|@a?JekBADA2k}kZu6l%-NG(T0Ta9+R=4(Z+v|I=h=NT zq3_J#l%CV`lmNNTUzX2be(?)R&n<)8%HZhBneVc|;EnI>sG)6JZXH?{u9t 4M@POMd~%&yqo($Xe--{Llv=wB zt=&(Xi>=4!hUiopJKnS(TDnneKmNp39eY_gNLhMusOay^3!Om8eNW|O&&j;?BsoIe zMnBl7AJvS$iIZU~O-{Z|3mZ8(x&9$dtE;JYD|P5+CLOlROftvr63giw;71Ibc?N@4 z^VpE16kCflo*{E?m3_8X=0`rJkk9B(gQIvKQ8(CxuZABCKOBAI@&9pfaj@8UxabMw ztpT(1NU+tgO{64kioi H*mOmr f*JcJ8<9emUDj9@t|XFcIouf&ZT4bJBnQIJN^)Ndd-6PldDi#y-xpE z;xbV)OM$1&O9udT;vL_~odQ(vDwI}lRZ+7=Zf}{Zf5-D&Cjc7YvG1LgzM9kiFM+D4 AEdT%j diff --git a/web_server/blueprints/__pycache__/main.cpython-310.pyc b/web_server/blueprints/__pycache__/main.cpython-310.pyc deleted file mode 100644 index a8a124751c8190423ec887f9468cffa95579b0c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 564 zcmYjP!EO^V5VgJ8Y=~4qe1WgIq)5G02q6LzrwS?J&|qoht|!S-du@%ql=d2q@DFh0 zm-fnuU+9VP7SxX9u}7Xa@6Fi$=xEN!o_+kjd&?R7or8x~Q1FUYd``|V!!2`s!=2a& z&OjIe#X)Q)F!@oM;wLu~Q+{O!zL}conk}k7gklRZJVEFTV4c7Ps}l^5UfUi5wp|(u z9l|X?ZgT2F6BMjy#TmIo)CW!_#m%?5Bzxx_$e?#1{Z^(uovH5DqZ@BWxAI-mZ5O4M zwv8z##*F$0hzUWvNMN0$MvzU9Bs1A-O8*Q}cV;Z?JYj $IDR+<_8>Rb=_$P pbv;xWU0;NuM4$OH cU)pVVcb1u1wLO(0 z*n^6<_UNf1`DYr)LG~ng@)ikRa`NpqDHeR}d;8{n% +NU^iWTwU4X)u;&k=z-!qR9p@(`ZUf~@% zMz=Q&kao!{wn(+~D~nW(bU{Mofpj#4alkdCv-g7pV(CXZHF+G5=?(X+869(?BZkf) z(PvNush ^8h$e)Yk!qua-{#<1+S2-zE eIymT^t%ES{)KJzfEFXITy*pIfK7pGt6-S diff --git a/web_server/blueprints/__pycache__/main.cpython-312.pyc b/web_server/blueprints/__pycache__/main.cpython-312.pyc deleted file mode 100644 index 0ad7799810f0a29da2881a1ae1a65deba60905b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 640 zcmYLH&ubJh6iza;v%6Dkg?bRAkb{Q~=;~66BBcj^fF}{!(=srmGuiFb$z(_}t=m%t zK@SSv+J8azPw7S2+gwCEd8@3aJ^7OE;)A@rH+kRpy}Zoj>S~C !@O><+kdWEKJ-ftO-?z *SSv;--@%B@;YJnzrRj4yvZ5WNo ;07o+q Kk=rhEl>Y!k*`Fo= diff --git a/web_server/blueprints/__pycache__/stripe.cpython-311.pyc b/web_server/blueprints/__pycache__/stripe.cpython-311.pyc deleted file mode 100644 index 6cda2eb6088a243d0f65e85331c4b6790c84a17d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 zcmbVN-%k@s9G}_k(%+!< HqMXJ@dCeBJVYbet zgs8wF!YMqdTjLN~hiN-$^ zQ*nJngL|I__kkKbAJyR9r@^Ce<0w%7idhw~nGKYr6+%UWXxWrx5Yzc}Do3(ZO&g}2 zk{daq!z7_+(&|ip)U4ADs%D9q)RQ2h8)8rRs+t^54JUi^xny^4;H;J#8o81fnVX!C zN2j9d$l&zV0UEt_UA`DeclFN2jc{^eu_r$nnMx+RuU$>0i~$-SxUNOC uAmz_y?~N91HCX9RVk>uM%#+OCX^PXw@O*N8EfQFOT) zYna%f^U&Y?4delGA_K-sOF&&%Em6&PfpPC^3RbvTtni9W5gxHwonqf`tU<-CL$}%z zO82xNqgp8lokp~E2^;PT2ST^-8l1UaJr^Uxd+@HzO+$4q;oEq8cU-^==q5jn7O>Iq zfgDOyPu+0Vo&b4vjhYUk#fhR2#k9#1Rm^5cu1rLhx6#49y!C3)nQlcJdBqG2aHddZ zGaWZ_Qrb|Byy?+%ab1S&8!Yldn#>a#5KMbc6}5~)%uljXUL$Ekv~nRD`7F^*S4vG2 zQHAo-O N{1>GR z*c!V)^rVr=#>V2hs;ICPk#Z>`7U~j-l9MH7Z>*at{%Imn|KO!Fp>S+)yt_Np &6}TEo{1Ho!TfTe)6-xv zyL)tYqb#G6twCsf;cNP#v*-&v_l2JMLfei0?NhCVrcxbh?%(#GED8K!UkNe73r+PU z5Ayl9KW{G`MMuJ~k^6}2FGg1EEB1G9n~>*d32{Q>9(m#Lu1NPB_Z=&a7Y)AE@V)u_ z^DExH-#cg}0YqSY>p-3(1$)uov+3^La`zV9y_>dP{TP^frz4DhaSgQazkN2)%s*|y zFn!uA09|b8+;uLf8 m?)MEOx-syDdW2La&7kD9JsuSHb>l)-&k_Pt)t=|)C_i 2V;Y10X?FhB@YgX_M$IL~IronJ2WBEgq^WQHTLrbW^ajVR{nwb%ty|ZDFkS6)UXs zX(uc;GoB$J%jl)YcYmztX?gBxf97fbd1@o}Jb3O|@Z7Jdt>C3%@Y0s&a?x{n`HPp% zLl5nb>YpqW`^JiWlbg=SmNQaxMmD*~8&HH6ot>3ZuE{LRYB{rhm_TN$mm-3Px;E+% zHEwj#TT#<7XK1MarcC-LL_;u?J+eZ@;>Dn%9|8hyxQ{(NzvXT#y4yBwZDr 9y=*qXNa|OqiCs6bRmYq9?Z!g!~ zt>3|}?@rt~v3a=d$;^}M%O|#Qe-ZbWI3MmSAt0}L#GS9Mv?9)Jv7dT8`FNPIpDE%q uC632a814w5OrU3P&9y7Bdc2S;%rb$FBJL=07`K-Y5XRnFvr=9zhu|OSh*{$R diff --git a/web_server/blueprints/__pycache__/stripe.cpython-312.pyc b/web_server/blueprints/__pycache__/stripe.cpython-312.pyc deleted file mode 100644 index 8dd2cb295bef3ea1cf4a16cae0e4589d1d269fd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2220 zcmb_dO>7fK6rS1j`giSsLudpl7(!K6Bsh*qf~pdl(lkhI62SQ(R-~1^JBio!+Gcj0 z;E15KLMl~@N>8CurRE4qq;l+)b1$)i jC>FHY z$|!LgCe})b Eu*W8@Vujc@QVB zTva}uEcEnc(q=3-zSvutn4HSx;#V%`^X4E<4_?(L_1x^x#fhH9*o92*SbDy@d%8Pb z9FO(%FSbV&jA(9MN(L#pV%h96kYQ-W0&!g$ON>j9cywfDimIVBOAUaBzVP(f`GZa? zzz59T-E0H3T?G}g4g>Zmvn<9NLxn0g2UT8mslty;a;u(o?;7P38%w}!u_XX*fb2d; zZm#RTHE6#jKnE~)8FK>Q$PzRIj^z#L*g;?h|E*QHY0AbWcoQZX>jGQ=*ZFC%044t@ z@ghBqR28YjrKGS*j!;k)Bs085FEsJ$)04AtRUdi5l9D(gSZ2g~t(+>Dnpq*DQBE5Q zMcrf-7Yb+|VM!pKvL@?A6_Ep_R7FPxQ?@aX%}NOw#Gls+NY*H=4C1ov4q~Kg7%8S) zEXYcc(haeQ6g^SNYcxOtQJ781hgs2y*8!V&5)HK7HVuex=(>U$>DWx=DJ`*^xdrW5 zvSA0~h{xdyL O tX!YOryo>;`b=6ag z^j0Iij{|)huD-us`heK>C*Wv!Z}4{NTkn&W@ZH!q^LK)O*9EG5WxPu>_%c2i0FMH` z!881$18sv*{*eTk92Mxi*b;4|-DQ|5vuqH4cxe2!7Gk8fTIe|yR{p03YEnLHUB@)^ zo{`<9dQ++Hwt~|V|J`P^`NGWzj+8y%NX>PfbFSkAkoZyJZ&XFrRN4>p# *<7U4GI%bAzZ?5{tR{9;#g3ZTSrt3ir+%J!FjMO~ zSM56YOMbKKvrX~y<@cZa_TBUR6#60baG};eR_!0F^-om$Cm#DIH@L|i8VfA?q7IK= z1D^qJf!|IA3V!3(0`$-5z(5PejV=Zq_tP0u&r1+9uLl5k)5ZE2yGpE7tUnBfF#UqS zp?l{y1E)4zrz}e;NQBvZ%E(#n*u|V#CGGOrcY-VzQaX}l;W&O-=)0|T32;28-1F1Fpxta>*^ zY1#L5|IKCht qDLdN}*=>hjS|IIzuyVgC*fxbt-;)lUL0VA~wOKXHGU n*__$tcsK=_QE%N6>;8t--NUQp)j4K#dYgl=li5Tq$;$R0rw0st diff --git a/web_server/blueprints/__pycache__/utils.cpython-310.pyc b/web_server/blueprints/__pycache__/utils.cpython-310.pyc deleted file mode 100644 index 7d1d51668e0e00b81bf170e8ca1e58e0b4082aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1293 zcmb_by-yTD6rY*hy;}}A6*ch#bqkuaps_QAs8AYWLMYs9a#?rgj^*~_d^77Q!3q*- z@Ndw>hJR^VD{DF{- AF}J}4(y`9S?&9$Au!d7dC=C0?C70~G zFrx2WI{A`eT(M!pMk}b&QuP98p^f#1%0NInpHwzTWtmsU4Ce99iQn zF?pev$DeGssE0!(`+3!;@Klc`(d7#qZr~>4D9#2^L0Y7Vo!moV*dg2JU)X>O7YE@! z|IGI|mg?=kOr?xc6KRuziRwWFH72X0$+p78D432arDSC4=$(qDc|>_d=QPU@`AcY1 zXoBepPW{w{-a)Jz23;eJC%N%=0x6EfK88PJdn{*r{0IN)lG(5U`bSu~^(*z!^jZ#b zm_<&Dvm4q 7vK%yM0&e2a$=Gz&jJ@ w2$VzgO?~ z>RvY6N?>%}`m*?rNyyLmk__WiIDQL+yMz-?15% BfC%Fu_09&{X*veCLq(A*Dy6d;2j1=6L!qZW@Dua9>lu=rWkE=rIh!&%?5=!}D zd6!1^vUDrT!+puHK!7;O@hyP6MAJk;$n}QIDJMG+{a%s*(YWt) &by1s=RT;exz#{B!>{B8uX?VALvcnWXCDYxvZ=SnhDV&KxzW+#SJ}L9 zOKdJI=w(+5_MQx{!|^(vLgmXElp`aK7fRtQ231j!epxH0s{KF>Rc=NdL0Bvbp7+an z3|F3qC^1QO31E#JWgp*M*m`<f>b3&EKV*`i=4Nin~S@2=+osl3D|&RCyk;eWge@C^kj!JLc- zR9bsU+sP^+8tZ#HIMta%2J$tmzBihw*PP@WG01IWmH1?pen-E;)Xdq)hG>ByG_uO# zhVD *NiMz7FCp5f_lSjed3E{g_ex1$#ZDej;&LHs-kM8 zFZQ3uE`!eFL*qf{xq+G(`m+^Y1PTlF`x^PBt$p*gjftbKi{H*{&;0n}4}-OyiT$35 z1Hi7ygRaS1`{ZF~*M`0`U+e7Kx(0wxrZ47z#Dm#2WDiWT7u{kbe#lNjL%spml3*lO z0XH0v0pPdo){U{x7S 8*Q_W1U*28$Ti(U3{b_(%f0Gjv~S9zr`K8;3Y|C(l9 zxc3UcDa~HLQ~ar|x7ODCU&tn(L9b0LYmP-e2L{*~k|E$tHQV17*@eJWOAj^KN%zH9 zc}t;M_H-BqO19uWyc=V}#{Ohy;wxtM{mghN %Rc}CLBJ3I diff --git a/web_server/blueprints/__pycache__/utils.cpython-312.pyc b/web_server/blueprints/__pycache__/utils.cpython-312.pyc deleted file mode 100644 index 6ed7cf5e313b2ac0dba92a66e6df1c2972234847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1765 zcmb_c&2Jk;6rb4-d-LIhHWUJF=^_l38;B?+O@%5)L5SR BQNmm4G?cl QXLO2S+$J9JXh1?*qM=sOLcOGiM#%`xl1Xt+3o>E0 zlm%OFk&@*ZfCHWhIJlN6WdFcm1v9ZY^L)-+nPeM0s8nN~WI6k=!Gug`Ey)Tdgdaz{ zG%;7Xvm)GH5=t3>kR|Cf0d5mXK`B{Ib4`DM_NYhpdjBP^R8qn9N}g!-ahx?$(B>1X zAsCOGkQGdxg{X;MW0GgkGH@y}9WV5wUDClVAI`k ixG zu3UM2>NN?ImoJyyn6vWDputwSA4ySeNIwvhD{IL}5Z7wVtN2j`!}HS+6;l$g05r*A z?&+ 6ZqNm&!TPM@dA1{MAssI5xN7sbA(^mOKVWb^%u?79W1cNz z`zEuy2eADJ$ByelyWMWYE@JI2z}MLT_?kkKyZ-@CYH~9#&D23+2b6eJTB*IP2%e6* z`a3NpMtZyjqLH??L42}7zolQ{(e(MmglwUEG%+Ifu`Fa%XL$~Sa4Z Spn9?CdvlJ99r={Bh#@iJ#9E55{Kphi85r9lN!-Kbqfu@9t=R z-^#0Ab1cQK#?OJ`=P?*wiudhqLdYm!Q(D+T()GivYNzIk@@eXG #RvZrjPs8N; EE8e z1P;h=ZX@6eGhY}=%xd6>`aiBp_YSGYa-iCXTp7oK-~+f0Uo%BO6_1amu@qAuTGzwa qYXq#w@v*~aNg$h#bV})ca_tv#?H)P%z|iQc53DR5@0 7%Q6rR~1d!0Jjq^Ya?5Opaa)gU5=0EH4&LJ5!*6c8aru`I3DyA#;pc-`4G zP9g`aDhDG4sZ k2s4t^bRt(4P@}!5V;4R z-?E&6=TKVsn@wl+L#sCgJ_naz+CT(lv4OxpZtxpImNzgFmc$@nkuwCa#td--W#ixz zgPCM-u(#w&Q<|gYHJi9GN}Mt+&gwV_gfR{u58uI`AR5R48MLL)Z!1VASn|dv__Ezj zv?urmz(xEW4`|=C4LR(Ec|>Ohj>1_*YAo2uK=9|e*|nHfDvcWXbll}E+Z9Th^QkK= zS!U6VYkAw7#toAewPoT;s=8 u b^vE1a` z_;}_O 1AqLG|f|)`3cNOhd{MidWxdZUS{vpDbXC_#lWUe*0rG!@)K(k zi+>daU@xED{PH{J_DWN}(2_6Ih5h04x8JA>Eoq>g8U(1j+I^|U@Xg_GMsAJNV{JKA z@200AGy*(>#{<3&N&_VjfDD@7wvLq{uptzM2*Z0chn_)B2sA>^B02;mVUNIJtKw+E zFj|1Pb^HaqKXZp#1y|4tzkn*3o`JBmKnGy}9IfSL({U4Tt>~o00CL3=HH%J~^O42G zX0!+ZJ>~nWjMr;tj-d2*@vN*K_QxP5nLO7@p1T|T9_-5l z9fT99Be9?CyYci_)0@-vNPhsW!-FS`HbeRP;0XG@>rKq>$P@f;A}A5uS;ijjuYuC| zpQ!sdaXwC>Ua;Uw_rQMs sxsb*bvIWt6?QE~%>5%38r+p?%;>+3s#^(z_LuokGtu z@f?U< l3)V$tCiJI3t!f6aA Po)rHu+rN)l@Q(Tqa$37B diff --git a/web_server/database/app.db b/web_server/database/app.db deleted file mode 100644 index 1e82968d6811ad99e4a97362b1205fdc4726d5f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 zcmeI((NEJr90%~0;U )wfQz_d+pu*cK7++mNm ed9Anp{;!C}(tGDY!Y*Wrc z*B_Fe SjnYYjC!O>p&VJvfy#p)PP$xFs zr#7{^^hgeY%McT9%yiPX$R0JR7;x7(>Kc3WmN?nL-7i>OUvE`4V^vlB$&h{K=Ogi? z<9gF5kk@X?<8G#f+F-t_t*xmi5;kql+4+=B-m}8xgB*0BvK`N^BYNsrAD3maeyk@k zqmX%H&Xd!8K1OmgO;*w*%?CZ8HpyneIClCyOLRY^mXnx8el%jlp>K-G<&hUgZsd;{ z*%M2{=^fHS`X|$|d*QQ77V_NU5V_emj!lPbBroA})4yP3x8FCZVaynKwn8Es~C`y}hC5 zsPpfXPafx&K{%W>f3m%!7iPo8o 1Ccd0VIdp-7yQ%@ zWa8_(-l%HNw7b^3oVU9vPZjZr@-Y5XX~c(Ce82_)2tWV=5P$##AOHafKmY;|fIwLV z>hZ*q=l{9ppRp^MU{bAOHafKmY;|fB*y_009V;Utpo4sS)GRR^_I&IajMZT8QuA z_y6+eA2Wmi1Rwwb2tWV=5P$##AOHaf;Q1eG00Izz00bZa0SG_<0uX=z1Rzj;0X+Yg zKgXCM1Rwwb2tWV=5P$##AOHafKp^w~|0*;f009U<00Izz00bZa0SG_<0uU&tz(3@2 BS+)QG diff --git a/web_server/database/database.py b/web_server/database/database.py deleted file mode 100644 index 034a6ff..0000000 --- a/web_server/database/database.py +++ /dev/null @@ -1,22 +0,0 @@ -import sqlite3 -import os - -class Database: - def __init__(self) -> None: - self._db = os.path.join(os.path.abspath(os.path.dirname(__file__)), "app.db") - - def create_connection(self) -> sqlite3.Cursor: - conn = sqlite3.connect(self._db) - conn.row_factory = sqlite3.Row - self._conn = conn - cursor = conn.cursor() - return cursor - - def commit_data(self): - try: - self._conn.commit() - except Exception as e: - print(e) - - def close_connection(self) -> None: - self._conn.close() \ No newline at end of file diff --git a/web_server/database/requirements.txt b/web_server/database/requirements.txt deleted file mode 100644 index 8ab6294..0000000 --- a/web_server/database/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -flask \ No newline at end of file diff --git a/web_server/database/schema.sql b/web_server/database/schema.sql deleted file mode 100644 index 8f8d7cd..0000000 --- a/web_server/database/schema.sql +++ /dev/null @@ -1,36 +0,0 @@ -DROP TABLE IF EXISTS users; -CREATE TABLE users -( - username VARCHAR(50) PRIMARY KEY NOT NULL, - password VARCHAR(256) NOT NULL, - email VARCHAR(64) NOT NULL, - num_followers INTEGER NOT NULL, - isPartenered BOOLEAN NOT NULL DEFAULT 0, - bio TEXT -); - -SELECT * FROM users; - - -DROP TABLE IF EXISTS streams; -CREATE TABLE streams -( - stream_id INTEGER PRIMARY KEY AUTOINCREMENT, - title TEXT NOT NULL, - start_time DATETIME NOT NULL, - num_viewers INT NOT NULL DEFAULT 0, - isLive BOOLEAN NOT NULL DEFAULT 0, - vod_id INT, - streamer_id VARCHAR NOT NULL, - FOREIGN KEY (streamer_id) REFERENCES users(username) ON DELETE CASCADE -); - -DROP TABLE IF EXISTS follows; -CREATE TABLE follows -( - user_id INT NOT NULL, - following_id INT NOT NULL, - PRIMARY KEY (user_id, following_id), - FOREIGN KEY (user_id) REFERENCES users(username) ON DELETE CASCADE, - FOREIGN KEY (following_id) REFERENCES users(username) ON DELETE CASCADE -); \ No newline at end of file diff --git a/web_server/forms.py b/web_server/forms.py deleted file mode 100644 index f339bd7..0000000 --- a/web_server/forms.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import SubmitField, StringField, EmailField, PasswordField -from wtforms.validators import InputRequired, EqualTo - -class SignupForm(FlaskForm): - username = StringField("Username:", validators=[InputRequired()]) - email = EmailField("Email:", validators=[InputRequired()]) - password = PasswordField("Password:", validators=[InputRequired()]) - password2 = PasswordField("Confirm Password:", validators=[InputRequired(), EqualTo("password")]) - submit = SubmitField("Submit") - -class LoginForm(FlaskForm): - username = StringField("Username:", validators=[InputRequired()]) - password = PasswordField("Password:", validators=[InputRequired()]) - submit = SubmitField("Submit") \ No newline at end of file diff --git a/frontend/eslint.config.js b/web_server/frontend/eslint.config.js similarity index 100% rename from frontend/eslint.config.js rename to web_server/frontend/eslint.config.js diff --git a/frontend/index.html b/web_server/frontend/index.html similarity index 100% rename from frontend/index.html rename to web_server/frontend/index.html diff --git a/frontend/package-lock.json b/web_server/frontend/package-lock.json similarity index 100% rename from frontend/package-lock.json rename to web_server/frontend/package-lock.json diff --git a/frontend/package.json b/web_server/frontend/package.json similarity index 95% rename from frontend/package.json rename to web_server/frontend/package.json index 336f3c7..e3bbe4b 100644 --- a/frontend/package.json +++ b/web_server/frontend/package.json @@ -9,6 +9,7 @@ "lint": "eslint .", "preview": "vite preview" }, + "proxy": "http://localhost:5000", "dependencies": { "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/frontend/postcss.config.js b/web_server/frontend/postcss.config.js similarity index 100% rename from frontend/postcss.config.js rename to web_server/frontend/postcss.config.js diff --git a/frontend/src/App.tsx b/web_server/frontend/src/App.tsx similarity index 100% rename from frontend/src/App.tsx rename to web_server/frontend/src/App.tsx diff --git a/web_server/frontend/src/assets/images/dance_game.png b/web_server/frontend/src/assets/images/dance_game.png new file mode 100644 index 0000000000000000000000000000000000000000..cd7aff79356e9903c26f83c78856853a941f62e7 GIT binary patch literal 295434 zcmdSBeLU0q|39ue zMS)UpU?OG`MiJM|9`LB&CTt#+s(~h&&SpMaev$& zue+yDx$Eg{($Uh=(mQ_a$QdmyZIqVQcXr>e0zR34`}_v*Ygxh>_rqF*?#&ax&3EC4 zP9D L-y~a@>fqUT|ZlG$-VpK?k!izk)z((KC|6z!`F+qZQc5+ z z05IsK`w$GZTK)!9A=?+cX;h2h&D4U^$g4CO?%Yd)* zU)TFf3fmR`y3x|A`Q;| zQtKeW+}!+8y0}r`5!@JG#_v7lcv7lT%$SCxQ(%%j6_cj%k?LACZ&hfN5)6B2$jo5r z>91}5`irad%7bNEdkoI~+hLtn=xW)2=z6Ob!)WG;KSHu{roe%LF#%@l?hg2hH%V;9 zCnq=MI663(I0~6WjH)Lad2U~A;$OBIjA;&8EgrZb^zy2MU^`XB>x%<7TKBHfI=I^m z_21Ups`XN}^4jLa;aeL$TBd3`O~B{Q9h1#~Rav(^zFaJ&ZV;#2MUyKkj>jVqRK8(c z!y&1N%(MLai=Pl=S^XmZ#Wgk-&+q8)pldX*jP+YucP#in@Lk4cvv=o*tk!zS0{+84 zR=%cHEZwLT|6U&)_^X1Qz{q8DI2MDy{bq$pzp{v=3&~InJ2w2W?~u;$r;=^-17`{l zCkv)x0_0Dy$sNC;)o`OmKdPZ^%)|6WwcOK|K$ZEk{_?M_3G>-jzu -W_zIMiowX3{Lls&!BQ&zrMyVPE*(e z55P5NJaWoYrDMJHNwv|PCEoOzsp!Up_BHgAdU|M{q8sLs4Bx6Szor*9{?~WjcbE2+ z>7(34__}n$QY+-NF5R2bao)Q^ys|k#5=?)FK1`>?q7)jq_#wN$e}_G$F=TaFSs7Zu zD6~+_Vw#Ug_j+PHxUt~4fJiS#Z}^Flx4z(n^krJ{y1D-rg@9unJQ$QRd<#u%mU__J z+A 4E {q>yuOq2UX z-ZNvzxeIS~(b=F06MCH21@N+%2D2~!!z(8ES$hMM2QQ;XL=vHF7NMyqH`(|&dJ(2{ z4qDc!E03-(QKX$uYqcJ7X<5|pJjLUmIxaqldjUE%;{{E<yGFHgR7yXJY{b)09~T zxa$0`iYL*8oS3B$xp5z`&Og`pT7WNay}+L8b`*c4# +h z%ye<@D%3k7PG-|jgjh8`vo>igD-DW2v>& {s`u>A>BElzj~3pDRaw>>)3UM8r9 z0gjRllKsI)EtI3stCtSvpqZM#( gOp)=Q_zO1M(o1C09p-uV_(H~lzmLB5Txo^fHe>lPjp#r5H z$0W5a25*ATKPysm#0p360^?q1@ma>AZ+t*NLFkF=oE7tE7}c|;HhuUoYg2vNToiqC zh}N|){~@;T06F-y^odQh$>OLLDrd7f@w6v|sP2ZDWVlY_&RF~3?W!J%l_9Lo#W;`M zE);B5yB(_VWy#1B8doZuqwiDa5pFB5pOjN39ZlOE7E(B#iqF ^zZz(1J+RMG$Mr8()`RHTmBeakz2hoXS;b+Yw(eH zzpK^!yu;Y*f!;wDjZF=Q<4vk~Rvo>dEB an5oidT 3!tofxOtd zif&ML {rg>k~5T;`06ngvg_tg)TiG5m7NY7SC2~>SpjX0PL-W!bNTwm z33tX7r`#pi_;FqkO5WHidaX36V!~aFI#T29RC`W}gP?Bn#}DT7L;V5+q5}%S M&*dd`ObqBC(d57s=g z1-(pbF#CV!$*o54slD{IpxK9^VAD;cK4ROPi!z@dRA76&+eFd#M0YGYi2ynDr>|DP zGmii>r{^X9#LW}TN_NeeF6&ZjQ-)bp&Ss0 r+obi@I+`8IC_@vxv3mf}#D; z)GrcrCgBt!2(p+hI9BLQAcK5X-dy-Yr?oX3AHT;;Q9`DktT_uV*MC!9m{tj3SKva^ zxBOR(j|D(;RhKe+AFfGJqelj56z_O&txQ01ka>!y`qPWOmGzk!b!iQ?XO(=lx|BB- zntLStSk~`ugrEC|2nc22byxJw%IAl{9?B1 9tA?u<8bK&sj|}tBQtK&hOMQCE z3+!OPmcCxXC%Y%aTpAK_vx!OUb$qE@CyMU%>j)^~?HU|+N;xPs5LD$ot?J;VWLfra z9Cf0&XBXspj{b#rx8|yHX>m!_N-@Pt+N)%lX1w(e;LGGTY$IB1*OU7tX@QqI^LCno z!O_N4J1=O6x|VS~F6xPjOIx{eh_QB1gN&>;(te45V%1o4OgV*J;eV3dSI#JXmRin# z(Vs@=P#4bM+;PbqMO rV@Cv4@PM0kkj|ktfsk?jH?kv&Vr@V@c(ibs$#6bl-b|!k;R!| z`e^#QpZ;dQ{^xUlWS9J^?_m7f&po}V`c2_iU+&R3mECwd>@iq#$GNEFVfPf?qQ6pb z?@qUlWfyZ&aJn$KJmNI8*3m26P$^d>0Y?S$|EU=vkE6Q ! zWzGcs9@wCHThr+poGNL}76+4jzs4o&T|0NB{g<#0A3OZpA&LN+ANa#$X2mX%_*2wb znoLGT>w4C$)u?8gw7+T8LkzKmi6ou (YD@KTd;B`dK z$14Y=dqB>wUivFJxUk8N0H0dYS38FQ^Ba2LVOB3rox1ZeQ9w5S=)rVNibXs6+em~x z9iwA$oEb9dq_Hc!Tt>e6mL`x~U(rfT3Mth%Ep<@;31=)tl>4HRh8FnxdSrnW1;^o< z+hLQ=jw^i}YUQskVap6Hdn$v-?a%>3!hDjMC;|TiBPTGhSh?9 aUiufjj5P;J@0*^hPZm;PR= zXox0>>g(WVxjr!z&bG+wqG?TK5Mx+ChVP%N;v^7WA+0)>mIPFF-eUIRuB8_5f0p5; zzIEB&{0`oOff;5Tt$=v6$$d%@@I|J Z!fNtFrVoRV z6KK?LK*&9shV5_yZL$0;%<@&RY>TaL2py8#V$M>#oo%IQb( ;{q|!o{?2iGux&UMRrw|pJuVh9j*$({Z1- ->EOLc z#{RIGB7hP(?JxI~7#CTGN06@i90_+N&y6Q7ta_oDPV?`pUb6j*u&yUIXokIDGkrQS zY2pD&3owd!2El1cLT8eqnL`_{RX+eLl$|`#PJ3rHM`-w}ufh45>JoiUJNRK>r1|xN zH516@T h*%ymTiw~xfUgB~pu>jwIjV7esC!PoEnkE9 f3n^pWpW8q6<7@B1DI>Igs;uR0YN di&8SV0l0g L} zHNOdnDJTtWj>;g*vGX1d7b*T=_Y95En0|y!TtK;udjH;>M3(EBXj3&_tU=JA*}*N( zQyQdpmmF0&`#_R!T$(S67&L(k0BbgV z!neX@E5aBMt@kJY9oYUAQ8|x6D3Nn>PCWK9%g4pZ)p>LZvGMm0?!6zi9}^F!e2lAD zZ`p6~mPAT0F|5t@-;o+uT_}*vi(XkjYzGPle9<9p?UyD?>@@4j1xo1l&qQ9QRZsf_ z*sp}hd7u+e?KFG2fqHFcNYcB#OFrcmpW7lyV^T~g_qcBlFMe90EY|nNm|urf5i!j& zpnpwg#gdP&ithpnwo9YPo4$VUxWlY-YW)cBQ;S#p#UobC!7|1CWt<7~Tm%FqSrvrE zHN>YJEs8jzT+H!H?kn0xY03+_)#;;gSb33}K7$NeSsZs?(@mkG;8GHi$1U@zK8c5$ z7~-*Mi&H>ky-)lP$FjEqgqlfO71P48WyVF0q*gp_p45@5 0;4Ry6FdDtoQD2PwCDuFnV 6sW2%6O;(E^dl~Y-f-K(1s(>+IAn+kj|I4XF&6NJ`$OrhO^2(J*y}iXlJo()DS-B zylG8bE}NSVQYzb83u#&p3;qMfy>teyvFx8=Yns$uk*ZzaL~|@iNw%qfkXhq%w<7m9 z*TiQ5xAANKm7@KyTE3D~+Ai{T3b~lcPc`4*Nyu+JBCXnn*COoR%r$-=QEPos8RHXo z_L10bc2?J+7bdxFfzG_=r;pA?C_Lz# ygCAo&*9@v}F068E z8Jq5Q!B3v2pVMpuH{RpfME4&{hARQDIzbk($et}KX{YJgWe >+6AWhe|Id$au~wGzoKF{5|YubX>)NHk*^WE(KET!fO7C$3)Owpr5M8a%S~8>s19 z7K3TOQr4Y!KT8JipMOwuxwmpL!$I!JMO-Q6R}C>?yO+Gl{_el`NUQ#h7d ^h3+D$jn@8#)>=i{qdjDj30YyB`N zS(J?heALsV=nTA>pZad$$>RY>=%&x6r5e@Fpr%+g#LiP(ZS|q%viot{EJx%mzJX_w zfnY_(?DeE%mU6aY_iv8^g9+J`_m(y`Pp-ENGcPVhq@T>7vCTrB-sb~8o;6U`0XW(x zJb`dZn&CYAD}DFkgW^rlL4h$Zp2j~i+xcrG!~9i7nXYKV$x}s~Qx)f7LDD>ne*Dvp zdr7>PMif 2y|igg h9cLAkFMs% uVPLGWq$r_p5#gnU=a-(Na7^;%t z{Fd^f)F*sJLS0ouwO4qTQA|`Gzzy$mtex6DVQ|z3tu38Z#)4weaP8TQ)Bexpxfr`Z zGek^cMW`7n$NYx>wDSG->|;oPk2kT~zyDY=t&?7tu861G0F>HB3xAW;xye4DRc_2= zJm*hLenQd%cniMtb6VRY0K}k{t(81>GL5^qo0ZwEJD~&Vd5J9L$qKfc9z}0t1ng*Z zI=6f9icdpOmwykduPm3aB51pEjI(7(9yi(FN3q=xP}Hx0cC6=d?nG4ZZQSy>SkXf^ zPhxJ>eWc#&C;$xj8~y`q{^P_babu6cD}_U9zu|$G_NH~?$@48S7o#sWcK@+u{8RR` zmYc~?2zCH|J{IpgumK$P!*su1fQh^LZTWYVgucq5rWH-@*_5>mXW}PtWZ6urImCR> zM-#_YJ?2Ar(~k7Z`c2tT;q?vl484sbX;${`;cp4&%iwFaMD*R`wXC5CvZ3Z*PoFOm zeAvgSdM~=Xe|#c_pSOWyJ|Oxba6?b~h0}`rfnO>SnOo1PnktJRiwjJ2CM~W9MJ^QQ zYdWqa#N_tjvU@;(LX`e$*q&S;a5R%Z!sl2v^4GC+ZZ~_*@xHt -)Kou@^iUIVcpYgif*r@mk4^n5WnSAS^5 zYS)fV(w51-s4vY !qH5w*D_|`Nst3Q8UZG0B+2Mxt~fT*q8 zls4ONaEEy1hyTw63$z}jy@Il*tQoK_gj#Y2+fx9QH*9$@9>YHUzIztm>sNtwbkEZQ zf2gs$pnoLYwBEHTMn87K3?Wt)4Q_9o{SLnxIq|jDl<77%Tbk``lFGUri(c#E%R{!# zcs&I;csuy;X8H>1_VC#;mJY-PW-mu9PWYK_FT!lBrG1O^Y4-rY?xDJ{u1)kJ&1|`; zVS=EWgr6FgDU}`ImTd}fwzFBP>n5|x9bcRE%}r>MrwJysQ446!(+5$};2vB5m8=vV z!?x6CI1BvFFaYn^FMrU};=)B-NIwL3$qKKk c=jN3WlexQOcKPtmQQf01`md-3$|fAbKvk1z%^wPR$Ac<}xDqcN94k zRirWO=Mgh-+r33{W7=V58|Y+O^Ora6Br9kG2(GI$3uIj(%|f>_(G>3iM Votc^Sa%k$2Z0hWw$5@snz7FgApR)Yl zxr!u!@^ -$&)8|TeJ%wH_P)k zno>XyIW2EJyU*_){KI>1a$lmiCP$y{Ccnmc{(jSV-^SFBz6*rFm&zYu15tV-PltL< z&noV3jb9AAEHpw9Y9^c4rXQ3RC5zBcW4VZ-NHpq#`JXS&L>?WL{8<^#QM5(y3dUpG zxcw XOi1cjLgs9LrY0EV*3-u{11L|my3$}2jm5%edG#A%(7c$R2TCrr ziztq`s7C&yF#O}G=8sk6y+egGQ*T7e<#%ZxN{G<;HGxNG-fX}d$)M9hBTt`+ @-#CqJ1RqdNq@_dgayEOif>id^n_9ZcRH*_cxuUp-AI*fiZPK}>KL4C=q6Y*f? z`zZdgBX;UYP^er*HzwS%+4fVwna!o-R<7IKU^4Y;5np4AooHJ417IreMUkeF6c+~9 z2#bIhR|LmTJ7c?qW_le_84?_^wfiG!J?1_;*bS8I>@$2V%zXa^JFA)nsk<{n90!1% zs?W@e^bbeTnWduL7tK)C*|-n(!m3)6_D7kyX1&ioX;_I;`c6+m ZI=%?$W-wp zNoW#IDMHP+{yphC^=IO_`pam#?}S5jUsEXpS|$8NBgqb{Qg$T$6;pMUfgx2MLEC#~ zwk*oq_YK8{Q6}c)IgGLo)gkR`0H&K2M>#1)n|hjr#1L*Ef<7n*)W{19CleXGl*7NW zpxsQ(;>8tPo`@7HSGFp@GmInhr0b{*^cm6FTyV4toR!Ss!PGN^C|Co^+oy~ KRm^2-Eb-rE zC69BRP3s35qI_@J-rm1?C_2Clb=n*lv&`Bgm19+}SjX(00dk6hJWl_HP}4$!w*#!h zL_*KejmMEAh5!}oBUz|D>%CVs^Ohef45q<2Nf>@7k#b6UyD&5kUFa+z0@Fp$`cF}2 zE=4_Ni8uT&P7wRC5p!`>(*)szWXSrxL$Ry+j+noTFOxFwg8dwObb{N1;+oAk)#7NU zQchUC=Q~< zh?Qv28(_qsu8~_Zi3lq zlRPoPLwrl6i?BnOqEr8`sDpUz97|i-=K$}g381Mh-Q#-tlMe=8m0Mr-)V*htA)Qsd zO~+zc*2UI$SlSukH`f9j6x6l6+dq~BmnD)jpXO5H-&CV9dBWA)7jf8ItN~z>d@vfz zFL~(Pc5jvXPGIue<#e|Ia5*142RDH`+)X}r^yqeTRQAA%1}NX?4Fc545aP?D-dW|+ z=< {L1t%vyez>XL|AMncJxrcj(Y^7Yp+L vn)Yjd+`G^fHGp;e;BcbP8HJXzuBC_ z&1AmyOl*q-D3jQLAv<^JgLT;79BV&_8S6jgw;V0(R#~hO&J_$Lp}1M9VS`qS`mf|? zC&N`@=a;oqCB;2&l<-HwJ^tB^!orK<`X|~VqeCG7AK3jR<@W=WrbK5S`DW|4sSd3v zUXOf#kg(My{O+8U&B32f5v7u4Q}goW$?(OtG>NCx;}fHj&sda3f#%H-V8?@-Q>O1c z_#7SAucNe2n1wmBRBHN8QAm z^4Q?!pu(x^+H;Cn?)2}Wj9v}u&~@K^;0?mc)261iCWZ-~bGBnk(*yeeDE!Llwcqa- ze+pR*UpqNMi0 +L2!!BteNw$Cd0k>rh*21Z9n`7^w`E2g$_LN=^{OV#UEIu%oIQ_zodR&?x zUih1R0PfVy*P>JmzOUbomtM>7l>Fj1yk`qrOTvD1TN^HDTfIO4&4kzII?*U!b?7^> z`=z|j>hvDp^>y`=wELGY`^OH?d#!jhN;JARDvLt#l-!-EHEr<4P0bm5eM+er>r)qZ z%p}lPe?kube*diVdF98Jozx`Pt8>;a^@0 5e8Sk3TuyZNOt{Gx z2Q`5|dbf8!3Oqv~-tURV{ob1D5HKKG#vUl^YcQ;j$zw<3vXnZc$pfED%UkPpQtPPK zLaGH4{?i0NQ?fYXqH(RMP9upW4`$)~9Cs72Pb3Lde^vQsP;DHRe{Ro;mb YW6+GsId!)g^=P^=bX7>N&5zNQ*C0u} zc2UK&DS$ ^&YBV`X9^y2c`cJU2no;!jqiKO}zP~l+@N5k=M*ij$eMPc2;q4`A z%x7?!lD)nFka<+lJd9#pxNlX%0$PO3gYGGa*1zhLYcxJS(Z6q`%{9$1DbwGZ^|4By zrX3(ODPQq_1vp@}_NO36N6hIZo#r0fzkw=(0Vywj>-*NS2LaQG7IA3`hmiV`)8VuI zzbEa8O*&_O^S(4O?21!?os+3zkmkH|kmHUjLjI}$`)r~DtwZn3O3M!g`>=rl$4w5G z7E6J75DLqQ7cbumD}|j7U+ aRZ~(~1-J m3S%NFc@ zWbCwV6g+ybv@ ?N^hBBaO{DB-CiOF{gc?#nc7a#(hzoDkQrZARK@h52CiV-&!5 z8X`;JSs62>XbzI<)^H*8C=`ql&j~F@%x=VbSK0wpaO}+`{MkzUmcjB)d7>4kW3b5q zAT5IYV~)YfWh0)HIp>A6*~Is;CNX+z)*Q3k-Pa<2(Vpz78L?jL5f_ESIORoA1d>X7 zht#m-eCI6j8iZ<&nilh{;;eFNPETkGOPruBi+r=xx l0f$>!joqzefJCbK#}8SIsT=^Z-um>^bws znj;LD{%h<_rHLURr+CSaMfIqYXGrG NGJ uiSml5>Zz;S-UZ;u)(-7}~t>qkoa#*T%8xTfRr1o28IV8+Uj%-8a- zoL9=GXZ0dTq6;+HJ2ia4ZCjHRTo;JT2>$@!(3s1_9`+vgqMcdP?L|wmuupksc9Ovm zDGYz>Z67s5ZUKZ(Blgs;o#b(yOG?9}wO^`#{yAciTA6sAudtpyf2hHW0X6un6i-Fx zHp3Pz>7W%u8D82lAcwM#{H>(`3 +yeRTxQ!-jO9w* zB){k5%Y(XqBL-qzv-rY^cuI0YY_+A}XUkWeE~CQu)75K|wmep`jTcQC8>xQrhe%xa z#WzTLFy+P9j&=0fY!^2v8qoB@W7DWFZoAQ~1>@^JWa_ncZu4REGD$Uu6C_{Wj~2~H z6Mv|9dngD^C<9}>hk}Tn$6+v*DJf|#iumdrh8k>>K;VCS{cR?|zr Q1fG$D)s z7bo87;&qf;wjQph4gJisf~CS7j215gg{yjA;-W7felQof^DBWO26V3CJuD~b`|aq2 z*g*k34%#*t)Q*+SpipM=y_*&h 4)iji1 z>QX mw3%@?FVKgZ2ZJ*)s=6eCcZSZ*2c)r{u=;JjAMN?8E=^h0u?7 zK0dFPJmSTY6z<0#A62O477}H#9ur3fF2 bMRzDd2!>_`-(S$kFJ!a}3Ct zrgQOir@c1Ljn9}_^$y~ylSz|RL-=grgEa6-r& mLGUpF4ynw1$wYZl315ATkqJ^WV+G) zo{2GSeiwc8A_Cdg^Uh!IsW6vD_$n_oR=?zvn@26sXWu|bLOZTpZ}IXDctL)=F&&t^ z!X*9qbAwU6JJj-DnPw=%O`A--ey7BE=V&OtzP>ve>puG?4pgqVP vH z$Nvq*a(0WU`*Y>cCKt?($u~1Ch=wNz@(eE6cAoM&x0JmjFd|(Oe}!;kfS#lOI~?W1 z5t<8kG?N~@v!~N=J@u5?Xw=GYKslzVIPY7I@D83J#nEJC_hXMj-)#m3ogt_vjty)^ zJD&l>8a$p|jg-8rQZ1~1VM|vdlKqIk=H}X @<#y;gSMb4LsED|$2A4sSJW7A{&POxU_x@8c32a^h3?=_B zTen?a6~A*+sh(=n)XF6_-SahnS=@juAf6&@@i}xXeD-#j@Wf!V4lqU6nRviG_Gfpu zMPGg`K}xPWXdZt!HMy7li|D5RN!AcfDNIg^yfyP-AHFz=E$@7r#(I}r#8DfPhDvBD z{3`Yv?r?9}Ma1Uebn4>Z{Yn#zZ^Y$~UyAb%0I41O@gt_EztlPxCMIIo;ZXQRymOx4 ztr-(TVD25)Jncru1fm!GG>`Dbnc;P2tmzXn>Fq^_^$7M|wtGq7sN}Yup-DJyAx(|# zB6aYVhG9U9l$V%p*|>~Tu>e#nDFHdwF8loFccTdv)z#kdw&ygb{tP9K&{Qee^kcKm zXD*8T5vwu5X%+mx#%DXpAT#@OFA)o0?*wt9@6Z4(iP!;9ECL$M2%W>FOsiWnvmfhm zsxD!#b8_d5KZ13hxw|nrSJudh3SH||_2_iHxF7VnyribiH{PVA{bEy7T}eIZEbieT z(4+3*{Hv56>}a6=-gSoYXv_SP#D9 >?=}vCu1QP$vFt&Y<{~I0qx(c~An9~`08wmH_jUd#x^r7o_CwU# z3*~zta;GTa _EH ^gCQMyAJ*)~1OD?8!~s@bENcZ0+C6QuIHI}@$MF|e+tq &1U!75j&BA6QP07SK%qEV!`*j z-_P-qQMHoo-SS_e!X}Z_+Dg(;zt8m8tq}${)8}(J=I(|lQ)r#X%vXi~QT8Jy0A`j= z0ontO(d#WM7JhGnC%Ps2gr@k;g_@)O615PKb2!t*;kBrTs@E&l9_!v9PEA*ILh_to z;`g9}vypTX^ii|=UVy2xQ37Pf%$~SjRDh;4`*JgDQ&*_Cb(+TvZPdZK8|5zq`{!?E z%2awC3_YzIW`=T=4SU_k_4;*;vQA6Nhx!*|Trvj`?#iD8KtckxzY7lAEnW~yHLUwE zM~(17*fz4wle^pufK)&C64!f=$v|ml(6uC*O)%{$0C~eF>#T&bp-h{h!j=#b$FS2! zi_${DZO$q`P(sd!6gNiFd}nP%OdaNnCSUrB*dcAJ4rbrGu`T6rElMt}KIW58<0Ry> z(EZ-5vta<~#z4eWzkogTjLhNS%#oSoa_FJ!M%u?ZxwL n(RHa#*SLeiM)zB@yZHWfaggSDU4tP;FRQce%-z%psP`BROQ) zcd&w{TSRbwxl-J}`(+NBS?<%I=V)jO%cwgu|8m6ln5EH2gV%~%vNz{*y{Xvq8Bdb( zVp^9`@mI2g!`t>c7%u!ilIID~L<{C9xb_@rtzZJ-AWkRme03F=%kuB~YLIFn1e2}+ z)JnuU_}!o-yi)rv(~i6AuW4)!Ct1w?O(CZ(Qu#4HKxwlF%3ZBmuuAJtu9#6q-*dA$ z?3JC7^}(1`x$Wy8Gfd?Pe>FhcDIm@K2-=D|dxk!EsYKld{3i$M&F$c?_eOc0Oh^y> zPo0Y+yY3tL#j;<)Lf=6J*SKMk&otbl9&-*|Le>&O$51b|@atXu-?8e!*~SL~?4pmp zsxD2X@K-41$Ba;r3sf(%&6UM(VXu2{FY(`Y|Kh)|Jw9)D{Y}u)S<_wrQhc>Z6pow7 zYoVl5xAeL`s*|_*EM&g9lQ*}fZhSYJaMFR&AbFi*40)FCP;2L3W)0UCP29mwuv$)r zlN=H%=aP2m2@y7RMvnu}zA*h0pgT3x+}zf_WbIAKp2({i-LssTlESRV!m8n;?c-I$ z3Q`m5bn1E38bIFD(*U{_V%j8-bOy`z(X*WwUh-oGZ+3t*Hp#2f-iuHEKGh!<{%G;* zM%u%t_zhOUyZ^5Pu4I^=edd_s!KVKbeK)*z_iP_SHBh)I=(ID2%@ElLimVI<@kCE$ z3ZQ7g@?(UsOeS O^%CaLnR$fa%E79C z@7&%W3cDbiTyL58W)R3wPGjr3md?Cp#b0$l&R0A{iZ- pc&jBt{*&d)zI=ju&S6DLFnt?c-_##3lr4a+ z91NEgUio|+UHYz7DRDUZE^SaR!0s3ULR2p9Pa1zP7}D+J7GHM`cNfDNRG0lkwQ8qr zeDw$;2!1#WLjARD@snc+tgZvnF3K;!!@Vs0O00?Ht{5zy*Z)H4tRU5|p)q!Jh(>+S zmcmaNPklxd`^zSkod_QNxpEvRz9f!lQ?;m~Vd6zWjJYE=y~gN!S{TQH-fIyA^!S>D z71xTNObXBj-_(C&`6uJf&FgLY5hv@Vb}Sc+FW%o&@xZ$K;nSD5SK-em+WUI =lSs>n>>(jj%qyRBs3o%y=Dh{&;?8YFJ+&y)!Qg!v3wo zEH^L~ti!7HHossfkA%D;_;?w|d~QL&G6<{lz|Y}hn|w?cjKt&pGcu!r-S%7Hic_D@ z!!_cevc6B4!1%j>h-2A*7VSe6j_^0j=`-OI+*&s`u|haNMS(2l=eErx+QwbX1VCQL z(s=ORs@vv~IDgVxvbxyU#g-&&d3~y!10~l0!m7IB!1(vv&|S}!t0gWkt#57Yn_NAd zYn~LQY5BuoE>q9Jvz}BMB<;pG0Ya?P@+mB=O1z#8Dz1$-@0@GN8&coY)h4CEwn9Va zk|f3A$j#k`1lwe|W))S+6xq*Z!J1v;9Rh)^m!ba8L8<+I=%6_&u8FG3ax~fLS}AGe zv4dlM$V8uI3E^J9`0Cdxg#b3rI*Is qIk7s|&Bw =);XvV_SE`aO$racL{a3j8Iq-r^HW5oojyf89wqWcIpv)Zo_zmHb zNR(Yqi{1Mz8iFX~n|97Y1r|b*16lEq(2~UdZ9xe>SJl4ENZqB2hP$R2tB (iz; zgPYGt0Vo0{23shm+l?_#CkTyWn^;efgdv8{hhXU|-&~VRqI`c)^H^Q43B^E4Z(0je zy8UBlbMT~cp0}vxnTDIo;iP1B8of8R30TiaRSQiQ0m2Ub6wjs=T%_o t|HIy zB1ApELW3AxSV0fW`P1h^GA!EIY>RyFyb*ra$s=4Z5`$06PHgx@Xvm#t6WRfibfrp@ z1CWSU^;;Ax>uJ!=oWL?D1^-P{uTK+USD@iaccXd&zJG=GNo59D&?H|A1LS-@_1*Sz zz%e~%6XB&A3ItNltia;T*INYon>UIc%II=DQyx+t^bTj?W$ZdtxgIW$Dx1=@;n5&3 zV;C@TF;VInrx~QK4s)0r6W&Lt1 &e+m^!Pto`mGrz(SCx8j>qjwOPSyO z@UJ}I1+1wKc6|xF%D#%u6rx`AU0jK9ctpaT4Ht)%+_>eCVC&!oY>8CXeT|Kq2<++^ zM%)L;SYo005F!{`k8UhQ@lWu_@D83#(X?SVlO6B{moDxbY}W(o(Yom3aQ Fr#lhNsS1v8Ozp5HPAqcC6q>{Tg zc!iA;A5|&ufE7X$rL&6cq96YB>TSMN;8M*bz4A3*(G+7kvBDANQE1ugqkt=b&Fi?q z25;$h2B6Ij_8=hD`-lpCL_`Zt?YGyjxAwrmvp73&~qH z9d84&fXYVy^~Am$HL_NnK$noL;Q6tp?)z}@K}jTBThfaeXSBD%aR_muTv)@GZ~ &`*4e^l;#L?&$)(!e&=d&KZ_%b z#hAt6>u^&jG8mj_FFpcVwJ+oaf$xJRX44W55-Ab+gf^cbn|MeBcv-VL2ZSaM>c3f& zv__J{>c`{m<_=bVedA2|JwF#*Y`!mPZc^uBW>?zk5{exHcj`kvks-IPZ-Rw *4;+D@b{P2ZM(*+^z@YZM>F`Yrsq-s@O! zP3Yaw5omIo3X%LG?k$_&pYtdXWL1AHxsvt0Fs~svCBOSA*4`C&A>0D=*Wz!W{*@rX zGWsb &tK7NS(u@w~*Z#1tO#`a`21--fa(TzJVN(HY14#x_#Sr)=K5;D7<1^i&sD5PhZW8 z1!uO%uo@m{`ZX2`FW}=^ltJ`Cu|@qQ!IFN&3o}uvQgigd$6A~`&3yCDO(4HHinvsU zq{l-~>yMXU7K(}S0efm#Vh)-j;^yUB0(?BU=t?!eHmvArjmMXPQ7mo#L-x*Qc0xVE zGE<;>G&hIG;T}ER1;%5>3mMZ5_XY(qJ{KIs+w*g2V&_j6c`XREF(BHa=SMXoN4CJ& zzosgrfas?HN;w%nSalQ)lQ28ZgGZwqJRsr4s3{NLu^eBS?~yrMoz^r2c)~I7X66ti zRb`d7`cJ<-0om*8633AgcVm3JTiAzsZNsWy3gZftESoa~RJy-+BmAkXL7TwAz(9lC z&6(pP!iZ18sc2@WEj(?oElj=J{z}AszGk=!RgMj~JMp=6_I!s-#4 &g^Mq{Nw}jq&gA zm`_!ufS1ivc Q0d~L+YCwzjF7qr{_`-$BgP0R3L)vpvN z!MsvLu8jm?e{_rl6sz!ewMohIRYSu%4F*RS4sLRo+Xo;&qI4O4lk*2yO}Ur+hYsQA z!S+){@T&fw;LE*ku#~X z52*7G7)%VX+C_7erNz{VD>e9*E5K;-rHcB#`$=3}9I#8Myn|ProI^CQ?AQpC$rZ-) z*Z3&CW1|u?N_gH3E0z^wPT9geJ6$YJ(!7Rfw%PaYuE}kISIn+_xQ(zbB~NXb*4mFp zv-Z`k`-4$7CEcO4W1U;n;9sem3PhD&^ebhe1SiGwHQnVSOF2Ubl#27Ds9b*Hlv=ou zvVMXG!2QJbU$~P2cPEWlf|pgFe5#Vgy|m6tID{i*Zr~tA6b-A-o=R}{oUO6$m_2{^ zE~l5t@EMg2;wU;_2bA|VWH}Lr&8}mm`|z`Kl8x*b03VVmXQgi(I6Iqa!OBI?N>Y5o zu{A}w=3~cz?N4V~cQU7w+yaJ{R-A>Fwj9C@IyOBqaXfkvvAbs*XwApoa^?)g(xAgE ziB#=1q!~EGB1YfyOZ}n;O}QBg{>^1*>3tWn|FHu81_F4+e_h{e)yBOW5PC1ys(E`W zIkFC*08U6@Ei+r_wP9W8n1;((LgT~^I>j~??G)K`CI^_*V!}Fz4~}K!ZY1eNp9Wh? z7i3YTlHwo&-SXX2Naak9bbHhDPX{qbC%w9f(N&4>$j=-}_HO$fq}_*aU8L{ajB4f& znUa9C!LIEMXFi-1_RJ_9lqQaxXTzga*f-o9!JJI^>Gbf818YCt84%=@lSKiMLjiG^ zK@e)%+|)46pzfA#lD&ms>75AaN)g#pRxo}BV#iG>jZNj2VS=Lq9*yK_!3B=I-%|I* zQGw;^f^`Vv9d8E1i!2mPz&l9d_vImw6t!PmEyLVT{u5;?;UAz O{XJ5`QP~eiQbui;T^H z5-I~WP}J+X7Gz@Y?TN9%s8GiP(WzaL<;Rn=Ew;#W9$YR`%X8Lrie}PSEbflfeHx}L zM ?9%4a4M^p&C_ZE79K=REA;;!uO`}==$c>zMsIdf*7xt}`ssJ%gn>0_E%Op51g zc{wG^rk0tgX_*7dF*?MVhBz;Mm9m+IAFWb(>MVI1>$SI}pPf%qjZj~ C{}0b!p{1$*WXq(J+D3z}SGpYTkVnkol@Qo~>o@fPAq6KB==u zVZqbmB=f|NUB?iFNz3mduj*uvA04xn-~S#iTLd=S2R~>1Y>Sg@%fL-eF!tEJ#gMB9 z4}}Ps^hnhtl&u)o*tp_1h=7YkW;r)NsiOZG6Gwm(V5$g2ZbeBUS=;12*_oJ;p*rtH zCv( U@=V2QUrtMBmPT iQenP6^5NLs z?u|3NPoxofZw*)6wK%7WANKo9&~@TEZm`nQO)SVR?atg;osNt8SXGkk7B&=IU0plT zOIj`pCax{McM!?ru5DQH!)kb|J5}MeD&`qFZv{xrKOYil6u)LC1 $X$Vwk4X?tv|-BL$5FOp4Ez*bXa~V zb?orTWYroJ`Yu`z9n5sHAkn#wOPVUL$Rm4bS+tBMO2bfVl1K3CL}yyCa?K4;U=q`o z2TvNBJ{axCd6AccaBR%1qwFLn+x;${lHRPnnygXhB<^Jt>D|s%wBvY#BxcDVVn08` zf5Y~4yl(j+e>;YxHf3X |d1~NxG-DeWKs*_`}iU8PylRlN}-Kv@S3?v3* zfn&UdU$9O79?ufe+9W3%a ydX=yop a*60PvomvVyil2Z-rzEof95jq9SaE);~#g%S;ykCn{XIzTm8Ehm&)oS>W)o# zRC3>$w3;#lWeK9}g#);TdT9qm!ohn*poBzqAmO!4P;D=+d}BJ8X?j7~TdM 2q8w9ntmI-#Zyw-+bav=Wpezv4EdPuLNz;K_cc)T+iRIFq1AzPv!w5p z9PCyQ=0QRDr6FRjSh03HAy^7*|02Ioj_TthMmOd()ny8_n(=z#;JpH_GwT{XnnZ%G zI%ejnjxn!CoR8+(C9uP+C;{$VXL}L9qs$xc+qwAaib+}gOidB);5dfc_4IVQ!m|qF z>z~((?q9FSy7v7?YI>-2kvdV+X9``GsHx>+dx?4}^6G^*=_2C0mJ7?M1G {WDnk uEX|kC+LP%GXR+YsyDFl(x3GS0;_%DyPojU*tDYM$uD;zTtSf2<}m=EB==FQ499Mf_mzPD)LaCyb9zGi9|d z;SWrud9je=KX@3G!M`=vjVS4dzLoW5B}NNI$r|Jx<`;~RN>5Xs2M)KO1T(9)TAWgs z{%y(Wm-y?;=)-k-BRatLcQxf-TwJ5pc|XWw9@5VO{N&X~IzotwOaam|nxK5+*_~eR zbUxAeJdxESOYZ?c)_k%oxn$^-q?vyfhi$9W28$SL_II^9)Y9Vj;J4q0o!E*OZd_8D z=SPw9hkB)!LWdme@Of@T)+8W2g?1VrM2-oDyEh$`l? 6y0?Gq??rBTT zkG4NxQ+eQ%b+o^ihyx`U0iDz +=gs*WE+9V^$fK(GCgIOswy4XfFdoDNacS zR3&gQ!973}DIW*6GSdOC>{mMkqh$N^?pw4PKy*)jI#$Wa>E#X#A8hChiwG0s_4$Zk zCfYHY?{lFIKlZomc}uHR>KGBBOdB@F*Lh$6>Cl-1%RM>YFTE2n=)8*HED{@|`B4b% z9t%41?DoTUo;aV1De=sK^R;!3R15bRFx|^@lHI#5sg!oj6uD<~tGrKCA*j6Q;OUWQ zDMi^`NFyF*dcQpS{p;6LC0`md8l5Jm>q+D&<1g2QGxD 0p|kXvpydiL3h*4jBlIyJ zXGS|)jNtG>R*SuzVO1~n5vs2rBxp{sc1h>H=pK0-M4YN -OJOMRF6wdwJy zNVrl@XG%-+>Z%i}KM!o(D_z77G|EWNG>f?mRa8jpt)UxPrCGmP(p~?vZZQw<_B{q< zN>aL6LCpeABMkFdGqKn9^TA-hPB;Ke80-p^{`l2)!yqT#R!jHMQ(&2vjK=f27VPg! z=G9V`nHx*u6uTg%;_-FHyR>O$`un#Okq3w=EB&|2k^PJf8Vioc+%Vl 1!O8Z6z?2}4AE4I2ba^(#0F?TX4(?K9&T z^jdZJTz$Kf9Q&`v?a;fICK93d1)tGgN*&n0e8cU+K}25iEsglbk;Xr34c^43uOsnb zGqe26Ju?)6u44kl Z{{A&VQb-G^IQ zUl{Bs-w;B5FX8DEMbsPOvh;%W$j$`PMlkh@f&^Xd*StncixV%dqmlQ%APm!&$vP7t ztn%h6?+4zI@fY`2ukQh@IbLoFj*^Qm*Kzvj8{Tiz?HK}Y5r>v{_jD(wUzmD_QndqF zzx1)9UUfOMR8khkl$085VAb06xXLE8Co}acL(Gd$Yf^4*Q;+D%=tG*}ydg U_c&0Ay_@NuOPcnP#s{!J9jY-}hoUN3 z@4g~kEgHV1wFY*7e_K0~f8lfE1^&3c3YC)Th9A~>8sAx*np*Cav1vtR)4P3qvL`sH zaOX-k2xqmgG{-r2Xy%l6H+o`%UU !u$ISa~?Ws-BtltV(mcqtVx#aUIU)CRkr<8 zN-5ko)mM(|ySyHPoWH!7({4@D1Vtwi1z%ssgnQU&^~p4?GfstBo!O!h#iKJgGhSrb zbj1yZ<@YtbKagG{ZM6Xs_9KeRpGvXK2MOKWt4?Kf_JNtXB7LYF1%l?)93=V40S?sH zMsbCiROG}ts1wy1*@X-r0@^ej1Iu&)2O0I~GrD$Z?d$_9FBFb VNAI zSj7Y9h7o4h-PuEssVNe@pa>E)InyfZKbF%ES>X$KEi%K%qtArP23m0XV8^(iUg@2@ zbYtsW;t$adGzu^>YVDIU6dcW789q@tD?}C1{m?k;8v$h5^M}&2N|o&dFy=6b_3szT zoH_*gS RSSKB7u6# zTDOVnXUg~uDs< pN(n`92W?k(yX#8NlB3xt}1#ksaew`1MCDKLRaQD2)%+)$_D>NvI%?B!WmJ# ziibUU*W7qn)*2Ahb$53M$NBryc3!fB3z{C+vYxHBZ&LEG0gRC_&metkUQhL+^r@9O z*AvVn<#Oz_^4aw1-s`X@52ibGJH{Ddfj%d|tG`SwEEG+q<{oK`v($k-dH%7t>m%S* zRi*L5lz4qKI3*VKvG)#}iqOR5B)YWp5~vBNG@b=jJSk!obAI22FI&?7S?qN>Y9u4S zF^|7V2N>wqW~>BpkyW9S?X%*p{2`<3uTj@tR>ZS5RBRkHAz+qK@Jsyq<#*@(X;^dW z7qM+7sH)ZGcS9K2je;T7g8R+vHImLVp|PoX{g3AFaRne=Qpql))(v4xOiAuF+2Tug zYDg&D_f^*ubO}K|_6dGBjEr6nDX<~$*l`Wu`-b}8tHxWo@^{yoo6kCzYD&}%nVf@p zE*e3d<`U6y{PKc9|G|S)tv~+gyPnj1_^^-MK)h)C9sUbqVk!j%1&TIom$J*U)f3-h zdM8;<%&vJ4l*n$JGqFf7^-sCt?J^-=94J*DUh~;9YU^A3;=PmW^>6)q6QGB)>ep?3 z^I=)Ph`r?xm>siE2{s)#e$?gZwVM}?2K`aZ%YSZ;hli(pe%`Kz>*}>pXD6rHM@K_U z&MZseSWldo6}9f*;H805U9%=o$Fo3Q4q;|yrZ3LCoR*eW&ItSmr~VtnCNT!2V8zNn ze;XQ6q$T#_+=J znC!%LlU}370%j!QMDwR~P<}pWm?j3+@o0dDQGV?(%xwon;m c3etv#uKE;hTd3ky9t E`1=4sQ4| zwJp&tR{0LRzTwBX*qv_?K)c@IU-R*`zcK=zjeC%W^8Qr+1idg4Gh9I_B;Q=8?IS?_ z18UsPUV$)-`K;Kbqny{T_hdw$l&CVM^6Wm9BhfQJg@}ocrY+K2p?=z6MxzBr&XaBP z;b{i9H!SaHYO=C+U9=Y4JJlG_z*TS8WIl_dS)b`H!*v$H6P)`#?8we7(GK?z1(XeR zj?YL06iLB`yfPTD$+id!w2ntEYuCV$O^9*;0qr!T=s|At_xWIR8C$$5oXWGoqtE;@ z?%;YA6HIip X4R}_EwK6^qHBl*_VIZuf445 zAib8B7Te5NebmLen46j-8b=viIs0?aj+EE;oYK<1Go&HMuJ7ntB4*LZ3~$ZQwo|QS zW)i|G*5}fTwD&MeKEmGYdKA`X!apPavW5!=I{_Knp8FmlaFL9ufN?2Tqe7tG6Ay@6 z(ZRv=J`w0CGjCoGI##K(`5J21Z4rnv2fIs>l4z(@%8tk#Yx`uAVb9ZQp GsOeweXJvQ9%3bJcK1aH~(kHpSi(nvP~kM1d| zSmGa#EgxXWo(1d?L#14a&F>sM>s>MA4g9c&>L|1m2JEU}imJg^fq=XX !>RR z$5VES3ks@-+ln?fH=k}-4R-Et43KV8eI-_3=~lEZ0)u%#Y|>yNBup>yK4Z*SqFakD z1}u7LZ#Iv+RJMRBwx3@+Pi{F^DC`47iF#)x-mz6%c-GRq0%X1F`tW^yube^1w9Z=O zCl7UA7}NU3n1ZaE%kTwzDNZMtxKp2V!DD^0XU>BdpCu{{FbBCgQz9_KPvL?F0t_F_ zU*TxRqG?~&2zaayvLU$R9D<#va *~xjC$jX)$`3M$R)14S*}oEc`$mwz z?`nK|k@;w2T#qFnMJNe4qAqn)m@)>J3td6#pHmi;BYJDe+VdtvW#-nu$~qwO$`Xu% zQ6bjODBQ#8aM{s #2u}@?dP=;;i _k!fFCY7DR+P8>W z(g*O{DI=3hXU+RS$zpuqL@x;1eI`y>$nwUq*}EQz5rZ$^kXbb?(Gzi@@KC}6{o>t# zX<~j^Ojg#w9~G%=ke_(Z*||vd&j6NnM {TF=~e>b81KYb&eJ8v#a_u2Ehb zcE!lwG17$7JP@aWFSXrOJ|gbRwC<-j)BY#9*!S}XL71Twvo$qL^+lA?!$_pLE_J2D zjd~hQdwm0gggXl)FlF-spxO&h>?K#YH^ssSAbRW@0buDGU6T0uh<<<9NL%ccfrF&d z9fo2nOmJA+BP>`ICl1uf?1FJMOmA35TBRY?EQY?mzLqzXul=cgY7o(jB)BTDIEDfT z7=2@zh+Ln;qQiK#-0&ze5p65ZhvJ!au742H|6+^L8Q&ip!t5kK;;HfV_I_krlFHWMm3SanEtvV!~re*=hFlt3O zCCT^(ytA;O6KDeGk9&?Y$IneX0iTB2Ar4ZS!I6;yz~j_@aJlq6R?(RE@j-hTu-DAf z2TFwo26lAZgU@u8d=u3uH uF7iwB6@mN472KYheS(5qqvma&R+LtI%#@lhBY@X z{D9bsC6#-Fqn}!gXw3rvjZil)U#)+6y9oDkyu8@ICeN(yjdhy)K@nd^APspx7N*+s z>6#q;8b;=~CMON4SG?h&)~P`PuX9_s_@jZ?tffEt{Okc(Bn@QY-KH-iXQz(w3kZaB zzG~ppyxnYB;rvaBTWKjfl}glz$3rc0qIZ4WJ*s`JqzQS$=JOQemNZj#l;I3e8~wEg zN3!N|f2OWoH1dxtp6G4cK$%c`XwNXh&TB)P`BEzRq>t+Curg1AMEHnFWU^oV12Isx z- sNmIvwP`_I-(>=MtPC~^g2tH{!zu}v3E{@qGweG2&LaV@7~pRUIT63hr6>D zjb~tBP%_I&U%%KZX0*J1ktGK2J}PO4zO62;@oU)w%-}%Hha@oPj%NE*RLHb1h!w5@ z%D?CZW+=yf`{wzhT9!v(o|PpNdPTbn#``MGzx()14@FLeiwlp+F8#P|SJJj)3*rYf z6?AfqpVCZJ2~1msJ2 )t1JjjD0E0&ionSa1NWn8@I zg&A@GE*clRG>NMlX8g(0-d=l?>(%&?5*A zPjLb`^eEon*2G7QO-K-|lZnyQ)t%}FYhWH7Q9i`^OOkrYB 6sfu_@IqSNSQx7aNVp*Gy;GdJpp32U Auh)rXn*93UszsErzs|9o)VDKFur`CCCx>ED(-+og4lqw9yYFmqpFLMmz>%cj=$J z!k(d#V|h(bo!Stf*Hf0+Sp2@pZ45Jw0dAFG;U3s!H|R1&A3182!E#=N($-C(qD*U$ zA7X`=lzz4CXCXicb&I{(ETKt!kcLvn3xl
0ub;3$xtzj+4m%fge;8k9 zK(hPwVaREsJP4BWt#%m(*`%OXyeNaY7g`_`47F-eh@#mFm|Tnhq=vn$3^s@$0CO>j z7i@l*PIf)#Kkr p$ZU7kT0y<}<_7_Wd`(?lT`}dJ zuyKZLOuWwy*yU2FtQPc-ur3WzZde2}@M^ZT+CJS}If~Lau-lrnQtCMQKYP2}ZlTi1 zQ5PXt#1F3@-F*Gvx}}=@WLeVJYjo|$V6gG6#ZBqJUpvU4{~m%tlLLAYf%Ire*XNW7 zVFt;S!eLjSIt#%BfEM^LOFf={V~(25{VNE4DboGsltRZUz~0D#syxcZE>*i9Hx=5$ zN3GlQzECRNV3*TM08`!~7OK4f19VFIpV`7ddQh!XvDT6u9;*bl^qA|!7dcL9{v6HJ zk+q@rZ*1hxY$QV+u=(Ym%-@js)b@e}sb$BdUFwhuVsM3^NMN(}?oIS$h=mGj9fX34 z{zahvNreVFBS3WTaUBI*(JJA5x%^F?705Cm1fY4|u}98ZjR*8P_ae6m{z5cPv5~{~ zxL_f;AlJlu+XcW{q+9?&%CGj{Q!#C6z$+2LcdwwjPznz0DR3>+ZZ&L9EU*Q7{?}Ac zA|w{UPY)dL2p *N`aFx^JqM1pg^!|F27G^ipa-Gb zx$_v1q>q4U{8!t4 R7+ype>w( yuL&@#g{?zeDRx{wdN0=c zK6-7NS3uB7fjTH4bc&OnWgQ9CTu6k}M+$u|l)?kEciRP%nMD*q_ X*jBENcEP6 zhM7)0uC47pKqAmiwdf{D>8uTs2`I9~{{km6flNvO*K2D(0N4NcVfy>^kRk>1^Pf72 zNU5{tN`3b(hrh|v#%3Eb>)4b)VEdoQOkM%}#S$T*5fPo?qwfm}w#^8cgeU*oq5vk# zul6@RQ2}klw+PP56YiWJTBUr#bG)Ad(ilJ_OL-4N5D5Z6N=vF(h{K1*Dk-a|0Ah!Z zj*e|h`8a0fDP>LkZX#@&H1wJ4NN58%=y_-;kfrxUMGy#qwk1nI@!S8BCCXpG7f%@U z^j~eKr&+=dU^D q4v zpFHS12svz9LT_a^Qvap%+s=CWW#5p;6G%!xe&yJKdezg@`&}SOAqnf1|7#NQNIU{` zJ~5FUbRGm`wsk&%yvjxyieH!x4qhRGdHVF}D!3p%9zuMmZM`j?OoCG`fHsc*YCAoD zuNnipjv) J2qC)?4jw_Mhy^ zM>+s)tE->wlc}hvw#gs}>Aa>) hmGhZ#W#FcRarT>9)ZKG8+H?IQWVV?V|x6 zi%CEV;qYv0R}f&{hJ(=h{(a;H%cg{DqTalHiv@y~lLOhWplt~n93+tbZ3#doJLC!w za|4j7c3k5#GeGEhd3f@E7kbFq{r@5KvLLAhgdSS?!%%SY_r72@rs10=)|Lj_sN|M8 zEfM12 q$3%p9TylgxZAKc8kBJVK3~z%z+wpk6YkX#>RjK;S~_rHga&}q|U#* z$}b$=`0-W-;BWyz;PBBffX2rt&)mXcVA`ntE<+S{PK#g=Sq3un?c1&2J5R0>t1$YP z75i^%4w`m|E&>>I65=4Q0J;gapQf+}I1y;e$MGx {*LgwmP0^}34 zE!!Vh$_AUB1VBm!plWIY$NKOVG7F4A&`L_$fuJQOe)@fKp<1=?;8%)tfYAfG8KqH5 zB|jW~w|-q15;j3V3 -E5m_K)IvwZ%YQU zBIU&)KX&WwE*k^I^5HP}QggoDEJ4hs>+I$}JtbOJsr%r-AU!>6AOfImSy4EB#D5sr zeR~0yHY1nLYMImYy&6jGu0`;(XH=kz(a|Tj$riB1oVSGWuQ_!c4ht5k0f(kp)h(De z#y;5gXkGhF+x&Ms wpMpkt z(| +!p=j;k0zsP)YYGJ>`mrIylmHz1Fu0gksv{{aKw^FR)dO2Ve$6v?`&TEIblkSBQA z?f+8ie+|n-I^@NJBhIYqLPmE}o|xiIalxgI1XzM22o3=2${!3Yc;}D3s$EPLP4UtI z5JAaa{_pTA=-z*T^6>x5XYSj}M|=r{w|!I)Ij#a`8Kla9!A5aEDIM4nF!C~-ylLV6 zJ}F>DiSG= hledk$< _CU`c8bO7jzLd3Ns&;4FC#A zCzMz&wuS5o(6%7Mz_CT+|L2=nW|hd>akZD&zXiQWyzaZL7qz_E1(a$1Jv{ag@ZVg2 zfxz~KjC=u!kg2v@;19v)2EP1`qa+YmZloX-xCis&j|LpqKv)1;ks!2%BszhW#;Fp% z4Gh59mYXOJrgT7f*M}n?KM2Zy2KozXkvvduBAKDD!20gPL(owZW!hP24W?TqLSUN- z+2paDPZ^}4&c8(qtBwE5t^gUPXwWw(P&5xR0O1gnfwrZRFr-P$ri1rOp9YXu=s*YR z!udf5pv1@TvqY}Ltou@?_WuHb&3GlH02$0txobX{BajB#24@MY^%h{-{@bZr%0}q{ zlMcB~iQZ9qzZGk%6U20F%?9k8Q2WPTKPE9{k~eCFx+bbpTGRxT2K+vO6@U}_KY{r! zsCC#}i_i$s{B%jAQJ6VDIFMVx^4TZg6>7tHw|O|<6G#P=5&2!`{0gi>2fP8pnnFX` zqyzTQ{63 sb*Q+pZrtlCT-%`2G3+SSFCKDnMKZPQH#Emn-1W2TB4;>TkpJ6|Afc1=D{y zh?2dl{zIzsfZG$;Xe_Apx!)&+1PsXfzvdANPJEyw4W$WPChBV4O5AZALgCQTEX?%L z^SD65%7COf-Z2{yCw;LL93H34et1Mi^@NYiOzQcjb}6TjkdM*{J~9!h `Mxe+llP$}!;MEb-*jUSs3_N}@g&2-J_8%lJV)Y@h=axcz)k z3`jH}CU^-X8l?X~%-FL=*y}uq*cM4A*9T{eh@81O$X~NI$VP4}^f#R$4uz-}zO5QT zO^tX!l#ZQ%rvPwX2b`#nt`{!g8W1AHRofLDxfq6>K8| B5wGd)7%bTy> 2KoFTD`!j(l7;!T0 zT^JEfneW--sXMwEHvtC{Q=sBk+yr JgE nJb5O3(d{?I!BpSxpZB=T|T*XMzb7`^>rE0 zv&j%24!!Mv!c%yc3fF+1jP_yP9s>8txyrIwSum3&4%hj}P1rl}Rb~FN^$0 ap TR^auqs z$rdvY5dskvBdf#&F=#F9j*5Cw2?E`oZ$zlu>9v