From 9505750e296517e92d58ce0c5ef864fa1fed0cee Mon Sep 17 00:00:00 2001
From: Mira <56395159+TheXorog@users.noreply.github.com>
Date: Mon, 27 Jan 2025 17:17:53 +0100
Subject: [PATCH] refactor: Initial release
---
.gitattributes | 2 +
.gitconfig | 2 +
.github/CODE_OF_CONDUCT.md | 134 +
.github/workflows/dev.yml | 71 +
.github/workflows/main.yml | 119 +
.github/workflows/preview.yml | 148 +
.gitignore | 348 ++
.gitmodules | 33 +
.vscode/Snippets.code-snippets | 97 +
.vscode/extensions.json | 11 +
.vscode/settings.json | 28 +
.vscode/tasks.json | 41 +
CONTRIBUTING.md | 49 +
DeleteDrafts.sh | 35 +
DeleteOldTags.sh | 37 +
Dependencies/DisCatSharp | 1 +
Dependencies/Xorog.UniversalExtensions | 1 +
Dependencies/quickchart-csharp | 1 +
DocAssets/DownloadProject1.png | Bin 0 -> 30389 bytes
DocAssets/DownloadRelease1.png | Bin 0 -> 16250 bytes
DocAssets/ExamplePluginInfo1.png | Bin 0 -> 43967 bytes
InitSubmodules.sh | 5 +
LICENSE | 674 +++
OfficialPlugins/Example | 1 +
OfficialPlugins/Music | 1 +
OfficialPlugins/ScoreSaber | 1 +
OfficialPlugins/Social | 1 +
OfficialPlugins/Translations | 1 +
OfficialPlugins/build_all.cmd | 29 +
OfficialPlugins/build_all.sh | 44 +
OfficialPlugins/move_all.cmd | 7 +
OfficialPlugins/move_all.sh | 7 +
OfficialPlugins/update_deps.cmd | 34 +
OfficialPlugins/update_deps.sh | 55 +
PLUGINS.md | 37 +
ProjectMakoto/.editorconfig | 110 +
ProjectMakoto/Assets/1.png | Bin 0 -> 134 bytes
ProjectMakoto/Assets/ASCII.txt | 44 +
ProjectMakoto/Assets/AddToServer.pdn | Bin 0 -> 29387 bytes
ProjectMakoto/Assets/AddToServer.png | Bin 0 -> 19441 bytes
ProjectMakoto/Assets/Countries.json | 1262 ++++
ProjectMakoto/Assets/Dev.pdn | Bin 0 -> 314675 bytes
ProjectMakoto/Assets/Dev.png | Bin 0 -> 430001 bytes
ProjectMakoto/Assets/DevSmall.png | Bin 0 -> 445570 bytes
ProjectMakoto/Assets/DiscordMessages.html | 136 +
.../Assets/Emojis/Editing Files/Channel.pdn | Bin 0 -> 46021 bytes
.../Editing Files/CheckboxTickedBlue.pdn | Bin 0 -> 9752 bytes
.../Editing Files/CheckboxUntickedBlue.pdn | Bin 0 -> 5953 bytes
.../Assets/Emojis/Editing Files/Guild.pdn | Bin 0 -> 80848 bytes
.../Assets/Emojis/Editing Files/Invite.pdn | Bin 0 -> 89556 bytes
.../Assets/Emojis/Editing Files/Message.pdn | Bin 0 -> 30626 bytes
.../Emojis/Editing Files/MessageCommand.pdn | Bin 0 -> 31085 bytes
.../Assets/Emojis/Editing Files/PillOff.pdn | Bin 0 -> 102343 bytes
.../Assets/Emojis/Editing Files/PillOn.pdn | Bin 0 -> 117341 bytes
.../Editing Files/PrefixCommandDisabled.pdn | Bin 0 -> 36977 bytes
.../Editing Files/PrefixCommandEnabled.pdn | Bin 0 -> 39316 bytes
.../Emojis/Editing Files/SlashCommand.pdn | Bin 0 -> 26955 bytes
.../Assets/Emojis/Editing Files/User.pdn | Bin 0 -> 47871 bytes
.../Emojis/Editing Files/UserCommand.pdn | Bin 0 -> 49406 bytes
.../Emojis/Editing Files/VoiceStateUser.pdn | Bin 0 -> 63089 bytes
.../Assets/Emojis/Upload/Channel.png | Bin 0 -> 13619 bytes
.../Assets/Emojis/Upload/CheckboxTicked.png | Bin 0 -> 3042 bytes
.../Assets/Emojis/Upload/CheckboxUnticked.png | Bin 0 -> 1391 bytes
.../Assets/Emojis/Upload/DisabledPause.png | Bin 0 -> 1680 bytes
.../Assets/Emojis/Upload/DisabledPlay.png | Bin 0 -> 2028 bytes
.../Assets/Emojis/Upload/DisabledRepeat.png | Bin 0 -> 5163 bytes
.../Assets/Emojis/Upload/DisabledShuffle.png | Bin 0 -> 5243 bytes
ProjectMakoto/Assets/Emojis/Upload/Dot.png | Bin 0 -> 4193 bytes
ProjectMakoto/Assets/Emojis/Upload/Error.png | Bin 0 -> 25014 bytes
ProjectMakoto/Assets/Emojis/Upload/Guild.png | Bin 0 -> 30166 bytes
ProjectMakoto/Assets/Emojis/Upload/In.png | Bin 0 -> 152 bytes
ProjectMakoto/Assets/Emojis/Upload/Invite.png | Bin 0 -> 34542 bytes
.../Assets/Emojis/Upload/Loading.gif | Bin 0 -> 165087 bytes
.../Assets/Emojis/Upload/Message.png | Bin 0 -> 9800 bytes
.../Assets/Emojis/Upload/MessageCommand.png | Bin 0 -> 10265 bytes
ProjectMakoto/Assets/Emojis/Upload/Paused.gif | Bin 0 -> 929 bytes
.../Assets/Emojis/Upload/PillOff.png | Bin 0 -> 14252 bytes
ProjectMakoto/Assets/Emojis/Upload/PillOn.png | Bin 0 -> 12576 bytes
.../Emojis/Upload/PrefixCommandDisabled.png | Bin 0 -> 17540 bytes
.../Emojis/Upload/PrefixCommandEnabled.png | Bin 0 -> 19252 bytes
.../Assets/Emojis/Upload/QuestionMark.png | Bin 0 -> 12569 bytes
.../Assets/Emojis/Upload/SlashCommand.png | Bin 0 -> 9432 bytes
.../Assets/Emojis/Upload/Soundcloud.png | Bin 0 -> 8562 bytes
.../Assets/Emojis/Upload/Spotify.png | Bin 0 -> 20889 bytes
ProjectMakoto/Assets/Emojis/Upload/User.png | Bin 0 -> 18069 bytes
.../Assets/Emojis/Upload/UserCommand.png | Bin 0 -> 20022 bytes
.../Assets/Emojis/Upload/VoiceState.png | Bin 0 -> 22377 bytes
.../Assets/Emojis/Upload/YouTube.png | Bin 0 -> 2974 bytes
.../Assets/Emojis/Upload/abuseipdb.png | Bin 0 -> 10685 bytes
.../Assets/Icons/Editing Files/BanRemoved.pdn | Bin 0 -> 71877 bytes
.../Icons/Editing Files/ChannelAdded.pdn | Bin 0 -> 53279 bytes
.../Icons/Editing Files/ChannelRemoved.pdn | Bin 0 -> 50135 bytes
.../Icons/Editing Files/ChannelUpdated.pdn | Bin 0 -> 57956 bytes
.../Icons/Editing Files/GuildUpdated.pdn | Bin 0 -> 73595 bytes
.../Icons/Editing Files/InviteAdded.pdn | Bin 0 -> 75722 bytes
.../Icons/Editing Files/InviteRemoved.pdn | Bin 0 -> 71981 bytes
.../Icons/Editing Files/MessageRemoved.pdn | Bin 0 -> 39282 bytes
.../Icons/Editing Files/MessageUpdated.pdn | Bin 0 -> 47406 bytes
.../Assets/Icons/Editing Files/UserAdded.pdn | Bin 0 -> 63600 bytes
.../Assets/Icons/Editing Files/UserBanned.pdn | Bin 0 -> 65154 bytes
.../Assets/Icons/Editing Files/UserKicked.pdn | Bin 0 -> 66001 bytes
.../Icons/Editing Files/UserRemoved.pdn | Bin 0 -> 60027 bytes
.../Icons/Editing Files/UserUpdated.pdn | Bin 0 -> 68301 bytes
.../Assets/Icons/Editing Files/UserWarned.pdn | Bin 0 -> 62520 bytes
.../Editing Files/VoiceStateUserJoined.pdn | Bin 0 -> 54559 bytes
.../Editing Files/VoiceStateUserLeft.pdn | Bin 0 -> 54425 bytes
.../Editing Files/VoiceStateUserUpdated.pdn | Bin 0 -> 58401 bytes
.../Assets/Icons/Upload/BanRemoved.png | Bin 0 -> 34345 bytes
.../Assets/Icons/Upload/ChannelAdded.png | Bin 0 -> 22613 bytes
.../Assets/Icons/Upload/ChannelRemoved.png | Bin 0 -> 20886 bytes
.../Assets/Icons/Upload/ChannelUpdated.png | Bin 0 -> 25467 bytes
.../Assets/Icons/Upload/CheckMark Icon.png | Bin 0 -> 15534 bytes
.../Assets/Icons/Upload/Error Icon.png | Bin 0 -> 19511 bytes
.../Assets/Icons/Upload/GuildUpdated.png | Bin 0 -> 33372 bytes
.../Assets/Icons/Upload/InviteAdded.png | Bin 0 -> 35633 bytes
.../Assets/Icons/Upload/InviteRemoved.png | Bin 0 -> 33548 bytes
.../Assets/Icons/Upload/MessageRemoved.png | Bin 0 -> 16855 bytes
.../Assets/Icons/Upload/MessageUpdated.png | Bin 0 -> 21749 bytes
.../Assets/Icons/Upload/UserAdded.png | Bin 0 -> 29971 bytes
.../Assets/Icons/Upload/UserBanned.png | Bin 0 -> 30924 bytes
.../Assets/Icons/Upload/UserKicked.png | Bin 0 -> 31513 bytes
.../Assets/Icons/Upload/UserRemoved.png | Bin 0 -> 28138 bytes
.../Assets/Icons/Upload/UserUpdated.png | Bin 0 -> 32940 bytes
.../Assets/Icons/Upload/UserWarned.png | Bin 0 -> 29174 bytes
.../Icons/Upload/VoiceStateUserJoined.png | Bin 0 -> 24391 bytes
.../Icons/Upload/VoiceStateUserLeft.png | Bin 0 -> 24555 bytes
.../Icons/Upload/VoiceStateUserUpdated.png | Bin 0 -> 27003 bytes
ProjectMakoto/Assets/Icons/Upload/Warning.png | Bin 0 -> 13910 bytes
ProjectMakoto/Assets/Languages.json | 422 ++
ProjectMakoto/Assets/Original.png | Bin 0 -> 46781 bytes
ProjectMakoto/Assets/Pre.png | Bin 0 -> 436118 bytes
ProjectMakoto/Assets/PreSmall.png | Bin 0 -> 450541 bytes
ProjectMakoto/Assets/Prod.png | Bin 0 -> 491861 bytes
ProjectMakoto/Assets/ProdSmall.png | Bin 0 -> 513667 bytes
ProjectMakoto/Bot.cs | 558 ++
.../Commands/AutocompleteProviders.cs | 84 +
ProjectMakoto/Commands/BaseCommand.cs | 1714 ++++++
ProjectMakoto/Commands/Commands.cs | 199 +
.../Configuration/ActionLogCommand.cs | 200 +
.../Configuration/AutoCrosspostCommand.cs | 226 +
.../Configuration/AutoUnarchiveCommand.cs | 130 +
.../Configuration/BumpReminderCommand.cs | 230 +
.../Configuration/EmbedMessageCommand.cs | 82 +
.../Configuration/ExperienceCommand.cs | 83 +
.../Configuration/GuildLanguageCommand.cs | 114 +
.../Configuration/InVoicePrivacyCommand.cs | 106 +
.../Configuration/InviteNotesCommand.cs | 192 +
.../Configuration/InviteTrackerCommand.cs | 71 +
.../Commands/Configuration/JoinCommand.cs | 280 +
.../Configuration/LevelRewardsCommand.cs | 460 ++
.../Configuration/NameNormalizerCommand.cs | 125 +
.../Commands/Configuration/PhishingCommand.cs | 234 +
.../Commands/Configuration/PrefixCommand.cs | 103 +
.../ReactionRolesCommand/AddCommand.cs | 204 +
.../ReactionRolesCommand/ConfigCommand.cs | 372 ++
.../ReactionRolesCommandAbstractions.cs | 83 +
.../ReactionRolesCommand/RemoveAllCommand.cs | 86 +
.../ReactionRolesCommand/RemoveCommand.cs | 122 +
.../Configuration/TokenDetectionCommand.cs | 68 +
.../Configuration/VcCreatorCommand.cs | 98 +
ProjectMakoto/Commands/DebugCommands.cs | 480 ++
ProjectMakoto/Commands/DummyCommand.cs | 18 +
.../Maintainers/DevDebug/ThrowCommand.cs | 21 +
.../Maintainers/DevTools/BanGuildCommand.cs | 43 +
.../Maintainers/DevTools/BanUserCommand.cs | 49 +
.../DevTools/BatchLookupCommand.cs | 43 +
.../Maintainers/DevTools/BotnickCommand.cs | 37 +
.../DevTools/CommandManageCommand.cs | 142 +
.../DevTools/CreateIssueCommand.cs | 92 +
.../DevTools/Disenroll2FAUserCommand.cs | 33 +
.../DevTools/EnrollTwoFactorCommand.cs | 93 +
.../Maintainers/DevTools/EvaluationCommand.cs | 83 +
.../Maintainers/DevTools/GlobalBanCommand.cs | 183 +
.../DevTools/GlobalNotesCommand.cs | 121 +
.../DevTools/GlobalUnbanCommand.cs | 155 +
.../Maintainers/DevTools/InfoCommand.cs | 211 +
.../Maintainers/DevTools/LogCommand.cs | 29 +
.../DevTools/Quit2FASessionCommand.cs | 25 +
.../Maintainers/DevTools/RawGuildCommand.cs | 29 +
.../Maintainers/DevTools/StopCommand.cs | 35 +
.../Maintainers/DevTools/UnbanGuildCommand.cs | 32 +
.../Maintainers/DevTools/UnbanUserCommand.cs | 32 +
.../Commands/Moderation/BanCommand.cs | 58 +
.../Commands/Moderation/ClearBackupCommand.cs | 48 +
.../Commands/Moderation/CustomEmbedCommand.cs | 750 +++
.../Moderation/FollowUpdatesCommand.cs | 62 +
.../Commands/Moderation/GuildPurgeCommand.cs | 157 +
.../Commands/Moderation/KickCommand.cs | 65 +
.../Commands/Moderation/ManualBumpCommand.cs | 54 +
.../Commands/Moderation/MoveAllCommand.cs | 52 +
.../Commands/Moderation/MoveHereCommand.cs | 60 +
.../Commands/Moderation/PurgeCommand.cs | 156 +
.../Moderation/RemoveTimeoutCommand.cs | 57 +
.../Commands/Moderation/SoftBanCommand.cs | 59 +
.../Commands/Moderation/TimeoutCommand.cs | 98 +
.../Commands/Moderation/UnbanCommand.cs | 44 +
.../Commands/Utility/AvatarCommand.cs | 92 +
.../Commands/Utility/BannerCommand.cs | 37 +
.../Commands/Utility/CreditsCommand.cs | 48 +
.../Commands/Utility/Data/DeleteCommand.cs | 166 +
.../Commands/Utility/Data/InfoCommand.cs | 65 +
.../Commands/Utility/Data/RequestCommand.cs | 86 +
.../Commands/Utility/EmojiStealerCommand.cs | 530 ++
.../Commands/Utility/GuildInfoCommand.cs | 231 +
ProjectMakoto/Commands/Utility/HelpCommand.cs | 220 +
.../Commands/Utility/LanguageCommand.cs | 108 +
.../Commands/Utility/LeaderboardCommand.cs | 106 +
ProjectMakoto/Commands/Utility/RankCommand.cs | 49 +
.../Commands/Utility/RemindersCommand.cs | 217 +
.../Commands/Utility/ReportHostCommand.cs | 197 +
.../Utility/ReportTranslationCommand.cs | 155 +
.../Commands/Utility/UploadCommand.cs | 64 +
.../Utility/UrbanDictionaryCommand.cs | 133 +
.../Commands/Utility/UserInfoCommand.cs | 234 +
.../Commands/Utility/VcCreator/BanCommand.cs | 62 +
.../Utility/VcCreator/ChangeOwnerCommand.cs | 65 +
.../Utility/VcCreator/CloseCommand.cs | 39 +
.../Utility/VcCreator/InviteCommand.cs | 69 +
.../Commands/Utility/VcCreator/KickCommand.cs | 52 +
.../Utility/VcCreator/LimitCommand.cs | 46 +
.../Commands/Utility/VcCreator/NameCommand.cs | 54 +
.../Commands/Utility/VcCreator/OpenCommand.cs | 39 +
.../Utility/VcCreator/UnbanCommand.cs | 47 +
.../Database/DatabaseClient.TypeInfo.cs | 98 +
ProjectMakoto/Database/DatabaseClient.cs | 876 +++
ProjectMakoto/Entities/AbuseIpDbQuery.cs | 44 +
.../Attributes/ModulePriorityAttribute.cs | 16 +
.../PrefixCommandAlternativeAttribute.cs | 16 +
.../PreventCommandDeletionAttribute.cs | 16 +
ProjectMakoto/Entities/BanDetails.cs | 49 +
.../BaseEntities/RequiresBotReference.cs | 16 +
.../Entities/BaseEntities/RequiresParent.cs | 16 +
.../BaseEntities/RequiresTranslation.cs | 15 +
.../Commands/GuildInfo/Mee6Leaderboard.cs | 50 +
.../Entities/Commands/RequestData.cs | 18 +
.../Entities/Commands/Social/KawaiiRequest.cs | 15 +
.../Commands/Social/NekosLifeRequest.cs | 15 +
.../Entities/Commands/UrbanDictionary.cs | 42 +
ProjectMakoto/Entities/Commands/UserUpload.cs | 18 +
ProjectMakoto/Entities/Config.cs | 207 +
ProjectMakoto/Entities/CountryCodes.cs | 29 +
.../Attributes/ColumnNameAttribute.cs | 16 +
.../Attributes/ColumnTypeAttribute.cs | 16 +
.../Attributes/ContainsValuesAttribute.cs | 16 +
.../Database/Attributes/DefaultAttribute.cs | 16 +
.../Database/Attributes/MaxValueAttribute.cs | 16 +
.../Database/Attributes/NullableAttribute.cs | 16 +
.../Database/Attributes/PrimaryAttribute.cs | 16 +
.../Database/Attributes/TableNameAttribute.cs | 16 +
.../Database/DummyTables/DatabaseULongList.cs | 17 +
.../Database/Lists/DatabaseDictionary.cs | 209 +
.../Entities/Database/Lists/DatabaseList.cs | 113 +
.../Lists/SelfFillingDatabaseDictionary.cs | 64 +
ProjectMakoto/Entities/DatabaseMigration.cs | 21 +
ProjectMakoto/Entities/EmbedColors.cs | 25 +
ProjectMakoto/Entities/EmojiEntry.cs | 27 +
ProjectMakoto/Entities/GlobalNote.cs | 40 +
ProjectMakoto/Entities/Guild.cs | 128 +
.../Entities/Guilds/ActionLogSettings.cs | 129 +
.../Entities/Guilds/BumpReminderSettings.cs | 82 +
.../Guilds/Crosspost/CrosspostMessage.cs | 16 +
.../Guilds/Crosspost/CrosspostRatelimit.cs | 60 +
.../Entities/Guilds/CrosspostSettings.cs | 196 +
.../Entities/Guilds/EmbedMessageSettings.cs | 27 +
.../Entities/Guilds/ExperienceSettings.cs | 27 +
.../Guilds/InVoiceTextPrivacySettings.cs | 27 +
.../Entities/Guilds/InviteNotesDetails.cs | 60 +
.../Entities/Guilds/InviteNotesSettings.cs | 27 +
.../InviteTracker/InviteTrackerCacheItem.cs | 61 +
.../Entities/Guilds/InviteTrackerSettings.cs | 34 +
ProjectMakoto/Entities/Guilds/JoinSettings.cs | 69 +
.../Entities/Guilds/LevelRewardEntry.cs | 17 +
ProjectMakoto/Entities/Guilds/Member.cs | 141 +
.../Guilds/Members/ExperienceMember.cs | 36 +
.../Guilds/Members/InviteTrackerMember.cs | 29 +
.../Entities/Guilds/Members/MemberRole.cs | 16 +
.../Entities/Guilds/NameNormalizerSettings.cs | 22 +
.../Guilds/PhishingDetectionSettings.cs | 57 +
.../Entities/Guilds/PrefixSettings.cs | 26 +
.../Entities/Guilds/ReactionRoleEntry.cs | 28 +
.../Guilds/TokenLeakDetectionSettings.cs | 20 +
.../Guilds/VcCreator/VcCreatorDetails.cs | 74 +
.../Guilds/VcCreator/VcCreatorSettings.cs | 164 +
ProjectMakoto/Entities/InteractionResult.cs | 35 +
ProjectMakoto/Entities/LanguageCodes.cs | 28 +
.../BadRequestExceptionEnricher.cs | 42 +
.../LoggingEnrichers/ExceptionDataEnricher.cs | 31 +
ProjectMakoto/Entities/LogsSink.cs | 24 +
.../Entities/MakotoCommands/MakotoCommand.cs | 317 ++
.../MakotoCommands/MakotoCommandOverload.cs | 126 +
.../MakotoCommands/MakotoCommandType.cs | 16 +
.../Entities/MakotoCommands/MakotoModule.cs | 76 +
.../ChannelPromptConfiguration.cs | 23 +
.../MethodConfigs/RolePromptConfiguration.cs | 19 +
.../PhishingProtection/PhishingUrlEntry.cs | 42 +
.../PhishingProtection/SubmittedUrlEntry.cs | 45 +
ProjectMakoto/Entities/Plugins/BasePlugin.cs | 412 ++
.../Plugins/Database/PluginDatabaseTable.cs | 113 +
.../Plugins/EventArgs/PreLoginEventArgs.cs | 14 +
.../Plugins/EventArgs/SyncTaskEventArgs.cs | 14 +
.../Entities/Plugins/ManifestBuilder.cs | 95 +
.../Entities/Plugins/PluginLoggerClient.cs | 99 +
.../Entities/Plugins/PluginManifest.cs | 18 +
ProjectMakoto/Entities/Plugins/SemVer.cs | 85 +
.../Entities/Resources/AuditLogIcons.cs | 39 +
.../Entities/Resources/EmojiTemplates.cs | 49 +
.../Entities/Resources/MessageComponents.cs | 24 +
.../Entities/Resources/RegexTemplates.cs | 35 +
ProjectMakoto/Entities/Resources/Resources.cs | 36 +
.../Resources/StatusIndicatorIcons.cs | 18 +
.../Entities/ScheduledTaskIdentifier.cs | 16 +
.../Entities/ScoreSaber/Leaderboard.cs | 127 +
.../Entities/ScoreSaber/LeaderboardScores.cs | 176 +
.../Entities/ScoreSaber/PlayerInfo.cs | 35 +
.../Entities/ScoreSaber/PlayerScores.cs | 74 +
.../Entities/ScoreSaber/PlayerSearch.cs | 48 +
.../Entities/SharedCommandContext.cs | 398 ++
ProjectMakoto/Entities/Status.cs | 129 +
.../Entities/SystemMonitor/SystemInfo.cs | 46 +
ProjectMakoto/Entities/TaskInfo.cs | 37 +
.../Translation/CommandTranslation.cs | 31 +
.../Entities/Translation/EmbeddedLink.cs | 17 +
.../Entities/Translation/ITranslations.cs | 15 +
.../Translation/MultiTranslationKey.cs | 120 +
.../Translation/SingleTranslationKey.cs | 120 +
ProjectMakoto/Entities/Translation/TVar.cs | 12 +
.../Entities/Translation/Translations.cs | 1200 ++++
ProjectMakoto/Entities/User.cs | 103 +
ProjectMakoto/Entities/Users/Cooldown.cs | 121 +
ProjectMakoto/Entities/Users/DataSettings.cs | 33 +
.../Entities/Users/ExperienceUserSettings.cs | 20 +
.../Entities/Users/Reminders/ReminderItem.cs | 34 +
.../Users/Reminders/ReminderSettings.cs | 87 +
.../Users/Reminders/ReminderSnoozeButton.cs | 19 +
.../Users/TranslationReportSettings.cs | 33 +
.../Entities/Users/UrlSubmissionSettings.cs | 27 +
.../Users/UserPlaylist/PlaylistEntry.cs | 26 +
.../Users/UserPlaylist/UserPlaylist.cs | 59 +
ProjectMakoto/Entities/WebRequestItem.cs | 22 +
ProjectMakoto/Enums/ColumnTypes.cs | 21 +
ProjectMakoto/Enums/CommandType.cs | 19 +
ProjectMakoto/Enums/DatabaseRequestType.cs | 16 +
ProjectMakoto/Enums/DevCommands.cs | 33 +
ProjectMakoto/Enums/EmojiType.cs | 16 +
ProjectMakoto/Enums/ExitCodes.cs | 22 +
ProjectMakoto/Enums/FollowChannel.cs | 17 +
ProjectMakoto/Enums/PhishingPunishmentType.cs | 19 +
ProjectMakoto/Enums/PrivateButtonType.cs | 15 +
ProjectMakoto/Enums/PunishmentActions.cs | 18 +
ProjectMakoto/Enums/QueuePriority.cs | 18 +
.../Enums/ReportTranslationReason.cs | 17 +
ProjectMakoto/Enums/ReportTranslationType.cs | 16 +
ProjectMakoto/Enums/ScoreSaber/Difficulty.cs | 19 +
ProjectMakoto/Enums/ScoreSaber/ScoreType.cs | 16 +
ProjectMakoto/Events/.DiscordEventHandler.cs | 409 ++
ProjectMakoto/Events/ActionlogEvents.cs | 1140 ++++
ProjectMakoto/Events/AutoUnarchiveEvents.cs | 23 +
ProjectMakoto/Events/BumpReminderEvents.cs | 144 +
ProjectMakoto/Events/CommandEvents.cs | 84 +
ProjectMakoto/Events/CrosspostEvents.cs | 57 +
ProjectMakoto/Events/DiscordEvents.cs | 64 +
ProjectMakoto/Events/EmbedMessagesEvents.cs | 175 +
ProjectMakoto/Events/ExperienceEvents.cs | 38 +
ProjectMakoto/Events/GenericGuildEvents.cs | 99 +
ProjectMakoto/Events/InviteNoteEvents.cs | 20 +
ProjectMakoto/Events/InviteTrackerEvents.cs | 92 +
ProjectMakoto/Events/JoinEvents.cs | 85 +
ProjectMakoto/Events/NameNormalizerEvents.cs | 66 +
.../Events/PhishingProtectionEvents.cs | 262 +
.../Events/PhishingSubmissionEvents.cs | 92 +
ProjectMakoto/Events/ReactionRoleEvents.cs | 48 +
ProjectMakoto/Events/ReminderEvents.cs | 39 +
ProjectMakoto/Events/TokenLeakEvents.cs | 110 +
ProjectMakoto/Events/VcCreatorEvents.cs | 69 +
ProjectMakoto/Events/VoicePrivacyEvents.cs | 208 +
.../Exceptions/AlreadyAppliedException.cs | 14 +
ProjectMakoto/Exceptions/CancelException.cs | 13 +
.../Exceptions/ForbiddenException.cs | 13 +
.../InternalServerErrorException.cs | 13 +
.../Exceptions/InvalidCallException.cs | 32 +
ProjectMakoto/Exceptions/NotFoundException.cs | 13 +
ProjectMakoto/Exceptions/TimedOutException.cs | 13 +
.../UnprocessableEntityException.cs | 5 +
ProjectMakoto/Global.cs | 69 +
ProjectMakoto/GlobalSuppressions.cs | 25 +
ProjectMakoto/Main.png | Bin 0 -> 145458 bytes
ProjectMakoto/Program.cs | 19 +
ProjectMakoto/ProjectMakoto.csproj | 145 +
ProjectMakoto/ProjectMakoto.sln | 297 +
.../Properties/Resources.Designer.cs | 63 +
ProjectMakoto/Properties/Resources.resx | 101 +
ProjectMakoto/RunTranslationGenerator.sh | 4 +
.../Snippets/Project Makoto Command.zip | Bin 0 -> 89791 bytes
ProjectMakoto/Snippets/asynctask.snippet | 19 +
ProjectMakoto/Snippets/braces.snippet | 18 +
.../Snippets/channelselection.snippet | 39 +
ProjectMakoto/Snippets/modal.snippet | 31 +
ProjectMakoto/Snippets/roleselection.snippet | 38 +
ProjectMakoto/Snippets/selection.snippet | 31 +
ProjectMakoto/Snippets/task.snippet | 19 +
ProjectMakoto/Snippets/taskwithadd.snippet | 19 +
ProjectMakoto/Translations/strings.json | 5066 +++++++++++++++++
ProjectMakoto/Util/BumpReminderHandler.cs | 119 +
ProjectMakoto/Util/Clients/AbuseIpDbClient.cs | 171 +
ProjectMakoto/Util/Clients/ChartGeneration.cs | 74 +
.../Util/Clients/GoogleTranslateClient.cs | 139 +
.../Util/Clients/OfficialPluginRepository.cs | 164 +
.../Clients/SystemMonitor/MonitorClient.cs | 287 +
.../Util/Clients/SystemMonitor/RamUsage.cs | 88 +
.../Clients/ThreadJoiner/ThreadJoinClient.cs | 70 +
.../ThreadJoiner/ThreadJoinExtensions.cs | 16 +
.../Clients/TokenInvalidatorRepository.cs | 156 +
.../CustomArgumentConverter.cs | 41 +
ProjectMakoto/Util/ExperienceHandler.cs | 240 +
.../Util/Extensions/DiscordExtensions.cs | 824 +++
.../Util/Extensions/GenericExtensions.cs | 377 ++
.../Util/Extensions/InteractionExtensions.cs | 25 +
.../Extensions/PreMadeEmbedsExtensions.cs | 166 +
.../Util/Extensions/TranslationUtil.cs | 179 +
.../Util/Extensions/UserExtensions.cs | 41 +
.../Util/Initializers/CommandCompiler.cs | 518 ++
.../Util/Initializers/ConfigLoader.cs | 95 +
.../Util/Initializers/DependencyLoader.cs | 27 +
.../DisCatSharpExtensionsLoader.cs | 330 ++
ProjectMakoto/Util/Initializers/ListLoader.cs | 54 +
.../Util/Initializers/PluginLoader.cs | 269 +
.../Util/Initializers/PostLoginTaskLoader.cs | 68 +
ProjectMakoto/Util/Initializers/SyncTasks.cs | 259 +
.../Util/Initializers/TranslationLoader.cs | 103 +
.../ReminderSnoozeMinifiedSerializer.cs | 39 +
ProjectMakoto/Util/PhishingUrlHandler.cs | 152 +
ProjectMakoto/Util/PrefixCommandUtil.cs | 18 +
ProjectMakoto/Util/TaskWatcher/TaskWatcher.cs | 329 ++
.../Util/TaskWatcher/TaskWatcherExtensions.cs | 56 +
README.md | 68 +
ResetDevToPreview.sh | 19 +
ResetPreviewToMain.sh | 19 +
SecretsIgnore.txt | 4 +
SetupGit.sh | 2 +
TRANSLATING.md | 118 +
TestRun.sh | 1 +
Tools | 1 +
UpdateSubmodules.sh | 5 +
_typos.toml | 6 +
event.json | 3 +
hooks/commit-msg | 34 +
renovate.json | 20 +
447 files changed, 41522 insertions(+)
create mode 100644 .gitattributes
create mode 100644 .gitconfig
create mode 100644 .github/CODE_OF_CONDUCT.md
create mode 100644 .github/workflows/dev.yml
create mode 100644 .github/workflows/main.yml
create mode 100644 .github/workflows/preview.yml
create mode 100644 .gitignore
create mode 100644 .gitmodules
create mode 100644 .vscode/Snippets.code-snippets
create mode 100644 .vscode/extensions.json
create mode 100644 .vscode/settings.json
create mode 100644 .vscode/tasks.json
create mode 100644 CONTRIBUTING.md
create mode 100644 DeleteDrafts.sh
create mode 100644 DeleteOldTags.sh
create mode 160000 Dependencies/DisCatSharp
create mode 160000 Dependencies/Xorog.UniversalExtensions
create mode 160000 Dependencies/quickchart-csharp
create mode 100644 DocAssets/DownloadProject1.png
create mode 100644 DocAssets/DownloadRelease1.png
create mode 100644 DocAssets/ExamplePluginInfo1.png
create mode 100644 InitSubmodules.sh
create mode 100644 LICENSE
create mode 160000 OfficialPlugins/Example
create mode 160000 OfficialPlugins/Music
create mode 160000 OfficialPlugins/ScoreSaber
create mode 160000 OfficialPlugins/Social
create mode 160000 OfficialPlugins/Translations
create mode 100644 OfficialPlugins/build_all.cmd
create mode 100644 OfficialPlugins/build_all.sh
create mode 100644 OfficialPlugins/move_all.cmd
create mode 100644 OfficialPlugins/move_all.sh
create mode 100644 OfficialPlugins/update_deps.cmd
create mode 100644 OfficialPlugins/update_deps.sh
create mode 100644 PLUGINS.md
create mode 100644 ProjectMakoto/.editorconfig
create mode 100644 ProjectMakoto/Assets/1.png
create mode 100644 ProjectMakoto/Assets/ASCII.txt
create mode 100644 ProjectMakoto/Assets/AddToServer.pdn
create mode 100644 ProjectMakoto/Assets/AddToServer.png
create mode 100644 ProjectMakoto/Assets/Countries.json
create mode 100644 ProjectMakoto/Assets/Dev.pdn
create mode 100644 ProjectMakoto/Assets/Dev.png
create mode 100644 ProjectMakoto/Assets/DevSmall.png
create mode 100644 ProjectMakoto/Assets/DiscordMessages.html
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/Channel.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/CheckboxTickedBlue.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/CheckboxUntickedBlue.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/Guild.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/Invite.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/Message.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/MessageCommand.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/PillOff.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/PillOn.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/PrefixCommandDisabled.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/PrefixCommandEnabled.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/SlashCommand.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/User.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/UserCommand.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Editing Files/VoiceStateUser.pdn
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Channel.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/CheckboxTicked.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/CheckboxUnticked.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/DisabledPause.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/DisabledPlay.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/DisabledRepeat.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/DisabledShuffle.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Dot.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Error.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Guild.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/In.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Invite.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Loading.gif
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Message.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/MessageCommand.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Paused.gif
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/PillOff.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/PillOn.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/PrefixCommandDisabled.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/PrefixCommandEnabled.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/QuestionMark.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/SlashCommand.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Soundcloud.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/Spotify.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/User.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/UserCommand.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/VoiceState.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/YouTube.png
create mode 100644 ProjectMakoto/Assets/Emojis/Upload/abuseipdb.png
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/BanRemoved.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/ChannelAdded.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/ChannelRemoved.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/ChannelUpdated.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/GuildUpdated.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/InviteAdded.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/InviteRemoved.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/MessageRemoved.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/MessageUpdated.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/UserAdded.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/UserBanned.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/UserKicked.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/UserRemoved.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/UserUpdated.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/UserWarned.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/VoiceStateUserJoined.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/VoiceStateUserLeft.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Editing Files/VoiceStateUserUpdated.pdn
create mode 100644 ProjectMakoto/Assets/Icons/Upload/BanRemoved.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/ChannelAdded.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/ChannelRemoved.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/ChannelUpdated.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/CheckMark Icon.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/Error Icon.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/GuildUpdated.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/InviteAdded.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/InviteRemoved.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/MessageRemoved.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/MessageUpdated.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/UserAdded.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/UserBanned.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/UserKicked.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/UserRemoved.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/UserUpdated.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/UserWarned.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/VoiceStateUserJoined.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/VoiceStateUserLeft.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/VoiceStateUserUpdated.png
create mode 100644 ProjectMakoto/Assets/Icons/Upload/Warning.png
create mode 100644 ProjectMakoto/Assets/Languages.json
create mode 100644 ProjectMakoto/Assets/Original.png
create mode 100644 ProjectMakoto/Assets/Pre.png
create mode 100644 ProjectMakoto/Assets/PreSmall.png
create mode 100644 ProjectMakoto/Assets/Prod.png
create mode 100644 ProjectMakoto/Assets/ProdSmall.png
create mode 100644 ProjectMakoto/Bot.cs
create mode 100644 ProjectMakoto/Commands/AutocompleteProviders.cs
create mode 100644 ProjectMakoto/Commands/BaseCommand.cs
create mode 100644 ProjectMakoto/Commands/Commands.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ActionLogCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/AutoCrosspostCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/AutoUnarchiveCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/BumpReminderCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/EmbedMessageCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ExperienceCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/GuildLanguageCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/InVoicePrivacyCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/InviteNotesCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/InviteTrackerCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/JoinCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/LevelRewardsCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/NameNormalizerCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/PhishingCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/PrefixCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ReactionRolesCommand/AddCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ReactionRolesCommand/ConfigCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ReactionRolesCommand/ReactionRolesCommandAbstractions.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ReactionRolesCommand/RemoveAllCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/ReactionRolesCommand/RemoveCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/TokenDetectionCommand.cs
create mode 100644 ProjectMakoto/Commands/Configuration/VcCreatorCommand.cs
create mode 100644 ProjectMakoto/Commands/DebugCommands.cs
create mode 100644 ProjectMakoto/Commands/DummyCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevDebug/ThrowCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/BanGuildCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/BanUserCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/BatchLookupCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/BotnickCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/CommandManageCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/CreateIssueCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/Disenroll2FAUserCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/EnrollTwoFactorCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/EvaluationCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/GlobalBanCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/GlobalNotesCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/GlobalUnbanCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/InfoCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/LogCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/Quit2FASessionCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/RawGuildCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/StopCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/UnbanGuildCommand.cs
create mode 100644 ProjectMakoto/Commands/Maintainers/DevTools/UnbanUserCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/BanCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/ClearBackupCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/CustomEmbedCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/FollowUpdatesCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/GuildPurgeCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/KickCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/ManualBumpCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/MoveAllCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/MoveHereCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/PurgeCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/RemoveTimeoutCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/SoftBanCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/TimeoutCommand.cs
create mode 100644 ProjectMakoto/Commands/Moderation/UnbanCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/AvatarCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/BannerCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/CreditsCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/Data/DeleteCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/Data/InfoCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/Data/RequestCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/EmojiStealerCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/GuildInfoCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/HelpCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/LanguageCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/LeaderboardCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/RankCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/RemindersCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/ReportHostCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/ReportTranslationCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/UploadCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/UrbanDictionaryCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/UserInfoCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/BanCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/ChangeOwnerCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/CloseCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/InviteCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/KickCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/LimitCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/NameCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/OpenCommand.cs
create mode 100644 ProjectMakoto/Commands/Utility/VcCreator/UnbanCommand.cs
create mode 100644 ProjectMakoto/Database/DatabaseClient.TypeInfo.cs
create mode 100644 ProjectMakoto/Database/DatabaseClient.cs
create mode 100644 ProjectMakoto/Entities/AbuseIpDbQuery.cs
create mode 100644 ProjectMakoto/Entities/Attributes/ModulePriorityAttribute.cs
create mode 100644 ProjectMakoto/Entities/Attributes/PrefixCommandAlternativeAttribute.cs
create mode 100644 ProjectMakoto/Entities/Attributes/PreventCommandDeletionAttribute.cs
create mode 100644 ProjectMakoto/Entities/BanDetails.cs
create mode 100644 ProjectMakoto/Entities/BaseEntities/RequiresBotReference.cs
create mode 100644 ProjectMakoto/Entities/BaseEntities/RequiresParent.cs
create mode 100644 ProjectMakoto/Entities/BaseEntities/RequiresTranslation.cs
create mode 100644 ProjectMakoto/Entities/Commands/GuildInfo/Mee6Leaderboard.cs
create mode 100644 ProjectMakoto/Entities/Commands/RequestData.cs
create mode 100644 ProjectMakoto/Entities/Commands/Social/KawaiiRequest.cs
create mode 100644 ProjectMakoto/Entities/Commands/Social/NekosLifeRequest.cs
create mode 100644 ProjectMakoto/Entities/Commands/UrbanDictionary.cs
create mode 100644 ProjectMakoto/Entities/Commands/UserUpload.cs
create mode 100644 ProjectMakoto/Entities/Config.cs
create mode 100644 ProjectMakoto/Entities/CountryCodes.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/ColumnNameAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/ColumnTypeAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/ContainsValuesAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/DefaultAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/MaxValueAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/NullableAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/PrimaryAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/Attributes/TableNameAttribute.cs
create mode 100644 ProjectMakoto/Entities/Database/DummyTables/DatabaseULongList.cs
create mode 100644 ProjectMakoto/Entities/Database/Lists/DatabaseDictionary.cs
create mode 100644 ProjectMakoto/Entities/Database/Lists/DatabaseList.cs
create mode 100644 ProjectMakoto/Entities/Database/Lists/SelfFillingDatabaseDictionary.cs
create mode 100644 ProjectMakoto/Entities/DatabaseMigration.cs
create mode 100644 ProjectMakoto/Entities/EmbedColors.cs
create mode 100644 ProjectMakoto/Entities/EmojiEntry.cs
create mode 100644 ProjectMakoto/Entities/GlobalNote.cs
create mode 100644 ProjectMakoto/Entities/Guild.cs
create mode 100644 ProjectMakoto/Entities/Guilds/ActionLogSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/BumpReminderSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/Crosspost/CrosspostMessage.cs
create mode 100644 ProjectMakoto/Entities/Guilds/Crosspost/CrosspostRatelimit.cs
create mode 100644 ProjectMakoto/Entities/Guilds/CrosspostSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/EmbedMessageSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/ExperienceSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/InVoiceTextPrivacySettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/InviteNotesDetails.cs
create mode 100644 ProjectMakoto/Entities/Guilds/InviteNotesSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/InviteTracker/InviteTrackerCacheItem.cs
create mode 100644 ProjectMakoto/Entities/Guilds/InviteTrackerSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/JoinSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/LevelRewardEntry.cs
create mode 100644 ProjectMakoto/Entities/Guilds/Member.cs
create mode 100644 ProjectMakoto/Entities/Guilds/Members/ExperienceMember.cs
create mode 100644 ProjectMakoto/Entities/Guilds/Members/InviteTrackerMember.cs
create mode 100644 ProjectMakoto/Entities/Guilds/Members/MemberRole.cs
create mode 100644 ProjectMakoto/Entities/Guilds/NameNormalizerSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/PhishingDetectionSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/PrefixSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/ReactionRoleEntry.cs
create mode 100644 ProjectMakoto/Entities/Guilds/TokenLeakDetectionSettings.cs
create mode 100644 ProjectMakoto/Entities/Guilds/VcCreator/VcCreatorDetails.cs
create mode 100644 ProjectMakoto/Entities/Guilds/VcCreator/VcCreatorSettings.cs
create mode 100644 ProjectMakoto/Entities/InteractionResult.cs
create mode 100644 ProjectMakoto/Entities/LanguageCodes.cs
create mode 100644 ProjectMakoto/Entities/LoggingEnrichers/BadRequestExceptionEnricher.cs
create mode 100644 ProjectMakoto/Entities/LoggingEnrichers/ExceptionDataEnricher.cs
create mode 100644 ProjectMakoto/Entities/LogsSink.cs
create mode 100644 ProjectMakoto/Entities/MakotoCommands/MakotoCommand.cs
create mode 100644 ProjectMakoto/Entities/MakotoCommands/MakotoCommandOverload.cs
create mode 100644 ProjectMakoto/Entities/MakotoCommands/MakotoCommandType.cs
create mode 100644 ProjectMakoto/Entities/MakotoCommands/MakotoModule.cs
create mode 100644 ProjectMakoto/Entities/MethodConfigs/ChannelPromptConfiguration.cs
create mode 100644 ProjectMakoto/Entities/MethodConfigs/RolePromptConfiguration.cs
create mode 100644 ProjectMakoto/Entities/PhishingProtection/PhishingUrlEntry.cs
create mode 100644 ProjectMakoto/Entities/PhishingProtection/SubmittedUrlEntry.cs
create mode 100644 ProjectMakoto/Entities/Plugins/BasePlugin.cs
create mode 100644 ProjectMakoto/Entities/Plugins/Database/PluginDatabaseTable.cs
create mode 100644 ProjectMakoto/Entities/Plugins/EventArgs/PreLoginEventArgs.cs
create mode 100644 ProjectMakoto/Entities/Plugins/EventArgs/SyncTaskEventArgs.cs
create mode 100644 ProjectMakoto/Entities/Plugins/ManifestBuilder.cs
create mode 100644 ProjectMakoto/Entities/Plugins/PluginLoggerClient.cs
create mode 100644 ProjectMakoto/Entities/Plugins/PluginManifest.cs
create mode 100644 ProjectMakoto/Entities/Plugins/SemVer.cs
create mode 100644 ProjectMakoto/Entities/Resources/AuditLogIcons.cs
create mode 100644 ProjectMakoto/Entities/Resources/EmojiTemplates.cs
create mode 100644 ProjectMakoto/Entities/Resources/MessageComponents.cs
create mode 100644 ProjectMakoto/Entities/Resources/RegexTemplates.cs
create mode 100644 ProjectMakoto/Entities/Resources/Resources.cs
create mode 100644 ProjectMakoto/Entities/Resources/StatusIndicatorIcons.cs
create mode 100644 ProjectMakoto/Entities/ScheduledTaskIdentifier.cs
create mode 100644 ProjectMakoto/Entities/ScoreSaber/Leaderboard.cs
create mode 100644 ProjectMakoto/Entities/ScoreSaber/LeaderboardScores.cs
create mode 100644 ProjectMakoto/Entities/ScoreSaber/PlayerInfo.cs
create mode 100644 ProjectMakoto/Entities/ScoreSaber/PlayerScores.cs
create mode 100644 ProjectMakoto/Entities/ScoreSaber/PlayerSearch.cs
create mode 100644 ProjectMakoto/Entities/SharedCommandContext.cs
create mode 100644 ProjectMakoto/Entities/Status.cs
create mode 100644 ProjectMakoto/Entities/SystemMonitor/SystemInfo.cs
create mode 100644 ProjectMakoto/Entities/TaskInfo.cs
create mode 100644 ProjectMakoto/Entities/Translation/CommandTranslation.cs
create mode 100644 ProjectMakoto/Entities/Translation/EmbeddedLink.cs
create mode 100644 ProjectMakoto/Entities/Translation/ITranslations.cs
create mode 100644 ProjectMakoto/Entities/Translation/MultiTranslationKey.cs
create mode 100644 ProjectMakoto/Entities/Translation/SingleTranslationKey.cs
create mode 100644 ProjectMakoto/Entities/Translation/TVar.cs
create mode 100644 ProjectMakoto/Entities/Translation/Translations.cs
create mode 100644 ProjectMakoto/Entities/User.cs
create mode 100644 ProjectMakoto/Entities/Users/Cooldown.cs
create mode 100644 ProjectMakoto/Entities/Users/DataSettings.cs
create mode 100644 ProjectMakoto/Entities/Users/ExperienceUserSettings.cs
create mode 100644 ProjectMakoto/Entities/Users/Reminders/ReminderItem.cs
create mode 100644 ProjectMakoto/Entities/Users/Reminders/ReminderSettings.cs
create mode 100644 ProjectMakoto/Entities/Users/Reminders/ReminderSnoozeButton.cs
create mode 100644 ProjectMakoto/Entities/Users/TranslationReportSettings.cs
create mode 100644 ProjectMakoto/Entities/Users/UrlSubmissionSettings.cs
create mode 100644 ProjectMakoto/Entities/Users/UserPlaylist/PlaylistEntry.cs
create mode 100644 ProjectMakoto/Entities/Users/UserPlaylist/UserPlaylist.cs
create mode 100644 ProjectMakoto/Entities/WebRequestItem.cs
create mode 100644 ProjectMakoto/Enums/ColumnTypes.cs
create mode 100644 ProjectMakoto/Enums/CommandType.cs
create mode 100644 ProjectMakoto/Enums/DatabaseRequestType.cs
create mode 100644 ProjectMakoto/Enums/DevCommands.cs
create mode 100644 ProjectMakoto/Enums/EmojiType.cs
create mode 100644 ProjectMakoto/Enums/ExitCodes.cs
create mode 100644 ProjectMakoto/Enums/FollowChannel.cs
create mode 100644 ProjectMakoto/Enums/PhishingPunishmentType.cs
create mode 100644 ProjectMakoto/Enums/PrivateButtonType.cs
create mode 100644 ProjectMakoto/Enums/PunishmentActions.cs
create mode 100644 ProjectMakoto/Enums/QueuePriority.cs
create mode 100644 ProjectMakoto/Enums/ReportTranslationReason.cs
create mode 100644 ProjectMakoto/Enums/ReportTranslationType.cs
create mode 100644 ProjectMakoto/Enums/ScoreSaber/Difficulty.cs
create mode 100644 ProjectMakoto/Enums/ScoreSaber/ScoreType.cs
create mode 100644 ProjectMakoto/Events/.DiscordEventHandler.cs
create mode 100644 ProjectMakoto/Events/ActionlogEvents.cs
create mode 100644 ProjectMakoto/Events/AutoUnarchiveEvents.cs
create mode 100644 ProjectMakoto/Events/BumpReminderEvents.cs
create mode 100644 ProjectMakoto/Events/CommandEvents.cs
create mode 100644 ProjectMakoto/Events/CrosspostEvents.cs
create mode 100644 ProjectMakoto/Events/DiscordEvents.cs
create mode 100644 ProjectMakoto/Events/EmbedMessagesEvents.cs
create mode 100644 ProjectMakoto/Events/ExperienceEvents.cs
create mode 100644 ProjectMakoto/Events/GenericGuildEvents.cs
create mode 100644 ProjectMakoto/Events/InviteNoteEvents.cs
create mode 100644 ProjectMakoto/Events/InviteTrackerEvents.cs
create mode 100644 ProjectMakoto/Events/JoinEvents.cs
create mode 100644 ProjectMakoto/Events/NameNormalizerEvents.cs
create mode 100644 ProjectMakoto/Events/PhishingProtectionEvents.cs
create mode 100644 ProjectMakoto/Events/PhishingSubmissionEvents.cs
create mode 100644 ProjectMakoto/Events/ReactionRoleEvents.cs
create mode 100644 ProjectMakoto/Events/ReminderEvents.cs
create mode 100644 ProjectMakoto/Events/TokenLeakEvents.cs
create mode 100644 ProjectMakoto/Events/VcCreatorEvents.cs
create mode 100644 ProjectMakoto/Events/VoicePrivacyEvents.cs
create mode 100644 ProjectMakoto/Exceptions/AlreadyAppliedException.cs
create mode 100644 ProjectMakoto/Exceptions/CancelException.cs
create mode 100644 ProjectMakoto/Exceptions/ForbiddenException.cs
create mode 100644 ProjectMakoto/Exceptions/InternalServerErrorException.cs
create mode 100644 ProjectMakoto/Exceptions/InvalidCallException.cs
create mode 100644 ProjectMakoto/Exceptions/NotFoundException.cs
create mode 100644 ProjectMakoto/Exceptions/TimedOutException.cs
create mode 100644 ProjectMakoto/Exceptions/UnprocessableEntityException.cs
create mode 100644 ProjectMakoto/Global.cs
create mode 100644 ProjectMakoto/GlobalSuppressions.cs
create mode 100644 ProjectMakoto/Main.png
create mode 100644 ProjectMakoto/Program.cs
create mode 100644 ProjectMakoto/ProjectMakoto.csproj
create mode 100644 ProjectMakoto/ProjectMakoto.sln
create mode 100644 ProjectMakoto/Properties/Resources.Designer.cs
create mode 100644 ProjectMakoto/Properties/Resources.resx
create mode 100644 ProjectMakoto/RunTranslationGenerator.sh
create mode 100644 ProjectMakoto/Snippets/Project Makoto Command.zip
create mode 100644 ProjectMakoto/Snippets/asynctask.snippet
create mode 100644 ProjectMakoto/Snippets/braces.snippet
create mode 100644 ProjectMakoto/Snippets/channelselection.snippet
create mode 100644 ProjectMakoto/Snippets/modal.snippet
create mode 100644 ProjectMakoto/Snippets/roleselection.snippet
create mode 100644 ProjectMakoto/Snippets/selection.snippet
create mode 100644 ProjectMakoto/Snippets/task.snippet
create mode 100644 ProjectMakoto/Snippets/taskwithadd.snippet
create mode 100644 ProjectMakoto/Translations/strings.json
create mode 100644 ProjectMakoto/Util/BumpReminderHandler.cs
create mode 100644 ProjectMakoto/Util/Clients/AbuseIpDbClient.cs
create mode 100644 ProjectMakoto/Util/Clients/ChartGeneration.cs
create mode 100644 ProjectMakoto/Util/Clients/GoogleTranslateClient.cs
create mode 100644 ProjectMakoto/Util/Clients/OfficialPluginRepository.cs
create mode 100644 ProjectMakoto/Util/Clients/SystemMonitor/MonitorClient.cs
create mode 100644 ProjectMakoto/Util/Clients/SystemMonitor/RamUsage.cs
create mode 100644 ProjectMakoto/Util/Clients/ThreadJoiner/ThreadJoinClient.cs
create mode 100644 ProjectMakoto/Util/Clients/ThreadJoiner/ThreadJoinExtensions.cs
create mode 100644 ProjectMakoto/Util/Clients/TokenInvalidatorRepository.cs
create mode 100644 ProjectMakoto/Util/CommandConverters/CustomArgumentConverter.cs
create mode 100644 ProjectMakoto/Util/ExperienceHandler.cs
create mode 100644 ProjectMakoto/Util/Extensions/DiscordExtensions.cs
create mode 100644 ProjectMakoto/Util/Extensions/GenericExtensions.cs
create mode 100644 ProjectMakoto/Util/Extensions/InteractionExtensions.cs
create mode 100644 ProjectMakoto/Util/Extensions/PreMadeEmbedsExtensions.cs
create mode 100644 ProjectMakoto/Util/Extensions/TranslationUtil.cs
create mode 100644 ProjectMakoto/Util/Extensions/UserExtensions.cs
create mode 100644 ProjectMakoto/Util/Initializers/CommandCompiler.cs
create mode 100644 ProjectMakoto/Util/Initializers/ConfigLoader.cs
create mode 100644 ProjectMakoto/Util/Initializers/DependencyLoader.cs
create mode 100644 ProjectMakoto/Util/Initializers/DisCatSharpExtensionsLoader.cs
create mode 100644 ProjectMakoto/Util/Initializers/ListLoader.cs
create mode 100644 ProjectMakoto/Util/Initializers/PluginLoader.cs
create mode 100644 ProjectMakoto/Util/Initializers/PostLoginTaskLoader.cs
create mode 100644 ProjectMakoto/Util/Initializers/SyncTasks.cs
create mode 100644 ProjectMakoto/Util/Initializers/TranslationLoader.cs
create mode 100644 ProjectMakoto/Util/JsonSerializers/ReminderSnoozeMinifiedSerializer.cs
create mode 100644 ProjectMakoto/Util/PhishingUrlHandler.cs
create mode 100644 ProjectMakoto/Util/PrefixCommandUtil.cs
create mode 100644 ProjectMakoto/Util/TaskWatcher/TaskWatcher.cs
create mode 100644 ProjectMakoto/Util/TaskWatcher/TaskWatcherExtensions.cs
create mode 100644 README.md
create mode 100644 ResetDevToPreview.sh
create mode 100644 ResetPreviewToMain.sh
create mode 100644 SecretsIgnore.txt
create mode 100644 SetupGit.sh
create mode 100644 TRANSLATING.md
create mode 100644 TestRun.sh
create mode 160000 Tools
create mode 100644 UpdateSubmodules.sh
create mode 100644 _typos.toml
create mode 100644 event.json
create mode 100644 hooks/commit-msg
create mode 100644 renovate.json
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..dfe07704
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/.gitconfig b/.gitconfig
new file mode 100644
index 00000000..a5440100
--- /dev/null
+++ b/.gitconfig
@@ -0,0 +1,2 @@
+[core]
+ hooksPath = hooks
diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..4e2473b8
--- /dev/null
+++ b/.github/CODE_OF_CONDUCT.md
@@ -0,0 +1,134 @@
+
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement at
+[INSERT CONTACT METHOD].
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
+
+Community Impact Guidelines were inspired by
+[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
+
+For answers to common questions about this code of conduct, see the FAQ at
+[https://www.contributor-covenant.org/faq][FAQ]. Translations are available
+at [https://www.contributor-covenant.org/translations][translations].
+
+[homepage]: https://www.contributor-covenant.org
+[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
+[Mozilla CoC]: https://github.com/mozilla/diversity
+[FAQ]: https://www.contributor-covenant.org/faq
+[translations]: https://www.contributor-covenant.org/translations
+
diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml
new file mode 100644
index 00000000..68beb209
--- /dev/null
+++ b/.github/workflows/dev.yml
@@ -0,0 +1,71 @@
+name: Test Dev Branch
+on:
+ push:
+ branches: [ "dev" ]
+ workflow_dispatch:
+jobs:
+ secretscan:
+ name: Scan for Secrets
+ runs-on: self-hosted
+ steps:
+ - name: Clone Repository
+ uses: actions/checkout@v4
+ with:
+ ref: dev
+
+ - name: Secret Scan
+ uses: max/secret-scan@master
+ with:
+ exclude_path: 'SecretsIgnore.txt'
+ spellcheck:
+ name: Clone Repository
+ runs-on: self-hosted
+ steps:
+ - name: Checkout Actions Repository
+ uses: actions/checkout@v4
+ with:
+ ref: dev
+
+ - name: Check spelling
+ uses: crate-ci/typos@master
+ testbuild:
+ name: Build Project
+ runs-on: self-hosted
+ steps:
+ - name: Cleanup before build
+ run: rm -rf ProjectMakotoTest/
+
+ - name: Setup .NET Core SDK
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: |
+ 9.x
+
+ - name: "Clone Repository"
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ path: ProjectMakotoTest
+ token: ${{ secrets.Access_token }}
+ ref: dev
+
+ - name: Install dependencies
+ run: dotnet restore
+ working-directory: ProjectMakotoTest/ProjectMakoto/
+
+ - name: Mark .sh files as executable
+ run: find . -type f -name "*.sh" -exec chmod +x {} +
+ working-directory: ProjectMakotoTest/OfficialPlugins/
+
+ - name: Prepare Makoto Plugin Build
+ run: sh update_deps.sh
+ working-directory: ProjectMakotoTest/OfficialPlugins/
+
+ - name: Test Build Makoto
+ run: dotnet publish --configuration RELEASE --runtime linux-x64 --no-self-contained --framework net9.0
+ working-directory: ProjectMakotoTest/ProjectMakoto/
+ timeout-minutes: 5
+
+ - name: Test Build Makoto Plugins
+ run: sh build_all.sh 1
+ working-directory: ProjectMakotoTest/OfficialPlugins/
\ No newline at end of file
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
new file mode 100644
index 00000000..99f8f981
--- /dev/null
+++ b/.github/workflows/main.yml
@@ -0,0 +1,119 @@
+name: Deploy to Production Server
+on:
+ push:
+ branches: [ main ]
+ workflow_dispatch:
+
+permissions: write-all
+
+jobs:
+ build:
+ name: Build Project and Upload to Server
+ runs-on: self-hosted
+ steps:
+ - name: Cleanup
+ run: rm -rf ProjectMakoto/
+
+ - name: Install SSH Key
+ if: ${{ !github.event.act }} # skip during local actions testing
+ uses: shimataro/ssh-key-action@v2
+ with:
+ key: ${{ secrets.SSH_TOKEN }}
+ known_hosts: ${{ secrets.SSH_KNOWN_HOST }}
+
+ - name: Setup .NET Core SDK 9.x
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: '9.x'
+
+ - name: "Clone Repository"
+ uses: actions/checkout@v4
+ with:
+ ref: main
+ submodules: recursive
+ path: ProjectMakoto
+ token: ${{ secrets.Access_token }}
+
+ - name: Install Dependencies
+ run: dotnet restore
+ working-directory: ProjectMakoto/ProjectMakoto/
+
+ - name: Mark .sh files as executable
+ run: find . -type f -name "*.sh" -exec chmod +x {} +
+ working-directory: ProjectMakoto/OfficialPlugins/
+
+ - name: Prepare Makoto Plugin Build
+ run: sh update_deps.sh
+ working-directory: ProjectMakoto/OfficialPlugins/
+
+ - name: Build Makoto
+ run: dotnet publish --configuration RELEASE --runtime linux-x64 --no-self-contained --output "build" --property:PublishDir="build" --framework net9.0
+ working-directory: ProjectMakoto/ProjectMakoto/
+ timeout-minutes: 5
+
+ - name: Create Version File
+ run: git rev-parse --short HEAD > "ProjectMakoto/build/LatestGitPush.cfg" && git branch --show-current >> ProjectMakoto/build/LatestGitPush.cfg && echo $(date +%d.%m.%y) >> ProjectMakoto/build/LatestGitPush.cfg && echo $(date +%H:%M:%S,00) >> ProjectMakoto/build/LatestGitPush.cfg
+ working-directory: ProjectMakoto/
+
+ - name: Build Makoto Plugins
+ run: sh build_all.sh
+ working-directory: ProjectMakoto/OfficialPlugins/
+
+ - name: Create plugins directory
+ run: mkdir Plugins
+ working-directory: ProjectMakoto/ProjectMakoto/build
+
+ - name: Move plugins into directory
+ run: mv ../OfficialPlugins/*.pmpl build/Plugins/
+ working-directory: ProjectMakoto/ProjectMakoto/
+
+ - name: Commit new trusted hashes
+ working-directory: ProjectMakoto/
+ run: |
+ git clone https://github.com/Fortunevale/ProjectMakoto.TrustedPlugins
+ cd ProjectMakoto.TrustedPlugins
+ mv ../OfficialPlugins/trusted_manifests/*.json hashes/
+ git config --global user.name 'Project Makoto'
+ git config --global user.email 'ichigo@aitsys.dev'
+ git remote set-url origin https://x-access-token:${{ secrets.PROJECT_MAKOTO_ACCESS_TOKEN }}@github.com/Fortunevale/ProjectMakoto.TrustedPlugins
+ git add -A
+ git commit -am "Add new hashes"
+ git push
+
+ - name: Sleep for 10 seconds
+ run: sleep 10
+ shell: bash
+
+ - name: Deploy to Production Server
+ if: ${{ !github.event.act }} # skip during local actions testing
+ run: rsync -avz --delete --force -e "ssh -p ${{ secrets.SSH_PORT }}" . ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }}:/home/${{ secrets.SSH_USERNAME }}/Bots/latestProjectIchigo/
+ working-directory: ProjectMakoto/ProjectMakoto/build/
+
+ - name: Send Update Signal to Production Client
+ if: ${{ !github.event.act }} # skip during local actions testing
+ run: ssh ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }} -p ${{ secrets.SSH_PORT }} touch /home/${{ secrets.SSH_USERNAME }}/Bots/ProjectIchigo/updated
+
+ - name: Create Zip File from Build
+ run: zip -r Release.zip build
+ working-directory: ProjectMakoto/ProjectMakoto/
+
+ - name: Truncate String
+ uses: 2428392/gh-truncate-string-action@v1.3.0
+ id: truncatedString
+ with:
+ stringToTruncate: ${{ github.sha }}
+ maxLength: 10
+
+ - name: Create Release
+ if: ${{ !github.event.act }} # skip during local actions testing
+ uses: ncipollo/release-action@v1.14.0
+ with:
+ artifacts: "ProjectMakoto/ProjectMakoto/Release.zip"
+ generateReleaseNotes: true
+ prerelease: false
+ tag: ${{ steps.truncatedString.outputs.string }}
+ commit: ${{ github.sha }}
+
+ - name: Cleanup
+ run: rm -rf ProjectMakoto/
+ if: always()
\ No newline at end of file
diff --git a/.github/workflows/preview.yml b/.github/workflows/preview.yml
new file mode 100644
index 00000000..175be6a7
--- /dev/null
+++ b/.github/workflows/preview.yml
@@ -0,0 +1,148 @@
+name: Deploy to Preview Server
+on:
+ push:
+ branches: [ preview ]
+ workflow_dispatch:
+
+permissions: write-all
+
+jobs:
+ secretscan:
+ if: ${{ !github.event.act }} # skip during local actions testing
+ name: Scan for Secrets
+ runs-on: self-hosted
+ steps:
+ - name: Clone Repository
+ uses: actions/checkout@v4
+ with:
+ ref: preview
+
+ - name: Secret Scan
+ uses: max/secret-scan@master
+ with:
+ exclude_path: 'SecretsIgnore.txt'
+
+ spellcheck:
+ if: ${{ !github.event.act }} # skip during local actions testing
+ name: Spell Check with Typos
+ runs-on: self-hosted
+ steps:
+ - name: Clone Repository
+ uses: actions/checkout@v4
+ with:
+ ref: preview
+
+ - name: Check spelling
+ uses: crate-ci/typos@master
+
+ preview_deploy:
+ name: Build Project and Upload to Server
+ runs-on: self-hosted
+ steps:
+ - name: Cleanup
+ run: rm -rf ProjectMakotoPreview/
+
+ - name: Install SSH Key
+ if: ${{ !github.event.act }} # skip during local actions testing
+ uses: shimataro/ssh-key-action@v2
+ with:
+ key: ${{ secrets.SSH_TOKEN }}
+ known_hosts: ${{ secrets.SSH_KNOWN_HOST }}
+
+ - name: Setup .NET Core SDK 8.x
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: |
+ 9.x
+
+ - name: "Clone Repository"
+ uses: actions/checkout@v4
+ with:
+ ref: preview
+ submodules: recursive
+ path: ProjectMakotoPreview
+ token: ${{ secrets.Access_token }}
+
+ - name: Install Dependencies
+ run: dotnet restore
+ working-directory: ProjectMakotoPreview/ProjectMakoto/
+
+ - name: Mark .sh files as executable
+ run: find . -type f -name "*.sh" -exec chmod +x {} +
+ working-directory: ProjectMakotoPreview/OfficialPlugins/
+
+ - name: Prepare Makoto Plugin Build
+ run: sh update_deps.sh
+ working-directory: ProjectMakotoPreview/OfficialPlugins/
+
+ - name: Build Makoto
+ run: dotnet publish --configuration RELEASE --runtime linux-x64 --no-self-contained --output "build" --property:PublishDir="build" --framework net9.0
+ working-directory: ProjectMakotoPreview/ProjectMakoto/
+ timeout-minutes: 5
+
+ - name: Create Version File
+ run: git rev-parse --short HEAD > "ProjectMakoto/build/LatestGitPush.cfg" && git branch --show-current >> ProjectMakoto/build/LatestGitPush.cfg && echo $(date +%d.%m.%y) >> ProjectMakoto/build/LatestGitPush.cfg && echo $(date +%H:%M:%S,00) >> ProjectMakoto/build/LatestGitPush.cfg
+ working-directory: ProjectMakotoPreview/
+
+ - name: Build Makoto Plugins
+ run: sh build_all.sh 1
+ working-directory: ProjectMakotoPreview/OfficialPlugins/
+
+ - name: Create plugins directory
+ run: mkdir Plugins
+ working-directory: ProjectMakotoPreview/ProjectMakoto/build
+
+ - name: Move plugins into directory
+ run: mv ../OfficialPlugins/*.pmpl build/Plugins/
+ working-directory: ProjectMakotoPreview/ProjectMakoto/
+
+ - name: Commit new trusted hashes
+ working-directory: ProjectMakotoPreview/
+ run: |
+ git clone https://github.com/Fortunevale/ProjectMakoto.TrustedPlugins
+ cd ProjectMakoto.TrustedPlugins
+ mv ../OfficialPlugins/trusted_manifests/*.json hashes/
+ git config --global user.name 'Project Makoto'
+ git config --global user.email 'ichigo@aitsys.dev'
+ git remote set-url origin https://x-access-token:${{ secrets.PROJECT_MAKOTO_ACCESS_TOKEN }}@github.com/Fortunevale/ProjectMakoto.TrustedPlugins
+ git add -A
+ git commit -am "Add new preview hashes"
+ git push
+
+ - name: Sleep for 10 seconds
+ run: sleep 10
+ shell: bash
+
+ - name: Deploy to Preview Server
+ if: ${{ !github.event.act }} # skip during local actions testing
+ run: rsync -avz --delete --force -e "ssh -p ${{ secrets.SSH_PORT }}" . ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }}:/home/${{ secrets.SSH_USERNAME }}/Bots/latestProjectIchigoPreview/
+ working-directory: ProjectMakotoPreview/ProjectMakoto/build/
+
+ - name: Send Update Signal to Preview Client
+ if: ${{ !github.event.act }} # skip during local actions testing
+ run: ssh ${{ secrets.SSH_USERNAME }}@${{ secrets.SSH_SERVER }} -p ${{ secrets.SSH_PORT }} touch /home/${{ secrets.SSH_USERNAME }}/Bots/ProjectIchigoPreview/updated
+
+ - name: Create Zip File from Build
+ run: zip -r Release.zip build
+ working-directory: ProjectMakotoPreview/ProjectMakoto/
+
+ - name: Truncate String
+ uses: 2428392/gh-truncate-string-action@v1.3.0
+ id: truncatedString
+ with:
+ stringToTruncate: ${{ github.sha }}
+ maxLength: 10
+
+ - name: Create Release
+ if: ${{ !github.event.act }} # skip during local actions testing
+ uses: ncipollo/release-action@v1.14.0
+ with:
+ artifacts: "ProjectMakotoPreview/ProjectMakoto/Release.zip"
+ generateReleaseNotes: true
+ prerelease: true
+ tag: ${{ steps.truncatedString.outputs.string }}-pre
+ commit: ${{ github.sha }}
+
+ - name: Cleanup
+ run: rm -rf ProjectMakotoPreview/
+ if: always()
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..a22b5467
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,348 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# JetBrains Rider
+.idea/
+*.sln.iml
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+.vscode/*
+ProjectMakoto/Properties/launchSettings.json
+ProjectMakoto/Properties/
+launchSettings.json
+
+!.vscode/Snippets.code-snippets
+!.vscode/tasks.json
+!.vscode/extensions.json
+!.vscode/settings.json
+ProjectMakoto/Plugins/*
+OfficialPlugins/deps/
+OfficialPlugins/trusted_manifests/
+*.pmpl
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..9411d4c7
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,33 @@
+[submodule "Xorog.UniversalExtensions"]
+ path = Dependencies/Xorog.UniversalExtensions
+ url = https://github.com/Fortunevale/Xorog.UniversalExtensions
+ branch = main
+[submodule "quickchart-csharp"]
+ path = Dependencies/quickchart-csharp
+ url = https://github.com/TheXorog/quickchart-csharp
+ branch = applied-editorconfig
+[submodule "DisCatSharp"]
+ path = Dependencies/DisCatSharp
+ url = https://github.com/Aiko-IT-Systems/DisCatSharp
+ branch = main
+[submodule "OfficialPlugins/Example"]
+ path = OfficialPlugins/Example
+ url = https://github.com/Fortunevale/ProjectMakoto.Plugins.Example
+ branch = main
+[submodule "OfficialPlugins/Social"]
+ path = OfficialPlugins/Social
+ url = https://github.com/Fortunevale/ProjectMakoto.Plugins.Social
+ branch = main
+[submodule "OfficialPlugins/Translations"]
+ path = OfficialPlugins/Translations
+ url = https://github.com/Fortunevale/ProjectMakoto.Plugins.Translations
+ branch = main
+[submodule "Tools"]
+ path = Tools
+ url = https://github.com/Fortunevale/ProjectMakoto.Tools
+[submodule "OfficialPlugins/ProjectMakoto.Plugins.Music"]
+ path = OfficialPlugins/Music
+ url = https://github.com/Fortunevale/ProjectMakoto.Plugins.Music
+[submodule "ScoreSaber"]
+ path = OfficialPlugins/ScoreSaber
+ url = https://github.com/Fortunevale/ProjectMakoto.Plugins.ScoreSaber
diff --git a/.vscode/Snippets.code-snippets b/.vscode/Snippets.code-snippets
new file mode 100644
index 00000000..6fb5d397
--- /dev/null
+++ b/.vscode/Snippets.code-snippets
@@ -0,0 +1,97 @@
+{
+ // Place your ProjectIchigo workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
+ // description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
+ // is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
+ // used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
+ // $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
+ // Placeholders with the same ids are connected.
+ // Example:
+ // "Print to console": {
+ // "scope": "javascript,typescript",
+ // "prefix": "log",
+ // "body": [
+ // "console.log('$1');",
+ // "$2"
+ // ],
+ // "description": "Log output to console"
+ // }
+ "FileHeader": {
+ "prefix": "header",
+ "body": [
+ "Project Makoto",
+ "Copyright (C) 2024 Fortunevale",
+ "This program is free software: you can redistribute it and/or modify",
+ "it under the terms of the GNU General Public License as published by",
+ "the Free Software Foundation, either version 3 of the License, or",
+ "(at your option) any later version.",
+ "This program is distributed in the hope that it will be useful,",
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of",
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the",
+ "GNU General Public License for more details.",
+ "You should have received a copy of the GNU General Public License",
+ "along with this program. If not, see

A feature packed discord bot!
+ +
+
5{Vj87_>@Vi0cRnKDtr?0oV_$<+vPWO2yFG$iXU{ zLW4nVV#Pj>(Nivj%F#-G{wiyuhaMN`r%88Vo_%=s@Pw&8T>lNz%de{KUAQ zo~shi25R#*btdqr=u2Dyhu<@FupwD`ZuIo@gapm3w+Z;-X++DW_eXA>tOHuhi<%29 zA>(qzTIdSESGm@FMTt8DV5!h06ALfC;#$!(l8|9CJsG%IADhrN4fMb)Ve?Gk=!Ray zw5m+&1Pg%nHjy^9oatvi8e`+&BVzvV{(?rbpngzH0UaC7TMCMVtpTkWy~R8rMXWfv z#q`XlFhE7Gef6IYHlLCs!x-(k7n1VPz%}D;#NboWU&};hTHR)hb+0Pj9j(}*oWFAz zGtMu2FeEG91K?E?h2`ZM<94NN27*O&jcdfE&s8vK^NN9u_L%?*K1UPH5D=jiC6!jK zXg&6s8GTmdFS0=I4fdGtn)n>&N(W$? ly%V=t)jC)-m0{y3Q%YO+7dwXqq IU)0L=t&rfSdP(9B+UWk*|&%--ck&bi;H*GL-i%ZJj-9j`0Hue1U>fh zlgl7{f {OeFT zyMPpb8iT4)8bkWnD(J@EEsYa?Q<-3fKrGo;X;-oFsoU 4P}Y zZssE9=Ct2Z_1D_p$x)AM?BN&E6`Gjsh_Y!inyuES8pd34X53ySfVUq~bgTN9^SD>T zd*rIVwJ4T-`bZx2Knox)L`$|W99RZOPJZ?uXA0JB5mSh0bAt_+OeY9RA$MRjTe39k zM4n(WP*lFnx-M2CZybo-P4WWgv22C|s3$AK0Ilh9|9&WTGPEF?5)d8#92(FB-DqtK z;UW(B3LOYMeo>h=2ptHB|CNOzG$2LX46C&qK^H#p53juZg;YRk0a;m8d;sS>JIw(p zE(*m(8cBN=f*u=uZVr1)$#RL24Qz(jA!{2wCxH{ipX+;TSBh9k_&;%1H9=T3Ge)lh zs>Ip?zKKn&kCh6b7ozKIq4fqXnA7RRy!LiiqaF##t1p)di6^lle?)ic!BIEvQ(H%h zJroXdsHd$#Qy?L@rVP8usMLkld&Yh~ooZvhq_sY=^b%<@nuLmNSLuUE-;;}Q!5^KC zXt>#8`YT>^k0pT|#FhiPG9#DY-gv&cRFtOEkqxfML)m5H^VTi0AW|rIy0Q(`J5fI! z6uoVx35t0;)VkIV9U>53+M?#!BqFY%Q9dMdoQ`2JNu!dqi)!(J |5p(=d7uvIjnVMa(=!O{|scG3l^ zVsY3~DFCR|EGjLHt6f&GJw%J-51TpL52eU+72)YN$^TA7@4r96TUO1N_VPJ)H}@Kt z&e_Miq4B8O#XO~ChTql^v;X&cK@jjYqeijav9>EG!CzH~*m8F}Pm{Cfds;{!TzNmL zM $WR*B ze%{0!V}6`h&@c#s&$sMgGt0>Y{Eqpi*Vdo^CW6zhqkvY}&&>TsXJ;Hlb4XdM`GG4~ zk#Ax%=bUtVyO?llaqj9^GyLVHYPPBrfAJsu<}J8#aTks?nItX>Po5)2ZYyb_KZ t$bk+1sg_<^x8F;?Bl=qGL-Rz`>9WQZ%=DHEI-m4Txo1*vC+>(haHfM({ zLTVtI8gWUi^Mp!HJf10HDdHkufajg5XBnDBK-?M_>Pv%7!v3f)bTM#oLp^QV6wmSn zzx_inUzsD&`N#mAquNc$yBuy)tsw}yyT6|q??MyBp#4l;meCtlfSQFHbRr6r!VFdW zpvco7p|At}71)Fm9W_`C)gWqAcotPnX(P0A1?|?Iy;*;*BP?}5)p5N`pfMTZnG&O2 z9^dTj*vgLg&s@F>0@?XmW3BCPV{BR^WwcbezZfG)|M3d%$;Q^@2n?f 0Z(J-r3PTSrMP+`2!LFYuSgFczWs;43LW6UjA{D*FQGe&%>n)=@lJ zXb>kSkYWD2mwigoyJU0 -A4)(i{QhR6-_SnP_Y_vI0)7@d z5XM3_GWwcSK4BTGaCk2XwNb#xUyBd^$YX%UIr6M)#ibX#Vm+gQobcgt yH4={lIvr`vlpvUNHjlCWBFodG zNkg_l&3WvK1NIo9l6Y>OG)T|*LQDKV_GavB#34_v_YZ87m((7AzVXWiG$C$3j}KNn z-5L5=_eVXQ90MGj=&s|>(pkQAb~G6JUO#5XX5$=Ho1abM-P8S+^7a*Mo({Y(62{;x zqqZImNY`q9lk^{J-0koO%wpmg7&B{9L+7@(`&eA&vDY~?Zofk7w?F+u $B!&0-Sx;;4Jl3(#B6w~OKDs|P@0#tB zK1#HxK!wiB9fr1|g?1E_sN6ExasTnT$9q^G{i`_si!_l$@5>QGIY5nyJ%S-yk6cmd zWdz=mGA0j#eoyzT@l584yY}qyDnej8eTx1GpAL4O{a{iM7mXOA@)!t(^-w3`4O88k zq&*d$bt@?3Tbfd06^f2_G;LuEGd4Kjw?~*BIGY#NjZMq_=c04n--$kr^mp9-E|vQR zZKH~f=qtB>?tWg?R%@18b}?B}24+-P syGJN7;_}Sw=q`4ICx= z5i}cqXY26%Hh6f~BXUt4(cPlOVXsG2JDq4ajrJb$&kO5>|CmL8bCNL Lp2L0|p+sDbtW|7N?N}9OAPBq^R1FlKiP@hMWdg1AZ z2v<@i@Y^w+1E-+5QOJM-aY-QoQU&Mkwl_A%R%x=7m_YwrE0#nXh8}79b=+ak9Bcc1 zzhj*_o`d?{c1uP0!UtpN$?PQU;|w40I%(b5PSsAP*l&AxyPZ*}lh$sgP|v8S e5iMyHB{ck;qt( zZXk;CspTcQW)*I+9}v+vD^l{Pb~#=oQuG*eml93EOcKF>lgw}7`X?DEe1E`m$rbn? zsj~++zJ`Z5B q7>d%t{IP}; XIaV*c>}m zrn|%R$m7l8XPbd94&QByWcZ#SEgjBJl!k_0m}?x`Z)r8>O-Z(EMGJILm^G}hT1hJ) zS?-Re=8I#`VoHuNIt1v}Xhu;BTrnuUnfME`&WGmtD%3{Xkd^TQ9V};fu$3D>?<<`v z)GoCu;$-_hzWqJc^xnS}akZqhu=6{;@Yh%Ef3f>=Gq={1q@Etu+$pW=%}0LkVC9Ir z++3;OHc-xhgzy`hL|GekM8qd#*kvGnn$wv_jc|>bbd=JULmMl2e|oEn#-3U#&SQvR zfNv$ue8MU18mf`PCVhN}b$bs wa2e(~a{aR$*`ru&(uQ2BTKpW5hjUIw|s9}OgVT75P^ zDQv@M ZP3zhZTni^A}DtVUMO)O^ouipa4Iq1%OSO~~tt z-^A_eJo8(-Q58@4Xh3Y4=Bq+zXo#=fYTNB6cQWkDLCqLHYIhNtBwmLjFrUX+UR^`I zk3p`CW|NWf*5tQbJ$ORad_0+O;l?>xNRv4U#fyr+Y)zzw8DVIJn~XA1gIa-sQyvdZ zdbZByZ_cBu=Bf(%IzJ*9V3MP=Mess@e0GU=)+vnCYWLU9m08uogHi#~vFY*`DXo6w zhAt<8O|;7u#u(sasuN|Q1?-D2 lOa~((1 z88vjC%lYN`T4Na^trEG6wt6p;$d6hnb$E(S YJC3~O&Jwm)ztPLe-I&r&M zUdj<>30#SmD=n^0K&64H?}Sr)%PbO}&Fdp5qmt7+d56}UeZxL_;-Ws=?xg@CJkrc- zOe>aQsWB8QwrJAYWmPf%ba9u1Nr}p*a!-Q~k4D7glDN|eH$~Bj2~|5Jf8~Hh=zg(O zh+w8@>Zf|xh|WUDE=NXutnt(S3$x9 h#&) z72$n;rdspK(fOAaRlihH{_cnc03;RmPI#@GT~?M}t%qeKKM7l(*h$BYt2!d*WLCw+ zmoo_CB^ySD(8(bhE|PS7UXaT#dw;y1-{e$ecZKIWW62G=hxN+0#0vHI!&*bc&ab`d z>&cF4sDwq{F`=srSDVV@d;K|kk~udnr<@Kv@^)LpL2*-_J~(~Gs}%Sqa-o@-D6{Lg zeXR;$9EnYISOC*!zg>p#O{!@vY>N+BP^?6>yf6uhN~ Z{Ve}RiR$(8w%{&}g#(0RKm^&hduYN^~4S4Cwh`=soW15I=V`zQ ?hEf4K@Q6c#wVMp1 (fnfCxTo=t&G`=*lHywqi0yF`XT&>JR0zN6E+4esff4Jc&{EdHJSSh&wFx zHVr+tr=4fp*cfwozX2$;2jHc60fewfoG+3NPBzn@^?!C<4(vI%6M5Lc%LlRz$F!)+ zU5m9ER3Y#LwsF5PhGxF{^|BKUJ&z5CJhTSlO2%nwwTMi_ib#nKYMiZasHmlcN-| z()jakZgwdY9tHDX3M%;B$N;g5mZBFYLc`WSd@cvIW#y}*GLN=MfuL~T&C9|<;!-Us z9AOH^Jr~=?O8&rwjTEtk#S1JcJ sU@JGw2OFZ zHrf8bNm$ti$r01Nby%P->uYWD?uBuZ$feUW6m+$~u8ouz)jfAn)R=~8=I0*YDQ2(& zx>Bn={GG8Smxbyy*Xs_f?9|FRYiDR|As7 {@nPkOr)IAhx%%1>_Dk zzez0Prtv4pv=*Vh$c{->;8HucBA)O}x8Fpij{XerREB8RI2NmZnQgi+AS5ruI@Ei% zMGStkR%Q35F#r{sO;-bF e6utw?wpj4MG=Me!am6$|LZc1XP=2N zL*7O=ew_lIQL8WGM0vdWSqRlU4aB-Wzm(dM1IHxTyd=d*(@~-DJ?$4pYc<}mpLWOl zoc@8+=i9!W`jOSK%}CFj%*+)NtfCT~Azf>o(puR$S(P4fNg8pVWX}PqnxnD4Y4~Qe zxKv1+92Fshr^)zrLjxakx#6EmV7a}%e66(!6<9}F+k)2&-u#EW}tdQxEMbH;AM@ z6ky8re7lg$y??Ll#@@14AaLA^LsuY>eY2~uOwmwK>|hmkuOhv35HJk?h+c9P7$aQ( zm$KQi43helz#jylrjLL31Mpnv^H;hUTxwj?H)Sm}?#MM~RH#Wf*4XhwEm@4IZPzZ; zXAp`G%u>_wAIvhk>g$LqBLR(08G{=FV(~g$Sh0asIaS}0^7JA1;4!@bZ3Mt0Rc!yt zpS7rqIA6=F#fZB_x3H`IeuaF7ks{7abD#OIy|KOan(N)Ma)*vnWRFu|%tpU$a{ulZ z@2u#p3hG|vU=FAYL&5VZpQdk+XNNyaP_^!n7(tHsGMG(y`Z_Qd{P#<{64M(8QNg*c z+mEt#xWu1uXrgMM!A@ii@#LFF<~wm;*9={&7C8ZFzh+ExlJlZw8NYI)qAMu(9g-21 zGT8egQRyE)ItnI@`cen2c!3ZIezlmAf{yAP=Z*DB>Iu^Rhc`9y Alr?RMq-?uZ-jRaCu>auVt%hdFRWWpwOFh zuA`2LnLbM!3T<%8R=*FwtX&b_A-c@qD+vzJb#@{6ueDL2LTZ(k0zIkJZ83)9wQ6N1 zK!KGy8Xw(J?*zP1I0{sp0e2BbJrANnDeM4nR;Th1H)>smfu7NY3V7wxGlYTLCf)%d z+)~AWtSL7|d>%n6i28JtO`5J7e9W4n^W8JGnqWrHDaGYF_WKg{)FsCJX6Jn`#dRdk z$Z07lPtOw9a?CBXr>Fz81B#gj WkS81*F4? a)b^iRq~3i; zJOt@E44EkPG(KmWI{EdvQ03{arnDliVNUx#v*~ _zY&EoE)E`^h{%8Y|&vvAZ0b((HM zkbo6(q*^SXb7}ggTKdpe a>CsIC$ZY26XQHMj?(34$%8)-y zsG;cF7wc9X)kDNX6T!5^4O>piBHI9P&=8KetSHXA&)-fWbthiUMqhx;G!2a;p&Jb( z1#&%$ktf74@Me*RXUrEz-QZEro$3G>k!E9Al;WEB3s{f%Yc@`(^XnA9pxQphlCmdH zGxwR*g&_Rc>B3W52jI?V-+eMZK_ExHu-jDz5q6)Uwoo-%1dE^jN{Cn6E4_G3a2be2 z;RYos=a*ifr7EY2_J>ez)ZN4>LY9yzs9UK`M&Ly1=2#|=4m-FjftmIlWM}m4-a&7u zhPW)>?pP+_mr!`r%A@)%W^}Tc;R9S7M3h%V3UXwzPjRJycO95hv1&$@zm?LO;4{oe zk2FfRbybS{Nxw+D4`d=q05^T8CXWr`6iBJ)9S_78XMwup1EeqZ1=@PZ8G#N^F~6S@ z@ZxBO1Zya FZVQa{eSgfcJhi?uPbQz8-stwuc}87P*T-vu`0Yg-o GW&PxG7-v2qyOX1<#;7$CW{YScv>t4)Yq4yw z-XZhwpD;Dut!-31#@=AlF{>h%v_MfFf`bS)e|G(T=Gk~X#M5wnx8PE%_4V>N2_P&z z=u&mk@cV4Y@NRb0$0V2S!h_J_RJ!@eq=D%(szWhaAmH<|wZf_t#`2r5w6sB*FwZ}E z0aw*F2Jswz8`rQ1s8FY@ee)P8ZJy#NBQ}6ne2~F(cExQ7KA#=O@px)5gfQ7=^<(rh zI5ie8`54 k!I0J= z&I2lVtT{3tITCO=`B@sKh?(-sTh&+PXgTSL@2gCut>4}2=GG+{^sE?kkvgTCIP=>n z4goLjk+JetSYNr2u$^eugJxwD{G(K}+SRWgu-M{FI5F#XxUYi|%jwqqaH-)Uz|VQ6 zP|N+cjZ!42bmR?{}XwSO!fumS)aHwT|HeQ$)pU4}O3~(%SWXvAc=&g=u5Z(C9p@ znByU}%@|f0Ki_c@4o GiC*TZ z^5$*20DBy)=F~1PzmUGfM&rxfIERPKL=r{xsaFHvySk25A73pt9xrL@d?Q)@(H}7n z5`gVw)$dR(H!4&4dbaM&4EinORDraq63~4Xe+#T8wTh58(3+(I>tsnX-IZ30WR|0f z6L$+aIv?)pEt|$j^@Bq&OZN)1DRsE^7wQL_Hog?zk7&j`hoQS*oa8U`^rQvq=sk zl=^M9*$JCt+`#sTn^5z_asB!mAa{OvTkGay!sT_asj$x{1dRqJnmyxmtDOCwc7*LY zZZ^$S PWeuU%IY^z^qDn8>Lr%r&lm|KQ{=>P132L&7m5xGnDKT zu&6LDOgp|e+dSM0g^4^J2(W8-Y~A{x$bGD6RkBa?Ide&Ss%g8r6W8@wA)q#VkFAF1 z4ucI^2WXM#s#OZIj%PMWS6p7Bt+{j8&=`718R%EZ?$H0ZV!3P8Sxs>f8PpW_Pai5X zpj|;lhjCGt%a=c_9-c)$qMrR~1`sf^Vy1FOQO28!y|FgdUj4|omrML38E@v-J+Myv zyy8QxyGx}vOrdfJ9^HDO)GP%UfVq#=c*{hUTC?jNpkYpzT4nyJ%T+5CiHD=7%D;zv z&Kv?7G(BD25}$oZ`E~Gz86g}IW3~178m3hr&b>@hmO}P}DFAkhFGS4=8E02~^0-bk zk`n{7;b??ZH%XEtR!fpt=MO}|zal3&l{)j*Thllz;ow4|0{@*qm9lkv$e-#@jaRA4 zH{+|f&G+RpD*><5J= #H#ZJynRZyznCz1Y2E|C_Ce hd;^ULWvXD|(X1 zw2x)j`qs-#qprqj{gi3@&`akgF&-?%rw=|YeXsG*{ljH8CqM>$>K=GI8%kXI-j2%x z2y_Bx?RzO{I~28tf6~uSSyGl;x+r~rspPEFqW;O?Ps;IeHR;t*HHc)$#>%(+QMry< zhkLp@99iBl$Pj=sU*zt;rH&XGZbH#f^(Pc&L?$Nl-oD*WPb?MvXIG{YRFSE09bS$R zDrFUJj9Iq2@49v$k(mz++DQNTnv6UpgEb_6jxSCYn5L(V(YZodq;mP+7kHgN^VEmo zggpP9h_|;}yTN)YKUj2o{$FB-HqRJBm!wls!k?5>3^4uglu%$d2~3N)jpg5}L7YVO zK{y+peK`MZz3@0q3ro=Ymmi?bI}N)m4~J<-KWG7ZI6#bMaA@)nfw=YgSS)>XF^}qd zBHZF4N^O5n1)uvGa~wSDn;&<3$pF&uVD;(=bvXQBvl0_&%d8YnoP7}oO1;rhar!m+vk zX}@Z-hi#V%14{oDKZ(l*sw(|vtc3h$EhWr =7A0~0hirI9GQoH|QVT%J~3o{(G|E^(_e4u>K^YPM_*xJQB0C)mD05n;YE zlC 5Ww{l#Z9(vuPS71sw@{y zt<_AX=^ywvQ>V~G=M6Hyk#AD13WsNy&dqoDtTnWt;4nkhR_~L~&aMrTe8!K@nJ=q- zdptenFOTD{pK`Bn6TVNkwyRKeG%gKLAOz-yQ3X8B@28^&SI&Y2Z*uIWcF&Rgn|hNP zjUd!*Gb@hj^aJ>n(tS04?@;{PI-7x~qWuqBi`yz6o!=Sk>ByNqidA~u;6Q{%!0kY@ zv8QlmAgLTQYZsgDHFuZry$b1vIK)!zC1(nyn-{7imbaQG+ZG`2J}t|rS?K(?FxRKY zWR>!<%VXc@ q0D#Keavd8Tx=$5l3$K306PdTD>(RJNyUS zV10IAqf5#U5!21We^&Qv#aE9Gt#8fEzuH~?k@mfJFe69S7BDa@JNML?J+p$~*EZr( zxnL_j2=U?%huD!vhLAQP?yrjL^ k zzv*Qkic49yC!?r)v~)e6)Zl)qe*S#eB)!ySNjh%>?Z|8GKI>t#^Cnnx`-937zU|6; zp-(g_!U-$UOU?V3N_$BlZYeCcb+tbhXm@7g!dkq#?4>c34QsGn5x0Xx-%C$!^$p~5 zRBUXRr3|PtYkVfx3y{u3CXq8W!n)(mj82|VyQIGjk%K>)(UaeO|Gr#z0vAgpOUz2V zRC#?>0X~v=?c*@KB+N@??*;TW4kx&NhP;zgU_D%qPsn{(TM;*lAErT`9YV^hsL<^c z*aVI1!TK#A>>gU4^veF%_=wg-ql|%S@P5bja}gh2VIK$W*qYTu>ujYL_3Og00v?UV zR93xz6asDB$I8i6gl;X*X2~`~?5gbOr%q5B?GbmH%OCVHm$#m!f*Or8^Hs8h|6Ji0 zkb0RZ_%+GwKuu9*EpY7Q)c{rF_Q^)qb{^|gN_)vND;e7<7j|AVc2A<3w{wTL_io72 z)$d&hZZ;aIvpsD6PgAzG4(|WOK%IUUGG`r;BC+A*H#Z3C5nZ9RyPZbwF{z10rK7rF z8vJHk^Q{O_@<@)3Pb!7LwtrUU)S6GU;K7K!E(rE9FzxSEwz`^rD}%L7a2pi;0J){- z%QmR)VXb7d_V~dy#!J$Hc%I0p{bSmp*l`FkueTCXbjR-#?tq=Xf#9dC{ok8N+xE$k z@k~p<={m&ASp!N;54ov B2f~Z;uW9^rP+u z&`(}1M+b9&vgk$tkUormc49=~2F@<{3^xL|%cLiOAZ$rfg#CZar($T=?-cZQOysY= z|8EvGh?C)e)9bPt|7s`x$JqY=t!wBNag)KH$BXA4r+bHF;oqlynmR+g?(krE1EZB% zGTFA{TzdJVN9DrD>PThOXSW+Aci0AK#T(=~6EL~3KW^ -Xeuq#v=e7=+~FQZ;tc{qv2zeL6+fQloD zC&kA ^`$H_9&v4)_vhCi54pa)KG(h4YV zw@bO%!}-t0{Ut`Xq(UwltEVkINl~d=|NdiPS|uDbd#t~=d+vHC1XI@qZ2+OON$Y7t zQy3Rk`w}eI27P--e~bBf**hNBFB+a8FUdLk>f$ba!kV}mPxTVLz%dr*=}1$>$hj3i z@j;l81vdCv=nTS-4;7+wbGvV|G8sX=E<)@8=z(tq?rMFvkNotpz7C?M47XmtUb#N= zk}-wxwE#GTebKi!yb5oh_5a7Szc(L$Q8wIR*Y5N=im$97tDcY5%KEBMrs2XNq20K| zabU^mde>$-IbHGz6Nv?<0wAYCpPe5K7BvYm_mb)nHMN$t2N$|Wk1-DO$>}Ltj a=QsyS>n@Y6)Qc*Uif5eZpT?bY>} z?BUXx^cdZKJkKhDZbwb{jP{-gZJy)LE+uB48cXUB7_0_9HKxUXcQuH;=sgQ{FKZhK zzAT <8Dxz%J^d7)xWZ2nGmZp>2h>hiu#wDVxO_2c0{&vgetV1Pfn{;t#Ucmdmp z{Wjp8c!eO=>iB6EIghLy!P~cQnHlAZf%0+Ma&cGh #28$buVg*aED2H-ABw0{uJrxbl8s*Sfa(WxA#I(ekR0CN^u=6X%_@+wGt`F}U zW{H2I{qw{B?|$b0!3F*Q))g1>Ak-v+7-*CqpYjl%%ebKCV-UF&$v*!mj?rARaSZ(j zFu8UcUN9m}&YzrrBn8d<$5;M;qf {d25=gdeI+*UXKt=j&}7um54 zVR|N&%nN4HaTh`K`6`t8#YGluQoxk(tC7^tmS%suW5$t6eaC#ZM9XP=@HMrKq7lU9 ztBZUNFb3(o{R-eYaAq7QzWmA4d$|0k*6CrvF`OJ3)8O~?^f+0cBw#MZF(~+0Z%xLa zgj&e~?F&`1uaE?YlSMl3j>)Ubn?1JO3g=gUkwuoY@F*$}Af0*Ju}l%B+TGEs>i%D} z$53PThPJ4rB$9LNzcq+`!{^U;TX}yiFi_8lJj_QPB^((_5=EovRz*Q@z#^vL?9ZD` zOL(M_JwN5!NER!xIEV7@+RohNJ=$pvuV)*e3PcTMXIuD(@h_*yBo-{SgTz{B2j{Vd z YX?Ucxp5JHX3XT^>PR}-f zpT)Ueyh!psVyQ!qMhS0M=(zQP_tmD2nTyLz=-FtH7X-$p-=ewdzJ)`bPN6eO7r%&- ztl!(>T+B)m-rVGzL*b3xEGplmDzt$zTG-;Akg&7=9AoG Dw_C1m4n)inz!^^6U z1;3M6qK4?HADphXQyu1&sfEv}U(y0gm33AP4&UUl%U9A|_^}ygqWK8o%tw%n4G(~% zeXtNC2EPP%VM`Yu-L1r;E9sLd=&Tsj?8ttYFx$r$C0Spxe9d#3HFxwQVx5%VOk)EZ ze60F?zDtLbPC9?gg5e5nybizvWu2dWA=XYW<#i8<_E0s%DBuct`gDeP<>MxHd79mS zINRNv#`bqpx07rAF&DDa>U5&d>xL*C%Wrjh??C&OGS$Gp_3Nc;jXlC{O1N~TP&42X z=l)uVwX*##TqTu)s0s5!Ll;aRpJzoaTYHA{=6!`QH?A)+B &x+&I(N{?9MnRZ8o3SbCW*hb(FraZI1jDOKn=e;P|4B4y89j;_`^0oLa3E3ZG1y zl|Y<&xZS!lqiQviM!0hX4MSW9I-cBUVoI6L+9d*l0Y ;}Z2iMe}!<5@MOyzbAoBX|&O!E>*N&_p&XQge9K`?*2&Fi6>_ zMjI(4*?v11o9PeUZCw?YW#5_jg{^lA9vNgffNn``2J_9!J>z0<&nTUob^=_)QKMLmO zUEbVX_Kkgy4n5z1fLc5+XXnj3) %Orj3 zFVu9J{(YQSZ{rXva_8W;uE8jii AR z=JV~d@WxYxEXP`3qN8*1dhCp)Gr?TVNXRk>t4*r=ut5;OR7nz*H_&@0hU(!I%#r|O zx0V?Z6_n7u=xe@F+TLPpN_9?Rm{L<|j=tNhat17rc8WAm`x>%Q4Fh?bY?p=+r? s1u-~txsYFzH~YPX{)3;sAUaxvE90!%y8&A1|8Un{DxiQ4bUBhmJT!? zZ|S!18*(>Igq}gZmU%BvO<2f=IuFo|j4!@gvb-m`?z#N4xz}-nRF=&O_r%REPZI6+ z_cv)DNFB(>0$UEqBF3dsYq^(Czs?&Ltp(TC=s6tm{-m7Oeh_vXyCmJ1&=D9wmbX^c z_=u*~G&y%17l|CQcK^*To%XIHoEp7tn1)bXEAKn{{?*wIz2c&}9;k5LC#-OGEp~6Y z7JDhJO&WTmWeN>IbGkavrA`+V;#s2$o%JMlzqiX)AF6@r3^} Y;te*21IzhJI&<6G74i>X%NadSe%E)qdB{4{Kd|B9r3_R6aC2>m+?EFH_$)~~ z+i92k3=ueK&1{B^9LIjF;5nXs6%c3 guO3ZoPAVCNovT>yRYy!xl% X!;Q{Z6k1@(vxIizJ&-VO)6lg7zsDkE7Mz@>i$@F<;~x{>gMC@BYzM4-FG|L zaOCM`wdWCdZl@~%d2cy3|2m_yBIA4>Oo3-C)WLqFUqPi)xrA4@SK;c`KCq?vrj^Fi zmzREe_(#q9`hhr9Dh@X-w&>O!qcE@p*6Mz+%yhF3d2SI{9qhc+>jA02tDxTKcGams z=;Gh%X4RU^7^lyS!^4-HHe-UP5ohceQXbjeOgr#7Io(@MN_InTicT=~`jlxvOO?nM zg>gKC?nm0Pg;Pwc1;#p3_z42 M3so7(HE7Iit{bnQ+?BcANa@8r z)J-32y!suzc!|5DmzJLkmX#2OL+pA7=ng(_HXQFjPFt@ YK5N~{Rj1dLJfhVf#kDt3D!BB^IN!V_&V9?&SJPzQPf?O8ODf3S za{pa#lEIx1YHqSk?GesD{hM*y0!|y35h8X?q~sCMwx^!1TZkTBY>t{%%MR9WPa;j0 z^PxbcW_Q!>cc?sd>8dCqcifH1KFYrR^Vn*NA(Gd+MOd+m?{>_Gl!i9v!{$dlz2&S+ z(%Z4 &OUR9SU*UM5VlQa_ av%8kOL4muvOK_>QJ>o0yy-8@3m|`}vh&7c7NSZV zpyO>6G0y(gGO}frmQ??tA$k#u-ECQ)SKz3_`)^~g&kB4Ka*1%QXj?g0C_#f zMq8yN4&9~peNLv7Io9EIV{ Kpde1^Sjvx $IZZnGu)--jwT-rc8YX)9?H7L#wBYxw)eNtwaz__ zp;6+dPexZV@y~YHD5k2zneVX8GtSrJ6Y=1Q7`H#zN3E?Ex|&t{8)V*OJ)O(3PfPu7 z{5g&>#7@a^r?*k#|4yW<$QhKlajn$u?y&MW-#z +S `Uw+ z_5+@g;pVVJ 6$Nl47)S|H7UQANIpe&x_?}%=w^JQ}a#2XBt{f!=D{W`ChdI}uCO4^5WoPT3# z=?ky=^g$1h?)>;cw@b@7@6wuvGtuVr8g #K{cD3-6Hj;Qo8j$jR$n5ZSMr={lFsPP!@0D3+wT`uUT=d)>MO>;{r-)3>k+ zvZfEeuSrW7npJmNQP{_W0a^B?mF$?svW~HwBvVA#a0S^ju~L*vv{02ic&N(I7>h&} z#{nkbO-r;r4`S>Nf$MN2XfL3XSc-P22W+3fGov8}reWv%ChTS4g&qR>ynAy6^FV2^ z8$pHYs&l~l8GcvkIZ IY48a)qz=xWc)dnHuM#Bgm&+N^ zYIZL1jy;0YM+qC0l&|~ze2Y6^nslij25L|Ut@OK*2~jvVpL$67l6}b_RABs8FsTh$ z7wYHDwcS`>)J$YYV>iTOfl%Jc5n<1`Vm-`$l2~St+9m|I-dQ8ggfKTaj|55Gpw>4# z^b^?be U%UFl85=_M`zBP`N2?RY*~1yE zoA3tTrVl7d7UL^s*;UTt`Boy6B9ZGNN-F!ck`MQv*y+zlz(q^9k3e_JuFzTpv&{6# z@%aJQq6q5jO^IrBsX$%v#>tP^Yl$pAk&~S<^v5#cV-VTHm)7-7=QP~Sh2Gl*eB<+S z+-& ^nyv8bw#^R z(t+QjE}!o~%9^zkC!8*R*`46aHhMd)3- TcJW4$#(E6{_?MDN!Uwuxs9WnUT;$N8>^B69hQth z_>F{%{pku@UkLX)fLh{83u~MtaE@#Lm*C7VJ=CEtYwZ!&Yj!YEpb 1~3={(6%A6IafAI z9wu p4pbm*>FXnYSYKNq@+Hm%oF8&okBRCDxnsigJ~AI{>_tSn|NV$~Mo zC5~ri272!;d04e?ImX|gq`UB8JIPaf47;O@yU7T;^e_r*J0Dimz12>1L)E &o58Vtl^GjIldjg!-#mXkFB>F3)eEm&!!?VqcBVIEiD z(d$WAv-kXKXr>K(^fo+M`s6wRrm3Ulq(=hBfN@)l1&E{~dTVGLteJSH6 vxi(a zIb052R&3&^ZT0&(+hg5^u6{`R&VX$<6;?P_y>_hQ4o(xE-_mr|)63^rnCuqew0sS( z+@s&$VHI$AuS7wr6X3ki>8i*}P&F*?`H4)O|G40jDuFiF{j#`vpM29jmb;&R0ayjY z`unrw@W(X4U64m9lZ4vhgX#gn^oX}+gnG^^Ne4{r3XAP9ZM1+2#s#i(Q$eD*w8<5c zEByAs40m_{Y&ICbk`;r8DctH2_FO&t8l;XR)yo0Qsor(QbRe7>GsZn;J530nCU}|E z;Y1E)K*c0Sv V=V7mj4v@uWVF((UYjJXbq-C5t@Ycu|151o=U2@#T!8nryS z*Km7-Y%^FPM;bwm9pdTMYDVc7>MH!Jh`Gs8k)*+#%bMo?$_AgxuM$&NMV6DMuptK9{lA#pP^QP3ObaJi%_Nimm+Yc0Mhw^;9n?9K*5 zHj9aqGm{@o |-nSC`WQ(Hz>h^)*M|kB?Y~f@Up L;uuRqRSkOg zbSZ~RV0@>&Z3u3cGg>?>WND$O9w2@4DJ`{`dlZgh(9QeDtM%-y_?IDJwQ`Gk^pV_p zH`Z6(9pwcZpq`ufpvN7iww|v@WW&YLI=a(Pb*66{?eVAU=})rwH4CoK$=7%6Rr9>- znA%)~E=rz)Q=3gSZcRL&O=-FfK=s?g1*jgES2`Z-v`l>B^ !*o?l(}Y?xa@!Vph~hvvJVh<7AKR?fA3N zs}5 t}Di2JZCV5 zkO!+^Xa)$UwIBK0bc^28|7mB$L_M_0kZM0F-CkP~CSbQ$)!d-SX37|VL-wx@`O#E? zhZB)wfS^a+UhE_=(Vah@+r9`Qri%}0osnO&tQ$xTC`470HWcdZyknJP`(TTkp4htb zP-aTA8HeG)QX{A3puN?BPa5?)>OA|z%>&_v7RFUTZ)NcST4%c!Jhh=|&=F&=k!Co& zH7-84*ruf{@FV$FGu6rj(dg`v1j8<`G+Z3=&aQgR7$G+D(&Hu%%2nmO1zO19OA9OO zKh42g0;}8PFXgq>dhLRuH_LHWCu2LReW|iDtT@wfX9slO*rjYB;$FbdBU%6S!3$9< zZqb~6A#yL-dfa0D4R3T+^sBFe#t8ae7r>zMX9>`_&Pv<6S63=zPr>AGr=CuA539Rq zv#ODPeqUCGoo;=8AaNaqpxH6QD+w%|pD6v(L2$-2NOw~BVwQu|^2OHM?h>)+Ky7O` zC7qgu)BD8M96x{(i* v3 }NS|9c*&6hae0gOGkt!llg{v^A(S$5Gi&n{2-^)adT@8o)iU1b!k4**-v zv&W)e)Da{jBQ2M+;oM2j3@AM8P3->pMVOJ`ug>Owl)U_ZU2o88N;3kVqqmh7#Qmp4 z=EyVlqF_hPi3EP=Yo!C vaoB9Ku(eh2CG0>{Y{%`#pq8HZ&uw`qO;kx%e9fA_ zAG$AZvgru#cdOgcT1On*2o8d-_LwbbXX9~{>ui*@rtm&)eo7J4E4?oBI5s UW z;<~yy2MmcVw9V4GKjR=@Ckd4l_9uOIy_^CkZyoHnR&j~>;Vf- #8hg?C9+yU{=AN}=hRrL}9v+Fwf%&5VWa0`!F*SQKLe`0s6{*PC66 _>m#3nAw~3Dk2jqrR+Ju<#Q~lLbO^l@!LnrW)YvYmc zp%ug3y(a51>g%d}xEQ4u*rDr6Bk9V~((8$sbnEjjYumw`vi@+~7IHFIy_u>2+1LJ1 zagI=@cB@?tkIE*STi46EyuMN8_Nrdg`jxb$cZE(I>ht+dsxl5V^) WyeCtwk#X+VQXdZeZ3ebe`2Tf zVr<7=X?9hOLPjF@mPg&_70aFnaj*MM22*}&PBrVPC7*lN?UVJT_^TU-BSy#qJi~h} zf~)o&X)9-|QO!vn{VF8c;#>* KJ4f?rAv1VaJP@ zrmk42d8fuJZv2eC$*R)hI1Zw!b2&cTU$KQDznv#5(0pthe~g~apy2~6W`f2Hzn&^r zU Kh9aDC~W55LxZ_l^Tw z7e7`!rMBlDg3*4#sbPq+u+*X3W5sC-ULGcZH(pRU3F+3K6NptWz4S{dwd^}0aa}{K zReUM8U=iR;IO_T-4+t0c6K+oRCU%P7EQF($)-mI6G4brn_gB*zZ^)cZhj FS%a-PF#(DvWG7vixyvm_`z=nTr7J_;Q zNwUA0S-9%zYGoEGD*i&d`$yOH&I!L-jK9QYMO_cbM0opGcKcN))vHE|^hs^rO_D%r zAGBJ}XfnrlMn~>uwC(FWzdTBEfLL&~3r?K>G5n+yI&;Jr$`q+OC4n$f5DL95Sthwm z5^(n2%UqOM4{M34uD2brbA+PPl6!VLwVpk?6NNfAtEOKcH4)|>pST#NH7$o E7Vv|2m5a@gRnE zFUHSMUrkl|quFl6PAL|1Jb%d&WOr7G^4!9FMg{i*y8h?fX}DQUjRB@xqH~(qbcDWo z^$=y1jyN2%4k|o!JI3^8sOaZ#z)lzVB*tu`zL${`>e{R$*VQ<=!^eTp23;I3`*L-; zrgcrbf;2qU{3F1bLa6&BTo4%n&BYi7ERAY|W_q{VnE7Zj`ZA^+eKTd1_qtOdCr{io zb-xOo;_ir*tRGwHynfQq`PxKeX7zi4{xH`kU9$fCzpYBJuH3jm6Ic}X={m%l_R0^k z;G~*6Qs7M^tPxxbufK%V1YHQ%JNv2`AJMEfgpQoPqL1*OUHa(Lz&}6R2uWt2K=DAI zB-?jVHM%j1Xk3J&c6+wD)pwGe``0dLZIzSwHk2T^2M6L2^fGy@9hO2H2%V*C)(1OI zH_+7`|H8Olm67yd8Bw{WtHfyQ2I>7%jx%*YJ{xzx6>LwMFv6n9p^b>W@y|^geh5F% zwTXP~_`reVcgMihjd<^gz;4_v_2N4+`84S0%BKH4jk_+5-Zxv7sLtB{r^662zLH{u zz=qA>(lpJ|<*53GyK|*SQPP#@<14M4@Bjp{2q`J5F@}dDa!=R)4+$cAhe2Jb5iZ zL0124=(70()5LD&+0KnpedQF{PapL4_CfA2U(z85hxPA>;Pr`?uaj3{7gy&xDP7(C zxeyAmiQCWf4n@+|7h5Z?1xd!88F|K2ECPoKB?A_YUKQ*@F%5&af{W&^ak?y&Py6Ry z?Yz2?sNP{HX=y6H;lE!9ELtpFyefIqWUdI)>k2dK1zvv-;-G6Eq^aPrrfAD2a2Md+U=|cX~ z8t`eyVhLsg((z8H?*Rh0f@D`ZhfZGz=OV?vW9Xz)hlO|(3r+(&$9Qplxb~9Ec<+$f zF08x{Nc9%?e+X*dGuf(Ab0Cj&eIr1Mzy3iV#@|1dLq-0P{hGb3?R-yf+l2TGz^ICk zLJu?lkxJBm@RshZ5^O|@dyRxJ{{C1F&1vdob$wKT Qxs(y?Vh09|B%A2-0y zuifpIn*e`R=rB{Mxxr5DlPJ#tq#{~CZikMl*P)}< Piy%-hgd>> zvg@cqtSBJWkip$BR6d5hQ?BdrLkF}Q#^!-BIl?Agktx7MNFiI7#t{8+4#Ydl4G?-H zd_HEz?aZ7r47+*^w)8H{XOWf=NsRSxmPfu7#m~q%Zu&ZMeT0g 6(Ov$^g6y?NB7ZyYe^l-DhTzr>d7QCq0-q@YDc`t83YNW&)R$rjud%cD z!>|_(Tn`%V+#DW&?T9RWt&pGOJ6;`9dU$!)zZ93k aIk~1*+T5S%bY&q;?sMiRjXnxyFT`YmJJX|{e zbls@xY>?(`gE+d{URaD109ZCSxKS;^ttK?#55Edmo~^RIF0~ggpzunibBUBZaK8L} z|JJ^imje5&C?;vZQ!6#veSPI_p`w#8Ns?0${&SCzEvixIX2pFeHf7t+dyeK7Cd!tZ zyGLW3KI_Uy-k7VHM7;kB$KIdC=<&X^-era7OT89IGnZdW^Es2}zUYYjWm>a%!zVPz zm!#86m672ZYy #Eq7oOSnfyzYA@i=`L6=B2Eu7(=GZ$9vg_U{Ift+>$nqe !~j#T%Y(^3P3dp+Sr;+4$hp3~&1i~aHlgSmi%iIgbo`s)+T z2BVEvp5eo1{0(a1{cDYVzlxIstN5@WWNZ9f()sg2B@Sffqtxza&~~TNpR(Jz)q|iv zBC+a-WdD;a&)Xrka3NS|lfU{ %{G)gx zPtaw*lS+Tm`XJY7Qoi0ihm2mme f7Kr9(h zCW*ChcLE_0EMCydcYE&fdc<*i@DWaH1^743G>5RnI~F*pHcox`(*03y@SHK%VZP-_ z*4dzr{GX4L47IIz(+!GlAM^K)$6R>MW}6FALnGUB=G^EqwRs e+q&pm!-+k`izlkDiWNV-`OSL>Zwi+~2 (S*yCYu;xr^Yl)BVrLfmPdo^3uU-N)a~508|#N`EE5fDfYG_6Z5Z*~cx8kd05R z;;(b};d@=1B&L1~Tfr+gn) (1Qd&MMD%$qo!KEp0u=-mQZE zN-Z`jjdxVeG*Q{Uo}MD0Fs@+DZoQqfxyeOpoK>r8u11W zx$j-vAJD0mV`z|+k(c}Nr%uK=qo;G3A$GUp`~5dXxzIH|vO2==?p`ylBqvRsTSK7h zjotYWsG7z%Bbm9`s=U}sOK1ARv)jzGP#mRTV7M#w+_U(r0lzlB{mqdUS&Ky?wT9*e z=-7s0+SsRS7_Vx2Q@++%>=6ivq2~E6gESl!OyJwCbN1C~gR>O`X*VJXB*(3JDtN1I zH6=Z=Hgaf{jEy-w1T4=h782P9PmQ_1$UD9>3LzmRX}WbVGDw?8Z=02YS@A&@rR?{t zqD3ZhMJ!0~iPs5gEh9I=y&86#!kiY>jFo|2%Osdf!T0gq2Hi^p>Je$WKCi;m24aqD zii(fXx A)mw_{7drN0I$m$eAL}9yQtz&jalC&>zP)qTA^8Ui@1X+*bi9U%*0u{f$-tZsv z6Zqc+>OTqV3S175@A3b05JcGg4+tuCs|7$%@Zx_1LBWgvdk{3$^e+&^ tR)7WPf*{&g>s7laDlW<;H4g(yExg znMn}#&iaMKK9sqF3UETsf`36j`UZy0eEEnjg1R8?N 4s>Tokq)nsMHx2vzwI9f6EPp8k zPF7DZqwwtuQd cH2#~N^q^<&jvpWgr4%P_i(GDSC+ z#!t?4CceMDm&lEK=t)-D0x}^y1D~srktH!S+C6vfCm UT zScF^BPX!jgW>YoRUn1Rhpot?wvyO3a88)LMbf*WPAuqAY^6A)x*+Jy~LlSa vfEl}<>alG5GI?1%dZHt8S?u4g$Af0j@!)pqg+v7j%RjinMa?y)1723^r z0yI1>bIuosj>8YGWzoPNh?SS!IC>cts_COhD$c*TS#Y?~G0L1+4ao+2zBMDhV8(Zy zs9jJM;i1b#8|eFWX5jlZkzT;$yA>Hs-9@TlV}HnOJ1oZNlrPs~NvO1_L8|$YyGdSn z_nuaernKg5jTh{|4pgFD<7Mr|qTZ-Cv3 AM;lY7bCfq46g PUXx76087)uraoHE9duP^KX1CFWYF9!|)!I5D{{}l)|A8F^d%i(n zse6NTFB{AqiE~uL(UuO9q$B}^- _Y;L;TeWn%hAZ+ z`|{g@4gDB`)nJ(89REyZY0%dvx_t2yg(7FU2--K{7NCWlUr`<)rd=Yhx -3^~ zIpgb`SQu(-=_!7}#W;s@e43JD`z(Wcsq>NDOu435=QC%V2CY~-o#-_2YEzdaiAnNk zuMfCG^G-r&U^k$9Wh63%>S=BIUq^;L|1U`6rHk*4O1!M{cAi@to84azLis)-DSL{Z z8b8+ROF!n# b}1S`blwzDP?hvJ0WZHAUM>B zXv&u-9HCt8;iv;xJkz@H>i!R?xaKhNbvqC0sX7dP!wj4;t$?| FM|nLS9nl!LZ*NUT-tDRe(cpPD_8oijlepP=i^}*YRMwIQ3@?+(i-&O( zN@#W>FVB?NF-Qr}+5ZbN&{KUwon+$aM>XFQA9JSzk=BV@(bg7}{e=t|`~LwM$Z`S5 z5YxY5kMZj_DD*w2da-hO!mrbHW3;j8^M>0u%1f)Bh}iO#;)Gohzx(9~BS9?Jj_Km@ zBHZfnV+^IH9IjX=9yzahyYL~S>buX=pGJ?<2Iwa*8p!=v1w!4iu`ux6oTct(8D?0C zQj6U%f}gXi%k`3c1(lqQMSv#T4KYjr=S!MWdC1O810_c@7sc;}-PnDN-{f!p!34B5 zfNh#u%JCjtv@K~Q#?H4x2%ZN&Y9fvMN+EIonG0`WtPi1j!eMSnnXR0;dBb8iVi?tD z^vT(4*G&-OM%sT&H+*G#n~hj$7{>lQQ9=Tw94j3{!p`UGgruT+dU_;2NlJApMO8^f zRZ&ZhM*eU#|7sA`b0ZqHL9Cm(tx?weFEgwDspvr!ZgEsHvd#lj&w&X#wVu|Mj&OW* z|A#byeVLPF@(`5hq;i`@tM2RXlRR?h>LddH9MowD)u4}V;NFrbB$)r3bdc_ {0 zC|>+CJWJvN>onCe&Z xw7-S#Gfr3E%NbA3thl$#M 4NYO;^g97$o!GC+b&uA82%e*W^Yv{T3|`aw0`M8wE;K))U}55?%tOE>~gs zgAMWp|0;yZt*Xt0Tb{sajb}d)Ce1Rdsm3lktUaNTq cXA@CVGqizb@mf9x5H;Y`pm^EVQ7l2{I)fi|lD7dVCB9!1=-mp1}Oa`4Ugy z{ZF0-@)~^$)r;bRh|_sIlT7 xg^*YlXeD2ur-n+oMf06-) zj7*8j>%8WQbuKLvi^@@gl1JgOKBo|!QFF3_b5A(sCuNmLFYuD3vbYZ>yI^8rnIEoR z4&5WL*RPqp^k8?@rTs9^YvcW ^A}zT!9(|@ L ztv#V`e`5CJ)f3J
|QH$QMx(_{D^!%&1b} z$w>Jt!LDz-^>mfVbU(tD29XA{EgE|OW*dBd_NIun&c^cuw289he(BEd`02E_2D{$7 z8OSQhdpGp}(7){OtKGWYoEwAE +0Y3nj20zE@Rva zN&rVu`vBl5%KXmu6t_={bf}LN*fFOo* *@Lvb z2*BPgTV3uwU81Vzf8_nix;e+O(LJ{8Wo^;kUsJsszccXA{aV2@A!??J+u8Z{#*NLd z|Bt(}{u+^|`#S3HFC|M<&41m3keNozOSvzW*WR};cR CV1q`)Dl%3}6wqy1L ztZI^W=e5HdXzInd@c;(J=u_5X>)Y>$8ZG;KnCBR)*mhBwzDfOdAG4c!!2mwm`L0^e zdl`As=|bNdtQmK~Y_m1zLOKpUu7_O~bFsID`G|u ZTA-8;^x%wf5vo8_H`JC*k4()^vC&nN9n zR!Pdqb9Y%c0_Z{Rfxy8ryE%Q1P15|cVCy}C7Ms@_3Ip!8%@wzmICAe?c$=iv{eV2| z- ~`_-ND~kH*(B*i_KSboiMe0Y(wu21nVip0=429YgH>id+1d%sXk%4wxRP* z_r~cikkYXJAPtP=k4=B`aq^yT#%A%jNTwoZYoo7Jnlsqh2`OwZI{&iRK}W~-<+Lne zt%|>pv#$pxnQ>5Mt1;^?8D#yh_o3mGOzM#_QT2Wu6NMcry?~0G%X8=RJ877 =T zLK6wJnJ3kN@vf&zG3|~DrhU0)>|FpoXaF*KOtZ4S4)f5&N=X)~O%$v!77q&iN%=i? z$c)J}aX8U1V~;pWKM$b3N
v|UM(f!I@`oX;qCuiwAoT`|g@x%8bmS-;mV`_+v`@e7D+kZ*2n z&bga2K?$(=^vPRUFC_$z!q(pqT3IO_6+4OUUC1q_`2j!s8;#WYfu4PxyG_9t{x{dS ztEmoV9zV37-B1m2P-L?YM{py4&6#OQp~?q!_Gz}l&zI5PO)y@-J#aOp193T~yoUo7 z4+5GRR-z|jI@hiwgK>n-A7BO|sJ=Y!*$E~xfTITnfh2<%82I02UEyscp2IB^zu)rJ zQPEVJvjKTV!{|J0yn45;#NBbjYyGjMN&+&9cfUms+7|5Yii+0w>T sIWwnFKsNp{!mOYZ%)cLnbLtl}Hba}A;rgM(z1 zDIeuh5tN4HH>O)lAlImviP9-FD4ywf`*uCvQ>>)JA;lSv&@y0P2&~f0k4`H Ta8%G86N6cr<<`xz%&t9<6*S)we z{*WOjZ`$eqdE}vnb)C1f9FNOBkhZ8queP|0 w16!kDhAuy3OS91;9#S9d)zKr(e?y;yv zH#$M?p#q+)q?^Xc8nx{|MV7$5j~3{yCdiUbLQJCK^4TBD?d4;}FJZXs9Sg#~zW9?^ z7}o4Tn@|c{t=kW9#ii2$-op9oK{p2u6odMdiH~Zv$)ktMZDcosrbDR=CtE{Xj>r)R zJsoox?F%aK0W*5@ntfZ_Y=guGF|>W4l5f2!g>s`Ze-jsZbg5O+)|(Cx}0`ABC69hD5MIhDL#d8V*8rB!7l0W8XFgsEv zIdka@dWDvO!NS{NQae~eS~?hSE1!x%m%fz$$nU+G3Vy6h%k_de;b4@pqlU#W<)DwU z{9z#q4yT6w-mC?FaklhYB^wq+QWp56ihLD^?*d2g$7@l=T8@CLk1l~{B4h<;{=j$` zg5pDfhVs+^gYs!)dsP-LWBDA2*0kmW>>ji=HA|I0VO;AQ{w{L1{KQjY_gfVb~_LTbA2F zN~j>@u)2vVS4#tS#jO+0_+mj0ied*u^h||nfxIU&Bm!|`V`FdgR7J#RtC+H^J#z`3 zqXgUoiMr;!Gp9xYxlb)HVGDUDkoZJDjM&$|7%qV4C^4Mex($0s-aV3K=Q*Q>Lwr!x zS1RkbiJSBs)ypzKV6w{MxQ()6o5 l(c%6K_;m#-$l>Dc$Aq3o1{nMmDfrZZ zjf8Q5DTI|M^bHaFzXqPYso}`GRHJ^3)$(vkGx=SA+)ymG$MU1&`XNs&O&V1;lYvCG zQNVxi>)XLx5cM5odx7#5q;Hrs&6 &*u`ng-3@1t>1pd$s-8UKb*jtKYu| zUC5%)ZI2UCnsH|IVdxyD hdI1i$Ei zq)G?-4R9$}zl1z{VDSO;lJ|{nL}Vn^MB&ZaL*N8YCyPPU)bgp(BO_RnTGD5j`d=Fc z6MICTt>#cZ#T^QalgBW8`l;i+Vk#HT4ev^AdvYSu@o(%Cr2m`UJD>ZjNVX4I`vpW2 zZ?ev_+Zd-7=LtX7J4ql#c8Oi7YN-$WQ!FJAeO{sy-YfV=OVyUi+IEtD`;}FkVdh?f zeP*-I93i!Nx^`W1<;`h;3%T >0j@jK5z!4uZE_#Yn_{qA-!B)mK`(SA=INC5Uv zVAYONg35jmnA^D8*;3;r#$l<+o%d=1wluMySWb5&6|j~M!Nx9>t0pj3>BPj7DYC4s z+OBFKw yzU`%YQaZrpT(>Pkh?2}yGVhOK+T%;HRi9sK7L~%GjH_xGnFoR@f-Q|wn_=n zgm+JAm61q`TQ18mGa4?0&&y=iy3lws7HR&LqNF67drV1bP0A$Csg9hGv8rc6y}xet z349#4dVT%>Y%LK#yh7c+@>!)J-KI|LN4?_s4=Jn7agQlYgstAN0TE1JR1@Ifd!AF` zGUYwkr=D^&c3H*WpkvqBemv;d{!*VEy22V1O%U@8O}Y_pD7>%9^&LoIbYX#SvQ zW7ds-+kFGH^)p-fGbkXN6}{6cQn)aPs7PYkvcOGlqN&5Hz`g-QYai$p!F&3PK@a&* z{`@9-`Au=SoMZ`V0$n6_c+`x`2I^L%mFk^zxS+?c8vRIL X1In48r)S94L~V;8q6yKe%U|Pz+!w1TJ@hTvuG6#s8F^-u^L5lRyO2sGamfh+ zBUbDfov2np-TMJVKU8hf_8tLyqC7fZ@@jd*W&g_$Na^^ycT1;rN%9^ijl=f_ - z+?pMfzP`k|erJ870al+%Z>qG-sA{>))ilRp_b61moU#GdLV))Aw{Oh;KW^@=2ujjN Vg0J5KTg^U@6q6Gz5!UzlzX01)R!sl^ literal 0 HcmV?d00001 diff --git a/DocAssets/DownloadRelease1.png b/DocAssets/DownloadRelease1.png new file mode 100644 index 0000000000000000000000000000000000000000..26151befdc4ece65ec4c13f041b6d77d6f1f3eb3 GIT binary patch literal 16250 zcmd732UL?=*Di`%1rd=gs2~UtrEH~17cd|y0s`WuV+g497CMm@*r1@&dz0Q<=mZjq zh|+5)p@o3d5J;qkP)~^8f4={}_nbTKIb)o0uVWw~?|fI8Ypyw;^~||Gy?mj{e3A1a z9UUFBy4q76I=ZuX>gSyc^wj@_TWkKH{yO8PqxzT*-hcD-$vJCfEoC~o%1EZeH|ME; zGdimoyV22IZae)s)8SNTK}V;=qW)A_@15y7mg$S$VlwHVVE=j0pcJ-~|NR3gsgEh* zoXVWa&~}SQf3){luuA`$aH-<19@zbr?5H_?(7TrmT)xRR&*%3g`9bpc-r3hbzh|1W z1t~1OJ(mLFYv*!z`=s1Kzfa$nhqq57dtnX?%HVK#^EEx?ljgk&Vu^v+RPrIg4_A9T zM%~a%#C73g7zrQUFB2X3h3C`mQ+`g5sk6}^8=hAi2wJsk2A1q%c#dy;+iJqg9pFy& zK-Vb|6y_rHcok;F8Gg=7Vh>bc6$Azdr%b%o1`nBUTEnC|gfpVW&D)dSd4DIytG9Ys zb+1k6OrmcW^f|z JT`~-&zQMI6BSdx^0Zi`?d!l+`9;s3_R#My!-Fhc zv5wVtte3hwyk>J;N$4xiJYO$(TOcRY=Gj2x^EZZxQnK38OiroYU&81oY=`sJL7>zI zmGkJkz!>(fjrB$EW!6`{>yD!p#2}>DBE~1n__XP-=R1QTs>?@J8IkwcE(ckras J|UO4S)`+^1xD>!n)D`l+Rz z!meD31aFH*#Lc_XJ<0Z312)dwN-!iN9?RM%E&F}C{9_;XScsWx O(SJ~Nn6iAKpG8sO} zOqGcyw^hp0bjI1@;U61#CmCB!BGYV4F*ZCVW)I?)1>(%uXSA1V<1$W7m`?Q4MgVsl z%Pbb6_%OULmD^kMQCNt_k@;qWOojc4qoXKMT>0p>WJVW5r=`I6{tPkn2;V$vi*It& z5%O_{y-9lsvI1xlv^lIL=qCuJ)kvi@*psZTa0;T?&Zw2lu55@T?Au@ zOkt`e*GONLf+9x&9Eeir#i=Z5YxF3C 0dfq$IK@uryd;X0AE7OW% z6gyv$vk_+A*ND7am2uiQ-2;+s{_f&gBnwV42}*rxLyCBo1B_Pte$IofKSzF5eq{>F zCha1jWcEUqM?xbxI+{+wviqu>EkyZ62<6>YWU@5g#OaeUT9jxNo6N-E4(Mdk!b@({ zy3ZuyR3kTdfj39=pTP`H`}+EE;_FI&vs6+DXwdJLl6f&!>!{J7JQMQVEOv&ilJf8! ztl_c_=1=dn@i*Y!k74Hw{dQiZCNJR&eS7LMg_xI{rA>MeF$d13ak=h(_4-&u;c&|3 z)0WvU1Nv)y*~!jKNR|aoS-&)y#Wp1UJ1p^u-=F9mU&TUu*WSK(ws2BvGF3(I(jK^E zQ+&c2LR*0!$7jw@P64l%O54~|eyyL~f1qowWl8MYJZ&~$tCczbMKU@Q{tq@}&)FV% zmwiy{C8nT}(5)+y?1MxF|8#>FEZ^3}3WO8bZ>1-*Tz7=XE`mm+OAm-^liBb$w7nCc z=R07p^z>DA9yd=}(X=Kw+27#>OUm+=t0Zfzxx`g8Do@ai6xqPC%f!?q+ud(Nx$XfN zVLbJ_bOBj|YaEwXUZse;X^wAC=r)|e?_d8_*jJJq7ahgJjkz gfI20%_){X*GkVny$_%zuu27PEOos=aG2F% <%ZHMI;u}fVShDp;`-$kfmo}0IiS#EWD~ddooSAMt2$T{S}VaeUvGN9u+-A< zUW5PHM)Rb2sA+CrZ}9dY;+m&SXmb-y&SWo;BL( 1470UnrN~H7Nk01OJM`r Ly>Y|4dYdSQJ}7±~obcsHCXXg2{Lw@dNz*E#hCo1)R+r570 zy7Ar_N#KTpS3#F1lW5`({}_JW%^W~%q`yVJrf|21P*rH~dQ6Nu#P-)VN8su71DKe3 zfy~54+bm6);a%W~C=TcLt@m0tKoq44uK*1J*6S3%1Q79+?tTnZac5rM+{khN_{I1i zR+FOTPDc#J2>bG6wk{E~TN%$|(AL;P!z$vk!a^;ub#G@9Sgz4GP_pm>0k%jHKHhTb zbW1gh#n=b=&A<+%y(oCGE*(Tj?d)ZWfBJ-Qc{7+xVW4N=FuwH5VqH(-qA~cyI*}pN zG9#*dwW`Rvg|$?I{f>XbF}u!Id;09n19GRm0*n{8_hkx}5TAfI isaLZjwd%-N@+d@P(>o-2$)Izmq#Of&oA0*|+7yc{O|VzeyXOVosXD1W z(!r$*u_?KKvT^eA=riO=^so1i@69maLwl>uzz9({38HbfiHHBhA^j}=VVu=I6l*xT zGn`v-P`HNi%eKm(HdcN_K=7^D;zR{Opv9-40^n05wyG%Bx_7fiy9akdxZ{ecmCTbW z*IgyI2pkZm_^p3xHheehHO>{8J&IH=k2}Bs#YUAbuM(j3qv|ViHd-{TXL0!P9-(~} zxRmyz4?!{e?HOjPo}8t&n+=iRyC1CJN8x2vS*94E&=hX4&OMq%wB8s} _?uc7v`Wuh}8GqYtKEwO?GakfS|1 znUlL{xam)*DjL 0`-r)u|vRiv~?TYnieW<9bTbHle z@w`7yxJ1!*b +V|^I}d|B(_WFw3KkK9 zeZkom8;+d(?>RN^GZ~W&5nYy*A#p9dCwom=I=CW{pBf8d$BUL;O-o*ssgqsR%0ES} z4X;00 j=z+64&9%6H_pY buD;VP1_11~Tvo6v zpZ@XMVqcJ8COz92_2;t>G>%R)i`5o8k))(r*Y#x0r^T2()P;kOq`j6@VK*COKAy-n zy!qjuNIKpYk(=bzdADJ?*>$otwYk>fZwzPjWOSG6Y{r 011_6&aP-Ik#z z-@iM$^%{OFS7Vdg8@WDF&?4}xHHmSFL|6 caS zedyR1xttTNOW(+VD8QOX{9S-+kNTy3T11apeCDJEH6Mnum Kb54^ko=ie_xAo?9Mw zA1wN`yaU6UC@Nm3;b=6Y{JP(gFS!f6xvA@2x3f8@bol($+TgAdV?V+Nap+C9-`wvx z5%za!yEMhjo8J$7CjzbWwMvsC5iyInZ6KcNT%bqm0$xY8+?(hvvF;wLqbIVHq0u-e zcmn%&QuWG+I{CvR38=5kwiJ1wTYoEMp_7Dt%X)X wudUrceC4oJ&ml|v^EYI1xtb$&%4Qj~3o*?wda{Le?KrF5y^E7o2We-S zNWBRR10;&2sp4W1kMSj&;lCoc*KnOD Xw#$lfsejQ9)?gL4cM7n zct%Qcw=i*W`J|bauYI1QxowBUMnheEZAtF0|B^C6)U5amwdHiM4xVB$6SWKY&cYnk z)sSl=I~>64r+O0Qd+%=XCD?JjZid9M^Cwo7%%6E`?Dc FqD~?k0 3G zpZ@cnZ%Xb9` ! z{F2D)H{uD!1i-3x-XER6MN{~rB^!ZZhx{8_)sr?d_nsg jj%< z!=?Gjjy0U|yx@*Z``=6O$aCnwe+gh!{rzR9V#?^Vt)M2a^IWtE{SN`Rt;~Fo )%pBjM;+Uu8Y$U^yy&5V%cj-N(Y|jdF5XQy5=MDKVgX7m z%2aH}j9(?jcqR5HviR@aiAhWpV^)oPjxeTK%8FTv#FR$RMPJSdru%LQEixwYasx{22B=j zq2gT+jjHlj#p(V%B7Cu{CN7JzN`DD0k94)G9!!btO{2NBJNNrk*HdOW6bQNUJj)q; zEeeS<0``V_^&cvZkFf+f$d#hwx-|#qlKYubmURr8(kXVH9^dpz?gAziv^ %sNl>4QbPCl_De!MaV0!{4+{0p02do#ilS6BL_N2fv|hP_4@3Wn zY9Fk1m^S1UA~h=uG&nwp+##c?t)Co1#db+xe-@do#Y^bGD8 9R)}WZ2Ig7spA8HQzVe%{8u5Xr(yC*1%CuFQY$G4~_Kpo6N45&k{w( zh9b2PeIrU=6R1j;bJnD5gjf<=^_imnc-OMZISYbmuRrE4 V$Iz6e$M=jlZ(`U29>{wGY-L=wDuElL ~7Pc}U15c3xmO zY-?4NGNS|(rEa-#v=>;`W~=#iM fM*936>yucW3_BA) z${*3}f#%*|>ha>yy;wnwBB|%P#t-yzF96zH^*qN$x~98llr20zsA*|!LUt^fNS+v1 zgkHA{g;At9ry~ ECMcd*U`>pHxnJ%3&F*fp`5e;A zy@nI=KZI8erIoLKXo9pfclV?$bdAHpbsD<;;iiV~Y`WOcdX=4ue8N!?gl7^|u3#9x zPW=b(udlruR~nPtyyKOu*2D D#^0@HeH;U5Bv*`FHZD-@E{ZM0h4KQZEJt6DM)Mt>!37pLeLr|pVejw%!A zOI7GJ*tRM%X7?|g{wKu|Z6qUip*nV1Lq$E!;Svy(<+bIu1a*e@5=V>EUOD#lFajTR z=Z*kcmdjw}8()_OU3_+*JE|9rzu6-qf0{kI8J{+~gv9C~;aq-K(2^p%vkx3UPyzV| z9?nEVdF&xjzni!TZj(MIC_CG{mF_{%5 5Go|#&OR#B(8w{ zH{}J7@3A6#<{w|(uHe}I6?z;O|J+z3wx<5aoNYq>uM>I `}O-}sngxZ*R(DI*=rpV{BS(f z2?TI*T6}lX;>lg=1Lb=5dsMytRF~}(%k48w|8+QF;VMu#_&dV1AeP&(9Qd$U#bBFl z#N*+9iq6E6PhgUtuHs+XK@F+3{p}t>QHrcw8Ms^K7dtxF{k;pQ;ZN|O*|cxa1F1zG z^4m#*tvA(TIM(51+C46geWq7e-zt(SbLSBZGvo?)q!Z@z()(BFwgahVc0zvorY~Gy zkt3to;JIVZA>I67TelM1L2tH7Np9y&ABR8Zs6!9)bn1%WX62N$e~-$Zy59Po!HhZa zp!CBN8x>grkp`7}8mqYxFa2AG;Y7=D=AdKjN+QAU3Lu9Fi{wPqGhn3EVkda~rC$%C z?(nlU&u5uLLaV#pziRVovKsXCGvkxpAvc^gl?@J!Qv74z`GKG7L0w9pj-qwMG^Jsn zr#4<=+93KvJZ9oQ=BIbav0jBrm!7MAo^ps9HV2PdfB)v`bVTA}nuZhhjo3cVTYX2> z;4J@eE0y-WpRwMNRZ?P+g3}fnMa{4@icyG?1@SCzFDXzD$HR@3sj5ns=+a%Rn^5XP zmmobLJ0#o7sZ6T->pu#|v-J#?wSGp1zH8#5Cj8VKlOy;ubem=J?+MD&+L3 }o*@aSeWT$Ng zxbri%N)r7OvQrOiSiRpKz6N1W;g$u%I!`$Z R`jXW197JT(?rMYJcfW+IIUS{ySH3 zd|!Y@{?l39{NFih{7T=xlHyOf=6b{|`+P1*9HQkkWnY&xxt4I+8{OGCAfBU+a55Z@ z9(2~LOTGmkb>99+1;l2>_Cn>c+QJ99Q#5oPaC`-=T3F#6)_6c9S*rG32c`Er`ND!4 zkCwRVYSS`lR5!;3USQuT;HV>-9C nCsoNR(}?@lN$vu-)P-gyVK6s1bX(Hf0&8=<=FlZNr|YnnhC0Zl*d& z(SN8LYBBk9k+w)VQ$MO^iBq}LBF3j+k>r10oqvrzXSrVWx~6C7SGo&$ThH}uf`jc} zEJ`c0Hf>jAm&@YOwUHXhRLokev5;BjllM2kI)K+m=m(}zY==OM6-DGnHX%}ce9CH8 z@7$putlKb^lRn6L G zCCaCz+iF5}9DuuWIWaZY!#+N> (sAf#!&z5gvf9q`uzIy} z7hoq7!Pgu%X^4L*(P~{sjvFN=fATpj-0xWo0mO@rD)ylIXS$rPmQ{zxUOMEJU>K;Y z#|ifGy0j86;eZ)Gi9Na=y(*%Ew2JSoC9GPQm%FVhW*HnLIBqVmiA_O+`J3n+7t6 XGMSSl_<%(as9xAh#cg7>6T wA41H&)vF{FfSd!9rp@O2A3GcZi@NL}X~JX+QRI>KFw zffD!Q2uVT|ev(E33#JZ)LZ$DFqVq8o;>H8-slJ_g6@p{O$zsT*2k5Uh5C7ukm*m5V zoYJ4_%*bngF?#T!%ym?UVP|)$nA?=epkrx-M}~hD1YX*FK<_s4I(f@5<(EUG?3-y5 zj207@)_o{=(`=luODJh9RZkCF$NUvva=5(eQ5HizFx3;hAE(^g)}RyP#)Ml?O HfJ3m2;< NYhHj?&Gt zU+Mee-{iC-y9?_$RH%R6-rjtnFup$lA2U#Y%8caRx1BMGRt{IeTwi^svHO3;b~R-` z|5@rAP!I2opLp_a+{97qEt6+*-2Obdag-#@Gk#MZGGJOHa`)QQeIi`w`26?3CyX88 zQzCf; 5LEg lsocRG^^vtQYHhxB`ARiWjV^w0T{LZ+ c9qUuds|jV1Xr__?Zp$))ajuI`Kri>?V%Tpk_YjV zkUv)3eZT(>vwNmoNaXj5 {;PKmM z*wFFEfkG``;uvF_a2-u1?fvQZ&{euG>>t!%8w;LKeBLwK$yV8~sKvT!o-MRb6HRHF zK6NaZ_Z^;sZ%`f`AVQg!{kkt^tRQFrbamB$isu&Qak^iuGYQ0EtSzd!L#cr5!Gf3H zch@iz%InD|ui9mpkhbi5P|X)f^?>4GC)v~Jdn*%+?cwBNMJBPdrT6I!v-0FX`kNN6 z7dcG- Z?{YbLEvGx& z-KPCgcB+jf9fZ=8Z!<^5qTxG}Wu|~HON!759Yo(3Z9ttt^B6c1k~*Yqze%^O?twl2 z$E$Kcy^)v&R^9WkRS~MSZ)BXUgm32eBAa`6)oe ZXu48J-ONHTo z`t(iirij$_p!}s%6`w*LyHp;oCMv}uaK3HapK2<~-BNiw-kO ~PEby)g9E|s2f1%B?#W}z*F4*F zYc@B|@W`KnnXqSxU7Odg*{%Wu^la2S{*rvDK}-FP`wTwO4lePdfv|zVq3M_xzqwJ1 zYe>{7VxkKOyYs)05`VTXG#&v^So)1vCUW2Xd^!^g6WvIsQLvBv-)WzAOXZy&{O@Gm zXMy-TQYV{23;SG nk#gWR5mG@Te(6d zh+Fh92Bv};M!V_=Sz7l;cXA_NzM13jB4cqq5!9u4n1 WZtns=F3CwKh*USvhx zM3@MadZ}8KF^_iFLZ()t5${lx2}I91zn@?4kI!QsS^=!0m_Hjd-x E%hJA?J<@Jx5@zj&I+AP76^HkN)8`V09Q8Q5R0`E}CFrKF~Nd1dB6V z?Nru`6|uHHaZ5i^ak@l?$YwiTX?(dJ91wjgx4`% Y)>=O55%;Zm5HzZ7LX l|iwU=6)_e32aK` zBJM;BdY^PtOxfW8g#B{Q#@X9HmL6{S(fe@Ao6Pc3IiLB!4FBRO0oTJH8o9RR$wOm1 zmWJnre88a!u#Oiu5SrzJhm!A_$`|+Gc6XCR(3vOw-f0-Qm;4N}2IrOLFCsFgsO(w5 zR^R`hQIm7w{|q%1{~I+$+5SJECUKrpD!byw-?HF`cb{vqC)9fSbH(*l%4Bk>vv+f3(n_kEVmpfr-mBHAAk55;7yIP7)t$Juj{B5=ob0G%Eq p>ohzIsw15eXim+&j&90`O8GIr<1S=F)jpA{_wOLfely!| z)xeqeE^c615eKQ(X^$@d)+3gAzW++1VeZ| Y2|dK;MtmG|YHimuw1keD_S#_JpfE~LDa%Y}?Eq!UL2ft4np{1f?Rh?D-GnnzS* z#q0JT$m#|Tn6$MG#eT}TqwngAc_Zs|2`_J@uH56ZODNZytP6fsz2nO`*FcU6imF%DEs(2?iXJ?>rBCRC^Q^}Id0vEg 0?e+^`r>`^c>@nBS!U9eS5Q-4Rx-c8p*`0@nNj4WUCW+@OjCb zrgsz7b$K%7?%ox0njmZJT18x6#WK-mb;{%6-b2TYUG0=e=mydJ>lWVyFciJc`ve)$ ziiR)mnsoI;AB?f$LXN)#?Xli++IS)X@n2y&b$wxfu=lK8j7B!yxfyC|aL-aiD|_9u z4I`{IcOo+RtE$w@Q0SU{px}U5%Sf5_vkqKG`bz+5QgPNJZxI=NiAwlNW#Wztpea$X zw9|Y@?osazgysG1H|CSsH*1 xz@eGw$}J1S zT#~!4U>NV143Ht8R|%6l>77u>%Nj_c%z!tjX6F3QP=ZBK{88n`)SX#S`LKEray{5o zq$)cj6FxtLiR+fZfWc%fO6Ei6CCHdO7l!$ )#_`{1HNrX?P)e(FS-Mr1nQE>ALaQBn4xqYd f4hcCyjLqbZzFAfhkB0oaSa{fA* z4nc1#F~u&@Fb=6UZx!-UDn+vVXSPgGq(O8h27+o9i%H!-m_Ad^)uy5b$fD*FCA>DT zBI3R%COfx>u}t{2ZU1AV% TVp>oMUlL*Tbv>lGqQvd?)ZsdTe`*CezzP zOSy67W`C(2z7pu^=dH n>B@q-=U_8?P&p1&Ww!b6faR$M}8W5qVG$Lo+qwKn+S+lteS$#l>q?8x-bB zOsQk}#9LJ3fnhcN$%4RD_MUPWMe-C3Oh>CRIa2Dd6Kom1uml@2MXvnP{Y#nTk~!)S z1DGC{8@8l@8v~i!^0Po^k#-IjcsR4pfGL)KlLzzuWUW8;CkEeTNUf!a4(~U9BRUKc z*A2Ti{E9m8>}9@R7`je<;va6w!e)O*=g*u~`;g$CX*PNLxIXSfda%pkkG%s7RU&{X z(TBx*#h(e&{L6V0vSr L@VgFVCu6=nRr(6_YHJpZH*dC`5( SaJes6bfaUEKoo4h=0ys7WSUN%q-L)4bImQ`2?%`G@m*4nNTY0OJ0t z*+Vujp5AV-(oZ)wd|f;^^1zS{9G`qodgo(NO_Gt$ZT4`0*oP11)0|YT(tT~nH6N@E z^+^E@0`8C66i>wOW;scZE)@^!8S3SNvWIwLHTz22M{deZm^fKUnvaCgu;thD_{K|k z>ROz(@&84N|KGI)+k6) {@zaUW<(}omCck|6cY6d%4JnUu;2^E6#1V sBWe)Pdg&(x9sho42&b-{ipqRm$KjPqk%22)i2fv7zK&izJA*gaEB~Si{;N}2 zC0r3=_q`?+39I)s)0TpLJ4abjW$zADiLct;kL*${H~uT}uvPeO@&okgJZ4=^VzmZaw|#bZ(D=8!c9AsAWr&5+%wnP}=ske~qHW`~T*;9G~o2LoFDR zd_5BE?l%j{Dw4GJ4sq1?!s;|^%=etuG`Md6x-!wy@?ysSM2SyKR(r|RyU1i?PAIP; z^W}^mnN0i`5Md}LEF5Q3ql!e*;~Y;(FS;ntWlJ@vp$jBFPE!_|t3e7Bos8n4mSSkC z4M>;xKEOb~guCTwTMgfn)VEu`qI)OXymP13>67`O)5*5=ddV29$v%Wi|6_8Sa-bhE z&M*qV)D|?x#l>aO#^OI)cTTEvd2v}?!z~s>J3Ms;{FmH!t%gUU`pW+IUsMwY8x8!6 zL4UTG ~GKKD*!3@=o1UninXZDRgQx84}gyJZ$;PBW_zfv?AfJFT<(z z+xah%Y=0mllrfOC$v{&SG!iuRI{~#lejkW{(Q1O}o}6xem}#@$ASfx=F%LY=&_g0b z?rcx*-#FC=-K8Iem+*2_3mhI+$kom`KI64K+iJuP JUwf3P9Aob8;GL8XQu=*t%*t#)0F?IUSRD9Q zoq)8L??_VzQ Z>PU2w2r+EH}9+cfE}jvu(f9p#JwGisuH|ug7gxng5vX}mJ@($ zSE=zXaAjtc>3Vl}s#ART4-H5Bp=zJJHZ|9_Jzim9K0|eqRBFGII+HYTT1@KHfvW%f z&aC=+;>nxFJYVX<+#($kGxbcoi%zRY(s3970pGAAN$ZN^vxzLQ;PdBpjY!HoPisE+ zfJeLL9XYEP!_}sS=|z7Snwx}s?6~N*u}ceb>GFZW8_+yx4MOA1n=Idj;>hkUwleg{ zxDCekzP}^6q|V(GQ`E2}8sAMwm<)iuHcJC9U%Pts`4oN_jm55y(YoxfOw>%1p*pm- zIC^>Jz*n5lYu!t$B0kBmwP`9$zM$W_asM6&tsp R2BZq*~?=}Tb-9Mqfm z^?fr1 EYi`9 zOyWGf#nn0P!mbWVg=L{r>!Jux=0`}EdEx}fc6DfU*Cs=?)r6O$vi7Bw;=)3;7a8(* zt^2>Y*wco8<5xh@Gu=M;izGYgMbMZ>nCpLc%ivJ&h%XLs+3I9*c@&CkaunE-`Dk-% zi%K#1lLtw8)EbyHF(IMY3AcL|`wUiU+R((C<1N~-V|1t=vcBZow?EwAJaU%5sexNL z{XIk?@m_zKgN-`*xj_7Ls>gD74_i}qI)9!L6B{ce(x(NXx%*o|{XGfWf6EB~*Ty%j zxZt(deCxN3fFbF>&*^iVJG{V2?%FaO5cs!3`ooPku0<=&-eEi?%Y$w- kS_ehQV)D^|caIN&6%F~+rs&)naWc$ $9i)B&oH4PbHMz ?e=6%wx)iSN zG~Ch~{*m5%Xq~$fIO8GeYj{{SGXgOL=hH^6rc#}gu+;fI6CUWbg;+x0%6R5rsngDL zlO4bM8Bs8mNlaYx+msbM> =ZA0t!{TC4YLK(dQYDJ-ka=fO_Ssds-5d}xh>xCzg@p_?&BtS-11 z=*?&M)WNhb_tJ;$*j)xF_To)Rfbf1Q_3oRK%D> ;rb*q!Ad>kq8)EW}%vH_+7&I>+^pmzd%^E1Mrz06<$0Fmtp zvb%GDrZNt3E)MKSA`4#8-Tne*^9?q{Esb1;Z+bP-r|w;oi24-jt>}jS$eh&?!9DgP ztW(YTzuXiA?m}!H%QC%E?j&-Lw7mhEz*3!*$-LN%9vBT;%{DHdMJ8~YLApaArz2o7 zEDwOVdTH~qit}R6Z5JwbP78R%PHKJW9Y`Dw59!shvJm*%pDx0$rG=i+<&$dw$}8eZ zM-JYKssf7G<8M|AbUgJ0Af*EiDtIoh!;FP0&w~p-|27?Vdge&j>Jy|vy$Y7W70`V& zLhr6?byCQ-y>#*Ux6eV7t4I*1pQK@4u)A zlX@1y+#nHSPw@+ypQq(^>z!@hT{3)7Nb4JGRRCeT?6FE76?hA6WX=(IxTF?BL3JM5 z+R7D{NZfYg-Hp-6Ev(hO=#!1UhG#v t-*G(qg7c`arXQq>C=m+HH*_Eu3G;Z0HSN 88Q zu9B)CKsk5i{rH17|H~cU*`Qi>mPx;!kj Lp($D8f-7B1JPrjBOLO z&>5{$eOQO(Ws~4EDbPw4pd$ArgKKI94Nx!65p&A43Ftn-FsUfQ6v1eUq3FPx*i&dq zHwg$V %_av~>&I4Y zYqSg2Z*ig-Lg#m*iQWTi7*2Vox8C;|^W{snT1)@Ox2uC>+)_vSlsub^uhlS i;C}-@>B4XT literal 0 HcmV?d00001 diff --git a/DocAssets/ExamplePluginInfo1.png b/DocAssets/ExamplePluginInfo1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae25f45b7ddad4b63c628f292ef72dab8592cde6 GIT binary patch literal 43967 zcmd?PbySpL+%~A9pdcV2AgOc@-64oH(j7x1-3 L$Y5iVVm^5A09#I0O6|b|G`0s1 z9+5spNBxJ5B)16l>!GWfjO2sL5%S-to5xlXN)itq)Wl+4n><0?KXa1Rb$##vr|16X zA;huR{K11V4LK QJgZE12g-YI2+1J%B-cuZ3 z19fM68Olr^JbAa_opd8c22!4Tp;AeDHlWRa_cYB}XBhn?5{q$-ZIA-v4c?Sf#-~># z;Z2N+cjDVqB?s`-N;o|8Aji_H>yM)L^zTxkqSn?cKX|&0gw+4T%SyRdgfAy2E+)tK zZ1m5?cGfx+0O;2S`o~;ib^f?0!g4OGet@(Z$*xWmnaPqU?|e|B^Sr{`i2kIWTKy8Q zc5Y%&1RoD|ecOyesyK>DDI&!2zsbm1jZE$SmX#32#ME1@A0n=|3DzpwJ+fG}CiHWr z91%X0Ob@s%YX0*B>u6ktcwm8o&VFjqnpugw{ser&nLFMkSA9&^DRL;1eo^|8_JhRD z?<$oSObJ0mlfh~bO(lrAB!%qDGQu4hnK68TKY?~o80spX=ODgvN6g#smz}zI)R%2a zG*!{G2E5L_LYu0acJo*Kob&_n`Up!e!xMcw0Gaq0u$|X>spj23OJ|=r#gkguuu@ml z%R;rj3p5G?==)QDiips_d=dWgbzu;}%ksHC&WCb}p=>^Sn z(7WT^-|=eGW1AhepZ=Akh~(jAJ8{LNm3fq`BSj7V?DNbR?tGh~@aO0vOJRxn6SUL+ zvgKlihYj?y`g-57xn7ec{dNtDuy-VWFiS!rKT(XNmC%KwJcyP+>!;N)^9;TcQJL<| z$$9NL6`k1M<#vnVVzbar6QmAs<1i&k^{5ApMJfs#h^w 5JWTZv5tSt?m=<9ooX8hw=r T& (Cbk2X339p6H4&1I$bDO zffiHv=7|$1ANCwA9JX3g@ z#uIjUr2b8Da;DnK9iF$|Cvy-|^C5flFCH6PTRLv>&!9uARZ;_&0l9h`cXZAYCB^7Z z>eJfx*d^)Ku5$x8YEx#V8-6jSP4Rmd32|J=D9?8g&v#74+LMJw626~YTh=n0TF$H@ ztaw<98ZttJj}|~$dwHeF#Ec`VeE#s(jZPEBtD0MAT!Uq wTM(9@FY6-(mvuudjF