gendisjawi commited on
Commit
359264c
1 Parent(s): 9bb4bf3

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +24 -0
  2. README.md +1 -0
  3. bore +3 -0
  4. docker-compose.yaml +21 -0
  5. domain-ngrok.txt +1 -0
  6. share/readme.txt +18 -0
  7. try-on/.env +3 -0
  8. try-on/README.md +110 -0
  9. try-on/app.py +199 -0
  10. try-on/env/bin/Activate.ps1 +241 -0
  11. try-on/env/bin/activate +76 -0
  12. try-on/env/bin/activate.csh +37 -0
  13. try-on/env/bin/activate.fish +75 -0
  14. try-on/env/bin/dotenv +8 -0
  15. try-on/env/bin/easy_install +8 -0
  16. try-on/env/bin/easy_install-3.8 +8 -0
  17. try-on/env/bin/f2py +8 -0
  18. try-on/env/bin/f2py3 +8 -0
  19. try-on/env/bin/f2py3.8 +8 -0
  20. try-on/env/bin/flask +8 -0
  21. try-on/env/bin/httpx +8 -0
  22. try-on/env/bin/huggingface-cli +8 -0
  23. try-on/env/bin/normalizer +8 -0
  24. try-on/env/bin/pip +8 -0
  25. try-on/env/bin/pip3 +8 -0
  26. try-on/env/bin/pip3.8 +8 -0
  27. try-on/env/bin/python +3 -0
  28. try-on/env/bin/python3 +3 -0
  29. try-on/env/bin/python3.8 +3 -0
  30. try-on/env/bin/tqdm +8 -0
  31. try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER +1 -0
  32. try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst +28 -0
  33. try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/METADATA +93 -0
  34. try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/RECORD +14 -0
  35. try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL +6 -0
  36. try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt +1 -0
  37. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst +7 -0
  38. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/INSTALLER +1 -0
  39. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/LICENSE +21 -0
  40. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/METADATA +97 -0
  41. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/RECORD +32 -0
  42. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/WHEEL +5 -0
  43. try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/top_level.txt +1 -0
  44. try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/INSTALLER +1 -0
  45. try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/LICENSE +20 -0
  46. try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/METADATA +46 -0
  47. try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/RECORD +43 -0
  48. try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/WHEEL +6 -0
  49. try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/top_level.txt +2 -0
  50. try-on/env/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc +0 -0
