So the name is Iko Ikang (Words of the Flame/Fire), add more advanced African styling and concepts, it must be engaing more than any chatbot ever developed, it must captivattes African youths and make them talk to it infifnitely.. the AI that will be manning it is acleed MoStar AI - Follow Up Deployment
Browse files- index.html +17 -369
index.html
CHANGED
@@ -1,372 +1,20 @@
|
|
1 |
<!DOCTYPE html>
|
2 |
-
<html
|
3 |
-
<head>
|
4 |
-
<
|
5 |
-
<meta name="viewport" content="width=device-width, initial-scale=1.0"
|
6 |
-
<
|
7 |
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
.african-pattern-bg {
|
18 |
-
background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiPjxkZWZzPjxwYXR0ZXJuIGlkPSJwYXR0ZXJuIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSkiPjxyZWN0IHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgZmlsbD0iI2U5YzQwMCIvPjwvcGF0dGVybj48L2RlZnM+PHJlY3QgZmlsbD0idXJsKCNwYXR0ZXJuKSIgaGVpZ2h0PSIxMDAlIiB3aWR0aD0iMTAwJSIvPjwvc3ZnPg==');
|
19 |
-
opacity: 0.1;
|
20 |
-
position: absolute;
|
21 |
-
top: 0;
|
22 |
-
left: 0;
|
23 |
-
right: 0;
|
24 |
-
bottom: 0;
|
25 |
-
z-index: -1;
|
26 |
-
}
|
27 |
-
|
28 |
-
.voice-wave {
|
29 |
-
position: relative;
|
30 |
-
height: 60px;
|
31 |
-
display: flex;
|
32 |
-
justify-content: center;
|
33 |
-
align-items: center;
|
34 |
-
}
|
35 |
-
|
36 |
-
.voice-wave span {
|
37 |
-
display: block;
|
38 |
-
width: 4px;
|
39 |
-
height: 20px;
|
40 |
-
background: #e9c400;
|
41 |
-
margin: 0 2px;
|
42 |
-
border-radius: 10px;
|
43 |
-
animation: voice-wave 1.5s infinite ease-in-out;
|
44 |
-
}
|
45 |
-
|
46 |
-
.voice-wave span:nth-child(2) {
|
47 |
-
animation-delay: 0.2s;
|
48 |
-
}
|
49 |
-
|
50 |
-
.voice-wave span:nth-child(3) {
|
51 |
-
animation-delay: 0.4s;
|
52 |
-
}
|
53 |
-
|
54 |
-
.voice-wave span:nth-child(4) {
|
55 |
-
animation-delay: 0.6s;
|
56 |
-
}
|
57 |
-
|
58 |
-
.voice-wave span:nth-child(5) {
|
59 |
-
animation-delay: 0.8s;
|
60 |
-
}
|
61 |
-
|
62 |
-
@keyframes voice-wave {
|
63 |
-
0%, 100% {
|
64 |
-
transform: scaleY(0.5);
|
65 |
-
}
|
66 |
-
50% {
|
67 |
-
transform: scaleY(2);
|
68 |
-
}
|
69 |
-
}
|
70 |
-
|
71 |
-
.response-bubble {
|
72 |
-
position: relative;
|
73 |
-
background: #f8f9fa;
|
74 |
-
border-radius: 18px;
|
75 |
-
padding: 12px 16px;
|
76 |
-
margin: 8px 0;
|
77 |
-
max-width: 80%;
|
78 |
-
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
79 |
-
}
|
80 |
-
|
81 |
-
.response-bubble:after {
|
82 |
-
content: '';
|
83 |
-
position: absolute;
|
84 |
-
bottom: -10px;
|
85 |
-
left: 20px;
|
86 |
-
border-width: 10px 10px 0;
|
87 |
-
border-style: solid;
|
88 |
-
border-color: #f8f9fa transparent;
|
89 |
-
}
|
90 |
-
|
91 |
-
.user-bubble {
|
92 |
-
background: #e9c400;
|
93 |
-
color: white;
|
94 |
-
align-self: flex-end;
|
95 |
-
}
|
96 |
-
|
97 |
-
.user-bubble:after {
|
98 |
-
right: 20px;
|
99 |
-
left: auto;
|
100 |
-
border-width: 10px 10px 0;
|
101 |
-
border-style: solid;
|
102 |
-
border-color: #e9c400 transparent;
|
103 |
-
}
|
104 |
-
|
105 |
-
.typing-indicator {
|
106 |
-
display: flex;
|
107 |
-
padding: 8px 12px;
|
108 |
-
background: #f8f9fa;
|
109 |
-
border-radius: 18px;
|
110 |
-
align-self: flex-start;
|
111 |
-
margin: 8px 0;
|
112 |
-
}
|
113 |
-
|
114 |
-
.typing-indicator span {
|
115 |
-
width: 6px;
|
116 |
-
height: 6px;
|
117 |
-
background: #6c757d;
|
118 |
-
border-radius: 50%;
|
119 |
-
margin: 0 2px;
|
120 |
-
animation: typing 1s infinite ease-in-out;
|
121 |
-
}
|
122 |
-
|
123 |
-
.typing-indicator span:nth-child(2) {
|
124 |
-
animation-delay: 0.2s;
|
125 |
-
}
|
126 |
-
|
127 |
-
.typing-indicator span:nth-child(3) {
|
128 |
-
animation-delay: 0.4s;
|
129 |
-
}
|
130 |
-
|
131 |
-
@keyframes typing {
|
132 |
-
0%, 100% {
|
133 |
-
transform: translateY(0);
|
134 |
-
}
|
135 |
-
50% {
|
136 |
-
transform: translateY(-5px);
|
137 |
-
}
|
138 |
-
}
|
139 |
-
</style>
|
140 |
-
</head>
|
141 |
-
<body class="min-h-screen bg-gray-100">
|
142 |
-
<div class="african-pattern-bg"></div>
|
143 |
-
|
144 |
-
<div class="container mx-auto px-4 py-8 max-w-4xl">
|
145 |
-
<header class="text-center mb-8">
|
146 |
-
<h1 class="text-4xl font-bold text-yellow-700 mb-2">Infinite Skills</h1>
|
147 |
-
<p class="text-lg text-gray-600">African Context Voice Assistant</p>
|
148 |
-
<div class="mt-4 flex justify-center">
|
149 |
-
<div class="w-16 h-1 bg-yellow-600 rounded-full"></div>
|
150 |
-
</div>
|
151 |
-
</header>
|
152 |
-
|
153 |
-
<div class="bg-white rounded-2xl shadow-xl overflow-hidden">
|
154 |
-
<div class="bg-yellow-600 py-4 px-6 flex items-center">
|
155 |
-
<div class="w-12 h-12 rounded-full bg-yellow-700 flex items-center justify-center text-white">
|
156 |
-
<i class="fas fa-headphones text-2xl"></i>
|
157 |
-
</div>
|
158 |
-
<div class="ml-4">
|
159 |
-
<h3 class="text-white font-semibold">African Voice Assistant</h3>
|
160 |
-
<p class="text-yellow-100 text-sm">Ready to assist you</p>
|
161 |
-
</div>
|
162 |
-
<div class="ml-auto flex space-x-2">
|
163 |
-
<button class="w-8 h-8 rounded-full bg-yellow-700 text-white flex items-center justify-center">
|
164 |
-
<i class="fas fa-cog"></i>
|
165 |
-
</button>
|
166 |
-
<button class="w-8 h-8 rounded-full bg-yellow-700 text-white flex items-center justify-center">
|
167 |
-
<i class="fas fa-times"></i>
|
168 |
-
</button>
|
169 |
-
</div>
|
170 |
-
</div>
|
171 |
-
|
172 |
-
<div class="p-4 h-96 overflow-y-auto flex flex-col" id="chat-container">
|
173 |
-
<div class="response-bubble">
|
174 |
-
<p>Hello my brother/sister! How can I help you today? Remember I understand African context only.</p>
|
175 |
-
</div>
|
176 |
-
<!-- Chat messages will appear here -->
|
177 |
-
</div>
|
178 |
-
|
179 |
-
<div class="border-t border-gray-200 p-4 bg-gray-50">
|
180 |
-
<div class="flex items-center">
|
181 |
-
<button id="voice-btn" class="w-12 h-12 rounded-full bg-yellow-600 text-white flex items-center justify-center hover:bg-yellow-700 transition">
|
182 |
-
<i class="fas fa-microphone text-xl"></i>
|
183 |
-
</button>
|
184 |
-
<div class="ml-4 flex-1 relative">
|
185 |
-
<input type="text" id="user-input" placeholder="Speak or type your request..." class="w-full px-4 py-3 rounded-full border border-gray-300 focus:outline-none focus:ring-2 focus:ring-yellow-500 focus:border-transparent">
|
186 |
-
<button id="send-btn" class="absolute right-3 top-3 text-gray-400 hover:text-yellow-600">
|
187 |
-
<i class="fas fa-paper-plane"></i>
|
188 |
-
</button>
|
189 |
-
</div>
|
190 |
-
</div>
|
191 |
-
|
192 |
-
<div class="mt-4 flex justify-center hidden" id="voice-wave">
|
193 |
-
<div class="voice-wave">
|
194 |
-
<span></span>
|
195 |
-
<span></span>
|
196 |
-
<span></span>
|
197 |
-
<span></span>
|
198 |
-
<span></span>
|
199 |
-
</div>
|
200 |
-
<p class="ml-3 text-gray-600">Listening for African context...</p>
|
201 |
-
</div>
|
202 |
-
</div>
|
203 |
-
</div>
|
204 |
-
|
205 |
-
<div class="mt-8 grid grid-cols-1 md:grid-cols-3 gap-4">
|
206 |
-
<div class="bg-white p-4 rounded-lg shadow-md">
|
207 |
-
<div class="text-yellow-600 mb-2">
|
208 |
-
<i class="fas fa-globe-africa text-2xl"></i>
|
209 |
-
</div>
|
210 |
-
<h3 class="font-semibold text-gray-800">African Context</h3>
|
211 |
-
<p class="text-gray-600 text-sm mt-1">Understands local dialects, proverbs and cultural references</p>
|
212 |
-
</div>
|
213 |
-
<div class="bg-white p-4 rounded-lg shadow-md">
|
214 |
-
<div class="text-yellow-600 mb-2">
|
215 |
-
<i class="fas fa-comments text-2xl"></i>
|
216 |
-
</div>
|
217 |
-
<h3 class="font-semibold text-gray-800">Local Languages</h3>
|
218 |
-
<p class="text-gray-600 text-sm mt-1">Supports Pidgin, Swahili, Yoruba and more in English voice</p>
|
219 |
-
</div>
|
220 |
-
<div class="bg-white p-4 rounded-lg shadow-md">
|
221 |
-
<div class="text-yellow-600 mb-2">
|
222 |
-
<i class="fas fa-lightbulb text-2xl"></i>
|
223 |
-
</div>
|
224 |
-
<h3 class="font-semibold text-gray-800">Smart Assistance</h3>
|
225 |
-
<p class="text-gray-600 text-sm mt-1">Provides solutions relevant to African lifestyle</p>
|
226 |
-
</div>
|
227 |
-
</div>
|
228 |
</div>
|
229 |
-
|
230 |
-
<script>
|
231 |
-
|
232 |
-
|
233 |
-
const sendBtn = document.getElementById('send-btn');
|
234 |
-
const userInput = document.getElementById('user-input');
|
235 |
-
const chatContainer = document.getElementById('chat-container');
|
236 |
-
const voiceWave = document.getElementById('voice-wave');
|
237 |
-
|
238 |
-
// African context responses
|
239 |
-
const africanResponses = {
|
240 |
-
"greeting": ["Nna, how you dey?", "Sawubona my brother/sister!", "Kedu! How far?", "Akwaba! How you dey do?"],
|
241 |
-
"help": ["I fit help you with African matters only o!", "Abeg, ask me anything about our African way.", "I sabi African matters pass, wetin you wan know?"],
|
242 |
-
"time": ["Time dey go like NEPA bill for Nigeria!", "E be like say time don dey for {current_time}. No waste am!"],
|
243 |
-
"joke": ["Why the chicken cross the road? To show the goat say road no be only for am!", "Wetin dey worry lion? Nothing, na just him nature!"],
|
244 |
-
"proverb": ["The child who is not embraced by the village will burn it down to feel its warmth.", "Until the lions have their own historians, the history of the hunt will always glorify the hunter."],
|
245 |
-
"food": ["You wan chop amala with ewedu? Or maybe fufu and egusi soup?", "Jollof rice na the real deal, no be small thing!"],
|
246 |
-
"weather": ["Sun dey bake like plantain for roadside!", "Rain dey fall like say heaven don open!"],
|
247 |
-
"default": ["Abeg, I no understand. Make you repeat am.", "Oga, na African matters I sabi. Try again."]
|
248 |
-
};
|
249 |
-
|
250 |
-
// Speech recognition setup
|
251 |
-
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
|
252 |
-
let recognition;
|
253 |
-
|
254 |
-
if (SpeechRecognition) {
|
255 |
-
recognition = new SpeechRecognition();
|
256 |
-
recognition.continuous = false;
|
257 |
-
recognition.interimResults = false;
|
258 |
-
recognition.lang = 'en-US';
|
259 |
-
|
260 |
-
recognition.onstart = function() {
|
261 |
-
voiceWave.classList.remove('hidden');
|
262 |
-
voiceBtn.innerHTML = '<i class="fas fa-microphone-slash text-xl"></i>';
|
263 |
-
};
|
264 |
-
|
265 |
-
recognition.onend = function() {
|
266 |
-
voiceWave.classList.add('hidden');
|
267 |
-
voiceBtn.innerHTML = '<i class="fas fa-microphone text-xl"></i>';
|
268 |
-
};
|
269 |
-
|
270 |
-
recognition.onresult = function(event) {
|
271 |
-
const transcript = event.results[0][0].transcript;
|
272 |
-
userInput.value = transcript;
|
273 |
-
processUserInput(transcript);
|
274 |
-
};
|
275 |
-
|
276 |
-
recognition.onerror = function(event) {
|
277 |
-
console.error('Speech recognition error', event.error);
|
278 |
-
addMessage("System", "Abeg, I no hear you well. Try again.", false);
|
279 |
-
voiceWave.classList.add('hidden');
|
280 |
-
voiceBtn.innerHTML = '<i class="fas fa-microphone text-xl"></i>';
|
281 |
-
};
|
282 |
-
} else {
|
283 |
-
voiceBtn.disabled = true;
|
284 |
-
voiceBtn.title = "Speech recognition not supported in your browser";
|
285 |
-
}
|
286 |
-
|
287 |
-
// Event listeners
|
288 |
-
voiceBtn.addEventListener('click', toggleVoiceRecognition);
|
289 |
-
sendBtn.addEventListener('click', () => processUserInput(userInput.value));
|
290 |
-
userInput.addEventListener('keypress', (e) => {
|
291 |
-
if (e.key === 'Enter') {
|
292 |
-
processUserInput(userInput.value);
|
293 |
-
}
|
294 |
-
});
|
295 |
-
|
296 |
-
function toggleVoiceRecognition() {
|
297 |
-
if (recognition) {
|
298 |
-
if (voiceWave.classList.contains('hidden')) {
|
299 |
-
recognition.start();
|
300 |
-
} else {
|
301 |
-
recognition.stop();
|
302 |
-
}
|
303 |
-
}
|
304 |
-
}
|
305 |
-
|
306 |
-
function processUserInput(input) {
|
307 |
-
if (!input.trim()) return;
|
308 |
-
|
309 |
-
// Add user message to chat
|
310 |
-
addMessage("You", input, true);
|
311 |
-
userInput.value = '';
|
312 |
-
|
313 |
-
// Show typing indicator
|
314 |
-
const typingIndicator = document.createElement('div');
|
315 |
-
typingIndicator.className = 'typing-indicator';
|
316 |
-
typingIndicator.innerHTML = '<span></span><span></span><span></span>';
|
317 |
-
chatContainer.appendChild(typingIndicator);
|
318 |
-
chatContainer.scrollTop = chatContainer.scrollHeight;
|
319 |
-
|
320 |
-
// Simulate processing delay
|
321 |
-
setTimeout(() => {
|
322 |
-
// Remove typing indicator
|
323 |
-
chatContainer.removeChild(typingIndicator);
|
324 |
-
|
325 |
-
// Generate response
|
326 |
-
const response = generateAfricanResponse(input);
|
327 |
-
addMessage("African Assistant", response, false);
|
328 |
-
}, 1500);
|
329 |
-
}
|
330 |
-
|
331 |
-
function addMessage(sender, message, isUser) {
|
332 |
-
const messageDiv = document.createElement('div');
|
333 |
-
messageDiv.className = isUser ? 'response-bubble user-bubble' : 'response-bubble';
|
334 |
-
messageDiv.innerHTML = `<p><strong>${sender}:</strong> ${message}</p>`;
|
335 |
-
chatContainer.appendChild(messageDiv);
|
336 |
-
chatContainer.scrollTop = chatContainer.scrollHeight;
|
337 |
-
}
|
338 |
-
|
339 |
-
function generateAfricanResponse(input) {
|
340 |
-
input = input.toLowerCase();
|
341 |
-
|
342 |
-
// Get current time for time-related responses
|
343 |
-
const now = new Date();
|
344 |
-
const currentTime = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });
|
345 |
-
|
346 |
-
// Check for keywords and respond accordingly
|
347 |
-
if (input.includes('hello') || input.includes('hi') || input.includes('how you')) {
|
348 |
-
return getRandomResponse(africanResponses.greeting);
|
349 |
-
} else if (input.includes('help') || input.includes('assist')) {
|
350 |
-
return getRandomResponse(africanResponses.help);
|
351 |
-
} else if (input.includes('time') || input.includes('what time')) {
|
352 |
-
return africanResponses.time[0].replace('{current_time}', currentTime);
|
353 |
-
} else if (input.includes('joke') || input.includes('make me laugh')) {
|
354 |
-
return getRandomResponse(africanResponses.joke);
|
355 |
-
} else if (input.includes('proverb') || input.includes('wise word')) {
|
356 |
-
return getRandomResponse(africanResponses.proverb);
|
357 |
-
} else if (input.includes('food') || input.includes('chop') || input.includes('eat')) {
|
358 |
-
return getRandomResponse(africanResponses.food);
|
359 |
-
} else if (input.includes('weather') || input.includes('rain') || input.includes('sun')) {
|
360 |
-
return getRandomResponse(africanResponses.weather);
|
361 |
-
} else {
|
362 |
-
return getRandomResponse(africanResponses.default);
|
363 |
-
}
|
364 |
-
}
|
365 |
-
|
366 |
-
function getRandomResponse(responses) {
|
367 |
-
return responses[Math.floor(Math.random() * responses.length)];
|
368 |
-
}
|
369 |
-
});
|
370 |
-
</script>
|
371 |
-
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=MoShow/awert" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
|
372 |
-
</html>
|
|
|
1 |
<!DOCTYPE html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>My app</title>
|
5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
6 |
+
<meta charset="utf-8">
|
7 |
<script src="https://cdn.tailwindcss.com"></script>
|
8 |
+
</head>
|
9 |
+
<body class="flex justify-center items-center h-screen overflow-hidden bg-white font-sans text-center px-6">
|
10 |
+
<div class="w-full">
|
11 |
+
<span class="text-xs rounded-full mb-2 inline-block px-2 py-1 border border-amber-500/15 bg-amber-500/15 text-amber-500">🔥 New version dropped!</span>
|
12 |
+
<h1 class="text-4xl lg:text-6xl font-bold font-sans">
|
13 |
+
<span class="text-2xl lg:text-4xl text-gray-400 block font-medium">I'm ready to work,</span>
|
14 |
+
Ask me anything.
|
15 |
+
</h1>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
16 |
</div>
|
17 |
+
<img src="https://enzostvs-deepsite.hf.space/arrow.svg" class="absolute bottom-8 left-0 w-[100px] transform rotate-[30deg]" />
|
18 |
+
<script></script>
|
19 |
+
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=MoShow/awert" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
|
20 |
+
</html>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|