diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 77548d3..0000000 --- a/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -__pycache__ -/ptb_website/settings.py -/static diff --git a/website/static/website/code.css b/code.css similarity index 100% rename from website/static/website/code.css rename to code.css diff --git a/website/static/website/dark.css b/dark.css similarity index 100% rename from website/static/website/dark.css rename to dark.css diff --git a/example.py b/example.py new file mode 100644 index 0000000..cc43b5e --- /dev/null +++ b/example.py @@ -0,0 +1,13 @@ +from telegram import Update +from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes + + +async def hello(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + await update.message.reply_text(f'Hello {update.effective_user.first_name}') + + +app = ApplicationBuilder().token("YOUR TOKEN HERE").build() + +app.add_handler(CommandHandler("hello", hello)) + +app.run_polling() diff --git a/website/static/website/favicons.zip b/favicons.zip similarity index 100% rename from website/static/website/favicons.zip rename to favicons.zip diff --git a/website/static/website/favicons/android-chrome-144x144.png b/favicons/android-chrome-144x144.png similarity index 100% rename from website/static/website/favicons/android-chrome-144x144.png rename to favicons/android-chrome-144x144.png diff --git a/website/static/website/favicons/android-chrome-192x192.png b/favicons/android-chrome-192x192.png similarity index 100% rename from website/static/website/favicons/android-chrome-192x192.png rename to favicons/android-chrome-192x192.png diff --git a/website/static/website/favicons/android-chrome-36x36.png b/favicons/android-chrome-36x36.png similarity index 100% rename from website/static/website/favicons/android-chrome-36x36.png rename to favicons/android-chrome-36x36.png diff --git a/website/static/website/favicons/android-chrome-48x48.png b/favicons/android-chrome-48x48.png similarity index 100% rename from website/static/website/favicons/android-chrome-48x48.png rename to favicons/android-chrome-48x48.png diff --git a/website/static/website/favicons/android-chrome-72x72.png b/favicons/android-chrome-72x72.png similarity index 100% rename from website/static/website/favicons/android-chrome-72x72.png rename to favicons/android-chrome-72x72.png diff --git a/website/static/website/favicons/android-chrome-96x96.png b/favicons/android-chrome-96x96.png similarity index 100% rename from website/static/website/favicons/android-chrome-96x96.png rename to favicons/android-chrome-96x96.png diff --git a/website/static/website/favicons/apple-touch-icon-114x114.png b/favicons/apple-touch-icon-114x114.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-114x114.png rename to favicons/apple-touch-icon-114x114.png diff --git a/website/static/website/favicons/apple-touch-icon-120x120.png b/favicons/apple-touch-icon-120x120.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-120x120.png rename to favicons/apple-touch-icon-120x120.png diff --git a/website/static/website/favicons/apple-touch-icon-144x144.png b/favicons/apple-touch-icon-144x144.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-144x144.png rename to favicons/apple-touch-icon-144x144.png diff --git a/website/static/website/favicons/apple-touch-icon-152x152.png b/favicons/apple-touch-icon-152x152.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-152x152.png rename to favicons/apple-touch-icon-152x152.png diff --git a/website/static/website/favicons/apple-touch-icon-180x180.png b/favicons/apple-touch-icon-180x180.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-180x180.png rename to favicons/apple-touch-icon-180x180.png diff --git a/website/static/website/favicons/apple-touch-icon-57x57.png b/favicons/apple-touch-icon-57x57.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-57x57.png rename to favicons/apple-touch-icon-57x57.png diff --git a/website/static/website/favicons/apple-touch-icon-60x60.png b/favicons/apple-touch-icon-60x60.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-60x60.png rename to favicons/apple-touch-icon-60x60.png diff --git a/website/static/website/favicons/apple-touch-icon-72x72.png b/favicons/apple-touch-icon-72x72.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-72x72.png rename to favicons/apple-touch-icon-72x72.png diff --git a/website/static/website/favicons/apple-touch-icon-76x76.png b/favicons/apple-touch-icon-76x76.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-76x76.png rename to favicons/apple-touch-icon-76x76.png diff --git a/website/static/website/favicons/apple-touch-icon-precomposed.png b/favicons/apple-touch-icon-precomposed.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon-precomposed.png rename to favicons/apple-touch-icon-precomposed.png diff --git a/website/static/website/favicons/apple-touch-icon.png b/favicons/apple-touch-icon.png similarity index 100% rename from website/static/website/favicons/apple-touch-icon.png rename to favicons/apple-touch-icon.png diff --git a/website/static/website/favicons/browserconfig.xml b/favicons/browserconfig.xml similarity index 97% rename from website/static/website/favicons/browserconfig.xml rename to favicons/browserconfig.xml index 6cb53da..bebc6e8 100644 --- a/website/static/website/favicons/browserconfig.xml +++ b/favicons/browserconfig.xml @@ -1,12 +1,12 @@ - - - - - - - - - #2b5797 - - - + + + + + + + + + #2b5797 + + + diff --git a/website/static/website/favicons/favicon-16x16.png b/favicons/favicon-16x16.png similarity index 100% rename from website/static/website/favicons/favicon-16x16.png rename to favicons/favicon-16x16.png diff --git a/website/static/website/favicons/favicon-32x32.png b/favicons/favicon-32x32.png similarity index 100% rename from website/static/website/favicons/favicon-32x32.png rename to favicons/favicon-32x32.png diff --git a/website/static/website/favicons/favicon-96x96.png b/favicons/favicon-96x96.png similarity index 100% rename from website/static/website/favicons/favicon-96x96.png rename to favicons/favicon-96x96.png diff --git a/website/static/website/favicons/favicon.ico b/favicons/favicon.ico similarity index 100% rename from website/static/website/favicons/favicon.ico rename to favicons/favicon.ico diff --git a/website/static/website/favicons/manifest.json b/favicons/manifest.json similarity index 54% rename from website/static/website/favicons/manifest.json rename to favicons/manifest.json index 66ed1e7..22d9d4f 100644 --- a/website/static/website/favicons/manifest.json +++ b/favicons/manifest.json @@ -1,38 +1,40 @@ { "name": "python-telegram-bot", + "start_url": "../index.html", + "display":"fullscreen", "icons": [ { - "src": "\/static\/website\/favicons\/android-chrome-36x36.png", + "src": "\/favicons\/android-chrome-36x36.png", "sizes": "36x36", "type": "image\/png", "density": 0.75 }, { - "src": "\/static\/website\/favicons\/android-chrome-48x48.png", + "src": "\/favicons\/android-chrome-48x48.png", "sizes": "48x48", "type": "image\/png", "density": 1 }, { - "src": "\/static\/website\/favicons\/android-chrome-72x72.png", + "src": "\/favicons\/android-chrome-72x72.png", "sizes": "72x72", "type": "image\/png", "density": 1.5 }, { - "src": "\/static\/website\/favicons\/android-chrome-96x96.png", + "src": "\/favicons\/android-chrome-96x96.png", "sizes": "96x96", "type": "image\/png", "density": 2 }, { - "src": "\/static\/website\/favicons\/android-chrome-144x144.png", + "src": "\/favicons\/android-chrome-144x144.png", "sizes": "144x144", "type": "image\/png", "density": 3 }, { - "src": "\/static\/website\/favicons\/android-chrome-192x192.png", + "src": "\/favicons\/android-chrome-192x192.png", "sizes": "192x192", "type": "image\/png", "density": 4 diff --git a/website/static/website/favicons/mstile-144x144.png b/favicons/mstile-144x144.png similarity index 100% rename from website/static/website/favicons/mstile-144x144.png rename to favicons/mstile-144x144.png diff --git a/website/static/website/favicons/mstile-150x150.png b/favicons/mstile-150x150.png similarity index 100% rename from website/static/website/favicons/mstile-150x150.png rename to favicons/mstile-150x150.png diff --git a/website/static/website/favicons/mstile-310x150.png b/favicons/mstile-310x150.png similarity index 100% rename from website/static/website/favicons/mstile-310x150.png rename to favicons/mstile-310x150.png diff --git a/website/static/website/favicons/mstile-310x310.png b/favicons/mstile-310x310.png similarity index 100% rename from website/static/website/favicons/mstile-310x310.png rename to favicons/mstile-310x310.png diff --git a/website/static/website/favicons/mstile-70x70.png b/favicons/mstile-70x70.png similarity index 100% rename from website/static/website/favicons/mstile-70x70.png rename to favicons/mstile-70x70.png diff --git a/website/static/website/favicons/safari-pinned-tab.svg b/favicons/safari-pinned-tab.svg similarity index 100% rename from website/static/website/favicons/safari-pinned-tab.svg rename to favicons/safari-pinned-tab.svg diff --git a/httplogger.py b/httplogger.py deleted file mode 100644 index 8ff457a..0000000 --- a/httplogger.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -import logging -import sys - -import cherrypy -from cherrypy import _cplogging, _cperror -from django.http import HttpResponseServerError - -class HTTPLogger(_cplogging.LogManager): - def __init__(self, app): - _cplogging.LogManager.__init__(self, id(self), cherrypy.log.logger_root) - self.app = app - - def __call__(self, environ, start_response): - """ - Called as part of the WSGI stack to log the incoming request - and its response using the common log format. If an error bubbles up - to this middleware, we log it as such. - """ - try: - response = self.app(environ, start_response) - self.access(environ, response) - return response - except: - self.error(traceback=True) - return HttpResponseServerError(_cperror.format_exc()) - - def access(self, environ, response): - """ - Special method that logs a request following the common - log format. This is mostly taken from CherryPy and adapted - to the WSGI's style of passing information. - """ - - if 'status_code' not in dir(response): - return - - atoms = {'h': environ.get('REMOTE_ADDR', ''), - 'l': '-', - 'u': "-", - 't': self.time(), - 'r': "%s %s %s" % (environ['REQUEST_METHOD'], environ['REQUEST_URI'], environ['SERVER_PROTOCOL']), - 's': response.status_code, - 'b': str(len(response.content)), - 'f': environ.get('HTTP_REFERER', ''), - 'a': environ.get('HTTP_USER_AGENT', '') - } - for k, v in atoms.items(): - if not isinstance(v, str): - v = str(v) - # Fortunately, repr(str) escapes unprintable chars, \n, \t, etc - # and backslash for us. All we have to do is strip the quotes. - v = repr(v)[1:-1] - # Escape double-quote. - atoms[k] = v.replace('"', '\\"') - - try: - self.access_log.log(logging.INFO, self.access_log_format.format(**atoms)) - except: - self.error(traceback=True) diff --git a/index.html b/index.html new file mode 100644 index 0000000..b395dd1 --- /dev/null +++ b/index.html @@ -0,0 +1,127 @@ + + + + + python-telegram-bot + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

python-telegram-bot

+

We have made you a wrapper you can't refuse

+
+ +
+ +

+ Star + Fork +

+
+ +
+

+

It's fun

+ +
+
+
+
+
+from telegram import Update
+from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
+
+
+async def hello(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
+    await update.message.reply_text(f'Hello {update.effective_user.first_name}')
+
+
+app = ApplicationBuilder().token("YOUR TOKEN HERE").build()
+
+app.add_handler(CommandHandler("hello", hello))
+
+app.run_polling()
+
+
+
+

Easy to setup

+
+
+
+
+
$ pip install python-telegram-bot 
+$ python bot.py
+
+
+

And it is free

+

python-telegram-bot is distributed under a + LGPLv3 license. +

+ +
+ +
+ +
+ +
+ + + + + diff --git a/website/static/website/jetbrains.png b/jetbrains.png similarity index 100% rename from website/static/website/jetbrains.png rename to jetbrains.png diff --git a/manage.py b/manage.py deleted file mode 100755 index de1cd62..0000000 --- a/manage.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ptb_website.settings") - - from django.core.management import execute_from_command_line - - execute_from_command_line(sys.argv) diff --git a/ptb_website/__init__.py b/ptb_website/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ptb_website/urls.py b/ptb_website/urls.py deleted file mode 100644 index 5513f0c..0000000 --- a/ptb_website/urls.py +++ /dev/null @@ -1,23 +0,0 @@ -"""ptb_website URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.8/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Add an import: from blog import urls as blog_urls - 2. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) -""" -from django.conf.urls import include, url -from django.contrib import admin - - -urlpatterns = [ - url(r'^admin/', admin.site.urls), - url(r'^', include('website.urls')) -] diff --git a/ptb_website/wsgi.py b/ptb_website/wsgi.py deleted file mode 100644 index 4073a3e..0000000 --- a/ptb_website/wsgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for ptb_website project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ptb_website.settings") - -application = get_wsgi_application() diff --git a/website/static/website/pycharm.png b/pycharm.png similarity index 100% rename from website/static/website/pycharm.png rename to pycharm.png diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 83e62ae..0000000 --- a/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -django>=2 -cherrypy -paste -git+https://github.com/natevw/django-sameas.git@master#egg=django-sameas -Pygments diff --git a/website/static/website/reset.css b/reset.css similarity index 100% rename from website/static/website/reset.css rename to reset.css diff --git a/sponsors.html b/sponsors.html new file mode 100644 index 0000000..9796e6d --- /dev/null +++ b/sponsors.html @@ -0,0 +1,97 @@ + + + + + python-telegram-bot - Sponsors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

python-telegram-bot

+

We have made you a wrapper you can't refuse

+
+ +
+ +

+ Star + Fork +

+
+
+
+

Sponsors

+ +

JetBrains

+ +
+ JetBrains supports this project by providing PyCharm Professional licenses to the core developers under their support program for Open Source projects. +
+ + +
+ +
+ +
+ +
+ + + + + + + diff --git a/start.py b/start.py deleted file mode 100644 index f3375ba..0000000 --- a/start.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -import os -import logging - -os.environ["DJANGO_SETTINGS_MODULE"] = "ptb_website.settings" - -import cherrypy -import django -django.setup() - -from django.conf import settings -from django.core.handlers.wsgi import WSGIHandler -from paste.translogger import TransLogger - -PATH = os.path.abspath(os.path.dirname(__file__)) - -logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', - level=logging.INFO) - - -class WebsiteApplication(object): - HOST = "127.0.0.1" - PORT = 8001 - - def mount_static(self, url, root): - """ - :param url: Relative url - :param root: Path to static files root - """ - config = { - 'tools.staticdir.on': True, - 'tools.staticdir.dir': root, - 'tools.expires.on': True, - 'tools.expires.secs': 86400 - } - cherrypy.tree.mount(None, url, {'/': config}) - - def run(self): - cherrypy.config.update({ - 'environment': 'production', - 'server.socket_host': self.HOST, - 'server.socket_port': self.PORT, - 'engine.autoreload_on': False, - 'log.error_file': 'site.log', - 'log.screen': True - }) - self.mount_static(settings.STATIC_URL, settings.STATIC_ROOT) - self.mount_static('/.well-known', os.path.join(PATH, '.well-known')) - - cherrypy.log("Loading and serving Django application on /") - cherrypy.tree.graft(TransLogger(WSGIHandler()), '/') - cherrypy.engine.start() - cherrypy.log("Your app is running at http://%s:%s" % (self.HOST, self.PORT)) - - cherrypy.engine.block() - - -if __name__ == "__main__": - WebsiteApplication().run() diff --git a/static/testfiles/game.gif b/static/testfiles/game.gif new file mode 100644 index 0000000..50fca0a Binary files /dev/null and b/static/testfiles/game.gif differ diff --git a/static/testfiles/game.png b/static/testfiles/game.png new file mode 100644 index 0000000..cf0dd30 Binary files /dev/null and b/static/testfiles/game.png differ diff --git a/static/testfiles/telegram.gif b/static/testfiles/telegram.gif new file mode 100644 index 0000000..ec3d51e Binary files /dev/null and b/static/testfiles/telegram.gif differ diff --git a/static/testfiles/telegram.jpg b/static/testfiles/telegram.jpg new file mode 100644 index 0000000..0e42a29 Binary files /dev/null and b/static/testfiles/telegram.jpg differ diff --git a/static/testfiles/telegram.jpg.bak b/static/testfiles/telegram.jpg.bak new file mode 100644 index 0000000..5fd11c8 Binary files /dev/null and b/static/testfiles/telegram.jpg.bak differ diff --git a/static/testfiles/telegram.mp3 b/static/testfiles/telegram.mp3 new file mode 100644 index 0000000..4b158d2 Binary files /dev/null and b/static/testfiles/telegram.mp3 differ diff --git a/static/testfiles/telegram.mp4 b/static/testfiles/telegram.mp4 new file mode 100644 index 0000000..ef1fc0c Binary files /dev/null and b/static/testfiles/telegram.mp4 differ diff --git a/static/testfiles/telegram.png b/static/testfiles/telegram.png new file mode 100644 index 0000000..ec89bdf Binary files /dev/null and b/static/testfiles/telegram.png differ diff --git a/static/testfiles/telegram.webp b/static/testfiles/telegram.webp new file mode 100644 index 0000000..7c5cbfa --- /dev/null +++ b/static/testfiles/telegram.webp @@ -0,0 +1,470 @@ + +RIFFVWEBPVP8X +ALPH"%'$HxkDUNGq' 8*P;-N5h%C]CݍZԑzk=3˂mnJ՟AdȰYLF Q\Fݹ|M֮ZQ1^Ϊcu 48{ؘ wqvuWÁ + V$ WQ<6xuޓ[4&a2Hډ +u|XӢSqWY!|asIA|Xc1O\[@܉ #ujҨ + t +`/ Fb]`\g[(>qxMDϔ ]kgkȊ4ϱzoz$̍v9g+>4Qx + +o&'G&ρ @tBxV8X4yXgS8` + +$rWcjIpg`_Vc db{<#8dmѿdX}d{u8Nh^ +` a3zy/=u'ȋ#ENP)H * + Q< @^LZčcg +-VM+brE@cy.)Cw5ÐjQ|w8-CC^8<T1VMÝ sHYy y [Z$=ai¹ZQ̐jQrbWb֖R~ny +bAGAJ+rK3 >tk]CwsA<ߏ|'K'`nuZw?Ȉ|Ny + +BRȩ֨/ʴey+NwյdĶ\CU962ܑbul1?j*n c)M + !wIL_8vRh +@)SԞ9Sr#攩^)T6NpEI~DŽJvÑ>vz_^S$J]n+D뙀;) ,AB*UH_vJ}R?ce+. ++^LUR@Bӷ*$2MQ +ݾ + 1'>#wvMƁ8_)_QO^$IR*dEkI0jo +.^cF_cRqH.*t(^rqQ*_oÒѽ{xS$,,#5:|*yXf<%t&854Y5J/\+HMxEc#LVIw + +ʻWjp[ůw&$rdÌ[-F,k!goaOyrjYԸJkC4ZQ2$Ò|=MZ[bCRJboT8z +j1 + DBO(S )!m6H +-_1@RXw +b:D@sB3Ks'%D)FxFi$ KD?MuBӵͯ7fi1%D)BGzta4<wXV%s7z + +F }>RBy"1 Bkp6ѪZD3,&<y +;bN%!n-Ә 0D6ky(Ղ2?fR0!lB[j^x(٪KՁMC|Wz昃A3NCP L+#B/*:_Jtm[68= + +h>Z t6`[x>۽`Llt£+5G&^tqπx}uB/P"l+/LmPS3xN`? +o+yV`WP}~JhE=r16!DUKWAzk0>;|j,7و3Y + +cw+\k5t:j.B{bPnKV/X3333Nkxp +'vu7CaR)&#"\@bmuY!Ap0Q)t Kpm6q(wSאMFlJ|\`A̍< !B + + ^$抅ςxU},P`d22=EӞ+1`N{]i%=qQ#FNvc@`,5U _qAa52nbEv̀y'~8Ӧ#*` + N INoiylBOrLN@B ++T "1tmD͉W1أLDB`:lZ E FJ} +-~jNJ%xyQEaZe!50ǃg٦ +.ϔQWPDŽz"( +Ǣ}!IA(zD( 015Â【 L^FJ#<p,n1FB5-W 9S6FԇQ,fAr@bqĚ01YU/c\EET셾6ˁ_Hkr@Sg!m7.@L] FH|m&,efKBh.]"(~އY*d۫U݂2۪\QX+u GQ2آF@`F]#܏S + 0~3ʉ c~tA-f<Qk4Բn^FAAtk'HM +D-ccR# F]}}}w/J#(khѷK<K+VN*TB:QʅH\&̇A>SD WgT(j2:gm"u+UFdF#?&HwCnocRWrl¢( + "6dƉzN 4IWڇEc +l/YLgŭ9sJ;j5'#s/YjGZmظm ֺpրsk +68/A4T+%Uo,X/\ Acڤ{?#H*'/.I + +7$}IR>UIgIi3|6)骞qI5upbȉVccI + ++fi1@r*AZIǨ(Y+XX`N;U: rjΝnIA!&uRq'i:HSۇۻ:H3I;u"餁&LWdhaANX*:q,lX<ehAA6YmfC *5}؏rKZb{W8[I_<MvKEuHMXnj~q0#oڰvՂڗDCHk"AVJUsRR=6ohX8GBzd5k_"vtJS6+ۇ + o%t_?zo<u ++/k€NzWJY=F0]#in-p >Pw4>$AjxwHn[Trroε^; hᥓRVy/J>mW{.["rNy9x(.Аm#Yyӆ~aRm@:R8Μ;Qv8N'e65W}F{"vOvNO(@)zu) 6lڲu۶6oZxB -E5C{UvnjNC_[ +e*'Pʑ~xBi߇LkaX+Ǘ Ks&);55=~@8p&{BaU$d(^?睉.&ߛIyjf$nJ_L;dO<8z`P0[k}߀.(owZF j= + oո.Z6u)WX:j^>ej쒝K +jzveQ!w%f? +z [/ gx&D$f>1e4h&%p;:v3ehinLL Yj׶;i6zGcѼ@Gsk7fvKD,lk=M/>]REٞ_f +W<@oz;G :Gy5,/td nʹ27 p^LfDYvZ,kAM'vl]NB~sB.gAE)]z[@3Im=qN`son=|F A3nj 9Jŧ [a_ˀ9iL}yeT~:qq +:%>^iR^,q\~[YmBCTK܃vWrh$ztVYPMcBJ>OxPv8͹ˊՁeBH5ڰ4]颮dв„TA + x<#cDoePI8Kāz +%AɬV[{Gy/*+gpூa +SifbPߋwtmNuUJKr֚wM+AWO)GrfxKr"`xLЍU + DWPNآ.xphHݮ8jKPXytJ1yXہ*&U"bW\jY +כ@ЂzL͖bէg^ahJ +qG6nt.-w.m=B~vŻBǍ/ ars֬iʚ}bBjP&r8xI@a08Q$νK;RuRѻr,a%򷛯bz0b@ +? %'QZk0,d=t0KS[ "B + k[[G<kngǞ|7_=) x[d?o.;E +ŗՑΚH8 +۔g>/xP]kgP_B+Ӹ6 +2mMoh+"ԗ=j!.V_C_ޡ +KͫAwW &i;3jj9utk=J1gnw%yQ6KR,->;0_|y;tk(svxMQQW]UT +jKjԼ.R_+DVJZ+3 + 8:u6m$< 2nv' Gf5kc\Q @9Dc4,ihljjڴ-[o߱c={/]]?g`y6>xOG]y$mb?њDY9m\մ-`biNrq +DPGb + tDMX_B+Q:aMmm~O>ޏfIB +X߷𱪿%eOwyp0O4@G +D{O梶)ϑ#޺#e{FkJKaѤ 8g +0De3K6ΡyS6MPh=ȏ1 +m,v?Kp%U?̟:/l@It*nb˿zkO<hH%$"N@DcKiϚI~<_ YNAFjӡWooq6gYEp>>adZhJo3+gC}|ђ%.w{~WRCq I4"ǽejj21;w*.<ѿkɬAs"!=PaY.7e6qTGO:|JY5 + +hq;NE[d̈Rs_nRA\8$}`XV Dtr#B + $T8))^.Cкs4Pde4C̕\! NLHOмTiZ= +_hkUw{?uWLyYaf+9\3TulsP#s9p=f.9g,̑\$/Ի:nk$*eΈWؘOɦ + rEx=|XX1Ue~ޓz*HP*6u+9 +8g5.2WؓѨ^kՅ~u~~^hAx|3 [\Yǎ8f6b5"ZQ/ocĂRF#o"5p + +.wq#jpdp(FiQ<JEAcH0(S0zym!|c2-r37HA եJR"As4_~:X' +J"o2ȔH9uփjh:ρH9Ǝ͌Al ;) + +p"^&M`SkG=TLX<ew9/W#+(%vyuTHg0P32 + . ޡR(mb߂Y!:+ +R%HGln`S:|"do +X豞yl)?x{H^;ƄɄL,ȸuwUxwhڳ +2.ٺ@ 脄ԲH?bg|鮖0S +!ѐn΀RHLT>8;<qm)y'Syb&B*~EA=Oɒc^n%*X7{"Yf!Z$&}iHy$ЩL6B&;kx/J %4Cg\TBjN@o>)'ZE +E%<gnS2t +ҪA`~ej}N*Ֆ7-=8u;!f~um6f0 +֌ + -[F +c Z֌PVe gk,cL1 F-̬ePisE+qTss' +w2lRM&F%.J{[89 -91$jdi:qq(sir|Dk=kE6kf+a-xDz4:yKa̋39_NwԉO=:j&BE/J}r߼A`GaH˴]-k~qr09#vgN-j{o<%L OЊD{<{] hoIF~7awz/MqgmHn˯s`"ygÙmT]z8膹x&qHCvWViۓu ˩Gf/,W#E7AyM[ + {pYs" +(D1+7(=a}z}`-Mg/͎~&; z *MlemKKP!i6/m&4bm3 + Y]ؕ;M$гSv18\4'5kc+@^ +@O⚵yyABId1/1\/t4YVP8 u*>E +D!ɍh(D~>LL?_%-|YV ͓>ٿ'=x!g~1?O_7w_G?o~Aeox=vw#۟3szEp`_ҿo__bx;~{m\q{6KiyZo|[v>;+ /3A2,nN@'/~-ooydwM> w$"P .ILt;Q'7!$fi+2%fOED.N*FDdԟ>a|bf(TULms~)NJq>iy۔IIi{>uPRMB&K{hw؏Jsiߋ|[¡(0'EӾ FǦԇh^mS%8$ + +  u]qI`,#E2AiW2K}/s +ei kKi=ZtTA>Ԅ2c5kl-RYNI*XfYھpc&b؆5.~hH.y!O Dǁ? egKоC>Ud=@߫JՁ31np#3lCbׄv-TyF2'"SԱnmK~]ϗjH[@Uڄn + ^cVm#{=72sa %9)NIAZ?Uhӎif;(qN9u? 899yKS$~;]؆6! +~tF + +A;8im7}!j:L['j\Ȕ)vgD]ž-o{\7<ߞ. + I>*,~wdha0*Q߭!o#<3&UY=is + aiqY7-"F8 +1# 70T|̲FLZɼ/8:ii8 +gr̻dMn^\]YBe+Sp"yޖ8B*d|>7%TE(ĎE? ?tTl*˓RQM=(bEVD +MJ~%`"RR7VnPn8?vwiY=)L]G4IU)/sº( m7(O5JsHߪ_\:C?Y&Goo~durJ&ѹ.Fi{B٣OQ +A NhX])[* + ,\{f:FěH'liC:Ӭ3~={|7Gz-;]D<3jsz,RWj +kicת/IŲګ&pBXv x7ť{s *Ue'VA8[Cix} A+ci/6ţWva'Gp@KtѯsU.{OZ@fqyK]zoN6wPd o̻Q~ZIrBCL%VIGc B0T\lb>-oC-E +vG 1ꪡ<2^2}YЍ̯[178ph&;H֜S͉=0 + b%[.Kq]gP55.WKoZjߨM7F6!-`uטKg~ +BoM* +`Ys.\<?셱dK{&SeO΍lCbTф+%>;T~ƘjQ,5] {6kE!:ى ž-R'{y>)W>Mhj_70-œ鑢 poI + +Th,rž*[cݟyᘨ@Bzʱ~ yx323|[q Zdž-oz:z-}bO wC + {n!'/~-o|[OrM?R + KWž-o +i-[DQ#I`L2]a)Y&xEf~S-uMh<0{.c"wto]yp2;L:zhUkY֛1]|yf?*ǰ+$bbw$Iݹ}TMRfjzI6sM]/3(P yo +wesgcFޕn'Ln8`#j +΂HtDnLrA,ʌ䙿g +_xC2/oW#\%1! {2_T3%-Y; + \ŷb@[{"A4O_fj +t Èf.Ě/6H<A~91%M<aL!bhCbʮօvlGG@bgTZM8% +݆aQbbk>!RWa:M5rGbrp<y + +ATҶ;Q8,,3Pl@;nCdf'WlZ:ZVNk#L`g\Ɔ \jJcp4N\ ckDC $?g$d1Ƨ )MܤsO?7H9R + +0aya:)o`ib;m+ +,5DڅPWV^JM>n4 W: +jԨP5ݸoJ=?XrTZDIT%fQIpxo^onl + +7Bb63wzO4 N[f&3%9jyz:ר"KVHlKvcUĉzغ!>ܴP`IS + kDKՉEϛUj1sgW׸, ?rz+= +`~,bL$@>;u"H0K7LF/t7,  %Ju"X_W`uͥ +/|2*msks4eMG"&^-q;T8i_Mh&!*>ʎT4w9y_nڲ{6cpwS8enkO5Hw/'?-V$AjSxfW_°A-÷e o=:fZb+Fw7 + +%m,:cF^&"96T[ח䎖)oT5{ؗ_/&i;^3['x TH,V+)… +b?5dtœ1*쩝Y)4>4SKGӽeRY\L"fNiŽGŕ TO^2&SG7i3]ܜ?OF[њ=6ld\Gq +jTAsCT8V\ېj}ۥ6CoExީ~G2h(|D2dkV&SY^Oɡ2ˊĔkx91UPcAR3tNSmFD뷅T]5dC;R5tNݒ@ }p:\VyDV'mm@RP΁\aS%()ގ"P 0AW{P + +EDz#\-.WP v[aIJ4|`d0pwhz $*;3FWnC_.\-r<7t)C +K|hAV-=H>|*, +w~#&q \UZ!¦x-0! +8ŮQ1Jb}[ + &a +ƜD}q_5#\ۙ/߶Gb׈hYo6ZRMK=f^|o 'x5}"붧" !CX;ʥtUM.bO}\]&RYN{ dޔQb\V~XIq7w;A +(1YYP + 8ݾGGYnT%[c:;?=OSGWu^tc+ ٌ* +ro3  +(LUE8dڦlJAʢR5f'lӴwo)PY$̨cY*j&}#&Q+N"X϶:+2z|+{C<I Ӟewr͛ךl±1}ܷ{BBçQkP;' + ""^j 0A +ڞEXV{)&f +J,SpL`|zB_4uWd\htLAǁ7ja_nd0|W~ÓI,£-aڻw?,UipSл_}>9֊$\oQcEJ +]Ulͩm=^@W<2ϼ|z-J޼o#<)6J#r.4?r:zF;Z3c/܊2u j$j^PUJ` + +^@/t$@/^zhN>WQeI&xp]lNxo4$d + +Q{;[~aa!יu ?"X- PzuNbbK2A]4'쇯w"R}Ma/F9:<eB6g['Lj?e3+rMWbl- + +Z[9rxcxY0*00+$_ϵW,5Gy*;vn'srXue6 + vbjxEkllÞq +s#~5_.Ǔ&RW9-XQL#![ٖ; ~u9q/{~,B30 ;B`tP% t33ZXQCNa=]HIn;mE=ǁkSs<߆YPat-Gc1$t3!\Ui7Tn'ĭbcCmP$c<KBO + /D߱0 mYFS˒'hpqCtj_Kj fnPu SDHD; +;CA-Ml_bKo +yVOPHO Vz93V0`ODf{0cDP>Kls/ ʿ'"/: + T%lF?raQ%jIMQbW5tFe'ub'.Af9d =)t +>U i oK\6ZX̭g'}C' Ɨܼ;`oeG +c@c򿰿(tV m/:񰓽A!u +EqhdJkWE@(;ʬ4ʪvEٲLNB% +W= yCЈsUaȤ~EW1U{R&[Qxc<ɻU"I"u'cI䉔2P6`~T%7<0g#g]p:TZej/7dQ;ȹ U9ݴae n + \?p ?oS%t9̉ +'c_]vQZI%蜃engrK3٘U$WY+rLޙ +9J9gYGI$j6K(ȆAX*4~'3.l!gl[prxJu + 6h Ruz +g2%büʻl;=҆`6#U)ȩdi(j8P|!+~bGPg%of|ݐ?@Rf%^ w|ϔkS'oUoidŔPJmOdqL|jS +Cm?[i(bkִj~ぞ.{ȾM<\mUCM5R ph2԰gysH*&k=&/ jV;U'-!xFY<7RB/nP"3JfFlvvn t2[8h/{DB9 + {K8LλOj3 +4vXJ +>D.h$.k#((z>c˂V-&UZJI&hOc?!!{fHRT,3 =<IFf~g0EΓ!JQnߚvh*#Hh>%9J6D_ԑ J}ņ٥ + nlSYۇN!?u9G -~ēt +Q<#r|\QeyXJԚ1M" ]Yy॥bBwlIK +s;'b않Ht+VCeϋO +LV{vγ_{I&M"]ʟ-;l9A ܘGmkTTl6ٍ_z46-6RsK7sa9ʪ¸!FQAɫA9bUT}!פ<D޹F}ʄp\e]틌v9. +X<0Trrg5p +tL +Nݢ9z-(obPoWe1B+ɰ4L&j~D$(Fߥ_EA-sT4)@T VGBR'}E<ⰼC?+GɄ۟#qb5/߯7 ݟQy@]cE#C>7j(^Rη?|#P8BeuS̺T}B[2&i_: +lI +6v +D[Q + ̸+H}p^э}D0>H' +:I-&&ДENvyW#ќ; +ey;e޺ VC:I?MJ+oIjjyyR igYl MȎDӿ*|B4 +CEuw' +DM2zcDP]8Sp +u\[Hb횶Y}_BXBt4Qf+92ulʮEy'DCB\ +Q{9YEb}~iH^N*$ǥK5 +Lp!Y^ve^CS&(&8t8Ai +XrO0T s~DZ +~/2cu=$̨:ڔ5-ׁY9|:GV9. ?KWJBG4\^ XCp]!uK~o2nBAr* +1>zݝ;*V9u~4#5"}[谪pJ&J$~,\3N_{il@ݺ^5BsDjG + o{58Iy)AZ/8η +(*a@[͉i߮ +u}U1Zz-Y2΁?d̶sN +[I)VKasC?ä;?KjSADuUo3v6c)12F]U`d;xhuZGwX̵ Mq,t)TGg~o!Xgj\s)2؞䈊Kwt@MkL cQF:z1VPĺ]!BwrlJGOyJqǓ@S4B6bqIHﯪNbH&L2HM8htPqf %)ޘ6^y}w;5L=T\X:w~zWxvR:QO#-|ݭ13%b8eCtŰݿiyYu5_j&1{魀|Ujb}<?DUƌަ-V531cbGa5&߀/V(ul NaN Åv(enQ(҃gD[ʪXLu+'xezȦ*;Bt1r5_(OW#T +>+(eUf[Y@ގ= +Ӫ *,ozN/*s(-!JI/9ok/CGէɇJx!GpWciW-b\ JZ7?_]h,[5ѕTi5ֽ3ڙ^|^:dY/ż0,I9zZqtNT_eI(sвZNvT/q + +/@l\SCgj406<[\IOh}Τ'Qp`He_&e4 fR\ј-2 Qt + +䙩U'r1~*YH+:1ѩ}Q"J*ѿlCNRk[+nzL + *86y D +~z .Fu bl?tEΏ)CQ=i=Le@!$SyJt%by{`5m̄|vWPjP +"9iXsS2C!+QκiCx| + 1o;1) +ǤJƱw:KVj +гl/ +Й@a5 > ]8MSk;]JMW=҉<Yӟ[}wګp +9A$dZp2Kg~`F8F]k4ךAyi,ySaM0ܻ:)3C",rƉFAf +dʅ:  + xYr>oidA6WSPJHpm]c@V^J)XFʞ +_qEE2X3EN/P@vmD`u%#cE| + +۟bBwM 88-BhH~VK[ E +dC"ӹٙc5 +e&+1%ux0oj֥fr0bOŝ][S3WD:bp~r|Aw +e =T0ˆ + &ZŪձh,V&0 +K4(WGNx3CEp2>귊0#(JZs9 ZVt@|f=Hzn /x+(Cbe"Z&cboȖ[qVL/ ! + ;X0&s,Uh m0'*˺o%EY8NYy& +8ڹ$󥡇2n$0M`-k.N˭ј4i[' +E,$}0X޳EVүخ +;hʪZ#ʑX4B[fm*ǽߐYۼUB p&WM`kT).6vjNGR@'L)C9Ĺ :\t#\4<Ma- +1$gЕ(mMAաeA lFJ}>^Z^ӵ]ӧxC<f{hT{(Glbq_cԑu<8/V`IA|I}z4k[6f*n=L@D OXbm<%CO6XѐKzp>?޸حNgr=Tup +5 i-=R(k$FjGIew2RBksK'h?.y@0̤m#C eFC#U&Q붥caHq?f v7mȯi'0&%ҢѢJsRo + W-iR*L԰!?>@ (|R +0g.J ,LP] /PG\y\XlVѱ>7Z~bxh&R9vjb`46QUj IMG'1*Re6zAyDT(@ϰf2<4ƣl4-c^,Qvv+4f7*tWHMElX΍Uo@{a6޸ͽp<@e8۞`OB6-(躊FAC6VɥZ)s.40Tw\‰ (1A t|7kXZ&>℀ZcdJ#y,dX Κ˖҇ +gyO< + h,y ̜uWѿk}Jf/BŹ]lLL)-HX'^~2=ۧޑ=&6 + Dbc   v`~7AmRTW:EUI~ +9kcFeR^ + x0 +3Tj/V~pF(3 +LE1;YUu7tZaaޫW3Gz K}G +/9 +c |TJW +LtX#lzDK@JꫭlsMMϬ=dhXي3 5{KML.(`z‡(U2<F3.ntK3^bD + 0ѺT + +rpBP"#q h/2rWeadqoWccv-YGaDzK:TfkُF]؍qQ׭!4 +^ + +eL\w(ČJճHxy;.=.Wn]8 ^Wl%;OVq[_6!.8kwlL4 .Q8!XhpeT@\^V(*DAsazAY9|4RѿO&rYb +y1 ;nDxױ3"UrtkǐCC7Fp$eV1J1DSE˸l +ԫn@=z˘YmH + xAWFAᩧ%suI# ] +FJطBZ+]lПޔ&9 +?_i!!\!ִx}6݅V/'w +Vx`vJr*1Q6Ƒ DH@tB]n{XFI/MHtHwOӺ"4x3S<ozgp ?fH"hn=$^ `# HSsWjV,p-zh0& [e +de +,b + +iX@'^O٥N<pB\: )Ъ./ԕ7uP**0aTӤ?UyywHryA{}TZjcPu'MRb݈f ($!}Pa%͊:QQP[o#׸K-k@8_srjf8]) +9V_RIR_kw{2dݹ6 ig`,V9ucZTo4xrV + ? p#]L>7A!1 +[g 2 +aD*(.rj(i.~8٦LZ'~]\0h&&Mό2 + =gFԲyq.q'|/ +2'ӷцpe9]#Zb^aqJ[Svk$Yt1RU{<;/ +JSu!4Èv7z5> j=@OiFI + i +"^?t]*"Q~Q"苊q~1d7.xdEŴ>v3uyt_r +k̉RAC_p oHľl^ܑ=Abߦ60/jXg#[Ut +P%=s_,=vR~ʝ}ݮ[YV׷~ [_!BoYW)pID`OW։[Q9|(Dvv:P* N|G/" + %}㙹Y +배o/.'YWs#"ݾazXLR$lssU ÁR1X(T.Sd 'YZZ4q"@y8^%aK*X'߉gmKg"&Kh'Ʌc2q-i ːX +{mv8"XF)5w| 䁷g]v$a֩u榅Yĕ?1jE%x3G}>Ɛ\1l6 ǾV).^asYXNSﱔJ5)c~C#@wRwI3 + sRQ}SǚwPqf0Y1_6$s +eYǞhAw1mp}H})6:_2û=| +<) :"jtW߲Lxs{<F`*P3KUXTp *qLk{lHZVNBdIٰHGEj }mJ Ql>FupCNtϛQ(7_hԭN+ + +\`3թ=p;s wRCo~ [_J1'9)c&Ý-T-0CUc: + 2eew`p, +71G Õ̧/Az;Sj>rg!8"9ˣ%Jxg'x]tzh%>I +;X# + +2=Bxci4@'LDz3選ߦ^z\>Hvs[veFDV4%L:C*{튄n$kn7d;Ӳ2;$ʏzZPLwɤ;ל0\a<ý2]m_[—SHnYtIt|egE*wYʈ=S~YQGབC;i⸫sp~ +&Z/ވՑ!6bmj7H| + +0).b1mb%nu` L+@6O;]ü`8L^kR"%xHȪPٵGX>c` + ŀQw Yo=(n4%i?zUD{”@H2څ4`me + \BLfc +#DO +;+e#DgKI=&MƔJDymA7up~(#`#U=snZ>)Z,s + 1CMq\i >Dc`Mo o,]۽ +ma\?EgnUA W}tۊ:e(qbwwL +:ĚW}mrUi8ּ܍ fc1 i} +ldA`td6p@v@S_aйm:onc֘fOkʕ0 eAgQ$ri%A + 4<3R5pR7uFt'Kw Eu~q `9K +R_e%#eLi(2Syl <2x񴡸Es&URw5==פySYupΪFfrN) >D}&Ry4& +IKw'#`Kp[rUoVgӛxh}Gs-^QE3›C9S>*fK 'V}2*7R)&2&gO)|Ec`Xfjknp +l!B#v3sb,T ![, L;EvGt"k + \ G9/zБC_tSGnWq ;p6@G!Csl ȅz7IWE$ +2(p,FYݰ߈Ֆ6"}H{>'JrLYtvam +fczkN\QWs-_Y3eMܙ.5=R{bWۼiybSb!^o=qbe + 5pYk":n}ͨ3x +Lz |ZK>},nYdV[ efS17aɰwO^f7VDf + +(h6Ծ1溤4j$4YmUA&kAO2NQ҄M0 h8}8'[KCy%}Atp&kQOKa;2䞮a"IVF%Cld?F + +66m[,Xit߃?`>!.t#E̾US?Kbp6}[R> + K"<}[]^cCn> +ckqj3tl*rWm8g7 oƦ5v_'Y&Ė=u$ސw\=/j + Hnz%lIUGYp7%dLB$>q*mUdhj/PG ?9VsuPIdnڥ'RLIxt)فÿkeT&m;/H*a,K|v\7ڜMf~>{xi[c~u6Y$*-/U7t^GwKJ\vʪz k%*B;i`d`5wȼN~?5-jvriBi2E>rv>v2gwTz9.oWhV.k:[R[a`ɵ!l9aN;e]`r΅U~x"ʯ-v4,Ӎ3\#s̉Qϫ:AN)ԗ:oVM+ffi-gA$ܤ2\r'BwMݞlYA>K7[=* cN(L{S +{v2UDYy + عQN +tQjHځZcv+MI5o*C̞sp$9UmqAi0p7 +qC,)GJ# + + +V0ݿxl0؟!>c$Ot0Ŕ.N0I:P T1b{=^xSP1XJJP;`F**OCи%( RO}erÑkLk+Y{=i^rPV{0 +!;k(oj}^GÏ!wbp JGH\ + H[-p3&' GL#tY*Q>տAt(h32<i8#˅xν>7c=gR'}C_تNx4uU + +_ﶃʩC)h_~ d9Z ˜k▅Uzf\Vv-|L՜g~_6;.PID;!5TfVs`289Mq4QyЄ? +$i6 +*QZ=•y3"U@ +8|qՅmʳ/WJ-i mSmnE,{@/Jnz-GP.)F<ޛ؟:*Z3 S>d=ĶG͌1:v!'13$lA!.v'q;*zI[n9dU4P v/[0ׂ+U;6 +APXp5p*-ғ+E:H::Ќi8b + +U\P0drTeQGE5f%w!'$ܷLlltB{m$:GWaq~߆ + d$-aE\ +uYq؅nE++6]Q[qi t# +G7弉*+dxq;Ogȶ쿈W)e6Clvw ._ia/qNAJؔ3P\ZzϬ%ZlG + tXiP**x h[ʌA?LCyNM5Wj|xBi qZE6o| +'D]η̭]E +[$PtŲ454\`Us25pGkA-?tIoLL:K8tA}l׽Fnz}Gj߃9:}@D-J+[dCܶQ|@͜aщOUBbko)+t5B>!!Z]VT4K?2nkS0\t[oDdq4w+*_ ݇ؾ}[?WBB}C!&1\ؚٚLeb]kJf + +cBw%2u#/ fanWbsd|l]7;lhPcsv<I|AӀQ:\>Qc뀫MnZbcDdi9ˮq{{90֛LxAđ("ZRdXYnC6 +Pe H:Kys4鄄 + !MLj\dƧ +f2dtJγ2iD ~_\]Ud/aΕNݎ|+QJBɷYu +ގUl3sN@ w/Tn Yux_鬘GUba4n}_'F,SfNHd^RU#"TmAS\Q+=1ߺ ܢjCؚ9@LJ|0.pAHȻdV)!͞3+~0_96ߝ`dED+NPֈK48[T/-Igdq*+frA'}ޟ>:V + ' +ɺRh5.+OI]h@# 3>Cݛ?؇ IV`ž~OPEt\'Qz]C@ςAkXoH+7Ǽ8b핢Oh?H&CC + ~* +W)%8ϒ)H!A!XUA?\xSL|8]3u? Wqr C +NNO_FhtrՎU".~4`)\Gno\vozʐs3)AtV~ovxQ-0k?u8'0 + +6^4̶  ҩY&cMqOhn)&]>*P&k (BJ<*~+ +XD܀GY'{Z'\N{}$Tu~he] +i9SXerUo'i'[v݉p+.EƈєuabBd-4T6voeHnQi:X +XR-mϑ3Iu4dmRւ?۱y5'V + +v 9rԯt稬i[#WqHg'rsUqZ" +{pIp8raXN_jlj\^ye>$@W.(%s? +gyUN= M71~3df + +vR4lq[DH^OW_0+<Ii}:/m#x7 ]knYN)aoU6dZ|[秝Nv1ʟ}(><K.!J_Gb_l":-iShȈc3zŮiTߘU:&.hA + nzk}dv4;tR9Z +ԟ4 òGW$3 %8bŹΛ)%5 6 + _,Z ;@XDD^r zSX"@6podA*af +d(}Mp|<bٗ{.81 OӉ1!$dN7 +"˸  + {ɧFAtkf7uts3I'1i8wX52s qEF3A]rga$ĄQ`_ĵ +Rj ǛkfUn-u + !86,G9y Bof(Kʏ/>hy؃@ˮU7(8:*mm'e)Qe[>d />j4#2nSZ[hⶩL)7X>+b㋥oΎȐm~lbS3;8,Ψ1 +  dLK$N^ wOqIDW2WSY9V #/LE +N\}BpN,-S;[o +^Q18c{FC + (yw%mYv6['4l,D75}+U.@Dl + +-(k:ȷ<L_uGB?S0WUiX5J;,qoW2Q6 r:Q7yFǕyVkJ|KJ#}dT9GC +}jL Ajb*)vyN@bGB[`Di3F#YM4SD9yźv + =& ㇈{!7da>9QzxWPVy~r\YKFo +֧rt:s +_0(0Zy ħ(+h}$ AkS<7$'i|#ȧA)P2}'N5 + ])A`Rw\w~F/$v9n_g{Z4"i&D#K_/Ve4"*R:3T-~w + z_vg +epwr+AΨ'Ta9F"h qw&xBz7.A&B$ɥI'Gá] + m2 ++hdh0 oϡ~v -UQr^?P. +ocU2}#Pߓ\,xglp6JW/X,ز7ˀ߿ݮQ +$[NxMUVG;ak]Gnj.,ٜ9 +?m +rB7YdrVYbp]@!xjnHǮ=ޘCdͦfYOv7(Y}ѷ!n|puD"u+j'5> +o|Pk$N$<;j-@,>&4mLHrK.Fu1C},|qhj-A9(sk@akFH6cMg@׹m7pI + ߐ&0K +O㿒S{=hJa̩8\#rfژ$gBph",[?!Ly]3\p.%e>~z#w|ަb7b + l8r,d,)R\(1Anym,ӣŧ +pEGMrI|' jKl% -o'HzT.@Vac + (Տ܈+yjmjIߙzomU ̻;n|KݲPHzCaU[_Ɓ</ym7gW+v#w[tM`d"{P"!mc@ + .t + C'9/Xx݁ +&))#,@i+b+P-Z}H@4G!.}:?EGSƒ`['qmrGM0THc\j)PF\n9^ySmTte:NYaθǶ)tOמInK,"S@LĮ&dJ{>Uʒ2S^Ƒpy&Rfg9lGꮘy'$W\2BMv +  ShQ┑P͍Mf7(-x<Ώfܵ .+ऻE +!AS/L|8쐅f!Bh.wR˱JSxEz`AErd&~A@ݏXZnbqGuJXrMmèxiX,V6eS3:o?9fZG(k!|Me6ќ^TwĹXywsTHu + +r &tmXo >%Mc=C˞$:tt@^& Te) + 6Tw̰/K +j +v7,uo",ı-u{UkZz \n]vba/M`1Mv}g1l|5J$nW'۪pw7pGνko_Kя$]O3ۡw~=QۭudTInT + +zHw^d.Cy0LhIZȦ#G?4<cԓ>܇eЛI!:݀ׄ^2|F./n,Ai.Mv)Eq0ObTI=+!3fQtlP]lv +?!w',ɶe#VXk=K[:k-c7gmO&k-+?C~y=qB>; 8>gJil7Ֆtޙ3Q),UcP.Йc8 ?c3](bև[xkV +Pt +  +}\Dd{bi$"PDgՉeYUAp!5NhDKx)`Uo +\BewO6BnR׫v]ЇLf {R%%H. +,i^iUB9V^cD~NH!5{Hw2ML^<vUݰPeIx |gJNTdlfb +32PS19q*kї`saʌ3wLu˩"Xds)dHS^-/jݭ1 ZPN + !ĨvCM0S oS]`GP`[,>KZ +:.A C+R4QTщkmx.n 0׊:w +;iHݝ +G@M6}sV p| [=+9mFVʷ,Vs0h\5x\"QNnrYi%ɂ'+ԃO5/&*idi&7 +v*Td-SQ4kȇYt.[I;E.* )}v=Nm]bCS##Uo M%eۨ><‡Q`tq0ݖ=:=…e|> + T:o"\“֚9 sߜ`%; 9 +AKU}=o'S!R!uO2jV^}* :jhk'RٷX<0{4Q$@eд<)'3Y;d;6$]W\@(٩P\dm;g + Aw0w ݣ~i"QEn}cPfO{kҍjSsPVlY{<6PG5`<%qTDdtq>3뵀kla+}B[3ߖ~DHVY8/ZA.NXGxqƟ`ɍ Oz/"&QI`r +3[B]Ӣ5t+ +U7pZ*@0w*jp^`gH\I2K7ie4(D|ݰI/5ZNAmD{&@3)$PS|5{NIHjOh&H ?S2!+0b +őꚐVݼLWfck[J + L!8Z0rLVR% +Xyrc&>˰)Y㬒O9NJGTOOXwukp04Z0̿aem + ԟUԊ +$X´oQ5ܳ檵VWOcPwד9޹g'allQ$,4)H8eB!~a,۔h'T; ҳU)dQ˽QaoyK@(*ʜ66n\KqfCN4l)[Ԟ,R%ỗV@]S +UˊU:^lɼ&6\k;skY{H&B +L{-p &F1_FĆT?'AǟƋw .hPI 87 _ڄ5?G9bRXm0=S~":K"CZ*qp?zG"g^72 + lMQsx'o8*-^{= +;WI'틛Sɨ2AŖ 6Ly/0GM }I=S; +K,E %wu `#sR;`oMTZ0WZ +v@<`޶ +MœvD|)(SQɉ, @HۤI4 9Б5 ?#^ +bCig@20fܰz9Ԛypdew/Tl Kո:wX;%_%"D&W Kns)Gʝvb +ǺdRF%i"ElH,3yyndFSNj{OMq+%oN`2YapW]VAhN؅;USq܏DFSў9={Borz^qOQcCh?q}pf,0aD9;„:?a!PdJ7)KakϹYU!*O9+lTX + ϱtԤk5遚dΑAXnljځ XRޖ +`.t,Uf6.5?r ++Pc3~<򺡇I +6&xF(^][g"b.%3'mZ"L/ٲŽ`䢿d:\Sa[8'g5)cdR?yʴgN + +5Y륶3t6ITC ,F}1BtYY`p"#/?{?GlGg}4aX1++TkȷsVsJφ:@+#82y, z0 HZ@X<35 + :8+K :iumM&#'i8 +:nz"{H>YMå%A\CqmHwI>INi&wyچJD+Y{rYh/Rfjı~U+x#_ 1^](WΈ[χ#7Xp];HݎfjE 2xZ#ɑ%Ӈ!*Uo ;#ޗ,b + +FmfIFZ:y^TR}H}K瀮X9z'~;]hcwy36L|_ b%%/8u^T"f)ymGp*s0UabfFI; Co%j~G'V + +qRڔO(b!%lQu{2V'bzB_70oUQ9OݢP<;d*ZrxT* 6-r-+U~&hsRCo]I}C9L?o!=;^㈎ + F. +BʗN +ǓX>F%֪c<^IhHR0,Y9&~OW9 =뭭%bkSr) E h~b5r{(+coxq52/`sܜlЙRg.RWAfŠXlXfQPy?s%8$~ΕmMe] + ǻn04SoL"/}Uw.7~46CiD8;*`- +%"fOU*-$۶7g18}R08a+:74ZUXpr>DLNU=}h]oÏt<F +4ӱK@fM yt{twpzEYZڔ)BM/6ad[_:$a  + pE uoCVr"OѸ1n^İ@ad֨  +Lup/b +3>8X|Q:C@-WOGM{#Ҵ^PЛuQB/vϢv5' + bOFe0 g d26YTLAsߣ [g= + CM6u80J~1O\߷D# +AiY'?}D!GQ˅N<$ŭiXrb& NeD) +?~eS زF 7j3u?b*I@ \ No newline at end of file diff --git a/static/testfiles/telegram2.mp4 b/static/testfiles/telegram2.mp4 new file mode 100644 index 0000000..1fa6e10 Binary files /dev/null and b/static/testfiles/telegram2.mp4 differ diff --git a/static/testfiles/telegram_new.jpg b/static/testfiles/telegram_new.jpg new file mode 100644 index 0000000..0e42a29 Binary files /dev/null and b/static/testfiles/telegram_new.jpg differ diff --git a/static/testfiles/telegram_no_standard_header.jpg b/static/testfiles/telegram_no_standard_header.jpg new file mode 100644 index 0000000..7f47f42 Binary files /dev/null and b/static/testfiles/telegram_no_standard_header.jpg differ diff --git a/website/static/website/style.css b/style.css similarity index 100% rename from website/static/website/style.css rename to style.css diff --git a/website/__init__.py b/website/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/website/admin.py b/website/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/website/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/website/migrations/__init__.py b/website/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/website/models.py b/website/models.py deleted file mode 100644 index 71a8362..0000000 --- a/website/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/website/static/website/example.py b/website/static/website/example.py deleted file mode 100644 index cd900d8..0000000 --- a/website/static/website/example.py +++ /dev/null @@ -1,14 +0,0 @@ -from telegram import Update -from telegram.ext import Updater, CommandHandler, CallbackContext - - -def hello(update: Update, context: CallbackContext) -> None: - update.message.reply_text(f'Hello {update.effective_user.first_name}') - - -updater = Updater('YOUR TOKEN HERE') - -updater.dispatcher.add_handler(CommandHandler('hello', hello)) - -updater.start_polling() -updater.idle() diff --git a/website/static/website/furley_bg.png b/website/static/website/furley_bg.png deleted file mode 100644 index a5e603e..0000000 Binary files a/website/static/website/furley_bg.png and /dev/null differ diff --git a/website/templates/website/base.html b/website/templates/website/base.html deleted file mode 100644 index f992070..0000000 --- a/website/templates/website/base.html +++ /dev/null @@ -1,87 +0,0 @@ -{% load sameastags %} - - - - - - python-telegram-bot{% block dashtitle %} - {% sameas title %}{% endblock %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- -
-

python-telegram-bot

-

We have made you a wrapper you can't refuse

-
- -
- -

- Star - Fork -

-
- -
-
- {% block content %}{% endblock %} -
-
- -
- -
- - - - diff --git a/website/templates/website/index.html b/website/templates/website/index.html index 0805d08..a052243 100644 --- a/website/templates/website/index.html +++ b/website/templates/website/index.html @@ -16,27 +16,26 @@

It's fun

from telegram import Update
-from telegram.ext import Updater, CommandHandler, CallbackContext
+from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
 
 
-def hello(update: Update, context: CallbackContext) -> None:
-    update.message.reply_text(f'Hello {update.effective_user.first_name}')
+async def hello(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
+    await update.message.reply_text(f'Hello {update.effective_user.first_name}')
 
 
-updater = Updater('YOUR TOKEN HERE')
+app = ApplicationBuilder().token("YOUR TOKEN HERE").build()
 
-updater.dispatcher.add_handler(CommandHandler('hello', hello))
+app.add_handler(CommandHandler("hello", hello))
+
+app.run_polling()
+
-updater.start_polling() -updater.idle() - -

Easy to setup

-
$ pip install python-telegram-bot
+		
$ pip install python-telegram-bot --pre
 $ python bot.py

And it is free

diff --git a/website/templates/website/sponsors.html b/website/templates/website/sponsors.html deleted file mode 100644 index 060719f..0000000 --- a/website/templates/website/sponsors.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "website/base.html" %} -{% load sameastags %} - -{% block title %}Sponsors{% endblock %} - -{% block content %} -

{% sameas title %}

- -

JetBrains

- -
JetBrains supports this project by providing PyCharm Professional licenses to the core developers under their support program for Open Source projects.
- -{% endblock %} diff --git a/website/tests.py b/website/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/website/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/website/urls.py b/website/urls.py deleted file mode 100644 index 0f1fa5c..0000000 --- a/website/urls.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.conf.urls import url - -from . import views - -urlpatterns = [ - url(r'^$', views.index, name='index'), - url(r'^(?P[^/]*)/$', views.page, name='page'), -] diff --git a/website/views.py b/website/views.py deleted file mode 100644 index d968420..0000000 --- a/website/views.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.shortcuts import render -from django.http import HttpResponse - - -def index(request): - return render(request, 'website/index.html', {}) - -def page(request, page): - return render(request, 'website/%s.html' % page, {})