.gitattributes CHANGED
@@ -33,3 +33,27 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ bore filter=lfs diff=lfs merge=lfs -text
37
+ try-on/env/bin/python filter=lfs diff=lfs merge=lfs -text
38
+ try-on/env/bin/python3 filter=lfs diff=lfs merge=lfs -text
39
+ try-on/env/bin/python3.8 filter=lfs diff=lfs merge=lfs -text
40
+ try-on/env/lib/python3.8/site-packages/aiohttp/_http_parser.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
41
+ try-on/env/lib/python3.8/site-packages/cv2/cv2.abi3.so filter=lfs diff=lfs merge=lfs -text
42
+ try-on/env/lib/python3.8/site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
43
+ try-on/env/lib/python3.8/site-packages/numpy/core/_simd.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
44
+ try-on/env/lib/python3.8/site-packages/numpy.libs/libgfortran-040039e1.so.5.0.0 filter=lfs diff=lfs merge=lfs -text
45
+ try-on/env/lib/python3.8/site-packages/numpy.libs/libopenblas64_p-r0-15028c96.3.21.so filter=lfs diff=lfs merge=lfs -text
46
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5Core-e6d3f451.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
47
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5Gui-5dea4132.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
48
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5Widgets-e392eaf8.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
49
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libQt5XcbQpa-3bf8a55a.so.5.15.13 filter=lfs diff=lfs merge=lfs -text
50
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libavcodec-9aae324f.so.59.37.100 filter=lfs diff=lfs merge=lfs -text
51
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libavformat-3ff1be5b.so.59.27.100 filter=lfs diff=lfs merge=lfs -text
52
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libcrypto-337dac8b.so.1.1 filter=lfs diff=lfs merge=lfs -text
53
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libgfortran-91cc3cb1.so.3.0.0 filter=lfs diff=lfs merge=lfs -text
54
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libopenblas-r0-f650aae0.3.3.so filter=lfs diff=lfs merge=lfs -text
55
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libpng16-1bde1c40.so.16.43.0 filter=lfs diff=lfs merge=lfs -text
56
+ try-on/env/lib/python3.8/site-packages/opencv_python.libs/libvpx-c3a7933e.so.9.0.0 filter=lfs diff=lfs merge=lfs -text
57
+ try-on/env/lib/python3.8/site-packages/yaml/_yaml.cpython-38-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text
58
+ win/data.img filter=lfs diff=lfs merge=lfs -text
59
+ win/windows.rom filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1 @@
 
 
1
+ # ruang-rindu
bore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f44936a327daf82ebe609359d9fccc6d77039fc61e0054de0344b1a5aeb85c9c
3
+ size 6298496
docker-compose.yaml ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ services:
2
+ windows:
3
+ image: dockurr/windows
4
+ container_name: windows
5
+ environment:
6
+ RAM_SIZE: "10G"
7
+ CPU_CORES: "2"
8
+ DISK_SIZE: "20G"
9
+ VERSION: "11"
10
+ devices:
11
+ - /dev/kvm
12
+ cap_add:
13
+ - NET_ADMIN
14
+ ports:
15
+ - 8006:8006
16
+ - 3389:3389/tcp
17
+ - 3389:3389/udp
18
+ stop_grace_period: 2m
19
+ volumes:
20
+ - /workspaces/ruang-rindu/win:/storage
21
+ - /workspaces/ruang-rindu/share:/data
domain-ngrok.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ ngrok http --url=26499a1c4bfb-550921446110692386.ngrok-free.app 80
share/readme.txt ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ --------------------------------------------------------
2
+ Windows for Docker v4.05...
3
+ For support visit https://github.com/dockur/windows
4
+ --------------------------------------------------------
5
+
6
+ Using this folder you can share files with the host machine.
7
+
8
+ To change its location, include the following bind mount in your compose file:
9
+
10
+ volumes:
11
+ - "/home/example:/data"
12
+
13
+ Or in your run command:
14
+
15
+ -v "/home/example:/data"
16
+
17
+ Replace the example path /home/example with the desired shared folder.
18
+
try-on/.env ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ TWILIO_ACCOUNT_SID=AC0241772166fa5b2d70bf06a693ec1aac
2
+ TWILIO_AUTH_TOKEN=6e60bca9c0f656f18082fb90b76d9ed0
3
+ TWILIO_WHATSAPP_NUMBER='whatsapp:+14155238886'
try-on/README.md ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ![4179993](https://github.com/user-attachments/assets/9057edbb-6d9f-4aba-8bce-1ff120f7b970)
2
+ # Virtual Try-On Prototype with Flask, Twilio, and Hugging Face's Gradio API !
3
+
4
+ This repository contains the code for a virtual try-on application built using Flask, Twilio's WhatsApp API, and Gradio's virtual try-on model. Users can send images via WhatsApp to Twilio to try on garments virtually, and the results are sent back to them.
5
+
6
+ ## Features
7
+ - Receive images of a person and a garment via WhatsApp.
8
+ - Use Gradio’s API to generate virtual try-on results.
9
+ - Return the result image to the user via WhatsApp.
10
+ - Uses Twilio Sandbox for WhatsApp for easy prototyping and testing.
11
+
12
+ ## Technologies Used
13
+ - **Flask**: Backend server to handle requests and interact with Twilio and Gradio.
14
+ - **Twilio API**: To send and receive WhatsApp messages and media.
15
+ - **Gradio**: For interacting with the virtual try-on model.
16
+ - **Ngrok**: For exposing the local server to the internet for WhatsApp interaction.
17
+ - **OpenCV**: For handling images.
18
+
19
+ ## Prerequisites
20
+ Before running this project, ensure you have the following:
21
+ - Twilio account with WhatsApp sandbox setup.
22
+ - Hugging Face account to use the Gradio API.
23
+ - Python 3.6+ installed on your machine.
24
+
25
+ ## Twilio Setup
26
+ 1. Create a [Twilio account](https://www.twilio.com/try-twilio).
27
+ 2. Activate the [Twilio Sandbox for WhatsApp](https://www.twilio.com/console/sms/whatsapp/sandbox):
28
+ - In the Twilio console, navigate to the **Messaging** section and select **Try it Out** under the **WhatsApp** sandbox.
29
+ - Follow the instructions to join the sandbox by sending a WhatsApp message to the provided Twilio number.
30
+ 3. Get your **Twilio Account SID** and **Auth Token** from your Twilio console:
31
+ - Go to **Settings** in the Twilio console to find these credentials.
32
+ 4. Take note of the **Twilio Sandbox number** for sending and receiving WhatsApp messages.
33
+
34
+ Once the sandbox is set up, you can start receiving and sending messages to the WhatsApp sandbox number for testing your virtual try-on application.
35
+
36
+ ## Hugging Face Setup
37
+ 1. Create a [Hugging Face account](https://huggingface.co/join).
38
+ 2. Use the **Nymbo Virtual Try-On** model as API available on Hugging Face Spaces: [Nymbo Virtual Try-On](https://huggingface.co/spaces/Nymbo/Virtual-Try-On).
39
+
40
+ ## Installation
41
+ Clone the repository:
42
+ ```bash
43
+ git clone https://github.com/adarshb3/Virtual-Try-On-Application-using-Flask-Twilio-and-Gradio.git
44
+ cd Virtual-Try-On-Application-using-Flask-Twilio-and-Gradio
45
+ ```
46
+ Install the required Python packages:
47
+ ```
48
+ pip install -r requirements.txt
49
+ ```
50
+ Set up your environment variables:
51
+ ```
52
+ TWILIO_ACCOUNT_SID=your_account_sid
53
+ TWILIO_AUTH_TOKEN=your_auth_token
54
+ ```
55
+
56
+ ## Running the Application
57
+ Start the Flask server:
58
+ ```
59
+ python app.py
60
+ ```
61
+ ## Ngrok Setup for Local Development
62
+ Since the Flask server runs locally, we use **ngrok** to expose the server to the internet so that Twilio's WhatsApp Sandbox can communicate with it.
63
+
64
+ 1. Download and install ngrok from [here](https://ngrok.com/download).
65
+ 2. Once installed, authenticate ngrok by running:
66
+ ```
67
+ ngrok authtoken your_ngrok_auth_token
68
+ ```
69
+ (Get your authentication token from the ngrok dashboard after signing up).
70
+ 3. Start ngrok to expose your local Flask server:
71
+ ```
72
+ .\ngrok http 8080
73
+ ```
74
+ Copy the ngrok forwarding URL (e.g., https://e3e3-xxxx.ngrok-free.app) and set this as your Twilio webhook under the WhatsApp Sandbox Settings:
75
+ ```
76
+ https://your-ngrok-url/webhook
77
+ ```
78
+ Use WhatsApp to send a message or an image to the Twilio Sandbox number, and the application will respond with the virtual try-on result.
79
+
80
+ ## Code Explanation
81
+ - **app.py**: The main Flask application that handles incoming WhatsApp messages, downloads the images from Twilio, and interacts with Gradio's virtual try-on model.
82
+ - **static**: This folder stores the images temporarily that are sent by users.
83
+ - **requirements.txt**: List of dependencies required for the project.
84
+
85
+ ## Key Functions
86
+ - **webhook()**: Handles incoming POST requests from Twilio, manages the session, and interacts with the Gradio API.
87
+ - **send_to_gradio()**: Sends the person and garment images to Gradio's model for processing.
88
+ - **download_image()**: Downloads media files from Twilio's API and stores them locally.
89
+
90
+ ## Usage
91
+ 1. Send a photo of yourself via WhatsApp to the Twilio Sandbox number.
92
+ 2. You'll receive a prompt asking you to send a photo of the garment.
93
+ 3. After sending the garment photo, the system will process the images and send you the result with the garment virtually applied to your photo.
94
+
95
+ ![WhatsApp Image 2024-10-19 at 2 32 06 PM](https://github.com/user-attachments/assets/2ecb7ccb-5637-4785-8a30-55170ae8bcb8)
96
+
97
+
98
+ ## Future Enhancements
99
+ - Integrate more detailed error handling for the Gradio API.
100
+ - Add functionality to handle multiple garments or different garment categories (e.g. bottoms, shoes).
101
+ - Deploy on a production-grade WSGI server like Gunicorn instead of the Flask development server.
102
+
103
+ ## License
104
+ This project is licensed under the MIT License.
105
+
106
+
107
+
108
+
109
+
110
+
try-on/app.py ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import requests
3
+ import base64
4
+ import cv2
5
+ import numpy as np
6
+ from flask import Flask, request, send_from_directory
7
+ from twilio.twiml.messaging_response import MessagingResponse
8
+ from twilio.rest import Client
9
+ from gradio_client import Client as GradioClient, file
10
+ import shutil
11
+ from dotenv import load_dotenv
12
+
13
+ # Load environment variables from .env file
14
+ load_dotenv()
15
+
16
+ app = Flask(__name__)
17
+
18
+ @app.route('/', methods=['GET'])
19
+ def index():
20
+ return "This is the virtual try-on chatbot API.", 200
21
+
22
+ # In-memory storage for tracking sessions
23
+ user_sessions = {}
24
+
25
+ # Twilio credentials loaded from .env file
26
+ TWILIO_ACCOUNT_SID = os.getenv("TWILIO_ACCOUNT_SID")
27
+ TWILIO_AUTH_TOKEN = os.getenv("TWILIO_AUTH_TOKEN")
28
+ client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)
29
+
30
+ # Gradio Client for Nymbo Virtual Try-On API
31
+ gradio_client = GradioClient("Nymbo/Virtual-Try-On")
32
+
33
+ # Ngrok URL loaded from .env file
34
+ NGROK_URL = os.getenv("NGROK_URL")
35
+
36
+ # Webhook route to handle POST requests from Twilio
37
+ @app.route('/webhook', methods=['POST'])
38
+ def webhook():
39
+ sender_number = request.form.get('From') # User's WhatsApp number
40
+ media_url = request.form.get('MediaUrl0') # URL of the media if image is sent
41
+
42
+ # Log the media URL
43
+ print(f"Received media URL: {media_url}")
44
+
45
+ # Create a response object for Twilio
46
+ resp = MessagingResponse()
47
+
48
+ # If no image is received, inform the user
49
+ if media_url is None:
50
+ resp.message("We didn't receive an image. Please try sending your image again.")
51
+ return str(resp)
52
+
53
+ # Step 1: Check if person image is uploaded
54
+ if sender_number not in user_sessions:
55
+ user_sessions[sender_number] = {}
56
+ if media_url:
57
+ user_sessions[sender_number]['person_image'] = media_url
58
+ resp.message("Great! Now please send the image of the garment you want to try on.")
59
+ else:
60
+ resp.message("Please send your image to begin the virtual try-on process.")
61
+ # Step 2: Check if garment image is uploaded
62
+ elif 'person_image' in user_sessions[sender_number] and 'garment_image' not in user_sessions[sender_number]:
63
+ if media_url:
64
+ user_sessions[sender_number]['garment_image'] = media_url
65
+ # Now both images are collected, send them to the Gradio API for virtual try-on
66
+ try_on_image_url = send_to_gradio(user_sessions[sender_number]['person_image'], media_url)
67
+ if try_on_image_url:
68
+ # Send the image as a WhatsApp media message
69
+ send_media_message(sender_number, try_on_image_url)
70
+ resp.message("Here is your virtual try-on result!")
71
+ else:
72
+ resp.message("Sorry, something went wrong with the try-on process.")
73
+ # Clear session after completion
74
+ del user_sessions[sender_number]
75
+ else:
76
+ resp.message("Please send the garment image to complete the process.")
77
+ else:
78
+ # If both images have already been received, start the process again
79
+ resp.message("Please send your image to begin the virtual try-on process.")
80
+
81
+ return str(resp)
82
+
83
+ # Function to interact with the Gradio API
84
+ def send_to_gradio(person_image_url, garment_image_url):
85
+ # Download both images from Twilio
86
+ person_image_path = download_image(person_image_url, 'person_image.jpg')
87
+ garment_image_path = download_image(garment_image_url, 'garment_image.jpg')
88
+
89
+ if person_image_path is None or garment_image_path is None:
90
+ print("Error: One of the images could not be downloaded.")
91
+ return None
92
+
93
+ try:
94
+ # Interact with the Gradio API using the client
95
+ result = gradio_client.predict(
96
+ dict={"background": file(person_image_path), "layers": [], "composite": None},
97
+ garm_img=file(garment_image_path),
98
+ garment_des="A cool description of the garment",
99
+ is_checked=True,
100
+ is_checked_crop=False,
101
+ denoise_steps=30,
102
+ seed=42,
103
+ api_name="/tryon"
104
+ )
105
+
106
+ # Log the result for debugging
107
+ print(f"API result: {result}")
108
+
109
+ # Check if the result is returned correctly
110
+ if result and len(result) > 0:
111
+ try_on_image_path = result[0] # First item in result is the output image path
112
+ print(f"Generated try-on image path: {try_on_image_path}")
113
+
114
+ # Ensure the static directory exists
115
+ static_dir = 'static'
116
+ if not os.path.exists(static_dir):
117
+ os.makedirs(static_dir)
118
+ print(f"Created directory: {static_dir}")
119
+
120
+ # Make sure the path exists
121
+ if os.path.exists(try_on_image_path):
122
+ # Convert the image to PNG format and save it
123
+ img = cv2.imread(try_on_image_path)
124
+ target_path_png = os.path.join(static_dir, 'result.png')
125
+ cv2.imwrite(target_path_png, img)
126
+ print(f"Image saved to: {target_path_png}")
127
+
128
+ # Return the public URL for the image as PNG
129
+ return f"{NGROK_URL}/static/result.png"
130
+ else:
131
+ print(f"Image not found at: {try_on_image_path}")
132
+ return None
133
+
134
+ print("No image returned from the API.")
135
+ return None
136
+
137
+ except Exception as e:
138
+ print(f"Error interacting with Gradio API: {e}")
139
+ return None
140
+
141
+ # Helper function to send media message via Twilio
142
+ def send_media_message(to_number, media_url):
143
+ message = client.messages.create(
144
+ from_='whatsapp:+14155238886', # Twilio sandbox number
145
+ body="Here is your virtual try-on result:",
146
+ media_url=[media_url], # Public URL of the media
147
+ to=to_number
148
+ )
149
+ print(f"Sent media message to {to_number}. Message SID: {message.sid}")
150
+
151
+ # Helper function to download an image from Twilio using the Twilio API
152
+ def download_image(media_url, filename):
153
+ try:
154
+ # Extract Message SID and Media SID from the URL
155
+ message_sid = media_url.split('/')[-3]
156
+ media_sid = media_url.split('/')[-1]
157
+
158
+ # Log the message and media SIDs
159
+ print(f"Message SID: {message_sid}, Media SID: {media_sid}")
160
+
161
+ # Use Twilio client to fetch the media resource
162
+ media = client.api.accounts(TWILIO_ACCOUNT_SID).messages(message_sid).media(media_sid).fetch()
163
+
164
+ # Construct the actual media URL
165
+ media_uri = media.uri.replace('.json', '')
166
+ image_url = f"https://api.twilio.com{media_uri}"
167
+
168
+ # Log the full URL being used for the image download
169
+ print(f"Downloading image from: {image_url}")
170
+
171
+ # Download the image with proper authorization (using Basic Auth)
172
+ response = requests.get(image_url, auth=(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN))
173
+
174
+ if response.status_code == 200:
175
+ # Save the image locally
176
+ with open(filename, 'wb') as f:
177
+ f.write(response.content)
178
+ print(f"Image downloaded successfully as {filename}.")
179
+ return filename
180
+ else:
181
+ print(f"Failed to download image: {response.status_code}")
182
+ return None
183
+ except Exception as err:
184
+ print(f"Error downloading image from Twilio: {err}")
185
+ return None
186
+
187
+ # Ensure Flask serves static files properly
188
+ @app.route('/static/<path:filename>')
189
+ def serve_static_file(filename):
190
+ file_path = os.path.join('static', filename)
191
+ # Check if the file exists and serve with the correct Content-Type
192
+ if os.path.exists(file_path):
193
+ return send_from_directory('static', filename, mimetype='image/png')
194
+ else:
195
+ print(f"File not found: {filename}")
196
+ return "File not found", 404
197
+
198
+ if __name__ == '__main__':
199
+ app.run(port=8080)
try-on/env/bin/Activate.ps1 ADDED
@@ -0,0 +1,241 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <#
2
+ .Synopsis
3
+ Activate a Python virtual environment for the current PowerShell session.
4
+
5
+ .Description
6
+ Pushes the python executable for a virtual environment to the front of the
7
+ $Env:PATH environment variable and sets the prompt to signify that you are
8
+ in a Python virtual environment. Makes use of the command line switches as
9
+ well as the `pyvenv.cfg` file values present in the virtual environment.
10
+
11
+ .Parameter VenvDir
12
+ Path to the directory that contains the virtual environment to activate. The
13
+ default value for this is the parent of the directory that the Activate.ps1
14
+ script is located within.
15
+
16
+ .Parameter Prompt
17
+ The prompt prefix to display when this virtual environment is activated. By
18
+ default, this prompt is the name of the virtual environment folder (VenvDir)
19
+ surrounded by parentheses and followed by a single space (ie. '(.venv) ').
20
+
21
+ .Example
22
+ Activate.ps1
23
+ Activates the Python virtual environment that contains the Activate.ps1 script.
24
+
25
+ .Example
26
+ Activate.ps1 -Verbose
27
+ Activates the Python virtual environment that contains the Activate.ps1 script,
28
+ and shows extra information about the activation as it executes.
29
+
30
+ .Example
31
+ Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
32
+ Activates the Python virtual environment located in the specified location.
33
+
34
+ .Example
35
+ Activate.ps1 -Prompt "MyPython"
36
+ Activates the Python virtual environment that contains the Activate.ps1 script,
37
+ and prefixes the current prompt with the specified string (surrounded in
38
+ parentheses) while the virtual environment is active.
39
+
40
+ .Notes
41
+ On Windows, it may be required to enable this Activate.ps1 script by setting the
42
+ execution policy for the user. You can do this by issuing the following PowerShell
43
+ command:
44
+
45
+ PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
46
+
47
+ For more information on Execution Policies:
48
+ https://go.microsoft.com/fwlink/?LinkID=135170
49
+
50
+ #>
51
+ Param(
52
+ [Parameter(Mandatory = $false)]
53
+ [String]
54
+ $VenvDir,
55
+ [Parameter(Mandatory = $false)]
56
+ [String]
57
+ $Prompt
58
+ )
59
+
60
+ <# Function declarations --------------------------------------------------- #>
61
+
62
+ <#
63
+ .Synopsis
64
+ Remove all shell session elements added by the Activate script, including the
65
+ addition of the virtual environment's Python executable from the beginning of
66
+ the PATH variable.
67
+
68
+ .Parameter NonDestructive
69
+ If present, do not remove this function from the global namespace for the
70
+ session.
71
+
72
+ #>
73
+ function global:deactivate ([switch]$NonDestructive) {
74
+ # Revert to original values
75
+
76
+ # The prior prompt:
77
+ if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
78
+ Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
79
+ Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
80
+ }
81
+
82
+ # The prior PYTHONHOME:
83
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
84
+ Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
85
+ Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
86
+ }
87
+
88
+ # The prior PATH:
89
+ if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
90
+ Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
91
+ Remove-Item -Path Env:_OLD_VIRTUAL_PATH
92
+ }
93
+
94
+ # Just remove the VIRTUAL_ENV altogether:
95
+ if (Test-Path -Path Env:VIRTUAL_ENV) {
96
+ Remove-Item -Path env:VIRTUAL_ENV
97
+ }
98
+
99
+ # Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
100
+ if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
101
+ Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
102
+ }
103
+
104
+ # Leave deactivate function in the global namespace if requested:
105
+ if (-not $NonDestructive) {
106
+ Remove-Item -Path function:deactivate
107
+ }
108
+ }
109
+
110
+ <#
111
+ .Description
112
+ Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
113
+ given folder, and returns them in a map.
114
+
115
+ For each line in the pyvenv.cfg file, if that line can be parsed into exactly
116
+ two strings separated by `=` (with any amount of whitespace surrounding the =)
117
+ then it is considered a `key = value` line. The left hand string is the key,
118
+ the right hand is the value.
119
+
120
+ If the value starts with a `'` or a `"` then the first and last character is
121
+ stripped from the value before being captured.
122
+
123
+ .Parameter ConfigDir
124
+ Path to the directory that contains the `pyvenv.cfg` file.
125
+ #>
126
+ function Get-PyVenvConfig(
127
+ [String]
128
+ $ConfigDir
129
+ ) {
130
+ Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
131
+
132
+ # Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
133
+ $pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
134
+
135
+ # An empty map will be returned if no config file is found.
136
+ $pyvenvConfig = @{ }
137
+
138
+ if ($pyvenvConfigPath) {
139
+
140
+ Write-Verbose "File exists, parse `key = value` lines"
141
+ $pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
142
+
143
+ $pyvenvConfigContent | ForEach-Object {
144
+ $keyval = $PSItem -split "\s*=\s*", 2
145
+ if ($keyval[0] -and $keyval[1]) {
146
+ $val = $keyval[1]
147
+
148
+ # Remove extraneous quotations around a string value.
149
+ if ("'""".Contains($val.Substring(0, 1))) {
150
+ $val = $val.Substring(1, $val.Length - 2)
151
+ }
152
+
153
+ $pyvenvConfig[$keyval[0]] = $val
154
+ Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
155
+ }
156
+ }
157
+ }
158
+ return $pyvenvConfig
159
+ }
160
+
161
+
162
+ <# Begin Activate script --------------------------------------------------- #>
163
+
164
+ # Determine the containing directory of this script
165
+ $VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
166
+ $VenvExecDir = Get-Item -Path $VenvExecPath
167
+
168
+ Write-Verbose "Activation script is located in path: '$VenvExecPath'"
169
+ Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
170
+ Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
171
+
172
+ # Set values required in priority: CmdLine, ConfigFile, Default
173
+ # First, get the location of the virtual environment, it might not be
174
+ # VenvExecDir if specified on the command line.
175
+ if ($VenvDir) {
176
+ Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
177
+ }
178
+ else {
179
+ Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
180
+ $VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
181
+ Write-Verbose "VenvDir=$VenvDir"
182
+ }
183
+
184
+ # Next, read the `pyvenv.cfg` file to determine any required value such
185
+ # as `prompt`.
186
+ $pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
187
+
188
+ # Next, set the prompt from the command line, or the config file, or
189
+ # just use the name of the virtual environment folder.
190
+ if ($Prompt) {
191
+ Write-Verbose "Prompt specified as argument, using '$Prompt'"
192
+ }
193
+ else {
194
+ Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
195
+ if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
196
+ Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
197
+ $Prompt = $pyvenvCfg['prompt'];
198
+ }
199
+ else {
200
+ Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
201
+ Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
202
+ $Prompt = Split-Path -Path $venvDir -Leaf
203
+ }
204
+ }
205
+
206
+ Write-Verbose "Prompt = '$Prompt'"
207
+ Write-Verbose "VenvDir='$VenvDir'"
208
+
209
+ # Deactivate any currently active virtual environment, but leave the
210
+ # deactivate function in place.
211
+ deactivate -nondestructive
212
+
213
+ # Now set the environment variable VIRTUAL_ENV, used by many tools to determine
214
+ # that there is an activated venv.
215
+ $env:VIRTUAL_ENV = $VenvDir
216
+
217
+ if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
218
+
219
+ Write-Verbose "Setting prompt to '$Prompt'"
220
+
221
+ # Set the prompt to include the env name
222
+ # Make sure _OLD_VIRTUAL_PROMPT is global
223
+ function global:_OLD_VIRTUAL_PROMPT { "" }
224
+ Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
225
+ New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
226
+
227
+ function global:prompt {
228
+ Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
229
+ _OLD_VIRTUAL_PROMPT
230
+ }
231
+ }
232
+
233
+ # Clear PYTHONHOME
234
+ if (Test-Path -Path Env:PYTHONHOME) {
235
+ Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
236
+ Remove-Item -Path Env:PYTHONHOME
237
+ }
238
+
239
+ # Add the venv to the PATH
240
+ Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
241
+ $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
try-on/env/bin/activate ADDED
@@ -0,0 +1,76 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file must be used with "source bin/activate" *from bash*
2
+ # you cannot run it directly
3
+
4
+ deactivate () {
5
+ # reset old environment variables
6
+ if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
7
+ PATH="${_OLD_VIRTUAL_PATH:-}"
8
+ export PATH
9
+ unset _OLD_VIRTUAL_PATH
10
+ fi
11
+ if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
12
+ PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
13
+ export PYTHONHOME
14
+ unset _OLD_VIRTUAL_PYTHONHOME
15
+ fi
16
+
17
+ # This should detect bash and zsh, which have a hash command that must
18
+ # be called to get it to forget past commands. Without forgetting
19
+ # past commands the $PATH changes we made may not be respected
20
+ if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
21
+ hash -r
22
+ fi
23
+
24
+ if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
25
+ PS1="${_OLD_VIRTUAL_PS1:-}"
26
+ export PS1
27
+ unset _OLD_VIRTUAL_PS1
28
+ fi
29
+
30
+ unset VIRTUAL_ENV
31
+ if [ ! "${1:-}" = "nondestructive" ] ; then
32
+ # Self destruct!
33
+ unset -f deactivate
34
+ fi
35
+ }
36
+
37
+ # unset irrelevant variables
38
+ deactivate nondestructive
39
+
40
+ VIRTUAL_ENV=/workspaces/ruang-rindu/try-on/env
41
+ export VIRTUAL_ENV
42
+
43
+ _OLD_VIRTUAL_PATH="$PATH"
44
+ PATH="$VIRTUAL_ENV/"bin":$PATH"
45
+ export PATH
46
+
47
+ # unset PYTHONHOME if set
48
+ # this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
49
+ # could use `if (set -u; : $PYTHONHOME) ;` in bash
50
+ if [ -n "${PYTHONHOME:-}" ] ; then
51
+ _OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
52
+ unset PYTHONHOME
53
+ fi
54
+
55
+ if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
56
+ _OLD_VIRTUAL_PS1="${PS1:-}"
57
+ if [ "x'(env) '" != x ] ; then
58
+ PS1='(env) '"${PS1:-}"
59
+ else
60
+ if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
61
+ # special case for Aspen magic directories
62
+ # see https://aspen.io/
63
+ PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
64
+ else
65
+ PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
66
+ fi
67
+ fi
68
+ export PS1
69
+ fi
70
+
71
+ # This should detect bash and zsh, which have a hash command that must
72
+ # be called to get it to forget past commands. Without forgetting
73
+ # past commands the $PATH changes we made may not be respected
74
+ if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
75
+ hash -r
76
+ fi
try-on/env/bin/activate.csh ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file must be used with "source bin/activate.csh" *from csh*.
2
+ # You cannot run it directly.
3
+ # Created by Davide Di Blasi <davidedb@gmail.com>.
4
+ # Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
5
+
6
+ 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; test "\!:*" != "nondestructive" && unalias deactivate'
7
+
8
+ # Unset irrelevant variables.
9
+ deactivate nondestructive
10
+
11
+ setenv VIRTUAL_ENV /workspaces/ruang-rindu/try-on/env
12
+
13
+ set _OLD_VIRTUAL_PATH="$PATH"
14
+ setenv PATH "$VIRTUAL_ENV/"bin":$PATH"
15
+
16
+
17
+ set _OLD_VIRTUAL_PROMPT="$prompt"
18
+
19
+ if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
20
+ if ("env" != "") then
21
+ set env_name = env
22
+ else
23
+ if (`basename "VIRTUAL_ENV"` == "__") then
24
+ # special case for Aspen magic directories
25
+ # see https://aspen.io/
26
+ set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
27
+ else
28
+ set env_name = `basename "$VIRTUAL_ENV"`
29
+ endif
30
+ endif
31
+ set prompt = "[$env_name] $prompt"
32
+ unset env_name
33
+ endif
34
+
35
+ alias pydoc python -m pydoc
36
+
37
+ rehash
try-on/env/bin/activate.fish ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
2
+ # you cannot run it directly
3
+
4
+ function deactivate -d "Exit virtualenv and return to normal shell environment"
5
+ # reset old environment variables
6
+ if test -n "$_OLD_VIRTUAL_PATH"
7
+ set -gx PATH $_OLD_VIRTUAL_PATH
8
+ set -e _OLD_VIRTUAL_PATH
9
+ end
10
+ if test -n "$_OLD_VIRTUAL_PYTHONHOME"
11
+ set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
12
+ set -e _OLD_VIRTUAL_PYTHONHOME
13
+ end
14
+
15
+ if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
16
+ functions -e fish_prompt
17
+ set -e _OLD_FISH_PROMPT_OVERRIDE
18
+ functions -c _old_fish_prompt fish_prompt
19
+ functions -e _old_fish_prompt
20
+ end
21
+
22
+ set -e VIRTUAL_ENV
23
+ if test "$argv[1]" != "nondestructive"
24
+ # Self destruct!
25
+ functions -e deactivate
26
+ end
27
+ end
28
+
29
+ # unset irrelevant variables
30
+ deactivate nondestructive
31
+
32
+ set -gx VIRTUAL_ENV /workspaces/ruang-rindu/try-on/env
33
+
34
+ set -gx _OLD_VIRTUAL_PATH $PATH
35
+ set -gx PATH "$VIRTUAL_ENV/"bin $PATH
36
+
37
+ # unset PYTHONHOME if set
38
+ if set -q PYTHONHOME
39
+ set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
40
+ set -e PYTHONHOME
41
+ end
42
+
43
+ if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
44
+ # fish uses a function instead of an env var to generate the prompt.
45
+
46
+ # save the current fish_prompt function as the function _old_fish_prompt
47
+ functions -c fish_prompt _old_fish_prompt
48
+
49
+ # with the original prompt function renamed, we can override with our own.
50
+ function fish_prompt
51
+ # Save the return status of the last command
52
+ set -l old_status $status
53
+
54
+ # Prompt override?
55
+ if test -n "'(env) '"
56
+ printf "%s%s" '(env) ' (set_color normal)
57
+ else
58
+ # ...Otherwise, prepend env
59
+ set -l _checkbase (basename "$VIRTUAL_ENV")
60
+ if test $_checkbase = "__"
61
+ # special case for Aspen magic directories
62
+ # see https://aspen.io/
63
+ printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
64
+ else
65
+ printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
66
+ end
67
+ end
68
+
69
+ # Restore the return status of the previous command.
70
+ echo "exit $old_status" | .
71
+ _old_fish_prompt
72
+ end
73
+
74
+ set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
75
+ end
try-on/env/bin/dotenv ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from dotenv.__main__ import cli
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(cli())
try-on/env/bin/easy_install ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from setuptools.command.easy_install import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/easy_install-3.8 ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from setuptools.command.easy_install import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/f2py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from numpy.f2py.f2py2e import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/f2py3 ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from numpy.f2py.f2py2e import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/f2py3.8 ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from numpy.f2py.f2py2e import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/flask ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from flask.cli import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/httpx ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from httpx import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/huggingface-cli ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from huggingface_hub.commands.huggingface_cli import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/normalizer ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from charset_normalizer.cli import cli_detect
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(cli_detect())
try-on/env/bin/pip ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from pip._internal.cli.main import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/pip3 ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from pip._internal.cli.main import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/pip3.8 ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from pip._internal.cli.main import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/bin/python ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8a011e4a19d06f02f5ed255f60d209bbe978ae7caf7df4184dced9440ab4c045
3
+ size 5490488
try-on/env/bin/python3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8a011e4a19d06f02f5ed255f60d209bbe978ae7caf7df4184dced9440ab4c045
3
+ size 5490488
try-on/env/bin/python3.8 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8a011e4a19d06f02f5ed255f60d209bbe978ae7caf7df4184dced9440ab4c045
3
+ size 5490488
try-on/env/bin/tqdm ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/workspaces/ruang-rindu/try-on/env/bin/python3.8
2
+ # -*- coding: utf-8 -*-
3
+ import re
4
+ import sys
5
+ from tqdm.cli import main
6
+ if __name__ == '__main__':
7
+ sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8
+ sys.exit(main())
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/LICENSE.rst ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright 2010 Pallets
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions are
5
+ met:
6
+
7
+ 1. Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+
10
+ 2. Redistributions in binary form must reproduce the above copyright
11
+ notice, this list of conditions and the following disclaimer in the
12
+ documentation and/or other materials provided with the distribution.
13
+
14
+ 3. Neither the name of the copyright holder nor the names of its
15
+ contributors may be used to endorse or promote products derived from
16
+ this software without specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
25
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
26
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/METADATA ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: MarkupSafe
3
+ Version: 2.1.5
4
+ Summary: Safely add untrusted strings to HTML/XML markup.
5
+ Home-page: https://palletsprojects.com/p/markupsafe/
6
+ Maintainer: Pallets
7
+ Maintainer-email: contact@palletsprojects.com
8
+ License: BSD-3-Clause
9
+ Project-URL: Donate, https://palletsprojects.com/donate
10
+ Project-URL: Documentation, https://markupsafe.palletsprojects.com/
11
+ Project-URL: Changes, https://markupsafe.palletsprojects.com/changes/
12
+ Project-URL: Source Code, https://github.com/pallets/markupsafe/
13
+ Project-URL: Issue Tracker, https://github.com/pallets/markupsafe/issues/
14
+ Project-URL: Chat, https://discord.gg/pallets
15
+ Classifier: Development Status :: 5 - Production/Stable
16
+ Classifier: Environment :: Web Environment
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: License :: OSI Approved :: BSD License
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Programming Language :: Python
21
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
22
+ Classifier: Topic :: Text Processing :: Markup :: HTML
23
+ Requires-Python: >=3.7
24
+ Description-Content-Type: text/x-rst
25
+ License-File: LICENSE.rst
26
+
27
+ MarkupSafe
28
+ ==========
29
+
30
+ MarkupSafe implements a text object that escapes characters so it is
31
+ safe to use in HTML and XML. Characters that have special meanings are
32
+ replaced so that they display as the actual characters. This mitigates
33
+ injection attacks, meaning untrusted user input can safely be displayed
34
+ on a page.
35
+
36
+
37
+ Installing
38
+ ----------
39
+
40
+ Install and update using `pip`_:
41
+
42
+ .. code-block:: text
43
+
44
+ pip install -U MarkupSafe
45
+
46
+ .. _pip: https://pip.pypa.io/en/stable/getting-started/
47
+
48
+
49
+ Examples
50
+ --------
51
+
52
+ .. code-block:: pycon
53
+
54
+ >>> from markupsafe import Markup, escape
55
+
56
+ >>> # escape replaces special characters and wraps in Markup
57
+ >>> escape("<script>alert(document.cookie);</script>")
58
+ Markup('&lt;script&gt;alert(document.cookie);&lt;/script&gt;')
59
+
60
+ >>> # wrap in Markup to mark text "safe" and prevent escaping
61
+ >>> Markup("<strong>Hello</strong>")
62
+ Markup('<strong>hello</strong>')
63
+
64
+ >>> escape(Markup("<strong>Hello</strong>"))
65
+ Markup('<strong>hello</strong>')
66
+
67
+ >>> # Markup is a str subclass
68
+ >>> # methods and operators escape their arguments
69
+ >>> template = Markup("Hello <em>{name}</em>")
70
+ >>> template.format(name='"World"')
71
+ Markup('Hello <em>&#34;World&#34;</em>')
72
+
73
+
74
+ Donate
75
+ ------
76
+
77
+ The Pallets organization develops and supports MarkupSafe and other
78
+ popular packages. In order to grow the community of contributors and
79
+ users, and allow the maintainers to devote more time to the projects,
80
+ `please donate today`_.
81
+
82
+ .. _please donate today: https://palletsprojects.com/donate
83
+
84
+
85
+ Links
86
+ -----
87
+
88
+ - Documentation: https://markupsafe.palletsprojects.com/
89
+ - Changes: https://markupsafe.palletsprojects.com/changes/
90
+ - PyPI Releases: https://pypi.org/project/MarkupSafe/
91
+ - Source Code: https://github.com/pallets/markupsafe/
92
+ - Issue Tracker: https://github.com/pallets/markupsafe/issues/
93
+ - Chat: https://discord.gg/pallets
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/RECORD ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MarkupSafe-2.1.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ MarkupSafe-2.1.5.dist-info/LICENSE.rst,sha256=SJqOEQhQntmKN7uYPhHg9-HTHwvY-Zp5yESOf_N9B-o,1475
3
+ MarkupSafe-2.1.5.dist-info/METADATA,sha256=2dRDPam6OZLfpX0wg1JN5P3u9arqACxVSfdGmsJU7o8,3003
4
+ MarkupSafe-2.1.5.dist-info/RECORD,,
5
+ MarkupSafe-2.1.5.dist-info/WHEEL,sha256=zTDqV7OR0em6fvysya0bwC-51Mb7EQ0x5PBJySRF2iQ,148
6
+ MarkupSafe-2.1.5.dist-info/top_level.txt,sha256=qy0Plje5IJuvsCBjejJyhDCjEAdcDLK_2agVcex8Z6U,11
7
+ markupsafe/__init__.py,sha256=r7VOTjUq7EMQ4v3p4R1LoVOGJg6ysfYRncLr34laRBs,10958
8
+ markupsafe/__pycache__/__init__.cpython-38.pyc,,
9
+ markupsafe/__pycache__/_native.cpython-38.pyc,,
10
+ markupsafe/_native.py,sha256=GR86Qvo_GcgKmKreA1WmYN9ud17OFwkww8E-fiW-57s,1713
11
+ markupsafe/_speedups.c,sha256=X2XvQVtIdcK4Usz70BvkzoOfjTCmQlDkkjYSn-swE0g,7083
12
+ markupsafe/_speedups.cpython-38-x86_64-linux-gnu.so,sha256=dR4WFvrcpISjeacwjKYJrqkz-0j0ZXF4oAHtTK0cKpw,45024
13
+ markupsafe/_speedups.pyi,sha256=vfMCsOgbAXRNLUXkyuyonG8uEWKYU4PDqNuMaDELAYw,229
14
+ markupsafe/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/WHEEL ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.42.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp38-cp38-manylinux_2_17_x86_64
5
+ Tag: cp38-cp38-manylinux2014_x86_64
6
+
try-on/env/lib/python3.8/site-packages/MarkupSafe-2.1.5.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ markupsafe
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/AUTHORS.rst ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ Authors
2
+ =======
3
+
4
+ ``pyjwt`` is currently written and maintained by `Jose Padilla <https://github.com/jpadilla>`_.
5
+ Originally written and maintained by `Jeff Lindsay <https://github.com/progrium>`_.
6
+
7
+ A full list of contributors can be found on GitHub’s `overview <https://github.com/jpadilla/pyjwt/graphs/contributors>`_.
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-2022 José Padilla
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/METADATA ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: PyJWT
3
+ Version: 2.9.0
4
+ Summary: JSON Web Token implementation in Python
5
+ Home-page: https://github.com/jpadilla/pyjwt
6
+ Author: Jose Padilla
7
+ Author-email: hello@jpadilla.com
8
+ License: MIT
9
+ Keywords: json,jwt,security,signing,token,web
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Natural Language :: English
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.8
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Topic :: Utilities
23
+ Requires-Python: >=3.8
24
+ Description-Content-Type: text/x-rst
25
+ License-File: LICENSE
26
+ License-File: AUTHORS.rst
27
+ Provides-Extra: crypto
28
+ Requires-Dist: cryptography >=3.4.0 ; extra == 'crypto'
29
+ Provides-Extra: dev
30
+ Requires-Dist: sphinx ; extra == 'dev'
31
+ Requires-Dist: sphinx-rtd-theme ; extra == 'dev'
32
+ Requires-Dist: zope.interface ; extra == 'dev'
33
+ Requires-Dist: cryptography >=3.4.0 ; extra == 'dev'
34
+ Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'dev'
35
+ Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'dev'
36
+ Requires-Dist: pre-commit ; extra == 'dev'
37
+ Provides-Extra: docs
38
+ Requires-Dist: sphinx ; extra == 'docs'
39
+ Requires-Dist: sphinx-rtd-theme ; extra == 'docs'
40
+ Requires-Dist: zope.interface ; extra == 'docs'
41
+ Provides-Extra: tests
42
+ Requires-Dist: pytest <7.0.0,>=6.0.0 ; extra == 'tests'
43
+ Requires-Dist: coverage[toml] ==5.0.4 ; extra == 'tests'
44
+
45
+ PyJWT
46
+ =====
47
+
48
+ .. image:: https://github.com/jpadilla/pyjwt/workflows/CI/badge.svg
49
+ :target: https://github.com/jpadilla/pyjwt/actions?query=workflow%3ACI
50
+
51
+ .. image:: https://img.shields.io/pypi/v/pyjwt.svg
52
+ :target: https://pypi.python.org/pypi/pyjwt
53
+
54
+ .. image:: https://codecov.io/gh/jpadilla/pyjwt/branch/master/graph/badge.svg
55
+ :target: https://codecov.io/gh/jpadilla/pyjwt
56
+
57
+ .. image:: https://readthedocs.org/projects/pyjwt/badge/?version=stable
58
+ :target: https://pyjwt.readthedocs.io/en/stable/
59
+
60
+ A Python implementation of `RFC 7519 <https://tools.ietf.org/html/rfc7519>`_. Original implementation was written by `@progrium <https://github.com/progrium>`_.
61
+
62
+ Installing
63
+ ----------
64
+
65
+ Install with **pip**:
66
+
67
+ .. code-block:: console
68
+
69
+ $ pip install PyJWT
70
+
71
+
72
+ Usage
73
+ -----
74
+
75
+ .. code-block:: pycon
76
+
77
+ >>> import jwt
78
+ >>> encoded = jwt.encode({"some": "payload"}, "secret", algorithm="HS256")
79
+ >>> print(encoded)
80
+ eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg
81
+ >>> jwt.decode(encoded, "secret", algorithms=["HS256"])
82
+ {'some': 'payload'}
83
+
84
+ Documentation
85
+ -------------
86
+
87
+ View the full docs online at https://pyjwt.readthedocs.io/en/stable/
88
+
89
+
90
+ Tests
91
+ -----
92
+
93
+ You can run tests from the project root after cloning with:
94
+
95
+ .. code-block:: console
96
+
97
+ $ tox
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/RECORD ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ PyJWT-2.9.0.dist-info/AUTHORS.rst,sha256=klzkNGECnu2_VY7At89_xLBF3vUSDruXk3xwgUBxzwc,322
2
+ PyJWT-2.9.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
3
+ PyJWT-2.9.0.dist-info/LICENSE,sha256=eXp6ICMdTEM-nxkR2xcx0GtYKLmPSZgZoDT3wPVvXOU,1085
4
+ PyJWT-2.9.0.dist-info/METADATA,sha256=YRmm4Pcq065Rja5Gzuh80YA2groQSgOR8I1Cx0MF8EM,3048
5
+ PyJWT-2.9.0.dist-info/RECORD,,
6
+ PyJWT-2.9.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
7
+ PyJWT-2.9.0.dist-info/top_level.txt,sha256=RP5DHNyJbMq2ka0FmfTgoSaQzh7e3r5XuCWCO8a00k8,4
8
+ jwt/__init__.py,sha256=TlvdnR8JPnAKjXE3Yt4qSA4AApcb0_9fh4RppJfnMcU,1670
9
+ jwt/__pycache__/__init__.cpython-38.pyc,,
10
+ jwt/__pycache__/algorithms.cpython-38.pyc,,
11
+ jwt/__pycache__/api_jwk.cpython-38.pyc,,
12
+ jwt/__pycache__/api_jws.cpython-38.pyc,,
13
+ jwt/__pycache__/api_jwt.cpython-38.pyc,,
14
+ jwt/__pycache__/exceptions.cpython-38.pyc,,
15
+ jwt/__pycache__/help.cpython-38.pyc,,
16
+ jwt/__pycache__/jwk_set_cache.cpython-38.pyc,,
17
+ jwt/__pycache__/jwks_client.cpython-38.pyc,,
18
+ jwt/__pycache__/types.cpython-38.pyc,,
19
+ jwt/__pycache__/utils.cpython-38.pyc,,
20
+ jwt/__pycache__/warnings.cpython-38.pyc,,
21
+ jwt/algorithms.py,sha256=5MLQ2WIhHPiN--67afLk4yXOLsYfx2OiNeLVORZT3G8,29851
22
+ jwt/api_jwk.py,sha256=6F1r7rmm8V5qEnBKA_xMjS9R7VoANe1_BL1oD2FrAjE,4451
23
+ jwt/api_jws.py,sha256=1cBVJuYxo6UrDU6UH4VTA2EqctBj1x7mNlnNb-Ocn4g,11425
24
+ jwt/api_jwt.py,sha256=gsmF7wVxKFfsDBjrMq-M2UiyUBzl6U6YwaEqNdN1zkM,12875
25
+ jwt/exceptions.py,sha256=xaWnosa-cREyXMyb7PYmLfQv9weZ7Q9XUYMiLJvN0hA,1101
26
+ jwt/help.py,sha256=Jrp84fG43sCwmSIaDtY08I6ZR2VE7NhrTff89tYSE40,1749
27
+ jwt/jwk_set_cache.py,sha256=hBKmN-giU7-G37L_XKgc_OZu2ah4wdbj1ZNG_GkoSE8,959
28
+ jwt/jwks_client.py,sha256=9W8JVyGByQgoLbBN1u5iY1_jlgfnnukeOBTpqaM_9SE,4222
29
+ jwt/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ jwt/types.py,sha256=VnhGv_VFu5a7_mrPoSCB7HaNLrJdhM8Sq1sSfEg0gLU,99
31
+ jwt/utils.py,sha256=efS6RKCALEBeBw-uZj8VtzfZFFcECTd28q9ndNn9huw,3544
32
+ jwt/warnings.py,sha256=50XWOnyNsIaqzUJTk6XHNiIDykiL763GYA92MjTKmok,59
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (72.1.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
try-on/env/lib/python3.8/site-packages/PyJWT-2.9.0.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ jwt
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/LICENSE ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2017-2021 Ingy döt Net
2
+ Copyright (c) 2006-2016 Kirill Simonov
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
5
+ this software and associated documentation files (the "Software"), to deal in
6
+ the Software without restriction, including without limitation the rights to
7
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
8
+ of the Software, and to permit persons to whom the Software is furnished to do
9
+ so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/METADATA ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: PyYAML
3
+ Version: 6.0.2
4
+ Summary: YAML parser and emitter for Python
5
+ Home-page: https://pyyaml.org/
6
+ Download-URL: https://pypi.org/project/PyYAML/
7
+ Author: Kirill Simonov
8
+ Author-email: xi@resolvent.net
9
+ License: MIT
10
+ Project-URL: Bug Tracker, https://github.com/yaml/pyyaml/issues
11
+ Project-URL: CI, https://github.com/yaml/pyyaml/actions
12
+ Project-URL: Documentation, https://pyyaml.org/wiki/PyYAMLDocumentation
13
+ Project-URL: Mailing lists, http://lists.sourceforge.net/lists/listinfo/yaml-core
14
+ Project-URL: Source Code, https://github.com/yaml/pyyaml
15
+ Platform: Any
16
+ Classifier: Development Status :: 5 - Production/Stable
17
+ Classifier: Intended Audience :: Developers
18
+ Classifier: License :: OSI Approved :: MIT License
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Programming Language :: Cython
21
+ Classifier: Programming Language :: Python
22
+ Classifier: Programming Language :: Python :: 3
23
+ Classifier: Programming Language :: Python :: 3.8
24
+ Classifier: Programming Language :: Python :: 3.9
25
+ Classifier: Programming Language :: Python :: 3.10
26
+ Classifier: Programming Language :: Python :: 3.11
27
+ Classifier: Programming Language :: Python :: 3.12
28
+ Classifier: Programming Language :: Python :: 3.13
29
+ Classifier: Programming Language :: Python :: Implementation :: CPython
30
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
31
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
32
+ Classifier: Topic :: Text Processing :: Markup
33
+ Requires-Python: >=3.8
34
+ License-File: LICENSE
35
+
36
+ YAML is a data serialization format designed for human readability
37
+ and interaction with scripting languages. PyYAML is a YAML parser
38
+ and emitter for Python.
39
+
40
+ PyYAML features a complete YAML 1.1 parser, Unicode support, pickle
41
+ support, capable extension API, and sensible error messages. PyYAML
42
+ supports standard YAML tags and provides Python-specific tags that
43
+ allow to represent an arbitrary Python object.
44
+
45
+ PyYAML is applicable for a broad range of tasks from complex
46
+ configuration files to object serialization and persistence.
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/RECORD ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ PyYAML-6.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
2
+ PyYAML-6.0.2.dist-info/LICENSE,sha256=jTko-dxEkP1jVwfLiOsmvXZBAqcoKVQwfT5RZ6V36KQ,1101
3
+ PyYAML-6.0.2.dist-info/METADATA,sha256=9-odFB5seu4pGPcEv7E8iyxNF51_uKnaNGjLAhz2lto,2060
4
+ PyYAML-6.0.2.dist-info/RECORD,,
5
+ PyYAML-6.0.2.dist-info/WHEEL,sha256=BNLU9SWje0ru8009ZyWPG7zS_e_-YS0KxJU6xSwvdrU,148
6
+ PyYAML-6.0.2.dist-info/top_level.txt,sha256=rpj0IVMTisAjh_1vG3Ccf9v5jpCQwAz6cD1IVU5ZdhQ,11
7
+ _yaml/__init__.py,sha256=04Ae_5osxahpJHa3XBZUAf4wi6XX32gR8D6X6p64GEA,1402
8
+ _yaml/__pycache__/__init__.cpython-38.pyc,,
9
+ yaml/__init__.py,sha256=N35S01HMesFTe0aRRMWkPj0Pa8IEbHpE9FK7cr5Bdtw,12311
10
+ yaml/__pycache__/__init__.cpython-38.pyc,,
11
+ yaml/__pycache__/composer.cpython-38.pyc,,
12
+ yaml/__pycache__/constructor.cpython-38.pyc,,
13
+ yaml/__pycache__/cyaml.cpython-38.pyc,,
14
+ yaml/__pycache__/dumper.cpython-38.pyc,,
15
+ yaml/__pycache__/emitter.cpython-38.pyc,,
16
+ yaml/__pycache__/error.cpython-38.pyc,,
17
+ yaml/__pycache__/events.cpython-38.pyc,,
18
+ yaml/__pycache__/loader.cpython-38.pyc,,
19
+ yaml/__pycache__/nodes.cpython-38.pyc,,
20
+ yaml/__pycache__/parser.cpython-38.pyc,,
21
+ yaml/__pycache__/reader.cpython-38.pyc,,
22
+ yaml/__pycache__/representer.cpython-38.pyc,,
23
+ yaml/__pycache__/resolver.cpython-38.pyc,,
24
+ yaml/__pycache__/scanner.cpython-38.pyc,,
25
+ yaml/__pycache__/serializer.cpython-38.pyc,,
26
+ yaml/__pycache__/tokens.cpython-38.pyc,,
27
+ yaml/_yaml.cpython-38-x86_64-linux-gnu.so,sha256=_3oKdUU-cDdJ8ZRrTSE72_cSPNW2wottYUd4Iw2VVmA,2425936
28
+ yaml/composer.py,sha256=_Ko30Wr6eDWUeUpauUGT3Lcg9QPBnOPVlTnIMRGJ9FM,4883
29
+ yaml/constructor.py,sha256=kNgkfaeLUkwQYY_Q6Ff1Tz2XVw_pG1xVE9Ak7z-viLA,28639
30
+ yaml/cyaml.py,sha256=6ZrAG9fAYvdVe2FK_w0hmXoG7ZYsoYUwapG8CiC72H0,3851
31
+ yaml/dumper.py,sha256=PLctZlYwZLp7XmeUdwRuv4nYOZ2UBnDIUy8-lKfLF-o,2837
32
+ yaml/emitter.py,sha256=jghtaU7eFwg31bG0B7RZea_29Adi9CKmXq_QjgQpCkQ,43006
33
+ yaml/error.py,sha256=Ah9z-toHJUbE9j-M8YpxgSRM5CgLCcwVzJgLLRF2Fxo,2533
34
+ yaml/events.py,sha256=50_TksgQiE4up-lKo_V-nBy-tAIxkIPQxY5qDhKCeHw,2445
35
+ yaml/loader.py,sha256=UVa-zIqmkFSCIYq_PgSGm4NSJttHY2Rf_zQ4_b1fHN0,2061
36
+ yaml/nodes.py,sha256=gPKNj8pKCdh2d4gr3gIYINnPOaOxGhJAUiYhGRnPE84,1440
37
+ yaml/parser.py,sha256=ilWp5vvgoHFGzvOZDItFoGjD6D42nhlZrZyjAwa0oJo,25495
38
+ yaml/reader.py,sha256=0dmzirOiDG4Xo41RnuQS7K9rkY3xjHiVasfDMNTqCNw,6794
39
+ yaml/representer.py,sha256=IuWP-cAW9sHKEnS0gCqSa894k1Bg4cgTxaDwIcbRQ-Y,14190
40
+ yaml/resolver.py,sha256=9L-VYfm4mWHxUD1Vg4X7rjDRK_7VZd6b92wzq7Y2IKY,9004
41
+ yaml/scanner.py,sha256=YEM3iLZSaQwXcQRg2l2R4MdT0zGP2F9eHkKGKnHyWQY,51279
42
+ yaml/serializer.py,sha256=ChuFgmhU01hj4xgI8GaKv6vfM2Bujwa9i7d2FAHj7cA,4165
43
+ yaml/tokens.py,sha256=lTQIzSVw8Mg9wv459-TjiOQe6wVziqaRlqX2_89rp54,2573
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/WHEEL ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.44.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp38-cp38-manylinux_2_17_x86_64
5
+ Tag: cp38-cp38-manylinux2014_x86_64
6
+
try-on/env/lib/python3.8/site-packages/PyYAML-6.0.2.dist-info/top_level.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ _yaml
2
+ yaml
try-on/env/lib/python3.8/site-packages/__pycache__/easy_install.cpython-38.pyc ADDED
Binary file (281 Bytes). View file