From 0dbdc54b7d968af50f3b48776533ff9aaa0929a2 Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:27:42 -0400 Subject: [PATCH 1/9] Update app.py --- app.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app.py b/app.py index 11f385c..ca9f8c1 100644 --- a/app.py +++ b/app.py @@ -1,15 +1,20 @@ from flask import Flask from flask_mail import Mail -from pymongo import MongoClient +from flask_pymongo import PyMongo from celery import Celery +# Create a Flask application app = Flask(__name__) app.config.from_object('config.Config') +# Create a Flask-Mail instance mail = Mail(app) -client = MongoClient(app.config['MONGO_URI']) -db = client.get_database() +# Connect to MongoDB +client = PyMongo(app).cx +db = client[app.config['DATABASE_NAME']] + +# Create a Celery instance celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL']) celery.conf.update(app.config) @@ -17,4 +22,4 @@ from tasks import * if __name__ == '__main__': - app.run(debug=True) + app.run(debug=True) From 3621558cbd0473fd838f48d9b530aa56ef18bf3d Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:28:11 -0400 Subject: [PATCH 2/9] Update config.py --- config.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/config.py b/config.py index 44db1f7..ba44d56 100644 --- a/config.py +++ b/config.py @@ -1,17 +1,17 @@ import os class Config: - CELERY_BROKER_URL = 'amqp://guest:guest@localhost//' - RESULT_BACKEND = 'mongodb://localhost:27017/celery_results' - MAIL_SERVER = 'smtp.gmail.com' - MAIL_PORT = 587 - MAIL_USE_TLS = True - MAIL_USERNAME = '@gmail.com' - MAIL_PASSWORD = 'htue qczu rnxo codx' - MAIL_DEFAULT_SENDER = '@gmail.com' - ALLOWED_IPS = ['127.0.0.1'] - MONGO_URI = 'mongodb://localhost:27017/newsletter' - + MAIL_USERNAME = '@gmail.com' + MAIL_PASSWORD = 'htue qczu rnxo codx' + MAIL_DEFAULT_SENDER = '@gmail.com' + MONGO_URI = '' + DATABASE_NAME = 'newsletter' + ALLOWED_IPS = ['127.0.0.1'] + MAIL_SERVER = 'smtp.gmail.com' + MAIL_PORT = 587 + MAIL_USE_TLS = True + CELERY_BROKER_URL = 'amqp://guest:guest@localhost//' + RESULT_BACKEND = MONGO_URI + '/celery_results' From 175cf11440519cf9f5d1b238dc0f2cab22f05f07 Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:33:01 -0400 Subject: [PATCH 3/9] Update routes.py --- routes.py | 67 +++++++++++++++++++++++++------------------------------ 1 file changed, 30 insertions(+), 37 deletions(-) diff --git a/routes.py b/routes.py index 26c5aab..6279c62 100644 --- a/routes.py +++ b/routes.py @@ -4,57 +4,50 @@ @app.before_request def limit_remote_addr(): - if 'X-Forwarded-For' in request.headers: - remote_addr = request.headers['X-Forwarded-For'].split(',')[0] - else: - remote_addr = request.remote_addr - - if request.endpoint == 'admin' and remote_addr not in app.config['ALLOWED_IPS']: - abort(403) + if 'X-Forwarded-For' in request.headers: + remote_addr = request.headers['X-Forwarded-For'].split(',')[0] + else: + remote_addr = request.remote_addr + + if request.endpoint == 'admin' and remote_addr not in app.config['ALLOWED_IPS']: + abort(403) @app.route('/') def home(): - return render_template('subscribe.html') + return render_template('subscribe.html') @app.route('/admin') def admin(): - return render_template('admin.html') + return render_template('admin.html') @app.route('/subscribe', methods=['POST']) def subscribe(): - first_name = request.form['firstname'] - last_name = request.form['lastname'] - email = request.form['email'] + first_name = request.form['firstname'] + last_name = request.form['lastname'] + email = request.form['email'] - if db.subscribers.find_one({'email': email}): - return """ -
+ if db.users.find_one({'email': email}): + return """ +
This email is already subscribed! -
- """, 409 +
+ """, 409 - db.subscribers.insert_one({'firstname': first_name, 'lastname': last_name, 'email': email, 'subscribed': True}) - return """ -
- Subscribed successfully! -
- """, 200 + db.users.insert_one({'firstname': first_name, 'lastname': last_name, 'email': email, 'subscribed': True}) + return """ +
+ Subscribed successfully! +
+ """, 200 @app.route('/send-newsletters', methods=['POST']) def send_newsletters(): - title = request.form['title'] - body = request.form['body'] - subscribers = list(db.subscribers.find({'subscribed': True})) - - for subscriber in subscribers: - subscriber['_id'] = str(subscriber['_id']) - - send_emails.apply_async(args=[subscribers, title, body]) - return jsonify({'message': 'Emails are being sent!'}), 202 - - - - - + title = request.form['title'] + body = request.form['body'] + subscribers = list(db.users.find({'subscribed': True})) + for subscriber in subscribers: + subscriber['_id'] = str(subscriber['_id']) + send_emails.apply_async(args=[subscribers, title, body]) + return jsonify({'message': 'Emails are being sent!'}), 202 From 13de15eb1746b2305502017579632899ffef5229 Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:33:50 -0400 Subject: [PATCH 4/9] Update admin.html --- templates/admin.html | 63 ++++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/templates/admin.html b/templates/admin.html index 78a8043..b063621 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -1,48 +1,47 @@ - - - Admin - Send Newsletter - + + + Admin - Send Newsletter + -

Send Newsletter

-
- - -
- - -
- -
-
- - + }); + From da8a1d532e50f12b261df57538b665f2832319d5 Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:34:15 -0400 Subject: [PATCH 5/9] Update subscribe.html --- templates/subscribe.html | 81 +++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/templates/subscribe.html b/templates/subscribe.html index adc87ec..b5a17b6 100644 --- a/templates/subscribe.html +++ b/templates/subscribe.html @@ -1,58 +1,53 @@ - - - Subscribe to Newsletter - + + + Subscribe to Newsletter + -

Subscribe to our Newsletter

-
- - -
- - -
- - -
- -
-
- -
- Made with ❤️ © 2024 Mercy -
- - + }); + From 1c4a3bf0815da6db647c0c3428e574683ef48a3c Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:34:35 -0400 Subject: [PATCH 6/9] Update styles.css --- static/styles.css | 97 +++++++++++++++++++++++------------------------ 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/static/styles.css b/static/styles.css index 3921b1a..d3774f7 100644 --- a/static/styles.css +++ b/static/styles.css @@ -1,78 +1,75 @@ -@import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap'); - body { - font-family: "Nunito", sans-serif; - font-optical-sizing: auto; - font-weight: 300; - font-style: normal; - margin: 0; - padding: 0; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - height: 100vh; - background-color: #040100; + font-family: system-ui; + font-optical-sizing: auto; + font-weight: 300; + font-style: normal; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; + background-color: #040100; } h1 { - color: white; + color: white; } form { - background: #DB4918; - padding: 30px 40px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - width: 100%; - max-width: 400px; - margin: 20px 0; + background: #023430; + padding: 30px 40px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 400px; + margin: 20px 0; } label { - display: block; - margin-bottom: 8px; - font-weight: bold; - color: white; + display: block; + margin-bottom: 8px; + font-weight: bold; + color: white; } input[type="text"], input[type="email"], textarea { - width: 100%; - padding: 10px; - margin-bottom: 10px; - border: 1px solid #ccc; - border-radius: 4px; - font-size: 16px; + width: 100%; + padding: 10px; + margin-bottom: 10px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 16px; } button { - background: #DB8218; - color: white; - padding: 10px 20px; - border: none; - border-radius: 4px; - cursor: pointer; - font-size: 16px; - font-family: "Nunito", sans-serif; + background: #00ED64; + color: white; + padding: 10px 20px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 16px; + font-family: "Nunito", sans-serif; } button:hover { - background: #DB6B18; + background: #00684A; } #response { - margin-top: 20px; - font-size: 16px; - color: #28a745; + margin-top: 20px; + font-size: 16px; + color: #28a745; } footer { - text-align: center; - padding: 20px; - margin-top: 20px; - font-size: 16px; - color: #666; + text-align: center; + padding: 20px; + margin-top: 20px; + font-size: 16px; + color: #666; } - From 9ce7beb300abf787a150b89fc555888775944c6b Mon Sep 17 00:00:00 2001 From: Rachel Mackintosh <148898879+rachel-mack@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:37:37 -0400 Subject: [PATCH 7/9] remove unnecessary meta data --- .venv/bin/Activate.ps1 | 247 - .venv/bin/activate | 69 - .venv/bin/activate.csh | 26 - .venv/bin/activate.fish | 69 - .venv/bin/celery | 8 - .venv/bin/flask | 8 - .venv/bin/pip | 8 - .venv/bin/pip3 | 8 - .venv/bin/pip3.10 | 8 - .venv/bin/python | 1 - .venv/bin/python3 | 1 - .venv/bin/python3.10 | 1 - .../MarkupSafe-2.1.5.dist-info/INSTALLER | 1 - .../MarkupSafe-2.1.5.dist-info/LICENSE.rst | 28 - .../MarkupSafe-2.1.5.dist-info/METADATA | 93 - .../MarkupSafe-2.1.5.dist-info/RECORD | 14 - .../MarkupSafe-2.1.5.dist-info/WHEEL | 6 - .../MarkupSafe-2.1.5.dist-info/top_level.txt | 1 - .../__pycache__/six.cpython-310.pyc | Bin 27560 -> 0 bytes .../site-packages/_distutils_hack/__init__.py | 132 - .../__pycache__/__init__.cpython-310.pyc | Bin 5104 -> 0 bytes .../__pycache__/override.cpython-310.pyc | Bin 229 -> 0 bytes .../site-packages/_distutils_hack/override.py | 1 - .../amqp-5.2.0.dist-info/INSTALLER | 1 - .../amqp-5.2.0.dist-info/LICENSE | 47 - .../amqp-5.2.0.dist-info/METADATA | 241 - .../site-packages/amqp-5.2.0.dist-info/RECORD | 34 - .../site-packages/amqp-5.2.0.dist-info/WHEEL | 5 - .../amqp-5.2.0.dist-info/top_level.txt | 1 - .../python3.10/site-packages/amqp/__init__.py | 75 - .../amqp/__pycache__/__init__.cpython-310.pyc | Bin 1844 -> 0 bytes .../abstract_channel.cpython-310.pyc | Bin 3979 -> 0 bytes .../__pycache__/basic_message.cpython-310.pyc | Bin 2962 -> 0 bytes .../amqp/__pycache__/channel.cpython-310.pyc | Bin 62867 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 19726 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 8513 -> 0 bytes .../method_framing.cpython-310.pyc | Bin 4025 -> 0 bytes .../amqp/__pycache__/platform.cpython-310.pyc | Bin 1574 -> 0 bytes .../amqp/__pycache__/protocol.cpython-310.pyc | Bin 422 -> 0 bytes .../amqp/__pycache__/sasl.cpython-310.pyc | Bin 6029 -> 0 bytes .../__pycache__/serialization.cpython-310.pyc | Bin 11561 -> 0 bytes .../amqp/__pycache__/spec.cpython-310.pyc | Bin 3257 -> 0 bytes .../__pycache__/transport.cpython-310.pyc | Bin 17045 -> 0 bytes .../amqp/__pycache__/utils.cpython-310.pyc | Bin 1701 -> 0 bytes .../site-packages/amqp/abstract_channel.py | 163 - .../site-packages/amqp/basic_message.py | 122 - .../python3.10/site-packages/amqp/channel.py | 2127 -------- .../site-packages/amqp/connection.py | 784 --- .../site-packages/amqp/exceptions.py | 288 -- .../site-packages/amqp/method_framing.py | 189 - .../python3.10/site-packages/amqp/platform.py | 79 - .../python3.10/site-packages/amqp/protocol.py | 12 - .../lib/python3.10/site-packages/amqp/sasl.py | 191 - .../site-packages/amqp/serialization.py | 582 --- .../lib/python3.10/site-packages/amqp/spec.py | 121 - .../site-packages/amqp/transport.py | 676 --- .../python3.10/site-packages/amqp/utils.py | 64 - .../billiard-4.2.0.dist-info/INSTALLER | 1 - .../billiard-4.2.0.dist-info/LICENSE.txt | 29 - .../billiard-4.2.0.dist-info/METADATA | 111 - .../billiard-4.2.0.dist-info/RECORD | 62 - .../billiard-4.2.0.dist-info/WHEEL | 5 - .../billiard-4.2.0.dist-info/top_level.txt | 1 - .../site-packages/billiard/__init__.py | 60 - .../__pycache__/__init__.cpython-310.pyc | Bin 1183 -> 0 bytes .../billiard/__pycache__/_ext.cpython-310.pyc | Bin 979 -> 0 bytes .../billiard/__pycache__/_win.cpython-310.pyc | Bin 2790 -> 0 bytes .../__pycache__/common.cpython-310.pyc | Bin 3490 -> 0 bytes .../__pycache__/compat.cpython-310.pyc | Bin 7626 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 26821 -> 0 bytes .../__pycache__/context.cpython-310.pyc | Bin 13471 -> 0 bytes .../__pycache__/einfo.cpython-310.pyc | Bin 6078 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 2287 -> 0 bytes .../__pycache__/forkserver.cpython-310.pyc | Bin 6919 -> 0 bytes .../billiard/__pycache__/heap.cpython-310.pyc | Bin 6829 -> 0 bytes .../__pycache__/managers.cpython-310.pyc | Bin 33105 -> 0 bytes .../billiard/__pycache__/pool.cpython-310.pyc | Bin 55484 -> 0 bytes .../__pycache__/popen_fork.cpython-310.pyc | Bin 2456 -> 0 bytes .../popen_forkserver.cpython-310.pyc | Bin 2276 -> 0 bytes .../popen_spawn_posix.cpython-310.pyc | Bin 2312 -> 0 bytes .../popen_spawn_win32.cpython-310.pyc | Bin 3380 -> 0 bytes .../__pycache__/process.cpython-310.pyc | Bin 10401 -> 0 bytes .../__pycache__/queues.cpython-310.pyc | Bin 11481 -> 0 bytes .../__pycache__/reduction.cpython-310.pyc | Bin 8526 -> 0 bytes .../resource_sharer.cpython-310.pyc | Bin 5331 -> 0 bytes .../semaphore_tracker.cpython-310.pyc | Bin 3755 -> 0 bytes .../__pycache__/sharedctypes.cpython-310.pyc | Bin 7412 -> 0 bytes .../__pycache__/spawn.cpython-310.pyc | Bin 8983 -> 0 bytes .../__pycache__/synchronize.cpython-310.pyc | Bin 12155 -> 0 bytes .../billiard/__pycache__/util.cpython-310.pyc | Bin 5429 -> 0 bytes .../python3.10/site-packages/billiard/_ext.py | 32 - .../python3.10/site-packages/billiard/_win.py | 114 - .../site-packages/billiard/common.py | 157 - .../site-packages/billiard/compat.py | 279 -- .../site-packages/billiard/connection.py | 1034 ---- .../site-packages/billiard/context.py | 420 -- .../site-packages/billiard/dummy/__init__.py | 166 - .../__pycache__/__init__.cpython-310.pyc | Bin 4113 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 2365 -> 0 bytes .../billiard/dummy/connection.py | 92 - .../site-packages/billiard/einfo.py | 192 - .../site-packages/billiard/exceptions.py | 52 - .../site-packages/billiard/forkserver.py | 264 - .../python3.10/site-packages/billiard/heap.py | 285 -- .../site-packages/billiard/managers.py | 1210 ----- .../python3.10/site-packages/billiard/pool.py | 2052 -------- .../site-packages/billiard/popen_fork.py | 89 - .../billiard/popen_forkserver.py | 68 - .../billiard/popen_spawn_posix.py | 74 - .../billiard/popen_spawn_win32.py | 121 - .../site-packages/billiard/process.py | 400 -- .../site-packages/billiard/queues.py | 403 -- .../site-packages/billiard/reduction.py | 293 -- .../site-packages/billiard/resource_sharer.py | 162 - .../billiard/semaphore_tracker.py | 146 - .../site-packages/billiard/sharedctypes.py | 258 - .../site-packages/billiard/spawn.py | 389 -- .../site-packages/billiard/synchronize.py | 436 -- .../python3.10/site-packages/billiard/util.py | 232 - .../blinker-1.8.2.dist-info/INSTALLER | 1 - .../blinker-1.8.2.dist-info/LICENSE.txt | 20 - .../blinker-1.8.2.dist-info/METADATA | 60 - .../blinker-1.8.2.dist-info/RECORD | 12 - .../blinker-1.8.2.dist-info/WHEEL | 4 - .../site-packages/blinker/__init__.py | 60 - .../__pycache__/__init__.cpython-310.pyc | Bin 1502 -> 0 bytes .../__pycache__/_utilities.cpython-310.pyc | Bin 2166 -> 0 bytes .../blinker/__pycache__/base.cpython-310.pyc | Bin 20406 -> 0 bytes .../site-packages/blinker/_utilities.py | 64 - .../python3.10/site-packages/blinker/base.py | 621 --- .../python3.10/site-packages/blinker/py.typed | 0 .../python3.10/site-packages/bson/__init__.py | 1464 ------ .../bson/__pycache__/__init__.cpython-310.pyc | Bin 41056 -> 0 bytes .../bson/__pycache__/_helpers.cpython-310.pyc | Bin 1176 -> 0 bytes .../bson/__pycache__/binary.cpython-310.pyc | Bin 7085 -> 0 bytes .../bson/__pycache__/code.cpython-310.pyc | Bin 3152 -> 0 bytes .../__pycache__/codec_options.cpython-310.pyc | Bin 17398 -> 0 bytes .../__pycache__/datetime_ms.cpython-310.pyc | Bin 6095 -> 0 bytes .../bson/__pycache__/dbref.cpython-310.pyc | Bin 4759 -> 0 bytes .../__pycache__/decimal128.cpython-310.pyc | Bin 9767 -> 0 bytes .../bson/__pycache__/errors.cpython-310.pyc | Bin 1202 -> 0 bytes .../bson/__pycache__/int64.cpython-310.pyc | Bin 1144 -> 0 bytes .../__pycache__/json_util.cpython-310.pyc | Bin 32735 -> 0 bytes .../bson/__pycache__/max_key.cpython-310.pyc | Bin 1947 -> 0 bytes .../bson/__pycache__/min_key.cpython-310.pyc | Bin 1947 -> 0 bytes .../bson/__pycache__/objectid.cpython-310.pyc | Bin 9054 -> 0 bytes .../bson/__pycache__/raw_bson.cpython-310.pyc | Bin 7246 -> 0 bytes .../bson/__pycache__/regex.cpython-310.pyc | Bin 4585 -> 0 bytes .../bson/__pycache__/son.cpython-310.pyc | Bin 7274 -> 0 bytes .../__pycache__/timestamp.cpython-310.pyc | Bin 4267 -> 0 bytes .../bson/__pycache__/typings.cpython-310.pyc | Bin 709 -> 0 bytes .../bson/__pycache__/tz_util.cpython-310.pyc | Bin 1884 -> 0 bytes .../_cbson.cpython-310-x86_64-linux-gnu.so | Bin 321848 -> 0 bytes .../site-packages/bson/_cbsonmodule.c | 3164 ------------ .../site-packages/bson/_cbsonmodule.h | 181 - .../python3.10/site-packages/bson/_helpers.py | 43 - .../python3.10/site-packages/bson/binary.py | 367 -- .../site-packages/bson/bson-endian.h | 233 - .../python3.10/site-packages/bson/buffer.c | 157 - .../python3.10/site-packages/bson/buffer.h | 51 - .../lib/python3.10/site-packages/bson/code.py | 100 - .../site-packages/bson/codec_options.py | 505 -- .../site-packages/bson/datetime_ms.py | 171 - .../python3.10/site-packages/bson/dbref.py | 133 - .../site-packages/bson/decimal128.py | 312 -- .../python3.10/site-packages/bson/errors.py | 36 - .../python3.10/site-packages/bson/int64.py | 39 - .../site-packages/bson/json_util.py | 1161 ----- .../python3.10/site-packages/bson/max_key.py | 56 - .../python3.10/site-packages/bson/min_key.py | 56 - .../python3.10/site-packages/bson/objectid.py | 278 -- .../python3.10/site-packages/bson/py.typed | 2 - .../python3.10/site-packages/bson/raw_bson.py | 196 - .../python3.10/site-packages/bson/regex.py | 133 - .../lib/python3.10/site-packages/bson/son.py | 211 - .../python3.10/site-packages/bson/time64.c | 781 --- .../python3.10/site-packages/bson/time64.h | 67 - .../site-packages/bson/time64_config.h | 78 - .../site-packages/bson/time64_limits.h | 95 - .../site-packages/bson/timestamp.py | 123 - .../python3.10/site-packages/bson/typings.py | 31 - .../python3.10/site-packages/bson/tz_util.py | 53 - .../celery-5.4.0.dist-info/INSTALLER | 1 - .../celery-5.4.0.dist-info/LICENSE | 55 - .../celery-5.4.0.dist-info/METADATA | 668 --- .../celery-5.4.0.dist-info/RECORD | 326 -- .../celery-5.4.0.dist-info/REQUESTED | 0 .../celery-5.4.0.dist-info/WHEEL | 5 - .../celery-5.4.0.dist-info/entry_points.txt | 2 - .../celery-5.4.0.dist-info/top_level.txt | 1 - .../site-packages/celery/__init__.py | 172 - .../site-packages/celery/__main__.py | 19 - .../__pycache__/__init__.cpython-310.pyc | Bin 4459 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 650 -> 0 bytes .../celery/__pycache__/_state.cpython-310.pyc | Bin 4605 -> 0 bytes .../celery/__pycache__/beat.cpython-310.pyc | Bin 23475 -> 0 bytes .../__pycache__/bootsteps.cpython-310.pyc | Bin 14210 -> 0 bytes .../celery/__pycache__/canvas.cpython-310.pyc | Bin 70240 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 11184 -> 0 bytes .../celery/__pycache__/local.cpython-310.pyc | Bin 17408 -> 0 bytes .../__pycache__/platforms.cpython-310.pyc | Bin 24504 -> 0 bytes .../celery/__pycache__/result.cpython-310.pyc | Bin 38604 -> 0 bytes .../__pycache__/schedules.cpython-310.pyc | Bin 28549 -> 0 bytes .../__pycache__/signals.cpython-310.pyc | Bin 2695 -> 0 bytes .../celery/__pycache__/states.cpython-310.pyc | Bin 3023 -> 0 bytes .../python3.10/site-packages/celery/_state.py | 197 - .../site-packages/celery/app/__init__.py | 76 - .../app/__pycache__/__init__.cpython-310.pyc | Bin 2722 -> 0 bytes .../app/__pycache__/amqp.cpython-310.pyc | Bin 16457 -> 0 bytes .../__pycache__/annotations.cpython-310.pyc | Bin 2128 -> 0 bytes .../app/__pycache__/autoretry.cpython-310.pyc | Bin 1627 -> 0 bytes .../app/__pycache__/backends.cpython-310.pyc | Bin 2721 -> 0 bytes .../app/__pycache__/base.cpython-310.pyc | Bin 43925 -> 0 bytes .../app/__pycache__/builtins.cpython-310.pyc | Bin 7141 -> 0 bytes .../app/__pycache__/control.cpython-310.pyc | Bin 28510 -> 0 bytes .../app/__pycache__/defaults.cpython-310.pyc | Bin 12332 -> 0 bytes .../app/__pycache__/events.cpython-310.pyc | Bin 1761 -> 0 bytes .../app/__pycache__/log.cpython-310.pyc | Bin 7620 -> 0 bytes .../app/__pycache__/registry.cpython-310.pyc | Bin 2765 -> 0 bytes .../app/__pycache__/routes.cpython-310.pyc | Bin 4114 -> 0 bytes .../app/__pycache__/task.cpython-310.pyc | Bin 32887 -> 0 bytes .../app/__pycache__/trace.cpython-310.pyc | Bin 16729 -> 0 bytes .../app/__pycache__/utils.cpython-310.pyc | Bin 13009 -> 0 bytes .../site-packages/celery/app/amqp.py | 615 --- .../site-packages/celery/app/annotations.py | 52 - .../site-packages/celery/app/autoretry.py | 66 - .../site-packages/celery/app/backends.py | 69 - .../site-packages/celery/app/base.py | 1376 ------ .../site-packages/celery/app/builtins.py | 187 - .../site-packages/celery/app/control.py | 779 --- .../site-packages/celery/app/defaults.py | 421 -- .../site-packages/celery/app/events.py | 40 - .../site-packages/celery/app/log.py | 247 - .../site-packages/celery/app/registry.py | 68 - .../site-packages/celery/app/routes.py | 136 - .../site-packages/celery/app/task.py | 1154 ----- .../site-packages/celery/app/trace.py | 739 --- .../site-packages/celery/app/utils.py | 415 -- .../site-packages/celery/apps/__init__.py | 0 .../apps/__pycache__/__init__.cpython-310.pyc | Bin 174 -> 0 bytes .../apps/__pycache__/beat.cpython-310.pyc | Bin 5575 -> 0 bytes .../apps/__pycache__/multi.cpython-310.pyc | Bin 16758 -> 0 bytes .../apps/__pycache__/worker.cpython-310.pyc | Bin 12463 -> 0 bytes .../site-packages/celery/apps/beat.py | 160 - .../site-packages/celery/apps/multi.py | 506 -- .../site-packages/celery/apps/worker.py | 389 -- .../site-packages/celery/backends/__init__.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 206 -> 0 bytes .../__pycache__/arangodb.cpython-310.pyc | Bin 5055 -> 0 bytes .../__pycache__/asynchronous.cpython-310.pyc | Bin 11805 -> 0 bytes .../azureblockblob.cpython-310.pyc | Bin 5142 -> 0 bytes .../backends/__pycache__/base.cpython-310.pyc | Bin 33153 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 5834 -> 0 bytes .../__pycache__/cassandra.cpython-310.pyc | Bin 6149 -> 0 bytes .../__pycache__/consul.cpython-310.pyc | Bin 3669 -> 0 bytes .../__pycache__/cosmosdbsql.cpython-310.pyc | Bin 6561 -> 0 bytes .../__pycache__/couchbase.cpython-310.pyc | Bin 3296 -> 0 bytes .../__pycache__/couchdb.cpython-310.pyc | Bin 3185 -> 0 bytes .../__pycache__/dynamodb.cpython-310.pyc | Bin 12204 -> 0 bytes .../__pycache__/elasticsearch.cpython-310.pyc | Bin 7444 -> 0 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 4253 -> 0 bytes .../backends/__pycache__/gcs.cpython-310.pyc | Bin 4605 -> 0 bytes .../__pycache__/mongodb.cpython-310.pyc | Bin 8880 -> 0 bytes .../__pycache__/redis.cpython-310.pyc | Bin 20516 -> 0 bytes .../backends/__pycache__/rpc.cpython-310.pyc | Bin 10889 -> 0 bytes .../backends/__pycache__/s3.cpython-310.pyc | Bin 2937 -> 0 bytes .../site-packages/celery/backends/arangodb.py | 190 - .../celery/backends/asynchronous.py | 333 -- .../celery/backends/azureblockblob.py | 165 - .../site-packages/celery/backends/base.py | 1110 ----- .../site-packages/celery/backends/cache.py | 163 - .../celery/backends/cassandra.py | 256 - .../site-packages/celery/backends/consul.py | 116 - .../celery/backends/cosmosdbsql.py | 218 - .../celery/backends/couchbase.py | 114 - .../site-packages/celery/backends/couchdb.py | 99 - .../celery/backends/database/__init__.py | 222 - .../__pycache__/__init__.cpython-310.pyc | Bin 7044 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 3639 -> 0 bytes .../__pycache__/session.cpython-310.pyc | Bin 2881 -> 0 bytes .../celery/backends/database/models.py | 108 - .../celery/backends/database/session.py | 89 - .../site-packages/celery/backends/dynamodb.py | 547 --- .../celery/backends/elasticsearch.py | 283 -- .../celery/backends/filesystem.py | 112 - .../site-packages/celery/backends/gcs.py | 141 - .../site-packages/celery/backends/mongodb.py | 333 -- .../site-packages/celery/backends/redis.py | 668 --- .../site-packages/celery/backends/rpc.py | 342 -- .../site-packages/celery/backends/s3.py | 87 - .../python3.10/site-packages/celery/beat.py | 736 --- .../site-packages/celery/bin/__init__.py | 0 .../bin/__pycache__/__init__.cpython-310.pyc | Bin 173 -> 0 bytes .../bin/__pycache__/amqp.cpython-310.pyc | Bin 6895 -> 0 bytes .../bin/__pycache__/base.cpython-310.pyc | Bin 10795 -> 0 bytes .../bin/__pycache__/beat.cpython-310.pyc | Bin 2219 -> 0 bytes .../bin/__pycache__/call.cpython-310.pyc | Bin 1667 -> 0 bytes .../bin/__pycache__/celery.cpython-310.pyc | Bin 6254 -> 0 bytes .../bin/__pycache__/control.cpython-310.pyc | Bin 6262 -> 0 bytes .../bin/__pycache__/events.cpython-310.pyc | Bin 2579 -> 0 bytes .../bin/__pycache__/graph.cpython-310.pyc | Bin 7464 -> 0 bytes .../bin/__pycache__/list.cpython-310.pyc | Bin 1399 -> 0 bytes .../bin/__pycache__/logtool.cpython-310.pyc | Bin 4859 -> 0 bytes .../bin/__pycache__/migrate.cpython-310.pyc | Bin 1809 -> 0 bytes .../bin/__pycache__/multi.cpython-310.pyc | Bin 17881 -> 0 bytes .../bin/__pycache__/purge.cpython-310.pyc | Bin 2370 -> 0 bytes .../bin/__pycache__/result.cpython-310.pyc | Bin 1014 -> 0 bytes .../bin/__pycache__/shell.cpython-310.pyc | Bin 4516 -> 0 bytes .../bin/__pycache__/upgrade.cpython-310.pyc | Bin 3392 -> 0 bytes .../bin/__pycache__/worker.cpython-310.pyc | Bin 9011 -> 0 bytes .../site-packages/celery/bin/amqp.py | 312 -- .../site-packages/celery/bin/base.py | 305 -- .../site-packages/celery/bin/beat.py | 72 - .../site-packages/celery/bin/call.py | 71 - .../site-packages/celery/bin/celery.py | 236 - .../site-packages/celery/bin/control.py | 252 - .../site-packages/celery/bin/events.py | 94 - .../site-packages/celery/bin/graph.py | 197 - .../site-packages/celery/bin/list.py | 38 - .../site-packages/celery/bin/logtool.py | 157 - .../site-packages/celery/bin/migrate.py | 63 - .../site-packages/celery/bin/multi.py | 480 -- .../site-packages/celery/bin/purge.py | 70 - .../site-packages/celery/bin/result.py | 30 - .../site-packages/celery/bin/shell.py | 173 - .../site-packages/celery/bin/upgrade.py | 91 - .../site-packages/celery/bin/worker.py | 360 -- .../site-packages/celery/bootsteps.py | 415 -- .../python3.10/site-packages/celery/canvas.py | 2414 --------- .../celery/concurrency/__init__.py | 48 - .../__pycache__/__init__.cpython-310.pyc | Bin 1191 -> 0 bytes .../__pycache__/asynpool.cpython-310.pyc | Bin 34765 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 5847 -> 0 bytes .../__pycache__/eventlet.cpython-310.pyc | Bin 6001 -> 0 bytes .../__pycache__/gevent.cpython-310.pyc | Bin 4055 -> 0 bytes .../__pycache__/prefork.cpython-310.pyc | Bin 5504 -> 0 bytes .../__pycache__/solo.cpython-310.pyc | Bin 1204 -> 0 bytes .../__pycache__/thread.cpython-310.pyc | Bin 2619 -> 0 bytes .../celery/concurrency/asynpool.py | 1360 ----- .../site-packages/celery/concurrency/base.py | 180 - .../celery/concurrency/eventlet.py | 181 - .../celery/concurrency/gevent.py | 122 - .../celery/concurrency/prefork.py | 172 - .../site-packages/celery/concurrency/solo.py | 31 - .../celery/concurrency/thread.py | 64 - .../site-packages/celery/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 177 -> 0 bytes .../__pycache__/abortable.cpython-310.pyc | Bin 5277 -> 0 bytes .../__pycache__/migrate.cpython-310.pyc | Bin 13260 -> 0 bytes .../__pycache__/pytest.cpython-310.pyc | Bin 5521 -> 0 bytes .../contrib/__pycache__/rdb.cpython-310.pyc | Bin 5264 -> 0 bytes .../__pycache__/sphinx.cpython-310.pyc | Bin 3558 -> 0 bytes .../site-packages/celery/contrib/abortable.py | 165 - .../celery/contrib/django/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 184 -> 0 bytes .../django/__pycache__/task.cpython-310.pyc | Bin 1141 -> 0 bytes .../celery/contrib/django/task.py | 21 - .../site-packages/celery/contrib/migrate.py | 416 -- .../site-packages/celery/contrib/pytest.py | 216 - .../site-packages/celery/contrib/rdb.py | 187 - .../site-packages/celery/contrib/sphinx.py | 105 - .../celery/contrib/testing/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 185 -> 0 bytes .../testing/__pycache__/app.cpython-310.pyc | Bin 3389 -> 0 bytes .../__pycache__/manager.cpython-310.pyc | Bin 9302 -> 0 bytes .../testing/__pycache__/mocks.cpython-310.pyc | Bin 3637 -> 0 bytes .../testing/__pycache__/tasks.cpython-310.pyc | Bin 452 -> 0 bytes .../__pycache__/worker.cpython-310.pyc | Bin 6342 -> 0 bytes .../celery/contrib/testing/app.py | 112 - .../celery/contrib/testing/manager.py | 239 - .../celery/contrib/testing/mocks.py | 137 - .../celery/contrib/testing/tasks.py | 9 - .../celery/contrib/testing/worker.py | 219 - .../site-packages/celery/events/__init__.py | 15 - .../__pycache__/__init__.cpython-310.pyc | Bin 650 -> 0 bytes .../__pycache__/cursesmon.cpython-310.pyc | Bin 15404 -> 0 bytes .../__pycache__/dispatcher.cpython-310.pyc | Bin 8022 -> 0 bytes .../events/__pycache__/dumper.cpython-310.pyc | Bin 3654 -> 0 bytes .../events/__pycache__/event.cpython-310.pyc | Bin 1746 -> 0 bytes .../__pycache__/receiver.cpython-310.pyc | Bin 4774 -> 0 bytes .../__pycache__/snapshot.cpython-310.pyc | Bin 4001 -> 0 bytes .../events/__pycache__/state.cpython-310.pyc | Bin 21906 -> 0 bytes .../site-packages/celery/events/cursesmon.py | 534 -- .../site-packages/celery/events/dispatcher.py | 229 - .../site-packages/celery/events/dumper.py | 103 - .../site-packages/celery/events/event.py | 63 - .../site-packages/celery/events/receiver.py | 135 - .../site-packages/celery/events/snapshot.py | 111 - .../site-packages/celery/events/state.py | 730 --- .../site-packages/celery/exceptions.py | 312 -- .../site-packages/celery/fixups/__init__.py | 1 - .../__pycache__/__init__.cpython-310.pyc | Bin 195 -> 0 bytes .../fixups/__pycache__/django.cpython-310.pyc | Bin 7994 -> 0 bytes .../site-packages/celery/fixups/django.py | 216 - .../site-packages/celery/loaders/__init__.py | 18 - .../__pycache__/__init__.cpython-310.pyc | Bin 716 -> 0 bytes .../loaders/__pycache__/app.cpython-310.pyc | Bin 516 -> 0 bytes .../loaders/__pycache__/base.cpython-310.pyc | Bin 8885 -> 0 bytes .../__pycache__/default.cpython-310.pyc | Bin 1601 -> 0 bytes .../site-packages/celery/loaders/app.py | 8 - .../site-packages/celery/loaders/base.py | 278 -- .../site-packages/celery/loaders/default.py | 42 - .../python3.10/site-packages/celery/local.py | 543 -- .../site-packages/celery/platforms.py | 831 ---- .../python3.10/site-packages/celery/result.py | 1090 ---- .../site-packages/celery/schedules.py | 865 ---- .../site-packages/celery/security/__init__.py | 74 - .../__pycache__/__init__.cpython-310.pyc | Bin 2282 -> 0 bytes .../__pycache__/certificate.cpython-310.pyc | Bin 5561 -> 0 bytes .../security/__pycache__/key.cpython-310.pyc | Bin 1566 -> 0 bytes .../__pycache__/serialization.cpython-310.pyc | Bin 3558 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 1129 -> 0 bytes .../celery/security/certificate.py | 113 - .../site-packages/celery/security/key.py | 35 - .../celery/security/serialization.py | 101 - .../site-packages/celery/security/utils.py | 28 - .../site-packages/celery/signals.py | 154 - .../python3.10/site-packages/celery/states.py | 151 - .../site-packages/celery/utils/__init__.py | 37 - .../__pycache__/__init__.cpython-310.pyc | Bin 927 -> 0 bytes .../__pycache__/abstract.cpython-310.pyc | Bin 5026 -> 0 bytes .../__pycache__/collections.cpython-310.pyc | Bin 27484 -> 0 bytes .../utils/__pycache__/debug.cpython-310.pyc | Bin 5171 -> 0 bytes .../__pycache__/deprecated.cpython-310.pyc | Bin 4135 -> 0 bytes .../__pycache__/functional.cpython-310.pyc | Bin 13113 -> 0 bytes .../utils/__pycache__/graph.cpython-310.pyc | Bin 11528 -> 0 bytes .../utils/__pycache__/imports.cpython-310.pyc | Bin 4520 -> 0 bytes .../utils/__pycache__/iso8601.cpython-310.pyc | Bin 2849 -> 0 bytes .../utils/__pycache__/log.cpython-310.pyc | Bin 8120 -> 0 bytes .../__pycache__/nodenames.cpython-310.pyc | Bin 3400 -> 0 bytes .../utils/__pycache__/objects.cpython-310.pyc | Bin 5029 -> 0 bytes .../__pycache__/saferepr.cpython-310.pyc | Bin 6112 -> 0 bytes .../__pycache__/serialization.cpython-310.pyc | Bin 8038 -> 0 bytes .../utils/__pycache__/sysinfo.cpython-310.pyc | Bin 2185 -> 0 bytes .../utils/__pycache__/term.cpython-310.pyc | Bin 6705 -> 0 bytes .../utils/__pycache__/text.cpython-310.pyc | Bin 7551 -> 0 bytes .../utils/__pycache__/threads.cpython-310.pyc | Bin 10631 -> 0 bytes .../utils/__pycache__/time.cpython-310.pyc | Bin 15934 -> 0 bytes .../utils/__pycache__/timer2.cpython-310.pyc | Bin 5064 -> 0 bytes .../site-packages/celery/utils/abstract.py | 146 - .../site-packages/celery/utils/collections.py | 863 ---- .../site-packages/celery/utils/debug.py | 193 - .../site-packages/celery/utils/deprecated.py | 113 - .../celery/utils/dispatch/__init__.py | 4 - .../__pycache__/__init__.cpython-310.pyc | Bin 270 -> 0 bytes .../__pycache__/signal.cpython-310.pyc | Bin 10844 -> 0 bytes .../celery/utils/dispatch/signal.py | 354 -- .../site-packages/celery/utils/functional.py | 402 -- .../site-packages/celery/utils/graph.py | 309 -- .../site-packages/celery/utils/imports.py | 168 - .../site-packages/celery/utils/iso8601.py | 76 - .../site-packages/celery/utils/log.py | 295 -- .../site-packages/celery/utils/nodenames.py | 114 - .../site-packages/celery/utils/objects.py | 142 - .../site-packages/celery/utils/saferepr.py | 269 - .../celery/utils/serialization.py | 273 -- .../celery/utils/static/__init__.py | 14 - .../__pycache__/__init__.cpython-310.pyc | Bin 576 -> 0 bytes .../celery/utils/static/celery_128.png | Bin 2556 -> 0 bytes .../site-packages/celery/utils/sysinfo.py | 50 - .../site-packages/celery/utils/term.py | 180 - .../site-packages/celery/utils/text.py | 198 - .../site-packages/celery/utils/threads.py | 331 -- .../site-packages/celery/utils/time.py | 430 -- .../site-packages/celery/utils/timer2.py | 154 - .../site-packages/celery/worker/__init__.py | 4 - .../__pycache__/__init__.cpython-310.pyc | Bin 275 -> 0 bytes .../__pycache__/autoscale.cpython-310.pyc | Bin 5508 -> 0 bytes .../__pycache__/components.cpython-310.pyc | Bin 8120 -> 0 bytes .../__pycache__/control.cpython-310.pyc | Bin 18874 -> 0 bytes .../__pycache__/heartbeat.cpython-310.pyc | Bin 2205 -> 0 bytes .../worker/__pycache__/loops.cpython-310.pyc | Bin 3242 -> 0 bytes .../worker/__pycache__/pidbox.cpython-310.pyc | Bin 4308 -> 0 bytes .../__pycache__/request.cpython-310.pyc | Bin 20533 -> 0 bytes .../worker/__pycache__/state.cpython-310.pyc | Bin 7699 -> 0 bytes .../__pycache__/strategy.cpython-310.pyc | Bin 5208 -> 0 bytes .../worker/__pycache__/worker.cpython-310.pyc | Bin 13706 -> 0 bytes .../site-packages/celery/worker/autoscale.py | 154 - .../site-packages/celery/worker/components.py | 240 - .../celery/worker/consumer/__init__.py | 15 - .../__pycache__/__init__.cpython-310.pyc | Bin 621 -> 0 bytes .../__pycache__/agent.cpython-310.pyc | Bin 1032 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 1469 -> 0 bytes .../__pycache__/consumer.cpython-310.pyc | Bin 22630 -> 0 bytes .../__pycache__/control.cpython-310.pyc | Bin 1399 -> 0 bytes .../__pycache__/events.cpython-310.pyc | Bin 1989 -> 0 bytes .../__pycache__/gossip.cpython-310.pyc | Bin 6537 -> 0 bytes .../__pycache__/heart.cpython-310.pyc | Bin 1411 -> 0 bytes .../__pycache__/mingle.cpython-310.pyc | Bin 3498 -> 0 bytes .../__pycache__/tasks.cpython-310.pyc | Bin 2234 -> 0 bytes .../celery/worker/consumer/agent.py | 21 - .../celery/worker/consumer/connection.py | 36 - .../celery/worker/consumer/consumer.py | 749 --- .../celery/worker/consumer/control.py | 33 - .../celery/worker/consumer/events.py | 68 - .../celery/worker/consumer/gossip.py | 206 - .../celery/worker/consumer/heart.py | 36 - .../celery/worker/consumer/mingle.py | 76 - .../celery/worker/consumer/tasks.py | 65 - .../site-packages/celery/worker/control.py | 624 --- .../site-packages/celery/worker/heartbeat.py | 61 - .../site-packages/celery/worker/loops.py | 135 - .../site-packages/celery/worker/pidbox.py | 122 - .../site-packages/celery/worker/request.py | 790 --- .../site-packages/celery/worker/state.py | 288 -- .../site-packages/celery/worker/strategy.py | 208 - .../site-packages/celery/worker/worker.py | 409 -- .../click-8.1.7.dist-info/INSTALLER | 1 - .../click-8.1.7.dist-info/LICENSE.rst | 28 - .../click-8.1.7.dist-info/METADATA | 103 - .../click-8.1.7.dist-info/RECORD | 39 - .../site-packages/click-8.1.7.dist-info/WHEEL | 5 - .../click-8.1.7.dist-info/top_level.txt | 1 - .../site-packages/click/__init__.py | 73 - .../__pycache__/__init__.cpython-310.pyc | Bin 2612 -> 0 bytes .../click/__pycache__/_compat.cpython-310.pyc | Bin 15670 -> 0 bytes .../__pycache__/_termui_impl.cpython-310.pyc | Bin 16310 -> 0 bytes .../__pycache__/_textwrap.cpython-310.pyc | Bin 1546 -> 0 bytes .../__pycache__/_winconsole.cpython-310.pyc | Bin 7662 -> 0 bytes .../click/__pycache__/core.cpython-310.pyc | Bin 91140 -> 0 bytes .../__pycache__/decorators.cpython-310.pyc | Bin 17210 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 10254 -> 0 bytes .../__pycache__/formatting.cpython-310.pyc | Bin 9459 -> 0 bytes .../click/__pycache__/globals.cpython-310.pyc | Bin 2431 -> 0 bytes .../click/__pycache__/parser.cpython-310.pyc | Bin 13672 -> 0 bytes .../shell_completion.cpython-310.pyc | Bin 16847 -> 0 bytes .../click/__pycache__/termui.cpython-310.pyc | Bin 26132 -> 0 bytes .../click/__pycache__/testing.cpython-310.pyc | Bin 15205 -> 0 bytes .../click/__pycache__/types.cpython-310.pyc | Bin 33689 -> 0 bytes .../click/__pycache__/utils.cpython-310.pyc | Bin 18845 -> 0 bytes .../python3.10/site-packages/click/_compat.py | 623 --- .../site-packages/click/_termui_impl.py | 739 --- .../site-packages/click/_textwrap.py | 49 - .../site-packages/click/_winconsole.py | 279 -- .../python3.10/site-packages/click/core.py | 3042 ------------ .../site-packages/click/decorators.py | 561 --- .../site-packages/click/exceptions.py | 288 -- .../site-packages/click/formatting.py | 301 -- .../python3.10/site-packages/click/globals.py | 68 - .../python3.10/site-packages/click/parser.py | 529 -- .../python3.10/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 596 --- .../python3.10/site-packages/click/termui.py | 784 --- .../python3.10/site-packages/click/testing.py | 479 -- .../python3.10/site-packages/click/types.py | 1089 ---- .../python3.10/site-packages/click/utils.py | 624 --- .../INSTALLER | 1 - .../click_didyoumean-0.3.1.dist-info/LICENSE | 19 - .../click_didyoumean-0.3.1.dist-info/METADATA | 153 - .../click_didyoumean-0.3.1.dist-info/RECORD | 7 - .../click_didyoumean-0.3.1.dist-info/WHEEL | 4 - .../click_didyoumean/__init__.py | 66 - .../__pycache__/__init__.cpython-310.pyc | Bin 2403 -> 0 bytes .../click_plugins-1.1.1.dist-info/AUTHORS.txt | 5 - .../click_plugins-1.1.1.dist-info/INSTALLER | 1 - .../click_plugins-1.1.1.dist-info/LICENSE.txt | 29 - .../click_plugins-1.1.1.dist-info/METADATA | 210 - .../click_plugins-1.1.1.dist-info/RECORD | 12 - .../click_plugins-1.1.1.dist-info/WHEEL | 6 - .../top_level.txt | 1 - .../click_plugins-1.1.1.dist-info/zip-safe | 1 - .../site-packages/click_plugins/__init__.py | 61 - .../__pycache__/__init__.cpython-310.pyc | Bin 2462 -> 0 bytes .../__pycache__/core.cpython-310.pyc | Bin 2756 -> 0 bytes .../site-packages/click_plugins/core.py | 92 - .../click_repl-0.3.0.dist-info/INSTALLER | 1 - .../click_repl-0.3.0.dist-info/LICENSE | 20 - .../click_repl-0.3.0.dist-info/METADATA | 117 - .../click_repl-0.3.0.dist-info/RECORD | 16 - .../click_repl-0.3.0.dist-info/WHEEL | 5 - .../click_repl-0.3.0.dist-info/top_level.txt | 1 - .../site-packages/click_repl/__init__.py | 11 - .../__pycache__/__init__.cpython-310.pyc | Bin 496 -> 0 bytes .../__pycache__/_completer.cpython-310.pyc | Bin 6217 -> 0 bytes .../__pycache__/_repl.cpython-310.pyc | Bin 3267 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 962 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 5128 -> 0 bytes .../site-packages/click_repl/_completer.py | 296 -- .../site-packages/click_repl/_repl.py | 152 - .../site-packages/click_repl/exceptions.py | 23 - .../site-packages/click_repl/utils.py | 222 - .../site-packages/dateutil/__init__.py | 24 - .../__pycache__/__init__.cpython-310.pyc | Bin 938 -> 0 bytes .../__pycache__/_common.cpython-310.pyc | Bin 1418 -> 0 bytes .../__pycache__/_version.cpython-310.pyc | Bin 272 -> 0 bytes .../__pycache__/easter.cpython-310.pyc | Bin 2202 -> 0 bytes .../__pycache__/relativedelta.cpython-310.pyc | Bin 15732 -> 0 bytes .../__pycache__/rrule.cpython-310.pyc | Bin 43294 -> 0 bytes .../__pycache__/tzwin.cpython-310.pyc | Bin 191 -> 0 bytes .../__pycache__/utils.cpython-310.pyc | Bin 2255 -> 0 bytes .../site-packages/dateutil/_common.py | 43 - .../site-packages/dateutil/_version.py | 4 - .../site-packages/dateutil/easter.py | 89 - .../site-packages/dateutil/parser/__init__.py | 61 - .../__pycache__/__init__.cpython-310.pyc | Bin 2066 -> 0 bytes .../__pycache__/_parser.cpython-310.pyc | Bin 40501 -> 0 bytes .../__pycache__/isoparser.cpython-310.pyc | Bin 11298 -> 0 bytes .../site-packages/dateutil/parser/_parser.py | 1613 ------ .../dateutil/parser/isoparser.py | 416 -- .../site-packages/dateutil/relativedelta.py | 599 --- .../site-packages/dateutil/rrule.py | 1737 ------- .../site-packages/dateutil/tz/__init__.py | 12 - .../tz/__pycache__/__init__.cpython-310.pyc | Bin 664 -> 0 bytes .../tz/__pycache__/_common.cpython-310.pyc | Bin 10750 -> 0 bytes .../tz/__pycache__/_factories.cpython-310.pyc | Bin 2933 -> 0 bytes .../tz/__pycache__/tz.cpython-310.pyc | Bin 44915 -> 0 bytes .../tz/__pycache__/win.cpython-310.pyc | Bin 11428 -> 0 bytes .../site-packages/dateutil/tz/_common.py | 419 -- .../site-packages/dateutil/tz/_factories.py | 80 - .../site-packages/dateutil/tz/tz.py | 1849 ------- .../site-packages/dateutil/tz/win.py | 370 -- .../site-packages/dateutil/tzwin.py | 2 - .../site-packages/dateutil/utils.py | 71 - .../dateutil/zoneinfo/__init__.py | 167 - .../__pycache__/__init__.cpython-310.pyc | Bin 5759 -> 0 bytes .../__pycache__/rebuild.cpython-310.pyc | Bin 2686 -> 0 bytes .../zoneinfo/dateutil-zoneinfo.tar.gz | Bin 156400 -> 0 bytes .../dateutil/zoneinfo/rebuild.py | 75 - .../site-packages/distutils-precedence.pth | 1 - .../python3.10/site-packages/dns/__init__.py | 70 - .../dns/__pycache__/__init__.cpython-310.pyc | Bin 694 -> 0 bytes .../__pycache__/_asyncbackend.cpython-310.pyc | Bin 4141 -> 0 bytes .../_asyncio_backend.cpython-310.pyc | Bin 8998 -> 0 bytes .../dns/__pycache__/_ddr.cpython-310.pyc | Bin 4118 -> 0 bytes .../dns/__pycache__/_features.cpython-310.pyc | Bin 2390 -> 0 bytes .../_immutable_ctx.cpython-310.pyc | Bin 2174 -> 0 bytes .../__pycache__/_trio_backend.cpython-310.pyc | Bin 7531 -> 0 bytes .../__pycache__/asyncbackend.cpython-310.pyc | Bin 2626 -> 0 bytes .../__pycache__/asyncquery.cpython-310.pyc | Bin 17997 -> 0 bytes .../__pycache__/asyncresolver.cpython-310.pyc | Bin 13203 -> 0 bytes .../dns/__pycache__/dnssec.cpython-310.pyc | Bin 32156 -> 0 bytes .../__pycache__/dnssectypes.cpython-310.pyc | Bin 1637 -> 0 bytes .../dns/__pycache__/e164.cpython-310.pyc | Bin 3496 -> 0 bytes .../dns/__pycache__/edns.cpython-310.pyc | Bin 14754 -> 0 bytes .../dns/__pycache__/entropy.cpython-310.pyc | Bin 3386 -> 0 bytes .../dns/__pycache__/enum.cpython-310.pyc | Bin 3268 -> 0 bytes .../dns/__pycache__/exception.cpython-310.pyc | Bin 5630 -> 0 bytes .../dns/__pycache__/flags.cpython-310.pyc | Bin 2183 -> 0 bytes .../dns/__pycache__/grange.cpython-310.pyc | Bin 1154 -> 0 bytes .../dns/__pycache__/immutable.cpython-310.pyc | Bin 2437 -> 0 bytes .../dns/__pycache__/inet.cpython-310.pyc | Bin 4574 -> 0 bytes .../dns/__pycache__/ipv4.cpython-310.pyc | Bin 1865 -> 0 bytes .../dns/__pycache__/ipv6.cpython-310.pyc | Bin 3932 -> 0 bytes .../dns/__pycache__/message.cpython-310.pyc | Bin 50663 -> 0 bytes .../dns/__pycache__/name.cpython-310.pyc | Bin 34767 -> 0 bytes .../dns/__pycache__/namedict.cpython-310.pyc | Bin 3017 -> 0 bytes .../__pycache__/nameserver.cpython-310.pyc | Bin 9174 -> 0 bytes .../dns/__pycache__/node.cpython-310.pyc | Bin 11618 -> 0 bytes .../dns/__pycache__/opcode.cpython-310.pyc | Bin 2486 -> 0 bytes .../dns/__pycache__/query.cpython-310.pyc | Bin 40371 -> 0 bytes .../dns/__pycache__/rcode.cpython-310.pyc | Bin 3266 -> 0 bytes .../dns/__pycache__/rdata.cpython-310.pyc | Bin 23470 -> 0 bytes .../__pycache__/rdataclass.cpython-310.pyc | Bin 2789 -> 0 bytes .../dns/__pycache__/rdataset.cpython-310.pyc | Bin 15302 -> 0 bytes .../dns/__pycache__/rdatatype.cpython-310.pyc | Bin 6681 -> 0 bytes .../dns/__pycache__/renderer.cpython-310.pyc | Bin 9915 -> 0 bytes .../dns/__pycache__/resolver.cpython-310.pyc | Bin 52676 -> 0 bytes .../__pycache__/reversename.cpython-310.pyc | Bin 3070 -> 0 bytes .../dns/__pycache__/rrset.cpython-310.pyc | Bin 7942 -> 0 bytes .../dns/__pycache__/serial.cpython-310.pyc | Bin 2881 -> 0 bytes .../dns/__pycache__/set.cpython-310.pyc | Bin 8634 -> 0 bytes .../dns/__pycache__/tokenizer.cpython-310.pyc | Bin 17127 -> 0 bytes .../__pycache__/transaction.cpython-310.pyc | Bin 19901 -> 0 bytes .../dns/__pycache__/tsig.cpython-310.pyc | Bin 10261 -> 0 bytes .../__pycache__/tsigkeyring.cpython-310.pyc | Bin 1857 -> 0 bytes .../dns/__pycache__/ttl.cpython-310.pyc | Bin 1694 -> 0 bytes .../dns/__pycache__/update.cpython-310.pyc | Bin 8886 -> 0 bytes .../dns/__pycache__/version.cpython-310.pyc | Bin 590 -> 0 bytes .../dns/__pycache__/versioned.cpython-310.pyc | Bin 8881 -> 0 bytes .../dns/__pycache__/win32util.cpython-310.pyc | Bin 5732 -> 0 bytes .../dns/__pycache__/wire.cpython-310.pyc | Bin 3319 -> 0 bytes .../dns/__pycache__/xfr.cpython-310.pyc | Bin 7813 -> 0 bytes .../dns/__pycache__/zone.cpython-310.pyc | Bin 45422 -> 0 bytes .../dns/__pycache__/zonefile.cpython-310.pyc | Bin 17731 -> 0 bytes .../dns/__pycache__/zonetypes.cpython-310.pyc | Bin 1048 -> 0 bytes .../site-packages/dns/_asyncbackend.py | 99 - .../site-packages/dns/_asyncio_backend.py | 275 -- .../lib/python3.10/site-packages/dns/_ddr.py | 154 - .../python3.10/site-packages/dns/_features.py | 92 - .../site-packages/dns/_immutable_ctx.py | 76 - .../site-packages/dns/_trio_backend.py | 250 - .../site-packages/dns/asyncbackend.py | 101 - .../site-packages/dns/asyncquery.py | 780 --- .../site-packages/dns/asyncresolver.py | 475 -- .../python3.10/site-packages/dns/dnssec.py | 1223 ----- .../site-packages/dns/dnssecalgs/__init__.py | 120 - .../__pycache__/__init__.cpython-310.pyc | Bin 3741 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 3721 -> 0 bytes .../__pycache__/cryptography.cpython-310.pyc | Bin 2669 -> 0 bytes .../__pycache__/dsa.cpython-310.pyc | Bin 3778 -> 0 bytes .../__pycache__/ecdsa.cpython-310.pyc | Bin 3778 -> 0 bytes .../__pycache__/eddsa.cpython-310.pyc | Bin 2945 -> 0 bytes .../__pycache__/rsa.cpython-310.pyc | Bin 4667 -> 0 bytes .../site-packages/dns/dnssecalgs/base.py | 84 - .../dns/dnssecalgs/cryptography.py | 68 - .../site-packages/dns/dnssecalgs/dsa.py | 101 - .../site-packages/dns/dnssecalgs/ecdsa.py | 89 - .../site-packages/dns/dnssecalgs/eddsa.py | 65 - .../site-packages/dns/dnssecalgs/rsa.py | 119 - .../site-packages/dns/dnssectypes.py | 71 - .../lib/python3.10/site-packages/dns/e164.py | 116 - .../lib/python3.10/site-packages/dns/edns.py | 516 -- .../python3.10/site-packages/dns/entropy.py | 130 - .../lib/python3.10/site-packages/dns/enum.py | 116 - .../python3.10/site-packages/dns/exception.py | 169 - .../lib/python3.10/site-packages/dns/flags.py | 123 - .../python3.10/site-packages/dns/grange.py | 72 - .../python3.10/site-packages/dns/immutable.py | 68 - .../lib/python3.10/site-packages/dns/inet.py | 197 - .../lib/python3.10/site-packages/dns/ipv4.py | 77 - .../lib/python3.10/site-packages/dns/ipv6.py | 219 - .../python3.10/site-packages/dns/message.py | 1888 ------- .../lib/python3.10/site-packages/dns/name.py | 1283 ----- .../python3.10/site-packages/dns/namedict.py | 109 - .../site-packages/dns/nameserver.py | 359 -- .../lib/python3.10/site-packages/dns/node.py | 359 -- .../python3.10/site-packages/dns/opcode.py | 117 - .../lib/python3.10/site-packages/dns/py.typed | 0 .../lib/python3.10/site-packages/dns/query.py | 1578 ------ .../site-packages/dns/quic/__init__.py | 75 - .../quic/__pycache__/__init__.cpython-310.pyc | Bin 2478 -> 0 bytes .../quic/__pycache__/_asyncio.cpython-310.pyc | Bin 8158 -> 0 bytes .../quic/__pycache__/_common.cpython-310.pyc | Bin 7009 -> 0 bytes .../quic/__pycache__/_sync.cpython-310.pyc | Bin 8686 -> 0 bytes .../quic/__pycache__/_trio.cpython-310.pyc | Bin 7066 -> 0 bytes .../site-packages/dns/quic/_asyncio.py | 228 - .../site-packages/dns/quic/_common.py | 224 - .../site-packages/dns/quic/_sync.py | 238 - .../site-packages/dns/quic/_trio.py | 210 - .../lib/python3.10/site-packages/dns/rcode.py | 168 - .../lib/python3.10/site-packages/dns/rdata.py | 884 ---- .../site-packages/dns/rdataclass.py | 118 - .../python3.10/site-packages/dns/rdataset.py | 516 -- .../python3.10/site-packages/dns/rdatatype.py | 332 -- .../site-packages/dns/rdtypes/ANY/AFSDB.py | 45 - .../site-packages/dns/rdtypes/ANY/AMTRELAY.py | 91 - .../site-packages/dns/rdtypes/ANY/AVC.py | 26 - .../site-packages/dns/rdtypes/ANY/CAA.py | 71 - .../site-packages/dns/rdtypes/ANY/CDNSKEY.py | 33 - .../site-packages/dns/rdtypes/ANY/CDS.py | 29 - .../site-packages/dns/rdtypes/ANY/CERT.py | 116 - .../site-packages/dns/rdtypes/ANY/CNAME.py | 28 - .../site-packages/dns/rdtypes/ANY/CSYNC.py | 68 - .../site-packages/dns/rdtypes/ANY/DLV.py | 24 - .../site-packages/dns/rdtypes/ANY/DNAME.py | 27 - .../site-packages/dns/rdtypes/ANY/DNSKEY.py | 33 - .../site-packages/dns/rdtypes/ANY/DS.py | 24 - .../site-packages/dns/rdtypes/ANY/EUI48.py | 30 - .../site-packages/dns/rdtypes/ANY/EUI64.py | 30 - .../site-packages/dns/rdtypes/ANY/GPOS.py | 125 - .../site-packages/dns/rdtypes/ANY/HINFO.py | 66 - .../site-packages/dns/rdtypes/ANY/HIP.py | 85 - .../site-packages/dns/rdtypes/ANY/ISDN.py | 77 - .../site-packages/dns/rdtypes/ANY/L32.py | 41 - .../site-packages/dns/rdtypes/ANY/L64.py | 47 - .../site-packages/dns/rdtypes/ANY/LOC.py | 354 -- .../site-packages/dns/rdtypes/ANY/LP.py | 42 - .../site-packages/dns/rdtypes/ANY/MX.py | 24 - .../site-packages/dns/rdtypes/ANY/NID.py | 47 - .../site-packages/dns/rdtypes/ANY/NINFO.py | 26 - .../site-packages/dns/rdtypes/ANY/NS.py | 24 - .../site-packages/dns/rdtypes/ANY/NSEC.py | 67 - .../site-packages/dns/rdtypes/ANY/NSEC3.py | 126 - .../dns/rdtypes/ANY/NSEC3PARAM.py | 69 - .../dns/rdtypes/ANY/OPENPGPKEY.py | 53 - .../site-packages/dns/rdtypes/ANY/OPT.py | 77 - .../site-packages/dns/rdtypes/ANY/PTR.py | 24 - .../site-packages/dns/rdtypes/ANY/RP.py | 58 - .../site-packages/dns/rdtypes/ANY/RRSIG.py | 157 - .../site-packages/dns/rdtypes/ANY/RT.py | 24 - .../site-packages/dns/rdtypes/ANY/SMIMEA.py | 9 - .../site-packages/dns/rdtypes/ANY/SOA.py | 86 - .../site-packages/dns/rdtypes/ANY/SPF.py | 26 - .../site-packages/dns/rdtypes/ANY/SSHFP.py | 68 - .../site-packages/dns/rdtypes/ANY/TKEY.py | 142 - .../site-packages/dns/rdtypes/ANY/TLSA.py | 9 - .../site-packages/dns/rdtypes/ANY/TSIG.py | 160 - .../site-packages/dns/rdtypes/ANY/TXT.py | 24 - .../site-packages/dns/rdtypes/ANY/URI.py | 79 - .../site-packages/dns/rdtypes/ANY/X25.py | 57 - .../site-packages/dns/rdtypes/ANY/ZONEMD.py | 66 - .../site-packages/dns/rdtypes/ANY/__init__.py | 68 - .../ANY/__pycache__/AFSDB.cpython-310.pyc | Bin 788 -> 0 bytes .../ANY/__pycache__/AMTRELAY.cpython-310.pyc | Bin 2547 -> 0 bytes .../ANY/__pycache__/AVC.cpython-310.pyc | Bin 467 -> 0 bytes .../ANY/__pycache__/CAA.cpython-310.pyc | Bin 2014 -> 0 bytes .../ANY/__pycache__/CDNSKEY.cpython-310.pyc | Bin 546 -> 0 bytes .../ANY/__pycache__/CDS.cpython-310.pyc | Bin 552 -> 0 bytes .../ANY/__pycache__/CERT.cpython-310.pyc | Bin 2794 -> 0 bytes .../ANY/__pycache__/CNAME.cpython-310.pyc | Bin 675 -> 0 bytes .../ANY/__pycache__/CSYNC.cpython-310.pyc | Bin 2117 -> 0 bytes .../ANY/__pycache__/DLV.cpython-310.pyc | Bin 464 -> 0 bytes .../ANY/__pycache__/DNAME.cpython-310.pyc | Bin 673 -> 0 bytes .../ANY/__pycache__/DNSKEY.cpython-310.pyc | Bin 543 -> 0 bytes .../ANY/__pycache__/DS.cpython-310.pyc | Bin 461 -> 0 bytes .../ANY/__pycache__/EUI48.cpython-310.pyc | Bin 528 -> 0 bytes .../ANY/__pycache__/EUI64.cpython-310.pyc | Bin 528 -> 0 bytes .../ANY/__pycache__/GPOS.cpython-310.pyc | Bin 3292 -> 0 bytes .../ANY/__pycache__/HINFO.cpython-310.pyc | Bin 1838 -> 0 bytes .../ANY/__pycache__/HIP.cpython-310.pyc | Bin 2680 -> 0 bytes .../ANY/__pycache__/ISDN.cpython-310.pyc | Bin 2024 -> 0 bytes .../ANY/__pycache__/L32.cpython-310.pyc | Bin 1666 -> 0 bytes .../ANY/__pycache__/L64.cpython-310.pyc | Bin 1871 -> 0 bytes .../ANY/__pycache__/LOC.cpython-310.pyc | Bin 7755 -> 0 bytes .../ANY/__pycache__/LP.cpython-310.pyc | Bin 1652 -> 0 bytes .../ANY/__pycache__/MX.cpython-310.pyc | Bin 461 -> 0 bytes .../ANY/__pycache__/NID.cpython-310.pyc | Bin 1865 -> 0 bytes .../ANY/__pycache__/NINFO.cpython-310.pyc | Bin 473 -> 0 bytes .../ANY/__pycache__/NS.cpython-310.pyc | Bin 461 -> 0 bytes .../ANY/__pycache__/NSEC.cpython-310.pyc | Bin 2000 -> 0 bytes .../ANY/__pycache__/NSEC3.cpython-310.pyc | Bin 3464 -> 0 bytes .../__pycache__/NSEC3PARAM.cpython-310.pyc | Bin 2090 -> 0 bytes .../__pycache__/OPENPGPKEY.cpython-310.pyc | Bin 1658 -> 0 bytes .../ANY/__pycache__/OPT.cpython-310.pyc | Bin 2392 -> 0 bytes .../ANY/__pycache__/PTR.cpython-310.pyc | Bin 464 -> 0 bytes .../ANY/__pycache__/RP.cpython-310.pyc | Bin 1674 -> 0 bytes .../ANY/__pycache__/RRSIG.cpython-310.pyc | Bin 3720 -> 0 bytes .../ANY/__pycache__/RT.cpython-310.pyc | Bin 479 -> 0 bytes .../ANY/__pycache__/SMIMEA.cpython-310.pyc | Bin 479 -> 0 bytes .../ANY/__pycache__/SOA.cpython-310.pyc | Bin 2188 -> 0 bytes .../ANY/__pycache__/SPF.cpython-310.pyc | Bin 467 -> 0 bytes .../ANY/__pycache__/SSHFP.cpython-310.pyc | Bin 1971 -> 0 bytes .../ANY/__pycache__/TKEY.cpython-310.pyc | Bin 2756 -> 0 bytes .../ANY/__pycache__/TLSA.cpython-310.pyc | Bin 473 -> 0 bytes .../ANY/__pycache__/TSIG.cpython-310.pyc | Bin 3234 -> 0 bytes .../ANY/__pycache__/TXT.cpython-310.pyc | Bin 467 -> 0 bytes .../ANY/__pycache__/URI.cpython-310.pyc | Bin 2607 -> 0 bytes .../ANY/__pycache__/X25.cpython-310.pyc | Bin 1632 -> 0 bytes .../ANY/__pycache__/ZONEMD.cpython-310.pyc | Bin 2429 -> 0 bytes .../ANY/__pycache__/__init__.cpython-310.pyc | Bin 540 -> 0 bytes .../site-packages/dns/rdtypes/CH/A.py | 59 - .../site-packages/dns/rdtypes/CH/__init__.py | 22 - .../rdtypes/CH/__pycache__/A.cpython-310.pyc | Bin 1691 -> 0 bytes .../CH/__pycache__/__init__.cpython-310.pyc | Bin 239 -> 0 bytes .../site-packages/dns/rdtypes/IN/A.py | 51 - .../site-packages/dns/rdtypes/IN/AAAA.py | 51 - .../site-packages/dns/rdtypes/IN/APL.py | 150 - .../site-packages/dns/rdtypes/IN/DHCID.py | 54 - .../site-packages/dns/rdtypes/IN/HTTPS.py | 9 - .../site-packages/dns/rdtypes/IN/IPSECKEY.py | 91 - .../site-packages/dns/rdtypes/IN/KX.py | 24 - .../site-packages/dns/rdtypes/IN/NAPTR.py | 110 - .../site-packages/dns/rdtypes/IN/NSAP.py | 60 - .../site-packages/dns/rdtypes/IN/NSAP_PTR.py | 24 - .../site-packages/dns/rdtypes/IN/PX.py | 73 - .../site-packages/dns/rdtypes/IN/SRV.py | 75 - .../site-packages/dns/rdtypes/IN/SVCB.py | 9 - .../site-packages/dns/rdtypes/IN/WKS.py | 100 - .../site-packages/dns/rdtypes/IN/__init__.py | 35 - .../rdtypes/IN/__pycache__/A.cpython-310.pyc | Bin 1538 -> 0 bytes .../IN/__pycache__/AAAA.cpython-310.pyc | Bin 1562 -> 0 bytes .../IN/__pycache__/APL.cpython-310.pyc | Bin 3767 -> 0 bytes .../IN/__pycache__/DHCID.cpython-310.pyc | Bin 1604 -> 0 bytes .../IN/__pycache__/HTTPS.cpython-310.pyc | Bin 475 -> 0 bytes .../IN/__pycache__/IPSECKEY.cpython-310.pyc | Bin 2474 -> 0 bytes .../rdtypes/IN/__pycache__/KX.cpython-310.pyc | Bin 478 -> 0 bytes .../IN/__pycache__/NAPTR.cpython-310.pyc | Bin 2936 -> 0 bytes .../IN/__pycache__/NSAP.cpython-310.pyc | Bin 1804 -> 0 bytes .../IN/__pycache__/NSAP_PTR.cpython-310.pyc | Bin 486 -> 0 bytes .../rdtypes/IN/__pycache__/PX.cpython-310.pyc | Bin 2218 -> 0 bytes .../IN/__pycache__/SRV.cpython-310.pyc | Bin 2406 -> 0 bytes .../IN/__pycache__/SVCB.cpython-310.pyc | Bin 472 -> 0 bytes .../IN/__pycache__/WKS.cpython-310.pyc | Bin 2639 -> 0 bytes .../IN/__pycache__/__init__.cpython-310.pyc | Bin 323 -> 0 bytes .../site-packages/dns/rdtypes/__init__.py | 33 - .../__pycache__/__init__.cpython-310.pyc | Bin 322 -> 0 bytes .../__pycache__/dnskeybase.cpython-310.pyc | Bin 2457 -> 0 bytes .../__pycache__/dsbase.cpython-310.pyc | Bin 2494 -> 0 bytes .../__pycache__/euibase.cpython-310.pyc | Bin 2128 -> 0 bytes .../__pycache__/mxbase.cpython-310.pyc | Bin 3108 -> 0 bytes .../__pycache__/nsbase.cpython-310.pyc | Bin 2096 -> 0 bytes .../__pycache__/svcbbase.cpython-310.pyc | Bin 16675 -> 0 bytes .../__pycache__/tlsabase.cpython-310.pyc | Bin 2086 -> 0 bytes .../__pycache__/txtbase.cpython-310.pyc | Bin 3079 -> 0 bytes .../rdtypes/__pycache__/util.cpython-310.pyc | Bin 7170 -> 0 bytes .../site-packages/dns/rdtypes/dnskeybase.py | 87 - .../site-packages/dns/rdtypes/dsbase.py | 85 - .../site-packages/dns/rdtypes/euibase.py | 70 - .../site-packages/dns/rdtypes/mxbase.py | 87 - .../site-packages/dns/rdtypes/nsbase.py | 63 - .../site-packages/dns/rdtypes/svcbbase.py | 553 --- .../site-packages/dns/rdtypes/tlsabase.py | 71 - .../site-packages/dns/rdtypes/txtbase.py | 104 - .../site-packages/dns/rdtypes/util.py | 257 - .../python3.10/site-packages/dns/renderer.py | 346 -- .../python3.10/site-packages/dns/resolver.py | 2054 -------- .../site-packages/dns/reversename.py | 105 - .../lib/python3.10/site-packages/dns/rrset.py | 285 -- .../python3.10/site-packages/dns/serial.py | 118 - .venv/lib/python3.10/site-packages/dns/set.py | 307 -- .../python3.10/site-packages/dns/tokenizer.py | 708 --- .../site-packages/dns/transaction.py | 651 --- .../lib/python3.10/site-packages/dns/tsig.py | 352 -- .../site-packages/dns/tsigkeyring.py | 68 - .venv/lib/python3.10/site-packages/dns/ttl.py | 92 - .../python3.10/site-packages/dns/update.py | 386 -- .../python3.10/site-packages/dns/version.py | 58 - .../python3.10/site-packages/dns/versioned.py | 318 -- .../python3.10/site-packages/dns/win32util.py | 252 - .../lib/python3.10/site-packages/dns/wire.py | 89 - .venv/lib/python3.10/site-packages/dns/xfr.py | 343 -- .../lib/python3.10/site-packages/dns/zone.py | 1434 ------ .../python3.10/site-packages/dns/zonefile.py | 746 --- .../python3.10/site-packages/dns/zonetypes.py | 37 - .../dnspython-2.6.1.dist-info/INSTALLER | 1 - .../dnspython-2.6.1.dist-info/METADATA | 147 - .../dnspython-2.6.1.dist-info/RECORD | 290 -- .../dnspython-2.6.1.dist-info/WHEEL | 4 - .../licenses/LICENSE | 35 - .../flask-3.0.3.dist-info/INSTALLER | 1 - .../flask-3.0.3.dist-info/LICENSE.txt | 28 - .../flask-3.0.3.dist-info/METADATA | 101 - .../flask-3.0.3.dist-info/RECORD | 58 - .../flask-3.0.3.dist-info/REQUESTED | 0 .../site-packages/flask-3.0.3.dist-info/WHEEL | 4 - .../flask-3.0.3.dist-info/entry_points.txt | 3 - .../site-packages/flask/__init__.py | 60 - .../site-packages/flask/__main__.py | 3 - .../__pycache__/__init__.cpython-310.pyc | Bin 2283 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 208 -> 0 bytes .../flask/__pycache__/app.cpython-310.pyc | Bin 49922 -> 0 bytes .../__pycache__/blueprints.cpython-310.pyc | Bin 4129 -> 0 bytes .../flask/__pycache__/cli.cpython-310.pyc | Bin 29082 -> 0 bytes .../flask/__pycache__/config.cpython-310.pyc | Bin 13417 -> 0 bytes .../flask/__pycache__/ctx.cpython-310.pyc | Bin 14849 -> 0 bytes .../__pycache__/debughelpers.cpython-310.pyc | Bin 6587 -> 0 bytes .../flask/__pycache__/globals.cpython-310.pyc | Bin 1576 -> 0 bytes .../flask/__pycache__/helpers.cpython-310.pyc | Bin 21603 -> 0 bytes .../flask/__pycache__/logging.cpython-310.pyc | Bin 2543 -> 0 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 13660 -> 0 bytes .../flask/__pycache__/signals.cpython-310.pyc | Bin 806 -> 0 bytes .../__pycache__/templating.cpython-310.pyc | Bin 7080 -> 0 bytes .../flask/__pycache__/testing.cpython-310.pyc | Bin 9843 -> 0 bytes .../flask/__pycache__/typing.cpython-310.pyc | Bin 1830 -> 0 bytes .../flask/__pycache__/views.cpython-310.pyc | Bin 5540 -> 0 bytes .../__pycache__/wrappers.cpython-310.pyc | Bin 5234 -> 0 bytes .../lib/python3.10/site-packages/flask/app.py | 1498 ------ .../site-packages/flask/blueprints.py | 129 - .../lib/python3.10/site-packages/flask/cli.py | 1109 ----- .../python3.10/site-packages/flask/config.py | 370 -- .../lib/python3.10/site-packages/flask/ctx.py | 449 -- .../site-packages/flask/debughelpers.py | 178 - .../python3.10/site-packages/flask/globals.py | 51 - .../python3.10/site-packages/flask/helpers.py | 621 --- .../site-packages/flask/json/__init__.py | 170 - .../json/__pycache__/__init__.cpython-310.pyc | Bin 5990 -> 0 bytes .../json/__pycache__/provider.cpython-310.pyc | Bin 7682 -> 0 bytes .../json/__pycache__/tag.cpython-310.pyc | Bin 11640 -> 0 bytes .../site-packages/flask/json/provider.py | 215 - .../site-packages/flask/json/tag.py | 327 -- .../python3.10/site-packages/flask/logging.py | 79 - .../python3.10/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 - .../sansio/__pycache__/app.cpython-310.pyc | Bin 28585 -> 0 bytes .../__pycache__/blueprints.cpython-310.pyc | Bin 22929 -> 0 bytes .../__pycache__/scaffold.cpython-310.pyc | Bin 24086 -> 0 bytes .../site-packages/flask/sansio/app.py | 964 ---- .../site-packages/flask/sansio/blueprints.py | 632 --- .../site-packages/flask/sansio/scaffold.py | 801 --- .../site-packages/flask/sessions.py | 379 -- .../python3.10/site-packages/flask/signals.py | 17 - .../site-packages/flask/templating.py | 219 - .../python3.10/site-packages/flask/testing.py | 298 -- .../python3.10/site-packages/flask/typing.py | 90 - .../python3.10/site-packages/flask/views.py | 191 - .../site-packages/flask/wrappers.py | 174 - .../flask_mail-0.10.0.dist-info/INSTALLER | 1 - .../flask_mail-0.10.0.dist-info/LICENSE.txt | 28 - .../flask_mail-0.10.0.dist-info/METADATA | 68 - .../flask_mail-0.10.0.dist-info/RECORD | 9 - .../flask_mail-0.10.0.dist-info/REQUESTED | 0 .../flask_mail-0.10.0.dist-info/WHEEL | 4 - .../site-packages/flask_mail/__init__.py | 660 --- .../__pycache__/__init__.cpython-310.pyc | Bin 19819 -> 0 bytes .../site-packages/flask_mail/py.typed | 0 .../site-packages/gridfs/__init__.py | 1000 ---- .../__pycache__/__init__.cpython-310.pyc | Bin 35658 -> 0 bytes .../gridfs/__pycache__/errors.cpython-310.pyc | Bin 1047 -> 0 bytes .../__pycache__/grid_file.cpython-310.pyc | Bin 31034 -> 0 bytes .../python3.10/site-packages/gridfs/errors.py | 34 - .../site-packages/gridfs/grid_file.py | 964 ---- .../python3.10/site-packages/gridfs/py.typed | 2 - .../itsdangerous-2.2.0.dist-info/INSTALLER | 1 - .../itsdangerous-2.2.0.dist-info/LICENSE.txt | 28 - .../itsdangerous-2.2.0.dist-info/METADATA | 60 - .../itsdangerous-2.2.0.dist-info/RECORD | 22 - .../itsdangerous-2.2.0.dist-info/WHEEL | 4 - .../site-packages/itsdangerous/__init__.py | 38 - .../__pycache__/__init__.cpython-310.pyc | Bin 1457 -> 0 bytes .../__pycache__/_json.cpython-310.pyc | Bin 975 -> 0 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 1926 -> 0 bytes .../__pycache__/exc.cpython-310.pyc | Bin 3391 -> 0 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 11723 -> 0 bytes .../__pycache__/signer.cpython-310.pyc | Bin 9002 -> 0 bytes .../__pycache__/timed.cpython-310.pyc | Bin 6562 -> 0 bytes .../__pycache__/url_safe.cpython-310.pyc | Bin 2856 -> 0 bytes .../site-packages/itsdangerous/_json.py | 18 - .../site-packages/itsdangerous/encoding.py | 54 - .../site-packages/itsdangerous/exc.py | 106 - .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 406 -- .../site-packages/itsdangerous/signer.py | 266 - .../site-packages/itsdangerous/timed.py | 228 - .../site-packages/itsdangerous/url_safe.py | 83 - .../jinja2-3.1.4.dist-info/INSTALLER | 1 - .../jinja2-3.1.4.dist-info/LICENSE.txt | 28 - .../jinja2-3.1.4.dist-info/METADATA | 76 - .../jinja2-3.1.4.dist-info/RECORD | 57 - .../jinja2-3.1.4.dist-info/WHEEL | 4 - .../jinja2-3.1.4.dist-info/entry_points.txt | 3 - .../site-packages/jinja2/__init__.py | 38 - .../__pycache__/__init__.cpython-310.pyc | Bin 1597 -> 0 bytes .../__pycache__/_identifier.cpython-310.pyc | Bin 2072 -> 0 bytes .../__pycache__/async_utils.cpython-310.pyc | Bin 2686 -> 0 bytes .../__pycache__/bccache.cpython-310.pyc | Bin 13963 -> 0 bytes .../__pycache__/compiler.cpython-310.pyc | Bin 54560 -> 0 bytes .../__pycache__/constants.cpython-310.pyc | Bin 1533 -> 0 bytes .../jinja2/__pycache__/debug.cpython-310.pyc | Bin 3989 -> 0 bytes .../__pycache__/defaults.cpython-310.pyc | Bin 1333 -> 0 bytes .../__pycache__/environment.cpython-310.pyc | Bin 53475 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 5532 -> 0 bytes .../jinja2/__pycache__/ext.cpython-310.pyc | Bin 25862 -> 0 bytes .../__pycache__/filters.cpython-310.pyc | Bin 51951 -> 0 bytes .../__pycache__/idtracking.cpython-310.pyc | Bin 11084 -> 0 bytes .../jinja2/__pycache__/lexer.cpython-310.pyc | Bin 20434 -> 0 bytes .../__pycache__/loaders.cpython-310.pyc | Bin 20488 -> 0 bytes .../jinja2/__pycache__/meta.cpython-310.pyc | Bin 3813 -> 0 bytes .../__pycache__/nativetypes.cpython-310.pyc | Bin 5008 -> 0 bytes .../jinja2/__pycache__/nodes.cpython-310.pyc | Bin 40299 -> 0 bytes .../__pycache__/optimizer.cpython-310.pyc | Bin 1953 -> 0 bytes .../jinja2/__pycache__/parser.cpython-310.pyc | Bin 27792 -> 0 bytes .../__pycache__/runtime.cpython-310.pyc | Bin 32153 -> 0 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 11991 -> 0 bytes .../jinja2/__pycache__/tests.cpython-310.pyc | Bin 6693 -> 0 bytes .../jinja2/__pycache__/utils.cpython-310.pyc | Bin 24523 -> 0 bytes .../__pycache__/visitor.cpython-310.pyc | Bin 3972 -> 0 bytes .../site-packages/jinja2/_identifier.py | 6 - .../site-packages/jinja2/async_utils.py | 84 - .../site-packages/jinja2/bccache.py | 408 -- .../site-packages/jinja2/compiler.py | 1960 -------- .../site-packages/jinja2/constants.py | 20 - .../python3.10/site-packages/jinja2/debug.py | 191 - .../site-packages/jinja2/defaults.py | 48 - .../site-packages/jinja2/environment.py | 1675 ------- .../site-packages/jinja2/exceptions.py | 166 - .../python3.10/site-packages/jinja2/ext.py | 870 ---- .../site-packages/jinja2/filters.py | 1866 ------- .../site-packages/jinja2/idtracking.py | 318 -- .../python3.10/site-packages/jinja2/lexer.py | 868 ---- .../site-packages/jinja2/loaders.py | 667 --- .../python3.10/site-packages/jinja2/meta.py | 112 - .../site-packages/jinja2/nativetypes.py | 130 - .../python3.10/site-packages/jinja2/nodes.py | 1206 ----- .../site-packages/jinja2/optimizer.py | 48 - .../python3.10/site-packages/jinja2/parser.py | 1041 ---- .../python3.10/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1056 ---- .../site-packages/jinja2/sandbox.py | 429 -- .../python3.10/site-packages/jinja2/tests.py | 256 - .../python3.10/site-packages/jinja2/utils.py | 755 --- .../site-packages/jinja2/visitor.py | 92 - .../kombu-5.3.7.dist-info/INSTALLER | 1 - .../kombu-5.3.7.dist-info/LICENSE | 26 - .../kombu-5.3.7.dist-info/METADATA | 70 - .../kombu-5.3.7.dist-info/RECORD | 158 - .../site-packages/kombu-5.3.7.dist-info/WHEEL | 5 - .../kombu-5.3.7.dist-info/top_level.txt | 1 - .../site-packages/kombu/__init__.py | 115 - .../__pycache__/__init__.cpython-310.pyc | Bin 3179 -> 0 bytes .../__pycache__/abstract.cpython-310.pyc | Bin 5524 -> 0 bytes .../kombu/__pycache__/clocks.cpython-310.pyc | Bin 5939 -> 0 bytes .../kombu/__pycache__/common.cpython-310.pyc | Bin 13268 -> 0 bytes .../kombu/__pycache__/compat.cpython-310.pyc | Bin 6765 -> 0 bytes .../__pycache__/compression.cpython-310.pyc | Bin 3152 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 35559 -> 0 bytes .../kombu/__pycache__/entity.cpython-310.pyc | Bin 29483 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 4146 -> 0 bytes .../kombu/__pycache__/log.cpython-310.pyc | Bin 5070 -> 0 bytes .../kombu/__pycache__/matcher.cpython-310.pyc | Bin 3358 -> 0 bytes .../kombu/__pycache__/message.cpython-310.pyc | Bin 6873 -> 0 bytes .../__pycache__/messaging.cpython-310.pyc | Bin 19370 -> 0 bytes .../kombu/__pycache__/mixins.cpython-310.pyc | Bin 10387 -> 0 bytes .../kombu/__pycache__/pidbox.cpython-310.pyc | Bin 11301 -> 0 bytes .../kombu/__pycache__/pools.cpython-310.pyc | Bin 5341 -> 0 bytes .../__pycache__/resource.cpython-310.pyc | Bin 7481 -> 0 bytes .../__pycache__/serialization.cpython-310.pyc | Bin 13947 -> 0 bytes .../kombu/__pycache__/simple.cpython-310.pyc | Bin 4767 -> 0 bytes .../site-packages/kombu/abstract.py | 143 - .../kombu/asynchronous/__init__.py | 9 - .../__pycache__/__init__.cpython-310.pyc | Bin 466 -> 0 bytes .../__pycache__/debug.cpython-310.pyc | Bin 2557 -> 0 bytes .../__pycache__/hub.cpython-310.pyc | Bin 10399 -> 0 bytes .../__pycache__/semaphore.cpython-310.pyc | Bin 4441 -> 0 bytes .../__pycache__/timer.cpython-310.pyc | Bin 7911 -> 0 bytes .../kombu/asynchronous/aws/__init__.py | 17 - .../aws/__pycache__/__init__.cpython-310.pyc | Bin 709 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 9193 -> 0 bytes .../aws/__pycache__/ext.cpython-310.pyc | Bin 833 -> 0 bytes .../kombu/asynchronous/aws/connection.py | 272 - .../kombu/asynchronous/aws/ext.py | 26 - .../kombu/asynchronous/aws/sqs/__init__.py | 0 .../sqs/__pycache__/__init__.cpython-310.pyc | Bin 189 -> 0 bytes .../__pycache__/connection.cpython-310.pyc | Bin 8912 -> 0 bytes .../aws/sqs/__pycache__/ext.cpython-310.pyc | Bin 340 -> 0 bytes .../sqs/__pycache__/message.cpython-310.pyc | Bin 1451 -> 0 bytes .../aws/sqs/__pycache__/queue.cpython-310.pyc | Bin 4808 -> 0 bytes .../kombu/asynchronous/aws/sqs/connection.py | 275 -- .../kombu/asynchronous/aws/sqs/ext.py | 9 - .../kombu/asynchronous/aws/sqs/message.py | 35 - .../kombu/asynchronous/aws/sqs/queue.py | 130 - .../site-packages/kombu/asynchronous/debug.py | 67 - .../kombu/asynchronous/http/__init__.py | 28 - .../http/__pycache__/__init__.cpython-310.pyc | Bin 1149 -> 0 bytes .../http/__pycache__/base.cpython-310.pyc | Bin 10246 -> 0 bytes .../http/__pycache__/curl.cpython-310.pyc | Bin 8319 -> 0 bytes .../kombu/asynchronous/http/base.py | 274 -- .../kombu/asynchronous/http/curl.py | 289 -- .../site-packages/kombu/asynchronous/hub.py | 399 -- .../kombu/asynchronous/semaphore.py | 128 - .../site-packages/kombu/asynchronous/timer.py | 241 - .../python3.10/site-packages/kombu/clocks.py | 156 - .../python3.10/site-packages/kombu/common.py | 446 -- .../python3.10/site-packages/kombu/compat.py | 227 - .../site-packages/kombu/compression.py | 121 - .../site-packages/kombu/connection.py | 1115 ----- .../python3.10/site-packages/kombu/entity.py | 887 ---- .../site-packages/kombu/exceptions.py | 112 - .../lib/python3.10/site-packages/kombu/log.py | 139 - .../python3.10/site-packages/kombu/matcher.py | 144 - .../python3.10/site-packages/kombu/message.py | 234 - .../site-packages/kombu/messaging.py | 666 --- .../python3.10/site-packages/kombu/mixins.py | 303 -- .../python3.10/site-packages/kombu/pidbox.py | 413 -- .../python3.10/site-packages/kombu/pools.py | 152 - .../site-packages/kombu/resource.py | 251 - .../site-packages/kombu/serialization.py | 463 -- .../python3.10/site-packages/kombu/simple.py | 163 - .../site-packages/kombu/transport/SLMQ.py | 202 - .../site-packages/kombu/transport/SQS.py | 921 ---- .../site-packages/kombu/transport/__init__.py | 91 - .../__pycache__/SLMQ.cpython-310.pyc | Bin 6508 -> 0 bytes .../transport/__pycache__/SQS.cpython-310.pyc | Bin 27630 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 3033 -> 0 bytes .../azureservicebus.cpython-310.pyc | Bin 15062 -> 0 bytes .../azurestoragequeues.cpython-310.pyc | Bin 8255 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 9845 -> 0 bytes .../confluentkafka.cpython-310.pyc | Bin 12368 -> 0 bytes .../__pycache__/consul.cpython-310.pyc | Bin 9733 -> 0 bytes .../__pycache__/etcd.cpython-310.pyc | Bin 8867 -> 0 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 9893 -> 0 bytes .../__pycache__/librabbitmq.cpython-310.pyc | Bin 6233 -> 0 bytes .../__pycache__/memory.cpython-310.pyc | Bin 3650 -> 0 bytes .../__pycache__/mongodb.cpython-310.pyc | Bin 13287 -> 0 bytes .../__pycache__/pyamqp.cpython-310.pyc | Bin 8045 -> 0 bytes .../__pycache__/pyro.cpython-310.pyc | Bin 7204 -> 0 bytes .../__pycache__/qpid.cpython-310.pyc | Bin 67697 -> 0 bytes .../__pycache__/redis.cpython-310.pyc | Bin 40253 -> 0 bytes .../__pycache__/zookeeper.cpython-310.pyc | Bin 6206 -> 0 bytes .../kombu/transport/azureservicebus.py | 493 -- .../kombu/transport/azurestoragequeues.py | 263 - .../site-packages/kombu/transport/base.py | 271 - .../kombu/transport/confluentkafka.py | 380 -- .../site-packages/kombu/transport/consul.py | 323 -- .../site-packages/kombu/transport/etcd.py | 300 -- .../kombu/transport/filesystem.py | 352 -- .../kombu/transport/librabbitmq.py | 190 - .../site-packages/kombu/transport/memory.py | 106 - .../site-packages/kombu/transport/mongodb.py | 525 -- .../site-packages/kombu/transport/pyamqp.py | 253 - .../site-packages/kombu/transport/pyro.py | 212 - .../site-packages/kombu/transport/qpid.py | 1748 ------- .../site-packages/kombu/transport/redis.py | 1443 ------ .../kombu/transport/sqlalchemy/__init__.py | 248 - .../__pycache__/__init__.cpython-310.pyc | Bin 6993 -> 0 bytes .../__pycache__/models.cpython-310.pyc | Bin 2831 -> 0 bytes .../kombu/transport/sqlalchemy/models.py | 76 - .../kombu/transport/virtual/__init__.py | 11 - .../__pycache__/__init__.cpython-310.pyc | Bin 619 -> 0 bytes .../virtual/__pycache__/base.cpython-310.pyc | Bin 30655 -> 0 bytes .../__pycache__/exchange.cpython-310.pyc | Bin 6133 -> 0 bytes .../kombu/transport/virtual/base.py | 1039 ---- .../kombu/transport/virtual/exchange.py | 164 - .../kombu/transport/zookeeper.py | 223 - .../site-packages/kombu/utils/__init__.py | 20 - .../__pycache__/__init__.cpython-310.pyc | Bin 832 -> 0 bytes .../__pycache__/amq_manager.cpython-310.pyc | Bin 883 -> 0 bytes .../__pycache__/collections.cpython-310.pyc | Bin 1831 -> 0 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 3258 -> 0 bytes .../utils/__pycache__/debug.cpython-310.pyc | Bin 2261 -> 0 bytes .../utils/__pycache__/div.cpython-310.pyc | Bin 1127 -> 0 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 2755 -> 0 bytes .../utils/__pycache__/eventio.cpython-310.pyc | Bin 9204 -> 0 bytes .../__pycache__/functional.cpython-310.pyc | Bin 12350 -> 0 bytes .../utils/__pycache__/imports.cpython-310.pyc | Bin 2000 -> 0 bytes .../utils/__pycache__/json.cpython-310.pyc | Bin 4380 -> 0 bytes .../utils/__pycache__/limits.cpython-310.pyc | Bin 2935 -> 0 bytes .../utils/__pycache__/objects.cpython-310.pyc | Bin 2171 -> 0 bytes .../__pycache__/scheduling.cpython-310.pyc | Bin 3929 -> 0 bytes .../utils/__pycache__/text.cpython-310.pyc | Bin 2628 -> 0 bytes .../utils/__pycache__/time.cpython-310.pyc | Bin 549 -> 0 bytes .../utils/__pycache__/url.cpython-310.pyc | Bin 3627 -> 0 bytes .../utils/__pycache__/uuid.cpython-310.pyc | Bin 631 -> 0 bytes .../site-packages/kombu/utils/amq_manager.py | 22 - .../site-packages/kombu/utils/collections.py | 45 - .../site-packages/kombu/utils/compat.py | 137 - .../site-packages/kombu/utils/debug.py | 62 - .../site-packages/kombu/utils/div.py | 37 - .../site-packages/kombu/utils/encoding.py | 97 - .../site-packages/kombu/utils/eventio.py | 329 -- .../site-packages/kombu/utils/functional.py | 360 -- .../site-packages/kombu/utils/imports.py | 68 - .../site-packages/kombu/utils/json.py | 146 - .../site-packages/kombu/utils/limits.py | 87 - .../site-packages/kombu/utils/objects.py | 67 - .../site-packages/kombu/utils/scheduling.py | 111 - .../site-packages/kombu/utils/text.py | 73 - .../site-packages/kombu/utils/time.py | 9 - .../site-packages/kombu/utils/url.py | 130 - .../site-packages/kombu/utils/uuid.py | 15 - .../site-packages/markupsafe/__init__.py | 332 -- .../__pycache__/__init__.cpython-310.pyc | Bin 11342 -> 0 bytes .../__pycache__/_native.cpython-310.pyc | Bin 1997 -> 0 bytes .../site-packages/markupsafe/_native.py | 63 - .../site-packages/markupsafe/_speedups.c | 320 -- .../_speedups.cpython-310-x86_64-linux-gnu.so | Bin 44240 -> 0 bytes .../site-packages/markupsafe/_speedups.pyi | 9 - .../site-packages/markupsafe/py.typed | 0 .../pip-22.0.2.dist-info/INSTALLER | 1 - .../pip-22.0.2.dist-info/LICENSE.txt | 20 - .../pip-22.0.2.dist-info/METADATA | 92 - .../site-packages/pip-22.0.2.dist-info/RECORD | 1037 ---- .../pip-22.0.2.dist-info/REQUESTED | 0 .../site-packages/pip-22.0.2.dist-info/WHEEL | 5 - .../pip-22.0.2.dist-info/entry_points.txt | 5 - .../pip-22.0.2.dist-info/top_level.txt | 1 - .../python3.10/site-packages/pip/__init__.py | 13 - .../python3.10/site-packages/pip/__main__.py | 31 - .../pip/__pycache__/__init__.cpython-310.pyc | Bin 622 -> 0 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 584 -> 0 bytes .../site-packages/pip/_internal/__init__.py | 19 - .../__pycache__/__init__.cpython-310.pyc | Bin 743 -> 0 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 9587 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 8370 -> 0 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 11116 -> 0 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 23113 -> 0 bytes .../__pycache__/main.cpython-310.pyc | Bin 608 -> 0 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 3527 -> 0 bytes .../self_outdated_check.cpython-310.pyc | Bin 4567 -> 0 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 9129 -> 0 bytes .../site-packages/pip/_internal/build_env.py | 296 -- .../site-packages/pip/_internal/cache.py | 264 - .../pip/_internal/cli/__init__.py | 4 - .../cli/__pycache__/__init__.cpython-310.pyc | Bin 263 -> 0 bytes .../autocompletion.cpython-310.pyc | Bin 5296 -> 0 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 6239 -> 0 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 22538 -> 0 bytes .../command_context.cpython-310.pyc | Bin 1297 -> 0 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 1361 -> 0 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 2147 -> 0 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 9934 -> 0 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 9223 -> 0 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 13524 -> 0 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 4937 -> 0 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 342 -> 0 bytes .../pip/_internal/cli/autocompletion.py | 171 - .../pip/_internal/cli/base_command.py | 220 - .../pip/_internal/cli/cmdoptions.py | 1018 ---- .../pip/_internal/cli/command_context.py | 27 - .../site-packages/pip/_internal/cli/main.py | 70 - .../pip/_internal/cli/main_parser.py | 87 - .../site-packages/pip/_internal/cli/parser.py | 292 -- .../pip/_internal/cli/progress_bars.py | 321 -- .../pip/_internal/cli/req_command.py | 506 -- .../pip/_internal/cli/spinners.py | 157 - .../pip/_internal/cli/status_codes.py | 6 - .../pip/_internal/commands/__init__.py | 127 - .../__pycache__/__init__.cpython-310.pyc | Bin 3126 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 6167 -> 0 bytes .../__pycache__/check.cpython-310.pyc | Bin 1560 -> 0 bytes .../__pycache__/completion.cpython-310.pyc | Bin 3127 -> 0 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 8309 -> 0 bytes .../__pycache__/debug.cpython-310.pyc | Bin 6664 -> 0 bytes .../__pycache__/download.cpython-310.pyc | Bin 3974 -> 0 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 2640 -> 0 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 2139 -> 0 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 1300 -> 0 bytes .../__pycache__/index.cpython-310.pyc | Bin 4623 -> 0 bytes .../__pycache__/install.cpython-310.pyc | Bin 17782 -> 0 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 10349 -> 0 bytes .../__pycache__/search.cpython-310.pyc | Bin 5353 -> 0 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 6106 -> 0 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 3097 -> 0 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 4829 -> 0 bytes .../pip/_internal/commands/cache.py | 223 - .../pip/_internal/commands/check.py | 53 - .../pip/_internal/commands/completion.py | 96 - .../pip/_internal/commands/configuration.py | 266 - .../pip/_internal/commands/debug.py | 202 - .../pip/_internal/commands/download.py | 140 - .../pip/_internal/commands/freeze.py | 97 - .../pip/_internal/commands/hash.py | 59 - .../pip/_internal/commands/help.py | 41 - .../pip/_internal/commands/index.py | 139 - .../pip/_internal/commands/install.py | 771 --- .../pip/_internal/commands/list.py | 363 -- .../pip/_internal/commands/search.py | 174 - .../pip/_internal/commands/show.py | 178 - .../pip/_internal/commands/uninstall.py | 105 - .../pip/_internal/commands/wheel.py | 178 - .../pip/_internal/configuration.py | 366 -- .../pip/_internal/distributions/__init__.py | 21 - .../__pycache__/__init__.cpython-310.pyc | Bin 790 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 1847 -> 0 bytes .../__pycache__/installed.cpython-310.pyc | Bin 1224 -> 0 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 4436 -> 0 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 1591 -> 0 bytes .../pip/_internal/distributions/base.py | 36 - .../pip/_internal/distributions/installed.py | 20 - .../pip/_internal/distributions/sdist.py | 127 - .../pip/_internal/distributions/wheel.py | 31 - .../site-packages/pip/_internal/exceptions.py | 658 --- .../pip/_internal/index/__init__.py | 2 - .../__pycache__/__init__.cpython-310.pyc | Bin 217 -> 0 bytes .../__pycache__/collector.cpython-310.pyc | Bin 19296 -> 0 bytes .../package_finder.cpython-310.pyc | Bin 28105 -> 0 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 7110 -> 0 bytes .../pip/_internal/index/collector.py | 648 --- .../pip/_internal/index/package_finder.py | 1004 ---- .../pip/_internal/index/sources.py | 224 - .../pip/_internal/locations/__init__.py | 520 -- .../__pycache__/__init__.cpython-310.pyc | Bin 12377 -> 0 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 4645 -> 0 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 6228 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 1527 -> 0 bytes .../pip/_internal/locations/_distutils.py | 169 - .../pip/_internal/locations/_sysconfig.py | 219 - .../pip/_internal/locations/base.py | 52 - .../site-packages/pip/_internal/main.py | 12 - .../pip/_internal/metadata/__init__.py | 62 - .../__pycache__/__init__.cpython-310.pyc | Bin 2283 -> 0 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 20837 -> 0 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 9853 -> 0 bytes .../pip/_internal/metadata/base.py | 546 --- .../pip/_internal/metadata/pkg_resources.py | 256 - .../pip/_internal/models/__init__.py | 2 - .../__pycache__/__init__.cpython-310.pyc | Bin 251 -> 0 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 1403 -> 0 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 7276 -> 0 bytes .../format_control.cpython-310.pyc | Bin 2728 -> 0 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 1220 -> 0 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 10152 -> 0 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 1019 -> 0 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 3474 -> 0 bytes .../selection_prefs.cpython-310.pyc | Bin 1681 -> 0 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 3432 -> 0 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 4348 -> 0 bytes .../pip/_internal/models/candidate.py | 34 - .../pip/_internal/models/direct_url.py | 220 - .../pip/_internal/models/format_control.py | 80 - .../pip/_internal/models/index.py | 28 - .../pip/_internal/models/link.py | 288 -- .../pip/_internal/models/scheme.py | 31 - .../pip/_internal/models/search_scope.py | 129 - .../pip/_internal/models/selection_prefs.py | 51 - .../pip/_internal/models/target_python.py | 110 - .../pip/_internal/models/wheel.py | 89 - .../pip/_internal/network/__init__.py | 2 - .../__pycache__/__init__.cpython-310.pyc | Bin 239 -> 0 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 7507 -> 0 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 2920 -> 0 bytes .../__pycache__/download.cpython-310.pyc | Bin 5486 -> 0 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 8394 -> 0 bytes .../__pycache__/session.cpython-310.pyc | Bin 10715 -> 0 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 1435 -> 0 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 2052 -> 0 bytes .../pip/_internal/network/auth.py | 323 -- .../pip/_internal/network/cache.py | 69 - .../pip/_internal/network/download.py | 185 - .../pip/_internal/network/lazy_wheel.py | 210 - .../pip/_internal/network/session.py | 454 -- .../pip/_internal/network/utils.py | 96 - .../pip/_internal/network/xmlrpc.py | 60 - .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 187 -> 0 bytes .../__pycache__/check.cpython-310.pyc | Bin 4000 -> 0 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 6185 -> 0 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 14883 -> 0 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 193 -> 0 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 1420 -> 0 bytes .../metadata_editable.cpython-310.pyc | Bin 1454 -> 0 bytes .../metadata_legacy.cpython-310.pyc | Bin 2365 -> 0 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 1210 -> 0 bytes .../wheel_editable.cpython-310.pyc | Bin 1434 -> 0 bytes .../__pycache__/wheel_legacy.cpython-310.pyc | Bin 2750 -> 0 bytes .../_internal/operations/build/metadata.py | 39 - .../operations/build/metadata_editable.py | 41 - .../operations/build/metadata_legacy.py | 74 - .../pip/_internal/operations/build/wheel.py | 37 - .../operations/build/wheel_editable.py | 46 - .../operations/build/wheel_legacy.py | 102 - .../pip/_internal/operations/check.py | 149 - .../pip/_internal/operations/freeze.py | 254 - .../_internal/operations/install/__init__.py | 2 - .../__pycache__/__init__.cpython-310.pyc | Bin 251 -> 0 bytes .../editable_legacy.cpython-310.pyc | Bin 1538 -> 0 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 3322 -> 0 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 21080 -> 0 bytes .../operations/install/editable_legacy.py | 47 - .../_internal/operations/install/legacy.py | 120 - .../pip/_internal/operations/install/wheel.py | 738 --- .../pip/_internal/operations/prepare.py | 642 --- .../site-packages/pip/_internal/pyproject.py | 168 - .../pip/_internal/req/__init__.py | 94 - .../req/__pycache__/__init__.cpython-310.pyc | Bin 2587 -> 0 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 12150 -> 0 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 13478 -> 0 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 22167 -> 0 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 5827 -> 0 bytes .../__pycache__/req_tracker.cpython-310.pyc | Bin 4295 -> 0 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 18933 -> 0 bytes .../pip/_internal/req/constructors.py | 490 -- .../pip/_internal/req/req_file.py | 536 -- .../pip/_internal/req/req_install.py | 858 ---- .../pip/_internal/req/req_set.py | 189 - .../pip/_internal/req/req_tracker.py | 124 - .../pip/_internal/req/req_uninstall.py | 633 --- .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 187 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 1039 -> 0 bytes .../pip/_internal/resolution/base.py | 20 - .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 194 -> 0 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 12281 -> 0 bytes .../_internal/resolution/legacy/resolver.py | 467 -- .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 198 -> 0 bytes .../__pycache__/base.cpython-310.pyc | Bin 6441 -> 0 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 18348 -> 0 bytes .../__pycache__/factory.cpython-310.pyc | Bin 19206 -> 0 bytes .../found_candidates.cpython-310.pyc | Bin 4858 -> 0 bytes .../__pycache__/provider.cpython-310.pyc | Bin 7700 -> 0 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 3167 -> 0 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 7456 -> 0 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 8093 -> 0 bytes .../_internal/resolution/resolvelib/base.py | 141 - .../resolution/resolvelib/candidates.py | 547 --- .../resolution/resolvelib/factory.py | 739 --- .../resolution/resolvelib/found_candidates.py | 155 - .../resolution/resolvelib/provider.py | 248 - .../resolution/resolvelib/reporter.py | 68 - .../resolution/resolvelib/requirements.py | 166 - .../resolution/resolvelib/resolver.py | 292 -- .../pip/_internal/self_outdated_check.py | 189 - .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 182 -> 0 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 1510 -> 0 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 1608 -> 0 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 1498 -> 0 bytes .../compatibility_tags.cpython-310.pyc | Bin 4067 -> 0 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 505 -> 0 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 3303 -> 0 bytes .../direct_url_helpers.cpython-310.pyc | Bin 2073 -> 0 bytes .../distutils_args.cpython-310.pyc | Bin 1089 -> 0 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 2138 -> 0 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 1295 -> 0 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 1292 -> 0 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 5150 -> 0 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 932 -> 0 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 1661 -> 0 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 5184 -> 0 bytes .../inject_securetransport.cpython-310.pyc | Bin 977 -> 0 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 9621 -> 0 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 19387 -> 0 bytes .../utils/__pycache__/models.cpython-310.pyc | Bin 1978 -> 0 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 2070 -> 0 bytes .../setuptools_build.cpython-310.pyc | Bin 4585 -> 0 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 5764 -> 0 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 7287 -> 0 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 6642 -> 0 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 1575 -> 0 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 3278 -> 0 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 4403 -> 0 bytes .../site-packages/pip/_internal/utils/_log.py | 38 - .../pip/_internal/utils/appdirs.py | 52 - .../pip/_internal/utils/compat.py | 63 - .../pip/_internal/utils/compatibility_tags.py | 165 - .../pip/_internal/utils/datetime.py | 11 - .../pip/_internal/utils/deprecation.py | 120 - .../pip/_internal/utils/direct_url_helpers.py | 87 - .../pip/_internal/utils/distutils_args.py | 42 - .../pip/_internal/utils/egg_link.py | 75 - .../pip/_internal/utils/encoding.py | 36 - .../pip/_internal/utils/entrypoints.py | 27 - .../pip/_internal/utils/filesystem.py | 182 - .../pip/_internal/utils/filetypes.py | 27 - .../pip/_internal/utils/glibc.py | 88 - .../pip/_internal/utils/hashes.py | 144 - .../_internal/utils/inject_securetransport.py | 35 - .../pip/_internal/utils/logging.py | 343 -- .../site-packages/pip/_internal/utils/misc.py | 653 --- .../pip/_internal/utils/models.py | 39 - .../pip/_internal/utils/packaging.py | 57 - .../pip/_internal/utils/setuptools_build.py | 195 - .../pip/_internal/utils/subprocess.py | 260 - .../pip/_internal/utils/temp_dir.py | 246 - .../pip/_internal/utils/unpacking.py | 258 - .../site-packages/pip/_internal/utils/urls.py | 62 - .../pip/_internal/utils/virtualenv.py | 104 - .../pip/_internal/utils/wheel.py | 136 - .../pip/_internal/vcs/__init__.py | 15 - .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 505 -> 0 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 3332 -> 0 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 12535 -> 0 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 5051 -> 0 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 8439 -> 0 bytes .../versioncontrol.cpython-310.pyc | Bin 21134 -> 0 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 101 - .../site-packages/pip/_internal/vcs/git.py | 526 -- .../pip/_internal/vcs/mercurial.py | 163 - .../pip/_internal/vcs/subversion.py | 324 -- .../pip/_internal/vcs/versioncontrol.py | 705 --- .../pip/_internal/wheel_builder.py | 377 -- .../site-packages/pip/_vendor/__init__.py | 111 - .../__pycache__/__init__.cpython-310.pyc | Bin 2905 -> 0 bytes .../__pycache__/distro.cpython-310.pyc | Bin 38223 -> 0 bytes .../_vendor/__pycache__/six.cpython-310.pyc | Bin 27572 -> 0 bytes .../typing_extensions.cpython-310.pyc | Bin 66568 -> 0 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 - .../__pycache__/__init__.cpython-310.pyc | Bin 633 -> 0 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 1571 -> 0 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 3147 -> 0 bytes .../__pycache__/cache.cpython-310.pyc | Bin 1837 -> 0 bytes .../__pycache__/compat.cpython-310.pyc | Bin 747 -> 0 bytes .../__pycache__/controller.cpython-310.pyc | Bin 8201 -> 0 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 2783 -> 0 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 4707 -> 0 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 4242 -> 0 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 678 -> 0 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 - .../pip/_vendor/cachecontrol/adapter.py | 137 - .../pip/_vendor/cachecontrol/cache.py | 43 - .../_vendor/cachecontrol/caches/__init__.py | 6 - .../__pycache__/__init__.cpython-310.pyc | Bin 284 -> 0 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 3358 -> 0 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 1564 -> 0 bytes .../_vendor/cachecontrol/caches/file_cache.py | 150 - .../cachecontrol/caches/redis_cache.py | 37 - .../pip/_vendor/cachecontrol/compat.py | 32 - .../pip/_vendor/cachecontrol/controller.py | 415 -- .../pip/_vendor/cachecontrol/filewrapper.py | 111 - .../pip/_vendor/cachecontrol/heuristics.py | 139 - .../pip/_vendor/cachecontrol/serialize.py | 186 - .../pip/_vendor/cachecontrol/wrapper.py | 33 - .../pip/_vendor/certifi/__init__.py | 3 - .../pip/_vendor/certifi/__main__.py | 12 - .../__pycache__/__init__.cpython-310.pyc | Bin 266 -> 0 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 445 -> 0 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 1504 -> 0 bytes .../pip/_vendor/certifi/cacert.pem | 4362 ----------------- .../site-packages/pip/_vendor/certifi/core.py | 76 - .../pip/_vendor/chardet/__init__.py | 83 - .../__pycache__/__init__.cpython-310.pyc | Bin 1890 -> 0 bytes .../__pycache__/big5freq.cpython-310.pyc | Bin 27169 -> 0 bytes .../__pycache__/big5prober.cpython-310.pyc | Bin 1120 -> 0 bytes .../chardistribution.cpython-310.pyc | Bin 5730 -> 0 bytes .../charsetgroupprober.cpython-310.pyc | Bin 2219 -> 0 bytes .../__pycache__/charsetprober.cpython-310.pyc | Bin 3473 -> 0 bytes .../codingstatemachine.cpython-310.pyc | Bin 2892 -> 0 bytes .../__pycache__/compat.cpython-310.pyc | Bin 391 -> 0 bytes screenshot.png | Bin 75271 -> 0 bytes 1571 files changed, 202110 deletions(-) delete mode 100644 .venv/bin/Activate.ps1 delete mode 100644 .venv/bin/activate delete mode 100644 .venv/bin/activate.csh delete mode 100644 .venv/bin/activate.fish delete mode 100755 .venv/bin/celery delete mode 100755 .venv/bin/flask delete mode 100755 .venv/bin/pip delete mode 100755 .venv/bin/pip3 delete mode 100755 .venv/bin/pip3.10 delete mode 120000 .venv/bin/python delete mode 120000 .venv/bin/python3 delete mode 120000 .venv/bin/python3.10 delete mode 100644 .venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst delete mode 100644 .venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/__pycache__/six.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/_distutils_hack/override.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/abstract_channel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/basic_message.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/channel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/method_framing.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/platform.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/protocol.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/sasl.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/serialization.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/spec.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/transport.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/amqp/abstract_channel.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/basic_message.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/channel.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/method_framing.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/platform.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/protocol.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/sasl.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/serialization.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/spec.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/transport.py delete mode 100644 .venv/lib/python3.10/site-packages/amqp/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/_ext.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/_win.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/common.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/compat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/context.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/einfo.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/forkserver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/heap.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/managers.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/pool.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/popen_fork.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/popen_forkserver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/process.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/queues.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/reduction.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/resource_sharer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/semaphore_tracker.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/sharedctypes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/spawn.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/synchronize.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/__pycache__/util.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/_ext.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/_win.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/common.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/compat.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/context.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/dummy/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/dummy/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/dummy/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/billiard/dummy/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/einfo.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/forkserver.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/heap.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/managers.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/pool.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/popen_fork.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/popen_forkserver.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/popen_spawn_posix.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/popen_spawn_win32.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/process.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/queues.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/reduction.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/resource_sharer.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/semaphore_tracker.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/sharedctypes.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/spawn.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/synchronize.py delete mode 100644 .venv/lib/python3.10/site-packages/billiard/util.py delete mode 100644 .venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/blinker/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/blinker/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/blinker/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/blinker/_utilities.py delete mode 100644 .venv/lib/python3.10/site-packages/blinker/base.py delete mode 100644 .venv/lib/python3.10/site-packages/blinker/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/bson/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/_helpers.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/binary.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/code.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/codec_options.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/datetime_ms.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/dbref.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/decimal128.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/errors.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/int64.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/json_util.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/max_key.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/min_key.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/objectid.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/raw_bson.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/regex.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/son.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/timestamp.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/typings.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/bson/__pycache__/tz_util.cpython-310.pyc delete mode 100755 .venv/lib/python3.10/site-packages/bson/_cbson.cpython-310-x86_64-linux-gnu.so delete mode 100644 .venv/lib/python3.10/site-packages/bson/_cbsonmodule.c delete mode 100644 .venv/lib/python3.10/site-packages/bson/_cbsonmodule.h delete mode 100644 .venv/lib/python3.10/site-packages/bson/_helpers.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/binary.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/bson-endian.h delete mode 100644 .venv/lib/python3.10/site-packages/bson/buffer.c delete mode 100644 .venv/lib/python3.10/site-packages/bson/buffer.h delete mode 100644 .venv/lib/python3.10/site-packages/bson/code.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/codec_options.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/datetime_ms.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/dbref.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/decimal128.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/errors.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/int64.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/json_util.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/max_key.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/min_key.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/objectid.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/bson/raw_bson.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/regex.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/son.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/time64.c delete mode 100644 .venv/lib/python3.10/site-packages/bson/time64.h delete mode 100644 .venv/lib/python3.10/site-packages/bson/time64_config.h delete mode 100644 .venv/lib/python3.10/site-packages/bson/time64_limits.h delete mode 100644 .venv/lib/python3.10/site-packages/bson/timestamp.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/typings.py delete mode 100644 .venv/lib/python3.10/site-packages/bson/tz_util.py delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.10/site-packages/celery-5.4.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/celery/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/__main__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/__main__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/_state.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/beat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/bootsteps.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/canvas.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/local.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/platforms.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/result.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/schedules.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/signals.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/__pycache__/states.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/_state.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/amqp.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/annotations.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/autoretry.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/backends.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/builtins.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/control.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/defaults.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/events.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/log.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/registry.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/routes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/task.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/trace.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/amqp.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/annotations.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/autoretry.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/backends.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/base.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/builtins.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/control.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/defaults.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/events.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/log.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/registry.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/routes.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/task.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/trace.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/app/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/__pycache__/beat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/__pycache__/multi.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/__pycache__/worker.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/beat.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/multi.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/apps/worker.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/arangodb.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/asynchronous.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/azureblockblob.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/cassandra.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/consul.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/couchbase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/couchdb.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/dynamodb.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/elasticsearch.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/filesystem.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/gcs.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/mongodb.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/redis.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/rpc.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/__pycache__/s3.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/arangodb.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/asynchronous.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/azureblockblob.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/base.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/cache.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/cassandra.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/consul.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/cosmosdbsql.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/couchbase.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/couchdb.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/database/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/database/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/database/__pycache__/models.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/database/__pycache__/session.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/database/models.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/database/session.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/dynamodb.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/elasticsearch.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/filesystem.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/gcs.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/mongodb.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/redis.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/rpc.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/backends/s3.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/beat.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/amqp.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/beat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/call.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/celery.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/control.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/events.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/graph.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/list.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/logtool.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/migrate.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/multi.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/purge.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/result.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/shell.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/upgrade.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/__pycache__/worker.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/amqp.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/base.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/beat.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/call.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/celery.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/control.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/events.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/graph.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/list.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/logtool.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/migrate.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/multi.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/purge.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/result.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/shell.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/upgrade.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bin/worker.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/bootsteps.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/canvas.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/asynpool.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/eventlet.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/gevent.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/prefork.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/solo.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/__pycache__/thread.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/asynpool.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/base.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/eventlet.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/gevent.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/prefork.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/solo.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/concurrency/thread.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__pycache__/abortable.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__pycache__/migrate.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__pycache__/pytest.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__pycache__/rdb.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/__pycache__/sphinx.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/abortable.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/django/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/django/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/django/__pycache__/task.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/django/task.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/migrate.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/pytest.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/rdb.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/sphinx.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__pycache__/app.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__pycache__/manager.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/__pycache__/worker.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/app.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/manager.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/mocks.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/tasks.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/contrib/testing/worker.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/cursesmon.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/dispatcher.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/dumper.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/event.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/receiver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/snapshot.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/__pycache__/state.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/cursesmon.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/dispatcher.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/dumper.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/event.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/receiver.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/snapshot.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/events/state.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/fixups/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/fixups/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/fixups/__pycache__/django.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/fixups/django.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/__pycache__/app.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/__pycache__/default.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/app.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/base.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/loaders/default.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/local.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/platforms.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/result.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/schedules.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/__pycache__/certificate.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/__pycache__/key.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/__pycache__/serialization.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/certificate.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/key.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/serialization.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/security/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/signals.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/states.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/abstract.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/collections.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/debug.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/deprecated.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/functional.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/graph.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/imports.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/iso8601.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/log.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/nodenames.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/objects.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/saferepr.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/serialization.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/sysinfo.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/term.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/text.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/threads.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/time.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/__pycache__/timer2.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/abstract.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/collections.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/debug.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/deprecated.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/dispatch/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/dispatch/signal.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/functional.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/graph.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/imports.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/iso8601.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/log.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/nodenames.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/objects.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/saferepr.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/serialization.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/static/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/static/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/static/celery_128.png delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/sysinfo.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/term.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/text.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/threads.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/time.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/utils/timer2.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/autoscale.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/components.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/control.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/heartbeat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/loops.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/pidbox.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/request.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/state.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/strategy.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/__pycache__/worker.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/autoscale.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/components.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/agent.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/control.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/events.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/heart.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/agent.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/consumer.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/control.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/events.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/gossip.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/heart.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/mingle.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/consumer/tasks.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/control.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/heartbeat.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/loops.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/pidbox.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/request.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/state.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/strategy.py delete mode 100644 .venv/lib/python3.10/site-packages/celery/worker/worker.py delete mode 100644 .venv/lib/python3.10/site-packages/click-8.1.7.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/click-8.1.7.dist-info/LICENSE.rst delete mode 100644 .venv/lib/python3.10/site-packages/click-8.1.7.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/click-8.1.7.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/click-8.1.7.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/click-8.1.7.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/click/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_compat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_termui_impl.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_textwrap.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/_winconsole.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/core.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/decorators.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/formatting.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/globals.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/parser.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/shell_completion.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/termui.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/testing.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/types.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click/_compat.py delete mode 100644 .venv/lib/python3.10/site-packages/click/_termui_impl.py delete mode 100644 .venv/lib/python3.10/site-packages/click/_textwrap.py delete mode 100644 .venv/lib/python3.10/site-packages/click/_winconsole.py delete mode 100644 .venv/lib/python3.10/site-packages/click/core.py delete mode 100644 .venv/lib/python3.10/site-packages/click/decorators.py delete mode 100644 .venv/lib/python3.10/site-packages/click/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/click/formatting.py delete mode 100644 .venv/lib/python3.10/site-packages/click/globals.py delete mode 100644 .venv/lib/python3.10/site-packages/click/parser.py delete mode 100644 .venv/lib/python3.10/site-packages/click/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/click/shell_completion.py delete mode 100644 .venv/lib/python3.10/site-packages/click/termui.py delete mode 100644 .venv/lib/python3.10/site-packages/click/testing.py delete mode 100644 .venv/lib/python3.10/site-packages/click/types.py delete mode 100644 .venv/lib/python3.10/site-packages/click/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean-0.3.1.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean-0.3.1.dist-info/LICENSE delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean-0.3.1.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean-0.3.1.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean-0.3.1.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/click_didyoumean/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/AUTHORS.txt delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins-1.1.1.dist-info/zip-safe delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins/__pycache__/core.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_plugins/core.py delete mode 100644 .venv/lib/python3.10/site-packages/click_repl-0.3.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/click_repl-0.3.0.dist-info/LICENSE delete mode 100644 .venv/lib/python3.10/site-packages/click_repl-0.3.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/click_repl-0.3.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/click_repl-0.3.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/click_repl-0.3.0.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/__pycache__/_completer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/__pycache__/_repl.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/_completer.py delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/_repl.py delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/click_repl/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/_common.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/_version.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/easter.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/relativedelta.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/rrule.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/tzwin.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/_common.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/_version.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/easter.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/parser/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/parser/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/parser/__pycache__/_parser.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/parser/__pycache__/isoparser.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/parser/_parser.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/parser/isoparser.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/relativedelta.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/rrule.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/__pycache__/_common.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/__pycache__/_factories.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/__pycache__/tz.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/__pycache__/win.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/_common.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/_factories.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/tz.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tz/win.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/tzwin.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/zoneinfo/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/zoneinfo/dateutil-zoneinfo.tar.gz delete mode 100644 .venv/lib/python3.10/site-packages/dateutil/zoneinfo/rebuild.py delete mode 100644 .venv/lib/python3.10/site-packages/distutils-precedence.pth delete mode 100644 .venv/lib/python3.10/site-packages/dns/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/_asyncbackend.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/_asyncio_backend.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/_ddr.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/_features.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/_immutable_ctx.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/_trio_backend.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/asyncbackend.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/asyncquery.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/asyncresolver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/dnssec.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/dnssectypes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/e164.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/edns.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/entropy.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/enum.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/exception.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/flags.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/grange.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/immutable.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/inet.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/ipv4.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/ipv6.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/message.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/name.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/namedict.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/nameserver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/node.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/opcode.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/query.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/rcode.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/rdata.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/rdataclass.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/rdataset.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/rdatatype.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/renderer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/resolver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/reversename.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/rrset.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/serial.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/set.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/tokenizer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/transaction.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/tsig.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/tsigkeyring.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/ttl.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/update.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/version.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/versioned.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/win32util.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/wire.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/xfr.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/zone.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/zonefile.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/__pycache__/zonetypes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/_asyncbackend.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/_asyncio_backend.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/_ddr.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/_features.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/_immutable_ctx.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/_trio_backend.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/asyncbackend.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/asyncquery.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/asyncresolver.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssec.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/cryptography.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/dsa.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/ecdsa.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/eddsa.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/__pycache__/rsa.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/base.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/cryptography.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/dsa.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/ecdsa.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/eddsa.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssecalgs/rsa.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/dnssectypes.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/e164.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/edns.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/entropy.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/enum.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/exception.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/flags.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/grange.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/immutable.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/inet.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/ipv4.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/ipv6.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/message.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/name.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/namedict.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/nameserver.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/node.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/opcode.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/dns/query.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/__pycache__/_asyncio.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/__pycache__/_common.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/__pycache__/_sync.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/__pycache__/_trio.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/_asyncio.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/_common.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/_sync.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/quic/_trio.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rcode.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdata.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdataclass.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdataset.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdatatype.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/AFSDB.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/AMTRELAY.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/AVC.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/CAA.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/CDNSKEY.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/CDS.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/CERT.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/CNAME.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/CSYNC.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/DLV.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/DNAME.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/DNSKEY.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/DS.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/EUI48.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/EUI64.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/GPOS.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/HINFO.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/HIP.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/ISDN.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/L32.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/L64.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/LOC.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/LP.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/MX.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/NID.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/NINFO.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/NS.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/NSEC.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/NSEC3.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/NSEC3PARAM.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/OPENPGPKEY.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/OPT.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/PTR.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/RP.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/RRSIG.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/RT.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/SMIMEA.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/SOA.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/SPF.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/SSHFP.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/TKEY.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/TLSA.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/TSIG.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/TXT.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/URI.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/X25.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/ZONEMD.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/AFSDB.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/AMTRELAY.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/AVC.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/CAA.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/CDNSKEY.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/CDS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/CERT.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/CNAME.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/CSYNC.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/DLV.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/DNAME.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/DNSKEY.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/DS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/EUI48.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/EUI64.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/GPOS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/HINFO.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/HIP.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/ISDN.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/L32.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/L64.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/LOC.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/LP.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/MX.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/NID.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/NINFO.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/NS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/NSEC.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/NSEC3PARAM.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/OPENPGPKEY.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/OPT.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/PTR.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/RP.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/RRSIG.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/RT.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/SMIMEA.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/SOA.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/SPF.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/SSHFP.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/TKEY.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/TLSA.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/TSIG.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/TXT.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/URI.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/X25.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/ZONEMD.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/ANY/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/CH/A.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/CH/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/CH/__pycache__/A.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/CH/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/A.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/AAAA.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/APL.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/DHCID.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/HTTPS.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/IPSECKEY.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/KX.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/NAPTR.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/NSAP.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/NSAP_PTR.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/PX.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/SRV.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/SVCB.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/WKS.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/A.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/AAAA.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/APL.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/DHCID.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/HTTPS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/IPSECKEY.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/KX.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/NAPTR.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/NSAP.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/NSAP_PTR.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/PX.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/SRV.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/SVCB.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/WKS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/IN/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/dnskeybase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/dsbase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/euibase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/mxbase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/nsbase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/svcbbase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/tlsabase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/txtbase.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/__pycache__/util.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/dnskeybase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/dsbase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/euibase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/mxbase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/nsbase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/svcbbase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/tlsabase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/txtbase.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rdtypes/util.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/renderer.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/resolver.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/reversename.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/rrset.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/serial.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/set.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/tokenizer.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/transaction.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/tsig.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/tsigkeyring.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/ttl.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/update.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/version.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/versioned.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/win32util.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/wire.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/xfr.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/zone.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/zonefile.py delete mode 100644 .venv/lib/python3.10/site-packages/dns/zonetypes.py delete mode 100644 .venv/lib/python3.10/site-packages/dnspython-2.6.1.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/dnspython-2.6.1.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/dnspython-2.6.1.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/dnspython-2.6.1.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/dnspython-2.6.1.dist-info/licenses/LICENSE delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/flask-3.0.3.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.10/site-packages/flask/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/__main__.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/__main__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/app.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/blueprints.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/cli.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/config.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/ctx.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/debughelpers.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/globals.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/helpers.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/logging.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/sessions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/signals.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/templating.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/testing.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/typing.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/views.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/__pycache__/wrappers.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/app.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/blueprints.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/cli.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/config.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/ctx.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/debughelpers.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/globals.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/helpers.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/json/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/json/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/json/__pycache__/provider.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/json/__pycache__/tag.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/json/provider.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/json/tag.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/logging.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/README.md delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/__pycache__/app.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/__pycache__/blueprints.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/__pycache__/scaffold.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/app.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/blueprints.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/sansio/scaffold.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/sessions.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/signals.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/templating.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/testing.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/typing.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/views.py delete mode 100644 .venv/lib/python3.10/site-packages/flask/wrappers.py delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail-0.10.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail-0.10.0.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail-0.10.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail-0.10.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail-0.10.0.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail-0.10.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/flask_mail/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/__pycache__/errors.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/__pycache__/grid_file.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/errors.py delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/grid_file.py delete mode 100644 .venv/lib/python3.10/site-packages/gridfs/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous-2.2.0.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous-2.2.0.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous-2.2.0.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous-2.2.0.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous-2.2.0.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/_json.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/encoding.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/exc.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/serializer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/signer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/timed.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/__pycache__/url_safe.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/_json.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/encoding.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/exc.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/serializer.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/signer.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/timed.py delete mode 100644 .venv/lib/python3.10/site-packages/itsdangerous/url_safe.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.4.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.4.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.4.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.4.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.4.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/jinja2-3.1.4.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/_identifier.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/async_utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/bccache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/compiler.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/constants.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/debug.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/defaults.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/environment.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/ext.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/filters.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/idtracking.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/lexer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/loaders.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/meta.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/nativetypes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/nodes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/optimizer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/parser.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/runtime.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/sandbox.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/tests.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/__pycache__/visitor.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/_identifier.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/async_utils.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/bccache.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/compiler.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/constants.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/debug.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/defaults.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/environment.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/ext.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/filters.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/idtracking.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/lexer.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/loaders.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/meta.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/nativetypes.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/nodes.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/optimizer.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/parser.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/runtime.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/sandbox.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/tests.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/jinja2/visitor.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu-5.3.7.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/kombu-5.3.7.dist-info/LICENSE delete mode 100644 .venv/lib/python3.10/site-packages/kombu-5.3.7.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/kombu-5.3.7.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/kombu-5.3.7.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/kombu-5.3.7.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/abstract.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/clocks.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/common.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/compat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/compression.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/entity.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/log.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/matcher.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/message.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/messaging.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/mixins.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/pidbox.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/pools.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/resource.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/serialization.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/__pycache__/simple.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/abstract.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/__pycache__/debug.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/__pycache__/hub.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/__pycache__/semaphore.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/__pycache__/timer.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/__pycache__/ext.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/ext.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/__pycache__/connection.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/__pycache__/ext.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/__pycache__/message.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/__pycache__/queue.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/ext.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/message.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/aws/sqs/queue.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/debug.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/http/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/http/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/http/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/http/__pycache__/curl.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/http/base.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/http/curl.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/hub.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/semaphore.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/asynchronous/timer.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/clocks.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/common.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/compat.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/compression.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/connection.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/entity.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/log.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/matcher.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/message.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/messaging.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/mixins.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/pidbox.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/pools.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/resource.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/serialization.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/simple.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/SLMQ.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/SQS.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/SLMQ.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/SQS.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/azureservicebus.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/azurestoragequeues.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/confluentkafka.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/consul.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/etcd.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/filesystem.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/librabbitmq.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/memory.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/mongodb.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/pyamqp.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/pyro.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/qpid.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/redis.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/__pycache__/zookeeper.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/azureservicebus.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/azurestoragequeues.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/base.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/confluentkafka.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/consul.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/etcd.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/filesystem.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/librabbitmq.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/memory.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/mongodb.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/pyamqp.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/pyro.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/qpid.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/redis.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/sqlalchemy/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/sqlalchemy/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/sqlalchemy/__pycache__/models.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/sqlalchemy/models.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/virtual/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/virtual/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/virtual/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/virtual/__pycache__/exchange.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/virtual/base.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/virtual/exchange.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/transport/zookeeper.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/amq_manager.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/collections.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/compat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/debug.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/div.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/encoding.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/eventio.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/functional.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/imports.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/json.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/limits.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/objects.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/scheduling.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/text.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/time.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/url.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/__pycache__/uuid.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/amq_manager.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/collections.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/compat.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/debug.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/div.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/encoding.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/eventio.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/functional.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/imports.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/json.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/limits.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/objects.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/scheduling.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/text.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/time.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/url.py delete mode 100644 .venv/lib/python3.10/site-packages/kombu/utils/uuid.py delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/__pycache__/_native.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/_native.py delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/_speedups.c delete mode 100755 .venv/lib/python3.10/site-packages/markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/_speedups.pyi delete mode 100644 .venv/lib/python3.10/site-packages/markupsafe/py.typed delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/INSTALLER delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/LICENSE.txt delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/METADATA delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/RECORD delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/REQUESTED delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/WHEEL delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/entry_points.txt delete mode 100644 .venv/lib/python3.10/site-packages/pip-22.0.2.dist-info/top_level.txt delete mode 100644 .venv/lib/python3.10/site-packages/pip/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/__main__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/__pycache__/__main__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/build_env.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/build_env.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cache.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/autocompletion.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/base_command.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/cmdoptions.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/command_context.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/main.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/main_parser.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/parser.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/progress_bars.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/req_command.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/spinners.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/cli/status_codes.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/completion.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/download.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/show.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/cache.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/check.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/completion.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/configuration.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/debug.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/download.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/freeze.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/hash.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/help.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/index.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/install.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/list.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/search.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/show.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/uninstall.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/commands/wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/configuration.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/base.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/installed.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/sdist.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/distributions/wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/exceptions.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/collector.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/package_finder.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/index/sources.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/_distutils.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/_sysconfig.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/locations/base.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/main.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/base.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/metadata/pkg_resources.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/target_python.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/__pycache__/wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/candidate.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/direct_url.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/format_control.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/index.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/link.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/scheme.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/search_scope.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/selection_prefs.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/target_python.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/models/wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/download.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/session.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/auth.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/cache.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/download.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/lazy_wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/session.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/utils.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/network/xmlrpc.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_editable.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/metadata_legacy.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_editable.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/build/wheel_legacy.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/check.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/freeze.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/editable_legacy.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/legacy.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/install/wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/operations/prepare.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/pyproject.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/constructors.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/constructors.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_file.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_install.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_set.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_tracker.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/req/req_uninstall.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/base.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/legacy/resolver.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/base.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/candidates.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/factory.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/provider.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/reporter.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/requirements.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/resolution/resolvelib/resolver.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/self_outdated_check.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/logging.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/misc.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/models.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/_log.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/appdirs.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/compat.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/compatibility_tags.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/datetime.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/deprecation.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/direct_url_helpers.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/distutils_args.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/egg_link.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/encoding.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/entrypoints.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/filesystem.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/filetypes.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/glibc.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/hashes.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/inject_securetransport.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/logging.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/misc.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/models.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/packaging.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/setuptools_build.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/subprocess.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/temp_dir.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/unpacking.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/urls.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/virtualenv.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/utils/wheel.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/bazaar.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/git.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/mercurial.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/subversion.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/vcs/versioncontrol.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_internal/wheel_builder.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/distro.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/six.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/_cmd.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/adapter.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/cache.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/compat.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/controller.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/filewrapper.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/heuristics.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/serialize.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/cachecontrol/wrapper.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__main__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/cacert.pem delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/certifi/core.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__init__.py delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc delete mode 100644 .venv/lib/python3.10/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-310.pyc delete mode 100644 screenshot.png diff --git a/.venv/bin/Activate.ps1 b/.venv/bin/Activate.ps1 deleted file mode 100644 index b49d77b..0000000 --- a/.venv/bin/Activate.ps1 +++ /dev/null @@ -1,247 +0,0 @@ -<# -.Synopsis -Activate a Python virtual environment for the current PowerShell session. - -.Description -Pushes the python executable for a virtual environment to the front of the -$Env:PATH environment variable and sets the prompt to signify that you are -in a Python virtual environment. Makes use of the command line switches as -well as the `pyvenv.cfg` file values present in the virtual environment. - -.Parameter VenvDir -Path to the directory that contains the virtual environment to activate. The -default value for this is the parent of the directory that the Activate.ps1 -script is located within. - -.Parameter Prompt -The prompt prefix to display when this virtual environment is activated. By -default, this prompt is the name of the virtual environment folder (VenvDir) -surrounded by parentheses and followed by a single space (ie. '(.venv) '). - -.Example -Activate.ps1 -Activates the Python virtual environment that contains the Activate.ps1 script. - -.Example -Activate.ps1 -Verbose -Activates the Python virtual environment that contains the Activate.ps1 script, -and shows extra information about the activation as it executes. - -.Example -Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv -Activates the Python virtual environment located in the specified location. - -.Example -Activate.ps1 -Prompt "MyPython" -Activates the Python virtual environment that contains the Activate.ps1 script, -and prefixes the current prompt with the specified string (surrounded in -parentheses) while the virtual environment is active. - -.Notes -On Windows, it may be required to enable this Activate.ps1 script by setting the -execution policy for the user. You can do this by issuing the following PowerShell -command: - -PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser - -For more information on Execution Policies: -https://go.microsoft.com/fwlink/?LinkID=135170 - -#> -Param( - [Parameter(Mandatory = $false)] - [String] - $VenvDir, - [Parameter(Mandatory = $false)] - [String] - $Prompt -) - -<# Function declarations --------------------------------------------------- #> - -<# -.Synopsis -Remove all shell session elements added by the Activate script, including the -addition of the virtual environment's Python executable from the beginning of -the PATH variable. - -.Parameter NonDestructive -If present, do not remove this function from the global namespace for the -session. - -#> -function global:deactivate ([switch]$NonDestructive) { - # Revert to original values - - # The prior prompt: - if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) { - Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt - Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT - } - - # The prior PYTHONHOME: - if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) { - Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME - Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME - } - - # The prior PATH: - if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) { - Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH - Remove-Item -Path Env:_OLD_VIRTUAL_PATH - } - - # Just remove the VIRTUAL_ENV altogether: - if (Test-Path -Path Env:VIRTUAL_ENV) { - Remove-Item -Path env:VIRTUAL_ENV - } - - # Just remove VIRTUAL_ENV_PROMPT altogether. - if (Test-Path -Path Env:VIRTUAL_ENV_PROMPT) { - Remove-Item -Path env:VIRTUAL_ENV_PROMPT - } - - # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether: - if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) { - Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force - } - - # Leave deactivate function in the global namespace if requested: - if (-not $NonDestructive) { - Remove-Item -Path function:deactivate - } -} - -<# -.Description -Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the -given folder, and returns them in a map. - -For each line in the pyvenv.cfg file, if that line can be parsed into exactly -two strings separated by `=` (with any amount of whitespace surrounding the =) -then it is considered a `key = value` line. The left hand string is the key, -the right hand is the value. - -If the value starts with a `'` or a `"` then the first and last character is -stripped from the value before being captured. - -.Parameter ConfigDir -Path to the directory that contains the `pyvenv.cfg` file. -#> -function Get-PyVenvConfig( - [String] - $ConfigDir -) { - Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg" - - # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue). - $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue - - # An empty map will be returned if no config file is found. - $pyvenvConfig = @{ } - - if ($pyvenvConfigPath) { - - Write-Verbose "File exists, parse `key = value` lines" - $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath - - $pyvenvConfigContent | ForEach-Object { - $keyval = $PSItem -split "\s*=\s*", 2 - if ($keyval[0] -and $keyval[1]) { - $val = $keyval[1] - - # Remove extraneous quotations around a string value. - if ("'""".Contains($val.Substring(0, 1))) { - $val = $val.Substring(1, $val.Length - 2) - } - - $pyvenvConfig[$keyval[0]] = $val - Write-Verbose "Adding Key: '$($keyval[0])'='$val'" - } - } - } - return $pyvenvConfig -} - - -<# Begin Activate script --------------------------------------------------- #> - -# Determine the containing directory of this script -$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition -$VenvExecDir = Get-Item -Path $VenvExecPath - -Write-Verbose "Activation script is located in path: '$VenvExecPath'" -Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)" -Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)" - -# Set values required in priority: CmdLine, ConfigFile, Default -# First, get the location of the virtual environment, it might not be -# VenvExecDir if specified on the command line. -if ($VenvDir) { - Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values" -} -else { - Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir." - $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/") - Write-Verbose "VenvDir=$VenvDir" -} - -# Next, read the `pyvenv.cfg` file to determine any required value such -# as `prompt`. -$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir - -# Next, set the prompt from the command line, or the config file, or -# just use the name of the virtual environment folder. -if ($Prompt) { - Write-Verbose "Prompt specified as argument, using '$Prompt'" -} -else { - Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value" - if ($pyvenvCfg -and $pyvenvCfg['prompt']) { - Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'" - $Prompt = $pyvenvCfg['prompt']; - } - else { - Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virtual environment)" - Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'" - $Prompt = Split-Path -Path $venvDir -Leaf - } -} - -Write-Verbose "Prompt = '$Prompt'" -Write-Verbose "VenvDir='$VenvDir'" - -# Deactivate any currently active virtual environment, but leave the -# deactivate function in place. -deactivate -nondestructive - -# Now set the environment variable VIRTUAL_ENV, used by many tools to determine -# that there is an activated venv. -$env:VIRTUAL_ENV = $VenvDir - -if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) { - - Write-Verbose "Setting prompt to '$Prompt'" - - # Set the prompt to include the env name - # Make sure _OLD_VIRTUAL_PROMPT is global - function global:_OLD_VIRTUAL_PROMPT { "" } - Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT - New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt - - function global:prompt { - Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) " - _OLD_VIRTUAL_PROMPT - } - $env:VIRTUAL_ENV_PROMPT = $Prompt -} - -# Clear PYTHONHOME -if (Test-Path -Path Env:PYTHONHOME) { - Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME - Remove-Item -Path Env:PYTHONHOME -} - -# Add the venv to the PATH -Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH -$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" diff --git a/.venv/bin/activate b/.venv/bin/activate deleted file mode 100644 index 94ede4f..0000000 --- a/.venv/bin/activate +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source bin/activate" *from bash* -# you cannot run it directly - -deactivate () { - # reset old environment variables - if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then - PATH="${_OLD_VIRTUAL_PATH:-}" - export PATH - unset _OLD_VIRTUAL_PATH - fi - if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then - PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}" - export PYTHONHOME - unset _OLD_VIRTUAL_PYTHONHOME - fi - - # This should detect bash and zsh, which have a hash command that must - # be called to get it to forget past commands. Without forgetting - # past commands the $PATH changes we made may not be respected - if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null - fi - - if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then - PS1="${_OLD_VIRTUAL_PS1:-}" - export PS1 - unset _OLD_VIRTUAL_PS1 - fi - - unset VIRTUAL_ENV - unset VIRTUAL_ENV_PROMPT - if [ ! "${1:-}" = "nondestructive" ] ; then - # Self destruct! - unset -f deactivate - fi -} - -# unset irrelevant variables -deactivate nondestructive - -VIRTUAL_ENV="/home/mercy/newsletter/.venv" -export VIRTUAL_ENV - -_OLD_VIRTUAL_PATH="$PATH" -PATH="$VIRTUAL_ENV/bin:$PATH" -export PATH - -# unset PYTHONHOME if set -# this will fail if PYTHONHOME is set to the empty string (which is bad anyway) -# could use `if (set -u; : $PYTHONHOME) ;` in bash -if [ -n "${PYTHONHOME:-}" ] ; then - _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}" - unset PYTHONHOME -fi - -if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then - _OLD_VIRTUAL_PS1="${PS1:-}" - PS1="(.venv) ${PS1:-}" - export PS1 - VIRTUAL_ENV_PROMPT="(.venv) " - export VIRTUAL_ENV_PROMPT -fi - -# This should detect bash and zsh, which have a hash command that must -# be called to get it to forget past commands. Without forgetting -# past commands the $PATH changes we made may not be respected -if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then - hash -r 2> /dev/null -fi diff --git a/.venv/bin/activate.csh b/.venv/bin/activate.csh deleted file mode 100644 index ec7800d..0000000 --- a/.venv/bin/activate.csh +++ /dev/null @@ -1,26 +0,0 @@ -# This file must be used with "source bin/activate.csh" *from csh*. -# You cannot run it directly. -# Created by Davide Di Blasi . -# Ported to Python 3.3 venv by Andrew Svetlov - -alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; unsetenv VIRTUAL_ENV_PROMPT; test "\!:*" != "nondestructive" && unalias deactivate' - -# Unset irrelevant variables. -deactivate nondestructive - -setenv VIRTUAL_ENV "/home/mercy/newsletter/.venv" - -set _OLD_VIRTUAL_PATH="$PATH" -setenv PATH "$VIRTUAL_ENV/bin:$PATH" - - -set _OLD_VIRTUAL_PROMPT="$prompt" - -if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then - set prompt = "(.venv) $prompt" - setenv VIRTUAL_ENV_PROMPT "(.venv) " -endif - -alias pydoc python -m pydoc - -rehash diff --git a/.venv/bin/activate.fish b/.venv/bin/activate.fish deleted file mode 100644 index 3331ec3..0000000 --- a/.venv/bin/activate.fish +++ /dev/null @@ -1,69 +0,0 @@ -# This file must be used with "source /bin/activate.fish" *from fish* -# (https://fishshell.com/); you cannot run it directly. - -function deactivate -d "Exit virtual environment and return to normal shell environment" - # reset old environment variables - if test -n "$_OLD_VIRTUAL_PATH" - set -gx PATH $_OLD_VIRTUAL_PATH - set -e _OLD_VIRTUAL_PATH - end - if test -n "$_OLD_VIRTUAL_PYTHONHOME" - set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME - set -e _OLD_VIRTUAL_PYTHONHOME - end - - if test -n "$_OLD_FISH_PROMPT_OVERRIDE" - set -e _OLD_FISH_PROMPT_OVERRIDE - # prevents error when using nested fish instances (Issue #93858) - if functions -q _old_fish_prompt - functions -e fish_prompt - functions -c _old_fish_prompt fish_prompt - functions -e _old_fish_prompt - end - end - - set -e VIRTUAL_ENV - set -e VIRTUAL_ENV_PROMPT - if test "$argv[1]" != "nondestructive" - # Self-destruct! - functions -e deactivate - end -end - -# Unset irrelevant variables. -deactivate nondestructive - -set -gx VIRTUAL_ENV "/home/mercy/newsletter/.venv" - -set -gx _OLD_VIRTUAL_PATH $PATH -set -gx PATH "$VIRTUAL_ENV/bin" $PATH - -# Unset PYTHONHOME if set. -if set -q PYTHONHOME - set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME - set -e PYTHONHOME -end - -if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" - # fish uses a function instead of an env var to generate the prompt. - - # Save the current fish_prompt function as the function _old_fish_prompt. - functions -c fish_prompt _old_fish_prompt - - # With the original prompt function renamed, we can override with our own. - function fish_prompt - # Save the return status of the last command. - set -l old_status $status - - # Output the venv prompt; color taken from the blue of the Python logo. - printf "%s%s%s" (set_color 4B8BBE) "(.venv) " (set_color normal) - - # Restore the return status of the previous command. - echo "exit $old_status" | . - # Output the original/"old" prompt. - _old_fish_prompt - end - - set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" - set -gx VIRTUAL_ENV_PROMPT "(.venv) " -end diff --git a/.venv/bin/celery b/.venv/bin/celery deleted file mode 100755 index 26b9ce0..0000000 --- a/.venv/bin/celery +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/mercy/newsletter/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from celery.__main__ import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/flask b/.venv/bin/flask deleted file mode 100755 index a4f16b9..0000000 --- a/.venv/bin/flask +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/mercy/newsletter/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from flask.cli import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip b/.venv/bin/pip deleted file mode 100755 index aa6b89c..0000000 --- a/.venv/bin/pip +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/mercy/newsletter/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip3 b/.venv/bin/pip3 deleted file mode 100755 index aa6b89c..0000000 --- a/.venv/bin/pip3 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/mercy/newsletter/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/pip3.10 b/.venv/bin/pip3.10 deleted file mode 100755 index aa6b89c..0000000 --- a/.venv/bin/pip3.10 +++ /dev/null @@ -1,8 +0,0 @@ -#!/home/mercy/newsletter/.venv/bin/python3 -# -*- coding: utf-8 -*- -import re -import sys -from pip._internal.cli.main import main -if __name__ == '__main__': - sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) - sys.exit(main()) diff --git a/.venv/bin/python b/.venv/bin/python deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/bin/python3 b/.venv/bin/python3 deleted file mode 120000 index ae65fda..0000000 --- a/.venv/bin/python3 +++ /dev/null @@ -1 +0,0 @@ -/usr/bin/python3 \ No newline at end of file diff --git a/.venv/bin/python3.10 b/.venv/bin/python3.10 deleted file mode 120000 index b8a0adb..0000000 --- a/.venv/bin/python3.10 +++ /dev/null @@ -1 +0,0 @@ -python3 \ No newline at end of file diff --git a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst b/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst deleted file mode 100644 index 9d227a0..0000000 --- a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -Copyright 2010 Pallets - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA b/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA deleted file mode 100644 index dfe37d5..0000000 --- a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/METADATA +++ /dev/null @@ -1,93 +0,0 @@ -Metadata-Version: 2.1 -Name: MarkupSafe -Version: 2.1.5 -Summary: Safely add untrusted strings to HTML/XML markup. -Home-page: https://palletsprojects.com/p/markupsafe/ -Maintainer: Pallets -Maintainer-email: contact@palletsprojects.com -License: BSD-3-Clause -Project-URL: Donate, https://palletsprojects.com/donate -Project-URL: Documentation, https://markupsafe.palletsprojects.com/ -Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/ -Project-URL: Source Code, https://github.com/pallets/markupsafe/ -Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/ -Project-URL: Chat, https://discord.gg/pallets -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Web Environment -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: BSD License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content -Classifier: Topic :: Text Processing :: Markup :: HTML -Requires-Python: >=3.7 -Description-Content-Type: text/x-rst -License-File: LICENSE.rst - -MarkupSafe -========== - -MarkupSafe implements a text object that escapes characters so it is -safe to use in HTML and XML. Characters that have special meanings are -replaced so that they display as the actual characters. This mitigates -injection attacks, meaning untrusted user input can safely be displayed -on a page. - - -Installing ----------- - -Install and update using `pip`_: - -.. code-block:: text - - pip install -U MarkupSafe - -.. _pip: https://pip.pypa.io/en/stable/getting-started/ - - -Examples --------- - -.. code-block:: pycon - - >>> from markupsafe import Markup, escape - - >>> # escape replaces special characters and wraps in Markup - >>> escape("") - Markup('<script>alert(document.cookie);</script>') - - >>> # wrap in Markup to mark text "safe" and prevent escaping - >>> Markup("Hello") - Markup('hello') - - >>> escape(Markup("Hello")) - Markup('hello') - - >>> # Markup is a str subclass - >>> # methods and operators escape their arguments - >>> template = Markup("Hello {name}") - >>> template.format(name='"World"') - Markup('Hello "World"') - - -Donate ------- - -The Pallets organization develops and supports MarkupSafe and other -popular packages. In order to grow the community of contributors and -users, and allow the maintainers to devote more time to the projects, -`please donate today`_. - -.. _please donate today: https://palletsprojects.com/donate - - -Links ------ - -- Documentation: https://markupsafe.palletsprojects.com/ -- Changes: https://markupsafe.palletsprojects.com/changes/ -- PyPI Releases: https://pypi.org/project/MarkupSafe/ -- Source Code: https://github.com/pallets/markupsafe/ -- Issue Tracker: https://github.com/pallets/markupsafe/issues/ -- Chat: https://discord.gg/pallets diff --git a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD b/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD deleted file mode 100644 index 1a961ed..0000000 --- a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/RECORD +++ /dev/null @@ -1,14 +0,0 @@ -MarkupSafe-2.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -MarkupSafe-2.1.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475 -MarkupSafe-2.1.5.dist-info/METADATA,sha256=2dRDPam6OZLfpX0wg1JN5P3u9arqACxVSfdGmsJU7o8,3003 -MarkupSafe-2.1.5.dist-info/RECORD,, -MarkupSafe-2.1.5.dist-info/WHEEL,sha256=1FEjxEYgybphwh9S0FO9IcZ0B-NIeM2ko8OzhFZeOeQ,152 -MarkupSafe-2.1.5.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11 -markupsafe/__init__.py,sha256=r7VOTjUq7EMQ4v3p4R1LoVOGJg6ysfYRncLr34laRBs,10958 -markupsafe/__pycache__/__init__.cpython-310.pyc,, -markupsafe/__pycache__/_native.cpython-310.pyc,, -markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713 -markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083 -markupsafe/_speedups.cpython-310-x86_64-linux-gnu.so,sha256=kPt-fhZ_RG7PUbDvwmyC26ZvRJ9DvUlF3hszBIB6_xs,44240 -markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229 -markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL deleted file mode 100644 index 1d81251..0000000 --- a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL +++ /dev/null @@ -1,6 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.42.0) -Root-Is-Purelib: false -Tag: cp310-cp310-manylinux_2_17_x86_64 -Tag: cp310-cp310-manylinux2014_x86_64 - diff --git a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt deleted file mode 100644 index 75bf729..0000000 --- a/.venv/lib/python3.10/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -markupsafe diff --git a/.venv/lib/python3.10/site-packages/__pycache__/six.cpython-310.pyc b/.venv/lib/python3.10/site-packages/__pycache__/six.cpython-310.pyc deleted file mode 100644 index 93f3e24ad3895c9345024fe09d67df5c18128b27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27560 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 diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py b/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py deleted file mode 100644 index f707416..0000000 --- a/.venv/lib/python3.10/site-packages/_distutils_hack/__init__.py +++ /dev/null @@ -1,132 +0,0 @@ -import sys -import os -import re -import importlib -import warnings - - -is_pypy = '__pypy__' in sys.builtin_module_names - - -warnings.filterwarnings('ignore', - r'.+ distutils\b.+ deprecated', - DeprecationWarning) - - -def warn_distutils_present(): - if 'distutils' not in sys.modules: - return - if is_pypy and sys.version_info < (3, 7): - # PyPy for 3.6 unconditionally imports distutils, so bypass the warning - # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 - return - warnings.warn( - "Distutils was imported before Setuptools, but importing Setuptools " - "also replaces the `distutils` module in `sys.modules`. This may lead " - "to undesirable behaviors or errors. To avoid these issues, avoid " - "using distutils directly, ensure that setuptools is installed in the " - "traditional way (e.g. not an editable install), and/or make sure " - "that setuptools is always imported before distutils.") - - -def clear_distutils(): - if 'distutils' not in sys.modules: - return - warnings.warn("Setuptools is replacing distutils.") - mods = [name for name in sys.modules if re.match(r'distutils\b', name)] - for name in mods: - del sys.modules[name] - - -def enabled(): - """ - Allow selection of distutils by environment variable. - """ - which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') - return which == 'local' - - -def ensure_local_distutils(): - clear_distutils() - - # With the DistutilsMetaFinder in place, - # perform an import to cause distutils to be - # loaded from setuptools._distutils. Ref #2906. - add_shim() - importlib.import_module('distutils') - remove_shim() - - # check that submodules load as expected - core = importlib.import_module('distutils.core') - assert '_distutils' in core.__file__, core.__file__ - - -def do_override(): - """ - Ensure that the local copy of distutils is preferred over stdlib. - - See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 - for more motivation. - """ - if enabled(): - warn_distutils_present() - ensure_local_distutils() - - -class DistutilsMetaFinder: - def find_spec(self, fullname, path, target=None): - if path is not None: - return - - method_name = 'spec_for_{fullname}'.format(**locals()) - method = getattr(self, method_name, lambda: None) - return method() - - def spec_for_distutils(self): - import importlib.abc - import importlib.util - - class DistutilsLoader(importlib.abc.Loader): - - def create_module(self, spec): - return importlib.import_module('setuptools._distutils') - - def exec_module(self, module): - pass - - return importlib.util.spec_from_loader('distutils', DistutilsLoader()) - - def spec_for_pip(self): - """ - Ensure stdlib distutils when running under pip. - See pypa/pip#8761 for rationale. - """ - if self.pip_imported_during_build(): - return - clear_distutils() - self.spec_for_distutils = lambda: None - - @staticmethod - def pip_imported_during_build(): - """ - Detect if pip is being imported in a build script. Ref #2355. - """ - import traceback - return any( - frame.f_globals['__file__'].endswith('setup.py') - for frame, line in traceback.walk_stack(None) - ) - - -DISTUTILS_FINDER = DistutilsMetaFinder() - - -def add_shim(): - sys.meta_path.insert(0, DISTUTILS_FINDER) - - -def remove_shim(): - try: - sys.meta_path.remove(DISTUTILS_FINDER) - except ValueError: - pass diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 8c0ebcea7a8ccd24f72cb9227177b97fcce88ac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5104 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 diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc b/.venv/lib/python3.10/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc deleted file mode 100644 index 4aa126f43611768bb93781a6425cb7ce0b38d6d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmZ9Gu?oU45QdZDAeCZY!BNnj;ws`3xQKJ8&1r*a6Oy#j*%#5#SL*6JI5?RKg80Mz z$A80jzlx%ec#WRyF!B4*gB^d9JE8mg>{t^(y~0wP8)v< z854z8#xd3oxMHeCV+6-LF+ETD*lP#5Di8`ZSpy}WtwiV0KvH8_gA{wvjmuTJNai!J g!r@eVe0oF+e=p(7Pju7vmxbb$#1-vIckN^H28T#NC;$Ke diff --git a/.venv/lib/python3.10/site-packages/_distutils_hack/override.py b/.venv/lib/python3.10/site-packages/_distutils_hack/override.py deleted file mode 100644 index 2cc433a..0000000 --- a/.venv/lib/python3.10/site-packages/_distutils_hack/override.py +++ /dev/null @@ -1 +0,0 @@ -__import__('_distutils_hack').do_override() diff --git a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/LICENSE b/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/LICENSE deleted file mode 100644 index 46087c2..0000000 --- a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/LICENSE +++ /dev/null @@ -1,47 +0,0 @@ -Copyright (c) 2015-2016 Ask Solem & contributors. All rights reserved. -Copyright (c) 2012-2014 GoPivotal, Inc. All rights reserved. -Copyright (c) 2009, 2010, 2011, 2012 Ask Solem, and individual contributors. All rights reserved. -Copyright (C) 2007-2008 Barry Pederson . All rights reserved. - -py-amqp is licensed under The BSD License (3 Clause, also known as -the new BSD license). The license is an OSI approved Open Source -license and is GPL-compatible(1). - -The license text can also be found here: -http://www.opensource.org/licenses/BSD-3-Clause - -License -======= - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of Ask Solem, nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Ask Solem OR CONTRIBUTORS -BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - -Footnotes -========= -(1) A GPL-compatible license makes it possible to - combine Celery with other software that is released - under the GPL, it does not mean that we're distributing - Celery under the GPL license. The BSD license, unlike the GPL, - let you distribute a modified version without making your - changes open source. diff --git a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/METADATA deleted file mode 100644 index 67bca3f..0000000 --- a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/METADATA +++ /dev/null @@ -1,241 +0,0 @@ -Metadata-Version: 2.1 -Name: amqp -Version: 5.2.0 -Summary: Low-level AMQP client for Python (fork of amqplib). -Home-page: http://github.com/celery/py-amqp -Author: Barry Pederson -Author-email: auvipy@gmail.com -Maintainer: Asif Saif Uddin, Matus Valo -License: BSD -Keywords: amqp rabbitmq cloudamqp messaging -Platform: any -Classifier: Development Status :: 5 - Production/Stable -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: License :: OSI Approved :: BSD License -Classifier: Intended Audience :: Developers -Classifier: Operating System :: OS Independent -Requires-Python: >=3.6 -Description-Content-Type: text/x-rst -License-File: LICENSE -Requires-Dist: vine (<6.0.0,>=5.0.0) - -===================================================================== - Python AMQP 0.9.1 client library -===================================================================== - -|build-status| |coverage| |license| |wheel| |pyversion| |pyimp| - -:Version: 5.2.0 -:Web: https://amqp.readthedocs.io/ -:Download: https://pypi.org/project/amqp/ -:Source: http://github.com/celery/py-amqp/ -:Keywords: amqp, rabbitmq - -About -===== - -This is a fork of amqplib_ which was originally written by Barry Pederson. -It is maintained by the Celery_ project, and used by `kombu`_ as a pure python -alternative when `librabbitmq`_ is not available. - -This library should be API compatible with `librabbitmq`_. - -.. _amqplib: https://pypi.org/project/amqplib/ -.. _Celery: http://celeryproject.org/ -.. _kombu: https://kombu.readthedocs.io/ -.. _librabbitmq: https://pypi.org/project/librabbitmq/ - -Differences from `amqplib`_ -=========================== - -- Supports draining events from multiple channels (``Connection.drain_events``) -- Support for timeouts -- Channels are restored after channel error, instead of having to close the - connection. -- Support for heartbeats - - - ``Connection.heartbeat_tick(rate=2)`` must called at regular intervals - (half of the heartbeat value if rate is 2). - - Or some other scheme by using ``Connection.send_heartbeat``. -- Supports RabbitMQ extensions: - - Consumer Cancel Notifications - - by default a cancel results in ``ChannelError`` being raised - - but not if a ``on_cancel`` callback is passed to ``basic_consume``. - - Publisher confirms - - ``Channel.confirm_select()`` enables publisher confirms. - - ``Channel.events['basic_ack'].append(my_callback)`` adds a callback - to be called when a message is confirmed. This callback is then - called with the signature ``(delivery_tag, multiple)``. - - Exchange-to-exchange bindings: ``exchange_bind`` / ``exchange_unbind``. - - ``Channel.confirm_select()`` enables publisher confirms. - - ``Channel.events['basic_ack'].append(my_callback)`` adds a callback - to be called when a message is confirmed. This callback is then - called with the signature ``(delivery_tag, multiple)``. - - Authentication Failure Notifications - Instead of just closing the connection abruptly on invalid - credentials, py-amqp will raise an ``AccessRefused`` error - when connected to rabbitmq-server 3.2.0 or greater. -- Support for ``basic_return`` -- Uses AMQP 0-9-1 instead of 0-8. - - ``Channel.access_request`` and ``ticket`` arguments to methods - **removed**. - - Supports the ``arguments`` argument to ``basic_consume``. - - ``internal`` argument to ``exchange_declare`` removed. - - ``auto_delete`` argument to ``exchange_declare`` deprecated - - ``insist`` argument to ``Connection`` removed. - - ``Channel.alerts`` has been removed. - - Support for ``Channel.basic_recover_async``. - - ``Channel.basic_recover`` deprecated. -- Exceptions renamed to have idiomatic names: - - ``AMQPException`` -> ``AMQPError`` - - ``AMQPConnectionException`` -> ConnectionError`` - - ``AMQPChannelException`` -> ChannelError`` - - ``Connection.known_hosts`` removed. - - ``Connection`` no longer supports redirects. - - ``exchange`` argument to ``queue_bind`` can now be empty - to use the "default exchange". -- Adds ``Connection.is_alive`` that tries to detect - whether the connection can still be used. -- Adds ``Connection.connection_errors`` and ``.channel_errors``, - a list of recoverable errors. -- Exposes the underlying socket as ``Connection.sock``. -- Adds ``Channel.no_ack_consumers`` to keep track of consumer tags - that set the no_ack flag. -- Slightly better at error recovery - -Quick overview -============== - -Simple producer publishing messages to ``test`` queue using default exchange: - -.. code:: python - - import amqp - - with amqp.Connection('broker.example.com') as c: - ch = c.channel() - ch.basic_publish(amqp.Message('Hello World'), routing_key='test') - -Producer publishing to ``test_exchange`` exchange with publisher confirms enabled and using virtual_host ``test_vhost``: - -.. code:: python - - import amqp - - with amqp.Connection( - 'broker.example.com', exchange='test_exchange', - confirm_publish=True, virtual_host='test_vhost' - ) as c: - ch = c.channel() - ch.basic_publish(amqp.Message('Hello World'), routing_key='test') - -Consumer with acknowledgments enabled: - -.. code:: python - - import amqp - - with amqp.Connection('broker.example.com') as c: - ch = c.channel() - def on_message(message): - print('Received message (delivery tag: {}): {}'.format(message.delivery_tag, message.body)) - ch.basic_ack(message.delivery_tag) - ch.basic_consume(queue='test', callback=on_message) - while True: - c.drain_events() - - -Consumer with acknowledgments disabled: - -.. code:: python - - import amqp - - with amqp.Connection('broker.example.com') as c: - ch = c.channel() - def on_message(message): - print('Received message (delivery tag: {}): {}'.format(message.delivery_tag, message.body)) - ch.basic_consume(queue='test', callback=on_message, no_ack=True) - while True: - c.drain_events() - -Speedups -======== - -This library has **experimental** support of speedups. Speedups are implemented using Cython. To enable speedups, ``CELERY_ENABLE_SPEEDUPS`` environment variable must be set during building/installation. -Currently speedups can be installed: - -1. using source package (using ``--no-binary`` switch): - -.. code:: shell - - CELERY_ENABLE_SPEEDUPS=true pip install --no-binary :all: amqp - - -2. building directly source code: - -.. code:: shell - - CELERY_ENABLE_SPEEDUPS=true python setup.py install - -Further -======= - -- Differences between AMQP 0.8 and 0.9.1 - - http://www.rabbitmq.com/amqp-0-8-to-0-9-1.html - -- AMQP 0.9.1 Quick Reference - - http://www.rabbitmq.com/amqp-0-9-1-quickref.html - -- RabbitMQ Extensions - - http://www.rabbitmq.com/extensions.html - -- For more information about AMQP, visit - - http://www.amqp.org - -- For other Python client libraries see: - - http://www.rabbitmq.com/devtools.html#python-dev - -.. |build-status| image:: https://github.com/celery/py-amqp/actions/workflows/ci.yaml/badge.svg - :alt: Build status - :target: https://github.com/celery/py-amqp/actions/workflows/ci.yaml - -.. |coverage| image:: https://codecov.io/github/celery/py-amqp/coverage.svg?branch=main - :target: https://codecov.io/github/celery/py-amqp?branch=main - -.. |license| image:: https://img.shields.io/pypi/l/amqp.svg - :alt: BSD License - :target: https://opensource.org/licenses/BSD-3-Clause - -.. |wheel| image:: https://img.shields.io/pypi/wheel/amqp.svg - :alt: Python AMQP can be installed via wheel - :target: https://pypi.org/project/amqp/ - -.. |pyversion| image:: https://img.shields.io/pypi/pyversions/amqp.svg - :alt: Supported Python versions. - :target: https://pypi.org/project/amqp/ - -.. |pyimp| image:: https://img.shields.io/pypi/implementation/amqp.svg - :alt: Support Python implementations. - :target: https://pypi.org/project/amqp/ - -py-amqp as part of the Tidelift Subscription -============================================ - -The maintainers of py-amqp and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/pypi-amqp?utm_source=pypi-amqp&utm_medium=referral&utm_campaign=readme&utm_term=repo) - - - diff --git a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/RECORD deleted file mode 100644 index 2cfc8ba..0000000 --- a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/RECORD +++ /dev/null @@ -1,34 +0,0 @@ -amqp-5.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -amqp-5.2.0.dist-info/LICENSE,sha256=9e9fEoLq4ZMcdGRfhxm2xps9aizyd7_aJJqCcM1HOvM,2372 -amqp-5.2.0.dist-info/METADATA,sha256=8ziHE6Ia9M14MugiVn6DA2ZAjyr3olg_ovB6GhbsZ3c,8892 -amqp-5.2.0.dist-info/RECORD,, -amqp-5.2.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -amqp-5.2.0.dist-info/top_level.txt,sha256=tWQNmFVhU4UtDgB6Yy2lKqRz7LtOrRcN8_bPFVcVVR8,5 -amqp/__init__.py,sha256=jzOMNTuAUAWksI5O3rBjOoJ3QacK06u5m6fcYma7HSc,2357 -amqp/__pycache__/__init__.cpython-310.pyc,, -amqp/__pycache__/abstract_channel.cpython-310.pyc,, -amqp/__pycache__/basic_message.cpython-310.pyc,, -amqp/__pycache__/channel.cpython-310.pyc,, -amqp/__pycache__/connection.cpython-310.pyc,, -amqp/__pycache__/exceptions.cpython-310.pyc,, -amqp/__pycache__/method_framing.cpython-310.pyc,, -amqp/__pycache__/platform.cpython-310.pyc,, -amqp/__pycache__/protocol.cpython-310.pyc,, -amqp/__pycache__/sasl.cpython-310.pyc,, -amqp/__pycache__/serialization.cpython-310.pyc,, -amqp/__pycache__/spec.cpython-310.pyc,, -amqp/__pycache__/transport.cpython-310.pyc,, -amqp/__pycache__/utils.cpython-310.pyc,, -amqp/abstract_channel.py,sha256=D_OEWvX48yKUzMYm_sN-IDRQmqIGvegi9KlJriqttBc,4941 -amqp/basic_message.py,sha256=Q8DV31tuuphloTETPHiJFwNg6b5M6pccJ0InJ4MZUz8,3357 -amqp/channel.py,sha256=XzCuKPy9qFMiTsnqksKpFIh9PUcKZm3uIXm1RFCeZQs,74475 -amqp/connection.py,sha256=8vsfpVTsTJBS-uu_SEEEuT-RXMk_IX_jCldOHP-oDlo,27541 -amqp/exceptions.py,sha256=yqjoFIRue2rvK7kMdvkKsGOD6dMOzzzT3ZzBwoGWAe4,7166 -amqp/method_framing.py,sha256=avnw90X9t4995HpHoZV4-1V73UEbzUKJ83pHEicAqWY,6734 -amqp/platform.py,sha256=cyLevv6E15P9zhMo_fV84p67Q_A8fdsTq9amjvlUwqE,2379 -amqp/protocol.py,sha256=Di3y6qqhnOV4QtkeYKO-zryfWqwl3F1zUxDOmVSsAp0,291 -amqp/sasl.py,sha256=6AbsnxlbAyoiYxDezoQTfm-E0t_TJyHXpqGJ0KlPkI4,5986 -amqp/serialization.py,sha256=xzzXmmQ45fGUuSCxGTEMizmRQTmzaz3Z7YYfpxmfXuY,17162 -amqp/spec.py,sha256=2ZjbL4FR4Fv67HA7HUI9hLUIvAv3A4ZH6GRPzrMRyWg,2121 -amqp/transport.py,sha256=UFfwKfon7zjZXbZNceoTyGan0CSKTlM5H474UmbTNhg,22949 -amqp/utils.py,sha256=JjjY040LwsDUc1zmKP2VTzXBioVXy48DUZtWB8PaPy0,1456 diff --git a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/top_level.txt deleted file mode 100644 index 5e610d3..0000000 --- a/.venv/lib/python3.10/site-packages/amqp-5.2.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -amqp diff --git a/.venv/lib/python3.10/site-packages/amqp/__init__.py b/.venv/lib/python3.10/site-packages/amqp/__init__.py deleted file mode 100644 index 315ef0f..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/__init__.py +++ /dev/null @@ -1,75 +0,0 @@ -"""Low-level AMQP client for Python (fork of amqplib).""" -# Copyright (C) 2007-2008 Barry Pederson - -import re -from collections import namedtuple - -__version__ = '5.2.0' -__author__ = 'Barry Pederson' -__maintainer__ = 'Asif Saif Uddin, Matus Valo' -__contact__ = 'auvipy@gmail.com' -__homepage__ = 'http://github.com/celery/py-amqp' -__docformat__ = 'restructuredtext' - -# -eof meta- - -version_info_t = namedtuple('version_info_t', ( - 'major', 'minor', 'micro', 'releaselevel', 'serial', -)) - -# bumpversion can only search for {current_version} -# so we have to parse the version here. -_temp = re.match( - r'(\d+)\.(\d+).(\d+)(.+)?', __version__).groups() -VERSION = version_info = version_info_t( - int(_temp[0]), int(_temp[1]), int(_temp[2]), _temp[3] or '', '') -del(_temp) -del(re) - -from .basic_message import Message # noqa -from .channel import Channel # noqa -from .connection import Connection # noqa -from .exceptions import (AccessRefused, AMQPError, # noqa - AMQPNotImplementedError, ChannelError, ChannelNotOpen, - ConnectionError, ConnectionForced, ConsumerCancelled, - ContentTooLarge, FrameError, FrameSyntaxError, - InternalError, InvalidCommand, InvalidPath, - IrrecoverableChannelError, - IrrecoverableConnectionError, NoConsumers, NotAllowed, - NotFound, PreconditionFailed, RecoverableChannelError, - RecoverableConnectionError, ResourceError, - ResourceLocked, UnexpectedFrame, error_for_code) -from .utils import promise # noqa - -__all__ = ( - 'Connection', - 'Channel', - 'Message', - 'promise', - 'AMQPError', - 'ConnectionError', - 'RecoverableConnectionError', - 'IrrecoverableConnectionError', - 'ChannelError', - 'RecoverableChannelError', - 'IrrecoverableChannelError', - 'ConsumerCancelled', - 'ContentTooLarge', - 'NoConsumers', - 'ConnectionForced', - 'InvalidPath', - 'AccessRefused', - 'NotFound', - 'ResourceLocked', - 'PreconditionFailed', - 'FrameError', - 'FrameSyntaxError', - 'InvalidCommand', - 'ChannelNotOpen', - 'UnexpectedFrame', - 'ResourceError', - 'NotAllowed', - 'AMQPNotImplementedError', - 'InternalError', - 'error_for_code', -) diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 49eb3b27ff6329ccb422a3ea164524496bc825d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1844 zcmZ{k-BR2(6vu7vE-cG>SqOpf5pcd)2x}6On@pz-Wx@=dgivU5p=8DtmSEjTmMhzY ze)l2KMCbv8!Ec!f3C_y>Bv>GD%Z%Gyie}Sb+RtIq$@)b$_=t1 zACLz&-c|8XZjw!~XUHSw9Xg%a^Ude#{kq_%Tm)M$e%=pak?^z#j+GAf`$bQs!3x;# z0(Bfv`FkdkqfYlTqTlPdrjb&~Sy5(!pVuCDA9gp+TR&2*`@ueET<0o1U)ai%}bf>X7?ps9VFI%Nsc+<`*@y|V}Z6K($Mj{n5+4|uLhpflXih5KB^?-0+cl%HjgG|nsw z)8d$;2#$IbD`qpCX(f}Kcb0S;4uGCOX`!s4Orgx6+(ijcrcv&oETddQnM1jOGK;c= zGKq2vWd-Fn$~?*f%5{{hC>@l0C^u2Ape&-Sf^;66(I{dnjw0h}ZpLE;nYYI<*LZHt zcobb!Mr0aML`$e=4Z~Ye1O*4#Pg0IP3EJ^KA&gA}Mt0D$Wbl zRm43ra-vn4<)#)DTxO;M6PnT2&khcEU+$UaMP#f=;~&vHi6c2EA4}1U#)As7U`+!S zFf1aA+cfxD%riU&`GA)NZV_0_7Les{xn8oq1Zh!OnwGlFNdOxdq{AY$NwEBF+H5K< zaGMy*A6c7PStKI2nMdkWh$#Bg(OWnh%HKbQ2rYyfjQe5A-{*oCP*Gv`l&7a5+?sHI z;cdFveXtScNx|1M8ovX^d5E`K7{TS00O4-dH}&tNVx{2U;}w)Y0;xLnO4F@+Rrli8 ds8&a+uJ;eVp111OK|QzWHQlD0xy?r1`xj2@AFTiY diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/abstract_channel.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/abstract_channel.cpython-310.pyc deleted file mode 100644 index 0cd57e66eff059a8cc36f34e76a1889637fb3151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3979 zcmaJ^U2hx56`k4dB`I04WjjuqghAn=Y-7o7fVL>yG>$AQMrGQSlBOXVY*w7HwDNM7 zo>@u}yLxDp0x630y$D)JeQN&Fy!I)7p$+1mJ0xvOO*6z^&dko|z2}~Lx15`6FqBLG z{P4lu3yl4X8qXFNjW_Y=4z!y=MKD{$C>bipZkNL7YxE)Xxl*^ z4dPxrX!IIrhrOoc$1M?^@ZOw=d-H2dG(__gCYnc1@0@TpS*JB#S}BEW_shYcEZSAs zUMY)0_Nxr7v=Hr;ofPf7U2g57S1)~uQ?YKxG4ry}BPEleDhHXCCY)BjJk>k;;ngc0Vt*{hyxvs$OcpvyRNv~ayD#c(x)ry(Uv`jgtA7u zYVV|bvYob*yQ}ZKeeYIs_vU?Qm(B@Wtheo zOp<+>K2-8SlJv>lXNBtYSmSx9)G)voylXH11y_scvh|6$gr<=C9SZL=uzMW={(g6SXI41{CBiKk-CB@LS%G@US{-Nn>IxwUqzb-WnFYjWnR;pb@?9cKgcS;H zDiZ=cm=*0Aqe8jBEX_I+?8M>h(fa1M&;9+Wxx1(4?h^Zd%f5d-HTTm~ zb3ff@9j^@FjR6c z85%xN-=`PB!+q;qJUa_0^0MFH(QiOR);GvQB4+^s!f^t4O7J*v8}Oe+zTmXbo_CzD zoc}ENlltOUv%c}-Sum2T_lZPiiW1*ySveG4B0pVDJBsJF$N(v50)o{_&zK6J{u$6@3v|V?0Fb5j}dbR zt5eFH7r_1J&fnk-AJbT(g6w0w_-^sADECiiTVGl>zhuL?c`3QM zzJBk$RU~dUf7?vndwaE;tgPSLywhDXO-j>}^?Pe;s~aW+b_z;rzI$h_dvD{(oaENK z8yK9dynVCVU0t`6S1t3~^uUBWsZOg(8E>l;2PT*#N$QsXgNau^>dT=G3(@QdCi;~; zu(`e>{<4|HB**v}H3`Uy$X9hp{1{>uMjF$UjG{?6Ob_S-!Hz4llY2TGRa+1RELHruc`Ft`hnY+Nx0p{`?1MAx@4 kL){`l-%#IlWE0((=;jTgY?}~!EOHkd{Gj;;4u0PMFOaS8&;S4c diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/basic_message.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/basic_message.cpython-310.pyc deleted file mode 100644 index f3cae74a410d36666e70dae73e0b0cc6363d8dfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2962 zcma)8%X1qw7}u`XkGOUyr2`C5Mhp+fOk%gd4B(+1N}4hmnzS_S#g|1{$+lYUYAeZU z9Kxxc>5abu7!LGb+AAl{y>a5xKC$)0dVKo6pMKv%E4$q`g7)TLKTR%l5&GLs zs?CGRxA4l*l|tNLT~KB*c;csN3>2Gj}dJ!_fc)!pv^thZyl{( z-TCnr-eFpkDbs_098lGFlGX27#1s!UWn@@nV5R;Y(L8`bGZzj(a;aH3w&@$tF*J4n zl1rU&jd}O#{0wNX5prowhHm~lZBi$-`Yk_PK}97_cX`q{Z3*y5p76vs-&Oc~BJ z4#@)ZC=heXMy2u~qtLfD!N?4hfTa^N*3{1S&KAz)Qf$wkW>Fw1z0#X#IfK3 zFC*v^>3_t`?PFDW1q&1uBPK!t(+ z8Vh(x1dJ##%BRr2ZpGJ^xLRON>`lZVK$$=8kDS5JV64D7rBxL1Ds0QlvdjyIB zYthse4h7yR&w>YE@o3f8RSl5$5SFI^*p7@M8@U)(a-Jf25sh~v4%yCZU9xqBD2CIV zw$&?u__Bq-28Myq>lO8-$ok$%%0Q)?hY)}RygdO~VtN`w3bA#}?NBpgmGti3xxVpL z50kl(A+Qq=Ar_Ua+&Tn*3O1^gH0#AsPx0lV7_aqaObCggA`04Dt_fDS+6uhZ&zF0K z9hzY*2#@~fScUeYgkAo*H<7Y8!e9Q__Z;eQbnN}<{OZ6*0y;*%d+b18 zJFY?RQ3P+VyZaRN>q#BnKc(qFqlrvB`-UdXAbW%1fTx+5sQ18B(kh-( zb-_;C<&*i;NmhJ65JYR=S8v1azc+_78M0x>RInIE?4cISKw1q42P`@m3cf##7x1n} zpARlw9BOXZMofbH_Tyzp!Uyp%d;N2E2k}C^16rr>(=F)EISserw4I}~J6ZJ~6c_5( z)Vm;%B2IAz_EV^6c3gwsCj6dtpgTtQ&~L!s?@r2*vda6e!tj^Wrp!Eb)cY__@04{P z+O1~(`Wl!#bD`_FN3Ru7^1YWDRv*Cua7fZQ2~I<%U^NB)F>I<&Y-f2aZK^&@5ABlm z`_cKr+LDf%dJ8spcl%xIVp~?h#ckid#B*WC9p8U2CnDcz`aYEbxXf~rv^H;C-P`lG zuO;nUw{PCsx_xJRYcJ*9dRGf+z`Hhk(l4cj>RB)rRnpC!A3*iU10VzbffccgrC)yM zV4%-K*Fv7txYDYxzV0>MM%!^~=bThxx8GD7AdqySuyZ2#QTjS6OEH8ZJbf8d01o91 hOxa|p5S3DvdZ_hHcIPYB<=TFLd*Gx_+jGy?{sUMTC{X|a diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/channel.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/channel.cpython-310.pyc deleted file mode 100644 index 2f68b5620dfa24c0c469de656dee660b159924cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62867 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 diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/connection.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/connection.cpython-310.pyc deleted file mode 100644 index bc8be2796bb0a92cbb2d1061b507e4b1152ab71c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19726 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 diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/method_framing.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/method_framing.cpython-310.pyc deleted file mode 100644 index 85fcce1ce9b6c31ed39917c199486284bc07a5fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4025 zcmb7H-ESMm5#Qb0J06c8k`>#s9oM1VrVZ0ta{86RHB^7eaUU!@l9M(>+bhLgQk0H& z^xjdn*dq{>E<^)K(TDV@FH)bXm!kax`Y#md>%JB!py&1}K&;N}i5BhJKzhP1XLo03 zW@l&TH;PInkHB~GPrqy~ogw6(IGFr$Ft`dW{xfuf)QF&h1+>Fzj3R9XR)^Pk$FA8O zr{=&M7j}^AxHZ?%PLS_-HP6twpwKDSiiUQBQm0%i1D&r;$!Y1XA6uU>{cEN_-m-?Y zc0zcylhTnVnoJZ#@iDEPZErM11I-xdw=Q?!&XKK#S1|K|u^#QWzO~L`}iZQTO@1`L(Dc=Q~n0w&p|mFb-q_ zhnSz+l;P%l&|aPIZh@D>@65e(X+DPYT|^gxqvH8`=Rp@X;vM+tfOgoL>uzcHN>J~t ziu%GEXaR$cll~jeIc)Aq5H;#SyZ}VT+dz}YANmU0YtZ7$u#%FWSpzy?18YP%S%)LN zOBnGU3B>mf8_({tA^kN?sh}H7-5A+|r>*d}nv9z3eXQsul0! z_1@aYz`kGgv}fLjuViCWVVcrTGg6&;qVhN>x5L$_7Yct3f)`$mjX}Jnt!~s+$ALke zK(6ALYc&#ERY%)K+gK@@r*jQ>c%clmwc2ZH?=S@8c1v5GxV7hK7lJET#ng({M-o(z>_zk2mwPeXckev4DQkAOnFt^7b3Co~q21l96n6F(QQg=J?{hy!+l;zR>RHkZfy!Kr3z>vje zbfRxkNEjM(u9GLZgeGi6*DXO$K@b3rkx2~OcD8d(S1@4#j^)!l1PJe6co~iv$b1H5Y6cWE z5H82xF(A+!0|lSJ{ex0Sho>O@3N~;A8RSMz3Z=&YQn|XC@^w0J6PCJ(HDv0mFy=cp zM(!>HLtIG4`CZ^h`A%*Z_W~#E_24%*q}@v(vj8;6OAE6k^=3)p&XPefEvEJcACy8{ z*Z@WDz#Ej(lKN{(gahgJry{ol$zQlFnzBFAW%65+S}nFqLx7Ay86=iLOK}A7BJyeR zB*Y|yOffABZ|DpWKwR~gLm35t3j=AHZ9|^sP}0k!h~o270ODBc0kl{*$r* z1%LJ|`3(ZrOY9J(=OsM&Ec_(3M{Gpay&>J;>TgK_xCPB4EnSaHJf0P z`Vlf;L1uUC9i7AD1Txg+BddHIyXMG9E6%3u#<w z(9-sG6r!DFne-Hd%uN|Ug$vc?dosDZp{M;DcbD!jF5UOy@T>)cgCUR Gr~d^gj>xJ2 diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/platform.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/platform.cpython-310.pyc deleted file mode 100644 index f543eb5022aa18cc6913e7bab5a7d03cbafbc934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1574 zcmaJ=UvC>l5Z}E!+ZX5TIB63%rBr=E>M3ADc|{SCb5zF8+1O6gSV+gkyNR#4f8ARr zbrd9|z$;&X7hAlP@4!dk6YMJzl3$Q`LPA0?dv-z#6?fX%nfcAm?#}!+DirbvzKxe( z959=A%gmdV50cAkJDM{E9tEE)pXYS+Jz39>Suy%Ka0@;3Rg5l zb7K=D`2(f_rc3M)h4>s%WwJyvQ{2y!EL|o!sy#DkLH@_;COX!LPL{sb`o#rW08gGQ zgJ)%ki19t{mx$6|rRp<0StErhX3uGn;>oQky29XJCB;+3j%aCeo2*PRMssYkPD&6P zK#tWk$KC!0QMzc6XAQ8g{#ip7D7hu^GsM3AFSb~D8&-Zt)`#+3ujkwVhI2+);zgm$qd;Vm7*1zmra|Nnh#4^b@o9A! z1+*GaHW*h!dY<@{bIPifGa8;%eeb9mkNGePKdgN4el_tpeJ^$gr|t<&s&4Q+uEvWB zRN}EHJH8i=UR-bL@W@FIvj!U_3W$4{6=8bqs?slyo?i74C~!$MMNH@T5?IwmT$!ks zXo|nYmzb5oiznI?xDD3_l*j@oHj@=IGa~0D#5?i0P`!|gY{zo!{XLNhTs|0z>l3Tv?9^&jyEpgjcfrxC?^&(=h3BAd@3sz{T61TwEi!2@Om!v;JdXm)BU@ z^9C$RqGP@-$-v4|Y)Wxg3duN;B`!PnLZKcdM5v&p0U|pXpGbEm8HG{8)@7*bdM`{> z6yT=&Pn{=Lr(18?Ol~ZS4ZC$p>hbZZQ@yCaEHF^0|3FWvl7#31=eHleA|gaHJedd&b_C=9Ub~C){N` zIrsQbZku1>_ zMJZtem$33zUc0ZZX}YfE4Dd(>6*Y)>+xR7q_09YY#03tnac0UwEr@`b2eCM^^p=m6rboO(ngE diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/sasl.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/sasl.cpython-310.pyc deleted file mode 100644 index ec64686504b11a7f2be7ce2d9a397cb40fc13825..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6029 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 jT@e?$Xkdbj=FbDM&L<_8esDY@8 zsL5K0T8L_h7Fion8e{U4)|u@(tPXx1x4{ClOU&-OCIea~bzXl%mmZUuzkvc{r>5N8` zh|L1RjnU}Q%nS6B+GxZgAJz88ck8>mqdS|jvYU7!ku~MEk7RY1`!fM~r5-iq2eXjN zDp`uQr#zHZvWO}hK@@XYQx0+MW)S&DoXPsba4&^Q963|RcmC-VV}EN=zT6Ims@eI!1l`j5!a3dk8n+^4APqP(QOUMCJ@ z(epyG;%j*N=453n1*A2kee2itMY*DRz{);2j7D1=+r0BWpma_m9Sa_ULFH^(89RkHLPBBj_)J;*s<#GCjFM=5sP% zkU1*_U*Z9g7}FX$D+M|Y^j>iqe#X=PpN8z5aFWyML9dMe)vkBIy2DAn@ywK+XP9){&t)1Ck zFpdvp^*&E#BBZ4qj309$OSgFJ=hPySHCMUAA?qgvOahISke#Pl68~3>%;fwY7 zB=luXN3yO#!9xEEbGeHW(K|t{)iXEPcV>BG?|Ps(bSVT?ngne zM~ZMVR4{$gIB8g1B$FzBxYcW@gIX^5XeYf6#)9sm>8+QjQr8l7+^WrA(AJ}rpqNuF mowb!o`+9me`-ZNs>PRW$hU-{Psa0t$x07+2r~Vg%xNJ`V diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/transport.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/transport.cpython-310.pyc deleted file mode 100644 index 4d433b60d7543a26ad55598b31dc89152d5ca8ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17045 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 diff --git a/.venv/lib/python3.10/site-packages/amqp/__pycache__/utils.cpython-310.pyc b/.venv/lib/python3.10/site-packages/amqp/__pycache__/utils.cpython-310.pyc deleted file mode 100644 index 2626224b3e7cd43636e54e28940f189f6bc80639..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmZ`)OK&4Z5bo}IX6!hDh_Ji|5Fn$C&1x?QtyZACKw7egAOXIZ@pRjnWMd-}?WGq=5js&>c*5N&l;KWeJK`l`AumzNU)ZT;8phQ9@b{Em~G zEr!Xb(De@>IO!2iIV)+8g7!*Uu^ywi=9gaO_k1@F%Ag8+AtkfWSx3F-Yf?9SBI0SA z68v%2i@qf_Js~{g(PPqE;xS(Wo$!P=KsR`kFN1FK7GD9q%-KF^ug-35%4(dMVo;QY znWhtix)8ea2jC-nZE72Pld}9gt9dCDOrx=qRiVXGYJ(G%jdjk@@~ZiuF~m*inu9P9 z%!DWazE5U>A&2yoEx;Q#U0;AV9%pCtM*wfgIhlhz^e@<{H>c{oxi@DI$*ETdI9efJ z!uZ+>)-F5L33c`3C>hdj-OMyOOg5_xBDcE>Gm$a(`87RI$Ssh*6- zQW?QhS*PZp(CN6$%uuST9ok@+*QT_|&Q^c(!Ncuuwl{6-Gh99GlvH+YPns{P zaVaWMgO|l(wA0_+{%U8-!eAcT$5V44>${yhA9ZzM#Kt(wkFt@_-K_e4+{N7K&Uk7YTA2RT zLFie(4kBhgWi+8pkc|45?6T$iFi+SjRWE=+PC@+LFsGPH54yeu!jLEAjQ&K1Sg7oA zd`3^{9C8ZW-`*0rRGEuEbaL=@-OxLp@)mUcDu^eL z{esNtFZ5@q6GP@u7ZfC%L$Mb9T0Ams&-$4fX&WA$IL&ei)#$;Yj!3l%o@~$`NNL_h z&mo8wi>Xg%Yk*XC?v*mnN`1fMY!pIhGxahkg|RNYtmDYJ^6{g$Vd^}EtVR7my#n)p zP=@rOr%mX8VlV)o7<$H3V@}Q)(sluX%!woIrA=8M3kBt89BqTCflK!+n3&J3mfaQimoPyrmS8tywBH^4X(gaa<_q5Lgpr=6Ip|96~&cK9cumZJ#bV6Qt;r^F$Gy)KVXe(MracpcHDJU@E-xMBd#{!5rKEey&vvE zx)O8wa%?%@H{d*{IKEd&J}Je0EJ2Oo`XmNCO%E) - -import logging - -from vine import ensure_promise, promise - -from .exceptions import AMQPNotImplementedError, RecoverableConnectionError -from .serialization import dumps, loads - -__all__ = ('AbstractChannel',) - -AMQP_LOGGER = logging.getLogger('amqp') - -IGNORED_METHOD_DURING_CHANNEL_CLOSE = """\ -Received method %s during closing channel %s. This method will be ignored\ -""" - - -class AbstractChannel: - """Superclass for Connection and Channel. - - The connection is treated as channel 0, then comes - user-created channel objects. - - The subclasses must have a _METHOD_MAP class property, mapping - between AMQP method signatures and Python methods. - """ - - def __init__(self, connection, channel_id): - self.is_closing = False - self.connection = connection - self.channel_id = channel_id - connection.channels[channel_id] = self - self.method_queue = [] # Higher level queue for methods - self.auto_decode = False - self._pending = {} - self._callbacks = {} - - self._setup_listeners() - - __slots__ = ( - "is_closing", - "connection", - "channel_id", - "method_queue", - "auto_decode", - "_pending", - "_callbacks", - # adding '__dict__' to get dynamic assignment - "__dict__", - "__weakref__", - ) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - - def send_method(self, sig, - format=None, args=None, content=None, - wait=None, callback=None, returns_tuple=False): - p = promise() - conn = self.connection - if conn is None: - raise RecoverableConnectionError('connection already closed') - args = dumps(format, args) if format else '' - try: - conn.frame_writer(1, self.channel_id, sig, args, content) - except StopIteration: - raise RecoverableConnectionError('connection already closed') - - # TODO temp: callback should be after write_method ... ;) - if callback: - p.then(callback) - p() - if wait: - return self.wait(wait, returns_tuple=returns_tuple) - return p - - def close(self): - """Close this Channel or Connection.""" - raise NotImplementedError('Must be overridden in subclass') - - def wait(self, method, callback=None, timeout=None, returns_tuple=False): - p = ensure_promise(callback) - pending = self._pending - prev_p = [] - if not isinstance(method, list): - method = [method] - - for m in method: - prev_p.append(pending.get(m)) - pending[m] = p - - try: - while not p.ready: - self.connection.drain_events(timeout=timeout) - - if p.value: - args, kwargs = p.value - args = args[1:] # We are not returning method back - return args if returns_tuple else (args and args[0]) - finally: - for i, m in enumerate(method): - if prev_p[i] is not None: - pending[m] = prev_p[i] - else: - pending.pop(m, None) - - def dispatch_method(self, method_sig, payload, content): - if self.is_closing and method_sig not in ( - self._ALLOWED_METHODS_WHEN_CLOSING - ): - # When channel.close() was called we must ignore all methods except - # Channel.close and Channel.CloseOk - AMQP_LOGGER.warning( - IGNORED_METHOD_DURING_CHANNEL_CLOSE, - method_sig, self.channel_id - ) - return - - if content and \ - self.auto_decode and \ - hasattr(content, 'content_encoding'): - try: - content.body = content.body.decode(content.content_encoding) - except Exception: - pass - - try: - amqp_method = self._METHODS[method_sig] - except KeyError: - raise AMQPNotImplementedError( - f'Unknown AMQP method {method_sig!r}') - - try: - listeners = [self._callbacks[method_sig]] - except KeyError: - listeners = [] - one_shot = None - try: - one_shot = self._pending.pop(method_sig) - except KeyError: - if not listeners: - return - - args = [] - if amqp_method.args: - args, _ = loads(amqp_method.args, payload, 4) - if amqp_method.content: - args.append(content) - - for listener in listeners: - listener(*args) - - if one_shot: - one_shot(method_sig, *args) - - #: Placeholder, the concrete implementations will have to - #: supply their own versions of _METHOD_MAP - _METHODS = {} diff --git a/.venv/lib/python3.10/site-packages/amqp/basic_message.py b/.venv/lib/python3.10/site-packages/amqp/basic_message.py deleted file mode 100644 index cee0515..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/basic_message.py +++ /dev/null @@ -1,122 +0,0 @@ -"""AMQP Messages.""" -# Copyright (C) 2007-2008 Barry Pederson -from .serialization import GenericContent -# Intended to fix #85: ImportError: cannot import name spec -# Encountered on python 2.7.3 -# "The submodules often need to refer to each other. For example, the -# surround [sic] module might use the echo module. In fact, such -# references are so common that the import statement first looks in -# the containing package before looking in the standard module search -# path." -# Source: -# http://stackoverflow.com/a/14216937/4982251 -from .spec import Basic - -__all__ = ('Message',) - - -class Message(GenericContent): - """A Message for use with the Channel.basic_* methods. - - Expected arg types - - body: string - children: (not supported) - - Keyword properties may include: - - content_type: shortstr - MIME content type - - content_encoding: shortstr - MIME content encoding - - application_headers: table - Message header field table, a dict with string keys, - and string | int | Decimal | datetime | dict values. - - delivery_mode: octet - Non-persistent (1) or persistent (2) - - priority: octet - The message priority, 0 to 9 - - correlation_id: shortstr - The application correlation identifier - - reply_to: shortstr - The destination to reply to - - expiration: shortstr - Message expiration specification - - message_id: shortstr - The application message identifier - - timestamp: unsigned long - The message timestamp - - type: shortstr - The message type name - - user_id: shortstr - The creating user id - - app_id: shortstr - The creating application id - - cluster_id: shortstr - Intra-cluster routing identifier - - Unicode bodies are encoded according to the 'content_encoding' - argument. If that's None, it's set to 'UTF-8' automatically. - - Example:: - - msg = Message('hello world', - content_type='text/plain', - application_headers={'foo': 7}) - """ - - CLASS_ID = Basic.CLASS_ID - - #: Instances of this class have these attributes, which - #: are passed back and forth as message properties between - #: client and server - PROPERTIES = [ - ('content_type', 's'), - ('content_encoding', 's'), - ('application_headers', 'F'), - ('delivery_mode', 'o'), - ('priority', 'o'), - ('correlation_id', 's'), - ('reply_to', 's'), - ('expiration', 's'), - ('message_id', 's'), - ('timestamp', 'L'), - ('type', 's'), - ('user_id', 's'), - ('app_id', 's'), - ('cluster_id', 's') - ] - - def __init__(self, body='', children=None, channel=None, **properties): - super().__init__(**properties) - #: set by basic_consume/basic_get - self.delivery_info = None - self.body = body - self.channel = channel - - __slots__ = ( - "delivery_info", - "body", - "channel", - ) - - @property - def headers(self): - return self.properties.get('application_headers') - - @property - def delivery_tag(self): - return self.delivery_info.get('delivery_tag') diff --git a/.venv/lib/python3.10/site-packages/amqp/channel.py b/.venv/lib/python3.10/site-packages/amqp/channel.py deleted file mode 100644 index fffc7b8..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/channel.py +++ /dev/null @@ -1,2127 +0,0 @@ -"""AMQP Channels.""" -# Copyright (C) 2007-2008 Barry Pederson - -import logging -import socket -from collections import defaultdict -from queue import Queue - -from vine import ensure_promise - -from . import spec -from .abstract_channel import AbstractChannel -from .exceptions import (ChannelError, ConsumerCancelled, MessageNacked, - RecoverableChannelError, RecoverableConnectionError, - error_for_code) -from .protocol import queue_declare_ok_t - -__all__ = ('Channel',) - -AMQP_LOGGER = logging.getLogger('amqp') - -REJECTED_MESSAGE_WITHOUT_CALLBACK = """\ -Rejecting message with delivery tag %r for reason of having no callbacks. -consumer_tag=%r exchange=%r routing_key=%r.\ -""" - - -class VDeprecationWarning(DeprecationWarning): - pass - - -class Channel(AbstractChannel): - """AMQP Channel. - - The channel class provides methods for a client to establish a - virtual connection - a channel - to a server and for both peers to - operate the virtual connection thereafter. - - GRAMMAR:: - - channel = open-channel *use-channel close-channel - open-channel = C:OPEN S:OPEN-OK - use-channel = C:FLOW S:FLOW-OK - / S:FLOW C:FLOW-OK - / functional-class - close-channel = C:CLOSE S:CLOSE-OK - / S:CLOSE C:CLOSE-OK - - Create a channel bound to a connection and using the specified - numeric channel_id, and open on the server. - - The 'auto_decode' parameter (defaults to True), indicates - whether the library should attempt to decode the body - of Messages to a Unicode string if there's a 'content_encoding' - property for the message. If there's no 'content_encoding' - property, or the decode raises an Exception, the message body - is left as plain bytes. - """ - - _METHODS = { - spec.method(spec.Channel.Close, 'BsBB'), - spec.method(spec.Channel.CloseOk), - spec.method(spec.Channel.Flow, 'b'), - spec.method(spec.Channel.FlowOk, 'b'), - spec.method(spec.Channel.OpenOk), - spec.method(spec.Exchange.DeclareOk), - spec.method(spec.Exchange.DeleteOk), - spec.method(spec.Exchange.BindOk), - spec.method(spec.Exchange.UnbindOk), - spec.method(spec.Queue.BindOk), - spec.method(spec.Queue.UnbindOk), - spec.method(spec.Queue.DeclareOk, 'sll'), - spec.method(spec.Queue.DeleteOk, 'l'), - spec.method(spec.Queue.PurgeOk, 'l'), - spec.method(spec.Basic.Cancel, 's'), - spec.method(spec.Basic.CancelOk, 's'), - spec.method(spec.Basic.ConsumeOk, 's'), - spec.method(spec.Basic.Deliver, 'sLbss', content=True), - spec.method(spec.Basic.GetEmpty, 's'), - spec.method(spec.Basic.GetOk, 'Lbssl', content=True), - spec.method(spec.Basic.QosOk), - spec.method(spec.Basic.RecoverOk), - spec.method(spec.Basic.Return, 'Bsss', content=True), - spec.method(spec.Tx.CommitOk), - spec.method(spec.Tx.RollbackOk), - spec.method(spec.Tx.SelectOk), - spec.method(spec.Confirm.SelectOk), - spec.method(spec.Basic.Ack, 'Lb'), - spec.method(spec.Basic.Nack, 'Lb'), - } - _METHODS = {m.method_sig: m for m in _METHODS} - - _ALLOWED_METHODS_WHEN_CLOSING = ( - spec.Channel.Close, spec.Channel.CloseOk - ) - - def __init__(self, connection, - channel_id=None, auto_decode=True, on_open=None): - if channel_id: - connection._claim_channel_id(channel_id) - else: - channel_id = connection._get_free_channel_id() - - AMQP_LOGGER.debug('using channel_id: %s', channel_id) - - super().__init__(connection, channel_id) - - self.is_open = False - self.active = True # Flow control - self.returned_messages = Queue() - self.callbacks = {} - self.cancel_callbacks = {} - self.auto_decode = auto_decode - self.events = defaultdict(set) - self.no_ack_consumers = set() - - self.on_open = ensure_promise(on_open) - - # set first time basic_publish_confirm is called - # and publisher confirms are enabled for this channel. - self._confirm_selected = False - if self.connection.confirm_publish: - self.basic_publish = self.basic_publish_confirm - - __slots__ = ( - "is_open", - "active", - "returned_messages", - "callbacks", - "cancel_callbacks", - "events", - "no_ack_consumers", - "on_open", - "_confirm_selected", - ) - - def then(self, on_success, on_error=None): - return self.on_open.then(on_success, on_error) - - def _setup_listeners(self): - self._callbacks.update({ - spec.Channel.Close: self._on_close, - spec.Channel.CloseOk: self._on_close_ok, - spec.Channel.Flow: self._on_flow, - spec.Channel.OpenOk: self._on_open_ok, - spec.Basic.Cancel: self._on_basic_cancel, - spec.Basic.CancelOk: self._on_basic_cancel_ok, - spec.Basic.Deliver: self._on_basic_deliver, - spec.Basic.Return: self._on_basic_return, - spec.Basic.Ack: self._on_basic_ack, - spec.Basic.Nack: self._on_basic_nack, - }) - - def collect(self): - """Tear down this object. - - Best called after we've agreed to close with the server. - """ - AMQP_LOGGER.debug('Closed channel #%s', self.channel_id) - self.is_open = False - channel_id, self.channel_id = self.channel_id, None - connection, self.connection = self.connection, None - if connection: - connection.channels.pop(channel_id, None) - try: - connection._used_channel_ids.remove(channel_id) - except ValueError: - # channel id already removed - pass - self.callbacks.clear() - self.cancel_callbacks.clear() - self.events.clear() - self.no_ack_consumers.clear() - - def _do_revive(self): - self.is_open = False - self.open() - - def close(self, reply_code=0, reply_text='', method_sig=(0, 0), - argsig='BsBB'): - """Request a channel close. - - This method indicates that the sender wants to close the - channel. This may be due to internal conditions (e.g. a forced - shut-down) or due to an error handling a specific method, i.e. - an exception. When a close is due to an exception, the sender - provides the class and method id of the method which caused - the exception. - - RULE: - - After sending this method any received method except - Channel.Close-OK MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with Channel.Close-OK.. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - try: - if self.connection is None: - return - if self.connection.channels is None: - return - if not self.is_open: - return - - self.is_closing = True - return self.send_method( - spec.Channel.Close, argsig, - (reply_code, reply_text, method_sig[0], method_sig[1]), - wait=spec.Channel.CloseOk, - ) - finally: - self.is_closing = False - self.connection = None - - def _on_close(self, reply_code, reply_text, class_id, method_id): - """Request a channel close. - - This method indicates that the sender wants to close the - channel. This may be due to internal conditions (e.g. a forced - shut-down) or due to an error handling a specific method, i.e. - an exception. When a close is due to an exception, the sender - provides the class and method id of the method which caused - the exception. - - RULE: - - After sending this method any received method except - Channel.Close-OK MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with Channel.Close-OK.. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - self.send_method(spec.Channel.CloseOk) - if not self.connection.is_closing: - self._do_revive() - raise error_for_code( - reply_code, reply_text, (class_id, method_id), ChannelError, - ) - - def _on_close_ok(self): - """Confirm a channel close. - - This method confirms a Channel.Close method and tells the - recipient that it is safe to release resources for the channel - and close the socket. - - RULE: - - A peer that detects a socket closure without having - received a Channel.Close-Ok handshake method SHOULD log - the error. - """ - self.collect() - - def flow(self, active): - """Enable/disable flow from peer. - - This method asks the peer to pause or restart the flow of - content data. This is a simple flow-control mechanism that a - peer can use to avoid overflowing its queues or otherwise - finding itself receiving more messages than it can process. - Note that this method is not intended for window control. The - peer that receives a request to stop sending content should - finish sending the current content, if any, and then wait - until it receives a Flow restart method. - - RULE: - - When a new channel is opened, it is active. Some - applications assume that channels are inactive until - started. To emulate this behaviour a client MAY open the - channel, then pause it. - - RULE: - - When sending content data in multiple frames, a peer - SHOULD monitor the channel for incoming methods and - respond to a Channel.Flow as rapidly as possible. - - RULE: - - A peer MAY use the Channel.Flow method to throttle - incoming content data for internal reasons, for example, - when exchanging data over a slower connection. - - RULE: - - The peer that requests a Channel.Flow method MAY - disconnect and/or ban a peer that does not respect the - request. - - PARAMETERS: - active: boolean - - start/stop content frames - - If True, the peer starts sending content frames. If - False, the peer stops sending content frames. - """ - return self.send_method( - spec.Channel.Flow, 'b', (active,), wait=spec.Channel.FlowOk, - ) - - def _on_flow(self, active): - """Enable/disable flow from peer. - - This method asks the peer to pause or restart the flow of - content data. This is a simple flow-control mechanism that a - peer can use to avoid overflowing its queues or otherwise - finding itself receiving more messages than it can process. - Note that this method is not intended for window control. The - peer that receives a request to stop sending content should - finish sending the current content, if any, and then wait - until it receives a Flow restart method. - - RULE: - - When a new channel is opened, it is active. Some - applications assume that channels are inactive until - started. To emulate this behaviour a client MAY open the - channel, then pause it. - - RULE: - - When sending content data in multiple frames, a peer - SHOULD monitor the channel for incoming methods and - respond to a Channel.Flow as rapidly as possible. - - RULE: - - A peer MAY use the Channel.Flow method to throttle - incoming content data for internal reasons, for example, - when exchanging data over a slower connection. - - RULE: - - The peer that requests a Channel.Flow method MAY - disconnect and/or ban a peer that does not respect the - request. - - PARAMETERS: - active: boolean - - start/stop content frames - - If True, the peer starts sending content frames. If - False, the peer stops sending content frames. - """ - self.active = active - self._x_flow_ok(self.active) - - def _x_flow_ok(self, active): - """Confirm a flow method. - - Confirms to the peer that a flow command was received and - processed. - - PARAMETERS: - active: boolean - - current flow setting - - Confirms the setting of the processed flow method: - True means the peer will start sending or continue - to send content frames; False means it will not. - """ - return self.send_method(spec.Channel.FlowOk, 'b', (active,)) - - def open(self): - """Open a channel for use. - - This method opens a virtual connection (a channel). - - RULE: - - This method MUST NOT be called when the channel is already - open. - - PARAMETERS: - out_of_band: shortstr (DEPRECATED) - - out-of-band settings - - Configures out-of-band transfers on this channel. The - syntax and meaning of this field will be formally - defined at a later date. - """ - if self.is_open: - return - - return self.send_method( - spec.Channel.Open, 's', ('',), wait=spec.Channel.OpenOk, - ) - - def _on_open_ok(self): - """Signal that the channel is ready. - - This method signals to the client that the channel is ready - for use. - """ - self.is_open = True - self.on_open(self) - AMQP_LOGGER.debug('Channel open') - - ############# - # - # Exchange - # - # - # work with exchanges - # - # Exchanges match and distribute messages across queues. - # Exchanges can be configured in the server or created at runtime. - # - # GRAMMAR:: - # - # exchange = C:DECLARE S:DECLARE-OK - # / C:DELETE S:DELETE-OK - # - # RULE: - # - # The server MUST implement the direct and fanout exchange - # types, and predeclare the corresponding exchanges named - # amq.direct and amq.fanout in each virtual host. The server - # MUST also predeclare a direct exchange to act as the default - # exchange for content Publish methods and for default queue - # bindings. - # - # RULE: - # - # The server SHOULD implement the topic exchange type, and - # predeclare the corresponding exchange named amq.topic in - # each virtual host. - # - # RULE: - # - # The server MAY implement the system exchange type, and - # predeclare the corresponding exchanges named amq.system in - # each virtual host. If the client attempts to bind a queue to - # the system exchange, the server MUST raise a connection - # exception with reply code 507 (not allowed). - # - - def exchange_declare(self, exchange, type, passive=False, durable=False, - auto_delete=True, nowait=False, arguments=None, - argsig='BssbbbbbF'): - """Declare exchange, create if needed. - - This method creates an exchange if it does not already exist, - and if the exchange exists, verifies that it is of the correct - and expected class. - - RULE: - - The server SHOULD support a minimum of 16 exchanges per - virtual host and ideally, impose no limit except as - defined by available resources. - - PARAMETERS: - exchange: shortstr - - RULE: - - Exchange names starting with "amq." are reserved - for predeclared and standardised exchanges. If - the client attempts to create an exchange starting - with "amq.", the server MUST raise a channel - exception with reply code 403 (access refused). - - type: shortstr - - exchange type - - Each exchange belongs to one of a set of exchange - types implemented by the server. The exchange types - define the functionality of the exchange - i.e. how - messages are routed through it. It is not valid or - meaningful to attempt to change the type of an - existing exchange. - - RULE: - - If the exchange already exists with a different - type, the server MUST raise a connection exception - with a reply code 507 (not allowed). - - RULE: - - If the server does not support the requested - exchange type it MUST raise a connection exception - with a reply code 503 (command invalid). - - passive: boolean - - do not create exchange - - If set, the server will not create the exchange. The - client can use this to check whether an exchange - exists without modifying the server state. - - RULE: - - If set, and the exchange does not already exist, - the server MUST raise a channel exception with - reply code 404 (not found). - - durable: boolean - - request a durable exchange - - If set when creating a new exchange, the exchange will - be marked as durable. Durable exchanges remain active - when a server restarts. Non-durable exchanges - (transient exchanges) are purged if/when a server - restarts. - - RULE: - - The server MUST support both durable and transient - exchanges. - - RULE: - - The server MUST ignore the durable field if the - exchange already exists. - - auto_delete: boolean - - auto-delete when unused - - If set, the exchange is deleted when all queues have - finished using it. - - RULE: - - The server SHOULD allow for a reasonable delay - between the point when it determines that an - exchange is not being used (or no longer used), - and the point when it deletes the exchange. At - the least it must allow a client to create an - exchange and then bind a queue to it, with a small - but non-zero delay between these two actions. - - RULE: - - The server MUST ignore the auto-delete field if - the exchange already exists. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - arguments: table - - arguments for declaration - - A set of arguments for the declaration. The syntax and - semantics of these arguments depends on the server - implementation. This field is ignored if passive is - True. - """ - self.send_method( - spec.Exchange.Declare, argsig, - (0, exchange, type, passive, durable, auto_delete, - False, nowait, arguments), - wait=None if nowait else spec.Exchange.DeclareOk, - ) - - def exchange_delete(self, exchange, if_unused=False, nowait=False, - argsig='Bsbb'): - """Delete an exchange. - - This method deletes an exchange. When an exchange is deleted - all queue bindings on the exchange are cancelled. - - PARAMETERS: - exchange: shortstr - - RULE: - - The exchange MUST exist. Attempting to delete a - non-existing exchange causes a channel exception. - - if_unused: boolean - - delete only if unused - - If set, the server will only delete the exchange if it - has no queue bindings. If the exchange has queue - bindings the server does not delete it but raises a - channel exception instead. - - RULE: - - If set, the server SHOULD delete the exchange but - only if it has no queue bindings. - - RULE: - - If set, the server SHOULD raise a channel - exception if the exchange is in use. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - """ - return self.send_method( - spec.Exchange.Delete, argsig, (0, exchange, if_unused, nowait), - wait=None if nowait else spec.Exchange.DeleteOk, - ) - - def exchange_bind(self, destination, source='', routing_key='', - nowait=False, arguments=None, argsig='BsssbF'): - """Bind an exchange to an exchange. - - RULE: - - A server MUST allow and ignore duplicate bindings - that - is, two or more bind methods for a specific exchanges, - with identical arguments - without treating these as an - error. - - RULE: - - A server MUST allow cycles of exchange bindings to be - created including allowing an exchange to be bound to - itself. - - RULE: - - A server MUST not deliver the same message more than once - to a destination exchange, even if the topology of - exchanges and bindings results in multiple (even infinite) - routes to that exchange. - - PARAMETERS: - reserved-1: short - - destination: shortstr - - Specifies the name of the destination exchange to - bind. - - RULE: - - A client MUST NOT be allowed to bind a non- - existent destination exchange. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - source: shortstr - - Specifies the name of the source exchange to bind. - - RULE: - - A client MUST NOT be allowed to bind a non- - existent source exchange. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - routing-key: shortstr - - Specifies the routing key for the binding. The routing - key is used for routing messages depending on the - exchange configuration. Not all exchanges use a - routing key - refer to the specific exchange - documentation. - - no-wait: bit - - arguments: table - - A set of arguments for the binding. The syntax and - semantics of these arguments depends on the exchange - class. - """ - return self.send_method( - spec.Exchange.Bind, argsig, - (0, destination, source, routing_key, nowait, arguments), - wait=None if nowait else spec.Exchange.BindOk, - ) - - def exchange_unbind(self, destination, source='', routing_key='', - nowait=False, arguments=None, argsig='BsssbF'): - """Unbind an exchange from an exchange. - - RULE: - - If a unbind fails, the server MUST raise a connection - exception. - - PARAMETERS: - reserved-1: short - - destination: shortstr - - Specifies the name of the destination exchange to - unbind. - - RULE: - - The client MUST NOT attempt to unbind an exchange - that does not exist from an exchange. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - source: shortstr - - Specifies the name of the source exchange to unbind. - - RULE: - - The client MUST NOT attempt to unbind an exchange - from an exchange that does not exist. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - routing-key: shortstr - - Specifies the routing key of the binding to unbind. - - no-wait: bit - - arguments: table - - Specifies the arguments of the binding to unbind. - """ - return self.send_method( - spec.Exchange.Unbind, argsig, - (0, destination, source, routing_key, nowait, arguments), - wait=None if nowait else spec.Exchange.UnbindOk, - ) - - ############# - # - # Queue - # - # - # work with queues - # - # Queues store and forward messages. Queues can be configured in - # the server or created at runtime. Queues must be attached to at - # least one exchange in order to receive messages from publishers. - # - # GRAMMAR:: - # - # queue = C:DECLARE S:DECLARE-OK - # / C:BIND S:BIND-OK - # / C:PURGE S:PURGE-OK - # / C:DELETE S:DELETE-OK - # - # RULE: - # - # A server MUST allow any content class to be sent to any - # queue, in any mix, and queue and delivery these content - # classes independently. Note that all methods that fetch - # content off queues are specific to a given content class. - # - - def queue_bind(self, queue, exchange='', routing_key='', - nowait=False, arguments=None, argsig='BsssbF'): - """Bind queue to an exchange. - - This method binds a queue to an exchange. Until a queue is - bound it will not receive any messages. In a classic - messaging model, store-and-forward queues are bound to a dest - exchange and subscription queues are bound to a dest_wild - exchange. - - RULE: - - A server MUST allow ignore duplicate bindings - that is, - two or more bind methods for a specific queue, with - identical arguments - without treating these as an error. - - RULE: - - If a bind fails, the server MUST raise a connection - exception. - - RULE: - - The server MUST NOT allow a durable queue to bind to a - transient exchange. If the client attempts this the server - MUST raise a channel exception. - - RULE: - - Bindings for durable queues are automatically durable and - the server SHOULD restore such bindings after a server - restart. - - RULE: - - The server SHOULD support at least 4 bindings per queue, - and ideally, impose no limit except as defined by - available resources. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to bind. If the queue - name is empty, refers to the current queue for the - channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - RULE: - - If the queue does not exist the server MUST raise - a channel exception with reply code 404 (not - found). - - exchange: shortstr - - The name of the exchange to bind to. - - RULE: - - If the exchange does not exist the server MUST - raise a channel exception with reply code 404 (not - found). - - routing_key: shortstr - - message routing key - - Specifies the routing key for the binding. The - routing key is used for routing messages depending on - the exchange configuration. Not all exchanges use a - routing key - refer to the specific exchange - documentation. If the routing key is empty and the - queue name is empty, the routing key will be the - current queue for the channel, which is the last - declared queue. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - arguments: table - - arguments for binding - - A set of arguments for the binding. The syntax and - semantics of these arguments depends on the exchange - class. - """ - return self.send_method( - spec.Queue.Bind, argsig, - (0, queue, exchange, routing_key, nowait, arguments), - wait=None if nowait else spec.Queue.BindOk, - ) - - def queue_unbind(self, queue, exchange, routing_key='', - nowait=False, arguments=None, argsig='BsssF'): - """Unbind a queue from an exchange. - - This method unbinds a queue from an exchange. - - RULE: - - If a unbind fails, the server MUST raise a connection exception. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to unbind. - - RULE: - - The client MUST either specify a queue name or have - previously declared a queue on the same channel - - RULE: - - The client MUST NOT attempt to unbind a queue that - does not exist. - - exchange: shortstr - - The name of the exchange to unbind from. - - RULE: - - The client MUST NOT attempt to unbind a queue from an - exchange that does not exist. - - RULE: - - The server MUST accept a blank exchange name to mean - the default exchange. - - routing_key: shortstr - - routing key of binding - - Specifies the routing key of the binding to unbind. - - arguments: table - - arguments of binding - - Specifies the arguments of the binding to unbind. - """ - return self.send_method( - spec.Queue.Unbind, argsig, - (0, queue, exchange, routing_key, arguments), - wait=None if nowait else spec.Queue.UnbindOk, - ) - - def queue_declare(self, queue='', passive=False, durable=False, - exclusive=False, auto_delete=True, nowait=False, - arguments=None, argsig='BsbbbbbF'): - """Declare queue, create if needed. - - This method creates or checks a queue. When creating a new - queue the client can specify various properties that control - the durability of the queue and its contents, and the level of - sharing for the queue. - - RULE: - - The server MUST create a default binding for a newly- - created queue to the default exchange, which is an - exchange of type 'direct'. - - RULE: - - The server SHOULD support a minimum of 256 queues per - virtual host and ideally, impose no limit except as - defined by available resources. - - PARAMETERS: - queue: shortstr - - RULE: - - The queue name MAY be empty, in which case the - server MUST create a new queue with a unique - generated name and return this to the client in - the Declare-Ok method. - - RULE: - - Queue names starting with "amq." are reserved for - predeclared and standardised server queues. If - the queue name starts with "amq." and the passive - option is False, the server MUST raise a connection - exception with reply code 403 (access refused). - - passive: boolean - - do not create queue - - If set, the server will not create the queue. The - client can use this to check whether a queue exists - without modifying the server state. - - RULE: - - If set, and the queue does not already exist, the - server MUST respond with a reply code 404 (not - found) and raise a channel exception. - - durable: boolean - - request a durable queue - - If set when creating a new queue, the queue will be - marked as durable. Durable queues remain active when - a server restarts. Non-durable queues (transient - queues) are purged if/when a server restarts. Note - that durable queues do not necessarily hold persistent - messages, although it does not make sense to send - persistent messages to a transient queue. - - RULE: - - The server MUST recreate the durable queue after a - restart. - - RULE: - - The server MUST support both durable and transient - queues. - - RULE: - - The server MUST ignore the durable field if the - queue already exists. - - exclusive: boolean - - request an exclusive queue - - Exclusive queues may only be consumed from by the - current connection. Setting the 'exclusive' flag - always implies 'auto-delete'. - - RULE: - - The server MUST support both exclusive (private) - and non-exclusive (shared) queues. - - RULE: - - The server MUST raise a channel exception if - 'exclusive' is specified and the queue already - exists and is owned by a different connection. - - auto_delete: boolean - - auto-delete queue when unused - - If set, the queue is deleted when all consumers have - finished using it. Last consumer can be cancelled - either explicitly or because its channel is closed. If - there was no consumer ever on the queue, it won't be - deleted. - - RULE: - - The server SHOULD allow for a reasonable delay - between the point when it determines that a queue - is not being used (or no longer used), and the - point when it deletes the queue. At the least it - must allow a client to create a queue and then - create a consumer to read from it, with a small - but non-zero delay between these two actions. The - server should equally allow for clients that may - be disconnected prematurely, and wish to re- - consume from the same queue without losing - messages. We would recommend a configurable - timeout, with a suitable default value being one - minute. - - RULE: - - The server MUST ignore the auto-delete field if - the queue already exists. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - arguments: table - - arguments for declaration - - A set of arguments for the declaration. The syntax and - semantics of these arguments depends on the server - implementation. This field is ignored if passive is - True. - - Returns a tuple containing 3 items: - the name of the queue (essential for automatically-named queues), - message count and - consumer count - """ - self.send_method( - spec.Queue.Declare, argsig, - (0, queue, passive, durable, exclusive, auto_delete, - nowait, arguments), - ) - if not nowait: - return queue_declare_ok_t(*self.wait( - spec.Queue.DeclareOk, returns_tuple=True, - )) - - def queue_delete(self, queue='', - if_unused=False, if_empty=False, nowait=False, - argsig='Bsbbb'): - """Delete a queue. - - This method deletes a queue. When a queue is deleted any - pending messages are sent to a dead-letter queue if this is - defined in the server configuration, and all consumers on the - queue are cancelled. - - RULE: - - The server SHOULD use a dead-letter queue to hold messages - that were pending on a deleted queue, and MAY provide - facilities for a system administrator to move these - messages back to an active queue. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to delete. If the - queue name is empty, refers to the current queue for - the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - RULE: - - The queue must exist. Attempting to delete a non- - existing queue causes a channel exception. - - if_unused: boolean - - delete only if unused - - If set, the server will only delete the queue if it - has no consumers. If the queue has consumers the - server does does not delete it but raises a channel - exception instead. - - RULE: - - The server MUST respect the if-unused flag when - deleting a queue. - - if_empty: boolean - - delete only if empty - - If set, the server will only delete the queue if it - has no messages. If the queue is not empty the server - raises a channel exception. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - If nowait is False, returns the number of deleted messages. - """ - return self.send_method( - spec.Queue.Delete, argsig, - (0, queue, if_unused, if_empty, nowait), - wait=None if nowait else spec.Queue.DeleteOk, - ) - - def queue_purge(self, queue='', nowait=False, argsig='Bsb'): - """Purge a queue. - - This method removes all messages from a queue. It does not - cancel consumers. Purged messages are deleted without any - formal "undo" mechanism. - - RULE: - - A call to purge MUST result in an empty queue. - - RULE: - - On transacted channels the server MUST not purge messages - that have already been sent to a client but not yet - acknowledged. - - RULE: - - The server MAY implement a purge queue or log that allows - system administrators to recover accidentally-purged - messages. The server SHOULD NOT keep purged messages in - the same storage spaces as the live messages since the - volumes of purged messages may get very large. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to purge. If the - queue name is empty, refers to the current queue for - the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - RULE: - - The queue must exist. Attempting to purge a non- - existing queue causes a channel exception. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - If nowait is False, returns a number of purged messages. - """ - return self.send_method( - spec.Queue.Purge, argsig, (0, queue, nowait), - wait=None if nowait else spec.Queue.PurgeOk, - ) - - ############# - # - # Basic - # - # - # work with basic content - # - # The Basic class provides methods that support an industry- - # standard messaging model. - # - # GRAMMAR:: - # - # basic = C:QOS S:QOS-OK - # / C:CONSUME S:CONSUME-OK - # / C:CANCEL S:CANCEL-OK - # / C:PUBLISH content - # / S:RETURN content - # / S:DELIVER content - # / C:GET ( S:GET-OK content / S:GET-EMPTY ) - # / C:ACK - # / C:REJECT - # - # RULE: - # - # The server SHOULD respect the persistent property of basic - # messages and SHOULD make a best-effort to hold persistent - # basic messages on a reliable storage mechanism. - # - # RULE: - # - # The server MUST NOT discard a persistent basic message in - # case of a queue overflow. The server MAY use the - # Channel.Flow method to slow or stop a basic message - # publisher when necessary. - # - # RULE: - # - # The server MAY overflow non-persistent basic messages to - # persistent storage and MAY discard or dead-letter non- - # persistent basic messages on a priority basis if the queue - # size exceeds some configured limit. - # - # RULE: - # - # The server MUST implement at least 2 priority levels for - # basic messages, where priorities 0-4 and 5-9 are treated as - # two distinct levels. The server MAY implement up to 10 - # priority levels. - # - # RULE: - # - # The server MUST deliver messages of the same priority in - # order irrespective of their individual persistence. - # - # RULE: - # - # The server MUST support both automatic and explicit - # acknowledgments on Basic content. - # - - def basic_ack(self, delivery_tag, multiple=False, argsig='Lb'): - """Acknowledge one or more messages. - - This method acknowledges one or more messages delivered via - the Deliver or Get-Ok methods. The client can ask to confirm - a single message or a set of messages up to and including a - specific message. - - PARAMETERS: - delivery_tag: longlong - - server-assigned delivery tag - - The server-assigned and channel-specific delivery tag - - RULE: - - The delivery tag is valid only within the channel - from which the message was received. I.e. a client - MUST NOT receive a message on one channel and then - acknowledge it on another. - - RULE: - - The server MUST NOT use a zero value for delivery - tags. Zero is reserved for client use, meaning "all - messages so far received". - - multiple: boolean - - acknowledge multiple messages - - If set to True, the delivery tag is treated as "up to - and including", so that the client can acknowledge - multiple messages with a single method. If set to - False, the delivery tag refers to a single message. - If the multiple field is True, and the delivery tag - is zero, tells the server to acknowledge all - outstanding messages. - - RULE: - - The server MUST validate that a non-zero delivery- - tag refers to an delivered message, and raise a - channel exception if this is not the case. - """ - return self.send_method( - spec.Basic.Ack, argsig, (delivery_tag, multiple), - ) - - def basic_cancel(self, consumer_tag, nowait=False, argsig='sb'): - """End a queue consumer. - - This method cancels a consumer. This does not affect already - delivered messages, but it does mean the server will not send - any more messages for that consumer. The client may receive - an arbitrary number of messages in between sending the cancel - method and receiving the cancel-ok reply. - - RULE: - - If the queue no longer exists when the client sends a - cancel command, or the consumer has been cancelled for - other reasons, this command has no effect. - - PARAMETERS: - consumer_tag: shortstr - - consumer tag - - Identifier for the consumer, valid within the current - connection. - - RULE: - - The consumer tag is valid only within the channel - from which the consumer was created. I.e. a client - MUST NOT create a consumer in one channel and then - use it in another. - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - """ - if self.connection is not None: - self.no_ack_consumers.discard(consumer_tag) - return self.send_method( - spec.Basic.Cancel, argsig, (consumer_tag, nowait), - wait=None if nowait else spec.Basic.CancelOk, - ) - - def _on_basic_cancel(self, consumer_tag): - """Consumer cancelled by server. - - Most likely the queue was deleted. - - """ - callback = self._remove_tag(consumer_tag) - if callback: - callback(consumer_tag) - else: - raise ConsumerCancelled(consumer_tag, spec.Basic.Cancel) - - def _on_basic_cancel_ok(self, consumer_tag): - self._remove_tag(consumer_tag) - - def _remove_tag(self, consumer_tag): - self.callbacks.pop(consumer_tag, None) - return self.cancel_callbacks.pop(consumer_tag, None) - - def basic_consume(self, queue='', consumer_tag='', no_local=False, - no_ack=False, exclusive=False, nowait=False, - callback=None, arguments=None, on_cancel=None, - argsig='BssbbbbF'): - """Start a queue consumer. - - This method asks the server to start a "consumer", which is a - transient request for messages from a specific queue. - Consumers last as long as the channel they were created on, or - until the client cancels them. - - RULE: - - The server SHOULD support at least 16 consumers per queue, - unless the queue was declared as private, and ideally, - impose no limit except as defined by available resources. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to consume from. If - the queue name is null, refers to the current queue - for the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - consumer_tag: shortstr - - Specifies the identifier for the consumer. The - consumer tag is local to a connection, so two clients - can use the same consumer tags. If this field is empty - the server will generate a unique tag. - - RULE: - - The tag MUST NOT refer to an existing consumer. If - the client attempts to create two consumers with - the same non-empty tag the server MUST raise a - connection exception with reply code 530 (not - allowed). - - no_local: boolean - - do not deliver own messages - - If the no-local field is set the server will not send - messages to the client that published them. - - no_ack: boolean - - no acknowledgment needed - - If this field is set the server does not expect - acknowledgments for messages. That is, when a message - is delivered to the client the server automatically and - silently acknowledges it on behalf of the client. This - functionality increases performance but at the cost of - reliability. Messages can get lost if a client dies - before it can deliver them to the application. - - exclusive: boolean - - request exclusive access - - Request exclusive consumer access, meaning only this - consumer can access the queue. - - RULE: - - If the server cannot grant exclusive access to the - queue when asked, - because there are other - consumers active - it MUST raise a channel - exception with return code 403 (access refused). - - nowait: boolean - - do not send a reply method - - If set, the server will not respond to the method. The - client should not wait for a reply method. If the - server could not complete the method it will raise a - channel or connection exception. - - callback: Python callable - - function/method called with each delivered message - - For each message delivered by the broker, the - callable will be called with a Message object - as the single argument. If no callable is specified, - messages are quietly discarded, no_ack should probably - be set to True in that case. - """ - p = self.send_method( - spec.Basic.Consume, argsig, - ( - 0, queue, consumer_tag, no_local, no_ack, exclusive, - nowait, arguments - ), - wait=None if nowait else spec.Basic.ConsumeOk, - returns_tuple=True - ) - - if not nowait: - # send_method() returns (consumer_tag,) tuple. - # consumer_tag is returned by broker using following rules: - # * consumer_tag is not specified by client, random one - # is generated by Broker - # * consumer_tag is provided by client, the same one - # is returned by broker - consumer_tag = p[0] - elif nowait and not consumer_tag: - raise ValueError( - 'Consumer tag must be specified when nowait is True' - ) - - self.callbacks[consumer_tag] = callback - - if on_cancel: - self.cancel_callbacks[consumer_tag] = on_cancel - if no_ack: - self.no_ack_consumers.add(consumer_tag) - - if not nowait: - return consumer_tag - else: - return p - - def _on_basic_deliver(self, consumer_tag, delivery_tag, redelivered, - exchange, routing_key, msg): - msg.channel = self - msg.delivery_info = { - 'consumer_tag': consumer_tag, - 'delivery_tag': delivery_tag, - 'redelivered': redelivered, - 'exchange': exchange, - 'routing_key': routing_key, - } - - try: - fun = self.callbacks[consumer_tag] - except KeyError: - AMQP_LOGGER.warning( - REJECTED_MESSAGE_WITHOUT_CALLBACK, - delivery_tag, consumer_tag, exchange, routing_key, - ) - self.basic_reject(delivery_tag, requeue=True) - else: - fun(msg) - - def basic_get(self, queue='', no_ack=False, argsig='Bsb'): - """Direct access to a queue. - - This method provides a direct access to the messages in a - queue using a synchronous dialogue that is designed for - specific types of application where synchronous functionality - is more important than performance. - - PARAMETERS: - queue: shortstr - - Specifies the name of the queue to consume from. If - the queue name is null, refers to the current queue - for the channel, which is the last declared queue. - - RULE: - - If the client did not previously declare a queue, - and the queue name in this method is empty, the - server MUST raise a connection exception with - reply code 530 (not allowed). - - no_ack: boolean - - no acknowledgment needed - - If this field is set the server does not expect - acknowledgments for messages. That is, when a message - is delivered to the client the server automatically and - silently acknowledges it on behalf of the client. This - functionality increases performance but at the cost of - reliability. Messages can get lost if a client dies - before it can deliver them to the application. - - Non-blocking, returns a amqp.basic_message.Message object, - or None if queue is empty. - """ - ret = self.send_method( - spec.Basic.Get, argsig, (0, queue, no_ack), - wait=[spec.Basic.GetOk, spec.Basic.GetEmpty], returns_tuple=True, - ) - if not ret or len(ret) < 2: - return self._on_get_empty(*ret) - return self._on_get_ok(*ret) - - def _on_get_empty(self, cluster_id=None): - pass - - def _on_get_ok(self, delivery_tag, redelivered, exchange, routing_key, - message_count, msg): - msg.channel = self - msg.delivery_info = { - 'delivery_tag': delivery_tag, - 'redelivered': redelivered, - 'exchange': exchange, - 'routing_key': routing_key, - 'message_count': message_count - } - return msg - - def _basic_publish(self, msg, exchange='', routing_key='', - mandatory=False, immediate=False, timeout=None, - confirm_timeout=None, - argsig='Bssbb'): - """Publish a message. - - This method publishes a message to a specific exchange. The - message will be routed to queues as defined by the exchange - configuration and distributed to any active consumers when the - transaction, if any, is committed. - - When channel is in confirm mode (when Connection parameter - confirm_publish is set to True), each message is confirmed. - When broker rejects published message (e.g. due internal broker - constrains), MessageNacked exception is raised and - set confirm_timeout to wait maximum confirm_timeout second - for message to confirm. - - PARAMETERS: - exchange: shortstr - - Specifies the name of the exchange to publish to. The - exchange name can be empty, meaning the default - exchange. If the exchange name is specified, and that - exchange does not exist, the server will raise a - channel exception. - - RULE: - - The server MUST accept a blank exchange name to - mean the default exchange. - - RULE: - - The exchange MAY refuse basic content in which - case it MUST raise a channel exception with reply - code 540 (not implemented). - - routing_key: shortstr - - Message routing key - - Specifies the routing key for the message. The - routing key is used for routing messages depending on - the exchange configuration. - - mandatory: boolean - - indicate mandatory routing - - This flag tells the server how to react if the message - cannot be routed to a queue. If this flag is True, the - server will return an unroutable message with a Return - method. If this flag is False, the server silently - drops the message. - - RULE: - - The server SHOULD implement the mandatory flag. - - immediate: boolean - - request immediate delivery - - This flag tells the server how to react if the message - cannot be routed to a queue consumer immediately. If - this flag is set, the server will return an - undeliverable message with a Return method. If this - flag is zero, the server will queue the message, but - with no guarantee that it will ever be consumed. - - RULE: - - The server SHOULD implement the immediate flag. - - timeout: short - - timeout for publish - - Set timeout to wait maximum timeout second - for message to publish. - - confirm_timeout: short - - confirm_timeout for publish in confirm mode - - When the channel is in confirm mode set - confirm_timeout to wait maximum confirm_timeout - second for message to confirm. - - """ - if not self.connection: - raise RecoverableConnectionError( - 'basic_publish: connection closed') - - capabilities = self.connection. \ - client_properties.get('capabilities', {}) - if capabilities.get('connection.blocked', False): - try: - # Check if an event was sent, such as the out of memory message - self.connection.drain_events(timeout=0) - except socket.timeout: - pass - - try: - with self.connection.transport.having_timeout(timeout): - return self.send_method( - spec.Basic.Publish, argsig, - (0, exchange, routing_key, mandatory, immediate), msg - ) - except socket.timeout: - raise RecoverableChannelError('basic_publish: timed out') - - basic_publish = _basic_publish - - def basic_publish_confirm(self, *args, **kwargs): - confirm_timeout = kwargs.pop('confirm_timeout', None) - - def confirm_handler(method, *args): - # When RMQ nacks message we are raising MessageNacked exception - if method == spec.Basic.Nack: - raise MessageNacked() - - if not self._confirm_selected: - self._confirm_selected = True - self.confirm_select() - ret = self._basic_publish(*args, **kwargs) - # Waiting for confirmation of message. - timeout = confirm_timeout or kwargs.get('timeout', None) - self.wait([spec.Basic.Ack, spec.Basic.Nack], - callback=confirm_handler, - timeout=timeout) - return ret - - def basic_qos(self, prefetch_size, prefetch_count, a_global, - argsig='lBb'): - """Specify quality of service. - - This method requests a specific quality of service. The QoS - can be specified for the current channel or for all channels - on the connection. The particular properties and semantics of - a qos method always depend on the content class semantics. - Though the qos method could in principle apply to both peers, - it is currently meaningful only for the server. - - PARAMETERS: - prefetch_size: long - - prefetch window in octets - - The client can request that messages be sent in - advance so that when the client finishes processing a - message, the following message is already held - locally, rather than needing to be sent down the - channel. Prefetching gives a performance improvement. - This field specifies the prefetch window size in - octets. The server will send a message in advance if - it is equal to or smaller in size than the available - prefetch size (and also falls into other prefetch - limits). May be set to zero, meaning "no specific - limit", although other prefetch limits may still - apply. The prefetch-size is ignored if the no-ack - option is set. - - RULE: - - The server MUST ignore this setting when the - client is not processing any messages - i.e. the - prefetch size does not limit the transfer of - single messages to a client, only the sending in - advance of more messages while the client still - has one or more unacknowledged messages. - - prefetch_count: short - - prefetch window in messages - - Specifies a prefetch window in terms of whole - messages. This field may be used in combination with - the prefetch-size field; a message will only be sent - in advance if both prefetch windows (and those at the - channel and connection level) allow it. The prefetch- - count is ignored if the no-ack option is set. - - RULE: - - The server MAY send less data in advance than - allowed by the client's specified prefetch windows - but it MUST NOT send more. - - a_global: boolean - - Defines a scope of QoS. Semantics of this parameter differs - between AMQP 0-9-1 standard and RabbitMQ broker: - - MEANING IN AMQP 0-9-1: - False: shared across all consumers on the channel - True: shared across all consumers on the connection - MEANING IN RABBITMQ: - False: applied separately to each new consumer - on the channel - True: shared across all consumers on the channel - """ - return self.send_method( - spec.Basic.Qos, argsig, (prefetch_size, prefetch_count, a_global), - wait=spec.Basic.QosOk, - ) - - def basic_recover(self, requeue=False): - """Redeliver unacknowledged messages. - - This method asks the broker to redeliver all unacknowledged - messages on a specified channel. Zero or more messages may be - redelivered. This method is only allowed on non-transacted - channels. - - RULE: - - The server MUST set the redelivered flag on all messages - that are resent. - - RULE: - - The server MUST raise a channel exception if this is - called on a transacted channel. - - PARAMETERS: - requeue: boolean - - requeue the message - - If this field is False, the message will be redelivered - to the original recipient. If this field is True, the - server will attempt to requeue the message, - potentially then delivering it to an alternative - subscriber. - """ - return self.send_method(spec.Basic.Recover, 'b', (requeue,)) - - def basic_recover_async(self, requeue=False): - return self.send_method(spec.Basic.RecoverAsync, 'b', (requeue,)) - - def basic_reject(self, delivery_tag, requeue, argsig='Lb'): - """Reject an incoming message. - - This method allows a client to reject a message. It can be - used to interrupt and cancel large incoming messages, or - return untreatable messages to their original queue. - - RULE: - - The server SHOULD be capable of accepting and process the - Reject method while sending message content with a Deliver - or Get-Ok method. I.e. the server should read and process - incoming methods while sending output frames. To cancel a - partially-send content, the server sends a content body - frame of size 1 (i.e. with no data except the frame-end - octet). - - RULE: - - The server SHOULD interpret this method as meaning that - the client is unable to process the message at this time. - - RULE: - - A client MUST NOT use this method as a means of selecting - messages to process. A rejected message MAY be discarded - or dead-lettered, not necessarily passed to another - client. - - PARAMETERS: - delivery_tag: longlong - - server-assigned delivery tag - - The server-assigned and channel-specific delivery tag - - RULE: - - The delivery tag is valid only within the channel - from which the message was received. I.e. a client - MUST NOT receive a message on one channel and then - acknowledge it on another. - - RULE: - - The server MUST NOT use a zero value for delivery - tags. Zero is reserved for client use, meaning "all - messages so far received". - - requeue: boolean - - requeue the message - - If this field is False, the message will be discarded. - If this field is True, the server will attempt to - requeue the message. - - RULE: - - The server MUST NOT deliver the message to the - same client within the context of the current - channel. The recommended strategy is to attempt - to deliver the message to an alternative consumer, - and if that is not possible, to move the message - to a dead-letter queue. The server MAY use more - sophisticated tracking to hold the message on the - queue and redeliver it to the same client at a - later stage. - """ - return self.send_method( - spec.Basic.Reject, argsig, (delivery_tag, requeue), - ) - - def _on_basic_return(self, reply_code, reply_text, - exchange, routing_key, message): - """Return a failed message. - - This method returns an undeliverable message that was - published with the "immediate" flag set, or an unroutable - message published with the "mandatory" flag set. The reply - code and text provide information about the reason that the - message was undeliverable. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - exchange: shortstr - - Specifies the name of the exchange that the message - was originally published to. - - routing_key: shortstr - - Message routing key - - Specifies the routing key name specified when the - message was published. - """ - exc = error_for_code( - reply_code, reply_text, spec.Basic.Return, ChannelError, - ) - handlers = self.events.get('basic_return') - if not handlers: - raise exc - for callback in handlers: - callback(exc, exchange, routing_key, message) - - ############# - # - # Tx - # - # - # work with standard transactions - # - # Standard transactions provide so-called "1.5 phase commit". We - # can ensure that work is never lost, but there is a chance of - # confirmations being lost, so that messages may be resent. - # Applications that use standard transactions must be able to - # detect and ignore duplicate messages. - # - # GRAMMAR:: - # - # tx = C:SELECT S:SELECT-OK - # / C:COMMIT S:COMMIT-OK - # / C:ROLLBACK S:ROLLBACK-OK - # - # RULE: - # - # An client using standard transactions SHOULD be able to - # track all messages received within a reasonable period, and - # thus detect and reject duplicates of the same message. It - # SHOULD NOT pass these to the application layer. - # - # - - def tx_commit(self): - """Commit the current transaction. - - This method commits all messages published and acknowledged in - the current transaction. A new transaction starts immediately - after a commit. - """ - return self.send_method(spec.Tx.Commit, wait=spec.Tx.CommitOk) - - def tx_rollback(self): - """Abandon the current transaction. - - This method abandons all messages published and acknowledged - in the current transaction. A new transaction starts - immediately after a rollback. - """ - return self.send_method(spec.Tx.Rollback, wait=spec.Tx.RollbackOk) - - def tx_select(self): - """Select standard transaction mode. - - This method sets the channel to use standard transactions. - The client must use this method at least once on a channel - before using the Commit or Rollback methods. - """ - return self.send_method(spec.Tx.Select, wait=spec.Tx.SelectOk) - - def confirm_select(self, nowait=False): - """Enable publisher confirms for this channel. - - Note: This is an RabbitMQ extension. - - Can now be used if the channel is in transactional mode. - - :param nowait: - If set, the server will not respond to the method. - The client should not wait for a reply method. If the - server could not complete the method it will raise a channel - or connection exception. - """ - return self.send_method( - spec.Confirm.Select, 'b', (nowait,), - wait=None if nowait else spec.Confirm.SelectOk, - ) - - def _on_basic_ack(self, delivery_tag, multiple): - for callback in self.events['basic_ack']: - callback(delivery_tag, multiple) - - def _on_basic_nack(self, delivery_tag, multiple): - for callback in self.events['basic_nack']: - callback(delivery_tag, multiple) diff --git a/.venv/lib/python3.10/site-packages/amqp/connection.py b/.venv/lib/python3.10/site-packages/amqp/connection.py deleted file mode 100644 index 07a817d..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/connection.py +++ /dev/null @@ -1,784 +0,0 @@ -"""AMQP Connections.""" -# Copyright (C) 2007-2008 Barry Pederson - -import logging -import socket -import uuid -import warnings -from array import array -from time import monotonic - -from vine import ensure_promise - -from . import __version__, sasl, spec -from .abstract_channel import AbstractChannel -from .channel import Channel -from .exceptions import (AMQPDeprecationWarning, ChannelError, ConnectionError, - ConnectionForced, MessageNacked, RecoverableChannelError, - RecoverableConnectionError, ResourceError, - error_for_code) -from .method_framing import frame_handler, frame_writer -from .transport import Transport - -try: - from ssl import SSLError -except ImportError: # pragma: no cover - class SSLError(Exception): # noqa - pass - -W_FORCE_CONNECT = """\ -The .{attr} attribute on the connection was accessed before -the connection was established. This is supported for now, but will -be deprecated in amqp 2.2.0. - -Since amqp 2.0 you have to explicitly call Connection.connect() -before using the connection. -""" - -START_DEBUG_FMT = """ -Start from server, version: %d.%d, properties: %s, mechanisms: %s, locales: %s -""".strip() - -__all__ = ('Connection',) - -AMQP_LOGGER = logging.getLogger('amqp') -AMQP_HEARTBEAT_LOGGER = logging.getLogger( - 'amqp.connection.Connection.heartbeat_tick' -) - -#: Default map for :attr:`Connection.library_properties` -LIBRARY_PROPERTIES = { - 'product': 'py-amqp', - 'product_version': __version__, -} - -#: Default map for :attr:`Connection.negotiate_capabilities` -NEGOTIATE_CAPABILITIES = { - 'consumer_cancel_notify': True, - 'connection.blocked': True, - 'authentication_failure_close': True, -} - - -class Connection(AbstractChannel): - """AMQP Connection. - - The connection class provides methods for a client to establish a - network connection to a server, and for both peers to operate the - connection thereafter. - - GRAMMAR:: - - connection = open-connection *use-connection close-connection - open-connection = C:protocol-header - S:START C:START-OK - *challenge - S:TUNE C:TUNE-OK - C:OPEN S:OPEN-OK - challenge = S:SECURE C:SECURE-OK - use-connection = *channel - close-connection = C:CLOSE S:CLOSE-OK - / S:CLOSE C:CLOSE-OK - Create a connection to the specified host, which should be - a 'host[:port]', such as 'localhost', or '1.2.3.4:5672' - (defaults to 'localhost', if a port is not specified then - 5672 is used) - - Authentication can be controlled by passing one or more - `amqp.sasl.SASL` instances as the `authentication` parameter, or - setting the `login_method` string to one of the supported methods: - 'GSSAPI', 'EXTERNAL', 'AMQPLAIN', or 'PLAIN'. - Otherwise authentication will be performed using any supported method - preferred by the server. Userid and passwords apply to AMQPLAIN and - PLAIN authentication, whereas on GSSAPI only userid will be used as the - client name. For EXTERNAL authentication both userid and password are - ignored. - - The 'ssl' parameter may be simply True/False, or - a dictionary of options to pass to :class:`ssl.SSLContext` such as - requiring certain certificates. For details, refer ``ssl`` parameter of - :class:`~amqp.transport.SSLTransport`. - - The "socket_settings" parameter is a dictionary defining tcp - settings which will be applied as socket options. - - When "confirm_publish" is set to True, the channel is put to - confirm mode. In this mode, each published message is - confirmed using Publisher confirms RabbitMQ extension. - """ - - Channel = Channel - - #: Mapping of protocol extensions to enable. - #: The server will report these in server_properties[capabilities], - #: and if a key in this map is present the client will tell the - #: server to either enable or disable the capability depending - #: on the value set in this map. - #: For example with: - #: negotiate_capabilities = { - #: 'consumer_cancel_notify': True, - #: } - #: The client will enable this capability if the server reports - #: support for it, but if the value is False the client will - #: disable the capability. - negotiate_capabilities = NEGOTIATE_CAPABILITIES - - #: These are sent to the server to announce what features - #: we support, type of client etc. - library_properties = LIBRARY_PROPERTIES - - #: Final heartbeat interval value (in float seconds) after negotiation - heartbeat = None - - #: Original heartbeat interval value proposed by client. - client_heartbeat = None - - #: Original heartbeat interval proposed by server. - server_heartbeat = None - - #: Time of last heartbeat sent (in monotonic time, if available). - last_heartbeat_sent = 0 - - #: Time of last heartbeat received (in monotonic time, if available). - last_heartbeat_received = 0 - - #: Number of successful writes to socket. - bytes_sent = 0 - - #: Number of successful reads from socket. - bytes_recv = 0 - - #: Number of bytes sent to socket at the last heartbeat check. - prev_sent = None - - #: Number of bytes received from socket at the last heartbeat check. - prev_recv = None - - _METHODS = { - spec.method(spec.Connection.Start, 'ooFSS'), - spec.method(spec.Connection.OpenOk), - spec.method(spec.Connection.Secure, 's'), - spec.method(spec.Connection.Tune, 'BlB'), - spec.method(spec.Connection.Close, 'BsBB'), - spec.method(spec.Connection.Blocked), - spec.method(spec.Connection.Unblocked), - spec.method(spec.Connection.CloseOk), - } - _METHODS = {m.method_sig: m for m in _METHODS} - - _ALLOWED_METHODS_WHEN_CLOSING = ( - spec.Connection.Close, spec.Connection.CloseOk - ) - - connection_errors = ( - ConnectionError, - socket.error, - IOError, - OSError, - ) - channel_errors = (ChannelError,) - recoverable_connection_errors = ( - RecoverableConnectionError, - MessageNacked, - socket.error, - IOError, - OSError, - ) - recoverable_channel_errors = ( - RecoverableChannelError, - ) - - def __init__(self, host='localhost:5672', userid='guest', password='guest', - login_method=None, login_response=None, - authentication=(), - virtual_host='/', locale='en_US', client_properties=None, - ssl=False, connect_timeout=None, channel_max=None, - frame_max=None, heartbeat=0, on_open=None, on_blocked=None, - on_unblocked=None, confirm_publish=False, - on_tune_ok=None, read_timeout=None, write_timeout=None, - socket_settings=None, frame_handler=frame_handler, - frame_writer=frame_writer, **kwargs): - self._connection_id = uuid.uuid4().hex - channel_max = channel_max or 65535 - frame_max = frame_max or 131072 - if authentication: - if isinstance(authentication, sasl.SASL): - authentication = (authentication,) - self.authentication = authentication - elif login_method is not None: - if login_method == 'GSSAPI': - auth = sasl.GSSAPI(userid) - elif login_method == 'EXTERNAL': - auth = sasl.EXTERNAL() - elif login_method == 'AMQPLAIN': - if userid is None or password is None: - raise ValueError( - "Must supply authentication or userid/password") - auth = sasl.AMQPLAIN(userid, password) - elif login_method == 'PLAIN': - if userid is None or password is None: - raise ValueError( - "Must supply authentication or userid/password") - auth = sasl.PLAIN(userid, password) - elif login_response is not None: - auth = sasl.RAW(login_method, login_response) - else: - raise ValueError("Invalid login method", login_method) - self.authentication = (auth,) - else: - self.authentication = (sasl.GSSAPI(userid, fail_soft=True), - sasl.EXTERNAL(), - sasl.AMQPLAIN(userid, password), - sasl.PLAIN(userid, password)) - - self.client_properties = dict( - self.library_properties, **client_properties or {} - ) - self.locale = locale - self.host = host - self.virtual_host = virtual_host - self.on_tune_ok = ensure_promise(on_tune_ok) - - self.frame_handler_cls = frame_handler - self.frame_writer_cls = frame_writer - - self._handshake_complete = False - - self.channels = {} - # The connection object itself is treated as channel 0 - super().__init__(self, 0) - - self._frame_writer = None - self._on_inbound_frame = None - self._transport = None - - # Properties set in the Tune method - self.channel_max = channel_max - self.frame_max = frame_max - self.client_heartbeat = heartbeat - - self.confirm_publish = confirm_publish - self.ssl = ssl - self.read_timeout = read_timeout - self.write_timeout = write_timeout - self.socket_settings = socket_settings - - # Callbacks - self.on_blocked = on_blocked - self.on_unblocked = on_unblocked - self.on_open = ensure_promise(on_open) - - self._used_channel_ids = array('H') - - # Properties set in the Start method - self.version_major = 0 - self.version_minor = 0 - self.server_properties = {} - self.mechanisms = [] - self.locales = [] - - self.connect_timeout = connect_timeout - - def __repr__(self): - if self._transport: - return f'' - else: - return f'' - - def __enter__(self): - self.connect() - return self - - def __exit__(self, *eargs): - self.close() - - def then(self, on_success, on_error=None): - return self.on_open.then(on_success, on_error) - - def _setup_listeners(self): - self._callbacks.update({ - spec.Connection.Start: self._on_start, - spec.Connection.OpenOk: self._on_open_ok, - spec.Connection.Secure: self._on_secure, - spec.Connection.Tune: self._on_tune, - spec.Connection.Close: self._on_close, - spec.Connection.Blocked: self._on_blocked, - spec.Connection.Unblocked: self._on_unblocked, - spec.Connection.CloseOk: self._on_close_ok, - }) - - def connect(self, callback=None): - # Let the transport.py module setup the actual - # socket connection to the broker. - # - if self.connected: - return callback() if callback else None - try: - self.transport = self.Transport( - self.host, self.connect_timeout, self.ssl, - self.read_timeout, self.write_timeout, - socket_settings=self.socket_settings, - ) - self.transport.connect() - self.on_inbound_frame = self.frame_handler_cls( - self, self.on_inbound_method) - self.frame_writer = self.frame_writer_cls(self, self.transport) - - while not self._handshake_complete: - self.drain_events(timeout=self.connect_timeout) - - except (OSError, SSLError): - self.collect() - raise - - def _warn_force_connect(self, attr): - warnings.warn(AMQPDeprecationWarning( - W_FORCE_CONNECT.format(attr=attr))) - - @property - def transport(self): - if self._transport is None: - self._warn_force_connect('transport') - self.connect() - return self._transport - - @transport.setter - def transport(self, transport): - self._transport = transport - - @property - def on_inbound_frame(self): - if self._on_inbound_frame is None: - self._warn_force_connect('on_inbound_frame') - self.connect() - return self._on_inbound_frame - - @on_inbound_frame.setter - def on_inbound_frame(self, on_inbound_frame): - self._on_inbound_frame = on_inbound_frame - - @property - def frame_writer(self): - if self._frame_writer is None: - self._warn_force_connect('frame_writer') - self.connect() - return self._frame_writer - - @frame_writer.setter - def frame_writer(self, frame_writer): - self._frame_writer = frame_writer - - def _on_start(self, version_major, version_minor, server_properties, - mechanisms, locales, argsig='FsSs'): - client_properties = self.client_properties - self.version_major = version_major - self.version_minor = version_minor - self.server_properties = server_properties - if isinstance(mechanisms, str): - mechanisms = mechanisms.encode('utf-8') - self.mechanisms = mechanisms.split(b' ') - self.locales = locales.split(' ') - AMQP_LOGGER.debug( - START_DEBUG_FMT, - self.version_major, self.version_minor, - self.server_properties, self.mechanisms, self.locales, - ) - - # Negotiate protocol extensions (capabilities) - scap = server_properties.get('capabilities') or {} - cap = client_properties.setdefault('capabilities', {}) - cap.update({ - wanted_cap: enable_cap - for wanted_cap, enable_cap in self.negotiate_capabilities.items() - if scap.get(wanted_cap) - }) - if not cap: - # no capabilities, server may not react well to having - # this key present in client_properties, so we remove it. - client_properties.pop('capabilities', None) - - for authentication in self.authentication: - if authentication.mechanism in self.mechanisms: - login_response = authentication.start(self) - if login_response is not NotImplemented: - break - else: - raise ConnectionError( - "Couldn't find appropriate auth mechanism " - "(can offer: {}; available: {})".format( - b", ".join(m.mechanism - for m in self.authentication - if m.mechanism).decode(), - b", ".join(self.mechanisms).decode())) - - self.send_method( - spec.Connection.StartOk, argsig, - (client_properties, authentication.mechanism, - login_response, self.locale), - ) - - def _on_secure(self, challenge): - pass - - def _on_tune(self, channel_max, frame_max, server_heartbeat, argsig='BlB'): - client_heartbeat = self.client_heartbeat or 0 - self.channel_max = channel_max or self.channel_max - self.frame_max = frame_max or self.frame_max - self.server_heartbeat = server_heartbeat or 0 - - # negotiate the heartbeat interval to the smaller of the - # specified values - if self.server_heartbeat == 0 or client_heartbeat == 0: - self.heartbeat = max(self.server_heartbeat, client_heartbeat) - else: - self.heartbeat = min(self.server_heartbeat, client_heartbeat) - - # Ignore server heartbeat if client_heartbeat is disabled - if not self.client_heartbeat: - self.heartbeat = 0 - - self.send_method( - spec.Connection.TuneOk, argsig, - (self.channel_max, self.frame_max, self.heartbeat), - callback=self._on_tune_sent, - ) - - def _on_tune_sent(self, argsig='ssb'): - self.send_method( - spec.Connection.Open, argsig, (self.virtual_host, '', False), - ) - - def _on_open_ok(self): - self._handshake_complete = True - self.on_open(self) - - def Transport(self, host, connect_timeout, - ssl=False, read_timeout=None, write_timeout=None, - socket_settings=None, **kwargs): - return Transport( - host, connect_timeout=connect_timeout, ssl=ssl, - read_timeout=read_timeout, write_timeout=write_timeout, - socket_settings=socket_settings, **kwargs) - - @property - def connected(self): - return self._transport and self._transport.connected - - def collect(self): - if self._transport: - self._transport.close() - - if self.channels: - # Copy all the channels except self since the channels - # dictionary changes during the collection process. - channels = [ - ch for ch in self.channels.values() - if ch is not self - ] - - for ch in channels: - ch.collect() - self._transport = self.connection = self.channels = None - - def _get_free_channel_id(self): - # Cast to a set for fast lookups, and keep stored as an array for lower memory usage. - used_channel_ids = set(self._used_channel_ids) - - for channel_id in range(1, self.channel_max + 1): - if channel_id not in used_channel_ids: - self._used_channel_ids.append(channel_id) - return channel_id - - raise ResourceError( - 'No free channel ids, current={}, channel_max={}'.format( - len(self.channels), self.channel_max), spec.Channel.Open) - - def _claim_channel_id(self, channel_id): - if channel_id in self._used_channel_ids: - raise ConnectionError(f'Channel {channel_id!r} already open') - else: - self._used_channel_ids.append(channel_id) - return channel_id - - def channel(self, channel_id=None, callback=None): - """Create new channel. - - Fetch a Channel object identified by the numeric channel_id, or - create that object if it doesn't already exist. - """ - if self.channels is None: - raise RecoverableConnectionError('Connection already closed.') - - try: - return self.channels[channel_id] - except KeyError: - channel = self.Channel(self, channel_id, on_open=callback) - channel.open() - return channel - - def is_alive(self): - raise NotImplementedError('Use AMQP heartbeats') - - def drain_events(self, timeout=None): - # read until message is ready - while not self.blocking_read(timeout): - pass - - def blocking_read(self, timeout=None): - with self.transport.having_timeout(timeout): - frame = self.transport.read_frame() - return self.on_inbound_frame(frame) - - def on_inbound_method(self, channel_id, method_sig, payload, content): - if self.channels is None: - raise RecoverableConnectionError('Connection already closed') - - return self.channels[channel_id].dispatch_method( - method_sig, payload, content, - ) - - def close(self, reply_code=0, reply_text='', method_sig=(0, 0), - argsig='BsBB'): - """Request a connection close. - - This method indicates that the sender wants to close the - connection. This may be due to internal conditions (e.g. a - forced shut-down) or due to an error handling a specific - method, i.e. an exception. When a close is due to an - exception, the sender provides the class and method id of the - method which caused the exception. - - RULE: - - After sending this method any received method except the - Close-OK method MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with the Close-OK method. - - RULE: - - When a server receives the Close method from a client it - MUST delete all server-side resources associated with the - client's context. A client CANNOT reconnect to a context - after sending or receiving a Close method. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - if self._transport is None: - # already closed - return - - try: - self.is_closing = True - return self.send_method( - spec.Connection.Close, argsig, - (reply_code, reply_text, method_sig[0], method_sig[1]), - wait=spec.Connection.CloseOk, - ) - except (OSError, SSLError): - # close connection - self.collect() - raise - finally: - self.is_closing = False - - def _on_close(self, reply_code, reply_text, class_id, method_id): - """Request a connection close. - - This method indicates that the sender wants to close the - connection. This may be due to internal conditions (e.g. a - forced shut-down) or due to an error handling a specific - method, i.e. an exception. When a close is due to an - exception, the sender provides the class and method id of the - method which caused the exception. - - RULE: - - After sending this method any received method except the - Close-OK method MUST be discarded. - - RULE: - - The peer sending this method MAY use a counter or timeout - to detect failure of the other peer to respond correctly - with the Close-OK method. - - RULE: - - When a server receives the Close method from a client it - MUST delete all server-side resources associated with the - client's context. A client CANNOT reconnect to a context - after sending or receiving a Close method. - - PARAMETERS: - reply_code: short - - The reply code. The AMQ reply codes are defined in AMQ - RFC 011. - - reply_text: shortstr - - The localised reply text. This text can be logged as an - aid to resolving issues. - - class_id: short - - failing method class - - When the close is provoked by a method exception, this - is the class of the method. - - method_id: short - - failing method ID - - When the close is provoked by a method exception, this - is the ID of the method. - """ - self._x_close_ok() - raise error_for_code(reply_code, reply_text, - (class_id, method_id), ConnectionError) - - def _x_close_ok(self): - """Confirm a connection close. - - This method confirms a Connection.Close method and tells the - recipient that it is safe to release resources for the - connection and close the socket. - - RULE: - A peer that detects a socket closure without having - received a Close-Ok handshake method SHOULD log the error. - """ - self.send_method(spec.Connection.CloseOk, callback=self._on_close_ok) - - def _on_close_ok(self): - """Confirm a connection close. - - This method confirms a Connection.Close method and tells the - recipient that it is safe to release resources for the - connection and close the socket. - - RULE: - - A peer that detects a socket closure without having - received a Close-Ok handshake method SHOULD log the error. - """ - self.collect() - - def _on_blocked(self): - """Callback called when connection blocked. - - Notes: - This is an RabbitMQ Extension. - """ - reason = 'connection blocked, see broker logs' - if self.on_blocked: - return self.on_blocked(reason) - - def _on_unblocked(self): - if self.on_unblocked: - return self.on_unblocked() - - def send_heartbeat(self): - self.frame_writer(8, 0, None, None, None) - - def heartbeat_tick(self, rate=2): - """Send heartbeat packets if necessary. - - Raises: - ~amqp.exceptions.ConnectionForvced: if none have been - received recently. - - Note: - This should be called frequently, on the order of - once per second. - - Keyword Arguments: - rate (int): Number of heartbeat frames to send during the heartbeat - timeout - """ - AMQP_HEARTBEAT_LOGGER.debug('heartbeat_tick : for connection %s', - self._connection_id) - if not self.heartbeat: - return - - # If rate is wrong, let's use 2 as default - if rate <= 0: - rate = 2 - - # treat actual data exchange in either direction as a heartbeat - sent_now = self.bytes_sent - recv_now = self.bytes_recv - if self.prev_sent is None or self.prev_sent != sent_now: - self.last_heartbeat_sent = monotonic() - if self.prev_recv is None or self.prev_recv != recv_now: - self.last_heartbeat_received = monotonic() - - now = monotonic() - AMQP_HEARTBEAT_LOGGER.debug( - 'heartbeat_tick : Prev sent/recv: %s/%s, ' - 'now - %s/%s, monotonic - %s, ' - 'last_heartbeat_sent - %s, heartbeat int. - %s ' - 'for connection %s', - self.prev_sent, self.prev_recv, - sent_now, recv_now, now, - self.last_heartbeat_sent, - self.heartbeat, - self._connection_id, - ) - - self.prev_sent, self.prev_recv = sent_now, recv_now - - # send a heartbeat if it's time to do so - if now > self.last_heartbeat_sent + self.heartbeat / rate: - AMQP_HEARTBEAT_LOGGER.debug( - 'heartbeat_tick: sending heartbeat for connection %s', - self._connection_id) - self.send_heartbeat() - self.last_heartbeat_sent = monotonic() - - # if we've missed two intervals' heartbeats, fail; this gives the - # server enough time to send heartbeats a little late - two_heartbeats = 2 * self.heartbeat - two_heartbeats_interval = self.last_heartbeat_received + two_heartbeats - heartbeats_missed = two_heartbeats_interval < monotonic() - if self.last_heartbeat_received and heartbeats_missed: - raise ConnectionForced('Too many heartbeats missed') - - @property - def sock(self): - return self.transport.sock - - @property - def server_capabilities(self): - return self.server_properties.get('capabilities') or {} diff --git a/.venv/lib/python3.10/site-packages/amqp/exceptions.py b/.venv/lib/python3.10/site-packages/amqp/exceptions.py deleted file mode 100644 index 0098dba..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/exceptions.py +++ /dev/null @@ -1,288 +0,0 @@ -"""Exceptions used by amqp.""" -# Copyright (C) 2007-2008 Barry Pederson - -from struct import pack, unpack - -__all__ = ( - 'AMQPError', - 'ConnectionError', 'ChannelError', - 'RecoverableConnectionError', 'IrrecoverableConnectionError', - 'RecoverableChannelError', 'IrrecoverableChannelError', - 'ConsumerCancelled', 'ContentTooLarge', 'NoConsumers', - 'ConnectionForced', 'InvalidPath', 'AccessRefused', 'NotFound', - 'ResourceLocked', 'PreconditionFailed', 'FrameError', 'FrameSyntaxError', - 'InvalidCommand', 'ChannelNotOpen', 'UnexpectedFrame', 'ResourceError', - 'NotAllowed', 'AMQPNotImplementedError', 'InternalError', - 'MessageNacked', - 'AMQPDeprecationWarning', -) - - -class AMQPDeprecationWarning(UserWarning): - """Warning for deprecated things.""" - - -class MessageNacked(Exception): - """Message was nacked by broker.""" - - -class AMQPError(Exception): - """Base class for all AMQP exceptions.""" - - code = 0 - - def __init__(self, reply_text=None, method_sig=None, - method_name=None, reply_code=None): - self.message = reply_text - self.reply_code = reply_code or self.code - self.reply_text = reply_text - self.method_sig = method_sig - self.method_name = method_name or '' - if method_sig and not self.method_name: - self.method_name = METHOD_NAME_MAP.get(method_sig, '') - Exception.__init__(self, reply_code, - reply_text, method_sig, self.method_name) - - def __str__(self): - if self.method: - return '{0.method}: ({0.reply_code}) {0.reply_text}'.format(self) - return self.reply_text or '<{}: unknown error>'.format( - type(self).__name__ - ) - - @property - def method(self): - return self.method_name or self.method_sig - - -class ConnectionError(AMQPError): - """AMQP Connection Error.""" - - -class ChannelError(AMQPError): - """AMQP Channel Error.""" - - -class RecoverableChannelError(ChannelError): - """Exception class for recoverable channel errors.""" - - -class IrrecoverableChannelError(ChannelError): - """Exception class for irrecoverable channel errors.""" - - -class RecoverableConnectionError(ConnectionError): - """Exception class for recoverable connection errors.""" - - -class IrrecoverableConnectionError(ConnectionError): - """Exception class for irrecoverable connection errors.""" - - -class Blocked(RecoverableConnectionError): - """AMQP Connection Blocked Predicate.""" - - -class ConsumerCancelled(RecoverableConnectionError): - """AMQP Consumer Cancelled Predicate.""" - - -class ContentTooLarge(RecoverableChannelError): - """AMQP Content Too Large Error.""" - - code = 311 - - -class NoConsumers(RecoverableChannelError): - """AMQP No Consumers Error.""" - - code = 313 - - -class ConnectionForced(RecoverableConnectionError): - """AMQP Connection Forced Error.""" - - code = 320 - - -class InvalidPath(IrrecoverableConnectionError): - """AMQP Invalid Path Error.""" - - code = 402 - - -class AccessRefused(IrrecoverableChannelError): - """AMQP Access Refused Error.""" - - code = 403 - - -class NotFound(IrrecoverableChannelError): - """AMQP Not Found Error.""" - - code = 404 - - -class ResourceLocked(RecoverableChannelError): - """AMQP Resource Locked Error.""" - - code = 405 - - -class PreconditionFailed(IrrecoverableChannelError): - """AMQP Precondition Failed Error.""" - - code = 406 - - -class FrameError(IrrecoverableConnectionError): - """AMQP Frame Error.""" - - code = 501 - - -class FrameSyntaxError(IrrecoverableConnectionError): - """AMQP Frame Syntax Error.""" - - code = 502 - - -class InvalidCommand(IrrecoverableConnectionError): - """AMQP Invalid Command Error.""" - - code = 503 - - -class ChannelNotOpen(IrrecoverableConnectionError): - """AMQP Channel Not Open Error.""" - - code = 504 - - -class UnexpectedFrame(IrrecoverableConnectionError): - """AMQP Unexpected Frame.""" - - code = 505 - - -class ResourceError(RecoverableConnectionError): - """AMQP Resource Error.""" - - code = 506 - - -class NotAllowed(IrrecoverableConnectionError): - """AMQP Not Allowed Error.""" - - code = 530 - - -class AMQPNotImplementedError(IrrecoverableConnectionError): - """AMQP Not Implemented Error.""" - - code = 540 - - -class InternalError(IrrecoverableConnectionError): - """AMQP Internal Error.""" - - code = 541 - - -ERROR_MAP = { - 311: ContentTooLarge, - 313: NoConsumers, - 320: ConnectionForced, - 402: InvalidPath, - 403: AccessRefused, - 404: NotFound, - 405: ResourceLocked, - 406: PreconditionFailed, - 501: FrameError, - 502: FrameSyntaxError, - 503: InvalidCommand, - 504: ChannelNotOpen, - 505: UnexpectedFrame, - 506: ResourceError, - 530: NotAllowed, - 540: AMQPNotImplementedError, - 541: InternalError, -} - - -def error_for_code(code, text, method, default): - try: - return ERROR_MAP[code](text, method, reply_code=code) - except KeyError: - return default(text, method, reply_code=code) - - -METHOD_NAME_MAP = { - (10, 10): 'Connection.start', - (10, 11): 'Connection.start_ok', - (10, 20): 'Connection.secure', - (10, 21): 'Connection.secure_ok', - (10, 30): 'Connection.tune', - (10, 31): 'Connection.tune_ok', - (10, 40): 'Connection.open', - (10, 41): 'Connection.open_ok', - (10, 50): 'Connection.close', - (10, 51): 'Connection.close_ok', - (20, 10): 'Channel.open', - (20, 11): 'Channel.open_ok', - (20, 20): 'Channel.flow', - (20, 21): 'Channel.flow_ok', - (20, 40): 'Channel.close', - (20, 41): 'Channel.close_ok', - (30, 10): 'Access.request', - (30, 11): 'Access.request_ok', - (40, 10): 'Exchange.declare', - (40, 11): 'Exchange.declare_ok', - (40, 20): 'Exchange.delete', - (40, 21): 'Exchange.delete_ok', - (40, 30): 'Exchange.bind', - (40, 31): 'Exchange.bind_ok', - (40, 40): 'Exchange.unbind', - (40, 41): 'Exchange.unbind_ok', - (50, 10): 'Queue.declare', - (50, 11): 'Queue.declare_ok', - (50, 20): 'Queue.bind', - (50, 21): 'Queue.bind_ok', - (50, 30): 'Queue.purge', - (50, 31): 'Queue.purge_ok', - (50, 40): 'Queue.delete', - (50, 41): 'Queue.delete_ok', - (50, 50): 'Queue.unbind', - (50, 51): 'Queue.unbind_ok', - (60, 10): 'Basic.qos', - (60, 11): 'Basic.qos_ok', - (60, 20): 'Basic.consume', - (60, 21): 'Basic.consume_ok', - (60, 30): 'Basic.cancel', - (60, 31): 'Basic.cancel_ok', - (60, 40): 'Basic.publish', - (60, 50): 'Basic.return', - (60, 60): 'Basic.deliver', - (60, 70): 'Basic.get', - (60, 71): 'Basic.get_ok', - (60, 72): 'Basic.get_empty', - (60, 80): 'Basic.ack', - (60, 90): 'Basic.reject', - (60, 100): 'Basic.recover_async', - (60, 110): 'Basic.recover', - (60, 111): 'Basic.recover_ok', - (60, 120): 'Basic.nack', - (90, 10): 'Tx.select', - (90, 11): 'Tx.select_ok', - (90, 20): 'Tx.commit', - (90, 21): 'Tx.commit_ok', - (90, 30): 'Tx.rollback', - (90, 31): 'Tx.rollback_ok', - (85, 10): 'Confirm.select', - (85, 11): 'Confirm.select_ok', -} - - -for _method_id, _method_name in list(METHOD_NAME_MAP.items()): - METHOD_NAME_MAP[unpack('>I', pack('>HH', *_method_id))[0]] = \ - _method_name diff --git a/.venv/lib/python3.10/site-packages/amqp/method_framing.py b/.venv/lib/python3.10/site-packages/amqp/method_framing.py deleted file mode 100644 index 6c49833..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/method_framing.py +++ /dev/null @@ -1,189 +0,0 @@ -"""Convert between frames and higher-level AMQP methods.""" -# Copyright (C) 2007-2008 Barry Pederson - -from collections import defaultdict -from struct import pack, pack_into, unpack_from - -from . import spec -from .basic_message import Message -from .exceptions import UnexpectedFrame -from .utils import str_to_bytes - -__all__ = ('frame_handler', 'frame_writer') - -#: Set of methods that require both a content frame and a body frame. -_CONTENT_METHODS = frozenset([ - spec.Basic.Return, - spec.Basic.Deliver, - spec.Basic.GetOk, -]) - - -#: Number of bytes reserved for protocol in a content frame. -#: We use this to calculate when a frame exceeeds the max frame size, -#: and if it does not the message will fit into the preallocated buffer. -FRAME_OVERHEAD = 40 - - -def frame_handler(connection, callback, - unpack_from=unpack_from, content_methods=_CONTENT_METHODS): - """Create closure that reads frames.""" - expected_types = defaultdict(lambda: 1) - partial_messages = {} - - def on_frame(frame): - frame_type, channel, buf = frame - connection.bytes_recv += 1 - if frame_type not in (expected_types[channel], 8): - raise UnexpectedFrame( - 'Received frame {} while expecting type: {}'.format( - frame_type, expected_types[channel]), - ) - elif frame_type == 1: - method_sig = unpack_from('>HH', buf, 0) - - if method_sig in content_methods: - # Save what we've got so far and wait for the content-header - partial_messages[channel] = Message( - frame_method=method_sig, frame_args=buf, - ) - expected_types[channel] = 2 - return False - - callback(channel, method_sig, buf, None) - - elif frame_type == 2: - msg = partial_messages[channel] - msg.inbound_header(buf) - - if not msg.ready: - # wait for the content-body - expected_types[channel] = 3 - return False - - # bodyless message, we're done - expected_types[channel] = 1 - partial_messages.pop(channel, None) - callback(channel, msg.frame_method, msg.frame_args, msg) - - elif frame_type == 3: - msg = partial_messages[channel] - msg.inbound_body(buf) - if not msg.ready: - # wait for the rest of the content-body - return False - expected_types[channel] = 1 - partial_messages.pop(channel, None) - callback(channel, msg.frame_method, msg.frame_args, msg) - elif frame_type == 8: - # bytes_recv already updated - return False - return True - - return on_frame - - -class Buffer: - def __init__(self, buf): - self.buf = buf - - @property - def buf(self): - return self._buf - - @buf.setter - def buf(self, buf): - self._buf = buf - # Using a memoryview allows slicing without copying underlying data. - # Slicing this is much faster than slicing the bytearray directly. - # More details: https://stackoverflow.com/a/34257357 - self.view = memoryview(buf) - - -def frame_writer(connection, transport, - pack=pack, pack_into=pack_into, range=range, len=len, - bytes=bytes, str_to_bytes=str_to_bytes, text_t=str): - """Create closure that writes frames.""" - write = transport.write - - buffer_store = Buffer(bytearray(connection.frame_max - 8)) - - def write_frame(type_, channel, method_sig, args, content): - chunk_size = connection.frame_max - 8 - offset = 0 - properties = None - args = str_to_bytes(args) - if content: - body = content.body - if isinstance(body, str): - encoding = content.properties.setdefault( - 'content_encoding', 'utf-8') - body = body.encode(encoding) - properties = content._serialize_properties() - bodylen = len(body) - properties_len = len(properties) or 0 - framelen = len(args) + properties_len + bodylen + FRAME_OVERHEAD - bigbody = framelen > chunk_size - else: - body, bodylen, bigbody = None, 0, 0 - - if bigbody: - # ## SLOW: string copy and write for every frame - frame = (b''.join([pack('>HH', *method_sig), args]) - if type_ == 1 else b'') # encode method frame - framelen = len(frame) - write(pack('>BHI%dsB' % framelen, - type_, channel, framelen, frame, 0xce)) - if body: - frame = b''.join([ - pack('>HHQ', method_sig[0], 0, len(body)), - properties, - ]) - framelen = len(frame) - write(pack('>BHI%dsB' % framelen, - 2, channel, framelen, frame, 0xce)) - - for i in range(0, bodylen, chunk_size): - frame = body[i:i + chunk_size] - framelen = len(frame) - write(pack('>BHI%dsB' % framelen, - 3, channel, framelen, - frame, 0xce)) - - else: - # frame_max can be updated via connection._on_tune. If - # it became larger, then we need to resize the buffer - # to prevent overflow. - if chunk_size > len(buffer_store.buf): - buffer_store.buf = bytearray(chunk_size) - buf = buffer_store.buf - - # ## FAST: pack into buffer and single write - frame = (b''.join([pack('>HH', *method_sig), args]) - if type_ == 1 else b'') - framelen = len(frame) - pack_into('>BHI%dsB' % framelen, buf, offset, - type_, channel, framelen, frame, 0xce) - offset += 8 + framelen - if body is not None: - frame = b''.join([ - pack('>HHQ', method_sig[0], 0, len(body)), - properties, - ]) - framelen = len(frame) - - pack_into('>BHI%dsB' % framelen, buf, offset, - 2, channel, framelen, frame, 0xce) - offset += 8 + framelen - - bodylen = len(body) - if bodylen > 0: - framelen = bodylen - pack_into('>BHI%dsB' % framelen, buf, offset, - 3, channel, framelen, body, 0xce) - offset += 8 + framelen - - write(buffer_store.view[:offset]) - - connection.bytes_sent += 1 - return write_frame diff --git a/.venv/lib/python3.10/site-packages/amqp/platform.py b/.venv/lib/python3.10/site-packages/amqp/platform.py deleted file mode 100644 index 6f6c6f3..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/platform.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Platform compatibility.""" - -import platform -import re -import sys -# Jython does not have this attribute -import typing - -try: - from socket import SOL_TCP -except ImportError: # pragma: no cover - from socket import IPPROTO_TCP as SOL_TCP # noqa - - -RE_NUM = re.compile(r'(\d+).+') - - -def _linux_version_to_tuple(s: str) -> typing.Tuple[int, int, int]: - return tuple(map(_versionatom, s.split('.')[:3])) - - -def _versionatom(s: str) -> int: - if s.isdigit(): - return int(s) - match = RE_NUM.match(s) - return int(match.groups()[0]) if match else 0 - - -# available socket options for TCP level -KNOWN_TCP_OPTS = { - 'TCP_CORK', 'TCP_DEFER_ACCEPT', 'TCP_KEEPCNT', - 'TCP_KEEPIDLE', 'TCP_KEEPINTVL', 'TCP_LINGER2', - 'TCP_MAXSEG', 'TCP_NODELAY', 'TCP_QUICKACK', - 'TCP_SYNCNT', 'TCP_USER_TIMEOUT', 'TCP_WINDOW_CLAMP', -} - -LINUX_VERSION = None -if sys.platform.startswith('linux'): - LINUX_VERSION = _linux_version_to_tuple(platform.release()) - if LINUX_VERSION < (2, 6, 37): - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - - # Windows Subsystem for Linux is an edge-case: the Python socket library - # returns most TCP_* enums, but they aren't actually supported - if platform.release().endswith("Microsoft"): - KNOWN_TCP_OPTS = {'TCP_NODELAY', 'TCP_KEEPIDLE', 'TCP_KEEPINTVL', - 'TCP_KEEPCNT'} - -elif sys.platform.startswith('darwin'): - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - -elif 'bsd' in sys.platform: - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - -# According to MSDN Windows platforms support getsockopt(TCP_MAXSSEG) but not -# setsockopt(TCP_MAXSEG) on IPPROTO_TCP sockets. -elif sys.platform.startswith('win'): - KNOWN_TCP_OPTS = {'TCP_NODELAY'} - -elif sys.platform.startswith('cygwin'): - KNOWN_TCP_OPTS = {'TCP_NODELAY'} - - # illumos does not allow to set the TCP_MAXSEG socket option, - # even if the Oracle documentation says otherwise. - # TCP_USER_TIMEOUT does not exist on Solaris 11.4 -elif sys.platform.startswith('sunos'): - KNOWN_TCP_OPTS.remove('TCP_MAXSEG') - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') - -# aix does not allow to set the TCP_MAXSEG -# or the TCP_USER_TIMEOUT socket options. -elif sys.platform.startswith('aix'): - KNOWN_TCP_OPTS.remove('TCP_MAXSEG') - KNOWN_TCP_OPTS.remove('TCP_USER_TIMEOUT') -__all__ = ( - 'LINUX_VERSION', - 'SOL_TCP', - 'KNOWN_TCP_OPTS', -) diff --git a/.venv/lib/python3.10/site-packages/amqp/protocol.py b/.venv/lib/python3.10/site-packages/amqp/protocol.py deleted file mode 100644 index b58d5c9..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/protocol.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Protocol data.""" - -from collections import namedtuple - -queue_declare_ok_t = namedtuple( - 'queue_declare_ok_t', ('queue', 'message_count', 'consumer_count'), -) - -basic_return_t = namedtuple( - 'basic_return_t', - ('reply_code', 'reply_text', 'exchange', 'routing_key', 'message'), -) diff --git a/.venv/lib/python3.10/site-packages/amqp/sasl.py b/.venv/lib/python3.10/site-packages/amqp/sasl.py deleted file mode 100644 index 407ccb8..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/sasl.py +++ /dev/null @@ -1,191 +0,0 @@ -"""SASL mechanisms for AMQP authentication.""" - -import socket -import warnings -from io import BytesIO - -from amqp.serialization import _write_table - - -class SASL: - """The base class for all amqp SASL authentication mechanisms. - - You should sub-class this if you're implementing your own authentication. - """ - - @property - def mechanism(self): - """Return a bytes containing the SASL mechanism name.""" - raise NotImplementedError - - def start(self, connection): - """Return the first response to a SASL challenge as a bytes object.""" - raise NotImplementedError - - -class PLAIN(SASL): - """PLAIN SASL authentication mechanism. - - See https://tools.ietf.org/html/rfc4616 for details - """ - - mechanism = b'PLAIN' - - def __init__(self, username, password): - self.username, self.password = username, password - - __slots__ = ( - "username", - "password", - ) - - def start(self, connection): - if self.username is None or self.password is None: - return NotImplemented - login_response = BytesIO() - login_response.write(b'\0') - login_response.write(self.username.encode('utf-8')) - login_response.write(b'\0') - login_response.write(self.password.encode('utf-8')) - return login_response.getvalue() - - -class AMQPLAIN(SASL): - """AMQPLAIN SASL authentication mechanism. - - This is a non-standard mechanism used by AMQP servers. - """ - - mechanism = b'AMQPLAIN' - - def __init__(self, username, password): - self.username, self.password = username, password - - __slots__ = ( - "username", - "password", - ) - - def start(self, connection): - if self.username is None or self.password is None: - return NotImplemented - login_response = BytesIO() - _write_table({b'LOGIN': self.username, b'PASSWORD': self.password}, - login_response.write, []) - # Skip the length at the beginning - return login_response.getvalue()[4:] - - -def _get_gssapi_mechanism(): - try: - import gssapi - import gssapi.raw.misc # Fail if the old python-gssapi is installed - except ImportError: - class FakeGSSAPI(SASL): - """A no-op SASL mechanism for when gssapi isn't available.""" - - mechanism = None - - def __init__(self, client_name=None, service=b'amqp', - rdns=False, fail_soft=False): - if not fail_soft: - raise NotImplementedError( - "You need to install the `gssapi` module for GSSAPI " - "SASL support") - - def start(self): # pragma: no cover - return NotImplemented - return FakeGSSAPI - else: - class GSSAPI(SASL): - """GSSAPI SASL authentication mechanism. - - See https://tools.ietf.org/html/rfc4752 for details - """ - - mechanism = b'GSSAPI' - - def __init__(self, client_name=None, service=b'amqp', - rdns=False, fail_soft=False): - if client_name and not isinstance(client_name, bytes): - client_name = client_name.encode('ascii') - self.client_name = client_name - self.fail_soft = fail_soft - self.service = service - self.rdns = rdns - - __slots__ = ( - "client_name", - "fail_soft", - "service", - "rdns" - ) - - def get_hostname(self, connection): - sock = connection.transport.sock - if self.rdns and sock.family in (socket.AF_INET, - socket.AF_INET6): - peer = sock.getpeername() - hostname, _, _ = socket.gethostbyaddr(peer[0]) - else: - hostname = connection.transport.host - if not isinstance(hostname, bytes): - hostname = hostname.encode('ascii') - return hostname - - def start(self, connection): - try: - if self.client_name: - creds = gssapi.Credentials( - name=gssapi.Name(self.client_name)) - else: - creds = None - hostname = self.get_hostname(connection) - name = gssapi.Name(b'@'.join([self.service, hostname]), - gssapi.NameType.hostbased_service) - context = gssapi.SecurityContext(name=name, creds=creds) - return context.step(None) - except gssapi.raw.misc.GSSError: - if self.fail_soft: - return NotImplemented - else: - raise - return GSSAPI - - -GSSAPI = _get_gssapi_mechanism() - - -class EXTERNAL(SASL): - """EXTERNAL SASL mechanism. - - Enables external authentication, i.e. not handled through this protocol. - Only passes 'EXTERNAL' as authentication mechanism, but no further - authentication data. - """ - - mechanism = b'EXTERNAL' - - def start(self, connection): - return b'' - - -class RAW(SASL): - """A generic custom SASL mechanism. - - This mechanism takes a mechanism name and response to send to the server, - so can be used for simple custom authentication schemes. - """ - - mechanism = None - - def __init__(self, mechanism, response): - assert isinstance(mechanism, bytes) - assert isinstance(response, bytes) - self.mechanism, self.response = mechanism, response - warnings.warn("Passing login_method and login_response to Connection " - "is deprecated. Please implement a SASL subclass " - "instead.", DeprecationWarning) - - def start(self, connection): - return self.response diff --git a/.venv/lib/python3.10/site-packages/amqp/serialization.py b/.venv/lib/python3.10/site-packages/amqp/serialization.py deleted file mode 100644 index 1f2f8e2..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/serialization.py +++ /dev/null @@ -1,582 +0,0 @@ -"""Convert between bytestreams and higher-level AMQP types. - -2007-11-05 Barry Pederson - -""" -# Copyright (C) 2007 Barry Pederson - -import calendar -from datetime import datetime -from decimal import Decimal -from io import BytesIO -from struct import pack, unpack_from - -from .exceptions import FrameSyntaxError -from .spec import Basic -from .utils import bytes_to_str as pstr_t -from .utils import str_to_bytes - -ILLEGAL_TABLE_TYPE = """\ - Table type {0!r} not handled by amqp. -""" - -ILLEGAL_TABLE_TYPE_WITH_KEY = """\ -Table type {0!r} for key {1!r} not handled by amqp. [value: {2!r}] -""" - -ILLEGAL_TABLE_TYPE_WITH_VALUE = """\ - Table type {0!r} not handled by amqp. [value: {1!r}] -""" - - -def _read_item(buf, offset): - ftype = chr(buf[offset]) - offset += 1 - - # 'S': long string - if ftype == 'S': - slen, = unpack_from('>I', buf, offset) - offset += 4 - try: - val = pstr_t(buf[offset:offset + slen]) - except UnicodeDecodeError: - val = buf[offset:offset + slen] - - offset += slen - # 's': short string - elif ftype == 's': - slen, = unpack_from('>B', buf, offset) - offset += 1 - val = pstr_t(buf[offset:offset + slen]) - offset += slen - # 'x': Bytes Array - elif ftype == 'x': - blen, = unpack_from('>I', buf, offset) - offset += 4 - val = buf[offset:offset + blen] - offset += blen - # 'b': short-short int - elif ftype == 'b': - val, = unpack_from('>B', buf, offset) - offset += 1 - # 'B': short-short unsigned int - elif ftype == 'B': - val, = unpack_from('>b', buf, offset) - offset += 1 - # 'U': short int - elif ftype == 'U': - val, = unpack_from('>h', buf, offset) - offset += 2 - # 'u': short unsigned int - elif ftype == 'u': - val, = unpack_from('>H', buf, offset) - offset += 2 - # 'I': long int - elif ftype == 'I': - val, = unpack_from('>i', buf, offset) - offset += 4 - # 'i': long unsigned int - elif ftype == 'i': - val, = unpack_from('>I', buf, offset) - offset += 4 - # 'L': long long int - elif ftype == 'L': - val, = unpack_from('>q', buf, offset) - offset += 8 - # 'l': long long unsigned int - elif ftype == 'l': - val, = unpack_from('>Q', buf, offset) - offset += 8 - # 'f': float - elif ftype == 'f': - val, = unpack_from('>f', buf, offset) - offset += 4 - # 'd': double - elif ftype == 'd': - val, = unpack_from('>d', buf, offset) - offset += 8 - # 'D': decimal - elif ftype == 'D': - d, = unpack_from('>B', buf, offset) - offset += 1 - n, = unpack_from('>i', buf, offset) - offset += 4 - val = Decimal(n) / Decimal(10 ** d) - # 'F': table - elif ftype == 'F': - tlen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + tlen - val = {} - while offset < limit: - keylen, = unpack_from('>B', buf, offset) - offset += 1 - key = pstr_t(buf[offset:offset + keylen]) - offset += keylen - val[key], offset = _read_item(buf, offset) - # 'A': array - elif ftype == 'A': - alen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + alen - val = [] - while offset < limit: - v, offset = _read_item(buf, offset) - val.append(v) - # 't' (bool) - elif ftype == 't': - val, = unpack_from('>B', buf, offset) - val = bool(val) - offset += 1 - # 'T': timestamp - elif ftype == 'T': - val, = unpack_from('>Q', buf, offset) - offset += 8 - val = datetime.utcfromtimestamp(val) - # 'V': void - elif ftype == 'V': - val = None - else: - raise FrameSyntaxError( - 'Unknown value in table: {!r} ({!r})'.format( - ftype, type(ftype))) - return val, offset - - -def loads(format, buf, offset): - """Deserialize amqp format. - - bit = b - octet = o - short = B - long = l - long long = L - float = f - shortstr = s - longstr = S - table = F - array = A - timestamp = T - """ - bitcount = bits = 0 - - values = [] - append = values.append - format = pstr_t(format) - - for p in format: - if p == 'b': - if not bitcount: - bits = ord(buf[offset:offset + 1]) - offset += 1 - bitcount = 8 - val = (bits & 1) == 1 - bits >>= 1 - bitcount -= 1 - elif p == 'o': - bitcount = bits = 0 - val, = unpack_from('>B', buf, offset) - offset += 1 - elif p == 'B': - bitcount = bits = 0 - val, = unpack_from('>H', buf, offset) - offset += 2 - elif p == 'l': - bitcount = bits = 0 - val, = unpack_from('>I', buf, offset) - offset += 4 - elif p == 'L': - bitcount = bits = 0 - val, = unpack_from('>Q', buf, offset) - offset += 8 - elif p == 'f': - bitcount = bits = 0 - val, = unpack_from('>f', buf, offset) - offset += 4 - elif p == 's': - bitcount = bits = 0 - slen, = unpack_from('B', buf, offset) - offset += 1 - val = buf[offset:offset + slen].decode('utf-8', 'surrogatepass') - offset += slen - elif p == 'S': - bitcount = bits = 0 - slen, = unpack_from('>I', buf, offset) - offset += 4 - val = buf[offset:offset + slen].decode('utf-8', 'surrogatepass') - offset += slen - elif p == 'x': - blen, = unpack_from('>I', buf, offset) - offset += 4 - val = buf[offset:offset + blen] - offset += blen - elif p == 'F': - bitcount = bits = 0 - tlen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + tlen - val = {} - while offset < limit: - keylen, = unpack_from('>B', buf, offset) - offset += 1 - key = pstr_t(buf[offset:offset + keylen]) - offset += keylen - val[key], offset = _read_item(buf, offset) - elif p == 'A': - bitcount = bits = 0 - alen, = unpack_from('>I', buf, offset) - offset += 4 - limit = offset + alen - val = [] - while offset < limit: - aval, offset = _read_item(buf, offset) - val.append(aval) - elif p == 'T': - bitcount = bits = 0 - val, = unpack_from('>Q', buf, offset) - offset += 8 - val = datetime.utcfromtimestamp(val) - else: - raise FrameSyntaxError(ILLEGAL_TABLE_TYPE.format(p)) - append(val) - return values, offset - - -def _flushbits(bits, write): - if bits: - write(pack('B' * len(bits), *bits)) - bits[:] = [] - return 0 - - -def dumps(format, values): - """Serialize AMQP arguments. - - Notes: - bit = b - octet = o - short = B - long = l - long long = L - shortstr = s - longstr = S - byte array = x - table = F - array = A - """ - bitcount = 0 - bits = [] - out = BytesIO() - write = out.write - - format = pstr_t(format) - - for i, val in enumerate(values): - p = format[i] - if p == 'b': - val = 1 if val else 0 - shift = bitcount % 8 - if shift == 0: - bits.append(0) - bits[-1] |= (val << shift) - bitcount += 1 - elif p == 'o': - bitcount = _flushbits(bits, write) - write(pack('B', val)) - elif p == 'B': - bitcount = _flushbits(bits, write) - write(pack('>H', int(val))) - elif p == 'l': - bitcount = _flushbits(bits, write) - write(pack('>I', val)) - elif p == 'L': - bitcount = _flushbits(bits, write) - write(pack('>Q', val)) - elif p == 'f': - bitcount = _flushbits(bits, write) - write(pack('>f', val)) - elif p == 's': - val = val or '' - bitcount = _flushbits(bits, write) - if isinstance(val, str): - val = val.encode('utf-8', 'surrogatepass') - write(pack('B', len(val))) - write(val) - elif p == 'S' or p == 'x': - val = val or '' - bitcount = _flushbits(bits, write) - if isinstance(val, str): - val = val.encode('utf-8', 'surrogatepass') - write(pack('>I', len(val))) - write(val) - elif p == 'F': - bitcount = _flushbits(bits, write) - _write_table(val or {}, write, bits) - elif p == 'A': - bitcount = _flushbits(bits, write) - _write_array(val or [], write, bits) - elif p == 'T': - write(pack('>Q', int(calendar.timegm(val.utctimetuple())))) - _flushbits(bits, write) - - return out.getvalue() - - -def _write_table(d, write, bits): - out = BytesIO() - twrite = out.write - for k, v in d.items(): - if isinstance(k, str): - k = k.encode('utf-8', 'surrogatepass') - twrite(pack('B', len(k))) - twrite(k) - try: - _write_item(v, twrite, bits) - except ValueError: - raise FrameSyntaxError( - ILLEGAL_TABLE_TYPE_WITH_KEY.format(type(v), k, v)) - table_data = out.getvalue() - write(pack('>I', len(table_data))) - write(table_data) - - -def _write_array(list_, write, bits): - out = BytesIO() - awrite = out.write - for v in list_: - try: - _write_item(v, awrite, bits) - except ValueError: - raise FrameSyntaxError( - ILLEGAL_TABLE_TYPE_WITH_VALUE.format(type(v), v)) - array_data = out.getvalue() - write(pack('>I', len(array_data))) - write(array_data) - - -def _write_item(v, write, bits): - if isinstance(v, (str, bytes)): - if isinstance(v, str): - v = v.encode('utf-8', 'surrogatepass') - write(pack('>cI', b'S', len(v))) - write(v) - elif isinstance(v, bool): - write(pack('>cB', b't', int(v))) - elif isinstance(v, float): - write(pack('>cd', b'd', v)) - elif isinstance(v, int): - if v > 2147483647 or v < -2147483647: - write(pack('>cq', b'L', v)) - else: - write(pack('>ci', b'I', v)) - elif isinstance(v, Decimal): - sign, digits, exponent = v.as_tuple() - v = 0 - for d in digits: - v = (v * 10) + d - if sign: - v = -v - write(pack('>cBi', b'D', -exponent, v)) - elif isinstance(v, datetime): - write( - pack('>cQ', b'T', int(calendar.timegm(v.utctimetuple())))) - elif isinstance(v, dict): - write(b'F') - _write_table(v, write, bits) - elif isinstance(v, (list, tuple)): - write(b'A') - _write_array(v, write, bits) - elif v is None: - write(b'V') - else: - raise ValueError() - - -def decode_properties_basic(buf, offset): - """Decode basic properties.""" - properties = {} - - flags, = unpack_from('>H', buf, offset) - offset += 2 - - if flags & 0x8000: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['content_type'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x4000: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['content_encoding'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x2000: - _f, offset = loads('F', buf, offset) - properties['application_headers'], = _f - if flags & 0x1000: - properties['delivery_mode'], = unpack_from('>B', buf, offset) - offset += 1 - if flags & 0x0800: - properties['priority'], = unpack_from('>B', buf, offset) - offset += 1 - if flags & 0x0400: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['correlation_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0200: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['reply_to'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0100: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['expiration'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0080: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['message_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0040: - properties['timestamp'], = unpack_from('>Q', buf, offset) - offset += 8 - if flags & 0x0020: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['type'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0010: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['user_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0008: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['app_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - if flags & 0x0004: - slen, = unpack_from('>B', buf, offset) - offset += 1 - properties['cluster_id'] = pstr_t(buf[offset:offset + slen]) - offset += slen - return properties, offset - - -PROPERTY_CLASSES = { - Basic.CLASS_ID: decode_properties_basic, -} - - -class GenericContent: - """Abstract base class for AMQP content. - - Subclasses should override the PROPERTIES attribute. - """ - - CLASS_ID = None - PROPERTIES = [('dummy', 's')] - - def __init__(self, frame_method=None, frame_args=None, **props): - self.frame_method = frame_method - self.frame_args = frame_args - - self.properties = props - self._pending_chunks = [] - self.body_received = 0 - self.body_size = 0 - self.ready = False - - __slots__ = ( - "frame_method", - "frame_args", - "properties", - "_pending_chunks", - "body_received", - "body_size", - "ready", - # adding '__dict__' to get dynamic assignment - "__dict__", - "__weakref__", - ) - - def __getattr__(self, name): - # Look for additional properties in the 'properties' - # dictionary, and if present - the 'delivery_info' dictionary. - if name == '__setstate__': - # Allows pickling/unpickling to work - raise AttributeError('__setstate__') - - if name in self.properties: - return self.properties[name] - raise AttributeError(name) - - def _load_properties(self, class_id, buf, offset): - """Load AMQP properties. - - Given the raw bytes containing the property-flags and property-list - from a content-frame-header, parse and insert into a dictionary - stored in this object as an attribute named 'properties'. - """ - # Read 16-bit shorts until we get one with a low bit set to zero - props, offset = PROPERTY_CLASSES[class_id](buf, offset) - self.properties = props - return offset - - def _serialize_properties(self): - """Serialize AMQP properties. - - Serialize the 'properties' attribute (a dictionary) into - the raw bytes making up a set of property flags and a - property list, suitable for putting into a content frame header. - """ - shift = 15 - flag_bits = 0 - flags = [] - sformat, svalues = [], [] - props = self.properties - for key, proptype in self.PROPERTIES: - val = props.get(key, None) - if val is not None: - if shift == 0: - flags.append(flag_bits) - flag_bits = 0 - shift = 15 - - flag_bits |= (1 << shift) - if proptype != 'bit': - sformat.append(str_to_bytes(proptype)) - svalues.append(val) - - shift -= 1 - flags.append(flag_bits) - result = BytesIO() - write = result.write - for flag_bits in flags: - write(pack('>H', flag_bits)) - write(dumps(b''.join(sformat), svalues)) - - return result.getvalue() - - def inbound_header(self, buf, offset=0): - class_id, self.body_size = unpack_from('>HxxQ', buf, offset) - offset += 12 - self._load_properties(class_id, buf, offset) - if not self.body_size: - self.ready = True - return offset - - def inbound_body(self, buf): - chunks = self._pending_chunks - self.body_received += len(buf) - if self.body_received >= self.body_size: - if chunks: - chunks.append(buf) - self.body = bytes().join(chunks) - chunks[:] = [] - else: - self.body = buf - self.ready = True - else: - chunks.append(buf) diff --git a/.venv/lib/python3.10/site-packages/amqp/spec.py b/.venv/lib/python3.10/site-packages/amqp/spec.py deleted file mode 100644 index 2a1169e..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/spec.py +++ /dev/null @@ -1,121 +0,0 @@ -"""AMQP Spec.""" - -from collections import namedtuple - -method_t = namedtuple('method_t', ('method_sig', 'args', 'content')) - - -def method(method_sig, args=None, content=False): - """Create amqp method specification tuple.""" - return method_t(method_sig, args, content) - - -class Connection: - """AMQ Connection class.""" - - CLASS_ID = 10 - - Start = (10, 10) - StartOk = (10, 11) - Secure = (10, 20) - SecureOk = (10, 21) - Tune = (10, 30) - TuneOk = (10, 31) - Open = (10, 40) - OpenOk = (10, 41) - Close = (10, 50) - CloseOk = (10, 51) - Blocked = (10, 60) - Unblocked = (10, 61) - - -class Channel: - """AMQ Channel class.""" - - CLASS_ID = 20 - - Open = (20, 10) - OpenOk = (20, 11) - Flow = (20, 20) - FlowOk = (20, 21) - Close = (20, 40) - CloseOk = (20, 41) - - -class Exchange: - """AMQ Exchange class.""" - - CLASS_ID = 40 - - Declare = (40, 10) - DeclareOk = (40, 11) - Delete = (40, 20) - DeleteOk = (40, 21) - Bind = (40, 30) - BindOk = (40, 31) - Unbind = (40, 40) - UnbindOk = (40, 51) - - -class Queue: - """AMQ Queue class.""" - - CLASS_ID = 50 - - Declare = (50, 10) - DeclareOk = (50, 11) - Bind = (50, 20) - BindOk = (50, 21) - Purge = (50, 30) - PurgeOk = (50, 31) - Delete = (50, 40) - DeleteOk = (50, 41) - Unbind = (50, 50) - UnbindOk = (50, 51) - - -class Basic: - """AMQ Basic class.""" - - CLASS_ID = 60 - - Qos = (60, 10) - QosOk = (60, 11) - Consume = (60, 20) - ConsumeOk = (60, 21) - Cancel = (60, 30) - CancelOk = (60, 31) - Publish = (60, 40) - Return = (60, 50) - Deliver = (60, 60) - Get = (60, 70) - GetOk = (60, 71) - GetEmpty = (60, 72) - Ack = (60, 80) - Nack = (60, 120) - Reject = (60, 90) - RecoverAsync = (60, 100) - Recover = (60, 110) - RecoverOk = (60, 111) - - -class Confirm: - """AMQ Confirm class.""" - - CLASS_ID = 85 - - Select = (85, 10) - SelectOk = (85, 11) - - -class Tx: - """AMQ Tx class.""" - - CLASS_ID = 90 - - Select = (90, 10) - SelectOk = (90, 11) - Commit = (90, 20) - CommitOk = (90, 21) - Rollback = (90, 30) - RollbackOk = (90, 31) diff --git a/.venv/lib/python3.10/site-packages/amqp/transport.py b/.venv/lib/python3.10/site-packages/amqp/transport.py deleted file mode 100644 index c915977..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/transport.py +++ /dev/null @@ -1,676 +0,0 @@ -"""Transport implementation.""" -# Copyright (C) 2009 Barry Pederson - -import errno -import os -import re -import socket -import ssl -from contextlib import contextmanager -from ssl import SSLError -from struct import pack, unpack - -from .exceptions import UnexpectedFrame -from .platform import KNOWN_TCP_OPTS, SOL_TCP -from .utils import set_cloexec - -_UNAVAIL = {errno.EAGAIN, errno.EINTR, errno.ENOENT, errno.EWOULDBLOCK} - -AMQP_PORT = 5672 - -EMPTY_BUFFER = bytes() - -SIGNED_INT_MAX = 0x7FFFFFFF - -# Yes, Advanced Message Queuing Protocol Protocol is redundant -AMQP_PROTOCOL_HEADER = b'AMQP\x00\x00\x09\x01' - -# Match things like: [fe80::1]:5432, from RFC 2732 -IPV6_LITERAL = re.compile(r'\[([\.0-9a-f:]+)\](?::(\d+))?') - -DEFAULT_SOCKET_SETTINGS = { - 'TCP_NODELAY': 1, - 'TCP_USER_TIMEOUT': 1000, - 'TCP_KEEPIDLE': 60, - 'TCP_KEEPINTVL': 10, - 'TCP_KEEPCNT': 9, -} - - -def to_host_port(host, default=AMQP_PORT): - """Convert hostname:port string to host, port tuple.""" - port = default - m = IPV6_LITERAL.match(host) - if m: - host = m.group(1) - if m.group(2): - port = int(m.group(2)) - else: - if ':' in host: - host, port = host.rsplit(':', 1) - port = int(port) - return host, port - - -class _AbstractTransport: - """Common superclass for TCP and SSL transports. - - PARAMETERS: - host: str - - Broker address in format ``HOSTNAME:PORT``. - - connect_timeout: int - - Timeout of creating new connection. - - read_timeout: int - - sets ``SO_RCVTIMEO`` parameter of socket. - - write_timeout: int - - sets ``SO_SNDTIMEO`` parameter of socket. - - socket_settings: dict - - dictionary containing `optname` and ``optval`` passed to - ``setsockopt(2)``. - - raise_on_initial_eintr: bool - - when True, ``socket.timeout`` is raised - when exception is received during first read. See ``_read()`` for - details. - """ - - def __init__(self, host, connect_timeout=None, - read_timeout=None, write_timeout=None, - socket_settings=None, raise_on_initial_eintr=True, **kwargs): - self.connected = False - self.sock = None - self.raise_on_initial_eintr = raise_on_initial_eintr - self._read_buffer = EMPTY_BUFFER - self.host, self.port = to_host_port(host) - self.connect_timeout = connect_timeout - self.read_timeout = read_timeout - self.write_timeout = write_timeout - self.socket_settings = socket_settings - - __slots__ = ( - "connection", - "sock", - "raise_on_initial_eintr", - "_read_buffer", - "host", - "port", - "connect_timeout", - "read_timeout", - "write_timeout", - "socket_settings", - # adding '__dict__' to get dynamic assignment - "__dict__", - "__weakref__", - ) - - def __repr__(self): - if self.sock: - src = f'{self.sock.getsockname()[0]}:{self.sock.getsockname()[1]}' - dst = f'{self.sock.getpeername()[0]}:{self.sock.getpeername()[1]}' - return f'<{type(self).__name__}: {src} -> {dst} at {id(self):#x}>' - else: - return f'<{type(self).__name__}: (disconnected) at {id(self):#x}>' - - def connect(self): - try: - # are we already connected? - if self.connected: - return - self._connect(self.host, self.port, self.connect_timeout) - self._init_socket( - self.socket_settings, self.read_timeout, self.write_timeout, - ) - # we've sent the banner; signal connect - # EINTR, EAGAIN, EWOULDBLOCK would signal that the banner - # has _not_ been sent - self.connected = True - except (OSError, SSLError): - # if not fully connected, close socket, and reraise error - if self.sock and not self.connected: - self.sock.close() - self.sock = None - raise - - @contextmanager - def having_timeout(self, timeout): - if timeout is None: - yield self.sock - else: - sock = self.sock - prev = sock.gettimeout() - if prev != timeout: - sock.settimeout(timeout) - try: - yield self.sock - except SSLError as exc: - if 'timed out' in str(exc): - # http://bugs.python.org/issue10272 - raise socket.timeout() - elif 'The operation did not complete' in str(exc): - # Non-blocking SSL sockets can throw SSLError - raise socket.timeout() - raise - except OSError as exc: - if exc.errno == errno.EWOULDBLOCK: - raise socket.timeout() - raise - finally: - if timeout != prev: - sock.settimeout(prev) - - def _connect(self, host, port, timeout): - entries = socket.getaddrinfo( - host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, SOL_TCP, - ) - for i, res in enumerate(entries): - af, socktype, proto, canonname, sa = res - try: - self.sock = socket.socket(af, socktype, proto) - try: - set_cloexec(self.sock, True) - except NotImplementedError: - pass - self.sock.settimeout(timeout) - self.sock.connect(sa) - except socket.error: - if self.sock: - self.sock.close() - self.sock = None - if i + 1 >= len(entries): - raise - else: - break - - def _init_socket(self, socket_settings, read_timeout, write_timeout): - self.sock.settimeout(None) # set socket back to blocking mode - self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - self._set_socket_options(socket_settings) - - # set socket timeouts - for timeout, interval in ((socket.SO_SNDTIMEO, write_timeout), - (socket.SO_RCVTIMEO, read_timeout)): - if interval is not None: - sec = int(interval) - usec = int((interval - sec) * 1000000) - self.sock.setsockopt( - socket.SOL_SOCKET, timeout, - pack('ll', sec, usec), - ) - self._setup_transport() - - self._write(AMQP_PROTOCOL_HEADER) - - def _get_tcp_socket_defaults(self, sock): - tcp_opts = {} - for opt in KNOWN_TCP_OPTS: - enum = None - if opt == 'TCP_USER_TIMEOUT': - try: - from socket import TCP_USER_TIMEOUT as enum - except ImportError: - # should be in Python 3.6+ on Linux. - enum = 18 - elif hasattr(socket, opt): - enum = getattr(socket, opt) - - if enum: - if opt in DEFAULT_SOCKET_SETTINGS: - tcp_opts[enum] = DEFAULT_SOCKET_SETTINGS[opt] - elif hasattr(socket, opt): - tcp_opts[enum] = sock.getsockopt( - SOL_TCP, getattr(socket, opt)) - return tcp_opts - - def _set_socket_options(self, socket_settings): - tcp_opts = self._get_tcp_socket_defaults(self.sock) - if socket_settings: - tcp_opts.update(socket_settings) - for opt, val in tcp_opts.items(): - self.sock.setsockopt(SOL_TCP, opt, val) - - def _read(self, n, initial=False): - """Read exactly n bytes from the peer.""" - raise NotImplementedError('Must be overridden in subclass') - - def _setup_transport(self): - """Do any additional initialization of the class.""" - pass - - def _shutdown_transport(self): - """Do any preliminary work in shutting down the connection.""" - pass - - def _write(self, s): - """Completely write a string to the peer.""" - raise NotImplementedError('Must be overridden in subclass') - - def close(self): - if self.sock is not None: - try: - self._shutdown_transport() - except OSError: - pass - - # Call shutdown first to make sure that pending messages - # reach the AMQP broker if the program exits after - # calling this method. - try: - self.sock.shutdown(socket.SHUT_RDWR) - except OSError: - pass - - try: - self.sock.close() - except OSError: - pass - self.sock = None - self.connected = False - - def read_frame(self, unpack=unpack): - """Parse AMQP frame. - - Frame has following format:: - - 0 1 3 7 size+7 size+8 - +------+---------+---------+ +-------------+ +-----------+ - | type | channel | size | | payload | | frame-end | - +------+---------+---------+ +-------------+ +-----------+ - octet short long 'size' octets octet - - """ - read = self._read - read_frame_buffer = EMPTY_BUFFER - try: - frame_header = read(7, True) - read_frame_buffer += frame_header - frame_type, channel, size = unpack('>BHI', frame_header) - # >I is an unsigned int, but the argument to sock.recv is signed, - # so we know the size can be at most 2 * SIGNED_INT_MAX - if size > SIGNED_INT_MAX: - part1 = read(SIGNED_INT_MAX) - - try: - part2 = read(size - SIGNED_INT_MAX) - except (socket.timeout, OSError, SSLError): - # In case this read times out, we need to make sure to not - # lose part1 when we retry the read - read_frame_buffer += part1 - raise - - payload = b''.join([part1, part2]) - else: - payload = read(size) - read_frame_buffer += payload - frame_end = ord(read(1)) - except socket.timeout: - self._read_buffer = read_frame_buffer + self._read_buffer - raise - except (OSError, SSLError) as exc: - if ( - isinstance(exc, socket.error) and os.name == 'nt' - and exc.errno == errno.EWOULDBLOCK # noqa - ): - # On windows we can get a read timeout with a winsock error - # code instead of a proper socket.timeout() error, see - # https://github.com/celery/py-amqp/issues/320 - self._read_buffer = read_frame_buffer + self._read_buffer - raise socket.timeout() - - if isinstance(exc, SSLError) and 'timed out' in str(exc): - # Don't disconnect for ssl read time outs - # http://bugs.python.org/issue10272 - self._read_buffer = read_frame_buffer + self._read_buffer - raise socket.timeout() - - if exc.errno not in _UNAVAIL: - self.connected = False - raise - # frame-end octet must contain '\xce' value - if frame_end == 206: - return frame_type, channel, payload - else: - raise UnexpectedFrame( - f'Received frame_end {frame_end:#04x} while expecting 0xce') - - def write(self, s): - try: - self._write(s) - except socket.timeout: - raise - except OSError as exc: - if exc.errno not in _UNAVAIL: - self.connected = False - raise - - -class SSLTransport(_AbstractTransport): - """Transport that works over SSL. - - PARAMETERS: - host: str - - Broker address in format ``HOSTNAME:PORT``. - - connect_timeout: int - - Timeout of creating new connection. - - ssl: bool|dict - - parameters of TLS subsystem. - - when ``ssl`` is not dictionary, defaults of TLS are used - - otherwise: - - if ``ssl`` dictionary contains ``context`` key, - :attr:`~SSLTransport._wrap_context` is used for wrapping - socket. ``context`` is a dictionary passed to - :attr:`~SSLTransport._wrap_context` as context parameter. - All others items from ``ssl`` argument are passed as - ``sslopts``. - - if ``ssl`` dictionary does not contain ``context`` key, - :attr:`~SSLTransport._wrap_socket_sni` is used for - wrapping socket. All items in ``ssl`` argument are - passed to :attr:`~SSLTransport._wrap_socket_sni` as - parameters. - - kwargs: - - additional arguments of - :class:`~amqp.transport._AbstractTransport` class - """ - - def __init__(self, host, connect_timeout=None, ssl=None, **kwargs): - self.sslopts = ssl if isinstance(ssl, dict) else {} - self._read_buffer = EMPTY_BUFFER - super().__init__( - host, connect_timeout=connect_timeout, **kwargs) - - __slots__ = ( - "sslopts", - ) - - def _setup_transport(self): - """Wrap the socket in an SSL object.""" - self.sock = self._wrap_socket(self.sock, **self.sslopts) - # Explicitly set a timeout here to stop any hangs on handshake. - self.sock.settimeout(self.connect_timeout) - self.sock.do_handshake() - self._quick_recv = self.sock.read - - def _wrap_socket(self, sock, context=None, **sslopts): - if context: - return self._wrap_context(sock, sslopts, **context) - return self._wrap_socket_sni(sock, **sslopts) - - def _wrap_context(self, sock, sslopts, check_hostname=None, **ctx_options): - """Wrap socket without SNI headers. - - PARAMETERS: - sock: socket.socket - - Socket to be wrapped. - - sslopts: dict - - Parameters of :attr:`ssl.SSLContext.wrap_socket`. - - check_hostname - - Whether to match the peer cert’s hostname. See - :attr:`ssl.SSLContext.check_hostname` for details. - - ctx_options - - Parameters of :attr:`ssl.create_default_context`. - """ - ctx = ssl.create_default_context(**ctx_options) - ctx.check_hostname = check_hostname - return ctx.wrap_socket(sock, **sslopts) - - def _wrap_socket_sni(self, sock, keyfile=None, certfile=None, - server_side=False, cert_reqs=None, - ca_certs=None, do_handshake_on_connect=False, - suppress_ragged_eofs=True, server_hostname=None, - ciphers=None, ssl_version=None): - """Socket wrap with SNI headers. - - stdlib :attr:`ssl.SSLContext.wrap_socket` method augmented with support - for setting the server_hostname field required for SNI hostname header. - - PARAMETERS: - sock: socket.socket - - Socket to be wrapped. - - keyfile: str - - Path to the private key - - certfile: str - - Path to the certificate - - server_side: bool - - Identifies whether server-side or client-side - behavior is desired from this socket. See - :attr:`~ssl.SSLContext.wrap_socket` for details. - - cert_reqs: ssl.VerifyMode - - When set to other than :attr:`ssl.CERT_NONE`, peers certificate - is checked. Possible values are :attr:`ssl.CERT_NONE`, - :attr:`ssl.CERT_OPTIONAL` and :attr:`ssl.CERT_REQUIRED`. - - ca_certs: str - - Path to “certification authority” (CA) certificates - used to validate other peers’ certificates when ``cert_reqs`` - is other than :attr:`ssl.CERT_NONE`. - - do_handshake_on_connect: bool - - Specifies whether to do the SSL - handshake automatically. See - :attr:`~ssl.SSLContext.wrap_socket` for details. - - suppress_ragged_eofs (bool): - - See :attr:`~ssl.SSLContext.wrap_socket` for details. - - server_hostname: str - - Specifies the hostname of the service which - we are connecting to. See :attr:`~ssl.SSLContext.wrap_socket` - for details. - - ciphers: str - - Available ciphers for sockets created with this - context. See :attr:`ssl.SSLContext.set_ciphers` - - ssl_version: - - Protocol of the SSL Context. The value is one of - ``ssl.PROTOCOL_*`` constants. - """ - opts = { - 'sock': sock, - 'server_side': server_side, - 'do_handshake_on_connect': do_handshake_on_connect, - 'suppress_ragged_eofs': suppress_ragged_eofs, - 'server_hostname': server_hostname, - } - - if ssl_version is None: - ssl_version = ( - ssl.PROTOCOL_TLS_SERVER - if server_side - else ssl.PROTOCOL_TLS_CLIENT - ) - - context = ssl.SSLContext(ssl_version) - - if certfile is not None: - context.load_cert_chain(certfile, keyfile) - if ca_certs is not None: - context.load_verify_locations(ca_certs) - if ciphers is not None: - context.set_ciphers(ciphers) - # Set SNI headers if supported. - # Must set context.check_hostname before setting context.verify_mode - # to avoid setting context.verify_mode=ssl.CERT_NONE while - # context.check_hostname is still True (the default value in context - # if client-side) which results in the following exception: - # ValueError: Cannot set verify_mode to CERT_NONE when check_hostname - # is enabled. - try: - context.check_hostname = ( - ssl.HAS_SNI and server_hostname is not None - ) - except AttributeError: - pass # ask forgiveness not permission - - # See note above re: ordering for context.check_hostname and - # context.verify_mode assignments. - if cert_reqs is not None: - context.verify_mode = cert_reqs - - if ca_certs is None and context.verify_mode != ssl.CERT_NONE: - purpose = ( - ssl.Purpose.CLIENT_AUTH - if server_side - else ssl.Purpose.SERVER_AUTH - ) - context.load_default_certs(purpose) - - sock = context.wrap_socket(**opts) - return sock - - def _shutdown_transport(self): - """Unwrap a SSL socket, so we can call shutdown().""" - if self.sock is not None: - self.sock = self.sock.unwrap() - - def _read(self, n, initial=False, - _errnos=(errno.ENOENT, errno.EAGAIN, errno.EINTR)): - # According to SSL_read(3), it can at most return 16kb of data. - # Thus, we use an internal read buffer like TCPTransport._read - # to get the exact number of bytes wanted. - recv = self._quick_recv - rbuf = self._read_buffer - try: - while len(rbuf) < n: - try: - s = recv(n - len(rbuf)) # see note above - except OSError as exc: - # ssl.sock.read may cause ENOENT if the - # operation couldn't be performed (Issue celery#1414). - if exc.errno in _errnos: - if initial and self.raise_on_initial_eintr: - raise socket.timeout() - continue - raise - if not s: - raise OSError('Server unexpectedly closed connection') - rbuf += s - except: # noqa - self._read_buffer = rbuf - raise - result, self._read_buffer = rbuf[:n], rbuf[n:] - return result - - def _write(self, s): - """Write a string out to the SSL socket fully.""" - write = self.sock.write - while s: - try: - n = write(s) - except ValueError: - # AG: sock._sslobj might become null in the meantime if the - # remote connection has hung up. - # In python 3.4, a ValueError is raised is self._sslobj is - # None. - n = 0 - if not n: - raise OSError('Socket closed') - s = s[n:] - - -class TCPTransport(_AbstractTransport): - """Transport that deals directly with TCP socket. - - All parameters are :class:`~amqp.transport._AbstractTransport` class. - """ - - def _setup_transport(self): - # Setup to _write() directly to the socket, and - # do our own buffered reads. - self._write = self.sock.sendall - self._read_buffer = EMPTY_BUFFER - self._quick_recv = self.sock.recv - - def _read(self, n, initial=False, _errnos=(errno.EAGAIN, errno.EINTR)): - """Read exactly n bytes from the socket.""" - recv = self._quick_recv - rbuf = self._read_buffer - try: - while len(rbuf) < n: - try: - s = recv(n - len(rbuf)) - except OSError as exc: - if exc.errno in _errnos: - if initial and self.raise_on_initial_eintr: - raise socket.timeout() - continue - raise - if not s: - raise OSError('Server unexpectedly closed connection') - rbuf += s - except: # noqa - self._read_buffer = rbuf - raise - - result, self._read_buffer = rbuf[:n], rbuf[n:] - return result - - -def Transport(host, connect_timeout=None, ssl=False, **kwargs): - """Create transport. - - Given a few parameters from the Connection constructor, - select and create a subclass of - :class:`~amqp.transport._AbstractTransport`. - - PARAMETERS: - - host: str - - Broker address in format ``HOSTNAME:PORT``. - - connect_timeout: int - - Timeout of creating new connection. - - ssl: bool|dict - - If set, :class:`~amqp.transport.SSLTransport` is used - and ``ssl`` parameter is passed to it. Otherwise - :class:`~amqp.transport.TCPTransport` is used. - - kwargs: - - additional arguments of :class:`~amqp.transport._AbstractTransport` - class - """ - transport = SSLTransport if ssl else TCPTransport - return transport(host, connect_timeout=connect_timeout, ssl=ssl, **kwargs) diff --git a/.venv/lib/python3.10/site-packages/amqp/utils.py b/.venv/lib/python3.10/site-packages/amqp/utils.py deleted file mode 100644 index 8ba5f67..0000000 --- a/.venv/lib/python3.10/site-packages/amqp/utils.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Compatibility utilities.""" -import logging -from logging import NullHandler - -# enables celery 3.1.23 to start again -from vine import promise # noqa -from vine.utils import wraps - -try: - import fcntl -except ImportError: # pragma: no cover - fcntl = None # noqa - - -def set_cloexec(fd, cloexec): - """Set flag to close fd after exec.""" - if fcntl is None: - return - try: - FD_CLOEXEC = fcntl.FD_CLOEXEC - except AttributeError: - raise NotImplementedError( - 'close-on-exec flag not supported on this platform', - ) - flags = fcntl.fcntl(fd, fcntl.F_GETFD) - if cloexec: - flags |= FD_CLOEXEC - else: - flags &= ~FD_CLOEXEC - return fcntl.fcntl(fd, fcntl.F_SETFD, flags) - - -def coro(gen): - """Decorator to mark generator as a co-routine.""" - @wraps(gen) - def _boot(*args, **kwargs): - co = gen(*args, **kwargs) - next(co) - return co - - return _boot - - -def str_to_bytes(s): - """Convert str to bytes.""" - if isinstance(s, str): - return s.encode('utf-8', 'surrogatepass') - return s - - -def bytes_to_str(s): - """Convert bytes to str.""" - if isinstance(s, bytes): - return s.decode('utf-8', 'surrogatepass') - return s - - -def get_logger(logger): - """Get logger by name.""" - if isinstance(logger, str): - logger = logging.getLogger(logger) - if not logger.handlers: - logger.addHandler(NullHandler()) - return logger diff --git a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/LICENSE.txt b/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/LICENSE.txt deleted file mode 100644 index b9920ed..0000000 --- a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/LICENSE.txt +++ /dev/null @@ -1,29 +0,0 @@ -Copyright (c) 2006-2008, R Oudkerk and Contributors - -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -3. Neither the name of author nor the names of any contributors may be - used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -SUCH DAMAGE. - diff --git a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/METADATA b/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/METADATA deleted file mode 100644 index 80d9e3c..0000000 --- a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/METADATA +++ /dev/null @@ -1,111 +0,0 @@ -Metadata-Version: 2.1 -Name: billiard -Version: 4.2.0 -Summary: Python multiprocessing fork with improvements and bugfixes -Home-page: https://github.com/celery/billiard -Author: R Oudkerk / Python Software Foundation -Author-email: python-dev@python.org -Maintainer: Asif Saif Uddin -Maintainer-email: auvipy@gmail.com -License: BSD -Keywords: multiprocessing pool process -Platform: UNKNOWN -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python -Classifier: Programming Language :: C -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Operating System :: Microsoft :: Windows -Classifier: Operating System :: POSIX -Classifier: License :: OSI Approved :: BSD License -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: System :: Distributed Computing -Requires-Python: >=3.7 -License-File: LICENSE.txt - -======== -billiard -======== -:version: 4.2.0 - -|build-status-lin| |build-status-win| |license| |wheel| |pyversion| |pyimp| - -.. |build-status-lin| image:: https://github.com/celery/billiard/actions/workflows/ci.yaml/badge.svg - :alt: Build status on Linux - :target: https://github.com/celery/billiard/actions/workflows/ci.yaml - -.. |build-status-win| image:: https://ci.appveyor.com/api/projects/status/github/celery/billiard?png=true&branch=main - :alt: Build status on Windows - :target: https://ci.appveyor.com/project/ask/billiard - -.. |license| image:: https://img.shields.io/pypi/l/billiard.svg - :alt: BSD License - :target: https://opensource.org/licenses/BSD-3-Clause - -.. |wheel| image:: https://img.shields.io/pypi/wheel/billiard.svg - :alt: Billiard can be installed via wheel - :target: https://pypi.org/project/billiard/ - -.. |pyversion| image:: https://img.shields.io/pypi/pyversions/billiard.svg - :alt: Supported Python versions. - :target: https://pypi.org/project/billiard/ - -.. |pyimp| image:: https://img.shields.io/pypi/implementation/billiard.svg - :alt: Support Python implementations. - :target: https://pypi.org/project/billiard/ - -About ------ - -``billiard`` is a fork of the Python 2.7 `multiprocessing `_ -package. The multiprocessing package itself is a renamed and updated version of -R Oudkerk's `pyprocessing `_ package. -This standalone variant draws its fixes/improvements from python-trunk and provides -additional bug fixes and improvements. - -- This package would not be possible if not for the contributions of not only - the current maintainers but all of the contributors to the original pyprocessing - package listed `here `_. - -- Also, it is a fork of the multiprocessing backport package by Christian Heims. - -- It includes the no-execv patch contributed by R. Oudkerk. - -- And the Pool improvements previously located in `Celery`_. - -- Billiard is used in and is a dependency for `Celery`_ and is maintained by the - Celery team. - -.. _`Celery`: http://celeryproject.org - -Documentation -------------- - -The documentation for ``billiard`` is available on `Read the Docs `_. - -Bug reporting -------------- - -Please report bugs related to multiprocessing at the -`Python bug tracker `_. Issues related to billiard -should be reported at https://github.com/celery/billiard/issues. - -billiard is part of the Tidelift Subscription ---------------------------------------------- - -The maintainers of ``billiard`` and thousands of other packages are working -with Tidelift to deliver commercial support and maintenance for the open source -dependencies you use to build your applications. Save time, reduce risk, and -improve code health, while paying the maintainers of the exact dependencies you -use. `Learn more`_. - -.. _`Learn more`: https://tidelift.com/subscription/pkg/pypi-billiard?utm_source=pypi-billiard&utm_medium=referral&utm_campaign=readme&utm_term=repo - - diff --git a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/RECORD b/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/RECORD deleted file mode 100644 index b60acb8..0000000 --- a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/RECORD +++ /dev/null @@ -1,62 +0,0 @@ -billiard-4.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -billiard-4.2.0.dist-info/LICENSE.txt,sha256=ZjLlmsq9u77CYoN9RHJKBlMYlJ8ALv0GAtZCcRrjpFc,1483 -billiard-4.2.0.dist-info/METADATA,sha256=mmlqJWJYihPYLSq3L4df_etK-irJSXaub2Ctm7e6qZY,4419 -billiard-4.2.0.dist-info/RECORD,, -billiard-4.2.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 -billiard-4.2.0.dist-info/top_level.txt,sha256=52Kkdlqn9Np8pbpkTVd_1KZTZLGjupUzhUw8QsW-B-U,9 -billiard/__init__.py,sha256=SnaiO1mX2JDQ9lndkcVb4iQ_DEW4CWymrOcjGhm-GC0,1556 -billiard/__pycache__/__init__.cpython-310.pyc,, -billiard/__pycache__/_ext.cpython-310.pyc,, -billiard/__pycache__/_win.cpython-310.pyc,, -billiard/__pycache__/common.cpython-310.pyc,, -billiard/__pycache__/compat.cpython-310.pyc,, -billiard/__pycache__/connection.cpython-310.pyc,, -billiard/__pycache__/context.cpython-310.pyc,, -billiard/__pycache__/einfo.cpython-310.pyc,, -billiard/__pycache__/exceptions.cpython-310.pyc,, -billiard/__pycache__/forkserver.cpython-310.pyc,, -billiard/__pycache__/heap.cpython-310.pyc,, -billiard/__pycache__/managers.cpython-310.pyc,, -billiard/__pycache__/pool.cpython-310.pyc,, -billiard/__pycache__/popen_fork.cpython-310.pyc,, -billiard/__pycache__/popen_forkserver.cpython-310.pyc,, -billiard/__pycache__/popen_spawn_posix.cpython-310.pyc,, -billiard/__pycache__/popen_spawn_win32.cpython-310.pyc,, -billiard/__pycache__/process.cpython-310.pyc,, -billiard/__pycache__/queues.cpython-310.pyc,, -billiard/__pycache__/reduction.cpython-310.pyc,, -billiard/__pycache__/resource_sharer.cpython-310.pyc,, -billiard/__pycache__/semaphore_tracker.cpython-310.pyc,, -billiard/__pycache__/sharedctypes.cpython-310.pyc,, -billiard/__pycache__/spawn.cpython-310.pyc,, -billiard/__pycache__/synchronize.cpython-310.pyc,, -billiard/__pycache__/util.cpython-310.pyc,, -billiard/_ext.py,sha256=ybsKrDCncAVFL8ml4nMNKbvb2no5sap3qHc6_cwUxqE,872 -billiard/_win.py,sha256=vILzfaBKGhhNjePPfRTdRrVoIygnXyUGtJ4FmBFU4Gw,2919 -billiard/common.py,sha256=zwZfEFio46uJPyyT5sf7Fy8HLLkJdf_WW2CKMo7gpeI,4154 -billiard/compat.py,sha256=Q30pRcJmFdwHDNuJJsB8xmXJfuv_RGT8zuY0PHGB9L0,8148 -billiard/connection.py,sha256=DdrB0iAM0zZtjKmr51hv9t4YjsWHafZ5FCbOKs8mkIw,32647 -billiard/context.py,sha256=QfLpnJwJblvUP_BPRDrbBx9DgKBvH5ZHDDkYr2anw1E,13154 -billiard/dummy/__init__.py,sha256=MGuxw6dYyU-TokOw2mEizwefj-FxjDwq5tEshuSJ5ng,4633 -billiard/dummy/__pycache__/__init__.cpython-310.pyc,, -billiard/dummy/__pycache__/connection.cpython-310.pyc,, -billiard/dummy/connection.py,sha256=UYjJH4smDsj7X0W4uJxvg97z2TxILDL2x5GER4vv4Mw,2907 -billiard/einfo.py,sha256=UeytGoRdbPZFuNojB-1goYMsuOEKF2GIxQkc6UkjriM,5064 -billiard/exceptions.py,sha256=xymsevvXvB5SO-ebmaHBqQPEJfl6EqThM1PlLtGFk3U,1272 -billiard/forkserver.py,sha256=SPfs8T2uaPtfK_F1ADVNNPZGSUrjeadTf5h6gwKOiPc,8282 -billiard/heap.py,sha256=YQoNKIELwpQhq7U7XTRKAD5-JVGKgye08O8vbQRdATw,9154 -billiard/managers.py,sha256=yxeuqrtauo173KJy6SuK3EAfRmSWejBqEi-oJ57ZokI,36757 -billiard/pool.py,sha256=ESHfpJOSxqxAHib3SUAy3EnprjcJl3tNPsE4s85RIDc,68795 -billiard/popen_fork.py,sha256=Kt3n8oEE3J8qb9N28orS7o28Y5bZmBbVe9uU37y-GxQ,2552 -billiard/popen_forkserver.py,sha256=BLLO5B0P9GQj3i2r-16ulKcRMLy3HYNvw8I129ZcNas,1770 -billiard/popen_spawn_posix.py,sha256=cnRYqmztgDv2pURFQl1PzgOzR1ThxuUJeG3ksCy7SCQ,1922 -billiard/popen_spawn_win32.py,sha256=1FH4HYC9ilmkzSEfGqyf6g39qv-zc6cPuM8Z56H51ww,3543 -billiard/process.py,sha256=FQliOzUtgKWcNG-Yd9lcS9ypv8BtkcH6IM9isfOjVRc,11055 -billiard/queues.py,sha256=b8Ykkvg9B3c5jhXzImcERxCc-bLfDBtFO8u3Y480l08,12739 -billiard/reduction.py,sha256=pVr81gei43nJNhfdSuTDevwmZsiY3LXFTZ-G_uGN5Ts,9382 -billiard/resource_sharer.py,sha256=AKGDzC6ScuX8GdPk9RFEH8MP578_yiJ5Hvy6KTwSIfI,5299 -billiard/semaphore_tracker.py,sha256=72OU2cxJzc3vDamj1oVI5HL8sWRsRfMCWBxQKUP1c2Y,4846 -billiard/sharedctypes.py,sha256=6w59LGEa5PAcufoC4DUUq6TjtyR7cqZz9xmBc9GrLZg,6665 -billiard/spawn.py,sha256=JNdBCCGkQx4wVeTgyiZWMMV-3goL_qJBwtdkkpF5uZ8,11740 -billiard/synchronize.py,sha256=hmQisAgIePaxIpYR2_4D7Nfa9-EurXpeViT5nyKue0I,12962 -billiard/util.py,sha256=oMkyLqonT1IvdmpM_RBUnLDUeK5h5_DeCH9IY7FoGu0,6088 diff --git a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/WHEEL deleted file mode 100644 index becc9a6..0000000 --- a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.37.1) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/top_level.txt b/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/top_level.txt deleted file mode 100644 index 7ac9b31..0000000 --- a/.venv/lib/python3.10/site-packages/billiard-4.2.0.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -billiard diff --git a/.venv/lib/python3.10/site-packages/billiard/__init__.py b/.venv/lib/python3.10/site-packages/billiard/__init__.py deleted file mode 100644 index c876b7e..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -"""Python multiprocessing fork with improvements and bugfixes""" -# -# Package analogous to 'threading.py' but using processes -# -# multiprocessing/__init__.py -# -# This package is intended to duplicate the functionality (and much of -# the API) of threading.py but uses processes instead of threads. A -# subpackage 'multiprocessing.dummy' has the same API but is a simple -# wrapper for 'threading'. -# -# Try calling `multiprocessing.doc.main()` to read the html -# documentation in a webbrowser. -# -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - - -import sys -from . import context - -VERSION = (4, 2, 0) -__version__ = '.'.join(map(str, VERSION[0:4])) + "".join(VERSION[4:]) -__author__ = 'R Oudkerk / Python Software Foundation' -__author_email__ = 'python-dev@python.org' -__maintainer__ = 'Asif Saif Uddin' -__contact__ = "auvipy@gmail.com" -__homepage__ = "https://github.com/celery/billiard" -__docformat__ = "restructuredtext" - -# -eof meta- - -# -# Copy stuff from default context -# - -globals().update((name, getattr(context._default_context, name)) - for name in context._default_context.__all__) -__all__ = context._default_context.__all__ - -# -# XXX These should not really be documented or public. -# - -SUBDEBUG = 5 -SUBWARNING = 25 - -# -# Alias for main module -- will be reset by bootstrapping child processes -# - -if '__main__' in sys.modules: - sys.modules['__mp_main__'] = sys.modules['__main__'] - - -def ensure_multiprocessing(): - from ._ext import ensure_multiprocessing - return ensure_multiprocessing() diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index ad5b3c93f02d605375aff2294ea1239a64dd7368..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1183 zcmZ8hO>f&q5Zxtdk(MP}u_e2{5k0h3fru%3GmOCbMlMQg!6`tXU{{=#OqpNZUCNf= z01cG8#|qL6_Lanc3OpyvHGnX0uLkbpHHp)UFZow{gB4E;=VT z+a8fI?Lz@!V2py<>*x)tpatAZq_tqg#!AWK_hHHGi<_kxXpJKv&p$R99-Gk_$Yw^%hz z%Gt>{V@cYJi){Y&xl*M(3W70~UJXqwh{+a!r2SdPA?NB8pC|Yr3#T)@wq^?-mdgk@mZ`cE?;XrG&6?i*7~0M+_y6 zKC5DBtM@=VIm`G*BAS@=Pd_*>G9F}H#Iqphmonu_aS`;UJf8+>G7Q$-f9(D6AdrdT z_e&OEurZf+T!JV{@Dv zSsq1t3$60jF_iCy(Zp!+1gG3ZShY3D=o@5yO%{f^-4`b1Bh~vnmndiSzc%Vx+KEtM z(ZMv)Hejf)VcS?{;RvTREz+Phx{7oUv>QcG#8{y%XHuAtY%Q((`q}B=<*UASCPk8K zJ7XoLC}EgPxscdDxTzjRtir|?Xt(ZcZu$fx+iUs?CEz9lx0?6FVpLK$qR70L5`{*u zxhey{hK!j-cbpbOmP%c#N^Djx%)i0Z%2IQ%H#mFz^x5OH7rKttFON?9FZ(aFn-x%{ xT&`94Pk@zWRM6h>I_05JU4Dn)5U<^!j`cltzPK7*je4Iv%c(iEUTe{Y{V#h@Kz{%L diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/_ext.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/_ext.cpython-310.pyc deleted file mode 100644 index 28b04f853502a95fe579665f412148ca216ffb4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 979 zcmZ8fOK;RL5VpP9-R!GCX?s9I$_1oFWmD*(7le=yNFcPAR;rrIlE%}nw}}&MXG2!v z0{jQAaHD@IS5Ey4NKnRUS1q;W@ngpG_`XR8gD%0b{`39Ov_Z%(d$~Sbyu84rXDB$~ zG$sMzETFu>otPz!z@Y@ltogmgn?I;p=QL=`jYX@rZ3pdrB5yea-0~46cGmBmpv_wW zJs^@6gtxi-l>}Yh;a%K&obHlg?+oLS@!lE5ZAh#3q!2R9MCHuFdH6cA+UtYi%9zEIe zwJ`8F3!{_p7_`3(;!ohC8D(X)0aE7*CO7iCV+(4baH&h3bJfA)f0bKsdbsM!$9PzD zIOQxR3H^jv?;{So#36>24=>PPbZdQMsXw@~cyM817;jk23Q~}vGgdalDdN8i$-6W< zS$x}@3hiZaXpT~qcrn(bz0f<#Wn@GuEvg!lNt%K5#1g;Isy00{1qJvGHoJKA6nw~q z0`BQjMpK2K7qy|6DUk>x=AbWT57hIaW=aez!O^M;BD{hY>kGFYGSI&!cp~* zIpnk^t-5^^R%KiMib-XAyjr=W;IhsQeABBa7+s}(%IF$Om$GyAN3G!VuwONFsjItM0WrIrmwT e@;rv;mJNLmg-aaP$JwHc_3P9yxxa3+-~0!;aQ5*4 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/_win.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/_win.cpython-310.pyc deleted file mode 100644 index d752970c3398eac1c6605ee8d8762704bd6ab5c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2790 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 XQqTY8j(bia=ViRCH{kK1>}cWttJ?*S diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/compat.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/compat.cpython-310.pyc deleted file mode 100644 index f09214a23e155724149e22761db16fcd31df6a6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7626 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 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/einfo.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/einfo.cpython-310.pyc deleted file mode 100644 index b68256c3daef526373f2fd88400557583abcef6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6078 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 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/forkserver.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/forkserver.cpython-310.pyc deleted file mode 100644 index ea4dd2d1d868359e4156ec8b00b8c0336f0548eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6919 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 JEsn3<{}9sI$!l`+ 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 sh0Q~jndTl={yX0)0O_^|oB#j- diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/pool.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/pool.cpython-310.pyc deleted file mode 100644 index 8e4f2d8649cd99e01cff33132d3df0cc8aa3b701..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55484 zcmbrn34C1FecwC#hQUGrTt!Kvg%Uwg)V@(0DT%<|RJ3+`;oZE+i&i$GJDM}& zWASD>sGM7_5Xml0y4uX-+&gjJj3t`+sio!e)Z+3&t=V_FQX{%htGrqxWoo%LGdGrQ z_MJF|CWhw>TM8oBgg*C5P(F>4nKT ze_Nw4OI#UCHuK8A;@rYwGdo|IFS}~B*;lPB1m(r)X}+Y){==_MRhDWqiwj2=rWbio ze0+I+e&u<$I8~`u$Fj}bp+&cNytcU19645@7Or;0RnFB-!n~yI}*G|mLSDu-f zpQ*JT7fw{%{LI2+jU=1azb@+0;&SblA znHrBvlhd_|<4$$fJ$&K{%$-# zOFmM5?&+DmK*aC=jW6i$?>{;v@QD7DgAnc^uIfVs^>iaP8(WQgbWn@0fD8>C@XVuw z21s~0=62Q+wOAvzmb?_ZkT@P|0F-aX$H!7`kX)Jr2WvGqb85L(v7UF<(9HDATxDSq z&@2Fp3zaEBLo>tR&Ad{1JLYcZ%Wpn)+nL4r%5C!%H??xxLgjpQu2Q2@Z`=1uW#N_E z=4MXawzN_^v$$~AzB_KetvXYy+`2S5b$0S}rFz>bI%;Op1-C6NF3#;+T4@fI1(zLg z_^O&YM39IV;>CC_p17P#48&7$cP9_KdPcpZT3gQ)iPU1Xcq8`N*aceZZs7s#NX^Yu zYt7{R^=C&_`ofp``4q3Js?N5! zdyt>5>ZsW&;5n{piJ%r+i(iV(QlZoFM*NHMW3ic7Bk?2g&&F9NVo`S_U6!=Xg8F=J z@$~76Yo@^oi;kI;oUfjC_v&@#EOTgGKe>l__Zcp$R4H!vQ>tL}r+8~TuHmK;R%COXB{^{46{;Hm}$m6)g(D3>@?OCm_J0;MWxcWp2nWP&W~ zSSH8?d7fs2LeR%=E+_{5{N{u7@ffKF!c>D{s-ZB|rgo~ak>W z7G0(O@m91{J2P1;O`WMsovr%#4JB8Zt4vlarI~8!p@&O1lqRRnEzf}P_ZCY0F^5Z_ zeX^;RW~O-^Ca;zrdARh-|ayw3RDM}&Gj7{w0)mXXyuGgX+)ww z#r5eSuId&7L3sm2b}11jY{be?nIUYyoop7$txjy_%2wTS**(d3ZztW;{4~>H)nBQ& zQ;XF~PnDf!(+_f4eT(3q`p%8&8)dz&Q(I{I7?}u3e{LuBROiNn_dYMwW_Qfi zSwqk9*hyw-ivJ5q-|=_Es@I=qvgrTCa4_5xWIL8>rbQXZt?sjwM%4uj_IJWxc6eI`Cd1e*NY8RU5TD{Hm+*opa^gJ!GZEtI;%gq?TAqHe$kQ?Wa{38<0T+maMj| z`nz$ycOO--(J-Z_nB?xKdHt?OTZQ=O<@)xGYHBIhO_emC+EnrDlbnba$OifuG}fIAsg*uHNVbg{s=6cCWJFd=93nXZX7T{R+SUnBQ=P!G|2zL*<&o&rYtKsvKUJS`=Ym6l(p$CmobpX=$-qojEmEDJ?H}4ro$0M#fb4 zma2;^nw6E()Z{|xRK?cE>g04~Zlwf~S>v5sTt0n9X-GPCwo==-ZXT(3RsX8yI}~*M zf|i;%F(^DOI<@45*jh?hfGeTJs6F4)&6KMwxn>d;!+nShn(6BD61CIf0zIg8$emT7 zmn@!nfO~GTT4jXVJ+H*S!({|a0g&AiuV1ykOZHuHDQYd7qvR5(p47I+f^#80o!A0) z8cU4Va}VvR?l0}CK0>_~Naq5AX0lpy8zLy6O-(D8|24^sQXaiht$eyGPJ-%Ct5)j8 zc8$htq%~B=oI%kn&(-#qZr>j76$#?uN;E6`xLB?XS4*&hzrR0T#b95frbc_p!lGehiOa`^?9iBnAG z(nCq7=j*15u)_f*R;P4Ml>nv}`V8uN_z=Yoz=4Dp#(L_9WyXN?o)$lzK>;r$gF26I^T5c^qneAQ&V?E*J_n@tdy{Dt$qGItj%-LJq}X zG}z4Z{$NY6mEVD2Td*N}oNG_#8fWyw>T{R}6fkXk4w zAp3L86tWz`>I(6J^I&X}hGM1W5Fd)yTk%3K${&@;%Znk(wZ-z{saf(G>-T8#4eIW` zOTniUtSWd-!FLceb3*7$i8(i2H-;%)gNPNh?1(cPlMvW*NSd<>`RO8YDr7#`2gR6>(tru(sE5pm3^PfhH zM(C$lnEVvow-JD?TbM*29#WR~5~y3%om?71CflqQdkrAdb5=vAp<)8gYKZ!#`=-Iv zzKe@~A?@zx9>{gyNg*2o?MCYul%1;t%TrKxXhHmvl8O)UUyNtot8WUM*-q8fIKgTk zmyl`o>jX6#_9pbo>G+%RAouCmr&)aiD6%*5qT_3#bKq(&#a3y$U{!SeTH628e8eJe z!SB?csP}nhobIq^;)0M!-jIsbax2H;vDGB0w$}0iUDrqk(0Fg9EU!W%aWNibk(wpN znVf{Z4M_c3a$%GIJ&!`;q)Kh23}Q+tjCQ5x>r2ftRUbVQu6FEu@ z(c)$XAJHO=E`)e3Ih$f>O}hK*TS<{#%ha-ZH_g95w3b`T2NpXSs}C&n(<^r;W{6u~|T9f8^lNXI?mV*o{#?Kbe1+STnaYH(8_4=WXF)ut9g} z#}6Mo@g!?7(o5KZxe8SDkLa_%Nf34Pntd%8F&Jz2wspBtY(GhoJ?dx?Uh3Qe=&q1R z#7BwmNDOpzYdDHmq~_jLAFFYOwhZV)k%}Meo|W^*Nxh$vjbH=0j)p+q1y)xq%qB-` z8S*nM#P1nT;@dMH*t{B8f`gcJ6;PizfQKpC{UUX!Zw?FYe%}Q>SCg*5Whn0e3w9&9 zl=kxR)#Syvmekc0zp2$UVR|(~m|4vdW|y`G@zor$+-jaMzgi$HycrA8q-4UmRcOc6 zV*MKpG}n-I_cXHZPa(dt2!#H$QMeFW?QitEZ#4QpmRKEF9c&EL`pzb*j~k&k__6fr z(CVhu;nk7V(MGCPYz#Fv!BkSiMrJxa4SN{}8@ZPu0EaHbS2s5{S6@DNOT8Z?nr{p@ zMv&=`N~SL+ZgmUjb^vtSzw!x534!8tZQw#oZ@e0)UZjjcD`QI|J)QFT^VI|P)vtl1 z(T~?}tqrYhx)l3Za&;U3+v``?h8tTOTY}7X)JCg2Y6INwXl$Q`oLIdo$}vbcu9}8u zZRh&h_Jzc2+l9Ifp>KU{>jJv|Repug8^s`VUu?D5$cgZE->8kyQ#%_wxr@7hRT~Ym zYP;R@wz0F3vs9aFTh_MfPRbQ#@3xcR?Ah()meVqXQfu8PFe33F-zZ*?j5z!GxEr$3 zNf67{wt+i#^yX2!s`p7}87w3PPeymGCK9%ZBeK=x<3xapcpd^RNK*5W8ukiWUm(hC zIYs1=)&h7D1`6DjaC;gFAOuKkBx@;Hg6o3}tx49>K+A4HOMoDR+!FL!{9JM@*P&K= z$JBtkue?q3Sn1%Qr%NY}K707N7f$RiK}PLoNtq4^N#rh3y(1^aGKS(k zE&UdcJk^&P=i6qI0CjV6menLa(@dh*ZKlODluakZGT2`}KRHv=a#Duc^NT|ZH8qQ! zFP{;Px`q-`aWUN~7J$sIKPBe5_b9O@GBwKw*GflP%>U;Y^O)WKdSC9PUB08 ziQ{yiS0GNqGZcTHSVuGIWA__+lsa+n_|xvoO7{~AhV(Ff?C`hgRgFj28BKVw(>;kZ`0CKndZdmR3OO>zH7^-v4kKUDB53VxNKnHD=(1{7%F zFY7^adU?U1z&)zlEESlZVS)R5+!ej8(F8=spX3V4QLr{-d1Nl95(9mszf;(ii4VsIvZ-(G%(MuQ2==-bFD)HfAP;d> zpCW*ih*i^K{%g?37vhh{UfOIVh}eTThBw=5seoxMqyr*OlFmpE5f|t3wOo)A`ZD1` zy6%u<)t21?>OHrNQg6Bhp$G{3@%3^_7%wl}IaR4FpwOGDpnwlbh)ztTS>i8(gVOn# z+L@V!(j>_wAhX#qIWMb{(&BVUL`UgJeUAsDpj}Sudv6lKlyDVT@k;eX{UK~pu$@5O zUGkrG*YJGBRocZbxtT>*VmgLXY%FigcQfrK7fx52V^6$r@Yuoe6Ne9%pFMp1_`xR* zmk&KRe*A@JpFeT*x$*L`!zYftSbpZ{vqw*Ofu4Za{j7qYBWUjZc0NB!_QyVa@EMy| zk&snjO(kg4N)LJA{yDGS5&#Yp$)u3aiI4(V1dORfy>!x0&Auzny{@Hzj9Ln^>i2LX zs|%_8E+m|I^l%Aa`O`quht zgGIOz+*~sW*V(R``%h%^%NjzFLpi2Vs#|HuE1Mox z=5B84(10p8NW4WSob({eG+7yG0WApheC+Mi_zCx4_`vl8!T+=J)t z0$gRM5i=kXMRgIIB7v+di#!4{&b% zn)9A!J2FW5CN>pDgZ!@G;wC;U7=@JpJ*Sv#smsGy=}FK7-Sv9nTe-BS_3O8F!OS|)Y$K~M zf9m-SRs1^%nwgm@(&U=eJX+TOo8Ep?fdTBFC}v3D4~hMjYL_EYfYKXIq=xI)d~o^j zb{@-(kB^@?LHrgz9vkUZqL~WtO%?S81wWJEj%*WH*#p-vq6q$8PsDkYm>svo3-Ua#aZ6;@&zDz zQ?nqszbb`RhK%dS|ae$VH3F_sw*d@g9ckEj#$8!7-LB{k=8V<&E&Bc#<6FT z+_i!Y!}&?ZUeZeViA*qwneM{dq5Aw@eIs6^qaO_fRQeybK|pK;MqDH9I=7WNq-yfB zg-Z}{Au@@-2Eq`!UL|%u4hrg9c|Oc<>lO0LtQ8|ErAbqI@-Tv~zS)lhGUL*eo2;Ix z1TFcovHWBG&D5zyCcBWP=Q~?Cfwf#l%N^XWW{qc9|CVAup+NGZB zm-@TJOBw8XhAeY=0J<&rdUUr?WEgM?y z5&|;;mq%Mk>y2h=7E1w_qwdkzJ-)uW?lGR_)g2mm%@epFl%E~dRAbilh^nS)y{ic$ zhNf)L?JK~J2JKfkI)3oPVRxAX8`1n2{6+=~gXCuPEVFd9qvTeCD;DqiXkJuk`p`4a z9lvsc?%z_AVTy7CeAG4Sp4ZX1j`eMb^D`<&kYoL6o#v#5vpii@O*9CwzyQt=kznz^ zk*qpI1lx)P7E}GXR3VwmU%`qDY^K1*X($7k7QHf4 zU3BZ}f1;1p!;EO+#W_EPgg+y~kZo1#rjXumBja!i!G(;pYp^kH)ua}L z31+IlM}TD1lWUmIdmIOFCs*V3C&iDgCJ>}B*=N(ENKh|8zLit8OaKXHA{Xgmv$dQ^ zHPWTN_w}v!aXy8&Zl!DChwBOh9&ZF;W&X_RM?IBj*((^$iK%z&A;vof_wTyo9AoWS~YesbMh0Cq|L>OiJ_F!vn$VGIWN4p2{+MCKq~w=dkwn|y1oAq)#r z-^G?1azztY$H1kL+b)9uc3RZ>B&YD=u7y0`6;~#Gj$Z5aBITfOO1pEEU?np;*&w?W zn$2o4cv3aH&r1Ap|79cN-oPX)EET>q=S#-;D*g&Ie@FS`(^&_~`LSC68YKzube2Rt z2Eh^80EUn^7-n6fTtNmr$2*t#tKTfpK+J3QaHVPO36X&+4B9?FIZM|)T!JdDU)7e! zqE9x}MQL%Nrd!)%6K%bbj{q;l@-sBW_8s-kTww5yJ$oQI}-aQ{;IU|1Gxgrg1%MI0lA2mDb~Oi~g^>@T&Gm{YG_ zDDup!4tRPw1%sN(dg}zqe7BK$2kEupjCbG6<%)^=&mKnnGL4+AKHg zr%rua4X(!qKfVT$WV{d?i|k2~Ns~eOhY5r3&mp5&=m#WIVm0*7x8d~A24C*H20`GH z9bw8K5ByqG?a5j&63Q4#=g**u=q;;SAMMIITEo&F zZwcjj1s!NSyTg}KgC71szL8wLr_B%fZ*TgaP2Ui zWez{iyk&-ZIbRo?=`&q->GPWiz7t4$X@C_)t7>8vnLG3=u?Eub4>Q%zfdnE$oF5`R zTiFu(Zuh#^l={W#sh=Gp&zkv%PFEHxuP(Vq{wj5ScYtS!*HgyCp=Xb$-ml-$+s?3i z%coY#7>u>0ZmpcK6&}afJVm}Whg*c0v(Ej6R>@WeD}FGdLBrfWuSy6~O?!4Zkxac; zzvhE0(8a9?fb{txuIj4nhQD7NK`kevmobfi>BEk=8@r|+ySuo zqNM}NtUQR21>sD65E(AmvzD99V;FY(CrM*MmDFpY9DS9Tj8r7Cy;fl7m8O1AxU848 zy`A;hA!<2+XjtGKi>^WG;@e~x3Fm`E%t0kd2_6klJ73w*$^9C7#3%P{eO ztRAv~*+LB2cFoUtca6p=RhCtQNEN4XbN4HFKyQj=^u#hdkytEZmNXphA*C@3H0%BD zAyBoVB7QU)0?{7uNUT(%EfSZ9GQ}h&2&`Be4MArXT|+>2Z5rb%-1vDhYcr#Mo$Wq^ zWkw@JC=(*yYcOD&p&t@!3=R7eEk!Leo4v%-1qNj;Cqfi@L&S4_<#s<{3{C;E8FRPU zK1qq+io5+b)R4P8^=01F&QbYN=EubZE52cwrl)f%yRdYj-?ET_KMj@#)6wZ5t7Hl$o`TqiM!xdEHL(B0dc-ni>Hr1^UVLBTIlJ+#yp3z~JJ*7g*ez_Au#g zttD(RmLen9fQ-HXiH%)nOi~?)>U&ryva7j9Znm(RC+u4-G-Nyxa|as<;0M`L1l-dn9w)3EmE0nW z`jDsfoNa;iWjK<=#fRTnx32VLzHVGwyzBFn2ne&JYXzyZk4RbtCQ^14Mb{d}^akvO zaJ@*c;L5XuP~PeN6tBAeg!A=R{V+kqk+NrV*f6)O z=<}#E{O0dexPLPpj2J&EFDs+QkxCKmInrFP+4gS6C)%p$EzSO8wm0BOFFqTe>a#L^ zptuH@PK;GQPVm8!TibRSZn(5T&6@g=RRkc&+vZDF5#nsj^z#2&KeFDoL@zOZ1PPi+ zG`>!09_{^CV$BgL<7`I__Bf%81wUZRHFgD^by^_}V4A}%qYDgtz40>caO4HXFbgOi zk6#e%(65+lV8YSd#GS>W&6Ifk@&-WR4xkQxxvxXy(p^FKvc`W>fmKGB!UYN{3O3-T z`vjRLl1X|r)f>vgNPSD!=(HJaGHv}St`R!KRUIO*DF_81wk|{@C$RPshQMfXc$&?s z)idQuWCP(=)GLZ=t|nj8EDj~=*L7D#T#wuZb*O2((4*KKwtv6qbYv<8LMi z6K^I7lW)pu2~#337FabKrcWn6otj2}CE8>aU6fP~$k18rk(9#;HIg&QRP4?4#Z)=_ zX)F%S^dblClj2FvTFj<3RUrCPJkK@4Rozb@Lp|^kHcky33Q8ZWJ;9CCCAiEMhVnK} zEljP9!B67ia32#t1{=hR<-lSwv&@A1G*0K2Nzm-?S|z=NW5RarMu_5ptDVW_#CDptU*~ZNson`t=Xb{*{LT3*}jX2Uwo4< z(BOK;cf)Fm<*5KW6I;O%iC><4qc0|Bz(zg>??ZHoXLdiTn7CV3 z)z&b&zpkg>O<;oj`DUS=jhSb|;u>vcQ{ATj)B2)4u(=4m+@_)3%S+8`ztV~g$Rs6Q z(CRc4-+5UgS*ZZULKu^9>$f}fhQhk|UQIlavPLgIMWmkh)zeNV2`ZDdGe^`vL!?mayW}n3b{|+iT}ViM(3$`banq183;|+256H{sTtYVD9Uz6w zPXAssLvH}6E$eT5eO&v(!dbZ41#J$JX1Z39=a15EZT5J0S9Of(ZO|vmi?-h&(33F@ zgo|hu(C>iVA&xb5Rp>^~ld^_VNy-jX+5CSA^V#QheDf8$XoMJy37x%s}5VQG1+Jq1UMm5+Oya z+dyJCm)ly*6)qQ3g-rdb4`_`Mzg-|Ld?t{d;;Q}>fmkVYts*YrUh@!|k_Vg7DqJww zYzqMH(Ksa5Y6c+B*%p(G30lxJn;B~6wT$hqliu}y@?y6u`^WCk{xR86h?|wXT}~$4 z^9?k&@WF?9W6GrP4cco{NyURS;?d_cxfa4{W9(gSEaRQPeY50@;%ZUzQVwB!*0yJ@ z@9jykfll*b$uG=8sD4#X>Q05EDJ)T={8u{5kKenB{SO5u-ZMVI_`M>-1@5y!d|dC_ z-~6#|1#SL8*Fxo5#N>axJZr2rTXri;zXnbZI{4*5E!-q8*tQzt?PCH|m( z^|4NRbYDwI?(?1^@7ABXeMMwGa-^N7C)#E_kG;uYEpoFpY55AyWNfK1^Nrj zgOuJdPhqu>e%=A*Db(<3vGNp{hsjkh){59uTn+T<9A11Zo zmvcMdpZaWUvshPvUqsha!Y!20zw+H4aJ6TdJ=6K>Qlo!0zp$f0d>cY#cF{J-$@T>^ z+S`cdYJ;_*=sjuj7pS-JA@5n-J6l=3uC@uc6O!G1nJ;}UMry-B(d<=Q9g5c5TZA7~26@UeyC*1ME@xBgV(Q!r0Vr>H#Nn z%PG~ov}%(QC7Z_@R?}R>!kp$~{zebfuj~0ZRHg4XwMS5b1+3rOon*i5%L}>64nI(P z?GrvIu`h5}wdzek-lCZL^|ql;RWd)Lq%kWJ$<4LhPy52$u$ppTcTth(W6ruTz@mh;79+ocyw02pxEg-ooCl2e;Ss?GA!wa`IFa*R;X!@SDn9JW%hH)?9y6Q+k${5j_z7 zO0lEWAX+Q9W35P~JUyIa4UxA^Rt+u``4Y{>F;sa!^?Kq@2mY{dH7Fvb&4=0(oqAom zJMd`|BZtd%_KC{-K`7zaw*mWm3l)MvHUPYnTD~1Was@+HGdK`o<8hcteSl$HoGGYw zx7xUVBZbPm&8z7`dTdHa4ZNQl#*p>?!d1EaaM9`g6tBAeirgLGsxE--Bl%BYUUlVB zcOqTE|9=JF{}ufHSMd2?DNGddDg1gR^JxneOK@fEUw6cV^Tsd7C;CFm1?F`i%Z2_> zPK2K?vs@SqHU+~xA3~-y%I_xRM_c$E4z>o{_#MH|{SJOd@o&GA-_60*!8QDD!Dm>B z->t!`!F9p)Y=zhs+z{NzlkLH-;3j@|1UCn}`MoL_3-<84Gq@$#%kR~}t-(HiuL*7o zZs+&f;Ev!b2k#!E?d$+}+0W4+Y1F-5xZ8`*&kiF8lFqkUg2Dpk$R=cFx zw?4NbtjJz>b9&C^?8Oqy5r%IIwdy|0?S$VdURV6jnSo) zSM6XaI*jBHN`EaW`lObU!l#^OI|J_BFintSH`$NoO$u2si_*RZUTtvjB}>zOvosxO zum!L@*vKy3#u^waZ!&r0u(^sGG3RfitcLKeEG}Dz zM@`XifOH2e-N6Rmxm~*VwWvLY#49#?h)cD8oGYsJ9mMbD($}K-9w5KNmtxZe;mNmD zw@{CmK;|e79*z{2a4d&)b=65Gje)$(5$y@8aiddA zA?OuO#vXozHLI!3yx!j-J1D$|!_9ichE^R2(c$>87&$&ShlzQ+GmnWw<(?Md+WooX zC(0+EJNES9W38R>BkZTIMfO3VLd+a;MK)Q>OHEnxM7QQ*aexP5S~b#y{n0(HZSg(Y z%zDa;BLyTv1C=%V>FUMvC7Z>rii=#R5UH9sVLp!(BqI2lTgp?UN4yltFnuYuBcM4LJq-m@UR^FrN%wvFI4||M zhlhTHjYxv!2~nggxHE`)CwkXRJ%f;yf}=hUGcV6`UdF4t9L4XSIQ^I8u^LhdHv zX1*F7Y~X%W55Hf*cj-+hplgDgHyNFI<6ftI?yoE1ql#@rhfACJFGY<0G?C)4_wf?Z z;q71ZBLlS^{U^{0LuGT0Nanp_MwB`pVNzQXqmo}}+dh}JxcKyP9)PZuZ=k^m{eR|L zsWkZ}@PJKT(EIP_@E^)AlscPX?ArqI3`SpUl~E4770sXcRw7;evwFX%l8x11v0D{R0PcfsM+>Fs|1H|pqEjKTos39JsnkII9?yN zN}ROa@KIIBp!KJ!NX%gbl=NKI2dWBEFD@AgNdl%NP)l9Q3FkDfE4VMrP-(eFvnrbo z1x85RiF;eY_mic&NDMN@?b`!RhYF2>^s6FL6~&*%VEP-_$He0k$@ zQocmOahh(n2{NGa8x2z5N~Ht~8DwSF85<&lb;>_7v+?QKff@DFW!N4s=viR}VpW=c?1Bn(ahT|{|f$cRYN%!-lbU&fsiwd6No8E%|E-xlj@IN3@ z-)RM30ZFZ^gLEHO2cf;Xkz*njTcY2pHX)hd;OAP zx0BWf#!vq&&!*HTwvAw$^~nau?6&8IZVJC>HD7u1*s4=(>x`?InSAj5lGwRkuH+7gk5>5t)R| zswQ_3so&gPlPj95J4rjhg(k>GCLDs{FSPQuQmlZxc{`&5?ok1@&A2U`_XTt{fK=@% zAf`^E%mpXZo&X6y0Svcn0A9^uDQcts^xeIvI{atyt8cYNu20d`(V798fHn($C#;6U zAZ3}4BcimCLDi}{s*s(ysCiMNWE z*wV+{z#2@Z*eG%sk|CtNpH5yv%-YD#Zdw~gK#;nWXk^Qqunf+YM_>uF<MFn68vfMQAOJi6!${PcS7)-vNAPWW}>#Mll`NxY#K z>BBOUa{t8QAJ!>H?pKJLQw;Z46hpuqb8jkmOMy`)P>WqI$=zr4N+_(Ek?%V8nf+tk zq-2gO${KcPs^aJlO7zzFS$*-t3f5FsR^7vLSKY1xrF&l(G>9 z*>D{njUab=ZW)6c55M0n`29t4@y?6)ZIq^~RB>~HVqt^o9CZj#Sp+iwLg@o!7##bZ zG_dg7wYy_!RA*}d*SPUT-z}JCi|sZXW6q{g2;2<(XhUgQ(0Fd3!J%*xpdgNqSMS6( z4~oti4n9jH-i)tiq{N8c%1D?pUNQ*JHSj)dCc;HC5$-n=;W*A*Utoi29O1+d)&_9j znU!h*<6%8H)yS<43ch&*)Y}^z#bQo81e{BB6UJ(rYQxhBjE6r{8^PHrhZ9^#RzHJ- zQ<)@hR;t>T23tZU!h9=jvurEwO>Ms6Ry_N#dS;u_S!}zHojY(bj#%Js1fKMsTKqU- z7o3@O_2Wwc#zs3rXG-$nf`RnfRkG%!JQO7|e0G0GAMT_N`)o!h*RDnd@(s*huHi|1 z>34&?T;KXT+_e_n@6(Q=jyAiHbiYr2*EaGdWcd>Ll#~zmNk-#KjL~%{a+0&xqg?5y zw&_Oy+6|Xth(W+VR%ZX~kd54zOvo|X7zp2whVKWW_tXF!$B2zGPO;e=$!%|g9;gZe zc18WQcB7AdK7MXHJ(1Bja^!tlikZRsj~rrOzyjL?yo1BZg_ZE!j8X`?$Tqxa(4-q; zN7&{QELRZynY^#WAB-o`0aKS$W?ZSdRGFHYo*~`b%ydQEq0S}o-W*Rv-W*#6kw2~y zTY2f&CXVnZEiZX_qVn%vJT+07X4Ic4Bhp8*u$TJenq9kZs@mQWm*MqaO`OA2+)xRm z&mWUgE^~~$#y+SjQhlHBiqVHX1VP~;orx$b!$-a#ydw%Ihh77{L%eXgeyhhS8_>mV zldX0R_3PUE{r8uwh3YMO-PfkHiz7=qli1^c$5^81Koh){;eD;R>c!buN6#54@^;u$|EIdE zyQkdm^6bm%BIP)|aUr5}sy7mRr-rIug&lhFvEUl_{Vf8yS z9NuUn$<@gGq&r*2Ia3F;xrRDVtEinJ)6C&s0)Z4hYJZO!dmE}J^!8fa<`r90Y)rvF zBd|R$=7`eVIAJoK8|^X?=eo6r5%!R0Hsk$Ha;z>W2A#zQAJIIs43UXTh|Fc zG;PiG5B0B03|L-kB~ShL9M8y#xp&3V37kLXjc!Q>fk3-h=~T1&(w>7rO6pq?bJh z#LVy|f$x5VC-0>)Vq!&-$P7J2j;YI}NoNv637LRk-SE0pn<7gfOlW;X_j z|1a(1+<=+Dk9v0_-G89q|I#YhbBrPT9u+Ux7gO2#Q(O%+-eHJ{siH7e#wiYbLz`KZ zj@@apckOsw(^J7^FFyPVDgQuqF^+!2x(L|UbwG=oe}qhRa!7zj1a?-S7y>23TZG$3 zV=LIP>YwF~y}4{2#dys-`-m)?WVEyUr1z>AE(SQW!D}`?vgcOzmpH+>^c4Qjb%OK0 zBUtckQ#<~t0z)VVXo6YG+Ah#Ynr0xjQH%c_$-hC1O*|%de73XmGPXP^?d+`kKG*;y zb}dL`LZke6*w&{;GzPwhpHlU@#~lQO_hB*Xy6sS;?2IyQH|dSe_znXnqvDxkL42Eb^WEZ2gwCPlm4VeK`UvuZe@p-WFKS68lsqm*a^J(qm3aL_rLY1X3=wf)BwJVR#9 z(bj_AK}fkj)`tb-i%kd?P4NGz@5FSw4KS)@n5Oegb}3#|C|!$!myYF<^**CGe9gOh zQv{b9XT2#2F1_iwu1%6t(2Mj-bOUpcaAaLE}QRSz&Y>TFdxmhtF1^GkrZuhD% zoMsVgZUZ8DpQs+FhmaZyhiC)gxcd_lZi_0FcwI{+H23RxYw*JHu0g(X*Y2i@s+$0n z`W5M1oF6polnM4SY@!QcfzDym2NQ%J=Oc`~1mEu8C|KibCju(!LxX}1xCHl25?!t8 zian57yDR;bnh;SD05Nwtl1SR`-r)9W4q1slR;b3E$nT<54VccXSo zY>(BLG{#2XNGi_k(PYCmZ$P$rD^P*9NVMLB_J1+X^RfL|0;F2M-;j6?23|c;fBiA0 zkj&mteJ{_SsyNwwXzq1PJJ=S?KJ0MN7Nh4A`=hpD*vteY*EFNOc}Y1zkW)Ug40n}EKo5qe+2m;zD9UgOGP=#`~r;iz0fc)7MDN3ea9uT0L& zg{~q*U`Ipyjt1POdiV4|-HBXlacLP%f5p^@H)xzi3v5dnP~zpy({WIC`0^zFC-u!X zb9%q*nnjdnC_t#7`Z$3fd0A`dgy?F)?9wr6)*f%3fo3I`L5$%Y(qi%ZMvk3Qr1oMV zG4s9h3K z(W@PNZ^TP=wOdtEn~fEe6@pbM+9-WR7BH%ohUo3Mj^7Jrrr-^%hAr9nJygy;r&eS- z*enB@=hYr2L(BtGn~J!sXO_cz#O_q{WIi#KFl* zM!-6zPK3rXZOlj>W1legU>zB#H!f@K4M?qAA0f#$g(4*SNoHs*yK+CK-5^P5aa`Q7 zb1FYu!0?{)B^vQhCO*k3?41>#xAnNqF%;d8t1sF(O3mx>G}*J8s+l=F{v5~LH2a=4 z%Nmcm()zA@DmMGOI^vKzO_K>8l+{NZsI2M3l}JXm@8$k1TspfxT-SpUcvX*(+r@C{ zyogC&M;r$dvp71OP4k>hg`BFHoy`$v!|^n9ix87Zb~tlYy}`oTRSc~$2p-|rV*f=!dn(&3{x$Odu=+!@Sbc%;f44_d zofc4SJk_b=Mi2f5-#7b?&qy))A@e=?^Xh*q{;#OK?^Pgk88fbS|C?e~8!6`*{68+ylUntEh#7XPZUxSQPWw!bzRot3uh@%uO8{e@EacbHRDk<`H&ihOxl=Bm5*$Q*5NY0n;SkTCXgCk{)sXKS<1 z%v=%PVf|_b`XN`K^I&*#FO_j$RtNOV%(Q)1i6F3mCs>4!<_mtGy;|2m0jgoG>pL4b z2%dsmWh-=&CfbJFRug}-)x>9J&Q?k<&rdGx9($SNigcPK{E*IW=a_e|*{|BkM%=$F z&Pe8kFPlvxPSH3&7!s>Pf{ztqlnBE|iR9t5vmo_)xh{t`K7u_;TIa*IHO;O(7*g_H;sm-7-X3nX z`=DUuj9Xk-T&{K+Ourl!)*hqI)^`A%E7CxxX1^V}wpEMWfCBmd_LhXFWY0NJk#jUV zQB?Om9l&YRzJ0zYUr|>S)D>yr!<4$gGg4j2)X!wUw0}$0aQbKs#wpsgVD2+lzV2^U+_b z#;laMoj@>fr5Y#OHFo!@ZrcGl`euWA{vh>qatOYz2I{vem-)%GK9j(NA$%zfk?wmb z)9K(+9T0X9M~w;BxyAJ>j!-1PG3@6 zOm5a^N+9nJ*?ot;DU@Y(BMb5B#@NUpqghmn@~O!hDxr`cyGrv>BoF=+7@bd3H`^*) zNSUE1w1CV?GkBzxb_5;Cd#QAhtzpq~@zwtMKsuB{DW5COTDO@3nFG(X=73)o^-&w= z+Pb*tu>KY%f*=SHkvYe6r|_9N=~jB--^sK3x{-{a-)&V(Z&4@8)xSZ7v(|UR?w2B% zsNZCBO%*FIFIZ(jbFEXa|6=HMSGP*Mrd8s#iglOx<*3AUb&sIXm0CI3r`NSI>CWj_ zmD3HpTn|;71ywIZ%{Z!MxwbKQxn0U#VC8O7?B-TsZCDxT?v)>IK~3624KO39;iS6= zIy}@w&%2<;vy0t1PKg+Z{$y~Y>kwCUh>G=K{d|b^^NqsN5bu&0zVt0g5Szj@B=2_B z@W01ypIti5hC?gC_$HE#VPsGrgazN8VMo@YN$PKGq@QSQ8nW%zC=wXAryy|2k%GRdBV{( z&H`=>%yL4rr;vq&PxGZ;iy8wuu4`@E`ZOk#=dDpTsY#7ZYf5zyH<&gJ zz@fadiT*mO5Y_t1Wk)G?`|QWseKYP}XWqaYevjt$_YyQmqSRHH04zgR7_UNGXYyH+Ut~d8u`5xTCr^Bjr)RPe?!3!DELtYKc?U)v$olHP(YMY6|Y5p7#|;*B^c$==Ib`;YaNBt9PH`;=1{cNC2B67 zhwvzhwE=Wh&Gj^8uQJ-FpiM5cajec2`gP&DBebcoMYvA?rbM#M7xG>xdjfe!@LQro z8-zd0<=LiT+J+2=4r-&u4w#(OANXT?Jh$oLwQK35FtCM3eH)v~%P6I~#M#M}wwI)4 zVtU=V0_xyzYJD(`tJi-1t;*QGc_qn+z*VvPH7USt?+X%pT~ z6Q;$u3K3j#SQFG_KMW zXxn?Q%cBhXgVdjfd|20KS7u5_$;)>gaseHy60)LW@%lrpDgHs2x{D%e6FZ34jrBCz zc1WPw-7YuEvpl0{QZ?3H$uzu%U8IZ&Nv1>E5V~pC-bxB*9I{REgGR$xKv- zV0~CRp?@W!j=9}6)LeREstt}L36gA@O_+UawvojV2M&2S<~>Y>8=i!_JxFt(T|+u6 z3)oA^Rh)NF9@~R`UM#4YAoEt*n6A+lKCo&AbQD^|0Dq+51Z)YVOnDFPaNmUR5rhqW|izJFuJg@^~ zzcW<6ug3ELsCU{eA9V7R+(=f3g+16+j6smGu^F$+PC2Bl*rKtecCO+cATu4nIfqUP zF`?SqOt4`uWwNOqt(LX$gi*nJ)UqKyO}sAG7v2>;c>Y^a3tIeF7eokB$kF3cVKDC% z2$PA#czyqpl(dVdW)ZlE;#!cS5~!dh_Vz=2ovPH%>yY%e@dS?gmu9BULYR%k-9IGn z4F$SipqRTHc>bEXwTgEEsJeZyg|}AyH$CI+9MzoEi;#axLX_fbgJNW8}ie^}@6<|5mX! zlpfaYQwnTo+T){i_p8B@V9TgO5^TRN<1zZ1p*+`)#9P8gw%Mi6FD^EZhw z>NY7cZ-`a%kxE?EGap}&0>luj>6dlUb~~CuLwF*Pr7~ya(WyXwWiZv~_E2J#l-K?s zvz5a}DX)MEK5+r^fa6DS+=O=J2@FR1#bBM=M=sf@bH;Mx^)1q7YQ((4G;)pg&C%$& zx}){9mD)=lqUZI^-S?rfcYS-5NtpSr>TSF5Lb%KM)2iyjHrJJig~q$VjZnCOzCn)7 z2?KKjpF_e$KOyk>83n@9-WJ)kwNL0)CdZLkgjq!F($k*#p+wJUc%^mp-nE61HB)lX ztJ~}sOV`MXNVV)5YJo)yK`0Xq^;+EQbj(0O8x-hrqw72zCcSa9+2%-{57DCKr5W!P z|7$Oj1lzTbs)hn6+aeT+{==7D1gfgis?G#A(Y&Qvw!Z>+h)d0+eKj6exmzrjG4>tm zBRrtdry7e=`2{2*K@D?Zm5IZs`NdZRI3`~!O}oW;#OAhn2pvmpX3ig67EYv+-=mI= zIL+3ws!_#dgERN0#th|JCfIEqsi`I<(YBKjIk5(_2`j=qCNTKo`f+6zuiqK3P84Ry zCB=#e310txG@sX{zH+Zh`a&OqSWHmTfnL7E8)}!FnyYr4;MWatSlG)--Om)F-Z|JA z)lHx@kcf<^H%Qgx?piGo5nwoGKV8ro>9oL)an6LljC;8HU|s7m4122!@+Ha+KA%>$ zcu?V&U{=@l$f*H`BDN>`a>4-Yf!r;xJltarn9`aNRw}sw^=)ybl9@H$aBO?vmE3= zt@}bOcagUq%T;-APT)9V=6k_?16FR*{Qx_fEFMAgSaG~Q2xwyZUyqip`b`3f2(lv- zcUxpo0`2T!*&x~MZ0jS@%G5@rRrk0cRA<)Jw?=3%WV)j~>n$W}crYxXzIo$)H6xvg zLJSMzZ|Kq1Q~{xTTBSa#!06xqtQle`^D*9X_~p@O4?p+9iSn}tKjMxm)tWwPVNE;e z7RU0>=+#zz`;=na6vNgK(??&)$a#fL!{$H;)6u#r7jVtNNWu_4ZEjgN)5?-Qxs8zX z&ymBNW`-!6T$U4cF-!9oD4NX&!{&k5j6@(k^^UkaJ8*D`o`TBt6w4a~4m{D$d?>zf zKX5c$-X5+Ct5a}`Hhp)9o0k0=_Lruq>M;hPe+=&)=hqBrZTnGZp*GvIb;~;XGo*C? zih_EVq~GP)kJ9RQl_$1od!CoAaAfx%VT_KWJlY$xAbkxPZa@h(H?7OzhbhFJp|tvz zjf)uDGVZ-!jqA_&J4H^6A31V_-y`ldKBi2ep>Szax+!kQj`SW&a9WA}x!Sv;m_*ff zww)a(;Jr3TD&UVVSkv2IQSc=NfdaV}@NQ~;R(rp*G{?1#->*Q{Wj*?+yKByqw1sA6fwKBd^-QP8JbY3SXE zV$#&QF~x3CAbFUV+}*2~1P>;g;Jgq#EYD1NBL}ZW5L;rC&Y$sPGgXv{dqQ7nGB^9C z$Ice#)+!1*ecx)ucp z?1)M){CV#FLNZa*^F-dlZOq&pIpC&+STZ-5K+u%Paj||U?j4Am9!9{{_1DMU0j{cq zlwFPp;}ghcI1LyHiT|(2K`C}#3a9M^EL_;3kPb4qqRW}%K^=|gk4!9tjtBcf$AiVt z@nC=GcyJ)N(OeJ4Ck8{;gF`%#^T9aI2yZm^gK^vudiR4PI2XJoxR!ULY(Kq@@-_$8 z2RHD$#grB|x!V{|Kl{4$J)%AsOuy{^4I<_N4(7uAkzr&bwhR^xN5M5nd}0zO$>LFj6GQHHX^~%SG4Rzf^9qM$DN=A_it6qpd3;~i6FJShpOlS@&-+>LZAk{)Kud!QqKX-rGJ-q}2bELfnFaK*0gEKTz-dv2Hh5*xV8?eoO6_tU&k# z1^oNHZNu!BT~$|H4h1&7(y1bjkbp zlMa*37Qwy~_@QzYjlo9M%7!!U->Xh)ZGnv{oiz&Iud7arYw}tM4LW@y9tl38EiOuW z%#&o-ga^Y7D-q08r#SKJs~VkiRHC~I;oB)yFZxqlmmtBzo$zZ%!5l)zdrXK7T`ZHV zV_ml?FGBxoD$yWsb7!MlMD4mVH9f3MsRrv=ZPi+0G3EK)DbUsN%>{-7TfaRr4C%#?7_=+BgA#)xt-KI zP=o$Lx`27k#qsR@ynZIrMVj;QQsX@IFlPj?R{N?mZ%y*2%_NsHI6IRO`>Z zEHr}K5{O1&SA%1;pCCG2MmR)!R5-@udeTboY3_Y?tK(U>xh`GQ9dlDoC%zKKBp9F_XLFgxhTkH8MeWEq$9n1EEnv zE_aE8w-P{Lv=iev$C~u^ZuqUnTE3fNW$ji%?&lsR4@`!YlV5L%^|_;d^oVQx`Y!?D zwE^>OHs~(Z@8P(L7#_;duxtF;61v$i%FxOwk5Ov)j54gUX=Sec#BUJQAtAKp0`0h< zcEI{vu^kInTiPEY?OJcz3=54zZBX+(1ya7mAHiw+?VymOFV;Bk_2H=22P%f zsv5S8>_rSj&nnk7ee!t)cPXzPJTgm?8wIh_IY@&d)*e40IKLeF^9&AH<;F}Wnqt5n zzSD`dI$BI_TG<+HHnp6a{Wap-Wj!=NJhi=$0?&RWarMAg6IWmV)gHJO-=L+~3!=96 zikyB&_5P}Y|D@ov3bb4q%itM`S+!+O!MuV+1tvxn?P9cpUsttA`U(7iUKrh@Hh1)c z^@x#YV%>jAONC8eNnF%asrG$L(vE9FIZ7&*LLY%t1-S{bl0qSuEp9gEe~Kcz{>U|U zfXlLNOE$EzmZLRw03oh7L+M32lwM>)=|wi^gWxW@hsb1|S&q#vtC)nCpxJ?qw7LtvHjp70-0U*+D=`&bbOwXXEZ69IQza0dn`&q9!dU zK5WaGruPnZaO-yqH0f5Afs%k~r^ns>)ceE{BR=7y)xmxwg@7?b3GKZ_?)WLeUdNa- z797Sr+FirGX}__X^wYHtlx;ZruklF)_QsWs7yx8e>LSIzD}g^c z@G(40{C;q=>F2Ra!lnq<^s`B~2b?6V=htEAMkjajZ1*6{w(xMc2uGLi&o-xE+6^eT-e6lHVQfd^x62ls=-@PV5_1r_iaRFLt%8aEvB}>YR!x&H}wj~ z(s_0@RHHSs5&J5cU+(~Eu6|qtbR#cC-ChIHro~i9N{)oZyD4Y||=EL3oavK?ck(LyGAc z_Rk8-V28DZuw__Uph2jr)oKKNUb=608(Y)J0Thrrc&sXI4 z)Gs|N-tY44byevExz)$ot?%F}JB-s>?)RJ{{YC-}TW!8WIU2vXdBYsX8NNUrR8cUk zz*e;Of@CY&e0PQ0OOx>bQyN7vd$}0OvfF`wNOfYQcIwL~ooS$5f3-T;T2+xB)ehYz|Q^q*QhZB4FE!yeMI>$$5iX-ku zDmK23u@I;mG89>%13|eGmq0)uCC=EzRg_|!SVG9|1(SiBb8v0h=2@SuT}3-lq~FdM z8L$-zhRWt`#!IT*IZ7WJa%yTbe`pb>48|@?VC@7X-s8eYN#*G*n^N3KoXs}Q`Ko(Z zNi`2;&LFdYoH;EoR5^SG;c&}MqeKlRfQ}4PY@zvF_h_}2mCtCPwor=v2mHU4ooi@Z zRS?Jbag%Pg+jwI`DJ4;fts1ET6)f~c6j3n}sE<~Q7Qju@&Egu-FxreO|@>=$=P#X=gv7ZXJ*cv8AqNM zZ2!rA>wPQj?JC)fqPwLZ%6vg$@*B^wyyO9~4529tgG16xO+Cjzd|Ov_KSjnGnNoTC z_J=u(0p+fGM+H%LY2i9KI%BJ`-^tO6kC@2u!TdKLa=-k zt{(K&+qbq>B0HdVo7c4W>)x%PrwRF@&U6 z$yC!7u1PetKT>odvdt*k23ILuG;`H|UNbYKv*gD1lE&Tv!uitGWrP$PHI%P3*=5SK z%CFk`wzE-+?#Xu`Gh%X7nAJ>Z5_QkeW63A<$D@?2f!_w^Jw>|9OuH5{4slAMOJJlY z=#mk42@@Q_7h2yX<$={ArGo(cQE7~vEOdf3ZQV8fP)<8xuYQ1-g^Pu5SQaP-IdsNI zOJ@dg5r|VgNbfx>)LhnunjiEqWk@w@{PM<+F<^wGXlR><=G4|AHa4j4J+Q%~k08r% zG*14mROCIiwqpp|lpEyb4w(t|z)W(zzB93aUJJ8Om2u~Ogej>VkI@8ruT4V*_0vL1 zp~H|%K2{UMtl3EuY}VV>JKp!-S9y~B{rzUk z-JhBIv-JL*_{>QXp`HE3x!)RYrq@2s8^KiI<1hrd=36qL9}`P(e+mOZug&o2l4l)e z;V0A@&pP-DD8%QgdNo=jL193v@l^>5oO7@4((zGUX*L^ zp_~%OynZk)7A_AQN~W5OFI8J%Qs2-~2G@62X_eAnDxosM?*luOFa7|FQ-w}1uxfjk`j3ugXut-{Q8__uhFdE z>b##g3t0)#>fDPOY%MPZTG9ScPOS>yAtZAb(<4##Njz=GLC69cL!;oqC>$T!UKw+aAf3s+f&rWtNBP zVB5mb+FOv96yxK{m?9l9_D$?+f^e0 z{6^mP8URj>#bGv~1E<^Amx)dqZ=*c2G&h`o>n>+T4Us?&qxAwEH+$|oG(CO96q5{q zcPnmoC)-IQcwnv(8B=~z2Y#X@`2IlWvW_Y#Rb`c2pg0!jXiu_(w>Zh2*~gQ-0(b-P z9pGiaIN$`}d7Uh$vQ|hFZIMJRmGa}=VIuIE1cGU{Jno?7L`@JP<)S~Wl|=YY-Lnbn3kfYw&H;P@hyhR2WDwA-r^|LT&Pg7Eioq_z>hc;&maErNS_gQF zt394gH|J4j=hq7;eJIduv~qkZJfe28?xjlE0~JYeTDb%dE3NQ_oGK=y{kMSi{G8;z z8#%Y{mNb#sBu7pIvW*Bfoqs^x`vBYC-=Z`McpdN&;CpWUEhW#-UsC!?KoKz5O_x}i zw1RmBhc*GW09dE=P8H|H3u~AAsG9{G2H1mgky6Z4)&MR7OaaVKZ6Zb6_k8V{Aq*Ce zs|-Nn&DvINj8ho&?Yg`)^O``d5&UQKu%SQ~vA#p)K?N^pl-HLVeKE$LN`Itd%8iC( zjCWoz>erPIxwjhi+Ugyk6qiWb-y~N=1Q@p>qbzLl?yJiV9@V3`C*Bed)S~`c=~(Gl e9L1yYhIoQf=~(|}>cU_D1FAc}e_MR>VEhk2N98F1 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/popen_fork.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/popen_fork.cpython-310.pyc deleted file mode 100644 index 30dd32bd01324984cf1517a1d8b3f631d92158cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2456 zcmZuzTW{P%6rLH6FYDcG+w?*y5|@f1EFc@i0}@m~Rnj(yZmVw4!V1Z3cAUhC*WQl3 zO|#lmsO>910G^UJD)9&SD}Lpv{{V5R_|7Q#=5&XG*T}o_&)kTgj)eo`{~Kc!vef zbL_y{&pBkk%lgv7z1v}D@n-wl*QI?o8%61WCLDbZ4qt*dVss!5<2_4>o>Uec(6e!n zgSQj8>)r}iuJWGpUQL}*HRVI|Rb4eOURN`!iFZStQm65rQ365DYKg5&xsvIP_COpt zoOC+>I{xx^Aquw6cf>B^q*;}w*p!8G%69B2-{tst)?v?hJ8()X-^xoTFH|-zN_!<4 z=WE7{v@U%e6=R(aG8L6>nDoc#U@Z`(%%fzbtdDdyi1Iwlme-##eF`W4b+@&a4WrgD z(u1v58g1rDR1}eJ%{_?H2dyMtZjH8zwJiN;?!)<39v9IEqyAu{zZ&JOjxz8QmGeEIFK*kcaMC+l$B02S1A9dVZ; z%S(5&9~Yxol@>uOqVuDl4hm7u-IO@SJu0WH>xsO__Fl6R5mcn8r%!tE-t}Y z?~>A4y0-L9C$Os&$d#nOsxQztGF1me2~JBsgSz>qH7uk=xJ|#3VNb}Ox`RU00GdRSOpr|hNT0nuTh8n ziJ)Y9{xQ}W+VV&6bWT_xF8oAX8Vh7wQ<<&)@-scZe;#oC4(z};kX4Y#4KxYE6-}Ac zuRxUUYE<-#LYw8_V&~rVTLzE)BDbQ4gA;g_HFTw6oTADUX0qZ01xg1Fz4gR>+njd zIdo!+c=UkjD}atA?zTO(cRcFeQ&j0L+ZJ8)aa5?-@7ssgCXL7`_=nlpKdkRVNx3zY zD;?cWRW=M7dk~J|QKYFmRW)Z1k}Qw33rFb=Gc``4T)$5ix_qQcKU~hTA}@4*RN7(m zFfKGzVc-~2YNA^y%?06&`Wh?_b?KU>8E%?=P9U!vSYgWV5)=uZQt1jKJ@D2CXMN%G z$;@7NuWp@V#3d5bO<=Ym*6$IQ>kE^{9&s6ALbRo>MyOO;MYgKHS>{U&EP4*RfN^vw zoD7(T=vvRIRwz_ZM96<8^(w#$KcYduaGb;fZBq7j|2f`;yV%;UACI8EAw9gB_XHv9srfx6Q0ww{PUjg)f#64 xx7wOAT$PA3$c9679x5SR>tR1h!q9B=vJ*=0YV{$X5$rid<1xxqLpWmA{SW()2z>wm diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/popen_forkserver.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/popen_forkserver.cpython-310.pyc deleted file mode 100644 index 81d8c82d52126938dc1c301bdd662a089afa98d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2276 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 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-310.pyc deleted file mode 100644 index b08b7dabe26b7b28e0ce0df13b8e24829698788a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3380 zcmZ`*-E-T<5x+Zt00@$jEXndmnpSa>PC0EPJMQG6_4p$)?a)am*Hof};|>DxP7-Jk zU=Bx9;*c|~OOU*Z<(g)?tzjm#|7r@7K_E*?(P15hqO}h z30!CY`t|O&6+-@w53gPxJluqq{S!J)IE_gwA8Cu4XVzk7v|5%K?Uv0Mx8g$AX*raD zY=i8!Tq74i_FA5iow(TbTRzC{9&MGl*D4FUQ{lx&Ed8CB6E^pG>Bwr$gLYwZW=bZD zyga3?rDH1@4=b={CHA|^t>y07)>%q~-&tv$+a}3bn~3v=k0`<0SY3E&#pn3^Q_?#3 z6-nrT+$DU0yHCN7Bi6deX_HjXynuK~;{}DjO10Zg6D1B5h=r^d4iXTGQt*CTMJYbG z!5~V)UZe~6)1F8o0*mSb=&pXCon4s@MRI3&rgy0J(-%X}tapWMAFd~2ki|kNA=lR)i{$Zo9PO;<{#{+Wa(O+Alz6`vwjYIiB3s{y z;y4N=U+-abf!P9#`0591y+gg!#svel50UU7U-VsA@!#lZnaVRTw4t54EO@#JExQMu zAXrUMNffGxK?PZ@0=Ibqa^!FabJKFU$BQs}kSnN*r?ge%WnKY|Kg(u`TbMcN!i2+{ z{wiEe6-u=lu4et6UcSMrDqWTRWL52p)i&($YPt*Wk6)%c9nn_iQ)$CAjW&jGeBpMN zplv|Qegm1{RFMwl>>5#QVqq3wv`4g4n9?y*&cubnv!?7J8(U*rd6VJ@LYuO2L9vdn z$fPtSBa7S5*x2EPNjVR7 z>WNu>eMeVM;R5r7C6!@258a<2zCXBQD60`&Az#4i-#~dmfv}-{>Amby!+-(+$kr}v zdSIUNZUMg5#cO*a5eGea{kJ$H76bd^3K_m*@VyoUQ4*;jSi2Ud?J&-+ubtRyHrUxh zN-(I{<#(z-(Jalh3n+_ZnwY}UZwI$KVX~J7Y0QH-JWTrvB5OYif-HP2^zxp7n5BT| zL!_91hbq*CAPE7!4m#-1cmuXXJKgMYTPi(g(3xhtIR^Ct&eBf1UEqNrjuNm04Q{2~ zNuxxwDAhK8Bk>f_b7&5%)b6WrCl&^`x@6eoW5Xoc!f$;kR9_~D9^k#%QdX2G?PZWE zSSFU33cZ-Ye1tK;#Hht>RGF`CC)TfL(KPGk@tIX)P^I>_+4eW zw{tN4>n<;ymg(2|Y=w8wyut&s&^xR03pPyr>Per%6y1^*)Qs`5Lf z62WK88m`OxKnS`w`$tzh6fVMPcLnUk-C%0 zCLkgfo94KYYxt(JeXG6|Y<_gFwy_mlmUzzS;#Td!XZ6M{n8L}Ty(Ema+pOP3ZM9(b zS-UFg3Lp<%=w_mwX-kSs+lbBAci$es(qF^0*$Q-s0gtXgSEPvHDPn;dB1@GNEjx*_kw^i}Vb zye(`A*@eHklb&F&JxivssfemH$7?BA_9k!kkAKD+2U9(vG1V_JjTXa6aGc z6WbhcWetplJRbzw4}xyW`!UMpAo!*q#<%0@y-?-#4=#pr90d8MdA&GP0Q;_Xfl5N9q;|IJjoOzr?Y}&8bRkX$LTXPW zJR3x6U;ALxtUdUmzELx$ltG3e#@YE)@AguuOhR-ic=@MiLVHup+Pju->UCu73=a;E eAR6#4voa*9%p7JrE08STW7wO-l^Oef(fuDp?<>9l diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/process.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/process.cpython-310.pyc deleted file mode 100644 index fc269d914b294d58d17399e194a2779cb633a411..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10401 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 C#7^q~ diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/queues.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/queues.cpython-310.pyc deleted file mode 100644 index 1850c11173e42a977eb0f689882dcfebcf61d7bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11481 zcma)CNst@YdF~BBqX&b*EaVI+N`k1xgci~g9jC0wF=bifSe7P|NlOmw3XH+)Au$6q zpw~SD2f^5~hFP4HN|)piXQ>%iDlwBvDwShysa$eQ<(9tYkWx;r$}N_~eBb}D&f+pq z{lBGO_j~W(|NnJoem=19JNJ|CZvE@?mi1q3O#eJIZs3al2S8cMZdp}R+ErWHPSugp zt-4ZrRZq%HHKQEmwzBP9HD_C>d#L+WU+S4wz8zEp)Gd{5&9w{Fg4A=Z`F62dY%f$7 zWSrkBwHK?4?WO8cd%3#YUa79M&sER0&sWdO{d{Y+y;fbbt=pCger#7SeAQBOs&LOz zg#)L0F?{I2s$N3hyeguv7+ySZs}G~Sph{?$Fy;}o7S$43OW`B9`>3*ST9xIGv0rQB zV;ityr$M6=MPVapb|SQLXeHs@1l9cQFsX%FM;$iWov4#^qGqGwq?uRS-DEHI)^}U2 zN;b`?aC7%|n!(tPPQ7Nd)k*#JW>jxA`(e7Q!`sa`33aW$MYz?`J8962YvJ8y(u{87 z<;8XMq55XCvC|55#Z5DB?S{KyI(M_#?zTeHn18Kjr2luO~VdR#qm&pNQHE2uxIo|5`G z)IX!HNd3GjfGp4G5*FV7Tu{bOc3e*Ox?y=Y24>3ja<|zHpDl0hZf%9ST#r;axue6n zlHr=PY&Za;Uj`K)*KgvA{~4g49k|NAVC{SFSkatkCDz`eZSkMj$~mw0i zFDYQE<+R;>+eY8Os(DFfJFBuP_o4kA2kjg#f8ZVFk1W)JWbUvawfUsDy`cOZN57J4x{A7GKLFIG;snBo4@($8@0Dze*K%T z*4}veTkH4jG^=*OS$ES+uNhr`p|YC#Uk~?Q6%Nkd0^Ut^F5Zh8cQp9EALAzE>FGJJB^(*ThlF;PA5*Y5T|ZarI}iXg&Xh1so!nY z69_~bBYQHk^ySWOq(XHwY}dPYIyy|fS{%01`C9XKgk~)yAEa|r!ldW15MiGCnbeEJ z)>fJut}*q15=_0*W2u)h@V=!#i{k%Yzjmk74zIOC-PpSpg}t~HCRq5jtM7%;d)Hdc z&1>Dg7(=eqUAPW^TmU)yZ9TFtsv*WRU&##g(0z)GzdHIrKHalAXe z0^ryM{C(Sb;5!8;Yp>XW{Czuc3U=1U_=1r4(D=*K#__!V67Re;1g z1pge7FRg8G;t|Uf&J2JlvC=}V26DzpJqc^Im(UY)nSouxAA4FF?P)S- zMmourd0etDzItGP2dl18W+)$&G3=~{oz<|j8l?q0JM<|nlnZ?w4^{HN>@M`v7=GW8 zt)v-Q_9;7x$2)o%!(~T~v-F?@I!<;p8FYeDM6~SaJya4H)C15du@4mAV%g>zomR`(#F*v{j1JK@x)&Am z4hZ2kEYh%1lt!Z-H9|b9Fsjk&#HeIVML3M&87Vx-qPDr0gt4$+>gllY9#n%A!Q^fl zu*ZzVV^a;UizVU-7W!AP{$m6clCPsbz6juhF9SO}{u@~g?4sRYJb|uT8x4|j^kaQ2 zgk3a%a!Y4kvpxVpw?W>4GjNZbxR|)o<9+n7h-XGwyAUz3EeI|>xkH}@KxwUuSGg9DoHn-EvrYPN9(rkyF-Q*YwQ@6XDd=u}8mjH+?&xYE9Qlo0S{7FA= zP=`?s7b8Z$k?j>(_;>UUZ2kBEt|ZX$IFa`e973SQKC<@RX#_+*w!b#LeT;S}JGK?w zz+0Y9yaQ|Ctip=(J%<@sX9uXio@76;`xT7%>cHceHESPaQTC1%e+4t;Fv^bCIVyrK zIm{hd@f&Q7Rxz399U<>SXU_5GPb9`PC%8J=5*K!>(I1W zc5M*k2;LxA07x^fPF=;7j8Ut%*iRIvt`1=j70hU>8HFb(0Y&;<42!AAXjTII(u0EI zxrQnZC==LAfHXIt66muA12du!o<56hI8oZ%GdKd};y;Y$9O@d_wn9a)9Z3SfT(cc(}=9BwMB z@9{~#BCto(NdKAB#08mVTV(fWG*QJB3hM9RCd@hfbGSI2Q@7`B!SDaUXj&MD!0e9Q zCuSX^d9*nN4FJ>ZY^+yo{cXJE)HwoTIO_E3&Ey`(Yy$L4W}eBd6GnAxg3KNdA$pk4 zfx+Cu3ozl^D29em-{gyFeGL%99zd9f^Zq{XgaD&?C%0yHN!*Y1^*%8_gC*n!8U<-|bmFirTG;XH*{@l{6z}MSlhLiZSSV8}(!R zkiI`ezi9ugO>Zm4;osCbap*<{ox6(jL+$Tq7-h4^ zvAgb!O)$;lP#0gRfWc^i%~t4OoJ#k(sb~I}>nGb#+_TsLJgcF#ni_Rt)ni(G4v&sj zEv|*#r)xM=s8qZ+VR;g7@50F5um?DY6LHb7nz83%+Q%EY1?43>`7$@boupYaE-k*C zB)Yk|o0#z7)EzFJeCLnwj<^WmW19|4HHZaG)?Yho5i@(9;Xj6YqdiafFLAdegkuk` zv6GB?ussJ@*vc}a@gbegc}3$gUn}B08M<(69WIcM(UTqal#<26r6X&{0ashw%kdin z8zu!V+4ekw#dFE|!&TOg?AtcO?GNe7uJJzZUcen$$8858xVd+cxUU2o{c~p1GnV{H zB{hU!4?~1mw~#l@k31cr63U*w!wvlNNG;EZiydBz=~ z=Vd|(i7Z4!E9|==kEwcygo?Q0I*~v_KgPS4352hxz|vxEYnVn67EE)!u)d?iEn3Sh z!+HyoAty9Ly4pZonuK&UfePsKuI@C#I6kf|m?iizuJ{E2NSo`ylosIdI1e1h|HRK4 zx2Na_U{4xXz@IxgY7=OdpO0PcY47U#J36CCF)QfPAY<+HE(J@LJze3q3h2LfLIn09eS4r9Fo-&7p%8-2KM!m&geXmSk11eO)0*|AS*>aPf z23HAx9Y<0h%l!j$@;obbyOy0>dGS>P<|T<{5M#;TE>^TWDjm*m=F4VqhAS?Ib1^UdoU)G4R71~*#SJQ{T!gXPnGQL=abBS zkYu-W%Gq)CBLf$s<^Y}jLIlrwf3E*l-Wp_SH2cB8ik}(yti!P8SVo>HdshEC#^u3O z^Mm<80FV1OFtaC03w|-5Fp6KiS*RzBL&S-3ZzGJE=eTHbFemfmM?ILOFq}oop7rkM zVK{=l?#OUNHu^53Z*K2jY-_)WReoiV(LYQIgW`dmAd*E+?1%3lq`_W_-z$=QpxwfO zrT-);sm!1#*)eTcKlZg5prv3e_^n2xJ=PN_AW2;{KI%|zlYxGH_x`rj6JLn znY8{BBBSIO!{y`^s;#oBCv`TMU(%}}o#f8?Px2-*j>FNnI|+2B;iK|%&y|Ns-2Meg z{+653j1az9ep26pM)kwH4J3$==>jKMl@-I55+1yRj?|-{m*%=1q~x{|{Q+lxg5XI4 z6E~>cb~jFguOT~jcbKPp^=>2VN&wH0OA^pg2ifU2zxL*%$aKt@=ugNgU-_gq#7b-2xq}}{z7ml8OeBlkm2Utox~Z==)DxaRdMz1DWHW(GB&D=io=*06l>3m(XIHnusuP z#Z^KtQc;fc)50PnBIm!04=qudXR`1uvU~%gB)si?xKwuOLDBZ#cYZo@1;vOV>>#D? zJGVBN8m-l6TWhs6sMXpXwcBDHIk0zk>#gCPT&<=$jap69glMXG{RM)j3FvhjU;npR zs}m@K+XPJlv5-5gaqF5EDJ_6klV+nGA`z)H^{=K%5-d$&PH;%?UCc0ZIg%^%EuhWy zFZdZh6D$OCQgeOt4`9=L=PB5)Jg#ifmS-DycIM}zbpuySojr4?uz2R7!jhcQ*f>^@ zlNlT;$cYS&6asiS%bM|K|6|G9zdVu_Ci;7KnvFZL9dkf$H{&~ydEUjN zVI(gKk@`(QQDoB5S8gB^jg0VTVhH>&8C`DI_sX63LcP`M^e}-roA`2Fm2cgFN{Qt) z&>?pu=W8}JMB*^li+qPiHx-7`JM@$%IYpi^WRDnDA*Tow zXEr3$-M@17dBN;a0ph}CEW;=#U$3!#fq+&_7&^^Q67q|+-Drft8Zj8_U&A=Ke>gi+ z`WZfROspvrmmyFwUpUE(myiiZ2JZZ8a6amzgRQeO;bg{FaK+~VMwxI}PsxLCIjh*a z$qRdC;Ua`|>+})9DJcYz(`UFaI%ntY{>9@ zu{mqRJsSwi99jA?jx#CZ;1>3)g1L6bz7$cbrnIEA-Nk@a(cpH z)H!MJHuHDlNl4O5H>B5OiEDVrX#xW`Vx&;NM5Ixki6~x><^3VILvxpi$aW=Y0 z7(v%1gD#V!h#5g!hu(3nI)iU6A4iSho6OY4ncS0o>fdASG>!0m+*s$<7=RA9^{LQ* zX?9!NP+Iy=`I;XAAQk*)tp7Q|Ul9By0TthrGa!DzU$c+XOtGRcrI_#~+(15Nh+3L( z-_QGQ;Q8}~oY+p%Y3Apmbpuyi1(-3?=XsJXC;vFR#%X*8-gF*iRt0JfWlj~;JW5{` z)dI@ADyc=3fm%|_DCg9QI)}2LT-cRWxI9xIB=lbr`zAfjttMDb!a#Fs57!t`CQa$~ zZk&|sWxA9YLho80TR(ZoLc911_d%>BkPsvik>6L&hwemyf+ZZDc-C;d;(=+**`TOZ zNCJ{{d3b;I@_E%c#7NAHG=B|-z7MWE9p2STkujg`6^*M9HbkqJ{l7F~HdZoN@Or%q(sCl=y`G z9Fv>=1`dEpR1y@KF>?Ss(f!`3D>}^K7iRMKdL~x#gf<${L&zzb2f3ILb{w;U z*YMWUFp6eb<;{+bYOtFGTc^1U;b7F$Yp$RTr{r8-ck+J>*f;$AWc#x>8HJW|p`0T&Xep6AC z3X+yvVa5f9NK$jO$z;?BpTe>1aU9P!ZC&XzmF&!n!ySIbLzeE%te=M&Cg_s{>1o(w zNQex}==ha>a|wrfESDVblm4t4kQ`LSU0>g*%%5$G>YSEhYob%3oS;%pqPT6ds0k{i zCZ_3caQAht=R7JBU3z{F@uWA5DZPTHIi`VY=10l8fh&FjU}B(@1JmM49BEB|oCZ_l z>qQKm;YxBO{VR!@6e@_C;8o#^E}S8s^+gw>CQdN?ZcFUOz#TT{R&YLl+3v4Q+3B+_5YZ`0hf1F;{?Yu%T|I(l?to#v;kOAlEjXXcr+Zkg z*@bZQSqf5g#1FaNEaqaq=7|UW)#+9KBJDU{=r@K7m5^i}OCD+mqZ?!k__%bs{}dnk z3`fzOIcM*0m#XNu%aW|)W? zx&M2dhCBC>3G?$1F7{T+hFu=xOI{@SBEjzv{1HHE87GJ0f^)e}yIW5*wQA}y5ReZO za6r$q1M_JDXGp!>q}eiANp8&K4e0@!kLzdz;8TTaSH6=q8A)Wk;NT(SMGj1}_?`q` z44K^J5}%|hkR?yyaJ<9Rf5{}$ejU3sU(CVH1zVVZ0hs|_CA(}FT;SNXzMs8Ya*Nkj GUig1X&9)~1 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/reduction.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/reduction.cpython-310.pyc deleted file mode 100644 index e4fa07c1dcc9b24ae8170471b11610a9e0d882d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8526 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 Z3+X8nw|@G7W;#}$XKnOalSs(T{{_W^JU;*c diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/resource_sharer.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/resource_sharer.cpython-310.pyc deleted file mode 100644 index 03b30f9c702ab1ef840e71af2a6da5114541f4fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5331 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 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/semaphore_tracker.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/semaphore_tracker.cpython-310.pyc deleted file mode 100644 index 7873ccefcf148c6e4d43144f90d5f1baf392b917..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3755 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 diff --git a/.venv/lib/python3.10/site-packages/billiard/__pycache__/spawn.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/__pycache__/spawn.cpython-310.pyc deleted file mode 100644 index 0199bc1c634285b91e3de30676d6e44c03f91ffa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8983 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 diff --git a/.venv/lib/python3.10/site-packages/billiard/_ext.py b/.venv/lib/python3.10/site-packages/billiard/_ext.py deleted file mode 100644 index 00a53cd..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/_ext.py +++ /dev/null @@ -1,32 +0,0 @@ -import sys - -supports_exec = True - -from .compat import _winapi as win32 # noqa - -if sys.platform.startswith("java"): - _billiard = None -else: - try: - import _billiard # noqa - except ImportError: - import _multiprocessing as _billiard # noqa - supports_exec = False - - -def ensure_multiprocessing(): - if _billiard is None: - raise NotImplementedError("multiprocessing not supported") - - -def ensure_SemLock(): - try: - from _billiard import SemLock # noqa - except ImportError: - try: - from _multiprocessing import SemLock # noqa - except ImportError: - raise ImportError("""\ -This platform lacks a functioning sem_open implementation, therefore, -the required synchronization primitives needed will not function, -see issue 3770.""") diff --git a/.venv/lib/python3.10/site-packages/billiard/_win.py b/.venv/lib/python3.10/site-packages/billiard/_win.py deleted file mode 100644 index 1dcba64..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/_win.py +++ /dev/null @@ -1,114 +0,0 @@ -""" - billiard._win - ~~~~~~~~~~~~~ - - Windows utilities to terminate process groups. - -""" - -import os - -# psutil is painfully slow in win32. So to avoid adding big -# dependencies like pywin32 a ctypes based solution is preferred - -# Code based on the winappdbg project http://winappdbg.sourceforge.net/ -# (BSD License) -from ctypes import ( - byref, sizeof, windll, - Structure, WinError, POINTER, - c_size_t, c_char, c_void_p, -) -from ctypes.wintypes import DWORD, LONG - -ERROR_NO_MORE_FILES = 18 -INVALID_HANDLE_VALUE = c_void_p(-1).value - - -class PROCESSENTRY32(Structure): - _fields_ = [ - ('dwSize', DWORD), - ('cntUsage', DWORD), - ('th32ProcessID', DWORD), - ('th32DefaultHeapID', c_size_t), - ('th32ModuleID', DWORD), - ('cntThreads', DWORD), - ('th32ParentProcessID', DWORD), - ('pcPriClassBase', LONG), - ('dwFlags', DWORD), - ('szExeFile', c_char * 260), - ] -LPPROCESSENTRY32 = POINTER(PROCESSENTRY32) - - -def CreateToolhelp32Snapshot(dwFlags=2, th32ProcessID=0): - hSnapshot = windll.kernel32.CreateToolhelp32Snapshot(dwFlags, - th32ProcessID) - if hSnapshot == INVALID_HANDLE_VALUE: - raise WinError() - return hSnapshot - - -def Process32First(hSnapshot, pe=None): - return _Process32n(windll.kernel32.Process32First, hSnapshot, pe) - - -def Process32Next(hSnapshot, pe=None): - return _Process32n(windll.kernel32.Process32Next, hSnapshot, pe) - - -def _Process32n(fun, hSnapshot, pe=None): - if pe is None: - pe = PROCESSENTRY32() - pe.dwSize = sizeof(PROCESSENTRY32) - success = fun(hSnapshot, byref(pe)) - if not success: - if windll.kernel32.GetLastError() == ERROR_NO_MORE_FILES: - return - raise WinError() - return pe - - -def get_all_processes_pids(): - """Return a dictionary with all processes pids as keys and their - parents as value. Ignore processes with no parents. - """ - h = CreateToolhelp32Snapshot() - parents = {} - pe = Process32First(h) - while pe: - if pe.th32ParentProcessID: - parents[pe.th32ProcessID] = pe.th32ParentProcessID - pe = Process32Next(h, pe) - - return parents - - -def get_processtree_pids(pid, include_parent=True): - """Return a list with all the pids of a process tree""" - parents = get_all_processes_pids() - all_pids = list(parents.keys()) - pids = {pid} - while 1: - pids_new = pids.copy() - - for _pid in all_pids: - if parents[_pid] in pids: - pids_new.add(_pid) - - if pids_new == pids: - break - - pids = pids_new.copy() - - if not include_parent: - pids.remove(pid) - - return list(pids) - - -def kill_processtree(pid, signum): - """Kill a process and all its descendants""" - family_pids = get_processtree_pids(pid) - - for _pid in family_pids: - os.kill(_pid, signum) diff --git a/.venv/lib/python3.10/site-packages/billiard/common.py b/.venv/lib/python3.10/site-packages/billiard/common.py deleted file mode 100644 index 9324d3b..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/common.py +++ /dev/null @@ -1,157 +0,0 @@ -""" -This module contains utilities added by billiard, to keep -"non-core" functionality out of ``.util``.""" - -import os -import signal -import sys - -import pickle - -from .exceptions import RestartFreqExceeded -from time import monotonic - -pickle_load = pickle.load -pickle_loads = pickle.loads - -# cPickle.loads does not support buffer() objects, -# but we can just create a StringIO and use load. -from io import BytesIO - - -SIGMAP = dict( - (getattr(signal, n), n) for n in dir(signal) if n.startswith('SIG') -) -for _alias_sig in ('SIGHUP', 'SIGABRT'): - try: - # Alias for deprecated signal overwrites the name we want - SIGMAP[getattr(signal, _alias_sig)] = _alias_sig - except AttributeError: - pass - - -TERM_SIGNAL, TERM_SIGNAME = signal.SIGTERM, 'SIGTERM' -REMAP_SIGTERM = os.environ.get('REMAP_SIGTERM') -if REMAP_SIGTERM: - TERM_SIGNAL, TERM_SIGNAME = ( - getattr(signal, REMAP_SIGTERM), REMAP_SIGTERM) - - -TERMSIGS_IGNORE = {'SIGTERM'} if REMAP_SIGTERM else set() -TERMSIGS_FORCE = {'SIGQUIT'} if REMAP_SIGTERM else set() - -EX_SOFTWARE = 70 - -TERMSIGS_DEFAULT = { - 'SIGHUP', - 'SIGQUIT', - TERM_SIGNAME, - 'SIGUSR1', - 'SIGUSR2' -} - -TERMSIGS_FULL = { - 'SIGHUP', - 'SIGQUIT', - 'SIGTRAP', - 'SIGABRT', - 'SIGEMT', - 'SIGSYS', - 'SIGPIPE', - 'SIGALRM', - TERM_SIGNAME, - 'SIGXCPU', - 'SIGXFSZ', - 'SIGVTALRM', - 'SIGPROF', - 'SIGUSR1', - 'SIGUSR2', -} - -#: set by signal handlers just before calling exit. -#: if this is true after the sighandler returns it means that something -#: went wrong while terminating the process, and :func:`os._exit` -#: must be called ASAP. -_should_have_exited = [False] - - -def human_status(status): - if (status or 0) < 0: - try: - return 'signal {0} ({1})'.format(-status, SIGMAP[-status]) - except KeyError: - return 'signal {0}'.format(-status) - return 'exitcode {0}'.format(status) - - -def pickle_loads(s, load=pickle_load): - # used to support buffer objects - return load(BytesIO(s)) - - -def maybe_setsignal(signum, handler): - try: - signal.signal(signum, handler) - except (OSError, AttributeError, ValueError, RuntimeError): - pass - - -def _shutdown_cleanup(signum, frame): - # we will exit here so if the signal is received a second time - # we can be sure that something is very wrong and we may be in - # a crashing loop. - if _should_have_exited[0]: - os._exit(EX_SOFTWARE) - maybe_setsignal(signum, signal.SIG_DFL) - _should_have_exited[0] = True - sys.exit(-(256 - signum)) - - -def signum(sig): - return getattr(signal, sig, None) - - -def _should_override_term_signal(sig, current): - return ( - sig in TERMSIGS_FORCE or - (current is not None and current != signal.SIG_IGN) - ) - - -def reset_signals(handler=_shutdown_cleanup, full=False): - for sig in TERMSIGS_FULL if full else TERMSIGS_DEFAULT: - num = signum(sig) - if num: - if _should_override_term_signal(sig, signal.getsignal(num)): - maybe_setsignal(num, handler) - for sig in TERMSIGS_IGNORE: - num = signum(sig) - if num: - maybe_setsignal(num, signal.SIG_IGN) - - -class restart_state: - RestartFreqExceeded = RestartFreqExceeded - - def __init__(self, maxR, maxT): - self.maxR, self.maxT = maxR, maxT - self.R, self.T = 0, None - - def step(self, now=None): - now = monotonic() if now is None else now - R = self.R - if self.T and now - self.T >= self.maxT: - # maxT passed, reset counter and time passed. - self.T, self.R = now, 0 - elif self.maxR and self.R >= self.maxR: - # verify that R has a value as the result handler - # resets this when a job is accepted. If a job is accepted - # the startup probably went fine (startup restart burst - # protection) - if self.R: # pragma: no cover - self.R = 0 # reset in case someone catches the error - raise self.RestartFreqExceeded("%r in %rs" % (R, self.maxT)) - # first run sets T - if self.T is None: - self.T = now - self.R += 1 diff --git a/.venv/lib/python3.10/site-packages/billiard/compat.py b/.venv/lib/python3.10/site-packages/billiard/compat.py deleted file mode 100644 index bea9746..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/compat.py +++ /dev/null @@ -1,279 +0,0 @@ -import errno -import numbers -import os -import subprocess -import sys - -from itertools import zip_longest - -if sys.platform == 'win32': - try: - import _winapi # noqa - except ImportError: # pragma: no cover - from _multiprocessing import win32 as _winapi # noqa -else: - _winapi = None # noqa - -try: - import resource -except ImportError: # pragma: no cover - resource = None - -from io import UnsupportedOperation -FILENO_ERRORS = (AttributeError, ValueError, UnsupportedOperation) - - -if hasattr(os, 'write'): - __write__ = os.write - - def send_offset(fd, buf, offset): - return __write__(fd, buf[offset:]) - -else: # non-posix platform - - def send_offset(fd, buf, offset): # noqa - raise NotImplementedError('send_offset') - - -try: - fsencode = os.fsencode - fsdecode = os.fsdecode -except AttributeError: - def _fscodec(): - encoding = sys.getfilesystemencoding() - if encoding == 'mbcs': - errors = 'strict' - else: - errors = 'surrogateescape' - - def fsencode(filename): - """ - Encode filename to the filesystem encoding with 'surrogateescape' - error handler, return bytes unchanged. On Windows, use 'strict' - error handler if the file system encoding is 'mbcs' (which is the - default encoding). - """ - if isinstance(filename, bytes): - return filename - elif isinstance(filename, str): - return filename.encode(encoding, errors) - else: - raise TypeError("expect bytes or str, not %s" - % type(filename).__name__) - - def fsdecode(filename): - """ - Decode filename from the filesystem encoding with 'surrogateescape' - error handler, return str unchanged. On Windows, use 'strict' error - handler if the file system encoding is 'mbcs' (which is the default - encoding). - """ - if isinstance(filename, str): - return filename - elif isinstance(filename, bytes): - return filename.decode(encoding, errors) - else: - raise TypeError("expect bytes or str, not %s" - % type(filename).__name__) - - return fsencode, fsdecode - - fsencode, fsdecode = _fscodec() - del _fscodec - - -def maybe_fileno(f): - """Get object fileno, or :const:`None` if not defined.""" - if isinstance(f, numbers.Integral): - return f - try: - return f.fileno() - except FILENO_ERRORS: - pass - - -def get_fdmax(default=None): - """Return the maximum number of open file descriptors - on this system. - - :keyword default: Value returned if there's no file - descriptor limit. - - """ - try: - return os.sysconf('SC_OPEN_MAX') - except: - pass - if resource is None: # Windows - return default - fdmax = resource.getrlimit(resource.RLIMIT_NOFILE)[1] - if fdmax == resource.RLIM_INFINITY: - return default - return fdmax - - -def uniq(it): - """Return all unique elements in ``it``, preserving order.""" - seen = set() - return (seen.add(obj) or obj for obj in it if obj not in seen) - - -try: - closerange = os.closerange -except AttributeError: - - def closerange(fd_low, fd_high): # noqa - for fd in reversed(range(fd_low, fd_high)): - try: - os.close(fd) - except OSError as exc: - if exc.errno != errno.EBADF: - raise - - def close_open_fds(keep=None): - # must make sure this is 0-inclusive (Issue #celery/1882) - keep = list(uniq(sorted( - f for f in map(maybe_fileno, keep or []) if f is not None - ))) - maxfd = get_fdmax(default=2048) - kL, kH = iter([-1] + keep), iter(keep + [maxfd]) - for low, high in zip_longest(kL, kH): - if low + 1 != high: - closerange(low + 1, high) -else: - def close_open_fds(keep=None): # noqa - keep = [maybe_fileno(f) - for f in (keep or []) if maybe_fileno(f) is not None] - for fd in reversed(range(get_fdmax(default=2048))): - if fd not in keep: - try: - os.close(fd) - except OSError as exc: - if exc.errno != errno.EBADF: - raise - - -def get_errno(exc): - """:exc:`socket.error` and :exc:`IOError` first got - the ``.errno`` attribute in Py2.7""" - try: - return exc.errno - except AttributeError: - return 0 - - -try: - import _posixsubprocess -except ImportError: - def spawnv_passfds(path, args, passfds): - if sys.platform != 'win32': - # when not using _posixsubprocess (on earlier python) and not on - # windows, we want to keep stdout/stderr open... - passfds = passfds + [ - maybe_fileno(sys.stdout), - maybe_fileno(sys.stderr), - ] - pid = os.fork() - if not pid: - close_open_fds(keep=sorted(f for f in passfds if f)) - os.execv(fsencode(path), args) - return pid -else: - def spawnv_passfds(path, args, passfds): - passfds = sorted(passfds) - errpipe_read, errpipe_write = os.pipe() - try: - args = [ - args, [fsencode(path)], True, tuple(passfds), None, None, - -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, - False, False] - if sys.version_info >= (3, 11): - args.append(-1) # process_group - if sys.version_info >= (3, 9): - args.extend((None, None, None, -1)) # group, extra_groups, user, umask - args.append(None) # preexec_fn - if sys.version_info >= (3, 11): - args.append(subprocess._USE_VFORK) - return _posixsubprocess.fork_exec(*args) - finally: - os.close(errpipe_read) - os.close(errpipe_write) - - -if sys.platform == 'win32': - - def setblocking(handle, blocking): - raise NotImplementedError('setblocking not implemented on win32') - - def isblocking(handle): - raise NotImplementedError('isblocking not implemented on win32') - -else: - from os import O_NONBLOCK - from fcntl import fcntl, F_GETFL, F_SETFL - - def isblocking(handle): # noqa - return not (fcntl(handle, F_GETFL) & O_NONBLOCK) - - def setblocking(handle, blocking): # noqa - flags = fcntl(handle, F_GETFL, 0) - fcntl( - handle, F_SETFL, - flags & (~O_NONBLOCK) if blocking else flags | O_NONBLOCK, - ) - - -E_PSUTIL_MISSING = """ -On Windows, the ability to inspect memory usage requires the psutil library. - -You can install it using pip: - - $ pip install psutil -""" - - -E_RESOURCE_MISSING = """ -Your platform ({0}) does not seem to have the `resource.getrusage' function. - -Please open an issue so that we can add support for this platform. -""" - - -if sys.platform == 'win32': - - try: - import psutil - except ImportError: # pragma: no cover - psutil = None # noqa - - def mem_rss(): - # type () -> int - if psutil is None: - raise ImportError(E_PSUTIL_MISSING.strip()) - return int(psutil.Process(os.getpid()).memory_info()[0] / 1024.0) - -else: - try: - from resource import getrusage, RUSAGE_SELF - except ImportError: # pragma: no cover - getrusage = RUSAGE_SELF = None # noqa - - if 'bsd' in sys.platform or sys.platform == 'darwin': - # On BSD platforms :man:`getrusage(2)` ru_maxrss field is in bytes. - - def maxrss_to_kb(v): - # type: (SupportsInt) -> int - return int(v) / 1024.0 - - else: - # On Linux it's kilobytes. - - def maxrss_to_kb(v): - # type: (SupportsInt) -> int - return int(v) - - def mem_rss(): - # type () -> int - if resource is None: - raise ImportError(E_RESOURCE_MISSING.strip().format(sys.platform)) - return maxrss_to_kb(getrusage(RUSAGE_SELF).ru_maxrss) diff --git a/.venv/lib/python3.10/site-packages/billiard/connection.py b/.venv/lib/python3.10/site-packages/billiard/connection.py deleted file mode 100644 index 70b8059..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/connection.py +++ /dev/null @@ -1,1034 +0,0 @@ -# -# A higher level module for using sockets (or Windows named pipes) -# -# multiprocessing/connection.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import errno -import io -import os -import sys -import socket -import select -import struct -import tempfile -import itertools - -from . import reduction -from . import util - -from . import AuthenticationError, BufferTooShort -from ._ext import _billiard -from .compat import setblocking, send_offset -from time import monotonic -from .reduction import ForkingPickler - -try: - from .compat import _winapi -except ImportError: - if sys.platform == 'win32': - raise - _winapi = None -else: - if sys.platform == 'win32': - WAIT_OBJECT_0 = _winapi.WAIT_OBJECT_0 - WAIT_ABANDONED_0 = _winapi.WAIT_ABANDONED_0 - - WAIT_TIMEOUT = _winapi.WAIT_TIMEOUT - INFINITE = _winapi.INFINITE - -__all__ = ['Client', 'Listener', 'Pipe', 'wait'] - -is_pypy = hasattr(sys, 'pypy_version_info') - -# -# -# - -BUFSIZE = 8192 -# A very generous timeout when it comes to local connections... -CONNECTION_TIMEOUT = 20. - -_mmap_counter = itertools.count() - -default_family = 'AF_INET' -families = ['AF_INET'] - -if hasattr(socket, 'AF_UNIX'): - default_family = 'AF_UNIX' - families += ['AF_UNIX'] - -if sys.platform == 'win32': - default_family = 'AF_PIPE' - families += ['AF_PIPE'] - - -def _init_timeout(timeout=CONNECTION_TIMEOUT): - return monotonic() + timeout - - -def _check_timeout(t): - return monotonic() > t - -# -# -# - - -def arbitrary_address(family): - ''' - Return an arbitrary free address for the given family - ''' - if family == 'AF_INET': - return ('localhost', 0) - elif family == 'AF_UNIX': - return tempfile.mktemp(prefix='listener-', dir=util.get_temp_dir()) - elif family == 'AF_PIPE': - return tempfile.mktemp(prefix=r'\\.\pipe\pyc-%d-%d-' % - (os.getpid(), next(_mmap_counter)), dir="") - else: - raise ValueError('unrecognized family') - - -def _validate_family(family): - ''' - Checks if the family is valid for the current environment. - ''' - if sys.platform != 'win32' and family == 'AF_PIPE': - raise ValueError('Family %s is not recognized.' % family) - - if sys.platform == 'win32' and family == 'AF_UNIX': - # double check - if not hasattr(socket, family): - raise ValueError('Family %s is not recognized.' % family) - - -def address_type(address): - ''' - Return the types of the address - - This can be 'AF_INET', 'AF_UNIX', or 'AF_PIPE' - ''' - if type(address) == tuple: - return 'AF_INET' - elif type(address) is str and address.startswith('\\\\'): - return 'AF_PIPE' - elif type(address) is str: - return 'AF_UNIX' - else: - raise ValueError('address type of %r unrecognized' % address) - -# -# Connection classes -# - - -class _SocketContainer: - - def __init__(self, sock): - self.sock = sock - - -class _ConnectionBase: - _handle = None - - def __init__(self, handle, readable=True, writable=True): - if isinstance(handle, _SocketContainer): - self._socket = handle.sock # keep ref so not collected - handle = handle.sock.fileno() - handle = handle.__index__() - if handle < 0: - raise ValueError("invalid handle") - if not readable and not writable: - raise ValueError( - "at least one of `readable` and `writable` must be True") - self._handle = handle - self._readable = readable - self._writable = writable - - # XXX should we use util.Finalize instead of a __del__? - - def __del__(self): - if self._handle is not None: - self._close() - - def _check_closed(self): - if self._handle is None: - raise OSError("handle is closed") - - def _check_readable(self): - if not self._readable: - raise OSError("connection is write-only") - - def _check_writable(self): - if not self._writable: - raise OSError("connection is read-only") - - def _bad_message_length(self): - if self._writable: - self._readable = False - else: - self.close() - raise OSError("bad message length") - - @property - def closed(self): - """True if the connection is closed""" - return self._handle is None - - @property - def readable(self): - """True if the connection is readable""" - return self._readable - - @property - def writable(self): - """True if the connection is writable""" - return self._writable - - def fileno(self): - """File descriptor or handle of the connection""" - self._check_closed() - return self._handle - - def close(self): - """Close the connection""" - if self._handle is not None: - try: - self._close() - finally: - self._handle = None - - def send_bytes(self, buf, offset=0, size=None): - """Send the bytes data from a bytes-like object""" - self._check_closed() - self._check_writable() - m = memoryview(buf) - # HACK for byte-indexing of non-bytewise buffers (e.g. array.array) - if m.itemsize > 1: - m = memoryview(bytes(m)) - n = len(m) - if offset < 0: - raise ValueError("offset is negative") - if n < offset: - raise ValueError("buffer length < offset") - if size is None: - size = n - offset - elif size < 0: - raise ValueError("size is negative") - elif offset + size > n: - raise ValueError("buffer length < offset + size") - self._send_bytes(m[offset:offset + size]) - - def send(self, obj): - """Send a (picklable) object""" - self._check_closed() - self._check_writable() - self._send_bytes(ForkingPickler.dumps(obj)) - - def recv_bytes(self, maxlength=None): - """ - Receive bytes data as a bytes object. - """ - self._check_closed() - self._check_readable() - if maxlength is not None and maxlength < 0: - raise ValueError("negative maxlength") - buf = self._recv_bytes(maxlength) - if buf is None: - self._bad_message_length() - return buf.getvalue() - - def recv_bytes_into(self, buf, offset=0): - """ - Receive bytes data into a writeable bytes-like object. - Return the number of bytes read. - """ - self._check_closed() - self._check_readable() - with memoryview(buf) as m: - # Get bytesize of arbitrary buffer - itemsize = m.itemsize - bytesize = itemsize * len(m) - if offset < 0: - raise ValueError("negative offset") - elif offset > bytesize: - raise ValueError("offset too large") - result = self._recv_bytes() - size = result.tell() - if bytesize < offset + size: - raise BufferTooShort(result.getvalue()) - # Message can fit in dest - result.seek(0) - result.readinto(m[ - offset // itemsize:(offset + size) // itemsize - ]) - return size - - def recv(self): - """Receive a (picklable) object""" - self._check_closed() - self._check_readable() - buf = self._recv_bytes() - return ForkingPickler.loadbuf(buf) - - def poll(self, timeout=0.0): - """Whether there is any input available to be read""" - self._check_closed() - self._check_readable() - return self._poll(timeout) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_tb): - self.close() - - def send_offset(self, buf, offset): - return send_offset(self.fileno(), buf, offset) - - def setblocking(self, blocking): - setblocking(self.fileno(), blocking) - - -if _winapi: - - class PipeConnection(_ConnectionBase): - """ - Connection class based on a Windows named pipe. - Overlapped I/O is used, so the handles must have been created - with FILE_FLAG_OVERLAPPED. - """ - _got_empty_message = False - - def _close(self, _CloseHandle=_winapi.CloseHandle): - _CloseHandle(self._handle) - - def _send_bytes(self, buf): - ov, err = _winapi.WriteFile(self._handle, buf, overlapped=True) - try: - if err == _winapi.ERROR_IO_PENDING: - waitres = _winapi.WaitForMultipleObjects( - - [ov.event], False, INFINITE) - assert waitres == WAIT_OBJECT_0 - except: - ov.cancel() - raise - finally: - nwritten, err = ov.GetOverlappedResult(True) - assert err == 0 - assert nwritten == len(buf) - - def _recv_bytes(self, maxsize=None): - if self._got_empty_message: - self._got_empty_message = False - return io.BytesIO() - else: - bsize = 128 if maxsize is None else min(maxsize, 128) - try: - ov, err = _winapi.ReadFile( - self._handle, bsize, overlapped=True, - ) - try: - if err == _winapi.ERROR_IO_PENDING: - waitres = _winapi.WaitForMultipleObjects( - [ov.event], False, INFINITE) - assert waitres == WAIT_OBJECT_0 - except: - ov.cancel() - raise - finally: - nread, err = ov.GetOverlappedResult(True) - if err == 0: - f = io.BytesIO() - f.write(ov.getbuffer()) - return f - elif err == _winapi.ERROR_MORE_DATA: - return self._get_more_data(ov, maxsize) - except OSError as e: - if e.winerror == _winapi.ERROR_BROKEN_PIPE: - raise EOFError - else: - raise - raise RuntimeError( - "shouldn't get here; expected KeyboardInterrupt") - - def _poll(self, timeout): - if (self._got_empty_message or - _winapi.PeekNamedPipe(self._handle)[0] != 0): - return True - return bool(wait([self], timeout)) - - def _get_more_data(self, ov, maxsize): - buf = ov.getbuffer() - f = io.BytesIO() - f.write(buf) - left = _winapi.PeekNamedPipe(self._handle)[1] - assert left > 0 - if maxsize is not None and len(buf) + left > maxsize: - self._bad_message_length() - ov, err = _winapi.ReadFile(self._handle, left, overlapped=True) - rbytes, err = ov.GetOverlappedResult(True) - assert err == 0 - assert rbytes == left - f.write(ov.getbuffer()) - return f - - -class Connection(_ConnectionBase): - """ - Connection class based on an arbitrary file descriptor (Unix only), or - a socket handle (Windows). - """ - - if _winapi: - def _close(self, _close=_billiard.closesocket): - _close(self._handle) - _write = _billiard.send - _read = _billiard.recv - else: - def _close(self, _close=os.close): - _close(self._handle) - _write = os.write - _read = os.read - - def _send(self, buf, write=_write): - remaining = len(buf) - while True: - try: - n = write(self._handle, buf) - except (OSError, IOError, socket.error) as exc: - if getattr(exc, 'errno', None) != errno.EINTR: - raise - else: - remaining -= n - if remaining == 0: - break - buf = buf[n:] - - def _recv(self, size, read=_read): - buf = io.BytesIO() - handle = self._handle - remaining = size - while remaining > 0: - try: - chunk = read(handle, remaining) - except (OSError, IOError, socket.error) as exc: - if getattr(exc, 'errno', None) != errno.EINTR: - raise - else: - n = len(chunk) - if n == 0: - if remaining == size: - raise EOFError - else: - raise OSError("got end of file during message") - buf.write(chunk) - remaining -= n - return buf - - def _send_bytes(self, buf, memoryview=memoryview): - n = len(buf) - # For wire compatibility with 3.2 and lower - header = struct.pack("!i", n) - if n > 16384: - # The payload is large so Nagle's algorithm won't be triggered - # and we'd better avoid the cost of concatenation. - self._send(header) - self._send(buf) - else: - # Issue #20540: concatenate before sending, to avoid delays due - # to Nagle's algorithm on a TCP socket. - # Also note we want to avoid sending a 0-length buffer separately, - # to avoid "broken pipe" errors if the other end closed the pipe. - if isinstance(buf, memoryview): - buf = buf.tobytes() - self._send(header + buf) - - def _recv_bytes(self, maxsize=None): - buf = self._recv(4) - size, = struct.unpack("!i", buf.getvalue()) - if maxsize is not None and size > maxsize: - return None - return self._recv(size) - - def _poll(self, timeout): - r = wait([self], timeout) - return bool(r) - - -# -# Public functions -# - -class Listener: - ''' - Returns a listener object. - - This is a wrapper for a bound socket which is 'listening' for - connections, or for a Windows named pipe. - ''' - def __init__(self, address=None, family=None, backlog=1, authkey=None): - family = (family or - (address and address_type(address)) or default_family) - address = address or arbitrary_address(family) - - _validate_family(family) - if family == 'AF_PIPE': - self._listener = PipeListener(address, backlog) - else: - self._listener = SocketListener(address, family, backlog) - - if authkey is not None and not isinstance(authkey, bytes): - raise TypeError('authkey should be a byte string') - - self._authkey = authkey - - def accept(self): - ''' - Accept a connection on the bound socket or named pipe of `self`. - - Returns a `Connection` object. - ''' - if self._listener is None: - raise OSError('listener is closed') - c = self._listener.accept() - if self._authkey: - deliver_challenge(c, self._authkey) - answer_challenge(c, self._authkey) - return c - - def close(self): - ''' - Close the bound socket or named pipe of `self`. - ''' - listener = self._listener - if listener is not None: - self._listener = None - listener.close() - - address = property(lambda self: self._listener._address) - last_accepted = property(lambda self: self._listener._last_accepted) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, exc_tb): - self.close() - - -def Client(address, family=None, authkey=None): - ''' - Returns a connection to the address of a `Listener` - ''' - family = family or address_type(address) - _validate_family(family) - if family == 'AF_PIPE': - c = PipeClient(address) - else: - c = SocketClient(address) - - if authkey is not None and not isinstance(authkey, bytes): - raise TypeError('authkey should be a byte string') - - if authkey is not None: - answer_challenge(c, authkey) - deliver_challenge(c, authkey) - - return c - - -def detach(sock): - if hasattr(sock, 'detach'): - return sock.detach() - # older socket lib does not have detach. We'll keep a reference around - # so that it does not get garbage collected. - return _SocketContainer(sock) - - -if sys.platform != 'win32': - - def Pipe(duplex=True, rnonblock=False, wnonblock=False): - ''' - Returns pair of connection objects at either end of a pipe - ''' - if duplex: - s1, s2 = socket.socketpair() - s1.setblocking(not rnonblock) - s2.setblocking(not wnonblock) - c1 = Connection(detach(s1)) - c2 = Connection(detach(s2)) - else: - fd1, fd2 = os.pipe() - if rnonblock: - setblocking(fd1, 0) - if wnonblock: - setblocking(fd2, 0) - c1 = Connection(fd1, writable=False) - c2 = Connection(fd2, readable=False) - - return c1, c2 - -else: - - def Pipe(duplex=True, rnonblock=False, wnonblock=False): - ''' - Returns pair of connection objects at either end of a pipe - ''' - assert not rnonblock, 'rnonblock not supported on windows' - assert not wnonblock, 'wnonblock not supported on windows' - address = arbitrary_address('AF_PIPE') - if duplex: - openmode = _winapi.PIPE_ACCESS_DUPLEX - access = _winapi.GENERIC_READ | _winapi.GENERIC_WRITE - obsize, ibsize = BUFSIZE, BUFSIZE - else: - openmode = _winapi.PIPE_ACCESS_INBOUND - access = _winapi.GENERIC_WRITE - obsize, ibsize = 0, BUFSIZE - - h1 = _winapi.CreateNamedPipe( - address, openmode | _winapi.FILE_FLAG_OVERLAPPED | - _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE, - _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | - _winapi.PIPE_WAIT, - 1, obsize, ibsize, _winapi.NMPWAIT_WAIT_FOREVER, - # default security descriptor: the handle cannot be inherited - _winapi.NULL - ) - h2 = _winapi.CreateFile( - address, access, 0, _winapi.NULL, _winapi.OPEN_EXISTING, - _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL - ) - _winapi.SetNamedPipeHandleState( - h2, _winapi.PIPE_READMODE_MESSAGE, None, None - ) - - overlapped = _winapi.ConnectNamedPipe(h1, overlapped=True) - _, err = overlapped.GetOverlappedResult(True) - assert err == 0 - - c1 = PipeConnection(h1, writable=duplex) - c2 = PipeConnection(h2, readable=duplex) - - return c1, c2 - -# -# Definitions for connections based on sockets -# - - -class SocketListener: - ''' - Representation of a socket which is bound to an address and listening - ''' - def __init__(self, address, family, backlog=1): - self._socket = socket.socket(getattr(socket, family)) - try: - # SO_REUSEADDR has different semantics on Windows (issue #2550). - if os.name == 'posix': - self._socket.setsockopt(socket.SOL_SOCKET, - socket.SO_REUSEADDR, 1) - self._socket.setblocking(True) - self._socket.bind(address) - self._socket.listen(backlog) - self._address = self._socket.getsockname() - except OSError: - self._socket.close() - raise - self._family = family - self._last_accepted = None - - if family == 'AF_UNIX': - self._unlink = util.Finalize( - self, os.unlink, args=(address,), exitpriority=0 - ) - else: - self._unlink = None - - def accept(self): - while True: - try: - s, self._last_accepted = self._socket.accept() - except (OSError, IOError, socket.error) as exc: - if getattr(exc, 'errno', None) != errno.EINTR: - raise - else: - break - s.setblocking(True) - return Connection(detach(s)) - - def close(self): - try: - self._socket.close() - finally: - unlink = self._unlink - if unlink is not None: - self._unlink = None - unlink() - - -def SocketClient(address): - ''' - Return a connection object connected to the socket given by `address` - ''' - family = address_type(address) - s = socket.socket(getattr(socket, family)) - s.setblocking(True) - s.connect(address) - return Connection(detach(s)) - -# -# Definitions for connections based on named pipes -# - -if sys.platform == 'win32': - - class PipeListener: - ''' - Representation of a named pipe - ''' - def __init__(self, address, backlog=None): - self._address = address - self._handle_queue = [self._new_handle(first=True)] - - self._last_accepted = None - util.sub_debug('listener created with address=%r', self._address) - self.close = util.Finalize( - self, PipeListener._finalize_pipe_listener, - args=(self._handle_queue, self._address), exitpriority=0 - ) - - def _new_handle(self, first=False): - flags = _winapi.PIPE_ACCESS_DUPLEX | _winapi.FILE_FLAG_OVERLAPPED - if first: - flags |= _winapi.FILE_FLAG_FIRST_PIPE_INSTANCE - return _winapi.CreateNamedPipe( - self._address, flags, - _winapi.PIPE_TYPE_MESSAGE | _winapi.PIPE_READMODE_MESSAGE | - _winapi.PIPE_WAIT, - _winapi.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, - _winapi.NMPWAIT_WAIT_FOREVER, _winapi.NULL - ) - - def accept(self): - self._handle_queue.append(self._new_handle()) - handle = self._handle_queue.pop(0) - try: - ov = _winapi.ConnectNamedPipe(handle, overlapped=True) - except OSError as e: - if e.winerror != _winapi.ERROR_NO_DATA: - raise - # ERROR_NO_DATA can occur if a client has already connected, - # written data and then disconnected -- see Issue 14725. - else: - try: - _winapi.WaitForMultipleObjects( - [ov.event], False, INFINITE) - except: - ov.cancel() - _winapi.CloseHandle(handle) - raise - finally: - _, err = ov.GetOverlappedResult(True) - assert err == 0 - return PipeConnection(handle) - - @staticmethod - def _finalize_pipe_listener(queue, address): - util.sub_debug('closing listener with address=%r', address) - for handle in queue: - _winapi.CloseHandle(handle) - - def PipeClient(address, _ignore=(_winapi.ERROR_SEM_TIMEOUT, - _winapi.ERROR_PIPE_BUSY)): - ''' - Return a connection object connected to the pipe given by `address` - ''' - t = _init_timeout() - while 1: - try: - _winapi.WaitNamedPipe(address, 1000) - h = _winapi.CreateFile( - address, _winapi.GENERIC_READ | _winapi.GENERIC_WRITE, - 0, _winapi.NULL, _winapi.OPEN_EXISTING, - _winapi.FILE_FLAG_OVERLAPPED, _winapi.NULL - ) - except OSError as e: - if e.winerror not in _ignore or _check_timeout(t): - raise - else: - break - else: - raise - - _winapi.SetNamedPipeHandleState( - h, _winapi.PIPE_READMODE_MESSAGE, None, None - ) - return PipeConnection(h) - -# -# Authentication stuff -# - -MESSAGE_LENGTH = 20 - -CHALLENGE = b'#CHALLENGE#' -WELCOME = b'#WELCOME#' -FAILURE = b'#FAILURE#' - - -def deliver_challenge(connection, authkey): - import hmac - assert isinstance(authkey, bytes) - message = os.urandom(MESSAGE_LENGTH) - connection.send_bytes(CHALLENGE + message) - digest = hmac.new(authkey, message, 'md5').digest() - response = connection.recv_bytes(256) # reject large message - if response == digest: - connection.send_bytes(WELCOME) - else: - connection.send_bytes(FAILURE) - raise AuthenticationError('digest received was wrong') - - -def answer_challenge(connection, authkey): - import hmac - assert isinstance(authkey, bytes) - message = connection.recv_bytes(256) # reject large message - assert message[:len(CHALLENGE)] == CHALLENGE, 'message = %r' % message - message = message[len(CHALLENGE):] - digest = hmac.new(authkey, message, 'md5').digest() - connection.send_bytes(digest) - response = connection.recv_bytes(256) # reject large message - if response != WELCOME: - raise AuthenticationError('digest sent was rejected') - -# -# Support for using xmlrpclib for serialization -# - - -class ConnectionWrapper: - - def __init__(self, conn, dumps, loads): - self._conn = conn - self._dumps = dumps - self._loads = loads - for attr in ('fileno', 'close', 'poll', 'recv_bytes', 'send_bytes'): - obj = getattr(conn, attr) - setattr(self, attr, obj) - - def send(self, obj): - s = self._dumps(obj) - self._conn.send_bytes(s) - - def recv(self): - s = self._conn.recv_bytes() - return self._loads(s) - - -def _xml_dumps(obj): - o = xmlrpclib.dumps((obj, ), None, None, None, 1) # noqa - return o.encode('utf-8') - - -def _xml_loads(s): - (obj,), method = xmlrpclib.loads(s.decode('utf-8')) # noqa - return obj - - -class XmlListener(Listener): - - def accept(self): - global xmlrpclib - import xmlrpc.client as xmlrpclib # noqa - obj = Listener.accept(self) - return ConnectionWrapper(obj, _xml_dumps, _xml_loads) - - -def XmlClient(*args, **kwds): - global xmlrpclib - import xmlrpc.client as xmlrpclib # noqa - return ConnectionWrapper(Client(*args, **kwds), _xml_dumps, _xml_loads) - -# -# Wait -# - -if sys.platform == 'win32': - - def _exhaustive_wait(handles, timeout): - # Return ALL handles which are currently signaled. (Only - # returning the first signaled might create starvation issues.) - L = list(handles) - ready = [] - while L: - res = _winapi.WaitForMultipleObjects(L, False, timeout) - if res == WAIT_TIMEOUT: - break - elif WAIT_OBJECT_0 <= res < WAIT_OBJECT_0 + len(L): - res -= WAIT_OBJECT_0 - elif WAIT_ABANDONED_0 <= res < WAIT_ABANDONED_0 + len(L): - res -= WAIT_ABANDONED_0 - else: - raise RuntimeError('Should not get here') - ready.append(L[res]) - L = L[res + 1:] - timeout = 0 - return ready - - _ready_errors = {_winapi.ERROR_BROKEN_PIPE, _winapi.ERROR_NETNAME_DELETED} - - def wait(object_list, timeout=None): - ''' - Wait till an object in object_list is ready/readable. - - Returns list of those objects in object_list which are ready/readable. - ''' - if timeout is None: - timeout = INFINITE - elif timeout < 0: - timeout = 0 - else: - timeout = int(timeout * 1000 + 0.5) - - object_list = list(object_list) - waithandle_to_obj = {} - ov_list = [] - ready_objects = set() - ready_handles = set() - - try: - for o in object_list: - try: - fileno = getattr(o, 'fileno') - except AttributeError: - waithandle_to_obj[o.__index__()] = o - else: - # start an overlapped read of length zero - try: - ov, err = _winapi.ReadFile(fileno(), 0, True) - except OSError as e: - err = e.winerror - if err not in _ready_errors: - raise - if err == _winapi.ERROR_IO_PENDING: - ov_list.append(ov) - waithandle_to_obj[ov.event] = o - else: - # If o.fileno() is an overlapped pipe handle and - # err == 0 then there is a zero length message - # in the pipe, but it HAS NOT been consumed. - ready_objects.add(o) - timeout = 0 - - ready_handles = _exhaustive_wait(waithandle_to_obj.keys(), timeout) - finally: - # request that overlapped reads stop - for ov in ov_list: - ov.cancel() - - # wait for all overlapped reads to stop - for ov in ov_list: - try: - _, err = ov.GetOverlappedResult(True) - except OSError as e: - err = e.winerror - if err not in _ready_errors: - raise - if err != _winapi.ERROR_OPERATION_ABORTED: - o = waithandle_to_obj[ov.event] - ready_objects.add(o) - if err == 0: - # If o.fileno() is an overlapped pipe handle then - # a zero length message HAS been consumed. - if hasattr(o, '_got_empty_message'): - o._got_empty_message = True - - ready_objects.update(waithandle_to_obj[h] for h in ready_handles) - return [p for p in object_list if p in ready_objects] - -else: - - if hasattr(select, 'poll'): - def _poll(fds, timeout): - if timeout is not None: - timeout = int(timeout * 1000) # timeout is in milliseconds - fd_map = {} - pollster = select.poll() - for fd in fds: - pollster.register(fd, select.POLLIN) - if hasattr(fd, 'fileno'): - fd_map[fd.fileno()] = fd - else: - fd_map[fd] = fd - ls = [] - for fd, event in pollster.poll(timeout): - if event & select.POLLNVAL: - raise ValueError('invalid file descriptor %i' % fd) - ls.append(fd_map[fd]) - return ls - else: - def _poll(fds, timeout): # noqa - return select.select(fds, [], [], timeout)[0] - - def wait(object_list, timeout=None): # noqa - ''' - Wait till an object in object_list is ready/readable. - - Returns list of those objects in object_list which are ready/readable. - ''' - if timeout is not None: - if timeout <= 0: - return _poll(object_list, 0) - else: - deadline = monotonic() + timeout - while True: - try: - return _poll(object_list, timeout) - except (OSError, IOError, socket.error) as e: - if e.errno != errno.EINTR: - raise - if timeout is not None: - timeout = deadline - monotonic() - -# -# Make connection and socket objects shareable if possible -# - -if sys.platform == 'win32': - def reduce_connection(conn): - handle = conn.fileno() - with socket.fromfd(handle, socket.AF_INET, socket.SOCK_STREAM) as s: - from . import resource_sharer - ds = resource_sharer.DupSocket(s) - return rebuild_connection, (ds, conn.readable, conn.writable) - - def rebuild_connection(ds, readable, writable): - sock = ds.detach() - return Connection(detach(sock), readable, writable) - reduction.register(Connection, reduce_connection) - - def reduce_pipe_connection(conn): - access = ((_winapi.FILE_GENERIC_READ if conn.readable else 0) | - (_winapi.FILE_GENERIC_WRITE if conn.writable else 0)) - dh = reduction.DupHandle(conn.fileno(), access) - return rebuild_pipe_connection, (dh, conn.readable, conn.writable) - - def rebuild_pipe_connection(dh, readable, writable): - return PipeConnection(detach(dh), readable, writable) - reduction.register(PipeConnection, reduce_pipe_connection) - -else: - def reduce_connection(conn): - df = reduction.DupFd(conn.fileno()) - return rebuild_connection, (df, conn.readable, conn.writable) - - def rebuild_connection(df, readable, writable): - return Connection(detach(df), readable, writable) - reduction.register(Connection, reduce_connection) diff --git a/.venv/lib/python3.10/site-packages/billiard/context.py b/.venv/lib/python3.10/site-packages/billiard/context.py deleted file mode 100644 index 5bbc835..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/context.py +++ /dev/null @@ -1,420 +0,0 @@ -import os -import sys -import threading -import warnings - -from . import process - -__all__ = [] # things are copied from here to __init__.py - - -W_NO_EXECV = """\ -force_execv is not supported as the billiard C extension \ -is not installed\ -""" - - -# -# Exceptions -# - -from .exceptions import ( # noqa - ProcessError, - BufferTooShort, - TimeoutError, - AuthenticationError, - TimeLimitExceeded, - SoftTimeLimitExceeded, - WorkerLostError, -) - - -# -# Base type for contexts -# - -class BaseContext: - - ProcessError = ProcessError - BufferTooShort = BufferTooShort - TimeoutError = TimeoutError - AuthenticationError = AuthenticationError - TimeLimitExceeded = TimeLimitExceeded - SoftTimeLimitExceeded = SoftTimeLimitExceeded - WorkerLostError = WorkerLostError - - current_process = staticmethod(process.current_process) - active_children = staticmethod(process.active_children) - - if hasattr(os, 'cpu_count'): - def cpu_count(self): - '''Returns the number of CPUs in the system''' - num = os.cpu_count() - if num is None: - raise NotImplementedError('cannot determine number of cpus') - else: - return num - else: - def cpu_count(self): # noqa - if sys.platform == 'win32': - try: - num = int(os.environ['NUMBER_OF_PROCESSORS']) - except (ValueError, KeyError): - num = 0 - elif 'bsd' in sys.platform or sys.platform == 'darwin': - comm = '/sbin/sysctl -n hw.ncpu' - if sys.platform == 'darwin': - comm = '/usr' + comm - try: - with os.popen(comm) as p: - num = int(p.read()) - except ValueError: - num = 0 - else: - try: - num = os.sysconf('SC_NPROCESSORS_ONLN') - except (ValueError, OSError, AttributeError): - num = 0 - - if num >= 1: - return num - else: - raise NotImplementedError('cannot determine number of cpus') - - def Manager(self): - '''Returns a manager associated with a running server process - - The managers methods such as `Lock()`, `Condition()` and `Queue()` - can be used to create shared objects. - ''' - from .managers import SyncManager - m = SyncManager(ctx=self.get_context()) - m.start() - return m - - def Pipe(self, duplex=True, rnonblock=False, wnonblock=False): - '''Returns two connection object connected by a pipe''' - from .connection import Pipe - return Pipe(duplex, rnonblock, wnonblock) - - def Lock(self): - '''Returns a non-recursive lock object''' - from .synchronize import Lock - return Lock(ctx=self.get_context()) - - def RLock(self): - '''Returns a recursive lock object''' - from .synchronize import RLock - return RLock(ctx=self.get_context()) - - def Condition(self, lock=None): - '''Returns a condition object''' - from .synchronize import Condition - return Condition(lock, ctx=self.get_context()) - - def Semaphore(self, value=1): - '''Returns a semaphore object''' - from .synchronize import Semaphore - return Semaphore(value, ctx=self.get_context()) - - def BoundedSemaphore(self, value=1): - '''Returns a bounded semaphore object''' - from .synchronize import BoundedSemaphore - return BoundedSemaphore(value, ctx=self.get_context()) - - def Event(self): - '''Returns an event object''' - from .synchronize import Event - return Event(ctx=self.get_context()) - - def Barrier(self, parties, action=None, timeout=None): - '''Returns a barrier object''' - from .synchronize import Barrier - return Barrier(parties, action, timeout, ctx=self.get_context()) - - def Queue(self, maxsize=0): - '''Returns a queue object''' - from .queues import Queue - return Queue(maxsize, ctx=self.get_context()) - - def JoinableQueue(self, maxsize=0): - '''Returns a queue object''' - from .queues import JoinableQueue - return JoinableQueue(maxsize, ctx=self.get_context()) - - def SimpleQueue(self): - '''Returns a queue object''' - from .queues import SimpleQueue - return SimpleQueue(ctx=self.get_context()) - - def Pool(self, processes=None, initializer=None, initargs=(), - maxtasksperchild=None, timeout=None, soft_timeout=None, - lost_worker_timeout=None, max_restarts=None, - max_restart_freq=1, on_process_up=None, on_process_down=None, - on_timeout_set=None, on_timeout_cancel=None, threads=True, - semaphore=None, putlocks=False, allow_restart=False): - '''Returns a process pool object''' - from .pool import Pool - return Pool(processes, initializer, initargs, maxtasksperchild, - timeout, soft_timeout, lost_worker_timeout, - max_restarts, max_restart_freq, on_process_up, - on_process_down, on_timeout_set, on_timeout_cancel, - threads, semaphore, putlocks, allow_restart, - context=self.get_context()) - - def RawValue(self, typecode_or_type, *args): - '''Returns a shared object''' - from .sharedctypes import RawValue - return RawValue(typecode_or_type, *args) - - def RawArray(self, typecode_or_type, size_or_initializer): - '''Returns a shared array''' - from .sharedctypes import RawArray - return RawArray(typecode_or_type, size_or_initializer) - - def Value(self, typecode_or_type, *args, **kwargs): - '''Returns a synchronized shared object''' - from .sharedctypes import Value - lock = kwargs.get('lock', True) - return Value(typecode_or_type, *args, lock=lock, - ctx=self.get_context()) - - def Array(self, typecode_or_type, size_or_initializer, *args, **kwargs): - '''Returns a synchronized shared array''' - from .sharedctypes import Array - lock = kwargs.get('lock', True) - return Array(typecode_or_type, size_or_initializer, lock=lock, - ctx=self.get_context()) - - def freeze_support(self): - '''Check whether this is a fake forked process in a frozen executable. - If so then run code specified by commandline and exit. - ''' - if sys.platform == 'win32' and getattr(sys, 'frozen', False): - from .spawn import freeze_support - freeze_support() - - def get_logger(self): - '''Return package logger -- if it does not already exist then - it is created. - ''' - from .util import get_logger - return get_logger() - - def log_to_stderr(self, level=None): - '''Turn on logging and add a handler which prints to stderr''' - from .util import log_to_stderr - return log_to_stderr(level) - - def allow_connection_pickling(self): - '''Install support for sending connections and sockets - between processes - ''' - # This is undocumented. In previous versions of multiprocessing - # its only effect was to make socket objects inheritable on Windows. - from . import connection # noqa - - def set_executable(self, executable): - '''Sets the path to a python.exe or pythonw.exe binary used to run - child processes instead of sys.executable when using the 'spawn' - start method. Useful for people embedding Python. - ''' - from .spawn import set_executable - set_executable(executable) - - def set_forkserver_preload(self, module_names): - '''Set list of module names to try to load in forkserver process. - This is really just a hint. - ''' - from .forkserver import set_forkserver_preload - set_forkserver_preload(module_names) - - def get_context(self, method=None): - if method is None: - return self - try: - ctx = _concrete_contexts[method] - except KeyError: - raise ValueError('cannot find context for %r' % method) - ctx._check_available() - return ctx - - def get_start_method(self, allow_none=False): - return self._name - - def set_start_method(self, method=None): - raise ValueError('cannot set start method of concrete context') - - def forking_is_enabled(self): - # XXX for compatibility with billiard <3.4 - return (self.get_start_method() or 'fork') == 'fork' - - def forking_enable(self, value): - # XXX for compatibility with billiard <3.4 - if not value: - from ._ext import supports_exec - if supports_exec: - self.set_start_method('spawn', force=True) - else: - warnings.warn(RuntimeWarning(W_NO_EXECV)) - - def _check_available(self): - pass - -# -# Type of default context -- underlying context can be set at most once -# - - -class Process(process.BaseProcess): - _start_method = None - - @staticmethod - def _Popen(process_obj): - return _default_context.get_context().Process._Popen(process_obj) - - -class DefaultContext(BaseContext): - Process = Process - - def __init__(self, context): - self._default_context = context - self._actual_context = None - - def get_context(self, method=None): - if method is None: - if self._actual_context is None: - self._actual_context = self._default_context - return self._actual_context - else: - return super(DefaultContext, self).get_context(method) - - def set_start_method(self, method, force=False): - if self._actual_context is not None and not force: - raise RuntimeError('context has already been set') - if method is None and force: - self._actual_context = None - return - self._actual_context = self.get_context(method) - - def get_start_method(self, allow_none=False): - if self._actual_context is None: - if allow_none: - return None - self._actual_context = self._default_context - return self._actual_context._name - - def get_all_start_methods(self): - if sys.platform == 'win32': - return ['spawn'] - else: - from . import reduction - if reduction.HAVE_SEND_HANDLE: - return ['fork', 'spawn', 'forkserver'] - else: - return ['fork', 'spawn'] - -DefaultContext.__all__ = list(x for x in dir(DefaultContext) if x[0] != '_') - -# -# Context types for fixed start method -# - -if sys.platform != 'win32': - - class ForkProcess(process.BaseProcess): - _start_method = 'fork' - - @staticmethod - def _Popen(process_obj): - from .popen_fork import Popen - return Popen(process_obj) - - class SpawnProcess(process.BaseProcess): - _start_method = 'spawn' - - @staticmethod - def _Popen(process_obj): - from .popen_spawn_posix import Popen - return Popen(process_obj) - - class ForkServerProcess(process.BaseProcess): - _start_method = 'forkserver' - - @staticmethod - def _Popen(process_obj): - from .popen_forkserver import Popen - return Popen(process_obj) - - class ForkContext(BaseContext): - _name = 'fork' - Process = ForkProcess - - class SpawnContext(BaseContext): - _name = 'spawn' - Process = SpawnProcess - - class ForkServerContext(BaseContext): - _name = 'forkserver' - Process = ForkServerProcess - - def _check_available(self): - from . import reduction - if not reduction.HAVE_SEND_HANDLE: - raise ValueError('forkserver start method not available') - - _concrete_contexts = { - 'fork': ForkContext(), - 'spawn': SpawnContext(), - 'forkserver': ForkServerContext(), - } - _default_context = DefaultContext(_concrete_contexts['fork']) - -else: - - class SpawnProcess(process.BaseProcess): - _start_method = 'spawn' - - @staticmethod - def _Popen(process_obj): - from .popen_spawn_win32 import Popen - return Popen(process_obj) - - class SpawnContext(BaseContext): - _name = 'spawn' - Process = SpawnProcess - - _concrete_contexts = { - 'spawn': SpawnContext(), - } - _default_context = DefaultContext(_concrete_contexts['spawn']) - -# -# Force the start method -# - - -def _force_start_method(method): - _default_context._actual_context = _concrete_contexts[method] - -# -# Check that the current thread is spawning a child process -# - -_tls = threading.local() - - -def get_spawning_popen(): - return getattr(_tls, 'spawning_popen', None) - - -def set_spawning_popen(popen): - _tls.spawning_popen = popen - - -def assert_spawning(obj): - if get_spawning_popen() is None: - raise RuntimeError( - '%s objects should only be shared between processes' - ' through inheritance' % type(obj).__name__ - ) diff --git a/.venv/lib/python3.10/site-packages/billiard/dummy/__init__.py b/.venv/lib/python3.10/site-packages/billiard/dummy/__init__.py deleted file mode 100644 index 1ba3e90..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/dummy/__init__.py +++ /dev/null @@ -1,166 +0,0 @@ -# -# Support for the API of the multiprocessing package using threads -# -# multiprocessing/dummy/__init__.py -# -# Copyright (c) 2006-2008, R Oudkerk -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of author nor the names of any contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# - -# -# Imports -# - -import threading -import sys -import weakref -import array - -from threading import Lock, RLock, Semaphore, BoundedSemaphore -from threading import Event - -from queue import Queue - -from billiard.connection import Pipe - -__all__ = [ - 'Process', 'current_process', 'active_children', 'freeze_support', - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', - 'Event', 'Queue', 'Manager', 'Pipe', 'Pool', 'JoinableQueue' -] - - -class DummyProcess(threading.Thread): - - def __init__(self, group=None, target=None, name=None, args=(), kwargs={}): - threading.Thread.__init__(self, group, target, name, args, kwargs) - self._pid = None - self._children = weakref.WeakKeyDictionary() - self._start_called = False - self._parent = current_process() - - def start(self): - assert self._parent is current_process() - self._start_called = True - if hasattr(self._parent, '_children'): - self._parent._children[self] = None - threading.Thread.start(self) - - @property - def exitcode(self): - if self._start_called and not self.is_alive(): - return 0 - else: - return None - - -try: - _Condition = threading._Condition -except AttributeError: # Py3 - _Condition = threading.Condition # noqa - - -class Condition(_Condition): - if sys.version_info[0] == 3: - notify_all = _Condition.notifyAll - else: - notify_all = _Condition.notifyAll.__func__ - - -Process = DummyProcess -current_process = threading.current_thread -current_process()._children = weakref.WeakKeyDictionary() - - -def active_children(): - children = current_process()._children - for p in list(children): - if not p.is_alive(): - children.pop(p, None) - return list(children) - - -def freeze_support(): - pass - - -class Namespace(object): - - def __init__(self, **kwds): - self.__dict__.update(kwds) - - def __repr__(self): - items = list(self.__dict__.items()) - temp = [] - for name, value in items: - if not name.startswith('_'): - temp.append('%s=%r' % (name, value)) - temp.sort() - return '%s(%s)' % (self.__class__.__name__, str.join(', ', temp)) - - -dict = dict -list = list - - -def Array(typecode, sequence, lock=True): - return array.array(typecode, sequence) - - -class Value(object): - - def __init__(self, typecode, value, lock=True): - self._typecode = typecode - self._value = value - - def _get(self): - return self._value - - def _set(self, value): - self._value = value - value = property(_get, _set) - - def __repr__(self): - return '<%r(%r, %r)>' % (type(self).__name__, - self._typecode, self._value) - - -def Manager(): - return sys.modules[__name__] - - -def shutdown(): - pass - - -def Pool(processes=None, initializer=None, initargs=()): - from billiard.pool import ThreadPool - return ThreadPool(processes, initializer, initargs) - - -JoinableQueue = Queue diff --git a/.venv/lib/python3.10/site-packages/billiard/dummy/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/billiard/dummy/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index e6bf43ea3743a67061903f25933c1a24dab8a82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4113 zcmaJ^&2!tv72m}dL5h-S*|MeBj$PME&DJs7riXsGuG2V8>o}|vYmx?&4hnNu5-5;> z7ob&gsF_abnNAO#=^>XMIz#nT|4V!ADQDk$Nq=u4(xU7Xn0A8X1^8&9|2`ZfC z+o1b_Z*V86_G&@R;BK(?D7 z&kP@MMlYyqLF04Q=LZa{s-lKfHQB(LHMts`#rU~kU0T!gM@+6ySa?A!iTX1ZY=~vC zg6}3)t%?R#HRKyubx~dlF3HQmWpP=oiL=jm@Fr%Q6YH3ii3n}K5CfDx! zPi4O#KYE-VG9R>v4tx+Rs^s zZZvxcr|Z0jmj4)_U|l}7#%#>T*4Q39WB14-8yd6FE}W@*L>RUPtQ7u)dR4)o5v%>H zW=&U%JtZR%_jk3oZBXrpVcd_4Fw{<%#X?sOWVEm3jz04lkPqeXUJMDR{YVXU^`)4X z!@P)85q6>^kwTFJ=}MSIq@1Rwom?h6+TB&@Ak!XZ?#e*Jwv=!VG~_g6H8qnMRZx$8RN{t?RwM7m>qFa5L95dx78-LY5M9SK1OEh z4Pd&m7v)h=C^M|i(%?CwyGF*(xw=H8xv11N>RtyhS0m0EhO0Vn@X^`=XJ&_2*dnJe zYtI9rE34|5P5BYat7MkP7NbZ4O{=`4ALn6|z}3_isHZNYefh_@=%hm4$6!uoyJ9)q zu};Z(Hmg}7yCZXe-POXdmx@6`cs&fC45FkQG0HQ1Y9IcdNmUHhcNR}KLNW38NEa zF{1g(2G(v?)eWLF349ko+xalpbx10Q-@v!*z}aq)2<2H3u4saiu$i?N@I7?a&nuQ zauJj*gkal*WQ1bj!X-UjZNmt2L=w5+B(#N%_91Q403ausLUJ>2Huof1grPuygz0*N zOhko*ztFMT**_2`!dvOH6pa*ZN&Azp&QE`R2qIOIGZ}S$0i>XdAOjphnTLFr9a>{j z>e?69p?&C#?Wrwr#r*QvnmWQ{h#l*^2|-VmKtp~&Frt9vb&(&YRpE@SBa7xh8g5(j zaO7^~Ki^U#Z!5pCl{ZJ$&8y9tq6DXY2B2L;-d?V2Ca~lOaj~bpD9dDDAm}6EB1wdu zB+7FbGWi9(p-|fCB9X$ZOd$IOksWN4sVip7r%^JHCzO7TsF19ZnF_-JdPWB;+<`IG z_?j`OjZ@+)CzI_ix?>qdevM5|obb}IC}d=GLYZrQt8OczZFfljvxjgpQKJYlx`Iui z3fO~nY_n9hL`p@&rmg*Am`RF;+Rx>af$VpX_7W6ACvISPbl;^F6YOU!qR!Pvz&mIQ z51oD&&6EIhgI*GruuXLVW2Wjtc%p)@D?N!yV`3p<`JxJnFKSS4UAv!>ptn23$?PGV ztkH00ES<6%LwUhM#D*Dn7W6vj$_tIg5DSeyDdwvW2s|Kg%4Nys|B9B=NtAy_E9M%n zw|EK&v!Gy9LXLNQ2_(XY7=CR6aza!Xf1_iF8IO-@$A^I2A=2z2e9kYW3Y1ddch0H$ z7_?(2E}2^72W3(&i@#&i3)%+k%uWJ%A%+kebDP;fM{siA3Gd>>F67&_cWmQ$R(n*x zy`^q!shd}~RPzqi%_Qv7l7EY(-^jQk!~PP@2&;y0>wW!Fz{fuEoNvF9rAoK>g!XellJ@4RQ%gql}c4v6;;j1>>sWC*(gg1 zvj4KYr8>amZSAFxyEw{(TkTL9E%OY;Kx0xy`K5jgyA+;INM>#%+P_`e(H$~{{5F99 wmJeU>`Gy5)!9;y)tzvDUXhHz8zHT^9g?&&jx z*m6(qnZF_7ME<3@azH(E5@t*r$N~ET^ z4hNH6Q2qo=Fu_wce!qJbR^v%?qmGuCRp!Ktjpwfl4;C$eR0Z!b;csL=i|NnXg2RN8rxjAbXLjjO}P zWEYfw4<=cc3kGM_g)JPIvjtp$1CFQ(A758`#u2uFE2Se{AI>$Qs|yZSHWY>0dBeeD z5|@Ky3$zEyn_vZ-+Y3HtAxu7F=e*Oh6m8JWuouOLX?74EnP?pCU{`Xt^MK+Y}p;Ym-J(4f;R2GF)?d@YZI&P;)uRWd?FS60s+Yi5N z=Sd;I7{gF>AoF%FNz)`!qAe!F;j|rRqmhh@BpYpyr`iw0WRw(P_&KcnOFlOF?CvtN z+e>XsF)s(nl-t#C*?^x~XY3Dzt7_2Uo`Su~lJc>n?E_hyb5)0If+`v1OM6iq%W=^r z)dtvXy>g+{+;E`EHx;K~$Tj$daTpK-vl--;zSPP1Hog~gnX2>7g7nKG&ymMB~k zss~}t21_gIKIXUD@E@houqUFOZ?MCd@z_dIm)f^mqJo-Nc1#4f#ZnJLG=fxN_$_`g zx99NLW))ARzG8{OCVC9Y8(?#G%FYsC8^rTg1oL;BE194orc|5T{S-pM7KSYA6@O(R zFMMvzdEYt%niY`d*21a^yzFRuJSo&&{M)jPf7(W>v=e4nzI4#|M&@=vIpw0sn>^r( z*7o1-)B~umI#uw}4SeCy!s=HJl@N2`i}u81oXQi;Bh7o)J#lgD51^c)Z}Kg!Xe9<+ z8RXn9D5u<10Lq00NVEZ#gy$RpS|YhCe1K$N9Ej=Hp_Awa2=1Ay(c-Wg3GFO{sS;_cV2gJ)|+={^)^QSrE z+NDsj{S3+pF+A?!S~mIY-X(Tb82Ar1m=Rk`315<{;C{t~5aN`d;T=45R9)bD=3Ll^ zT&)WSGPDEh)TVyBkP$T1*Tu|TYL;gpr*20P2<>pd6$%A%}@?<7;eUufU9F7Y- z8c}>SNtD#i%P1*yP03V7xm@;ftw@IQW?gD$oTceg9Gw&NHo3!nPy?ADnys(of_7f1 zR`QF;+$~j8b!TPG-2z*ttDj@5dJk;2v2wft;11x20!5r3(5?@OeMHOv!$Xn?7*>k< zvj3?Qe*&57^qFr3UZX6@7T<5xku-XD%hs)hVU(tTAKyH>iNy1p^#*tx4OE!kG>u_O d`Zjage^g@F4&}gLPUC@ZdDe#QZw20#`#%-4!Z-i` diff --git a/.venv/lib/python3.10/site-packages/billiard/dummy/connection.py b/.venv/lib/python3.10/site-packages/billiard/dummy/connection.py deleted file mode 100644 index fe2de94..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/dummy/connection.py +++ /dev/null @@ -1,92 +0,0 @@ -# -# Analogue of `multiprocessing.connection` which uses queues instead of sockets -# -# multiprocessing/dummy/connection.py -# -# Copyright (c) 2006-2008, R Oudkerk -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. Neither the name of author nor the names of any contributors may be -# used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -# SUCH DAMAGE. -# - -from queue import Queue - -__all__ = ['Client', 'Listener', 'Pipe'] - -families = [None] - - -class Listener(object): - - def __init__(self, address=None, family=None, backlog=1): - self._backlog_queue = Queue(backlog) - - def accept(self): - return Connection(*self._backlog_queue.get()) - - def close(self): - self._backlog_queue = None - - address = property(lambda self: self._backlog_queue) - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.close() - - -def Client(address): - _in, _out = Queue(), Queue() - address.put((_out, _in)) - return Connection(_in, _out) - - -def Pipe(duplex=True): - a, b = Queue(), Queue() - return Connection(a, b), Connection(b, a) - - -class Connection(object): - - def __init__(self, _in, _out): - self._out = _out - self._in = _in - self.send = self.send_bytes = _out.put - self.recv = self.recv_bytes = _in.get - - def poll(self, timeout=0.0): - if self._in.qsize() > 0: - return True - if timeout <= 0.0: - return False - self._in.not_empty.acquire() - self._in.not_empty.wait(timeout) - self._in.not_empty.release() - return self._in.qsize() > 0 - - def close(self): - pass diff --git a/.venv/lib/python3.10/site-packages/billiard/einfo.py b/.venv/lib/python3.10/site-packages/billiard/einfo.py deleted file mode 100644 index 8ea736a..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/einfo.py +++ /dev/null @@ -1,192 +0,0 @@ -import sys -import traceback - -__all__ = ['ExceptionInfo', 'Traceback'] - -DEFAULT_MAX_FRAMES = sys.getrecursionlimit() // 8 - - -class _Code: - - def __init__(self, code): - self.co_filename = code.co_filename - self.co_name = code.co_name - self.co_argcount = code.co_argcount - self.co_cellvars = () - self.co_firstlineno = code.co_firstlineno - self.co_flags = code.co_flags - self.co_freevars = () - self.co_code = b'' - self.co_lnotab = b'' - self.co_names = code.co_names - self.co_nlocals = code.co_nlocals - self.co_stacksize = code.co_stacksize - self.co_varnames = () - if sys.version_info >= (3, 11): - self._co_positions = list(code.co_positions()) - - if sys.version_info >= (3, 11): - @property - def co_positions(self): - return self._co_positions.__iter__ - - -class _Frame: - Code = _Code - - def __init__(self, frame): - self.f_builtins = {} - self.f_globals = { - "__file__": frame.f_globals.get("__file__", "__main__"), - "__name__": frame.f_globals.get("__name__"), - "__loader__": None, - } - self.f_locals = fl = {} - try: - fl["__traceback_hide__"] = frame.f_locals["__traceback_hide__"] - except KeyError: - pass - self.f_back = None - self.f_trace = None - self.f_exc_traceback = None - self.f_exc_type = None - self.f_exc_value = None - self.f_code = self.Code(frame.f_code) - self.f_lineno = frame.f_lineno - self.f_lasti = frame.f_lasti - # don't want to hit https://bugs.python.org/issue21967 - self.f_restricted = False - - if sys.version_info >= (3, 11): - @property - def co_positions(self): - return self.f_code.co_positions - - -class _Object: - - def __init__(self, **kw): - [setattr(self, k, v) for k, v in kw.items()] - - if sys.version_info >= (3, 11): - __default_co_positions__ = ((None, None, None, None),) - - @property - def co_positions(self): - return getattr( - self, - "_co_positions", - self.__default_co_positions__ - ).__iter__ - - @co_positions.setter - def co_positions(self, value): - self._co_positions = value # noqa - - -class _Truncated: - - def __init__(self): - self.tb_lineno = -1 - self.tb_frame = _Object( - f_globals={"__file__": "", - "__name__": "", - "__loader__": None}, - f_fileno=None, - f_code=_Object(co_filename="...", - co_name="[rest of traceback truncated]"), - ) - self.tb_next = None - self.tb_lasti = 0 - - if sys.version_info >= (3, 11): - @property - def co_positions(self): - return self.tb_frame.co_positions - - -class Traceback: - Frame = _Frame - - def __init__(self, tb, max_frames=DEFAULT_MAX_FRAMES, depth=0): - self.tb_frame = self.Frame(tb.tb_frame) - self.tb_lineno = tb.tb_lineno - self.tb_lasti = tb.tb_lasti - self.tb_next = None - if tb.tb_next is not None: - if depth <= max_frames: - self.tb_next = Traceback(tb.tb_next, max_frames, depth + 1) - else: - self.tb_next = _Truncated() - - -class RemoteTraceback(Exception): - def __init__(self, tb): - self.tb = tb - - def __str__(self): - return self.tb - - -class ExceptionWithTraceback(Exception): - def __init__(self, exc, tb): - self.exc = exc - self.tb = '\n"""\n%s"""' % tb - super().__init__() - - def __str__(self): - return self.tb - - def __reduce__(self): - return rebuild_exc, (self.exc, self.tb) - - -def rebuild_exc(exc, tb): - exc.__cause__ = RemoteTraceback(tb) - return exc - - -class ExceptionInfo: - """Exception wrapping an exception and its traceback. - - :param exc_info: The exception info tuple as returned by - :func:`sys.exc_info`. - - """ - - #: Exception type. - type = None - - #: Exception instance. - exception = None - - #: Pickleable traceback instance for use with :mod:`traceback` - tb = None - - #: String representation of the traceback. - traceback = None - - #: Set to true if this is an internal error. - internal = False - - def __init__(self, exc_info=None, internal=False): - self.type, exception, tb = exc_info or sys.exc_info() - try: - self.tb = Traceback(tb) - self.traceback = ''.join( - traceback.format_exception(self.type, exception, tb), - ) - self.internal = internal - finally: - del tb - self.exception = ExceptionWithTraceback(exception, self.traceback) - - def __str__(self): - return self.traceback - - def __repr__(self): - return "<%s: %r>" % (self.__class__.__name__, self.exception, ) - - @property - def exc_info(self): - return self.type, self.exception, self.tb diff --git a/.venv/lib/python3.10/site-packages/billiard/exceptions.py b/.venv/lib/python3.10/site-packages/billiard/exceptions.py deleted file mode 100644 index 11e2e7e..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/exceptions.py +++ /dev/null @@ -1,52 +0,0 @@ -try: - from multiprocessing import ( - ProcessError, - BufferTooShort, - TimeoutError, - AuthenticationError, - ) -except ImportError: - class ProcessError(Exception): # noqa - pass - - class BufferTooShort(ProcessError): # noqa - pass - - class TimeoutError(ProcessError): # noqa - pass - - class AuthenticationError(ProcessError): # noqa - pass - - -class TimeLimitExceeded(Exception): - """The time limit has been exceeded and the job has been terminated.""" - - def __str__(self): - return "TimeLimitExceeded%s" % (self.args, ) - - -class SoftTimeLimitExceeded(Exception): - """The soft time limit has been exceeded. This exception is raised - to give the task a chance to clean up.""" - - def __str__(self): - return "SoftTimeLimitExceeded%s" % (self.args, ) - - -class WorkerLostError(Exception): - """The worker processing a job has exited prematurely.""" - - -class Terminated(Exception): - """The worker processing a job has been terminated by user request.""" - - -class RestartFreqExceeded(Exception): - """Restarts too fast.""" - - -class CoroStop(Exception): - """Coroutine exit, as opposed to StopIteration which may - mean it should be restarted.""" - pass diff --git a/.venv/lib/python3.10/site-packages/billiard/forkserver.py b/.venv/lib/python3.10/site-packages/billiard/forkserver.py deleted file mode 100644 index 9e6a9c9..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/forkserver.py +++ /dev/null @@ -1,264 +0,0 @@ -import errno -import os -import selectors -import signal -import socket -import struct -import sys -import threading - -from . import connection -from . import process -from . import reduction -from . import semaphore_tracker -from . import spawn -from . import util - -from .compat import spawnv_passfds - -__all__ = ['ensure_running', 'get_inherited_fds', 'connect_to_new_process', - 'set_forkserver_preload'] - -# -# -# - -MAXFDS_TO_SEND = 256 -UNSIGNED_STRUCT = struct.Struct('Q') # large enough for pid_t - -# -# Forkserver class -# - - -class ForkServer: - - def __init__(self): - self._forkserver_address = None - self._forkserver_alive_fd = None - self._inherited_fds = None - self._lock = threading.Lock() - self._preload_modules = ['__main__'] - - def set_forkserver_preload(self, modules_names): - '''Set list of module names to try to load in forkserver process.''' - if not all(type(mod) is str for mod in self._preload_modules): - raise TypeError('module_names must be a list of strings') - self._preload_modules = modules_names - - def get_inherited_fds(self): - '''Return list of fds inherited from parent process. - - This returns None if the current process was not started by fork - server. - ''' - return self._inherited_fds - - def connect_to_new_process(self, fds): - '''Request forkserver to create a child process. - - Returns a pair of fds (status_r, data_w). The calling process can read - the child process's pid and (eventually) its returncode from status_r. - The calling process should write to data_w the pickled preparation and - process data. - ''' - self.ensure_running() - if len(fds) + 4 >= MAXFDS_TO_SEND: - raise ValueError('too many fds') - with socket.socket(socket.AF_UNIX) as client: - client.connect(self._forkserver_address) - parent_r, child_w = os.pipe() - child_r, parent_w = os.pipe() - allfds = [child_r, child_w, self._forkserver_alive_fd, - semaphore_tracker.getfd()] - allfds += fds - try: - reduction.sendfds(client, allfds) - return parent_r, parent_w - except: - os.close(parent_r) - os.close(parent_w) - raise - finally: - os.close(child_r) - os.close(child_w) - - def ensure_running(self): - '''Make sure that a fork server is running. - - This can be called from any process. Note that usually a child - process will just reuse the forkserver started by its parent, so - ensure_running() will do nothing. - ''' - with self._lock: - semaphore_tracker.ensure_running() - if self._forkserver_alive_fd is not None: - return - - cmd = ('from billiard.forkserver import main; ' + - 'main(%d, %d, %r, **%r)') - - if self._preload_modules: - desired_keys = {'main_path', 'sys_path'} - data = spawn.get_preparation_data('ignore') - data = { - x: y for (x, y) in data.items() if x in desired_keys - } - else: - data = {} - - with socket.socket(socket.AF_UNIX) as listener: - address = connection.arbitrary_address('AF_UNIX') - listener.bind(address) - os.chmod(address, 0o600) - listener.listen() - - # all client processes own the write end of the "alive" pipe; - # when they all terminate the read end becomes ready. - alive_r, alive_w = os.pipe() - try: - fds_to_pass = [listener.fileno(), alive_r] - cmd %= (listener.fileno(), alive_r, self._preload_modules, - data) - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() - args += ['-c', cmd] - spawnv_passfds(exe, args, fds_to_pass) - except: - os.close(alive_w) - raise - finally: - os.close(alive_r) - self._forkserver_address = address - self._forkserver_alive_fd = alive_w - -# -# -# - - -def main(listener_fd, alive_r, preload, main_path=None, sys_path=None): - '''Run forkserver.''' - if preload: - if '__main__' in preload and main_path is not None: - process.current_process()._inheriting = True - try: - spawn.import_main_path(main_path) - finally: - del process.current_process()._inheriting - for modname in preload: - try: - __import__(modname) - except ImportError: - pass - - # close sys.stdin - if sys.stdin is not None: - try: - sys.stdin.close() - sys.stdin = open(os.devnull) - except (OSError, ValueError): - pass - - # ignoring SIGCHLD means no need to reap zombie processes - handler = signal.signal(signal.SIGCHLD, signal.SIG_IGN) - with socket.socket(socket.AF_UNIX, fileno=listener_fd) as listener, \ - selectors.DefaultSelector() as selector: - _forkserver._forkserver_address = listener.getsockname() - selector.register(listener, selectors.EVENT_READ) - selector.register(alive_r, selectors.EVENT_READ) - - while True: - try: - while True: - rfds = [key.fileobj for (key, events) in selector.select()] - if rfds: - break - - if alive_r in rfds: - # EOF because no more client processes left - assert os.read(alive_r, 1) == b'' - raise SystemExit - - assert listener in rfds - with listener.accept()[0] as s: - code = 1 - if os.fork() == 0: - try: - _serve_one(s, listener, alive_r, handler) - except Exception: - sys.excepthook(*sys.exc_info()) - sys.stderr.flush() - finally: - os._exit(code) - except OSError as e: - if e.errno != errno.ECONNABORTED: - raise - - -def __unpack_fds(child_r, child_w, alive, stfd, *inherited): - return child_r, child_w, alive, stfd, inherited - - -def _serve_one(s, listener, alive_r, handler): - # close unnecessary stuff and reset SIGCHLD handler - listener.close() - os.close(alive_r) - signal.signal(signal.SIGCHLD, handler) - - # receive fds from parent process - fds = reduction.recvfds(s, MAXFDS_TO_SEND + 1) - s.close() - assert len(fds) <= MAXFDS_TO_SEND - - (child_r, child_w, _forkserver._forkserver_alive_fd, - stfd, _forkserver._inherited_fds) = __unpack_fds(*fds) - semaphore_tracker._semaphore_tracker._fd = stfd - - # send pid to client processes - write_unsigned(child_w, os.getpid()) - - # reseed random number generator - if 'random' in sys.modules: - import random - random.seed() - - # run process object received over pipe - code = spawn._main(child_r) - - # write the exit code to the pipe - write_unsigned(child_w, code) - -# -# Read and write unsigned numbers -# - - -def read_unsigned(fd): - data = b'' - length = UNSIGNED_STRUCT.size - while len(data) < length: - s = os.read(fd, length - len(data)) - if not s: - raise EOFError('unexpected EOF') - data += s - return UNSIGNED_STRUCT.unpack(data)[0] - - -def write_unsigned(fd, n): - msg = UNSIGNED_STRUCT.pack(n) - while msg: - nbytes = os.write(fd, msg) - if nbytes == 0: - raise RuntimeError('should not get here') - msg = msg[nbytes:] - -# -# -# - -_forkserver = ForkServer() -ensure_running = _forkserver.ensure_running -get_inherited_fds = _forkserver.get_inherited_fds -connect_to_new_process = _forkserver.connect_to_new_process -set_forkserver_preload = _forkserver.set_forkserver_preload diff --git a/.venv/lib/python3.10/site-packages/billiard/heap.py b/.venv/lib/python3.10/site-packages/billiard/heap.py deleted file mode 100644 index 5f940e9..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/heap.py +++ /dev/null @@ -1,285 +0,0 @@ -# -# Module which supports allocation of memory from an mmap -# -# multiprocessing/heap.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import bisect -import errno -import io -import mmap -import os -import sys -import threading -import tempfile - -from . import context -from . import reduction -from . import util - -from ._ext import _billiard, win32 - -__all__ = ['BufferWrapper'] - -PY3 = sys.version_info[0] == 3 - -# -# Inheritable class which wraps an mmap, and from which blocks can be allocated -# - -if sys.platform == 'win32': - - class Arena: - - _rand = tempfile._RandomNameSequence() - - def __init__(self, size): - self.size = size - for i in range(100): - name = 'pym-%d-%s' % (os.getpid(), next(self._rand)) - buf = mmap.mmap(-1, size, tagname=name) - if win32.GetLastError() == 0: - break - # we have reopened a preexisting map - buf.close() - else: - exc = IOError('Cannot find name for new mmap') - exc.errno = errno.EEXIST - raise exc - self.name = name - self.buffer = buf - self._state = (self.size, self.name) - - def __getstate__(self): - context.assert_spawning(self) - return self._state - - def __setstate__(self, state): - self.size, self.name = self._state = state - self.buffer = mmap.mmap(-1, self.size, tagname=self.name) - # XXX Temporarily preventing buildbot failures while determining - # XXX the correct long-term fix. See issue #23060 - # assert win32.GetLastError() == win32.ERROR_ALREADY_EXISTS - -else: - - class Arena: - - def __init__(self, size, fd=-1): - self.size = size - self.fd = fd - if fd == -1: - if PY3: - self.fd, name = tempfile.mkstemp( - prefix='pym-%d-' % (os.getpid(),), - dir=util.get_temp_dir(), - ) - - os.unlink(name) - util.Finalize(self, os.close, (self.fd,)) - with io.open(self.fd, 'wb', closefd=False) as f: - bs = 1024 * 1024 - if size >= bs: - zeros = b'\0' * bs - for _ in range(size // bs): - f.write(zeros) - del(zeros) - f.write(b'\0' * (size % bs)) - assert f.tell() == size - else: - self.fd, name = tempfile.mkstemp( - prefix='pym-%d-' % (os.getpid(),), - dir=util.get_temp_dir(), - ) - os.unlink(name) - util.Finalize(self, os.close, (self.fd,)) - os.ftruncate(self.fd, size) - self.buffer = mmap.mmap(self.fd, self.size) - - def reduce_arena(a): - if a.fd == -1: - raise ValueError('Arena is unpicklable because' - 'forking was enabled when it was created') - return rebuild_arena, (a.size, reduction.DupFd(a.fd)) - - def rebuild_arena(size, dupfd): - return Arena(size, dupfd.detach()) - - reduction.register(Arena, reduce_arena) - -# -# Class allowing allocation of chunks of memory from arenas -# - - -class Heap: - - _alignment = 8 - - def __init__(self, size=mmap.PAGESIZE): - self._lastpid = os.getpid() - self._lock = threading.Lock() - self._size = size - self._lengths = [] - self._len_to_seq = {} - self._start_to_block = {} - self._stop_to_block = {} - self._allocated_blocks = set() - self._arenas = [] - # list of pending blocks to free - see free() comment below - self._pending_free_blocks = [] - - @staticmethod - def _roundup(n, alignment): - # alignment must be a power of 2 - mask = alignment - 1 - return (n + mask) & ~mask - - def _malloc(self, size): - # returns a large enough block -- it might be much larger - i = bisect.bisect_left(self._lengths, size) - if i == len(self._lengths): - length = self._roundup(max(self._size, size), mmap.PAGESIZE) - self._size *= 2 - util.info('allocating a new mmap of length %d', length) - arena = Arena(length) - self._arenas.append(arena) - return (arena, 0, length) - else: - length = self._lengths[i] - seq = self._len_to_seq[length] - block = seq.pop() - if not seq: - del self._len_to_seq[length], self._lengths[i] - - (arena, start, stop) = block - del self._start_to_block[(arena, start)] - del self._stop_to_block[(arena, stop)] - return block - - def _free(self, block): - # free location and try to merge with neighbours - (arena, start, stop) = block - - try: - prev_block = self._stop_to_block[(arena, start)] - except KeyError: - pass - else: - start, _ = self._absorb(prev_block) - - try: - next_block = self._start_to_block[(arena, stop)] - except KeyError: - pass - else: - _, stop = self._absorb(next_block) - - block = (arena, start, stop) - length = stop - start - - try: - self._len_to_seq[length].append(block) - except KeyError: - self._len_to_seq[length] = [block] - bisect.insort(self._lengths, length) - - self._start_to_block[(arena, start)] = block - self._stop_to_block[(arena, stop)] = block - - def _absorb(self, block): - # deregister this block so it can be merged with a neighbour - (arena, start, stop) = block - del self._start_to_block[(arena, start)] - del self._stop_to_block[(arena, stop)] - - length = stop - start - seq = self._len_to_seq[length] - seq.remove(block) - if not seq: - del self._len_to_seq[length] - self._lengths.remove(length) - - return start, stop - - def _free_pending_blocks(self): - # Free all the blocks in the pending list - called with the lock held - while 1: - try: - block = self._pending_free_blocks.pop() - except IndexError: - break - self._allocated_blocks.remove(block) - self._free(block) - - def free(self, block): - # free a block returned by malloc() - # Since free() can be called asynchronously by the GC, it could happen - # that it's called while self._lock is held: in that case, - # self._lock.acquire() would deadlock (issue #12352). To avoid that, a - # trylock is used instead, and if the lock can't be acquired - # immediately, the block is added to a list of blocks to be freed - # synchronously sometimes later from malloc() or free(), by calling - # _free_pending_blocks() (appending and retrieving from a list is not - # strictly thread-safe but under cPython it's atomic - # thanks to the GIL). - assert os.getpid() == self._lastpid - if not self._lock.acquire(False): - # can't acquire the lock right now, add the block to the list of - # pending blocks to free - self._pending_free_blocks.append(block) - else: - # we hold the lock - try: - self._free_pending_blocks() - self._allocated_blocks.remove(block) - self._free(block) - finally: - self._lock.release() - - def malloc(self, size): - # return a block of right size (possibly rounded up) - assert 0 <= size < sys.maxsize - if os.getpid() != self._lastpid: - self.__init__() # reinitialize after fork - with self._lock: - self._free_pending_blocks() - size = self._roundup(max(size, 1), self._alignment) - (arena, start, stop) = self._malloc(size) - new_stop = start + size - if new_stop < stop: - self._free((arena, new_stop, stop)) - block = (arena, start, new_stop) - self._allocated_blocks.add(block) - return block - -# -# Class representing a chunk of an mmap -- can be inherited -# - - -class BufferWrapper: - - _heap = Heap() - - def __init__(self, size): - assert 0 <= size < sys.maxsize - block = BufferWrapper._heap.malloc(size) - self._state = (block, size) - util.Finalize(self, BufferWrapper._heap.free, args=(block,)) - - def get_address(self): - (arena, start, stop), size = self._state - address, length = _billiard.address_of_buffer(arena.buffer) - assert size <= length - return address + start - - def get_size(self): - return self._state[1] - - def create_memoryview(self): - (arena, start, stop), size = self._state - return memoryview(arena.buffer)[start:start + size] diff --git a/.venv/lib/python3.10/site-packages/billiard/managers.py b/.venv/lib/python3.10/site-packages/billiard/managers.py deleted file mode 100644 index 6a496c6..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/managers.py +++ /dev/null @@ -1,1210 +0,0 @@ -# -# Module providing the `SyncManager` class for dealing -# with shared objects -# -# multiprocessing/managers.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -# -# Imports -# - -import sys -import threading -import array - -from traceback import format_exc - -from . import connection -from . import context -from . import pool -from . import process -from . import reduction -from . import util -from . import get_context - -from queue import Queue -from time import monotonic - -__all__ = ['BaseManager', 'SyncManager', 'BaseProxy', 'Token'] - -PY3 = sys.version_info[0] == 3 - -# -# Register some things for pickling -# - - -if PY3: - def reduce_array(a): - return array.array, (a.typecode, a.tobytes()) -else: - def reduce_array(a): # noqa - return array.array, (a.typecode, a.tostring()) -reduction.register(array.array, reduce_array) - -view_types = [type(getattr({}, name)()) - for name in ('items', 'keys', 'values')] -if view_types[0] is not list: # only needed in Py3.0 - - def rebuild_as_list(obj): - return list, (list(obj), ) - for view_type in view_types: - reduction.register(view_type, rebuild_as_list) - -# -# Type for identifying shared objects -# - - -class Token: - ''' - Type to uniquely identify a shared object - ''' - __slots__ = ('typeid', 'address', 'id') - - def __init__(self, typeid, address, id): - (self.typeid, self.address, self.id) = (typeid, address, id) - - def __getstate__(self): - return (self.typeid, self.address, self.id) - - def __setstate__(self, state): - (self.typeid, self.address, self.id) = state - - def __repr__(self): - return '%s(typeid=%r, address=%r, id=%r)' % \ - (self.__class__.__name__, self.typeid, self.address, self.id) - -# -# Function for communication with a manager's server process -# - - -def dispatch(c, id, methodname, args=(), kwds={}): - ''' - Send a message to manager using connection `c` and return response - ''' - c.send((id, methodname, args, kwds)) - kind, result = c.recv() - if kind == '#RETURN': - return result - raise convert_to_error(kind, result) - - -def convert_to_error(kind, result): - if kind == '#ERROR': - return result - elif kind == '#TRACEBACK': - assert type(result) is str - return RemoteError(result) - elif kind == '#UNSERIALIZABLE': - assert type(result) is str - return RemoteError('Unserializable message: %s\n' % result) - else: - return ValueError('Unrecognized message type') - - -class RemoteError(Exception): - - def __str__(self): - return ('\n' + '-' * 75 + '\n' + str(self.args[0]) + '-' * 75) - -# -# Functions for finding the method names of an object -# - - -def all_methods(obj): - ''' - Return a list of names of methods of `obj` - ''' - temp = [] - for name in dir(obj): - func = getattr(obj, name) - if callable(func): - temp.append(name) - return temp - - -def public_methods(obj): - ''' - Return a list of names of methods of `obj` which do not start with '_' - ''' - return [name for name in all_methods(obj) if name[0] != '_'] - -# -# Server which is run in a process controlled by a manager -# - - -class Server: - ''' - Server class which runs in a process controlled by a manager object - ''' - public = ['shutdown', 'create', 'accept_connection', 'get_methods', - 'debug_info', 'number_of_objects', 'dummy', 'incref', 'decref'] - - def __init__(self, registry, address, authkey, serializer): - assert isinstance(authkey, bytes) - self.registry = registry - self.authkey = process.AuthenticationString(authkey) - Listener, Client = listener_client[serializer] - - # do authentication later - self.listener = Listener(address=address, backlog=16) - self.address = self.listener.address - - self.id_to_obj = {'0': (None, ())} - self.id_to_refcount = {} - self.mutex = threading.RLock() - - def serve_forever(self): - ''' - Run the server forever - ''' - self.stop_event = threading.Event() - process.current_process()._manager_server = self - try: - accepter = threading.Thread(target=self.accepter) - accepter.daemon = True - accepter.start() - try: - while not self.stop_event.is_set(): - self.stop_event.wait(1) - except (KeyboardInterrupt, SystemExit): - pass - finally: - if sys.stdout != sys.__stdout__: - util.debug('resetting stdout, stderr') - sys.stdout = sys.__stdout__ - sys.stderr = sys.__stderr__ - sys.exit(0) - - def accepter(self): - while True: - try: - c = self.listener.accept() - except OSError: - continue - t = threading.Thread(target=self.handle_request, args=(c, )) - t.daemon = True - t.start() - - def handle_request(self, c): - ''' - Handle a new connection - ''' - funcname = result = request = None - try: - connection.deliver_challenge(c, self.authkey) - connection.answer_challenge(c, self.authkey) - request = c.recv() - ignore, funcname, args, kwds = request - assert funcname in self.public, '%r unrecognized' % funcname - func = getattr(self, funcname) - except Exception: - msg = ('#TRACEBACK', format_exc()) - else: - try: - result = func(c, *args, **kwds) - except Exception: - msg = ('#TRACEBACK', format_exc()) - else: - msg = ('#RETURN', result) - try: - c.send(msg) - except Exception as exc: - try: - c.send(('#TRACEBACK', format_exc())) - except Exception: - pass - util.info('Failure to send message: %r', msg) - util.info(' ... request was %r', request) - util.info(' ... exception was %r', exc) - - c.close() - - def serve_client(self, conn): - ''' - Handle requests from the proxies in a particular process/thread - ''' - util.debug('starting server thread to service %r', - threading.current_thread().name) - - recv = conn.recv - send = conn.send - id_to_obj = self.id_to_obj - - while not self.stop_event.is_set(): - - try: - methodname = obj = None - request = recv() - ident, methodname, args, kwds = request - obj, exposed, gettypeid = id_to_obj[ident] - - if methodname not in exposed: - raise AttributeError( - 'method %r of %r object is not in exposed=%r' % ( - methodname, type(obj), exposed) - ) - - function = getattr(obj, methodname) - - try: - res = function(*args, **kwds) - except Exception as exc: - msg = ('#ERROR', exc) - else: - typeid = gettypeid and gettypeid.get(methodname, None) - if typeid: - rident, rexposed = self.create(conn, typeid, res) - token = Token(typeid, self.address, rident) - msg = ('#PROXY', (rexposed, token)) - else: - msg = ('#RETURN', res) - - except AttributeError: - if methodname is None: - msg = ('#TRACEBACK', format_exc()) - else: - try: - fallback_func = self.fallback_mapping[methodname] - result = fallback_func( - self, conn, ident, obj, *args, **kwds - ) - msg = ('#RETURN', result) - except Exception: - msg = ('#TRACEBACK', format_exc()) - - except EOFError: - util.debug('got EOF -- exiting thread serving %r', - threading.current_thread().name) - sys.exit(0) - - except Exception: - msg = ('#TRACEBACK', format_exc()) - - try: - try: - send(msg) - except Exception: - send(('#UNSERIALIZABLE', repr(msg))) - except Exception as exc: - util.info('exception in thread serving %r', - threading.current_thread().name) - util.info(' ... message was %r', msg) - util.info(' ... exception was %r', exc) - conn.close() - sys.exit(1) - - def fallback_getvalue(self, conn, ident, obj): - return obj - - def fallback_str(self, conn, ident, obj): - return str(obj) - - def fallback_repr(self, conn, ident, obj): - return repr(obj) - - fallback_mapping = { - '__str__': fallback_str, - '__repr__': fallback_repr, - '#GETVALUE': fallback_getvalue, - } - - def dummy(self, c): - pass - - def debug_info(self, c): - ''' - Return some info --- useful to spot problems with refcounting - ''' - with self.mutex: - result = [] - keys = list(self.id_to_obj.keys()) - keys.sort() - for ident in keys: - if ident != '0': - result.append(' %s: refcount=%s\n %s' % - (ident, self.id_to_refcount[ident], - str(self.id_to_obj[ident][0])[:75])) - return '\n'.join(result) - - def number_of_objects(self, c): - ''' - Number of shared objects - ''' - return len(self.id_to_obj) - 1 # don't count ident='0' - - def shutdown(self, c): - ''' - Shutdown this process - ''' - try: - util.debug('Manager received shutdown message') - c.send(('#RETURN', None)) - except: - import traceback - traceback.print_exc() - finally: - self.stop_event.set() - - def create(self, c, typeid, *args, **kwds): - ''' - Create a new shared object and return its id - ''' - with self.mutex: - callable, exposed, method_to_typeid, proxytype = \ - self.registry[typeid] - - if callable is None: - assert len(args) == 1 and not kwds - obj = args[0] - else: - obj = callable(*args, **kwds) - - if exposed is None: - exposed = public_methods(obj) - if method_to_typeid is not None: - assert type(method_to_typeid) is dict - exposed = list(exposed) + list(method_to_typeid) - # convert to string because xmlrpclib - # only has 32 bit signed integers - ident = '%x' % id(obj) - util.debug('%r callable returned object with id %r', typeid, ident) - - self.id_to_obj[ident] = (obj, set(exposed), method_to_typeid) - if ident not in self.id_to_refcount: - self.id_to_refcount[ident] = 0 - # increment the reference count immediately, to avoid - # this object being garbage collected before a Proxy - # object for it can be created. The caller of create() - # is responsible for doing a decref once the Proxy object - # has been created. - self.incref(c, ident) - return ident, tuple(exposed) - - def get_methods(self, c, token): - ''' - Return the methods of the shared object indicated by token - ''' - return tuple(self.id_to_obj[token.id][1]) - - def accept_connection(self, c, name): - ''' - Spawn a new thread to serve this connection - ''' - threading.current_thread().name = name - c.send(('#RETURN', None)) - self.serve_client(c) - - def incref(self, c, ident): - with self.mutex: - self.id_to_refcount[ident] += 1 - - def decref(self, c, ident): - with self.mutex: - assert self.id_to_refcount[ident] >= 1 - self.id_to_refcount[ident] -= 1 - if self.id_to_refcount[ident] == 0: - del self.id_to_obj[ident], self.id_to_refcount[ident] - util.debug('disposing of obj with id %r', ident) - -# -# Class to represent state of a manager -# - - -class State: - __slots__ = ['value'] - INITIAL = 0 - STARTED = 1 - SHUTDOWN = 2 - -# -# Mapping from serializer name to Listener and Client types -# - -listener_client = { - 'pickle': (connection.Listener, connection.Client), - 'xmlrpclib': (connection.XmlListener, connection.XmlClient), -} - -# -# Definition of BaseManager -# - - -class BaseManager: - ''' - Base class for managers - ''' - _registry = {} - _Server = Server - - def __init__(self, address=None, authkey=None, serializer='pickle', - ctx=None): - if authkey is None: - authkey = process.current_process().authkey - self._address = address # XXX not final address if eg ('', 0) - self._authkey = process.AuthenticationString(authkey) - self._state = State() - self._state.value = State.INITIAL - self._serializer = serializer - self._Listener, self._Client = listener_client[serializer] - self._ctx = ctx or get_context() - - def __reduce__(self): - return (type(self).from_address, - (self._address, self._authkey, self._serializer)) - - def get_server(self): - ''' - Return server object with serve_forever() method and address attribute - ''' - assert self._state.value == State.INITIAL - return Server(self._registry, self._address, - self._authkey, self._serializer) - - def connect(self): - ''' - Connect manager object to the server process - ''' - Listener, Client = listener_client[self._serializer] - conn = Client(self._address, authkey=self._authkey) - dispatch(conn, None, 'dummy') - self._state.value = State.STARTED - - def start(self, initializer=None, initargs=()): - ''' - Spawn a server process for this manager object - ''' - assert self._state.value == State.INITIAL - - if initializer is not None and not callable(initializer): - raise TypeError('initializer must be a callable') - - # pipe over which we will retrieve address of server - reader, writer = connection.Pipe(duplex=False) - - # spawn process which runs a server - self._process = self._ctx.Process( - target=type(self)._run_server, - args=(self._registry, self._address, self._authkey, - self._serializer, writer, initializer, initargs), - ) - ident = ':'.join(str(i) for i in self._process._identity) - self._process.name = type(self).__name__ + '-' + ident - self._process.start() - - # get address of server - writer.close() - self._address = reader.recv() - reader.close() - - # register a finalizer - self._state.value = State.STARTED - self.shutdown = util.Finalize( - self, type(self)._finalize_manager, - args=(self._process, self._address, self._authkey, - self._state, self._Client), - exitpriority=0 - ) - - @classmethod - def _run_server(cls, registry, address, authkey, serializer, writer, - initializer=None, initargs=()): - ''' - Create a server, report its address and run it - ''' - if initializer is not None: - initializer(*initargs) - - # create server - server = cls._Server(registry, address, authkey, serializer) - - # inform parent process of the server's address - writer.send(server.address) - writer.close() - - # run the manager - util.info('manager serving at %r', server.address) - server.serve_forever() - - def _create(self, typeid, *args, **kwds): - ''' - Create a new shared object; return the token and exposed tuple - ''' - assert self._state.value == State.STARTED, 'server not yet started' - conn = self._Client(self._address, authkey=self._authkey) - try: - id, exposed = dispatch(conn, None, 'create', - (typeid,) + args, kwds) - finally: - conn.close() - return Token(typeid, self._address, id), exposed - - def join(self, timeout=None): - ''' - Join the manager process (if it has been spawned) - ''' - if self._process is not None: - self._process.join(timeout) - if not self._process.is_alive(): - self._process = None - - def _debug_info(self): - ''' - Return some info about the servers shared objects and connections - ''' - conn = self._Client(self._address, authkey=self._authkey) - try: - return dispatch(conn, None, 'debug_info') - finally: - conn.close() - - def _number_of_objects(self): - ''' - Return the number of shared objects - ''' - conn = self._Client(self._address, authkey=self._authkey) - try: - return dispatch(conn, None, 'number_of_objects') - finally: - conn.close() - - def __enter__(self): - if self._state.value == State.INITIAL: - self.start() - assert self._state.value == State.STARTED - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.shutdown() - - @staticmethod - def _finalize_manager(process, address, authkey, state, _Client): - ''' - Shutdown the manager process; will be registered as a finalizer - ''' - if process.is_alive(): - util.info('sending shutdown message to manager') - try: - conn = _Client(address, authkey=authkey) - try: - dispatch(conn, None, 'shutdown') - finally: - conn.close() - except Exception: - pass - - process.join(timeout=1.0) - if process.is_alive(): - util.info('manager still alive') - if hasattr(process, 'terminate'): - util.info('trying to `terminate()` manager process') - process.terminate() - process.join(timeout=0.1) - if process.is_alive(): - util.info('manager still alive after terminate') - - state.value = State.SHUTDOWN - try: - del BaseProxy._address_to_local[address] - except KeyError: - pass - - address = property(lambda self: self._address) - - @classmethod - def register(cls, typeid, callable=None, proxytype=None, exposed=None, - method_to_typeid=None, create_method=True): - ''' - Register a typeid with the manager type - ''' - if '_registry' not in cls.__dict__: - cls._registry = cls._registry.copy() - - if proxytype is None: - proxytype = AutoProxy - - exposed = exposed or getattr(proxytype, '_exposed_', None) - - method_to_typeid = ( - method_to_typeid or - getattr(proxytype, '_method_to_typeid_', None) - ) - - if method_to_typeid: - for key, value in method_to_typeid.items(): - assert type(key) is str, '%r is not a string' % key - assert type(value) is str, '%r is not a string' % value - - cls._registry[typeid] = ( - callable, exposed, method_to_typeid, proxytype - ) - - if create_method: - def temp(self, *args, **kwds): - util.debug('requesting creation of a shared %r object', typeid) - token, exp = self._create(typeid, *args, **kwds) - proxy = proxytype( - token, self._serializer, manager=self, - authkey=self._authkey, exposed=exp - ) - conn = self._Client(token.address, authkey=self._authkey) - dispatch(conn, None, 'decref', (token.id,)) - return proxy - temp.__name__ = typeid - setattr(cls, typeid, temp) - -# -# Subclass of set which get cleared after a fork -# - - -class ProcessLocalSet(set): - - def __init__(self): - util.register_after_fork(self, lambda obj: obj.clear()) - - def __reduce__(self): - return type(self), () - -# -# Definition of BaseProxy -# - - -class BaseProxy: - ''' - A base for proxies of shared objects - ''' - _address_to_local = {} - _mutex = util.ForkAwareThreadLock() - - def __init__(self, token, serializer, manager=None, - authkey=None, exposed=None, incref=True): - with BaseProxy._mutex: - tls_idset = BaseProxy._address_to_local.get(token.address, None) - if tls_idset is None: - tls_idset = util.ForkAwareLocal(), ProcessLocalSet() - BaseProxy._address_to_local[token.address] = tls_idset - - # self._tls is used to record the connection used by this - # thread to communicate with the manager at token.address - self._tls = tls_idset[0] - - # self._idset is used to record the identities of all shared - # objects for which the current process owns references and - # which are in the manager at token.address - self._idset = tls_idset[1] - - self._token = token - self._id = self._token.id - self._manager = manager - self._serializer = serializer - self._Client = listener_client[serializer][1] - - if authkey is not None: - self._authkey = process.AuthenticationString(authkey) - elif self._manager is not None: - self._authkey = self._manager._authkey - else: - self._authkey = process.current_process().authkey - - if incref: - self._incref() - - util.register_after_fork(self, BaseProxy._after_fork) - - def _connect(self): - util.debug('making connection to manager') - name = process.current_process().name - if threading.current_thread().name != 'MainThread': - name += '|' + threading.current_thread().name - conn = self._Client(self._token.address, authkey=self._authkey) - dispatch(conn, None, 'accept_connection', (name,)) - self._tls.connection = conn - - def _callmethod(self, methodname, args=(), kwds={}): - ''' - Try to call a method of the referrent and return a copy of the result - ''' - try: - conn = self._tls.connection - except AttributeError: - util.debug('thread %r does not own a connection', - threading.current_thread().name) - self._connect() - conn = self._tls.connection - - conn.send((self._id, methodname, args, kwds)) - kind, result = conn.recv() - - if kind == '#RETURN': - return result - elif kind == '#PROXY': - exposed, token = result - proxytype = self._manager._registry[token.typeid][-1] - token.address = self._token.address - proxy = proxytype( - token, self._serializer, manager=self._manager, - authkey=self._authkey, exposed=exposed - ) - conn = self._Client(token.address, authkey=self._authkey) - dispatch(conn, None, 'decref', (token.id,)) - return proxy - raise convert_to_error(kind, result) - - def _getvalue(self): - ''' - Get a copy of the value of the referent - ''' - return self._callmethod('#GETVALUE') - - def _incref(self): - conn = self._Client(self._token.address, authkey=self._authkey) - dispatch(conn, None, 'incref', (self._id,)) - util.debug('INCREF %r', self._token.id) - - self._idset.add(self._id) - - state = self._manager and self._manager._state - - self._close = util.Finalize( - self, BaseProxy._decref, - args=(self._token, self._authkey, state, - self._tls, self._idset, self._Client), - exitpriority=10 - ) - - @staticmethod - def _decref(token, authkey, state, tls, idset, _Client): - idset.discard(token.id) - - # check whether manager is still alive - if state is None or state.value == State.STARTED: - # tell manager this process no longer cares about referent - try: - util.debug('DECREF %r', token.id) - conn = _Client(token.address, authkey=authkey) - dispatch(conn, None, 'decref', (token.id,)) - except Exception as exc: - util.debug('... decref failed %s', exc) - - else: - util.debug('DECREF %r -- manager already shutdown', token.id) - - # check whether we can close this thread's connection because - # the process owns no more references to objects for this manager - if not idset and hasattr(tls, 'connection'): - util.debug('thread %r has no more proxies so closing conn', - threading.current_thread().name) - tls.connection.close() - del tls.connection - - def _after_fork(self): - self._manager = None - try: - self._incref() - except Exception as exc: - # the proxy may just be for a manager which has shutdown - util.info('incref failed: %s', exc) - - def __reduce__(self): - kwds = {} - if context.get_spawning_popen() is not None: - kwds['authkey'] = self._authkey - - if getattr(self, '_isauto', False): - kwds['exposed'] = self._exposed_ - return (RebuildProxy, - (AutoProxy, self._token, self._serializer, kwds)) - else: - return (RebuildProxy, - (type(self), self._token, self._serializer, kwds)) - - def __deepcopy__(self, memo): - return self._getvalue() - - def __repr__(self): - return '<%s object, typeid %r at %#x>' % \ - (type(self).__name__, self._token.typeid, id(self)) - - def __str__(self): - ''' - Return representation of the referent (or a fall-back if that fails) - ''' - try: - return self._callmethod('__repr__') - except Exception: - return repr(self)[:-1] + "; '__str__()' failed>" - -# -# Function used for unpickling -# - - -def RebuildProxy(func, token, serializer, kwds): - ''' - Function used for unpickling proxy objects. - - If possible the shared object is returned, or otherwise a proxy for it. - ''' - server = getattr(process.current_process(), '_manager_server', None) - - if server and server.address == token.address: - return server.id_to_obj[token.id][0] - else: - incref = ( - kwds.pop('incref', True) and - not getattr(process.current_process(), '_inheriting', False) - ) - return func(token, serializer, incref=incref, **kwds) - -# -# Functions to create proxies and proxy types -# - - -def MakeProxyType(name, exposed, _cache={}): - ''' - Return an proxy type whose methods are given by `exposed` - ''' - exposed = tuple(exposed) - try: - return _cache[(name, exposed)] - except KeyError: - pass - - dic = {} - - for meth in exposed: - exec('''def %s(self, *args, **kwds): - return self._callmethod(%r, args, kwds)''' % (meth, meth), dic) - - ProxyType = type(name, (BaseProxy,), dic) - ProxyType._exposed_ = exposed - _cache[(name, exposed)] = ProxyType - return ProxyType - - -def AutoProxy(token, serializer, manager=None, authkey=None, - exposed=None, incref=True): - ''' - Return an auto-proxy for `token` - ''' - _Client = listener_client[serializer][1] - - if exposed is None: - conn = _Client(token.address, authkey=authkey) - try: - exposed = dispatch(conn, None, 'get_methods', (token,)) - finally: - conn.close() - - if authkey is None and manager is not None: - authkey = manager._authkey - if authkey is None: - authkey = process.current_process().authkey - - ProxyType = MakeProxyType('AutoProxy[%s]' % token.typeid, exposed) - proxy = ProxyType(token, serializer, manager=manager, authkey=authkey, - incref=incref) - proxy._isauto = True - return proxy - -# -# Types/callables which we will register with SyncManager -# - - -class Namespace: - - def __init__(self, **kwds): - self.__dict__.update(kwds) - - def __repr__(self): - _items = list(self.__dict__.items()) - temp = [] - for name, value in _items: - if not name.startswith('_'): - temp.append('%s=%r' % (name, value)) - temp.sort() - return '%s(%s)' % (self.__class__.__name__, ', '.join(temp)) - - -class Value: - - def __init__(self, typecode, value, lock=True): - self._typecode = typecode - self._value = value - - def get(self): - return self._value - - def set(self, value): - self._value = value - - def __repr__(self): - return '%s(%r, %r)' % (type(self).__name__, - self._typecode, self._value) - value = property(get, set) - - -def Array(typecode, sequence, lock=True): - return array.array(typecode, sequence) - -# -# Proxy types used by SyncManager -# - - -class IteratorProxy(BaseProxy): - if sys.version_info[0] == 3: - _exposed = ('__next__', 'send', 'throw', 'close') - else: - _exposed_ = ('__next__', 'next', 'send', 'throw', 'close') - - def next(self, *args): - return self._callmethod('next', args) - - def __iter__(self): - return self - - def __next__(self, *args): - return self._callmethod('__next__', args) - - def send(self, *args): - return self._callmethod('send', args) - - def throw(self, *args): - return self._callmethod('throw', args) - - def close(self, *args): - return self._callmethod('close', args) - - -class AcquirerProxy(BaseProxy): - _exposed_ = ('acquire', 'release') - - def acquire(self, blocking=True, timeout=None): - args = (blocking, ) if timeout is None else (blocking, timeout) - return self._callmethod('acquire', args) - - def release(self): - return self._callmethod('release') - - def __enter__(self): - return self._callmethod('acquire') - - def __exit__(self, exc_type, exc_val, exc_tb): - return self._callmethod('release') - - -class ConditionProxy(AcquirerProxy): - _exposed_ = ('acquire', 'release', 'wait', 'notify', 'notify_all') - - def wait(self, timeout=None): - return self._callmethod('wait', (timeout,)) - - def notify(self): - return self._callmethod('notify') - - def notify_all(self): - return self._callmethod('notify_all') - - def wait_for(self, predicate, timeout=None): - result = predicate() - if result: - return result - if timeout is not None: - endtime = monotonic() + timeout - else: - endtime = None - waittime = None - while not result: - if endtime is not None: - waittime = endtime - monotonic() - if waittime <= 0: - break - self.wait(waittime) - result = predicate() - return result - - -class EventProxy(BaseProxy): - _exposed_ = ('is_set', 'set', 'clear', 'wait') - - def is_set(self): - return self._callmethod('is_set') - - def set(self): - return self._callmethod('set') - - def clear(self): - return self._callmethod('clear') - - def wait(self, timeout=None): - return self._callmethod('wait', (timeout,)) - - -class BarrierProxy(BaseProxy): - _exposed_ = ('__getattribute__', 'wait', 'abort', 'reset') - - def wait(self, timeout=None): - return self._callmethod('wait', (timeout, )) - - def abort(self): - return self._callmethod('abort') - - def reset(self): - return self._callmethod('reset') - - @property - def parties(self): - return self._callmethod('__getattribute__', ('parties', )) - - @property - def n_waiting(self): - return self._callmethod('__getattribute__', ('n_waiting', )) - - @property - def broken(self): - return self._callmethod('__getattribute__', ('broken', )) - - -class NamespaceProxy(BaseProxy): - _exposed_ = ('__getattribute__', '__setattr__', '__delattr__') - - def __getattr__(self, key): - if key[0] == '_': - return object.__getattribute__(self, key) - callmethod = object.__getattribute__(self, '_callmethod') - return callmethod('__getattribute__', (key,)) - - def __setattr__(self, key, value): - if key[0] == '_': - return object.__setattr__(self, key, value) - callmethod = object.__getattribute__(self, '_callmethod') - return callmethod('__setattr__', (key, value)) - - def __delattr__(self, key): - if key[0] == '_': - return object.__delattr__(self, key) - callmethod = object.__getattribute__(self, '_callmethod') - return callmethod('__delattr__', (key,)) - - -class ValueProxy(BaseProxy): - _exposed_ = ('get', 'set') - - def get(self): - return self._callmethod('get') - - def set(self, value): - return self._callmethod('set', (value,)) - value = property(get, set) - - -_ListProxy_Attributes = ( - '__add__', '__contains__', '__delitem__', '__getitem__', '__len__', - '__mul__', '__reversed__', '__rmul__', '__setitem__', - 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', - 'reverse', 'sort', '__imul__', -) -if not PY3: - _ListProxy_Attributes += ('__getslice__', '__setslice__', '__delslice__') -BaseListProxy = MakeProxyType('BaseListProxy', _ListProxy_Attributes) - - -class ListProxy(BaseListProxy): - - def __iadd__(self, value): - self._callmethod('extend', (value,)) - return self - - def __imul__(self, value): - self._callmethod('__imul__', (value,)) - return self - - -DictProxy = MakeProxyType('DictProxy', ( - '__contains__', '__delitem__', '__getitem__', '__len__', - '__setitem__', 'clear', 'copy', 'get', 'has_key', 'items', - 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', -)) - - -_ArrayProxy_Attributes = ( - '__len__', '__getitem__', '__setitem__', -) -if not PY3: - _ArrayProxy_Attributes += ('__getslice__', '__setslice__') -ArrayProxy = MakeProxyType('ArrayProxy', _ArrayProxy_Attributes) - - -BasePoolProxy = MakeProxyType('PoolProxy', ( - 'apply', 'apply_async', 'close', 'imap', 'imap_unordered', 'join', - 'map', 'map_async', 'starmap', 'starmap_async', 'terminate', -)) -BasePoolProxy._method_to_typeid_ = { - 'apply_async': 'AsyncResult', - 'map_async': 'AsyncResult', - 'starmap_async': 'AsyncResult', - 'imap': 'Iterator', - 'imap_unordered': 'Iterator', -} - - -class PoolProxy(BasePoolProxy): - def __enter__(self): - return self - - def __exit__(self, *exc_info): - self.terminate() - - -# -# Definition of SyncManager -# - - -class SyncManager(BaseManager): - ''' - Subclass of `BaseManager` which supports a number of shared object types. - - The types registered are those intended for the synchronization - of threads, plus `dict`, `list` and `Namespace`. - - The `billiard.Manager()` function creates started instances of - this class. - ''' - -SyncManager.register('Queue', Queue) -SyncManager.register('JoinableQueue', Queue) -SyncManager.register('Event', threading.Event, EventProxy) -SyncManager.register('Lock', threading.Lock, AcquirerProxy) -SyncManager.register('RLock', threading.RLock, AcquirerProxy) -SyncManager.register('Semaphore', threading.Semaphore, AcquirerProxy) -SyncManager.register('BoundedSemaphore', threading.BoundedSemaphore, - AcquirerProxy) -SyncManager.register('Condition', threading.Condition, ConditionProxy) -if hasattr(threading, 'Barrier'): # PY3 - SyncManager.register('Barrier', threading.Barrier, BarrierProxy) -SyncManager.register('Pool', pool.Pool, PoolProxy) -SyncManager.register('list', list, ListProxy) -SyncManager.register('dict', dict, DictProxy) -SyncManager.register('Value', Value, ValueProxy) -SyncManager.register('Array', Array, ArrayProxy) -SyncManager.register('Namespace', Namespace, NamespaceProxy) - -# types returned by methods of PoolProxy -SyncManager.register('Iterator', proxytype=IteratorProxy, create_method=False) -SyncManager.register('AsyncResult', create_method=False) diff --git a/.venv/lib/python3.10/site-packages/billiard/pool.py b/.venv/lib/python3.10/site-packages/billiard/pool.py deleted file mode 100644 index 82bc53a..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/pool.py +++ /dev/null @@ -1,2052 +0,0 @@ -# -# Module providing the `Pool` class for managing a process pool -# -# multiprocessing/pool.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -# -# Imports -# -import copy -import errno -import itertools -import os -import platform -import signal -import sys -import threading -import time -import warnings - -from collections import deque -from functools import partial - -from . import cpu_count, get_context -from . import util -from .common import ( - TERM_SIGNAL, human_status, pickle_loads, reset_signals, restart_state, -) -from .compat import get_errno, mem_rss, send_offset -from .einfo import ExceptionInfo -from .dummy import DummyProcess -from .exceptions import ( - CoroStop, - RestartFreqExceeded, - SoftTimeLimitExceeded, - Terminated, - TimeLimitExceeded, - TimeoutError, - WorkerLostError, -) -from time import monotonic -from queue import Queue, Empty -from .util import Finalize, debug, warning - -MAXMEM_USED_FMT = """\ -child process exiting after exceeding memory limit ({0}KiB / {1}KiB) -""" - -PY3 = sys.version_info[0] == 3 - -if platform.system() == 'Windows': # pragma: no cover - # On Windows os.kill calls TerminateProcess which cannot be - # handled by # any process, so this is needed to terminate the task - # *and its children* (if any). - from ._win import kill_processtree as _kill # noqa - SIGKILL = TERM_SIGNAL -else: - from os import kill as _kill # noqa - SIGKILL = signal.SIGKILL - - -try: - TIMEOUT_MAX = threading.TIMEOUT_MAX -except AttributeError: # pragma: no cover - TIMEOUT_MAX = 1e10 # noqa - - -if sys.version_info >= (3, 3): - _Semaphore = threading.Semaphore -else: - # Semaphore is a factory function pointing to _Semaphore - _Semaphore = threading._Semaphore # noqa - -# -# Constants representing the state of a pool -# - -RUN = 0 -CLOSE = 1 -TERMINATE = 2 - -# -# Constants representing the state of a job -# - -ACK = 0 -READY = 1 -TASK = 2 -NACK = 3 -DEATH = 4 - -# -# Exit code constants -# -EX_OK = 0 -EX_FAILURE = 1 -EX_RECYCLE = 0x9B - - -# Signal used for soft time limits. -SIG_SOFT_TIMEOUT = getattr(signal, "SIGUSR1", None) - -# -# Miscellaneous -# - -LOST_WORKER_TIMEOUT = 10.0 -EX_OK = getattr(os, "EX_OK", 0) -GUARANTEE_MESSAGE_CONSUMPTION_RETRY_LIMIT = 300 -GUARANTEE_MESSAGE_CONSUMPTION_RETRY_INTERVAL = 0.1 - -job_counter = itertools.count() - -Lock = threading.Lock - - -def _get_send_offset(connection): - try: - native = connection.send_offset - except AttributeError: - native = None - if native is None: - return partial(send_offset, connection.fileno()) - return native - - -def mapstar(args): - return list(map(*args)) - - -def starmapstar(args): - return list(itertools.starmap(args[0], args[1])) - - -def error(msg, *args, **kwargs): - util.get_logger().error(msg, *args, **kwargs) - - -def stop_if_not_current(thread, timeout=None): - if thread is not threading.current_thread(): - thread.stop(timeout) - - -class LaxBoundedSemaphore(_Semaphore): - """Semaphore that checks that # release is <= # acquires, - but ignores if # releases >= value.""" - - def shrink(self): - self._initial_value -= 1 - self.acquire() - - if PY3: - - def __init__(self, value=1, verbose=None): - _Semaphore.__init__(self, value) - self._initial_value = value - - def grow(self): - with self._cond: - self._initial_value += 1 - self._value += 1 - self._cond.notify() - - def release(self): - cond = self._cond - with cond: - if self._value < self._initial_value: - self._value += 1 - cond.notify_all() - - def clear(self): - while self._value < self._initial_value: - _Semaphore.release(self) - else: - - def __init__(self, value=1, verbose=None): - _Semaphore.__init__(self, value, verbose) - self._initial_value = value - - def grow(self): - cond = self._Semaphore__cond - with cond: - self._initial_value += 1 - self._Semaphore__value += 1 - cond.notify() - - def release(self): # noqa - cond = self._Semaphore__cond - with cond: - if self._Semaphore__value < self._initial_value: - self._Semaphore__value += 1 - cond.notifyAll() - - def clear(self): # noqa - while self._Semaphore__value < self._initial_value: - _Semaphore.release(self) - -# -# Exceptions -# - - -class MaybeEncodingError(Exception): - """Wraps possible unpickleable errors, so they can be - safely sent through the socket.""" - - def __init__(self, exc, value): - self.exc = repr(exc) - self.value = repr(value) - super().__init__(self.exc, self.value) - - def __repr__(self): - return "<%s: %s>" % (self.__class__.__name__, str(self)) - - def __str__(self): - return "Error sending result: '%r'. Reason: '%r'." % ( - self.value, self.exc) - - -class WorkersJoined(Exception): - """All workers have terminated.""" - - -def soft_timeout_sighandler(signum, frame): - raise SoftTimeLimitExceeded() - -# -# Code run by worker processes -# - - -class Worker: - - def __init__(self, inq, outq, synq=None, initializer=None, initargs=(), - maxtasks=None, sentinel=None, on_exit=None, - sigprotection=True, wrap_exception=True, - max_memory_per_child=None, on_ready_counter=None): - assert maxtasks is None or (type(maxtasks) == int and maxtasks > 0) - self.initializer = initializer - self.initargs = initargs - self.maxtasks = maxtasks - self.max_memory_per_child = max_memory_per_child - self._shutdown = sentinel - self.on_exit = on_exit - self.sigprotection = sigprotection - self.inq, self.outq, self.synq = inq, outq, synq - self.wrap_exception = wrap_exception # XXX cannot disable yet - self.on_ready_counter = on_ready_counter - self.contribute_to_object(self) - - def contribute_to_object(self, obj): - obj.inq, obj.outq, obj.synq = self.inq, self.outq, self.synq - obj.inqW_fd = self.inq._writer.fileno() # inqueue write fd - obj.outqR_fd = self.outq._reader.fileno() # outqueue read fd - if self.synq: - obj.synqR_fd = self.synq._reader.fileno() # synqueue read fd - obj.synqW_fd = self.synq._writer.fileno() # synqueue write fd - obj.send_syn_offset = _get_send_offset(self.synq._writer) - else: - obj.synqR_fd = obj.synqW_fd = obj._send_syn_offset = None - obj._quick_put = self.inq._writer.send - obj._quick_get = self.outq._reader.recv - obj.send_job_offset = _get_send_offset(self.inq._writer) - return obj - - def __reduce__(self): - return self.__class__, ( - self.inq, self.outq, self.synq, self.initializer, - self.initargs, self.maxtasks, self._shutdown, self.on_exit, - self.sigprotection, self.wrap_exception, self.max_memory_per_child, - ) - - def __call__(self): - _exit = sys.exit - _exitcode = [None] - - def exit(status=None): - _exitcode[0] = status - return _exit(status) - sys.exit = exit - - pid = os.getpid() - - self._make_child_methods() - self.after_fork() - self.on_loop_start(pid=pid) # callback on loop start - try: - sys.exit(self.workloop(pid=pid)) - except Exception as exc: - error('Pool process %r error: %r', self, exc, exc_info=1) - self._do_exit(pid, _exitcode[0], exc) - finally: - self._do_exit(pid, _exitcode[0], None) - - def _do_exit(self, pid, exitcode, exc=None): - if exitcode is None: - exitcode = EX_FAILURE if exc else EX_OK - - if self.on_exit is not None: - self.on_exit(pid, exitcode) - - if sys.platform != 'win32': - try: - self.outq.put((DEATH, (pid, exitcode))) - time.sleep(1) - finally: - os._exit(exitcode) - else: - os._exit(exitcode) - - def on_loop_start(self, pid): - pass - - def prepare_result(self, result): - return result - - def workloop(self, debug=debug, now=monotonic, pid=None): - pid = pid or os.getpid() - put = self.outq.put - inqW_fd = self.inqW_fd - synqW_fd = self.synqW_fd - maxtasks = self.maxtasks - max_memory_per_child = self.max_memory_per_child or 0 - prepare_result = self.prepare_result - - wait_for_job = self.wait_for_job - _wait_for_syn = self.wait_for_syn - - def wait_for_syn(jid): - i = 0 - while 1: - if i > 60: - error('!!!WAIT FOR ACK TIMEOUT: job:%r fd:%r!!!', - jid, self.synq._reader.fileno(), exc_info=1) - req = _wait_for_syn() - if req: - type_, args = req - if type_ == NACK: - return False - assert type_ == ACK - return True - i += 1 - - completed = 0 - try: - while maxtasks is None or (maxtasks and completed < maxtasks): - req = wait_for_job() - if req: - type_, args_ = req - assert type_ == TASK - job, i, fun, args, kwargs = args_ - put((ACK, (job, i, now(), pid, synqW_fd))) - if _wait_for_syn: - confirm = wait_for_syn(job) - if not confirm: - continue # received NACK - try: - result = (True, prepare_result(fun(*args, **kwargs))) - except Exception: - result = (False, ExceptionInfo()) - try: - put((READY, (job, i, result, inqW_fd))) - except Exception as exc: - _, _, tb = sys.exc_info() - try: - wrapped = MaybeEncodingError(exc, result[1]) - einfo = ExceptionInfo(( - MaybeEncodingError, wrapped, tb, - )) - put((READY, (job, i, (False, einfo), inqW_fd))) - finally: - del(tb) - completed += 1 - if max_memory_per_child > 0: - used_kb = mem_rss() - if used_kb <= 0: - error('worker unable to determine memory usage') - if used_kb > 0 and used_kb > max_memory_per_child: - warning(MAXMEM_USED_FMT.format( - used_kb, max_memory_per_child)) - return EX_RECYCLE - - debug('worker exiting after %d tasks', completed) - if maxtasks: - return EX_RECYCLE if completed == maxtasks else EX_FAILURE - return EX_OK - finally: - # Before exiting the worker, we want to ensure that that all - # messages produced by the worker have been consumed by the main - # process. This prevents the worker being terminated prematurely - # and messages being lost. - self._ensure_messages_consumed(completed=completed) - - def _ensure_messages_consumed(self, completed): - """ Returns true if all messages sent out have been received and - consumed within a reasonable amount of time """ - - if not self.on_ready_counter: - return False - - for retry in range(GUARANTEE_MESSAGE_CONSUMPTION_RETRY_LIMIT): - if self.on_ready_counter.value >= completed: - debug('ensured messages consumed after %d retries', retry) - return True - time.sleep(GUARANTEE_MESSAGE_CONSUMPTION_RETRY_INTERVAL) - warning('could not ensure all messages were consumed prior to ' - 'exiting') - return False - - def after_fork(self): - if hasattr(self.inq, '_writer'): - self.inq._writer.close() - if hasattr(self.outq, '_reader'): - self.outq._reader.close() - - if self.initializer is not None: - self.initializer(*self.initargs) - - # Make sure all exiting signals call finally: blocks. - # This is important for the semaphore to be released. - reset_signals(full=self.sigprotection) - - # install signal handler for soft timeouts. - if SIG_SOFT_TIMEOUT is not None: - signal.signal(SIG_SOFT_TIMEOUT, soft_timeout_sighandler) - - try: - signal.signal(signal.SIGINT, signal.SIG_IGN) - except AttributeError: - pass - - def _make_recv_method(self, conn): - get = conn.get - - if hasattr(conn, '_reader'): - _poll = conn._reader.poll - if hasattr(conn, 'get_payload') and conn.get_payload: - get_payload = conn.get_payload - - def _recv(timeout, loads=pickle_loads): - return True, loads(get_payload()) - else: - def _recv(timeout): # noqa - if _poll(timeout): - return True, get() - return False, None - else: - def _recv(timeout): # noqa - try: - return True, get(timeout=timeout) - except Queue.Empty: - return False, None - return _recv - - def _make_child_methods(self, loads=pickle_loads): - self.wait_for_job = self._make_protected_receive(self.inq) - self.wait_for_syn = (self._make_protected_receive(self.synq) - if self.synq else None) - - def _make_protected_receive(self, conn): - _receive = self._make_recv_method(conn) - should_shutdown = self._shutdown.is_set if self._shutdown else None - - def receive(debug=debug): - if should_shutdown and should_shutdown(): - debug('worker got sentinel -- exiting') - raise SystemExit(EX_OK) - try: - ready, req = _receive(1.0) - if not ready: - return None - except (EOFError, IOError) as exc: - if get_errno(exc) == errno.EINTR: - return None # interrupted, maybe by gdb - debug('worker got %s -- exiting', type(exc).__name__) - raise SystemExit(EX_FAILURE) - if req is None: - debug('worker got sentinel -- exiting') - raise SystemExit(EX_FAILURE) - return req - - return receive - - -# -# Class representing a process pool -# - - -class PoolThread(DummyProcess): - - def __init__(self, *args, **kwargs): - DummyProcess.__init__(self) - self._state = RUN - self._was_started = False - self.daemon = True - - def run(self): - try: - return self.body() - except RestartFreqExceeded as exc: - error("Thread %r crashed: %r", type(self).__name__, exc, - exc_info=1) - _kill(os.getpid(), TERM_SIGNAL) - sys.exit() - except Exception as exc: - error("Thread %r crashed: %r", type(self).__name__, exc, - exc_info=1) - os._exit(1) - - def start(self, *args, **kwargs): - self._was_started = True - super(PoolThread, self).start(*args, **kwargs) - - def on_stop_not_started(self): - pass - - def stop(self, timeout=None): - if self._was_started: - self.join(timeout) - return - self.on_stop_not_started() - - def terminate(self): - self._state = TERMINATE - - def close(self): - self._state = CLOSE - - -class Supervisor(PoolThread): - - def __init__(self, pool): - self.pool = pool - super().__init__() - - def body(self): - debug('worker handler starting') - - time.sleep(0.8) - - pool = self.pool - - try: - # do a burst at startup to verify that we can start - # our pool processes, and in that time we lower - # the max restart frequency. - prev_state = pool.restart_state - pool.restart_state = restart_state(10 * pool._processes, 1) - for _ in range(10): - if self._state == RUN and pool._state == RUN: - pool._maintain_pool() - time.sleep(0.1) - - # Keep maintaining workers until the cache gets drained, unless - # the pool is terminated - pool.restart_state = prev_state - while self._state == RUN and pool._state == RUN: - pool._maintain_pool() - time.sleep(0.8) - except RestartFreqExceeded: - pool.close() - pool.join() - raise - debug('worker handler exiting') - - -class TaskHandler(PoolThread): - - def __init__(self, taskqueue, put, outqueue, pool, cache): - self.taskqueue = taskqueue - self.put = put - self.outqueue = outqueue - self.pool = pool - self.cache = cache - super().__init__() - - def body(self): - cache = self.cache - taskqueue = self.taskqueue - put = self.put - - for taskseq, set_length in iter(taskqueue.get, None): - task = None - i = -1 - try: - for i, task in enumerate(taskseq): - if self._state: - debug('task handler found thread._state != RUN') - break - try: - put(task) - except IOError: - debug('could not put task on queue') - break - except Exception: - job, ind = task[:2] - try: - cache[job]._set(ind, (False, ExceptionInfo())) - except KeyError: - pass - else: - if set_length: - debug('doing set_length()') - set_length(i + 1) - continue - break - except Exception: - job, ind = task[:2] if task else (0, 0) - if job in cache: - cache[job]._set(ind + 1, (False, ExceptionInfo())) - if set_length: - util.debug('doing set_length()') - set_length(i + 1) - else: - debug('task handler got sentinel') - - self.tell_others() - - def tell_others(self): - outqueue = self.outqueue - put = self.put - pool = self.pool - - try: - # tell result handler to finish when cache is empty - debug('task handler sending sentinel to result handler') - outqueue.put(None) - - # tell workers there is no more work - debug('task handler sending sentinel to workers') - for p in pool: - put(None) - except IOError: - debug('task handler got IOError when sending sentinels') - - debug('task handler exiting') - - def on_stop_not_started(self): - self.tell_others() - - -class TimeoutHandler(PoolThread): - - def __init__(self, processes, cache, t_soft, t_hard): - self.processes = processes - self.cache = cache - self.t_soft = t_soft - self.t_hard = t_hard - self._it = None - super().__init__() - - def _process_by_pid(self, pid): - return next(( - (proc, i) for i, proc in enumerate(self.processes) - if proc.pid == pid - ), (None, None)) - - def on_soft_timeout(self, job): - debug('soft time limit exceeded for %r', job) - process, _index = self._process_by_pid(job._worker_pid) - if not process: - return - - # Run timeout callback - job.handle_timeout(soft=True) - - try: - _kill(job._worker_pid, SIG_SOFT_TIMEOUT) - except OSError as exc: - if get_errno(exc) != errno.ESRCH: - raise - - def on_hard_timeout(self, job): - if job.ready(): - return - debug('hard time limit exceeded for %r', job) - # Remove from cache and set return value to an exception - try: - raise TimeLimitExceeded(job._timeout) - except TimeLimitExceeded: - job._set(job._job, (False, ExceptionInfo())) - else: # pragma: no cover - pass - - # Remove from _pool - process, _index = self._process_by_pid(job._worker_pid) - - # Run timeout callback - job.handle_timeout(soft=False) - - if process: - self._trywaitkill(process) - - def _trywaitkill(self, worker): - debug('timeout: sending TERM to %s', worker._name) - try: - if os.getpgid(worker.pid) == worker.pid: - debug("worker %s is a group leader. It is safe to kill (SIGTERM) the whole group", worker.pid) - os.killpg(os.getpgid(worker.pid), signal.SIGTERM) - else: - worker.terminate() - except OSError: - pass - else: - if worker._popen.wait(timeout=0.1): - return - debug('timeout: TERM timed-out, now sending KILL to %s', worker._name) - try: - if os.getpgid(worker.pid) == worker.pid: - debug("worker %s is a group leader. It is safe to kill (SIGKILL) the whole group", worker.pid) - os.killpg(os.getpgid(worker.pid), signal.SIGKILL) - else: - _kill(worker.pid, SIGKILL) - except OSError: - pass - - def handle_timeouts(self): - t_hard, t_soft = self.t_hard, self.t_soft - dirty = set() - on_soft_timeout = self.on_soft_timeout - on_hard_timeout = self.on_hard_timeout - - def _timed_out(start, timeout): - if not start or not timeout: - return False - if monotonic() >= start + timeout: - return True - - # Inner-loop - while self._state == RUN: - # Perform a shallow copy before iteration because keys can change. - # A deep copy fails (on shutdown) due to thread.lock objects. - # https://github.com/celery/billiard/issues/260 - cache = copy.copy(self.cache) - - # Remove dirty items not in cache anymore - if dirty: - dirty = set(k for k in dirty if k in cache) - - for i, job in cache.items(): - ack_time = job._time_accepted - soft_timeout = job._soft_timeout - if soft_timeout is None: - soft_timeout = t_soft - hard_timeout = job._timeout - if hard_timeout is None: - hard_timeout = t_hard - if _timed_out(ack_time, hard_timeout): - on_hard_timeout(job) - elif i not in dirty and _timed_out(ack_time, soft_timeout): - on_soft_timeout(job) - dirty.add(i) - yield - - def body(self): - while self._state == RUN: - try: - for _ in self.handle_timeouts(): - time.sleep(1.0) # don't spin - except CoroStop: - break - debug('timeout handler exiting') - - def handle_event(self, *args): - if self._it is None: - self._it = self.handle_timeouts() - try: - next(self._it) - except StopIteration: - self._it = None - - -class ResultHandler(PoolThread): - - def __init__(self, outqueue, get, cache, poll, - join_exited_workers, putlock, restart_state, - check_timeouts, on_job_ready, on_ready_counters=None): - self.outqueue = outqueue - self.get = get - self.cache = cache - self.poll = poll - self.join_exited_workers = join_exited_workers - self.putlock = putlock - self.restart_state = restart_state - self._it = None - self._shutdown_complete = False - self.check_timeouts = check_timeouts - self.on_job_ready = on_job_ready - self.on_ready_counters = on_ready_counters - self._make_methods() - super().__init__() - - def on_stop_not_started(self): - # used when pool started without result handler thread. - self.finish_at_shutdown(handle_timeouts=True) - - def _make_methods(self): - cache = self.cache - putlock = self.putlock - restart_state = self.restart_state - on_job_ready = self.on_job_ready - - def on_ack(job, i, time_accepted, pid, synqW_fd): - restart_state.R = 0 - try: - cache[job]._ack(i, time_accepted, pid, synqW_fd) - except (KeyError, AttributeError): - # Object gone or doesn't support _ack (e.g. IMAPIterator). - pass - - def on_ready(job, i, obj, inqW_fd): - if on_job_ready is not None: - on_job_ready(job, i, obj, inqW_fd) - try: - item = cache[job] - except KeyError: - return - - if self.on_ready_counters: - worker_pid = next(iter(item.worker_pids()), None) - if worker_pid and worker_pid in self.on_ready_counters: - on_ready_counter = self.on_ready_counters[worker_pid] - with on_ready_counter.get_lock(): - on_ready_counter.value += 1 - - if not item.ready(): - if putlock is not None: - putlock.release() - try: - item._set(i, obj) - except KeyError: - pass - - def on_death(pid, exitcode): - try: - os.kill(pid, TERM_SIGNAL) - except OSError as exc: - if get_errno(exc) != errno.ESRCH: - raise - - state_handlers = self.state_handlers = { - ACK: on_ack, READY: on_ready, DEATH: on_death - } - - def on_state_change(task): - state, args = task - try: - state_handlers[state](*args) - except KeyError: - debug("Unknown job state: %s (args=%s)", state, args) - self.on_state_change = on_state_change - - def _process_result(self, timeout=1.0): - poll = self.poll - on_state_change = self.on_state_change - - while 1: - try: - ready, task = poll(timeout) - except (IOError, EOFError) as exc: - debug('result handler got %r -- exiting', exc) - raise CoroStop() - - if self._state: - assert self._state == TERMINATE - debug('result handler found thread._state=TERMINATE') - raise CoroStop() - - if ready: - if task is None: - debug('result handler got sentinel') - raise CoroStop() - on_state_change(task) - if timeout != 0: # blocking - break - else: - break - yield - - def handle_event(self, fileno=None, events=None): - if self._state == RUN: - if self._it is None: - self._it = self._process_result(0) # non-blocking - try: - next(self._it) - except (StopIteration, CoroStop): - self._it = None - - def body(self): - debug('result handler starting') - try: - while self._state == RUN: - try: - for _ in self._process_result(1.0): # blocking - pass - except CoroStop: - break - finally: - self.finish_at_shutdown() - - def finish_at_shutdown(self, handle_timeouts=False): - self._shutdown_complete = True - get = self.get - outqueue = self.outqueue - cache = self.cache - poll = self.poll - join_exited_workers = self.join_exited_workers - check_timeouts = self.check_timeouts - on_state_change = self.on_state_change - - time_terminate = None - while cache and self._state != TERMINATE: - if check_timeouts is not None: - check_timeouts() - try: - ready, task = poll(1.0) - except (IOError, EOFError) as exc: - debug('result handler got %r -- exiting', exc) - return - - if ready: - if task is None: - debug('result handler ignoring extra sentinel') - continue - - on_state_change(task) - try: - join_exited_workers(shutdown=True) - except WorkersJoined: - now = monotonic() - if not time_terminate: - time_terminate = now - else: - if now - time_terminate > 5.0: - debug('result handler exiting: timed out') - break - debug('result handler: all workers terminated, ' - 'timeout in %ss', - abs(min(now - time_terminate - 5.0, 0))) - - if hasattr(outqueue, '_reader'): - debug('ensuring that outqueue is not full') - # If we don't make room available in outqueue then - # attempts to add the sentinel (None) to outqueue may - # block. There is guaranteed to be no more than 2 sentinels. - try: - for i in range(10): - if not outqueue._reader.poll(): - break - get() - except (IOError, EOFError): - pass - - debug('result handler exiting: len(cache)=%s, thread._state=%s', - len(cache), self._state) - - -class Pool: - ''' - Class which supports an async version of applying functions to arguments. - ''' - _wrap_exception = True - Worker = Worker - Supervisor = Supervisor - TaskHandler = TaskHandler - TimeoutHandler = TimeoutHandler - ResultHandler = ResultHandler - SoftTimeLimitExceeded = SoftTimeLimitExceeded - - def __init__(self, processes=None, initializer=None, initargs=(), - maxtasksperchild=None, timeout=None, soft_timeout=None, - lost_worker_timeout=None, - max_restarts=None, max_restart_freq=1, - on_process_up=None, - on_process_down=None, - on_timeout_set=None, - on_timeout_cancel=None, - threads=True, - semaphore=None, - putlocks=False, - allow_restart=False, - synack=False, - on_process_exit=None, - context=None, - max_memory_per_child=None, - enable_timeouts=False, - **kwargs): - self._ctx = context or get_context() - self.synack = synack - self._setup_queues() - self._taskqueue = Queue() - self._cache = {} - self._state = RUN - self.timeout = timeout - self.soft_timeout = soft_timeout - self._maxtasksperchild = maxtasksperchild - self._max_memory_per_child = max_memory_per_child - self._initializer = initializer - self._initargs = initargs - self._on_process_exit = on_process_exit - self.lost_worker_timeout = lost_worker_timeout or LOST_WORKER_TIMEOUT - self.on_process_up = on_process_up - self.on_process_down = on_process_down - self.on_timeout_set = on_timeout_set - self.on_timeout_cancel = on_timeout_cancel - self.threads = threads - self.readers = {} - self.allow_restart = allow_restart - - self.enable_timeouts = bool( - enable_timeouts or - self.timeout is not None or - self.soft_timeout is not None - ) - - if soft_timeout and SIG_SOFT_TIMEOUT is None: - warnings.warn(UserWarning( - "Soft timeouts are not supported: " - "on this platform: It does not have the SIGUSR1 signal.", - )) - soft_timeout = None - - self._processes = self.cpu_count() if processes is None else processes - self.max_restarts = max_restarts or round(self._processes * 100) - self.restart_state = restart_state(max_restarts, max_restart_freq or 1) - - if initializer is not None and not callable(initializer): - raise TypeError('initializer must be a callable') - - if on_process_exit is not None and not callable(on_process_exit): - raise TypeError('on_process_exit must be callable') - - self._Process = self._ctx.Process - - self._pool = [] - self._poolctrl = {} - self._on_ready_counters = {} - self.putlocks = putlocks - self._putlock = semaphore or LaxBoundedSemaphore(self._processes) - for i in range(self._processes): - self._create_worker_process(i) - - self._worker_handler = self.Supervisor(self) - if threads: - self._worker_handler.start() - - self._task_handler = self.TaskHandler(self._taskqueue, - self._quick_put, - self._outqueue, - self._pool, - self._cache) - if threads: - self._task_handler.start() - - self.check_timeouts = None - - # Thread killing timedout jobs. - if self.enable_timeouts: - self._timeout_handler = self.TimeoutHandler( - self._pool, self._cache, - self.soft_timeout, self.timeout, - ) - self._timeout_handler_mutex = Lock() - self._timeout_handler_started = False - self._start_timeout_handler() - # If running without threads, we need to check for timeouts - # while waiting for unfinished work at shutdown. - if not threads: - self.check_timeouts = self._timeout_handler.handle_event - else: - self._timeout_handler = None - self._timeout_handler_started = False - self._timeout_handler_mutex = None - - # Thread processing results in the outqueue. - self._result_handler = self.create_result_handler() - self.handle_result_event = self._result_handler.handle_event - - if threads: - self._result_handler.start() - - self._terminate = Finalize( - self, self._terminate_pool, - args=(self._taskqueue, self._inqueue, self._outqueue, - self._pool, self._worker_handler, self._task_handler, - self._result_handler, self._cache, - self._timeout_handler, - self._help_stuff_finish_args()), - exitpriority=15, - ) - - def Process(self, *args, **kwds): - return self._Process(*args, **kwds) - - def WorkerProcess(self, worker): - return worker.contribute_to_object(self.Process(target=worker)) - - def create_result_handler(self, **extra_kwargs): - return self.ResultHandler( - self._outqueue, self._quick_get, self._cache, - self._poll_result, self._join_exited_workers, - self._putlock, self.restart_state, self.check_timeouts, - self.on_job_ready, on_ready_counters=self._on_ready_counters, - **extra_kwargs - ) - - def on_job_ready(self, job, i, obj, inqW_fd): - pass - - def _help_stuff_finish_args(self): - return self._inqueue, self._task_handler, self._pool - - def cpu_count(self): - try: - return cpu_count() - except NotImplementedError: - return 1 - - def handle_result_event(self, *args): - return self._result_handler.handle_event(*args) - - def _process_register_queues(self, worker, queues): - pass - - def _process_by_pid(self, pid): - return next(( - (proc, i) for i, proc in enumerate(self._pool) - if proc.pid == pid - ), (None, None)) - - def get_process_queues(self): - return self._inqueue, self._outqueue, None - - def _create_worker_process(self, i): - sentinel = self._ctx.Event() if self.allow_restart else None - inq, outq, synq = self.get_process_queues() - on_ready_counter = self._ctx.Value('i') - w = self.WorkerProcess(self.Worker( - inq, outq, synq, self._initializer, self._initargs, - self._maxtasksperchild, sentinel, self._on_process_exit, - # Need to handle all signals if using the ipc semaphore, - # to make sure the semaphore is released. - sigprotection=self.threads, - wrap_exception=self._wrap_exception, - max_memory_per_child=self._max_memory_per_child, - on_ready_counter=on_ready_counter, - )) - self._pool.append(w) - self._process_register_queues(w, (inq, outq, synq)) - w.name = w.name.replace('Process', 'PoolWorker') - w.daemon = True - w.index = i - w.start() - self._poolctrl[w.pid] = sentinel - self._on_ready_counters[w.pid] = on_ready_counter - if self.on_process_up: - self.on_process_up(w) - return w - - def process_flush_queues(self, worker): - pass - - def _join_exited_workers(self, shutdown=False): - """Cleanup after any worker processes which have exited due to - reaching their specified lifetime. Returns True if any workers were - cleaned up. - """ - now = None - # The worker may have published a result before being terminated, - # but we have no way to accurately tell if it did. So we wait for - # _lost_worker_timeout seconds before we mark the job with - # WorkerLostError. - for job in [job for job in list(self._cache.values()) - if not job.ready() and job._worker_lost]: - now = now or monotonic() - lost_time, lost_ret = job._worker_lost - if now - lost_time > job._lost_worker_timeout: - self.mark_as_worker_lost(job, lost_ret) - - if shutdown and not len(self._pool): - raise WorkersJoined() - - cleaned, exitcodes = {}, {} - for i in reversed(range(len(self._pool))): - worker = self._pool[i] - exitcode = worker.exitcode - popen = worker._popen - if popen is None or exitcode is not None: - # worker exited - debug('Supervisor: cleaning up worker %d', i) - if popen is not None: - worker.join() - debug('Supervisor: worked %d joined', i) - cleaned[worker.pid] = worker - exitcodes[worker.pid] = exitcode - if exitcode not in (EX_OK, EX_RECYCLE) and \ - not getattr(worker, '_controlled_termination', False): - error( - 'Process %r pid:%r exited with %r', - worker.name, worker.pid, human_status(exitcode), - exc_info=0, - ) - self.process_flush_queues(worker) - del self._pool[i] - del self._poolctrl[worker.pid] - del self._on_ready_counters[worker.pid] - if cleaned: - all_pids = [w.pid for w in self._pool] - for job in list(self._cache.values()): - acked_by_gone = next( - (pid for pid in job.worker_pids() - if pid in cleaned or pid not in all_pids), - None - ) - # already accepted by process - if acked_by_gone: - self.on_job_process_down(job, acked_by_gone) - if not job.ready(): - exitcode = exitcodes.get(acked_by_gone) or 0 - proc = cleaned.get(acked_by_gone) - if proc and getattr(proc, '_job_terminated', False): - job._set_terminated(exitcode) - else: - self.on_job_process_lost( - job, acked_by_gone, exitcode, - ) - else: - # started writing to - write_to = job._write_to - # was scheduled to write to - sched_for = job._scheduled_for - - if write_to and not write_to._is_alive(): - self.on_job_process_down(job, write_to.pid) - elif sched_for and not sched_for._is_alive(): - self.on_job_process_down(job, sched_for.pid) - - for worker in cleaned.values(): - if self.on_process_down: - if not shutdown: - self._process_cleanup_queues(worker) - self.on_process_down(worker) - return list(exitcodes.values()) - return [] - - def on_partial_read(self, job, worker): - pass - - def _process_cleanup_queues(self, worker): - pass - - def on_job_process_down(self, job, pid_gone): - pass - - def on_job_process_lost(self, job, pid, exitcode): - job._worker_lost = (monotonic(), exitcode) - - def mark_as_worker_lost(self, job, exitcode): - try: - raise WorkerLostError( - 'Worker exited prematurely: {0} Job: {1}.'.format( - human_status(exitcode), job._job), - ) - except WorkerLostError: - job._set(None, (False, ExceptionInfo())) - else: # pragma: no cover - pass - - def __enter__(self): - return self - - def __exit__(self, *exc_info): - return self.terminate() - - def on_grow(self, n): - pass - - def on_shrink(self, n): - pass - - def shrink(self, n=1): - for i, worker in enumerate(self._iterinactive()): - self._processes -= 1 - if self._putlock: - self._putlock.shrink() - worker.terminate_controlled() - self.on_shrink(1) - if i >= n - 1: - break - else: - raise ValueError("Can't shrink pool. All processes busy!") - - def grow(self, n=1): - for i in range(n): - self._processes += 1 - if self._putlock: - self._putlock.grow() - self.on_grow(n) - - def _iterinactive(self): - for worker in self._pool: - if not self._worker_active(worker): - yield worker - - def _worker_active(self, worker): - for job in self._cache.values(): - if worker.pid in job.worker_pids(): - return True - return False - - def _repopulate_pool(self, exitcodes): - """Bring the number of pool processes up to the specified number, - for use after reaping workers which have exited. - """ - for i in range(self._processes - len(self._pool)): - if self._state != RUN: - return - try: - if exitcodes and exitcodes[i] not in (EX_OK, EX_RECYCLE): - self.restart_state.step() - except IndexError: - self.restart_state.step() - self._create_worker_process(self._avail_index()) - debug('added worker') - - def _avail_index(self): - assert len(self._pool) < self._processes - indices = set(p.index for p in self._pool) - return next(i for i in range(self._processes) if i not in indices) - - def did_start_ok(self): - return not self._join_exited_workers() - - def _maintain_pool(self): - """"Clean up any exited workers and start replacements for them. - """ - joined = self._join_exited_workers() - self._repopulate_pool(joined) - for i in range(len(joined)): - if self._putlock is not None: - self._putlock.release() - - def maintain_pool(self): - if self._worker_handler._state == RUN and self._state == RUN: - try: - self._maintain_pool() - except RestartFreqExceeded: - self.close() - self.join() - raise - except OSError as exc: - if get_errno(exc) == errno.ENOMEM: - raise MemoryError from exc - raise - - def _setup_queues(self): - self._inqueue = self._ctx.SimpleQueue() - self._outqueue = self._ctx.SimpleQueue() - self._quick_put = self._inqueue._writer.send - self._quick_get = self._outqueue._reader.recv - - def _poll_result(timeout): - if self._outqueue._reader.poll(timeout): - return True, self._quick_get() - return False, None - self._poll_result = _poll_result - - def _start_timeout_handler(self): - # ensure more than one thread does not start the timeout handler - # thread at once. - if self.threads and self._timeout_handler is not None: - with self._timeout_handler_mutex: - if not self._timeout_handler_started: - self._timeout_handler_started = True - self._timeout_handler.start() - - def apply(self, func, args=(), kwds={}): - ''' - Equivalent of `func(*args, **kwargs)`. - ''' - if self._state == RUN: - return self.apply_async(func, args, kwds).get() - - def starmap(self, func, iterable, chunksize=None): - ''' - Like `map()` method but the elements of the `iterable` are expected to - be iterables as well and will be unpacked as arguments. Hence - `func` and (a, b) becomes func(a, b). - ''' - if self._state == RUN: - return self._map_async(func, iterable, - starmapstar, chunksize).get() - - def starmap_async(self, func, iterable, chunksize=None, - callback=None, error_callback=None): - ''' - Asynchronous version of `starmap()` method. - ''' - if self._state == RUN: - return self._map_async(func, iterable, starmapstar, chunksize, - callback, error_callback) - - def map(self, func, iterable, chunksize=None): - ''' - Apply `func` to each element in `iterable`, collecting the results - in a list that is returned. - ''' - if self._state == RUN: - return self.map_async(func, iterable, chunksize).get() - - def imap(self, func, iterable, chunksize=1, lost_worker_timeout=None): - ''' - Equivalent of `map()` -- can be MUCH slower than `Pool.map()`. - ''' - if self._state != RUN: - return - lost_worker_timeout = lost_worker_timeout or self.lost_worker_timeout - if chunksize == 1: - result = IMapIterator(self._cache, - lost_worker_timeout=lost_worker_timeout) - self._taskqueue.put(( - ((TASK, (result._job, i, func, (x,), {})) - for i, x in enumerate(iterable)), - result._set_length, - )) - return result - else: - assert chunksize > 1 - task_batches = Pool._get_tasks(func, iterable, chunksize) - result = IMapIterator(self._cache, - lost_worker_timeout=lost_worker_timeout) - self._taskqueue.put(( - ((TASK, (result._job, i, mapstar, (x,), {})) - for i, x in enumerate(task_batches)), - result._set_length, - )) - return (item for chunk in result for item in chunk) - - def imap_unordered(self, func, iterable, chunksize=1, - lost_worker_timeout=None): - ''' - Like `imap()` method but ordering of results is arbitrary. - ''' - if self._state != RUN: - return - lost_worker_timeout = lost_worker_timeout or self.lost_worker_timeout - if chunksize == 1: - result = IMapUnorderedIterator( - self._cache, lost_worker_timeout=lost_worker_timeout, - ) - self._taskqueue.put(( - ((TASK, (result._job, i, func, (x,), {})) - for i, x in enumerate(iterable)), - result._set_length, - )) - return result - else: - assert chunksize > 1 - task_batches = Pool._get_tasks(func, iterable, chunksize) - result = IMapUnorderedIterator( - self._cache, lost_worker_timeout=lost_worker_timeout, - ) - self._taskqueue.put(( - ((TASK, (result._job, i, mapstar, (x,), {})) - for i, x in enumerate(task_batches)), - result._set_length, - )) - return (item for chunk in result for item in chunk) - - def apply_async(self, func, args=(), kwds={}, - callback=None, error_callback=None, accept_callback=None, - timeout_callback=None, waitforslot=None, - soft_timeout=None, timeout=None, lost_worker_timeout=None, - callbacks_propagate=(), - correlation_id=None): - ''' - Asynchronous equivalent of `apply()` method. - - Callback is called when the functions return value is ready. - The accept callback is called when the job is accepted to be executed. - - Simplified the flow is like this: - - >>> def apply_async(func, args, kwds, callback, accept_callback): - ... if accept_callback: - ... accept_callback() - ... retval = func(*args, **kwds) - ... if callback: - ... callback(retval) - - ''' - if self._state != RUN: - return - soft_timeout = soft_timeout or self.soft_timeout - timeout = timeout or self.timeout - lost_worker_timeout = lost_worker_timeout or self.lost_worker_timeout - if soft_timeout and SIG_SOFT_TIMEOUT is None: - warnings.warn(UserWarning( - "Soft timeouts are not supported: " - "on this platform: It does not have the SIGUSR1 signal.", - )) - soft_timeout = None - if self._state == RUN: - waitforslot = self.putlocks if waitforslot is None else waitforslot - if waitforslot and self._putlock is not None: - self._putlock.acquire() - result = ApplyResult( - self._cache, callback, accept_callback, timeout_callback, - error_callback, soft_timeout, timeout, lost_worker_timeout, - on_timeout_set=self.on_timeout_set, - on_timeout_cancel=self.on_timeout_cancel, - callbacks_propagate=callbacks_propagate, - send_ack=self.send_ack if self.synack else None, - correlation_id=correlation_id, - ) - if timeout or soft_timeout: - # start the timeout handler thread when required. - self._start_timeout_handler() - if self.threads: - self._taskqueue.put(([(TASK, (result._job, None, - func, args, kwds))], None)) - else: - self._quick_put((TASK, (result._job, None, func, args, kwds))) - return result - - def send_ack(self, response, job, i, fd): - pass - - def terminate_job(self, pid, sig=None): - proc, _ = self._process_by_pid(pid) - if proc is not None: - try: - _kill(pid, sig or TERM_SIGNAL) - except OSError as exc: - if get_errno(exc) != errno.ESRCH: - raise - else: - proc._controlled_termination = True - proc._job_terminated = True - - def map_async(self, func, iterable, chunksize=None, - callback=None, error_callback=None): - ''' - Asynchronous equivalent of `map()` method. - ''' - return self._map_async( - func, iterable, mapstar, chunksize, callback, error_callback, - ) - - def _map_async(self, func, iterable, mapper, chunksize=None, - callback=None, error_callback=None): - ''' - Helper function to implement map, starmap and their async counterparts. - ''' - if self._state != RUN: - return - if not hasattr(iterable, '__len__'): - iterable = list(iterable) - - if chunksize is None: - chunksize, extra = divmod(len(iterable), len(self._pool) * 4) - if extra: - chunksize += 1 - if len(iterable) == 0: - chunksize = 0 - - task_batches = Pool._get_tasks(func, iterable, chunksize) - result = MapResult(self._cache, chunksize, len(iterable), callback, - error_callback=error_callback) - self._taskqueue.put((((TASK, (result._job, i, mapper, (x,), {})) - for i, x in enumerate(task_batches)), None)) - return result - - @staticmethod - def _get_tasks(func, it, size): - it = iter(it) - while 1: - x = tuple(itertools.islice(it, size)) - if not x: - return - yield (func, x) - - def __reduce__(self): - raise NotImplementedError( - 'pool objects cannot be passed between processes or pickled', - ) - - def close(self): - debug('closing pool') - if self._state == RUN: - self._state = CLOSE - if self._putlock: - self._putlock.clear() - self._worker_handler.close() - self._taskqueue.put(None) - stop_if_not_current(self._worker_handler) - - def terminate(self): - debug('terminating pool') - self._state = TERMINATE - self._worker_handler.terminate() - self._terminate() - - @staticmethod - def _stop_task_handler(task_handler): - stop_if_not_current(task_handler) - - def join(self): - assert self._state in (CLOSE, TERMINATE) - debug('joining worker handler') - stop_if_not_current(self._worker_handler) - debug('joining task handler') - self._stop_task_handler(self._task_handler) - debug('joining result handler') - stop_if_not_current(self._result_handler) - debug('result handler joined') - for i, p in enumerate(self._pool): - debug('joining worker %s/%s (%r)', i + 1, len(self._pool), p) - if p._popen is not None: # process started? - p.join() - debug('pool join complete') - - def restart(self): - for e in self._poolctrl.values(): - e.set() - - @staticmethod - def _help_stuff_finish(inqueue, task_handler, _pool): - # task_handler may be blocked trying to put items on inqueue - debug('removing tasks from inqueue until task handler finished') - inqueue._rlock.acquire() - while task_handler.is_alive() and inqueue._reader.poll(): - inqueue._reader.recv() - time.sleep(0) - - @classmethod - def _set_result_sentinel(cls, outqueue, pool): - outqueue.put(None) - - @classmethod - def _terminate_pool(cls, taskqueue, inqueue, outqueue, pool, - worker_handler, task_handler, - result_handler, cache, timeout_handler, - help_stuff_finish_args): - - # this is guaranteed to only be called once - debug('finalizing pool') - - worker_handler.terminate() - - task_handler.terminate() - taskqueue.put(None) # sentinel - - debug('helping task handler/workers to finish') - cls._help_stuff_finish(*help_stuff_finish_args) - - result_handler.terminate() - cls._set_result_sentinel(outqueue, pool) - - if timeout_handler is not None: - timeout_handler.terminate() - - # Terminate workers which haven't already finished - if pool and hasattr(pool[0], 'terminate'): - debug('terminating workers') - for p in pool: - if p._is_alive(): - p.terminate() - - debug('joining task handler') - cls._stop_task_handler(task_handler) - - debug('joining result handler') - result_handler.stop() - - if timeout_handler is not None: - debug('joining timeout handler') - timeout_handler.stop(TIMEOUT_MAX) - - if pool and hasattr(pool[0], 'terminate'): - debug('joining pool workers') - for p in pool: - if p.is_alive(): - # worker has not yet exited - debug('cleaning up worker %d', p.pid) - if p._popen is not None: - p.join() - debug('pool workers joined') - - if inqueue: - inqueue.close() - if outqueue: - outqueue.close() - - @property - def process_sentinels(self): - return [w._popen.sentinel for w in self._pool] - -# -# Class whose instances are returned by `Pool.apply_async()` -# - - -class ApplyResult: - _worker_lost = None - _write_to = None - _scheduled_for = None - - def __init__(self, cache, callback, accept_callback=None, - timeout_callback=None, error_callback=None, soft_timeout=None, - timeout=None, lost_worker_timeout=LOST_WORKER_TIMEOUT, - on_timeout_set=None, on_timeout_cancel=None, - callbacks_propagate=(), send_ack=None, - correlation_id=None): - self.correlation_id = correlation_id - self._mutex = Lock() - self._event = threading.Event() - self._job = next(job_counter) - self._cache = cache - self._callback = callback - self._accept_callback = accept_callback - self._error_callback = error_callback - self._timeout_callback = timeout_callback - self._timeout = timeout - self._soft_timeout = soft_timeout - self._lost_worker_timeout = lost_worker_timeout - self._on_timeout_set = on_timeout_set - self._on_timeout_cancel = on_timeout_cancel - self._callbacks_propagate = callbacks_propagate or () - self._send_ack = send_ack - - self._accepted = False - self._cancelled = False - self._worker_pid = None - self._time_accepted = None - self._terminated = None - cache[self._job] = self - - def __repr__(self): - return '<{name}: {id} ack:{ack} ready:{ready}>'.format( - name=self.__class__.__name__, - id=self._job, ack=self._accepted, ready=self.ready(), - ) - - def ready(self): - return self._event.is_set() - - def accepted(self): - return self._accepted - - def successful(self): - assert self.ready() - return self._success - - def _cancel(self): - """Only works if synack is used.""" - self._cancelled = True - - def discard(self): - self._cache.pop(self._job, None) - - def terminate(self, signum): - self._terminated = signum - - def _set_terminated(self, signum=None): - try: - raise Terminated(-(signum or 0)) - except Terminated: - self._set(None, (False, ExceptionInfo())) - - def worker_pids(self): - return [self._worker_pid] if self._worker_pid else [] - - def wait(self, timeout=None): - self._event.wait(timeout) - - def get(self, timeout=None): - self.wait(timeout) - if not self.ready(): - raise TimeoutError - if self._success: - return self._value - else: - raise self._value.exception - - def safe_apply_callback(self, fun, *args, **kwargs): - if fun: - try: - fun(*args, **kwargs) - except self._callbacks_propagate: - raise - except Exception as exc: - error('Pool callback raised exception: %r', exc, - exc_info=1) - - def handle_timeout(self, soft=False): - if self._timeout_callback is not None: - self.safe_apply_callback( - self._timeout_callback, soft=soft, - timeout=self._soft_timeout if soft else self._timeout, - ) - - def _set(self, i, obj): - with self._mutex: - if self._on_timeout_cancel: - self._on_timeout_cancel(self) - self._success, self._value = obj - self._event.set() - if self._accepted: - # if not accepted yet, then the set message - # was received before the ack, which means - # the ack will remove the entry. - self._cache.pop(self._job, None) - - # apply callbacks last - if self._callback and self._success: - self.safe_apply_callback( - self._callback, self._value) - if (self._value is not None and - self._error_callback and not self._success): - self.safe_apply_callback( - self._error_callback, self._value) - - def _ack(self, i, time_accepted, pid, synqW_fd): - with self._mutex: - if self._cancelled and self._send_ack: - self._accepted = True - if synqW_fd: - return self._send_ack(NACK, pid, self._job, synqW_fd) - return - self._accepted = True - self._time_accepted = time_accepted - self._worker_pid = pid - if self.ready(): - # ack received after set() - self._cache.pop(self._job, None) - if self._on_timeout_set: - self._on_timeout_set(self, self._soft_timeout, self._timeout) - response = ACK - if self._accept_callback: - try: - self._accept_callback(pid, time_accepted) - except self._propagate_errors: - response = NACK - raise - except Exception: - response = NACK - # ignore other errors - finally: - if self._send_ack and synqW_fd: - return self._send_ack( - response, pid, self._job, synqW_fd - ) - if self._send_ack and synqW_fd: - self._send_ack(response, pid, self._job, synqW_fd) - -# -# Class whose instances are returned by `Pool.map_async()` -# - - -class MapResult(ApplyResult): - - def __init__(self, cache, chunksize, length, callback, error_callback): - ApplyResult.__init__( - self, cache, callback, error_callback=error_callback, - ) - self._success = True - self._length = length - self._value = [None] * length - self._accepted = [False] * length - self._worker_pid = [None] * length - self._time_accepted = [None] * length - self._chunksize = chunksize - if chunksize <= 0: - self._number_left = 0 - self._event.set() - del cache[self._job] - else: - self._number_left = length // chunksize + bool(length % chunksize) - - def _set(self, i, success_result): - success, result = success_result - if success: - self._value[i * self._chunksize:(i + 1) * self._chunksize] = result - self._number_left -= 1 - if self._number_left == 0: - if self._callback: - self._callback(self._value) - if self._accepted: - self._cache.pop(self._job, None) - self._event.set() - else: - self._success = False - self._value = result - if self._error_callback: - self._error_callback(self._value) - if self._accepted: - self._cache.pop(self._job, None) - self._event.set() - - def _ack(self, i, time_accepted, pid, *args): - start = i * self._chunksize - stop = min((i + 1) * self._chunksize, self._length) - for j in range(start, stop): - self._accepted[j] = True - self._worker_pid[j] = pid - self._time_accepted[j] = time_accepted - if self.ready(): - self._cache.pop(self._job, None) - - def accepted(self): - return all(self._accepted) - - def worker_pids(self): - return [pid for pid in self._worker_pid if pid] - -# -# Class whose instances are returned by `Pool.imap()` -# - - -class IMapIterator: - _worker_lost = None - - def __init__(self, cache, lost_worker_timeout=LOST_WORKER_TIMEOUT): - self._cond = threading.Condition(threading.Lock()) - self._job = next(job_counter) - self._cache = cache - self._items = deque() - self._index = 0 - self._length = None - self._ready = False - self._unsorted = {} - self._worker_pids = [] - self._lost_worker_timeout = lost_worker_timeout - cache[self._job] = self - - def __iter__(self): - return self - - def next(self, timeout=None): - with self._cond: - try: - item = self._items.popleft() - except IndexError: - if self._index == self._length: - self._ready = True - raise StopIteration - self._cond.wait(timeout) - try: - item = self._items.popleft() - except IndexError: - if self._index == self._length: - self._ready = True - raise StopIteration - raise TimeoutError - - success, value = item - if success: - return value - raise Exception(value) - - __next__ = next # XXX - - def _set(self, i, obj): - with self._cond: - if self._index == i: - self._items.append(obj) - self._index += 1 - while self._index in self._unsorted: - obj = self._unsorted.pop(self._index) - self._items.append(obj) - self._index += 1 - self._cond.notify() - else: - self._unsorted[i] = obj - - if self._index == self._length: - self._ready = True - del self._cache[self._job] - - def _set_length(self, length): - with self._cond: - self._length = length - if self._index == self._length: - self._ready = True - self._cond.notify() - del self._cache[self._job] - - def _ack(self, i, time_accepted, pid, *args): - self._worker_pids.append(pid) - - def ready(self): - return self._ready - - def worker_pids(self): - return self._worker_pids - -# -# Class whose instances are returned by `Pool.imap_unordered()` -# - - -class IMapUnorderedIterator(IMapIterator): - - def _set(self, i, obj): - with self._cond: - self._items.append(obj) - self._index += 1 - self._cond.notify() - if self._index == self._length: - self._ready = True - del self._cache[self._job] - -# -# -# - - -class ThreadPool(Pool): - - from .dummy import Process as DummyProcess - Process = DummyProcess - - def __init__(self, processes=None, initializer=None, initargs=()): - Pool.__init__(self, processes, initializer, initargs) - - def _setup_queues(self): - self._inqueue = Queue() - self._outqueue = Queue() - self._quick_put = self._inqueue.put - self._quick_get = self._outqueue.get - - def _poll_result(timeout): - try: - return True, self._quick_get(timeout=timeout) - except Empty: - return False, None - self._poll_result = _poll_result - - @staticmethod - def _help_stuff_finish(inqueue, task_handler, pool): - # put sentinels at head of inqueue to make workers finish - with inqueue.not_empty: - inqueue.queue.clear() - inqueue.queue.extend([None] * len(pool)) - inqueue.not_empty.notify_all() diff --git a/.venv/lib/python3.10/site-packages/billiard/popen_fork.py b/.venv/lib/python3.10/site-packages/billiard/popen_fork.py deleted file mode 100644 index caf14f8..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/popen_fork.py +++ /dev/null @@ -1,89 +0,0 @@ -import os -import sys -import errno - -from .common import TERM_SIGNAL - -__all__ = ['Popen'] - -# -# Start child process using fork -# - - -class Popen: - method = 'fork' - sentinel = None - - def __init__(self, process_obj): - sys.stdout.flush() - sys.stderr.flush() - self.returncode = None - self._launch(process_obj) - - def duplicate_for_child(self, fd): - return fd - - def poll(self, flag=os.WNOHANG): - if self.returncode is None: - while True: - try: - pid, sts = os.waitpid(self.pid, flag) - except OSError as e: - if e.errno == errno.EINTR: - continue - # Child process not yet created. See #1731717 - # e.errno == errno.ECHILD == 10 - return None - else: - break - if pid == self.pid: - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - else: - assert os.WIFEXITED(sts) - self.returncode = os.WEXITSTATUS(sts) - return self.returncode - - def wait(self, timeout=None): - if self.returncode is None: - if timeout is not None: - from .connection import wait - if not wait([self.sentinel], timeout): - return None - # This shouldn't block if wait() returned successfully. - return self.poll(os.WNOHANG if timeout == 0.0 else 0) - return self.returncode - - def terminate(self): - if self.returncode is None: - try: - os.kill(self.pid, TERM_SIGNAL) - except OSError as exc: - if getattr(exc, 'errno', None) != errno.ESRCH: - if self.wait(timeout=0.1) is None: - raise - - def _launch(self, process_obj): - code = 1 - parent_r, child_w = os.pipe() - self.pid = os.fork() - if self.pid == 0: - try: - os.close(parent_r) - if 'random' in sys.modules: - import random - random.seed() - code = process_obj._bootstrap() - finally: - os._exit(code) - else: - os.close(child_w) - self.sentinel = parent_r - - def close(self): - if self.sentinel is not None: - try: - os.close(self.sentinel) - finally: - self.sentinel = None diff --git a/.venv/lib/python3.10/site-packages/billiard/popen_forkserver.py b/.venv/lib/python3.10/site-packages/billiard/popen_forkserver.py deleted file mode 100644 index dfff254..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/popen_forkserver.py +++ /dev/null @@ -1,68 +0,0 @@ -import io -import os - -from . import reduction -from . import context -from . import forkserver -from . import popen_fork -from . import spawn - -__all__ = ['Popen'] - -# -# Wrapper for an fd used while launching a process -# - - -class _DupFd: - - def __init__(self, ind): - self.ind = ind - - def detach(self): - return forkserver.get_inherited_fds()[self.ind] - -# -# Start child process using a server process -# - - -class Popen(popen_fork.Popen): - method = 'forkserver' - DupFd = _DupFd - - def __init__(self, process_obj): - self._fds = [] - super().__init__(process_obj) - - def duplicate_for_child(self, fd): - self._fds.append(fd) - return len(self._fds) - 1 - - def _launch(self, process_obj): - prep_data = spawn.get_preparation_data(process_obj._name) - buf = io.BytesIO() - context.set_spawning_popen(self) - try: - reduction.dump(prep_data, buf) - reduction.dump(process_obj, buf) - finally: - context.set_spawning_popen(None) - - self.sentinel, w = forkserver.connect_to_new_process(self._fds) - with io.open(w, 'wb', closefd=True) as f: - f.write(buf.getbuffer()) - self.pid = forkserver.read_unsigned(self.sentinel) - - def poll(self, flag=os.WNOHANG): - if self.returncode is None: - from .connection import wait - timeout = 0 if flag == os.WNOHANG else None - if not wait([self.sentinel], timeout): - return None - try: - self.returncode = forkserver.read_unsigned(self.sentinel) - except (OSError, EOFError): - # The process ended abnormally perhaps because of a signal - self.returncode = 255 - return self.returncode diff --git a/.venv/lib/python3.10/site-packages/billiard/popen_spawn_posix.py b/.venv/lib/python3.10/site-packages/billiard/popen_spawn_posix.py deleted file mode 100644 index 5772a75..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/popen_spawn_posix.py +++ /dev/null @@ -1,74 +0,0 @@ -import io -import os - -from . import context -from . import popen_fork -from . import reduction -from . import spawn - -from .compat import spawnv_passfds - -__all__ = ['Popen'] - - -# -# Wrapper for an fd used while launching a process -# - -class _DupFd: - - def __init__(self, fd): - self.fd = fd - - def detach(self): - return self.fd - -# -# Start child process using a fresh interpreter -# - - -class Popen(popen_fork.Popen): - method = 'spawn' - DupFd = _DupFd - - def __init__(self, process_obj): - self._fds = [] - super().__init__(process_obj) - - def duplicate_for_child(self, fd): - self._fds.append(fd) - return fd - - def _launch(self, process_obj): - os.environ["MULTIPROCESSING_FORKING_DISABLE"] = "1" - spawn._Django_old_layout_hack__save() - from . import semaphore_tracker - tracker_fd = semaphore_tracker.getfd() - self._fds.append(tracker_fd) - prep_data = spawn.get_preparation_data(process_obj._name) - fp = io.BytesIO() - context.set_spawning_popen(self) - try: - reduction.dump(prep_data, fp) - reduction.dump(process_obj, fp) - finally: - context.set_spawning_popen(None) - - parent_r = child_w = child_r = parent_w = None - try: - parent_r, child_w = os.pipe() - child_r, parent_w = os.pipe() - cmd = spawn.get_command_line(tracker_fd=tracker_fd, - pipe_handle=child_r) - self._fds.extend([child_r, child_w]) - self.pid = spawnv_passfds( - spawn.get_executable(), cmd, self._fds, - ) - self.sentinel = parent_r - with io.open(parent_w, 'wb', closefd=False) as f: - f.write(fp.getvalue()) - finally: - for fd in (child_r, child_w, parent_w): - if fd is not None: - os.close(fd) diff --git a/.venv/lib/python3.10/site-packages/billiard/popen_spawn_win32.py b/.venv/lib/python3.10/site-packages/billiard/popen_spawn_win32.py deleted file mode 100644 index 2325492..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/popen_spawn_win32.py +++ /dev/null @@ -1,121 +0,0 @@ -import io -import os -import msvcrt -import signal -import sys - -from . import context -from . import spawn -from . import reduction - -from .compat import _winapi - -__all__ = ['Popen'] - -# -# -# - -TERMINATE = 0x10000 -WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) -WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") - -# -# We define a Popen class similar to the one from subprocess, but -# whose constructor takes a process object as its argument. -# - - -if sys.platform == 'win32': - try: - from _winapi import CreateProcess, GetExitCodeProcess - close_thread_handle = _winapi.CloseHandle - except ImportError: # Py2.7 - from _subprocess import CreateProcess, GetExitCodeProcess - - def close_thread_handle(handle): - handle.Close() - - -class Popen: - ''' - Start a subprocess to run the code of a process object - ''' - method = 'spawn' - sentinel = None - - def __init__(self, process_obj): - os.environ["MULTIPROCESSING_FORKING_DISABLE"] = "1" - spawn._Django_old_layout_hack__save() - prep_data = spawn.get_preparation_data(process_obj._name) - - # read end of pipe will be "stolen" by the child process - # -- see spawn_main() in spawn.py. - rhandle, whandle = _winapi.CreatePipe(None, 0) - wfd = msvcrt.open_osfhandle(whandle, 0) - cmd = spawn.get_command_line(parent_pid=os.getpid(), - pipe_handle=rhandle) - cmd = ' '.join('"%s"' % x for x in cmd) - - with io.open(wfd, 'wb', closefd=True) as to_child: - # start process - try: - hp, ht, pid, tid = CreateProcess( - spawn.get_executable(), cmd, - None, None, False, 0, None, None, None) - close_thread_handle(ht) - except: - _winapi.CloseHandle(rhandle) - raise - - # set attributes of self - self.pid = pid - self.returncode = None - self._handle = hp - self.sentinel = int(hp) - - # send information to child - context.set_spawning_popen(self) - try: - reduction.dump(prep_data, to_child) - reduction.dump(process_obj, to_child) - finally: - context.set_spawning_popen(None) - - def close(self): - if self.sentinel is not None: - try: - _winapi.CloseHandle(self.sentinel) - finally: - self.sentinel = None - - def duplicate_for_child(self, handle): - assert self is context.get_spawning_popen() - return reduction.duplicate(handle, self.sentinel) - - def wait(self, timeout=None): - if self.returncode is None: - if timeout is None: - msecs = _winapi.INFINITE - else: - msecs = max(0, int(timeout * 1000 + 0.5)) - - res = _winapi.WaitForSingleObject(int(self._handle), msecs) - if res == _winapi.WAIT_OBJECT_0: - code = GetExitCodeProcess(self._handle) - if code == TERMINATE: - code = -signal.SIGTERM - self.returncode = code - - return self.returncode - - def poll(self): - return self.wait(timeout=0) - - def terminate(self): - if self.returncode is None: - try: - _winapi.TerminateProcess(int(self._handle), TERMINATE) - except OSError: - if self.wait(timeout=1.0) is None: - raise diff --git a/.venv/lib/python3.10/site-packages/billiard/process.py b/.venv/lib/python3.10/site-packages/billiard/process.py deleted file mode 100644 index 5082343..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/process.py +++ /dev/null @@ -1,400 +0,0 @@ -# -# Module providing the `Process` class which emulates `threading.Thread` -# -# multiprocessing/process.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# -# -# Imports -# - -import os -import sys -import signal -import itertools -import logging -import threading -from _weakrefset import WeakSet - -from multiprocessing import process as _mproc - -try: - ORIGINAL_DIR = os.path.abspath(os.getcwd()) -except OSError: - ORIGINAL_DIR = None - -__all__ = ['BaseProcess', 'Process', 'current_process', 'active_children'] - -# -# Public functions -# - - -def current_process(): - ''' - Return process object representing the current process - ''' - return _current_process - - -def _set_current_process(process): - global _current_process - _current_process = _mproc._current_process = process - - -def _cleanup(): - # check for processes which have finished - for p in list(_children): - if p._popen.poll() is not None: - _children.discard(p) - - -def _maybe_flush(f): - try: - f.flush() - except (AttributeError, EnvironmentError, NotImplementedError): - pass - - -def active_children(_cleanup=_cleanup): - ''' - Return list of process objects corresponding to live child processes - ''' - try: - _cleanup() - except TypeError: - # called after gc collect so _cleanup does not exist anymore - return [] - return list(_children) - - -class BaseProcess: - ''' - Process objects represent activity that is run in a separate process - - The class is analogous to `threading.Thread` - ''' - - def _Popen(self): - raise NotImplementedError() - - def __init__(self, group=None, target=None, name=None, - args=(), kwargs={}, daemon=None, **_kw): - assert group is None, 'group argument must be None for now' - count = next(_process_counter) - self._identity = _current_process._identity + (count, ) - self._config = _current_process._config.copy() - self._parent_pid = os.getpid() - self._popen = None - self._target = target - self._args = tuple(args) - self._kwargs = dict(kwargs) - self._name = ( - name or type(self).__name__ + '-' + - ':'.join(str(i) for i in self._identity) - ) - if daemon is not None: - self.daemon = daemon - if _dangling is not None: - _dangling.add(self) - - self._controlled_termination = False - - def run(self): - ''' - Method to be run in sub-process; can be overridden in sub-class - ''' - if self._target: - self._target(*self._args, **self._kwargs) - - def start(self): - ''' - Start child process - ''' - assert self._popen is None, 'cannot start a process twice' - assert self._parent_pid == os.getpid(), \ - 'can only start a process object created by current process' - _cleanup() - self._popen = self._Popen(self) - self._sentinel = self._popen.sentinel - _children.add(self) - - def close(self): - if self._popen is not None: - self._popen.close() - - def terminate(self): - ''' - Terminate process; sends SIGTERM signal or uses TerminateProcess() - ''' - self._popen.terminate() - - def terminate_controlled(self): - self._controlled_termination = True - self.terminate() - - def join(self, timeout=None): - ''' - Wait until child process terminates - ''' - assert self._parent_pid == os.getpid(), 'can only join a child process' - assert self._popen is not None, 'can only join a started process' - res = self._popen.wait(timeout) - if res is not None: - _children.discard(self) - self.close() - - def is_alive(self): - ''' - Return whether process is alive - ''' - if self is _current_process: - return True - assert self._parent_pid == os.getpid(), 'can only test a child process' - if self._popen is None: - return False - self._popen.poll() - return self._popen.returncode is None - - def _is_alive(self): - if self._popen is None: - return False - return self._popen.poll() is None - - @property - def name(self): - return self._name - - @name.setter - def name(self, name): # noqa - assert isinstance(name, str), 'name must be a string' - self._name = name - - @property - def daemon(self): - ''' - Return whether process is a daemon - ''' - return self._config.get('daemon', False) - - @daemon.setter # noqa - def daemon(self, daemonic): - ''' - Set whether process is a daemon - ''' - assert self._popen is None, 'process has already started' - self._config['daemon'] = daemonic - - @property - def authkey(self): - return self._config['authkey'] - - @authkey.setter # noqa - def authkey(self, authkey): - ''' - Set authorization key of process - ''' - self._config['authkey'] = AuthenticationString(authkey) - - @property - def exitcode(self): - ''' - Return exit code of process or `None` if it has yet to stop - ''' - if self._popen is None: - return self._popen - return self._popen.poll() - - @property - def ident(self): - ''' - Return identifier (PID) of process or `None` if it has yet to start - ''' - if self is _current_process: - return os.getpid() - else: - return self._popen and self._popen.pid - - pid = ident - - @property - def sentinel(self): - ''' - Return a file descriptor (Unix) or handle (Windows) suitable for - waiting for process termination. - ''' - try: - return self._sentinel - except AttributeError: - raise ValueError("process not started") - - @property - def _counter(self): - # compat for 2.7 - return _process_counter - - @property - def _children(self): - # compat for 2.7 - return _children - - @property - def _authkey(self): - # compat for 2.7 - return self.authkey - - @property - def _daemonic(self): - # compat for 2.7 - return self.daemon - - @property - def _tempdir(self): - # compat for 2.7 - return self._config.get('tempdir') - - def __repr__(self): - if self is _current_process: - status = 'started' - elif self._parent_pid != os.getpid(): - status = 'unknown' - elif self._popen is None: - status = 'initial' - else: - if self._popen.poll() is not None: - status = self.exitcode - else: - status = 'started' - - if type(status) is int: - if status == 0: - status = 'stopped' - else: - status = 'stopped[%s]' % _exitcode_to_name.get(status, status) - - return '<%s(%s, %s%s)>' % (type(self).__name__, self._name, - status, self.daemon and ' daemon' or '') - - ## - - def _bootstrap(self): - from . import util, context - global _current_process, _process_counter, _children - - try: - if self._start_method is not None: - context._force_start_method(self._start_method) - _process_counter = itertools.count(1) - _children = set() - if sys.stdin is not None: - try: - sys.stdin.close() - sys.stdin = open(os.devnull) - except (EnvironmentError, OSError, ValueError): - pass - old_process = _current_process - _set_current_process(self) - - # Re-init logging system. - # Workaround for https://bugs.python.org/issue6721/#msg140215 - # Python logging module uses RLock() objects which are broken - # after fork. This can result in a deadlock (Celery Issue #496). - loggerDict = logging.Logger.manager.loggerDict - logger_names = list(loggerDict.keys()) - logger_names.append(None) # for root logger - for name in logger_names: - if not name or not isinstance(loggerDict[name], - logging.PlaceHolder): - for handler in logging.getLogger(name).handlers: - handler.createLock() - logging._lock = threading.RLock() - - try: - util._finalizer_registry.clear() - util._run_after_forkers() - finally: - # delay finalization of the old process object until after - # _run_after_forkers() is executed - del old_process - util.info('child process %s calling self.run()', self.pid) - try: - self.run() - exitcode = 0 - finally: - util._exit_function() - except SystemExit as exc: - if not exc.args: - exitcode = 1 - elif isinstance(exc.args[0], int): - exitcode = exc.args[0] - else: - sys.stderr.write(str(exc.args[0]) + '\n') - _maybe_flush(sys.stderr) - exitcode = 0 if isinstance(exc.args[0], str) else 1 - except: - exitcode = 1 - if not util.error('Process %s', self.name, exc_info=True): - import traceback - sys.stderr.write('Process %s:\n' % self.name) - traceback.print_exc() - finally: - util.info('process %s exiting with exitcode %d', - self.pid, exitcode) - _maybe_flush(sys.stdout) - _maybe_flush(sys.stderr) - - return exitcode - -# -# We subclass bytes to avoid accidental transmission of auth keys over network -# - - -class AuthenticationString(bytes): - - def __reduce__(self): - from .context import get_spawning_popen - - if get_spawning_popen() is None: - raise TypeError( - 'Pickling an AuthenticationString object is ' - 'disallowed for security reasons') - return AuthenticationString, (bytes(self),) - -# -# Create object representing the main process -# - - -class _MainProcess(BaseProcess): - - def __init__(self): - self._identity = () - self._name = 'MainProcess' - self._parent_pid = None - self._popen = None - self._config = {'authkey': AuthenticationString(os.urandom(32)), - 'semprefix': '/mp'} - -_current_process = _MainProcess() -_process_counter = itertools.count(1) -_children = set() -del _MainProcess - - -Process = BaseProcess - -# -# Give names to some return codes -# - -_exitcode_to_name = {} - -for name, signum in signal.__dict__.items(): - if name[:3] == 'SIG' and '_' not in name: - _exitcode_to_name[-signum] = name - -# For debug and leak testing -_dangling = WeakSet() diff --git a/.venv/lib/python3.10/site-packages/billiard/queues.py b/.venv/lib/python3.10/site-packages/billiard/queues.py deleted file mode 100644 index bd16f8c..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/queues.py +++ /dev/null @@ -1,403 +0,0 @@ -# -# Module implementing queues -# -# multiprocessing/queues.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import sys -import os -import threading -import collections -import weakref -import errno - -from . import connection -from . import context - -from .compat import get_errno -from time import monotonic -from queue import Empty, Full -from .util import ( - debug, error, info, Finalize, register_after_fork, is_exiting, -) -from .reduction import ForkingPickler - -__all__ = ['Queue', 'SimpleQueue', 'JoinableQueue'] - - -class Queue: - ''' - Queue type using a pipe, buffer and thread - ''' - def __init__(self, maxsize=0, *args, **kwargs): - try: - ctx = kwargs['ctx'] - except KeyError: - raise TypeError('missing 1 required keyword-only argument: ctx') - if maxsize <= 0: - # Can raise ImportError (see issues #3770 and #23400) - from .synchronize import SEM_VALUE_MAX as maxsize # noqa - self._maxsize = maxsize - self._reader, self._writer = connection.Pipe(duplex=False) - self._rlock = ctx.Lock() - self._opid = os.getpid() - if sys.platform == 'win32': - self._wlock = None - else: - self._wlock = ctx.Lock() - self._sem = ctx.BoundedSemaphore(maxsize) - # For use by concurrent.futures - self._ignore_epipe = False - - self._after_fork() - - if sys.platform != 'win32': - register_after_fork(self, Queue._after_fork) - - def __getstate__(self): - context.assert_spawning(self) - return (self._ignore_epipe, self._maxsize, self._reader, self._writer, - self._rlock, self._wlock, self._sem, self._opid) - - def __setstate__(self, state): - (self._ignore_epipe, self._maxsize, self._reader, self._writer, - self._rlock, self._wlock, self._sem, self._opid) = state - self._after_fork() - - def _after_fork(self): - debug('Queue._after_fork()') - self._notempty = threading.Condition(threading.Lock()) - self._buffer = collections.deque() - self._thread = None - self._jointhread = None - self._joincancelled = False - self._closed = False - self._close = None - self._send_bytes = self._writer.send - self._recv = self._reader.recv - self._send_bytes = self._writer.send_bytes - self._recv_bytes = self._reader.recv_bytes - self._poll = self._reader.poll - - def put(self, obj, block=True, timeout=None): - assert not self._closed - if not self._sem.acquire(block, timeout): - raise Full - - with self._notempty: - if self._thread is None: - self._start_thread() - self._buffer.append(obj) - self._notempty.notify() - - def get(self, block=True, timeout=None): - if block and timeout is None: - with self._rlock: - res = self._recv_bytes() - self._sem.release() - - else: - if block: - deadline = monotonic() + timeout - if not self._rlock.acquire(block, timeout): - raise Empty - try: - if block: - timeout = deadline - monotonic() - if timeout < 0 or not self._poll(timeout): - raise Empty - elif not self._poll(): - raise Empty - res = self._recv_bytes() - self._sem.release() - finally: - self._rlock.release() - # unserialize the data after having released the lock - return ForkingPickler.loads(res) - - def qsize(self): - # Raises NotImplementedError on macOS because - # of broken sem_getvalue() - return self._maxsize - self._sem._semlock._get_value() - - def empty(self): - return not self._poll() - - def full(self): - return self._sem._semlock._is_zero() - - def get_nowait(self): - return self.get(False) - - def put_nowait(self, obj): - return self.put(obj, False) - - def close(self): - self._closed = True - try: - self._reader.close() - finally: - close = self._close - if close: - self._close = None - close() - - def join_thread(self): - debug('Queue.join_thread()') - assert self._closed - if self._jointhread: - self._jointhread() - - def cancel_join_thread(self): - debug('Queue.cancel_join_thread()') - self._joincancelled = True - try: - self._jointhread.cancel() - except AttributeError: - pass - - def _start_thread(self): - debug('Queue._start_thread()') - - # Start thread which transfers data from buffer to pipe - self._buffer.clear() - self._thread = threading.Thread( - target=Queue._feed, - args=(self._buffer, self._notempty, self._send_bytes, - self._wlock, self._writer.close, self._ignore_epipe), - name='QueueFeederThread' - ) - self._thread.daemon = True - - debug('doing self._thread.start()') - self._thread.start() - debug('... done self._thread.start()') - - # On process exit we will wait for data to be flushed to pipe. - # - # However, if this process created the queue then all - # processes which use the queue will be descendants of this - # process. Therefore waiting for the queue to be flushed - # is pointless once all the child processes have been joined. - created_by_this_process = (self._opid == os.getpid()) - if not self._joincancelled and not created_by_this_process: - self._jointhread = Finalize( - self._thread, Queue._finalize_join, - [weakref.ref(self._thread)], - exitpriority=-5 - ) - - # Send sentinel to the thread queue object when garbage collected - self._close = Finalize( - self, Queue._finalize_close, - [self._buffer, self._notempty], - exitpriority=10 - ) - - @staticmethod - def _finalize_join(twr): - debug('joining queue thread') - thread = twr() - if thread is not None: - thread.join() - debug('... queue thread joined') - else: - debug('... queue thread already dead') - - @staticmethod - def _finalize_close(buffer, notempty): - debug('telling queue thread to quit') - with notempty: - buffer.append(_sentinel) - notempty.notify() - - @staticmethod - def _feed(buffer, notempty, send_bytes, writelock, close, ignore_epipe): - debug('starting thread to feed data to pipe') - - nacquire = notempty.acquire - nrelease = notempty.release - nwait = notempty.wait - bpopleft = buffer.popleft - sentinel = _sentinel - if sys.platform != 'win32': - wacquire = writelock.acquire - wrelease = writelock.release - else: - wacquire = None - - try: - while 1: - nacquire() - try: - if not buffer: - nwait() - finally: - nrelease() - try: - while 1: - obj = bpopleft() - if obj is sentinel: - debug('feeder thread got sentinel -- exiting') - close() - return - - # serialize the data before acquiring the lock - obj = ForkingPickler.dumps(obj) - if wacquire is None: - send_bytes(obj) - else: - wacquire() - try: - send_bytes(obj) - finally: - wrelease() - except IndexError: - pass - except Exception as exc: - if ignore_epipe and get_errno(exc) == errno.EPIPE: - return - # Since this runs in a daemon thread the resources it uses - # may be become unusable while the process is cleaning up. - # We ignore errors which happen after the process has - # started to cleanup. - try: - if is_exiting(): - info('error in queue thread: %r', exc, exc_info=True) - else: - if not error('error in queue thread: %r', exc, - exc_info=True): - import traceback - traceback.print_exc() - except Exception: - pass - -_sentinel = object() - - -class JoinableQueue(Queue): - ''' - A queue type which also supports join() and task_done() methods - - Note that if you do not call task_done() for each finished task then - eventually the counter's semaphore may overflow causing Bad Things - to happen. - ''' - - def __init__(self, maxsize=0, *args, **kwargs): - try: - ctx = kwargs['ctx'] - except KeyError: - raise TypeError('missing 1 required keyword argument: ctx') - Queue.__init__(self, maxsize, ctx=ctx) - self._unfinished_tasks = ctx.Semaphore(0) - self._cond = ctx.Condition() - - def __getstate__(self): - return Queue.__getstate__(self) + (self._cond, self._unfinished_tasks) - - def __setstate__(self, state): - Queue.__setstate__(self, state[:-2]) - self._cond, self._unfinished_tasks = state[-2:] - - def put(self, obj, block=True, timeout=None): - assert not self._closed - if not self._sem.acquire(block, timeout): - raise Full - - with self._notempty: - with self._cond: - if self._thread is None: - self._start_thread() - self._buffer.append(obj) - self._unfinished_tasks.release() - self._notempty.notify() - - def task_done(self): - with self._cond: - if not self._unfinished_tasks.acquire(False): - raise ValueError('task_done() called too many times') - if self._unfinished_tasks._semlock._is_zero(): - self._cond.notify_all() - - def join(self): - with self._cond: - if not self._unfinished_tasks._semlock._is_zero(): - self._cond.wait() - - -class _SimpleQueue: - ''' - Simplified Queue type -- really just a locked pipe - ''' - - def __init__(self, rnonblock=False, wnonblock=False, ctx=None): - self._reader, self._writer = connection.Pipe( - duplex=False, rnonblock=rnonblock, wnonblock=wnonblock, - ) - self._poll = self._reader.poll - self._rlock = self._wlock = None - - def empty(self): - return not self._poll() - - def __getstate__(self): - context.assert_spawning(self) - return (self._reader, self._writer, self._rlock, self._wlock) - - def __setstate__(self, state): - (self._reader, self._writer, self._rlock, self._wlock) = state - - def get_payload(self): - return self._reader.recv_bytes() - - def send_payload(self, value): - self._writer.send_bytes(value) - - def get(self): - # unserialize the data after having released the lock - return ForkingPickler.loads(self.get_payload()) - - def put(self, obj): - # serialize the data before acquiring the lock - self.send_payload(ForkingPickler.dumps(obj)) - - def close(self): - if self._reader is not None: - try: - self._reader.close() - finally: - self._reader = None - - if self._writer is not None: - try: - self._writer.close() - finally: - self._writer = None - - -class SimpleQueue(_SimpleQueue): - - def __init__(self, *args, **kwargs): - try: - ctx = kwargs['ctx'] - except KeyError: - raise TypeError('missing required keyword argument: ctx') - self._reader, self._writer = connection.Pipe(duplex=False) - self._rlock = ctx.Lock() - self._wlock = ctx.Lock() if sys.platform != 'win32' else None - - def get_payload(self): - with self._rlock: - return self._reader.recv_bytes() - - def send_payload(self, value): - if self._wlock is None: - # writes to a message oriented win32 pipe are atomic - self._writer.send_bytes(value) - else: - with self._wlock: - self._writer.send_bytes(value) diff --git a/.venv/lib/python3.10/site-packages/billiard/reduction.py b/.venv/lib/python3.10/site-packages/billiard/reduction.py deleted file mode 100644 index 1677ffc..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/reduction.py +++ /dev/null @@ -1,293 +0,0 @@ -# -# Module which deals with pickling of objects. -# -# multiprocessing/reduction.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import functools -import io -import os -import pickle -import socket -import sys - -from . import context - -__all__ = ['send_handle', 'recv_handle', 'ForkingPickler', 'register', 'dump'] - -PY3 = sys.version_info[0] == 3 - - -HAVE_SEND_HANDLE = (sys.platform == 'win32' or - (hasattr(socket, 'CMSG_LEN') and - hasattr(socket, 'SCM_RIGHTS') and - hasattr(socket.socket, 'sendmsg'))) - -# -# Pickler subclass -# - - -if PY3: - import copyreg - - class ForkingPickler(pickle.Pickler): - '''Pickler subclass used by multiprocessing.''' - _extra_reducers = {} - _copyreg_dispatch_table = copyreg.dispatch_table - - def __init__(self, *args): - super(ForkingPickler, self).__init__(*args) - self.dispatch_table = self._copyreg_dispatch_table.copy() - self.dispatch_table.update(self._extra_reducers) - - @classmethod - def register(cls, type, reduce): - '''Register a reduce function for a type.''' - cls._extra_reducers[type] = reduce - - @classmethod - def dumps(cls, obj, protocol=None): - buf = io.BytesIO() - cls(buf, protocol).dump(obj) - return buf.getbuffer() - - @classmethod - def loadbuf(cls, buf, protocol=None): - return cls.loads(buf.getbuffer()) - - loads = pickle.loads - -else: - - class ForkingPickler(pickle.Pickler): # noqa - '''Pickler subclass used by multiprocessing.''' - dispatch = pickle.Pickler.dispatch.copy() - - @classmethod - def register(cls, type, reduce): - '''Register a reduce function for a type.''' - def dispatcher(self, obj): - rv = reduce(obj) - self.save_reduce(obj=obj, *rv) - cls.dispatch[type] = dispatcher - - @classmethod - def dumps(cls, obj, protocol=None): - buf = io.BytesIO() - cls(buf, protocol).dump(obj) - return buf.getvalue() - - @classmethod - def loadbuf(cls, buf, protocol=None): - return cls.loads(buf.getvalue()) - - @classmethod - def loads(cls, buf, loads=pickle.loads): - if isinstance(buf, io.BytesIO): - buf = buf.getvalue() - return loads(buf) -register = ForkingPickler.register - - -def dump(obj, file, protocol=None): - '''Replacement for pickle.dump() using ForkingPickler.''' - ForkingPickler(file, protocol).dump(obj) - -# -# Platform specific definitions -# - -if sys.platform == 'win32': - # Windows - __all__ += ['DupHandle', 'duplicate', 'steal_handle'] - from .compat import _winapi - - def duplicate(handle, target_process=None, inheritable=False): - '''Duplicate a handle. (target_process is a handle not a pid!)''' - if target_process is None: - target_process = _winapi.GetCurrentProcess() - return _winapi.DuplicateHandle( - _winapi.GetCurrentProcess(), handle, target_process, - 0, inheritable, _winapi.DUPLICATE_SAME_ACCESS) - - def steal_handle(source_pid, handle): - '''Steal a handle from process identified by source_pid.''' - source_process_handle = _winapi.OpenProcess( - _winapi.PROCESS_DUP_HANDLE, False, source_pid) - try: - return _winapi.DuplicateHandle( - source_process_handle, handle, - _winapi.GetCurrentProcess(), 0, False, - _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE) - finally: - _winapi.CloseHandle(source_process_handle) - - def send_handle(conn, handle, destination_pid): - '''Send a handle over a local connection.''' - dh = DupHandle(handle, _winapi.DUPLICATE_SAME_ACCESS, destination_pid) - conn.send(dh) - - def recv_handle(conn): - '''Receive a handle over a local connection.''' - return conn.recv().detach() - - class DupHandle: - '''Picklable wrapper for a handle.''' - def __init__(self, handle, access, pid=None): - if pid is None: - # We just duplicate the handle in the current process and - # let the receiving process steal the handle. - pid = os.getpid() - proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, pid) - try: - self._handle = _winapi.DuplicateHandle( - _winapi.GetCurrentProcess(), - handle, proc, access, False, 0) - finally: - _winapi.CloseHandle(proc) - self._access = access - self._pid = pid - - def detach(self): - '''Get the handle. This should only be called once.''' - # retrieve handle from process which currently owns it - if self._pid == os.getpid(): - # The handle has already been duplicated for this process. - return self._handle - # We must steal the handle from the process whose pid is self._pid. - proc = _winapi.OpenProcess(_winapi.PROCESS_DUP_HANDLE, False, - self._pid) - try: - return _winapi.DuplicateHandle( - proc, self._handle, _winapi.GetCurrentProcess(), - self._access, False, _winapi.DUPLICATE_CLOSE_SOURCE) - finally: - _winapi.CloseHandle(proc) - -else: - # Unix - __all__ += ['DupFd', 'sendfds', 'recvfds'] - import array - - # On macOS we should acknowledge receipt of fds -- see Issue14669 - ACKNOWLEDGE = sys.platform == 'darwin' - - def sendfds(sock, fds): - '''Send an array of fds over an AF_UNIX socket.''' - fds = array.array('i', fds) - msg = bytes([len(fds) % 256]) - sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, fds)]) - if ACKNOWLEDGE and sock.recv(1) != b'A': - raise RuntimeError('did not receive acknowledgement of fd') - - def recvfds(sock, size): - '''Receive an array of fds over an AF_UNIX socket.''' - a = array.array('i') - bytes_size = a.itemsize * size - msg, ancdata, flags, addr = sock.recvmsg( - 1, socket.CMSG_LEN(bytes_size), - ) - if not msg and not ancdata: - raise EOFError - try: - if ACKNOWLEDGE: - sock.send(b'A') - if len(ancdata) != 1: - raise RuntimeError( - 'received %d items of ancdata' % len(ancdata), - ) - cmsg_level, cmsg_type, cmsg_data = ancdata[0] - if (cmsg_level == socket.SOL_SOCKET and - cmsg_type == socket.SCM_RIGHTS): - if len(cmsg_data) % a.itemsize != 0: - raise ValueError - a.frombytes(cmsg_data) - assert len(a) % 256 == msg[0] - return list(a) - except (ValueError, IndexError): - pass - raise RuntimeError('Invalid data received') - - def send_handle(conn, handle, destination_pid): # noqa - '''Send a handle over a local connection.''' - fd = conn.fileno() - with socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_STREAM) as s: - sendfds(s, [handle]) - - def recv_handle(conn): # noqa - '''Receive a handle over a local connection.''' - fd = conn.fileno() - with socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_STREAM) as s: - return recvfds(s, 1)[0] - - def DupFd(fd): - '''Return a wrapper for an fd.''' - popen_obj = context.get_spawning_popen() - if popen_obj is not None: - return popen_obj.DupFd(popen_obj.duplicate_for_child(fd)) - elif HAVE_SEND_HANDLE: - from . import resource_sharer - return resource_sharer.DupFd(fd) - else: - raise ValueError('SCM_RIGHTS appears not to be available') - -# -# Try making some callable types picklable -# - - -def _reduce_method(m): - if m.__self__ is None: - return getattr, (m.__class__, m.__func__.__name__) - else: - return getattr, (m.__self__, m.__func__.__name__) - - -class _C: - def f(self): - pass -register(type(_C().f), _reduce_method) - - -def _reduce_method_descriptor(m): - return getattr, (m.__objclass__, m.__name__) -register(type(list.append), _reduce_method_descriptor) -register(type(int.__add__), _reduce_method_descriptor) - - -def _reduce_partial(p): - return _rebuild_partial, (p.func, p.args, p.keywords or {}) - - -def _rebuild_partial(func, args, keywords): - return functools.partial(func, *args, **keywords) -register(functools.partial, _reduce_partial) - -# -# Make sockets picklable -# - -if sys.platform == 'win32': - - def _reduce_socket(s): - from .resource_sharer import DupSocket - return _rebuild_socket, (DupSocket(s),) - - def _rebuild_socket(ds): - return ds.detach() - register(socket.socket, _reduce_socket) - -else: - - def _reduce_socket(s): # noqa - df = DupFd(s.fileno()) - return _rebuild_socket, (df, s.family, s.type, s.proto) - - def _rebuild_socket(df, family, type, proto): # noqa - fd = df.detach() - return socket.socket(family, type, proto, fileno=fd) - register(socket.socket, _reduce_socket) diff --git a/.venv/lib/python3.10/site-packages/billiard/resource_sharer.py b/.venv/lib/python3.10/site-packages/billiard/resource_sharer.py deleted file mode 100644 index 243f5e3..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/resource_sharer.py +++ /dev/null @@ -1,162 +0,0 @@ -# -# We use a background thread for sharing fds on Unix, and for sharing -# sockets on Windows. -# -# A client which wants to pickle a resource registers it with the resource -# sharer and gets an identifier in return. The unpickling process will connect -# to the resource sharer, sends the identifier and its pid, and then receives -# the resource. -# - -import os -import signal -import socket -import sys -import threading - -from . import process -from . import reduction -from . import util - -__all__ = ['stop'] - - -if sys.platform == 'win32': - __all__ += ['DupSocket'] - - class DupSocket: - '''Picklable wrapper for a socket.''' - - def __init__(self, sock): - new_sock = sock.dup() - - def send(conn, pid): - share = new_sock.share(pid) - conn.send_bytes(share) - self._id = _resource_sharer.register(send, new_sock.close) - - def detach(self): - '''Get the socket. This should only be called once.''' - with _resource_sharer.get_connection(self._id) as conn: - share = conn.recv_bytes() - return socket.fromshare(share) - -else: - __all__ += ['DupFd'] - - class DupFd: - '''Wrapper for fd which can be used at any time.''' - def __init__(self, fd): - new_fd = os.dup(fd) - - def send(conn, pid): - reduction.send_handle(conn, new_fd, pid) - - def close(): - os.close(new_fd) - self._id = _resource_sharer.register(send, close) - - def detach(self): - '''Get the fd. This should only be called once.''' - with _resource_sharer.get_connection(self._id) as conn: - return reduction.recv_handle(conn) - - -class _ResourceSharer: - '''Manager for resources using background thread.''' - def __init__(self): - self._key = 0 - self._cache = {} - self._old_locks = [] - self._lock = threading.Lock() - self._listener = None - self._address = None - self._thread = None - util.register_after_fork(self, _ResourceSharer._afterfork) - - def register(self, send, close): - '''Register resource, returning an identifier.''' - with self._lock: - if self._address is None: - self._start() - self._key += 1 - self._cache[self._key] = (send, close) - return (self._address, self._key) - - @staticmethod - def get_connection(ident): - '''Return connection from which to receive identified resource.''' - from .connection import Client - address, key = ident - c = Client(address, authkey=process.current_process().authkey) - c.send((key, os.getpid())) - return c - - def stop(self, timeout=None): - '''Stop the background thread and clear registered resources.''' - from .connection import Client - with self._lock: - if self._address is not None: - c = Client(self._address, - authkey=process.current_process().authkey) - c.send(None) - c.close() - self._thread.join(timeout) - if self._thread.is_alive(): - util.sub_warning('_ResourceSharer thread did ' - 'not stop when asked') - self._listener.close() - self._thread = None - self._address = None - self._listener = None - for key, (send, close) in self._cache.items(): - close() - self._cache.clear() - - def _afterfork(self): - for key, (send, close) in self._cache.items(): - close() - self._cache.clear() - # If self._lock was locked at the time of the fork, it may be broken - # -- see issue 6721. Replace it without letting it be gc'ed. - self._old_locks.append(self._lock) - self._lock = threading.Lock() - if self._listener is not None: - self._listener.close() - self._listener = None - self._address = None - self._thread = None - - def _start(self): - from .connection import Listener - assert self._listener is None - util.debug('starting listener and thread for sending handles') - self._listener = Listener(authkey=process.current_process().authkey) - self._address = self._listener.address - t = threading.Thread(target=self._serve) - t.daemon = True - t.start() - self._thread = t - - def _serve(self): - if hasattr(signal, 'pthread_sigmask'): - signal.pthread_sigmask(signal.SIG_BLOCK, range(1, signal.NSIG)) - while 1: - try: - with self._listener.accept() as conn: - msg = conn.recv() - if msg is None: - break - key, destination_pid = msg - send, close = self._cache.pop(key) - try: - send(conn, destination_pid) - finally: - close() - except: - if not util.is_exiting(): - sys.excepthook(*sys.exc_info()) - - -_resource_sharer = _ResourceSharer() -stop = _resource_sharer.stop diff --git a/.venv/lib/python3.10/site-packages/billiard/semaphore_tracker.py b/.venv/lib/python3.10/site-packages/billiard/semaphore_tracker.py deleted file mode 100644 index 8ba0df4..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/semaphore_tracker.py +++ /dev/null @@ -1,146 +0,0 @@ -# -# On Unix we run a server process which keeps track of unlinked -# semaphores. The server ignores SIGINT and SIGTERM and reads from a -# pipe. Every other process of the program has a copy of the writable -# end of the pipe, so we get EOF when all other processes have exited. -# Then the server process unlinks any remaining semaphore names. -# -# This is important because the system only supports a limited number -# of named semaphores, and they will not be automatically removed till -# the next reboot. Without this semaphore tracker process, "killall -# python" would probably leave unlinked semaphores. -# - -import io -import os -import signal -import sys -import threading -import warnings -from ._ext import _billiard - -from . import spawn -from . import util - -from .compat import spawnv_passfds - -__all__ = ['ensure_running', 'register', 'unregister'] - - -class SemaphoreTracker: - - def __init__(self): - self._lock = threading.Lock() - self._fd = None - - def getfd(self): - self.ensure_running() - return self._fd - - def ensure_running(self): - '''Make sure that semaphore tracker process is running. - - This can be run from any process. Usually a child process will use - the semaphore created by its parent.''' - with self._lock: - if self._fd is not None: - return - fds_to_pass = [] - try: - fds_to_pass.append(sys.stderr.fileno()) - except Exception: - pass - cmd = 'from billiard.semaphore_tracker import main;main(%d)' - r, w = os.pipe() - try: - fds_to_pass.append(r) - # process will out live us, so no need to wait on pid - exe = spawn.get_executable() - args = [exe] + util._args_from_interpreter_flags() - args += ['-c', cmd % r] - spawnv_passfds(exe, args, fds_to_pass) - except: - os.close(w) - raise - else: - self._fd = w - finally: - os.close(r) - - def register(self, name): - '''Register name of semaphore with semaphore tracker.''' - self._send('REGISTER', name) - - def unregister(self, name): - '''Unregister name of semaphore with semaphore tracker.''' - self._send('UNREGISTER', name) - - def _send(self, cmd, name): - self.ensure_running() - msg = '{0}:{1}\n'.format(cmd, name).encode('ascii') - if len(name) > 512: - # posix guarantees that writes to a pipe of less than PIPE_BUF - # bytes are atomic, and that PIPE_BUF >= 512 - raise ValueError('name too long') - nbytes = os.write(self._fd, msg) - assert nbytes == len(msg) - - -_semaphore_tracker = SemaphoreTracker() -ensure_running = _semaphore_tracker.ensure_running -register = _semaphore_tracker.register -unregister = _semaphore_tracker.unregister -getfd = _semaphore_tracker.getfd - - -def main(fd): - '''Run semaphore tracker.''' - # protect the process from ^C and "killall python" etc - signal.signal(signal.SIGINT, signal.SIG_IGN) - signal.signal(signal.SIGTERM, signal.SIG_IGN) - - for f in (sys.stdin, sys.stdout): - try: - f.close() - except Exception: - pass - - cache = set() - try: - # keep track of registered/unregistered semaphores - with io.open(fd, 'rb') as f: - for line in f: - try: - cmd, name = line.strip().split(b':') - if cmd == b'REGISTER': - cache.add(name) - elif cmd == b'UNREGISTER': - cache.remove(name) - else: - raise RuntimeError('unrecognized command %r' % cmd) - except Exception: - try: - sys.excepthook(*sys.exc_info()) - except: - pass - finally: - # all processes have terminated; cleanup any remaining semaphores - if cache: - try: - warnings.warn('semaphore_tracker: There appear to be %d ' - 'leaked semaphores to clean up at shutdown' % - len(cache)) - except Exception: - pass - for name in cache: - # For some reason the process which created and registered this - # semaphore has failed to unregister it. Presumably it has died. - # We therefore unlink it. - try: - name = name.decode('ascii') - try: - _billiard.sem_unlink(name) - except Exception as e: - warnings.warn('semaphore_tracker: %r: %s' % (name, e)) - finally: - pass diff --git a/.venv/lib/python3.10/site-packages/billiard/sharedctypes.py b/.venv/lib/python3.10/site-packages/billiard/sharedctypes.py deleted file mode 100644 index 0b6589b..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/sharedctypes.py +++ /dev/null @@ -1,258 +0,0 @@ -# -# Module which supports allocation of ctypes objects from shared memory -# -# multiprocessing/sharedctypes.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import ctypes -import sys -import weakref - -from . import heap -from . import get_context -from .context import assert_spawning -from .reduction import ForkingPickler - -__all__ = ['RawValue', 'RawArray', 'Value', 'Array', 'copy', 'synchronized'] - -PY3 = sys.version_info[0] == 3 - -typecode_to_type = { - 'c': ctypes.c_char, 'u': ctypes.c_wchar, - 'b': ctypes.c_byte, 'B': ctypes.c_ubyte, - 'h': ctypes.c_short, 'H': ctypes.c_ushort, - 'i': ctypes.c_int, 'I': ctypes.c_uint, - 'l': ctypes.c_long, 'L': ctypes.c_ulong, - 'f': ctypes.c_float, 'd': ctypes.c_double -} - - -def _new_value(type_): - size = ctypes.sizeof(type_) - wrapper = heap.BufferWrapper(size) - return rebuild_ctype(type_, wrapper, None) - - -def RawValue(typecode_or_type, *args): - ''' - Returns a ctypes object allocated from shared memory - ''' - type_ = typecode_to_type.get(typecode_or_type, typecode_or_type) - obj = _new_value(type_) - ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj)) - obj.__init__(*args) - return obj - - -def RawArray(typecode_or_type, size_or_initializer): - ''' - Returns a ctypes array allocated from shared memory - ''' - type_ = typecode_to_type.get(typecode_or_type, typecode_or_type) - if isinstance(size_or_initializer, int): - type_ = type_ * size_or_initializer - obj = _new_value(type_) - ctypes.memset(ctypes.addressof(obj), 0, ctypes.sizeof(obj)) - return obj - else: - type_ = type_ * len(size_or_initializer) - result = _new_value(type_) - result.__init__(*size_or_initializer) - return result - - -def Value(typecode_or_type, *args, **kwds): - ''' - Return a synchronization wrapper for a Value - ''' - lock = kwds.pop('lock', None) - ctx = kwds.pop('ctx', None) - if kwds: - raise ValueError( - 'unrecognized keyword argument(s): %s' % list(kwds.keys())) - obj = RawValue(typecode_or_type, *args) - if lock is False: - return obj - if lock in (True, None): - ctx = ctx or get_context() - lock = ctx.RLock() - if not hasattr(lock, 'acquire'): - raise AttributeError("'%r' has no method 'acquire'" % lock) - return synchronized(obj, lock, ctx=ctx) - - -def Array(typecode_or_type, size_or_initializer, **kwds): - ''' - Return a synchronization wrapper for a RawArray - ''' - lock = kwds.pop('lock', None) - ctx = kwds.pop('ctx', None) - if kwds: - raise ValueError( - 'unrecognized keyword argument(s): %s' % list(kwds.keys())) - obj = RawArray(typecode_or_type, size_or_initializer) - if lock is False: - return obj - if lock in (True, None): - ctx = ctx or get_context() - lock = ctx.RLock() - if not hasattr(lock, 'acquire'): - raise AttributeError("'%r' has no method 'acquire'" % lock) - return synchronized(obj, lock, ctx=ctx) - - -def copy(obj): - new_obj = _new_value(type(obj)) - ctypes.pointer(new_obj)[0] = obj - return new_obj - - -def synchronized(obj, lock=None, ctx=None): - assert not isinstance(obj, SynchronizedBase), 'object already synchronized' - ctx = ctx or get_context() - - if isinstance(obj, ctypes._SimpleCData): - return Synchronized(obj, lock, ctx) - elif isinstance(obj, ctypes.Array): - if obj._type_ is ctypes.c_char: - return SynchronizedString(obj, lock, ctx) - return SynchronizedArray(obj, lock, ctx) - else: - cls = type(obj) - try: - scls = class_cache[cls] - except KeyError: - names = [field[0] for field in cls._fields_] - d = dict((name, make_property(name)) for name in names) - classname = 'Synchronized' + cls.__name__ - scls = class_cache[cls] = type(classname, (SynchronizedBase,), d) - return scls(obj, lock, ctx) - -# -# Functions for pickling/unpickling -# - - -def reduce_ctype(obj): - assert_spawning(obj) - if isinstance(obj, ctypes.Array): - return rebuild_ctype, (obj._type_, obj._wrapper, obj._length_) - else: - return rebuild_ctype, (type(obj), obj._wrapper, None) - - -def rebuild_ctype(type_, wrapper, length): - if length is not None: - type_ = type_ * length - ForkingPickler.register(type_, reduce_ctype) - if PY3: - buf = wrapper.create_memoryview() - obj = type_.from_buffer(buf) - else: - obj = type_.from_address(wrapper.get_address()) - obj._wrapper = wrapper - return obj - -# -# Function to create properties -# - - -def make_property(name): - try: - return prop_cache[name] - except KeyError: - d = {} - exec(template % ((name, ) * 7), d) - prop_cache[name] = d[name] - return d[name] - - -template = ''' -def get%s(self): - self.acquire() - try: - return self._obj.%s - finally: - self.release() -def set%s(self, value): - self.acquire() - try: - self._obj.%s = value - finally: - self.release() -%s = property(get%s, set%s) -''' - -prop_cache = {} -class_cache = weakref.WeakKeyDictionary() - -# -# Synchronized wrappers -# - - -class SynchronizedBase: - - def __init__(self, obj, lock=None, ctx=None): - self._obj = obj - if lock: - self._lock = lock - else: - ctx = ctx or get_context(force=True) - self._lock = ctx.RLock() - self.acquire = self._lock.acquire - self.release = self._lock.release - - def __enter__(self): - return self._lock.__enter__() - - def __exit__(self, *args): - return self._lock.__exit__(*args) - - def __reduce__(self): - assert_spawning(self) - return synchronized, (self._obj, self._lock) - - def get_obj(self): - return self._obj - - def get_lock(self): - return self._lock - - def __repr__(self): - return '<%s wrapper for %s>' % (type(self).__name__, self._obj) - - -class Synchronized(SynchronizedBase): - value = make_property('value') - - -class SynchronizedArray(SynchronizedBase): - - def __len__(self): - return len(self._obj) - - def __getitem__(self, i): - with self: - return self._obj[i] - - def __setitem__(self, i, value): - with self: - self._obj[i] = value - - def __getslice__(self, start, stop): - with self: - return self._obj[start:stop] - - def __setslice__(self, start, stop, values): - with self: - self._obj[start:stop] = values - - -class SynchronizedString(SynchronizedArray): - value = make_property('value') - raw = make_property('raw') diff --git a/.venv/lib/python3.10/site-packages/billiard/spawn.py b/.venv/lib/python3.10/site-packages/billiard/spawn.py deleted file mode 100644 index 9a29477..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/spawn.py +++ /dev/null @@ -1,389 +0,0 @@ -# -# Code used to start processes when using the spawn or forkserver -# start methods. -# -# multiprocessing/spawn.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import io -import os -import pickle -import sys -import runpy -import types -import warnings - -from . import get_start_method, set_start_method -from . import process -from . import util - -__all__ = ['_main', 'freeze_support', 'set_executable', 'get_executable', - 'get_preparation_data', 'get_command_line', 'import_main_path'] - -W_OLD_DJANGO_LAYOUT = """\ -Will add directory %r to path! This is necessary to accommodate \ -pre-Django 1.4 layouts using setup_environ. -You can skip this warning by adding a DJANGO_SETTINGS_MODULE=settings \ -environment variable. -""" - -# -# _python_exe is the assumed path to the python executable. -# People embedding Python want to modify it. -# - -if sys.platform != 'win32': - WINEXE = False - WINSERVICE = False -else: - WINEXE = (sys.platform == 'win32' and getattr(sys, 'frozen', False)) - WINSERVICE = sys.executable.lower().endswith("pythonservice.exe") - -if WINSERVICE: - _python_exe = os.path.join(sys.exec_prefix, 'python.exe') -else: - _python_exe = sys.executable - - -def _module_parent_dir(mod): - dir, filename = os.path.split(_module_dir(mod)) - if dir == os.curdir or not dir: - dir = os.getcwd() - return dir - - -def _module_dir(mod): - if '__init__.py' in mod.__file__: - return os.path.dirname(mod.__file__) - return mod.__file__ - - -def _Django_old_layout_hack__save(): - if 'DJANGO_PROJECT_DIR' not in os.environ: - try: - settings_name = os.environ['DJANGO_SETTINGS_MODULE'] - except KeyError: - return # not using Django. - - conf_settings = sys.modules.get('django.conf.settings') - configured = conf_settings and conf_settings.configured - try: - project_name, _ = settings_name.split('.', 1) - except ValueError: - return # not modified by setup_environ - - project = __import__(project_name) - try: - project_dir = os.path.normpath(_module_parent_dir(project)) - except AttributeError: - return # dynamically generated module (no __file__) - if configured: - warnings.warn(UserWarning( - W_OLD_DJANGO_LAYOUT % os.path.realpath(project_dir) - )) - os.environ['DJANGO_PROJECT_DIR'] = project_dir - - -def _Django_old_layout_hack__load(): - try: - sys.path.append(os.environ['DJANGO_PROJECT_DIR']) - except KeyError: - pass - - -def set_executable(exe): - global _python_exe - _python_exe = exe - - -def get_executable(): - return _python_exe - -# -# -# - - -def is_forking(argv): - ''' - Return whether commandline indicates we are forking - ''' - if len(argv) >= 2 and argv[1] == '--billiard-fork': - return True - else: - return False - - -def freeze_support(): - ''' - Run code for process object if this in not the main process - ''' - if is_forking(sys.argv): - kwds = {} - for arg in sys.argv[2:]: - name, value = arg.split('=') - if value == 'None': - kwds[name] = None - else: - kwds[name] = int(value) - spawn_main(**kwds) - sys.exit() - - -def get_command_line(**kwds): - ''' - Returns prefix of command line used for spawning a child process - ''' - if getattr(sys, 'frozen', False): - return ([sys.executable, '--billiard-fork'] + - ['%s=%r' % item for item in kwds.items()]) - else: - prog = 'from billiard.spawn import spawn_main; spawn_main(%s)' - prog %= ', '.join('%s=%r' % item for item in kwds.items()) - opts = util._args_from_interpreter_flags() - return [_python_exe] + opts + ['-c', prog, '--billiard-fork'] - - -def spawn_main(pipe_handle, parent_pid=None, tracker_fd=None): - ''' - Run code specified by data received over pipe - ''' - assert is_forking(sys.argv) - if sys.platform == 'win32': - import msvcrt - from .reduction import steal_handle - new_handle = steal_handle(parent_pid, pipe_handle) - fd = msvcrt.open_osfhandle(new_handle, os.O_RDONLY) - else: - from . import semaphore_tracker - semaphore_tracker._semaphore_tracker._fd = tracker_fd - fd = pipe_handle - exitcode = _main(fd) - sys.exit(exitcode) - - -def _setup_logging_in_child_hack(): - # Huge hack to make logging before Process.run work. - try: - os.environ["MP_MAIN_FILE"] = sys.modules["__main__"].__file__ - except KeyError: - pass - except AttributeError: - pass - loglevel = os.environ.get("_MP_FORK_LOGLEVEL_") - logfile = os.environ.get("_MP_FORK_LOGFILE_") or None - format = os.environ.get("_MP_FORK_LOGFORMAT_") - if loglevel: - from . import util - import logging - logger = util.get_logger() - logger.setLevel(int(loglevel)) - if not logger.handlers: - logger._rudimentary_setup = True - logfile = logfile or sys.__stderr__ - if hasattr(logfile, "write"): - handler = logging.StreamHandler(logfile) - else: - handler = logging.FileHandler(logfile) - formatter = logging.Formatter( - format or util.DEFAULT_LOGGING_FORMAT, - ) - handler.setFormatter(formatter) - logger.addHandler(handler) - - -def _main(fd): - _Django_old_layout_hack__load() - with io.open(fd, 'rb', closefd=True) as from_parent: - process.current_process()._inheriting = True - try: - preparation_data = pickle.load(from_parent) - prepare(preparation_data) - _setup_logging_in_child_hack() - self = pickle.load(from_parent) - finally: - del process.current_process()._inheriting - return self._bootstrap() - - -def _check_not_importing_main(): - if getattr(process.current_process(), '_inheriting', False): - raise RuntimeError(''' - An attempt has been made to start a new process before the - current process has finished its bootstrapping phase. - - This probably means that you are not using fork to start your - child processes and you have forgotten to use the proper idiom - in the main module: - - if __name__ == '__main__': - freeze_support() - ... - - The "freeze_support()" line can be omitted if the program - is not going to be frozen to produce an executable.''') - - -def get_preparation_data(name): - ''' - Return info about parent needed by child to unpickle process object - ''' - _check_not_importing_main() - d = dict( - log_to_stderr=util._log_to_stderr, - authkey=process.current_process().authkey, - ) - - if util._logger is not None: - d['log_level'] = util._logger.getEffectiveLevel() - - sys_path = sys.path[:] - try: - i = sys_path.index('') - except ValueError: - pass - else: - sys_path[i] = process.ORIGINAL_DIR - - d.update( - name=name, - sys_path=sys_path, - sys_argv=sys.argv, - orig_dir=process.ORIGINAL_DIR, - dir=os.getcwd(), - start_method=get_start_method(), - ) - - # Figure out whether to initialise main in the subprocess as a module - # or through direct execution (or to leave it alone entirely) - main_module = sys.modules['__main__'] - try: - main_mod_name = main_module.__spec__.name - except AttributeError: - main_mod_name = main_module.__name__ - if main_mod_name is not None: - d['init_main_from_name'] = main_mod_name - elif sys.platform != 'win32' or (not WINEXE and not WINSERVICE): - main_path = getattr(main_module, '__file__', None) - if main_path is not None: - if (not os.path.isabs(main_path) and - process.ORIGINAL_DIR is not None): - main_path = os.path.join(process.ORIGINAL_DIR, main_path) - d['init_main_from_path'] = os.path.normpath(main_path) - - return d - -# -# Prepare current process -# - - -old_main_modules = [] - - -def prepare(data): - ''' - Try to get current process ready to unpickle process object - ''' - if 'name' in data: - process.current_process().name = data['name'] - - if 'authkey' in data: - process.current_process().authkey = data['authkey'] - - if 'log_to_stderr' in data and data['log_to_stderr']: - util.log_to_stderr() - - if 'log_level' in data: - util.get_logger().setLevel(data['log_level']) - - if 'sys_path' in data: - sys.path = data['sys_path'] - - if 'sys_argv' in data: - sys.argv = data['sys_argv'] - - if 'dir' in data: - os.chdir(data['dir']) - - if 'orig_dir' in data: - process.ORIGINAL_DIR = data['orig_dir'] - - if 'start_method' in data: - set_start_method(data['start_method']) - - if 'init_main_from_name' in data: - _fixup_main_from_name(data['init_main_from_name']) - elif 'init_main_from_path' in data: - _fixup_main_from_path(data['init_main_from_path']) - -# Multiprocessing module helpers to fix up the main module in -# spawned subprocesses - - -def _fixup_main_from_name(mod_name): - # __main__.py files for packages, directories, zip archives, etc, run - # their "main only" code unconditionally, so we don't even try to - # populate anything in __main__, nor do we make any changes to - # __main__ attributes - current_main = sys.modules['__main__'] - if mod_name == "__main__" or mod_name.endswith(".__main__"): - return - - # If this process was forked, __main__ may already be populated - try: - current_main_name = current_main.__spec__.name - except AttributeError: - current_main_name = current_main.__name__ - - if current_main_name == mod_name: - return - - # Otherwise, __main__ may contain some non-main code where we need to - # support unpickling it properly. We rerun it as __mp_main__ and make - # the normal __main__ an alias to that - old_main_modules.append(current_main) - main_module = types.ModuleType("__mp_main__") - main_content = runpy.run_module(mod_name, - run_name="__mp_main__", - alter_sys=True) - main_module.__dict__.update(main_content) - sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module - - -def _fixup_main_from_path(main_path): - # If this process was forked, __main__ may already be populated - current_main = sys.modules['__main__'] - - # Unfortunately, the main ipython launch script historically had no - # "if __name__ == '__main__'" guard, so we work around that - # by treating it like a __main__.py file - # See https://github.com/ipython/ipython/issues/4698 - main_name = os.path.splitext(os.path.basename(main_path))[0] - if main_name == 'ipython': - return - - # Otherwise, if __file__ already has the setting we expect, - # there's nothing more to do - if getattr(current_main, '__file__', None) == main_path: - return - - # If the parent process has sent a path through rather than a module - # name we assume it is an executable script that may contain - # non-main code that needs to be executed - old_main_modules.append(current_main) - main_module = types.ModuleType("__mp_main__") - main_content = runpy.run_path(main_path, - run_name="__mp_main__") - main_module.__dict__.update(main_content) - sys.modules['__main__'] = sys.modules['__mp_main__'] = main_module - - -def import_main_path(main_path): - ''' - Set sys.modules['__main__'] to module at main_path - ''' - _fixup_main_from_path(main_path) diff --git a/.venv/lib/python3.10/site-packages/billiard/synchronize.py b/.venv/lib/python3.10/site-packages/billiard/synchronize.py deleted file mode 100644 index c864064..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/synchronize.py +++ /dev/null @@ -1,436 +0,0 @@ -# -# Module implementing synchronization primitives -# -# multiprocessing/synchronize.py -# -# Copyright (c) 2006-2008, R Oudkerk -# Licensed to PSF under a Contributor Agreement. -# - -import errno -import sys -import tempfile -import threading - -from . import context -from . import process -from . import util - -from ._ext import _billiard, ensure_SemLock -from time import monotonic - -__all__ = [ - 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', 'Event', -] - -# Try to import the mp.synchronize module cleanly, if it fails -# raise ImportError for platforms lacking a working sem_open implementation. -# See issue 3770 -ensure_SemLock() - -# -# Constants -# - -RECURSIVE_MUTEX, SEMAPHORE = list(range(2)) -SEM_VALUE_MAX = _billiard.SemLock.SEM_VALUE_MAX - -try: - sem_unlink = _billiard.SemLock.sem_unlink -except AttributeError: # pragma: no cover - try: - # Py3.4+ implements sem_unlink and the semaphore must be named - from _multiprocessing import sem_unlink # noqa - except ImportError: - sem_unlink = None # noqa - -# -# Base class for semaphores and mutexes; wraps `_billiard.SemLock` -# - - -def _semname(sl): - try: - return sl.name - except AttributeError: - pass - - -class SemLock: - _rand = tempfile._RandomNameSequence() - - def __init__(self, kind, value, maxvalue, ctx=None): - if ctx is None: - ctx = context._default_context.get_context() - name = ctx.get_start_method() - unlink_now = sys.platform == 'win32' or name == 'fork' - if sem_unlink: - for i in range(100): - try: - sl = self._semlock = _billiard.SemLock( - kind, value, maxvalue, self._make_name(), unlink_now, - ) - except (OSError, IOError) as exc: - if getattr(exc, 'errno', None) != errno.EEXIST: - raise - else: - break - else: - exc = IOError('cannot find file for semaphore') - exc.errno = errno.EEXIST - raise exc - else: - sl = self._semlock = _billiard.SemLock(kind, value, maxvalue) - - util.debug('created semlock with handle %s', sl.handle) - self._make_methods() - - if sem_unlink: - - if sys.platform != 'win32': - def _after_fork(obj): - obj._semlock._after_fork() - util.register_after_fork(self, _after_fork) - - if _semname(self._semlock) is not None: - # We only get here if we are on Unix with forking - # disabled. When the object is garbage collected or the - # process shuts down we unlink the semaphore name - from .semaphore_tracker import register - register(self._semlock.name) - util.Finalize(self, SemLock._cleanup, (self._semlock.name,), - exitpriority=0) - - @staticmethod - def _cleanup(name): - from .semaphore_tracker import unregister - sem_unlink(name) - unregister(name) - - def _make_methods(self): - self.acquire = self._semlock.acquire - self.release = self._semlock.release - - def __enter__(self): - return self._semlock.__enter__() - - def __exit__(self, *args): - return self._semlock.__exit__(*args) - - def __getstate__(self): - context.assert_spawning(self) - sl = self._semlock - if sys.platform == 'win32': - h = context.get_spawning_popen().duplicate_for_child(sl.handle) - else: - h = sl.handle - state = (h, sl.kind, sl.maxvalue) - try: - state += (sl.name, ) - except AttributeError: - pass - return state - - def __setstate__(self, state): - self._semlock = _billiard.SemLock._rebuild(*state) - util.debug('recreated blocker with handle %r', state[0]) - self._make_methods() - - @staticmethod - def _make_name(): - return '%s-%s' % (process.current_process()._config['semprefix'], - next(SemLock._rand)) - - -class Semaphore(SemLock): - - def __init__(self, value=1, ctx=None): - SemLock.__init__(self, SEMAPHORE, value, SEM_VALUE_MAX, ctx=ctx) - - def get_value(self): - return self._semlock._get_value() - - def __repr__(self): - try: - value = self._semlock._get_value() - except Exception: - value = 'unknown' - return '<%s(value=%s)>' % (self.__class__.__name__, value) - - -class BoundedSemaphore(Semaphore): - - def __init__(self, value=1, ctx=None): - SemLock.__init__(self, SEMAPHORE, value, value, ctx=ctx) - - def __repr__(self): - try: - value = self._semlock._get_value() - except Exception: - value = 'unknown' - return '<%s(value=%s, maxvalue=%s)>' % ( - self.__class__.__name__, value, self._semlock.maxvalue) - - -class Lock(SemLock): - ''' - Non-recursive lock. - ''' - - def __init__(self, ctx=None): - SemLock.__init__(self, SEMAPHORE, 1, 1, ctx=ctx) - - def __repr__(self): - try: - if self._semlock._is_mine(): - name = process.current_process().name - if threading.current_thread().name != 'MainThread': - name += '|' + threading.current_thread().name - elif self._semlock._get_value() == 1: - name = 'None' - elif self._semlock._count() > 0: - name = 'SomeOtherThread' - else: - name = 'SomeOtherProcess' - except Exception: - name = 'unknown' - return '<%s(owner=%s)>' % (self.__class__.__name__, name) - - -class RLock(SemLock): - ''' - Recursive lock - ''' - - def __init__(self, ctx=None): - SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1, ctx=ctx) - - def __repr__(self): - try: - if self._semlock._is_mine(): - name = process.current_process().name - if threading.current_thread().name != 'MainThread': - name += '|' + threading.current_thread().name - count = self._semlock._count() - elif self._semlock._get_value() == 1: - name, count = 'None', 0 - elif self._semlock._count() > 0: - name, count = 'SomeOtherThread', 'nonzero' - else: - name, count = 'SomeOtherProcess', 'nonzero' - except Exception: - name, count = 'unknown', 'unknown' - return '<%s(%s, %s)>' % (self.__class__.__name__, name, count) - - -class Condition: - ''' - Condition variable - ''' - - def __init__(self, lock=None, ctx=None): - assert ctx - self._lock = lock or ctx.RLock() - self._sleeping_count = ctx.Semaphore(0) - self._woken_count = ctx.Semaphore(0) - self._wait_semaphore = ctx.Semaphore(0) - self._make_methods() - - def __getstate__(self): - context.assert_spawning(self) - return (self._lock, self._sleeping_count, - self._woken_count, self._wait_semaphore) - - def __setstate__(self, state): - (self._lock, self._sleeping_count, - self._woken_count, self._wait_semaphore) = state - self._make_methods() - - def __enter__(self): - return self._lock.__enter__() - - def __exit__(self, *args): - return self._lock.__exit__(*args) - - def _make_methods(self): - self.acquire = self._lock.acquire - self.release = self._lock.release - - def __repr__(self): - try: - num_waiters = (self._sleeping_count._semlock._get_value() - - self._woken_count._semlock._get_value()) - except Exception: - num_waiters = 'unknown' - return '<%s(%s, %s)>' % ( - self.__class__.__name__, self._lock, num_waiters) - - def wait(self, timeout=None): - assert self._lock._semlock._is_mine(), \ - 'must acquire() condition before using wait()' - - # indicate that this thread is going to sleep - self._sleeping_count.release() - - # release lock - count = self._lock._semlock._count() - for i in range(count): - self._lock.release() - - try: - # wait for notification or timeout - return self._wait_semaphore.acquire(True, timeout) - finally: - # indicate that this thread has woken - self._woken_count.release() - - # reacquire lock - for i in range(count): - self._lock.acquire() - - def notify(self): - assert self._lock._semlock._is_mine(), 'lock is not owned' - assert not self._wait_semaphore.acquire(False) - - # to take account of timeouts since last notify() we subtract - # woken_count from sleeping_count and rezero woken_count - while self._woken_count.acquire(False): - res = self._sleeping_count.acquire(False) - assert res - - if self._sleeping_count.acquire(False): # try grabbing a sleeper - self._wait_semaphore.release() # wake up one sleeper - self._woken_count.acquire() # wait for sleeper to wake - - # rezero _wait_semaphore in case a timeout just happened - self._wait_semaphore.acquire(False) - - def notify_all(self): - assert self._lock._semlock._is_mine(), 'lock is not owned' - assert not self._wait_semaphore.acquire(False) - - # to take account of timeouts since last notify*() we subtract - # woken_count from sleeping_count and rezero woken_count - while self._woken_count.acquire(False): - res = self._sleeping_count.acquire(False) - assert res - - sleepers = 0 - while self._sleeping_count.acquire(False): - self._wait_semaphore.release() # wake up one sleeper - sleepers += 1 - - if sleepers: - for i in range(sleepers): - self._woken_count.acquire() # wait for a sleeper to wake - - # rezero wait_semaphore in case some timeouts just happened - while self._wait_semaphore.acquire(False): - pass - - def wait_for(self, predicate, timeout=None): - result = predicate() - if result: - return result - if timeout is not None: - endtime = monotonic() + timeout - else: - endtime = None - waittime = None - while not result: - if endtime is not None: - waittime = endtime - monotonic() - if waittime <= 0: - break - self.wait(waittime) - result = predicate() - return result - - -class Event: - - def __init__(self, ctx=None): - assert ctx - self._cond = ctx.Condition(ctx.Lock()) - self._flag = ctx.Semaphore(0) - - def is_set(self): - with self._cond: - if self._flag.acquire(False): - self._flag.release() - return True - return False - - def set(self): - with self._cond: - self._flag.acquire(False) - self._flag.release() - self._cond.notify_all() - - def clear(self): - with self._cond: - self._flag.acquire(False) - - def wait(self, timeout=None): - with self._cond: - if self._flag.acquire(False): - self._flag.release() - else: - self._cond.wait(timeout) - - if self._flag.acquire(False): - self._flag.release() - return True - return False - -# -# Barrier -# - - -if hasattr(threading, 'Barrier'): - - class Barrier(threading.Barrier): - - def __init__(self, parties, action=None, timeout=None, ctx=None): - assert ctx - import struct - from .heap import BufferWrapper - wrapper = BufferWrapper(struct.calcsize('i') * 2) - cond = ctx.Condition() - self.__setstate__((parties, action, timeout, cond, wrapper)) - self._state = 0 - self._count = 0 - - def __setstate__(self, state): - (self._parties, self._action, self._timeout, - self._cond, self._wrapper) = state - self._array = self._wrapper.create_memoryview().cast('i') - - def __getstate__(self): - return (self._parties, self._action, self._timeout, - self._cond, self._wrapper) - - @property - def _state(self): - return self._array[0] - - @_state.setter - def _state(self, value): # noqa - self._array[0] = value - - @property - def _count(self): - return self._array[1] - - @_count.setter - def _count(self, value): # noqa - self._array[1] = value - - -else: - - class Barrier: # noqa - - def __init__(self, *args, **kwargs): - raise NotImplementedError('Barrier only supported on Py3') diff --git a/.venv/lib/python3.10/site-packages/billiard/util.py b/.venv/lib/python3.10/site-packages/billiard/util.py deleted file mode 100644 index 0fdf2a2..0000000 --- a/.venv/lib/python3.10/site-packages/billiard/util.py +++ /dev/null @@ -1,232 +0,0 @@ -# -# Module providing various facilities to other parts of the package -# -# billiard/util.py -# -# Copyright (c) 2006-2008, R Oudkerk --- see COPYING.txt -# Licensed to PSF under a Contributor Agreement. -# - -import sys -import errno -import functools -import atexit - -try: - import cffi -except ImportError: - import ctypes - -try: - from subprocess import _args_from_interpreter_flags # noqa -except ImportError: # pragma: no cover - def _args_from_interpreter_flags(): # noqa - """Return a list of command-line arguments reproducing the current - settings in sys.flags and sys.warnoptions.""" - flag_opt_map = { - 'debug': 'd', - 'optimize': 'O', - 'dont_write_bytecode': 'B', - 'no_user_site': 's', - 'no_site': 'S', - 'ignore_environment': 'E', - 'verbose': 'v', - 'bytes_warning': 'b', - 'hash_randomization': 'R', - 'py3k_warning': '3', - } - args = [] - for flag, opt in flag_opt_map.items(): - v = getattr(sys.flags, flag) - if v > 0: - args.append('-' + opt * v) - for opt in sys.warnoptions: - args.append('-W' + opt) - return args - -from multiprocessing.util import ( # noqa - _afterfork_registry, - _afterfork_counter, - _exit_function, - _finalizer_registry, - _finalizer_counter, - Finalize, - ForkAwareLocal, - ForkAwareThreadLock, - get_temp_dir, - is_exiting, - register_after_fork, - _run_after_forkers, - _run_finalizers, -) - -from .compat import get_errno - -__all__ = [ - 'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger', - 'log_to_stderr', 'get_temp_dir', 'register_after_fork', - 'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal', - 'SUBDEBUG', 'SUBWARNING', -] - - -# Constants from prctl.h -PR_GET_PDEATHSIG = 2 -PR_SET_PDEATHSIG = 1 - -# -# Logging -# - -NOTSET = 0 -SUBDEBUG = 5 -DEBUG = 10 -INFO = 20 -SUBWARNING = 25 -WARNING = 30 -ERROR = 40 - -LOGGER_NAME = 'multiprocessing' -DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s' - -_logger = None -_log_to_stderr = False - - -def sub_debug(msg, *args, **kwargs): - if _logger: - _logger.log(SUBDEBUG, msg, *args, **kwargs) - - -def debug(msg, *args, **kwargs): - if _logger: - _logger.log(DEBUG, msg, *args, **kwargs) - - -def info(msg, *args, **kwargs): - if _logger: - _logger.log(INFO, msg, *args, **kwargs) - - -def sub_warning(msg, *args, **kwargs): - if _logger: - _logger.log(SUBWARNING, msg, *args, **kwargs) - -def warning(msg, *args, **kwargs): - if _logger: - _logger.log(WARNING, msg, *args, **kwargs) - -def error(msg, *args, **kwargs): - if _logger: - _logger.log(ERROR, msg, *args, **kwargs) - - -def get_logger(): - ''' - Returns logger used by multiprocessing - ''' - global _logger - import logging - - logging._acquireLock() - try: - if not _logger: - - _logger = logging.getLogger(LOGGER_NAME) - _logger.propagate = 0 - logging.addLevelName(SUBDEBUG, 'SUBDEBUG') - logging.addLevelName(SUBWARNING, 'SUBWARNING') - - # XXX multiprocessing should cleanup before logging - if hasattr(atexit, 'unregister'): - atexit.unregister(_exit_function) - atexit.register(_exit_function) - else: - atexit._exithandlers.remove((_exit_function, (), {})) - atexit._exithandlers.append((_exit_function, (), {})) - finally: - logging._releaseLock() - - return _logger - - -def log_to_stderr(level=None): - ''' - Turn on logging and add a handler which prints to stderr - ''' - global _log_to_stderr - import logging - - logger = get_logger() - formatter = logging.Formatter(DEFAULT_LOGGING_FORMAT) - handler = logging.StreamHandler() - handler.setFormatter(formatter) - logger.addHandler(handler) - - if level: - logger.setLevel(level) - _log_to_stderr = True - return _logger - - -def get_pdeathsig(): - """ - Return the current value of the parent process death signal - """ - if not sys.platform.startswith('linux'): - # currently we support only linux platform. - raise OSError() - try: - if 'cffi' in sys.modules: - ffi = cffi.FFI() - ffi.cdef("int prctl (int __option, ...);") - arg = ffi.new("int *") - C = ffi.dlopen(None) - C.prctl(PR_GET_PDEATHSIG, arg) - return arg[0] - else: - sig = ctypes.c_int() - libc = ctypes.cdll.LoadLibrary("libc.so.6") - libc.prctl(PR_GET_PDEATHSIG, ctypes.byref(sig)) - return sig.value - except Exception: - raise OSError() - - -def set_pdeathsig(sig): - """ - Set the parent process death signal of the calling process to sig - (either a signal value in the range 1..maxsig, or 0 to clear). - This is the signal that the calling process will get when its parent dies. - This value is cleared for the child of a fork(2) and - (since Linux 2.4.36 / 2.6.23) when executing a set-user-ID or set-group-ID binary. - """ - if not sys.platform.startswith('linux'): - # currently we support only linux platform. - raise OSError("pdeathsig is only supported on linux") - try: - if 'cffi' in sys.modules: - ffi = cffi.FFI() - ffi.cdef("int prctl (int __option, ...);") - C = ffi.dlopen(None) - C.prctl(PR_SET_PDEATHSIG, ffi.cast("int", sig)) - else: - libc = ctypes.cdll.LoadLibrary("libc.so.6") - libc.prctl(PR_SET_PDEATHSIG, ctypes.c_int(sig)) - except Exception as e: - raise OSError("An error occured while setting pdeathsig") from e - -def _eintr_retry(func): - ''' - Automatic retry after EINTR. - ''' - - @functools.wraps(func) - def wrapped(*args, **kwargs): - while 1: - try: - return func(*args, **kwargs) - except OSError as exc: - if get_errno(exc) != errno.EINTR: - raise - return wrapped diff --git a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/INSTALLER b/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/LICENSE.txt b/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/LICENSE.txt deleted file mode 100644 index 79c9825..0000000 --- a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright 2010 Jason Kirtland - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/METADATA b/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/METADATA deleted file mode 100644 index efa45f5..0000000 --- a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/METADATA +++ /dev/null @@ -1,60 +0,0 @@ -Metadata-Version: 2.1 -Name: blinker -Version: 1.8.2 -Summary: Fast, simple object-to-object and broadcast signaling -Author: Jason Kirtland -Maintainer-email: Pallets Ecosystem -Requires-Python: >=3.8 -Description-Content-Type: text/markdown -Classifier: Development Status :: 5 - Production/Stable -Classifier: License :: OSI Approved :: MIT License -Classifier: Programming Language :: Python -Classifier: Typing :: Typed -Project-URL: Chat, https://discord.gg/pallets -Project-URL: Documentation, https://blinker.readthedocs.io -Project-URL: Source, https://github.com/pallets-eco/blinker/ - -# Blinker - -Blinker provides a fast dispatching system that allows any number of -interested parties to subscribe to events, or "signals". - - -## Pallets Community Ecosystem - -> [!IMPORTANT]\ -> This project is part of the Pallets Community Ecosystem. Pallets is the open -> source organization that maintains Flask; Pallets-Eco enables community -> maintenance of related projects. If you are interested in helping maintain -> this project, please reach out on [the Pallets Discord server][discord]. -> -> [discord]: https://discord.gg/pallets - - -## Example - -Signal receivers can subscribe to specific senders or receive signals -sent by any sender. - -```pycon ->>> from blinker import signal ->>> started = signal('round-started') ->>> def each(round): -... print(f"Round {round}") -... ->>> started.connect(each) - ->>> def round_two(round): -... print("This is round two.") -... ->>> started.connect(round_two, sender=2) - ->>> for round in range(1, 4): -... started.send(round) -... -Round 1! -Round 2! -This is round two. -Round 3! -``` - diff --git a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/RECORD b/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/RECORD deleted file mode 100644 index e6c304b..0000000 --- a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/RECORD +++ /dev/null @@ -1,12 +0,0 @@ -blinker-1.8.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -blinker-1.8.2.dist-info/LICENSE.txt,sha256=nrc6HzhZekqhcCXSrhvjg5Ykx5XphdTw6Xac4p-spGc,1054 -blinker-1.8.2.dist-info/METADATA,sha256=3tEx40hm9IEofyFqDPJsDPE9MAIEhtifapoSp7FqzuA,1633 -blinker-1.8.2.dist-info/RECORD,, -blinker-1.8.2.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81 -blinker/__init__.py,sha256=ymyJY_PoTgBzaPgdr4dq-RRsGh7D-sYQIGMNp8Rx4qc,1577 -blinker/__pycache__/__init__.cpython-310.pyc,, -blinker/__pycache__/_utilities.cpython-310.pyc,, -blinker/__pycache__/base.cpython-310.pyc,, -blinker/_utilities.py,sha256=0J7eeXXTUx0Ivf8asfpx0ycVkp0Eqfqnj117x2mYX9E,1675 -blinker/base.py,sha256=nIZJEtXQ8LLZZJrwVp2wQcdfCzDixvAHR9VpSWiyVcQ,22574 -blinker/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/WHEEL b/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/WHEEL deleted file mode 100644 index 3b5e64b..0000000 --- a/.venv/lib/python3.10/site-packages/blinker-1.8.2.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: flit 3.9.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/.venv/lib/python3.10/site-packages/blinker/__init__.py b/.venv/lib/python3.10/site-packages/blinker/__init__.py deleted file mode 100644 index c93527e..0000000 --- a/.venv/lib/python3.10/site-packages/blinker/__init__.py +++ /dev/null @@ -1,60 +0,0 @@ -from __future__ import annotations - -import typing as t - -from .base import ANY -from .base import default_namespace -from .base import NamedSignal -from .base import Namespace -from .base import Signal -from .base import signal - -__all__ = [ - "ANY", - "default_namespace", - "NamedSignal", - "Namespace", - "Signal", - "signal", -] - - -def __getattr__(name: str) -> t.Any: - import warnings - - if name == "__version__": - import importlib.metadata - - warnings.warn( - "The '__version__' attribute is deprecated and will be removed in" - " Blinker 1.9.0. Use feature detection or" - " 'importlib.metadata.version(\"blinker\")' instead.", - DeprecationWarning, - stacklevel=2, - ) - return importlib.metadata.version("blinker") - - if name == "receiver_connected": - from .base import _receiver_connected - - warnings.warn( - "The global 'receiver_connected' signal is deprecated and will be" - " removed in Blinker 1.9. Use 'Signal.receiver_connected' and" - " 'Signal.receiver_disconnected' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _receiver_connected - - if name == "WeakNamespace": - from .base import _WeakNamespace - - warnings.warn( - "'WeakNamespace' is deprecated and will be removed in Blinker 1.9." - " Use 'Namespace' instead.", - DeprecationWarning, - stacklevel=2, - ) - return _WeakNamespace - - raise AttributeError(name) diff --git a/.venv/lib/python3.10/site-packages/blinker/__pycache__/__init__.cpython-310.pyc b/.venv/lib/python3.10/site-packages/blinker/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 392bd16850c8402d606d683ed7fea40a177433e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1502 zcmb7E&5j#I5bmBC&y2_RLN35 z!d<{wl~FP!BKwV2J#k08Bi?-#Recd0k2m^oRgA0d65u(N%GiT%sTO*$zKk@p`~}2E0D-(#vSW8|?6+BjUOjChL2Qol0Y&l8l}I{LP8XhdY*G&Yd&$c;RGT+g!-GkrVEu$hj8zS*=t)mbsBl zdkVH%=g(BFXVT;ki^s)-BLCLP{8(}*k%V9;C)l#QHTke^=B;t69v6*tTyV#WO&*`z zAFnsLKN`Z8)=4gks{oRP&Slo|$xO*pseH2G`F%)A))3Ant=4de6b5G%_;=ZD-}&!& z&8cd~T;;>t{$akJgSWr&>b}GEJQe@7F;?xCU)1(G@0%O@!E?!HyMwyN-msik!#8vY zecKML^SwUf=I~MG(=%>#t*6%S-|m%<(ChcV+zbSC_4%6a(``R}vT3M~#@tGC7dm3@ z;mqwFY=`PAV_Gxn82s*-_tDqAKI|soPhvg--|Mf-leUp%Bh6%4YI$arbWWNQCP$x^ zFiYip=}ubxS@G~eX=^7xh37xxQ)$c1sFaM=x^|2e^Cgb{6lM={VGPf(TxtA_@5|F1M@Kij-vG~dVozI#Q?1XpD}j4z!$)n!728!Th5`d xo;vd(^8Wv0lQ71Wf>=CcRfips<9_MqO)C~kKEVfV-viMnkTj&d{iVTP_Ah|0p%MT9 diff --git a/.venv/lib/python3.10/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc b/.venv/lib/python3.10/site-packages/blinker/__pycache__/_utilities.cpython-310.pyc deleted file mode 100644 index 1324a80ce79f85685944da6eee184c418981139c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2166 zcmZ`4O>f&al$2!4Q5-u-o37okLR+`B+ERJLE;|IliX6JjGGNIzKtaIBBAuv_C6A<2 zIPgvm(8K;jds~40B3^geU&v|iQBLYE8wHV%?>+K;KUOO%0fDjc$I;;TCLw>}W^s71 z`IZo>BmkUnT96@4C`H&QoS~a|bGVT-EUuaOu)0NSxRfkeng?)@1e6H>^)hd~p-KBW z;Z5#e5bn>MWQE`1ZN75hB^`d3Z}2s~e$hy}+}R`1y}wbLh??cJEGwPryeic$>|H4a zumrz|^z?h7PbzNceum781J#E?)h^6}B$SiH`3cNO+?*sHcSM7`TZFH@A_K~O-nwWf zO}@?pz6|R4H;T1Du`XW)+|n!Jkt6`sHcWGGGVE8y`Jd0i4AjzTsY7K^n_-z}LWcSz zEyJUus{cY{`bl(j6o)^Gkw~@RVU`w!3Z>9vSpuU7LKrF?iZHi#Wg-qNZhLz>tR+2p zJgBP2QJAZD5teOVj_W&a@mn&SwCnkYI^HQ#rG8H30namiptRha-*KOg)-rRfH|xoTW&TqY!)8jS5RN~rsNI%&6&cA_$@Mp$X?Rj z$dx{vGYvH!32A)BO7W7h$Tea2HsfMCA6f&Fi;D{=O z)2)j5_IfbqTGNzh`k5Pe@K#I zBpG`IL@TMeD5<7ht?BWo5C=MbR!%mQ$3jE6Qh5w< z{OnqV7Cqm%F?Nw7@@jW2;brJsiKgDh-bJiab0F_E{650V=w3`@#!SH2u;Swa;WlHx zj?-dJfz;zw##o(?UB(ug4PY@pb3z;9hd^* z(e_fu30i@>?pm7c0^T(1=3w=|3bOdSRGp;#LfmpX_A(psZvfEbHDuZwD!UrX%AHZW zdNVqJ;?j*N(M|0SoS7rA`|%; zY+c1aaH}m9f0&*Mmh;bnRu`*x*X=l-+j8X>c(#R2 zwGY*P^-&h@0E{*s9Kc&~uzz^C8Daq+hEuy^gxXdw9^R4}OdXZQegZ z2-`{2tVs<-*o&XuFkuUhRx!y3V|Y>^$tCs@)6J>^vdKQ2aoW#}ixbVP&Zem+qr5ye zR2%;#Jf)zM)!y1+{Qb#Dz&jzWK-AN^*{ZoQkW`4i# z^lb(JMQ_SgNtFhLp3|pKpUZc?`}dvc&CZr{_#FGI)%DsBbGe`KCi^Mi=Jj083T|4t z+z)apr>u6aW7RE-WxH*6@^vRF7wSc+o2pOAcd1^&cfLK{Dc8%=#%a%VD)ow#3n