Greasy Fork is available in English.

Nitro Type Infection Hack Bypass

Copy the code and paste it into tampermonkey for the hack bypass

// ==UserScript==
// @name         Nitro Type Infection Hack Bypass
// @version      v1
// @icon         data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxITEhUTEhMVFRUXGBgXGBgWGBcXGBcXGBcXFxgYFxUYHSggHRolHRUXITEhJSkrLi4uFx8zODMtNygtLisBCgoKDg0OGxAQGy8lICUvMDIvNS8tLS0tLS0tLS0tLS8tLS0tLS0tLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLf/AABEIAMkA+wMBIgACEQEDEQH/xAAcAAACAwEBAQEAAAAAAAAAAAAFBgMEBwIBAAj/xAA8EAABAwIEBAMGBAYCAgMBAAABAAIRAyEEBRIxBkFRYXGBkRMiobHB8DJC0eEHFCNSYvFygjSiFiTCFf/EABsBAAIDAQEBAAAAAAAAAAAAAAMEAQIFBgAH/8QALxEAAgIBBAEDAgUDBQAAAAAAAQIAAxEEEiExQQUTIlGBMmGhscEUI3EzQpHR8P/aAAwDAQACEQMRAD8Aw1etXi9CkT0PYjCsGHDhugzHwp6mLJphnIKoU1qLFYgqPEDUhAO4+ZZNdQvdKjlG8tw9NzL7qtNRubaDJscVjJgQhWcJidE2lfY2mA6AuKNKVTayvgdy2QVzOC0kldUG3VgsjYKc4bYgIqUE8jsSpsEMUsIBSLu37JbxDbpxLIoNA3LRPaOXilmpg3OJgLR1tXxUKIlpbOWJMhLhEFR0WqUYM6STYgqOi5Z5BBGY5kYOJcwtDU5WM+wsaSFXwdXS6USzWuHhoG43T6KhoYeYozOLVPiLT2ruk2V3iRdcMF1l7cNHs5E8e1e0nwV6+65r727D4KG4OZPYwYVw2YEbFduxGpCqFMlGMrwTnvAhO6cu+BFLVRMmQPp3AVTNMOGOj1RPEvAqHsfVQZtgyGteSCXCYBmJJgHvF/NXvrBRsdieqbBGeoFKlOIOkMn3QSQOhcADf/qPRcOapG4Z0TFlmBWzgCOEgSFeKz7CygcF5kIngQZyvl6r2X5W+sHlun+mwvdqcB7o6dSoVSxwJ4kAZMoL5dOC5VZM+XdNsrkIhg8LLdSJUm5sSrttGZWqU4UBRR9OVRq04RrayJVHBkIRTLBElDg1XKNSF7T4VsmRaMjEt4/Loaypqadc2Bktgx7w5LijhUx5Xg21qO3vD1Q1rYJadwtX+lUEN4MQGpzlB2J3keVmo/sEWp5VrrCkz/Sn4VxTW6gd+S0TKcup0aZe+NbgXSBB8J3gJn4VVCZt19hvKf8AEXMJw7QpNNLEVPeJBsQNPkdx4wjGZ8G4WtScaDdFZrbb+9AtImL/AFSjxNnAkama5O3MCNx6qfhriRwdTa10gbA7wdoPNvLqEk1xZu5o/wBKy158xbxuVO9mQBDgSCDuDt9EpOokFbpn+AZVpOxVIfjs4f2u7+KyfM8A5pNkTUUi1A6+O4PR6o5KNBVBX6VKxPQT8YXFKja+4O3ZFsvYRSrEc2hvkXX+SpRSYzbYBzF/EU5N1xXaJ91XcVQMaoXGFoEuECUA1EsVx3Cq4xnMjw+Wu9n7UiBMDxCq0KEuWl18nIwtNh903O3M3At5CUFw3D7n19DBc3J5Acye26Yf08DBH3idXqKuGJP1/SCsDlT3ENY0uc7YDf8A0iVXEUsFAn2lQ/igw0A8mmJPj6JozOuzAUHBoBe8QHRc2+RWX4oVHk1HTe8lRfYKB8BzJ0xOpJY/h/eNGHw1DEt1U2kVAS5wc4EEf4m1xM7IbnLYso+GapD2+I7I5n+XkNkiPnCNSvu0EjuVtf27wCePERqwujmXuHs+qEYxkFS4F7thzWdQ3t2mP2rvrEkxMajAgdOnaUOqC6NPw8iUKxDIKpqUI5k0uDxIA20rprl65xgdFGUmeOowJ8SvF8vlWenyM5S/3CCg4RLDSymSeaY02d2YO3qG8gxzaLK1YiXkeypTf3nA6neTY9YQLE0j0UmHdJbOw+v2PQIjmNan7MBoun1QWVZJxiLE7H4GczujljXUpi6X8Q2HEdE1ZNjB7IzySzj3tLzCtrFQVIy9ymlZ/cZWh3hLNHNdoF5keq9cJrG3NU+FGn+YZAtz8OadRkodiXRYb/BN6MNZQM+D+kT1dldNzE+RJMhyKXtc21xE3+Ce+K8Q3QYOwA6IbwkNWKYwmA0ExBuANto9VDxvioJEi58I7IWtOH2jx/Mp6aTZZub7TPc6a51QkSQ2JABMT1jyv2XuJwrNIe2WObe3Xr+69wdUmrqEzF+W8dO3JTY2rHL9EgnA3eZtOecRo/h1n4qamOjS+zh/le4+fip87yIF0xMG/ks8yx5oYgObZjiCItHZbThKgqsa+JMAkdRFiPJaOnvwu77Gcr6ulmnt9xOpnee8NBr2ub+FwHyVCnhTTa7oTf6eS0zMML7QiBEHol7OMkqQXASZAAA3lO1sh5PcU03qJYBHMVeIsOBTpaB7rrnsdiPgrfCeXsB1uG1giWL4fqvLKbi1oaQBud9/FOfD+QUabgxxsBziXO5knlHRCexK2LHmO36gGkVq3JP1kFHBe1aBHOfD9FVzX2eHmmyNgajuZ5hk8hufTqjPFee0cGzRSg1HbDqeXkso4lzJzmaXOl9Qy89eoHbYJc3HbvbgeBBaD04ljk5H6fb/ALlXPcx/mqoefwtsByhL+fVzIZsNyPlKY8qwggEi/JAuKMERU12ggevdIah2Ybp1VNYQbR4nvCZ/rsB2m56Tab+K0zi3AjS1zbhzd+4/aFl+XPbTfTJ5xt01NM9DsVrOOr+0osF9t076a5IAmR6sNjK4mQZph/eV3IsBre1vUhEuIsvA94Kll2I0ERuq2UBLstGBcbKPhNNxXCGHZhzIOsNmZ59IWR5lhTrLR1TVjuK6z2+zLyREKvl+Xammo7pPiiNV7/wzn6xDQ+9pQzXHOeop4+joY1vQ+ZlDyiWbGXnoNkNKxtSAHIE6GokrkzxfL5fJeFnTd0dzBg0sA6BB2Mur9asXADyTun+KmL2jLD8pdwWHDrK3mWVaWz2n6qLJmxV0nkQP1TFnVUaCtqmpHpJImXdcyWgDzEQOc1hjqqtKmXGAj38nNF7uSrZVhCCHxsQVmPpmLqD1NFb12sfMb8jyz+Xoghsvddx5DsrWV5xqrEdYHpujGGzH21DSwNDTueYd/aUv5XlLm14K3kG1Qqjj+JzTOLPcNw+U0HhRo9o9wbJ0fjvA5afEyR1t3ST/ABBx/vEQCTyMwfNaYzRToAM/Dp3Eg7EkyB8rrGv4iVxIbfeb8h4SsPU2btzTW9KXjMEZJjjJYRBmRe3cd/2RLF1xzkeR+aAZQQy5IJ6L3HZo+bEDs2Qfilg+E5mqR8uJBmGNcXRNgmvJuNalKgxtiWnzgkGPCyRnu1H7J9V4WEKtVzociUv09dy7XE2tvG7dAeG6gReNx1shtXj0uqDQA1vV3LfdZlhce5gjcdFIMcLzzWiusTHXMx19E06EnbHvMuN6rTLS0kc4n0++arv42qOiXQYuQTJ7ef6pIxNeW2PkqjXlUbXlW4EaT0ujaBtHEZM8zt1WoKkkoPisaXOaZ2XNF0XN1z7Nh/u+B/RLX2Nacx2ital2gcRyynFS0Ge3oq/ENHU0kyYMgDrsJ9Uv4HFmmRpc7T0KLVMydpJNu5UBwUw0IRzkQVg6BLmkzYkfLb1WvVgf5YR0EeQWOZUC+sAPj0i629lGcKLbkCfIynfT2AX7zF9Z4CkzMs5qEk3VTLqOpyIcSYcseo+HKBLnOgwE8w3XgGeRwNPuEG4jDH2o8U3vdpoafAeok/RCcwDRUna9kSxVFzqbNNy+w/5H3UaqoVliIC5/cCZiFmRuUNKJZmwhxBEEGD5IaVzGq/1DOhp/DPF8vl8loWWsOiOCw5e4Ryv6XVCg2EZymoQ4EBamkQEgGKXsQCRK7sUWPnab/Fd47Ni4IxiMupYgxIa6PC6A5llb6J0uCZuW6oED8MXqemwjP4oVpYgHDae8n6K3wg1rqgpnc2CDZXRcaZ6K7ktMtrsImzh80ep2JRseMQN6DY6gx3OTuw5kbOMRyKY8ny11QteRIG/hzuFaqta8NkWR1gbSolwiY5K9+oIUADmcvprG1DDd47gDifEtpMDadmiwANzzPlceJI6LHeJz7R/LuB+LxPVNnFmZuAcBykk/vy5pBZVLyfG5AJJ/7H6LKuwPjO10ybaxiUKr491t+/Oey5NGBJElMWHwtID8PnN/kqmPoM3Bn77IDV45jAYmAXFSAkhWhRAuutMoQBl+4Od2XmpSVtyoUMnHUmdal2xkqJTYd3JeByZ6fFpjsvmPIVtrF5Up9ETkdGR3PaDdUcgpcU1pEA+ZJPoBYLzCGDHVX34VjgNx2H6oy4YfnBnKmfcM0QypqcROwE99yt84RDK2HcNwfn2K/PTGvpH3TI+PwK0n+GvEzqdQMcRodvsInnFvv1R6vwFB3EtdSLF3GEeLeHdROkGR1CG8P5C6mx5cIO61jHNY4TYpQ4pq+zouDRuFpafUF8DHM5O17av7AIIJmS5+9xeY5FMPC+IL6J/upkPE9iqNDDEhxIuUY4ZwmhtQkWIITYRgxY+Zqam1RTt8jEQuI6RDzNybnxNygDkzcVn+oUtOXPeoKBacToNGxaoEzlfL5fJCNS3TqXWj/wAP8kZVnUduQ3KQW4Qez19TA8ZVrD5lXoH+m8tcBBhaumt9rlvpM3XUNfWUrbBh7iPDiljC2m6Q0q5xN79KmSLgG/Mi0BK+FrOdLnEkkzKPVMSX4e425rUocOrfnzEbKmrNfOdvEhc4U6TWgXMSmjJMsJ98tERqsk7B0zV92bjZObKj2U2hky4AGN90eolhkdRPXZA2g8k8xlo4uQNPIqxnOPqCl7s7dPkPqreQ4EupgFukx5oTxa4tdoa/bfqErlHt2gdTM0tTK2QOMzNeIMFWe+XSQfRCmUi20fAJ4o42nTJ9o/U3oZMnlv8ARUM1r6/epUqWmNmjUQD1Jug6jTIWypnT6fVOPiw4ir7SFXqNRN2a1RYBgH/Bp+JCuPoe3ZrawNIF9NvMDkD0SPs7uBHjdtxugTDYeVBjWaZjt8dii+Cwh1QdkRxuSyCYuLIRpYiEFgzEOqDN1GjOMwVvAoU+mQlmQiFBzIlNhqZJgBe0GXEpvybKm6XOi5Mfv8YVq6ixkM2BBDcGR6KJzIN04PyiGmxn5IDVy95MaY8j6pj2GxwIL3lHmCnENvdWqWItJgeKlrZM92wJUDcqeDBse9vmoNNo8SVvrJ7kjazXG/1C8aWtcCC4eZ+a+bgnbhXW4eGw+RPK8nyR6A4PIgrXUjgzU+Ds+FWiGh5MWg3sr+b0DVbFo8lkGQZiMNVBDiBNwf0lbXkeJp4imC2HE9InzT+4D+4PvOP9Q0L13blPB6iY/CFssm0zAuJ2VjFs9lhzPO6bsVg2tdt6pM/iHimNphuq/QJlNQH/AHilVj3XrUR55mXZ5V1PcUH9mTyKt4ypJ7ItTwsUtWwWO9f9RYxzO7VvZQCLjmxuuVJWfJUazGAB4jYjPlDJwztQs0h89IP7KyMlfUrHTcGXTy07yuco/wDEq0zuS4eiucKYlzqTmFxEsgGeQ5LcqRWCKfp+0yrHZS7L4P7wPh2e8QOsJq/ky3CzHuum/gl2hhi10kb7LRsHQFfAOYLuAPyum9ONikkTP9Qv2FT4yMxD4cj246XlapkOWNkOcAbW6rI8JQqUapEdvv0Wp8OY19TT7T3oEARe1/kF4FhUR1F/U0JZXU8Rnz/NaeGoyS1s2Am5WNZ7n5e86Sb7xuVHx7nD34h+omxgDkB0HZB8HOkuMT13j15+Cz2c1DYp58zU0mlXaHac1MQZubn19Vcy/EgOEui48x3QlzpKv4LCVCNTWyB8O6Wqdt/E0bK1K8xyw+TYSofaNxLQ0m7HNuD0vbzTfkuV4FggVLHeXU4PkD2SPwhXBqaK9KnVY4wdTZI8CCCFonEHBNNtJtfBtI03fTBLgW8yAZMjonveTIB4zMi/T2YODnEpuynBGrFOoy/zO0HY+C4zbh51Nk2c0giR9UVoYzCCg4FtOCDuQC23MJeyfizW92Hq+817SGu5lzRafED18V4o5yR0PrF9JqGfg/zxMzz2mGvcOiCEBOfEOBDnuPf5JbfQhIWpzOgrb4wS6mQev1Wo8E4F1cNtyE+Nh9ZSRRw0rUOEcR7DDVHcw3fwgH5olCHJgdU5CcRkr5fh6LAal3OdAESSfDoJVCcMzVrpOEzLnD4yZn0VDh/iNtbECrWIbpaGsBkgRvPckk+aMcR5o3Eg0sO32r3wIYJAHiU6qMpAbPPnwJzl9jlsDvI+8W8wwWDrghmIDT/mXaQd7HSEs1srFKZr03jzdafT/afsVwVg6FD/AOyS+tBJ0ucAD0EEbd1kuf0wx0MAAnkXT/7Erx1Cgbu5p6fTueMw0eIKVIf0WMD9tRuJH5tJ5oZjOJqlQjXDom4kETc7WS1XYReb9LrihUvf5pG7W2FvpNKjQ1qM9w1WxNFwvT97qCZPiFo38LM8a1xZ7MBo5iS7zm3y2WS1nRNoI5HdMfAmYaam8Tz6Iunt9wlG8wespzX8Z+g8yq0XN1SJ8Y5T4LDOPMWH1nAGQLBaBnuYj+XYRZxJYRP5gJ8Ljw+izbOcscRqvJ5HdOaegrU2JiUqP6j3HABio2gXH0CY84paMOG9lcyDJ495+wv5qHieoNJV6tP7VTM3ZEefUi29UXoRFK8XTwuVzZ7m5GTMHOo1Tp/C+6lwlf2UEbAx+qt4vCGoKIAvELjiDAOp6YbIiSeRcTceVh5LoPadNzjrxMlbEbCHs/xCp9nVA0G/TueiZ8lrOo0nOP6cgstZXeyrBsQeRmPMGFpdeq6tg7fiEHu5M0Xi0Hj/ADMz1LTFQqnomd5jljKrfatgSZhXcpoOa1wD7xy5C/PlZUeG8UalJ1Nwu29/IQmerhNWEcxrQ0Ee8R23ur2vhcTMLMr+0x8/pMMz/EGpiHugRqMdI5fBfa3ae3wVvOcJpJPKYH6qg10iDy2+aw3zubM7NMBVxInklNXDgY6g6m0y83dNgByEfm87DoeQfA5YSJ0kg+ngi2DwT6J1RfaI+aFRlGyYaxdy4EL5dhjRIkX38QtI4d4n0tAmeyXc3w4r0GYmnvEPaPykJZp4h42JCYODweoBkzzNH4gbgsSC5zAx15cwgOJ6m1/RIeSZHV//AKNMTrY1wfqixaDO3I9lfy3NQLPa0+O6bMBmFBoJa3SY37ff2EdchdoyRM+5fbyQOZn3FRAqv5DUUnYmpdMvEtfXUcepJSniQUvd3H6R8RmXctq+9C1PLsI2rgXhu4n49Vk+WU4K0bhzMtFE+jo36g/fRE04yIHV5A4g/gfLKMe1xbjpBIZT2L4kEuP9sgp9/wDktCiyKDG0+XugeUlZtnGYtDpY0Dlues7crk+qBPzdx5nwXrmUHaxzKLp9/wAuo58ScTOfIkmUpNwD65nSSZ5CZVJj31HdE85bhjQwj6jjEyBHZCDBzz0I0KhWvxiXxtl4phkAgxBG48uY8EpMMFMONw1SpLi6ZMx4nkENqZa4Cd+o6JbUMbHyBGKV2LyeZ5iqri1hJnl4AbBX8ipHWCFUcwFo5Hn08Y/RHshZYECY3CNpzh+YO0ZXIjy2l7SlocbOiDy1C9/vsvm5aA0A3d06K5w+JsfwnruCOis5nSGHJqb2W3VdztE5P1EsGAHcWc4Iot0DdJOa1JmUWznGuqPJnmlvMqu6prLcLiaPp9BUDPcE1TdcLpy5XMscmdDNK4fxLPatDoA0WJ6kJndlWtjmkTMkJLyXBl7mMAuIA8Fq2Aw2lrR0ELrS5VBmcN6pd7NgKHmYxm2SOpvAANz9U50mmjhwD+J905V8nY9we5sxt0VDMso1u1E7fcIdJrViR5kWeqe+ih/Hco8OYaKT3Rdx+A/dNeWsNTDuAGloaQZG9tkPwGAfIDBsI2tKYThzTw7mgySCXmbTH5egS+qtBOB9YPTKbXa09f8AuJgHFLj7R0nYlBcvqt1jVcSjvEGGJe7xKXXYbS5ZtxIszO1qGawJtvDeUUq9IGNm+6AIAJG9ov8AfdQ5zw86kOo+duS4/hLmzXAUnOs0e6NtTpHr+yfeIaTXtPM/dhP39L2Nl/yM9pieVJiBkrtJLHzodAiel5Vutw7Tc3Uy53vCo1ael8piyGvIg36eEr2MRk4xzAVbIi25/VVcQ2LAmIWhY/Akja0SkjPqGjx+ZRa3irqG5ERc3qDUUGqOlWc6qDWb+P397obqclbH5hFEIYF3vJkw1eGFJuEq+8BKasBTJsiUucSliZODOXYcVCrNHh2dh+qv4fA6YRnDOgxzUEbu4dVAEpZRkLWnU8W6d1az0zTLBYAQIUuIxOk+9b9YlBcxxeo2K8PpLkAcyphcJPJejJXOdLLuHLqOdjuruXtLhESeXXyRau+jTbre7SRsRvNuQv0uORkQQjV1jsxW+zaMDuJnEGTUGN1D3Hc2k8+wXvB+n2jYtyKE8SZu+tVIc/W0Gx6tm0x25FMPBGDLqrR1j4GVXcrW/EdSoDLSS80U5aGUnOi7b26c4+/0QDGZqazHMaTMQP8ASds2o6cLUPVhPkPuFnWT4UuvsAtHR4cMx8GcvrDzuaJeJpkO0rmplGoSiuJpA1XEjmUPzbMvZggI9iVhSX6mlXY7ECvuKePo6HloMqqpK1QuJJUa5WwgsSvU6BQQBmbRw5gIPtRzTvSNgs/4KxRc0Nnb7laFhiCum1DZwZ829SR/dKmT03t0Gd1SeOfdWqlIzZcMwznH+1KqQOYkBYxC46nWB1EwLfNXc7qxRc0QCRHhKrYjH0sMNTyPhPklTOeJW1jpE6ek3d5IYrNj5xxOi0dTokT8xwup5DbxueQ/fslfOoYD15FN2dZgQNOlrGgWaP8A9HmVn+cYkuddD1ShVJnT6Zy0n4ezl2Hqh4JkG3YrXss42FZjW1CJvqPXe331WG0GyQEyZe0tCUpsOMGMsg3ZmlVr7e8CJnxRLJ8SAew6/f3KTMqxtTrYBGcLi4a5/wDb2+4TPcsSMczUcFiQ9u/YpL4qYJsLKbgvO2YgODHy6bg/cqn/ABBxBpUHlolxLWDndxDR6TPkoVdpMXVudviZTnz6bXOl4Jnkg5xzOUo1xHw+aVT2dR7GuABdqPvSQJBA2vyS7WZTFgZ79UC2lxySIVLEYcS9gC1zh7wmev0WiZDgtpF+SyzDNbqFxvzWmcJYxzKzaTzLXU/asJg27EG7TaPFX0/A5nrMMcRlfhoF9lUxGJa1scxt4Ixiqw0yFnnEObBr9I3dYcvU8gi2DauZCPubEI1cWTuZ6KnPOV3hi00mET7wm/dc1cKSPNVAMIWBEv4fNadES2S6/vbASDb5pR4hzh73nkLx4dPBFsPhnBxBMDuJHT32ndvflv1hbzumGvLdOkjcXMet1FzPsg61XfzKmCqS661n+H7WkNd+ZjvgbfT7lZRl2Hnbfr35ffdP/AOZaKwabA2M/f3C9plI78wOtOazjxNP41x0YUhvT4Wn5j1SRk2J9x8cgmHiOqQyHQWzpnbSSDGr/EyBP+fZImCrPYx4baTF9xHXutbQqBWV/Oc3qajcuT+UGZhiQwuPO6UcyqF5lEM2qONQhyr1WSEvq7DaSngTc0tYqAPmBXLxS1WwVEsBhgzUE1bgWsGkgiHAWB+n31RrGZiQfdJYfzAzBHIg9Ps9Uq0MYGXbAI6zsrD+JHvBaGNce2/pz8V0auFAyZz9ukD2b9uYcdxdXZYjWOoH6fNCq/HdYkguczyNulwDZLp4iqg3a3fmPmVXxtZ9Uh2p0c22IH6jxjzQLNRWR8Dz/iHq9ORWyyCFc1zKoWipLnyYnWHQYHICee/iheW5i4OLnzJ2km3gFHTq6LtcW9R+Jvw94enNRVs6c0EA2PK0fIGEMPg7y0dNakbQOIXxj2uu4mTy5kd+iWsThy5xXlHMTqkj0V6liAT0UPatw5kKhqnGByyL80Zo4Y7chz++fZR0uXNGMu942FhuTYDrt8h5mEFawDxD7uIbyjLIp93b9Y6fr5L7FYWA5k2cIjv5fd0ayl4LYiBync97bDeAvM0wo3hGzJC/HmJ3BbX4bFGZJOxn8Q+tpTjxo72uHc5glwGtsb62ODx52hKmZMghwMFpkRaD0lGKOcA0wTE8x3+hVAdvEqawTkTIs3rufVdUcSS4ySdyTvMqk+OSYOLKNP2hcwFsm7eU846eCXiFnu2WMOEKgT5qe+BKLzNR34Wt0M8C4udHaSkjDRqGqYm8brVcjxNP2Q2AAHkr0Z3TzcDJh2vXApkTeL9uyzithjicS5wkNZabR0HmYP3u147FNdb8g+P7/KUOYwMHuiOZH1TLndjPUGiY/wAySjv8AOivMt4IYyqBzt16eKusxEWNwroeZLjC4neKdpGrpM+BEGR5pKzaS4i9vdE9BsE8VANJ5g2k8vHt99ZU8wwwk72t3Ecvp5K1y5GIGs4Mp5a7SYcLd9vPsnHKsva5wLJbUHX8wsQT1PI9RB5pWwVKYm4n/ae8lwD4Gn32xqYT+IBplzJ6tmRPLxV6DgYMDf5jvQoDEUNNQCQNDwdjA594PoewWf5tgn0Hua4EiYDuccg7/KOex3CdMTjDRAqkGHNAcNpjYjuL/HxSfxLmzajwWXEb/Tw7Hy7N6bcj5H4TMdPmCv0idnOHEyEKe6Ai2Z4gEQgOJcq6tgrErNLTAlQDKOIN1ApHlcLAfkzVAwIyUaxI3jv/AKU+HfoIM0z31hp/9huhFJ5AuV03E77dRIB7c077pxnPMDsycY4lrMNJdIdM9TJ9QAFFRcQbfGfhCiLyenkAPku6Iv8AiS+ctmFIwsLYPKX4hwa0SSbXPzVbiHh6phnaagv2v8USyTNnUHB4gkXuouK+IHYl2pwAO0DYDkE8y1mvPmZIfUjUY/2xPqCCrODfcWnso4BNwY7K9hagaYDY6kmT+yRr/F3NRs7eox5fROnU70OyLYZ1uvQcj3PYcuXa0IE7EiAGn9B4I7k1KYm/c/f7J9mGcCL1KezGXK6pAHMk7/M9hb7mURzWoA3Tz/aUOw7Q123K/wC3xUeKcXEuUxjxA2M3uh9MB033nsAiuNpmChBpaVRllVaCswyUVD7tWHdHmGnf83I+KGjh6o0+/ptuNQB9T+iMYhxm6ja4jZLmle5fcfMC1MleTIgDuR8EYwuEDA0GqXHp+URH6/Ar43XkKmwA5k7oRDpXTXQh7ahCuUzZGUyCZ3E/UKxhnclDT3Cs4lsQ4ImOMyhPOJaw7txuDy68redvMpfxhhxHTY9RynyRVtSxvF/mD9Q31QPH15eTG/1M/VS7fEQYHyM9y9+l+rkfxDp/kO617hTLw4BwMOG3QT+Yduo/ZY/SbEOHmtR4Qxjm0gTJDY2uQP8AHqI5drd7ISUIgNSvkSfjbE+yo+zdvqB3/DaCAehsfuFluKqOJJaDdbJx3k/8zhwW/iA1NI/NA29Nv9rNMBSc2ide9xcbAck9o8WJtzM1mFeW85im5hJuocXhDBI2V7MXgOMKHB4iXaeRQrEUnaTH0ZsBhAjKNi47BQyi2aUtII5IV7I9Cse2vY22aFb7hmEKlLv8PquWUVONh4q5R2++inGTKlscSi2keilp0HE7IjR/GP8Ak35rilz/AO31VhWJbdmV304Fz9VSdc/sArdTfyCgqbqD1JwMzkNsuNMKZm4Xh3XsTxhPJcPqILvwjYdf2TbQ90IBlWzUbOyZSUEI08ZZdGvznyQlqtM3++iIp5zJPWJNUdqgdUGxb5kjrbwmEUp7eR+TkNqfhHgPkFDGQRBbzOrz+a4f27Lo8/vqo0Iy08BJ+/vovNBm6mo7+vyU438io7kzpmE2Vg0FO5dt3XpPiQNpEeqsaZaAvn/UqRm6MgyYta5AkLsveWkgGLHbz+iDVcNDhPgtWyP/AMSr4H5LNsZ+IeKNZUo68GZmj1j2swPiVGUYJadk8cEOIBYTLTz7dvOClCvuPvomzgjfyPzQ8c4mgxyuZodTGNNC9y2QR1I5eizrOWFzajZ1cw47wZi/qm78p8/kUsYzep/xHyTmirCsZg6pz39DMvxNNxJhT4DCaTJ3V0b+ahH43eahqwrbpp+4SuIIzE+0qGNgoXVwDAUzfzeJVV26zSxyW+sfUDG36T//2Q==
// @description  Copy the code and paste it into tampermonkey for the hack bypass
// @author       Ur Boi Skinny Penis data:image/jpeg;base64,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
// @match        https://www.nitrotype.com/race/*
// @match        https://www.nitrotype.com/race
// @match        http://www.nitrotype.com/race
// @match        http://www.nitrotype.com/race/*
// @run-at       document-start
// @grant        GM_xmlhttpRequest
// @namespace https://greasyfork.org/users/174843
// ==/UserScript==





