WARNING: This repository has jokes in commit messages and source by developer(and a little contributor).
If you want to introduce an anti-cheat plugin with high detection rate, please do not use this plugin.
VERY WARNING: With this plugin, detectopm will run +4 timers at the same time.
In other words, it may consume a certain amount of RAM or CPU, so please use a server with specifications.
For more information on the number of threads, see Plugin Threads Summary.
Anti Cheat plugin for Bukkit / Spigot / PaperMC based server.
It has been confirmed to work with version 1.12.2.
This plugin is a Cheat Report Management / Cheat Detection Test plugin.
In the description of hack, the meaning of hacking (cracking) of the server itself is ambiguous, so it is written as cheat.
This document defines a simple markdown grammar to make it easy for users to understand.
WARNING: foo is not bar, please understand.
This represents information that all users should know.
This is message[CLICK]
This means that the messages within the code block will send to the Minecraft chat area.
IMPORTANT: foo, bar.
This means important items that the user should read.
- /foo <bar> [player]
This list a represents command and argmuents.
Argument enclosed in <>, it represents the necessary command, Enclosed in [] indicates an arbitrary command.
fooperm.bar
This block of code represents a permission.
WARNING: No authority group is described. Before referring to permissions, make sure you understand it.
- Download binary jar file from releases.
- Move / Copy plugin in the
plugins
directory.
for bash command:
$ curl -sL "https://github.com/peyang-Celeron/PeyangSuperbAntiCheat/releases/download/0.1a/PSAC.jar" -o (Your plugins dir)
- Execute this command. maven and curl and git required.
$ bash -c "$(curl -fsSL https://raw.githubusercontent.com/peyang-Celeron/PeyangSuperbAntiCheat/master/build)"
$ mv ProtocolLib.jar (Your plugins dir)
- Move / Copy the built plugin in the
plugins
directory.
$ mv PSACBuild/target/(PSAC jar file) (Your plugins dir)
- Start / Restart server.
/stop
or
$ java -jar server.jar
- Clone this repository.
$ git clone https://github.com/peyang-Celeron/PeyangSuperbAntiCheat.git PSACBuild
- enter repository root and build in Java environment with Maven (
mvn shade
is not needed).
$ cd PSACBuild && mvn package
$ mv ProtocolLib.jar (Your plugins dir)
- Move / Copy the built plugin in the
plugins
directory.
$ mv target/(PSAC jar file) (Your plugins dir)
- Start / Restart server.
/stop
or
$ java -jar server.jar
Commands are always assigned one or more premissions.
Other settings can be done using permissions.
Permission | Assigned Command | Description | Default Value | Permission Group |
---|---|---|---|---|
psac.member | group | This is a server member permission group. | true | none |
psac.report |
/report | This permission can execute report commands. Player deprived of this permission cannot report. | true | psac.member |
psac.report |
/psac help | This permission can view help for members of this plugin. | true | psac.member |
psac.notification |
none | This permission will receive broadcast messages when other players are kicked. | true | psac.member |
psac.regular |
none | This permission can visible sended regular messages. | true | psac.member |
psac.mod | group | This permission can kick or test the player. | op | none |
psac.kick |
/psac kick | This permission can kick player manually. | op | psac.mod |
psac.aurabot |
/aurabot | This permission can summon KillAura Test NPC. | op | psac.mod |
psac.aurapanic |
/acpanic | This permission can summon Panic NPC. | op | psac.mod |
psac.testkb |
/testkb | This permission can release invisible arrow to the player and check for knockback. | op | psac.mod |
psac.viewnpc |
none | This permission visible NPC other than the target player. | op | psac.mod |
psac.view |
/psac view | This permission can view report information. | op | psac.mod |
psac.show |
/psac show | This permission can view verbose report information. | op | psac.mod |
psac.bans |
/bans | This permission can view ban statics. | op | psac.mod |
psac.ntfadmin |
none | If the player calling the NPC has this permission, when that player detects a cheat, a message will be sent indicating the player's name. | op | psac.mod |
psac.reportntf |
none | Players with this permission can be notified when the player submits a report. | op | psac.mod |
psac.pull |
/pull | This permission can pull other players. | op | psac.mod |
psac.chattarget |
none | A mark will be added to the left of the chat for players with this permission. | op | psac.mod |
psac.mods |
none | This permission can see the mods that other players have introduced. | op | psac.mod |
psac.admin | group | This permission can use all commands of the plugin. | false | none |
psac.drop |
/psac drop | This permission can delete submitted report. | false | psac.admin |
psac.error |
none | This permission can get error information when the plugin encountered an internal error. | false | psac.admin |
This section are describe plugin commands.
- /peyangreport
- /pcr
- /rep
- /wdr
Send the content of the report selected and submitted by the player to the staff.
WARNING: It is not a command to automatically summon NPC.
The staff can see if the player is doing the same as the report.
User can also set the format for the report.
[PeyangSuperbAntiCheat] プレイヤーがレポートを提出しました!クリックしてレポートを確認してください! [CLICK]
Staff can check the contents of the report with the [CLICK]
button.
[STAFF] [ADMIN] Fishy: Report of <PlayerName> <Reason1>, [Reason2]...
This report format is lets them know who reported who and why.
WARNING: This report format is compatible with the Hypixel Lynx Mod (Keep leaking users down).
This mod may be Bannable on Hypixel server, so never use this on Hypixel server.
Developer does not take any responsibility.
-
/report <PlayerName>
Player can execute this command with this argument to open a book where you can select the reason for the report.
If you click on the reporting reason displayed in the book, the reason will be added as the content of the report. -
/report <PlayerName> <Reason1> [Reason2]...
Player can execute this command with this argument to report directly in chat/console without using a book.
Can use an alias for this reason. Please read below.
The books are sorted in the order they are displayed.
Reason | Aliases | Description |
---|---|---|
Fly | flight | Fly without creative mode. |
KillAura | killaura, aura, ka | Attack to entity without aiming. |
AutoClicker | autoclicker, ac, autoclick | Click Entity/Block automatically(External software clickers and macros also belong to AutoClicker). |
Speed | speed, bhop, timer | Run at a impossible speed(Bunny hops and Timer belong to speed). |
AntiKnockback | akb, velocity, antikb | Never be knocked back. |
Reach | reach | Extend the attack distance. |
Dolphin | dolphin | Swiming automatically like a dolphin. |
psac.report
- /testaura
- /auratest
- /killauratest
Executing this command will summon an NPC that spins around the player at a constant speed.
When an NPC is attacked a certain number of times, it kicks that player.
- /aurabot <PlayerName> Summon the NPC that performs the above actions to the player specified by <PlayerName>.
psac.aurabot
Manages the permission to execute the summon commands of Aurabot and Watchdog.
Players with this permission can summon Watchdogs.
- /testpanic
- /panictest
- /aurapanictest
This command always summons the NPC that is trying to move behind the player.
When an NPC is attacked a certain number of times, it kicks that player.
- /acpanic <PlayerName> Summon the NPC that performs the above actions to the player specified by <PlayerName>.
psac.aurapanic
- /testknockback
- /kbtest
- /knockbacktest
Fire a invisible arrow at the specified player.
This allows you to see if the player is knocking back.
- /testkb <PlayerName>
Fire invisible arrow at <PlayerName>.
psac.testkb
Pull the specified player.
- /pul
Pull the specified player to the executed player. It cannot be run from console.
- /pull <PlayerName>
psac.pull
- /banlist
- /playerbans
- /banlookup
Displays the player's kick (BAN) history remaining in this plugin.
- /bans [-a | ban | kick] <PlayerName>
Displays the BAN history of player specified by <PlayerName>.
Add -a to show all bans and kicks.
psac.bans
Displays the mods installed by the specified player.
If the mod loader is Forge, can view the mods installed by the player.
The response is returned as the Mod ID.
- /mods <PlayerName>
Displays the mods of the player specified by <PlayerName>.
psac.mods
WARNING: This command use psac.mods
permission. Not psac.mod
permission.
Tracks the specified player as a target.
Executing this command gives utility items.
These items allow you to execute useful commands with a click.
Dropping a gived item, clears all items.
- /target <PlayerName>
Start tracking <PlayerName>.
psac.target
Tracks the specified player as a target without utility items.
IMPORTANT: /target give utility items, but /track does not.
- /track
Tracks the specified player.
If tracking is currently started and no argument is specified, tracking will be stopped.
- /tracking [PlayerName]
Start [PlayerName].
- /tracking
Stop track if tracking.
psac.tracking
Causes the specified player to teleport you or the specified player.
Used for utility item internal commands in the /target.
It also suppresses broadcast messages on servers that do not have Essentials installed.
- /stp
Teleports to the player specified in the argument.
- /stp [PlayerName]
Teleport to [PlayerName].
- /stp [PlayerName] [DestPlayerName]
Teleport [PlayerName] to [DestPlayerName].
psac.silentteleport
- /peyangsuperbanticheat
- /psr
- /wdadmin
- /anticheat
The main command of this plugin. It works by adding an argument.
Displays help for this plugin command.
Commands related to management ID can be used in psac.mod
, but they are not shown in help.
Players with psac.mod
or psac.admin
permissions will also see the following help:
See the report submitted by player.
The reports are sorted by highest risk, five at a time.
View details of the report sent by player.
You can run this command from the player to view the report details by book.
If you run it from the console, it will appear as a log in the console.
Completely discards the reports sent by the player, except the command execution log.
The log of the deletion itself is not displayed. Be careful when discarding.
Kick player specified by <PlayerName>.
Specifying [test] as the second argument kick player in test mode.
<ManagementID> is a 32-character alphanumeric string that is automatically assigned when the player submits the report.
This ID is displayed when you run /psac view
from console.
Also, can execute commands related to the <ManagementID> from the player.
The plugin is concerned about falsely banning players due to false Watchdog detection.
Therefore, the plugin does not ban players automatically.
The following broadcast message will be played when the player is kicked.
[PEYANG CHEAT DETECTION] ハッキング、または不適切な発言によってゲームからプレイヤーが削除されました。
違反行為をしたプレイヤーをゲームから対処しました。ご報告ありがとうございました!
This message is sent when the watchdog automatically detects a cheat.
For staff kicks, you will only broadcast secondary message.
There are three types of kick reasons:
This is the message when this plugin automatically detects cheats.
This message is displayed when a staff member issues a kick command.
A test message for this plugin. Please use it for testing.
The Watchdog calls the NPC with a random username using the API "RandomUserGenerator" by @randomapi.
The NPC skin is displayed randomly by referring to the UUID skin settting.
In this plugin, the following config is set by default.
Setting name | Default value | Description |
---|---|---|
database.path | ./eye.db | Save report information by specifying location of SQLite database path. |
database.logPath | ./log.db | Save kick infomation by specifying location of SQLite database path. |
npc.seconds | 4 | Specifies the number of seconds the NPC will orbit the player. |
npc.time | 0.3 | Specifies the value of NPC orbit speed. |
npc.range | 2.1 | Specifies the radius that the NPC will rotate. The default distance is suitable for KillAura detection. |
npc.panicRange | 1.5 | Specifies the relative height of the Panic NPC and player. |
npc.wave | true | Whether the NPC spins like a wave. |
npc.waveMin | 1.0 | The minimum radius that the NPC orbits like a wave. |
npc.speed.wave | true | Specify whether to make the orbital velocity of NPC variable. |
npc.speed.waveRange | 0.03 | Specify the speed change range. |
npc.kill | 3 | Specifies the maximum number to call when an NPC is killed within 10 seconds. |
kick.delay | 2 | Specifies the delay between sending a broadcast message and kicking the player. |
kick.lightning | true | Specifies whether to drop lightning effect(no damage) when kicking. |
kick.defaultKick | 25 | Kick if the NPC is attacked above this value. This value takes precedence if no learned data is found. |
message.lynx | true | Specifies whether Lynx Mod compatible. |
autoMessage.enabled | true | Toggle the presence or absence of regular messages. |
autoMessage.time | 15 | Specify a minuites for recurring messages. |
skins | (UUID) | Specifies the skin to apply to the NPC. You can specify multiple UUIDs and it will be selected from a random UUID. |
This plugin has a learning function that automatically adjusts the parameters using the actual cheat material.
Learning cheat data can improve the accuracy of your decision to kick or not.
This feature is under development. Please note that this function cannot learn completely.
The learning feature of this plugin adjusts key parameters by iteratively calculating the average of the parameters when it detects a cheat or kick.
When you build PeyangSuperbAntiCheat.jar with mvn package
, mvn shade
is automatically executed.
You can edit this file to change the plugin messages before building.
At build time, message.yml is automatically include jar resource.
We accept bugs and errors related to GitHub issues.
I think that it will be handled by about two people, so please feel free to post.
Depending on the language of the problem, the following persons are responsible for resolution:
- Japanese issue assignee: @peyang-Celeron (and @Lemonade19x?)
- English issue assignee: @Potato1682
This plugin uses the following libraries/APIs:
- RandomApi/RandomUserGenerator
- brettwooldridge/HikariCP
- dmulloy2/Protocollib [Spigot] | [Bukkit]
- jedk1/BookUtil.java
- DarkBlade12/ReflectionUtils.java
- P2P-Develop/PeyangSuperLibrary
- PhantomUnicorns
)̶̡̢̡̧̡̧̢̢̡̡̨̨̡̢̧̨̞̘͖̦͈͎̰͔̯͉̻͍͎̻̙̝͖̤̤̠͎̜̗̜̞̪̞̳̳̫͇̜̜̭̣̥͍̲̝͚̟̠̺͎͍̠̩͕͉͇͔͚̙̭̱̺͚̭̣̥͕̙̪̣̰͙̲͚̙̟̲̩̗̯͇̫̬͈̜̣̝͈̗̮͕̝͈̟̬͍͚̜̗͖̭̗͍̰̫̟͎̠͇͚̫͖̹̲͔̝̱̝̜̮̲̥̼͍̯̪͙̬̩̠̦͎̫̖̰̞͇͖̘̱͍̥̟͕͔͍͉̳̤͎̠͍͖̩̼̫̞̫͎͖̟͕̻̟̬̗̰̲̦͖̬̫͍̮̟̖͚̤̝̖̥́̃͊̄̓̊̀̐́͂̌̌̽̈́͒́̍͆̀̇͊̏́͛͛̀̊̊̏̈̓́̈́̔̃̃̃͗͊̒̿̓̚͘̕̕̕̕͜͜͜͝ͅͅͅͅ.̵̡̧̡̨̢̨̡̨̨̡̢̨̧̡̨̧̧̢̨̨̡̧̡̡̧̨̡̡̛̛̛̛̛̛̛̜͓̭͕̗͍̱̼͔̦̹̼͉͔̜͎̩͖̤̮͎͙̙̹̗͙͇͓̱̱̝̣̭̟̭̙̻̝͚̖̻͙̫̠̰̠͖̮̞̱̱̗̺̺̗̞̝̦̖̮͉͇̱̗͎̪̫͎͔͔̝͖̮̤̖͚͔̜̞̝͕̬̱͈̱̦̩̙̱̗̦̼̺͇̭̤͈̞̳͍̤̭̟̫͙̞̰̹̪̱͈̱̺̣̫͇͔̙͕̹̱͉̝̙̙͙̹͉̥̺̜̲̮̳̯̯̖͈͓̰̥̙̻̹̳̘͈̗̺͖̬͍̘̘̦͕̫͉͚̹̲͖̫̯̙̠͉͍̰̫͎̼̫̻͖̖̺̰̥͖͎̦͓͇̮͚͖̳̻̻̭̻̜̥̥͈̤̥͇̺̙̬̜̞̖̗̻̺͓̺̙̯̯̰̯̱͇̰̤̌̓̉̊͛̾͐͊͐͛̃̾̾͋̓̒̋̓̒̂̓̐̆̑̎̂̆͂͌̅͛̊͒̾́̑̒́̅̑̍͐̓̾͐̐̾̌̒̀́̔̑͐͌̈́͐̑̑̓̓̐̆̀͒̍̐̎̈̈͌͂͂́̀̓̊͌̅̊̏̓͌͊̐̊̌̇̑̈́̀͗͌̿̃̊͐̓̊̏̇͆́̽̂̃̅͑̌̾̔̋́́̂͑̂̓̅̍̀̋̾̑̀͊̑̓͆̓̇̅̀̂̉̈́̄͒̓́̂͂̽̃̈́͆̓̃̀̈́̅̎̓̄͋̽͗̋̏̊͐̉̀̑͑̍͋̓͂̾̅̄̊͑̄́̆̓̅́̀͑̉̋̈́͛̈́͒̽͋̄̉̉̈́̔̽̽̓́̑̂͐͌̑̌̆̎͌̄̌͒̿͋̆͒͗̔̓̅̇̏͂̆̓̇͒̈́̐́̆͂͛́͂̽̊͗̇̽̓͊̄̆̋̉̎̔̂́̑̂͗̔̉̂̈́̕̚̚͘͘͘̚͘̚̚̕͘̕͘̚͘̚̚̕͜͜͜͜͜͜͠͠͝͝͝͝͠͝͝͝͠͝͝͝͠͝ͅͅͅ/̷̧̡̡̢̡̢̢̧̨̧̡̧̧̢̡̢̧̨̧̢̡̧̧̛̛̛͈̫̳̮̩̱͈̮͚̯͖̞͕͇͇̜̠̟͉̗̘̥̪͉̠͉͖̻̰̹̯͔̘̝̻̜͙̬̪̲̭̙̮̻͚̝̹͎̥͈͍̣͎̻̘͙̜͍̻̞̺͎͍̰̙̦̞͉̠̦̞͕̩̱͉͚̭̩̝͍̠̼̳͈̰̫̫͔̯̝̲̘͉̤͙͚̙̯͉̠͎̠͉̺͈͎͕̝̟̹͇͎̘̰̤̺̘̙̖͕̫͓̳͎̪̞̼͚̭̥̘͙̭͇͔̹̯͙̝͈͇̯̲̹̬͙̰͈̣̻͔̭̦͇̙̻͇͙̖̫̹̤̘̺̤̩̜̲̰̳̞̦̹̱́̾͆͒̈́̊̽̎̒͊͌̂̏́̐̿̅́̈͛̂̈̓̍̽̑͒̀͒͒͑̆̽̎͛́͐̒́̄̒̈́̃̌̐̅̃̅͂̌̃͂̽̾̐̒͛̄̀͒̍̄͆͌̿̂͊͛̏͑̇̇͐̈́̂̉̌́͊͋̿͑̒̂͂̔̈́́͆̀̓̓̇̊̄͊̊͊̉͂̀͊̄̃̓͊̾̅̅̂̑̃̎͐̃̍͂́̈̃̌̔̽̓͊̓͋̿̈́̿̏͗̌̽̔̃͗̍̊̈́̋͐̐̄̈́̐̈́̿̋̅̓̀̍̐̈́̉̃̑̈̓̐̆̇͐̆̽̔̎̒́̽́́̌͗͛̓̂́͋͂͌͆̽̈́̿̅̑̄̉̏̈̚͘̕͘͘͘̚̚̕͜͜͜͠͝͠͝͝͝͝͠͠͝͠͠͝͝͝͠͠͝ͅͅͅͅͅͅ:̷̢̡̡̡̡̧̧̩̥͚̣̹̥͉̱̩̘̲̮̠̺̦̘̭̟̭̮͎̭̖̝͈͔̟̬̩̯͔͎̣̼̫̞͕͍̗̮̼͉̮̞̟̻͖̼̦̜̙̭̪̳̖̘̥̈͜͝ͅͅ$̶̡̢̧̡̧̧̢̨̢̢̢̨̨̢̡̡̡̡̧̨̢̢̡̡̢̢̨̢̧̡̛̛̛̛̛̛̱̬̻̮̩̪͎͇̞̰͉̦̥̖̬͎̥̹͎̰͎̤̤̺̯̺̻̖̩̪͎͇̪̬̝̯͚͇͈͔͚̯͕̹̣̳͚̫͓̩̳̦̪̝̪̗̯͎̤̪̜̞̯͈̺̜͚̲̭̜̭̤̠͇̯̪̞͔̤̝̤̖̼̟̜̺̣̦̰̮̟̼̣̤̦̻̖͍͔̰̭̖̤̺̣̤̞̖̱̣̱͕̫͉͓͔̜̟̻̪͈̰̠̞͙̗̗̼͖̫̹͈͕̠͕͉̯̰̖̭̫̤̳͎̜̙͍͚̣̖̙͚̖̠͙̰̩͚̮̼͔͓̼̹͖͖̮̟̲͎̜̫͉̖̭̞̳̥͓͖̬̞̳̩̱͔̭̭͈͕̯̝͍̼̮̝̥̹͔̱̰̬̦̥̖̩͓̘̭̘͍͕͔̯̮̻̘͔̞͇̞̪̲̝͉͓̰̳̣̺̪͈̣̮̱͖̦̹͎̟͎̖̱̥͙̪͇̘̘̝͐̆͗̒̿̈̌͆͋̒̑́̍̓́͆͒̍̒̀̑̾̄́̔̍̇̔̈́̾͛͆̑̂̄͛̒͌̈́͑͆͛̎̊̈͛̏̽͊̋̌̋̄̄̂͂̀̽̈́̌͌̎͑͊̑̀͐͗̓̾̂̎̅̓́͗̀̓͆̾̇͒̈́̃͆͂̅͛̊̍̽̃̏̀͗̃̾̌̈́̆͛̏̉́̅́̔͒̐̇̂̏̌͒̄̋̓̔͑͂̑̈̑̊͑̇̌͒̔̔͆̔̇̑̓̔́̑͒́̈͋͊̓̑̾͗͛͐̿̊̇͛̆͆̂̾̔͗̐̑̂̈͋͗͘̕̕͘͘̚͘̚̚̕̚̕͜͜͜͜͜͜͜͜͝͝͝͠͠͠͝͠͝ͅͅͅͅͅͅͅ"̵̡̧̡̡̢̡̡̧̨̢̢̨̛̜̙͖͓̯̘̼͈͉͖͎͕̪̫̭͙̼̗̺̥̫̖̫̖̠͕͎̳̳̭̫̫̝̤̞̞̰͙̯̳͙͖̩̬̰̤̯̯͍̻͇͎͈̪̳̼̫̰͎͇͇̳̙̘̜͎͚̦̞̬̜̙͇͙̤̖̮̰̘̫͉̞̩̯͈͎̞͙̣̰͇̹͕̮̥̭̻̳͎͈̖̝̲̳̭̤͇̥̘͖͉̥̦̝̞̞͚̰̻͇͂͌͌̈́͑̋̀̑̆͑͛͌͌̈́̿̋́̈́̀̓̾͐͑̂̇̈͋̀̓̐́͒̎̍̈̅͊͋́̅̂̌͊̔͂̌̾̅̈́̒͂̍̾͗̇̋̽̊͌͐́̄́͑̀͐̇͒̓̈́̂̈́̉͗̏̒̄͑̓̈́̎́̒̓̈̍͒͐͌̽͂̓͋̓͘͘̚̚̚͜͝͝͝͝͠͝͠͝ͅͅͅͅͅ1̸̨̧̨̡̛̠̞̭͖̮͍̺͔̠͕͖̪̘̫̭̩̳̻̳̠͖̪̫͉̜̜̟̯̥̲̜̥̪̹͇͔̘͍̣͇̪̰͇͕͚̭̥͙͎̹̮͚͕̲̪̲̀̿̑̋͊̓̎̓̇̌̒̇̅̓͋̈́̈́̈͆̉̓̐̄̊͗͗͐̕͘͜͜͜͜͝͠͝͝͝ͅͅ$̴̨̡̧̧̡̢̢̢̡̡̢̨̧̡̡̢̢̧̡̨̨̡̢̨̡̛̛̛̗͍̝̺̟͚͚͓͓͓͙͖̙̮͈͉̰͚̲͔̭̘̳͉̫̪̫̱͔̫̜̞̻͕̟̬̗̲͔͖̦͓̘̗͍̙̥͓̗͍͈̝̥̭̳̯̱̠͍͚͈̘͉̗̞̟͖͉͎̦̹̼̳͕͖͙͓̣͖̣͙̟̝̦͓͉̪̬͍̝̥̘͇͙̻̰͉͓̰̗̟͇̼̯̪̟̖̫̩͎͍͖̺̫̰̭͙͈͔̗̲͇̞̻̖̣͎͚̜̪̟̗̤͈͈̲̹͖͇̬̹͈͈͔͎͍̳̥̻̰̭̹̞͓͉̘̺̫̞̺͔̪̭̮̰̤̪̞̰̹̰̼̗̦̦̻̠̳͈̲̱̰̗̦̺̩̗̝̯̯̥̩̦̝̣̳̟̘̩͖̦̪̘̘̣̹̗̙̤͉̟͙̘̣̫̥̗̗͉͔̮̈̿̃͊̇̀͒̀͐͆́̀͛͆̑͆̈͐̅̏̓͆̈́̓̐͌͗̔̔̓̓̂̊̈̾́̑́͆̃̇͒̀͋̑͌́̀̅͂́̅͑́͑͊̀̈́̐́͛́̓̐̄̈́̄̉̔̆̀̾́̽͗͐̋̉́̐̀̊̀̈́͑̾̉͌̒̍̅̈́͑́͌̏̊̉̎̓̋͗̌̏̔͘͘͘͘͘͘̚̚͜͜͜͜͜͜͜͜͠͠͠͝͠͝͝͝͠ͅͅͅͅ'̶̡̨̡̢̡̧̢̢̡̧̧̡̨̢̡̧̧̢̨̨̨̢̡̧̧̛̼̳̲̝͕̱̺̱̤̙̮̲̫̰̮̱̙̪̰̫͎̝̱̘͓̤̜̜̘̱̻̦̠͓͎̘̭̤̝̳̹̯̲̘̳̠͇͈̭̯̲̙̪̠̰̰͎̯͓̙̟̭̞̣̱̩̖̙̩͍̥̫͇͉̭̘̺̠̪̼̹͕̫̦̼̗͚͎̟̫̦͈̻̘͍͇̥̰̻͕̥̞͎͖͈̼͉̖̪̻̥̬͈͙̼͓̩͍̝̜̫̘͎͉̘͓̟͕̥̻̟̫͎͉͚̳̱̮̬͈̠̪̗̟̱̬̙̞̫̯͖͚̫̖̺̝͈̺͔̬̫͍̮̗̺̼̤̝̠̬͍͙̦͍͍͚̦̩͕̻̬̮̫͍͚̣̙̞̩̫̝̠͈̘̙̞̥̱̥̣͈̖̭͉̻̬̩͉͍̮̪̙̲̯̟̥̤̺̤̰͍͖̬͔̬̣̳͍̤̠̤̝̫͍͕̠̣͆̊͗̑̄̓̆̐̀̓́̇͜͜͜͜͜͜͜͜͠͠ͅͅͅͅͅͅ^̷̛̛̛̛̛̛̛̥̮̱͉͇̝̼̝͑̊̅̈̇͐̔̎̌͊̋̀̊̈̂͒̍̈́̆̈̑̈́̑́̐͑̿̐̒̎̈́͊̏͛̒̎͌́̈͗̊̊̈́͑͒̊̃̈́́̾̿̏̃͌͋̈́̃́͗͊̄̈́̅̒͗̽͗̉̈̐̇͛̊̽̍̿̄̔̎͂̊͌͗͋͂̇̄̽̈́̽̌͒͊̾̊̾̐̀̎͂̂̾͒̓̔͊͆̈́̒͆̽̆́̂̎͗͆̊͒̅̈́̒̋̿̈́͗̅́͂͂͐͛̎̇̃͆̀̆̈͐͊̒́́̑̐̓̈́͋͂͛͆̐͛̈́̈̀̒̔̎͗̓̓͗̃̆͑͋͑̈́̊̃͂̀̐͋͆̄̌͊͋̏̃͐̉̓̓͂̈́̓͌̈́̒̈́̐́̿̂̿̐̀̿͒̈́͆̎̈́̌̏̏͋̉͋̌̀̾͛̽̈́̄̄̊̃͋́̾̎̐̑͊̆́͐͗̄͊̈́͗̄̾͑̿̀̓́̍̏̒̄͘̚̚͘͘̕̕̕̕͘̕͘͘͘͘̕̕͠͠͠͝͠͝͝͠͝͝͝͝͠͠͝\̸̧̢̧̨̨̢̡̡̧̡̢̨̢̨̡̡̧̨̨̡̛͚͕̠̰͔̹̳̞̹̖̟̠̮͇̞̩̯͇̫̺̪͖̭̩͓̝͕͎͓̮̥͓̩͍̗̻̞͇̠͙͚̖̫̖̬̜̩̪̳͔̪̳̻̦̙̬̟̩̦̮̺̯̞̼͔̯̹͙͚͕͔̮̻̞̰̠̻̙̺̲͓̟͖̳̟̝͚̭̼̞͖͈͖̖͉̟͓̙͇̥̗̥̗̗̯͓̘̙̤͚͎̯̜̪̣̦̠̗̜̹̼̣͉̦̦̞̹͍̘͈̰͉̖͓̯̖̬̖͙͇̜̥͙͔̥̘̩̹͔̲̻̭̺̫͕̭̞̖̹̗̤͍̳̻̰̮̭̞̯̖̞̰̬̘͉̫͚̥͇̥͓̫͍͙̤͙̱̳͔̫̖͔̺̥͚̙͎̗̦̮̲͍͓̺͉̲͓̊̾̔̐͂͋͗̆̀͂̅̊̂͑̎́̆̂͗̕̚͘͜͜͜͜͜͜͜͝͝ͅͅͅͅͅͅͅͅͅ-̵̢̢̧̡̧̧̢̡̢̢̧̢̢̧̢̢̡̨̨̛̛̛̛̝̖̳̗̩̝̱̗͉̟͖̜͙̹̩͖͓̘̞͇̙̬̩̮̮̯̜̦̻̤̫̗̘̖̱͔͖͇̥͓̰̞͉̯͉͕̟̳̹̹̫͚͙̺̜̗̯̪͉̥̭̼̱̺̱̬͚̮̞̤̬̗͎̯̘͔̝̪̺̪̮̩̙̦̫̲̹̤͉͍̘̠͍̟͕̫͙̫̣̤͍̰̰̬̻͉̮̦̼̦̞̹̣̥͙͕̯̦͕̙̥͕̰̱͍͕̪̯̬̝̟̻̰̹̼͇̺̦̘̮͓̰̹̥̪̟̲̠̞͎̫̯̹̫̲̪̯͚̭͈͎͖͖̼̙̥̹̬̖͍͕̙̤̩̻̦̮͔͚̱̳̜̻̝̼͓̹̬̝͚͖̰͈̤͈̫͚͉̳͙̠̟͚͛̆̽͑̒̓̀̏̌́̒̎͛̉̅̈̏̓̈́̒̔̈́̂̽̅͛̔̆̓̑̾̅̏̄̋͑̽͐̈̏̎͐̋̂̇͒͛̃̄͛͛̑̑̉̾͛͑̉́͆̑̐̾̈́͗̅̽̅̂̀̓̏͐͂̉̽̑͂͆͌̎̈́͌̒͆̍̌̎̊̄̋͑̓̎̽̂̂̓̀͛̆͗̀͋̉͋̓̉͛͒̊́̅̆́̎̆̑͊̀̈́͊̈́̆̆̀͆͛͗̐͛̉́͊̉̏͛̂̑̃̀̋͆̃̔̀̃̾͂͆͂̈́̔̔͐͗̂̒̑͛̐͋͐̈́̇̓̀̊̑͋̏̈́̂̽̋̽̉͗̈͐͆̈́͋̄̾̐̕̕̕͘͘̕̕̕̚̚̕͘̕̚͜͜͜͜͜͜͠͝͝͠͝͠͝͝͝͝͝͝͠ͅͅͅͅ=̶̨̛̛̛̛̯̪̘̜̰̱̖̯̳̻̣͖̅̏̾̓̏̓̈́̈́̿̑̄͋̈́̅̅̏͌͌̿͊̽͌̉̔͋͋̔̌̓̆͆͛̽͛̓̑̍͋́̀̏̐̋͒̄́̋̅̀̃̒̎̀̾̌̓̅͗̆́̏̑̋̈̒̆͐̎̎̌̎̓́̒͑̔̀̍̆̈́͌̿̇̅̈̆̅̀͆̋͒͛̂̑̐̈́͆̅͗̋̓̌̂̀͛̿̀̾̓̒́̅͑̌͗̎̀̏͊̌́̎͛͛̾͋̅̓̇̂̓̂͂͐̈̅̊̔͑̅͗̇̅̌͂̈́͗̀͗̑̏͒̎̾̕͘̕̕̕̕̕͘̚͘̚̕͘̚͘͝͠͠͝͝͝͠͠͝͠͝͠͝_̷̢̨̧̨̢̡̧̨̛̛̛̛̠̖̖̘̖̼͎̗̺̥͈̣̥̬̦̙̹̻̬͚̳̟̞̣̖̜͎͉̯̘̺̬͖̮̫̘̰̪̩͔̮̫̲̬̹͓̜̺͈͚̲͙͍̦͕̲̳̝̦̪͗̀͂̔̍̏̀̉̓͋̄̀̿̔͑̀̾̓̓̊̿̾͋͌̉̈́͛̍̋̎͂̍͂̑̈́̂̓̎͂̓̂́͂̌̓̈́̅̅́̌͒̃̊̎̐̈̄̈́͒͌̓̌͋̈́̂̐́̽̽̉̔̄͌͋̽̈́̇̄͂͌͑̀̋͊͋̊͊̓̈́̑̈̏̊̈́̀̅̆̐̅̊͂̑̇͆̀̃̈́͑̌͒̈́͌͒͋́̓̋͐̾̽̂̉̈́͆̆̂̉̔̆̑̇̈̐̅̄̅̎̔͊̊̍͑͐̈́͐͋̽̅́̈́͛͂́̈́͌̾̏̄͊͋̐̏́͆̑̏̍̂̕͘̚͘͘̚̕̚̕̕̕͘̚͜͜͜͝͝͝͠͝͝͠͝͝͠͝͠ͅͅͅ/̸̭̏̾̌̍̽̊͌̎̓͐͊͐̽̅̾̅͊͂̈́̔̕̕͠͝͝\̵̦͋̍͐̎̔̍́̒͒̅͆̆̋̏͆̾̈́̋́̏̋̓̎͐͛̈́̆͌͒̊̂̅̓̐̃͊̄̌͗̂̆͛̈́͌̓̈̌͂́̌̍̈́́̒̌̈́̂͌̿͛͂̂͆͐͘͘̚͘̚͘̕͝͝͠͠}̸̡̢̧̡̡̡̨̢̢̧̧̡̧̨̧̢̧̨̢̨̨̨̨̛̛̛̛͕̙͙͙̫̝͓̮͚̠̺͔̻͔̳̬̤̫̞̼̱̮̼̥̤̬̻͙̳͔͙̘̱̟̣̜̟͚͇̝͙͔͈̟̘̦̫̥̫̯̲̖̻̬̞̭̣͖̘͉͈̖̺̞͍̻̥͈͍͕͚̫̘̙̞̣̲̱͍̹̰͖͓͓͍̟̜͎͙͙̳̬̤͓̲̫͇̠̝̯̜̞̭̮̟̬̤̝̤͓̤͉͙̻̟̜̝̬͍̭͕͙͕̪͓̥̰̺͇̥̬̳̹̪̩̰̪͚̤̫̠͉̩͓͉͙̭̭̦̝͇̯͍͍̪̫̩̦̙͚̤̭̮̹̘̮̤̱͔̹̗̟̪̞̯͚̻͍̫̝͙̙̘͙̞̫͚̹̣̝̩̮̲͉͖̟̺͔̞͖͙̬̪͇̬̑̌̈́͗̽͑̿̎̍̈́̈́͂̂͌̀̄̈́̀̍̈́̎̐̓̋̏̀̉̇̓͋̉̃͂̐͗̂̋͂̅̔̉̍̇́̓̿̃́͋͆͌̀͂̃̄͒̽̾̌̂͋̀̊̀̄̑̋̽̇́̾̈̂̍͗̇̉̏̂̌̿̃̍͌͒̏̈͊̏͆͗͊̐͗̀͋̀͌̌͒̔̓͂̄̐͒͑̿̒̏͛͂̎̈́̉̅́̒͛͂̾̅̎͆̈́͑͌͂́͒̒͊̿͋͑͒͆̈́̓͛̃́̀́̉͑̽͊̈́̆̊͑̐̓͋̃̓̆̑͑́̊̐̆͗̔̑̾͒̿̍́̌̈́͛̊̐̇̈́͐̎̽̒̄̇͋̇́͌͒͆͒̉̎̑̓̃̉͆̈́̄̆͊̍͑͂̿̈́̎̆̈́̓̃͒̂͋̏͌̊̐͂͆̋̎̀͐̚̚̚̕͘͘̕̚̚͘͘͜͜͜͜͜͜͜͝͝͝͝͝͠͠͝͝͝͝͝͝͝͝͝͝͝͝ͅͅͅͅͅ{̴̨̢̧̡̧̢̧̢̡̢̨̨̨̢̢̧̧̢̨̨̢̧̡̡̧̨̡̧̧̨̨̨̧̧̛̛̛̛̛̛̛͓͖̥̰͖͉̠͖̣̣̲͚͔̻̭͍̝̣͓͎̱̠̘͖̯̻̘̘͉̪̺̰̲̺̳̤̤̻͙̤̯̮̲͈̜͉̲̙̺̠̖͚̖̥̗̰̹͖͈̱̲̤̘͈̭̘̬̰̳̦̝͕̼͚̘̝̠̹̥̯̱͖̥̺̟͙̯̖̣͓̤̗͚̳̥̰̗̲̫̝̲͎̩͓͚̘͖͓͎̜̥̟̗͙̘̞͙͉̱̭̜̤͎̙̳͖͉̮͉̰̮̝̙̩͓͎̦̟̰̼̥͎̩͓̠̦̩̻̖͚̻̤̼̥͖̠̹̜̻̪̞̜̞̺̫̗̮͓͍̟̻̙̣̯͈̤͖͖̣̗̯̦̞̝̺̣͉̳̮͖̦̦̞̫͎͇̪͔͔̻͙͕̭͖͕̲̳͓̝̺̝͍̣͍̤̩̜̭̲̲̼̪̖̬̬̗̝̳̑̔̈͊͊̾̈́̈́̐̀̈́̾̅̒̒͌̉͑́̒̑̊̀̅̌̊̎̃̏̆̄̂̇̀̈̂̿͑͛͌̈́̏̇͗̒͆̓̓͆̌̉̓̔̈́̾͒̉̍̿̀͗̌͒̓̏͒̂͆͆̈́͗͂͛͒̒̀͂̇̍́̅̉̿̑̃́͑̐̿́͒͂͊̄̈́̍̊͑̋̿̔̅͛̽͆̈́̆́̈̀̏̈́̓̈́̈̃̃͊́̈́͂͆̂̔͒́̀̉̒̈́̌̉̋̓̉̑̃̿̒̊́̓͂̍́͊̈́̔͛̆̌̽̄̐̂̌͐͌̇͋͋̆̑͐͂̾͗̽̌̅́̅̌̄̇̿̑̅͗̈̂͐͗̒͐̾͐̇̊̍̋̉̐͆̀̌͋̂͐͒̈́̇̾̊͌͊̐̇̊̈̔̅̃͑͑͂́͑̍͆̒̇̕͘͘̚̚̕̕͘͘̕̕͘̚͘͘̚͘͘͜͜͜͝͝͠͝͠͝͝͝͝͝͠͝͠͝͝͝ͅͅͅͅͅͅͅ@̸̨̢̧̢̡̢̡̢̧̡̛̛̛̛̼̞͚̞͙̪̹̫̥̙̻̘̳̮̩̠͇̙͓͕͉͍̖̝͕̥̺͖͔͙̪̱͔̳̗͓̤̳̬͉͎͇͎͔̬̱̱̹͚͍̹͙͕͔̙͍̮̘̜̖͙͉͈͙͚̯̱̰̬̺̘̳̱͚̙̲͙̹̟͈̰͕͕̗̮͍̻͇̟͈̳̼̭̹̜͚͕͉̬̏̓̋̈́̃̿̌̈́̇̔̎̒̈͐̍̎̇̀̈̐̓͛̌͒̄͛̎͋̓̈́́͑̿̈̀̑͂̏̓̀̂̄̆̋̇̒́̉͌̉͊͐̈́̋̿̈́̉͊̇̾͂͗͊͑̾̓̌̄͒͌̍̾̿͛̈́̿́̄̿̀̅͑̆̓̓̌̍́̆̇̓̈́̀͗̉͗̓̍̆̿̔͛̂̀͊̅̓̏̿̆̈̐̀̈́̑̊̿͊͂̒̀͐͌̂̽̎́͛͂͌͗̏̍̾͑̎̈́̈́̎͆͌͋̾̽͑͂̓̌̂́͗͊̑̽̿̐̋̐̔̓͂͘̕͘̕̚͘͘̚̕̕͘̕͜͜͜͜͠͝͠͝͝͝͝͠͝͠͠͝͠ͅͅͅ:̵̡̡̼̻͙͚̱̥̰͚͓̙̲̝̝̱̱̲͓͙̭̮͚̙̝̤͕̣̘̟̪̣̌̏̀͊͛̈́̅̂̂̔́̃̇͆̂̾̒͋͝ͅͅ;̸̡̢̡̨̧̧̨̧̧̢̡̧̛̛̛̛͓̦̻̮̘̪͇̙̝͍̺̦͈͎̫͍̦̳̬͓̭͈̫͙̟̬͖̫̼̮͖̙̰͚̥̹͇̠̦̥̠̦̣͖̱͉̻̤̜̦̭̰̺̮͖͎̩̥͕̭̳̝̟̺̖̥͙̬̟̪̝̺̻͎̞̗͙͍̤̥̬̻̦͎͇̯͐̀̓̇͋̈́̽͊̔͂̑̎́̀̅̀̀͒͋̋̆̒̂͐̀̎̾̆̇̏͗̎̓̊̿͌̐̽̀͋̊͒͌͛̄̎͋̏̈̂͆̄̋̔͆̅͐̑̔͋̾̉̒͛̾̀͗̓̂̋̎̿̍̈́̇̔̈́̐̍̑͒̌̈̃͗̀̋̀̍̐́͑͛̀͂̈́̊͗̎͗̀͌̿͊̂̅̇̌͆̈́̉̽̄̉͌̋͑͑̈́͒̉̒́̀̈́̅̔̊̍̂̀̾̂̓̎͛́́͂̂̿̈̃̀̌̕͘̚͘͘̚̕͜͜͝͠͝͝͠͠͠͠͝͝͠͝͝ͅ