universal-mcp-applications 0.1.12__py3-none-any.whl → 0.1.14__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of universal-mcp-applications might be problematic. Click here for more details.
- universal_mcp/applications/aws_s3/app.py +71 -71
- universal_mcp/applications/calendly/app.py +199 -199
- universal_mcp/applications/canva/app.py +189 -189
- universal_mcp/applications/domain_checker/app.py +31 -24
- universal_mcp/applications/e2b/app.py +6 -7
- universal_mcp/applications/elevenlabs/app.py +24 -20
- universal_mcp/applications/exa/app.py +25 -20
- universal_mcp/applications/falai/app.py +44 -41
- universal_mcp/applications/file_system/app.py +20 -12
- universal_mcp/applications/firecrawl/app.py +46 -47
- universal_mcp/applications/fireflies/app.py +79 -79
- universal_mcp/applications/fpl/app.py +83 -74
- universal_mcp/applications/github/README.md +0 -1028
- universal_mcp/applications/github/app.py +55 -50227
- universal_mcp/applications/google_calendar/app.py +63 -65
- universal_mcp/applications/google_docs/app.py +78 -78
- universal_mcp/applications/google_drive/app.py +361 -440
- universal_mcp/applications/google_gemini/app.py +34 -17
- universal_mcp/applications/google_mail/app.py +164 -118
- universal_mcp/applications/google_searchconsole/app.py +41 -47
- universal_mcp/applications/google_sheet/app.py +157 -164
- universal_mcp/applications/http_tools/app.py +16 -16
- universal_mcp/applications/linkedin/app.py +26 -31
- universal_mcp/applications/ms_teams/app.py +190 -190
- universal_mcp/applications/openai/app.py +55 -56
- universal_mcp/applications/outlook/app.py +57 -57
- universal_mcp/applications/perplexity/app.py +17 -17
- universal_mcp/applications/reddit/app.py +225 -4053
- universal_mcp/applications/replicate/app.py +40 -42
- universal_mcp/applications/resend/app.py +157 -154
- universal_mcp/applications/scraper/app.py +24 -24
- universal_mcp/applications/serpapi/app.py +18 -20
- universal_mcp/applications/sharepoint/app.py +46 -36
- universal_mcp/applications/slack/app.py +66 -66
- universal_mcp/applications/tavily/app.py +7 -7
- universal_mcp/applications/twitter/api_segments/compliance_api.py +17 -20
- universal_mcp/applications/twitter/api_segments/dm_conversations_api.py +35 -40
- universal_mcp/applications/twitter/api_segments/dm_events_api.py +18 -21
- universal_mcp/applications/twitter/api_segments/likes_api.py +19 -22
- universal_mcp/applications/twitter/api_segments/lists_api.py +59 -68
- universal_mcp/applications/twitter/api_segments/spaces_api.py +36 -42
- universal_mcp/applications/twitter/api_segments/trends_api.py +7 -8
- universal_mcp/applications/twitter/api_segments/tweets_api.py +159 -185
- universal_mcp/applications/twitter/api_segments/usage_api.py +5 -6
- universal_mcp/applications/twitter/api_segments/users_api.py +230 -264
- universal_mcp/applications/unipile/app.py +99 -105
- universal_mcp/applications/whatsapp/app.py +86 -82
- universal_mcp/applications/whatsapp_business/app.py +147 -147
- universal_mcp/applications/youtube/app.py +290 -290
- universal_mcp/applications/zenquotes/app.py +6 -6
- {universal_mcp_applications-0.1.12.dist-info → universal_mcp_applications-0.1.14.dist-info}/METADATA +2 -2
- {universal_mcp_applications-0.1.12.dist-info → universal_mcp_applications-0.1.14.dist-info}/RECORD +54 -54
- {universal_mcp_applications-0.1.12.dist-info → universal_mcp_applications-0.1.14.dist-info}/WHEEL +0 -0
- {universal_mcp_applications-0.1.12.dist-info → universal_mcp_applications-0.1.14.dist-info}/licenses/LICENSE +0 -0
|
@@ -58,7 +58,9 @@ class WhatsappApp(BaseApplication):
|
|
|
58
58
|
self._api_key: str | None = None
|
|
59
59
|
|
|
60
60
|
def get_api_key(self) -> str:
|
|
61
|
-
"""
|
|
61
|
+
"""
|
|
62
|
+
Extracts the 'X-API-KEY' from the AgentR integration client's headers to authenticate WhatsApp API requests. A ValueError is raised if the integration is missing or the key cannot be found, ensuring all operations are properly authorized before execution.
|
|
63
|
+
"""
|
|
62
64
|
if not self.integration:
|
|
63
65
|
raise ValueError("No integration available to get API key from")
|
|
64
66
|
|
|
@@ -75,7 +77,9 @@ class WhatsappApp(BaseApplication):
|
|
|
75
77
|
|
|
76
78
|
@property
|
|
77
79
|
def api_key(self) -> str:
|
|
78
|
-
"""
|
|
80
|
+
"""
|
|
81
|
+
A cached property that retrieves the API key from the AgentrIntegration. It calls the `get_api_key` method on its first access and stores the result for efficient subsequent lookups, ensuring the integration object is queried only once.
|
|
82
|
+
"""
|
|
79
83
|
if self._api_key:
|
|
80
84
|
return self._api_key
|
|
81
85
|
self._api_key = self.get_api_key()
|
|
@@ -155,17 +159,17 @@ class WhatsappApp(BaseApplication):
|
|
|
155
159
|
query: str,
|
|
156
160
|
) -> list[dict[str, Any]]:
|
|
157
161
|
"""
|
|
158
|
-
|
|
159
|
-
|
|
162
|
+
Searches for WhatsApp contacts by name or phone number. This function takes a query string, handles user authentication, and calls the underlying API to find and return a list of matching contacts. It serves as the primary method to look up contact information within the application.
|
|
163
|
+
|
|
160
164
|
Args:
|
|
161
165
|
query (string): Search term to match against contact names or phone numbers
|
|
162
|
-
|
|
166
|
+
|
|
163
167
|
Returns:
|
|
164
168
|
List[Dict[str, Any]]: Retrieved collection
|
|
165
|
-
|
|
169
|
+
|
|
166
170
|
Raises:
|
|
167
171
|
ValueError: Raised when required parameters are missing.
|
|
168
|
-
|
|
172
|
+
|
|
169
173
|
Tags:
|
|
170
174
|
whatsapp.contacts, important
|
|
171
175
|
"""
|
|
@@ -179,7 +183,7 @@ class WhatsappApp(BaseApplication):
|
|
|
179
183
|
contacts = whatsapp_search_contacts(query, user_id)
|
|
180
184
|
return contacts
|
|
181
185
|
|
|
182
|
-
def
|
|
186
|
+
def search_messages(
|
|
183
187
|
self,
|
|
184
188
|
after: str | None = None,
|
|
185
189
|
before: str | None = None,
|
|
@@ -193,8 +197,8 @@ class WhatsappApp(BaseApplication):
|
|
|
193
197
|
context_after: int = 1,
|
|
194
198
|
) -> list[dict[str, Any]]:
|
|
195
199
|
"""
|
|
196
|
-
|
|
197
|
-
|
|
200
|
+
Searches for and retrieves a paginated list of WhatsApp messages using various filters like date, sender, chat, or content query. It can optionally include surrounding contextual messages for each result, unlike `get_message_context` which targets a single message ID.
|
|
201
|
+
|
|
198
202
|
Args:
|
|
199
203
|
after (string): Optional ISO-8601 formatted string to only return messages after this date
|
|
200
204
|
before (string): Optional ISO-8601 formatted string to only return messages before this date
|
|
@@ -206,13 +210,13 @@ class WhatsappApp(BaseApplication):
|
|
|
206
210
|
include_context (boolean): Whether to include messages before and after matches (default True)
|
|
207
211
|
context_before (integer): Number of messages to include before each match (default 1)
|
|
208
212
|
context_after (integer): Number of messages to include after each match (default 1)
|
|
209
|
-
|
|
213
|
+
|
|
210
214
|
Returns:
|
|
211
215
|
List[Dict[str, Any]]: Retrieved collection
|
|
212
|
-
|
|
216
|
+
|
|
213
217
|
Raises:
|
|
214
218
|
ValueError: Raised when required parameters are missing.
|
|
215
|
-
|
|
219
|
+
|
|
216
220
|
Tags:
|
|
217
221
|
whatsapp.messages, important
|
|
218
222
|
"""
|
|
@@ -235,7 +239,7 @@ class WhatsappApp(BaseApplication):
|
|
|
235
239
|
)
|
|
236
240
|
return messages
|
|
237
241
|
|
|
238
|
-
def
|
|
242
|
+
def search_chats(
|
|
239
243
|
self,
|
|
240
244
|
query: str | None = None,
|
|
241
245
|
limit: int = 20,
|
|
@@ -244,21 +248,21 @@ class WhatsappApp(BaseApplication):
|
|
|
244
248
|
sort_by: str = "last_active",
|
|
245
249
|
) -> list[dict[str, Any]]:
|
|
246
250
|
"""
|
|
247
|
-
|
|
248
|
-
|
|
251
|
+
Retrieves a paginated list of WhatsApp chats, allowing filtering by a search query and sorting by activity or name. Unlike `get_chat`, which fetches a single known chat, this function provides broad search and discovery capabilities across multiple user conversations.
|
|
252
|
+
|
|
249
253
|
Args:
|
|
250
254
|
query (string): Optional search term to filter chats by name or JID
|
|
251
255
|
limit (integer): Maximum number of chats to return (default 20)
|
|
252
256
|
page (integer): Page number for pagination (default 0)
|
|
253
257
|
include_last_message (boolean): Whether to include the last message in each chat (default True)
|
|
254
258
|
sort_by (string): Field to sort results by, either "last_active" or "name" (default "last_active")
|
|
255
|
-
|
|
259
|
+
|
|
256
260
|
Returns:
|
|
257
261
|
List[Dict[str, Any]]: Retrieved collection
|
|
258
|
-
|
|
262
|
+
|
|
259
263
|
Raises:
|
|
260
264
|
ValueError: Raised when required parameters are missing.
|
|
261
|
-
|
|
265
|
+
|
|
262
266
|
Tags:
|
|
263
267
|
whatsapp.chats, important
|
|
264
268
|
"""
|
|
@@ -276,24 +280,24 @@ class WhatsappApp(BaseApplication):
|
|
|
276
280
|
)
|
|
277
281
|
return chats
|
|
278
282
|
|
|
279
|
-
def
|
|
283
|
+
def get_chat_by_jid(
|
|
280
284
|
self,
|
|
281
285
|
chat_jid: str,
|
|
282
286
|
include_last_message: bool = True,
|
|
283
287
|
) -> dict[str, Any]:
|
|
284
288
|
"""
|
|
285
|
-
|
|
286
|
-
|
|
289
|
+
Retrieves metadata for a specific WhatsApp chat (direct or group) using its unique JID. It can optionally include the most recent message. This precise JID-based lookup distinguishes it from `get_direct_chat_by_contact`, which uses a phone number, and `list_chats`, which performs a broader search.
|
|
290
|
+
|
|
287
291
|
Args:
|
|
288
292
|
chat_jid (string): The JID of the chat to retrieve
|
|
289
293
|
include_last_message (boolean): Whether to include the last message (default True)
|
|
290
|
-
|
|
294
|
+
|
|
291
295
|
Returns:
|
|
292
296
|
Dict[str, Any]: Retrieved chat metadata
|
|
293
|
-
|
|
297
|
+
|
|
294
298
|
Raises:
|
|
295
299
|
ValueError: Raised when required parameters are missing.
|
|
296
|
-
|
|
300
|
+
|
|
297
301
|
Tags:
|
|
298
302
|
whatsapp.chat, important
|
|
299
303
|
"""
|
|
@@ -307,22 +311,22 @@ class WhatsappApp(BaseApplication):
|
|
|
307
311
|
chat = whatsapp_get_chat(chat_jid, include_last_message, user_id)
|
|
308
312
|
return chat
|
|
309
313
|
|
|
310
|
-
def
|
|
314
|
+
def get_direct_chat_by_phone_number(
|
|
311
315
|
self,
|
|
312
316
|
sender_phone_number: str,
|
|
313
317
|
) -> dict[str, Any]:
|
|
314
318
|
"""
|
|
315
|
-
|
|
316
|
-
|
|
319
|
+
Retrieves metadata for a direct (one-on-one) WhatsApp chat using a contact's phone number. Unlike `get_chat` which requires a JID, this provides a simpler way to find direct conversations. Returns a dictionary containing the chat's details, such as its JID and name.
|
|
320
|
+
|
|
317
321
|
Args:
|
|
318
322
|
sender_phone_number (string): The phone number to search for
|
|
319
|
-
|
|
323
|
+
|
|
320
324
|
Returns:
|
|
321
325
|
Dict[str, Any]: Retrieved chat metadata
|
|
322
|
-
|
|
326
|
+
|
|
323
327
|
Raises:
|
|
324
328
|
ValueError: Raised when required parameters are missing.
|
|
325
|
-
|
|
329
|
+
|
|
326
330
|
Tags:
|
|
327
331
|
whatsapp.chat, important
|
|
328
332
|
"""
|
|
@@ -336,26 +340,26 @@ class WhatsappApp(BaseApplication):
|
|
|
336
340
|
chat = whatsapp_get_direct_chat_by_contact(sender_phone_number, user_id)
|
|
337
341
|
return chat
|
|
338
342
|
|
|
339
|
-
def
|
|
343
|
+
def list_chats_by_contact_jid(
|
|
340
344
|
self,
|
|
341
345
|
jid: str,
|
|
342
346
|
limit: int = 20,
|
|
343
347
|
page: int = 0,
|
|
344
348
|
) -> list[dict[str, Any]]:
|
|
345
349
|
"""
|
|
346
|
-
|
|
347
|
-
|
|
350
|
+
Retrieves a paginated list of all WhatsApp chats, including direct messages and groups, that a specific contact participates in. The contact is identified by their unique JID. This differs from `get_direct_chat_by_contact` which only finds one-on-one chats.
|
|
351
|
+
|
|
348
352
|
Args:
|
|
349
353
|
jid (string): The contact's JID to search for
|
|
350
354
|
limit (integer): Maximum number of chats to return (default 20)
|
|
351
355
|
page (integer): Page number for pagination (default 0)
|
|
352
|
-
|
|
356
|
+
|
|
353
357
|
Returns:
|
|
354
358
|
List[Dict[str, Any]]: Retrieved collection
|
|
355
|
-
|
|
359
|
+
|
|
356
360
|
Raises:
|
|
357
361
|
ValueError: Raised when required parameters are missing.
|
|
358
|
-
|
|
362
|
+
|
|
359
363
|
Tags:
|
|
360
364
|
whatsapp.contact_chats, important
|
|
361
365
|
"""
|
|
@@ -369,22 +373,22 @@ class WhatsappApp(BaseApplication):
|
|
|
369
373
|
chats = whatsapp_get_contact_chats(jid, limit, page, user_id)
|
|
370
374
|
return chats
|
|
371
375
|
|
|
372
|
-
def
|
|
376
|
+
def get_last_message_by_jid(
|
|
373
377
|
self,
|
|
374
378
|
jid: str,
|
|
375
379
|
) -> str:
|
|
376
380
|
"""
|
|
377
|
-
|
|
378
|
-
|
|
381
|
+
Retrieves the content of the most recent message involving a specific contact, identified by their JID. It authenticates the user and returns the message directly as a string, offering a quick way to view the last communication without fetching full message objects or chat histories.
|
|
382
|
+
|
|
379
383
|
Args:
|
|
380
384
|
jid (string): The JID of the contact to search for
|
|
381
|
-
|
|
385
|
+
|
|
382
386
|
Returns:
|
|
383
387
|
string: Retrieved message
|
|
384
|
-
|
|
388
|
+
|
|
385
389
|
Raises:
|
|
386
390
|
ValueError: Raised when required parameters are missing.
|
|
387
|
-
|
|
391
|
+
|
|
388
392
|
Tags:
|
|
389
393
|
whatsapp.interaction, important
|
|
390
394
|
"""
|
|
@@ -405,19 +409,19 @@ class WhatsappApp(BaseApplication):
|
|
|
405
409
|
after: int = 5,
|
|
406
410
|
) -> dict[str, Any]:
|
|
407
411
|
"""
|
|
408
|
-
|
|
409
|
-
|
|
412
|
+
Fetches the conversational context surrounding a specific WhatsApp message ID. It retrieves a configurable number of messages immediately preceding and following the target message. This provides a focused view of a dialogue, unlike `list_messages` which performs broader, filter-based searches.
|
|
413
|
+
|
|
410
414
|
Args:
|
|
411
415
|
message_id (string): The ID of the message to get context for
|
|
412
416
|
before (integer): Number of messages to include before the target message (default 5)
|
|
413
417
|
after (integer): Number of messages to include after the target message (default 5)
|
|
414
|
-
|
|
418
|
+
|
|
415
419
|
Returns:
|
|
416
420
|
Dict[str, Any]: Retrieved message context
|
|
417
|
-
|
|
421
|
+
|
|
418
422
|
Raises:
|
|
419
423
|
ValueError: Raised when required parameters are missing.
|
|
420
|
-
|
|
424
|
+
|
|
421
425
|
Tags:
|
|
422
426
|
whatsapp.message_context, important
|
|
423
427
|
"""
|
|
@@ -431,25 +435,25 @@ class WhatsappApp(BaseApplication):
|
|
|
431
435
|
context = whatsapp_get_message_context(message_id, before, after, user_id)
|
|
432
436
|
return context
|
|
433
437
|
|
|
434
|
-
def
|
|
438
|
+
def send_text_message(
|
|
435
439
|
self,
|
|
436
440
|
recipient: str,
|
|
437
441
|
message: str,
|
|
438
442
|
) -> dict[str, Any]:
|
|
439
443
|
"""
|
|
440
|
-
|
|
441
|
-
|
|
444
|
+
Authenticates the user and sends a text message to a specified WhatsApp recipient. The recipient can be an individual (via phone number) or a group (via JID). It returns a dictionary indicating the operation's success status and a corresponding message.
|
|
445
|
+
|
|
442
446
|
Args:
|
|
443
447
|
recipient (string): The recipient - either a phone number with country code but no + or other symbols,
|
|
444
448
|
or a JID (e.g., "123456789@s.whatsapp.net" or a group JID like "123456789@g.us")
|
|
445
449
|
message (string): The message text to send
|
|
446
|
-
|
|
450
|
+
|
|
447
451
|
Returns:
|
|
448
452
|
Dict[str, Any]: A dictionary containing success status and a status message
|
|
449
|
-
|
|
453
|
+
|
|
450
454
|
Raises:
|
|
451
455
|
ValueError: Raised when required parameters are missing.
|
|
452
|
-
|
|
456
|
+
|
|
453
457
|
Tags:
|
|
454
458
|
whatsapp.send_message, important
|
|
455
459
|
"""
|
|
@@ -469,25 +473,25 @@ class WhatsappApp(BaseApplication):
|
|
|
469
473
|
"message": status_message,
|
|
470
474
|
}
|
|
471
475
|
|
|
472
|
-
def
|
|
476
|
+
def send_attachment(
|
|
473
477
|
self,
|
|
474
478
|
recipient: str,
|
|
475
479
|
media_path: str,
|
|
476
480
|
) -> dict[str, Any]:
|
|
477
481
|
"""
|
|
478
|
-
|
|
479
|
-
|
|
482
|
+
Sends a media file (image, video, document, raw audio) as a standard attachment to a WhatsApp contact or group using their phone number or JID. Unlike `send_audio_message`, which creates a playable voice note, this function handles general file transfers. Returns a success status dictionary.
|
|
483
|
+
|
|
480
484
|
Args:
|
|
481
485
|
recipient (string): The recipient - either a phone number with country code but no + or other symbols,
|
|
482
486
|
or a JID (e.g., "123456789@s.whatsapp.net" or a group JID like "123456789@g.us")
|
|
483
487
|
media_path (string): The absolute path to the media file to send (image, video, document)
|
|
484
|
-
|
|
488
|
+
|
|
485
489
|
Returns:
|
|
486
490
|
Dict[str, Any]: A dictionary containing success status and a status message
|
|
487
|
-
|
|
491
|
+
|
|
488
492
|
Raises:
|
|
489
493
|
ValueError: Raised when required parameters are missing.
|
|
490
|
-
|
|
494
|
+
|
|
491
495
|
Tags:
|
|
492
496
|
whatsapp.send_file, important
|
|
493
497
|
"""
|
|
@@ -507,25 +511,25 @@ class WhatsappApp(BaseApplication):
|
|
|
507
511
|
"message": status_message,
|
|
508
512
|
}
|
|
509
513
|
|
|
510
|
-
def
|
|
514
|
+
def send_voice_message(
|
|
511
515
|
self,
|
|
512
516
|
recipient: str,
|
|
513
517
|
media_path: str,
|
|
514
518
|
) -> dict[str, Any]:
|
|
515
519
|
"""
|
|
516
|
-
|
|
517
|
-
|
|
520
|
+
Sends a local audio file as a playable WhatsApp voice message, converting it to the required format. Unlike `send_file` which sends audio as a document attachment, this function formats the audio as a voice note. It can be sent to an individual contact or a group chat.
|
|
521
|
+
|
|
518
522
|
Args:
|
|
519
523
|
recipient (string): The recipient - either a phone number with country code but no + or other symbols,
|
|
520
524
|
or a JID (e.g., "123456789@s.whatsapp.net" or a group JID like "123456789@g.us")
|
|
521
525
|
media_path (string): The absolute path to the audio file to send (will be converted to Opus .ogg if it's not a .ogg file)
|
|
522
|
-
|
|
526
|
+
|
|
523
527
|
Returns:
|
|
524
528
|
Dict[str, Any]: A dictionary containing success status and a status message
|
|
525
|
-
|
|
529
|
+
|
|
526
530
|
Raises:
|
|
527
531
|
ValueError: Raised when required parameters are missing.
|
|
528
|
-
|
|
532
|
+
|
|
529
533
|
Tags:
|
|
530
534
|
whatsapp.send_audio_message, important
|
|
531
535
|
"""
|
|
@@ -546,24 +550,24 @@ class WhatsappApp(BaseApplication):
|
|
|
546
550
|
"message": status_message,
|
|
547
551
|
}
|
|
548
552
|
|
|
549
|
-
def
|
|
553
|
+
def download_media_from_message(
|
|
550
554
|
self,
|
|
551
555
|
message_id: str,
|
|
552
556
|
chat_jid: str,
|
|
553
557
|
) -> dict[str, Any]:
|
|
554
558
|
"""
|
|
555
|
-
|
|
556
|
-
|
|
559
|
+
Downloads media from a specific WhatsApp message, identified by its ID and chat JID. It saves the content to a local file and returns the file's path upon success. The function automatically handles user authentication before initiating the download.
|
|
560
|
+
|
|
557
561
|
Args:
|
|
558
562
|
message_id (string): The ID of the message containing the media
|
|
559
563
|
chat_jid (string): The JID of the chat containing the message
|
|
560
|
-
|
|
564
|
+
|
|
561
565
|
Returns:
|
|
562
566
|
Dict[str, Any]: A dictionary containing success status, a status message, and the file path if successful
|
|
563
|
-
|
|
567
|
+
|
|
564
568
|
Raises:
|
|
565
569
|
ValueError: Raised when required parameters are missing.
|
|
566
|
-
|
|
570
|
+
|
|
567
571
|
Tags:
|
|
568
572
|
whatsapp.download_media, important
|
|
569
573
|
"""
|
|
@@ -596,15 +600,15 @@ class WhatsappApp(BaseApplication):
|
|
|
596
600
|
"""
|
|
597
601
|
return [
|
|
598
602
|
self.search_contacts,
|
|
599
|
-
self.
|
|
600
|
-
self.
|
|
601
|
-
self.
|
|
602
|
-
self.
|
|
603
|
-
self.
|
|
604
|
-
self.
|
|
603
|
+
self.search_messages,
|
|
604
|
+
self.search_chats,
|
|
605
|
+
self.get_chat_by_jid,
|
|
606
|
+
self.get_direct_chat_by_phone_number,
|
|
607
|
+
self.list_chats_by_contact_jid,
|
|
608
|
+
self.get_last_message_by_jid,
|
|
605
609
|
self.get_message_context,
|
|
606
|
-
self.
|
|
607
|
-
self.
|
|
608
|
-
self.
|
|
609
|
-
self.
|
|
610
|
+
self.send_text_message,
|
|
611
|
+
self.send_attachment,
|
|
612
|
+
self.send_voice_message,
|
|
613
|
+
self.download_media_from_message,
|
|
610
614
|
]
|