Refactored out rate limiting to its own class
Refactored out the version code to filename conversion
Refactored out using $_GET to use Symfony Request object instead
Refactored UA lookup to use SF2 request instead of $_POST
Refactored the ugly header/echo output in failed() with a SF2 Response object to be returned
Refactored header spamming with SF2's BinaryFileResponse
getFilenameFromCode should return false if not found
Refactored RateLimiter to allow for future permabans
Return false if config key not found
Inject a ban configuration array
Added phpdoc to isTemporarilyBanned and isPermanentlyBanned methods
Added temporary and permanent logged bans to RateLimiter class