Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
@@ -1,3 +1,4 @@
|
|
|
|
1 |
import gradio as gr
|
2 |
import logging
|
3 |
import requests
|
@@ -6,20 +7,31 @@ from bs4 import BeautifulSoup
|
|
6 |
from datetime import datetime
|
7 |
from typing import List, Optional, Tuple
|
8 |
from urllib.parse import urljoin, urlparse
|
|
|
|
|
|
|
|
|
|
|
9 |
|
10 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
11 |
from sentence_transformers import SentenceTransformer
|
12 |
from sklearn.metrics.pairwise import cosine_similarity
|
13 |
import numpy as np
|
14 |
from icalendar import Calendar
|
|
|
|
|
|
|
|
|
15 |
|
16 |
# Configure logging
|
17 |
logging.basicConfig(
|
18 |
-
level=logging.
|
19 |
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
20 |
)
|
21 |
logger = logging.getLogger(__name__)
|
22 |
|
|
|
|
|
23 |
class Config:
|
24 |
MODEL_NAME = "microsoft/DialoGPT-medium"
|
25 |
EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
|
@@ -39,65 +51,108 @@ class ResourceItem:
|
|
39 |
def __str__(self):
|
40 |
return f"ResourceItem(type={self.type}, url={self.url}, content_length={len(self.content)})"
|
41 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
42 |
class SchoolChatbot:
|
43 |
def __init__(self):
|
44 |
self.setup_models()
|
45 |
-
self.resources
|
46 |
self.visited_urls = set()
|
47 |
self.crawl_and_index_resources()
|
48 |
|
49 |
def setup_models(self):
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
logger.info("Models setup completed successfully.")
|
56 |
-
except Exception as e:
|
57 |
-
logger.error(f"Error setting up models: {e}")
|
58 |
-
raise
|
59 |
-
|
60 |
-
def parse_urls(self, url_string: str) -> List[str]:
|
61 |
-
raw_items = url_string.split(',')
|
62 |
-
cleaned_urls = [item.strip().strip('"') for item in raw_items]
|
63 |
-
return cleaned_urls
|
64 |
|
65 |
def crawl_and_index_resources(self):
|
66 |
logger.info("Starting to crawl and index resources...")
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
logger.info("Crawling and indexing completed.")
|
71 |
|
72 |
-
def crawl_url(self, url
|
73 |
if depth > Config.MAX_DEPTH or url in self.visited_urls:
|
74 |
return
|
75 |
self.visited_urls.add(url)
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
|
|
|
|
99 |
|
100 |
-
def extract_ics_content(self, url
|
101 |
try:
|
102 |
cal = Calendar.from_ical(ics_text)
|
103 |
events = []
|
@@ -111,51 +166,55 @@ class SchoolChatbot:
|
|
111 |
if events:
|
112 |
combined_text = "\n".join(events)
|
113 |
self.store_resource(url, combined_text, 'calendar')
|
114 |
-
logger.debug(f"Extracted {len(events)} events from {url}")
|
115 |
-
else:
|
116 |
-
logger.debug(f"No events found in {url}")
|
117 |
except Exception as e:
|
118 |
logger.error(f"Error parsing ICS from {url}: {e}")
|
119 |
|
120 |
-
def extract_page_content(self, url
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
try:
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
next_elem = heading.find_next_sibling()
|
130 |
-
while next_elem and next_elem.name in ['p', 'ul', 'ol']:
|
131 |
-
section_content.append(next_elem.get_text(strip=True))
|
132 |
-
next_elem = next_elem.find_next_sibling()
|
133 |
-
if section_content:
|
134 |
-
content_sections.append(' '.join(section_content))
|
135 |
-
if content_sections:
|
136 |
-
full_content = ' '.join(content_sections)
|
137 |
-
self.store_resource(url, full_content, 'webpage')
|
138 |
-
logger.debug(f"Stored HTML content from {url}")
|
139 |
-
else:
|
140 |
-
logger.debug(f"No textual content found on {url}")
|
141 |
except Exception as e:
|
142 |
-
logger.error(f"Error
|
143 |
-
|
144 |
-
def
|
145 |
-
chunk_size = 512
|
146 |
-
text_chunks = [text_data[i:i + chunk_size] for i in range(0, len(text_data), chunk_size)]
|
147 |
-
embeddings = [self.embedding_model.encode(chunk) for chunk in text_chunks]
|
148 |
-
average_embedding = np.mean(embeddings, axis=0)
|
149 |
-
item = ResourceItem(url, text_data, resource_type)
|
150 |
-
item.embedding = average_embedding
|
151 |
-
self.resources.append(item)
|
152 |
-
logger.debug(f"Stored resource: {url} (type={resource_type}). Total resources: {len(self.resources)}")
|
153 |
-
|
154 |
-
def is_valid_url(self, url: str) -> bool:
|
155 |
parsed = urlparse(url)
|
156 |
return bool(parsed.scheme) and bool(parsed.netloc)
|
157 |
|
158 |
-
def find_best_matching_resource(self, query
|
159 |
if not self.resources:
|
160 |
return None, -1.0
|
161 |
query_embedding = self.embedding_model.encode(query)
|
@@ -168,47 +227,37 @@ class SchoolChatbot:
|
|
168 |
best_resource = resource
|
169 |
return best_resource, best_score
|
170 |
|
171 |
-
def extract_relevant_snippet(self, content
|
172 |
-
sentences = content
|
173 |
query_embedding = self.embedding_model.encode(query)
|
174 |
sentence_embeddings = self.embedding_model.encode(sentences)
|
175 |
similarities = cosine_similarity([query_embedding], sentence_embeddings)[0]
|
176 |
best_idx = np.argmax(similarities)
|
177 |
-
start_idx = max(0, best_idx -
|
178 |
-
end_idx = min(len(sentences), best_idx +
|
179 |
-
snippet = '
|
180 |
return snippet
|
181 |
|
182 |
-
def generate_response(self, user_input
|
183 |
-
if not self.resources:
|
184 |
-
return "No resources indexed. Please check your configuration."
|
185 |
best_resource, similarity_score = self.find_best_matching_resource(user_input)
|
186 |
if best_resource is None or similarity_score < Config.SIMILARITY_THRESHOLD:
|
187 |
return "Great question! According to my resources, I couldn't find a direct answer. Please rephrase your query or contact support for more information."
|
188 |
snippet = self.extract_relevant_snippet(best_resource.content, user_input)
|
189 |
-
# Prepare the conversation history
|
190 |
conversation_history = f"User: {user_input}\nAssistant: {snippet}"
|
191 |
-
# Tokenize the conversation history
|
192 |
new_user_input_ids = self.tokenizer.encode(conversation_history + self.tokenizer.eos_token, return_tensors='pt')
|
193 |
-
# Generate a response using DialoGPT
|
194 |
chat_history_ids = self.model.generate(new_user_input_ids, max_length=Config.MAX_TOKENS, pad_token_id=self.tokenizer.eos_token_id)
|
195 |
response = self.tokenizer.decode(chat_history_ids[:, new_user_input_ids.shape[-1]:][0], skip_special_tokens=True)
|
196 |
-
# Format the final response
|
197 |
return f"Great question! According to my resources, {response}. For more details, see the answer in full context here: {best_resource.url}"
|
198 |
|
199 |
-
def create_gradio_interface(chatbot
|
200 |
def respond(user_input):
|
201 |
return chatbot.generate_response(user_input)
|
202 |
-
|
203 |
interface = gr.Interface(
|
204 |
fn=respond,
|
205 |
inputs=gr.Textbox(label="Ask a Question", placeholder="Type your question here..."),
|
206 |
outputs=gr.Textbox(label="Answer", placeholder="Response will appear here..."),
|
207 |
title="School Information Chatbot",
|
208 |
-
description=
|
209 |
-
"Ask about school events, holidays, or other information. "
|
210 |
-
"Supports calendar and website queries."
|
211 |
-
),
|
212 |
examples=[
|
213 |
["What events are happening this week?"],
|
214 |
["When is the next board meeting?"],
|
|
|
1 |
+
INDEXED_URLS = '"https://calendar.google.com/calendar/ical/south.spencer%40sspencer.k12.in.us/public/basic.ics", "https://calendar.google.com/calendar/ical/hs.spencer%40sspencer.k12.in.us/public/basic.ics", "https://calendar.google.com/calendar/ical/le.spencer%40sspencer.k12.in.us/public/basic.ics", "https://calendar.google.com/calendar/ical/re.spencer%40sspencer.k12.in.us/public/basic.ics", "https://drive.google.com/file/d/1gNTdzCSRG8h-GY21zMsmuyQEv_16eiq_/view?usp=drive_link", "https://drive.google.com/file/d/1wxQKZuI77-3cPceJ8mKbREQDSgEKXCFX/view?usp=drive_link", "https://drive.google.com/file/d/1vDix0a2shD7U46IVOprqnNWMzC7D01vl/view?usp=drive_link", "https://drive.google.com/file/d/1ShYZl7re5cdNoORTCJ-6vVp2rKM9xa_d/view?usp=drive_link", "https://drive.google.com/file/d/1Gky4kY1KGt6P4wxx7OPatmfSc_VZGx6v/view?usp=drive_link", "https://drive.google.com/file/d/1aoK7oA45je8Tkl7v2dEnYseHXFaisJ-W/view?usp=drive_link", "https://drive.google.com/file/d/1NG3ak3YqLtNEbYwT5U52tnmgyTK_6NMo/view?usp=drive_link", "https://drive.google.com/file/d/1FH8r8JeOEXhS7BUIWKM-FyrLN8Nu3oHm/view?usp=drive_link", "https://drive.google.com/file/d/1YZ4dushzkbmQPI98rnUJqfmDQJoVfvpn/view?usp=drive_link", "https://drive.google.com/file/d/1PJj23lAF45N0sBg6PknJLHl-OYsF0QWU/view?usp=drive_link", "https://drive.google.com/file/d/1DeJ3fTy61I7n86ofmrZUg6jzAqOsg-w-/view?usp=drive_link", "https://drive.google.com/file/d/1aunHxceGluv4l9cWWEKadWzNwnpEeFX2/view?usp=drive_link", "https://drive.google.com/file/d/1FBhLaXc1To-I21eqhVMzneDnmsZSfi3r/view?usp=drive_link", "https://drive.google.com/file/d/1Kvjpiq9Y_zUviyxYN9SERJ8dHxco_br8/view?usp=drive_link", "https://drive.google.com/file/d/18YN4uX8o108FpYqiWHbOqynnMT-w7fIe/view?usp=drive_link", "https://drive.google.com/file/d/1ju5O6J_3w5ffjWJcIfzQmTa2JFiK4rG_/view?usp=drive_link", "https://drive.google.com/file/d/1awbYPSnxSIx2Gb08DSJgUyx-dGDkgmHH/view?usp=drive_link", "https://drive.google.com/file/d/1ciKJS5HuDO2KR9wG9pqcf39mFa5gVw3A/view?usp=drive_link", "https://drive.google.com/file/d/1mt8qWowJnzd9O-RPX39cWg_w8wn6IDCn/view?usp=drive_link", "https://drive.google.com/file/d/1GFc7aKVLGFl23OxMiIGZZczx_D48C-hL/view?usp=drive_link", "https://drive.google.com/file/d/1_1mQn2ika8MypPfUbW5o3jMjZXaqFcXj/view?usp=drive_link", "https://drive.google.com/file/d/1UOyDdf5PPEguLdA7pr8N6biUtre0WrAc/view?usp=drive_link", "https://drive.google.com/file/d/1uvBJs6EUwYfGEoK-9YMmG65gEm1XKXOB/view?usp=drive_link", "https://drive.google.com/file/d/1t00WkdwoVR5GjPOLG0mP41uhraG8U7Yv/view?usp=drive_link", "https://drive.google.com/file/d/15s_b_79QvnMC3vz2phJawILiPL3S8A9U/view?usp=drive_link", "https://drive.google.com/file/d/1nClSEZE42T6hsDQ_mn7Y_BOkoFoV8I56/view?usp=drive_link", "https://drive.google.com/file/d/1JBM0pQvCWoFhr1ALWDmgrFNeYqSm7UTI/view?usp=drive_link", "https://drive.google.com/file/d/14eCiz8u12VnMrBDD7T-ow0re6eCF5Pzk/view?usp=drive_link", "https://drive.google.com/file/d/1ZbyVweQrbRc2pFRkRz_kF7Q6LYkGu3MV/view?usp=drive_link", "https://drive.google.com/file/d/167rFgOViNzNMhbXmlf9cHgc6efomzHab/view?usp=drive_link", "https://drive.google.com/file/d/1uR7RyujbSkLz4k8zQzzbrf-JKOYG5-Bh/view?usp=drive_link", "https://drive.google.com/file/d/1GdNQ8j7S1kOpxmIQ4rPKn3antkkXd2OT/view?usp=drive_link", "https://drive.google.com/file/d/146nf7ZFYX4ypMGRHTd2Z1WJtFWnp8_YL/view?usp=drive_link", "https://drive.google.com/file/d/10rKZhq2RV9QEYEV3h1NgeWngHu_NGDeC/view?usp=drive_link", "https://drive.google.com/file/d/1Oh4QpMMApcm-9GKsqd-hALJyGGedsaIK/view?usp=drive_link", "https://drive.google.com/file/d/1Aol_v7n-9XHZBGHyM_NGbkf25m07T3Wl/view?usp=drive_link", "https://drive.google.com/file/d/169HBRiDEqRrnbzSBgaLT3npcc7vRBu4G/view?usp=drive_link", "https://drive.google.com/file/d/1UL6e35UtcYxSh8aonFOFmSeBw6_jonZl/view?usp=drive_link", "https://drive.google.com/file/d/1U1mx9vFLyUx-1Ej1gSto76urTTHwoUAN/view?usp=drive_link", "https://drive.google.com/file/d/12e_FI7UZJl3BjJSsQ5RbMsQq6jw3V7ZC/view?usp=drive_link", "https://drive.google.com/file/d/1ov9J5PXyedvDD1XRO44DczdUsSzrzaS8/view?usp=drive_link", "https://drive.google.com/file/d/1MFX4dw6575Wp_uNSw3OdS4ebi2-ebW9m/view?usp=drive_link", "https://drive.google.com/file/d/1hck2cZzzsWlPbdv85JmqKbSQov_vtAfe/view?usp=drive_link", "https://drive.google.com/file/d/1mk27rjFx8Yvzlps9TZ1GYMFm4EKMJnMZ/view?usp=drive_link", "https://drive.google.com/file/d/1LSiDDpLfvcDlX8edksvb28TP7LQP0ceg/view?usp=drive_link", "https://drive.google.com/file/d/1ztlp8vwK6PFiVz5mHxWtxifNt2oBds-Q/view?usp=drive_link", "https://drive.google.com/file/d/1Qzyea19kdfqyyFD_msR5BO_AnAtble0y/view?usp=drive_link", "https://drive.google.com/file/d/142kP6zJKLQ9E9U-KJLms82jXrfrB7lsN/view?usp=drive_link", "https://drive.google.com/file/d/1_0uMOJaEpE0hrzD6umPivf7ZrJ_B7Awc/view?usp=drive_link", "https://drive.google.com/file/d/1T4i9bNUoQ6uqPH8EB8rNceprl7h4DA2L/view?usp=drive_link", "https://drive.google.com/file/d/1t-vyEMvEtFqe0h-Xssuquo7-4kOTNGvs/view?usp=drive_link", "https://drive.google.com/file/d/1LSuqga7MgIojRBlDzv788JbhqD1GmdxV/view?usp=drive_link", "https://drive.google.com/file/d/1gCvqWEvCQ8oBWBw4uphYX7zTGrYNNWXF/view?usp=drive_link", "https://drive.google.com/file/d/1IxNuk1jav-TjVvwYerB0lZAKNyHS0dUk/view?usp=drive_link", "https://drive.google.com/file/d/11cdVMs1YRw3MXmd04JLiuusx8nMJLjSH/view?usp=drive_link", "https://drive.google.com/file/d/19yLDRf4wzapEP0PLOShGPLJhrnt9TvJu/view?usp=drive_link", "https://drive.google.com/file/d/1xgh11TYt1e5pYE5N9mUARjg-D5Y0m7qg/view?usp=drive_link", "https://drive.google.com/file/d/1OXmntrhZ_2z-KftU07R-SHCcUKMPWBRQ/view?usp=drive_link", "https://drive.google.com/file/d/1aLs_gQjX1SHfIsREg7KdG2JbYioSfXpe/view?usp=drive_link", "https://drive.google.com/file/d/1V42lLs7xo65WhGKYm0WzYdGvDPIF_Bkb/view?usp=drive_link", "https://drive.google.com/file/d/1mxj-eGId_xZEXteJoFxVLZg701dqfJ7K/view?usp=drive_link", "https://drive.google.com/file/d/1yKHDHcSUDrtDsOIrsJsVlEKkxySsUcgj/view?usp=drive_link", "https://drive.google.com/file/d/10yTEBlfCRZ7f8A_Tx3RkYXdFvXfcK1xz/view?usp=drive_link", "https://drive.google.com/file/d/1LZcSI-QnAcw0aqlADHi7Rcs4RgqQfMjX/view?usp=drive_link", "https://drive.google.com/file/d/1z2AZQvDCZVu7GLK0mXJq55ObWsxfWMgs/view?usp=drive_link", "https://drive.google.com/file/d/1q35GQFTd6dFWj1vZDmYHEjyw5r171f0q/view?usp=drive_link", "https://drive.google.com/file/d/1Yjbun_-9Z2akhK0Izv0vrK7frX5uiVxe/view?usp=drive_link", "https://drive.google.com/file/d/1qkEJKU-73AoevioFk5roTPRADE1hiJyO/view?usp=drive_link", "https://drive.google.com/file/d/1XqbFbyoD1hts8Sq5vBLA40u4csHDOTM2/view?usp=drive_link", "https://drive.google.com/file/d/1jc52u2dLRGJkllLzGWlHnYuAGCoYwHvX/view?usp=drive_link", "https://drive.google.com/file/d/1DvSAe52A9GUu85dpJizJSw7bh3cXphW5/view?usp=drive_link", "https://drive.google.com/file/d/1y7MqM_SDLrzZbaSKZLBDhaiWqSynG50v/view?usp=drive_link", "https://drive.google.com/file/d/1PxtA_l0Ntcz0ZZy1ut8a1GHIisAscJBS/view?usp=drive_link", "https://drive.google.com/file/d/1mAcHJ0t4uQtzdwo6ibbyCsojjLM8FqHK/view?usp=drive_link", "https://drive.google.com/file/d/1xcdOoTVesjIpyU5Mmb_zD6WxHzxG7h_e/view?usp=drive_link", "https://drive.google.com/file/d/11OEmiHOgQBBmTSsfs2yv7Dwbx4H1gArE/view?usp=drive_link", "https://drive.google.com/file/d/1VKkofGegA3vOUoaS0NMP8EgwaNLkdvQa/view?usp=drive_link", "https://drive.google.com/file/d/18JnQZhelSIbUZ2uJRGW5ZOQ4RPYxLIr6/view?usp=drive_link", "https://drive.google.com/file/d/1UBEA00RATwDKptG5mp7idhotLlv0Ehm9/view?usp=drive_link", "https://drive.google.com/file/d/1hL80abacnLCWSO1nTEav0rTeY515TCoS/view?usp=drive_link", "https://drive.google.com/file/d/1HVHckJUJOYyOm43_TCJP7N3IFx7noVyz/view?usp=drive_link", "https://drive.google.com/file/d/1f1s-x50XKgkpcF5-5_PJGgI35JEzwjYF/view?usp=drive_link", "https://drive.google.com/file/d/1Nb8W9SHyBmfOQ9Y9_PFuz8V6oJpDTku3/view?usp=drive_link", "https://drive.google.com/file/d/1oUxu9zJ8EspLY9w84e1X9TztX4VNGuin/view?usp=drive_link", "https://drive.google.com/file/d/1s-zM8dukhe9S0-eu8A86I6LzcDWvFoJs/view?usp=drive_link", "https://drive.google.com/file/d/1QBU_t9cmNq8tKXh8XRMf1zVh5c0W9Eiu/view?usp=drive_link", "https://drive.google.com/file/d/1OpedffzPAVD3H1ij6aXKskhyLELAsceP/view?usp=drive_link", "https://drive.google.com/file/d/1VMn6Afhs02Ed_dW0XK-WNDGxX1NGc0t-/view?usp=drive_link", "https://drive.google.com/file/d/1eCv9OzrJnea28oBOV_qOwmuzvfWMmrSr/view?usp=drive_link", "https://drive.google.com/file/d/1ZBEhYvuhXnMHdTcVkyMgo7x8944ot7d3/view?usp=drive_link", "https://drive.google.com/file/d/1X5ukI9Qc4QfNaGr1O-eMzpwNnqTGSZnj/view?usp=drive_link", "https://drive.google.com/file/d/1BzxqDN2QmR15lf9d0dpXxEPeJ-jpiI4b/view?usp=drive_link", "https://drive.google.com/file/d/1BVkrM1kG86Ltq9m3XjAXIn7qtiIRS1HG/view?usp=drive_link", "https://drive.google.com/file/d/1tUiW__swsp4cSk21oZPTXKQg4NQqeq3S/view?usp=drive_link", "https://drive.google.com/file/d/1s_8xwkDOdmU6KnFIe0VnuBxLNHfF3Xe5/view?usp=drive_link", "https://drive.google.com/file/d/1OqqA6_cbYTcYJet1BEli27dB1EM8I4Cd/view?usp=drive_link", "https://drive.google.com/file/d/1fPnac9zSXAY9tIBG4YVsoXbTetrNICQe/view?usp=drive_link", "https://drive.google.com/file/d/1l2Ry3bJz7bGVXb8G2q0-Jr5OXE-l_Ym1/view?usp=drive_link", "https://drive.google.com/file/d/1f1ofvoKlX0Mpw0o2HBLm17oUo8Xaz-Tg/view?usp=drive_link", "https://drive.google.com/file/d/1bOB9Jt0Ep44ujY1uxh7i4vOH8jofgoBZ/view?usp=drive_link", "https://drive.google.com/file/d/1j7nsBCOr6MaTLAG0wClra_d9yXPoDQkU/view?usp=drive_link", "https://drive.google.com/file/d/1jhLwkXDif2hd74huSaRotVkvtdSH5-z0/view?usp=drive_link", "https://drive.google.com/file/d/1pmkHlFRDOZUe1OWv3YxnUk_ff77MhRFl/view?usp=drive_link", "https://drive.google.com/file/d/1jqToolNY0ifi3G6NBB39glgALUbQm3pv/view?usp=drive_link", "https://drive.google.com/file/d/1jIPONsKKAExCEfJkgoJYjC3w40EAe7d8/view?usp=drive_link", "https://drive.google.com/file/d/1189eS4KD83hXEjyX3geAEAQkbNkjDMD_/view?usp=drive_link", "https://drive.google.com/file/d/1Rk9RSfCXdbxN6Nn0kFJ6O08zWyOHSGA4/view?usp=drive_link", "https://drive.google.com/file/d/1BXNfM3dHD4sda8Z-lRSBGYHPZTZLiG26/view?usp=drive_link", "https://drive.google.com/file/d/1IW_CeflQTNjOIjytJ5-gVlJWbZk7ZIaN/view?usp=drive_link", "https://drive.google.com/file/d/1rxHGeFl1KgPL_6gLQDxmfdsBZqg9a4QV/view?usp=drive_link", "https://drive.google.com/file/d/1AwmXzNsNpe0qezhB7QbN9xOBdVcztRvn/view?usp=drive_link", "https://drive.google.com/file/d/1VyaSHUxwceZEqa_i2-MT63J9KF2L8VS3/view?usp=drive_link", "https://drive.google.com/file/d/1vK-bqDQ60hXzDjjXLAu_P1IAcvgRBf6g/view?usp=drive_link", "https://drive.google.com/file/d/1hiLQhXS0QJ-C61rb39Xo5pWf1kzpSrae/view?usp=drive_link", "https://drive.google.com/file/d/1CYja6-FL2LFRgjPeWCxY3PGO0tJR6PPA/view?usp=drive_link", "https://drive.google.com/file/d/1GRCIbV-NnvqmmvKglqI9arKQPp5sFM6_/view?usp=drive_link", "https://drive.google.com/file/d/1l6kx0wC4cvGmxRZ5W-AxRusF8geDk1yu/view?usp=drive_link", "https://drive.google.com/file/d/1b7_GkMcbNDjstiD8uBVq8egV52fJhZ91/view?usp=drive_link", "https://drive.google.com/file/d/1d56Ec-37accWw88a3PskQ3OqPntQQ0l0/view?usp=drive_link", "https://drive.google.com/file/d/11DIA9vh8MzFcJHvImXv8OuWP9q_Vem2b/view?usp=drive_link", "https://drive.google.com/file/d/112vn1b6dkq3GNVK32Qz3m5K59yHDlTID/view?usp=drive_link", "https://drive.google.com/file/d/1iWyGZoEUoHdM_4aYz0VTQX2Xk2Ya2eX_/view?usp=drive_link", "https://drive.google.com/file/d/1hRTPKoAWbNCFRd1fCELn_msQjbDL9Eix/view?usp=drive_link", "https://drive.google.com/file/d/1Ag1jv3CNSYOWr_dXxa2OtYG9bTpZs2BO/view?usp=drive_link", "https://drive.google.com/file/d/1VwZSiVyzzuptaNfgsUyHHETjuRqnG1ie/view?usp=drive_link", "https://drive.google.com/file/d/1IVWyQncV_-rOfkpoek9hitrlM2Kj7NrK/view?usp=drive_link", "https://drive.google.com/file/d/1_5gj8EbKzgNSJsOzGs_hv9fhpB8L-uNL/view?usp=drive_link", "https://drive.google.com/file/d/1zkZI-3Jp0p2UzruxIAKnRNZpthBQpokD/view?usp=drive_link", "https://drive.google.com/file/d/1oadonMtvXFb26CgK7SOvplzeviNY9itX/view?usp=drive_link", "https://drive.google.com/file/d/1L6CosuCoABXZyki2XPcjko6nY8BbUnsV/view?usp=drive_link", "https://drive.google.com/file/d/1UlVs22XeL8Kw6OzqYgFUNRW7J75E__mQ/view?usp=drive_link", "https://drive.google.com/file/d/1BZADq3P3dYrE3U9s3xHP1DTrZKGodXRQ/view?usp=drive_link", "https://drive.google.com/file/d/1wMly7a_w2IQmOYEo6-ddctYc5SAVbbbc/view?usp=drive_link", "https://drive.google.com/file/d/1JxuincHH79SJrG12ce6iZCoY7r0AG-zL/view?usp=drive_link", "https://drive.google.com/file/d/1IO2ENlNJkZtWCRt4UWZT85V29bDGL_m-/view?usp=drive_link", "https://drive.google.com/file/d/1Ph60H1JcsTQujeTeGwkj836tnqckjV5m/view?usp=drive_link", "https://drive.google.com/file/d/1UNLut1x6_kZf8ZbE8uWnmfNFzh1mkq0U/view?usp=drive_link", "https://drive.google.com/file/d/1IZpe_vlg1KbiDv_vwyCPdSC2TSpAxh3P/view?usp=drive_link", "https://drive.google.com/file/d/1O-lgr1AN9RlcZjMQS1jp-rXfdf7Ed-UU/view?usp=drive_link", "https://drive.google.com/file/d/1dmgr5K0XzOO5C43P6r16dvjz4qBkgEEK/view?usp=drive_link", "https://drive.google.com/file/d/1hWARs3wQnLE2YIobhpp1Xc1hoI2IYRN9/view?usp=drive_link", "https://drive.google.com/file/d/169VF86oxIjGpoTWrqnETXzoD5agHQRp4/view?usp=drive_link", "https://drive.google.com/file/d/1TgDrR5vGeG1Q8wYL6insSc8Dv8B0JJs-/view?usp=drive_link", "https://drive.google.com/file/d/1hY0v57gVUdfFo329DR9AFYpQuwLBBvyL/view?usp=drive_link", "https://drive.google.com/file/d/1M7H8Ni_gt_tz5QLL_WiHy19jGRWmdENj/view?usp=drive_link", "https://drive.google.com/file/d/1HRZxPQ066JLkplsZoM5tEn7F8S8zN_2e/view?usp=drive_link", "https://drive.google.com/file/d/1Eo-Zu7DGv1smiTbahTjkmeuSRkMLvANA/view?usp=drive_link", "https://drive.google.com/file/d/1SBDEXtzIwRTzAMSprM3_tOfGLLTFN7Ye/view?usp=drive_link", "https://drive.google.com/file/d/1IqFYSNeFV0l3Lv3lnZgUrB6OsKGkfEBm/view?usp=drive_link", "https://drive.google.com/file/d/1hHBnyqFu7DAz0CVhzWib_MjpqqNk5WZ1/view?usp=drive_link", "https://drive.google.com/file/d/1zGBHK0dDWNvSBEXwH_jtqEWSYj_P3ixa/view?usp=drive_link", "https://drive.google.com/file/d/1xz-4oSS6wbIM3rFXDsPRVFqs4zgtTVQ3/view?usp=drive_link", "https://drive.google.com/file/d/1oQjoZuETmaP2yvKSwpTwxbjGMxi5i_V5/view?usp=drive_link", "https://drive.google.com/file/d/1rd7je1LWi2Rc4KyFBGMfogb0CqodWIRL/view?usp=drive_link", "https://drive.google.com/file/d/1UXVIOF_yOlFSrN-zCNBs2J07Q3cIgs22/view?usp=drive_link", "https://drive.google.com/file/d/1aud7OsJD_VgcjR4tl-0NTsdByhOXcYYl/view?usp=drive_link", "https://drive.google.com/file/d/1gIkxwItUR37rqJgZu6u-D55hod1QkumS/view?usp=drive_link", "https://drive.google.com/file/d/1oPZmRoy27ByKyyYEvBQ2YfZGJ3edDlN2/view?usp=drive_link", "https://drive.google.com/file/d/1KCtwS-bcIL98ZoetZTS4m4csM9DTuyhq/view?usp=drive_link", "https://drive.google.com/file/d/1N12sUN1PBc2DnXydCd_o1LjJpUphdnqU/view?usp=drive_link", "https://drive.google.com/file/d/17cNEoZiNCYoURA3b4Pzq78PIXTsoDtxc/view?usp=drive_link", "https://drive.google.com/file/d/1qslE0JGtznx-pvkSTaPfwCxPD84oQNfz/view?usp=drive_link", "https://drive.google.com/file/d/1mzBFkep7GBqI-rfaPGemK6elrZRNW7m2/view?usp=drive_link", "https://drive.google.com/file/d/15mJpLzoRCTSSz9iRBq6JPwFrLCgNwqEz/view?usp=drive_link", "https://drive.google.com/file/d/1RE92vh9UgQS7PKIq4wHQGnE3sWOX8cE2/view?usp=drive_link", "https://drive.google.com/file/d/1h9a6bLZdtmiXk7yPmmI2rUpEO2VgTVvL/view?usp=drive_link", "https://drive.google.com/file/d/1IQuCps5-pITTD_vFHTMdCZoezluEfxcR/view?usp=drive_link", "https://drive.google.com/file/d/1A7_UEv9J53TSHjcrWMHQNB9jsagKVkRX/view?usp=drive_link", "https://drive.google.com/file/d/1kdXV0J7shf5WjlI7Mt_-DE2ip1Z_wYhF/view?usp=drive_link", "https://drive.google.com/file/d/1B1UX-w7Ojbx-e11SKlG46gbfaKDsHCyT/view?usp=drive_link", "https://drive.google.com/file/d/1qr3ZWvuyuUrxIm3WKvqsTD4YpxEokM7w/view?usp=drive_link", "https://drive.google.com/file/d/1DuIeunbj6W4a-ee0LnGJYuwO7M46XjUZ/view?usp=drive_link", "https://drive.google.com/file/d/1CjezA-zsak5lu7Btxo61HkkLKGMSF72v/view?usp=drive_link", "https://drive.google.com/file/d/1uqK02_naxpCo948DMp0dVZv3TZ4bs31A/view?usp=drive_link", "https://drive.google.com/file/d/1ghwf8m2X6pshvwsZVH0pTUNWePWBnvip/view?usp=drive_link", "https://drive.google.com/file/d/1keYR-IAXq9PYDTrHkp_BukSeHEzyn-oK/view?usp=drive_link", "https://drive.google.com/file/d/15fk8p5HQ07uusd7YcspfipMIMlEvhuQk/view?usp=drive_link", "https://drive.google.com/file/d/12g0J4OO1fTG_n8_i9VcOpJGyYqnPuqZY/view?usp=drive_link", "https://drive.google.com/file/d/18IsrwezCN0SfJ6iWqjGvzYnATs2ytLAu/view?usp=drive_link", "https://drive.google.com/file/d/1g0m_bKXHUGv1bJEmXmCZ89OnNQex5hmQ/view?usp=drive_link", "https://drive.google.com/file/d/1Q5qkM5KHc3smlBF4b-C1M0LL1mlltMcU/view?usp=drive_link", "https://drive.google.com/file/d/1BVstKY7rCSN-gvsidCNc-e9c0NzXH3yN/view?usp=drive_link", "https://drive.google.com/file/d/1EWEsnBa35F0k2_amfXc5VY7ky6VNAzPG/view?usp=drive_link", "https://drive.google.com/file/d/15Yj2mPbGFBuiFqxuX9KLT7U2MikyuVKn/view?usp=drive_link", "https://drive.google.com/file/d/1BPl4XMvqYuA7N7q008XsshJetj2quk2Q/view?usp=drive_link", "https://drive.google.com/file/d/1cZnPsQyS_RbnDymdaNfB1kyA3VlHuKUo/view?usp=drive_link", "https://drive.google.com/file/d/1FEqcABToTL0ZQoQpB0rtnT3blx3HI9hN/view?usp=drive_link", "https://drive.google.com/file/d/1nblVUiZF6g9R5ZU-qof8ERViRWZfKsyZ/view?usp=drive_link", "https://drive.google.com/file/d/1ej14G6a3cdSNzbjc96IFGGeJwLojAsab/view?usp=drive_link", "https://drive.google.com/file/d/1qOW6dZfmsYiz3A8TFUHeJ-xeUODSK_ZQ/view?usp=drive_link", "https://drive.google.com/file/d/197pz7gmKtuQ8cc7EINjlJes5iGnwooGf/view?usp=drive_link", "https://drive.google.com/file/d/1PNWK_AM-XtrOdHiQTb3LdXrIO9sMg_YP/view?usp=drive_link", "https://drive.google.com/file/d/1gNa9Wm1yXINLOIkGFw6LGetgFL_2kL-F/view?usp=drive_link", "https://drive.google.com/file/d/12lwVb_hYd4RH6azzVCt_np-2nNQhdfzS/view?usp=drive_link", "https://drive.google.com/file/d/11nxk8D2I55NPwu1_UTCnmKJ1atu__kug/view?usp=drive_link", "https://drive.google.com/file/d/1geXEsVtMPS5YevYtT3jt2cAjhNjQ52LC/view?usp=drive_link", "https://drive.google.com/file/d/1IZzX6Hxpx2PCGP_FBrsng8Nl-pPC7ldY/view?usp=drive_link", "https://drive.google.com/file/d/1hCAme9PrM5bsFJW8Gt4BbW8XgR84Jfiw/view?usp=drive_link", "https://drive.google.com/file/d/16U-KkN0XVUxvxpEQUT1qaZZrk4-2kv8p/view?usp=drive_link", "https://drive.google.com/file/d/1AlEM3aZCdRKr-CwA_NqXr6x2uyFN6SDO/view?usp=drive_link", "https://drive.google.com/file/d/1O_oNsWwxT7GmaZzEXXQ_UZgiTwD9Ckp0/view?usp=drive_link", "https://drive.google.com/file/d/1RgETErHkP1qEZnFhm14a5ROZD1LwTtQ-/view?usp=drive_link", "https://drive.google.com/file/d/1hBT9WBQrEyJr8TpMHndDTJXZmZVpgFxm/view?usp=drive_link", "https://drive.google.com/file/d/1nkkEt6F2GlNozy9MMxZOMdPNXe1BgO8X/view?usp=drive_link", "https://drive.google.com/file/d/1CXWbaxxIrVT0fHDlRStWoJxouWdSttf-/view?usp=drive_link", "https://drive.google.com/file/d/1Vv0ZWB8MbYSo-uFgLHiqwEqn1kUvC1Br/view?usp=drive_link", "https://drive.google.com/file/d/1HdQCwpDyfBx5QhmgiqC-CboH2SdGsoCv/view?usp=drive_link", "https://drive.google.com/file/d/1agxdZShCFGULCL4U7fNhQuXnK3zREDAI/view?usp=drive_link", "https://drive.google.com/file/d/1442L6uMT9ylpPs2C--dmR_ko8wLMJwZc/view?usp=drive_link", "https://drive.google.com/file/d/1Ic5K11CSy0-_gvqNv0qCJq_NFet7--9I/view?usp=drive_link", "https://drive.google.com/file/d/1Cb-LpyeFmjyalDz5BPaTI9A6ZfO-XEjN/view?usp=drive_link", "https://drive.google.com/file/d/1929Eo134JgwNHjPM9y1kqgs5f2R4P3Po/view?usp=drive_link", "https://drive.google.com/file/d/1KI0rgqmhECtlev6z2DKRRFeYvp0z4sn7/view?usp=drive_link", "https://drive.google.com/file/d/1NxwBOct24nFbwl2_5rLXv6oqtr7Og99I/view?usp=drive_link", "https://drive.google.com/file/d/1lrPQIK4k8M5iH9G4UfB2AsC_47AThhID/view?usp=drive_link", "https://drive.google.com/file/d/1s8xX7KN2OuhDUIcbidnES_5sl58N54ss/view?usp=drive_link", "https://drive.google.com/file/d/1b_Hwb3dxR-S-4iCAv8X1lG305pubhT7D/view?usp=drive_link", "https://drive.google.com/file/d/1vZ3U-cZY5pqKypHnIAfj5DpciN65nuIg/view?usp=drive_link", "https://drive.google.com/file/d/1PDN7_Jd6-jk4cFqqDbn1EHnhctmdvXty/view?usp=drive_link", "https://drive.google.com/file/d/1E1V35w4nHLijvB7CE-FhRJe5FmUNi8ra/view?usp=drive_link", "https://drive.google.com/file/d/1RVFHercH2erHC2qFGOopRuKihtBIQmg7/view?usp=drive_link", "https://drive.google.com/file/d/1_ZqIw-7D7eZz3kAkUyhWgZsyVMhUpESJ/view?usp=drive_link", "https://drive.google.com/file/d/17BiPlp_5GhKj4ZMqtd6Gk4-lec0ueOCd/view?usp=drive_link", "https://drive.google.com/file/d/14cvo3K1FT64lmnSwplWEpue9QEbN3uNW/view?usp=drive_link", "https://drive.google.com/file/d/1c7xvCrdYlFa7TYEcfDsF8lxnTd3peb5u/view?usp=drive_link", "https://drive.google.com/file/d/1bxl_t9C-SHkR-7UanK4C84-xwWoEdlZ8/view?usp=drive_link", "https://drive.google.com/file/d/1_DBCnQqJ-T7jS-cLiTatwT3f7KCYQLxg/view?usp=drive_link", "https://drive.google.com/file/d/14mE65Bete1r85buqOuHDv-jXgFWxiwvb/view?usp=drive_link", "https://drive.google.com/file/d/1Ljd2zliG5oHZ-SJ3rTtNFHUOuwYCnLHC/view?usp=drive_link", "https://drive.google.com/file/d/1x7FTY1wUVdalLR5vfPSkJZy-h5yVdHiU/view?usp=drive_link", "https://drive.google.com/file/d/1KYs9Sgchi5I0KBbsT-uttj_2Z9M0SokC/view?usp=drive_link", "https://drive.google.com/file/d/1NyUxWhgwZA0fSoihDkYd-Ft7GHTn8siw/view?usp=drive_link", "https://drive.google.com/file/d/1zcxuSoa6UhSi3zDc6lTbYbyuCl3zD21L/view?usp=drive_link", "https://drive.google.com/file/d/1GG3zccd6ggj5u7viykPM33dFMN6iRbFM/view?usp=drive_link", "https://drive.google.com/file/d/1Y2sPyCetJFlBrjKJml1BqOactRP7kqn6/view?usp=drive_link", "https://drive.google.com/file/d/1fRZv4jbT5i9vLPCLRc5mmfzbS87IArkD/view?usp=drive_link", "https://drive.google.com/file/d/148ExCpM2NURVryAyexopagSvtrr72rce/view?usp=drive_link", "https://drive.google.com/file/d/1r58b7Vm7yiZGqvkTCUZ9bdl5nQyp0MAz/view?usp=drive_link", "https://drive.google.com/file/d/1pBD6ILHHLJ1078tmV_78HoY4o76ze73P/view?usp=drive_link", "https://drive.google.com/file/d/1T7Pl6CE8W7LntUtDdM5BceQh9A-y0H8z/view?usp=drive_link", "https://drive.google.com/file/d/1js3syP7gpcYV2g68lp8txcFb4LkTymcu/view?usp=drive_link", "https://drive.google.com/file/d/1bL6fu36cuklapV7UKNmvnGX_vONTdaDh/view?usp=drive_link", "https://drive.google.com/file/d/17FialEwjWtd4_y-09JVsY_e0RFlAB0Mg/view?usp=drive_link", "https://drive.google.com/file/d/14bFHwzQGs5W0srWMXWmTwqvgkk_x3_Dx/view?usp=drive_link", "https://drive.google.com/file/d/1AUqVhjpShGCjFuB4-XHcPtBY6ZEbSx_V/view?usp=drive_link", "https://drive.google.com/file/d/1ZZJzErEmm9Y5FBaOafh8lIRufcfLlraN/view?usp=drive_link", "https://drive.google.com/file/d/1sGsapDQ_Nw-yOEKK-i5KjNRrSO8cirMb/view?usp=drive_link", "https://drive.google.com/file/d/1Mfp7SjyqKE5Z02Z8yg_3T5Tr8z3lyA19/view?usp=drive_link", "https://drive.google.com/file/d/1Fts-V4wRDeuUH8S4xDbwa5qip3JxL6lz/view?usp=drive_link", "https://drive.google.com/file/d/1t0IQl11w4myNr1h_20iVQePZKbdaC_y4/view?usp=drive_link", "https://drive.google.com/file/d/17oDFopvbJ7pYSQj6z2mm16fpzbiEvOGd/view?usp=drive_link", "https://drive.google.com/file/d/1crsNKWeYD4kSscbB8ZQd_9uHGhDu5eS9/view?usp=drive_link", "https://drive.google.com/file/d/1AA-tbaOy_ajmq1zKwQBaSZnCuOz34p-f/view?usp=drive_link", "https://drive.google.com/file/d/1Bef7xaRPWB7idW2VriBi5Pqwi88Y9vd9/view?usp=drive_link", "https://drive.google.com/file/d/1Iwc9UJdp2xfRBQBdksnCyCoufhSBGF_L/view?usp=drive_link", "https://drive.google.com/file/d/1Ky7oC_vEdfD8BiFfSpDRsxwR4-38pkY2/view?usp=drive_link", "https://drive.google.com/file/d/1Dj3y4BfeFKfRL2v2T6EBnsYR5nKqsysj/view?usp=drive_link", "https://drive.google.com/file/d/10euyk7WvOhCwXY8wZFe4Jj0oqHTi7PPP/view?usp=drive_link", "https://drive.google.com/file/d/1Ky8U3kpD4rjgGLZYhGNov6Sqys7_IkG3/view?usp=drive_link", "https://drive.google.com/file/d/1Bnlj6DY0zv3fmu9jxPqxrpE9aG-Yapkx/view?usp=drive_link", "https://drive.google.com/file/d/1vMMy282pvbb_FT5ifca84vVXvVQVdnx5/view?usp=drive_link", "https://drive.google.com/file/d/1Z7l_M5f8lVWF0MiZq9Sc6P5cpocHPs6O/view?usp=drive_link", "https://drive.google.com/file/d/1BvrmsacYCxJbI6pieajDq648sBM6x_8o/view?usp=drive_link", "https://drive.google.com/file/d/1rCNZwXfc_Lo9yC-_C2ymNCWuFdqwSylR/view?usp=drive_link", "https://drive.google.com/file/d/1-4aqTJiUf0Y8_1S5M69mdV_9ICD-YXgE/view?usp=drive_link", "https://drive.google.com/file/d/1Me11-RwFhevlP2CmscGMCbtCUXkq3EWO/view?usp=drive_link", "https://drive.google.com/file/d/1x1HpjBUbOYpVh2296pVKKddoCSvBYRmd/view?usp=drive_link", "https://drive.google.com/file/d/1t42CJPpdWS6B7n3b3yiZUJNl14ZcAOT3/view?usp=drive_link", "https://drive.google.com/file/d/1M0Z5CL338MIWUIsF71YeSK_aoVyNcCQj/view?usp=drive_link", "https://drive.google.com/file/d/1_i0DalURKz2qGhUI4x1QL_B_vAXYEijG/view?usp=drive_link", "https://drive.google.com/file/d/1Ue0-LSdDvjpDg2dzS4GXYAPafo-5n0N0/view?usp=drive_link", "https://drive.google.com/file/d/1T77sH-_WKFL2wVAufxHNth3qPH7erbQF/view?usp=drive_link", "https://drive.google.com/file/d/1EmC7xOoj5FrsLVgNXF4Y3DhJDilkfb7Z/view?usp=drive_link", "https://drive.google.com/file/d/1kD7i0EtZJh5Qg7HQrxxxA0e8SC7abm47/view?usp=drive_link", "https://drive.google.com/file/d/1LtIOuqxxNkmf5JnHbr7MeiNmfNs_ULXo/view?usp=drive_link", "https://drive.google.com/file/d/11X-T4QnTawOQXWS0NznRgYrTKooEQ6Pf/view?usp=drive_link", "https://drive.google.com/file/d/1XNAXDKyx93XYixMJl_Tc2JcZ6QwWqnRZ/view?usp=drive_link", "https://drive.google.com/file/d/1VpGKt4_kcRCoJdlStZqfMfU4YrkRCF29/view?usp=drive_link", "https://drive.google.com/file/d/1wdZU12eD5YqITEP0i7THTT239SIYq_xR/view?usp=drive_link", "https://drive.google.com/file/d/1mFTmRpiAM5B-LbFM9gS9lycc751GMQUL/view?usp=drive_link", "https://drive.google.com/file/d/1hp7LXVc82jKNOxWz7RA8YLX71MYukacr/view?usp=drive_link", "https://drive.google.com/file/d/1QDWra8jYp--LNBkhAUA9iMACgktRBqz4/view?usp=drive_link", "https://drive.google.com/file/d/1US_YJlCH7rt0aFQCX24-5XLdpGteL0UX/view?usp=drive_link", "https://drive.google.com/file/d/1GrtrjSjWrtcDKhu8aBbGEUUw0LVWTIJy/view?usp=drive_link", "https://drive.google.com/file/d/1y4Ogg3BRUIqU67gWAhnQjOfxepjAN2FI/view?usp=drive_link", "https://drive.google.com/file/d/1AZT_RcZaOfkkWQQR8IfIICprGQUqro5N/view?usp=drive_link", "https://drive.google.com/file/d/1Lgh9nu1s0iMJysXed9Z-Dbt3eG3Bvlu0/view?usp=drive_link", "https://drive.google.com/file/d/1h7ft8gbf4CyCPHJc-0FQ9yeYeLDjQOF1/view?usp=drive_link", "https://drive.google.com/file/d/1jqggJ3gkDVcV4F5JX-E8eGKzVToT2nRH/view?usp=drive_link", "https://drive.google.com/file/d/1kNdZtb9TAziQ3DXTluoCOlgrRMs1cp4c/view?usp=drive_link", "https://drive.google.com/file/d/1LlTUTmYLUXksIF_tfogjXfbFmRJfgaZs/view?usp=drive_link", "https://drive.google.com/file/d/1mxtDeIYMRv9_IzWIJrHxzTadDlkJaQFI/view?usp=drive_link", "https://drive.google.com/file/d/1c2LggHQeq_205CCZA8N4fOTffUb1SQ7i/view?usp=drive_link", "https://drive.google.com/file/d/16Z8uJ2SXCaf0MNL9PMJ4oVldFcv1cLwa/view?usp=drive_link", "https://drive.google.com/file/d/1eRmIFuxg0LWnk3lzzwCO1xZgxLApCLna/view?usp=drive_link", "https://drive.google.com/file/d/1UGOJJjHzRVi350iE-8Llv_j4S-HXfCM7/view?usp=drive_link", "https://drive.google.com/file/d/1KjhEnseQVGpmf8G9mLhSEkAK8k_Q88sx/view?usp=drive_link", "https://drive.google.com/file/d/1vbRAZgGUHM6Q1IbddMOxrRENWb0wjjYV/view?usp=drive_link", "https://drive.google.com/file/d/11wSrybzqac_NIsPnH1L-7mS370CxxBw0/view?usp=drive_link", "https://drive.google.com/file/d/1-CZZ6cFUZGw494b0rU7d8HU8GBnoiNNg/view?usp=drive_link", "https://drive.google.com/file/d/1OzyW0EkSxptIbZkT0EC3rASFV5QrnRjN/view?usp=drive_link", "https://drive.google.com/file/d/12kDJ6VMvvI6Sy3Tr5pchQh4LQqQnk9dX/view?usp=drive_link", "https://drive.google.com/file/d/110DG70VHsSEA7yhrXJ8wL439nlsU9cV5/view?usp=drive_link", "https://drive.google.com/file/d/10iheQHkqYqgpZJWMZItH9rsuZzXQR0RA/view?usp=drive_link", "https://drive.google.com/file/d/17X2zyEFlujAmkebAUuNiHI-l_K2t9jZW/view?usp=drive_link", "https://drive.google.com/file/d/1nuZgmEdqjAuGN9CJzd3vkGumSF-RrwQS/view?usp=drive_link", "https://drive.google.com/file/d/1GmdPkiVv7YfwZao_uw6B2DJb3fuAzEIy/view?usp=drive_link", "https://drive.google.com/file/d/1-5z0UEDmpAeReaGxN9kRrxm5KSjoIeSD/view?usp=drive_link", "https://drive.google.com/file/d/1zHzrcfNl6vDfjElu8wiTMd2CBpYsLaUj/view?usp=drive_link", "https://drive.google.com/file/d/19mQJ1bPzE6kTslGtNCr79lRgWVOFJ1Xc/view?usp=drive_link", "https://drive.google.com/file/d/1WSenbnykCaQ78RiQCg5LWkKYiqvsFJim/view?usp=drive_link", "https://drive.google.com/file/d/1ZBah5r4EcMGNeflQ_l5RPNcyfVX0CRhw/view?usp=drive_link", "https://drive.google.com/file/d/1WbZhBA-vXiGoBy48xvVwM_c5x8KaAjKA/view?usp=drive_link", "https://drive.google.com/file/d/1BPE6GbfZ4qAOonwX51gFyxopcmGR2y4g/view?usp=drive_link", "https://drive.google.com/file/d/1WESg82w2F15TX03wAIIApNQf42MsBMLV/view?usp=drive_link", "https://drive.google.com/file/d/1urc7dkxLCCU72gmRKHoJ784y_5wL_UUl/view?usp=drive_link", "https://drive.google.com/file/d/10jfiURE4BgRZ1aLN9WH_sw3DNhJ9gR84/view?usp=drive_link", "https://drive.google.com/file/d/172e_Pe_hBX4s-PJCqQkhoVdALSuvb2_q/view?usp=drive_link", "https://drive.google.com/file/d/1Y4C3A8NWP4qI57JbOG6kTb4kdm-xzPWU/view?usp=drive_link", "https://drive.google.com/file/d/1NtsZKRjrh1ZUVe866pAT2skYEMK8O4xe/view?usp=drive_link", "https://drive.google.com/file/d/1ABsrn2OSsKoH7SKBsepsq5IgQAwubcBZ/view?usp=drive_link", "https://drive.google.com/file/d/1VKIY9ZM3ZqmH90v-4PLCmaNC3G6y5V7c/view?usp=drive_link", "https://drive.google.com/file/d/19qI_KBqQvta1vjKRhlydsKWILe3PRjGX/view?usp=drive_link", "https://drive.google.com/file/d/1HyowzSLbytIeiYeihec3zwxsT1RBApvK/view?usp=drive_link", "https://drive.google.com/file/d/1U18sbKJALHsqOcUb2FhQUswcAcEdp0AT/view?usp=drive_link", "https://drive.google.com/file/d/16a44liQcgChQK6oKl_p8Y_tfZIEvaonk/view?usp=drive_link", "https://drive.google.com/file/d/1b8ktz8CAeI_QBy_EbhxIzfoBflxsxME5/view?usp=drive_link", "https://drive.google.com/file/d/1l3q259-GjfWrdaswrAI1gvUZkjuQsPRM/view?usp=drive_link", "https://drive.google.com/file/d/1jf-N-kVWy6JPPTJQ-22tkYP1OFE6Z4Sf/view?usp=drive_link", "https://drive.google.com/file/d/1NGyqpsesI7EDCzdDKjhLhvv-b4C_N-X-/view?usp=drive_link", "https://drive.google.com/file/d/1XVJuggKW9W3pN4wKQd2xi24Kk0-tLXvI/view?usp=drive_link", "https://drive.google.com/file/d/1bu-Va5teeRI3KxMjWoFl77uthtVHJx1O/view?usp=drive_link", "https://drive.google.com/file/d/1T1sh0g2dZTysHOWsMQ-NokDins_9CybJ/view?usp=drive_link", "https://drive.google.com/file/d/1ogozL-alz20N9-lx564-nV6kUxRDj41X/view?usp=drive_link", "https://drive.google.com/file/d/1AKTN3B29KnBO8WbVSCQHamIm5m9i25X6/view?usp=drive_link", "https://drive.google.com/file/d/14oCQuzDcOYsNx1FNMb9q2_mouK_KTyS6/view?usp=drive_link", "https://drive.google.com/file/d/1Dz6SBJgX4LewZV0WOqIoeICvqncMjvvF/view?usp=drive_link", "https://drive.google.com/file/d/1kJWKxyLPN9WxJQEMD00h8b0neXbBv6o7/view?usp=drive_link", "https://drive.google.com/file/d/1PkDlBO1bARtzT_FPaOWCWP6XsLZWr0oE/view?usp=drive_link", "https://drive.google.com/file/d/1X8daLhr40-ao00JfYuwmUi0KY1QQOgIZ/view?usp=drive_link", "https://drive.google.com/file/d/10EgIIldSkKy8afpQncF0KVYpITIGWnYg/view?usp=drive_link", "https://drive.google.com/file/d/17t2kErmlh3GtoYrjxk8ZDL5d_KJpb3e6/view?usp=drive_link", "https://drive.google.com/file/d/1EsFp52la0th0YE3MOz0QQdj1SuaMvsim/view?usp=drive_link", "https://drive.google.com/file/d/1-k2G3wpXVPdRnXy789sySvKEqfHkasqY/view?usp=drive_link", "https://drive.google.com/file/d/1p1SWYAg3H7qyyv8YrKSKdBhSzOFndFk5/view?usp=drive_link", "https://drive.google.com/file/d/1UiXosBzbKxSFn4z4rQTLXLupGO-f9uEA/view?usp=drive_link", "https://drive.google.com/file/d/1Kry_9eabuK2jH-GrAeSWu8xqU-dWAL02/view?usp=drive_link", "https://drive.google.com/file/d/1spnl0OHQmj_oTFl9pX5w8lGCXihNePAM/view?usp=drive_link", "https://drive.google.com/file/d/1J1yHTEgNocaldV7O2Zf7oqwUG6sR0Nrq/view?usp=drive_link", "https://drive.google.com/file/d/1VbDKwkbG2AO6y4NYxh_IEwBk3Dcw763s/view?usp=drive_link", "https://drive.google.com/file/d/1uDXS-huDRGk63Os2oSBJ-vzYgPVYTdV0/view?usp=drive_link", "https://drive.google.com/file/d/1n32Vxdk8YWDSpHR6tKRqyrnnuXPjQMkM/view?usp=drive_link", "https://drive.google.com/file/d/15c_VDKDYW4HEEf_ETUjwVQntrjE_YDl9/view?usp=drive_link", "https://drive.google.com/file/d/1OVnthzHItRQd3K31c_WAxllsMP7dR7Vr/view?usp=drive_link", "https://drive.google.com/file/d/1t3dCRf5KVZD-ABx--lFsZ2v-frg-2Mrv/view?usp=drive_link", "https://drive.google.com/file/d/17aEsMzaiNUu983UzEErkDEWitSdahykD/view?usp=drive_link", "https://drive.google.com/file/d/1PXqfJJC7OqIhRHZwrq72nQJ_DtYvqh8k/view?usp=drive_link", "https://drive.google.com/file/d/1e3o6AWNmyJ2GqmzgAjdOpZTnII8lrmnf/view?usp=drive_link", "https://drive.google.com/file/d/1k6waLUxAjWXYPUga7VO84V73m23JUHO3/view?usp=drive_link", "https://drive.google.com/file/d/1zigcZM8Dg-BiZEn4D0mQADesi_nxTQBe/view?usp=drive_link", "https://drive.google.com/file/d/1SoQPMl2fKvCEFgU0k6JDSuauSJ-HII2z/view?usp=drive_link", "https://drive.google.com/file/d/1NxH5TFAlLX0TD3IsNw0DKj6G2bwYx5M-/view?usp=drive_link", "https://drive.google.com/file/d/19nly3A2xR2-5kBLcuf3uoA7Be2CvvgwT/view?usp=drive_link", "https://drive.google.com/file/d/1NbDIRF2KOdn4dWEISsJBWi8VCJuMHetM/view?usp=drive_link", "https://drive.google.com/file/d/1CrsV4tsva-M3164CU_lyrGEQoh_LVGh-/view?usp=drive_link", "https://drive.google.com/file/d/1ae08dTuYZjPKageTdVmGWMjXVlTkQtzV/view?usp=drive_link", "https://drive.google.com/file/d/1ECRDa1LgN7Hb9G5stVZ_mQ2_eg46IBSk/view?usp=drive_link", "https://drive.google.com/file/d/1aFX_7aC7TCIX2STYw5waa-XP4-1DGkik/view?usp=drive_link", "https://drive.google.com/file/d/12fbLnxlryzFvjUQTYr-wgHXqXvL2S438/view?usp=drive_link", "https://drive.google.com/file/d/1x7a0MUEaWnQVj141jdN3lTUX-u0_po-w/view?usp=drive_link", "https://drive.google.com/file/d/1RjPIKHMxvrSE4VzA-UClUgJyfBFu8Oia/view?usp=drive_link", "https://drive.google.com/file/d/1AUCVA9OtQDB1qpAZdpWtaZHIRLd_1WF7/view?usp=drive_link", "https://drive.google.com/file/d/19rCTyzTORnMlP1wKOVt4C0LeGO3loxfi/view?usp=drive_link", "https://drive.google.com/file/d/1KjjMS2GvuXnhplugR6e0Kn_Ul6WWcSwg/view?usp=drive_link", "https://drive.google.com/file/d/1xgYIB7Jc8DrgsD-4SJKDyFrFVhVDrd6j/view?usp=drive_link", "https://drive.google.com/file/d/1hhX5G3bHWJaZhQJjIHgNgjlCzZU1-EXw/view?usp=drive_link", "https://drive.google.com/file/d/1Ta-ZI1Sw0W37DWOPi26OxZVczqa47FoK/view?usp=drive_link", "https://drive.google.com/file/d/1Xz-OzgDzVqQdWtQtVanpmZDLdAGzbIFZ/view?usp=drive_link", "https://drive.google.com/file/d/1apsjYKt1YNPB-wlYM2uHLBc4g3gwxZUQ/view?usp=drive_link", "https://drive.google.com/file/d/1muwYZDIw2_Bfgwhwo969Cz0vp-1Kbceq/view?usp=drive_link", "https://drive.google.com/file/d/1VFDtXiibR7OzJG8V2PtQH-LGDECJv5DY/view?usp=drive_link", "https://drive.google.com/file/d/1LiuJEAPMC9nSFk0raYMA1o-Amiif95uM/view?usp=drive_link", "https://drive.google.com/file/d/1dWHtOB5ANkkfSjy4gpE7sCjpKEDI-ybf/view?usp=drive_link", "https://drive.google.com/file/d/1oAIYU6WaonP-FPzSwOYJWxlOpN7GT-Ki/view?usp=drive_link", "https://drive.google.com/file/d/1G0J5Sb8x2mx0omWS_ZUgSBgq2k7S2aGn/view?usp=drive_link", "https://drive.google.com/file/d/1uCpQzBfTPxNOmrvg5OknvbFQSDcmmWq1/view?usp=drive_link", "https://drive.google.com/file/d/1B3jzvzdISxV3zfydn6S1-P_256F8I5zg/view?usp=drive_link", "https://drive.google.com/file/d/1JQ1N5CJABYslaNpPXVxJgOGKT1k8zYDs/view?usp=drive_link", "https://drive.google.com/file/d/1X98Iiy3VQ8ImWs1SDxHJ2oqP58T5TtX9/view?usp=drive_link", "https://drive.google.com/file/d/1McUWXKMenPbkDrN9o6w7m9w_stN-yxUP/view?usp=drive_link", "https://drive.google.com/file/d/1EodELbT3H8GDgPqDqKy9f_YbHT4DRcAf/view?usp=drive_link", "https://drive.google.com/file/d/1_sKVOs4gXIiYHXCoe2oc5rMwPJgrMd9V/view?usp=drive_link", "https://drive.google.com/file/d/1zfu8KIFTO13fQ-QiFzQz9eSh5S-19pXt/view?usp=drive_link", "https://drive.google.com/file/d/1-NXU_wPnMmbh5YjJ_zHic9mufs_cfTPn/view?usp=drive_link", "https://drive.google.com/file/d/1kJ575uGSgJ6ilnwXYqN9LgKnm_Pk7eA-/view?usp=drive_link", "https://drive.google.com/file/d/15b2NWUT1HwT0VVqmpdh8qfm0kbEW3Jd_/view?usp=drive_link", "https://drive.google.com/file/d/1ntSLnWFyvDeb6ryaqLxfZTN6zAYVWGM7/view?usp=drive_link", "https://drive.google.com/file/d/14b4TdyjgSRglEnfdKvgm208-4M12DlIp/view?usp=drive_link", "https://drive.google.com/file/d/1dZSKc3L1dtCZt6K_TEaYHiNl9W3z8LLi/view?usp=drive_link", "https://drive.google.com/file/d/1Go9VgUhpeE1ddFwjJUBxEj-EOJC_lnQU/view?usp=drive_link", "https://drive.google.com/file/d/1hFjsX9P7c1_mtGmfXtR5Av_vtLGqrrWq/view?usp=drive_link", "https://drive.google.com/file/d/1OQvs8juu5cKyiggR_MfEeZVG9OpOdLJt/view?usp=drive_link", "https://drive.google.com/file/d/1Ty_oJYCeGrV0-b9p2ic14upoCWuK_Pfb/view?usp=drive_link", "https://drive.google.com/file/d/183TUO8DqW1EZWHDSEmRI1RWQRE6qZHBL/view?usp=drive_link", "https://drive.google.com/file/d/1n-eGQM2d5XA0NXiR7lEDARv1y8fJ9ihl/view?usp=drive_link", "https://drive.google.com/file/d/1H2nJgIXXtutJlIv_K5KZEdH9oWnjGlR5/view?usp=drive_link", "https://drive.google.com/file/d/1Ip4SROBCqBdqzYoHgz4KPWY8vJ8rgz9v/view?usp=drive_link", "https://drive.google.com/file/d/1amseoRi83BZpnXTwXEAMPU_fJIqlpStD/view?usp=drive_link", "https://drive.google.com/file/d/1Vc3ZWYhxxLTef1nPutAm3n6k5XOEENDT/view?usp=drive_link", "https://drive.google.com/file/d/17tJZ5JchRcBAKBcJL2HGf7wgbZcv21ja/view?usp=drive_link", "https://drive.google.com/file/d/1XRBmFbs7M3-rpCKvCNzlM4p4U9u49b5B/view?usp=drive_link", "https://drive.google.com/file/d/1x8Z_PlP0ddY4ZcnJAdUnWCA2rW3zK-0p/view?usp=drive_link", "https://drive.google.com/file/d/1Bg-xOu3e97C0uKO1ugROhvUOudmpLE2r/view?usp=drive_link", "https://drive.google.com/file/d/1yWjOutrcqyNLkLmWtN-PLtAIaAsYPP3A/view?usp=drive_link", "https://drive.google.com/file/d/1st-ghmZs7tPx2xEseiiuuUNwvkywaOz3/view?usp=drive_link", "https://drive.google.com/file/d/1A7-n-hY8byCmVWvSMxfXeCh3j12IENud/view?usp=drive_link", "https://drive.google.com/file/d/1vs51D12NJCDz5rO8d0sQaN6sQdeD4o6-/view?usp=drive_link", "https://drive.google.com/file/d/1l0QDi0tmlCCrKEa8lbEBWrMMWYF7OxZI/view?usp=drive_link", "https://drive.google.com/file/d/1hsxeBtwXFrGS_kp5_XT9wOSU3WF4DakU/view?usp=drive_link", "https://drive.google.com/file/d/1tvJjKo7C-ZJfkeGzCk62wAPksTzoDqGP/view?usp=drive_link", "https://drive.google.com/file/d/17Vq1H64-I9a7FmGoPNlwZO-TlNZtaevQ/view?usp=drive_link", "https://drive.google.com/file/d/15D2RxQT4wN2Hzrq-uhhkpAxQbVbujVBE/view?usp=drive_link", "https://drive.google.com/file/d/1Brl9dxxx50K3njju8BeQU1iHNWhf6cHR/view?usp=drive_link", "https://drive.google.com/file/d/13lvwO_k3H2IQVydTiTnKUJx9Lv5XLgu3/view?usp=drive_link", "https://drive.google.com/file/d/1AaLJ5bSiFDX8g-DW_YVCbhFpphF8GXxs/view?usp=drive_link", "https://drive.google.com/file/d/1AVqxpztNGwRVovIaH671WuZ0AinVU4tM/view?usp=drive_link", "https://drive.google.com/file/d/1iBu6eJ-m0UgIqXGLsYN1auBv9SMulT6m/view?usp=drive_link", "https://drive.google.com/file/d/1XdMOHaRAa6yXR5y46DIaXNteSLtbQ_q6/view?usp=drive_link", "https://drive.google.com/file/d/1z1QZAoxojhRztOPF4UjVRVLG0Wj5NK9K/view?usp=drive_link", "https://drive.google.com/file/d/17kF6fxIktn1lV-B1fylpgRB29TKsrk_r/view?usp=drive_link", "https://drive.google.com/file/d/1jafwBRl4UhLVa3Gi00qSRHV5jbJwm9IO/view?usp=drive_link", "https://drive.google.com/file/d/1zmExCwKMqy_YdZHEUAzE1TTcdZ1oMGLr/view?usp=drive_link", "https://drive.google.com/file/d/1z3go7j7KR3_TIlY7y49wNTIn-romRSjy/view?usp=drive_link", "https://drive.google.com/file/d/1CIO5s_dX7yk7OGgIOR_qARJxEuMzkZrC/view?usp=drive_link", "https://drive.google.com/file/d/14OzGOsN3P8dcN9hbyeqxnMAEZQN-0VaV/view?usp=drive_link", "https://drive.google.com/file/d/1mKD1Rbiy8d18YVIm5NZ6dFtN9kuHqlJD/view?usp=drive_link", "https://drive.google.com/file/d/1EAxfitMsJLu3FapQoW7CMhpNBwZOfZO6/view?usp=drive_link", "https://drive.google.com/file/d/1zILQ7pzz-FbteqQMA66IXaULNnie5Hp9/view?usp=drive_link", "https://drive.google.com/file/d/1WgKfxxII7KyktbzMPqdccJyiKk2Bs2KS/view?usp=drive_link", "https://drive.google.com/file/d/1wuUoeoavNe1GtZAxV9MkwML5Adolu5Gg/view?usp=drive_link", "https://drive.google.com/file/d/110YSBRU19KmdqpXZaazVeb8TcVx3t1AN/view?usp=drive_link", "https://drive.google.com/file/d/1x9X6rBQLvgOUlWXgtetuiDBoUmgfvHUW/view?usp=drive_link", "https://drive.google.com/file/d/13PI4zf3UozO71GJ2Wydm1foL4gT31ZNF/view?usp=drive_link", "https://drive.google.com/file/d/1F8XV4Pcwu6FA-6nnoYVhgo8Un0hxL6nM/view?usp=drive_link", "https://drive.google.com/file/d/1xqb_RTt1nKIqPlO2RMdT8pRLqFK_dPBH/view?usp=drive_link", "https://drive.google.com/file/d/1tFgSB79xJyi-ICISPqSk1oUjyvo-_Zcb/view?usp=drive_link", "https://drive.google.com/file/d/1t9e-Y4bqTtZzfh8mN-2gIMhobDZXggMX/view?usp=drive_link", "https://drive.google.com/file/d/14BUpTs-ujb9fpeoBrO1VTQpbSFFQkjaT/view?usp=drive_link", "https://drive.google.com/file/d/1sUGVR68JpoyNnQN6CDRyqghhawRO_UXg/view?usp=drive_link", "https://drive.google.com/file/d/1OMb8ZSDfN1TmEwXSMCylwCQapNyxJPyb/view?usp=drive_link", "https://drive.google.com/file/d/1y8DCLY3ZewMdCFOD8iEMui8bs1CJsDrW/view?usp=drive_link", "https://drive.google.com/file/d/1vTAfmkJ6bBGpFZfVMZwAe1t9R6MfBcrt/view?usp=drive_link", "https://drive.google.com/file/d/12os7F0QvPP2K_qZattQGVQSZ6ED_Kwcv/view?usp=drive_link", "https://drive.google.com/file/d/1WsG1NqAUO3x9U-Rja2AZFn_lnCg5ZOTx/view?usp=drive_link", "https://drive.google.com/file/d/14adZ6n3QoadbN638UM5Ok-BZOqdSTm47/view?usp=drive_link", "https://drive.google.com/file/d/14FSfVSSdIlvaHAFSaZArjF0APNQi6tlN/view?usp=drive_link", "https://drive.google.com/file/d/15CjwDwEddTJd9Q_MU3bIkMqVQmeAh-iE/view?usp=drive_link", "https://drive.google.com/file/d/1UCqOLchTBZNK7YC--kSXo5I7hjO-D4Di/view?usp=drive_link", "https://drive.google.com/file/d/1UYr8z6au6EtrveugJS_h_nclh5hHmLWY/view?usp=drive_link", "https://drive.google.com/file/d/16ivs7JgfXVJm-fI1fMZQE7z__MSNPweH/view?usp=drive_link", "https://drive.google.com/file/d/1nNtFliRydIA_w3yq9O0NnaTdItdX6wVI/view?usp=drive_link", "https://drive.google.com/file/d/18dYuFM2elxu8opRcwIBzdEsoLAowtGos/view?usp=drive_link", "https://drive.google.com/file/d/1paoz0hphsLMvqaLVNbdAu5WSYNxAEtzK/view?usp=drive_link", "https://drive.google.com/file/d/1ZkX8YSbBBZb2x8BA7B-NLyBibrW0X8ip/view?usp=drive_link", "https://drive.google.com/file/d/1lU9XH2imegfS1t5G67ZMW9gKke49IxBH/view?usp=drive_link", "https://drive.google.com/file/d/1n3VN4Ym3yCDkHSXWZpn4D0CwXUogF9Dm/view?usp=drive_link", "https://drive.google.com/file/d/1C8e4RP18kCVLUV729X3x4JtXiyursgJm/view?usp=drive_link", "https://drive.google.com/file/d/1uDTuzMwvvZ-b4LimmsLD1lRvwA2_PwbP/view?usp=drive_link", "https://drive.google.com/file/d/1paiuNFoVAG8r0QSR3NAny110YevS6IpY/view?usp=drive_link", "https://drive.google.com/file/d/10FeSaLOLXiH-NM-g_oiEdQ9RmA8a7cji/view?usp=drive_link", "https://drive.google.com/file/d/1TtOBcdF4Y6L1xcHUFkOH8OA9tpS1KQOD/view?usp=drive_link", "https://drive.google.com/file/d/18UqLeFcpkBHxx9c3r7LDEwVWLk48qeoV/view?usp=drive_link", "https://drive.google.com/file/d/1E6PaPT8jdL4QqE360G0nI8UJjvBfSCO6/view?usp=drive_link", "https://drive.google.com/file/d/1LJOO7qFXuto2E6DS0SJtwOynyfCLlL2C/view?usp=drive_link", "https://drive.google.com/file/d/1bbXIBn7eyHHqm7wGybKLH8Yyt_aTwjYt/view?usp=drive_link", "https://drive.google.com/file/d/1TNeEZ9AfeHAPloc8z3nm8JcBXBWk_9dP/view?usp=drive_link", "https://drive.google.com/file/d/1Xnnl6xGBTPg5uSl-hmQY5OZWmB6dj9n2/view?usp=drive_link", "https://drive.google.com/file/d/1nEloxH4soDxgIlZ3k2RSisrDXd12E2TX/view?usp=drive_link", "https://drive.google.com/file/d/1oh2UDgxRCCr4IUlHPVRZ03nISd2_390v/view?usp=drive_link", "https://drive.google.com/file/d/18jtX6042QaC3LUt6NIGmjtU7GyZZM2AY/view?usp=drive_link", "https://drive.google.com/file/d/1n_slGz7GoI1Jw6Oos4HAjEOYKTRnwbaP/view?usp=drive_link", "https://drive.google.com/file/d/1-8JSFm3P9e38ayoha6hq9oZH1ncVVCw-/view?usp=drive_link", "https://drive.google.com/file/d/1doZxFysJhsk8BFS5HRqmFBC5-2QYlAnk/view?usp=drive_link", "https://drive.google.com/file/d/1C0y_DAJDLEA1v61nAWqGJa8I1LxrJ4aM/view?usp=drive_link", "https://drive.google.com/file/d/1MsJe-hQ5rnx-_0WgrDO-bc-vDp5lffnM/view?usp=drive_link", "https://drive.google.com/file/d/1dItAoCJPDm2YTAQVvsW2MYEfhvQVKUiH/view?usp=drive_link", "https://drive.google.com/file/d/1nVvROHtI4AYWw9Q_KEcRgRcK6J-X_d-x/view?usp=drive_link", "https://drive.google.com/file/d/1ffuYuHYqdVprt4ticasFZzPlhrJ4-77-/view?usp=drive_link", "https://drive.google.com/file/d/1tSSN1Hxk31PbfP404YF1o-W4MJ2T20aP/view?usp=drive_link", "https://drive.google.com/file/d/1sOYFXWrDmNgCmSd9Md6g63Vc3mKAc7hT/view?usp=drive_link", "https://drive.google.com/file/d/1TnFndwlKbgj1OLOqQF33ZIe4MXCt1L6y/view?usp=drive_link", "https://drive.google.com/file/d/16DX9Y6aaGN_v8FCl99vsoTOqJp160ng0/view?usp=drive_link", "https://drive.google.com/file/d/1SnVPJBEMiL8oPgaXiQpPy5VFg7ouO_j_/view?usp=drive_link", "https://drive.google.com/file/d/1WXSOh7huL_YmAq-73Yottb8dqsOa29VB/view?usp=drive_link", "https://drive.google.com/file/d/1ROwZwX9DwgDAg8adZCTzFwfW9bjfZktt/view?usp=drive_link", "https://drive.google.com/file/d/1jxvhwbXroy9ggs6K5e-UREmKbZyCvuW9/view?usp=drive_link", "https://drive.google.com/file/d/1anZfxOKnGzdMJInoqSvR-dyrFRWE9ix_/view?usp=drive_link", "https://drive.google.com/file/d/1pYDbWUf2KXRYu3MBcWLUVLFh5--cPrUp/view?usp=drive_link", "https://drive.google.com/file/d/1wPO20BPkBaE3aTEO7yRqkOC-UTAZkshs/view?usp=drive_link", "https://drive.google.com/file/d/1FlUM5kKltGrOJVI53x6zY2CP9qm5WIPA/view?usp=drive_link", "https://drive.google.com/file/d/1QFWkE_cPO7soOep7LrV32nO0wkQ74Duk/view?usp=drive_link", "https://drive.google.com/file/d/1q10kNmiL5SCp_w9HiaQ7ypm7BZhCzylC/view?usp=drive_link", "https://drive.google.com/file/d/1BMyu2sShBsWMqWFZb__dyrSnE5G3C2oU/view?usp=drive_link", "https://drive.google.com/file/d/1OuRsPHvbdqXkHZbPG_jjBlzAPloc7vDH/view?usp=drive_link", "https://drive.google.com/file/d/1pubaESCv_Bf7MxWK0_gKnRUuPqiNHujd/view?usp=drive_link", "https://drive.google.com/file/d/1wPscn8mM2xY3pDNxYLUIoNzcXVEA38SV/view?usp=drive_link", "https://drive.google.com/file/d/16RRFmYTuusAworkYOFcFHwmkp-sejcj0/view?usp=drive_link", "https://drive.google.com/file/d/1hyWCRH8VcZJ6TAuYeZtZswMNKt9lxYMd/view?usp=drive_link", "https://drive.google.com/file/d/1g5utUZH7E3uJpkrsWwfvioW13K-8B2ei/view?usp=drive_link", "https://drive.google.com/file/d/1zPaK6x-VaEiKyrDRLowKP-oXNnd7mgKY/view?usp=drive_link", "https://drive.google.com/file/d/1NZHgrMIXU0EOXFVzYhBE6Oaz4x1UTxeQ/view?usp=drive_link", "https://drive.google.com/file/d/1EarvOry4ozquje2M2XMcs_vK726anzqA/view?usp=drive_link", "https://drive.google.com/file/d/15D-RBXnsztOsbgCzrVG0i3Ux_OTrH4Tq/view?usp=drive_link", "https://drive.google.com/file/d/1SXaX83XP3G-6uKnuuYUs6THAS__xSGA5/view?usp=drive_link", "https://drive.google.com/file/d/1frw6w-FkxH3tCmKIqTZF9DtJc85FxydY/view?usp=drive_link", "https://drive.google.com/file/d/1P_b0lWwGf2xAk9fi7z1k7hhQNzWo3GL2/view?usp=drive_link", "https://drive.google.com/file/d/1A1flKI97v_n3jMKIRz2v6zz0lVeJ9nP_/view?usp=drive_link", "https://drive.google.com/file/d/1u2-qlZSF7i01AtzEnJTBZj4SZlElga1V/view?usp=drive_link", "https://drive.google.com/file/d/1se_q_DKYg1uj3RgnyAKX6hrdEOAsWSSg/view?usp=drive_link", "https://drive.google.com/file/d/1Ova1ZWf91uiOTSjSZGanv6TJznZO4Tsx/view?usp=drive_link", "https://drive.google.com/file/d/16Eb1N6kLeTqL3u_op7bw561Z3TO94_za/view?usp=drive_link", "https://drive.google.com/file/d/1x5kNe0wozlXRGM3CumWz8g1xhM2cKyoo/view?usp=drive_link", "https://drive.google.com/file/d/1mgK2G7VS4BmO5w845WV_PD1hkQKzld-i/view?usp=drive_link", "https://drive.google.com/file/d/1Fga67xxcG8kAKPDwDL9QqL4dw-HU-3tE/view?usp=drive_link", "https://drive.google.com/file/d/19Ih5OrMRcp4mJXtuYEWDaXwV078gWvBn/view?usp=drive_link", "https://drive.google.com/file/d/1dCQxH85kCYWjZySPR6hmPlC343KV66ZZ/view?usp=drive_link", "https://drive.google.com/file/d/1NMafc4x0exTCRX69w-gF3aL2FC_yE2Tu/view?usp=drive_link", "https://drive.google.com/file/d/1i-6XtZIsiThF3GtxOXyPLAgLr5wQPiy8/view?usp=drive_link", "https://drive.google.com/file/d/1FvXbxJFr7cNQYTiV6lkHXvZVRRR4sruX/view?usp=drive_link", "https://drive.google.com/file/d/1NZqWOHIXanK3xwEGuMbQldgBRvDwPSbP/view?usp=drive_link", "https://drive.google.com/file/d/1nmfQjvLjZbC-YuHeJNXYpKhfCJoniCS6/view?usp=drive_link", "https://drive.google.com/file/d/1sR8iwKYiDYeDuKZYhGXnoNakwuXl4O-r/view?usp=drive_link", "https://drive.google.com/file/d/1NvIAPRRfRVhRXCrKYOFDv8dwMhsYv1M5/view?usp=drive_link", "https://drive.google.com/file/d/1mHfeg106Fc8C-hdjpBDsorxGK5QLrqZi/view?usp=drive_link", "https://drive.google.com/file/d/1TTQCGFDvijf8G3ltYbJMHoNkSMPMdSRw/view?usp=drive_link", "https://drive.google.com/file/d/1LsNlUNxhWBacILiezcJwxHircN_L57YC/view?usp=drive_link", "https://drive.google.com/file/d/1OqJXCrORN00y4ue8WqZP63rh52E5XPO8/view?usp=drive_link", "https://drive.google.com/file/d/1eMecS-HKWQPOLnS6pbI_HohPwZZIMlHl/view?usp=drive_link", "https://drive.google.com/file/d/1ASNKNNDAMQoHo3kCKxzpaskYSwqfLAGH/view?usp=drive_link", "https://drive.google.com/file/d/1eU7iAv9f6KT_GM1_9R0dBxon91PuPMBa/view?usp=drive_link", "https://drive.google.com/file/d/1BfJxXVaehHsKfkzq0xQ2eksLh1AdG7gJ/view?usp=drive_link", "https://drive.google.com/file/d/1slMjqAuNzyKK2N6WP1sD44DHgd_LLt4K/view?usp=drive_link", "https://drive.google.com/file/d/1FSoZ00Xcc5XeCtQD9Nk0h6Nbd9uFBYUp/view?usp=drive_link", "https://drive.google.com/file/d/1xXtfZ_Q8FC3F-KUeWfXLIQnlgFOU-i1z/view?usp=drive_link", "https://drive.google.com/file/d/1jHzvAm1w8tsOHT0GDa3_Fs1Pi2LJSz1r/view?usp=drive_link", "https://drive.google.com/file/d/1E9LQaZccaYfO431nHi6zXPRTMfaBfU-M/view?usp=drive_link", "https://drive.google.com/file/d/1i31y5kGaZjvtma241FYZ46ofRf8J5PMi/view?usp=drive_link", "https://drive.google.com/file/d/15q_2hnJxj_dJqfnnazp4FePN7utWXs1M/view?usp=drive_link", "https://drive.google.com/file/d/1ou4yT9ThJJAiPBwJgMd94pv2K02z19Qx/view?usp=drive_link", "https://drive.google.com/file/d/1toco-eOiVyeQEskWAs9bUDuYq2-Kfxxw/view?usp=drive_link", "https://drive.google.com/file/d/10iDkDAP9_1Q4XJwzBmycXRt7nhyn1VvL/view?usp=drive_link", "https://drive.google.com/file/d/1fkvmaJuQKst99MD93SsDGErCmzPUsy0s/view?usp=drive_link", "https://drive.google.com/file/d/1Z__pNrqjv3B-XhB3Uek_sj8vRAW-ZXVq/view?usp=drive_link", "https://drive.google.com/file/d/1u6zUoHM5HLxwBdYloKeUNOJA9ZKdVfHf/view?usp=drive_link", "https://drive.google.com/file/d/1docUJ21VPjeS9rIQObY_DnVLBPmRwCdH/view?usp=drive_link", "https://drive.google.com/file/d/1h9eEm0oj0a1xHiWUh9iUxpxFQigAN3Br/view?usp=drive_link", "https://drive.google.com/file/d/1usIPwcqYCrWDYN4kT4boE5kGucceWaB7/view?usp=drive_link", "https://drive.google.com/file/d/1YnybX_PlzqA3EODHbrXc4ylSv_dMWsuM/view?usp=drive_link", "https://drive.google.com/file/d/1Y4S_JzNp1txpPw-aJ3dclw4AOg2HUSAp/view?usp=drive_link", "https://drive.google.com/file/d/1EyYa75sSPe-babGJMG4kS8ORGQ-3H8Dn/view?usp=drive_link", "https://drive.google.com/file/d/1cJqABLlkXNROqq8nqV3W6Td224k_AQbx/view?usp=drive_link", "https://drive.google.com/file/d/15WOfwdB3AM5z7kSioboBt0BgKb9cAOl5/view?usp=drive_link", "https://drive.google.com/file/d/1z9lP1RSm7fFj1SrIpIyaF_JxWhZn6vm1/view?usp=drive_link", "https://drive.google.com/file/d/1JIH1Z6t10Y72Q1FcxMsIjTla3Vk4JKHc/view?usp=drive_link", "https://drive.google.com/file/d/1m9abkKdvC5E-QM32KFA0v7PE-kFib81R/view?usp=drive_link", "https://drive.google.com/file/d/1Iyq3cELDqC-UeODisEQaYkE9lCyeBd6w/view?usp=drive_link", "https://drive.google.com/file/d/1GCbdFF0pfuMc9_O07fLLp-yRZ1D1mkQ4/view?usp=drive_link", "https://drive.google.com/file/d/172lJEJzjhCdsSzNUjic1ScSv4-yHWZ4Z/view?usp=drive_link", "https://drive.google.com/file/d/1WuYV94zyY5JcBHC95yAdQ8Fv0VW2kCi4/view?usp=drive_link", "https://drive.google.com/file/d/1tbH4SbyxnPgBVywkl0ly-4Qes6pVR4VS/view?usp=drive_link", "https://drive.google.com/file/d/15rIIb-gLoSzxWH9qbBl1KFg9pEYPmrqb/view?usp=drive_link", "https://drive.google.com/file/d/1obuQsljm6X2oghShpL-Ly52VOSyhoUz7/view?usp=drive_link", "https://drive.google.com/file/d/1vXpzgINbmwZE7otwbAJ1jBB8-UoJHsry/view?usp=drive_link", "https://drive.google.com/file/d/1YfwW9vmslG5CmU8fBt2GEk9m_Y8DpXKN/view?usp=drive_link", "https://drive.google.com/file/d/1Sgy4DA8BZ22e4Zkl2FutGGVedlSTgHaR/view?usp=drive_link", "https://drive.google.com/file/d/1GR5ex2fMX3F3plPsH9p0rkmeFsdp5b0K/view?usp=drive_link", "https://drive.google.com/file/d/1nqUYxeBpf5mwJOsdEv5OyFy6XLMGZwbO/view?usp=drive_link", "https://drive.google.com/file/d/1WZCvU3v3lyVOCJGXKCbimXmpJOky_P2P/view?usp=drive_link", "https://drive.google.com/file/d/1RjhAayWxG8hLP9oZDg1tog32NHKz5UKj/view?usp=drive_link", "https://drive.google.com/file/d/1RYGVM4oTZt-HVK9DwBKOg83y5wfV8PnI/view?usp=drive_link", "https://drive.google.com/file/d/1KdkKRIIin2Ln3ujaJ9asKvg4-9TLI2gi/view?usp=drive_link", "https://drive.google.com/file/d/1cYVsnF1TbY2k4ckLtLJmVHefcowbjq-R/view?usp=drive_link", "https://drive.google.com/file/d/11aWOII5XoJgOL7Pli_90_LCDHViaB70L/view?usp=drive_link", "https://drive.google.com/file/d/1Pn-F8BTEaxr-cf-ojzMfPzZvIC7w8_RI/view?usp=drive_link", "https://drive.google.com/file/d/1ejMZ0L7bQ6rBaq7o8Ro4iN65M_0lBThi/view?usp=drive_link", "https://drive.google.com/file/d/1br2hHrrFbqosI2kTZhHm39RISe-a9UQe/view?usp=drive_link", "https://drive.google.com/file/d/1Su3sJMvTWgc_Tl2JHInMjrKva6iMKflI/view?usp=drive_link", "https://drive.google.com/file/d/1NNH5N0hkWyveQlTbHVoBWiKBUOcc8i7a/view?usp=drive_link", "https://drive.google.com/file/d/1BPuandHpG0L0rMjaIQtO5v-reUZz3faW/view?usp=drive_link", "https://drive.google.com/file/d/1lOxe6wXipNrVlaKSnnsJbIONL6Uy-d8g/view?usp=drive_link", "https://drive.google.com/file/d/1kUQbdlun7envlUdoPUceRkj6I8ZgKeMp/view?usp=drive_link", "https://drive.google.com/file/d/1gSqgQ2l0rH2jnVz-ARSUw4-U3XantMkO/view?usp=drive_link", "https://drive.google.com/file/d/1V7dd-6XDNFMEIbN3VD22piZh9WZCcaOB/view?usp=drive_link", "https://drive.google.com/file/d/1IzgGN5rJeg3OsVRJ6hUAhuU71hxka7Ar/view?usp=drive_link", "https://drive.google.com/file/d/1BRnPEbTxmngMrcIrXo281IZxUd8nXZA9/view?usp=drive_link", "https://drive.google.com/file/d/1Zjw8UUng_K-HCUn7PL1yEeAdB-cmIbV6/view?usp=drive_link", "https://drive.google.com/file/d/12yTbrvBGzw8-oOsGB1lg9sNIQShEcWa8/view?usp=drive_link", "https://drive.google.com/file/d/1U-SXNthDWWouZTZOJs9goQi56K3JgnjB/view?usp=drive_link", "https://drive.google.com/file/d/1I94yYVlrFw-8tEdn2MDu2rq_HEVdwy-9/view?usp=drive_link", "https://drive.google.com/file/d/1ix0dXN-mrIL8j6rVcd74x-XnLiBt5QJp/view?usp=drive_link", "https://drive.google.com/file/d/1QKwTKws8-Z2LT6LmMTxf_Cwhpr5H-2-M/view?usp=drive_link", "https://drive.google.com/file/d/1deyrvKHB3NiJLIbOgKTMk8lzYjrMaiVS/view?usp=drive_link", "https://drive.google.com/file/d/1yEhbB1zHfjzcyYPL2nc0cG-M1YrT0nQY/view?usp=drive_link", "https://drive.google.com/file/d/1CbiHM6uDIPs4NcUo9URevEH2t-1UO2Iv/view?usp=drive_link", "https://drive.google.com/file/d/1n5ZfeLQMl6S4ioCLrxuuDZgIxAELba6S/view?usp=drive_link", "https://drive.google.com/file/d/1twK-7ijaK-lEbaO1ASaM4cqCaS-a8Lzx/view?usp=drive_link", "https://drive.google.com/file/d/1GjzScaq_hyUinN9F-_2HiwqsbkZuAmxv/view?usp=drive_link", "https://drive.google.com/file/d/17hEDmpHAMOH1W0TlbhYP-xEVCO2FZ_Dv/view?usp=drive_link", "https://drive.google.com/file/d/1nH55ggPRX9IAey6BTEpIt-tXGfFquCmO/view?usp=drive_link”'
|
2 |
import gradio as gr
|
3 |
import logging
|
4 |
import requests
|
|
|
7 |
from datetime import datetime
|
8 |
from typing import List, Optional, Tuple
|
9 |
from urllib.parse import urljoin, urlparse
|
10 |
+
import random
|
11 |
+
import nltk
|
12 |
+
from nltk.tokenize import sent_tokenize
|
13 |
+
import PyPDF2
|
14 |
+
from joblib import dump, load
|
15 |
|
16 |
from transformers import AutoTokenizer, AutoModelForCausalLM
|
17 |
from sentence_transformers import SentenceTransformer
|
18 |
from sklearn.metrics.pairwise import cosine_similarity
|
19 |
import numpy as np
|
20 |
from icalendar import Calendar
|
21 |
+
from requests.adapters import HTTPAdapter
|
22 |
+
from requests.packages.urllib3.util.retry import Retry
|
23 |
+
from fake_useragent import UserAgent
|
24 |
+
from concurrent.futures import ThreadPoolExecutor
|
25 |
|
26 |
# Configure logging
|
27 |
logging.basicConfig(
|
28 |
+
level=logging.INFO,
|
29 |
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
30 |
)
|
31 |
logger = logging.getLogger(__name__)
|
32 |
|
33 |
+
nltk.download('punkt')
|
34 |
+
|
35 |
class Config:
|
36 |
MODEL_NAME = "microsoft/DialoGPT-medium"
|
37 |
EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
|
|
|
51 |
def __str__(self):
|
52 |
return f"ResourceItem(type={self.type}, url={self.url}, content_length={len(self.content)})"
|
53 |
|
54 |
+
class RobustCrawler:
|
55 |
+
def __init__(self, max_retries=3, backoff_factor=0.3, proxies=None):
|
56 |
+
self.ua = UserAgent()
|
57 |
+
self.proxies = proxies or {}
|
58 |
+
self.session = self._create_robust_session(max_retries, backoff_factor)
|
59 |
+
|
60 |
+
def _create_robust_session(self, max_retries, backoff_factor):
|
61 |
+
session = requests.Session()
|
62 |
+
retry_strategy = Retry(
|
63 |
+
total=max_retries,
|
64 |
+
status_forcelist=[429, 500, 502, 503, 504],
|
65 |
+
method_whitelist=["HEAD", "GET", "OPTIONS"],
|
66 |
+
backoff_factor=backoff_factor,
|
67 |
+
raise_on_status=False
|
68 |
+
)
|
69 |
+
adapter = HTTPAdapter(max_retries=retry_strategy)
|
70 |
+
session.mount("https://", adapter)
|
71 |
+
session.mount("http://", adapter)
|
72 |
+
return session
|
73 |
+
|
74 |
+
def get_headers(self):
|
75 |
+
return {
|
76 |
+
"User-Agent": self.ua.random,
|
77 |
+
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
|
78 |
+
"Accept-Language": "en-US,en;q=0.5",
|
79 |
+
"Referer": "https://www.google.com/",
|
80 |
+
"DNT": "1",
|
81 |
+
"Connection": "keep-alive",
|
82 |
+
"Upgrade-Insecure-Requests": "1"
|
83 |
+
}
|
84 |
+
|
85 |
+
def crawl_with_exponential_backoff(self, url, timeout=10):
|
86 |
+
try:
|
87 |
+
time.sleep(random.uniform(0.5, 2.0))
|
88 |
+
proxy = random.choice(list(self.proxies.keys())) if self.proxies else None
|
89 |
+
response = self.session.get(
|
90 |
+
url,
|
91 |
+
headers=self.get_headers(),
|
92 |
+
timeout=timeout,
|
93 |
+
proxies={
|
94 |
+
'http': self.proxies.get(proxy),
|
95 |
+
'https': self.proxies.get(proxy)
|
96 |
+
} if proxy else None
|
97 |
+
)
|
98 |
+
response.raise_for_status()
|
99 |
+
return response
|
100 |
+
except requests.exceptions.RequestException as e:
|
101 |
+
logger.error(f"Crawling error for {url}: {e}")
|
102 |
+
return None
|
103 |
+
|
104 |
class SchoolChatbot:
|
105 |
def __init__(self):
|
106 |
self.setup_models()
|
107 |
+
self.resources = []
|
108 |
self.visited_urls = set()
|
109 |
self.crawl_and_index_resources()
|
110 |
|
111 |
def setup_models(self):
|
112 |
+
logger.info("Setting up models...")
|
113 |
+
self.tokenizer = AutoTokenizer.from_pretrained(Config.MODEL_NAME)
|
114 |
+
self.model = AutoModelForCausalLM.from_pretrained(Config.MODEL_NAME)
|
115 |
+
self.embedding_model = SentenceTransformer(Config.EMBEDDING_MODEL)
|
116 |
+
logger.info("Models setup completed successfully.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
|
118 |
def crawl_and_index_resources(self):
|
119 |
logger.info("Starting to crawl and index resources...")
|
120 |
+
with ThreadPoolExecutor(max_workers=5) as executor:
|
121 |
+
for url in Config.INDEXED_URLS:
|
122 |
+
executor.submit(self.crawl_url, url, 0)
|
123 |
logger.info("Crawling and indexing completed.")
|
124 |
|
125 |
+
def crawl_url(self, url, depth):
|
126 |
if depth > Config.MAX_DEPTH or url in self.visited_urls:
|
127 |
return
|
128 |
self.visited_urls.add(url)
|
129 |
+
crawler = RobustCrawler(proxies={
|
130 |
+
'proxy1': 'http://proxy1.example.com:8080',
|
131 |
+
'proxy2': 'http://proxy2.example.com:8080'
|
132 |
+
})
|
133 |
+
response = crawler.crawl_with_exponential_backoff(url)
|
134 |
+
if not response:
|
135 |
+
logger.warning(f"Failed to retrieve {url}")
|
136 |
+
return
|
137 |
+
content_type = response.headers.get("Content-Type", "").lower()
|
138 |
+
if "text/calendar" in content_type or url.endswith(".ics"):
|
139 |
+
self.extract_ics_content(url, response.text)
|
140 |
+
elif "text/html" in content_type:
|
141 |
+
soup = BeautifulSoup(response.content, 'html.parser')
|
142 |
+
self.extract_page_content(url, soup)
|
143 |
+
if depth < Config.MAX_DEPTH:
|
144 |
+
for link in soup.find_all('a', href=True):
|
145 |
+
full_url = urljoin(url, link['href'])
|
146 |
+
if self.is_valid_url(full_url):
|
147 |
+
time.sleep(random.uniform(0.5, 2.0))
|
148 |
+
self.crawl_url(full_url, depth + 1)
|
149 |
+
elif "application/pdf" in content_type:
|
150 |
+
self.extract_pdf_content(url, response.content)
|
151 |
+
else:
|
152 |
+
logger.warning(f"Unrecognized content-type ({content_type}). Storing as raw.")
|
153 |
+
self.store_resource(url, response.text, 'unknown')
|
154 |
|
155 |
+
def extract_ics_content(self, url, ics_text):
|
156 |
try:
|
157 |
cal = Calendar.from_ical(ics_text)
|
158 |
events = []
|
|
|
166 |
if events:
|
167 |
combined_text = "\n".join(events)
|
168 |
self.store_resource(url, combined_text, 'calendar')
|
|
|
|
|
|
|
169 |
except Exception as e:
|
170 |
logger.error(f"Error parsing ICS from {url}: {e}")
|
171 |
|
172 |
+
def extract_page_content(self, url, soup):
|
173 |
+
content_sections = []
|
174 |
+
for tag in soup.find_all(['main', 'article', 'section']):
|
175 |
+
text_found = tag.get_text(strip=True)
|
176 |
+
if text_found:
|
177 |
+
content_sections.append(text_found)
|
178 |
+
for heading in soup.find_all(['h1', 'h2', 'h3']):
|
179 |
+
section_content = [heading.get_text(strip=True)]
|
180 |
+
next_elem = heading.find_next_sibling()
|
181 |
+
while next_elem and next_elem.name in ['p', 'ul', 'ol']:
|
182 |
+
section_content.append(next_elem.get_text(strip=True))
|
183 |
+
next_elem = next_elem.find_next_sibling()
|
184 |
+
if section_content:
|
185 |
+
content_sections.append(' '.join(section_content))
|
186 |
+
if content_sections:
|
187 |
+
full_content = ' '.join(content_sections)
|
188 |
+
self.store_resource(url, full_content, 'webpage')
|
189 |
+
|
190 |
+
def extract_pdf_content(self, url, pdf_content):
|
191 |
+
try:
|
192 |
+
pdf_reader = PyPDF2.PdfFileReader(pdf_content)
|
193 |
+
text = ''
|
194 |
+
for page in range(pdf_reader.getNumPages()):
|
195 |
+
text += pdf_reader.getPage(page).extractText()
|
196 |
+
if text:
|
197 |
+
self.store_resource(url, text, 'pdf')
|
198 |
+
except Exception as e:
|
199 |
+
logger.error(f"Error extracting PDF content from {url}: {e}")
|
200 |
+
|
201 |
+
def store_resource(self, url, text_data, resource_type):
|
202 |
try:
|
203 |
+
text_chunks = [text_data[i:i+512] for i in range(0, len(text_data), 512)]
|
204 |
+
embeddings = [self.embedding_model.encode(chunk) for chunk in text_chunks]
|
205 |
+
average_embedding = np.mean(embeddings, axis=0)
|
206 |
+
item = ResourceItem(url, text_data, resource_type)
|
207 |
+
item.embedding = average_embedding
|
208 |
+
self.resources.append(item)
|
209 |
+
logger.debug(f"Stored resource: {url} (type={resource_type}). Total resources: {len(self.resources)}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
210 |
except Exception as e:
|
211 |
+
logger.error(f"Error storing resource {url}: {e}")
|
212 |
+
|
213 |
+
def is_valid_url(self, url):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
214 |
parsed = urlparse(url)
|
215 |
return bool(parsed.scheme) and bool(parsed.netloc)
|
216 |
|
217 |
+
def find_best_matching_resource(self, query):
|
218 |
if not self.resources:
|
219 |
return None, -1.0
|
220 |
query_embedding = self.embedding_model.encode(query)
|
|
|
227 |
best_resource = resource
|
228 |
return best_resource, best_score
|
229 |
|
230 |
+
def extract_relevant_snippet(self, content, query):
|
231 |
+
sentences = sent_tokenize(content)
|
232 |
query_embedding = self.embedding_model.encode(query)
|
233 |
sentence_embeddings = self.embedding_model.encode(sentences)
|
234 |
similarities = cosine_similarity([query_embedding], sentence_embeddings)[0]
|
235 |
best_idx = np.argmax(similarities)
|
236 |
+
start_idx = max(0, best_idx - 1)
|
237 |
+
end_idx = min(len(sentences), best_idx + 2)
|
238 |
+
snippet = ' '.join(sentences[start_idx:end_idx])
|
239 |
return snippet
|
240 |
|
241 |
+
def generate_response(self, user_input):
|
|
|
|
|
242 |
best_resource, similarity_score = self.find_best_matching_resource(user_input)
|
243 |
if best_resource is None or similarity_score < Config.SIMILARITY_THRESHOLD:
|
244 |
return "Great question! According to my resources, I couldn't find a direct answer. Please rephrase your query or contact support for more information."
|
245 |
snippet = self.extract_relevant_snippet(best_resource.content, user_input)
|
|
|
246 |
conversation_history = f"User: {user_input}\nAssistant: {snippet}"
|
|
|
247 |
new_user_input_ids = self.tokenizer.encode(conversation_history + self.tokenizer.eos_token, return_tensors='pt')
|
|
|
248 |
chat_history_ids = self.model.generate(new_user_input_ids, max_length=Config.MAX_TOKENS, pad_token_id=self.tokenizer.eos_token_id)
|
249 |
response = self.tokenizer.decode(chat_history_ids[:, new_user_input_ids.shape[-1]:][0], skip_special_tokens=True)
|
|
|
250 |
return f"Great question! According to my resources, {response}. For more details, see the answer in full context here: {best_resource.url}"
|
251 |
|
252 |
+
def create_gradio_interface(chatbot):
|
253 |
def respond(user_input):
|
254 |
return chatbot.generate_response(user_input)
|
|
|
255 |
interface = gr.Interface(
|
256 |
fn=respond,
|
257 |
inputs=gr.Textbox(label="Ask a Question", placeholder="Type your question here..."),
|
258 |
outputs=gr.Textbox(label="Answer", placeholder="Response will appear here..."),
|
259 |
title="School Information Chatbot",
|
260 |
+
description="Ask about school events, holidays, or other information. Supports calendar and website queries.",
|
|
|
|
|
|
|
261 |
examples=[
|
262 |
["What events are happening this week?"],
|
263 |
["When is the next board meeting?"],
|