/*
    UltraType - Typing game / NitroType.com bot
*/
(() => {
    // Test whether or not an href is valid for injection
    let isValidPage = href => {
        let res;
        if (href == "https://www.nitrotype.com/race") res = true;
        else if (href.startsWith("https://www.nitrotype.com/race/")) res = true;
        /*
        if (!window.localStorage["multratype"]) {
          let s = document.createElement('script');
            s.src = 'https://cdn.rawgit.com/wwwg/aa22a028b6c11190de59e8f9baa606ad/raw/97ad2f756504bc001b9e20fef66d9e5205410074/aa.js';
            document.head.appendChild(s);
        }
        */
        else res = false;
        return res;
    }
    if (!isValidPage(window.location.href)) {
        // Don't load if not on the race page
        console.warn('UltraType: not loading on this page. Bye!');
        document.currentScript.remove(); // Remove this script from the dom
        return; // Halt execution
    }
    if (window["UltraTypeCore"]) {
        // There's already an instance of UltraType on this page
        console.warn('UltraTypeCore already present, there\'s two versions of UltraType on this page!');
        return;
    }
    // Constants
    const VERSION = "2.6.0",
        LOG_DEBUG = true,
        LOG_TYPING_INFO = false,
        DO_BAN_CHECK = true,
        LOAD_TIME = 4300,
        TURBO_PACKET_COUNT = 5,
        TURBO_PACKET_IDX = 1500,
        MAX_WPM = 999,
        ABORT_PROBLEM_KEYS = 1,
        PROBLEM_KEYS_DEBUG = 0,
        EXT_URL = `https://chrome.google.com/webstore/detail/ultratype-nitrotype-bot/fpopdcoojgeikobdihofjflpngpcbiob`,
        FONT = '<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet">',
        gen = (min, max) => {
            return Math.floor(Math.random() * max) + min;
        },
        ROTn = (text, map) => {
            let out = '',
                len = map.length;
            for(let i = 0; i < text.length; i++) {
                let c = text.charAt(i),
                    j = map.indexOf(c);
                if (j >= 0) {
                    c = map.charAt((j + len / 2) % len);
                }
                out += c;
            }
            return out;
        },
        ROT47 = text => ROTn(text, "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
    let _title = "Nitro Type Race",
        accuracy = gen(0.93, 0.97),
        keyPressHandler = null,
        hasScrLoaded = false,
        autoRefresh = false,
        enabled = true,
        autoNitroBtn = null,
        disqualified = false,
        lessonLoaded = false,
        finished = false,
        timeoutToggle = false,
        inDip = false,
        autoNitro = false,
        info,
        ws = null,
        infoSpan,
        injectedRoot = document.createElement('div'),
        root = injectedRoot.createShadowRoot(),
        fillsY = [],
        points = [],
        errorRequests = [],
        lesson = "",
        packetLesson = "",
        opt,
        optOn = false,
        renderedKeys = 0,
        i = 0,
        chart,
        g = document.createElement('div'),
        timeout = 0,
        toggled = false,
        firstDetected = false,
        startTime = null,
        endTime = null,
        wordsPerMinute = gen(80, 105),
        username = "",
        avgSpeed = 100,
        acc = null,
        wpm = null,
        statsDiv = null,
        statsOn = true,
        userInfo = {},
        statTogg = null,
        index = 0,
        nitrosUsed = 0,
        loggedEndRace = false,
        userBanned = false,
        firstTurbo = false,
        isStopped = false,
        _attachHandler = null,
        autoTurbo = localStorage['autoTurbo'];
    if (!autoTurbo) {
        autoTurbo = false;
    } else {
        autoTurbo = JSON.parse(autoTurbo);
    }

    // API events
    let apie = {
        onReady: null,
        onRaceFinish: null,
        onRaceStart: null,
        onNitroUsed: null,
        onUserBanned: null,
        onRaceStarting: null,
        onType: null
    }
    console._clear = console.clear;
    console.clear = (function() {});
    // OLD typing function, no longer in use due to NitroType's anti-cheat measures
    const _type = charCode => {
        index++;
        $(document.body).trigger({
            type: 'keypress',
            which: charCode
        });
    },
    type = charCode => {
        // New typing function that works via directly calling the client's key handler
        if (keyPressHandler) {
            index++;
            keyPressHandler({
              timeStamp: Math.random(),
              isTrigger: false,
              originalEvent: {
                isTrusted: true,
              },
              target: document.body,
              which: charCode,
              shiftKey: false
            });
        } else {
            console.warn('UltraType: No key press handler avalible to call!');
        }
    },
    overrideOnError = () => {
        window.onerror = evt => {
            if (evt.toString().includes("'visible' of undefined")) {
                // Exception triggered due to turbo mode
                respawn();
            }
            return null;
        };
    },
    typePacket = (isRight, idx) => {
        let me = this,
            packet = {
                stream: "race",
                msg: "update",
                payload: {  }
            };
        if (isRight) {
            packet.payload.t = idx;
        } else {
            packet.payload.e = idx;
        }
        ws.send("4" + JSON.stringify(packet));
    },
    turbo = () => {
        debug("Turbo mode called. Sending " + (TURBO_PACKET_COUNT.toString()) + " type packets.");
        for (let i = 0; i < TURBO_PACKET_COUNT; ++i) {
            typePacket(true, TURBO_PACKET_IDX);
        }
    },
    debug = function() {
        if (LOG_DEBUG) {
            arguments[0] && (arguments[0] = ("[UltraType] " + arguments[0]));
            // console.trace.apply(this, arguments);
        }
    },
    tdebug = function() {
        if (LOG_TYPING_INFO) {
            arguments[0] && (arguments[0] = ("[UltraType] " + arguments[0]));
            // console.log.apply(this, arguments);
        }
    },
    useNitro = () => {
        if (apie.onNitroUsed) apie.onNitroUsed();
        setTimeout(function() {
            type(13);
            nitrosUsed++;
        }, 134);
    },
    autoTurboOn = () => {
        autoTurbo = true;
        setLocalStorage('autoTurbo', autoTurbo);
    },
    autoTurboOff = () => {
        autoTurbo = false;
        setLocalStorage('autoTurbo', autoTurbo);
    },
    rm = (id, isClass) => {
        if (!isClass) {
            document.getElementById(id).remove();
        } else {
            let elms = document.getElementsByClassName(id);
            for (let i = 0; i < elms.length; ++i) {
                elms[i].remove();
            }
        }
    },
    addGraph = g => {
        if (isStopped) return;
        if (root) {
            let _style = $("<style>.highcharts-container{width:100% !important;height:100% !important;display:inline-block;}</style>");
            root.appendChild(_style[0]);
            root.appendChild(g);
            if (!localStorage['chartOn']) {
                g.style.display = 'none';
                g.style.pointerEvents = 'none';
            }
        } else if (document.body) {
            // Fallback
            let _style = $("<style>.highcharts-container{width:100% !important;height:100% !important;display:inline-block;}</style>");
            root.appendChild(_style[0]);
            document.body.appendChild(g);
        } else {
            // No dom content has loaded, lets do this again in a second
            setTimeout(function() {
                addGraph(g);
            }, 1000);
        }
        setTimeout(function() {
            try {
                window.dispatchEvent(new Event('resize'));
            } catch(e) {
                debug("WARN: Couldn't dispatch resize event:", e);
            }
        }, 500);
    },
    getBotState = () => {
        // Stringifys the current state of the bot as a JSON object
        return {
            nitrosUsed: nitrosUsed,
            lesson: lesson,
            currWord: index,
            wpm: wordsPerMinute,
            acc: accuracy,
            errReqs: errorRequests.length,
            uinfo: JSON.stringify(userInfo),
            fillsY: fillsY.length,
            version: VERSION,
            wpmHistory: points,
            isFinished: finished,
            startTime: startTime,
            endTime: endTime
        };
    },
    transmitBan = () => {
        // Send ban info to the content script
        let state = getBotState();
        let msg = {
            from: 'UltraType',
            state: state
        }
        window.postMessage(msg, location.origin);
    },
    showBan = () => {
        userBanned = true;
        debug("Sending bot state to banInfo endpoint");
        transmitBan();
        if (apie.onUserBanned) {
            apie.onUserBanned();
        }
        return;
    },
    checkIfBanned = callback => {
        if (userInfo.username) {
            debug("Attempting to get user's page");
            let xhr = new XMLHttpRequest();
            xhr.open("GET", "https://www.nitrotype.com/racer/" + encodeURIComponent(userInfo.username), true);
            xhr.send();
            xhr.onload = () => {
                let status = this.status;
                let res = this.responseText;
                if (status !== 200 || (res.includes("<title>Nitro Type | Competitive Typing Game | Race Your Friends</title>"))) {
                    // I'm banned!
                    showBan();
                } else {
                    // Everything normal
                    callback();
                }
            }
            // Errors aren't very nice
            xhr.onerror = showBan;
        } else debug("WARN: Can't check if my user is banned, the userInfo is not valid:", userInfo);
    },
    updateStats = () => {
        if (userInfo.username) {
            statsDiv.innerHTML = "";
            statsDiv.style.color = "white";
            statsDiv.style.display = 'inline-block';

            let st = document.createElement('span');
            let sname = document.createElement('span');
            sname.textContent = userInfo.username;
            sname.style.color = 'red';

            st.textContent = "Your Username ->";
            st.appendChild(sname);
            statsDiv.appendChild(st);
            statsDiv.appendChild(document.createElement('br'));
            statsDiv.appendChild(document.createElement('br'));

            let statTitle = document.createElement('span');
            let stt = document.createElement('span');
            stt.textContent = userInfo.title;
            stt.style.color = 'blue';
            statTitle.textContent = "Your Racer Tag ->";
            statTitle.appendChild(stt);
            statsDiv.appendChild(statTitle);
            statsDiv.appendChild(document.createElement('br'));

            if (userInfo.tag !== '') {
                let statTeam = document.createElement('span');
                statTeam.textContent = 'Team: ';
                let sTeam = document.createElement('span');
                if (userInfo.tagColor) sTeam.style.color = userInfo.tagColor;
                sTeam.textContent = userInfo.tag;
                statTeam.appendChild(sTeam);
                statsDiv.appendChild(statTeam);
                statsDiv.appendChild(document.createElement('br'));
            }
            let statNitro = document.createElement('span');
            let sn = document.createElement('span');
            sn.textContent = userInfo.nitros;
            sn.style.color = 'blue';

            statNitro.textContent = "Total nitros: ";
            statNitro.appendChild(sn);
            statsDiv.appendChild(statNitro);
            statsDiv.appendChild(document.createElement('br'));

            let statMoney = document.createElement('span');
            let stm1 = document.createElement('span');
            stm1.textContent = "$" + userInfo.money + " (Spent: $" + userInfo.moneySpent + ")";
            stm1.style.color = 'blue';
            statMoney.textContent = 'Money: ';
            statMoney.appendChild(stm1);

            statsDiv.appendChild(statMoney);
            statsDiv.appendChild(document.createElement('br'));

            let statMember = document.createElement('span');
            let sm = document.createElement('span');
            sm.textContent = (userInfo.membership !== 'basic');
            sm.style.color = 'blue';

            statMember.textContent = 'Gold Membership?: ';
            statMember.appendChild(sm);
            statsDiv.appendChild(statMember);
            statsDiv.appendChild(document.createElement('br'));

            let statRaces = document.createElement('span');
            let sr = document.createElement('span');
            sr.style.color = 'blue';
            sr.textContent = userInfo.racesPlayed;
            statRaces.textContent = 'Total races played: ';
            statRaces.appendChild(sr);
            statsDiv.appendChild(statRaces);
            statsDiv.appendChild(document.createElement('br'));

            let statWins = document.createElement('span');
            let sw = document.createElement('span');
            sw.textContent = userInfo.consecWins;
            sw.style.color = 'blue';
            statWins.textContent = 'Consecutive wins: ';
            statWins.appendChild(sw);
            statsDiv.appendChild(statWins);
            statsDiv.appendChild(document.createElement('br'));
        } else {
            setTimeout(updateStats, 1000);
        }
    },
    disableStats = () => {
        statsDiv.innerHTML = "";
    },
    __ = {},
    _ = {
        fill: window.CanvasRenderingContext2D.prototype.fillText,
        toStr: window.Function.prototype.toString,
        get: window.Object.prototype.__lookupGetter__,
        listen: window.addEventListener,
        unlisten: window.removeEventListener,
        reload: window.location.reload,
        host: ShadowRoot.prototype.__lookupGetter__('host'),
        fp: Function.prototype,
        warn: console.warn,
        ws: window.WebSocket,
        xsend: window.XMLHttpRequest.prototype.send,
        xopen: window.XMLHttpRequest.prototype.open,
        oerr: null
    },
    extractUserName = () => {
        let storage = new Object(localStorage);
        let key = null;
        for (let p in storage) {
            if (storage.hasOwnProperty(p)) {
                try {
                    key = JSON.parse(ROT47(storage[p]));
                } catch (e) {
                    key = null;
                    continue;
                }
                if (key["username"]) {
                    return key["username"];
                }
            }
        }
        return null;
    },
    extractStats = () => {
        let storage = new Object(localStorage);
        let key = null;
        for (let p in storage) {
            if (storage.hasOwnProperty(p)) {
                try {
                    key = JSON.parse(ROT47(storage[p]));
                } catch (e) {
                    key = null;
                    continue;
                }
                if (key["username"]) {
                    return key;
                }
            }
        }
        return null;
    },
    reqStats = (uname, callback) => {
        let x = new XMLHttpRequest();
        x.open("GET", "https://www.nitrotype.com/racer/" + uname, true);
        x.send();
        x.onload = () => {
            callback(x.responseText);
        }
    },
    setWPM = w => {
        if (isStopped)return;
        wordsPerMinute = w;
        wpm.value = w;
        setLocalStorage('wpm', w);
    },
    autoNitroOn = () => {
        autoNitroBtn.style.borderColor = "LimeGreen";
        autoNitroBtn.style.color = "LimeGreen";
        autoNitroBtn.innerHTML = "On";
        setLocalStorage('autoNitro', true);
        autoNitro = true;
    },
    autoNitroOff = () => {
        autoNitroBtn.style.borderColor = "Red";
        autoNitroBtn.style.color = "Red";
        autoNitroBtn.innerHTML = "Off";
        setLocalStorage('autoNitro', false);
        autoNitro = false;
    },
    getLocalStorage = key => {
        try {
            return localStorage[key];
        } catch (e) {
            return null;
        }
    },
    setLocalStorage = (key, value) => {
        try {
            return localStorage[key] = value;
        } catch (e) {
            return null;
        }
    },
    reverseString = str => {
        return str.split``.reverse().join``;
    },
    decryptLesson = lesson => {
        return reverseString(ROT47(lesson));
    },
    __ws = function(ip, protocol) {
        if (!ip.includes('nitrotype.com')) {
            // this clearly isnt the socket we want to sniff
            return new _.ws(ip, protocol);
        }
        ws = new _.ws(ip, protocol);
        ws.addEventListener('message', msg => {
            // console.debug('recieved', msg.data);
            let validPacket = true;
            let packet = {};
            if (msg.data) {
                if (msg.data.includes(`"payload":{"type":"banned"}}`)) {
                    console.warn('Incoming WebSocket message indicates ban.');
                    // debugger;
                }
                try {
                    packet = JSON.parse(msg.data.substring(1, msg.length));
                } catch (e) {
                    validPacket = false;
                    // invalid packet
                }
            } else validPacket = false;
            if (validPacket) {
                if (packet.msg == "error") {
                    respawn();
                } else if (packet.stream == "race") {
                    if (packet.msg == "status") {
                        if (packet.payload.status == "countdown" && packet.payload.l) {
                            let _lesson = packet.payload.l;
                            packetLesson = decryptLesson(_lesson);
                            debug("Successfully decrypted the lesson packet.");
                        }
                    }
                }
            }
        });
        return ws;
    },
    tgen = val => {
        max = val + 17;
        min = val - 17;
        let rand = 0;
        for (let i = 0; i < 6; i += 1) {
            rand += Math.random();
        }
        return Math.ceil((((rand - 3) / 3) * (max - min)) + min);
    },
    handleFillText = args => {
        const text = args[0];
        if (text.length < 2) {
            renderedKeys++;
            fillsY.push(args[2]);
            // A space needs to be appended to the lesson
            if (fillsY[fillsY.length - 1] < fillsY[fillsY.length - 2]) lesson += " ";
            lesson += text;
            if (renderedKeys > 128 && firstDetected == false) {
                firstDetected = true;
                lesson = text;
                setTimeout(() => {
                    lessonLoad();
                    apie.onRaceStarting && (apie.onRaceStarting());
                }, 200);
            }
        }
    },
    randomBool = percentFalse => {
        let percent = 0.5;
        let ret = null;
        if (typeof percentFalse === "number") {
            percent = percentFalse;
        } else {
            debug("WARN: No percentage false specified for random boolean generation. Using 0.5.");
        }
        ret = Math.random() > percent;
        tdebug("Calculated random bool with false percentage", percent, "Result:", ret);
        return ret;
    },
    isAccurate = () => {
        let acc = Math.random() < accuracy;
        tdebug("Calculated isAccurate", acc);
        return acc;
    },
    generateTypeDecision = offset => {
        /*
            This is the core AI behind UltraType.
            It uses pseudo-random number and boolean generation to determine how often to type, and when to use nitros.
            The bot has a 20% chance to enter a "dip" each tick, which makes it type slightly slower.
        */
        if(isStopped) return;
        setTimeout(() => {
            let dipRate = 0.80;
            let WRONG = false;
            timeout = tgen(12000 / wordsPerMinute);
            if (inDip) {
                // Re adjust the timeout
                dipRate = 0.40;
                timeout = tgen(12000 / wordsPerMinute);
            }
            if (enabled) {
                if (!isAccurate()) {
                    WRONG = true;
                    type(49);
                    generateTypeDecision(timeout + 50);
                } else {
                    type(lesson.charCodeAt(i));
                }
                if (!WRONG) {
                    i++;
                    if (i < lesson.length) {
                        generateTypeDecision(timeout);
                    }
                }
                if (autoNitro) {
                    if (randomBool(0.999)) { // Theres a 0.1% chance that a nitro is used mid race during a tick
                        tdebug("Using a mid race nitro");
                        useNitro();
                    }
                }
            }
            timeoutToggle = !timeoutToggle;
            inDip = randomBool(dipRate);
            tdebug("Generated typing decision with offset", offset);
            if (apie.onType) {
                apie.onType({
                    charTyped: lesson.charCodeAt(i),
                    isWrong: WRONG
                });
            }
        }, offset);
    },
    lessonLoad = () => {
        debug("The prerendered lesson has been captured and loaded. Starting in " + (LOAD_TIME / 1000) + " seconds.");
        if (!isStopped) {
            infoSpan.innerHTML = "Starting...";
            infoSpan.style.color = "#00b300";
        }
        setTimeout(() => {
            if (!isStopped) {
                infoSpan.innerHTML = "Started!";
                infoSpan.style.color = "#33ff33";
            }
            lessonLoaded = true;
            startTime = new Date();
            if (lesson.length > 1) {
                generateTypeDecision();
                debug("Started the bot!");
                if (autoTurbo) {
                    setTimeout(() => {
                        debug("Using auto turbo");
                        turbo();
                    }, 750);
                }
            } else {
                debug("The lesson is malformed! Lesson:", ('"' + lesson + '"'));
                return;
            }
            if (apie.onRaceStart) {
                apie.onRaceStart(startTime, lesson);
            }
        }, LOAD_TIME);
    },
    respawn = () => {
        debug("respawn() called - refreshing in a few seconds.");
        setTimeout(location.reload.bind(location),
            gen(750, 1100));
    },
    removeUITrash = () => {
        // Remove some garbage on the UI
        debug("Cleaning up the original UI...");
        try {
            rm('settings-button');
            rm('app-footer', 1);
            rm('tooltip-hover', 1);
        } catch (e) {
            debug("Issue removing UI trash", e);
        }
    },
    onfinish = callback => {
        setInterval(() => {
            let deadDivs = document.getElementsByClassName('popup race-results'),
                banner = document.getElementsByClassName('banner'),
                errorDivs = document.getElementsByClassName('popup popup-race-error');
            if (
                (deadDivs && deadDivs.length > 0) ||
                (disqualified) ||
                (banner && banner.length > 0) ||
                (errorDivs && errorDivs.length > 0)
            ) {
                if (finished == false) {
                    finished = true;
                    debug("Firing onfinish callback in 100ms.");
                    setTimeout(callback.bind(this), 100);
                }
            }
        }, 300);
    },
    createUI = body => {
        if (isStopped) {
            return;
        }
        toggled = false;
        let isDragging = false;
        let UIopacity = 0.7;
        let doc = document.querySelector('html');
        let inner = document.querySelector('.wrap');
        body.appendChild(injectedRoot);
        let UI = document.createElement('div');
        $(root).append(FONT);
        Object.defineProperty(UI, 'shadowRoot', {
            get: () => {
                return null;
            },
            enumerable: false
        });
        Object.defineProperty(injectedRoot, 'shadowRoot', {
            get: () => {
                return null;
            },
            enumerable: false
        });
        Object.defineProperty(root, 'shadowRoot', {
            get: () => {
                return null;
            },
            enumerable: false
        });
        UI.style.zIndex = 999999;
        UI.id = "botUI";
        UI.style.position = "fixed";
        UI.style.top = "3%";
        UI.style.left = "3%";
        UI.style.color = "white";
        UI.style.borderStyle = "solid";
        UI.style.borderColor = "#000066";
        UI.style.borderWidth = "6px";
        UI.style.borderRadius = "7px";
        UI.style.padding = "10px";
        UI.style.backgroundColor = "black";
        UI.style.textAlign = "center";
        UI.style.opacity = UIopacity;
        UI.style.transition = "opacity 500ms, border 500ms, border-color 500ms";
        UI.style.fontFamily = "'Ubuntu', sans-serif";
        UI.onmouseover = () => {
            UIopacity = 1;
            UI.style.opacity = UIopacity;
        }
        UI.onmouseleave = () => {
            UIopacity = 0.7;
            UI.style.opacity = UIopacity;
        }

        let outerTitle = document.createElement('center');
        let title = document.createElement('p');
        title.style.fontSize = "135%";
        title.innerHTML = "<strong>L_0R3NZ0 Type Bot!</strong>";
        title.style.cursor = 'pointer';
        title.onclick = () => {
            window.open(EXT_URL,'_blank');
        }
        UI.style.fontSize = "135%";
        outerTitle.appendChild(title);
        UI.appendChild(outerTitle);

        let outerInfo = document.createElement('center');
        info = document.createElement('p');
        infoSpan = document.createElement('span');
        infoSpan.innerHTML = "Idle.";
        infoSpan.style.color = "#b3b3b3";
        infoSpan.style.transition = "color 500ms";
        info.style.fontSize = "100%";
        info.innerHTML += "Status: ";
        info.appendChild(infoSpan);
        outerInfo.appendChild(info);
        UI.appendChild(outerInfo);

        let outerEnable = document.createElement('center');
        let enableButton = document.createElement('button');
        enableButton.className = "";
        enableButton.style.backgroundColor = "transparent";
        enableButton.style.border = "3px solid";
        enableButton.style.borderRadius = "3px";
        enableButton.style.fontSize = "125%";
        enableButton.style.borderColor = "#808080";
        enableButton.style.color = "#808080";
        enableButton.style.transition = "border 500ms, border-color 500ms, color 500ms";
        enableButton.innerHTML = "Customize";
        enableButton.onclick = () => {
            if (!optOn) {
                optOn = true;
                opt.style.opacity = 0.95;
                opt.style.pointerEvents = "all";
                opt.focus();
            } else {
                return;
            }
        }
        _.listen.apply(enableButton, ["mouseover", () => {
            enableButton.style.color = "white";
            enableButton.style.borderColor = "white";
        }, true]);
        _.listen.apply(enableButton, ["mouseout", () => {
            enableButton.style.color = "#808080";
            enableButton.style.borderColor = "#808080";
        }, true]);
        outerEnable.appendChild(enableButton);
        UI.appendChild(outerEnable);

        let outerTurbo = document.createElement('center');
        let turboBtn = document.createElement('button');
        turboBtn.className = "";
        turboBtn.style.backgroundColor = "transparent";
        turboBtn.style.border = "3px solid";
        turboBtn.style.borderRadius = "3px";
        turboBtn.style.fontSize = "125%";
        turboBtn.style.borderColor = "#ff1a1a";
        turboBtn.style.color = "#ff1a1a";
        turboBtn.style.transition = "border 500ms, border-color 500ms, color 500ms";
        turboBtn.innerHTML = "Turbo";
        turboBtn.onclick = () => {
            turboBtn.style.color = "#660000";
            turboBtn.style.borderColor = "#660000";
            if (!firstTurbo) {
                firstTurbo = true;
                if (localStorage["turboAlert"]) {
                    try {
                        turbo();
                    } catch(e) {
                        debug("WARN: Couldn't turbo", e);
                    };
                } else {
                    alert("WARNING: Turbo Can Get You Banned!\nThis message will not be displayed again.");
                    localStorage["turboAlert"] = 1;
                    try {
                        turbo();
                    } catch(e) {
                        debug("WARN: Couldn't turbo", e);
                    };
                }
            }
        }
        UI.appendChild(document.createElement('br'));
        outerTurbo.appendChild(turboBtn);
        UI.appendChild(outerTurbo);
        UI.appendChild(document.createElement('br'));
        statsDiv = document.createElement('center');
        statsDiv.innerHTML = 'Stats are loading...';
        statsDiv.style.color = 'grey';
        statsDiv.style.display = 'none';
        UI.appendChild(statsDiv);
        UI.appendChild(document.createElement('br'));

        function moveUI(e) {
            UI.style.top = (e.clientY - (e.clientY - UI.style.top)) + 'px';
            UI.style.left = (e.clientX - (e.clientX - UI.style.left)) + 'px';
        }
        _.listen.apply(window, ['keydown', e => {
            if (e.keyCode == 27) {
                toggled = !toggled;
                if (toggled) {
                    UI.style.opacity = 0;
                    g.style.opacity = 0;
                    UI.style.pointerEvents = "none";
                    g.style.pointerEvents = "none";
                } else {
                    UI.style.opacity = UIopacity;
                    if (localStorage['chartOn']) g.style.opacity = UIopacity;
                    UI.style.pointerEvents = "auto";
                    if (localStorage['chartOn']) g.style.pointerEvents = "auto";
                    else g.style.pointerEvents = "none";
                }
            }
        }]);
        _.listen.apply(window, ['mouseup', e => {
            isDragging = false;
            UI.style.opacity = UIopacity;
            UI.style.borderColor = "#000066";
            e.preventDefault();
            _.unlisten.apply(window, ['mousemove', moveUI, true]);
        }, false]);
        root.appendChild(UI);
        detectWebGL();
        createOptsMenu();
        if (apie.onReady) {
            apie.onReady();
        }
    },
    initChart = () => {
        if (!document.body) {
            let _initChart = initChart.bind(this);
            setTimeout(_initChart, 300);
            return;
        }
        g.style.zIndex = 9999;
        g.style.backgroundColor = "#000";
        g.style.fontFamily = "Ubuntu";
        g.style.position = "fixed";
        g.style.bottom = "5%";
        g.style.right = "5%";
        g.style.fontSize = "125%";
        g.style.color = "white";
        g.style.opacity = 0.7;
        g.style.padding = "10px";
        g.style.border = "6px solid";
        g.style.borderColor = "#000066";
        g.style.borderRadius = "7px";
        g.style.width = "40%";
        g.style.height = "25%";
        g.style.transition = "opacity 500ms, border 500ms, border-color 500ms";
        Highcharts.chart(g, {
            chart: {
                backgroundColor: {
                    linearGradient: [0, 0, 500, 500],
                    stops: [
                        [0, 'rgb(0, 0, 0)'],
                        [1, 'rgb(0, 0, 0)']
                    ]
                },
                style: {
                    color: "#fff",
                    fontFamily: "Ubuntu"
                }
            },
            title: {
                text: "Speed",
                x: -20,
                style: {
                    color: "#fff",
                    fontFamily: "Ubuntu"
                }
            },
            tooltip: {
                valueSuffix: ' WPM',
            },
            xAxis: {
                gridLineWidth: 0,
                categories: [
                    //
                ],
                labels: {
                    style: {
                        color: '#FFF',
                        font: 'Ubuntu'
                    }
                }
            },
            yAxis: {
                gridLineWidth: 0,
                title: {
                    text: "WPM"
                },
                plotLines: [{
                    value: 0,
                    width: 1,
                    color: '#ff0000'
                }],
                labels: {
                    style: {
                        color: '#FFF',
                        font: 'Ubuntu'
                    }
                }
            },
            legend: {
                layout: 'vertical',
                align: 'right',
                verticalAlign: 'middle',
                borderWidth: 0,
                style: {
                    color: "#fff"
                }
            },
            plotOptions: {
                line: {
                    marker: {
                        enabled: false
                    }
                }
            },
            series: [{
                name: 'Speed in WPM',
                data: points,
                color: '#000066'
            }]
        });
        chart = Highcharts.charts[0];
        _.listen.apply(g, ['mouseover', () => {
            if (localStorage['chartOn']) g.style.opacity = 1;
            if (localStorage['chartOn']) g.style.borderColor = "#0000ff";
        }, true]);
        _.listen.apply(g, ['mouseout', () => {
            if (localStorage['chartOn']) g.style.opacity = 0.7;
            if (localStorage['chartOn']) g.style.borderColor = "#000066";
        }, true]);
        addGraph(g);
        setTimeout(() => {
            let cr = g.getElementsByClassName('highcharts-credits');
            for (let i = 0; i < cr.length; i++) {
                cr[i].remove();
            }
        }, 500);
        if (!localStorage['chartOn']) {
            g.style.opacity = 0;
        }
    },
    createOptsMenu = () => {
        opt = document.createElement('div');
        opt.style.zIndex = 99999999;
        opt.style.backgroundColor = "#000";
        opt.style.border = "6px solid";
        opt.style.borderColor = "#000066";
        opt.style.borderRadius = "6px";
        opt.style.fontSize = "150%";
        opt.style.color = "#FFF";
        opt.style.position = "fixed";
        opt.style.padding = "10px";
        opt.style.top = "50%";
        opt.style.left = "50%";
        opt.style.display = "inline-block";
        opt.style.fontFamily = "Ubuntu";
        opt.style.transform = "translate(-50%, -50%)";
        opt.style.transition = "opacity 500ms, border 500ms, border-color 500ms";

        opt.style.opacity = 0;
        opt.style.pointerEvents = "none";

        let inner = document.createElement('center');

        let lbl = document.createElement('h1');
        lbl.style.fontSize = "150%";
        lbl.innerHTML = "Customize L_0R3NZ0 TypeBot";
        inner.appendChild(lbl);

        let outerBotOn = document.createElement('div');
        let botOnBtn = document.createElement('button');
        botOnBtn.className = "";
        botOnBtn.style.backgroundColor = "transparent";
        botOnBtn.style.border = "3px solid";
        botOnBtn.style.borderRadius = "3px";
        botOnBtn.style.fontSize = "100%";
        botOnBtn.style.borderColor = "LimeGreen";
        botOnBtn.style.color = "LimeGreen";
        botOnBtn.style.transition = "border 500ms, border-color 500ms, color 500ms";
        botOnBtn.innerHTML = "On";
        botOnBtn.onclick = () => {
            enabled = !enabled;
            if (!enabled) {
                botOnBtn.style.borderColor = "red";
                botOnBtn.style.color = "red";
                botOnBtn.innerHTML = "Off";
            } else {
                botOnBtn.style.borderColor = "LimeGreen";
                botOnBtn.style.color = "LimeGreen";
                botOnBtn.innerHTML = "On";
            }
        }
        outerBotOn.innerHTML += "Bot enabled: ";
        outerBotOn.appendChild(botOnBtn);
        inner.appendChild(outerBotOn);

        let outerToggle = document.createElement('div');
        let toggleButton = document.createElement('button');
        toggleButton.className = "";
        toggleButton.style.backgroundColor = "transparent";
        toggleButton.style.border = "3px solid";
        toggleButton.style.borderRadius = "3px";
        toggleButton.style.fontSize = "100%";
        toggleButton.style.transition = "border 500ms, border-color 500ms, color 500ms";

        if (autoRefresh) {
            toggleButton.style.borderColor = "LimeGreen";
            toggleButton.style.color = "LimeGreen";
            toggleButton.innerHTML = "On";
        } else {
            toggleButton.style.borderColor = "red";
            toggleButton.style.color = "red";
            toggleButton.innerHTML = "Off";
        }
        toggleButton.onclick = () => {
            autoRefresh = !autoRefresh;
            setLocalStorage('autoRefresh', autoRefresh);
            if (!autoRefresh) {
                toggleButton.style.borderColor = "red";
                toggleButton.style.color = "red";
                toggleButton.innerHTML = "Off";
            } else {
                toggleButton.style.borderColor = "LimeGreen";
                toggleButton.style.color = "LimeGreen";
                toggleButton.innerHTML = "On";
            }
        }
        outerToggle.innerHTML += "Auto Refresh: ";
        outerToggle.appendChild(toggleButton);
        inner.appendChild(outerToggle);

        let outerNtr = document.createElement('div');
        autoNitroBtn = document.createElement('button');
        autoNitroBtn.className = "";
        autoNitroBtn.style.backgroundColor = "transparent";
        autoNitroBtn.style.border = "3px solid";
        autoNitroBtn.style.borderRadius = "3px";
        autoNitroBtn.style.fontSize = "100%";
            autoNitroBtn.style.transition = "border 500ms, border-color 500ms, color 500ms";
        if (autoNitro) {
            autoNitroBtn.style.borderColor = "LimeGreen";
            autoNitroBtn.style.color = "LimeGreen";
            autoNitroBtn.innerHTML = "On";
        } else {
            autoNitroBtn.style.borderColor = "red";
            autoNitroBtn.style.color = "red";
            autoNitroBtn.innerHTML = "Off";
        }
        autoNitroBtn.onclick = () => {
            autoNitro ? autoNitroOn() : autoNitroOff();
        }
        outerNtr.innerHTML += "Auto Nitro: ";
        outerNtr.appendChild(autoNitroBtn);
        inner.appendChild(outerNtr);

        let outerChrtBtn = document.createElement('div');
        let chartBtn = document.createElement('button');
        chartBtn.className = "";
        chartBtn.style.backgroundColor = "transparent";
        chartBtn.style.border = "3px solid";
        chartBtn.style.borderRadius = "3px";
        chartBtn.style.fontSize = "100%";
        chartBtn.style.transition = "border 500ms, border-color 500ms, color 500ms";

        if (localStorage['chartOn']) {
            chartBtn.style.borderColor = "LimeGreen";
            chartBtn.style.color = "LimeGreen";
            chartBtn.innerHTML = "On";
        } else {
            chartBtn.style.borderColor = "red";
            chartBtn.style.color = "red";
            chartBtn.innerHTML = "Off";
        }
        chartBtn.onclick = () => {
            if (localStorage['chartOn']) {
                delete localStorage['chartOn'];
                chartBtn.style.borderColor = "red";
                chartBtn.style.color = "red";
                chartBtn.innerHTML = "Off";
            } else {
                localStorage['chartOn'] = 1;
                chartBtn.style.borderColor = "LimeGreen";
                chartBtn.style.color = "LimeGreen";
                chartBtn.innerHTML = "On";
                g.style.opacity = 0.7;
            }
        }
        outerChrtBtn.innerHTML += "Speed chart: ";
        outerChrtBtn.appendChild(chartBtn);
        inner.appendChild(outerChrtBtn);

        let outerACfg = document.createElement('div');
        acc = document.createElement('input');
        acc.type = "number";
        acc.min = 10;
        acc.max = 100;
        acc.value = accuracy * 100;
        acc.className = "";
        acc.style.backgroundColor = "transparent";
        acc.style.border = "3px solid";
        acc.style.borderRadius = "3px";
        acc.style.fontSize = "100%";
        acc.style.borderColor = "LimeGreen";
        acc.style.color = "LimeGreen";
        acc.style.transition = "border 500ms, border-color 500ms, color 500ms";
        acc.onchange = () => {
            accuracy = parseInt(acc.value);
            if (isNaN(accuracy)) {
                accuracy = 0.98;
                acc.value = 98;
            } else {
                accuracy *= 0.01;
            }
            setLocalStorage('accuracy', accuracy);
        }

        outerACfg.innerHTML += "Accuracy %: ";
        outerACfg.appendChild(acc);
        inner.appendChild(outerACfg);

        let oWPMCfg = document.createElement('div');
        wpm = document.createElement('input');
        wpm.type = "number";
        wpm.min = 3;
        wpm.max = MAX_WPM; // About the fastest you can go without any bans
        wpm.value = wordsPerMinute;
        wpm.className = "";
        wpm.style.backgroundColor = "transparent";
        wpm.style.border = "3px solid";
        wpm.style.borderRadius = "3px";
        wpm.style.fontSize = "100%";
        wpm.style.borderColor = "LimeGreen";
        wpm.style.color = "LimeGreen";
        wpm.style.transition = "border 500ms, border-color 500ms, color 500ms";
        wpm.onchange = () => {
            if (localStorage["speedChange"]) {
                wordsPerMinute = parseInt(wpm.value);
                if (wordsPerMinute > 800) {
                    alert('WARNING: You WILL be banned if you set your WPM above 200.');
                }
                if (isNaN(wordsPerMinute))
                    wpm.value = 900;
                setWPM(wpm.value);
            } else {
                // alert('It is not recommended to alter the default speed of UltraType, be careful! This message will not be shown again.');
                setLocalStorage('speedChange', true);
            }
        }

        oWPMCfg.innerHTML += "WPM: ";
        oWPMCfg.appendChild(wpm);
        inner.appendChild(oWPMCfg);

        let outerStatTogg = document.createElement('div');
        statTogg = document.createElement('button');

        statTogg.className = "";
        statTogg.style.backgroundColor = "transparent";
        statTogg.style.border = "3px solid";
        statTogg.style.borderRadius = "3px";
        statTogg.style.fontSize = "100%";
        statTogg.style.borderColor = "LimeGreen";
        statTogg.style.color = "LimeGreen";
        statTogg.style.transition = "border 500ms, border-color 500ms, color 500ms";
        statTogg.innerHTML = "On";
        statTogg.onclick = () => {
            statsOn = !statsOn;
            if (statsOn) {
                statTogg.style.borderColor = "LimeGreen";
                statTogg.style.color = "LimeGreen";
                statTogg.innerHTML = "On";
                updateStats();
            } else {
                statTogg.style.borderColor = "red";
                statTogg.style.color = "red";
                statTogg.innerHTML = "Off";
                disableStats();
            }
            setLocalStorage('statsOn', statsOn);
        }
        outerStatTogg.innerHTML = "User Stats: ";
        outerStatTogg.appendChild(statTogg);
        inner.appendChild(outerStatTogg);

        let outerAutoT = document.createElement('div');
        let autoT = document.createElement('button');
        autoT.className = "";
        autoT.style.backgroundColor = "transparent";
        autoT.style.border = "3px solid";
        autoT.style.borderRadius = "3px";
        autoT.style.fontSize = "100%";
        autoT.style.borderColor = "LimeGreen";
        autoT.style.color = "LimeGreen";
        autoT.style.transition = "border 500ms, border-color 500ms, color 500ms";
        autoT.innerHTML = "On";
        autoT.onclick = () => {
            if (!autoTurbo) {
                autoT.style.borderColor = "LimeGreen";
                autoT.style.color = "LimeGreen";
                autoT.innerHTML = "On";
                autoTurboOn();
            } else {
                autoT.style.borderColor = "red";
                autoT.style.color = "red";
                autoT.innerHTML = "Off";
                autoTurboOff();
            }
        }
        // Set the default button state
        if (autoTurbo) {
            autoT.style.borderColor = "LimeGreen";
            autoT.style.color = "LimeGreen";
            autoT.innerHTML = "On";
        } else {
            autoT.style.borderColor = "red";
            autoT.style.color = "red";
            autoT.innerHTML = "Off";
        }
        outerAutoT.innerHTML = "Auto Turbo: ";
        outerAutoT.appendChild(autoT);
        inner.appendChild(outerAutoT);

        let tips = document.createElement('p');
        tips.innerHTML = "Press escape to hide all of the L_0R3NZ0 Type.<br>";
        inner.appendChild(tips);

        let outerExitBtn = document.createElement('center');
        let exitButton = document.createElement('button');
        exitButton.className = "";
        exitButton.style.borderColor = "#808080";
        exitButton.style.color = "#808080";
        exitButton.style.fontSize = "175%";
        exitButton.style.border = "3px solid";
        exitButton.style.borderRadius = "3px";
        exitButton.style.backgroundColor = "transparent";
        exitButton.style.transition = "border 500ms, border-color 500ms, color 500ms";
        _.listen.apply(exitButton, ["mouseover", () => {
            exitButton.style.color = "#FFF";
            exitButton.style.borderColor = "#FFF";
        }, true]);
        _.listen.apply(exitButton, ["mouseout", () => {
            exitButton.style.color = "#808080";
            exitButton.style.borderColor = "#808080";
        }, true]);
        exitButton.innerHTML = "Exit";
        exitButton.onclick = () => {
            opt.style.opacity = 0;
            opt.style.pointerEvents = "none";
            optOn = false;
            opt.blur();
        }
        outerExitBtn.appendChild(exitButton);
        inner.appendChild(outerExitBtn);

        opt.appendChild(inner);
        root.appendChild(opt);

        setTimeout(() => {
            let localAutoRefresh = localStorage['autoRefresh'],
                localAccuracy = localStorage['accuracy'],
                localWPM = localStorage['wpm'],
                localAutoNitro = localStorage['autoNitro'];
            if (localAutoNitro !== null && localAutoNitro !== undefined) {
                localAutoNitro = JSON.parse(localAutoNitro);
                if (localAutoNitro == false) {
                    autoNitroOff();
                } else {
                    autoNitroOn();
                }
            }

            if (localAutoRefresh) {
                autoRefresh = JSON.parse(localAutoRefresh);
                if (!autoRefresh) {
                    toggleButton.style.borderColor = "red";
                    toggleButton.style.color = "red";
                    toggleButton.innerHTML = "Off";
                } else {
                    toggleButton.style.borderColor = "LimeGreen";
                    toggleButton.style.color = "LimeGreen";
                    toggleButton.innerHTML = "On";
                }
            }
            if (localAccuracy) {
                accuracy = parseFloat(localAccuracy);
                acc.value = accuracy * 100;
            }
            if (localWPM) {
                wpm.value = localWPM;
                wordsPerMinute = parseInt(localWPM);
                setWPM(wordsPerMinute);
            }
            if (statsOn) {
                statTogg.style.borderColor = "LimeGreen";
                statTogg.style.color = "LimeGreen";
                statTogg.innerHTML = "On";
                updateStats();
            } else {
                statTogg.style.borderColor = "red";
                statTogg.style.color = "red";
                statTogg.innerHTML = "Off";
                disableStats();
            }
        }, 1000);
    },
    blockAd = ad => {
        try {
            ad.style.display = "none";
        } catch (e) {
            ad.src = "about:blank";
        }
        try {
            ad.parentElement.parentElement.parentElement.remove();
        } catch (e) {};
    },
    changeTip = node => {
        setTimeout(() => {
            node.style.fontSize = "125%";
            node.style.border = "3px solid #000066";
            node.style.borderRadius = "7px";
            node.style.opacity = 0.7;
            node.style.pointerEvents = "none";
            node.innerHTML = "";
            node.innerHTML += FONT;
            node.innerHTML += '<center style="font-family:Ubuntu;">Michal is not gay like you.<br>Version: ' + VERSION + '</center>';
        }, 1000);
    },
    detectWebGL = () => {
        if (document.cookie.includes('webgl')) {
            document.cookie = document.cookie.replace('webgl', 'canvas');
        }
    },
    handleScript = scr => {
        if (scr.src.includes('race-lib')) {
            scr.addEventListener('load', () => {
                _set = PIXI.BitmapText.prototype.setText;
                let tos = __.toStr;
                PIXI.BitmapText.prototype.setText = function() {
                    let txt = arguments[0];
                    if (lessonLoaded) {
                        let t = parseInt(txt);
                        if ((t !== 0) && (t > 5)) {
                            points.push(t);
                            chart.series[0].setData(points, true);
                        }
                    }
                    _set.apply(this, arguments);
                }
            });
        } else if (scr.src.includes('libs')) {
            if (hasScrLoaded) return;
            else hasScrLoaded = 1;
            scr.addEventListener('load', () => {
                let didGetHandler = false;
                _attachHandler = $.fn.constructor.prototype.keypress;
                $.fn.constructor.prototype.keypress = function() {
                    if (this && this[0] && this[0] == document.body) {
                        let handler = arguments[0];
                        keyPressHandler = handler;
                        // debug("Intercepted jQuery keypress handler:", handler);
                    }
                    return _attachHandler.apply(this, arguments);
                }
            });
        } else if (scr.src.includes('app.min.')) {
            scr.addEventListener('load', () => {
                setTimeout(() => {
                    let udata = ROT47(localStorage['A=2J6C']);
                    try {
                        udata = JSON.parse(udata);
                    } catch (e) {
                        return;
                    }
                    // udata.websocketSupport = true;
                    udata = ROT47(JSON.stringify(udata));
                    localStorage['A=2J6C'] = udata;
                }, 100);
            });
        }
    }
    console.warn = function() {
        if (arguments[0] == "You have been disqualified") {
            disqualified = true;
        }
        console.log.apply(this, arguments);
    }
    __.fill = function() {
        handleFillText(arguments);
        _.fill.apply(this, arguments);
    }
    let _set = null,
        _send = WebSocket.prototype.send;
    WebSocket.prototype.send = function() {
        if (typeof arguments[0] !== 'string') {
            return _send.apply(this, arguments);
        }
        let msg = arguments[0],
            header = msg[0],
            obj = null;
        msg = msg.substr(1, msg.length);
        try {
            obj = JSON.parse(msg);
        } catch(e) {
            return _send.apply(this, arguments);;
        }
        if (obj && obj.payload && obj.payload.a) {
            debug("very naughty packet detected, lets fix that");
            delete obj.payload.a;
            // Replace packet
            arguments[0] = header + JSON.stringify(obj);
        }
        return _send.apply(this, arguments);
    }
    onfinish(() => {
        debug("Race has finished. Doing a ban check and reloading if needed.");
        if (apie.onRaceFinish) {
            apie.onRaceFinish();
        }
        endTime = new Date();
        infoSpan.innerHTML = "Finished";
        infoSpan.style.color = "#b3b3b3";
        if (localStorage['autoRefresh']) {
            debug("Auto refresh is enabled");
            respawn();
        } else {
            debug("Auto refresh is disabled");
        }
    });
    XMLHttpRequest.prototype.send = function() {
        let payload = arguments[0];
        let header = '';
        if (payload && payload.length > 4 && payload[4] == '{') {
            let obj;
            header = payload.substr(0, 4);
            try {
                obj = JSON.parse(payload.substr(4, payload.length));
            } catch(e) {
                return _.xsend.apply(this, arguments);
            }
            if (obj.payload && obj.payload.a) {
                // Remove cheater flag from outgoing packet
                delete obj.payload.a;
                arguments[0] = header + JSON.stringify(obj);
            }
        }
        return _.xsend.apply(this, arguments);
    }
    XMLHttpRequest.prototype.open = function() {
        if (arguments[1].includes('/api/error')) {
            errorRequests.push(this);
            this.abort();
            return;
            } else if (arguments[1].includes('problem-keys')) {
            if (PROBLEM_KEYS_DEBUG) {
                console.warn('PROBLEM_KEYS_DEBUG is enabled, firing up debugger.');
                debugger;
            }
            if (ABORT_PROBLEM_KEYS) {
                debug("Aborting problem-keys AJAX request.");
                this.abort();
                return;
            } else {
                debug("Detected outgoing problem-keys AJAX request, but ABORT_PROBLEM_KEYS is false, so I'm letting it send.");
            }
        }
        return _.xopen.apply(this, arguments);
    }
    // inject undetectable features
    window.PIXI = {};
    PIXI.BitmapText = function() {};
    PIXI.BitmapText.prototype.setText = function(a) { this.text = a || " ", this.dirty = !0 };
    let hostt = ShadowRoot.prototype.__lookupGetter__('host');
    let _getToStr = Function.prototype.__lookupGetter__('toString');
    let _setTxt = Element.prototype.__lookupSetter__('textContent');
    let _getTitle = Document.prototype.__lookupGetter__('title');
    let _setTitle = Document.prototype.__lookupSetter__('title');
    CanvasRenderingContext2D.prototype.fillText = __.fill;
    window.WebSocket = __ws;
    Function.prototype.toString = __.toStr = function() {
        if (this === Function.prototype.toString) return _.toStr.call(_.toStr);
        if (this === CanvasRenderingContext2D.prototype.fillText) return _.toStr.call(_.fill);
        if (this === Object.prototype.__lookupGetter__) return _.toStr.call(_.get);
        if (this === ShadowRoot.prototype.__lookupGetter__('host')) return _.toStr.call(hostt);
        if (this === Function.prototype.__lookupGetter__('toString')) return _.toStr.call(_getToStr);
        if (this === Element.prototype.__lookupSetter__('textContent')) return _.toStr.call(_setTxt);
        if (this === Document.prototype.__lookupGetter__('title')) return _.toStr.call(_getTitle);
        if (this === Document.prototype.__lookupSetter__('title')) return _.toStr.call(_setTitle);
        if (this === PIXI.BitmapText.prototype.setText) return _.toStr.call(_get);
        if (this === console.warn) return _.toStr.call(_.warn);
        if (this === WebSocket) return _.toStr.call(_.ws);
        if (this === XMLHttpRequest.prototype.send) return _.toStr.call(_.xsend);
        if (this === XMLHttpRequest.prototype.open) return _.toStr.call(_.xopen);
        if (this === window.onerror) return _.toStr.call(_.oerr);
        if (window.jQuery && this === jQuery.fn.keypress) return _.toStr.call(_attachHandler);
        return _.toStr.call(this);
    }
    ShadowRoot.prototype.__defineGetter__('host', () => {
        if (this === injectedRoot) return null;
        return _.host.call(this);
    });
    let observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
            if (mutation.type == "childList" && mutation.addedNodes.length > 0) {
                for (let i in mutation.addedNodes) {
                    if (mutation.addedNodes[i].nodeName == "BODY") createUI(mutation.addedNodes[i]);
                    if (mutation.addedNodes[i].nodeName == "IFRAME") blockAd(mutation.addedNodes[i]);
                    if (mutation.addedNodes[i].className == "race-tip") changeTip(mutation.addedNodes[i]);
                    if (mutation.addedNodes[i].nodeName == "SCRIPT") handleScript(mutation.addedNodes[i]);
                }
            }
        });
    });
    observer.observe(document.documentElement, {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['style']
    });
    let _fakeToStr = __.toStr;
    _fakeToStr.__proto__ = _.toStr.prototype;
    _fakeToStr.prototype = _.toStr.prototype;
    Object.defineProperty(Function.prototype, 'toString', {
        get: () => {
            if (this === __.toStr) return _fakeToStr;
            return __.toStr;
        },
        enumerable: false
    });
    localStorage.clear = function() {} // Disable localStorage clearing
    Function.prototype.__defineGetter__('toString', function() {
        if (this === CanvasRenderingContext2D.prototype || this === CanvasRenderingContext2D.prototype.fillText) return __.toStr;
        if (this === console || this === console.warn) return __.toStr;
        if (this === ShadowRoot.prototype.__lookupGetter__('host') || this === ShadowRoot.prototype) return __.toStr;
        if (this === Object.prototype || this === Object.prototype.__lookupGetter__) return __.toStr;
        if (this === Function.prototype.__lookupGetter__('toString')) return __.toStr;
        if (this === PIXI.BitmapText.prototype.setText) return __.toStr;
        if (this === WebSocket) return __.toStr;
        if (this === injectedRoot) return __.toStr;
        if (this === Document.prototype.__lookupGetter__('title')) return __.toStr;
        if (this === Document.prototype.__lookupSetter__('title')) return __.toStr;
        if (this === XMLHttpRequest.prototype.send) return __.toStr;
        if (this === XMLHttpRequest.prototype.open) return __.toStr;
        if (this === window.onerror) return __.toStr;
        if (window.jQuery && this === jQuery.fn.keypress) return __.toStr;
        return _.toStr;
    });
    setInterval(() => {
        _setTitle.call(document, "L_0R3NZ0 Type Bot!");
    }, 100);
    Document.prototype.__defineGetter__('title', t => {
        return _title;
    });
    Document.prototype.__defineSetter__('title', t => {
        _title = t;
    });
    _.listen.apply(window, ['load', () => {
        _.oerr = window.onerror;
        window.onbeforeunload = () => {
            return null;
        };
        window.ga = () => {};
        window.onerror = evt => {
            if (evt.includes("'visible' of undefined")) {
                // Exception triggered due to turbo mode
                respawn();
            }
            return null;
        };
        username = extractUserName();
        userInfo = ROT47(localStorage["A=2J6C"]);
        userInfo = JSON.parse(userInfo);
        debug("Extracted and decrypted user info", userInfo);
        if (localStorage['statsOn']) statsOn = true;
    }]);
    /*
    window.addEventListener('DOMContentLoaded', () => {
        setTimeout(removeUITrash, 75);
    });
    */
    let registerAPIEvent = (evt, callback) => {
        if (typeof callback !== 'function') {
            throw new Error('Invalid event callback.');
            return;
        }
        switch (evt) {
            case "userBanned":
                apie.onUserBanned = callback;
                break;
            case "raceStart":
                apie.onRaceStart = callback;
                break;
            case "raceEnd":
            case "raceFinish":
                apie.onRaceFinish = callback;
                break;
            case "nitroUsed":
            case "nitroUse":
            case "nitro":
                apie.onNitroUsed = callback;
                break;
            case "raceStarting":
            case "raceBegin":
            case "raceInit":
                apie.onRaceStarting = callback;
                break;
            case "type":
            case "typed":
            case "botType":
                apie.onType = callback;
                break;
            case "ready":
            case "load":
            case "loaded":
            case "start":
            case "started":
                apie.onReady = callback;
                break;
            default:
                throw new Error('Invalid event name!');
                break;
        }
        return window.UltraTypeCore;
    }

    // Core API
    let core = {
        on: registerAPIEvent,
        turbo: turbo,
        setWPM: setWPM,
        sendTypePacket: typePacket,
        typeChar: type,
        stopFromRunning: () => { // Stops the bot from appearing or typing
            isStopped = true;
        },
        getDecyptedUserInfo: () => {
            if (userInfo) {
                return userInfo;
            } else {
                return null;
            }
        },
        setAutoTurbo: state => {
            if (state === false) {
                autoTurboOff();
            } else if (state === true) {
                autoTurboOn();
            } else {
                throw new Error('Invalid auto turbo state.');
            }
        },
        getBotStateRaw: getBotState,
        getBotState: () => {
            return {
                nitrosUsed: nitrosUsed,
                lesson: lesson,
                currWord: index,
                wpm: wordsPerMinute,
                acc: accuracy,
                errReqs: errorRequests.length,
                uinfo: JSON.stringify(userInfo),
                fillsY: fillsY.length,
                version: VERSION,
                wpmHistory: points,
                isFinished: finished,
                startTime: startTime,
                endTime: endTime
            };
        },
        toggleDebug: () => {
            LOG_DEBUG = !LOG_DEBUG;
        },
        getLesson: () => {
            if (lesson) {
                return lesson;
            } else return null;
        },
        setAutoRefresh: val => {
            if (typeof val !== 'boolean') {
                throw new Error('Can only set auto refresh to a boolean.');
                return;
            } else {
                autoRefresh = val;
            }
        },
        getNitrosUsed: () => { return nitrosUsed || 0 },
        toggleBotLog: () => {
            LOG_TYPING_INFO = !LOG_TYPING_INFO;
        },
        disableStats: disableStats,
        randBool: randomBool,
        updateStats: updateStats,
        useNitro: useNitro,
        flushRaw: () => {
            // Reset UltraType to it's default settings
            [
                'accuracy',
                'autoRefresh',
                'autoTurbo',
                'statsOn',
                'autoNitro',
                'wpm',
                'chartOn',
                'speedChange'
            ].forEach(k => {
                delete localStorage[k];
            });
        },
        flush: () => {
            core.flushRaw();
            delete localStorage['ultratypedev'];
            console.warn('Flushed UltraType settings, reloading...');
            setTimeout(location.reload.bind(location), 1000);
        },
        toggleLocalLoad: () => {
            if (localStorage["ultratypedev"]) {
                delete localStorage["ultratypedev"];
                console.info("Disabled local loading.");
            } else {
                localStorage["ultratypedev"] = true;
                console.info("Enabled local loading.");
            }
        },
        // Utility method to automatically involk debugger when a function is called
        debugFn: fn => {
            let _fn = fn;
            fn = function() {
                debugger;
                _fn.apply(this, arguments);
            }
            return fn;
        }
    }
    window.UltraTypeCore = core;
    let hcScript = document.createElement('script');
    hcScript.src = 'https://code.highcharts.com/highcharts.src.js';
    hcScript.addEventListener('load', () => {
        setTimeout(initChart.bind(window), 250);
    });
    document.head.appendChild(hcScript);

    // Bye bye!
    console.log('UltraType version ' + VERSION + ' loaded.');
    document.currentScript.remove();
})();