From 55f6b30906db0e46ef810cd3ed2a1984d7015838 Mon Sep 17 00:00:00 2001 From: Avi Patil <67785446+avipatilpro@users.noreply.github.com> Date: Thu, 17 Sep 2020 08:13:14 +0530 Subject: [PATCH 1/6] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dfe7b09b..958ab91e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Support

-![logo](https://i.ibb.co/02QVkHC/headersmina.jpg) +![logo](#) ``` #include @@ -72,4 +72,4 @@ and many more people who aren't mentioned here, but may be found in [Contributor ## License -This userbot licensed on [Raphielscape Public License](https://github.com/MoveAngel/One4uBot/blob/sql-extended/LICENSE) - Version 1.d, February 2020 \ No newline at end of file +This userbot licensed on [Raphielscape Public License](https://github.com/MoveAngel/One4uBot/blob/sql-extended/LICENSE) - Version 1.d, February 2020 From a0b85f59d06a7e49798f9ea8efa8d2ad0b2d367e Mon Sep 17 00:00:00 2001 From: Avi Patil <67785446+avipatilpro@users.noreply.github.com> Date: Thu, 17 Sep 2020 11:09:40 +0530 Subject: [PATCH 2/6] Create timefunc.py --- userbot/modules/timefunc.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 userbot/modules/timefunc.py diff --git a/userbot/modules/timefunc.py b/userbot/modules/timefunc.py new file mode 100644 index 00000000..9c4b4e25 --- /dev/null +++ b/userbot/modules/timefunc.py @@ -0,0 +1,31 @@ +import time + +uptimebot = time.time() + + +def get_readable_time(seconds: int) -> str: + count = 0 + ping_time = "" + time_list = [] + time_suffix_list = ["s", "m", "h", "days"] + + while count < 4: + count += 1 + if count < 3: + remainder, result = divmod(seconds, 60) + else: + remainder, result = divmod(seconds, 24) + if seconds == 0 and remainder == 0: + break + time_list.append(int(result)) + seconds = int(remainder) + + for x in range(len(time_list)): + time_list[x] = str(time_list[x]) + time_suffix_list[x] + if len(time_list) == 4: + ping_time += time_list.pop() + ", " + + time_list.reverse() + ping_time += ":".join(time_list) + + return ping_time From 3e93250d40bd77661ccb438427e16d6c1b86bf1b Mon Sep 17 00:00:00 2001 From: Avi Patil <67785446+avipatilpro@users.noreply.github.com> Date: Thu, 17 Sep 2020 11:14:56 +0530 Subject: [PATCH 3/6] Create lydia.py --- userbot/modules/lydia.py | 79 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 userbot/modules/lydia.py diff --git a/userbot/modules/lydia.py b/userbot/modules/lydia.py new file mode 100644 index 00000000..e0bd4673 --- /dev/null +++ b/userbot/modules/lydia.py @@ -0,0 +1,79 @@ +# Copyright 2019 - 2020 AviPatilPro + + +from coffeehouse.lydia import LydiaAI +from coffeehouse.api import API +import asyncio +from telethon import events + +# Non-SQL Mode +ACC_LYDIA = {} + +if Var.LYDIA_API_KEY: + api_key = Var.LYDIA_API_KEY + api_client = API(api_key) + lydia = LydiaAI(api_client) + +@command(pattern="^.repcf", outgoing=True) +async def repcf(event): + if event.fwd_from: + return + await event.edit("Processing...") + try: + session = lydia.create_session() + session_id = session.id + reply = await event.get_reply_message() + msg = reply.text + text_rep = session.think_thought(msg) + await event.edit("💫 {0}".format(text_rep)) + except Exception as e: + await event.edit(str(e)) + +@command(pattern="^.addcf", outgoing=True) +async def addcf(event): + if event.fwd_from: + return + await event.edit("Running on Non-SQL mode for now...") + await asyncio.sleep(3) + await event.edit("Processing...") + reply_msg = await event.get_reply_message() + if reply_msg: + session = lydia.create_session() + session_id = session.id + if reply_msg.from_id is None: + return await event.edit("Invalid user type.") + ACC_LYDIA.update({(event.chat_id & reply_msg.from_id): session}) + await event.edit("Lydia successfully (re)enabled for user: {} in chat: {}".format(str(reply_msg.from_id), str(event.chat_id))) + else: + await event.edit("Reply to a user to activate Lydia AI on them") + +@command(pattern="^.remcf", outgoing=True) +async def remcf(event): + if event.fwd_from: + return + await event.edit("Running on Non-SQL mode for now...") + await asyncio.sleep(3) + await event.edit("Processing...") + reply_msg = await event.get_reply_message() + try: + del ACC_LYDIA[event.chat_id & reply_msg.from_id] + await event.edit("Lydia successfully disabled for user: {} in chat: {}".format(str(reply_msg.from_id), str(event.chat_id))) + except Exception: + await event.edit("This person does not have Lydia activated on him/her.") + + +@bot.on(events.NewMessage(incoming=True)) +async def user(event): + user_text = event.text + try: + session = ACC_LYDIA[event.chat_id & event.from_id] + msg = event.text + async with event.client.action(event.chat_id, "typing"): + text_rep = session.think_thought(msg) + wait_time = 0 + for i in range(len(text_rep)): + wait_time = wait_time + 0.1 + await asyncio.sleep(wait_time) + await event.reply(text_rep) + except (KeyError, TypeError): + return From 006718d789ba8c1e9bed6160bee8f6c53eec1925 Mon Sep 17 00:00:00 2001 From: Avi Patil <67785446+avipatilpro@users.noreply.github.com> Date: Mon, 21 Sep 2020 16:27:33 +0530 Subject: [PATCH 4/6] Initial Commit --- userbot/modules/about.py | 28 ++ userbot/modules/actionwallpapers.py | 71 +++ userbot/modules/actressdp.py | 70 +++ userbot/modules/addprivate.py | 38 ++ userbot/modules/afk2.py | 179 +++++++ userbot/modules/angry.py | 35 ++ userbot/modules/anime_dwn.py | 88 ++++ userbot/modules/art==new.py | 108 ++++ userbot/modules/bigoof.py | 39 ++ userbot/modules/botgban.py | 49 ++ userbot/modules/buttonpost.py | 94 ++++ userbot/modules/bye.py | 24 + userbot/modules/calculator.py | 67 +++ userbot/modules/calendar.py | 40 ++ userbot/modules/call.py | 54 ++ userbot/modules/chatinfo.py | 558 ++++++++++----------- userbot/modules/clock_name.py | 40 ++ userbot/modules/ctext.py | 27 + userbot/modules/ctg.py | 36 ++ userbot/modules/dartndice.py | 32 ++ userbot/modules/dice_dart_ball.py | 32 ++ userbot/modules/dlinks.py | 337 +++++++++++++ userbot/modules/funnyfonts.py | 188 +++++++ userbot/modules/gaana.py | 126 +++++ userbot/modules/gnight.py | 13 + userbot/modules/grs.py | 154 ++++++ userbot/modules/idea.py | 45 ++ userbot/modules/indainflag.py | 25 + userbot/modules/indainmap.py | 26 + userbot/modules/letmesaerch.py | 188 +++++++ userbot/modules/link.py | 83 ++++ userbot/modules/moon2.py | 17 + userbot/modules/mystatus.py | 97 ++++ userbot/modules/noice.py | 732 ++++++++++++++++++++++++++++ userbot/modules/omg.py | 16 + userbot/modules/ophack.py | 53 ++ userbot/modules/owner.py | 39 ++ userbot/modules/picspam.py | 35 ++ userbot/modules/pluginbydead.py | 24 + userbot/modules/recognize.py | 55 +++ userbot/modules/resend.py | 17 + userbot/modules/ripper.py | 36 ++ userbot/modules/rt==new.py | 108 ++++ userbot/modules/sniper kill 200.py | 61 +++ userbot/modules/thanos.py | 29 ++ userbot/modules/whois.py | 453 +++++++++++------ 46 files changed, 4205 insertions(+), 461 deletions(-) create mode 100644 userbot/modules/about.py create mode 100644 userbot/modules/actionwallpapers.py create mode 100644 userbot/modules/actressdp.py create mode 100644 userbot/modules/addprivate.py create mode 100644 userbot/modules/afk2.py create mode 100644 userbot/modules/angry.py create mode 100644 userbot/modules/anime_dwn.py create mode 100644 userbot/modules/art==new.py create mode 100644 userbot/modules/bigoof.py create mode 100644 userbot/modules/botgban.py create mode 100644 userbot/modules/buttonpost.py create mode 100644 userbot/modules/bye.py create mode 100644 userbot/modules/calculator.py create mode 100644 userbot/modules/calendar.py create mode 100644 userbot/modules/call.py create mode 100644 userbot/modules/clock_name.py create mode 100644 userbot/modules/ctext.py create mode 100644 userbot/modules/ctg.py create mode 100644 userbot/modules/dartndice.py create mode 100644 userbot/modules/dice_dart_ball.py create mode 100644 userbot/modules/dlinks.py create mode 100644 userbot/modules/funnyfonts.py create mode 100644 userbot/modules/gaana.py create mode 100644 userbot/modules/gnight.py create mode 100644 userbot/modules/grs.py create mode 100644 userbot/modules/idea.py create mode 100644 userbot/modules/indainflag.py create mode 100644 userbot/modules/indainmap.py create mode 100644 userbot/modules/letmesaerch.py create mode 100644 userbot/modules/link.py create mode 100644 userbot/modules/moon2.py create mode 100644 userbot/modules/mystatus.py create mode 100644 userbot/modules/noice.py create mode 100644 userbot/modules/omg.py create mode 100644 userbot/modules/ophack.py create mode 100644 userbot/modules/owner.py create mode 100644 userbot/modules/picspam.py create mode 100644 userbot/modules/pluginbydead.py create mode 100644 userbot/modules/recognize.py create mode 100644 userbot/modules/resend.py create mode 100644 userbot/modules/ripper.py create mode 100644 userbot/modules/rt==new.py create mode 100644 userbot/modules/sniper kill 200.py create mode 100644 userbot/modules/thanos.py diff --git a/userbot/modules/about.py b/userbot/modules/about.py new file mode 100644 index 00000000..c3dc4f54 --- /dev/null +++ b/userbot/modules/about.py @@ -0,0 +1,28 @@ +# Ported from other Telegram UserBots for TeleBot//Made for TeleBot +# Kangers, don't remove this line +# @its_xditya +"""Available Commands: +.info +""" +import asyncio + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd("infowho")) +async def _(event): + if event.fwd_from: + return + animation_interval = 0.1 + animation_ttl = range(0, 36) + # input_str = event.pattern_match.group(1) + # if input_str == "Visit this page to know more about TeleBot.": + await event.edit("Thanks") + animation_chars = [ + "**TeleBot**", "[More Info](https://telegra.ph/TeleBot-07-08)" + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + await event.edit(animation_chars[i % 18]) \ No newline at end of file diff --git a/userbot/modules/actionwallpapers.py b/userbot/modules/actionwallpapers.py new file mode 100644 index 00000000..e3daa0ee --- /dev/null +++ b/userbot/modules/actionwallpapers.py @@ -0,0 +1,71 @@ +import asyncio +import os +import random +import re +import urllib +from datetime import datetime +from time import sleep + +import requests +from PIL import Image +from PIL import ImageDraw +from PIL import ImageFont +from telethon.tl import functions + +from userbot.utils import admin_cmd + +COLLECTION_STRINGZ = [ + "Vietnam-War-Wallpapers", + "War-of-the-Worlds-Wallpaper", + "War-Plane-Wallpaper", + "World-War-Ii-Wallpaper", + "Cool-War-Wallpapers", + "World-War-2-Wallpaper-HD", +] + + +async def animepp(): + + os.system("rm -rf donot.jpg") + + rnd = random.randint(0, len(COLLECTION_STRINGZ) - 1) + + pack = COLLECTION_STRINGZ[rnd] + + pc = requests.get("http://getwallpapers.com/collection/" + pack).text + + f = re.compile("/\w+/full.+.jpg") + + f = f.findall(pc) + + fy = "http://getwallpapers.com" + random.choice(f) + + print(fy) + + if not os.path.exists("f.ttf"): + + urllib.request.urlretrieve( + "https://github.com/rebel6969/mym/raw/master/Rebel-robot-Regular.ttf", + "f.ttf", + ) + + urllib.request.urlretrieve(fy, "donottouch.jpg") + + +@borg.on(admin_cmd(pattern="fire ?(.*)")) +async def main(event): + + await event.edit( + "**Uplaoding Walpapers \n please wait...\n\nDone !!! Check Your DP") + + while True: + + await animepp() + + file = await event.client.upload_file("donottouch.jpg") + + await event.client(functions.photos.UploadProfilePhotoRequest(file)) + + os.system("rm -rf donottouch.jpg") + + await asyncio.sleep(60) # Edit this to your required needs \ No newline at end of file diff --git a/userbot/modules/actressdp.py b/userbot/modules/actressdp.py new file mode 100644 index 00000000..d64281f7 --- /dev/null +++ b/userbot/modules/actressdp.py @@ -0,0 +1,70 @@ +# Ported from other Telegram UserBots for TeleBot//Made for TeleBot +# Kangers, don't remove this line +# @its_xditya +# Usage .actressdp Im Not Responsible For Any Ban caused By This +import asyncio +import os +import random +import re +import urllib + +import requests +from telethon.tl import functions + +from userbot.utils import admin_cmd + +COLLECTION_STRING = [ + "indian-actress-wallpapers", + "latest-bollywood-actress-wallpapers-2018-hd", + "bollywood-actress-wallpaper", + "hd-wallpapers-of-bollywood-actress", + "new-bollywood-actress-wallpaper-2018", +] + + +async def animepp(): + + os.system("rm -rf donot.jpg") + + rnd = random.randint(0, len(COLLECTION_STRING) - 1) + + pack = COLLECTION_STRING[rnd] + + pc = requests.get("http://getwallpapers.com/collection/" + pack).text + + f = re.compile("/\w+/full.+.jpg") + + f = f.findall(pc) + + fy = "http://getwallpapers.com" + random.choice(f) + + print(fy) + + if not os.path.exists("f.ttf"): + + urllib.request.urlretrieve( + "https://github.com/rebel6969/mym/raw/master/Rebel-robot-Regular.ttf", + "f.ttf", + ) + + urllib.request.urlretrieve(fy, "donottouch.jpg") + + +@borg.on(admin_cmd(pattern="actressdp ?(.*)")) +async def main(event): + + await event.edit( + "**Starting Actress Profile Pic...\n\nDone !!! Check Your DP in 5 seconds. \n By [TeleBot](https://github.com/xditya/TeleBot)**" + ) + + while True: + + await animepp() + + file = await event.client.upload_file("donottouch.jpg") + + await event.client(functions.photos.UploadProfilePhotoRequest(file)) + + os.system("rm -rf donottouch.jpg") + + await asyncio.sleep(600) # Edit this to your required needs \ No newline at end of file diff --git a/userbot/modules/addprivate.py b/userbot/modules/addprivate.py new file mode 100644 index 00000000..ac922f24 --- /dev/null +++ b/userbot/modules/addprivate.py @@ -0,0 +1,38 @@ +"""Invite the user(s) to the current chat +Syntax: .invite """ +from telethon import functions + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="add ?(.*)")) +async def _(event): + if event.fwd_from: + return + to_add_users = event.pattern_match.group(1) + if event.is_private: + await event.edit("`.invite` users to a chat, not to a Private Message") + else: + logger.info(to_add_users) + if not event.is_channel and event.is_group: + # https://lonamiwebs.github.io/Telethon/methods/messages/add_chat_user.html + for user_id in to_add_users.split(" "): + try: + await borg( + functions.messages.AddChatUserRequest( + chat_id=event.chat_id, + user_id=user_id, + fwd_limit=1000000)) + except Exception as e: + await event.reply(str(e)) + await event.edit("Invited Successfully") + else: + # https://lonamiwebs.github.io/Telethon/methods/channels/invite_to_channel.html + for user_id in to_add_users.split(" "): + try: + await borg( + functions.channels.InviteToChannelRequest( + channel=event.chat_id, users=[user_id])) + except Exception as e: + await event.reply(str(e)) + await event.edit("Invited Successfully") \ No newline at end of file diff --git a/userbot/modules/afk2.py b/userbot/modules/afk2.py new file mode 100644 index 00000000..d667b458 --- /dev/null +++ b/userbot/modules/afk2.py @@ -0,0 +1,179 @@ +"""AFK Plugin for @UniBorg +Syntax: .affk REASON""" +import asyncio +import datetime +from datetime import datetime + +from telethon import events +from telethon.tl import functions +from telethon.tl import types + +from userbot import CMD_HELP +from userbot.utils import admin_cmd + +global USER_AFK # pylint:disable=E0602 +global afk_time # pylint:disable=E0602 +global last_afk_message # pylint:disable=E0602 +global afk_start +global afk_end +USER_AFK = {} +afk_time = None +last_afk_message = {} +afk_start = {} + + +@borg.on(events.NewMessage(outgoing=True)) # pylint:disable=E0602 +async def set_not_afk(event): + global USER_AFK # pylint:disable=E0602 + global afk_time # pylint:disable=E0602 + global last_afk_message # pylint:disable=E0602 + global afk_start + global afk_end + back_alive = datetime.now() + afk_end = back_alive.replace(microsecond=0) + if afk_start != {}: + total_afk_time = str((afk_end - afk_start)) + current_message = event.message.message + if ".affk" not in current_message and "yes" in USER_AFK: # pylint:disable=E0602 + shite = await borg.send_message( + event.chat_id, + "__Back alive!__\n**No Longer afk.**\n `Was afk for:``" + + total_afk_time + "`", + ) + try: + await borg.send_message( # pylint:disable=E0602 + Config.PRIVATE_GROUP_BOT_API_ID, # pylint:disable=E0602 + "#AFKFALSE \n Set AFK mode to False\n" + + "__Back alive!__\n**No Longer afk.**\n `Was afk for:``" + + total_afk_time + "`", + ) + except Exception as e: # pylint:disable=C0103,W0703 + await borg.send_message( # pylint:disable=E0602 + event.chat_id, + "Please set `PRIVATE_GROUP_BOT_API_ID` " + + "for the proper functioning of afk functionality " + + "check pinned message in @catuserbot17.\n\n `{}`".format( + str(e)), + reply_to=event.message.id, + silent=True, + ) + await asyncio.sleep(5) + await shite.delete() + USER_AFK = {} # pylint:disable=E0602 + afk_time = None # pylint:disable=E0602 + + +@borg.on(admin_cmd(pattern=r"affk ?(.*)")) # pylint:disable=E0602 +async def _(event): + if event.fwd_from: + return + global USER_AFK # pylint:disable=E0602 + global afk_time # pylint:disable=E0602 + global last_afk_message # pylint:disable=E0602 + global afk_start + global afk_end + global reason + USER_AFK = {} + afk_time = None + last_afk_message = {} + afk_end = {} + start_1 = datetime.now() + afk_start = start_1.replace(microsecond=0) + reason = event.pattern_match.group(1) + if not USER_AFK: # pylint:disable=E0602 + last_seen_status = await borg( # pylint:disable=E0602 + functions.account.GetPrivacyRequest( + types.InputPrivacyKeyStatusTimestamp())) + if isinstance(last_seen_status.rules, types.PrivacyValueAllowAll): + afk_time = datetime.datetime.now() # pylint:disable=E0602 + USER_AFK = f"yes: {reason}" # pylint:disable=E0602 + if reason: + await borg.send_message( + event.chat_id, + f"**I shall be Going AFK!** __because ~ {reason}__") + else: + await borg.send_message(event.chat_id, f"**I am Going AFK!**") + await asyncio.sleep(2) + await event.delete() + try: + await borg.send_message( # pylint:disable=E0602 + Config.PRIVATE_GROUP_BOT_API_ID, # pylint:disable=E0602 + f"#AFKTRUE \n Set AFK mode to True, and Reason is {reason}", + ) + except Exception as e: # pylint:disable=C0103,W0703 + logger.warn(str(e)) # pylint:disable=E0602 + + +@borg.on( + events.NewMessage( # pylint:disable=E0602 + incoming=True, + func=lambda e: bool(e.mentioned or e.is_private))) +async def on_afk(event): + if event.fwd_from: + return + global USER_AFK # pylint:disable=E0602 + global afk_time # pylint:disable=E0602 + global last_afk_message # pylint:disable=E0602 + global afk_start + global afk_end + back_alivee = datetime.now() + afk_end = back_alivee.replace(microsecond=0) + if afk_start != {}: + total_afk_time = str((afk_end - afk_start)) + afk_since = "**a while ago**" + current_message_text = event.message.message.lower() + if "affk" in current_message_text: + # userbot's should not reply to other userbot's + # https://core.telegram.org/bots/faq#why-doesn-39t-my-bot-see-messages-from-other-bots + return False + if USER_AFK and not (await event.get_sender()).bot: # pylint:disable=E0602 + if afk_time: # pylint:disable=E0602 + now = datetime.datetime.now() + datime_since_afk = now - afk_time # pylint:disable=E0602 + time = float(datime_since_afk.seconds) + days = time // (24 * 3600) + time = time % (24 * 3600) + hours = time // 3600 + time %= 3600 + minutes = time // 60 + time %= 60 + seconds = time + if days == 1: + afk_since = "**Yesterday**" + elif days > 1: + if days > 6: + date = now + datetime.timedelta( + days=-days, hours=-hours, minutes=-minutes) + afk_since = date.strftime("%A, %Y %B %m, %H:%I") + else: + wday = now + datetime.timedelta(days=-days) + afk_since = wday.strftime("%A") + elif hours > 1: + afk_since = f"`{int(hours)}h{int(minutes)}m` **ago**" + elif minutes > 0: + afk_since = f"`{int(minutes)}m{int(seconds)}s` **ago**" + else: + afk_since = f"`{int(seconds)}s` **ago**" + msg = None + message_to_reply = ( + f"__My Master Has Been In afk For__ `{total_afk_time}`\nWhere He Is: ONLY GOD KNOWS " + + + f"\n\n__I promise He'll back in a few light years__\n**REASON**: {reason}" + if reason else + f"**Heya!**\n__I am currently unavailable. Since when, you ask? For {total_afk_time} I guess.__\n\n\n**Important Notice**\n\n[This User Is Dead Forever...](https://telegra.ph/file/a4821748db331a0c899a0.mp4)" + ) + msg = await event.reply(message_to_reply) + await asyncio.sleep(5) + if event.chat_id in last_afk_message: # pylint:disable=E0602 + await last_afk_message[event.chat_id].delete() # pylint:disable=E0602 + last_afk_message[event.chat_id] = msg # pylint:disable=E0602 + + +CMD_HELP.update({ + "affk": + ".affk [Optional Reason]\ +\nUsage: Sets you as afk.\nReplies to anyone who tags/PM's \ +you telling them that you are AFK(reason).\n\nSwitches off AFK when you type back anything, anywhere.\ +\n afk full form away from keyboard/keypad.\ +" +}) \ No newline at end of file diff --git a/userbot/modules/angry.py b/userbot/modules/angry.py new file mode 100644 index 00000000..aff6e801 --- /dev/null +++ b/userbot/modules/angry.py @@ -0,0 +1,35 @@ +"""Emoji +Available Commands: +.angry""" +import asyncio + +from telethon import events + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd("angry")) +async def _(event): + if event.fwd_from: + return + animation_interval = 3 + animation_ttl = range(0, 18) + + # await event.edit(input_str) + await event.edit("I am getting angry now") + animation_chars = [ + "😡😡😡", + "I am angry with you", + "Just shut up", + "And RUN Away NOW", + "Or else", + "I would call CEO of Telegram", + "My friend is also a hacker...", + "I would call him if you don't shut up", + "🤬🤬Warning you, Don't repeat it again and shut up now...🤬🤬", + "🤬🤬🤬🤬🤬 BSDK ab toh chup ho ja.", + ] + + for i in animation_ttl: + await asyncio.sleep(animation_interval) + await event.edit(animation_chars[i % 18]) \ No newline at end of file diff --git a/userbot/modules/anime_dwn.py b/userbot/modules/anime_dwn.py new file mode 100644 index 00000000..e9f5a488 --- /dev/null +++ b/userbot/modules/anime_dwn.py @@ -0,0 +1,88 @@ +""" +Anime Batch Downloader Plugin for userbot. //set TEMP_DIR Env Var first. +usage:- get a link of Animefrenzy.net Anime page and use in cmd. +cmd:- .anime page_link +By:- @Zero_cool7870 +""" +import asyncio +import os + +import requests +from bs4 import BeautifulSoup as bs +from telethon import events + +from userbot.utils import admin_cmd + +chunk_size = 3242880 + + +async def get_file_name(link): + new_link = link[26:] + l = "" + for c in new_link: + if c == "?": + break + l = l + c + l = l.replace("/", "_") + return l + + +async def download_file(url, filename): + response = requests.get(url, stream=True) + handle = open(filename, "wb") + for chunk in response.iter_content(chunk_size=chunk_size): + if chunk: # filter out keep-alive new chunks + handle.write(chunk) + handle.close() + + +@borg.on(admin_cmd(pattern=r"danime")) +async def anime_download(event): + urls = [] + url_links = [] + if event.fwd_from: + return + if Config.TEMP_DIR is None: + await event.edit("Please Set Required ENV Variables First.") + return + download_dir = Config.TEMP_DIR + try: + os.makedirs(download_dir) + except: + pass + + var = event.text + var = var[6:] + res = requests.get(var) + source = bs(res.text, "lxml") + + for a in source.find_all("a", {"class": "infovan"}): + url_links.append(a["href"]) + + for i in url_links: + res = requests.get(i) + source = bs(res.text, "lxml") + + for a in source.find_all("a", {"class": "an"}): + urls.append(a["href"]) + print("Getting Link...") + + counter = 0 + for url in urls: + if "download.php?" in url: + urls.pop(counter) + counter = counter + 1 + + counter = 0 + for url in urls: + if "#" in url: + urls.pop(counter) + counter = counter + 1 + await event.edit("Downloading Episodes...") + + for i in urls: + filename = await get_file_name(i) + print(filename) + filename = download_dir + "/" + filename + await download_file(i, filename) + await event.edit("All Episodes Downloaded.") \ No newline at end of file diff --git a/userbot/modules/art==new.py b/userbot/modules/art==new.py new file mode 100644 index 00000000..3d01997a --- /dev/null +++ b/userbot/modules/art==new.py @@ -0,0 +1,108 @@ +import asyncio +from platform import uname + +from telethon import events +from telethon.tl.types import ChannelParticipantsAdmins + +from userbot import ALIVE_NAME +from userbot.utils import admin_cmd + +n = str( + ALIVE_NAME) if ALIVE_NAME else "Set ALIVE_NAME in config vars in Heroku" + + +# @command(outgoing=True, pattern="^.ded$") +@borg.on(admin_cmd(pattern=r"ded")) +async def bluedevilded(ded): + await ded.edit(n + " == |\n     |" + "\n     | \n" + "     | \n" + "     | \n" + "     | \n" + "     | \n" + "     | \n" + "     | \n" + " / ̄ ̄\| \n" + "< ´・    |\ \n" + " | 3  | 丶\ \n" + "< 、・  |  \ \n" + " \__/∪ _ ∪) \n" + "      U U\n") + + +M = ("▄███████▄\n" + "█▄█████▄█\n" + "█▼▼▼▼▼█\n" + "██________█▌\n" + "█▲▲▲▲▲█\n" + "█████████\n" + "_████\n") +P = ("┈┈┏━╮╭━┓┈╭━━━━╮\n" + "┈┈┃┏┗┛┓┃╭┫ⓞⓘⓝⓚ┃\n" + "┈┈╰┓▋▋┏╯╯╰━━━━╯\n" + "┈╭━┻╮╲┗━━━━╮╭╮┈\n" + "┈┃▎▎┃╲╲╲╲╲╲┣━╯┈\n" + "┈╰━┳┻▅╯╲╲╲╲┃┈┈┈\n" + "┈┈┈╰━┳┓┏┳┓┏╯┈┈┈\n" + "┈┈┈┈┈┗┻┛┗┻┛┈┈┈┈\n") +K = "_/﹋\_\n" "(҂`_´)\n" "<,︻╦╤─ ҉ - -\n" "_/﹋\_\n" +G = ("........___________________\n" + "....../ `-___________--_____|] - - - - - -\n" + " - - ░ ▒▓▓█D \n" + "...../==o;;;;;;;;______.:/\n" + ".....), -.(_(__) /\n" + "....// (..) ), —\n" + "...//___//\n") +D = ("╥━━━━━━━━╭━━╮━━┳\n" + "╢╭╮╭━━━━━┫┃▋▋━▅┣\n" + "╢┃╰┫┈┈┈┈┈┃┃┈┈╰┫┣\n" + "╢╰━┫┈┈┈┈┈╰╯╰┳━╯┣\n" + "╢┊┊┃┏┳┳━━┓┏┳┫┊┊┣\n" + "╨━━┗┛┗┛━━┗┛┗┛━━┻\n") +H = ("▬▬▬.◙.▬▬▬ \n" + "═▂▄▄▓▄▄▂ \n" + "◢◤ █▀▀████▄▄▄▄◢◤ \n" + "█▄ █ █▄ ███▀▀▀▀▀▀▀╬ \n" + "◥█████◤ \n" + "══╩══╩══ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ Hello, my friend :D \n" + "╬═╬☻/ \n" + "╬═╬/▌ \n" + "╬═╬/ \\n") + + +@borg.on(admin_cmd(pattern=r"monster")) +async def bluedevilmonster(monster): + await monster.edit(M) + + +@borg.on(admin_cmd(pattern=r"pig")) +async def bluedevipig(pig): + await pig.edit(P) + + +@borg.on(admin_cmd(pattern=r"kiler")) +async def bluedevikiller(kiler): + await kiler.edit(K) + + +@borg.on(admin_cmd(pattern=r"gun")) +async def bluedevigun(gun): + await gun.edit(G) + + +@borg.on(admin_cmd(pattern=r"dog")) +async def bluedevidog(dog): + await dog.edit(D) + + +@borg.on(admin_cmd(pattern=r"hmf")) +async def bluedevihmf(hmf): + await hmf.edit(H) +© 2020 GitHub, Inc. \ No newline at end of file diff --git a/userbot/modules/bigoof.py b/userbot/modules/bigoof.py new file mode 100644 index 00000000..bbec7f9d --- /dev/null +++ b/userbot/modules/bigoof.py @@ -0,0 +1,39 @@ +"""Available Commands: +.bigoof +Credits to @T3b0N3 + Ultroid +""" +import asyncio + +from telethon import events + +from userbot.utils import admin_cmd +# Main Credits Goes to @T3b0N3 +# He Worked Very Hard to do this, So Please Respect Him!! + + +@borg.on(admin_cmd("bigoof")) +async def _(event): + if event.fwd_from: + return + animation_interval = 0.1 + animation_ttl = range(0, 36) + # input_str = event.pattern_match.group(1) + # if input_str == "nope": + await event.edit( + "┏━━━┓╋╋╋╋┏━━━┓ \n┃┏━┓┃╋╋╋╋┃┏━┓┃ \n┃┃╋┃┣┓┏┓┏┫┃╋┃┃ \n┃┃╋┃┃┗┛┗┛┃┃╋┃┃ \n┃┗━┛┣┓┏┓┏┫┗━┛┃ \n┗━━━┛┗┛┗┛┗━━━┛" + ) + animation_chars = [ + "╭━━━╮╱╱╱╭━╮ \n┃╭━╮┃╱╱╱┃╭╯ \n┃┃╱┃┣━━┳╯╰╮ \n┃┃╱┃┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃┃┃ \n╰━━━┻━━╯╰╯ ", + "╭━━━╮╱╱╱╱╱╱╭━╮ \n┃╭━╮┃╱╱╱╱╱╱┃╭╯ \n┃┃╱┃┣━━┳━━┳╯╰╮ \n┃┃╱┃┃╭╮┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃╰╯┃┃┃ \n ╰━━━┻━━┻━━╯╰╯", + "╭━━━╮╱╱╱╱╱╱╱╱╱╭━╮ \n┃╭━╮┃╱╱╱╱╱╱╱╱╱┃╭╯ \n┃┃╱┃┣━━┳━━┳━━┳╯╰╮ \n┃┃╱┃┃╭╮┃╭╮┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃╰╯┃╰╯┃┃┃ \n╰━━━┻━━┻━━┻━━╯╰╯", + "╭━━━╮╱╱╱╱╱╱╱╱╱╱╱╱╭━╮ \n┃╭━╮┃╱╱╱╱╱╱╱╱╱╱╱╱┃╭╯ \n┃┃╱┃┣━━┳━━┳━━┳━━┳╯╰╮ \n┃┃╱┃┃╭╮┃╭╮┃╭╮┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃╰╯┃╰╯┃╰╯┃┃┃ \n╰━━━┻━━┻━━┻━━┻━━╯╰╯", + "╭━━━╮╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱╭━╮ \n┃╭━╮┃╱╱╱╱╱╱╱╱╱╱╱╱╱╱╱┃╭╯ \n┃┃╱┃┣━━┳━━┳━━┳━━┳━━┳╯╰╮ \n┃┃╱┃┃╭╮┃╭╮┃╭╮┃╭╮┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃╰╯┃╰╯┃╰╯┃╰╯┃┃┃ \n╰━━━┻━━┻━━┻━━┻━━┻━━╯╰╯", + "╭━━━╮╱╱╱╱╱╱╱╱╱╱╱╱╭━╮ \n┃╭━╮┃╱╱╱╱╱╱╱╱╱╱╱╱┃╭╯ \n┃┃╱┃┣━━┳━━┳━━┳━━┳╯╰╮ \n┃┃╱┃┃╭╮┃╭╮┃╭╮┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃╰╯┃╰╯┃╰╯┃┃┃ \n╰━━━┻━━┻━━┻━━┻━━╯╰╯", + "╭━━━╮╱╱╱╱╱╱╱╱╱╭━╮ \n┃╭━╮┃╱╱╱╱╱╱╱╱╱┃╭╯ \n┃┃╱┃┣━━┳━━┳━━┳╯╰╮ \n┃┃╱┃┃╭╮┃╭╮┃╭╮┣╮╭╯ \n┃╰━╯┃╰╯┃╰╯┃╰╯┃┃┃ \n╰━━━┻━━┻━━┻━━╯╰╯", + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + await event.edit(animation_chars[i % 40]) \ No newline at end of file diff --git a/userbot/modules/botgban.py b/userbot/modules/botgban.py new file mode 100644 index 00000000..a714581f --- /dev/null +++ b/userbot/modules/botgban.py @@ -0,0 +1,49 @@ +"""Globally Ban users from all the +Group Administrations bots where you are SUDO +Available Commands: +.gban REASON +.ungban REASON""" +import asyncio + +from telethon import events + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="bgban ?(.*)")) +async def _(event): + if Config.G_BAN_LOGGER_GROUP is None: + await event.edit("ENV VAR is not set. This module will not work.") + return + if event.fwd_from: + return + reason = event.pattern_match.group(1) + if event.reply_to_msg_id: + r = await event.get_reply_message() + if r.forward: + r_from_id = r.forward.from_id or r.from_id + else: + r_from_id = r.from_id + await borg.send_message( + Config.G_BAN_LOGGER_GROUP, + "/gban [user](tg://user?id={}) {}".format(r_from_id, reason), + ) + await event.delete() + + +@borg.on(admin_cmd(pattern="bungban ?(.*)")) +async def _(event): + if Config.G_BAN_LOGGER_GROUP is None: + await event.edit("ENV VAR is not set. This module will not work.") + return + if event.fwd_from: + return + reason = event.pattern_match.group(1) + if event.reply_to_msg_id: + r = await event.get_reply_message() + r_from_id = r.from_id + await borg.send_message( + Config.G_BAN_LOGGER_GROUP, + "/ungban [user](tg://user?id={}) {}".format(r_from_id, reason), + ) + await event.delete() \ No newline at end of file diff --git a/userbot/modules/buttonpost.py b/userbot/modules/buttonpost.py new file mode 100644 index 00000000..4e4e2eaf --- /dev/null +++ b/userbot/modules/buttonpost.py @@ -0,0 +1,94 @@ +"""Create Button Posts +""" +import re + +from telethon import custom +from uniborg.util import admin_cmd + +# regex obtained from: https://github.com/PaulSonOfLars/tgbot/blob/master/tg_bot/modules/helper_funcs/string_handling.py#L23 +BTN_URL_REGEX = re.compile( + r"(\{([^\[]+?)\}\)") + + +@borg.on(admin_cmd(pattern="cbutton")) # pylint:disable=E0602 +async def _(event): + if Config.TG_BOT_USER_NAME_BF_HER is None or tgbot is None: + await event.edit( + "need to set up a @BotFather bot for this module to work") + return + + if Config.PRIVATE_CHANNEL_BOT_API_ID is None: + await event.edit( + "need to have a `PRIVATE_CHANNEL_BOT_API_ID` for this module to work" + ) + return + + reply_message = await event.get_reply_message() + if reply_message is None: + await event.edit("reply to a message that I need to parse the magic on" + ) + return + + markdown_note = reply_message.text + prev = 0 + note_data = "" + buttons = [] + for match in BTN_URL_REGEX.finditer(markdown_note): + # Check if btnurl is escaped + n_escapes = 0 + to_check = match.start(1) - 1 + while to_check > 0 and markdown_note[to_check] == "\\": + n_escapes += 1 + to_check -= 1 + + # if even, not escaped -> create button + if n_escapes % 2 == 0: + # create a thruple with button label, url, and newline status + buttons.append( + (match.group(2), match.group(3), bool(match.group(4)))) + note_data += markdown_note[prev:match.start(1)] + prev = match.end(1) + + # if odd, escaped -> move along + else: + note_data += markdown_note[prev:to_check] + prev = match.start(1) - 1 + + note_data += markdown_note[prev:] + + message_text = note_data.strip() + tl_ib_buttons = build_keyboard(buttons) + + # logger.info(message_text) + # logger.info(tl_ib_buttons) + + tgbot_reply_message = None + if reply_message.media is not None: + message_id_in_channel = reply_message.id + tgbot_reply_message = await tgbot.get_messages( + entity=Config.PRIVATE_CHANNEL_BOT_API_ID, + ids=message_id_in_channel) + tgbot_reply_message = tgbot_reply_message.media + + await tgbot.send_message( + entity=Config.PRIVATE_CHANNEL_BOT_API_ID, + message=message_text, + parse_mode="html", + file=tgbot_reply_message, + link_preview=False, + buttons=tl_ib_buttons, + silent=True, + ) + + +# Helpers + + +def build_keyboard(buttons): + keyb = [] + for btn in buttons: + if btn[2] and keyb: + keyb[-1].append(custom.Button.url(btn[0], btn[1])) + else: + keyb.append([custom.Button.url(btn[0], btn[1])]) + return keyb \ No newline at end of file diff --git a/userbot/modules/bye.py b/userbot/modules/bye.py new file mode 100644 index 00000000..9bd092ed --- /dev/null +++ b/userbot/modules/bye.py @@ -0,0 +1,24 @@ +# Courtesy @yasirsiddiqui +""" +.bye +""" +import time + +from telethon.tl.functions.channels import LeaveChannelRequest + +from userbot.utils import admin_cmd +from userbot.utils import edit_or_reply +from userbot.utils import sudo_cmd + + +@borg.on(admin_cmd("bye", outgoing=True)) +@borg.on(sudo_cmd("bye", allow_sudo=True)) +async def leave(e): + starkgang = await edit_or_reply(e, "Bye Kek") + if not e.text[0].isalpha() and e.text[0] not in ("/", "#", "@", "!"): + await starkgang.edit("`I am leaving this chat.....!`") + time.sleep(3) + if "-" in str(e.chat_id): + await borg(LeaveChannelRequest(e.chat_id)) + else: + await starkgang.edit("`Sir This is Not A Chat`") \ No newline at end of file diff --git a/userbot/modules/calculator.py b/userbot/modules/calculator.py new file mode 100644 index 00000000..aa09d9dc --- /dev/null +++ b/userbot/modules/calculator.py @@ -0,0 +1,67 @@ +# credits to @mrconfused +import asyncio +import inspect +import io +import sys +import traceback + +from telethon import errors +from telethon import events +from telethon import functions +from telethon import types + +from userbot import CMD_HELP +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="calc")) +async def _(event): + if event.fwd_from or event.via_bot_id: + return + await event.edit("Processing ...") + cmd = event.text.split(" ", maxsplit=1)[1] + reply_to_id = event.message.id + if event.reply_to_msg_id: + reply_to_id = event.reply_to_msg_id + + san = f"print({cmd})" + old_stderr = sys.stderr + old_stdout = sys.stdout + redirected_output = sys.stdout = io.StringIO() + redirected_error = sys.stderr = io.StringIO() + stdout, stderr, exc = None, None, None + try: + await aexec(san, event) + except Exception: + exc = traceback.format_exc() + stdout = redirected_output.getvalue() + stderr = redirected_error.getvalue() + sys.stdout = old_stdout + sys.stderr = old_stderr + + evaluation = "" + if exc: + evaluation = exc + elif stderr: + evaluation = stderr + elif stdout: + evaluation = stdout + else: + evaluation = "Something went wrong" + + final_output = "**EQUATION**: `{}` \n\n **SOLUTION**: \n`{}` \n".format( + cmd, evaluation) + await event.edit(final_output) + + +async def aexec(code, event): + exec(f"async def __aexec(event): " + "".join(f"\n {l}" + for l in code.split("\n"))) + return await locals()["__aexec"](event) + + +CMD_HELP.update({ + "calc": + "`.calc` your equation :\ + \nUSAGE: solves the given maths equation by bodmass rule. " +}) \ No newline at end of file diff --git a/userbot/modules/calendar.py b/userbot/modules/calendar.py new file mode 100644 index 00000000..a63a92aa --- /dev/null +++ b/userbot/modules/calendar.py @@ -0,0 +1,40 @@ +"""Malayalam Calendar plugin for @UniBorg +SYNTAX: .calendar YYYY-MM-DD""" +import asyncio +import json +from datetime import datetime + +import requests +from telethon import events +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern="calendar (.*)")) +async def _(event): + if event.fwd_from: + return + start = datetime.now() + input_str = event.pattern_match.group(1) + input_sgra = input_str.split("-") + if len(input_sgra) == 3: + yyyy = input_sgra[0] + mm = input_sgra[1] + dd = input_sgra[2] + required_url = "https://calendar.kollavarsham.org/api/years/{}/months/{}/days/{}?lang={}".format( + yyyy, mm, dd, "en") + headers = {"Accept": "application/json"} + response_content = requests.get(required_url, headers=headers).json() + a = "" + if "error" not in response_content: + current_date_detail_arraays = response_content["months"][0][ + "days"][0] + a = json.dumps(current_date_detail_arraays, + sort_keys=True, + indent=4) + else: + a = response_content["error"] + await event.edit(str(a)) + else: + await event.edit("SYNTAX: .calendar YYYY-MM-DD") + end = datetime.now() + ms = (end - start).seconds \ No newline at end of file diff --git a/userbot/modules/call.py b/userbot/modules/call.py new file mode 100644 index 00000000..fdd097ea --- /dev/null +++ b/userbot/modules/call.py @@ -0,0 +1,54 @@ +"""Emoji +Available Commands: +.emoji shrug +.emoji apple +.emoji :/ +.emoji -_-""" +import asyncio + +from telethon import events + + +@borg.on(events.NewMessage(pattern=r"\.(.*)", outgoing=True)) +async def _(event): + + if event.fwd_from: + + return + + animation_interval = 3 + + animation_ttl = range(0, 18) + + input_str = event.pattern_match.group(1) + + if input_str == "call": + + await event.edit(input_str) + + animation_chars = [ + "`Connecting To Telegram Headquarters...`", + "`Call Connected.`", + "`Telegram: Hello This is Telegram HQ. Who is this?`", + "`Me: Yo this is` @TeleBotHelp admin ,`Please Connect me to my lil bro,Pavel Durov`", + "`User Authorised.`", + "`Calling Pavel Durov` `At +916969696969`", + "`Private Call Connected...`", + "`Me: Hello Sir, Please Ban This Telegram Account.`", + "`Pavel: May I Know Who Is This?`", + "`Me: Yo Brah, I Am` @Dark_Princ3 ", + "`Pavel: OMG!!! Long time no see, Wassup Brother...\nI'll Make Sure That Guy Account Will Get Blocked Within 24Hrs.`", + "`Me: Thanks, See You Later Brah.`", + "`Pavel: Please Don't Thank Brah, Telegram Is Our's. Just Gimme A Call When You Become Free.`", + "`Me: Is There Any Issue/Emergency???`", + "`Pavel: Yes Sur, There Is A Bug In Telegram v69.6.9.\nI Am Not Able To Fix It. If Possible, Please Help Fix The Bug.`", + "`Me: Send Me The App On My Telegram Account, I Will Fix The Bug & Send You.`", + "`Pavel: Sure Sur \nTC Bye Bye :)`", + "`Private Call Disconnected.`", + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + + await event.edit(animation_chars[i % 18]) \ No newline at end of file diff --git a/userbot/modules/chatinfo.py b/userbot/modules/chatinfo.py index e2c1a1aa..495a84f5 100644 --- a/userbot/modules/chatinfo.py +++ b/userbot/modules/chatinfo.py @@ -1,301 +1,257 @@ -# Copyright (C) 2019 The Raphielscape Company LLC. -# -# Licensed under the Raphielscape Public License, Version 1.d (the "License"); -# you may not use this file except in compliance with the License. -# -# Credits to Hitalo-Sama and FTG Modules - -from datetime import datetime -from math import sqrt - -from emoji import emojize -from telethon.errors import ( - ChannelInvalidError, - ChannelPrivateError, - ChannelPublicGroupNaError, -) -from telethon.tl.functions.channels import GetFullChannelRequest, GetParticipantsRequest -from telethon.tl.functions.messages import GetFullChatRequest, GetHistoryRequest -from telethon.tl.types import ChannelParticipantsAdmins, MessageActionChannelMigrateFrom -from telethon.utils import get_input_location - -from userbot import CMD_HELP -from userbot.events import register - - -@register(pattern=".chatinfo(?: |$)(.*)", outgoing=True) -async def info(event): - await event.edit("`Analysing the chat...`") - chat = await get_chatinfo(event) - caption = await fetch_info(chat, event) - try: - await event.edit(caption, parse_mode="html") - except Exception as e: - print("Exception:", e) - await event.edit("`An unexpected error has occurred.`") - return - - -async def get_chatinfo(event): - chat = event.pattern_match.group(1) - chat_info = None - if chat: - try: - chat = int(chat) - except ValueError: - pass - if not chat: - if event.reply_to_msg_id: - replied_msg = await event.get_reply_message() - if replied_msg.fwd_from and replied_msg.fwd_from.channel_id is not None: - chat = replied_msg.fwd_from.channel_id - else: - chat = event.chat_id - try: - chat_info = await event.client(GetFullChatRequest(chat)) - except BaseException: - try: - chat_info = await event.client(GetFullChannelRequest(chat)) - except ChannelInvalidError: - await event.edit("`Invalid channel/group`") - return None - except ChannelPrivateError: - await event.edit( - "`This is a private channel/group or I am banned from there`" - ) - return None - except ChannelPublicGroupNaError: - await event.edit("`Channel or supergroup doesn't exist`") - return None - except (TypeError, ValueError) as err: - await event.edit(str(err)) - return None - return chat_info - - -async def fetch_info(chat, event): - # chat.chats is a list so we use get_entity() to avoid IndexError - chat_obj_info = await event.client.get_entity(chat.full_chat.id) - broadcast = ( - chat_obj_info.broadcast if hasattr(chat_obj_info, "broadcast") else False - ) - chat_type = "Channel" if broadcast else "Group" - chat_title = chat_obj_info.title - warn_emoji = emojize(":warning:") - try: - msg_info = await event.client( - GetHistoryRequest( - peer=chat_obj_info.id, - offset_id=0, - offset_date=datetime(2010, 1, 1), - add_offset=-1, - limit=1, - max_id=0, - min_id=0, - hash=0, - ) - ) - except Exception as e: - msg_info = None - print("Exception:", e) - # No chance for IndexError as it checks for msg_info.messages first - first_msg_valid = ( - True - if msg_info and msg_info.messages and msg_info.messages[0].id == 1 - else False - ) - # Same for msg_info.users - creator_valid = True if first_msg_valid and msg_info.users else False - creator_id = msg_info.users[0].id if creator_valid else None - creator_firstname = ( - msg_info.users[0].first_name - if creator_valid and msg_info.users[0].first_name is not None - else "Deleted Account" - ) - creator_username = ( - msg_info.users[0].username - if creator_valid and msg_info.users[0].username is not None - else None - ) - created = msg_info.messages[0].date if first_msg_valid else None - former_title = ( - msg_info.messages[0].action.title - if first_msg_valid - and isinstance(msg_info.messages[0].action, MessageActionChannelMigrateFrom) - and msg_info.messages[0].action.title != chat_title - else None - ) - try: - dc_id, location = get_input_location(chat.full_chat.chat_photo) - except Exception as e: - dc_id = "Unknown" - str(e) - - # this is some spaghetti I need to change - description = chat.full_chat.about - members = ( - chat.full_chat.participants_count - if hasattr(chat.full_chat, "participants_count") - else chat_obj_info.participants_count - ) - admins = ( - chat.full_chat.admins_count if hasattr(chat.full_chat, "admins_count") else None - ) - banned_users = ( - chat.full_chat.kicked_count if hasattr(chat.full_chat, "kicked_count") else None - ) - restrcited_users = ( - chat.full_chat.banned_count if hasattr(chat.full_chat, "banned_count") else None - ) - members_online = ( - chat.full_chat.online_count if hasattr(chat.full_chat, "online_count") else 0 - ) - group_stickers = ( - chat.full_chat.stickerset.title - if hasattr(chat.full_chat, "stickerset") and chat.full_chat.stickerset - else None - ) - messages_viewable = msg_info.count if msg_info else None - messages_sent = ( - chat.full_chat.read_inbox_max_id - if hasattr(chat.full_chat, "read_inbox_max_id") - else None - ) - messages_sent_alt = ( - chat.full_chat.read_outbox_max_id - if hasattr(chat.full_chat, "read_outbox_max_id") - else None - ) - exp_count = chat.full_chat.pts if hasattr(chat.full_chat, "pts") else None - username = chat_obj_info.username if hasattr(chat_obj_info, "username") else None - bots_list = chat.full_chat.bot_info # this is a list - bots = 0 - supergroup = ( - "Yes" - if hasattr(chat_obj_info, "megagroup") and chat_obj_info.megagroup - else "No" - ) - slowmode = ( - "Yes" - if hasattr(chat_obj_info, "slowmode_enabled") and chat_obj_info.slowmode_enabled - else "No" - ) - slowmode_time = ( - chat.full_chat.slowmode_seconds - if hasattr(chat_obj_info, "slowmode_enabled") and chat_obj_info.slowmode_enabled - else None - ) - restricted = ( - "Yes" - if hasattr(chat_obj_info, "restricted") and chat_obj_info.restricted - else "No" - ) - verified = ( - "Yes" - if hasattr(chat_obj_info, "verified") and chat_obj_info.verified - else "No" - ) - username = "@{}".format(username) if username else None - creator_username = "@{}".format(creator_username) if creator_username else None - # end of spaghetti block - - if admins is None: - # use this alternative way if chat.full_chat.admins_count is None, - # works even without being an admin - try: - participants_admins = await event.client( - GetParticipantsRequest( - channel=chat.full_chat.id, - filter=ChannelParticipantsAdmins(), - offset=0, - limit=0, - hash=0, - ) - ) - admins = participants_admins.count if participants_admins else None - except Exception as e: - print("Exception:", e) - if bots_list: - for bot in bots_list: - bots += 1 - - caption = "CHAT INFO:\n" - caption += f"ID: {chat_obj_info.id}\n" - if chat_title is not None: - caption += f"{chat_type} name: {chat_title}\n" - if former_title is not None: # Meant is the very first title - caption += f"Former name: {former_title}\n" - if username is not None: - caption += f"{chat_type} type: Public\n" - caption += f"Link: {username}\n" - else: - caption += f"{chat_type} type: Private\n" - if creator_username is not None: - caption += f"Creator: {creator_username}\n" - elif creator_valid: - caption += ( - f'Creator: {creator_firstname}\n' - ) - if created is not None: - caption += f"Created: {created.date().strftime('%b %d, %Y')} - {created.time()}\n" - else: - caption += f"Created: {chat_obj_info.date.date().strftime('%b %d, %Y')} - {chat_obj_info.date.time()} {warn_emoji}\n" - caption += f"Data Centre ID: {dc_id}\n" - if exp_count is not None: - chat_level = int((1 + sqrt(1 + 7 * exp_count / 14)) / 2) - caption += f"{chat_type} level: {chat_level}\n" - if messages_viewable is not None: - caption += f"Viewable messages: {messages_viewable}\n" - if messages_sent: - caption += f"Messages sent: {messages_sent}\n" - elif messages_sent_alt: - caption += f"Messages sent: {messages_sent_alt} {warn_emoji}\n" - if members is not None: - caption += f"Members: {members}\n" - if admins is not None: - caption += f"Administrators: {admins}\n" - if bots_list: - caption += f"Bots: {bots}\n" - if members_online: - caption += f"Currently online: {members_online}\n" - if restrcited_users is not None: - caption += f"Restricted users: {restrcited_users}\n" - if banned_users is not None: - caption += f"Banned users: {banned_users}\n" - if group_stickers is not None: - caption += f'{chat_type} stickers: {group_stickers}\n' - caption += "\n" - if not broadcast: - caption += f"Slow mode: {slowmode}" - if ( - hasattr(chat_obj_info, "slowmode_enabled") - and chat_obj_info.slowmode_enabled - ): - caption += f", {slowmode_time}s\n\n" - else: - caption += "\n\n" - if not broadcast: - caption += f"Supergroup: {supergroup}\n\n" - if hasattr(chat_obj_info, "restricted"): - caption += f"Restricted: {restricted}\n" - if chat_obj_info.restricted: - caption += f"> Platform: {chat_obj_info.restriction_reason[0].platform}\n" - caption += f"> Reason: {chat_obj_info.restriction_reason[0].reason}\n" - caption += f"> Text: {chat_obj_info.restriction_reason[0].text}\n\n" - else: - caption += "\n" - if hasattr(chat_obj_info, "scam") and chat_obj_info.scam: - caption += "Scam: Yes\n\n" - if hasattr(chat_obj_info, "verified"): - caption += f"Verified by Telegram: {verified}\n\n" - if description: - caption += f"Description: \n{description}\n" - return caption - - -CMD_HELP.update( - { - "chatinfo": ".chatinfo [optional: ]\ - \nUsage: Gets info of a chat. Some info might be limited due to missing permissions." - } -) +# Copyright (C) 2019 The Raphielscape Company LLC. +# +# Licensed under the Raphielscape Public License, Version 1.d (the "License"); +# you may not use this file except in compliance with the License. +# +# Credits to Hitalo-Sama and FTG Modules +from datetime import datetime +from math import sqrt + +from emoji import emojize +from telethon.errors import ChannelInvalidError +from telethon.errors import ChannelPrivateError +from telethon.errors import ChannelPublicGroupNaError +from telethon.tl.functions.channels import GetFullChannelRequest +from telethon.tl.functions.channels import GetParticipantsRequest +from telethon.tl.functions.messages import GetFullChatRequest +from telethon.tl.functions.messages import GetHistoryRequest +from telethon.tl.types import ChannelParticipantsAdmins +from telethon.tl.types import MessageActionChannelMigrateFrom +from telethon.utils import get_input_location + +from userbot import CMD_HELP +from userbot.events import register + + +@register(pattern=".chatinfo(?: |$)(.*)", outgoing=True) +async def info(event): + await event.edit("`Analysing the chat...`") + chat = await get_chatinfo(event) + caption = await fetch_info(chat, event) + try: + await event.edit(caption, parse_mode="html") + except Exception as e: + print("Exception:", e) + await event.edit("`An unexpected error has occurred.`") + return + + +async def get_chatinfo(event): + chat = event.pattern_match.group(1) + chat_info = None + if chat: + try: + chat = int(chat) + except ValueError: + pass + if not chat: + if event.reply_to_msg_id: + replied_msg = await event.get_reply_message() + if replied_msg.fwd_from and replied_msg.fwd_from.channel_id is not None: + chat = replied_msg.fwd_from.channel_id + else: + chat = event.chat_id + try: + chat_info = await event.client(GetFullChatRequest(chat)) + except BaseException: + try: + chat_info = await event.client(GetFullChannelRequest(chat)) + except ChannelInvalidError: + await event.edit("`Invalid channel/group`") + return None + except ChannelPrivateError: + await event.edit( + "`This is a private channel/group or I am banned from there`") + return None + except ChannelPublicGroupNaError: + await event.edit("`Channel or supergroup doesn't exist`") + return None + except (TypeError, ValueError) as err: + await event.edit(str(err)) + return None + return chat_info + + +async def fetch_info(chat, event): + # chat.chats is a list so we use get_entity() to avoid IndexError + chat_obj_info = await event.client.get_entity(chat.full_chat.id) + broadcast = (chat_obj_info.broadcast + if hasattr(chat_obj_info, "broadcast") else False) + chat_type = "Channel" if broadcast else "Group" + chat_title = chat_obj_info.title + warn_emoji = emojize(":warning:") + try: + msg_info = await event.client( + GetHistoryRequest( + peer=chat_obj_info.id, + offset_id=0, + offset_date=datetime(2010, 1, 1), + add_offset=-1, + limit=1, + max_id=0, + min_id=0, + hash=0, + )) + except Exception as e: + msg_info = None + print("Exception:", e) + # No chance for IndexError as it checks for msg_info.messages first + first_msg_valid = (True if msg_info and msg_info.messages + and msg_info.messages[0].id == 1 else False) + # Same for msg_info.users + creator_valid = True if first_msg_valid and msg_info.users else False + creator_id = msg_info.users[0].id if creator_valid else None + creator_firstname = (msg_info.users[0].first_name if creator_valid + and msg_info.users[0].first_name is not None else + "Deleted Account") + creator_username = (msg_info.users[0].username if creator_valid + and msg_info.users[0].username is not None else None) + created = msg_info.messages[0].date if first_msg_valid else None + former_title = ( + msg_info.messages[0].action.title if first_msg_valid and isinstance( + msg_info.messages[0].action, MessageActionChannelMigrateFrom) + and msg_info.messages[0].action.title != chat_title else None) + try: + dc_id, location = get_input_location(chat.full_chat.chat_photo) + except Exception as e: + dc_id = "Unknown" + str(e) + + # this is some spaghetti I need to change + description = chat.full_chat.about + members = (chat.full_chat.participants_count if hasattr( + chat.full_chat, "participants_count") else + chat_obj_info.participants_count) + admins = (chat.full_chat.admins_count + if hasattr(chat.full_chat, "admins_count") else None) + banned_users = (chat.full_chat.kicked_count if hasattr( + chat.full_chat, "kicked_count") else None) + restrcited_users = (chat.full_chat.banned_count if hasattr( + chat.full_chat, "banned_count") else None) + members_online = (chat.full_chat.online_count if hasattr( + chat.full_chat, "online_count") else 0) + group_stickers = (chat.full_chat.stickerset.title + if hasattr(chat.full_chat, "stickerset") + and chat.full_chat.stickerset else None) + messages_viewable = msg_info.count if msg_info else None + messages_sent = (chat.full_chat.read_inbox_max_id if hasattr( + chat.full_chat, "read_inbox_max_id") else None) + messages_sent_alt = (chat.full_chat.read_outbox_max_id if hasattr( + chat.full_chat, "read_outbox_max_id") else None) + exp_count = chat.full_chat.pts if hasattr(chat.full_chat, "pts") else None + username = chat_obj_info.username if hasattr(chat_obj_info, + "username") else None + bots_list = chat.full_chat.bot_info # this is a list + bots = 0 + supergroup = ("Yes" if hasattr(chat_obj_info, "megagroup") + and chat_obj_info.megagroup else "No") + slowmode = ("Yes" if hasattr(chat_obj_info, "slowmode_enabled") + and chat_obj_info.slowmode_enabled else "No") + slowmode_time = (chat.full_chat.slowmode_seconds + if hasattr(chat_obj_info, "slowmode_enabled") + and chat_obj_info.slowmode_enabled else None) + restricted = ("Yes" if hasattr(chat_obj_info, "restricted") + and chat_obj_info.restricted else "No") + verified = ("Yes" if hasattr(chat_obj_info, "verified") + and chat_obj_info.verified else "No") + username = "@{}".format(username) if username else None + creator_username = "@{}".format( + creator_username) if creator_username else None + # end of spaghetti block + + if admins is None: + # use this alternative way if chat.full_chat.admins_count is None, + # works even without being an admin + try: + participants_admins = await event.client( + GetParticipantsRequest( + channel=chat.full_chat.id, + filter=ChannelParticipantsAdmins(), + offset=0, + limit=0, + hash=0, + )) + admins = participants_admins.count if participants_admins else None + except Exception as e: + print("Exception:", e) + if bots_list: + for bot in bots_list: + bots += 1 + + caption = "CHAT INFO:\n" + caption += f"ID: {chat_obj_info.id}\n" + if chat_title is not None: + caption += f"{chat_type} name: {chat_title}\n" + if former_title is not None: # Meant is the very first title + caption += f"Former name: {former_title}\n" + if username is not None: + caption += f"{chat_type} type: Public\n" + caption += f"Link: {username}\n" + else: + caption += f"{chat_type} type: Private\n" + if creator_username is not None: + caption += f"Creator: {creator_username}\n" + elif creator_valid: + caption += ( + f'Creator: {creator_firstname}\n' + ) + if created is not None: + caption += f"Created: {created.date().strftime('%b %d, %Y')} - {created.time()}\n" + else: + caption += f"Created: {chat_obj_info.date.date().strftime('%b %d, %Y')} - {chat_obj_info.date.time()} {warn_emoji}\n" + caption += f"Data Centre ID: {dc_id}\n" + if exp_count is not None: + chat_level = int((1 + sqrt(1 + 7 * exp_count / 14)) / 2) + caption += f"{chat_type} level: {chat_level}\n" + if messages_viewable is not None: + caption += f"Viewable messages: {messages_viewable}\n" + if messages_sent: + caption += f"Messages sent: {messages_sent}\n" + elif messages_sent_alt: + caption += f"Messages sent: {messages_sent_alt} {warn_emoji}\n" + if members is not None: + caption += f"Members: {members}\n" + if admins is not None: + caption += f"Administrators: {admins}\n" + if bots_list: + caption += f"Bots: {bots}\n" + if members_online: + caption += f"Currently online: {members_online}\n" + if restrcited_users is not None: + caption += f"Restricted users: {restrcited_users}\n" + if banned_users is not None: + caption += f"Banned users: {banned_users}\n" + if group_stickers is not None: + caption += f'{chat_type} stickers: {group_stickers}\n' + caption += "\n" + if not broadcast: + caption += f"Slow mode: {slowmode}" + if (hasattr(chat_obj_info, "slowmode_enabled") + and chat_obj_info.slowmode_enabled): + caption += f", {slowmode_time}s\n\n" + else: + caption += "\n\n" + if not broadcast: + caption += f"Supergroup: {supergroup}\n\n" + if hasattr(chat_obj_info, "restricted"): + caption += f"Restricted: {restricted}\n" + if chat_obj_info.restricted: + caption += f"> Platform: {chat_obj_info.restriction_reason[0].platform}\n" + caption += f"> Reason: {chat_obj_info.restriction_reason[0].reason}\n" + caption += f"> Text: {chat_obj_info.restriction_reason[0].text}\n\n" + else: + caption += "\n" + if hasattr(chat_obj_info, "scam") and chat_obj_info.scam: + caption += "Scam: Yes\n\n" + if hasattr(chat_obj_info, "verified"): + caption += f"Verified by Telegram: {verified}\n\n" + if description: + caption += f"Description: \n{description}\n" + return caption + + +CMD_HELP.update({ + "chatinfo": + ".chatinfo [optional: ]\ + \nUsage: Gets info of a chat. Some info might be limited due to missing permissions." +}) \ No newline at end of file diff --git a/userbot/modules/clock_name.py b/userbot/modules/clock_name.py new file mode 100644 index 00000000..feaecbd7 --- /dev/null +++ b/userbot/modules/clock_name.py @@ -0,0 +1,40 @@ +"""COMMAND : .cname""" +import asyncio +import time + +from telethon.errors import FloodWaitError +from telethon.tl import functions + +from userbot import ALIVE_NAME +from userbot import CMD_HELP +from userbot.utils import admin_cmd + +DEL_TIME_OUT = 60 + +DEFAULTUSER = (str(ALIVE_NAME) + if ALIVE_NAME else "Set ALIVE_NAME in config vars in Heroku") + + +@borg.on(admin_cmd(pattern="cname")) # pylint:disable=E0602 +async def _(event): + if event.fwd_from: + return + while True: + DMY = time.strftime("%d.%m.%y") + HM = time.strftime("%H:%M") + name = f"{HM}🔥{DEFAULTUSER}🔥{DMY}" + logger.info(name) + try: + await borg( + functions.account.UpdateProfileRequest( # pylint:disable=E0602 + last_name=name)) + except FloodWaitError as ex: + logger.warning(str(e)) + await asyncio.sleep(ex.seconds) + # else: + # logger.info(r.stringify()) + # await borg.send_message( # pylint:disable=E0602 + # Config.PRIVATE_GROUP_BOT_API_ID, # pylint:disable=E0602 + # "Changed Profile Picture" + # ) + await asyncio.sleep(DEL_TIME_OUT) \ No newline at end of file diff --git a/userbot/modules/ctext.py b/userbot/modules/ctext.py new file mode 100644 index 00000000..5000d2d3 --- /dev/null +++ b/userbot/modules/ctext.py @@ -0,0 +1,27 @@ +import asyncio +import os +import sys + +from telethon import events + +from userbot import utils + + +@borg.on(utils.admin_cmd(pattern="ctext ?(.*)")) +async def payf(event): + paytext = event.pattern_match.group(1) + pay = "{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}\n{}".format( + paytext * 8, + paytext * 8, + paytext * 2, + paytext * 2, + paytext * 2, + paytext * 2, + paytext * 2, + paytext * 2, + paytext * 2, + paytext * 2, + paytext * 8, + paytext * 8, + ) + await event.edit(pay) \ No newline at end of file diff --git a/userbot/modules/ctg.py b/userbot/modules/ctg.py new file mode 100644 index 00000000..0463d0e5 --- /dev/null +++ b/userbot/modules/ctg.py @@ -0,0 +1,36 @@ +import datetime + +from telethon import events +from telethon.errors.rpcerrorlist import YouBlockedUserError +from telethon.tl.functions.account import UpdateNotifySettingsRequest +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern="ctg ?(.*)")) +async def _(event): + if event.fwd_from: + return + if not event.reply_to_msg_id: + await event.edit("```Reply to a Link.```") + return + reply_message = await event.get_reply_message() + if not reply_message.text: + await event.edit("```Reply to a Link```") + return + chat = "@chotamreaderbot" + sender = reply_message.sender + await event.edit("```Processing```") + async with event.client.conversation(chat) as conv: + try: + response = conv.wait_event( + events.NewMessage(incoming=True, from_users=272572121)) + await event.client.forward_messages(chat, reply_message) + response = await response + except YouBlockedUserError: + await event.reply("`RIP Check Your Blacklist Boss`") + return + if response.text.startswith(""): + await event.edit("Am I Dumb Or Am I Dumb?") + else: + await event.delete() + await event.client.send_message(event.chat_id, response.message) \ No newline at end of file diff --git a/userbot/modules/dartndice.py b/userbot/modules/dartndice.py new file mode 100644 index 00000000..c14bbc90 --- /dev/null +++ b/userbot/modules/dartndice.py @@ -0,0 +1,32 @@ +from telethon.tl.types import InputMediaDice + +from userbot.utils import admin_cmd + +# EMOJI CONSTANTS +DART_E_MOJI = "🎯" +DICE_E_MOJI = "🎲" +BALL_E_MOJI = "🏀" +# EMOJI CONSTANTS + + +@borg.on( + admin_cmd(pattern=f"({DART_E_MOJI}|{DICE_E_MOJI}|{BALL_E_MOJI}) ?(.*)")) +async def _(event): + if event.fwd_from: + return + reply_message = event + if event.reply_to_msg_id: + reply_message = await event.get_reply_message() + emoticon = event.pattern_match.group(1) + input_str = event.pattern_match.group(2) + await event.delete() + r = await reply_message.reply(file=InputMediaDice(emoticon=emoticon)) + if input_str: + try: + required_number = int(input_str) + while not r.media.value == required_number: + await r.delete() + r = await reply_message.reply(file=InputMediaDice( + emoticon=emoticon)) + except: + pass \ No newline at end of file diff --git a/userbot/modules/dice_dart_ball.py b/userbot/modules/dice_dart_ball.py new file mode 100644 index 00000000..c14bbc90 --- /dev/null +++ b/userbot/modules/dice_dart_ball.py @@ -0,0 +1,32 @@ +from telethon.tl.types import InputMediaDice + +from userbot.utils import admin_cmd + +# EMOJI CONSTANTS +DART_E_MOJI = "🎯" +DICE_E_MOJI = "🎲" +BALL_E_MOJI = "🏀" +# EMOJI CONSTANTS + + +@borg.on( + admin_cmd(pattern=f"({DART_E_MOJI}|{DICE_E_MOJI}|{BALL_E_MOJI}) ?(.*)")) +async def _(event): + if event.fwd_from: + return + reply_message = event + if event.reply_to_msg_id: + reply_message = await event.get_reply_message() + emoticon = event.pattern_match.group(1) + input_str = event.pattern_match.group(2) + await event.delete() + r = await reply_message.reply(file=InputMediaDice(emoticon=emoticon)) + if input_str: + try: + required_number = int(input_str) + while not r.media.value == required_number: + await r.delete() + r = await reply_message.reply(file=InputMediaDice( + emoticon=emoticon)) + except: + pass \ No newline at end of file diff --git a/userbot/modules/dlinks.py b/userbot/modules/dlinks.py new file mode 100644 index 00000000..138fe05f --- /dev/null +++ b/userbot/modules/dlinks.py @@ -0,0 +1,337 @@ +# Copyright (C) 2019 The Raphielscape Company LLC. +# +# Licensed under the Raphielscape Public License, Version 1.d (the "License"); +# you may not use this file except in compliance with the License. +# Re-written by @its_xditya for TeleBot +""" Userbot module containing various sites direct links generators""" +import json +import re +import urllib.parse +from random import choice +from subprocess import PIPE +from subprocess import Popen + +import requests +from bs4 import BeautifulSoup +from humanize import naturalsize + +from userbot import CMD_HELP +from userbot.events import register + + +def subprocess_run(cmd): + reply = "" + subproc = Popen( + cmd, + stdout=PIPE, + stderr=PIPE, + shell=True, + universal_newlines=True, + executable="bash", + ) + talk = subproc.communicate() + exitCode = subproc.returncode + if exitCode != 0: + reply += ("```An error was detected while running the subprocess:\n" + f"exit code: {exitCode}\n" + f"stdout: {talk[0]}\n" + f"stderr: {talk[1]}```") + return reply + return talk + + +@register(outgoing=True, pattern=r"^\.direct(?: |$)([\s\S]*)") +async def direct_link_generator(request): + """ direct links generator """ + await request.edit("`Processing...`") + textx = await request.get_reply_message() + message = request.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await request.edit("`Usage: .direct `") + return + reply = "" + links = re.findall(r"\bhttps?://.*\.\S+", message) + if not links: + reply = "`No links found!`" + await request.edit(reply) + for link in links: + if "drive.google.com" in link: + reply += gdrive(link) + elif "zippyshare.com" in link: + reply += zippy_share(link) + elif "yadi.sk" in link: + reply += yandex_disk(link) + elif "cloud.mail.ru" in link: + reply += cm_ru(link) + elif "mediafire.com" in link: + reply += mediafire(link) + elif "sourceforge.net" in link: + reply += sourceforge(link) + elif "osdn.net" in link: + reply += osdn(link) + elif "androidfilehost.com" in link: + reply += androidfilehost(link) + else: + reply += re.findall(r"\bhttps?://(.*?[^/]+)", + link)[0] + "is not supported" + await request.edit(reply) + + +def gdrive(url: str) -> str: + """ GDrive direct links generator """ + drive = "https://drive.google.com" + try: + link = re.findall(r"\bhttps?://drive\.google\.com\S+", url)[0] + except IndexError: + reply = "`No Google drive links found`\n" + return reply + file_id = "" + reply = "" + if link.find("view") != -1: + file_id = link.split("/")[-2] + elif link.find("open?id=") != -1: + file_id = link.split("open?id=")[1].strip() + elif link.find("uc?id=") != -1: + file_id = link.split("uc?id=")[1].strip() + url = f"{drive}/uc?export=download&id={file_id}" + download = requests.get(url, stream=True, allow_redirects=False) + cookies = download.cookies + try: + # In case of small file size, Google downloads directly + dl_url = download.headers["location"] + if "accounts.google.com" in dl_url: # non-public file + reply += "`Link is not public!`\n" + return reply + name = "Direct Download Link" + except KeyError: + # In case of download warning page + page = BeautifulSoup(download.content, "lxml") + export = drive + page.find("a", {"id": "uc-download-link"}).get("href") + name = page.find("span", {"class": "uc-name-size"}).text + response = requests.get(export, + stream=True, + allow_redirects=False, + cookies=cookies) + dl_url = response.headers["location"] + if "accounts.google.com" in dl_url: + reply += "Link is not public!" + return reply + reply += f"[{name}]({dl_url})\n" + return reply + + +def zippy_share(url: str) -> str: + """ZippyShare direct links generator + Based on https://github.com/LameLemon/ziggy""" + reply = "" + dl_url = "" + try: + link = re.findall(r"\bhttps?://.*zippyshare\.com\S+", url)[0] + except IndexError: + reply = "`No ZippyShare links found`\n" + return reply + session = requests.Session() + base_url = re.search("http.+.com", link).group() + response = session.get(link) + page_soup = BeautifulSoup(response.content, "lxml") + scripts = page_soup.find_all("script", {"type": "text/javascript"}) + for script in scripts: + if "getElementById('dlbutton')" in script.text: + url_raw = re.search(r"= (?P\".+\" \+ (?P\(.+\)) .+);", + script.text).group("url") + math = re.search(r"= (?P\".+\" \+ (?P\(.+\)) .+);", + script.text).group("math") + dl_url = url_raw.replace(math, '"' + str(eval(math)) + '"') + break + dl_url = base_url + eval(dl_url) + name = urllib.parse.unquote(dl_url.split("/")[-1]) + reply += f"[{name}]({dl_url})\n" + return reply + + +def yandex_disk(url: str) -> str: + """Yandex.Disk direct links generator + Based on https://github.com/wldhx/yadisk-direct""" + reply = "" + try: + link = re.findall(r"\bhttps?://.*yadi\.sk\S+", url)[0] + except IndexError: + reply = "`No Yandex.Disk links found`\n" + return reply + api = "https://cloud-api.yandex.net/v1/disk/public/resources/download?public_key={}" + try: + dl_url = requests.get(api.format(link)).json()["href"] + name = dl_url.split("filename=")[1].split("&disposition")[0] + reply += f"[{name}]({dl_url})\n" + except KeyError: + reply += "`Error: File not found / Download limit reached`\n" + return reply + return reply + + +def cm_ru(url: str) -> str: + """cloud.mail.ru direct links generator + Using https://github.com/JrMasterModelBuilder/cmrudl.py""" + reply = "" + try: + link = re.findall(r"\bhttps?://.*cloud\.mail\.ru\S+", url)[0] + except IndexError: + reply = "`No cloud.mail.ru links found`\n" + return reply + cmd = f"bin/cmrudl -s {link}" + result = subprocess_run(cmd) + try: + result = result[0].splitlines()[-1] + data = json.loads(result) + except json.decoder.JSONDecodeError: + reply += "`Error: Can't extract the link`\n" + return reply + except IndexError: + return reply + dl_url = data["download"] + name = data["file_name"] + size = naturalsize(int(data["file_size"])) + reply += f"[{name} ({size})]({dl_url})\n" + return reply + + +def mediafire(url: str) -> str: + """ MediaFire direct links generator """ + try: + link = re.findall(r"\bhttps?://.*mediafire\.com\S+", url)[0] + except IndexError: + reply = "`No MediaFire links found`\n" + return reply + reply = "" + page = BeautifulSoup(requests.get(link).content, "lxml") + info = page.find("a", {"aria-label": "Download file"}) + dl_url = info.get("href") + size = re.findall(r"\(.*\)", info.text)[0] + name = page.find("div", {"class": "filename"}).text + reply += f"[{name} {size}]({dl_url})\n" + return reply + + +def sourceforge(url: str) -> str: + """ SourceForge direct links generator """ + try: + link = re.findall(r"\bhttps?://.*sourceforge\.net\S+", url)[0] + except IndexError: + reply = "`No SourceForge links found`\n" + return reply + file_path = re.findall(r"files(.*)/download", link)[0] + reply = f"Mirrors for __{file_path.split('/')[-1]}__\n" + project = re.findall(r"projects?/(.*?)/files", link)[0] + mirrors = (f"https://sourceforge.net/settings/mirror_choices?" + f"projectname={project}&filename={file_path}") + page = BeautifulSoup(requests.get(mirrors).content, "html.parser") + info = page.find("ul", {"id": "mirrorList"}).findAll("li") + for mirror in info[1:]: + name = re.findall(r"\((.*)\)", mirror.text.strip())[0] + dl_url = ( + f'https://{mirror["id"]}.dl.sourceforge.net/project/{project}/{file_path}' + ) + reply += f"[{name}]({dl_url}) " + return reply + + +def osdn(url: str) -> str: + """ OSDN direct links generator """ + osdn_link = "https://osdn.net" + try: + link = re.findall(r"\bhttps?://.*osdn\.net\S+", url)[0] + except IndexError: + reply = "`No OSDN links found`\n" + return reply + page = BeautifulSoup( + requests.get(link, allow_redirects=True).content, "lxml") + info = page.find("a", {"class": "mirror_link"}) + link = urllib.parse.unquote(osdn_link + info["href"]) + reply = f"Mirrors for __{link.split('/')[-1]}__\n" + mirrors = page.find("form", {"id": "mirror-select-form"}).findAll("tr") + for data in mirrors[1:]: + mirror = data.find("input")["value"] + name = re.findall(r"\((.*)\)", data.findAll("td")[-1].text.strip())[0] + dl_url = re.sub(r"m=(.*)&f", f"m={mirror}&f", link) + reply += f"[{name}]({dl_url}) " + return reply + + +def androidfilehost(url: str) -> str: + """ AFH direct links generator """ + try: + link = re.findall(r"\bhttps?://.*androidfilehost.*fid.*\S+", url)[0] + except IndexError: + reply = "`No AFH links found`\n" + return reply + fid = re.findall(r"\?fid=(.*)", link)[0] + session = requests.Session() + user_agent = useragent() + headers = {"user-agent": user_agent} + res = session.get(link, headers=headers, allow_redirects=True) + headers = { + "origin": "https://androidfilehost.com", + "accept-encoding": "gzip, deflate, br", + "accept-language": "en-US,en;q=0.9", + "user-agent": user_agent, + "content-type": "application/x-www-form-urlencoded; charset=UTF-8", + "x-mod-sbb-ctype": "xhr", + "accept": "*/*", + "referer": f"https://androidfilehost.com/?fid={fid}", + "authority": "androidfilehost.com", + "x-requested-with": "XMLHttpRequest", + } + data = { + "submit": "submit", + "action": "getdownloadmirrors", + "fid": f"{fid}" + } + mirrors = None + reply = "" + error = "`Error: Can't find Mirrors for the link`\n" + try: + req = session.post( + "https://androidfilehost.com/libs/otf/mirrors.otf.php", + headers=headers, + data=data, + cookies=res.cookies, + ) + mirrors = req.json()["MIRRORS"] + except (json.decoder.JSONDecodeError, TypeError): + reply += error + if not mirrors: + reply += error + return reply + for item in mirrors: + name = item["name"] + dl_url = item["url"] + reply += f"[{name}]({dl_url}) " + return reply + + +def useragent(): + """ + useragent random setter + """ + useragents = BeautifulSoup( + requests.get( + "https://developers.whatismybrowser.com/" + "useragents/explore/operating_system_name/android/").content, + "lxml", + ).findAll("td", {"class": "useragent"}) + user_agent = choice(useragents) + return user_agent.text + + +CMD_HELP.update({ + "direct": + ".direct \n" + "Usage: Generate direct download link from supported URL(s)\n" + "Supported websites:\n" + "`Google Drive - MEGA.nz - Cloud Mail - Yandex.Disk - AFH - " + "ZippyShare - MediaFire - SourceForge - OSDN - GitHub`" +}) \ No newline at end of file diff --git a/userbot/modules/funnyfonts.py b/userbot/modules/funnyfonts.py new file mode 100644 index 00000000..cf93fac0 --- /dev/null +++ b/userbot/modules/funnyfonts.py @@ -0,0 +1,188 @@ +""" plugin is modified by @sn12384 """ +import asyncio +import random +import re +import time + +import requests +from telethon import events + +from userbot import CMD_HELP +from userbot import fonts +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="str(?: |$)(.*)")) +async def stretch(stret): + textx = await stret.get_reply_message() + message = stret.text + message = stret.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await stret.edit("`GiiiiiiiB sooooooomeeeeeee teeeeeeext!`") + return + + count = random.randint(3, 10) + reply_text = re.sub(r"([aeiouAEIOUaeiouAEIOUаеиоуюяыэё])", (r"\1" * count), + message) + await stret.edit(reply_text) + + +@borg.on(admin_cmd(pattern="zal(?: |$)(.*)")) +async def zal(zgfy): + reply_text = list() + textx = await zgfy.get_reply_message() + message = zgfy.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await zgfy.edit( + "`gͫ ̆ i̛ ̺ v͇̆ ȅͅ a̢ͦ s̴̪ c̸̢ ä̸ rͩͣ y͖͞ t̨͚ é̠ x̢͖ t͔͛`" + ) + return + + for charac in message: + if not charac.isalpha(): + reply_text.append(charac) + continue + + for _ in range(0, 3): + randint = random.randint(0, 2) + + if randint == 0: + charac = charac.strip() + random.choice( + fonts.ZALG_LIST[0]).strip() + elif randint == 1: + charac = charac.strip() + random.choice( + fonts.ZALG_LIST[1]).strip() + else: + charac = charac.strip() + random.choice( + fonts.ZALG_LIST[2]).strip() + + reply_text.append(charac) + + await zgfy.edit("".join(reply_text)) + + +@borg.on(admin_cmd(pattern="cp(?: |$)(.*)")) +async def copypasta(cp_e): + textx = await cp_e.get_reply_message() + message = cp_e.pattern_match.group(1) + + if message: + pass + elif textx: + message = textx.text + else: + await cp_e.edit("`😂🅱️IvE👐sOME👅text👅for✌️Me👌tO👐MAkE👀iT💞funNy!💦`") + return + + reply_text = random.choice(fonts.EMOJIS) + b_char = random.choice(message).lower( + ) # choose a random character in the message to be substituted with 🅱️ + for owo in message: + if owo == " ": + reply_text += random.choice(fonts.EMOJIS) + elif owo in fonts.EMOJIS: + reply_text += owo + reply_text += random.choice(fonts.EMOJIS) + elif owo.lower() == b_char: + reply_text += "🅱️" + else: + if bool(random.getrandbits(1)): + reply_text += owo.upper() + else: + reply_text += owo.lower() + reply_text += random.choice(fonts.EMOJIS) + await cp_e.edit(reply_text) + + +@borg.on(admin_cmd(pattern="weeb(?: |$)(.*)")) +async def weebify(event): + args = event.pattern_match.group(1) + if not args: + get = await event.get_reply_message() + args = get.text + if not args: + await event.edit("`What I am Supposed to Weebify `") + return + string = " ".join(args).lower() + for normiecharacter in string: + if normiecharacter in fonts.normiefont: + weebycharacter = fonts.weebyfont[fonts.normiefont.index( + normiecharacter)] + string = string.replace(normiecharacter, weebycharacter) + await event.edit(string) + + +@borg.on(admin_cmd(pattern="downside(?: |$)(.*)")) +async def stylish_generator(event): + args = event.pattern_match.group(1) + if not args: + get = await event.get_reply_message() + args = get.text + if not args: + await event.edit("What I am Supposed to change give text") + return + string = " ".join(args).lower() + for upsidecharacter in string: + if upsidecharacter in fonts.upsidefont: + downsidecharacter = fonts.downsidefont[fonts.upsidefont.index( + upsidecharacter)] + string = string.replace(upsidecharacter, downsidecharacter) + await event.edit(string) + + +@borg.on(admin_cmd(pattern="subscript(?: |$)(.*)")) +async def stylish_generator(event): + args = event.pattern_match.group(1) + if not args: + get = await event.get_reply_message() + args = get.text + if not args: + await event.edit("What I am Supposed to change give text") + return + string = " ".join(args).lower() + for normaltextcharacter in string: + if normaltextcharacter in fonts.normaltext: + subscriptcharacter = fonts.subscriptfont[fonts.normaltext.index( + normaltextcharacter)] + string = string.replace(normaltextcharacter, subscriptcharacter) + await event.edit(string) + + +@borg.on(admin_cmd(pattern="superscript(?: |$)(.*)")) +async def stylish_generator(event): + args = event.pattern_match.group(1) + if not args: + get = await event.get_reply_message() + args = get.text + if not args: + await event.edit("What I am Supposed to change give text") + return + string = " ".join(args).lower() + for normaltextcharacter in string: + if normaltextcharacter in fonts.normaltext: + superscriptcharacter = fonts.superscriptfont[ + fonts.normaltext.index(normaltextcharacter)] + string = string.replace(normaltextcharacter, superscriptcharacter) + await event.edit(string) + + +CMD_HELP.update({ + "funnyfonts": + ".cp (text) or .cp reply to message \ +\nUsage: inserts some emojis in between the texts\ +\n\n.str (text) or .str reply to message \ +\nUsage: Stretchs the given message.\ +\n\n.zal (text) or .zal reply to message \ +\nUsage: Invoke the feeling of chaos.\ +\n\n.weeb (text) or .weeb reply to message \ +\nUsage: a different style of alphabets .\ +" +}) \ No newline at end of file diff --git a/userbot/modules/gaana.py b/userbot/modules/gaana.py new file mode 100644 index 00000000..ac92c988 --- /dev/null +++ b/userbot/modules/gaana.py @@ -0,0 +1,126 @@ +# Port to UserBot +# modified by @hellboi_atul +# Copyright (C) 2020. +import asyncio +import os + +from telethon import events +from telethon.errors.rpcerrorlist import YouBlockedUserError + +from userbot import bot +from userbot import CMD_HELP +from userbot.events import register +# from userbot.utils import admin_cmd + +try: + import subprocess +except: + os.system("pip install instantmusic") + +os.system("rm -rf *.mp3") + + +def bruh(name): + + os.system("instantmusic -q -s " + name) + + +@register(outgoing=True, pattern="^.spd(?: |$)(.*)") +async def _(event): + if event.fwd_from: + return + link = event.pattern_match.group(1) + chat = "@SpotifyMusicDownloaderBot" + await event.edit("```Getting Your Music```") + async with bot.conversation(chat) as conv: + await asyncio.sleep(2) + await event.edit( + "`Downloading music taking some times, Stay Tuned.....`") + try: + response = conv.wait_event( + events.NewMessage(incoming=True, from_users=752979930)) + await bot.send_message(chat, link) + respond = await response + except YouBlockedUserError: + await event.reply( + "```Please unblock @SpotifyMusicDownloaderBot and try again```" + ) + return + await event.delete() + await bot.forward_messages(event.chat_id, respond.message) + + +@register(outgoing=True, pattern="^.netease(?: |$)(.*)") +async def WooMai(netase): + if netase.fwd_from: + return + song = netase.pattern_match.group(1) + chat = "@WooMaiBot" + link = f"/netease {song}" + await netase.edit("```Getting Your Music```") + async with bot.conversation(chat) as conv: + await asyncio.sleep(2) + await netase.edit("`Downloading...Please wait`") + try: + msg = await conv.send_message(link) + response = await conv.get_response() + respond = await conv.get_response() + """ - don't spam notif - """ + await bot.send_read_acknowledge(conv.chat_id) + except YouBlockedUserError: + await netase.edit("```Please unblock @WooMaiBot and try again```") + return + await netase.edit("`Sending Your Music...weit!😎`") + await asyncio.sleep(3) + await bot.send_file(netase.chat_id, respond) + await netase.client.delete_messages(conv.chat_id, + [msg.id, response.id, respond.id]) + await netase.delete() + + +@register(outgoing=True, pattern="^.dzd(?: |$)(.*)") +async def DeezLoader(Deezlod): + if Deezlod.fwd_from: + return + d_link = Deezlod.pattern_match.group(1) + if ".com" not in d_link: + await Deezlod.edit( + "` I need a link to download something pro.`**(._.)**") + else: + await Deezlod.edit("**Initiating Download!**") + chat = "@DeezLoadBot" + async with bot.conversation(chat) as conv: + try: + msg_start = await conv.send_message("/start") + response = await conv.get_response() + r = await conv.get_response() + msg = await conv.send_message(d_link) + details = await conv.get_response() + song = await conv.get_response() + """ - don't spam notif - """ + await bot.send_read_acknowledge(conv.chat_id) + except YouBlockedUserError: + await Deezlod.edit("**Error:** `unblock` @DeezLoadBot `and retry!`" + ) + return + await bot.send_file(Deezlod.chat_id, song, caption=details.text) + await Deezlod.client.delete_messages( + conv.chat_id, + [msg_start.id, response.id, r.id, msg.id, details.id, song.id]) + await Deezlod.delete() + + +CMD_HELP.update({ + "music": + ".spd`\ + \nUsage:For searching songs from Spotify.\ + \n\n`.netease` \ + \nUsage:Download music with @WooMaiBot\ + \n\n`.dzd` \ + \nUsage:Download music from Spotify or Deezer.\ + \n\n`.deezload` \ + \nUsage: Download music from deezer.\ + \n\n Well deezer is not available in India so create an deezer account using vpn. Set DEEZER_ARL_TOKEN in vars to make this work.\ + \n\n *Format= `FLAC`, `MP3_320`, `MP3_256`, `MP3_128`.\ + \n\n\n Guide:Video guide of arl token: [here](https://www.youtube.com/watch?v=O6PRT47_yds&feature=youtu.be) or Read [This](https://notabug.org/RemixDevs/DeezloaderRemix/wiki/Login+via+userToken)." +}) \ No newline at end of file diff --git a/userbot/modules/gnight.py b/userbot/modules/gnight.py new file mode 100644 index 00000000..978e1f7c --- /dev/null +++ b/userbot/modules/gnight.py @@ -0,0 +1,13 @@ +# Plugin by @xditya for @TeleBotHelp +# Kangers keep credits 😐 +from userbot.utils import register + + +@register(outgoing=True, pattern="^.night$") +async def join(e): + + if not e.text[0].isalpha() and e.text[0] not in ("/", "#", "@", "!"): + + await e.edit( + "\n。♥。・゚♡゚・。♥。・。・。・。♥。・\n╱╱╱╱╱╱╱╭╮╱╱╱╭╮╱╭╮╭╮\n╭━┳━┳━┳╯┃╭━┳╋╋━┫╰┫╰╮\n┃╋┃╋┃╋┃╋┃┃┃┃┃┃╋┃┃┃╭┫\n┣╮┣━┻━┻━╯╰┻━┻╋╮┣┻┻━╯\n╰━╯╱╱╱╱╱╱╱╱╱╱╰━╯\n。♥。・゚♡゚・。♥° ♥。・゚♡゚・\n" + ) \ No newline at end of file diff --git a/userbot/modules/grs.py b/userbot/modules/grs.py new file mode 100644 index 00000000..0dfb5e86 --- /dev/null +++ b/userbot/modules/grs.py @@ -0,0 +1,154 @@ +# Copyright (C) 2019 The Raphielscape Company LLC. +# +# Thanks to @kandnub, for this awesome module !! +# +# Licensed under the Raphielscape Public License, Version 1.c (the "License"); +# you may not use this file except in compliance with the License. +# +""" Userbot module for reverse searching stickers and images on Google """ +import io +import os +import re +import urllib +from urllib.request import urlopen + +import requests +from bs4 import BeautifulSoup +from PIL import Image +from telethon.tl.types import MessageMediaPhoto + +from userbot import bot +from userbot import CMD_HELP +from userbot.utils import errors_handler +from userbot.utils import register + +opener = urllib.request.build_opener() +useragent = "Mozilla/5.0 (Linux; Android 9; SM-G960F Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.157 Mobile Safari/537.36" +opener.addheaders = [("User-agent", useragent)] + + +@register(outgoing=True, pattern=r"^.reverse(?: |$)(\d*)") +@errors_handler +async def okgoogle(img): + """ For .reverse command, Google search images and stickers. """ + if os.path.isfile("okgoogle.png"): + os.remove("okgoogle.png") + + message = await img.get_reply_message() + if message and message.media: + photo = io.BytesIO() + await bot.download_media(message, photo) + else: + await img.edit("`Reply to photo or sticker nigger.`") + return + + if photo: + await img.edit("`Processing...`") + try: + image = Image.open(photo) + except OSError: + await img.edit("`Unsupported , most likely.`") + return + name = "okgoogle.png" + image.save(name, "PNG") + image.close() + # https://stackoverflow.com/questions/23270175/google-reverse-image-search-using-post-request#28792943 + searchUrl = "https://www.google.com/searchbyimage/upload" + multipart = { + "encoded_image": (name, open(name, "rb")), + "image_content": "" + } + response = requests.post(searchUrl, + files=multipart, + allow_redirects=False) + fetchUrl = response.headers["Location"] + + if response != 400: + await img.edit("`Image successfully uploaded to Google. Maybe.`" + "\n`Parsing source now. Maybe.`") + else: + await img.edit("`Google told me to fuck off.`") + return + + os.remove(name) + match = await ParseSauce(fetchUrl + + "&preferences?hl=en&fg=1#languages") + guess = match["best_guess"] + imgspage = match["similar_images"] + + if guess and imgspage: + await img.edit( + f"[{guess}]({fetchUrl})\n\n`Looking for this Image...`") + else: + await img.edit("`Can't find this piece of shit.`") + return + + if img.pattern_match.group(1): + lim = img.pattern_match.group(1) + else: + lim = 3 + images = await scam(match, lim) + yeet = [] + for i in images: + k = requests.get(i) + yeet.append(k.content) + try: + await img.client.send_file( + entity=await img.client.get_input_entity(img.chat_id), + file=yeet, + reply_to=img, + ) + except TypeError: + pass + await img.edit( + f"[{guess}]({fetchUrl})\n\n[Visually similar images]({imgspage})") + + +async def ParseSauce(googleurl): + """Parse/Scrape the HTML code for the info we want.""" + + source = opener.open(googleurl).read() + soup = BeautifulSoup(source, "html.parser") + + results = {"similar_images": "", "best_guess": ""} + + try: + for similar_image in soup.findAll("input", {"class": "gLFyf"}): + url = "https://www.google.com/search?tbm=isch&q=" + urllib.parse.quote_plus( + similar_image.get("value")) + results["similar_images"] = url + except BaseException: + pass + + for best_guess in soup.findAll("div", attrs={"class": "r5a77d"}): + results["best_guess"] = best_guess.get_text() + + return results + + +async def scam(results, lim): + + single = opener.open(results["similar_images"]).read() + decoded = single.decode("utf-8") + + imglinks = [] + counter = 0 + + pattern = r"^,\[\"(.*[.png|.jpg|.jpeg])\",[0-9]+,[0-9]+\]$" + oboi = re.findall(pattern, decoded, re.I | re.M) + + for imglink in oboi: + counter += 2 + if not counter >= int(lim): + imglinks.append(imglink) + else: + break + + return imglinks + + +CMD_HELP.update({ + "reverse": + ".reverse\ + \nUsage: Reply to a pic/sticker to revers-search it on Google Images !!" +}) \ No newline at end of file diff --git a/userbot/modules/idea.py b/userbot/modules/idea.py new file mode 100644 index 00000000..bad35e96 --- /dev/null +++ b/userbot/modules/idea.py @@ -0,0 +1,45 @@ +"""This Idea Is Flip for @UniBorg +Syntax: .This Idea Is flip [optiIn Favour Ofal_choice]""" +import random +import re + +from telethon import events +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern="idea ?(.*)")) +async def _(event): + if event.fwd_from: + return + r = random.randint(1, 100) + input_str = event.pattern_match.group(1) + if input_str: + input_str = input_str.lower() + if r % 2 == 1: + if input_str == "Good": + await event.edit( + "The This Idea Is In Favour Of: **Good**. \n You were correct\n ☆┌─┐ ─┐☆ \n │▒│ /▒/\n │▒│/▒/\n │▒ /▒/─┬─┐◯\n │▒│▒|▒│▒│\n┌┴─┴─┐-┘─┘\n│▒┌──┘▒▒▒│◯\n└┐▒▒▒▒▒▒┌┘\n◯└┐▒▒▒▒┌." + ) + elif input_str == "Bad‍": + await event.edit( + "The This Idea In Favour Of: **Good**. \n You weren't correct, try again ...\n ☆┌─┐ ─┐☆ \n │▒│ /▒/\n │▒│/▒/\n │▒ /▒/─┬─┐◯\n │▒│▒|▒│▒│\n┌┴─┴─┐-┘─┘\n│▒┌──┘▒▒▒│◯\n└┐▒▒▒▒▒▒┌┘\n◯└┐▒▒▒▒┌." + ) + else: + await event.edit( + "The This Idea Is In Favour Of: **Good**.\n ☆┌─┐ ─┐☆ \n │▒│ /▒/\n │▒│/▒/\n │▒ /▒/─┬─┐◯\n │▒│▒|▒│▒│\n┌┴─┴─┐-┘─┘\n│▒┌──┘▒▒▒│◯\n└┐▒▒▒▒▒▒┌┘\n◯└┐▒▒▒▒┌." + ) + elif r % 2 == 0: + if input_str == "Bad ": + await event.edit( + "The This Idea Is In Favour Of: **Bad 🙅‍**. \n You were correct\n███████▄▄███████████▄\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓███░░░░░░░░░░░░█\n██████▀░░█░░░░██████▀\n░░░░░░░░░█░░░░█\n░░░░░░░░░░█░░░█\n░░░░░░░░░░░█░░█\n░░░░░░░░░░░█░░█\n░░░░░░░░░░░░▀▀." + ) + elif input_str == "Good": + await event.edit( + "The This Idea Is In Favour Of: **Bad 🙅‍**. \n You weren't correct, try again ...\n███████▄▄███████████▄\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓███░░░░░░░░░░░░█\n██████▀░░█░░░░██████▀\n░░░░░░░░░█░░░░█\n░░░░░░░░░░█░░░█\n░░░░░░░░░░░█░░█\n░░░░░░░░░░░█░░█\n░░░░░░░░░░░░▀▀" + ) + else: + await event.edit( + "The This Idea Is In Favour Of: **Bad 🙅‍**.\n███████▄▄███████████▄\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓█░░░░░░░░░░░░░░█\n▓▓▓▓▓▓███░░░░░░░░░░░░█\n██████▀░░█░░░░██████▀\n░░░░░░░░░█░░░░█\n░░░░░░░░░░█░░░█\n░░░░░░░░░░░█░░█\n░░░░░░░░░░░█░░█\n░░░░░░░░░░░░▀▀" + ) + else: + await event.edit("¯\_(ツ)_/¯") \ No newline at end of file diff --git a/userbot/modules/indainflag.py b/userbot/modules/indainflag.py new file mode 100644 index 00000000..753a1075 --- /dev/null +++ b/userbot/modules/indainflag.py @@ -0,0 +1,25 @@ +# Coded by @AbirHasan2005 +# Telegram Group: http://t.me/linux_repo +import asyncio + +from telethon import events + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd("inflag")) +async def _(event): + if event.fwd_from: + return + animation_interval = 0.1 + animation_ttl = range(0, 36) + await event.edit("Hello ") + animation_chars = [ + "Happy Independence Day", + "**🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧🟧\n⬜️⬜️⬜️⬜️⬜️🟦🟦🟦⬜️⬜️⬜️⬜️⬜️\n⬜️⬜️⬜️⬜️⬜️🟦🟦🟦⬜️⬜️⬜️⬜️⬜️\n⬜️⬜️⬜️⬜️⬜️🟦🟦🟦⬜️⬜️⬜️⬜️⬜️\n🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩\n🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩\n🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩🟩\n\nMade With Love 🧡🤍💚\n\nHappy Independence Day !!!!!**", + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + await event.edit(animation_chars[i % 18]) \ No newline at end of file diff --git a/userbot/modules/indainmap.py b/userbot/modules/indainmap.py new file mode 100644 index 00000000..fa61309a --- /dev/null +++ b/userbot/modules/indainmap.py @@ -0,0 +1,26 @@ +# Coded by @AbirHasan2005 +# Telegram Group: http://t.me/linux_repo +import asyncio + +from telethon import events + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd("inmap")) +async def _(event): + if event.fwd_from: + return + animation_interval = 2 + animation_ttl = range(0, 36) + # input_str = event.pattern_match.group(1) + # if input_str == "Read This Telegraph Whole info here": + await event.edit("Loading Map ") + animation_chars = [ + "⣿⣿⣿⣿⣿⣍⠀⠉⠻⠟⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⠓⠀⠀⢒⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⡿⠃⠀⠀⠀⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿\n⣿⡿⠋⠋⠀⠀⠀⠀⠀⠀⠈⠙⠻⢿⢿⣿⣿⡿⣿⣿⡟⠋⠀⢀⣩\n⣿⣿⡄⠀⠀⠀⠀⠀⠁⡀⠀⠀⠀⠀⠈⠉⠛⢷⣭⠉⠁⠀⠀⣿⣿\n⣇⣀ . ..INDIA🇮🇳INDIA . . . ⢷⣿⣿⣛⠐⣶⣿⣿\n⣿⣄⠀⣰⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠐⢀⣠⣿⣿⣿⣾⣿⣿⣿\n⣿⣿⣿⣿⠀⠀⠀⠀⡠⠀⠀⠀⠀⠀⢀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠄⠀⣤⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⣠⣤⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿ \n⣿⣿⣿⣿⣿⣇⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⡆⠀⢀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿\n⣿⣿⣿⣿⣿⣿⣿⣦⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿" + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + await event.edit(animation_chars[i % 18]) \ No newline at end of file diff --git a/userbot/modules/letmesaerch.py b/userbot/modules/letmesaerch.py new file mode 100644 index 00000000..31d53a9a --- /dev/null +++ b/userbot/modules/letmesaerch.py @@ -0,0 +1,188 @@ +""" +Let me Google / YouTube / DuckDuckGo / altnews / Xvideo / Pornhub / var / log / dyno that for you! +Syntax: + .lmg + .lmy + .ddg + .lmalt + .lmx + .lmx2 + .lmp + .lmvar + .lmlog + .dyno + .lmkp + .lmki + .gem + .archive +""" +import json +import os + +import requests +from telethon import events + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="lmg (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=http://google.com/search?q={}".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **Googal** that for you:\n👉 [{}]({})\n`Thank me later 😉` ". + format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="lmy (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = ( + "https://da.gd/s?url=https://www.youtube.com/results?search_query={}". + format(input_str.replace(" ", "+"))) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **UThoob** that for you:\n👉 [{}]({})\n`Thank me later 😉` ". + format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="ddg (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = ( + "https://da.gd/s?url=https://duckduckgo.com/?q={}&t=h_&ia=about". + format(input_str.replace(" ", "+"))) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **duckduckgo** that for you:\n👉 [{}]({})\n`Thank me later 😉` " + .format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="lmalt (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=https://www.altnews.in/?s={}".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **altnews** that for you:\n👉 [{}]({})\n`Thank me later 😉` " + .format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="lmvar (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = ( + "https://da.gd/s?url=https://dashboard.heroku.com/apps/{}/settings". + format(input_str.replace(" ", "+"))) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **var** that for you:\n👉 [{}]({})\n`Thank me later 😉` ". + format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="lmlog (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=https://dashboard.heroku.com/apps/{}/logs".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **log** that for you:\n👉 [{}]({})\n`Thank me later 😉` ". + format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="dyno(.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=https://dashboard.heroku.com/account/{}".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **dyno** that for you:\n👉 [{}]({})\n`Thank me later 😉` ". + format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="lmkp (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=https://indiankanoon.org/search/?formInput={}+sortby%3Amostrecent".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **Indiankanoon.com : Place** that for you:\n👉 [{}]({})\n`Thank me later 😉` " + .format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="gem (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=https://mkp.gem.gov.in/search?q={}&sort_type=created_at_desc&_xhr=1".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me **gem.gov.in** that for you:\n👉 [{}]({})\n`Thank me later 😉` " + .format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") + + +@borg.on(admin_cmd(pattern="archive (.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + sample_url = "https://da.gd/s?url=https://web.archive.org/web/*/{}".format( + input_str.replace(" ", "+")) + response_api = requests.get(sample_url).text + if response_api: + await event.edit( + "Let me run your link on wayback machine that for you:\n👉 [{}]({})\n`Thank me later 😉` " + .format(input_str, response_api.rstrip())) + else: + await event.edit("Something went wrong. Please try again later.") \ No newline at end of file diff --git a/userbot/modules/link.py b/userbot/modules/link.py new file mode 100644 index 00000000..49d8b293 --- /dev/null +++ b/userbot/modules/link.py @@ -0,0 +1,83 @@ +# Licensed under the Raphielscape Public License, Version 1.c (the "License"); +# you may not use this file except in compliance with the License. +""" +Userbot module to help you manage a group +""" +from asyncio import sleep +from os import remove + +from telethon.errors import BadRequestError +from telethon.errors import UserAdminInvalidError +from telethon.errors.rpcerrorlist import UserIdInvalidError +from telethon.tl.types import ChannelParticipantsAdmins +from telethon.tl.types import ChannelParticipantsBots +from telethon.tl.types import ChatAdminRights +from telethon.tl.types import ChatBannedRights +from telethon.tl.types import MessageEntityMentionName +from telethon.tl.types import PeerChannel + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="link(?: |$)(.*)")) +async def permalink(mention): + """ For .link command, generates a link to the user's PM with a custom text. """ + user, custom = await get_user_from_event(mention) + if not user: + return + if custom: + await mention.edit(f"[{custom}](tg://user?id={user.id})") + else: + tag = (user.first_name.replace("\u2060", "") + if user.first_name else user.username) + await mention.edit(f"[{tag}](tg://user?id={user.id})") + + +async def get_user_from_event(event): + """ Get the user from argument or replied message. """ + args = event.pattern_match.group(1).split(":", 1) + extra = None + if event.reply_to_msg_id and not len(args) == 2: + previous_message = await event.get_reply_message() + user_obj = await event.client.get_entity(previous_message.from_id) + extra = event.pattern_match.group(1) + elif len(args[0]) > 0: + user = args[0] + if len(args) == 2: + extra = args[1] + + if user.isnumeric(): + user = int(user) + + if not user: + await event.edit("`Pass the user's username, id or reply!`") + return + + if event.message.entities: + probable_user_mention_entity = event.message.entities[0] + + if isinstance(probable_user_mention_entity, + MessageEntityMentionName): + user_id = probable_user_mention_entity.user_id + user_obj = await event.client.get_entity(user_id) + return user_obj + try: + user_obj = await event.client.get_entity(user) + except (TypeError, ValueError) as err: + await event.edit(str(err)) + return None + + return user_obj, extra + + +async def get_user_from_id(user, event): + if isinstance(user, str): + user = int(user) + + try: + user_obj = await event.client.get_entity(user) + except (TypeError, ValueError) as err: + await event.edit(str(err)) + return None + + return user_obj \ No newline at end of file diff --git a/userbot/modules/moon2.py b/userbot/modules/moon2.py new file mode 100644 index 00000000..89ca3ccb --- /dev/null +++ b/userbot/modules/moon2.py @@ -0,0 +1,17 @@ +# (c) @UniBorg +import asyncio +from collections import deque + +from telethon import events +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern=r"moon", outgoing=True)) +async def _(event): + if event.fwd_from: + return + deq = deque(list("🌗🌘🌑🌒🌓🌔🌕🌖")) + for _ in range(32): + await asyncio.sleep(0.1) + await event.edit("".join(deq)) + deq.rotate(1) \ No newline at end of file diff --git a/userbot/modules/mystatus.py b/userbot/modules/mystatus.py new file mode 100644 index 00000000..ddb17a97 --- /dev/null +++ b/userbot/modules/mystatus.py @@ -0,0 +1,97 @@ +""" +Commands - .offline .online +Offline = Add an offline tag in your name and change profile pic to black. +Online = Remove Offline Tag from your name and change profile pic to vars PROFILE_IMAGE. +Note - If you have a last name remove it unless it automatically removed. +""" +import os +import urllib + +from telethon import events +from telethon.tl import functions +from uniborg.util import admin_cmd + +OFFLINE_TAG = "[OFFLINE]" +ONLINE_TAG = "[ONLINE]" +PROFILE_IMAGE = os.environ.get( + "PROFILE_IMAGE", "https://telegra.ph/file/9f0638dbfa028162a8682.jpg") + + +@borg.on(admin_cmd(pattern="offline")) # pylint:disable=E0602 +async def _(event): + if event.fwd_from: + return + user_it = "me" + user = await event.client.get_entity(user_it) + if user.first_name.startswith(OFFLINE_TAG): + await event.edit("**Already in Offline Mode.**") + return + await event.edit("**Changing Profile to Offline...**") + if not os.path.isdir(Config.TMP_DOWNLOAD_DIRECTORY): # pylint:disable=E0602 + os.makedirs(Config.TMP_DOWNLOAD_DIRECTORY) # pylint:disable=E0602 + urllib.request.urlretrieve( + "https://telegra.ph/file/249f27d5b52a87babcb3f.jpg", "donottouch.jpg") + photo = "donottouch.jpg" + if photo: + file = await event.client.upload_file(photo) + try: + await borg(functions.photos.UploadProfilePhotoRequest(file)) + except Exception as e: # pylint:disable=C0103,W0703 + await event.edit(str(e)) + else: + await event.edit("**Changed profile to OffLine.**") + try: + os.system("rm -fr donottouch.jpg") + except Exception as e: # pylint:disable=C0103,W0703 + logger.warn(str(e)) # pylint:disable=E0602 + last_name = "" + first_name = OFFLINE_TAG + try: + await borg( + functions.account.UpdateProfileRequest( # pylint:disable=E0602 + last_name=last_name, + first_name=first_name)) + result = "**`{} {}`\nI am Offline now.**".format(first_name, last_name) + await event.edit(result) + except Exception as e: # pylint:disable=C0103,W0703 + await event.edit(str(e)) + + +@borg.on(admin_cmd(pattern="online")) # pylint:disable=E0602 +async def _(event): + if event.fwd_from: + return + user_it = "me" + user = await event.client.get_entity(user_it) + if user.first_name.startswith(OFFLINE_TAG): + await event.edit("**Changing Profile to Online...**") + else: + await event.edit("**Already Online.**") + return + if not os.path.isdir(Config.TMP_DOWNLOAD_DIRECTORY): # pylint:disable=E0602 + os.makedirs(Config.TMP_DOWNLOAD_DIRECTORY) # pylint:disable=E0602 + urllib.request.urlretrieve(PROFILE_IMAGE, "donottouch.jpg") + photo = "donottouch.jpg" + if photo: + file = await event.client.upload_file(photo) + try: + await borg(functions.photos.UploadProfilePhotoRequest(file)) + except Exception as e: # pylint:disable=C0103,W0703 + await event.edit(str(e)) + else: + await event.edit("**Changed profile to Online.**") + try: + os.system("rm -fr donottouch.jpg") + except Exception as e: # pylint:disable=C0103,W0703 + logger.warn(str(e)) # pylint:disable=E0602 + first_name = ONLINE_TAG + last_name = "" + try: + await borg( + functions.account.UpdateProfileRequest( # pylint:disable=E0602 + last_name=last_name, + first_name=first_name)) + result = "**`{} {}`\nI am Online !**".format(first_name, last_name) + await event.edit(result) + except Exception as e: # pylint:disable=C0103,W0703 + await event.edit(str(e)) \ No newline at end of file diff --git a/userbot/modules/noice.py b/userbot/modules/noice.py new file mode 100644 index 00000000..49c30ee1 --- /dev/null +++ b/userbot/modules/noice.py @@ -0,0 +1,732 @@ +"""Available Commands +Read code in noice.py """ +# .cowsay cow which says things.\ +# :/Usage: Check yourself +# -_- Ok... +# ;_; Like `-_-` but crying. +# .cp Copypasta the famous meme +# .vapor Vaporize everything! +# .str Stretch it. +# .10iq You retard !! +# .zal Invoke the feeling of chaos. +# nOof Ooooof +# .hii Greet everyone! +# .owo UwU +# .cry y u du dis, i cri. +# .shrug Shrug at it !! +# .runs Run, run, RUNNN! [`.disable runs`: disable | `.enable runs`: enable]\ +# .metoo Haha yes +# .mock Do it and find the real fun. +# .clap Praise people! +# .f Pay Respects. +# .bt Believe me, you will find this useful. +# .smk A shit module for ツ , who cares. +# .lgfy Let me Google that for you real quick !! +# Thanks to 🅱️ottom🅱️ext🅱️ot (@NotAMemeBot) for some of these. +import asyncio +import random +import re +import time +from collections import deque + +import requests +from telethon import events +from telethon.tl.functions.users import GetFullUserRequest +from telethon.tl.types import MessageEntityMentionName +from uniborg.util import admin_cmd + +# ================= CONSTANT ================= +RENDISTR = [ + "`I Know Uh ez Rendi Bhay Dont show Your Randi Pesa Here`", + "`Jag Suna suna laage Sab #maderchod bhay`", + "`you talking behind meh wew uh iz my fan now bhay`", + "`Wanna pass in Life Goto BRAZZER.CAM BHAY`", + "`Uh iz Pro i iz noob your boob is landi uh are Randi`", + "`Sellers Nasa calling Uh bhay😆`", + "`Badwoo ki yojna behan bna ke ch*da uh iz badwa its your yozja?`", + "`CHAND PE CHADA HAI CHANDYAAN KA GHODA TERA NAAM HAI MANSUR TU HAI BEHAN KA LOD*😂`", + "`Jab se dil lga baithe tanhai me maa chu*da baithe wo kho gyi kisi aur ke pyar hum apne hi jaato me aag lga baithe`", + "`Chadii ke ander se lal pani kha se ata hai ky teri masuka ka bhosda bhi paan khata hai😂`", + "`Sun bhosdi ke By anonyCrew MOHABBAT KE SIWA AUR BHI GAM HAI JAMANE ME BSDK GAND PAHAT JATI HAI PAISA KAMANE ME`", + "`Thaan liya tha Sayri nhi krege Unka pichwada dekha Alfaaz nikal gye`", + "`Ravivaar ko dekha Chand Ka Tukra Itna Baar Dekha par Jaath na Ukra`", + "`Katal kro Tir se Talwar me Ky Rkkha hai Maal Chodo Sari Me Salwar me Ky Rkkha hai`", +] + +METOOSTR = [ + "`Me too thanks`", + "`Haha yes, me too`", + "`Same lol`", + "`Me irl`", + "`Same here`", + "`Haha yes`", + "`Me rn`", +] + +EMOJIS = [ + "😂", + "😂", + "👌", + "✌", + "💞", + "👍", + "👌", + "💯", + "🎶", + "👀", + "😂", + "👓", + "👏", + "👐", + "🍕", + "💥", + "🍴", + "💦", + "💦", + "🍑", + "🍆", + "😩", + "😏", + "👉👌", + "👀", + "👅", + "😩", + "🚰", +] + +INSULT_STRINGS = [ + "`Owww ... Such a stupid idiot.`", + "`Don't drink and type.`", + "`Command not found. Just like your brain.`", + "`Bot rule 544 section 9 prevents me from replying to stupid humans like you.`", + "`Sorry, we do not sell brains.`", + "`Believe me you are not normal.`", + "`I bet your brain feels as good as new, seeing that you never use it.`", + "`If I wanted to kill myself I'd climb your ego and jump to your IQ.`", + "`You didn't evolve from apes, they evolved from you.`", + "`What language are you speaking? Cause it sounds like bullshit.`", + "`You are proof that evolution CAN go in reverse.`", + "`I would ask you how old you are but I know you can't count that high.`", + "`As an outsider, what do you think of the human race?`", + "`Ordinarily people live and learn. You just live.`", + "`Keep talking, someday you'll say something intelligent!.......(I doubt it though)`", + "`Everyone has the right to be stupid but you are abusing the privilege.`", + "`I'm sorry I hurt your feelings when I called you stupid. I thought you already knew that.`", + "`You should try tasting cyanide.`", + "`You should try sleeping forever.`", + "`Pick up a gun and shoot yourself.`", + "`Try bathing with Hydrochloric Acid instead of water.`", + "`Go Green! Stop inhaling Oxygen.`", + "`God was searching for you. You should leave to meet him.`", + "`You should Volunteer for target in an firing range.`", + "`Try playing catch and throw with RDX its fun.`", + "`People like you are the reason we have middle fingers.`", + "`When your mom dropped you off at the school, she got a ticket for littering.`", + "`You’re so ugly that when you cry, the tears roll down the back of your head, just to avoid your face.`", + "`If you’re talking behind my back then you’re in a perfect position to kiss my a**!.`", +] + +UWUS = [ + "(・`ω´・)", + ";;w;;", + "owo", + "UwU", + ">w<", + "^w^", + r"\(^o\) (/o^)/", + "( ^ _ ^)∠☆", + "(ô_ô)", + "~:o", + ";-;", + "(*^*)", + "(>_", + "(♥_♥)", + "*(^O^)*", + "((+_+))", +] + +ZALG_LIST = [ + [ + "̖", + " ̗", + " ̘", + " ̙", + " ̜", + " ̝", + " ̞", + " ̟", + " ̠", + " ̤", + " ̥", + " ̦", + " ̩", + " ̪", + " ̫", + " ̬", + " ̭", + " ̮", + " ̯", + " ̰", + " ̱", + " ̲", + " ̳", + " ̹", + " ̺", + " ̻", + " ̼", + " ͅ", + " ͇", + " ͈", + " ͉", + " ͍", + " ͎", + " ͓", + " ͔", + " ͕", + " ͖", + " ͙", + " ͚", + " ", + ], + [ + " ̍", + " ̎", + " ̄", + " ̅", + " ̿", + " ̑", + " ̆", + " ̐", + " ͒", + " ͗", + " ͑", + " ̇", + " ̈", + " ̊", + " ͂", + " ̓", + " ̈́", + " ͊", + " ͋", + " ͌", + " ̃", + " ̂", + " ̌", + " ͐", + " ́", + " ̋", + " ̏", + " ̽", + " ̉", + " ͣ", + " ͤ", + " ͥ", + " ͦ", + " ͧ", + " ͨ", + " ͩ", + " ͪ", + " ͫ", + " ͬ", + " ͭ", + " ͮ", + " ͯ", + " ̾", + " ͛", + " ͆", + " ̚", + ], + [ + " ̕", + " ̛", + " ̀", + " ́", + " ͘", + " ̡", + " ̢", + " ̧", + " ̨", + " ̴", + " ̵", + " ̶", + " ͜", + " ͝", + " ͞", + " ͟", + " ͠", + " ͢", + " ̸", + " ̷", + " ͡", + ], +] + +RUN_REACTS = [ + "`Runs to Thanos`", + "`Runs far, far away from earth`", + "`Running faster than usian bolt coz I'mma Bot`", + "`Runs to Marie`", + "`This Group is too cancerous to deal with.`", + "`Cya bois`", + "`Kys`", + "`I am a mad person. Plox Ban me.`", + "`I go away`", + "`I am just walking off, coz me is too fat.`", + "`I Fugged off!`", + "`Will run for chocolate.`", + "`I run because I really like food.`", + "`Running...because dieting is not an option.`", + "`Wicked fast runnah`", + "`If you wanna catch me, you got to be fast...if you wanna stay with me, you got to be good...if you wanna pass me...You've got to be kidding.`", + "`Anyone can run a hundred meters, it's the next forty-two thousand and two hundred that count.`", + "`Why are all these people following me?`", + "`Are the kids still chasing me?`", + "`Running a marathon...there's an app for that.`", +] + +HELLOSTR = [ + "`Hi !`", + "`‘Ello, gov'nor!`", + "`What’s crackin’?`", + "`‘Sup, homeslice?`", + "`Howdy, howdy ,howdy!`", + "`Hello, who's there, I'm talking.`", + "`You know who this is.`", + "`Yo!`", + "`Whaddup.`", + "`Greetings and salutations!`", + "`Hello, sunshine!`", + "`Hey, howdy, hi!`", + "`What’s kickin’, little chicken?`", + "`Peek-a-boo!`", + "`Howdy-doody!`", + "`Hey there, freshman!`", + "`I come in peace!`", + "`Ahoy, matey!`", + "`Hiya!`", + "`Oh retarded gey! Well Hello`", +] + +SHGS = [ + "┐(´д`)┌", + "┐(´~`)┌", + "┐(´ー`)┌", + "┐( ̄ヘ ̄)┌", + "╮(╯∀╰)╭", + "╮(╯_╰)╭", + "┐(´д`)┌", + "┐(´∀`)┌", + "ʅ(́◡◝)ʃ", + "ლ(゚д゚ლ)", + "┐(゚~゚)┌", + "┐('д')┌", + "ლ|^Д^ლ|", + "ლ(╹ε╹ლ)", + "ლ(ಠ益ಠ)ლ", + "┐(‘~`;)┌", + "ヘ(´-`;)ヘ", + "┐( -“-)┌", + "乁༼☯‿☯✿༽ㄏ", + "ʅ(´◔౪◔)ʃ", + "ლ(•ω •ლ)", + "ヽ(゜~゜o)ノ", + "ヽ(~~~ )ノ", + "┐(~ー~;)┌", + "┐(-。ー;)┌", + "¯\_(ツ)_/¯", + "¯\_(⊙_ʖ⊙)_/¯", + "乁ʕ •̀ ۝ •́ ʔㄏ", + "¯\_༼ ಥ ‿ ಥ ༽_/¯", + "乁( ⁰͡ Ĺ̯ ⁰͡ ) ㄏ", +] + +CRI = [ + "أ‿أ", + "╥﹏╥", + "(;﹏;)", + "(ToT)", + "(┳Д┳)", + "(ಥ﹏ಥ)", + "(;へ:)", + "(T_T)", + "(πーπ)", + "(T▽T)", + "(⋟﹏⋞)", + "(iДi)", + "(´Д⊂ヽ", + "(;Д;)", + "(>﹏<)", + "(TдT)", + "(つ﹏⊂)", + "༼☯﹏☯༽", + "(ノ﹏ヽ)", + "(ノAヽ)", + "(╥_╥)", + "(T⌓T)", + "(༎ຶ⌑༎ຶ)", + "(☍﹏⁰)。", + "(ಥ_ʖಥ)", + "(つд⊂)", + "(≖͞_≖̥)", + "(இ﹏இ`。)", + "༼ಢ_ಢ༽", + "༼ ༎ຶ ෴ ༎ຶ༽", +] + +DISABLE_ROON = False +# =========================================== + + +@borg.on(events.NewMessage(outgoing=True, pattern="^:/$")) +async def kek(keks): + """ Check yourself ;)""" + uio = ["/", "\\"] + for i in range(1, 15): + time.sleep(0.3) + await keks.edit(":" + uio[i % 2]) + + +@borg.on(events.NewMessage(outgoing=True, pattern="^-_-$")) +async def lol(lel): + """ Ok... """ + okay = "-_-" + for _ in range(10): + okay = okay[:-1] + "_-" + await lel.edit(okay) + + +@borg.on(events.NewMessage(outgoing=True, pattern="^;_;$")) +async def fun(e): + t = ";__;" + for j in range(10): + t = t[:-1] + "_;" + await e.edit(t) + + +@borg.on(admin_cmd(pattern="cri", outgoing=True)) +async def cri(e): + """ y u du dis, i cry everytime !! """ + if not e.text[0].isalpha() and e.text[0] not in ("/", "#", "@", "!"): + await e.edit(random.choice(CRI)) + + +@borg.on(admin_cmd(pattern="insut", outgoing=True)) +async def cry(e): + """ y u du dis, i cry everytime !! """ + if not e.text[0].isalpha() and e.text[0] not in ("/", "#", "@", "!"): + await e.edit(random.choice(INSULT_STRINGS)) + + +@borg.on(admin_cmd(pattern="cp(?: |$)(.*)", outgoing=True)) +async def copypasta(cp_e): + """ Copypasta the famous meme """ + if not cp_e.text[0].isalpha() and cp_e.text[0] not in ("/", "#", "@", "!"): + textx = await cp_e.get_reply_message() + message = cp_e.pattern_match.group(1) + + if message: + pass + elif textx: + message = textx.text + else: + await cp_e.edit("`😂🅱️IvE👐sOME👅text👅for✌️Me👌tO👐MAkE👀iT💞funNy!💦`") + return + + reply_text = random.choice(EMOJIS) + b_char = random.choice(message).lower( + ) # choose a random character in the message to be substituted with 🅱️ + for owo in message: + if owo == " ": + reply_text += random.choice(EMOJIS) + elif owo in EMOJIS: + reply_text += owo + reply_text += random.choice(EMOJIS) + elif owo.lower() == b_char: + reply_text += "🅱️" + else: + if bool(random.getrandbits(1)): + reply_text += owo.upper() + else: + reply_text += owo.lower() + reply_text += random.choice(EMOJIS) + await cp_e.edit(reply_text) + + +@borg.on(admin_cmd(pattern="vapor(?: |$)(.*)", outgoing=True)) +async def vapor(vpr): + """ Vaporize everything! """ + if not vpr.text[0].isalpha() and vpr.text[0] not in ("/", "#", "@", "!"): + reply_text = list() + textx = await vpr.get_reply_message() + message = vpr.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await vpr.edit("`Give some text for vapor!`") + return + + for charac in message: + if 0x21 <= ord(charac) <= 0x7F: + reply_text.append(chr(ord(charac) + 0xFEE0)) + elif ord(charac) == 0x20: + reply_text.append(chr(0x3000)) + else: + reply_text.append(charac) + + await vpr.edit("".join(reply_text)) + + +@borg.on(admin_cmd(pattern="str(?: |$)(.*)", outgoing=True)) +async def stretch(stret): + """ Stretch it.""" + if not stret.text[0].isalpha() and stret.text[0] not in ("/", "#", "@", + "!"): + textx = await stret.get_reply_message() + message = stret.text + message = stret.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await stret.edit("`GiiiiiiiB sooooooomeeeeeee teeeeeeext!`") + return + + count = random.randint(3, 10) + reply_text = re.sub(r"([aeiouAEIOUaeiouAEIOUаеиоуюяыэё])", + (r"\1" * count), message) + await stret.edit(reply_text) + + +@borg.on(admin_cmd(pattern="izal(?: |$)(.*)", outgoing=True)) +async def izal(zgfy): + """ Invoke the feeling of chaos. """ + if not zgfy.text[0].isalpha() and zgfy.text[0] not in ("/", "#", "@", "!"): + reply_text = list() + textx = await zgfy.get_reply_message() + message = zgfy.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await zgfy.edit( + "`gͫ ̆ i̛ ̺ v͇̆ ȅͅ a̢ͦ s̴̪ c̸̢ ä̸ rͩͣ y͖͞ t̨͚ é̠ x̢͖ t͔͛`" + ) + return + + for charac in message: + if not charac.isalpha(): + reply_text.append(charac) + continue + + for _ in range(0, 3): + randint = random.randint(0, 2) + + if randint == 0: + charac = charac.strip() + random.choice( + ZALG_LIST[0]).strip() + elif randint == 1: + charac = charac.strip() + random.choice( + ZALG_LIST[1]).strip() + else: + charac = charac.strip() + random.choice( + ZALG_LIST[2]).strip() + + reply_text.append(charac) + + await zgfy.edit("".join(reply_text)) + + +@borg.on(admin_cmd(pattern="hi", outgoing=True)) +async def hoi(hello): + """ Greet everyone! """ + if not hello.text[0].isalpha() and hello.text[0] not in ("/", "#", "@", + "!"): + await hello.edit(random.choice(HELLOSTR)) + + +@borg.on(admin_cmd(pattern="irand", outgoing=True)) +async def irand(randi): + """ur a Randi! """ + if not randi.text[0].isalpha() and randi.text[0] not in ("/", "#", "@", + "!"): + await randi.edit(random.choice(RENDISTR)) + + +@borg.on(admin_cmd(pattern="owo(?: |$)(.*)", outgoing=True)) +async def faces(owo): + """ UwU """ + if not owo.text[0].isalpha() and owo.text[0] not in ("/", "#", "@", "!"): + textx = await owo.get_reply_message() + message = owo.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await owo.edit("` UwU no text given! `") + return + + reply_text = re.sub(r"(r|l)", "w", message) + reply_text = re.sub(r"(R|L)", "W", reply_text) + reply_text = re.sub(r"n([aeiou])", r"ny\1", reply_text) + reply_text = re.sub(r"N([aeiouAEIOU])", r"Ny\1", reply_text) + reply_text = re.sub(r"\!+", " " + random.choice(UWUS), reply_text) + reply_text = reply_text.replace("ove", "uv") + reply_text += " " + random.choice(UWUS) + await owo.edit(reply_text) + + +@borg.on(admin_cmd(pattern="shrug", outgoing=True)) +async def shrugger(shg): + r""" ¯\_(ツ)_/¯ """ + if not shg.text[0].isalpha() and shg.text[0] not in ("/", "#", "@", "!"): + await shg.edit(random.choice(SHGS)) + + +@borg.on(admin_cmd(pattern="roon", outgoing=True)) +async def runner_lol(roon): + """ Run, run, RUNNN! """ + if not DISABLE_ROON: + if not roon.text[0].isalpha() and roon.text[0] not in ("/", "#", "@", + "!"): + await roon.edit(random.choice(RUN_REACTS)) + + +@borg.on(admin_cmd(pattern="disable roon", outgoing=True)) +async def disable_roon(noroon): + """ Some people don't like running... """ + if not noroon.text[0].isalpha() and noroon.text[0] not in ("/", "#", "@", + "!"): + global DISABLE_ROON + DISABLE_ROON = True + await noroon.edit("```Disabled .runs !!```") + + +@borg.on(admin_cmd(pattern="enable roon", outgoing=True)) +async def enable_roon(roon): + """ But some do! """ + if not roon.text[0].isalpha() and roon.text[0] not in ("/", "#", "@", "!"): + global DISABLE_ROON + DISABLE_ROON = False + await roon.edit("```Enabled .run !!```") + + +@borg.on(admin_cmd(pattern="10iq", outgoing=True)) +async def iqless(e): + if not e.text[0].isalpha() and e.text[0] not in ("/", "#", "@", "!"): + await e.edit("♿") + + +@borg.on(admin_cmd(pattern="mock(?: |$)(.*)", outgoing=True)) +async def spongemocktext(mock): + """ Do it and find the real fun. """ + if not mock.text[0].isalpha() and mock.text[0] not in ("/", "#", "@", "!"): + reply_text = list() + textx = await mock.get_reply_message() + message = mock.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await mock.edit("`gIvE sOMEtHInG tO MoCk!`") + return + + for charac in message: + if charac.isalpha() and random.randint(0, 1): + to_app = charac.upper() if charac.islower() else charac.lower() + reply_text.append(to_app) + else: + reply_text.append(charac) + + await mock.edit("".join(reply_text)) + + +@borg.on(admin_cmd(pattern="clap(?: |$)(.*)", outgoing=True)) +async def claptext(memereview): + """ Praise people! """ + if not memereview.text[0].isalpha() and memereview.text[0] not in ( + "/", + "#", + "@", + "!", + ): + textx = await memereview.get_reply_message() + message = memereview.pattern_match.group(1) + if message: + pass + elif textx: + message = textx.text + else: + await memereview.edit("`Hah, I don't clap pointlessly!`") + return + reply_text = "👏 " + reply_text += message.replace(" ", " 👏 ") + reply_text += " 👏" + await memereview.edit(reply_text) + + +@borg.on(admin_cmd(pattern="bt", outgoing=True)) +async def bluetext(bt_e): + """ Believe me, you will find this useful. """ + if not bt_e.text[0].isalpha() and bt_e.text[0] not in ("/", "#", "@", "!"): + if await bt_e.get_reply_message(): + await bt_e.edit( + "`BLUETEXT MUST CLICK.`\n" + "`Are you a stupid animal which is attracted to colours?`") + + +@borg.on(admin_cmd(pattern="smk (.*)", outgoing=True)) +async def smrk(smk): + if not smk.text[0].isalpha() and smk.text[0] not in ("/", "#", "@", "!"): + textx = await smk.get_reply_message() + message = smk.text + if message[5:]: + message = str(message[5:]) + elif textx: + message = textx + message = str(message.message) + if message == "dele": + await smk.edit(message + "te the hell" + "ツ") + await smk.edit("ツ") + else: + smirk = " ツ" + reply_text = message + smirk + await smk.edit(reply_text) + + +@borg.on(admin_cmd(pattern="f (.*)", outgoing=True)) +async def payf(e): + paytext = e.pattern_match.group(1)[0] + pay = "{}\n{}\n{}\n{}\n{}\n{}\n{}".format( + paytext * 5, + paytext * 1, + paytext * 1, + paytext * 4, + paytext * 1, + paytext * 1, + paytext * 1, + ) + await e.edit(pay) + + +@borg.on(admin_cmd(pattern="lgfy (.*)", outgoing=True)) +async def let_me_google_that_for_you(lmgtfy_q): + if not lmgtfy_q.text[0].isalpha() and lmgtfy_q.text[0] not in ("/", "#", + "@", "!"): + textx = await lmgtfy_q.get_reply_message() + query = lmgtfy_q.text + if query[5:]: + query = str(query[5:]) + elif textx: + query = textx + query = query.message + query_encoded = query.replace(" ", "+") + lfy_url = f"http://lmgtfy.com/?s=g&iie=1&q={query_encoded}" + payload = {"format": "json", "url": lfy_url} + r = requests.get("http://is.gd/create.php", params=payload) + await lmgtfy_q.edit(f"[{query}]({r.json()['shorturl']})") \ No newline at end of file diff --git a/userbot/modules/omg.py b/userbot/modules/omg.py new file mode 100644 index 00000000..a1631bdb --- /dev/null +++ b/userbot/modules/omg.py @@ -0,0 +1,16 @@ +# (c) @UniBorg +import asyncio +from collections import deque + +from telethon import events + + +@borg.on(events.NewMessage(pattern=r"\.omg", outgoing=True)) +async def _(event): + if event.fwd_from: + return + deq = deque(list("🙄😳🙄😳🙄😳")) + for _ in range(999): + await asyncio.sleep(0.1) + await event.edit("".join(deq)) + deq.rotate(1) \ No newline at end of file diff --git a/userbot/modules/ophack.py b/userbot/modules/ophack.py new file mode 100644 index 00000000..2fdb58ee --- /dev/null +++ b/userbot/modules/ophack.py @@ -0,0 +1,53 @@ +# Coded by @AbirHasan2005 +# Telegram Group: http://t.me/linux_repo +import asyncio + +from telethon import events +from telethon.tl.functions.users import GetFullUserRequest +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern=r"ophack")) +async def _(event): + + if event.fwd_from: + + return + + animation_interval = 2 + + animation_ttl = range(0, 11) + + if event.reply_to_msg_id: + reply_message = await event.get_reply_message() + replied_user = await event.client( + GetFullUserRequest(reply_message.from_id)) + firstname = replied_user.user.first_name + usname = replied_user.user.username + idd = reply_message.from_id + if idd == 715779594: + await event.edit( + "This is My Developer.\nI can't hack my developer's Account.\n**How dare you trying to hack my developer's account!**\n\n__Your account has been hacked! [Pay 69$](https://paypal.me/AbirHasan2005) to my developer__ [Abir Hasan](http://t.me/AbirHasan2005) __to release your account__" + ) + else: + await event.edit("Hacking ...") + animation_chars = [ + "`Hacking ... 0%\n▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)", + "`Hacking ... 4%\n█▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package", + "`Hacking ... 8%\n██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)", + "`Hacking ... 20%\n█████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)\nBuilding wheel for Tg-Bruteforcing (setup.py): finished with status 'done'", + "`Hacking ... 36%\n█████████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)\nBuilding wheel for Tg-Bruteforcing (setup.py): finished with status 'done'\nCreated wheel for telegram: filename=Telegram-Data-Sniffer-0.0.1-py3-none-any.whl size=1306 sha256=cb224caad7fe01a6649188c62303cd4697c1869fa12d280570bb6ac6a88e6b7e", + "`Hacking ... 52%\n█████████████▒▒▒▒▒▒▒▒▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)\nBuilding wheel for Tg-Bruteforcing (setup.py): finished with status 'done'\nCreated wheel for telegram: filename=Telegram-Data-Sniffer-0.0.1-py3-none-any.whl size=1306 sha256=cb224caad7fe01a6649188c62303cd4697c1869fa12d280570bb6ac6a88e6b7e\n Stored in directory: /app/.cache/pip/wheels/a2/9f/b5/650dd4d533f0a17ca30cc11120b176643d27e0e1f5c9876b5b", + "`Hacking ... 84%\n█████████████████████▒▒▒▒ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)\nBuilding wheel for Tg-Bruteforcing (setup.py): finished with status 'done'\nCreated wheel for telegram: filename=Telegram-Data-Sniffer-0.0.1-py3-none-any.whl size=1306 sha256=cb224caad7fe01a6649188c62303cd4697c1869fa12d280570bb6ac6a88e6b7e\n Stored in directory: /app/.cache/pip/wheels/a2/9f/b5/650dd4d533f0a17ca30cc11120b176643d27e0e1f5c9876b5b\n\n **Successfully Hacked Telegram Server Database**", + "`Hacking ... 100%\n█████████HACKED███████████ `\n\n\n TERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.66 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)\nBuilding wheel for Tg-Bruteforcing (setup.py): finished with status 'done'\nCreated wheel for telegram: filename=Telegram-Data-Sniffer-0.0.1-py3-none-any.whl size=1306 sha256=cb224caad7fe01a6649188c62303cd4697c1869fa12d280570bb6ac6a88e6b7e\n Stored in directory: /app/.cache/pip/wheels/a2/9f/b5/650dd4d533f0a17ca30cc11120b176643d27e0e1f5c9876b5b\n\n **Successfully Hacked Telegram Server Database**\n\n\n🔹Output: Generating ...", + "`Targeted Account Hacked ...`\n\n[Pay 10$](https://paypal.me/AbirHasan2005) `To My Boss To Remove this hack ...`\n\nTERMINAL:\nDownloading Bruteforce-Telegram-0.1.tar.gz (9.3 kB)\nCollecting Data Package\n Downloading Telegram-Data-Sniffer-7.1.1-py2.py3-none-any.whl (82 kB)\nBuilding wheel for Tg-Bruteforcing (setup.py): finished with status 'done'\nCreated wheel for telegram: filename=Telegram-Data-Sniffer-0.0.1-py3-none-any.whl size=1306 sha256=cb224caad7fe01a6649188c62303cd4697c1869fa12d280570bb6ac6a88e6b7e\n Stored in directory: /app/.cache/pip/wheels/a2/9f/b5/650dd4d533f0a17ca30cc11120b176643d27e0e1f5c9876b5b\n\n **Successfully Hacked this Account From Telegram Database**\n\n\n🔹**Output:** Successful", + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + + await event.edit(animation_chars[i % 11]) + else: + await event.edit( + "`No User is Defined ...`\n`Please reply to a user ...`") \ No newline at end of file diff --git a/userbot/modules/owner.py b/userbot/modules/owner.py new file mode 100644 index 00000000..e2057e19 --- /dev/null +++ b/userbot/modules/owner.py @@ -0,0 +1,39 @@ +"""Emoji +Available Commands: +.owner""" +import asyncio + +from telethon import events + + +@borg.on(events.NewMessage(pattern=r"\.(.*)", outgoing=True)) +async def _(event): + + if event.fwd_from: + + return + + animation_interval = 0.5 + + animation_ttl = range(0, 6) + + input_str = event.pattern_match.group(1) + + if input_str == "owner": + + await event.edit(input_str) + + animation_chars = [ + "⬛⬛⬛⬛⬛⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬜⬛⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬛⬛⬛⬛⬛", + "⬛⬛⬛⬛⬛⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬛⬛⬛⬛⬛", + "⬛⬛⬛⬛⬛⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬛⬜⬜⬛⬛\n⬛⬛⬛⬛⬛⬛", + "⬛⬛⬛⬛⬛⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬛⬛⬛⬛⬛", + "⬛⬛⬛⬛⬛⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬛⬛⬛⬛⬛", + "⬛⬛⬛⬛⬛⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬜⬜⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬜⬛⬛⬜⬛\n⬛⬛⬛⬛⬛⬛", + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + + await event.edit(animation_chars[i % 6]) \ No newline at end of file diff --git a/userbot/modules/picspam.py b/userbot/modules/picspam.py new file mode 100644 index 00000000..d804238d --- /dev/null +++ b/userbot/modules/picspam.py @@ -0,0 +1,35 @@ +# Copyright (C) 2019 The Raphielscape Company LLC. +# +# Licensed under the Raphielscape Public License, Version 1.c (the "License"); +# you may not use this file except in compliance with the License. +# Usage:- .picspam +import asyncio +from asyncio import sleep +from asyncio import wait + +from userbot import BOTLOG +from userbot import BOTLOG_CHATID +from userbot import CMD_HELP +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="picspam")) +async def tiny_pic_spam(e): + message = e.text + text = message.split() + counter = int(text[1]) + link = str(text[2]) + await e.delete() + for i in range(1, counter): + await e.client.send_file(e.chat_id, link) + if BOTLOG: + await e.client.send_message( + BOTLOG_CHATID, "#PICSPAM\n" + "PicSpam was executed successfully") + + +CMD_HELP.update({ + "spam": + '.picspam \ +\nUsage: As if text spam was not enough !!"' +}) \ No newline at end of file diff --git a/userbot/modules/pluginbydead.py b/userbot/modules/pluginbydead.py new file mode 100644 index 00000000..38aeb140 --- /dev/null +++ b/userbot/modules/pluginbydead.py @@ -0,0 +1,24 @@ +import asyncio +import io + +from telethon import events + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="mkc")) +async def monu(mkc): + name = mkc.pattern_match.group(1) + f = ( + "{name} madharchod h uski maa ki choot uski maa ko ulta taang ke pelangai tab usko pata chalega \n" + "\n" + "Uski maa ka bhosra \n" + "Sale randi ke aulad \n" + "{name} Madharjatt \n" + "Tere khandan ko kutta chode \n" + "Randi Jatt {name} ki MKC \n") + + await mkc.edit(f) + + +# ©VaibhavRaj jo edit kiya uski maa chod deni h \ No newline at end of file diff --git a/userbot/modules/recognize.py b/userbot/modules/recognize.py new file mode 100644 index 00000000..e1dc35ab --- /dev/null +++ b/userbot/modules/recognize.py @@ -0,0 +1,55 @@ +# credits: @Mr_Hops +import datetime + +from telethon import events +from telethon.errors.rpcerrorlist import YouBlockedUserError +from telethon.tl.functions.account import UpdateNotifySettingsRequest + +from userbot import CMD_HELP +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="recognize ?(.*)")) +async def _(event): + if event.fwd_from: + return + if not event.reply_to_msg_id: + await event.edit("Reply to any user's media message.") + return + reply_message = await event.get_reply_message() + if not reply_message.media: + await event.edit("reply to media file") + return + chat = "@Rekognition_Bot" + sender = reply_message.sender + if reply_message.sender.bot: + await event.edit("Reply to actual users message.") + return + cat = await event.edit("recognizeing this media") + async with event.client.conversation(chat) as conv: + try: + response = conv.wait_event( + events.NewMessage(incoming=True, from_users=461083923)) + await event.client.forward_messages(chat, reply_message) + response = await response + except YouBlockedUserError: + await event.reply("unblock @Rekognition_Bot and try again") + await cat.delete() + return + if response.text.startswith("See next message."): + response = conv.wait_event( + events.NewMessage(incoming=True, from_users=461083923)) + response = await response + cat = response.message.message + await event.edit(cat) + + else: + await event.edit("sorry, I couldnt find it") + + +CMD_HELP.update({ + "recognize": + "`.recognize` reply this to any media file\ + \nUSAGE : Get information about an image using AWS Rekognition.\ + \nFind out information including detected labels, faces. text and moderation tags." +}) \ No newline at end of file diff --git a/userbot/modules/resend.py b/userbot/modules/resend.py new file mode 100644 index 00000000..993f6c96 --- /dev/null +++ b/userbot/modules/resend.py @@ -0,0 +1,17 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +from telethon import events +from telethon import utils +from telethon.tl import types + +from userbot.utils import admin_cmd + + +@borg.on(admin_cmd(pattern="resend")) +async def _(event): + await event.delete() + m = await event.get_reply_message() + if not m: + return + await event.respond(m) \ No newline at end of file diff --git a/userbot/modules/ripper.py b/userbot/modules/ripper.py new file mode 100644 index 00000000..8d3beb99 --- /dev/null +++ b/userbot/modules/ripper.py @@ -0,0 +1,36 @@ +"""Corona: Avaible commands: .ripper +""" +import datetime + +from telethon import events +from telethon.errors.rpcerrorlist import YouBlockedUserError +from telethon.tl.functions.account import UpdateNotifySettingsRequest +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern="ripper ?(.*)")) +async def _(event): + if event.fwd_from: + return + input_str = event.pattern_match.group(1) + reply_message = await event.get_reply_message() + chat = "@mrhacker_genuine_bot" + await event.edit( + "```Thankyou User Reported @sensible_userbot Ripper Team Will Check This And If user Found So That User Will Be Globally Banned...```" + ) + async with event.client.conversation(chat) as conv: + try: + response = conv.wait_event( + events.NewMessage(incoming=True, from_users=1254445279)) + await event.client.send_message(chat, "{}".format(input_str)) + response = await response + except YouBlockedUserError: + await event.reply( + "```Abey (@mrhacker_genuine_bot) Ko Unblock Kar```") + return + if response.text.startswith("Ripper"): + await event.edit( + "😐**Abe Lode Code Churane Aya Hei kya 😎Bhak bhosdike") + else: + await event.delete() + await event.client.send_message(event.chat_id, response.message) \ No newline at end of file diff --git a/userbot/modules/rt==new.py b/userbot/modules/rt==new.py new file mode 100644 index 00000000..3d01997a --- /dev/null +++ b/userbot/modules/rt==new.py @@ -0,0 +1,108 @@ +import asyncio +from platform import uname + +from telethon import events +from telethon.tl.types import ChannelParticipantsAdmins + +from userbot import ALIVE_NAME +from userbot.utils import admin_cmd + +n = str( + ALIVE_NAME) if ALIVE_NAME else "Set ALIVE_NAME in config vars in Heroku" + + +# @command(outgoing=True, pattern="^.ded$") +@borg.on(admin_cmd(pattern=r"ded")) +async def bluedevilded(ded): + await ded.edit(n + " == |\n     |" + "\n     | \n" + "     | \n" + "     | \n" + "     | \n" + "     | \n" + "     | \n" + "     | \n" + " / ̄ ̄\| \n" + "< ´・    |\ \n" + " | 3  | 丶\ \n" + "< 、・  |  \ \n" + " \__/∪ _ ∪) \n" + "      U U\n") + + +M = ("▄███████▄\n" + "█▄█████▄█\n" + "█▼▼▼▼▼█\n" + "██________█▌\n" + "█▲▲▲▲▲█\n" + "█████████\n" + "_████\n") +P = ("┈┈┏━╮╭━┓┈╭━━━━╮\n" + "┈┈┃┏┗┛┓┃╭┫ⓞⓘⓝⓚ┃\n" + "┈┈╰┓▋▋┏╯╯╰━━━━╯\n" + "┈╭━┻╮╲┗━━━━╮╭╮┈\n" + "┈┃▎▎┃╲╲╲╲╲╲┣━╯┈\n" + "┈╰━┳┻▅╯╲╲╲╲┃┈┈┈\n" + "┈┈┈╰━┳┓┏┳┓┏╯┈┈┈\n" + "┈┈┈┈┈┗┻┛┗┻┛┈┈┈┈\n") +K = "_/﹋\_\n" "(҂`_´)\n" "<,︻╦╤─ ҉ - -\n" "_/﹋\_\n" +G = ("........___________________\n" + "....../ `-___________--_____|] - - - - - -\n" + " - - ░ ▒▓▓█D \n" + "...../==o;;;;;;;;______.:/\n" + ".....), -.(_(__) /\n" + "....// (..) ), —\n" + "...//___//\n") +D = ("╥━━━━━━━━╭━━╮━━┳\n" + "╢╭╮╭━━━━━┫┃▋▋━▅┣\n" + "╢┃╰┫┈┈┈┈┈┃┃┈┈╰┫┣\n" + "╢╰━┫┈┈┈┈┈╰╯╰┳━╯┣\n" + "╢┊┊┃┏┳┳━━┓┏┳┫┊┊┣\n" + "╨━━┗┛┗┛━━┗┛┗┛━━┻\n") +H = ("▬▬▬.◙.▬▬▬ \n" + "═▂▄▄▓▄▄▂ \n" + "◢◤ █▀▀████▄▄▄▄◢◤ \n" + "█▄ █ █▄ ███▀▀▀▀▀▀▀╬ \n" + "◥█████◤ \n" + "══╩══╩══ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ \n" + "╬═╬ Hello, my friend :D \n" + "╬═╬☻/ \n" + "╬═╬/▌ \n" + "╬═╬/ \\n") + + +@borg.on(admin_cmd(pattern=r"monster")) +async def bluedevilmonster(monster): + await monster.edit(M) + + +@borg.on(admin_cmd(pattern=r"pig")) +async def bluedevipig(pig): + await pig.edit(P) + + +@borg.on(admin_cmd(pattern=r"kiler")) +async def bluedevikiller(kiler): + await kiler.edit(K) + + +@borg.on(admin_cmd(pattern=r"gun")) +async def bluedevigun(gun): + await gun.edit(G) + + +@borg.on(admin_cmd(pattern=r"dog")) +async def bluedevidog(dog): + await dog.edit(D) + + +@borg.on(admin_cmd(pattern=r"hmf")) +async def bluedevihmf(hmf): + await hmf.edit(H) +© 2020 GitHub, Inc. \ No newline at end of file diff --git a/userbot/modules/sniper kill 200.py b/userbot/modules/sniper kill 200.py new file mode 100644 index 00000000..176e50fe --- /dev/null +++ b/userbot/modules/sniper kill 200.py @@ -0,0 +1,61 @@ +"""Emoji +Available Commands: +.snkill""" +import asyncio + +from telethon import events +from telethon.tl.functions.users import GetFullUserRequest +from uniborg.util import admin_cmd + + +@borg.on(admin_cmd(pattern=r"snkill")) +async def _(event): + + if event.fwd_from: + + return + + animation_interval = 2 + + animation_ttl = range(0, 11) + + # input_str = event.pattern_match.group(1) + + # if input_str == "hack": + + if event.reply_to_msg_id: + reply_message = await event.get_reply_message() + replied_user = await event.client( + GetFullUserRequest(reply_message.from_id)) + firstname = replied_user.user.first_name + usname = replied_user.user.username + idd = reply_message.from_id + if idd == 953414679: + await event.edit( + "This is My Master\n**How dare you trying to tell me to kill master nigger!**\n\n__Your account is on hold! Pay 99$ to my master__ [@ceowhitehatcracks](tg://user?id=813878981) __to release your account__😏" + ) + else: + await event.edit("killing..") + animation_chars = [ + "Loading My Sniper", + "( -_・)▄︻̷̿┻̿═━一->", + " F i i r e", + "---->____________⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠", + "------>__________⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠", + "-------->⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠________", + "---------->⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠______", + "------------>⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠____", + "-------------->⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠⁠__", + "---------------->", + "------>;(^。^)ノ", + "( ̄ー ̄) DEAD WITH MY SNIPEPR", + "**Target killed successfully (°̥̥̥̥̥̥̥̥•̀.̫•́°̥̥̥̥̥̥̥)**", + ] + + for i in animation_ttl: + + await asyncio.sleep(animation_interval) + + await event.edit(animation_chars[i % 11]) + else: + await event.edit("Reply to the user whom you want to kill") \ No newline at end of file diff --git a/userbot/modules/thanos.py b/userbot/modules/thanos.py new file mode 100644 index 00000000..2bfdf9f0 --- /dev/null +++ b/userbot/modules/thanos.py @@ -0,0 +1,29 @@ +"""Emoji +Available Commands: +.emoji shrug +.emoji apple +.emoji :/ +.emoji -_-""" +import asyncio + +from telethon import events + + +@borg.on(events.NewMessage(pattern=r"\.(.*)", outgoing=True)) +async def _(event): + if event.fwd_from: + return + animation_interval = 0.3 + animation_ttl = range(0, 16) + input_str = event.pattern_match.group(1) + if input_str == "thanos": + await event.edit(input_str) + animation_chars = [ + "JINGLE BELLS", + "THANOS SMELL LOKI NECKED SNAPPED AWAY", + "PETER DIED SensibleUserbot CRIED NOBODY SAVED THE DAY HEY!!", + "Jingle bells Thanos smells Loki's necked snapped away Peter died SensibleUserbot cried And nobody saved the day", + ] + for i in animation_ttl: + await asyncio.sleep(animation_interval) + await event.edit(animation_chars[i % 4]) \ No newline at end of file diff --git a/userbot/modules/whois.py b/userbot/modules/whois.py index 0fa12161..10d2ad2b 100644 --- a/userbot/modules/whois.py +++ b/userbot/modules/whois.py @@ -1,160 +1,293 @@ -# Copyright (C) 2019 The Raphielscape Company LLC. -# -# Licensed under the Raphielscape Public License, Version 1.d (the "License"); -# you may not use this file except in compliance with the License. -# -# The entire source code is OSSRPL except 'whois' which is MPL -# License: MPL and OSSRPL -""" Userbot module for getiing info about any user on Telegram(including you!). """ - -import os - -from telethon.tl.functions.photos import GetUserPhotosRequest -from telethon.tl.functions.users import GetFullUserRequest -from telethon.tl.types import MessageEntityMentionName -from telethon.utils import get_input_location - -from userbot import CMD_HELP, TEMP_DOWNLOAD_DIRECTORY -from userbot.events import register - - -@register(pattern=".whois(?: |$)(.*)", outgoing=True) -async def who(event): - - await event.edit( - "`Sit tight while I steal some data from *Global Network Zone*...`" - ) - - if not os.path.isdir(TEMP_DOWNLOAD_DIRECTORY): - os.makedirs(TEMP_DOWNLOAD_DIRECTORY) - - replied_user = await get_user(event) - - try: - photo, caption = await fetch_info(replied_user, event) - except AttributeError: - event.edit("`Could not fetch info of that user.`") - return - - message_id_to_reply = event.message.reply_to_msg_id - - if not message_id_to_reply: - message_id_to_reply = None - - try: - await event.client.send_file( - event.chat_id, - photo, - caption=caption, - link_preview=False, - force_document=False, - reply_to=message_id_to_reply, - parse_mode="html", - ) - - if not photo.startswith("http"): - os.remove(photo) - await event.delete() - - except TypeError: - await event.edit(caption, parse_mode="html") - - -async def get_user(event): - """ Get the user from argument or replied message. """ - if event.reply_to_msg_id and not event.pattern_match.group(1): - previous_message = await event.get_reply_message() - replied_user = await event.client(GetFullUserRequest(previous_message.from_id)) - else: - user = event.pattern_match.group(1) - - if user.isnumeric(): - user = int(user) - - if not user: - self_user = await event.client.get_me() - user = self_user.id - - if event.message.entities is not None: - probable_user_mention_entity = event.message.entities[0] - - if isinstance(probable_user_mention_entity, MessageEntityMentionName): - user_id = probable_user_mention_entity.user_id - replied_user = await event.client(GetFullUserRequest(user_id)) - return replied_user - try: - user_object = await event.client.get_entity(user) - replied_user = await event.client(GetFullUserRequest(user_object.id)) - except (TypeError, ValueError) as err: - await event.edit(str(err)) - return None - - return replied_user - - -async def fetch_info(replied_user, event): - """ Get details from the User object. """ - replied_user_profile_photos = await event.client( - GetUserPhotosRequest( - user_id=replied_user.user.id, offset=42, max_id=0, limit=80 - ) - ) - replied_user_profile_photos_count = ( - "Person needs help with uploading profile picture." - ) - try: - replied_user_profile_photos_count = replied_user_profile_photos.count - except AttributeError: - pass - user_id = replied_user.user.id - first_name = replied_user.user.first_name - last_name = replied_user.user.last_name - try: - dc_id, location = get_input_location(replied_user.profile_photo) - except Exception as e: - dc_id = "Couldn't fetch DC ID!" - str(e) - common_chat = replied_user.common_chats_count - username = replied_user.user.username - user_bio = replied_user.about - is_bot = replied_user.user.bot - restricted = replied_user.user.restricted - verified = replied_user.user.verified - photo = await event.client.download_profile_photo( - user_id, TEMP_DOWNLOAD_DIRECTORY + str(user_id) + ".jpg", download_big=True - ) - first_name = ( - first_name.replace("\u2060", "") - if first_name - else ("This User has no First Name") - ) - last_name = ( - last_name.replace("\u2060", "") if last_name else ("This User has no Last Name") - ) - username = "@{}".format(username) if username else ("This User has no Username") - user_bio = "This User has no About" if not user_bio else user_bio - - caption = "USER INFO:\n\n" - caption += f"First Name: {first_name}\n" - caption += f"Last Name: {last_name}\n" - caption += f"Username: {username}\n" - caption += f"Data Centre ID: {dc_id}\n" - caption += f"Number of Profile Pics: {replied_user_profile_photos_count}\n" - caption += f"Is Bot: {is_bot}\n" - caption += f"Is Restricted: {restricted}\n" - caption += f"Is Verified by Telegram: {verified}\n" - caption += f"ID: {user_id}\n\n" - caption += f"Bio: \n{user_bio}\n\n" - caption += f"Common Chats with this user: {common_chat}\n" - caption += f"Permanent Link To Profile: " - caption += f'{first_name}' - - return photo, caption - - -CMD_HELP.update( - { - "whois": ".whois or reply to someones text with .whois\ - \nUsage: Gets info of an user." - } -) +# Copyright (C) 2019 The Raphielscape Company LLC. +# +# Licensed under the Raphielscape Public License, Version 1.c (the "License"); +# you may not use this file except in compliance with the License. +# +# The entire source code is OSSRPL except 'whois' which is MPL +# License: MPL and OSSRPL +""" Userbot module for getiing info about any user on Telegram(including you!). """ +import html +import os + +from telethon.tl.functions.photos import GetUserPhotosRequest +from telethon.tl.functions.users import GetFullUserRequest +from telethon.tl.types import MessageEntityMentionName +from telethon.utils import get_input_location + +from userbot import CMD_HELP +from userbot import TEMP_DOWNLOAD_DIRECTORY +from userbot.utils import admin_cmd +from userbot.utils import register + + +@borg.on(admin_cmd(pattern="userinfo(?: |$)(.*)")) +async def _(event): + if event.fwd_from: + return + replied_user, error_i_a = await get_full_user(event) + if replied_user is None: + await event.edit(str(error_i_a)) + return False + replied_user_profile_photos = await borg( + GetUserPhotosRequest(user_id=replied_user.user.id, + offset=42, + max_id=0, + limit=80)) + replied_user_profile_photos_count = "NaN" + try: + replied_user_profile_photos_count = replied_user_profile_photos.count + except AttributeError as e: + pass + user_id = replied_user.user.id + # some people have weird HTML in their names + first_name = html.escape(replied_user.user.first_name) + # https://stackoverflow.com/a/5072031/4723940 + # some Deleted Accounts do not have first_name + if first_name is not None: + # some weird people (like me) have more than 4096 characters in their names + first_name = first_name.replace("\u2060", "") + # inspired by https://telegram.dog/afsaI181 + user_bio = replied_user.about + if user_bio is not None: + user_bio = html.escape(replied_user.about) + common_chats = replied_user.common_chats_count + try: + dc_id, location = get_input_location(replied_user.profile_photo) + except Exception as e: + dc_id = "Need a Profile Picture to check **this**" + location = str(e) + caption = """Detailed Whois: +🔖ID: {} +🤵Name: {} +✍️Bio: {} +🌏Data Centre Number: {} +🖼Number of Profile Pics: {} +🔏Restricted: {} +🌐Verified: {} +🤖Bot: {} +👥Groups in Common: {} +List Of Telegram Data Centres: +DC1 : Miami FL, USA +DC2 : Amsterdam, NL +DC3 : Miami FL, USA +DC4 : Amsterdam, NL +DC5 : Singapore, SG +""".format( + user_id, + user_id, + first_name, + user_bio, + dc_id, + replied_user_profile_photos_count, + replied_user.user.restricted, + replied_user.user.verified, + replied_user.user.bot, + common_chats, + ) + message_id_to_reply = event.message.reply_to_msg_id + if not message_id_to_reply: + message_id_to_reply = event.message.id + await borg.send_message( + event.chat_id, + caption, + reply_to=message_id_to_reply, + parse_mode="HTML", + file=replied_user.profile_photo, + force_document=False, + silent=True, + ) + await event.delete() + + +async def get_full_user(event): + if event.reply_to_msg_id: + previous_message = await event.get_reply_message() + if previous_message.forward: + replied_user = await event.client( + GetFullUserRequest(previous_message.forward.from_id + or previous_message.forward.channel_id)) + return replied_user, None + else: + replied_user = await event.client( + GetFullUserRequest(previous_message.from_id)) + return replied_user, None + else: + input_str = None + try: + input_str = event.pattern_match.group(1) + except IndexError as e: + return None, e + if event.message.entities: + mention_entity = event.message.entities + probable_user_mention_entity = mention_entity[0] + if isinstance(probable_user_mention_entity, + MessageEntityMentionName): + user_id = probable_user_mention_entity.user_id + replied_user = await event.client(GetFullUserRequest(user_id)) + return replied_user, None + else: + try: + user_object = await event.client.get_entity(input_str) + user_id = user_object.id + replied_user = await event.client( + GetFullUserRequest(user_id)) + return replied_user, None + except Exception as e: + return None, e + elif event.is_private: + try: + user_id = event.chat_id + replied_user = await event.client(GetFullUserRequest(user_id)) + return replied_user, None + except Exception as e: + return None, e + else: + try: + user_object = await event.client.get_entity(int(input_str)) + user_id = user_object.id + replied_user = await event.client(GetFullUserRequest(user_id)) + return replied_user, None + except Exception as e: + return None, e + + +@borg.on(admin_cmd(pattern="whois(?: |$)(.*)")) +async def who(event): + + await event.edit( + "`Sit tight while I steal some data from Mark Zuckerburg...`") + + if not os.path.isdir(TEMP_DOWNLOAD_DIRECTORY): + os.makedirs(TEMP_DOWNLOAD_DIRECTORY) + + replied_user = await get_user(event) + + try: + photo, caption = await fetch_info(replied_user, event) + except AttributeError: + await event.edit("`Could not fetch info of that user.`") + return + + message_id_to_reply = event.message.reply_to_msg_id + + if not message_id_to_reply: + message_id_to_reply = None + + try: + await event.client.send_file( + event.chat_id, + photo, + caption=caption, + link_preview=False, + force_document=False, + reply_to=message_id_to_reply, + parse_mode="html", + ) + + if not photo.startswith("http"): + os.remove(photo) + await event.delete() + + except TypeError: + await event.edit(caption, parse_mode="html") + + +async def get_user(event): + """ Get the user from argument or replied message. """ + if event.reply_to_msg_id and not event.pattern_match.group(1): + previous_message = await event.get_reply_message() + replied_user = await event.client( + GetFullUserRequest(previous_message.from_id)) + else: + user = event.pattern_match.group(1) + + if user.isnumeric(): + user = int(user) + + if not user: + self_user = await event.client.get_me() + user = self_user.id + + if event.message.entities: + probable_user_mention_entity = event.message.entities[0] + + if isinstance(probable_user_mention_entity, + MessageEntityMentionName): + user_id = probable_user_mention_entity.user_id + replied_user = await event.client(GetFullUserRequest(user_id)) + return replied_user + try: + user_object = await event.client.get_entity(user) + replied_user = await event.client( + GetFullUserRequest(user_object.id)) + except (TypeError, ValueError) as err: + await event.edit(str(err)) + return None + + return replied_user + + +async def fetch_info(replied_user, event): + """ Get details from the User object. """ + replied_user_profile_photos = await event.client( + GetUserPhotosRequest(user_id=replied_user.user.id, + offset=42, + max_id=0, + limit=80)) + replied_user_profile_photos_count = ( + "Person needs help with uploading profile picture.") + try: + replied_user_profile_photos_count = replied_user_profile_photos.count + except AttributeError as e: + pass + user_id = replied_user.user.id + first_name = replied_user.user.first_name + last_name = replied_user.user.last_name + try: + dc_id, location = get_input_location(replied_user.profile_photo) + except Exception as e: + dc_id = "Couldn't fetch DC ID!" + location = str(e) + common_chat = replied_user.common_chats_count + username = replied_user.user.username + user_bio = replied_user.about + is_bot = replied_user.user.bot + restricted = replied_user.user.restricted + verified = replied_user.user.verified + photo = await event.client.download_profile_photo(user_id, + TEMP_DOWNLOAD_DIRECTORY + + str(user_id) + ".jpg", + download_big=True) + first_name = (first_name.replace("\u2060", "") if first_name else + ("This User has no First Name")) + last_name = (last_name.replace("\u2060", "") if last_name else + ("This User has no Last Name")) + username = "@{}".format(username) if username else ( + "This User has no Username") + user_bio = "This User has no About" if not user_bio else user_bio + + caption = "USER INFO from cat's database :\n\n" + caption += f"First Name: {first_name}\n" + caption += f"Last Name: {last_name}\n" + caption += f"Username: {username}\n" + caption += f"Data Centre ID: {dc_id}\n" + caption += f"Number of Profile Pics: {replied_user_profile_photos_count}\n" + caption += f"Is Bot: {is_bot}\n" + caption += f"Is Restricted: {restricted}\n" + caption += f"Is Verified by Telegram: {verified}\n" + caption += f"ID: {user_id}\n\n" + caption += f"Bio: \n{user_bio}\n\n" + caption += f"Common Chats with this user: {common_chat}\n" + caption += f"Permanent Link To Profile: " + caption += f'{first_name}' + + return photo, caption + + +CMD_HELP.update({ + "whois": + ".whois or reply to someones text with .whois\ + \nUsage: Gets info of an user.\ + .userinfo or reply to someones text with .userinfo\ + \nUsage: Gets info of an user." +}) \ No newline at end of file From d4c48a8a4eacd026a3658a8ebd208b02bffc7fb9 Mon Sep 17 00:00:00 2001 From: Avi Patil <67785446+avipatilpro@users.noreply.github.com> Date: Mon, 21 Sep 2020 16:29:38 +0530 Subject: [PATCH 5/6] New Thing !! --- userbot/modules/superfban.py | 229 +++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 userbot/modules/superfban.py diff --git a/userbot/modules/superfban.py b/userbot/modules/superfban.py new file mode 100644 index 00000000..054513fa --- /dev/null +++ b/userbot/modules/superfban.py @@ -0,0 +1,229 @@ +# (c)2020 TeleBot +# +# You may not use this plugin without proper authorship and consent from @TeleBotSupport +# + +from telethon import events +import random, re +from userbot.utils import admin_cmd +import asyncio + +# By @HeisenbergTheDanger, @its_xditya +@telebot.on(admin_cmd("superfban ?(.*)")) +async def _(event): + if event.fwd_from: + return + await event.edit("Starting a Mass-FedBan...") + fedList = [] + if event.reply_to_msg_id: + previous_message = await event.get_reply_message() + if previous_message.media: + downloaded_file_name = await telebot.download_media( + previous_message, + "fedlist" + ) + await asyncio.sleep(6) + file = open(downloaded_file_name, 'r') + lines = file.readlines() + for line in lines: + try: + fedList.append(line[:36]) + except: + pass + arg = event.pattern_match.group(1) + args = arg.split() + if len(args) > 1: + FBAN = args[0] + REASON = "" + for a in args[1:]: + REASON += (a + " ") + else: + FBAN = arg + REASON = " #TBMassBanned " + else: + FBAN = previous_message.from_id + REASON = event.pattern_match.group(1) + if REASON.strip() == "": + REASON = " #TBMassBanned " + else: + arg = event.pattern_match.group(1) + args = arg.split() + if len(args) > 1: + FBAN = args[0] + REASON = "" + for a in args[1:]: + REASON += (a + " ") + else: + FBAN = arg + REASON = " #TBMassBanned " + try: + int(FBAN) + if int(FBAN) == 630654925 or int(FBAN) == 719195224: + await event.edit("Something went wrong.") + return + except: + if FBAN == "@HeisenbergTheDanger" or FBAN == "@xditya": + await event.edit("Something went wrong.") + return + if Config.FBAN_GROUP_ID: + chat = Config.FBAN_GROUP_ID + else: + chat = await event.get_chat() + if not len(fedList): + for a in range(3): + async with telebot.conversation("@MissRose_bot") as bot_conv: + await bot_conv.send_message("/start") + await bot_conv.send_message("/myfeds") + await asyncio.sleep(3) + response = await bot_conv.get_response() + await asyncio.sleep(3) + if "make a file" in response.text: + await asyncio.sleep(6) + await response.click(0) + await asyncio.sleep(6) + fedfile = await bot_conv.get_response() + await asyncio.sleep(3) + if fedfile.media: + downloaded_file_name = await telebot.download_media( + fedfile, + "fedlist" + ) + await asyncio.sleep(6) + file = open(downloaded_file_name, 'r') + lines = file.readlines() + for line in lines: + try: + fedList.append(line[:36]) + except: + pass + else: + return + if len(fedList) == 0: + await event.edit(f"Something went wrong. Retrying ({a+1}/3)...") + else: + break + else: + await event.edit(f"Error") + if "You can only use fed commands once every 5 minutes" in response.text: + await event.edit("Try again after 5 mins.") + return + In = False + tempFedId = "" + for x in response.text: + if x == "`": + if In: + In = False + fedList.append(tempFedId) + tempFedId = "" + else: + In = True + + elif In: + tempFedId += x + if len(fedList) == 0: + await event.edit("Something went wrong.") + return + await event.edit(f"Fbaning in {len(fedList)} feds.") + try: + await telebot.send_message(chat, f"/start") + except: + await event.edit("FBAN_GROUP_ID is incorrect.") + return + await asyncio.sleep(3) + if Config.EXCLUDE_FED: + excludeFed = Config.EXCLUDE_FED.split("|") + for n in range(len(excludeFed)): + excludeFed[n] = excludeFed[n].strip() + exCount = 0 + for fed in fedList: + if Config.EXCLUDE_FED and fed in excludeFed: + await telebot.send_message(chat, f"{fed} Excluded.") + exCount += 1 + continue + await telebot.send_message(chat, f"/joinfed {fed}") + await asyncio.sleep(3) + await telebot.send_message(chat, f"/fban {FBAN} {REASON}") + await asyncio.sleep(3) + await event.edit(f"SuperFBan Completed. Affected {len(fedList) - exCount} feds.\n#TB") +# By @HeisenbergTheDanger, @its_xditya +@telebot.on(admin_cmd("superunfban ?(.*)")) +async def _(event): + if event.fwd_from: + return + await event.edit("Starting a Mass-UnFedBan...") + if event.reply_to_msg_id: + previous_message = await event.get_reply_message() + FBAN = previous_message.from_id + else: + FBAN = event.pattern_match.group(1) + + if Config.FBAN_GROUP_ID: + chat = Config.FBAN_GROUP_ID + else: + chat = await event.get_chat() + fedList = [] + for a in range(3): + async with telebot.conversation("@MissRose_bot") as bot_conv: + await bot_conv.send_message("/start") + await bot_conv.send_message("/myfeds") + response = await bot_conv.get_response() + if "make a file" in response.text: + await asyncio.sleep(1) + await response.click(0) + fedfile = await bot_conv.get_response() + if fedfile.media: + downloaded_file_name = await telebot.download_media( + fedfile, + "fedlist" + ) + file = open(downloaded_file_name, 'r') + lines = file.readlines() + for line in lines: + fedList.append(line[:line.index(":")]) + else: + return + if len(fedList) == 0: + await event.edit(f"Something went wrong. Retrying ({a+1}/3)...") + else: + break + else: + await event.edit(f"Error") + if "You can only use fed commands once every 5 minutes" in response.text: + await event.edit("Try again after 5 mins.") + return + In = False + tempFedId = "" + for x in response.text: + if x == "`": + if In: + In = False + fedList.append(tempFedId) + tempFedId = "" + else: + In = True + + elif In: + tempFedId += x + + await event.edit(f"UnFbaning in {len(fedList)} feds.") + try: + await telebot.send_message(chat, f"/start") + except: + await event.edit("FBAN_GROUP_ID is incorrect.") + return + await asyncio.sleep(3) + for fed in fedList: + await telebot.send_message(chat, f"/joinfed {fed}") + await asyncio.sleep(3) + await telebot.send_message(chat, f"/unfban {FBAN}") + await asyncio.sleep(3) + await event.edit(f"SuperUnFBan Completed. Affected {len(fedList)} feds.\n#TB") +# By @HeisenbergTheDanger, @its_xditya + +""" +.superfban \ +\n**Usage**: Mass-Ban in all feds you are admin in.\ +\nSet `EXCLUDE_FED fedid1|fedid2` in heroku vars to exclude those feds.\ +\nSet var `FBAN_GROUP_ID` ti the group with rose, where you want FBan to take place.\ +\n\nGet help - @TeleBotSupport\ +""" From 5d7d625507e884cb08e49be337c914074c3cfa76 Mon Sep 17 00:00:00 2001 From: Avi Patil <67785446+avipatilpro@users.noreply.github.com> Date: Wed, 23 Sep 2020 12:54:07 +0530 Subject: [PATCH 6/6] Create tmdb.py --- tmdb.py | 330 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 tmdb.py diff --git a/tmdb.py b/tmdb.py new file mode 100644 index 00000000..4927dc58 --- /dev/null +++ b/tmdb.py @@ -0,0 +1,330 @@ +# (c) @Avishkarpatil + +""" +TheMovieDB +==================================== +It contains Movie & TvShows class, a synchronous themoviedb wrapper. +""" + + +from abc import ABC, abstractmethod +from typing import Optional, Dict, Any +from requests import get +from .excs import TmdbApiError, ZeroResultsFound + + +class AbsMovieDB(ABC): + """Abstract class for tmdb""" + + def __init__(self, api_key): + """ + :param api_key :type str themoviedb API key. + """ + self.api_key = api_key + self.base_url = "https://api.themoviedb.org/3" + + @abstractmethod + def search(self): + pass + + +############################## Movies class ############################## + + +class Movie(AbsMovieDB): + """This class handles all movie related tasks""" + + def search( + self, + query: str, + language: str = "en", + page: Optional[int] = 1, + include_adult: Optional[str] = "true", + ) -> Dict[str, Any]: + """ + search for the query and return data in json format + """ + + payload = { + "api_key": self.api_key, + "language": language, + "query": query, + "page": page, + "include_adult": include_adult, + } + + resp = get(self.base_url + "/search/movie", params=payload) + + if resp.status_code == 200: + + check_res = resp.json()["results"] + if len(check_res) <= 0: + raise ZeroResultsFound(resp.text) + return resp.json() + + raise TmdbApiError(resp.text) + + def searchid( + self, + movie_id: int, + language: str = "en", + append_to_response: Optional[str] = "videos", + ) -> Dict[str, Any]: + """ + returns movie detais for the movie_id in json format + """ + + payload = { + "api_key": self.api_key, + "language": language, + "append_to_response": append_to_response, + } + + resp = get(self.base_url + f"/movie/{movie_id}", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def recommendations( + self, movie_id: int, language: str = "en", page: Optional[int] = 1 + ) -> Dict[str, Any]: + """ + returns recommendations data for the movie_id in json format + """ + + payload = {"api_key": self.api_key, "language": language, "page": page} + + resp = get(self.base_url + f"/movie/{movie_id}/recommendations", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def trending(self, time_win: str = "week") -> Dict[str, Any]: + """ + returns trending movies for time_win (day / week) in json format + """ + payload = {"api_key": self.api_key} + + resp = get(self.base_url + f"/trending/movie/{time_win}", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def certification(self) -> Dict[str, Any]: + """ + Get an up to date list of the officially + supported movie certifications on TMDb. + """ + + payload = {"api_key": self.api_key} + + resp = get(self.base_url + "/certification/movie/list", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def genre(self, language: str = "en") -> Dict[str, Any]: + """ + Get the list of official genres for movies. + """ + payload = {"api_key": self.api_key, "language": language} + + resp = get(self.base_url + "/genre/movie/list", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def alternative_titles( + self, movie_id: int, country: Optional[str] = None + ) -> Dict[str, Any]: + """ + Get all of the alternative titles for a movie. + """ + + payload = {"api_key": self.api_key, "country": country} + + resp = get( + self.base_url + f"/movie/{movie_id}/alternative_titles", params=payload + ) + + if resp.status_code == 200: + + check_res = resp.json()["titles"] + if len(check_res) <= 0: + raise ZeroResultsFound(resp.text) + return resp.json() + + raise TmdbApiError(resp.text) + + def collection(self, collection_id: int, language: str = "en") -> Dict[str, Any]: + """ + Get collection details by id. + """ + + payload = {"api_key": self.api_key, "language": language} + + resp = get(self.base_url + f"/collection/{collection_id}", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def search_collection( + self, query: str, language: str = "en", page: Optional[int] = 1 + ) -> Dict[str, Any]: + """ + Search for collections. + """ + + payload = { + "api_key": self.api_key, + "language": language, + "query": query, + "page": page, + } + + resp = get(self.base_url + "/search/collection", params=payload) + + if resp.status_code == 200: + + check_res = resp.json()["results"] + if len(check_res) <= 0: + raise ZeroResultsFound(resp.text) + return resp.json() + + raise TmdbApiError(resp.text) + + +############################## TvShows class ############################## + + +class TvShows(AbsMovieDB): + """This class handles all tv related tasks""" + + def search( + self, + query: str, + language: str = "en", + page: Optional[int] = 1, + include_adult: Optional[str] = "true", + ) -> Dict[str, Any]: + """ + search for the query and return data in json format + """ + + payload = { + "api_key": self.api_key, + "language": language, + "query": query, + "page": page, + "include_adult": include_adult, + } + + resp = get(self.base_url + "/search/tv", params=payload) + + if resp.status_code == 200: + + check_res = resp.json()["results"] + if len(check_res) <= 0: + raise ZeroResultsFound(resp.text) + return resp.json() + + raise TmdbApiError(resp.text) + + def searchid( + self, + tv_id: int, + language: str = "en", + append_to_response: Optional[str] = "videos", + ) -> Dict[str, Any]: + """ + returns tv detais for the tv_id in json format + """ + + payload = { + "api_key": self.api_key, + "language": language, + "append_to_response": append_to_response, + } + + resp = get(self.base_url + f"/tv/{tv_id}", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def recommendations( + self, tv_id: int, language: str = "en", page: Optional[int] = 1 + ) -> Dict[str, Any]: + """ + returns recommendations data for the tv_id in json format + """ + + payload = {"api_key": self.api_key, "language": language, "page": page} + + resp = get(self.base_url + f"/tv/{tv_id}/recommendations", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def trending(self, time_win: str = "week") -> Dict[str, Any]: + """ + returns trending tvshows for time_win (day / week) in json format + """ + payload = {"api_key": self.api_key} + + resp = get(self.base_url + f"/trending/tv/{time_win}", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def certification(self) -> Dict[str, Any]: + """ + Get an up to date list of the officially + supported TV show certifications on TMDb. + """ + + payload = {"api_key": self.api_key} + + resp = get(self.base_url + "/certification/tv/list", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def genre(self, language: str = "en") -> Dict[str, Any]: + """ + Get the list of official genres for TV shows. + """ + payload = {"api_key": self.api_key, "language": language} + + resp = get(self.base_url + "/genre/tv/list", params=payload) + + if resp.status_code == 200: + return resp.json() + raise TmdbApiError(resp.text) + + def alternative_titles(self, tv_id: int, language: str = "en") -> Dict[str, Any]: + """ + Returns all of the alternative titles for a TV show. + """ + + payload = {"api_key": self.api_key, "language": language} + + resp = get(self.base_url + f"/tv/{tv_id}/alternative_titles", params=payload) + + if resp.status_code == 200: + + check_res = resp.json()["results"] + if len(check_res) <= 0: + raise ZeroResultsFound(resp.text) + return resp.json() + + raise TmdbApiError(resp.text)