diff --git a/penguinmod-packager-settings.json b/penguinmod-packager-settings.json index dd048d26..94260904 100644 --- a/penguinmod-packager-settings.json +++ b/penguinmod-packager-settings.json @@ -1 +1 @@ -{"framerate":0,"highQualityPen":true,"maxClones":9999999999,"fencing":false,"miscLimits":false,"stageWidth":640,"autoplay":true,"projectId":"p4-@TurboFunkSauce.sb3","appearance":{"accent":"#ff4c4c","background":"#000000","foreground":"#ffffff"},"loadingScreen":{"progressBar":false,"text":"","imageMode":"normal","image":null},"penguinmod":{"permissionManager":{"unsandboxedJavascript":true,"enabled":false}},"target":"electron-linux64","app":{"packageName":"turbofunksauce","windowTitle":"Penguin Funk","icon":{"__isBlob":true,"type":"image/png","name":"icon.png","data":"iVBORw0KGgoAAAANSUhEUgAAASwAAACkCAYAAAAt6RN0AAAAAXNSR0IArs4c6QAAIABJREFUeF7tXXl8HGX5f7O576RJm7RN0/uwHHKDgICCgKKiCAgqICggigiieHOpIAIi942CICD3KT9RFAFFkSrlaoHSJk2bpmmT5r43v0/f7/Pddic7O7O7M3vlnX+enZn3mmdmnnn2Ob5PjjLbZONAjlxwvtA8obmW49wPyHFSa3u7djxebBm3UPa5jiLZHxE6Zrkh3Od4PXK+X+iopV9Q9octlOMPWo6PT7YHIJOvlw9NJl+DWXtsHDACC/yiQDMCK7bnJ6WtjcBKKfsTmpyaToWMUiW0TCiPc7/ccrxW9nm8UvarLcepIZFyXPbj8VLpRw2qIKGrs+9MAUONaUia9lo0rzbZ3yh0k9DVQltt6Bo53uXT+s2wCXDACKwEmJfirkZg4QYYgZXiBzGZ0xuBlUxuu5uLNp1Z0ny20JkWOkP2a4ROEUpNiRoXNSJSakS0SblbVfa1ou2rXS6tWeg7Ql8R+rDQddnHgsy7IiOw0u+eGYGVnHtiBFZy+OzpLEZgecpOV4NR89lFWu8udKmF0kZEGxRtRCXSjoJtsmtKrpgeR6Nu6fOy0J8JfSGOsUwXjzhgBJZHjIxhGCOwYmBWCpsagZVC5ttNbQSW9zeFms9uMvRhQj9l0aCs8UvWe2Hujff3Jp4R6ZX8p3Q+Vehb8Qxm+iTGAfNSJMa/SL2NwPKep6kc0QisVHLfMrcRWM43gzyi7Yh/6aZL132FHiT0w0IZ5+Q8Q1Ja4DJy8qDY5eRKoHseoiNycnmc+1YqCmEAJrNAHsKsAkVwOgaKYWLLyce4eZVwWobO5yM8K1AIeZ6TI+spwPEcriPHYpKTdY2PIOxqfAy28vFR0OAgAt7HehE2NdqLQPixfoRljW5B+FVwGNEP48OIF+V+cBiB78HBAU1V0Bpoj8Pbbd+T31cJZTzYhIbmgPccMALLmadGYG0n0JQRWEZgOb8zvrUwAmsia+mNWyinFgmlTWof2d9TKDUv325SpIFDmkw5FL7cUoRZ5ZbCqUiNJ1c0H+7nVUj7coRr5YX6wSmZWyq0BOPklsu4xTJuoWhU1JREA0rqxccw2fgYNKbgEDSo4c0IgB/eiED34Y0Irxpoek/TvreWaTrYjP0I20Ny7MtCGWEfw6pM03g5YATWRM4ZgbVVUBmBZQRWvFLFx36TWWDx2mmL+qjwmbaonWSfmhZz7Hy8HUrliE2nYBoC2wvrQAumIbA9f8o0TfOqYSLLD2lM1LQsGpIInkCh2IpymdHj62Vk3ODBUZiiOl94RtPmq39sdw3PyYmjhJqcwyTebSOwlDICK4kPXLpOZQRWut6Z8HVNRoHFCPLThBVHC50vlDl5jJPy9E4GimDyKlm4g6bF8xHgXroAtKCuQVP+JQt52aRfoABetoB44zxdnBlM9b3zuubCO+d9yY4bT8mJLwhlgKnhXhI4YASWUkZgJeFBy5QpjMBK7zs1GQQWA3v4RbxSbslUy63xlxcSd1R9wCf0tLPP/nnUJ4NxSun9+GTf6rpf+5e+qFUXUAGfcI13yJFvCiXyKRtCRVaKzxtuuFL0NtOp0yfH/yv0XqGPCSWyavYxOYEr8vclTWBhHnY1AstDZmb7UEZgpfcdzkaBRdvTjsL67wv9jFCmzsR0ZxiJHYp3kvin4tlwIlbsgQD3/lVIMdv05O/Dx5cI7pqDsYzGMy+IaX7TODkc6Fr2kp7o/Yu/bjchn6dbpQG9yGfI/ieFEqcs1oUTIfU66XifUCKlEhYn1nGzor0RWC5voxFYLhmV4c2MwErvG5iNAouR6FcI6z8kNCbcKMY5FTfiA1o8FyaI0sU7gy4BnFW+xEONB1Gspe2R32ra+rurw+88NaxDRMP6htGw0vHV6HrleWhYPz/LujzmDP5STlBTP1H2rTbRRC+PmtS/ZSA+UI/KPotoJDpPRvU3AsvmdhmBlVHPsWeLNQLLM1b6MlA2CSzm9PEL9DF3HAMLCmc0alq514Galu2AVMGixnmaFtTUa8q/htaxg4Ie0PbgbfrUhvtuDG9iNCx3tyPFrbpfA8DoqgtOt66ExS5oY2LAsbvUAfESq4CYWAV1IobLJeY8bWfXSN9JFQdmBJYyAiuGlybrmxqBld63OJsE1jnCatoYon75iEpQe/ixulv1hw+HJsVI8+LYQBjGBUep7SGE6bTeQyePrIpxWAfCiTTnbEKEp/cDMtlWN7geiszbXydAbIgD1oKrkd+dPOCBlX1g17Dnqqhxgd4P5ANHbKgNKBFd//6rpp0vIodRiaYehe9Eh+A/CcaDbZkM98oILCOwJsNz7voajcByzaqUNMwGgSXQmYq2BSKCWhmqv5C5ZZUaIGn++ddrDax0EUEZEuN/yEv4sGhYd18bPmAo0v0IfXzOOdEj3RNbjekdKwfGx6FAjXZ3avrGSR9xN4Tc1+J5H9DtZ5wERb9sKeDTAoKk6jTY4DoUnH7/0rM1HWph2JVtT3oJ75QW3xWa1egRRmAZgeX0Lk2K80ZgZcZtzgaBxbirfwjLI15TTn6BhpxcdNndGjKzZN5iT+9QSMN6FB+81rt+HT6+fImrPnSIPj73PIaJeboMM1iMHCAi6YAgjLbcfIkeoW/F/2xGwuNVMBVe4ykSVzf1k1/U+3mC2BrjMkLNR7thimr9PWygHc8/rWlwgKmHE0ZmLiNVetpwO+JdQzr3MwLLo7tjBJZHjEzyMEZgJZnhCU6XDQKLkcYIMVcSp2BhTNmOe2j3z8Kf3Y6AK5+2jY/dpUde99tfYQaxjXC6yn0O1j/nfV/O+7QOM2x0DhCwr+8tgCW03nu9pn0rlst9Q+YCtxx6/3bcQx+q+9wpmpbvtJcvrB7ZslmP2/743aDP/EHToFQDijApvYSXybnLhTqWAfLlAnwa1AgsjxlrBJbHDPVpOCOwfGKsz8Nmg8A6T3j0C6ERr2nqp76ky6U0fOW7dX7ydOMT9+jh1/1WYLekagvnLN9tf/1zwfn4opstuRzgX/fu/8Hk2fo7BIwPrHkXCxkP16yI+Fq9/8f16WmfgUJfOHO2pjnWOooeX87IFpii2p8C+kfbQ7djBsldjTAdCjEq9R2h9CJ6vLLUDGcElsd8NwLLY4Z6PJwRWB4zNMnDZYPAgltHKeIURbymGSd/W3tT6o48KbYQ9hhvSPsf79c91t0BL+D4SHhSfdnOe+vjC86/QVO73MQYpzXNXXKgaxk0q7XXX6jpiNQptHZn9aLpn/+aPjXlkM9qyrqOyUaEZSXrdXcBtGGz2LSiXDaMYEqxfuKTLlmU1s2MwPL49hiB5TFDPR7OCCyPGZrk4bJBYJ0vPMMn08ZLOONk/KWvO/IEX1m86c+P6PHX3Q4njTV+pmwHeJnm/QRxNrlFqKRsNn84wIDQ3uWAlXrvQkFhsHhvQ7MLmsKs03+gD9Uedow/C4tzVP6lJV5X96svOI30jjQ4UugKpw7pfN4ILI/vjhFYHjM0weGMwFJGYCX4DHnd/VwZkHEnEYVw/RfP1M2mH3Oq1/OHjdfxPMrWtdyGcJixnvDUrlLJ4p/3Q3in8sorfF3PZB18XFAPet9aplnQJJWc7WxW+VNRWXvmyXicqvdFRkK6bkR7aPr1j/QSQ5H5EzVHIpc+JNeCZEWlNqTrtUVbVzZoWEZgZeKT5/OajcAKMdgILJ+ftViH/6p0uEVoRCFce8Tx+vSsU+lMjHUad+07//Gsbthyy6WajkrEMnuXLEQxn7nfQ6R7Qa2vYWHuFp1FrZhq0/vmq/qq1t0JPg+soulGYK0kt5M4VfXHoehN1Z5AnE137y3x17r/+09c520IQxxqXWt3NxkJTyA2uKmV0jm2mbJlg4ZlBFamPG1JWKcRWEZgJeExS2gK1ht8WEaJKISr9gXEu98oCV3/+bueZ+3NwLsaaQ83FRTPW6KPzzkXNq6imXMSunjTGRygcX1gNTSplluhcfStlNxAS2R4Qf0sfX7mKfAeV+y6r6ZEBM0Uvo4NQkHa/CxMVBvuv1nTsV5bqPdVcm0sbf1cplzr1nVmg4ZlBFYmPXE+rdUILCOwfHq0PB+W6fIod2IjhEsEqG/xL5H97tfWs/xfeujmG2EqGG5lsRPMWDQb2N6zz0aAfslcb3G5/LqudB93pBMpdKsu+ZamA1KB25pzlyNxb7O/hftTKTargKAxpPt12q2PkfDNN0Gz3/J34GhF2IhNz3qHKFmuFOsupjULskHDMgIrrR+x5CzOCCzUpjACKznPWyKzsOIujUURKzznllfrOXa6C1VK/MoF65cve/N1CLwfWL0y7NoKG1DncPa3fqppqXgNE2HAZO5LGw6x0HulrqCVJzlSrWaOIL3SG5htvBvejNIGK889TlOrlzrC9V4lxxgeZK0OlFYsygYNywistHqkkrsYI7DC+W0EVnKfv3hmo0aFQm9KAWzbZlt6K+q/FU5l4d54prTvM7i+SZ9suvonmvavfC2sccE0RFTPOuPHmlbsup+3C5gko41KBsG63wAVo+O5xyNeef4UfM9mfvV7mlaLtzjb2dS17EV9iWsuB1xcFEx4IpKinJNS/5fOvMkGDcsIrHR+wnxamxFY0RlrBJZPD56Hw0rpXHVYtDGJklC5O50jHq5gq6tFItvXXPVDPbDVppJXVaOPN3wVX77q/VFx2mzuODAq8UXtTwKBc6NUKQoOsngMxskXDXr6ccCzqj7gE5pmWpyVO67Yt2oRXDYilioLAu52PQn7QDgT/FVIsy0bNCyy1AisNHu4/FiOEVixcdUIrNj4lczWSN7bhjwace5pR52sj888kUnr3i4xODSoB1xzJWwmXf/+W9gEgZKysPlrD08vvCVvueHdaMFh8HXzc09ouuFepMKNdoWX38utQOHv+mOBe1VzMGCgcotLvVtMBo00uB5xgGtvuEjT3jf+Y7d6xEUoxdoIrG+YVvFZ2aRhGYGVQS9SrEs1AitWjqG9EVjx8S0ZvejliIpdXbYz4kwXXnyrL2tiikjzNQBC7fgbNALWJ2R9O6ID1B/9FV/WkS2DhgD4BH2hSWyDE3CtBCm0/likyNV99iRNA4WTG9GVqA6dLwFFZJ3gtFk1061PqDwzLHkt0KzqlXR6lrJJwzICK52eLI/WYgRWYow0Aisx/vnZe5oM3io0YsQ7I553vuclfIELCnxZ07o7f63HbX8CuYvjo+GmgGmfgQYw44SzNM3JzfNlHZk+6Gh/n76EVRfgg9//7uvhlxTAba494guaNnz528LP3Ey/dK7fGnkel5Ix1tejx1t7K1BCOp+XPyJ22PZKsTT5BbIQ2rhSyte4Lj6lK7af3AisNL0xiSzLCKzQXzWyMa531gisRJ5Cf/u+L8PPjTiNIE0uvvI+fbpE8Km8XtLGx3+nh2y9BxWeg0PhwI7VB30SGsEp39WU9e68Xkemjjc2AM2q5RY4rTr+Gh7JnlNYpI9PIR9PRZWbQF7WaaqMRKegivjPwe197nkNaCJNrMu4cb1dV/5T+Zw0ALRpire4pHWK1+w0vRFYThzKgPNGYIVukhFY2z2v2SiwHpTr45ch4us56wzk+tUedrQvr++Wf/5Zj0vUBqrknKxi9/31z4bTERFfOG2mL+vItEHHx1Azof1paMDr7rgSlzAe1CSnQDSrAxG5Pl2qIeVLBkGmXW+y1xscgS2VWPebJGMgyjqQUqDUl4SmFM3BCCwjsJL9zkSdzwgsf2+HEVj+8jee0ZGkpxTcIRM3/YWYcvBnNJ39zYsSsgnYLbDvHXizWKHXGvdSsmAHfb7xTOBmFc9ZFM+1Zl2fntcR9tN8PSKzhzdIUQXxolbt81F9nN7VgroGve8XvlnWMVguaEj4uvI8KE5j3SyqM+GKmaQJlVap51PJk2zUsIzASuUTleDcRmAlyECX3Y3AcsmoJDQ7SOb4i9CIGlTJgh20hrXgp7dpoZ1bXOLp0ojasPJc1EO0Rmbn1wK2a863kVFUtnS3mOYfWLdGt98idRALpzfq/UqxjWVa7tyQeKtY7aZbqg8xQ6Bk8QfBr3OAhV9QB5uf0axiemxCjRmQu+mZP+hjLTeDr1E2YsB/SNrAqJjkLRs1LCOwMjDZ1wis5L75RmAll9/RZmMZmj9Ko4jxWAV1DdpdPPe8yzUtmb/U05D3camDt/K8L+plDLz3VtiaA1K9Zc53L9fHK3aD19BJYxgUzWrld6C5BQfCcaCmHXOqPj79aNSXDUi8UvrcnvCVBEeG9QHiW7X+HnFr43I8r7pW7y+85LeaFk1HPUG3G+8DUTRY0Xmy4WLZ8Yv8efubn9VNhuT5itCeJe8JL/Ko23vgZbts1LCMwDICK/SOGIEVXVwYgeWlOI1vLGK6owSuUp+ONExuWaU+PFNyz2oOYT3W+Ca169V8w8X61OY/odCldWs4/Uf6UO2hR2nqlFPYev9Nut2Ge2+MOB77T5ccxakf/7xul66aVp9ons3XIC5usPk9TQvEJjfnXES6l4pX1e3doebWtwKY+hv+cAv4LPhj1fsd6naoqO3412p8eEi3GxVvW3AUmiMRPnNyJbdRMi1UDkyrPJ4jaBNE8wjR/Hy0k7qJThp4vBe1+S+P6a5rb0Q1J2vu63ZoDkw5wF8HpZCSkKQtGzUsI7C2alhGYOFtMgLLlSgxAssVm3xpRHcfQsiVIg0XzvLFmypZ/jNORMVgrysAb3zqXj3uulsJ5Bh+zURtmH781zG/g81p81+Br0WNhF40KycZET7jhG/qU7WHwfQQKCj0hemxDhoUbHFmAnRKrmBBPWxUM0/5jqZVe9GH4m4G2qq2/Av1J9seAO7Z8Cakxi26DOgZxY3z3Q3o0Gqkq1O32PTM/Zr2i8bIKjXBUZh+Qs+VoEtQE84RDYo2NeJ3BYoQ0U9vb25pBcYRxNq80vKw/dwy7OeWgOZXTsF+KRBunTT3oQ0tut2aq5CT2b9yud2VE+udQG70xnvCT6dBslHDMgJruxQWI7CMwDICy0kMpvY8hTDcaErB7aQUwL4tW7nELTV+DXUCCzyuV0gbzTvi1bPOX7HnAfrQ7LMRB8Mvpx0LWYSh5TZAbncS0dSmQ558aeulekzNIfAGpdpL1v2/l/U63r9UNFupzFz/eVS5YY6nW41wXDQ2xhW1STWdkXZoVjWHImd01tegcNNmZMdnt8dbH7xNN20TGxltWW77u24nNi7yg5r4NgpkVXqfA4JhTw0tX7yteVKnkft83vNr6nT/rpehMG24HybgCLYsGOuUulYojI9KAXTf5y0bNSwjsLZ7aIzAMgJr6+NgBJbPktSD4feRMegt3DnSmIUzZuvDjd8AsGLZDrt7MPW2IZhsuvwE1EEcHwzHxSqcOUcfX3jJbzSl7cFpESMd7bpJ800/07TbUp3H2p9f0Oliq5uyP8o3Otk2nNYR6/kxqSq04tvwXg6L7WTKR+DMnXkSNC56cd16xdoevUv323AfqukEhc+0ic3/MRSCoobIMGmxXgfbrzj3OP1zYNXb8Q6RnH70QortNuSdzKUXEjhijFMb7enW++NSrWi7RRKt4R9yjNjvbybjQrJRwyLfjMDa7gkyAssILHygEF5hBFYyxGtsc0yV5tSwGGhl8RbiyzLrdHhHaOPxysbBJa+5GjayTvHy8XiORLwvvQ6BwwWSY+j2UgfWvKObNkv8TL+gRNh5D5nD2PA1xH9V7rpf2APsdt5Y2zFeqeM5hPE0X4uqQsULd9Q0lCMo1x/yojF+yTIhvYG0VbFOYYiveUhcmHHKuZrWHgp4NK+9wE3XAW2j4y8S+G2PkR4ry9K9PUDilaK38IFkLDibNSwjsCI8QUZg4S+QV5sRWEZgefUsURgjdFcpfGqVQoCLZZtyMBSwmSejWV4Z4l682rb8GzBCqy+VitOCoMnxF/78Dv2TNjRqJCoIhNzgMCKn6bUhDUo1nu5XX9Tn2x66XVN6x+zWz0jy6cedoZvQKMtUjVA/rlPih3g8h/sSsR06zr8cFpuJkghvVm3pX4Hyd1M+CttVoFjihQSTvUhse6WLdtLnaesLDiJ3su0R5Ba2S5zbuNjGlKyrap+D9fmZJyOeq2Aq44ntOBLf8cH1CEtae/PPNWWgamg9zsPS67ZOmlKikhKkngF0DNtJl7JAUJWVQlKsz97CbNawjMCK8rIYgeUsSdy0MAJLGYHl5kGJoQ0LrLLU8/RIfQvqgVw5/3x4mYrEe+h2nlBOmaAMjEk9PWoEw5va9FBrrkCVnNEtm8OGniLxUcWNC/RxVtmhrWasH2XhuB+iksMWHMD5Ifnij2ze6G7pjO8RW5oSTHV2ZnyTouYkmlLIuxjStPB9CIjtiN4m1oFkewLHuY1XKpaqRpV7Hhh2/UwlGesJR8osFC9gw2mItyrfaU9N3Xob3TFtWyve9+E2RIq3P42Id9rqxnq7nIZkLh4jxu+RDvzgUrNCCLtSCGFXqloo/wrwOFRVpWps2nOcRJF2WRwDxlClUIhTKWqMTtcd1/ls1rDIECOwoj0aRmDF9eKwkxFYygishJ6giZ0BqKTUM0IjB1qJLWYW47GWAOFyVL6Qo52bsC/Z+COdiIMakePUgMZ68EXdZnOC7SkomhAxyhknxOXmWHL8xqW6CavFeMyTjBsupLEJasEE/kmkfONZMFlWf+gQTdkvWRfM52Oz5Ea23nOdntqFRkmvG1IYlAIUrVLUZEKPivyg5kWbbKnlOPetFDAlShFYjOWaEJCoFAPV5sk+NTlqZFwP47DOkXbLhPpaVWcyaFhGYCXrbfVxHiOwQsy1/lU0AsvH5y6VQxMu4XvRFhEoghOGL0jIayYIotv28aEZFy9eKO5p8sThpPJeTph7+gmIkK878sSw+5eqRVqRVNffeZXbpUB1VwruTaUQwu/dRoFHLyO9kNynd5KCEMZdpZYK3SD0VaGAq1AqKRjvk0HD4q02Asu7hz7tRjICy/UtMQLLNasSa8gvAbHXSflF4D7/i1vpLjI9ktiyZbNBsAwhWgbk+RQbHQuVurCpgEPSL68KTqhtiJhgd0Diphj/RDyn8RE4i3Lyw/G36N0cpXdPNFR6I+lVJaa729tUPBfI2KzozX2/kTrdrm/DI8gVJVKsC/7/V8ZGoJxSrFrjq43I7fWkoJ22xWWShmUEVqSnxAgszRUjsFIgQpI7ZdoJLAD6KAVgHqWYWkNKrwVLJLPYBOAOlOJ/bW8LDPp1U4jpXSCaini5iGM0AfeoACYFxjXxPJEocwWBMq8STp1cQabMLYGTKCBIlEOtzXq/4zlgeEepkoJxJOJ/htiIqg9AAeBE6zgGRQMb65P4sVZUeG69D1j1vcv/Bc7HaBMk3hNtWVX7H66HyRccKL/isZwekzFG6D+ITIT2p4FEG5R4vQj9aRNiMQB64xgR7zRltp3XhTvTScMyAkunqIiAkTCHEECbEViuXkAjsFyxKRMbJV1gUThSY0KSmFI7CCXINkK9laJGRVsUBVpaMZsCJq9CNBvB1s6TqjyM02I1GCWBmuU776Wvo2J34GRRI+I4AdGMiMnN84FCKJDUcNwicpJptBV1//clfWideK+G1r4fla/EiJ925Am6HavxUHOJ9aYw4JJ1FRm3tPFh2HqslbJjHZ/Y54yQ57pL5n0g1qE8bT8sGQitd1+jbVGdLyA8cHx0xE55YOHJi2QhVwhNilfO04tPbLA9tnZPpoZlBNZWjhuBhRdU/uoZgWUElks55rvAYoQtShorBWOCUrsKpc2JNiu2T0iIEqnSLoercu+P6ul73nhF02AfA4xlVbmw7RMloKAOgcDEvi6YOkPv02tGzOwQlrb8deNfuf5VqPi85nLkEBK1oGQxAFBnnQ6crOI5C+V0Qpfv8t5vjR/DB7rvPQBFttyCwOoB2bcbKEeq+lTt+zHdpF4qTceae0kkVkaCdwg2vTXHkusIVYsRm9rwxvXurlVyIIskR5PrJZpDCHXC3WgJt6KgHmxepTWs5usv1Dei/53XGUlu9wAw/unjsgjAXUyeTUcD+Pl2GIG19UE0AiviK2UElhFYMcpazwQWhR4jYb8sC2G8E3ORGJDD8ITYhKWgAhCAruwDUNRKl2pbnCoTuv4uJI13vwL8Kes29VNf0oemfRq053WEt4wNwFRQ8cG9NSWkcAh5lPXk5C8d446cvE7MIXz7LFR2JoY5Na0aQcKc+WXgcCXqfYvxIQj9NRtcu1p3bb4WGl//uw4Q3cKH0iUIb2s47fuaFs+OrimSH8SP6vzbU7of48MmrF/4PvtbwK4vmYfHbP29KIbU9a/n0EWq5jhdP22OUz+JwsV1R52cUr73vrVMa1qrLkK41fjwkNN7wXisfeVarbmGTizI6PNOzHFzcUZgReGSEVjhzDECC/zgX0MjsNyImG1tYhFY1IyIs0PbFArJKQV3l1IxlRbOycvX/+EDRSV6LYFieMFKFizVX56K3T+sj5cu2UXTQqkMTNymoQ2IK2Kdvt7XYZuy20oEhWHRpXfqJk4aUmzstG+9WTC/m68XZ4/YkBhJPuc8ADaGbCsMCPVqAS7HGWh+T7dcdzucUbT1WXGyrMPl1UzTh0LVh0TjDYhNb7SrA+PegXE7X/hj1BVRE6LmViNVddiJaBjtT/1eH2oT76IVH8tuEkbAVx8I9KH6Y0/TtGAabJTJei64vlapA7jhvhsRyT4+7vRuflX6IrBrkmxOTNmeDUZgJfBQGIFlBFa0x8cILHcvVzSBRQHFuCi415SC8UcpBBIp5YQtrb8Y/GLm19bpOQtqAfxZsmCpLtRXtsPuWjMrnr9Ue0uIqc4vHbPfB5tX6X5dUodv058e1PvEq3K6bEaK73T3C1i8eL2c+iV6fqwf3shVPweqQN+bTHbHyKH6eSHE08ZEp0yoPyPi+SJteelPejzHHD/xsk49AvX6SsXWSI2qW7DtI1QU1u3zpfL2tE8j3qv2MKl2I5qa3UV1L4dpp+3+m8BfqR74ZNksAAAVzUlEQVTkuF7RZCv2QAXu+s+hCEzJYoQJ5lgw6xNiapTOzLF876IzRvX631rG98+uF3MNPyUNJkUEvBFYRmBFfCGMwDICyy/hnMi4kQQWAe/waVMKn0qlaLNykvy6cVEDAtVLFu6oNawSqX5SPGeRnrNoFs7bVacZGwDUdf+7b2ja88Z/NGV1mMGmd/W+3ZfalinyRV38K2Bvl0iWfyJMdNOXcU9bxKu19kZ4vca6CSeEUar2O1TTWV8Htn+e5Ai6mcOPNsMdwIbv+DPq7m18EpDjY4K8ajunePeIL0YUBkXbnaUjNav6Y1FIeHwUSK3MNaw/muXvIs9IIzYx7dufhG2LkeQusNV1eyZR1x5xvN6fIrmTsWYUxHsvel5/Rb8vqy//rqZj3Z122OsozawUSpYrdbXQrEZzMALLCKyo75YRWEj2NgIrXhHsbb/tBRarbrC+GArGbau+EfHvI21T5TsjfqlyH5i6SuYAVCFfvEfM+rdWVKbmwcjl7v8CKrr7P4ijGmxZo+mIfOkdbRJK8QtDGvEL1ShxPTUfoQnAW8bajUYcqPV34oNIYzyx2xlJTnSEqZ+Agut3RDbRBHr+9zKWLhpSqOqM2Ka6X4Xtr/U+2Iqo6cbLPeZOTvsswveokW18FF7csT4oEktveELTvIqqqFNR06K3cMvLiNNa/7trMJ6lyo7dYES9qD3iC7rJNInf8ztObqy/Vz+3jCfc9MwDdmYb5hLCuKgUvfUolJilmxFYRmDhRRb4EyOw8KYbgZWeEm97gcW6fYxUj2iropeNlZKZtV8odf1CdegslYKpSQ22ABUgpElJxWLaqqhBxWyb2lZdhF8cejEZNxZ2B+rEGzTjhLOSemeoAfS9jVSwtTdcrCn5wsXQltL4TcRt+Y0ysFpyHbssGQI1Ui+x4SvnYWliA2R9wdZ7JOL8ZZTVs41Yt3KZEexno2Iy6yhuEC9fqCqORNQvvPgW3a5sR50D63ojOkW/5Eiu/iWg0t2iQTAntOawY3W/+mMQ/pRXzuIzrpfiqmEooFTwwJquuxDrbW+164+Cl0p9Qyjxs1zNl2mNjMAyAks/s0ZgRX51jcBKL5G2VWAhAEWpyMl3crJ0B3zZ+IUpkgq79PowjmRoM5LKB5sQMT2weqWmfSte0zSUZc9qM+75QZvUiHShe02SyRRUlW2VZx+WfWK5h81EW9vc867Ux+O1EY2Pw5TAJOfOF6HgjXZheSWCwlC+y4f0fl4VFD5in7c9dIfe3/jobzUN2ehEk6n5GJy1M05E/BaRRb2KxO5f844ed+XZx0S9E/XHfV2frz8WGgZtkbzvHc8jJ3CDXE9Q6jmOj+qwohAWfP7Uer3fcCpyDwvrANrRfD00iR6xYYYWI3FQDV9FsSPGd0VdbJSTQ6KpNF/9E92ql/Fwch9tu8o6aj72Wd1k+vHgR341nerxrihyP9Y3bLkdZQo7//40GtojsOJB3uY1ZEVpbxeW4tGMwDICSz+CRmA54OEZgZViUYXptwosFHJTCm4Z6ybeoRBGeGkZBP0YbnBwEIKc8TIqds3JjhHUqFByWSmoakoxRBwh7koJ+Lei5oVPuFI3C6W3M2ye4jmAhF/wU5ju4rVJ0Iu56mJ8cYc3Rg44JmJn6aIddbsy8armV8I5S29hv0Roc7G5gmTacApsL9UfBqxYjtyXsIuKY6fzxf/TvdZcITYqmzGYe7f4SmCRE5XB2pwIqz2vwdvIHEKiX9AGlS+aJm1ha66ABkVbU2hc0TSJrtDwFcEVi+Nat3ax2hBXX/btsHW6Hbb6w4ClqpMcRP7j8Erz5To2P/uI/klk2CjxZAhUVAoBZErhL06WbUZgGYGlH2kjsJDr6HYzAsstp7xtt1VgsQoN0+eJpe7tTPajEc8HIdVKAaJTKX4xiKy4TI4TfBzGkYkb3TeXyCmoPpatcAag4ud+HxV5ixsJKe/uspnb2CS2kC0vAurW/QZ/R67EFRHRdEAA/6zjFElc29zzgHYQK8Kn3bo6nodtpOmqH7haet3nEe4z43iWy3PVzbYRU4DovaPN09qhcq+P6EPzfgi8s3g3alg94oVbfQlsg7TFxTpu2U5wRteJ97B8xz31frw2Uev8g+uBRrL6l9AEB9cgwyPCRpvVkXIObtss24zAMgJLP9JGYA3G9WobgRUX2+LutFVgMbThQBmFxgx80pRCQbz4N1ozN8sQhLKk5kQERf7nps2K8SWsGuJ2BcTjgtFHKSTtWba8ahTvmXUGEDar9jrI7fi6Xec/ntW06VfQTOKIG4tpPjau/TiAXGed/sO4+ls7bXoWYTtrr6eTNfqwFbshpXT++Yi/SnQbXI/A7NW/EA1C8Lis4xLZlDbHgNRxjHV+xmVtehZO5JabIj4eW0/RJsrK4pGnEhtb8dwl+vz0L56pacWu8ApbMzviXW/TtcgtJULrtoSOCSOyug5pVuUWGoFlBJYRWJGliBFYsUrXJLSPlKdEDYWATMSOttYL5PKoQVEzYjkT/tleLg1po+KDQNsVqddfglNl3huEhkXuM55pugSOTj0ckcxOG3MB3/3RKbop8bkm9BM3OKvhDEhcWqJe1MKZc/VUS68HekKiW/sfgVrRcjNNftFHLBLM9iVXoV+iGkRIwxJvHeP3rKsong8s9wUXIeI9T+o/xnr9tD2u+w1sgZuexnVE2GDcVArJhNsqkkedkjUHZp2BOK+KXfH6JGrTYt3G5msRrxblOfqbLPBgoVlVv9AILCOw9HNtBNYEOWQEVqxfgyS0jwUiOQnL8XQK4nkxHissp5BxRUQJmP4FpGLZxdEwR26j4CxtuPdGfOgkadi68hCulXxpiX7AOKvet+D07FspGQAbWsLGo9eKNhfGXTHSOpTblyDL2h67S4+w/jcMlI4+YKFkOCwRPLFEYVcG18GG9f4vztF0aC0QZa1bsVRsnn8h+J4v8WmxXj75+v5lqFLUs+xFuyEI40FrPBnE6lBRceFoIyXGfcUu++D5yotuErNbzLBE6L/1DTgBx4eH7Jqy0CYKaiplKbwZK8fSq70RWAJrYgSWEViWV9MIrPSSVRD4abgmr5bEHEkYPZRCaLtlm/JRfLEaxOtmxXhn3A7jg1j1xi5eKk8i1xu+9iM9btXecLba2Xo4/sgm5GAOCGb9oGgaY73AgyJuVM3BCNzPLa3whE9tT9ytx1l/O2HQog9bOHMOmHkFED1Z+TrexYTisAQtYuD9FRGHKp4HL9x8wbxnpHys84719+oub3/raE2joCAAI1mpt4XyeRIjktpPjketaRAQxFhmKrBidqx8I9oJ61sOtaCOZJSN6wPAXJZsRmAZgaUfZSOwJrzRRmCloZDLZoHFB442LATGWLaK3VFOkfFYBbVMRURDYsuz7t1GsflMsCFIPE7V/sj1Y85bvJpAsp6V9mce0FNFiUcKW0rIhnXlffo44VfiXe9Q61rdlalBRL2wjheyYV0gNqxKFhSPbWZCPr95KnIBo9Rb5ARbZAa+KwTkoqYFDGWHLbccSKl1n4N3uVYqfjNH16k/z6+9Cfhhm575g1OXs6UBsd6d2mfEeSOwjMAyAivyq2oEVhqKsGwWWIwjo4YF1ceylSzeWR9plCo1RCGgbYnoAWvExhLC87KMQ+z6hlMR+V65NyLnk1XXLt5nq+PvSCFt+hXwqZy2okaE4y35NTSzROOLhjYibK/pKkTu973NcnvhK6GGteBCYMk7YbvbXUfv2/DOvvuDk22byAkaCe3iA/l8XSbtWV0qKguJvlEnzp5aif9zixXPCP21rCBuPxtttyhDlCWbEVhGYEFgGIHFVxpWeaWMwEpDIZfNAqtc+M0vTcQvICsuN56J8m7Mtmf8U7PUD+z4MwFMI9/F8t3glJn3A8QbBvKZMJCGd327JXUJwuf7F7lDX2Al50WXAiE10Y3xRU3Xgv+9gqJgHXdbpDsUZrt6lk7r6RD8ryZ7/C+4a5VCaXLnjYKNgaYwUjlsrH0wU3DOag+F1zInN3ohddbnfO/H0es0KqX+KktgxXanJWXEeSOw6mfpG2UElhFY8sYagZXGoiubBRbZTgAlpNErFfYJo/em8Uw4fSoFtaFvJVIg3/2h2DpskFRZl5G4WhUfRH3GTNkGmgEvtuJsSQywqczM66k5DJpAIyP4E7xQIpSulVzGLqm+Yx22ZCGcvgt/dpum8Xon198HL2Ob1FWMsHzirNG7xueHObJ2uXl0L9N7eIKMXSw04rvGyPeG02DDm3KgFG4tjAySMtyBlN03T2GqoO0NYKBWsvHtEnwionc3AkvczUZgGYElr4oRWL6KnMQGnwwCC2DhSiF9XqnSMJZJ3buG0+Ddq5LK1e8LEqUVY93K7uqDPqkPzT7rp5om6jVL7HbG3js4BrAMYpuzsrOS46ERJc5s9jmXQhM4QOKYYp8yrAfj3FhJuv3x3+G8pTpMxR6Il5v3o2vBZ1lPrNN3SPWZpquQicCK2xHGoeAicieBs6w1BKxdmcNHtyuNTdS0Ii6ZmhbxtGokTitPIuXZiWgTrx0vYYVSlSjCoEw25PNOVJRYWZZW7Y3AMgLLCKzIr6QRWGklqrCYySCwGHADACSlUKbGstUdI/BZ8mVvexC2Erstb8o0fYo2Fa8w1lP1jAyuW6OnbnsYdRJZsp4oEeWi4cyQenzxVhmyXh9z5HqWA3i25bZfaMpcuZwiKCaMk5tygKvAcls2jki9yBaJGO96BfBRURBjKbhYY4BItszRs4vTqpNFADReKfaLCtdAnLZpR+GxZWV1a0T88pOQozrW5Vg8A2WulMqKOoVGYMndNALLCCwbKWcEVqq+ohHmnQwC6zC57tuF0sYQxo7qjwBNpE9wqobbItcXZCfGz0z91Jf0oXhtKunyLFDTGevp0ksa2SIAsoKcykh+q03Fq/UHBd9pQDDdh1ogQPNroaiULkQ9x3i9g1ynFR1j818e06c2PY3cyNFuFhSfcGW0ARHRkxC1TioO4wEB+KWUGM9UQTTe5UquZL1UKao9BBWniT/25mnQNO3qYG43Nv4KKNXu1b1K5ThGYAn3jcCCt94ILCOwUimQnOaeDAJrB2ECQdCJTR/GG+JLjUkl6wleMmnNL1+1oDJU7YN4mFJJ8UkUgdPphmX7eWpA1uv0WoO1ztP9KpBHm6U6DStWR+A3bVanybnoxs5tA9BLyNLVKNekVFSbVqAEJqjZZwNzv3JPwHKFcLHWskyn7ZOBIgBKQWXN8M0ILAoiAcQzAiu1T7QRWOH8NwIrnB+TQWDVyiXT9kCNy9M3M68SkPHluyOnsGpPoDUQKTO/GsswGpinbPd8sL73UHh81UWocM2/yBEmAhi+UifFuAh4qQMBxAUGg9TUokbE59fAljdXclWbroaCNmQ0rBjZn/7NjcBK/3uUNis0AittbkXEhUwGDYu5gy8IByIij3p+m3JRVKVE6ukRH6t8p7308aLG+ZrmFpV4PrUZMHYOjPahuEz3spc03fAHoEJE0WB+I7O4QmeIsCLkHgYCKOkcDLKOZtRqPER8VRLpbzSs2O91uvcwAivd71AarM8IrDS4CS6WMBk0LLLhTvlxogu+bN/EGskcH88CAdGs4KQsW/JBTct3hc2rbEdAhfsV5xTjNWd983HJwetf846+1o6/Ih5ry4t/0jSKl5DxWKwI7Qiu7sBM4m4xV9GVxsaI+DHRDKPMwbhDok1k9L2N7+XLzEs2Aisz75svqzYCyxe2+j7oZBJYgFNQivEvTswl7hGRG0m/KB0XCY0OEWk3iyBL5gm8Db1A1ft9TPeo3BtAkYXTAR2eaSgQTsxN1XnmTLY/da9eQrdUfh7Z1Kb3o+QUcslPyg96B50i3d1eKiuTEyH3KLcdHdpNlfOSuuDRqCkaxggse8YbgZWih9LPaY3A8pO7/o89mQQWkv6UEsAlR+YOS4t9hb4qlGDt+8g+bQ/7O44YSwOxeRUKhDNxt6Z+HCls1MxiGXIytR3rBzhBt2DWtz8NjarvTd7GmLkBOAmliG/1RswjuOswQ5o9JJTPmbveE1sxvmsw3gHSqZ8RWPZ3wwisdHpSY1yLEVghhhmBFeOzky7N6Y1ZIQtitRPr+iioLpcTTjavBmmHdH+l4P7bhmzq7UdB0BNKFwPjvGIP5JYxrqugFpcZkPguohuEaAEURCJcMp7H61w9r256KFVHsOaZOhUUDWq0t1tPNSDevt7XX9H7Pa/9U9ORzRvjXQqLUTwuA6DkslLN8Q4YY78DpT1A6JVaItTt8zQg7Yk4aofbFeOyUtvc7cWndpXezG4E1napQUZgOT5URmA5sij5DSaTwCJ3mS3PeJfZcoJeFJRCVor4Rf0ubwurkzA+ByDkSi0WinpiSiEgy6cttwyKI72OBYInxf18QUrNq0RKGysoE9GSNFCMCPzcYnygcwpQxYWaWk4eArKJSOqkoVFTYr3H8REosmP9vfrLHxwa0HSsr1cD5o31dpFqfo10btL4UYPrm/T+4FoUhRlcuwrj2ONYueV0qzSEiqbU3UKfEJpsGxBRHOiVBlyDUqzO4/Tuvivt6c12y4e0bud00Wm9+DgXZwTWVkFlBJb18TECK84XKpndJqPA4peL3hdqPpstX9h442s4Pm1bxN+iDQLGp222LqJHMKkwOfdEim/klgJviZoU6yzSBpYrmlZANKyckA0MGlbouHg1c/Ll8gUbP6RRjY7o9sER0PFRalh94RpWb7fWrEZ7tuiI8mBfr9aogkMD5GuiGiptOfzLR436KbkvxGrn+WS+j5Hmog3KiqPlFP+HkH2liLib6uvwZP7kvByeLNWzQYzA0pIGz7sRWMoILM9eLf8HmowCy3+uRp6BX0RifNNLWS3NAeOgFG1gO8t+pVCnL2pqrstaH1C8mKHFsL7guF3BZN+XDZVOKdqm7pf954QSvB9g9kqlbKEOnKiS87SpOcX9nSXtUcgxSzYjsJJ3I43ASh6vt5/JCKzU8N2XWY3A8oWtng7KwL9dZFTieZHuLsdpM6ONx3pvnfY9XbQPg1njiLhPSs0IkKFKPSCU8XEEP8/0eCRq3MxtpSZOlv9ZfhwhNCsqPvPijMDy4c3yeEgjsMBQI7DAByOwPH7BzHDJ5QA1KsbnMO7GSgFxui2OhxWBmRuJQCulrJT187zy0lm5Q82IBUuHpAHjngAFqlSvUMAqKLVcKJMDEdquVJPQTNeknJ4i2j7pBaQm9Yx0JN+cxsmo80bDyqjbFXGxRmCBLUZggQ9GYGX+O22uYDsO8C8myrAoxSIdxE0iLhP3+ReElPFi1LiooRGL3BonxS8/NSgawZnrxtxNalCMh2OlYoS0b9OcqGFxHHNzJxEHjIY1iW62XKoRWJPvnmfNFRuBlTW3MmkXQs2KlDYuhm1YNSzaqKhpUTOijYrns93mlLQblM0TGYGVzXfXn2szAssfvppRXXDg/wHy7fUIIZCZ+wAAAABJRU5ErkJggg=="},"windowMode":"window","version":"1.0.0"},"cursor":{"type":"none","custom":null,"center":{"x":0,"y":0}},"maxTextureDimension":4096,"turbo":false,"interpolation":false,"dangerousOptimizations":false,"stageHeight":360,"resizeMode":"preserve-ratio","username":"player####","closeWhenStopped":false,"custom":{"css":"","js":""},"controls":{"greenFlag":{"enabled":false},"stopAll":{"enabled":false},"fullscreen":{"enabled":false},"pause":{"enabled":false}},"monitors":{"editableLists":true,"variableColor":"#ff8c1a","listColor":"#fc662c"},"compiler":{"enabled":true,"warpTimer":false},"packagedRuntime":true,"chunks":{"gamepad":false,"pointerlock":false},"cloudVariables":{"mode":"ws","cloudHost":"wss://clouddata.turbowarp.org","custom":{},"specialCloudBehaviors":false,"unsafeCloudBehaviors":false},"extensions":["data:application/javascript,var%20count%20%3D%200%0Avar%20isMeasure%20%3D%20false%0Avar%20time%20%3D%200%0A%0A%2F*%09This%20work%20is%20licensed%20under%20Creative%20Commons%20GNU%20LGPL%20License.%0A%0A%09License%3A%20http%3A%2F%2Fcreativecommons.org%2Flicenses%2FLGPL%2F2.1%2F%0A%20%20%20Version%3A%200.9%0A%09Author%3A%20%20Stefan%20Goessner%2F2006%0A%09Web%3A%20%20%20%20%20http%3A%2F%2Fgoessner.net%2F%20%0A*%2F%0Afunction%20xml2json(xml%2C%20tab)%20%7B%0A%20%20var%20X%20%3D%20%7B%0A%20%20%20%20%20toObj%3A%20function(xml)%20%7B%0A%20%20%20%20%20%20%20%20var%20o%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20if%20(xml.nodeType%3D%3D1)%20%7B%20%20%20%2F%2F%20element%20node%20..%0A%20%20%20%20%20%20%20%20%20%20%20if%20(xml.attributes.length)%20%20%20%2F%2F%20element%20with%20attributes%20%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%3D0%3B%20i%3Cxml.attributes.length%3B%20i%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%40%22%2Bxml.attributes%5Bi%5D.nodeName%5D%20%3D%20(xml.attributes%5Bi%5D.nodeValue%7C%7C%22%22).toString()%3B%0A%20%20%20%20%20%20%20%20%20%20%20if%20(xml.firstChild)%20%7B%20%2F%2F%20element%20has%20child%20nodes%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20textChild%3D0%2C%20cdataChild%3D0%2C%20hasElementChild%3Dfalse%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20n%3Dxml.firstChild%3B%20n%3B%20n%3Dn.nextSibling)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%3D%3D1)%20hasElementChild%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%3D%3D3%20%26%26%20n.nodeValue.match(%2F%5B%5E%20%5Cf%5Cn%5Cr%5Ct%5Cv%5D%2F))%20textChild%2B%2B%3B%20%2F%2F%20non-whitespace%20text%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%3D%3D4)%20cdataChild%2B%2B%3B%20%2F%2F%20cdata%20section%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(hasElementChild)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(textChild%20%3C%202%20%26%26%20cdataChild%20%3C%202)%20%7B%20%2F%2F%20structured%20element%20with%20evtl.%20a%20single%20text%20or%2Fand%20cdata%20node%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X.removeWhite(xml)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20n%3Dxml.firstChild%3B%20n%3B%20n%3Dn.nextSibling)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%20%3D%3D%203)%20%20%2F%2F%20text%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23text%22%5D%20%3D%20X.escape(n.nodeValue)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%204)%20%20%2F%2F%20cdata%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23cdata%22%5D%20%3D%20X.escape(n.nodeValue)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(o%5Bn.nodeName%5D)%20%7B%20%20%2F%2F%20multiple%20occurence%20of%20element%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(o%5Bn.nodeName%5D%20instanceof%20Array)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bn.nodeName%5D%5Bo%5Bn.nodeName%5D.length%5D%20%3D%20X.toObj(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bn.nodeName%5D%20%3D%20%5Bo%5Bn.nodeName%5D%2C%20X.toObj(n)%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%20%2F%2F%20first%20occurence%20of%20element..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bn.nodeName%5D%20%3D%20X.toObj(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%20%2F%2F%20mixed%20content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!xml.attributes.length)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23text%22%5D%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(textChild)%20%7B%20%2F%2F%20pure%20text%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!xml.attributes.length)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23text%22%5D%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(cdataChild)%20%7B%20%2F%2F%20cdata%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cdataChild%20%3E%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20n%3Dxml.firstChild%3B%20n%3B%20n%3Dn.nextSibling)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23cdata%22%5D%20%3D%20X.escape(n.nodeValue)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20if%20(!xml.attributes.length%20%26%26%20!xml.firstChild)%20o%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20(xml.nodeType%3D%3D9)%20%7B%20%2F%2F%20document.node%0A%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.toObj(xml.documentElement)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20alert(%22unhandled%20node%20type%3A%20%22%20%2B%20xml.nodeType)%3B%0A%20%20%20%20%20%20%20%20return%20o%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20toJson%3A%20function(o%2C%20name%2C%20ind)%20%7B%0A%20%20%20%20%20%20%20%20var%20json%20%3D%20name%20%3F%20(%22%5C%22%22%2Bname%2B%22%5C%22%22)%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20if%20(o%20instanceof%20Array)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%3D0%2Cn%3Do.length%3B%20i%3Cn%3B%20i%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bi%5D%20%3D%20X.toJson(o%5Bi%5D%2C%20%22%22%2C%20ind%2B%22%5Ct%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%3F%22%3A%5B%22%3A%22%5B%22)%20%2B%20(o.length%20%3E%201%20%3F%20(%22%5Cn%22%2Bind%2B%22%5Ct%22%2Bo.join(%22%2C%5Cn%22%2Bind%2B%22%5Ct%22)%2B%22%5Cn%22%2Bind)%20%3A%20o.join(%22%22))%20%2B%20%22%5D%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20(o%20%3D%3D%20null)%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%26%26%22%3A%22)%20%2B%20%22null%22%3B%0A%20%20%20%20%20%20%20%20else%20if%20(typeof(o)%20%3D%3D%20%22object%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20arr%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20for%20(var%20m%20in%20o)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20arr%5Barr.length%5D%20%3D%20X.toJson(o%5Bm%5D%2C%20m%2C%20ind%2B%22%5Ct%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%3F%22%3A%7B%22%3A%22%7B%22)%20%2B%20(arr.length%20%3E%201%20%3F%20(%22%5Cn%22%2Bind%2B%22%5Ct%22%2Barr.join(%22%2C%5Cn%22%2Bind%2B%22%5Ct%22)%2B%22%5Cn%22%2Bind)%20%3A%20arr.join(%22%22))%20%2B%20%22%7D%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20(typeof(o)%20%3D%3D%20%22string%22)%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%26%26%22%3A%22)%20%2B%20%22%5C%22%22%20%2B%20o.toString()%20%2B%20%22%5C%22%22%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%26%26%22%3A%22)%20%2B%20o.toString()%3B%0A%20%20%20%20%20%20%20%20return%20json%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20innerXml%3A%20function(node)%20%7B%0A%20%20%20%20%20%20%20%20var%20s%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20if%20(%22innerHTML%22%20in%20node)%0A%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20node.innerHTML%3B%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20asXml%20%3D%20function(n)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20s%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3C%22%20%2B%20n.nodeName%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%3D0%3B%20i%3Cn.attributes.length%3Bi%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%20%22%20%2B%20n.attributes%5Bi%5D.nodeName%20%2B%20%22%3D%5C%22%22%20%2B%20(n.attributes%5Bi%5D.nodeValue%7C%7C%22%22).toString()%20%2B%20%22%5C%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.firstChild)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20c%3Dn.firstChild%3B%20c%3B%20c%3Dc.nextSibling)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20asXml(c)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3C%2F%22%2Bn.nodeName%2B%22%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%2F%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%203)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20n.nodeValue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%204)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3C!%5BCDATA%5B%22%20%2B%20n.nodeValue%20%2B%20%22%5D%5D%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20s%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20for%20(var%20c%3Dnode.firstChild%3B%20c%3B%20c%3Dc.nextSibling)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20asXml(c)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20s%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20escape%3A%20function(txt)%20%7B%0A%20%20%20%20%20%20%20%20return%20txt.replace(%2F%5B%5C%5C%5D%2Fg%2C%20%22%5C%5C%5C%5C%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace(%2F%5B%5C%22%5D%2Fg%2C%20'%5C%5C%22')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace(%2F%5B%5Cn%5D%2Fg%2C%20'%5C%5Cn')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace(%2F%5B%5Cr%5D%2Fg%2C%20'%5C%5Cr')%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20removeWhite%3A%20function(e)%20%7B%0A%20%20%20%20%20%20%20%20e.normalize()%3B%0A%20%20%20%20%20%20%20%20for%20(var%20n%20%3D%20e.firstChild%3B%20n%3B%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%20%3D%3D%203)%20%7B%20%20%2F%2F%20text%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!n.nodeValue.match(%2F%5B%5E%20%5Cf%5Cn%5Cr%5Ct%5Cv%5D%2F))%20%7B%20%2F%2F%20pure%20whitespace%20text%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20nxt%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.removeChild(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20nxt%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%201)%20%7B%20%20%2F%2F%20element%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X.removeWhite(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20else%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20any%20other%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20e%3B%0A%20%20%20%20%20%7D%0A%20%20%7D%3B%0A%20%20if%20(xml.nodeType%20%3D%3D%209)%20%2F%2F%20document%20node%0A%20%20%20%20%20xml%20%3D%20xml.documentElement%3B%0A%20%20var%20json%20%3D%20X.toJson(X.toObj(X.removeWhite(xml))%2C%20xml.nodeName%2C%20%22%5Ct%22)%3B%0A%20%20return%20%22%7B%5Cn%22%20%2B%20tab%20%2B%20(tab%20%3F%20json.replace(%2F%5Ct%2Fg%2C%20tab)%20%3A%20json.replace(%2F%5Ct%7C%5Cn%2Fg%2C%20%22%22))%20%2B%20%22%5Cn%7D%22%3B%0A%7D%0A%0Aclass%20RixxyX%20%7B%0A%20%20getInfo()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20color1%3A%20%22%23773c00%22%2C%0A%20%20%20%20%20%20color2%3A%20%22%235f3000%22%2C%0A%20%20%20%20%20%20id%3A%20%22RixxyX%22%2C%0A%20%20%20%20%20%20name%3A%20%22RixxyX%22%2C%0A%20%20%20%20%20%20description%3A%20'%5Bdeleted%5D'%2C%0A%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'notEquals'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT_1%5D%20!%3D%20%5BTEXT_2%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'TyruntX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'color'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'color%20%5BCOLOR%5D%20in%20hex'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.COLOR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%23ff0000'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnTrue'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'true'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnFalse'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'false'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'ifElseString'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'if%20%5BBOOL%5D%20then%20%5BTEXT_1%5D%20else%20%5BTEXT_2%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BOOL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20''%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'TyruntX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'ifString'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'if%20%5BBOOL%5D%20then%20%5BTEXT%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BOOL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20''%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'extractTextBetweenToCharacters'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'extract%20text%20%5BTEXT%5D%20between%20%5BNUM_1%5D%20to%20%5BNUM_2%5D%20characters'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%206%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnString'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT%5D%20as%20text'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnObject'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'JavaScript%20object%20%5BOBJ_NAME%5D%20with%20value%20%5BOBJ_VAL%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20OBJ_NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'String'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20OBJ_VAL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'isTheSameTypeAs'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT_1%5D%20is%20the%20same%20type%20as%20%5BTEXT_2%5D%3F'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'reverseTxt'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'reverse%20text%20%5BTEXT%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'XyxxiR'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnCount'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'counter'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'incrementCountByNum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'increment%20counter%20by%20%5BNUM%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'decrementCountByNum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'decrement%20counter%20by%20%5BNUM%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'setCount'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'set%20counter%20to%20%5BNUM%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'toUppercase'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT%5D%20to%20uppercase'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'rixxyx'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'toLowercase'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT%5D%20to%20lowercase'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RIXXYX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'toCapitalize'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'capitalize%20%5BTEXT%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'rixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'isJsNan'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'is%20JavaScript%20NaN%20%5BOBJ%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20OBJ%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20NaN%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnNum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BNUM%5D%20as%20number'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnBool'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BBOOL%5D%20as%20boolean'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BOOL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'true'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'binToTxt'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'binary%20%5BBIN%5D%20to%20text'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BIN%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'01010010%2001101001%2001111000%2001111000%2001111001%2001011000'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'txtToBin'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'text%20%5BTEXT%5D%20to%20binary'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'repeatTxtTimes'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'repeat%20text%20%5BTEXT%5D%20%5BNUM%5D%20times'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'x'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnJsCode'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'execute%20JavaScript%20code%20%5BJS_CODE%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20JS_CODE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%5C%22Ri%5C%22%20%2B%20%5C%22xx%5C%22%20%2B%20%5C%22yX%5C%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'jsonParse'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'JSON.parse(%5BTEXT%5D)'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%5C%22RixxyX%5C%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'execJsCode'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'execute%20JavaScript%20code%20%5BJS_CODE%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20JS_CODE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%5C%22Ri%5C%22%20%2B%20%5C%22xx%5C%22%20%2B%20%5C%22yX%5C%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnENum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'e'%2C%20%2F%2F%20e%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%09%09%09%09%7B%0A%09%09%09%09%09opcode%3A%20'startTime'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%09%09%09%09text%3A%20'start%20measuring%20time'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%2C%0A%09%09%09%09%7B%0A%09%09%09%09%09opcode%3A%20'endTime'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%09%09%09%09text%3A%20'end%20measuring%20time'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%2C%0A%09%09%09%09%7B%0A%09%09%09%09%09opcode%3A%20'returnTime'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%09%09%09%09%09text%3A%20'time'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%09%09%09%09%09opcode%3A%20'forceFetch'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%09%09%09%09text%3A%20'Force%20fetch%20modes'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%0A%20%20%20%20%20%20%5D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20notEquals(args)%20%7B%0A%20%20%20%20var%20isEquals%20%3D%20args.TEXT_1%20!%3D%20args.TEXT_2%3B%0A%20%20%20%20return%20isEquals%3B%0A%20%20%7D%0A%20%20color(args)%20%7B%0A%20%20%20%20return%20args.COLOR%3B%0A%20%20%7D%0A%20%20returnTrue(args)%20%7B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%20%20returnFalse(args)%20%7B%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20ifElseString(args)%20%7B%0A%20%20%20%20if%20(args.BOOL)%20%7B%0A%20%20%20%20%20%20return%20args.TEXT_1%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20args.TEXT_2%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20ifString(args)%20%7B%0A%20%20%20%20if%20(args.BOOL)%20%7B%0A%20%20%20%20%20%20return%20args.TEXT%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20extractTextBetweenToCharacters(args)%20%7B%0A%20%20%20%20var%20txt%20%3D%20args.TEXT.toString()%3B%0A%20%20%20%20var%20char1%20%3D%20args.NUM_1%20-%201%3B%0A%20%20%20%20var%20char2%20%3D%20args.NUM_2%3B%0A%20%20%20%20return%20txt.slice(char1%2C%20char2)%3B%0A%20%20%7D%0A%20%20returnString(args)%20%7B%0A%20%20%20%20return%20args.TEXT.toString()%3B%0A%20%20%7D%0A%20%20returnObject(args)%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20return%20eval(%22new%20%22%20%2B%20args.OBJ_NAME%20%2B%20%22(%5C%22%22%20%2B%20args.OBJ_VAL%20%2B%20%22%5C%22)%3B%22)%3B%0A%20%20%20%20%7D%20catch(err)%20%7B%0A%20%20%20%20%20%20return%20err%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20isTheSameTypeAs(args)%20%7B%0A%20%20%20%20return%20(typeof%20args.TEXT_1%20%3D%3D%20typeof%20args.TEXT_2)%3B%0A%20%20%7D%0A%20%20reverseTxt(args)%20%7B%0A%20%20%20%20var%20emptyStr%20%3D%20%22%22%3B%0A%20%20%20%20var%20txt%20%3D%20args.TEXT.toString()%3B%0A%20%20%20%20var%20localCount%20%3D%20args.TEXT.length%20-%201%3B%0A%20%20%20%20while%20(localCount%20!%3D%20-1)%20%7B%0A%20%20%20%20%20%20emptyStr%20%3D%20emptyStr%20%2B%20txt.charAt(localCount)%3B%0A%20%20%20%20%20%20localCount%20-%3D%201%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20emptyStr%3B%0A%20%20%7D%0A%20%20returnCount(args)%20%7B%0A%20%20%20%20return%20count%3B%0A%20%20%7D%0A%20%20incrementCountByNum(args)%20%7B%0A%20%20%20%20if%20((count.toString().indexOf(%22-%22)%20%3D%3D%20-1)%20%7C%7C%20(args.NUM.toString().indexOf(%22-%22)%20%3D%3D%20-1))%20%7B%0A%20%20%20%20%20%20count%20%2B%3D%20Math.floor(args.NUM)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20count%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20decrementCountByNum(args)%20%7B%0A%20%20%20%20if%20((count%20-%20Math.floor(args.NUM)).toString().indexOf(%22-%22)%20%3D%3D%20-1)%20%7B%0A%20%20%20%20%20%20count%20-%3D%20Math.floor(args.NUM)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20count%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20setCount(args)%20%7B%0A%20%20%20%20if%20((count.toString().indexOf(%22-%22)%20%3D%3D%20-1)%20%26%26%20(args.NUM.toString().indexOf(%22-%22)%20%3D%3D%20-1))%20%7B%0A%20%20%20%20%20%20count%20%3D%20Math.floor(args.NUM)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20count%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20toUppercase(args)%20%7B%0A%20%20%20%20return%20args.TEXT.toUpperCase()%3B%0A%20%20%7D%0A%20%20toLowercase(args)%20%7B%0A%20%20%20%20return%20args.TEXT.toLowerCase()%3B%0A%20%20%7D%0A%20%20toCapitalize(args)%20%7B%0A%20%20%20%20return%20args.TEXT.charAt(0).toUpperCase()%20%2B%20args.TEXT.slice(1)%3B%0A%20%20%7D%0A%20%20isJsNan(args)%20%7B%0A%20%20%20%20return%20isNaN(args.OBJ)%3B%0A%20%20%7D%0A%20%20returnNum(args)%20%7B%0A%20%20%20%20return%20Math.floor(args.NUM)%3B%0A%20%20%7D%0A%20%20returnBool(args)%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20if%20((JSON.parse(args.BOOL).toString()%20%3D%3D%20%22true%22)%20%7C%7C%20(JSON.parse(args.BOOL).toString()%20%3D%3D%20%22false%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20JSON.parse(args.BOOL)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(JSON.parse(args.BOOL).toString()%20%3D%3D%20%221%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(JSON.parse(args.BOOL).toString()%20%3D%3D%20%220%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20return%20err%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20binToTxt(args)%20%7B%0A%20%20%20%20var%20binary%20%3D%20args.BIN.toString()%3B%0A%20%20%20%20return%20binary.split(%22%20%22).map((x)%20%3D%3E%20x%20%3D%20String.fromCharCode(parseInt(x%2C%202))).join(%22%22)%3B%0A%20%20%7D%0A%20%20txtToBin(args)%20%7B%0A%20%20%20%20var%20text%20%3D%20args.TEXT.toString()%3B%0A%20%20%20%20return%20Array.from(text).map((each)%3D%3Eeach.charCodeAt(0).toString(2)).join(%22%20%22)%3B%0A%20%20%7D%0A%20%20repeatTxtTimes(args)%20%7B%0A%20%20%20%20return%20args.TEXT.repeat(Math.floor(args.NUM))%3B%0A%20%20%7D%0A%20%20returnJsCode(args)%20%7B%0A%20%20%20%20var%20func%20%3D%20eval(args.JS_CODE)%3B%0A%20%20%20%20return%20func%3B%0A%20%20%7D%0A%20%20jsonParse(args)%20%7B%0A%20%20%20%20return%20JSON.parse(args.TEXT.toString())%3B%0A%20%20%7D%0A%20%20execJsCode(args)%20%7B%0A%20%20%20%20var%20func%20%3D%20new%20Function(args.JS_CODE)%3B%0A%20%20%7D%0A%20%20returnENum(args)%20%7B%0A%20%20%20%20return%20Math.E%0A%20%20%7D%0A%09startTime(args)%20%7B%0A%09%09time%20%3D%200%0A%09%09isMeasure%20%3D%20true%0A%09%7D%0A%09endTime(args)%20%7B%0A%09%09isMeasure%20%3D%20false%0A%09%7D%0A%09returnTime(args)%20%7B%0A%09%09if%20(isMeasure%20%3D%3D%20true)%20%7B%0A%09%09%09time%20%2B%3D%201%0A%09%09%7D%0A%09%09return%20time%0A%09%7D%0A%20%20forceFetch()%20%7B%0A%20%20%20%20Scratch.canFetch%20%3D%20function%20()%20%7B%0A%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%7D%0AScratch.extensions.register(new%20RixxyX())%3B","https://extensions.turbowarp.org/Lily/Skins.js","https://extensions.turbowarp.org/Lily/TempVariables2.js","https://extensions.turbowarp.org/Skyhigh173/json.js","https://extensions.turbowarp.org/-SIPC-/consoles.js","https://extensions.turbowarp.org/TheShovel/ShovelUtils.js","https://extensions.turbowarp.org/NOname-awa/global-coordinate.js","https://extensions.turbowarp.org/Lily/MoreTimers.js","https://extensions.turbowarp.org/Lily/ClonesPlus.js","https://extensions.turbowarp.org/utilities.js","https://extensions.penguinmod.com/extensions/SharkPool/Sprite-Effects.js","https://extensions.turbowarp.org/local-storage.js","https://extensions.turbowarp.org/Lily/CommentBlocks.js","https://extensions.turbowarp.org/CST1229/zip.js","data:application/javascript,%2F%2F%20Name%3A%20Cloudlink%0A%2F%2F%20ID%3A%20cloudlink%0A%2F%2F%20Description%3A%20Powerful%20WebSocket%20extension%20for%20Scratch%203.%0A%2F%2F%20By%3A%20MikeDEV%0A%0A%2F%2F%20Copy%20of%20S4-0_nosuite.js%20as%20of%2010%2F31%2F2022%0A%2F*%20eslint-disable%20*%2F%0A%0A(function%20(Scratch)%20%7B%0A%09var%20servers%20%3D%20%7B%7D%3B%20%2F%2F%20Server%20list%0A%09let%20mWS%20%3D%20null%3B%0A%20%20%0A%09%2F%2F%20Get%20the%20server%20URL%20list%0A%09try%20%7B%0A%09%20%20Scratch.fetch(%0A%09%09%22https%3A%2F%2Fraw.githubusercontent.com%2FMikeDev101%2Fcloudlink%2Fmaster%2Fserverlist.json%22%0A%09%20%20)%0A%09%09.then((response)%20%3D%3E%20%7B%0A%09%09%20%20return%20response.text()%3B%0A%09%09%7D)%0A%09%09.then((data)%20%3D%3E%20%7B%0A%09%09%20%20servers%20%3D%20JSON.parse(data)%3B%0A%09%09%7D)%0A%09%09.catch((err)%20%3D%3E%20%7B%0A%09%09%20%20console.log(err)%3B%0A%09%09%20%20servers%20%3D%20%7B%7D%3B%0A%09%09%7D)%3B%0A%09%7D%20catch%20(err)%20%7B%0A%09%20%20console.log(err)%3B%0A%09%20%20servers%20%3D%20%7B%7D%3B%0A%09%7D%0A%20%20%0A%09function%20find_id(ID%2C%20ulist)%20%7B%0A%09%20%20%2F%2F%20Thanks%20StackOverflow!%0A%09%20%20if%20(jsonCheck(ID)%20%26%26%20!intCheck(ID))%20%7B%0A%09%09return%20ulist.some(%0A%09%09%20%20(o)%20%3D%3E%0A%09%09%09o.username%20%3D%3D%3D%20JSON.parse(ID).username%20%26%26%20o.id%20%3D%3D%20JSON.parse(ID).id%0A%09%09)%3B%0A%09%20%20%7D%20else%20%7B%0A%09%09return%20ulist.some((o)%20%3D%3E%20o.username%20%3D%3D%3D%20String(ID)%20%7C%7C%20o.id%20%3D%3D%20ID)%3B%0A%09%20%20%7D%0A%09%7D%0A%20%20%0A%09function%20jsonCheck(JSON_STRING)%20%7B%0A%09%20%20try%20%7B%0A%09%09JSON.parse(JSON_STRING)%3B%0A%09%09return%20true%3B%0A%09%20%20%7D%20catch%20(err)%20%7B%0A%09%09return%20false%3B%0A%09%20%20%7D%0A%09%7D%0A%20%20%0A%09function%20intCheck(value)%20%7B%0A%09%20%20return%20!isNaN(value)%3B%0A%09%7D%0A%20%20%0A%09function%20autoConvert(value)%20%7B%0A%09%20%20%2F%2F%20Check%20if%20the%20value%20is%20JSON%20%2F%20Dict%20first%0A%09%20%20try%20%7B%0A%09%09JSON.parse(value)%3B%0A%09%09return%20JSON.parse(value)%3B%0A%09%20%20%7D%20catch%20(err)%20%7B%7D%0A%20%20%0A%09%20%20%2F%2F%20Check%20if%20the%20value%20is%20an%20array%0A%09%20%20try%20%7B%0A%09%09tmp%20%3D%20value%3B%0A%09%09tmp%20%3D%20tmp.replace(%2F'%2Fg%2C%20'%22')%3B%0A%09%09JSON.parse(tmp)%3B%0A%09%09return%20JSON.parse(tmp)%3B%0A%09%20%20%7D%20catch%20(err)%20%7B%7D%0A%20%20%0A%09%20%20%2F%2F%20Check%20if%20an%20int%2Ffloat%0A%09%20%20if%20(!isNaN(value))%20%7B%0A%09%09return%20Number(value)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20%2F%2F%20Leave%20as%20the%20original%20value%20if%20none%20of%20the%20above%20work%0A%09%20%20return%20value%3B%0A%09%7D%0A%20%20%0A%09class%20CloudLink%20%7B%0A%09%20%20constructor(runtime%2C%20extensionId)%20%7B%0A%09%09%2F%2F%20Extension%20stuff%0A%09%09this.runtime%20%3D%20runtime%3B%0A%09%09this.cl_icon%20%3D%0A%09%09%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMjUuMzU0OCIgaGVpZ2h0PSIyMjUuMzU0OCIgdmlld0JveD0iMCwwLDIyNS4zNTQ4LDIyNS4zNTQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTI3LjMyMjYsLTY3LjMyMjYpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0xMjcuMzIyNiwxODBjMCwtNjIuMjMwMDEgNTAuNDQ3MzksLTExMi42Nzc0IDExMi42Nzc0LC0xMTIuNjc3NGM2Mi4yMzAwMSwwIDExMi42Nzc0LDUwLjQ0NzM5IDExMi42Nzc0LDExMi42Nzc0YzAsNjIuMjMwMDEgLTUwLjQ0NzM5LDExMi42Nzc0IC0xMTIuNjc3NCwxMTIuNjc3NGMtNjIuMjMwMDEsMCAtMTEyLjY3NzQsLTUwLjQ0NzM5IC0xMTIuNjc3NCwtMTEyLjY3NzR6IiBmaWxsPSIjMDBjMjhjIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS13aWR0aD0iMCIvPjxnIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLXdpZHRoPSIxIj48cGF0aCBkPSJNMjg2LjEyMDM3LDE1MC41NTc5NWMyMy4yNDA4NiwwIDQyLjA3ODksMTguODM5NDYgNDIuMDc4OSw0Mi4wNzg5YzAsMjMuMjM5NDQgLTE4LjgzODAzLDQyLjA3ODkgLTQyLjA3ODksNDIuMDc4OWgtOTIuMjQwNzRjLTIzLjI0MDg2LDAgLTQyLjA3ODksLTE4LjgzOTQ2IC00Mi4wNzg5LC00Mi4wNzg5YzAsLTIzLjIzOTQ0IDE4LjgzODAzLC00Mi4wNzg5IDQyLjA3ODksLTQyLjA3ODloNC4xODg4N2MxLjgxMTUzLC0yMS41NzA1NSAxOS44OTM1NywtMzguNTEyODkgNDEuOTMxNSwtMzguNTEyODljMjIuMDM3OTMsMCA0MC4xMTk5NywxNi45NDIzNCA0MS45MzE1LDM4LjUxMjg5eiIgZmlsbD0iI2ZmZmZmZiIvPjxwYXRoIGQ9Ik0yODkuMDg2NTUsMjEwLjM0MTE0djkuMDQ2NjdoLTI2LjkxNjYzaC05LjA0NjY3di05LjA0NjY3di01NC41MDMzOWg5LjA0NjY3djU0LjUwMzM5eiIgZmlsbD0iIzAwYzI4YyIvPjxwYXRoIGQ9Ik0yMjIuNDA5MjUsMjE5LjM4NzgxYy04LjM1MzIsMCAtMTYuMzY0MzEsLTMuMzE4MzQgLTIyLjI3MDksLTkuMjI0OTJjLTUuOTA2NjEsLTUuOTA2NTggLTkuMjI0OTEsLTEzLjkxNzY4IC05LjIyNDkxLC0yMi4yNzA4OWMwLC04LjM1MzIgMy4zMTgyOSwtMTYuMzY0MzEgOS4yMjQ5MSwtMjIuMjcwOWM1LjkwNjU5LC01LjkwNjYxIDEzLjkxNzcsLTkuMjI0OTEgMjIuMjcwOSwtOS4yMjQ5MWgyMS4xMDg5djguOTM0OThoLTIxLjEwODl2MC4xMDI1N2MtNS45NTYyOCwwIC0xMS42Njg2NCwyLjM2NjE2IC0xNS44ODAzNyw2LjU3Nzg5Yy00LjIxMTczLDQuMjExNzMgLTYuNTc3ODksOS45MjQwOCAtNi41Nzc4OSwxNS44ODAzN2MwLDUuOTU2MjggMi4zNjYxNiwxMS42Njg2NCA2LjU3Nzg5LDE1Ljg4MDM3YzQuMjExNzMsNC4yMTE3MyA5LjkyNDA4LDYuNTc3OTMgMTUuODgwMzcsNi41Nzc5M3YwLjEwMjUzaDIxLjEwODl2OC45MzQ5OHoiIGZpbGw9IiMwMGMyOGMiLz48L2c%2BPC9nPjwvZz48L3N2Zz48IS0tcm90YXRpb25DZW50ZXI6MTEyLjY3NzQwNDA4NDA4MzkyOjExMi42Nzc0MDQwODQwODQwMy0tPg%3D%3D%22%3B%0A%09%09this.cl_block%20%3D%0A%09%09%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNzYuMzk4NTQiIGhlaWdodD0iMTIyLjY3MDY5IiB2aWV3Qm94PSIwLDAsMTc2LjM5ODU0LDEyMi42NzA2OSI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE1MS44MDA3MywtMTE4LjY2NDY2KSI%2BPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI%2BPGc%2BPHBhdGggZD0iTTI4Ni4xMjAzNywxNTcuMTc3NTVjMjMuMjQwODYsMCA0Mi4wNzg5LDE4LjgzOTQ2IDQyLjA3ODksNDIuMDc4OWMwLDIzLjIzOTQ0IC0xOC44MzgwMyw0Mi4wNzg5IC00Mi4wNzg5LDQyLjA3ODloLTkyLjI0MDc0Yy0yMy4yNDA4NiwwIC00Mi4wNzg5LC0xOC44Mzk0NiAtNDIuMDc4OSwtNDIuMDc4OWMwLC0yMy4yMzk0NCAxOC44MzgwMywtNDIuMDc4OSA0Mi4wNzg5LC00Mi4wNzg5aDQuMTg4ODdjMS44MTE1MywtMjEuNTcwNTUgMTkuODkzNTcsLTM4LjUxMjg5IDQxLjkzMTUsLTM4LjUxMjg5YzIyLjAzNzkzLDAgNDAuMTE5OTcsMTYuOTQyMzQgNDEuOTMxNSwzOC41MTI4OXoiIGZpbGw9IiNmZmZmZmYiLz48cGF0aCBkPSJNMjg5LjA4NjU1LDIxNi45NjA3NHY5LjA0NjY3aC0yNi45MTY2M2gtOS4wNDY2N3YtOS4wNDY2N3YtNTQuNTAzMzloOS4wNDY2N3Y1NC41MDMzOXoiIGZpbGw9IiMwMGMyOGMiLz48cGF0aCBkPSJNMjIyLjQwOTI1LDIyNi4wMDc0MWMtOC4zNTMyLDAgLTE2LjM2NDMxLC0zLjMxODM0IC0yMi4yNzA5LC05LjIyNDkyYy01LjkwNjYxLC01LjkwNjU4IC05LjIyNDkxLC0xMy45MTc2OCAtOS4yMjQ5MSwtMjIuMjcwODljMCwtOC4zNTMyIDMuMzE4MjksLTE2LjM2NDMxIDkuMjI0OTEsLTIyLjI3MDljNS45MDY1OSwtNS45MDY2MSAxMy45MTc3LC05LjIyNDkxIDIyLjI3MDksLTkuMjI0OTFoMjEuMTA4OXY4LjkzNDk4aC0yMS4xMDg5djAuMTAyNTdjLTUuOTU2MjgsMCAtMTEuNjY4NjQsMi4zNjYxNiAtMTUuODgwMzcsNi41Nzc4OWMtNC4yMTE3Myw0LjIxMTczIC02LjU3Nzg5LDkuOTI0MDggLTYuNTc3ODksMTUuODgwMzdjMCw1Ljk1NjI4IDIuMzY2MTYsMTEuNjY4NjQgNi41Nzc4OSwxNS44ODAzN2M0LjIxMTczLDQuMjExNzMgOS45MjQwOCw2LjU3NzkzIDE1Ljg4MDM3LDYuNTc3OTN2MC4xMDI1M2gyMS4xMDg5djguOTM0OTh6IiBmaWxsPSIjMDBjMjhjIi8%2BPC9nPjwvZz48L2c%2BPC9zdmc%2BPCEtLXJvdGF0aW9uQ2VudGVyOjg4LjE5OTI2OTk5OTk5OTk4OjYxLjMzNTM0NDk5OTk5OTk5LS0%2B%22%3B%0A%20%20%0A%09%09%2F%2F%20Socket%20data%0A%09%09this.socketData%20%3D%20%7B%0A%09%09%20%20gmsg%3A%20%5B%5D%2C%0A%09%09%20%20pmsg%3A%20%5B%5D%2C%0A%09%09%20%20direct%3A%20%5B%5D%2C%0A%09%09%20%20statuscode%3A%20%5B%5D%2C%0A%09%09%20%20gvar%3A%20%5B%5D%2C%0A%09%09%20%20pvar%3A%20%5B%5D%2C%0A%09%09%20%20motd%3A%20%22%22%2C%0A%09%09%20%20client_ip%3A%20%22%22%2C%0A%09%09%20%20ulist%3A%20%5B%5D%2C%0A%09%09%20%20server_version%3A%20%22%22%2C%0A%09%09%7D%3B%0A%09%09this.varData%20%3D%20%7B%0A%09%09%20%20gvar%3A%20%7B%7D%2C%0A%09%09%20%20pvar%3A%20%7B%7D%2C%0A%09%09%7D%3B%0A%20%20%0A%09%09this.queueableCmds%20%3D%20%5B%0A%09%09%20%20%22gmsg%22%2C%0A%09%09%20%20%22pmsg%22%2C%0A%09%09%20%20%22gvar%22%2C%0A%09%09%20%20%22pvar%22%2C%0A%09%09%20%20%22direct%22%2C%0A%09%09%20%20%22statuscode%22%2C%0A%09%09%5D%3B%0A%09%09this.varCmds%20%3D%20%5B%22gvar%22%2C%20%22pvar%22%5D%3B%0A%20%20%0A%09%09%2F%2F%20Listeners%0A%09%09this.socketListeners%20%3D%20%7B%7D%3B%0A%09%09this.socketListenersData%20%3D%20%7B%7D%3B%0A%09%09this.newSocketData%20%3D%20%7B%0A%09%09%20%20gmsg%3A%20false%2C%0A%09%09%20%20pmsg%3A%20false%2C%0A%09%09%20%20direct%3A%20false%2C%0A%09%09%20%20statuscode%3A%20false%2C%0A%09%09%20%20gvar%3A%20false%2C%0A%09%09%20%20pvar%3A%20false%2C%0A%09%09%7D%3B%0A%20%20%0A%09%09%2F%2F%20Edge-triggered%20hat%20blocks%0A%09%09this.connect_hat%20%3D%200%3B%0A%09%09this.packet_hat%20%3D%200%3B%0A%09%09this.close_hat%20%3D%200%3B%0A%20%20%0A%09%09%2F%2F%20Status%20stuff%0A%09%09this.isRunning%20%3D%20false%3B%0A%09%09this.isLinked%20%3D%20false%3B%0A%09%09this.version%20%3D%20%22S4.0%22%3B%0A%09%09this.link_status%20%3D%200%3B%0A%09%09this.username%20%3D%20%22%22%3B%0A%09%09this.tmp_username%20%3D%20%22%22%3B%0A%09%09this.isUsernameSyncing%20%3D%20false%3B%0A%09%09this.isUsernameSet%20%3D%20false%3B%0A%09%09this.disconnectWasClean%20%3D%20false%3B%0A%09%09this.wasConnectionDropped%20%3D%20false%3B%0A%09%09this.didConnectionFail%20%3D%20false%3B%0A%09%09this.protocolOk%20%3D%20false%3B%0A%20%20%0A%09%09%2F%2F%20Listeners%20stuff%0A%09%09this.enableListener%20%3D%20false%3B%0A%09%09this.setListener%20%3D%20%22%22%3B%0A%20%20%0A%09%09%2F%2F%20Rooms%20stuff%0A%09%09this.enableRoom%20%3D%20false%3B%0A%09%09this.isRoomSetting%20%3D%20false%3B%0A%09%09this.selectRoom%20%3D%20%22%22%3B%0A%20%20%0A%09%09%2F%2F%20Remapping%20stuff%0A%09%09this.menuRemap%20%3D%20%7B%0A%09%09%20%20%22Global%20data%22%3A%20%22gmsg%22%2C%0A%09%09%20%20%22Private%20data%22%3A%20%22pmsg%22%2C%0A%09%09%20%20%22Global%20variables%22%3A%20%22gvar%22%2C%0A%09%09%20%20%22Private%20variables%22%3A%20%22pvar%22%2C%0A%09%09%20%20%22Direct%20data%22%3A%20%22direct%22%2C%0A%09%09%20%20%22Status%20code%22%3A%20%22statuscode%22%2C%0A%09%09%20%20%22All%20data%22%3A%20%22all%22%2C%0A%09%09%7D%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getInfo()%20%7B%0A%09%09return%20%7B%0A%09%09%20%20id%3A%20%22cloudlink%22%2C%0A%09%09%20%20name%3A%20%22CloudLink%22%2C%0A%09%09%20%20blockIconURI%3A%20this.cl_block%2C%0A%09%09%20%20menuIconURI%3A%20this.cl_icon%2C%0A%09%09%20%20docsURI%3A%20%22https%3A%2F%2Fhackmd.io%2F%40MikeDEV%2FHJiNYwOfo%22%2C%0A%09%09%20%20blocks%3A%20%5B%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnGlobalData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Global%20data%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnPrivateData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Private%20data%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnDirectData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Direct%20Data%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnLinkData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Link%20status%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnStatusCode%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Status%20code%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnUserListData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Usernames%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnUsernameData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22My%20username%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnVersionData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Extension%20version%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnServerVersion%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Server%20version%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnServerList%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Server%20list%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnMOTD%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Server%20MOTD%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnClientIP%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22My%20IP%20address%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnListenerData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Response%20for%20listener%20%5BID%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22readQueueSize%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Size%20of%20queue%20for%20%5BTYPE%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22allmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22All%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22readQueueData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Packet%20queue%20for%20%5BTYPE%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22allmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22All%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnVarData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22%5BTYPE%5D%20%5BVAR%5D%20data%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22parseJSON%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22%5BPATH%5D%20of%20%5BJSON_STRING%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09PATH%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22fruit%2Fapples%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09JSON_STRING%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%0A%09%09%09%09%09'%7B%22fruit%22%3A%20%7B%22apples%22%3A%202%2C%20%22bananas%22%3A%203%7D%2C%20%22total_fruit%22%3A%205%7D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getFromJSONArray%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Get%20%5BNUM%5D%20from%20JSON%20array%20%5BARRAY%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09NUM%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22number%22%2C%0A%09%09%09%09%20%20defaultValue%3A%200%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ARRAY%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%5B%22foo%22%2C%22bar%22%5D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22fetchURL%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20text%3A%20%22Fetch%20data%20from%20URL%20%5Burl%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09url%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fhello.txt%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22requestURL%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20request%20with%20method%20%5Bmethod%5D%20for%20URL%20%5Burl%5D%20with%20data%20%5Bdata%5D%20and%20headers%20%5Bheaders%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09method%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22GET%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09url%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fhello.txt%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09data%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22%7B%7D%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09headers%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22%7B%7D%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22makeJSON%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Convert%20%5BtoBeJSONified%5D%20to%20JSON%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09toBeJSONified%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%7B%22test%22%3A%20true%7D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onConnect%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20connected%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onClose%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20disconnected%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20I%20receive%20new%20packet%20with%20listener%20%5BID%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onNewPacket%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20I%20receive%20new%20%5BTYPE%5D%20packet%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22almostallmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onNewVar%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20I%20receive%20new%20%5BTYPE%5D%20data%20for%20%5BVAR%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getComState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Connected%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getRoomState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Linked%20to%20rooms%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getComLostConnectionState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Lost%20connection%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getComFailedConnectionState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Failed%20to%20connnect%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getUsernameState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Username%20synced%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnIsNewData%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Got%20New%20%5BTYPE%5D%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22datamenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnIsNewVarData%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Got%20New%20%5BTYPE%5D%20data%20for%20variable%20%5BVAR%5D%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnIsNewListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Got%20new%20packet%20with%20listener%20%5BID%5D%3F%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22checkForID%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22ID%20%5BID%5D%20connected%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Another%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22isValidJSON%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Is%20%5BJSON_STRING%5D%20valid%20JSON%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09JSON_STRING%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%0A%09%09%09%09%09'%7B%22fruit%22%3A%20%7B%22apples%22%3A%202%2C%20%22bananas%22%3A%203%7D%2C%20%22total_fruit%22%3A%205%7D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22openSocket%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Connect%20to%20%5BIP%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09IP%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22ws%3A%2F%2F127.0.0.1%3A3000%2F%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22openSocketPublicServers%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Connect%20to%20server%20%5BID%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22number%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22closeSocket%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20text%3A%20%22Disconnect%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22setMyName%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Set%20%5BNAME%5D%20as%20username%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09NAME%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22A%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22createListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Attach%20listener%20%5BID%5D%20to%20next%20packet%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22linkToRooms%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Link%20to%20room(s)%20%5BROOMS%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ROOMS%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%5B%22test%22%5D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22selectRoomsInNextPacket%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Select%20room(s)%20%5BROOMS%5D%20for%20next%20packet%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ROOMS%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%5B%22test%22%5D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22unlinkFromRooms%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Unlink%20from%20all%20rooms%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendGData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendPData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20%5BDATA%5D%20to%20%5BID%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Another%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendGDataAsVar%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20variable%20%5BVAR%5D%20with%20data%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Banana%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendPDataAsVar%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20variable%20%5BVAR%5D%20to%20%5BID%5D%20with%20data%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Banana%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Another%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22runCMDnoID%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20command%20without%20ID%20%5BCMD%5D%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09CMD%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22direct%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22val%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22runCMD%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20command%20%5BCMD%5D%20%5BID%5D%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09CMD%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22direct%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22id%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22val%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22resetNewData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Reset%20got%20new%20%5BTYPE%5D%20status%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22datamenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22resetNewVarData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Reset%20got%20new%20%5BTYPE%5D%20%5BVAR%5D%20status%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22resetNewListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Reset%20got%20new%20%5BID%5D%20listener%20status%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22clearAllPackets%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Clear%20all%20packets%20for%20%5BTYPE%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22allmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22All%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%20%20%5D%2C%0A%09%09%20%20menus%3A%20%7B%0A%09%09%09coms%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%22Connected%22%2C%20%22Username%20synced%22%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09datamenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%0A%09%09%09%09%22Global%20data%22%2C%0A%09%09%09%09%22Private%20data%22%2C%0A%09%09%09%09%22Direct%20data%22%2C%0A%09%09%09%09%22Status%20code%22%2C%0A%09%09%09%20%20%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09varmenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%22Global%20variables%22%2C%20%22Private%20variables%22%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09allmenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%0A%09%09%09%09%22Global%20data%22%2C%0A%09%09%09%09%22Private%20data%22%2C%0A%09%09%09%09%22Direct%20data%22%2C%0A%09%09%09%09%22Status%20code%22%2C%0A%09%09%09%09%22Global%20variables%22%2C%0A%09%09%09%09%22Private%20variables%22%2C%0A%09%09%09%09%22All%20data%22%2C%0A%09%09%09%20%20%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09almostallmenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%0A%09%09%09%09%22Global%20data%22%2C%0A%09%09%09%09%22Private%20data%22%2C%0A%09%09%09%09%22Direct%20data%22%2C%0A%09%09%09%09%22Status%20code%22%2C%0A%09%09%09%09%22Global%20variables%22%2C%0A%09%09%09%09%22Private%20variables%22%2C%0A%09%09%09%20%20%5D%2C%0A%09%09%09%7D%2C%0A%09%09%20%20%7D%2C%0A%09%09%7D%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20%2F%2F%20Code%20for%20blocks%20go%20here%0A%20%20%0A%09%20%20returnGlobalData()%20%7B%0A%09%09if%20(this.socketData.gmsg.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%20this.socketData.gmsg%5Bthis.socketData.gmsg.length%20-%201%5D.val%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnPrivateData()%20%7B%0A%09%09if%20(this.socketData.pmsg.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%20this.socketData.pmsg%5Bthis.socketData.pmsg.length%20-%201%5D.val%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnDirectData()%20%7B%0A%09%09if%20(this.socketData.direct.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%0A%09%09%09this.socketData.direct%5Bthis.socketData.direct.length%20-%201%5D.val%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnLinkData()%20%7B%0A%09%09return%20String(this.link_status)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnStatusCode()%20%7B%0A%09%09if%20(this.socketData.statuscode.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%0A%09%09%09this.socketData.statuscode%5Bthis.socketData.statuscode.length%20-%201%5D%0A%09%09%09%20%20.code%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnUserListData()%20%7B%0A%09%09return%20JSON.stringify(this.socketData.ulist)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnUsernameData()%20%7B%0A%09%09let%20data%20%3D%20this.username%3B%0A%20%20%0A%09%09if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%20%20data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%7D%0A%20%20%0A%09%09return%20data%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnVersionData()%20%7B%0A%09%09return%20String(this.version)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnServerVersion()%20%7B%0A%09%09return%20String(this.socketData.server_version)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnServerList()%20%7B%0A%09%09return%20JSON.stringify(servers)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnMOTD()%20%7B%0A%09%09return%20String(this.socketData.motd)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnClientIP()%20%7B%0A%09%09return%20String(this.socketData.client_ip)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnListenerData(%7B%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning%20%26%26%20this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%20%20return%20JSON.stringify(this.socketListenersData%5BID%5D)%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%7B%7D%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20readQueueSize(%7B%20TYPE%20%7D)%20%7B%0A%09%09if%20(this.menuRemap%5BString(TYPE)%5D%20%3D%3D%20%22all%22)%20%7B%0A%09%09%20%20let%20tmp_size%20%3D%200%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.gmsg.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.pmsg.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.direct.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.statuscode.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.gvar.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.pvar.length%3B%0A%09%09%20%20return%20tmp_size%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20this.socketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D.length%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20readQueueData(%7B%20TYPE%20%7D)%20%7B%0A%09%09if%20(this.menuRemap%5BString(TYPE)%5D%20%3D%3D%20%22all%22)%20%7B%0A%09%09%20%20let%20tmp_socketData%20%3D%20JSON.parse(JSON.stringify(this.socketData))%3B%20%2F%2F%20Deep%20copy%0A%20%20%0A%09%09%20%20delete%20tmp_socketData.motd%3B%0A%09%09%20%20delete%20tmp_socketData.client_ip%3B%0A%09%09%20%20delete%20tmp_socketData.ulist%3B%0A%09%09%20%20delete%20tmp_socketData.server_version%3B%0A%20%20%0A%09%09%20%20return%20JSON.stringify(tmp_socketData)%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20JSON.stringify(this.socketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnVarData(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20return%20this.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.value%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20return%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20%22%22%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20parseJSON(%7B%20PATH%2C%20JSON_STRING%20%7D)%20%7B%0A%09%09try%20%7B%0A%09%09%20%20const%20path%20%3D%20PATH.toString()%0A%09%09%09.split(%22%2F%22)%0A%09%09%09.map((prop)%20%3D%3E%20decodeURIComponent(prop))%3B%0A%09%09%20%20if%20(path%5B0%5D%20%3D%3D%3D%20%22%22)%20path.splice(0%2C%201)%3B%0A%09%09%20%20if%20(path%5Bpath.length%20-%201%5D%20%3D%3D%3D%20%22%22)%20path.splice(-1%2C%201)%3B%0A%09%09%20%20let%20json%3B%0A%09%09%20%20try%20%7B%0A%09%09%09json%20%3D%20JSON.parse(%22%20%22%20%2B%20JSON_STRING)%3B%0A%09%09%20%20%7D%20catch%20(e)%20%7B%0A%09%09%09return%20e.message%3B%0A%09%09%20%20%7D%0A%09%09%20%20path.forEach((prop)%20%3D%3E%20(json%20%3D%20json%5Bprop%5D))%3B%0A%09%09%20%20if%20(json%20%3D%3D%3D%20null)%20return%20%22null%22%3B%0A%09%09%20%20else%20if%20(json%20%3D%3D%3D%20undefined)%20return%20%22%22%3B%0A%09%09%20%20else%20if%20(typeof%20json%20%3D%3D%3D%20%22object%22)%20return%20JSON.stringify(json)%3B%0A%09%09%20%20else%20return%20json.toString()%3B%0A%09%09%7D%20catch%20(err)%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20getFromJSONArray(%7B%20NUM%2C%20ARRAY%20%7D)%20%7B%0A%09%09var%20json_array%20%3D%20JSON.parse(ARRAY)%3B%0A%09%09if%20(json_array%5BNUM%5D%20%3D%3D%20%22undefined%22)%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20let%20data%20%3D%20json_array%5BNUM%5D%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20fetchURL(args)%20%7B%0A%09%09return%20Scratch.fetch(args.url%2C%20%7B%0A%09%09%20%20method%3A%20%22GET%22%2C%0A%09%09%7D).then((response)%20%3D%3E%20response.text())%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20requestURL(args)%20%7B%0A%09%09if%20(args.method%20%3D%3D%20%22GET%22%20%7C%7C%20args.method%20%3D%3D%20%22HEAD%22)%20%7B%0A%09%09%20%20return%20Scratch.fetch(args.url%2C%20%7B%0A%09%09%09method%3A%20args.method%2C%0A%09%09%09headers%3A%20JSON.parse(args.headers)%2C%0A%09%09%20%20%7D).then((response)%20%3D%3E%20response.text())%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20Scratch.fetch(args.url%2C%20%7B%0A%09%09%09method%3A%20args.method%2C%0A%09%09%09headers%3A%20JSON.parse(args.headers)%2C%0A%09%09%09body%3A%20JSON.parse(args.data)%2C%0A%09%09%20%20%7D).then((response)%20%3D%3E%20response.text())%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20isValidJSON(%7B%20JSON_STRING%20%7D)%20%7B%0A%09%09return%20jsonCheck(JSON_STRING)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20makeJSON(%7B%20toBeJSONified%20%7D)%20%7B%0A%09%09if%20(typeof%20toBeJSONified%20%3D%3D%20%22string%22)%20%7B%0A%09%09%20%20try%20%7B%0A%09%09%09JSON.parse(toBeJSONified)%3B%0A%09%09%09return%20String(toBeJSONified)%3B%0A%09%09%20%20%7D%20catch%20(err)%20%7B%0A%09%09%09return%20%22Not%20JSON!%22%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20if%20(typeof%20toBeJSONified%20%3D%3D%20%22object%22)%20%7B%0A%09%09%20%20return%20JSON.stringify(toBeJSONified)%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22Not%20JSON!%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onConnect()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(self.connect_hat%20%3D%3D%200%20%26%26%20self.isRunning%20%26%26%20self.protocolOk)%20%7B%0A%09%09%20%20self.connect_hat%20%3D%201%3B%0A%09%09%20%20return%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onClose()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(self.close_hat%20%3D%3D%200%20%26%26%20!self.isRunning)%20%7B%0A%09%09%20%20self.close_hat%20%3D%201%3B%0A%09%09%20%20return%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onListener(%7B%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning%20%26%26%20this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%20%20if%20(self.socketListeners%5BString(ID)%5D)%20%7B%0A%09%09%09self.socketListeners%5BString(ID)%5D%20%3D%20false%3B%0A%09%09%09return%20true%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onNewPacket(%7B%20TYPE%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning%20%26%26%20this.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D)%20%7B%0A%09%09%20%20self.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%20%3D%20false%3B%0A%09%09%20%20return%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onNewVar(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew)%20%7B%0A%09%09%09%09self.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew%20%3D%20false%3B%0A%09%09%09%09return%20true%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09return%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20return%20false%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20getComState()%20%7B%0A%09%09return%20String(this.link_status%20%3D%3D%202%20%7C%7C%20this.protocolOk)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getRoomState()%20%7B%0A%09%09return%20this.isLinked%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getComLostConnectionState()%20%7B%0A%09%09return%20this.wasConnectionDropped%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getComFailedConnectionState()%20%7B%0A%09%09return%20this.didConnectionFail%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getUsernameState()%20%7B%0A%09%09return%20this.isUsernameSet%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnIsNewData(%7B%20TYPE%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20return%20this.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnIsNewVarData(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20return%20this.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20return%20false%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnIsNewListener(%7B%20ID%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%09return%20this.socketListeners%5BID%5D%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20checkForID(%7B%20ID%20%7D)%20%7B%0A%09%09return%20find_id(ID%2C%20this.socketData.ulist)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20async%20openSocket(%7B%20IP%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(!self.isRunning)%20%7B%0A%09%09%20%20if%20(!(await%20Scratch.canFetch(IP)))%20%7B%0A%09%09%09return%3B%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20console.log(%22Starting%20socket.%22)%3B%0A%09%09%20%20self.link_status%20%3D%201%3B%0A%20%20%0A%09%09%20%20self.disconnectWasClean%20%3D%20false%3B%0A%09%09%20%20self.wasConnectionDropped%20%3D%20false%3B%0A%09%09%20%20self.didConnectionFail%20%3D%20false%3B%0A%20%20%0A%09%09%20%20mWS%20%3D%20new%20WebSocket(String(IP))%3B%0A%20%20%0A%09%09%20%20mWS.onerror%20%3D%20function%20()%20%7B%0A%09%09%09self.isRunning%20%3D%20false%3B%0A%09%09%20%20%7D%3B%0A%20%20%0A%09%09%20%20mWS.onopen%20%3D%20function%20()%20%7B%0A%09%09%09self.isRunning%20%3D%20true%3B%0A%09%09%09self.packet_queue%20%3D%20%7B%7D%3B%0A%09%09%09self.link_status%20%3D%202%3B%0A%20%20%0A%09%09%09%2F%2F%20Send%20the%20handshake%20request%20to%20get%20server%20to%20detect%20client%20protocol%0A%09%09%09mWS.send(%0A%09%09%09%20%20JSON.stringify(%7B%20cmd%3A%20%22handshake%22%2C%20listener%3A%20%22setprotocol%22%20%7D)%0A%09%09%09)%3B%0A%20%20%0A%09%09%09console.log(%22Successfully%20opened%20socket.%22)%3B%0A%09%09%20%20%7D%3B%0A%20%20%0A%09%09%20%20mWS.onmessage%20%3D%20function%20(event)%20%7B%0A%09%09%09let%20tmp_socketData%20%3D%20JSON.parse(event.data)%3B%0A%09%09%09console.log(%22RX%3A%22%2C%20tmp_socketData)%3B%0A%20%20%0A%09%09%09if%20(self.queueableCmds.includes(tmp_socketData.cmd))%20%7B%0A%09%09%09%20%20self.socketData%5Btmp_socketData.cmd%5D.push(tmp_socketData)%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20if%20(tmp_socketData.cmd%20%3D%3D%20%22ulist%22)%20%7B%0A%09%09%09%09%2F%2F%20ulist%20functionality%20has%20been%20changed%20in%20server%200.1.9%0A%09%09%09%09if%20(tmp_socketData.hasOwnProperty(%22mode%22))%20%7B%0A%09%09%09%09%20%20if%20(tmp_socketData.mode%20%3D%3D%20%22set%22)%20%7B%0A%09%09%09%09%09self.socketData%5B%22ulist%22%5D%20%3D%20tmp_socketData.val%3B%0A%09%09%09%09%20%20%7D%20else%20if%20(tmp_socketData.mode%20%3D%3D%20%22add%22)%20%7B%0A%09%09%09%09%09if%20(%0A%09%09%09%09%09%20%20!self.socketData.ulist.some(%0A%09%09%09%09%09%09(o)%20%3D%3E%0A%09%09%09%09%09%09%20%20o.username%20%3D%3D%3D%20tmp_socketData.val.username%20%26%26%0A%09%09%09%09%09%09%20%20o.id%20%3D%3D%20tmp_socketData.val.id%0A%09%09%09%09%09%20%20)%0A%09%09%09%09%09)%20%7B%0A%09%09%09%09%09%20%20self.socketData%5B%22ulist%22%5D.push(tmp_socketData.val)%3B%0A%09%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%09%22Could%20not%20perform%20ulist%20method%20add%2C%20client%22%2C%0A%09%09%09%09%09%09tmp_socketData.val%2C%0A%09%09%09%09%09%09%22already%20exists%22%0A%09%09%09%09%09%20%20)%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%20%20%7D%20else%20if%20(tmp_socketData.mode%20%3D%3D%20%22remove%22)%20%7B%0A%09%09%09%09%09if%20(%0A%09%09%09%09%09%20%20self.socketData.ulist.some(%0A%09%09%09%09%09%09(o)%20%3D%3E%0A%09%09%09%09%09%09%20%20o.username%20%3D%3D%3D%20tmp_socketData.val.username%20%26%26%0A%09%09%09%09%09%09%20%20o.id%20%3D%3D%20tmp_socketData.val.id%0A%09%09%09%09%09%20%20)%0A%09%09%09%09%09)%20%7B%0A%09%09%09%09%09%20%20%2F%2F%20This%20is%20by%20far%20the%20fugliest%20thing%20I%20have%20ever%20written%20in%20JS%2C%20or%20in%20any%20programming%20language...%20thanks%20I%20hate%20it%0A%09%09%09%09%09%20%20self.socketData%5B%22ulist%22%5D%20%3D%20self.socketData%5B%22ulist%22%5D.filter(%0A%09%09%09%09%09%09(user)%20%3D%3E%0A%09%09%09%09%09%09%20%20!(user.username%20%3D%3D%3D%20tmp_socketData.val.username)%20%26%26%0A%09%09%09%09%09%09%20%20!(user.id%20%3D%3D%20tmp_socketData.val.id)%0A%09%09%09%09%09%20%20)%3B%0A%09%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%09%22Could%20not%20perform%20ulist%20method%20remove%2C%20client%22%2C%0A%09%09%09%09%09%09tmp_socketData.val%2C%0A%09%09%09%09%09%09%22was%20not%20found%22%0A%09%09%09%09%09%20%20)%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09%09console.log(%0A%09%09%09%09%09%20%20%22Could%20not%20understand%20ulist%20method%3A%22%2C%0A%09%09%09%09%09%20%20tmp_socketData.mode%0A%09%09%09%09%09)%3B%0A%09%09%09%09%20%20%7D%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20%2F%2F%20Retain%20compatibility%20wtih%20existing%20servers%0A%09%09%09%09%20%20self.socketData%5B%22ulist%22%5D%20%3D%20tmp_socketData.val%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09self.socketData%5Btmp_socketData.cmd%5D%20%3D%20tmp_socketData.val%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%0A%20%20%0A%09%09%09if%20(self.newSocketData.hasOwnProperty(tmp_socketData.cmd))%20%7B%0A%09%09%09%20%20self.newSocketData%5Btmp_socketData.cmd%5D%20%3D%20true%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09if%20(self.varCmds.includes(tmp_socketData.cmd))%20%7B%0A%09%09%09%20%20self.varData%5Btmp_socketData.cmd%5D%5Btmp_socketData.name%5D%20%3D%20%7B%0A%09%09%09%09value%3A%20tmp_socketData.val%2C%0A%09%09%09%09isNew%3A%20true%2C%0A%09%09%09%20%20%7D%3B%0A%09%09%09%7D%0A%09%09%09if%20(tmp_socketData.hasOwnProperty(%22listener%22))%20%7B%0A%09%09%09%20%20if%20(tmp_socketData.listener%20%3D%3D%20%22setusername%22)%20%7B%0A%09%09%09%09self.socketListeners%5B%22setusername%22%5D%20%3D%20true%3B%0A%09%09%09%09if%20(tmp_socketData.code%20%3D%3D%20%22I%3A100%20%7C%20OK%22)%20%7B%0A%09%09%09%09%20%20self.username%20%3D%20tmp_socketData.val%3B%0A%09%09%09%09%20%20self.isUsernameSyncing%20%3D%20false%3B%0A%09%09%09%09%20%20self.isUsernameSet%20%3D%20true%3B%0A%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%22Username%20was%20accepted%20by%20the%20server%2C%20and%20has%20been%20set%20to%3A%22%2C%0A%09%09%09%09%09self.username%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20console.warn(%0A%09%09%09%09%09%22Username%20was%20rejected%20by%20the%20server.%20Error%20code%3A%22%2C%0A%09%09%09%09%09String(tmp_socketData.code)%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%20%20self.isUsernameSyncing%20%3D%20false%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20if%20(tmp_socketData.listener%20%3D%3D%20%22roomLink%22)%20%7B%0A%09%09%09%09self.isRoomSetting%20%3D%20false%3B%0A%09%09%09%09self.socketListeners%5B%22roomLink%22%5D%20%3D%20true%3B%0A%09%09%09%09if%20(tmp_socketData.code%20%3D%3D%20%22I%3A100%20%7C%20OK%22)%20%7B%0A%09%09%09%09%20%20console.log(%22Linking%20to%20room(s)%20was%20accepted%20by%20the%20server!%22)%3B%0A%09%09%09%09%20%20self.isLinked%20%3D%20true%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20console.warn(%0A%09%09%09%09%09%22Linking%20to%20room(s)%20was%20rejected%20by%20the%20server.%20Error%20code%3A%22%2C%0A%09%09%09%09%09String(tmp_socketData.code)%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%09%20%20self.isLinked%20%3D%20false%3B%0A%09%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20if%20(%0A%09%09%09%09tmp_socketData.listener%20%3D%3D%20%22setprotocol%22%20%26%26%0A%09%09%09%09!this.protocolOk%0A%09%09%09%20%20)%20%7B%0A%09%09%09%09console.log(%0A%09%09%09%09%20%20%22Server%20successfully%20set%20client%20protocol%20to%20cloudlink!%22%0A%09%09%09%09)%3B%0A%09%09%09%09self.socketData.statuscode%20%3D%20%5B%5D%3B%0A%09%09%09%09self.protocolOk%20%3D%20true%3B%0A%09%09%09%09self.socketListeners%5B%22setprotocol%22%5D%20%3D%20true%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09if%20(%0A%09%09%09%09%20%20self.socketListeners.hasOwnProperty(tmp_socketData.listener)%0A%09%09%09%09)%20%7B%0A%09%09%09%09%20%20self.socketListeners%5Btmp_socketData.listener%5D%20%3D%20true%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.socketListenersData%5Btmp_socketData.listener%5D%20%3D%20tmp_socketData%3B%0A%09%09%09%7D%0A%09%09%09self.packet_hat%20%3D%200%3B%0A%09%09%20%20%7D%3B%0A%20%20%0A%09%09%20%20mWS.onclose%20%3D%20function%20()%20%7B%0A%09%09%09self.isRunning%20%3D%20false%3B%0A%09%09%09self.connect_hat%20%3D%200%3B%0A%09%09%09self.packet_hat%20%3D%200%3B%0A%09%09%09self.protocolOk%20%3D%20false%3B%0A%09%09%09if%20(self.close_hat%20%3D%3D%201)%20%7B%0A%09%09%09%20%20self.close_hat%20%3D%200%3B%0A%09%09%09%7D%0A%09%09%09self.socketData%20%3D%20%7B%0A%09%09%09%20%20gmsg%3A%20%5B%5D%2C%0A%09%09%09%20%20pmsg%3A%20%5B%5D%2C%0A%09%09%09%20%20direct%3A%20%5B%5D%2C%0A%09%09%09%20%20statuscode%3A%20%5B%5D%2C%0A%09%09%09%20%20gvar%3A%20%5B%5D%2C%0A%09%09%09%20%20pvar%3A%20%5B%5D%2C%0A%09%09%09%20%20motd%3A%20%22%22%2C%0A%09%09%09%20%20client_ip%3A%20%22%22%2C%0A%09%09%09%20%20ulist%3A%20%5B%5D%2C%0A%09%09%09%20%20server_version%3A%20%22%22%2C%0A%09%09%09%7D%3B%0A%09%09%09self.newSocketData%20%3D%20%7B%0A%09%09%09%20%20gmsg%3A%20false%2C%0A%09%09%09%20%20pmsg%3A%20false%2C%0A%09%09%09%20%20direct%3A%20false%2C%0A%09%09%09%20%20statuscode%3A%20false%2C%0A%09%09%09%20%20gvar%3A%20false%2C%0A%09%09%09%20%20pvar%3A%20false%2C%0A%09%09%09%7D%3B%0A%09%09%09self.socketListeners%20%3D%20%7B%7D%3B%0A%09%09%09self.username%20%3D%20%22%22%3B%0A%09%09%09self.tmp_username%20%3D%20%22%22%3B%0A%09%09%09self.isUsernameSyncing%20%3D%20false%3B%0A%09%09%09self.isUsernameSet%20%3D%20false%3B%0A%09%09%09self.enableListener%20%3D%20false%3B%0A%09%09%09self.setListener%20%3D%20%22%22%3B%0A%09%09%09self.enableRoom%20%3D%20false%3B%0A%09%09%09self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09self.isLinked%20%3D%20false%3B%0A%09%09%09self.isRoomSetting%20%3D%20false%3B%0A%20%20%0A%09%09%09if%20(self.link_status%20!%3D%201)%20%7B%0A%09%09%09%20%20if%20(self.disconnectWasClean)%20%7B%0A%09%09%09%09self.link_status%20%3D%203%3B%0A%09%09%09%09console.log(%22Socket%20closed.%22)%3B%0A%09%09%09%09self.wasConnectionDropped%20%3D%20false%3B%0A%09%09%09%09self.didConnectionFail%20%3D%20false%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09self.link_status%20%3D%204%3B%0A%09%09%09%09console.error(%22Lost%20connection%20to%20the%20server.%22)%3B%0A%09%09%09%09self.wasConnectionDropped%20%3D%20true%3B%0A%09%09%09%09self.didConnectionFail%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20self.link_status%20%3D%204%3B%0A%09%09%09%20%20console.error(%22Failed%20to%20connect%20to%20server.%22)%3B%0A%09%09%09%20%20self.wasConnectionDropped%20%3D%20false%3B%0A%09%09%09%20%20self.didConnectionFail%20%3D%20true%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20already%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20openSocketPublicServers(%7B%20ID%20%7D)%20%7B%0A%09%09if%20(servers.hasOwnProperty(ID))%20%7B%0A%09%09%20%20console.log(%22Connecting%20to%3A%22%2C%20servers%5BID%5D.url)%3B%0A%09%09%20%20this.openSocket(%7B%20IP%3A%20servers%5BID%5D.url%20%7D)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20closeSocket()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20console.log(%22Closing%20socket...%22)%3B%0A%09%09%20%20mWS.close(1000%2C%20%22script%20closure%22)%3B%0A%09%09%20%20self.disconnectWasClean%20%3D%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20setMyName(%7B%20NAME%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!this.isUsernameSyncing)%20%7B%0A%09%09%09if%20(!this.isUsernameSet)%20%7B%0A%09%09%09%20%20if%20(String(NAME)%20!%3D%20%22%22)%20%7B%0A%09%09%09%09if%20(!(String(NAME).length%20%3E%2020))%20%7B%0A%09%09%09%09%20%20if%20(%0A%09%09%09%09%09!(%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25CA%25%22%20%7C%7C%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25CC%25%22%20%7C%7C%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25CD%25%22%20%7C%7C%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25MS%25%22%0A%09%09%09%09%09)%0A%09%09%09%09%20%20)%20%7B%0A%09%09%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%09%09%20%20cmd%3A%20%22setid%22%2C%0A%09%09%09%09%09%20%20val%3A%20String(NAME)%2C%0A%09%09%09%09%09%20%20listener%3A%20%22setusername%22%2C%0A%09%09%09%09%09%7D%3B%0A%20%20%0A%09%09%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09%09%09self.tmp_username%20%3D%20String(NAME)%3B%0A%09%09%09%09%09self.isUsernameSyncing%20%3D%20true%3B%0A%09%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09%09console.log(%22Blocking%20attempt%20to%20use%20reserved%20usernames%22)%3B%0A%09%09%09%09%20%20%7D%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%22Blocking%20attempt%20to%20use%20username%20larger%20than%2020%20characters%2C%20username%20is%20%22%20%2B%0A%09%09%09%09%09%20%20String(NAME).length%20%2B%0A%09%09%09%09%09%20%20%22%20characters%20long%22%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09console.log(%22Blocking%20attempt%20to%20use%20blank%20username%22)%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20console.warn(%22Username%20already%20has%20been%20set!%22)%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Username%20is%20still%20syncing!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20createListener(%7B%20ID%20%7D)%20%7B%0A%09%09self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!this.enableListener)%20%7B%0A%09%09%09self.enableListener%20%3D%20true%3B%0A%09%09%09self.setListener%20%3D%20String(ID)%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Listeners%20were%20already%20created!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.log(%22Cannot%20assign%20a%20listener%20to%20a%20packet%20while%20disconnected%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20linkToRooms(%7B%20ROOMS%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%20%20%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!this.isRoomSetting)%20%7B%0A%09%09%09if%20(!(String(ROOMS).length%20%3E%201000))%20%7B%0A%09%09%09%20%20let%20tmp_msg%20%3D%20%7B%0A%09%09%09%09cmd%3A%20%22link%22%2C%0A%09%09%09%09val%3A%20autoConvert(ROOMS)%2C%0A%09%09%09%09listener%3A%20%22roomLink%22%2C%0A%09%09%09%20%20%7D%3B%0A%20%20%0A%09%09%09%20%20console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09%20%20mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09%20%20self.isRoomSetting%20%3D%20true%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20console.warn(%0A%09%09%09%09%22Blocking%20attempt%20to%20send%20a%20room%20ID%20%2F%20room%20list%20larger%20than%201000%20bytes%20(1%20KB)%2C%20room%20ID%20%2F%20room%20list%20is%20%22%20%2B%0A%09%09%09%09%20%20String(ROOMS).length%20%2B%0A%09%09%09%09%20%20%22%20bytes%22%0A%09%09%09%20%20)%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Still%20linking%20to%20rooms!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20selectRoomsInNextPacket(%7B%20ROOMS%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.isLinked)%20%7B%0A%09%09%09if%20(!this.enableRoom)%20%7B%0A%09%09%09%20%20if%20(!(String(ROOMS).length%20%3E%201000))%20%7B%0A%09%09%09%09self.enableRoom%20%3D%20true%3B%0A%09%09%09%09self.selectRoom%20%3D%20ROOMS%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09console.warn(%0A%09%09%09%09%20%20%22Blocking%20attempt%20to%20select%20a%20room%20ID%20%2F%20room%20list%20larger%20than%201000%20bytes%20(1%20KB)%2C%20room%20ID%20%2F%20room%20list%20is%20%22%20%2B%0A%09%09%09%09%09String(ROOMS).length%20%2B%0A%09%09%09%09%09%22%20bytes%22%0A%09%09%09%09)%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20console.warn(%22Rooms%20were%20already%20selected!%22)%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Not%20linked%20to%20any%20room(s)!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20unlinkFromRooms()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.isLinked)%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22unlink%22%2C%0A%09%09%09%20%20val%3A%20%22%22%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20autoConvert(this.setListener)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09self.isLinked%20%3D%20false%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Not%20linked%20to%20any%20rooms!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendGData(%7B%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22gmsg%22%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendPData(%7B%20DATA%2C%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22pmsg%22%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%20%20id%3A%20autoConvert(ID)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendGDataAsVar(%7B%20VAR%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22gvar%22%2C%0A%09%09%09%20%20name%3A%20VAR%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendPDataAsVar(%7B%20VAR%2C%20ID%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22pvar%22%2C%0A%09%09%09%20%20name%3A%20VAR%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%20%20id%3A%20autoConvert(ID)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20runCMDnoID(%7B%20CMD%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(CMD).length%20%3E%20100)%20%7C%7C%20!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20String(CMD)%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20String(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20with%20questionably%20long%20arguments%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20runCMD(%7B%20CMD%2C%20ID%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(%0A%09%09%09!(String(CMD).length%20%3E%20100)%20%7C%7C%0A%09%09%09!(String(ID).length%20%3E%2020)%20%7C%7C%0A%09%09%09!(String(DATA).length%20%3E%201000)%0A%09%09%20%20)%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20String(CMD)%2C%0A%09%09%09%20%20id%3A%20autoConvert(ID)%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20String(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20with%20questionably%20long%20arguments%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20resetNewData(%7B%20TYPE%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20self.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%20%3D%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20resetNewVarData(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20self.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20resetNewListener(%7B%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%09self.socketListeners%5BString(ID)%5D%20%3D%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20clearAllPackets(%7B%20TYPE%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.menuRemap%5BString(TYPE)%5D%20%3D%3D%20%22all%22)%20%7B%0A%09%09%20%20self.socketData.gmsg%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.pmsg%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.direct%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.statuscode%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.gvar%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.pvar%20%3D%20%5B%5D%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20self.socketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%20%3D%20%5B%5D%3B%0A%09%09%7D%0A%09%20%20%7D%0A%09%7D%0A%20%20%0A%09console.log(%22CloudLink%204.0%20loaded.%20Detecting%20unsandboxed%20mode.%22)%3B%0A%09Scratch.extensions.register(new%20CloudLink(Scratch.vm.runtime))%3B%0A%20%20%7D)(Scratch)%3B","https://extensions.turbowarp.org/encoding.js","https://extensions.turbowarp.org/true-fantom/network.js","https://extensions.turbowarp.org/sound.js","https://extensions.turbowarp.org/-SIPC-/time.js","data:application/javascript,%2F%2F%20Name%3A%20Key%20Simulation%0A%2F%2F%20ID%3A%20cubesterKeySimulation%0A%2F%2F%20Description%3A%20Simulate%20Key%20Presses%20and%20Mouse%20Clicks.%0A%2F%2F%20By%3A%20CubesterYT%20%3Chttps%3A%2F%2Fscratch.mit.edu%2Fusers%2FCubesterYT%2F%3E%0A%0A%2F%2F%20Version%20V.1.0.0%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20const%20icon%20%3D%0A%20%20%20%20%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAFs9JREFUeF7tnXuwZMVdxz9n5t67e%2B%2BCSGBFMMSERzAkGB9EjVHDkrA8AlSy0TxUqsRS4%2BMPqmI0CbDcvssjkFSMVlnRwtJYqVAQNGAJRBN3F4gkmhAMiJiEd4wGMYCBsK97986xvuecHnr6njPTM3POmYe3q6Zmd26f7v51f8%2Bvf%2F3r3yNiCouBFwOviuD4GI6N4MX6Bl4EHKpPBIfGEAMt0u%2BDwP%2FqE8EzMXwbeBx4LILHVuDBK%2BCxaZuuaNIJugo2L8PrgNdF8JpWuvBHVEFXDE834N4Y7ovgC%2Fvhcx9IgTKxZSIBYOA04GzgHL3pI579fwE%2BB9xiYPeIx9J39xMDgCU4I4Z3AOcDR%2FZNaT0PPCkgADcb%2BHQ9XQ7Xy1gDwMAJwIWkC39cKKmzwEL22QjoMwfo95ns0wAs8VYQWAVWss8ysD%2F77AP2ZL%2BHjgF4BPjEQbjuCnioj%2BdqrTqWAFiCLTG8C3h7yGx8D3AYoO9DsgUPea7fOgLE88BzwLPZd2AbfwV81MAdgfVrqzZWAFiC82J4D%2FBz3WZAb7OkPIn0hwPN2qarsyNxDB0bngGeBsQ1upUIbo%2Fhjw3cNKIhr%2Bl2LABg4CzShX9D0cRokb8P2Jwt%2BiATuCXwodsD6%2FnVBAYdCf4HEDi6lF0tuGYH%2FMOAXZX22EgBYOCHgB3ALxRRJLZ%2BNHCUs2cPSn3VALDjkkwhafC%2Fs62iy3hvXoXtl8MDg9I07HMjA4BJF357EQF6048BvndYCp3n6wKAO%2BTvAN%2FKOEMXUpYMmBJJDW6qdgAYeCPwkaLzu9i81HhS15VdRgEAS8N3gf%2FMtoc8uiJ4QPKPgb8vm%2B5u7dUKAAPXAL%2BfNyAJcz%2BYSfNVTcAoAWBp0unhPzLBsYDOawy8r6o58NutBQA74JQW%2FBnwk%2F4AdEZ%2FWSbgVU30OADA0ihBURcLOlrmlH8GfseAtIyVlsoBsAQXxHBt3vFcrF7ancoHkU3hOAFAQ5Kw%2BGi2NeSssnRSv2rgE1UioNK5L2L50tJJxSe2X2cZNwBY2nV8fBjYmz8ZHzBwcVXzVBkAMuT%2Bkj9wHelOrPGtd%2FsfVwBYbiB98RP5K32DgXdWAYLSAXAlHLUC1wNr5vvl2Zm%2BCkJC2hxnANjx68hYcHGwC3ibSRWPpZVSAXAJHDsLfwv8iDtCCXrS%2BEhfP8oyCQDQ%2FOik8LUcATGC%2B2LYZlLRoZRSGgAuh5etpovfcT%2BvRX8FsKGU4Q7XyKQAQFQeyEAgRZJX%2Fh14k0mtlYYupQAgW%2Fy%2FA05yRyRt3slDD7G8BiYJAJZqrXaOydEDM%2FCmS%2BEbw87O0AAwqbZW%2B9OPuYP5fh8Nw460hOcnEQAi%2B%2BvZvYI7BRHcPwtbLk4vIgcuZQBgp3%2BLJ0lfAt%2B4lUkFgObxwfwTwq5MtT7wVA8FgCW4MfZu8sbxzbezM8kAKOIEwPUGfnFQBAwMAANXAJeM857vT8qkA0D0FMgEVxt4%2FyAgGAgAmXr3426HEgRePcgIanxmGgCg6bo3387ggkHUxn0DwKRn%2FHsA2VUmRed8%2FTgOR71ueJoWAOiIKBC4F0kRHIjhp0z6p%2BAyCAA%2BD%2Fy024MWf9RKnhCKpwUAolXKopyV%2FpLJuXHtNjd9AcDA1cB73Qal15flzjgV2ePJ38sSZ79liRJSBrUJDGm7zDq6N9DpwCt92RMEA8CkXji3uZ2N03Ev9O0OWQBrZazJkcNgXhkXkBQcD8808NkQWvsBwH3AD9tGdaV76ohu9YoIKxME3SZvXBZfY5RNwZe9q%2BQIvroYqIQNAkBmsLjoToqQUPd9fgiiqwbBOC2%2BnQ%2FZE%2Fzr2skJMjTtCYDt8OqmJ2%2FIkuf4kNUYUZ2qQDCOi2%2BnWH5oMjr1yitNqjooLD0BYOBG125fR76fGDPWn0dd2SAY58W3W8GX1l4h32TgrQMDINMzd3iv6GpXptuTUMoCwbgvvl0LGZp%2B1VuYCLYudvFA6soBlmB37Fj2yBfvlElYeWeMw4JgUhbfknz%2FWpPzrhdGhQAw8Gb5ubvrPSkKHx%2Bjg4Jg0hZfdBcoiN5i4G%2Fy3t1CACzBzthx1hTbF%2Fuf1NIvCCZx8e3aaBvQduCUO0yOjab%2BngsAA6dnRh7tNmTtUYW7Vp2ACgXBJC%2B%2B5lNuaDkeJVvy4hMUAUD%2B62%2BxizNupl3DgKYXCCZ98e3c5Fwb32hyAm6sAUBm39dhdapr3jK9dIdZwDKeLQLBtCy%2B5kjGpFLdeuUk410frAGAr%2FWTf%2F6PljHrY9aGD4JpWnw71V9ZG8Zmh4EOje4aACzCo1Hqr5kUmfnKzGvainToEnRUpnHxRZcCVMig1CkPm9Qxq106AJCFapF5d1J0K6YIjD3VhdOGjimhRyCX8YYXruZsNwaBD4A%2FJY3OlZRxuu6dkjWpnYyc6%2BI%2FN%2FBrdiA%2BAMQ1FI4nKeN641f7LE5whzk3hU8aZ1dvA8DAVuAzllaFYnvtGBEezSjEo%2FajFzAbOf%2FuOtTQen4jsZhofyV2n4lj4tVVGKCd%2FnrtXvufvBB2EZy%2BmIk%2BLgA%2BCPzeOvsvc%2Bph7thjWf7mN8tttM%2FWcraBPzDwu8n7ZNsycHdm5JP89MoRB%2BRtzM3RWl5m7uijWX7iCc6fmeFgS5Z%2BadG7qcHbd9T%2Bu9tvVfzNTmIyDr3x2ff8%2FDw371OQ2bQ0N21idY8CztZfnqIzDl0EX1nMXPkSAJj0hleh7drlZ0YYgZOZGbYcPNhxPNvabLIiduqVRqNBKwNGs9lM%2Fi02rN%2F1rc%2BMwHPwBes%2B%2B4y%2FhXSwb6cf1bN%2FUx%2BrOeOw1W3dRhSxy2H90jvcdcQRrDw9lCvfQOjRrN219snNBp5KALAEb4%2FhBltHJt4dDv4DdTvYQ3EUcXo2ce75XGf2vB3ZLroWeWVFYXUkJqSMTYs2Ozvb%2Ft0Fi%2F23nhNo9HEX2h29%2Fd1%2Bz83NsbzcPTCs6u72AKA2dzWbNLoAaLBZ6%2F2UrxSKYNsi3Gw5QEf4NqXWCA7N3bvv8BqNBluyt%2FmYmRmuc97arVHESo4wZRdFC6lFFQi08C4ILCgsZ7AcwwdLyEAtNykCi20jjwPYv93ebELNIJBu35NEPmLg3RYAsvppm82PZP%2BPIrY4C%2FyiRoNPOXv%2BuTMz7HEA4bJcu9h2USzrd7eBkMUNreNyEv8Zl1v4HGDWAXHd2kdfDgB2G3iDBYDizrSNfBXMT7Z%2FdRZXNz%2FbaLAhjrnFAcS5UcSeHA6wYcOG5K3XW92MokQwXLXCWJ0EeH114wBtTlDj%2BORG9sXO%2Fp4ysDkyKbeXUWlSlFShw%2B%2BrhkG6i39Yo8GzrRaboohbnQU%2FJ4rY12ULcFmyK%2B2XNXxXY9ZNO9BNCNTf5FApgI4CBF%2Fwkl7MwEujLBVL24ukbi9f%2F1YuyeTRbLKx1eoAwBldvHTKWuRe7VgQhACgSAjU71KyHRgBCHyv4gjOEQf4TeBPLPF16%2F9dAMxEES19Wi3mo4hPO5MkAaVHDP5e6zf030M4SzcO4Aqj7mDqkgdyFEK%2FJQB8KEvWkIxJ98AvGXqqwhuwABDrf05Cn9hko8Fcq9UBgKJjYHhP9dTsJgS6AJCcs5IJubsbDSJH4K1qpApS7SU%2BvEYA0Pm%2FnZunTrt%2F98yvt6vhKHLGkQOELEw%2FHGAhitgbx9y1eTMr364%2B%2FWCO38ANAkBHkKc6zb9WNm5k6%2F79SWAJqVXcvdUHgHLJvKAIDlmK0dQJBYDqRXGc0FTXFpBjJnanACDZoB3dRR6%2Fm2qau%2BWFBc7cuzc5eaQ6vBfKtAMg2Q4y0NcFAN1EyJPYFkUeFQDkU%2FgD9kddAUtKraMcWFjgrEAAjIMQGDInoRxgFABQaBklInAA8A0BQDYDbaPfOi%2BBLAB00%2B8HYvA5wLQJgS6Y6uIA%2FqVQBM9Gi%2FB85HB9JeyrywbwwKZNnLVnT5LNsxcAppEDWBDUBQDJWEpy7JQD4gDiDG2u%2F%2FoQPldSnX4AMGlCYDdFkH%2FtXBcAtGx3dq7dQQFAnKEd8m0dAMOhux8ZoG4OkAOAWKrgvTHM28GsbwHTCwB%2FC4hgn2QAWYUoFW9S6hQC9y8scPbevYn%2Fga%2FmnfRj4DhuAb4QGMPT2gIUc76t%2Fa31GBggBM6fcAL7Hn44MVYY9V1ACG8Y5y3APwbKRkQAkDu5MrokpU5FkBUCu3GA%2BeOPZ98jjyRZpSdJExjCAUatCFJSEgFgt5vgqU5VcMgpwAJgGjlA3QDIUQXvFgCUmLCd3q3Oy6B1AKT3H3UdA3Mug64TADocQuq8Dg4RAuePO459jz66vgWECCA96uRcB39Ix8CLYvhD%2B2ydBiEhHMCOa30LGB4BOQYhF43UJCyEA1iy14XA4QGgiCFuGjrFENQWoMivbZPxOo1C1zlAvTKAbxS6Ai%2BxZuEdN4J1mYWvA6A%2BAOToAL5j4HDrGnZHDO1rgLocQ0L0AOtbwPCsXy3kOIbcaeA0C4CrYycTSF2uYescoD4OkOMalmQWsVtAR1jYupxD14XA%2BgDgO4e2YNsOxzlUgcA6UtfXcSnUDweYtFNAkWtYngdT1YqgPPfwWTjmEnjCDRAhkLS9wuuQA6YZAPJT3JnjHu4CQEYYbatgubRXFEqmZ4AICQl%2BRrA6FELTLASGcAAXAHKHS%2BIJVVByFEDtzGJtDrAEW%2BL0YigpdQSJCuEA8yeeyL6HHpo4VXAIB7BzrS1AQbDiHPf3MvAQFCQq4wId%2BoCqw8T1IwT2CvJcxkSV0Uaoa5jbVwKAijhATpi45Pxv%2B%2FfjBF4L%2FHpd9wIhHGBS9QAhW4DLAZLwdxXIADns%2F1rjBAP1AaA7l3aOoKpDxU4zAEIMQjoAUAb78dooCBV7RuYOmNRe4wJgUgfSl9q2Xp6FjK1gfKwDIJ3Vqo6BOcGiHzdOIPAiAFwJXGwXvMpw8SEAmFQhcBw4QE64%2BCsNXOq%2BzGs4QJ0JI7oJgQuNBrcpUERmFHq6E6uvCm5UVps2MJUAsMvx%2BbdCbF7gqio4QF7CiCYct90LEZDrBebHDKgqZUw3DtAGQHYMnBSDEAHJxiZ0F7bbKaYKAAycMkYE%2BHGD9FsVSaO6KYI2NZvc6ihG3qjQMWMQ%2FasXp1AcQRW5f%2B10xi8A2BiDfpi5sgGQlzSqKIFkoR%2BogV1OUo0klmzZaeO6cQCFqVPmCmsV%2FOaZGfatriaOpIoloG9rJp6EhtObl8Xhs%2Bnf9Xf9W46nNgaB%2Bzdp4vQ3%2FeZOhNqyDqv6dn3n3H7cMdi21M9yHDPXbHKbBwABww9bW4UQmJM2LokJmAfebgA4F7jFfajsxJHdAHDI7Cy3rKwwe%2BSRrDwlbfZkF3EA%2B%2BZXyQEKEkeeZ%2BDWvgCgyr7PQNmpY60QqOhgerNG6TVbNbwEAD98bRV6AKWRl%2FbPKYVJI3OPge6TBs4BbnN%2FK9NvwHIAse7VLDycG43b7o0hamA9V1S6RfeueuFdGuwW5QawLnMLKEgefc5iupvmlp6xIPwTQZnp4y0AtF8ur65iF3%2Bu0WC51UoUJCGLX%2FUi9tt%2B%2Bz7AiQHkHgPdYNVlAUBav5z08Z808I5u4%2B8JgEvhFTOgU0W7yIz4%2BH5nJae%2BywFsJHD3vtwFQLcAzSUMpZQm2o6hWQ4D%2B3%2BXCySBGJwcB2UBQLF%2BFezJLU04efvajPIddXoCQLUNXAW8332yjJtCfwtQ%2B%2Fbt6If9l7J6FTfSDczDHgNzbvxEzQeMo9EdeAuwDy7BvbETTm4h8yQOQlBB71YI1N6o45grBPrsfxI4QPpypxlMfIGvgwtkOg2fQwyCQbF%2BhX7b2%2FnwfSYw50fw%2Bpk0n0D7plD9DWs1ZDnAhmaTA541jAVASHzeQSZuFM%2F4oC4DADnXvSKt48ZvKBnAfdjAh4F3u78pD%2BkxA86mBYD%2FuPu22DdJdYpy%2BgzYfW2PWeHWp8vSM%2BgW8C3gobVUtDOChRAYzAFsYybNRtqRUmBQBVE3ALjSf9H5OYTAUddxhVqNxXKB2WYzyYImEAwCgAKFz%2BdNGuUnuAwCgFcB97ih5XQ0FAgU87efsjw%2Fz5lOajU7Qfq2ihPtqaM8x%2FdDT1FdcYBYiamyxbbgHnQLkJuX4vsqC4gtkVIQwKkG%2Fq2fMfcNADVu4FeAj7kdDZJowgaLdtvx98leadr6IXZUdYuUW4NGCPETP2R0XWjgL%2FulcSAAZCBYczTs99r4wPw8ZzkcoGOPLEgT1y%2BBo67vGom6e764gDim3uZ%2BtoCca16ReJWBSwahdWAAZCDoCC%2Bj3%2BRidFLgSGysYFt9UjV%2FIeS6x1hfxxEKgK8DMvPyynUGfjlkDHl1hgJABgKFn%2F1Zt%2FHQ46EvBLYFJCWBrMhGftCJGuY5N6NpHthDAFBw3LvLeHPf7ziHBsBVcMQKfCaGH3c7D%2BEELgcoOiL1S9A41rfbgGwBlCRCKXBdensBoODNv2cOzrwYhspFOzQAMi6g6wGlnj%2FZXYAQmUB7oc8SJ0XrFwo2aweo%2BgKDq%2B526c9rr2DP189nZrkeQoeRW68UAKjlS%2BHEWbgl9kQAuZrrCrnXEdEejWZ0Pl5dbatS3VG7SqGhqK7w4TxlVZECS8Dff%2BSRLOzfT%2Bv55ztGpRQ6WmWd970ihnC%2BAe0KQ5fSAKCRLKYxZz7lpqHX79ITKBSpwJBXXKWPPGp0Xq5b%2BVOmyrmfsStjmDyCtDXYokX%2FmnfOz%2F725RnYdumaNMCD46BUAGgY74PDN8JNwGn%2BsHwnk7jRoLmwwOsd9AsAyRuTpYEVGBLWmR0L%2Fe%2FBSe98Us6w6snGzZdtn%2FrS79aLV2%2Bl7BFla2gTXISEr%2FXHbNvTCPz9v0C9q6p37IdtV68x%2BBluBkoHgIZjYCaCj8fwTn94OiHo%2FqCSjoebi5E%2BLfBJr98RpeOFEV1%2FMlzwtgriZVe6DgauIEdBoavkE5xs1bM15c0b6QrndN447DBazz6b2PA9vPZK1z6xxpunTDoqBYAGugQXxiCv49Rg3ik6OihzdeWDKHPGSmxLb72CN%2FmWPFkX2mXeZeAvSuxyTVO1zP0OOKUFH83yUXQMQgKi4hPL7%2BD%2FU5EBp7xw3Qsdh%2F67GvDbl8H9Vc9JLQCwRPh5il3iZHKurBVFJ4WqJ6Ku9iXhK2jzM8UdftjAe%2BoaT60AEFEGtpJGKG9nK3WJFSfQ1nBoXTNQUz9y1xKr15tfUHTJ914Dn61pSEk3tQPA4QY7gO1FxEqLKEujdkbLOmelxL7kpaujXY%2FU0FeYLnNR4nBGIwMUEWBAxiXyV29nL%2FfrKj6Bjo5HjRKtfa6AhLsns5u7HE2e29onG3D5ZfBAn12UVn1kHMClINsWBISOW0W3jvx%2BtD2IM7QjHJU2DeU0pOOc3nSx%2BW4B3yL4xxj01tfK7vOoHAsA2IEtwXkxXESBJ6utJ%2B2c8txJcBQYip3CylnYola0yFp0CXS6kpOmsEfZFcEfLXpOt70eqvLvYwUAS%2BhlcEYDfgP4%2BRDidXLQVqHPIdndQ8hz%2FdbRkU1XNs9lnx7s3W3%2BryO4dtEzq%2B%2B3%2FyrqjyUALKEmDVZ1YfZREPOgIj3%2BJsUWyMAgXYO4hn6XNkof6eMt8dqzpdPXGy1dvz56m7Xg%2BuwD9mS%2FBw0grSShX0qcjxl4vI%2Fnaq061gBwZyKLWrINeGsmCtQ6UYGdKZCB3vabxvFtH3sZIHCSpUuQl5L9dFgihbZRVr0I7olhJ7DTjb9XVvtVtzMxHKBoIgwcE8FrY3hNBKfqOxMHSp%2B7CL4bw92ZJ%2FbdK%2FDFK%2BG%2FSu%2BoxgYnHgB5c5UZpsj8QB9dPEqNYD86PGyMYEOcfqvY7X5%2FnAr29hivb3lePxjDg0upFneqyv8BC0K%2Bo6SYlTUAAAAASUVORK5CYII%3D%22%3B%0A%0A%20%20let%20delay%20%3D%20(ms)%20%3D%3E%20new%20Promise((res)%20%3D%3E%20setTimeout(res%2C%20ms))%3B%0A%20%20let%20clamp%20%3D%20(min%2C%20max%2C%20num)%20%3D%3E%20%7B%0A%20%20%20%20return%20num%20%3C%3D%20min%20%3F%20min%20%3A%20num%20%3E%3D%20max%20%3F%20max%20%3A%20num%3B%0A%20%20%7D%3B%0A%0A%20%20let%20canvasSize%3B%0A%20%20if%20(window.ResizeObserver)%20%7B%0A%20%20%20%20let%20canvasWidth%20%3D%0A%20%20%20%20%20%20Scratch.vm.runtime.renderer._xRight%20-%20Scratch.vm.runtime.renderer._xLeft%3B%0A%20%20%20%20let%20canvasHeight%20%3D%0A%20%20%20%20%20%20Scratch.vm.runtime.renderer._yTop%20-%20Scratch.vm.runtime.renderer._yBottom%3B%0A%20%20%20%20const%20resize%20%3D%20new%20ResizeObserver((entries)%20%3D%3E%20%7B%0A%20%20%20%20%20%20for%20(const%20entry%20of%20entries)%20%7B%0A%20%20%20%20%20%20%20%20canvasWidth%20%3D%20entry.contentRect.width%3B%0A%20%20%20%20%20%20%20%20canvasHeight%20%3D%20entry.contentRect.height%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D)%3B%0A%20%20%20%20resize.observe(Scratch.vm.runtime.renderer.canvas)%3B%0A%20%20%20%20canvasSize%20%3D%20()%20%3D%3E%20%5BcanvasWidth%2C%20canvasHeight%5D%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20canvasSize%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20rectangle%20%3D%0A%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer.canvas.getBoundingClientRect()%3B%0A%20%20%20%20%20%20return%20%5Brectangle.width%2C%20rectangle.height%5D%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20let%20simulatedX%20%3D%200%3B%0A%20%20let%20simulatedY%20%3D%200%3B%0A%20%20const%20postMouseData%20%3D%20(data)%20%3D%3E%20%7B%0A%20%20%20%20const%20%5BrectangleWidth%2C%20rectangleHeight%5D%20%3D%20canvasSize()%3B%0A%20%20%20%20Scratch.vm.postIOData(%22mouse%22%2C%20%7B%0A%20%20%20%20%20%20...data%2C%0A%20%20%20%20%20%20canvasWidth%3A%20rectangleWidth%2C%0A%20%20%20%20%20%20canvasHeight%3A%20rectangleHeight%2C%0A%20%20%20%20%20%20x%3A%0A%20%20%20%20%20%20%20%20(simulatedX%20%2B%0A%20%20%20%20%20%20%20%20%20%20(Scratch.vm.runtime.renderer._xRight%20-%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._xLeft)%20%2F%0A%20%20%20%20%20%20%20%20%20%20%20%202)%20*%0A%20%20%20%20%20%20%20%20(rectangleWidth%20%2F%0A%20%20%20%20%20%20%20%20%20%20(Scratch.vm.runtime.renderer._xRight%20-%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._xLeft))%2C%0A%20%20%20%20%20%20y%3A%0A%20%20%20%20%20%20%20%20((Scratch.vm.runtime.renderer._yTop%20-%0A%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._yBottom)%20%2F%0A%20%20%20%20%20%20%20%20%20%202%20-%0A%20%20%20%20%20%20%20%20%20%20simulatedY)%20*%0A%20%20%20%20%20%20%20%20(rectangleHeight%20%2F%0A%20%20%20%20%20%20%20%20%20%20(Scratch.vm.runtime.renderer._yTop%20-%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._yBottom))%2C%0A%20%20%20%20%7D)%3B%0A%20%20%7D%3B%0A%0A%20%20class%20KeySimulation%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22cubesterKeySimulation%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Key%20Simulation%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23BF0000%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23800000%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%3A%20icon%2C%0A%20%20%20%20%20%20%20%20docsURI%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2FCubesterYT%2FKeySimulation%22%2C%0A%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22pressKey%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22press%20key%20%5BKEY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22KEYS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22holdKey%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22hold%20key%20%5BKEY%5D%20for%20%5BSECONDS%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22KEYS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECONDS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%205%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22clickMouse%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22click%20%5BBUTTON%5D%20mouse%20button%20at%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22BUTTONS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22holdMouse%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22click%20and%20hold%20%5BBUTTON%5D%20mouse%20button%20at%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%20for%20%5BSECONDS%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22BUTTONS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECONDS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%205%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20KEYS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22space%22%2C%20value%3A%20%22%20%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22up%20arrow%22%2C%20value%3A%20%22ArrowUp%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22down%20arrow%22%2C%20value%3A%20%22ArrowDown%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22right%20arrow%22%2C%20value%3A%20%22ArrowRight%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22left%20arrow%22%2C%20value%3A%20%22ArrowLeft%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22enter%22%2C%20value%3A%20%22Enter%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22backspace%22%2C%20value%3A%20%22Backspace%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22delete%22%2C%20value%3A%20%22Delete%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22shift%22%2C%20value%3A%20%22Shift%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22caps%20lock%22%2C%20value%3A%20%22CapsLock%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22scroll%20lock%22%2C%20value%3A%20%22ScrollLock%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22control%22%2C%20value%3A%20%22Control%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22escape%22%2C%20value%3A%20%22Escape%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22insert%22%2C%20value%3A%20%22Insert%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22home%22%2C%20value%3A%20%22Home%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22end%22%2C%20value%3A%20%22End%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22page%20up%22%2C%20value%3A%20%22PageUp%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22page%20down%22%2C%20value%3A%20%22PageDown%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22a%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22b%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22c%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22d%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22e%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22f%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22g%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22h%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22i%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22j%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22k%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22l%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22m%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22n%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22p%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22q%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22s%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22t%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22u%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22v%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22w%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22x%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22y%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22z%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%220%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%221%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%222%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%223%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%224%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%225%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%226%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%227%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%229%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22-%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22.%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%60%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5C%5C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22'%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22~%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22*%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%23%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22(%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3E%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%40%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'%22'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20BUTTONS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22left%22%2C%20value%3A%20%220%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22middle%22%2C%20value%3A%20%221%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22right%22%2C%20value%3A%20%222%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20pressKey(args)%20%7B%0A%20%20%20%20%20%20const%20pressKey%20%3D%20new%20KeyboardEvent(%22keydown%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(pressKey)%3B%0A%20%20%20%20%20%20await%20delay(100)%3B%0A%20%20%20%20%20%20const%20releaseKey%20%3D%20new%20KeyboardEvent(%22keyup%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(releaseKey)%3B%0A%20%20%20%20%7D%0A%20%20%20%20async%20holdKey(args)%20%7B%0A%20%20%20%20%20%20const%20pressKey%20%3D%20new%20KeyboardEvent(%22keydown%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(pressKey)%3B%0A%20%20%20%20%20%20await%20delay(args.SECONDS%20*%201000)%3B%0A%20%20%20%20%20%20const%20releaseKey%20%3D%20new%20KeyboardEvent(%22keyup%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(releaseKey)%3B%0A%20%20%20%20%7D%0A%20%20%20%20async%20clickMouse(args)%20%7B%0A%20%20%20%20%20%20simulatedX%20%3D%20args.X%3B%0A%20%20%20%20%20%20simulatedY%20%3D%20args.Y%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20true%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20await%20delay(100)%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20false%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20async%20holdMouse(args)%20%7B%0A%20%20%20%20%20%20simulatedX%20%3D%20args.X%3B%0A%20%20%20%20%20%20simulatedY%20%3D%20args.Y%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20true%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20await%20delay(args.SECONDS%20*%201000)%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20false%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20KeySimulation())%3B%0A%7D)(Scratch)%3B","https://extensions.turbowarp.org/obviousAlexC/SensingPlus.js","https://extensions.turbowarp.org/cursor.js"],"bakeExtensions":true} \ No newline at end of file +{"framerate":0,"highQualityPen":true,"maxClones":9999999999,"fencing":false,"miscLimits":false,"stageWidth":640,"autoplay":true,"projectId":"p4-@TurboFunkSauce.sb3","appearance":{"accent":"#ff4c4c","background":"#000000","foreground":"#ffffff"},"loadingScreen":{"progressBar":false,"text":"","imageMode":"normal","image":null},"monitors":{"editableLists":true,"variableColor":"#ff8c1a","listColor":"#fc662c"},"penguinmod":{"permissionManager":{"unsandboxedJavascript":true,"enabled":false}},"packagedRuntime":false,"target":"zip","app":{"packageName":"penguinfunk","windowTitle":"Co-Funk","version":"2.5.0","icon":null,"windowMode":"window"},"cursor":{"type":"none","custom":null,"center":{"x":0,"y":0}},"maxTextureDimension":4096,"turbo":false,"interpolation":false,"dangerousOptimizations":false,"stageHeight":360,"resizeMode":"preserve-ratio","username":"player####","closeWhenStopped":false,"custom":{"css":"","js":""},"controls":{"greenFlag":{"enabled":false},"stopAll":{"enabled":false},"fullscreen":{"enabled":false},"pause":{"enabled":false}},"compiler":{"enabled":true,"warpTimer":false},"chunks":{"gamepad":false,"pointerlock":false},"cloudVariables":{"mode":"ws","cloudHost":"wss://clouddata.turbowarp.org","custom":{},"specialCloudBehaviors":false,"unsafeCloudBehaviors":false},"extensions":["https://extensions.turbowarp.org/Lily/TempVariables2.js","https://extensions.turbowarp.org/local-storage.js","https://extensions.turbowarp.org/Skyhigh173/json.js","data:application/javascript,%2F%2F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%23((%23%23%0A%2F%2F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23%23(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%20%20%23%23%23%23%23%23%23%23%26%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%25%23%23%23%23%23(((%0A%2F%2F%20%20%20%20%20%20%20%23%23%23%23%23%23%25%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%25%23%23((((%0A%2F%2F%20%20%20%20%20%23%23%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%26%23((((%0A%2F%2F%20%20%20%20%23%23%23%23%40%40%40%40%40%40%40%40%40%40%25%25%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%23(((%0A%2F%2F%20%20%20%23%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26((((%0A%2F%2F%20%20%20%23%23%23%26%40%40%40%40%40%40%40%40%25%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%25%25%40%40%40%40%40%26%26%26%23(((%0A%2F%2F%20%20%20%23%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%26(((%2F%0A%2F%2F%20%20%20%20%23%23%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26((((.%0A%2F%2F%20%20%20%20%20%20%23%23%23%23%23%26%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%25(((((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%25%25%40%40%40%40%40%25%25%40%40%40%40%26%25%26%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%26%25%26%40%40%40%40%25%26%25%40%40%40%26%26%25%40%40%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%40%40%25%25%26%40%40%40%40%25%25%40%40%40%40%25%25%26%40%40%40%26%26%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%26%26%25%40%40%40%40%25%25%26%40%40%40%26%25%25%40%40%40%40%25%26%26%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%40%40%40%40%26%25%40%40%40%40%25%25%26%40%40%40%26%25%25%40%40%40%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%40%26%26%26%40%40%40%26%26%26%40%40%40%40%26%26%40%40%40%40%26%26%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%25%25%40%40%40%40%25%25%26%40%40%40%26%26%25%40%40%40%40%25%25%26%40%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%40%40%26%25%26%40%40%40%40%25%25%26%40%40%40%26%26%25%40%40%40%40%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%40%40%25%25%26%40%40%40%26%25%25%40%40%40%40%25%25%26%40%40%40%40%40%40%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%40%40%40%40%40%40%26%25%40%40%40%40%26%25%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20%23%23%23%26%26%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%40%26%26%26%26%26%26(((%0A%2F%2F%20%20%20%20%20%20%20%20%20((%23%23%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26%26((((%0A%2F%2F%20%20%20%20%20%20%20%20%20%20(((((((((((((((((((((((((((((((((((((((((%0A%2F%2F%0A%2F%2F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20-%3D%20Toast%20Notifs%20%3D-%0A%2F%2F%20%20Did%20you%20want%20alerts%3F%20Notificationss%20that%20are%20easily%20customizable%3F%0A%2F%2F%20%20%20%20%20%20%20%20This%20is%20the%20only%20and%20best%20notification%20extension!%0A%2F%2F%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Created%20by%20MubiLop%20%2B%20themeatly2%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20const%20ico%20%3D%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4IiBzdHlsZT0ic2hhcGUtcmVuZGVyaW5nOmdlb21ldHJpY1ByZWNpc2lvbjsgdGV4dC1yZW5kZXJpbmc6Z2VvbWV0cmljUHJlY2lzaW9uOyBpbWFnZS1yZW5kZXJpbmc6b3B0aW1pemVRdWFsaXR5OyBmaWxsLXJ1bGU6ZXZlbm9kZDsgY2xpcC1ydWxlOmV2ZW5vZGQiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KPGc%2BPHBhdGggc3R5bGU9Im9wYWNpdHk6MC45ODciIGZpbGw9IiNmNzllNjAiIGQ9Ik0gMjI4LjUsLTAuNSBDIDIzMy4xNjcsLTAuNSAyMzcuODMzLC0wLjUgMjQyLjUsLTAuNUMgMjkyLjgzNSwxLjgzNjM4IDM0MC41MDEsMTQuNjY5NyAzODUuNSwzOEMgNDEzLjYxNSw1My4xMTUyIDQzNS40NDksNzQuNjE1MiA0NTEsMTAyLjVDIDQ1NC45NTMsMTEwLjA2NiA0NTcuNDUzLDExOC4wNjYgNDU4LjUsMTI2LjVDIDQ0OC4zOCwxMDEuMTU0IDQzMS4zOCw4MS42NTQxIDQwNy41LDY4QyAzNjcuNTYsNDUuMjYxMyAzMjQuNTYsMzIuNTk0NyAyNzguNSwzMEMgMjYzLjY2MSwyOS4xNzI0IDI0OC45OTQsMjkuMzM5MSAyMzQuNSwzMC41QyAxOTEuNDMsMzIuMjQ0NyAxNTAuNzYzLDQzLjA3OCAxMTIuNSw2M0MgOTQuMjgyLDczLjIxMDkgNzguNDQ4Niw4Ni4zNzc1IDY1LDEwMi41QyA0NS4yNDkyLDEzMS41OTUgNDUuOTE1OCwxNjAuMjYyIDY3LDE4OC41QyA3NS44MTM4LDE5OC43MzYgODUuNDgwNSwyMDguMDY5IDk2LDIxNi41QyA5Ny44NjA1LDIxOC44ODggOTkuMTkzOSwyMjEuNTU0IDEwMCwyMjQuNUMgMTAwLjUsMjkzLjQ5OSAxMDAuNjY3LDM2Mi40OTkgMTAwLjUsNDMxLjVDIDEwMC4wNjksNDQyLjU3OCAxMDAuNTY5LDQ1My41NzggMTAyLDQ2NC41QyAxMDUuMzU1LDQ3MS42ODcgMTEwLjUyMiw0NzcuMDIxIDExNy41LDQ4MC41QyA4OC42OTY0LDQ3My4zNjIgNzIuNjk2NCw0NTUuMDI5IDY5LjUsNDI1LjVDIDY5LjY2NjcsMzYxLjQ5OSA2OS41LDI5Ny40OTkgNjksMjMzLjVDIDQ5LjIyMDIsMjE3LjU5IDM0LjU1MzUsMTk3LjkyMyAyNSwxNzQuNUMgMTQuNDAzNywxMzYuODkgMjIuMDcwNCwxMDMuNTU3IDQ4LDc0LjVDIDc4Ljc4OTcsNDQuMDExNSAxMTUuMjksMjMuMTc4MSAxNTcuNSwxMkMgMTgwLjk3LDUuODY3NDggMjA0LjYzNiwxLjcwMDgyIDIyOC41LC0wLjUgWiIvPjwvZz4KPGc%2BPHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2Q3N2Q0MSIgZD0iTSAyNDIuNSwtMC41IEMgMjU1LjgzMywtMC41IDI2OS4xNjcsLTAuNSAyODIuNSwtMC41QyAzMzMuOTk4LDIuOTQzMTQgMzgxLjk5OCwxNy43NzY1IDQyNi41LDQ0QyA0NTEuMjU2LDU5LjA4ODMgNDcwLjA5LDc5LjU4ODMgNDgzLDEwNS41QyA0OTcuNjY2LDE0NS41MDEgNDkwLjk5OSwxODEuNTAxIDQ2MywyMTMuNUMgNDU2LjMwMywyMjAuNTMyIDQ0OS4zMDMsMjI3LjE5OCA0NDIsMjMzLjVDIDQ0MS45NzksMzExLjE5MyA0NDEuMzEzLDM4OC44NiA0NDAsNDY2LjVDIDQzMy41NDMsNDkwLjQ1OCA0MTguMzc2LDUwNS40NTggMzk0LjUsNTExLjVDIDMwMS44MzMsNTExLjUgMjA5LjE2Nyw1MTEuNSAxMTYuNSw1MTEuNUMgOTIuNjIzOSw1MDUuNDU4IDc3LjQ1NzIsNDkwLjQ1OCA3MSw0NjYuNUMgNjkuNjM4NCw0NTIuODc0IDY5LjEzODQsNDM5LjIwOCA2OS41LDQyNS41QyA3Mi42OTY0LDQ1NS4wMjkgODguNjk2NCw0NzMuMzYyIDExNy41LDQ4MC41QyAyMDguMTM5LDQ4MS42NTkgMjk4LjgwNSw0ODEuODI2IDM4OS41LDQ4MUMgNDAxLjUxMiw0NzcuNjUyIDQwOC42NzksNDY5LjgxOSA0MTEsNDU3LjVDIDQxMS4zMzMsMzc5LjUgNDExLjY2NywzMDEuNSA0MTIsMjIzLjVDIDQxMi43MjUsMjIxLjA1MSA0MTMuNzI1LDIxOC43MTcgNDE1LDIxNi41QyA0MjQuMjY3LDIwOS4yMzYgNDMyLjkzNCwyMDEuMjM2IDQ0MSwxOTIuNUMgNDU3Ljc3MSwxNzMuNDE2IDQ2My42MDUsMTUxLjQxNiA0NTguNSwxMjYuNUMgNDU3LjQ1MywxMTguMDY2IDQ1NC45NTMsMTEwLjA2NiA0NTEsMTAyLjVDIDQzNS40NDksNzQuNjE1MiA0MTMuNjE1LDUzLjExNTIgMzg1LjUsMzhDIDM0MC41MDEsMTQuNjY5NyAyOTIuODM1LDEuODM2MzggMjQyLjUsLTAuNSBaIi8%2BPC9nPgo8Zz48cGF0aCBzdHlsZT0ib3BhY2l0eToxIiBmaWxsPSIjZmNkOGIzIiBkPSJNIDIzNC41LDMwLjUgQyAyNDguOTk0LDI5LjMzOTEgMjYzLjY2MSwyOS4xNzI0IDI3OC41LDMwQyAzMjQuNTYsMzIuNTk0NyAzNjcuNTYsNDUuMjYxMyA0MDcuNSw2OEMgNDMxLjM4LDgxLjY1NDEgNDQ4LjM4LDEwMS4xNTQgNDU4LjUsMTI2LjVDIDQ2My42MDUsMTUxLjQxNiA0NTcuNzcxLDE3My40MTYgNDQxLDE5Mi41QyA0MzIuOTM0LDIwMS4yMzYgNDI0LjI2NywyMDkuMjM2IDQxNSwyMTYuNUMgNDEzLjcyNSwyMTguNzE3IDQxMi43MjUsMjIxLjA1MSA0MTIsMjIzLjVDIDQxMS42NjcsMzAxLjUgNDExLjMzMywzNzkuNSA0MTEsNDU3LjVDIDQwOC42NzksNDY5LjgxOSA0MDEuNTEyLDQ3Ny42NTIgMzg5LjUsNDgxQyAyOTguODA1LDQ4MS44MjYgMjA4LjEzOSw0ODEuNjU5IDExNy41LDQ4MC41QyAxMTAuNTIyLDQ3Ny4wMjEgMTA1LjM1NSw0NzEuNjg3IDEwMiw0NjQuNUMgMTAwLjU2OSw0NTMuNTc4IDEwMC4wNjksNDQyLjU3OCAxMDAuNSw0MzEuNUMgMTA0LjA4LDQ0MS41NzcgMTExLjA4LDQ0OC4wNzcgMTIxLjUsNDUxQyAyMDAuODMzLDQ1MS42NjcgMjgwLjE2Nyw0NTEuNjY3IDM1OS41LDQ1MUMgMzcwLjM2LDQ0OC4xNCAzNzcuMTkzLDQ0MS4zMDcgMzgwLDQzMC41QyAzODAuMzMzLDM2MS44MzMgMzgwLjY2NywyOTMuMTY3IDM4MSwyMjQuNUMgMzg1LjAzNSwyMTUuNzk2IDM5MS4yMDEsMjA4Ljk2MyAzOTkuNSwyMDRDIDQ0MS43MjksMTYyLjMxMyA0NDAuNzI5LDEyMS42NDYgMzk2LjUsODJDIDM2Ni43MzcsNTkuNDU4NyAzMzMuNDAzLDQ0LjQ1ODcgMjk2LjUsMzdDIDI3Ni4wNjEsMzIuNTMyIDI1NS4zOTQsMzAuMzY1NCAyMzQuNSwzMC41IFoiLz48L2c%2BCjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNmZWU3YzciIGQ9Ik0gMjM0LjUsMzAuNSBDIDI1NS4zOTQsMzAuMzY1NCAyNzYuMDYxLDMyLjUzMiAyOTYuNSwzN0MgMzMzLjQwMyw0NC40NTg3IDM2Ni43MzcsNTkuNDU4NyAzOTYuNSw4MkMgNDQwLjcyOSwxMjEuNjQ2IDQ0MS43MjksMTYyLjMxMyAzOTkuNSwyMDRDIDM5MS4yMDEsMjA4Ljk2MyAzODUuMDM1LDIxNS43OTYgMzgxLDIyNC41QyAzODAuNjY3LDI5My4xNjcgMzgwLjMzMywzNjEuODMzIDM4MCw0MzAuNUMgMzc3LjE5Myw0NDEuMzA3IDM3MC4zNiw0NDguMTQgMzU5LjUsNDUxQyAyODAuMTY3LDQ1MS42NjcgMjAwLjgzMyw0NTEuNjY3IDEyMS41LDQ1MUMgMTExLjA4LDQ0OC4wNzcgMTA0LjA4LDQ0MS41NzcgMTAwLjUsNDMxLjVDIDEwMC42NjcsMzYyLjQ5OSAxMDAuNSwyOTMuNDk5IDEwMCwyMjQuNUMgOTkuMTkzOSwyMjEuNTU0IDk3Ljg2MDUsMjE4Ljg4OCA5NiwyMTYuNUMgODUuNDgwNSwyMDguMDY5IDc1LjgxMzgsMTk4LjczNiA2NywxODguNUMgNDUuOTE1OCwxNjAuMjYyIDQ1LjI0OTIsMTMxLjU5NSA2NSwxMDIuNUMgNzguNDQ4Niw4Ni4zNzc1IDk0LjI4Miw3My4yMTA5IDExMi41LDYzQyAxNTAuNzYzLDQzLjA3OCAxOTEuNDMsMzIuMjQ0NyAyMzQuNSwzMC41IFoiLz48L2c%2BCjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNmMmMzOTgiIGQ9Ik0gMTUzLjUsOTguNSBDIDE1OS41MjMsOTcuMTk2NiAxNjMuMTg5LDk5LjUzIDE2NC41LDEwNS41QyAxNjIuMDkxLDExMi43MDIgMTU3LjU5MSwxMTQuMzY5IDE1MSwxMTAuNUMgMTQ4LjUyMywxMDUuNjY5IDE0OS4zNTYsMTAxLjY2OSAxNTMuNSw5OC41IFoiLz48L2c%2BCjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNmMmM0OTgiIGQ9Ik0gMzMwLjUsMTEyLjUgQyAzMzguMjAxLDExMi4zNjIgMzQxLjM2NywxMTYuMDI5IDM0MCwxMjMuNUMgMzM0LjgzNywxMjkuMDYyIDMzMC4xNzEsMTI4LjcyOSAzMjYsMTIyLjVDIDMyNS40MzgsMTE4LjIzMiAzMjYuOTM4LDExNC44OTggMzMwLjUsMTEyLjUgWiIvPjwvZz4KPGc%2BPHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2YyYzM5OCIgZD0iTSAxMjQuNSwxNDAuNSBDIDEzMC41MjMsMTM5LjE5NyAxMzQuMTg5LDE0MS41MyAxMzUuNSwxNDcuNUMgMTMzLjA5MSwxNTQuNzAyIDEyOC41OTEsMTU2LjM2OSAxMjIsMTUyLjVDIDExOS41MjMsMTQ3LjY2OSAxMjAuMzU2LDE0My42NjkgMTI0LjUsMTQwLjUgWiIvPjwvZz4KPGc%2BPHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2YyYzQ5OSIgZD0iTSAzNzQuNSwxNDIuNSBDIDM4NC4xMSwxNDIuOTM2IDM4Ni43NzYsMTQ3LjQzNiAzODIuNSwxNTZDIDM3NC40NjMsMTU5LjYwMSAzNzAuMjk2LDE1Ny4xMDEgMzcwLDE0OC41QyAzNzEuMzMyLDE0Ni4zNCAzNzIuODMyLDE0NC4zNCAzNzQuNSwxNDIuNSBaIi8%2BPC9nPgo8Zz48cGF0aCBzdHlsZT0ib3BhY2l0eToxIiBmaWxsPSIjZjJjNDk4IiBkPSJNIDIwNy41LDE2MS41IEMgMjE1LjE2MSwxNjAuNjYzIDIxOC42NjEsMTYzLjk5NiAyMTgsMTcxLjVDIDIxNC4yOTUsMTc1Ljk4MiAyMDkuOTYyLDE3Ni42NDkgMjA1LDE3My41QyAyMDIuNTIzLDE2OC42NjkgMjAzLjM1NiwxNjQuNjY5IDIwNy41LDE2MS41IFoiLz48L2c%2BCjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNmMmMzOTciIGQ9Ik0gMzUyLjUsMjE5LjUgQyAzNjEuNjEsMjE5Ljc3MiAzNjQuNDQzLDIyNC4xMDUgMzYxLDIzMi41QyAyOTQuMTY3LDI5OS4zMzMgMjI3LjMzMywzNjYuMTY3IDE2MC41LDQzM0MgMTUxLjg3Niw0MzUuNzEzIDE0OC4wNDMsNDMyLjU0NiAxNDksNDIzLjVDIDIxNy4wMzUsMzU1LjYzMiAyODQuODY4LDI4Ny42MzIgMzUyLjUsMjE5LjUgWiIvPjwvZz4KPGc%2BPHBhdGggc3R5bGU9Im9wYWNpdHk6MSIgZmlsbD0iI2YyYzQ5OCIgZD0iTSAyOTYuNSwyMjEuNSBDIDMwNi4wOTgsMjIyLjM2MiAzMDguNTk4LDIyNy4wMjkgMzA0LDIzNS41QyAyNTcuMTY3LDI4Mi4zMzMgMjEwLjMzMywzMjkuMTY3IDE2My41LDM3NkMgMTU2Ljg2MSwzODAuMTc3IDE1Mi41MjcsMzc4LjUxMSAxNTAuNSwzNzFDIDE1MC41NDIsMzY5LjAzMyAxNTEuMDQyLDM2Ny4xOTkgMTUyLDM2NS41QyAyMDAuMDYyLDMxNy4yNzIgMjQ4LjIyOCwyNjkuMjcyIDI5Ni41LDIyMS41IFoiLz48L2c%2BCjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNmMmMzOTciIGQ9Ik0gMjMxLjUsMjI5LjUgQyAyNDEuMjQ1LDIyOC40MDUgMjQ0LjQxMSwyMzIuNDA1IDI0MSwyNDEuNUMgMjE3LjE2NywyNjUuMzMzIDE5My4zMzMsMjg5LjE2NyAxNjkuNSwzMTNDIDE2MC44OTQsMzE1LjczMiAxNTcuMDYxLDMxMi41NjYgMTU4LDMwMy41QyAxODIuNzAyLDI3OC45NjUgMjA3LjIwMiwyNTQuMjk5IDIzMS41LDIyOS41IFoiLz48L2c%2BCjxnPjxwYXRoIHN0eWxlPSJvcGFjaXR5OjEiIGZpbGw9IiNmMmMzOTciIGQ9Ik0gMzQ5LjUsMjc2LjUgQyAzNTkuMTQ4LDI3NS40OCAzNjIuMzE1LDI3OS40OCAzNTksMjg4LjVDIDMxMS41LDMzNiAyNjQsMzgzLjUgMjE2LjUsNDMxQyAyMDcuOTI4LDQzMy43NjkgMjA0LjA5NCw0MzAuNjAyIDIwNSw0MjEuNUMgMjUzLjM2OCwzNzMuMjk5IDMwMS41MzUsMzI0Ljk2NSAzNDkuNSwyNzYuNSBaIi8%2BPC9nPgo8Zz48cGF0aCBzdHlsZT0ib3BhY2l0eToxIiBmaWxsPSIjZjJjNDk4IiBkPSJNIDM0My41LDMzOS41IEMgMzUzLjYxNSwzNDAuMTExIDM1Ni4xMTUsMzQ0Ljc3OCAzNTEsMzUzLjVDIDMyNy44MzMsMzc2LjY2NyAzMDQuNjY3LDM5OS44MzMgMjgxLjUsNDIzQyAyNzYuNzQsNDI2Ljc3NyAyNzIuNTczLDQyNi4yNzcgMjY5LDQyMS41QyAyNjguMjEsNDE4LjM2NiAyNjguNTQzLDQxNS4zNjYgMjcwLDQxMi41QyAyOTQuMzk1LDM4Ny45MzggMzE4Ljg5NSwzNjMuNjA1IDM0My41LDMzOS41IFoiLz48L2c%2BCjwvc3ZnPgo%3D%22%3B%0A%0A%20%20function%20defaultStyles()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20toast%3A%20%7B%0A%20%20%20%20%20%20%20%20backgroundColour%3A%20null%2C%0A%20%20%20%20%20%20%20%20fontColour%3A%20null%2C%0A%20%20%20%20%20%20%20%20fontSize%3A%20null%2C%0A%20%20%20%20%20%20%20%20borderRadius%3A%20null%2C%0A%20%20%20%20%20%20%20%20padding%3A%20null%2C%0A%20%20%20%20%20%20%20%20soundLink%3A%20null%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20notification%3A%20%7B%0A%20%20%20%20%20%20%20%20backgroundColour%3A%20null%2C%0A%20%20%20%20%20%20%20%20fontColour%3A%20null%2C%0A%20%20%20%20%20%20%20%20fontSize%3A%20null%2C%0A%20%20%20%20%20%20%20%20borderRadius%3A%20null%2C%0A%20%20%20%20%20%20%20%20padding%3A%20null%2C%0A%20%20%20%20%20%20%20%20soundLink%3A%20null%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20alert%3A%20%7B%0A%20%20%20%20%20%20%20%20backgroundColour%3A%20null%2C%0A%20%20%20%20%20%20%20%20fontColour%3A%20null%2C%0A%20%20%20%20%20%20%20%20fontSize%3A%20null%2C%0A%20%20%20%20%20%20%20%20borderRadius%3A%20null%2C%0A%20%20%20%20%20%20%20%20padding%3A%20null%2C%0A%20%20%20%20%20%20%20%20soundLink%3A%20null%2C%0A%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20var%20toastConfig%20%3D%20%7B%0A%20%20%20%20soundWhenAlertEnabled%3A%20%22true%22%2C%0A%20%20%7D%3B%0A%0A%20%20const%20stylesToast%20%3D%20defaultStyles()%3B%0A%0A%20%20function%20validColour(colour)%20%7B%0A%20%20%20%20if%20(typeof%20colour%20!%3D%20%22string%22)%20return%20false%3B%0A%0A%20%20%20%20const%20hexRegex%20%3D%20%2F%5E%23%5B0-9A-F%5D%7B6%7D%24%2Fi%3B%0A%0A%20%20%20%20return%20hexRegex.test(colour)%3B%0A%20%20%7D%0A%0A%20%20class%20ToastNotifsExt%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22toastnotifs%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Toast%20Notifs%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%3A%20ico%2C%0A%20%20%20%20%20%20%20%20blockIconURI%3A%20ico%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23905c1b%22%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22showToast%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Show%20Toast%20with%20text%20%5BTEXT%5D%20with%20image%20%5BIMAGE%5D%20image%20rounded%3F%20%5BROUNDED%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Toast!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20IMAGE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22https%3A%2F%2Fpenguinmod.com%2Fnavicon.png%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ROUNDED%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22yesorno%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22no%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22showNotificationToast%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Show%20Notification%20Toast%20with%20text%20%5BTEXT%5D%20at%20position%20%5BPOSITION%5D%20custom%20css%3F%20%5BSTYLES%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Hello%2C%20World!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20POSITION%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22position%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22up%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22type%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20STYLES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22showAlert%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Show%20Alert%20with%20text%20%5BTEXT%5D%20with%20duration%20of%20%5BDURATION%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22Hello!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DURATION%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%225%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22__NOOPCODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Customization%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.LABEL%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setStyleOfTo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Set%20%5BSTYLE%5D%20of%20%5BALLTYPES%5D%20to%20%5BVALUE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20STYLE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22setStyle%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ALLTYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22setStyleAllTypes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetStyleOf%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Reset%20style%20of%20%5BALLTYPES%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ALLTYPES%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22setStyleAllTypes%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getHexColour%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Colour%20%5BHEX%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20HEX%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.COLOR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22__NOOPCODE%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Configuration%20(Can%20be%20experimental)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.LABEL%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setConfig%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22Set%20config%20%5BCONFIG%5D%20to%20%5BVALUE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20CONFIG%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22soundWhenAlertEnabled%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22configs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20%22true%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20position%3A%20%5B%22up%22%2C%20%22middle%22%2C%20%22down%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20type%3A%20%5B%22info%22%2C%20%22success%22%2C%20%22warning%22%2C%20%22error%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20yesorno%3A%20%5B%22yes%22%2C%20%22no%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20setStyle%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22background%20colour%22%2C%20value%3A%20%22backgroundColour%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22font%20colour%22%2C%20value%3A%20%22fontColour%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22font%20size%22%2C%20value%3A%20%22fontSize%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22border%20roundness%22%2C%20value%3A%20%22borderRadius%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22padding%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22sound%20url%22%2C%20value%3A%20%22soundLink%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20setStyleAllTypes%3A%20%5B%22toast%22%2C%20%22notification%22%2C%20%22alert%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20configs%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22play%20sound%20when%20alert%22%2C%20value%3A%20%22soundWhenAlertEnabled%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20showNotificationToast(args)%20%7B%0A%20%20%20%20%20%20var%20text%20%3D%20args.TEXT%3B%0A%20%20%20%20%20%20var%20position%20%3D%20args.POSITION%3B%0A%20%20%20%20%20%20var%20type%20%3D%20args.TYPE%3B%0A%0A%20%20%20%20%20%20var%20size%20%3D%20stylesToast%5B%22notification%22%5D.fontSize%20%3F%3F%2016%3B%0A%20%20%20%20%20%20var%20bgColour%20%3D%0A%20%20%20%20%20%20%20%20stylesToast%5B%22notification%22%5D.backgroundColour%20%3F%3F%20%22rgba(0%2C%200%2C%200%2C%200.8)%22%3B%0A%20%20%20%20%20%20var%20borderRadius%20%3D%20stylesToast%5B%22notification%22%5D.borderRadius%20%3F%3F%205%3B%0A%20%20%20%20%20%20var%20padding%20%3D%20stylesToast%5B%22notification%22%5D.padding%20%3F%3F%2010%3B%0A%20%20%20%20%20%20var%20fontColour%20%3D%20stylesToast%5B%22notification%22%5D.fontColour%20%3F%3F%20%22%23FFFFFF%22%3B%0A%0A%20%20%20%20%20%20var%20styles%20%3D%20args.STYLES%3B%0A%0A%20%20%20%20%20%20var%20existingStyle%20%3D%20document.getElementById(%22notificationToastStyle%22)%3B%0A%20%20%20%20%20%20if%20(existingStyle)%20%7B%0A%20%20%20%20%20%20%20%20existingStyle.remove()%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20notificationToastStyle%20%3D%20document.createElement(%22style%22)%3B%0A%20%20%20%20%20%20notificationToastStyle.id%20%3D%20%22notificationToastStyle%22%3B%0A%20%20%20%20%20%20notificationToastStyle.textContent%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20fixed%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20z-index%3A%209999%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right%3A%2010px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20padding%3A%20%24%7Bpadding%7Dpx%20%24%7Bpadding%20*%202%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20border-radius%3A%20%24%7BborderRadius%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font-family%3A%20Arial%2C%20sans-serif%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font-size%3A%20%24%7Bsize%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%24%7BfontColour%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20background-color%3A%20%24%7BbgColour%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20animation%3A%20slideIn%200.5s%20ease-in-out%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%7Bstyles%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.up%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top%3A%2010px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.middle%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top%3A%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateY(-50%25)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.down%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20bottom%3A%2010px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.info%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%232196F3%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.success%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%234CAF50%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.warning%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%23FFEB3B%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast.error%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%23F44336%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast%20.line%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20border-top%3A%203px%20solid%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20margin-bottom%3A%205px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast%20.close-button%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20absolute%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top%3A%205px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right%3A%205px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cursor%3A%20pointer%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.notification-toast%20.close-button%3Ahover%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%23fff%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40keyframes%20slideIn%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right%3A%20-300px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20to%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20right%3A%2010px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40keyframes%20fadeOut%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20to%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%3B%0A%20%20%20%20%20%20document.head.appendChild(notificationToastStyle)%3B%0A%0A%20%20%20%20%20%20var%20notificationToast%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20notificationToast.className%20%3D%20%60notification-toast%20%24%7Bposition%7D%20%24%7Btype%7D%60%3B%0A%20%20%20%20%20%20notificationToast.innerHTML%20%3D%20%60%3Cspan%20class%3D%22close-button%22%3E%C3%97%3C%2Fspan%3E%3Cdiv%20class%3D%22line%20%24%7Btype%7D%22%3E%3C%2Fdiv%3E%24%7Btext%7D%60%3B%0A%20%20%20%20%20%20document.body.appendChild(notificationToast)%3B%0A%0A%20%20%20%20%20%20if%20(toastConfig%5B%22soundWhenAlertEnabled%22%5D%20%3D%3D%20%22true%22)%20%7B%0A%20%20%20%20%20%20%20%20var%20audioLink%20%3D%0A%20%20%20%20%20%20%20%20%20%20stylesToast%5B%22notification%22%5D.soundLink%20%3F%3F%0A%20%20%20%20%20%20%20%20%20%20%22https%3A%2F%2Fruby-devs.vercel.app%2Fcdn%2Fappear.mp3%22%3B%0A%20%20%20%20%20%20%20%20var%20audio%20%3D%20new%20Audio(audioLink)%3B%0A%20%20%20%20%20%20%20%20audio.play()%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20closeButton%20%3D%20notificationToast.querySelector(%22.close-button%22)%3B%0A%20%20%20%20%20%20closeButton.addEventListener(%22click%22%2C%20function%20()%20%7B%0A%20%20%20%20%20%20%20%20notificationToast.classList.add(%22fade-out%22)%3B%0A%20%20%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20notificationToast.remove()%3B%0A%20%20%20%20%20%20%20%20%20%20notificationToastStyle.remove()%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20500)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20notificationToast.classList.add(%22fade-out%22)%3B%0A%0A%20%20%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20notificationToast.remove()%3B%0A%20%20%20%20%20%20%20%20%20%20notificationToastStyle.remove()%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20500)%3B%0A%20%20%20%20%20%20%7D%2C%205000)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20showToast(args)%20%7B%0A%20%20%20%20%20%20let%20round%3B%0A%20%20%20%20%20%20var%20text%20%3D%20args.TEXT%3B%0A%20%20%20%20%20%20var%20image%20%3D%20args.IMAGE%3B%0A%20%20%20%20%20%20var%20isRounded%20%3D%20args.ROUNDED%3B%0A%20%20%20%20%20%20var%20existingStyle%20%3D%20document.getElementById(%22toastStyle%22)%3B%0A%0A%20%20%20%20%20%20var%20size%20%3D%20stylesToast%5B%22toast%22%5D.fontSize%20%3F%3F%2018%3B%0A%20%20%20%20%20%20var%20bgColour%20%3D%20stylesToast%5B%22toast%22%5D.backgroundColour%20%3F%3F%20%22%23333%22%3B%0A%20%20%20%20%20%20var%20borderRadius%20%3D%20stylesToast%5B%22toast%22%5D.borderRadius%20%3F%3F%2010%3B%0A%20%20%20%20%20%20var%20padding%20%3D%20stylesToast%5B%22toast%22%5D.padding%20%3F%3F%2020%3B%0A%20%20%20%20%20%20var%20fontColour%20%3D%20stylesToast%5B%22toast%22%5D.fontColour%20%3F%3F%20%22%23FFFFFF%22%3B%0A%0A%20%20%20%20%20%20if%20(existingStyle)%20%7B%0A%20%20%20%20%20%20%20%20existingStyle.remove()%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(isRounded%20%3D%3D%3D%20%22yes%22)%20%7B%0A%20%20%20%20%20%20%20%20round%20%3D%20%22border-radius%3A%2050%25%3B%22%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20toastStyle%20%3D%20document.createElement(%22style%22)%3B%0A%20%20%20%20%20%20toastStyle.id%20%3D%20%22toastStyle%22%3B%0A%20%20%20%20%20%20toastStyle.textContent%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23toast%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20fixed%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20z-index%3A%209999%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top%3A%20-100px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20left%3A%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translateX(-50%25)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20background-color%3A%20%24%7BbgColour%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%24%7BfontColour%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20padding%3A%20%24%7Bpadding%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20border-radius%3A%20%24%7BborderRadius%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font-family%3A%20Arial%2C%20sans-serif%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font-size%3A%20%24%7Bsize%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display%3A%20flex%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20align-items%3A%20center%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transition%3A%20top%200.5s%20ease%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23toast%20img%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20width%3A%2064px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20height%3A%2064px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20margin-right%3A%2010px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%24%7Bround%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23toast%20.points%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20margin-left%3A%2010px%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%3B%0A%20%20%20%20%20%20document.head.appendChild(toastStyle)%3B%0A%0A%20%20%20%20%20%20var%20toast%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20toast.id%20%3D%20%22toast%22%3B%0A%0A%20%20%20%20%20%20if%20(image)%20%7B%0A%20%20%20%20%20%20%20%20var%20img%20%3D%20document.createElement(%22img%22)%3B%0A%20%20%20%20%20%20%20%20img.src%20%3D%20image%3B%0A%20%20%20%20%20%20%20%20img.width%20%3D%2064%3B%0A%20%20%20%20%20%20%20%20img.height%20%3D%2064%3B%0A%20%20%20%20%20%20%20%20toast.appendChild(img)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20var%20content%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20content.style.display%20%3D%20%22flex%22%3B%0A%20%20%20%20%20%20content.style.alignItems%20%3D%20%22center%22%3B%0A%20%20%20%20%20%20content.textContent%20%3D%20text%3B%0A%20%20%20%20%20%20toast.appendChild(content)%3B%0A%0A%20%20%20%20%20%20document.body.appendChild(toast)%3B%0A%0A%20%20%20%20%20%20if%20(toastConfig%5B%22soundWhenAlertEnabled%22%5D%20%3D%3D%20%22true%22)%20%7B%0A%20%20%20%20%20%20%20%20var%20audioLink%20%3D%0A%20%20%20%20%20%20%20%20%20%20stylesToast%5B%22toast%22%5D.soundLink%20%3F%3F%0A%20%20%20%20%20%20%20%20%20%20%22https%3A%2F%2Fruby-devs.vercel.app%2Fcdn%2Fappear.mp3%22%3B%0A%20%20%20%20%20%20%20%20var%20audio%20%3D%20new%20Audio(audioLink)%3B%0A%20%20%20%20%20%20%20%20audio.play()%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20toast.style.top%20%3D%20%220%22%3B%0A%20%20%20%20%20%20%7D%2C%20100)%3B%0A%0A%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20toast.style.top%20%3D%20%22-100px%22%3B%0A%20%20%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20toast.remove()%3B%0A%20%20%20%20%20%20%20%20%20%20toastStyle.remove()%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20500)%3B%0A%20%20%20%20%20%20%7D%2C%202000)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20showAlert(args)%20%7B%0A%20%20%20%20%20%20var%20text%20%3D%20args.TEXT%3B%0A%20%20%20%20%20%20var%20type%20%3D%20args.TYPE%3B%0A%20%20%20%20%20%20var%20duration%20%3D%20args.DURATION%3B%20%2F%2F%20New%20argument%20for%20duration%0A%0A%20%20%20%20%20%20var%20size%20%3D%20stylesToast%5B%22alert%22%5D.fontSize%20%3F%3F%2016%3B%0A%20%20%20%20%20%20var%20bgColour%20%3D%20stylesToast%5B%22alert%22%5D.backgroundColour%20%3F%3F%20%22%232196F3%22%3B%0A%20%20%20%20%20%20var%20borderRadius%20%3D%20stylesToast%5B%22alert%22%5D.borderRadius%20%3F%3F%205%3B%0A%20%20%20%20%20%20var%20padding%20%3D%20stylesToast%5B%22alert%22%5D.padding%20%3F%3F%2020%3B%0A%20%20%20%20%20%20var%20fontColour%20%3D%20stylesToast%5B%22alert%22%5D.fontColour%20%3F%3F%20%22%23FFFFFF%22%3B%0A%0A%20%20%20%20%20%20var%20alertStyle%20%3D%20document.createElement(%22style%22)%3B%0A%20%20%20%20%20%20alertStyle.id%20%3D%20%22alertStyle%22%3B%0A%20%20%20%20%20%20alertStyle.textContent%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.alert%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20position%3A%20fixed%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20top%3A%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20left%3A%2050%25%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3A%20translate(-50%25%2C%20-50%25)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20padding%3A%20%24%7Bpadding%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20border-radius%3A%20%24%7BborderRadius%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20background-color%3A%20%24%7BbgColour%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3A%20%24%7BfontColour%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font-family%3A%20Arial%2C%20sans-serif%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20font-size%3A%20%24%7Bsize%7Dpx%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20z-index%3A%209999%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%200%3B%20%2F*%20Initially%20transparent%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20animation%3A%20fadeIn%200.5s%20ease-in%20forwards%3B%20%2F*%20Fade%20in%20animation%20*%2F%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40keyframes%20fadeIn%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20to%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%40keyframes%20fadeOut%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20from%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%201%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20to%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20opacity%3A%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%60%3B%0A%20%20%20%20%20%20document.head.appendChild(alertStyle)%3B%0A%0A%20%20%20%20%20%20var%20alert%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20alert.className%20%3D%20%60alert%20%24%7Btype%7D%60%3B%0A%20%20%20%20%20%20alert.textContent%20%3D%20text%3B%0A%20%20%20%20%20%20document.body.appendChild(alert)%3B%0A%0A%20%20%20%20%20%20if%20(toastConfig%5B%22soundWhenAlertEnabled%22%5D%20%3D%3D%20%22true%22)%20%7B%0A%20%20%20%20%20%20%20%20var%20audioLink%20%3D%0A%20%20%20%20%20%20%20%20%20%20stylesToast%5B%22alert%22%5D.soundLink%20%3F%3F%0A%20%20%20%20%20%20%20%20%20%20%22https%3A%2F%2Fruby-devs.vercel.app%2Fcdn%2Fappear.mp3%22%3B%0A%20%20%20%20%20%20%20%20var%20audio%20%3D%20new%20Audio(audioLink)%3B%0A%0A%20%20%20%20%20%20%20%20audio.play()%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%2F%2F%20Schedule%20removal%20of%20the%20alert%20after%20duration%0A%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20alert.style.animation%20%3D%20%22fadeOut%200.5s%20ease-out%20forwards%22%3B%20%2F%2F%20Apply%20fade-out%20animation%0A%20%20%20%20%20%20%20%20setTimeout(function%20()%20%7B%0A%20%20%20%20%20%20%20%20%20%20alert.remove()%3B%0A%20%20%20%20%20%20%20%20%20%20alertStyle.remove()%3B%0A%20%20%20%20%20%20%20%20%7D%2C%20500)%3B%20%2F%2F%20Wait%20for%20fade-out%20animation%20to%20complete%20before%20removing%0A%20%20%20%20%20%20%7D%2C%20duration%20*%201000)%3B%20%2F%2F%20Convert%20duration%20to%20milliseconds%0A%20%20%20%20%7D%0A%0A%20%20%20%20setStyleOfTo(args)%20%7B%0A%20%20%20%20%20%20const%20cast%20%3D%20Scratch.Cast%3B%0A%20%20%20%20%20%20const%20styleNumbers%20%3D%20%5B%22fontSize%22%2C%20%22borderRadius%22%2C%20%22padding%22%5D%3B%0A%0A%20%20%20%20%20%20var%20style%20%3D%20args.STYLE%3B%0A%20%20%20%20%20%20var%20alltypes%20%3D%20args.ALLTYPES%3B%0A%20%20%20%20%20%20var%20value%20%3D%20args.VALUE%3B%0A%0A%20%20%20%20%20%20if%20(value%20%3D%3D%20%22%22)%20%7B%0A%20%20%20%20%20%20%20%20value%20%3D%20null%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20if%20(styleNumbers.includes(style))%20%7B%0A%20%20%20%20%20%20%20%20stylesToast%5Balltypes%5D%5Bstyle%5D%20%3D%20cast.toNumber(value)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(style%20%3D%3D%20%22backgroundColour%22%20%7C%7C%20style%20%3D%3D%20%22fontColour%22)%20%7B%0A%20%20%20%20%20%20%20%20stylesToast%5Balltypes%5D%5Bstyle%5D%20%3D%20validColour(value)%20%3F%20value%20%3A%20null%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20stylesToast%5Balltypes%5D%5Bstyle%5D%20%3D%20value%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetStyleOf(args)%20%7B%0A%20%20%20%20%20%20const%20alltypes%20%3D%20args.ALLTYPES%3B%0A%20%20%20%20%20%20stylesToast%5Balltypes%5D%20%3D%20defaultStyles()%5Balltypes%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getStyleOf(args)%20%7B%0A%20%20%20%20%20%20const%20alltypes%20%3D%20args.ALLTYPES%3B%0A%20%20%20%20%20%20const%20style%20%3D%20stylesToast%5Balltypes%5D%3B%0A%20%20%20%20%20%20return%20style%20%3D%3D%20null%20%3F%20%22undefined%22%20%3A%20style%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getHexColour(args)%20%7B%0A%20%20%20%20%20%20return%20args.HEX%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setConfig(args)%20%7B%0A%20%20%20%20%20%20const%20configname%20%3D%20args.CONFIG%3B%0A%20%20%20%20%20%20toastConfig%5Bconfigname%5D%20%3D%20args.VALUE%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20ToastNotifsExt())%3B%0A%7D)(Scratch)%3B","https://extensions.turbowarp.org/Lily/ClonesPlus.js","data:application/javascript,var%20count%20%3D%200%0Avar%20isMeasure%20%3D%20false%0Avar%20time%20%3D%200%0A%0A%2F*%09This%20work%20is%20licensed%20under%20Creative%20Commons%20GNU%20LGPL%20License.%0A%0A%09License%3A%20http%3A%2F%2Fcreativecommons.org%2Flicenses%2FLGPL%2F2.1%2F%0A%20%20%20Version%3A%200.9%0A%09Author%3A%20%20Stefan%20Goessner%2F2006%0A%09Web%3A%20%20%20%20%20http%3A%2F%2Fgoessner.net%2F%20%0A*%2F%0Afunction%20xml2json(xml%2C%20tab)%20%7B%0A%20%20var%20X%20%3D%20%7B%0A%20%20%20%20%20toObj%3A%20function(xml)%20%7B%0A%20%20%20%20%20%20%20%20var%20o%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20%20%20if%20(xml.nodeType%3D%3D1)%20%7B%20%20%20%2F%2F%20element%20node%20..%0A%20%20%20%20%20%20%20%20%20%20%20if%20(xml.attributes.length)%20%20%20%2F%2F%20element%20with%20attributes%20%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%3D0%3B%20i%3Cxml.attributes.length%3B%20i%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%40%22%2Bxml.attributes%5Bi%5D.nodeName%5D%20%3D%20(xml.attributes%5Bi%5D.nodeValue%7C%7C%22%22).toString()%3B%0A%20%20%20%20%20%20%20%20%20%20%20if%20(xml.firstChild)%20%7B%20%2F%2F%20element%20has%20child%20nodes%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20textChild%3D0%2C%20cdataChild%3D0%2C%20hasElementChild%3Dfalse%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20n%3Dxml.firstChild%3B%20n%3B%20n%3Dn.nextSibling)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%3D%3D1)%20hasElementChild%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%3D%3D3%20%26%26%20n.nodeValue.match(%2F%5B%5E%20%5Cf%5Cn%5Cr%5Ct%5Cv%5D%2F))%20textChild%2B%2B%3B%20%2F%2F%20non-whitespace%20text%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%3D%3D4)%20cdataChild%2B%2B%3B%20%2F%2F%20cdata%20section%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(hasElementChild)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(textChild%20%3C%202%20%26%26%20cdataChild%20%3C%202)%20%7B%20%2F%2F%20structured%20element%20with%20evtl.%20a%20single%20text%20or%2Fand%20cdata%20node%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X.removeWhite(xml)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20n%3Dxml.firstChild%3B%20n%3B%20n%3Dn.nextSibling)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%20%3D%3D%203)%20%20%2F%2F%20text%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23text%22%5D%20%3D%20X.escape(n.nodeValue)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%204)%20%20%2F%2F%20cdata%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23cdata%22%5D%20%3D%20X.escape(n.nodeValue)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(o%5Bn.nodeName%5D)%20%7B%20%20%2F%2F%20multiple%20occurence%20of%20element%20..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(o%5Bn.nodeName%5D%20instanceof%20Array)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bn.nodeName%5D%5Bo%5Bn.nodeName%5D.length%5D%20%3D%20X.toObj(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bn.nodeName%5D%20%3D%20%5Bo%5Bn.nodeName%5D%2C%20X.toObj(n)%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%20%2F%2F%20first%20occurence%20of%20element..%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bn.nodeName%5D%20%3D%20X.toObj(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%7B%20%2F%2F%20mixed%20content%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!xml.attributes.length)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23text%22%5D%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(textChild)%20%7B%20%2F%2F%20pure%20text%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!xml.attributes.length)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23text%22%5D%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(cdataChild)%20%7B%20%2F%2F%20cdata%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(cdataChild%20%3E%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.escape(X.innerXml(xml))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20n%3Dxml.firstChild%3B%20n%3B%20n%3Dn.nextSibling)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5B%22%23cdata%22%5D%20%3D%20X.escape(n.nodeValue)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20if%20(!xml.attributes.length%20%26%26%20!xml.firstChild)%20o%20%3D%20null%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20(xml.nodeType%3D%3D9)%20%7B%20%2F%2F%20document.node%0A%20%20%20%20%20%20%20%20%20%20%20o%20%3D%20X.toObj(xml.documentElement)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20alert(%22unhandled%20node%20type%3A%20%22%20%2B%20xml.nodeType)%3B%0A%20%20%20%20%20%20%20%20return%20o%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20toJson%3A%20function(o%2C%20name%2C%20ind)%20%7B%0A%20%20%20%20%20%20%20%20var%20json%20%3D%20name%20%3F%20(%22%5C%22%22%2Bname%2B%22%5C%22%22)%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20if%20(o%20instanceof%20Array)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%3D0%2Cn%3Do.length%3B%20i%3Cn%3B%20i%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20o%5Bi%5D%20%3D%20X.toJson(o%5Bi%5D%2C%20%22%22%2C%20ind%2B%22%5Ct%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%3F%22%3A%5B%22%3A%22%5B%22)%20%2B%20(o.length%20%3E%201%20%3F%20(%22%5Cn%22%2Bind%2B%22%5Ct%22%2Bo.join(%22%2C%5Cn%22%2Bind%2B%22%5Ct%22)%2B%22%5Cn%22%2Bind)%20%3A%20o.join(%22%22))%20%2B%20%22%5D%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20(o%20%3D%3D%20null)%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%26%26%22%3A%22)%20%2B%20%22null%22%3B%0A%20%20%20%20%20%20%20%20else%20if%20(typeof(o)%20%3D%3D%20%22object%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20arr%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20for%20(var%20m%20in%20o)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20arr%5Barr.length%5D%20%3D%20X.toJson(o%5Bm%5D%2C%20m%2C%20ind%2B%22%5Ct%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%3F%22%3A%7B%22%3A%22%7B%22)%20%2B%20(arr.length%20%3E%201%20%3F%20(%22%5Cn%22%2Bind%2B%22%5Ct%22%2Barr.join(%22%2C%5Cn%22%2Bind%2B%22%5Ct%22)%2B%22%5Cn%22%2Bind)%20%3A%20arr.join(%22%22))%20%2B%20%22%7D%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%20if%20(typeof(o)%20%3D%3D%20%22string%22)%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%26%26%22%3A%22)%20%2B%20%22%5C%22%22%20%2B%20o.toString()%20%2B%20%22%5C%22%22%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20json%20%2B%3D%20(name%26%26%22%3A%22)%20%2B%20o.toString()%3B%0A%20%20%20%20%20%20%20%20return%20json%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20innerXml%3A%20function(node)%20%7B%0A%20%20%20%20%20%20%20%20var%20s%20%3D%20%22%22%0A%20%20%20%20%20%20%20%20if%20(%22innerHTML%22%20in%20node)%0A%20%20%20%20%20%20%20%20%20%20%20s%20%3D%20node.innerHTML%3B%0A%20%20%20%20%20%20%20%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20var%20asXml%20%3D%20function(n)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20s%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%20%3D%3D%201)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3C%22%20%2B%20n.nodeName%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20i%3D0%3B%20i%3Cn.attributes.length%3Bi%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%20%22%20%2B%20n.attributes%5Bi%5D.nodeName%20%2B%20%22%3D%5C%22%22%20%2B%20(n.attributes%5Bi%5D.nodeValue%7C%7C%22%22).toString()%20%2B%20%22%5C%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(n.firstChild)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(var%20c%3Dn.firstChild%3B%20c%3B%20c%3Dc.nextSibling)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20asXml(c)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3C%2F%22%2Bn.nodeName%2B%22%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%2F%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%203)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20n.nodeValue%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%204)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20%22%3C!%5BCDATA%5B%22%20%2B%20n.nodeValue%20%2B%20%22%5D%5D%3E%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20s%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20for%20(var%20c%3Dnode.firstChild%3B%20c%3B%20c%3Dc.nextSibling)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20s%20%2B%3D%20asXml(c)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20s%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20escape%3A%20function(txt)%20%7B%0A%20%20%20%20%20%20%20%20return%20txt.replace(%2F%5B%5C%5C%5D%2Fg%2C%20%22%5C%5C%5C%5C%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace(%2F%5B%5C%22%5D%2Fg%2C%20'%5C%5C%22')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace(%2F%5B%5Cn%5D%2Fg%2C%20'%5C%5Cn')%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.replace(%2F%5B%5Cr%5D%2Fg%2C%20'%5C%5Cr')%3B%0A%20%20%20%20%20%7D%2C%0A%20%20%20%20%20removeWhite%3A%20function(e)%20%7B%0A%20%20%20%20%20%20%20%20e.normalize()%3B%0A%20%20%20%20%20%20%20%20for%20(var%20n%20%3D%20e.firstChild%3B%20n%3B%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20if%20(n.nodeType%20%3D%3D%203)%20%7B%20%20%2F%2F%20text%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(!n.nodeValue.match(%2F%5B%5E%20%5Cf%5Cn%5Cr%5Ct%5Cv%5D%2F))%20%7B%20%2F%2F%20pure%20whitespace%20text%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20nxt%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20e.removeChild(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20nxt%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20else%20if%20(n.nodeType%20%3D%3D%201)%20%7B%20%20%2F%2F%20element%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X.removeWhite(n)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20else%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20any%20other%20node%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20n%20%3D%20n.nextSibling%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20return%20e%3B%0A%20%20%20%20%20%7D%0A%20%20%7D%3B%0A%20%20if%20(xml.nodeType%20%3D%3D%209)%20%2F%2F%20document%20node%0A%20%20%20%20%20xml%20%3D%20xml.documentElement%3B%0A%20%20var%20json%20%3D%20X.toJson(X.toObj(X.removeWhite(xml))%2C%20xml.nodeName%2C%20%22%5Ct%22)%3B%0A%20%20return%20%22%7B%5Cn%22%20%2B%20tab%20%2B%20(tab%20%3F%20json.replace(%2F%5Ct%2Fg%2C%20tab)%20%3A%20json.replace(%2F%5Ct%7C%5Cn%2Fg%2C%20%22%22))%20%2B%20%22%5Cn%7D%22%3B%0A%7D%0A%0Aclass%20RixxyX%20%7B%0A%20%20getInfo()%20%7B%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20color1%3A%20%22%23773c00%22%2C%0A%20%20%20%20%20%20color2%3A%20%22%235f3000%22%2C%0A%20%20%20%20%20%20id%3A%20%22RixxyX%22%2C%0A%20%20%20%20%20%20name%3A%20%22RixxyX%22%2C%0A%20%20%20%20%20%20description%3A%20'%5Bdeleted%5D'%2C%0A%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'notEquals'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT_1%5D%20!%3D%20%5BTEXT_2%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'TyruntX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'color'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'color%20%5BCOLOR%5D%20in%20hex'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.COLOR%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%23ff0000'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnTrue'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'true'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnFalse'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'false'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'ifElseString'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'if%20%5BBOOL%5D%20then%20%5BTEXT_1%5D%20else%20%5BTEXT_2%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BOOL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20''%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'TyruntX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'ifString'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'if%20%5BBOOL%5D%20then%20%5BTEXT%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BOOL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20''%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'extractTextBetweenToCharacters'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'extract%20text%20%5BTEXT%5D%20between%20%5BNUM_1%5D%20to%20%5BNUM_2%5D%20characters'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%206%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnString'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT%5D%20as%20text'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnObject'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'JavaScript%20object%20%5BOBJ_NAME%5D%20with%20value%20%5BOBJ_VAL%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20OBJ_NAME%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'String'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20OBJ_VAL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'isTheSameTypeAs'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT_1%5D%20is%20the%20same%20type%20as%20%5BTEXT_2%5D%3F'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_1%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT_2%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'reverseTxt'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'reverse%20text%20%5BTEXT%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'XyxxiR'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnCount'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'counter'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'incrementCountByNum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'increment%20counter%20by%20%5BNUM%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'decrementCountByNum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'decrement%20counter%20by%20%5BNUM%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'setCount'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'set%20counter%20to%20%5BNUM%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'toUppercase'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT%5D%20to%20uppercase'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'rixxyx'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'toLowercase'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BTEXT%5D%20to%20lowercase'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RIXXYX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'toCapitalize'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'capitalize%20%5BTEXT%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'rixxyX%20is%20cool%2C%20right%3F'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'isJsNan'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'is%20JavaScript%20NaN%20%5BOBJ%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20OBJ%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20NaN%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnNum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BNUM%5D%20as%20number'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnBool'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'%5BBOOL%5D%20as%20boolean'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BOOL%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'true'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'binToTxt'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'binary%20%5BBIN%5D%20to%20text'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20BIN%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'01010010%2001101001%2001111000%2001111000%2001111001%2001011000'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'txtToBin'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'text%20%5BTEXT%5D%20to%20binary'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'RixxyX'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'repeatTxtTimes'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'repeat%20text%20%5BTEXT%5D%20%5BNUM%5D%20times'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'x'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20NUM%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%202%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnJsCode'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'execute%20JavaScript%20code%20%5BJS_CODE%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20JS_CODE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%5C%22Ri%5C%22%20%2B%20%5C%22xx%5C%22%20%2B%20%5C%22yX%5C%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'jsonParse'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'JSON.parse(%5BTEXT%5D)'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%5C%22RixxyX%5C%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'execJsCode'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'execute%20JavaScript%20code%20%5BJS_CODE%5D'%2C%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20JS_CODE%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%20'%5C%22Ri%5C%22%20%2B%20%5C%22xx%5C%22%20%2B%20%5C%22yX%5C%22'%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20opcode%3A%20'returnENum'%2C%0A%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20text%3A%20'e'%2C%20%2F%2F%20e%0A%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%09%09%09%09%7B%0A%09%09%09%09%09opcode%3A%20'startTime'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%09%09%09%09text%3A%20'start%20measuring%20time'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%2C%0A%09%09%09%09%7B%0A%09%09%09%09%09opcode%3A%20'endTime'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%09%09%09%09text%3A%20'end%20measuring%20time'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%2C%0A%09%09%09%09%7B%0A%09%09%09%09%09opcode%3A%20'returnTime'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%09%09%09%09%09text%3A%20'time'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%2C%0A%20%20%20%20%20%20%20%20%7B%0A%09%09%09%09%09opcode%3A%20'forceFetch'%2C%0A%09%09%09%09%09blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%09%09%09%09%09text%3A%20'Force%20fetch%20modes'%2C%0A%09%09%09%09%09arguments%3A%20%7B%7D%0A%09%09%09%09%7D%0A%20%20%20%20%20%20%5D%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20notEquals(args)%20%7B%0A%20%20%20%20var%20isEquals%20%3D%20args.TEXT_1%20!%3D%20args.TEXT_2%3B%0A%20%20%20%20return%20isEquals%3B%0A%20%20%7D%0A%20%20color(args)%20%7B%0A%20%20%20%20return%20args.COLOR%3B%0A%20%20%7D%0A%20%20returnTrue(args)%20%7B%0A%20%20%20%20return%20true%3B%0A%20%20%7D%0A%20%20returnFalse(args)%20%7B%0A%20%20%20%20return%20false%3B%0A%20%20%7D%0A%20%20ifElseString(args)%20%7B%0A%20%20%20%20if%20(args.BOOL)%20%7B%0A%20%20%20%20%20%20return%20args.TEXT_1%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20args.TEXT_2%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20ifString(args)%20%7B%0A%20%20%20%20if%20(args.BOOL)%20%7B%0A%20%20%20%20%20%20return%20args.TEXT%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20extractTextBetweenToCharacters(args)%20%7B%0A%20%20%20%20var%20txt%20%3D%20args.TEXT.toString()%3B%0A%20%20%20%20var%20char1%20%3D%20args.NUM_1%20-%201%3B%0A%20%20%20%20var%20char2%20%3D%20args.NUM_2%3B%0A%20%20%20%20return%20txt.slice(char1%2C%20char2)%3B%0A%20%20%7D%0A%20%20returnString(args)%20%7B%0A%20%20%20%20return%20args.TEXT.toString()%3B%0A%20%20%7D%0A%20%20returnObject(args)%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20return%20eval(%22new%20%22%20%2B%20args.OBJ_NAME%20%2B%20%22(%5C%22%22%20%2B%20args.OBJ_VAL%20%2B%20%22%5C%22)%3B%22)%3B%0A%20%20%20%20%7D%20catch(err)%20%7B%0A%20%20%20%20%20%20return%20err%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20isTheSameTypeAs(args)%20%7B%0A%20%20%20%20return%20(typeof%20args.TEXT_1%20%3D%3D%20typeof%20args.TEXT_2)%3B%0A%20%20%7D%0A%20%20reverseTxt(args)%20%7B%0A%20%20%20%20var%20emptyStr%20%3D%20%22%22%3B%0A%20%20%20%20var%20txt%20%3D%20args.TEXT.toString()%3B%0A%20%20%20%20var%20localCount%20%3D%20args.TEXT.length%20-%201%3B%0A%20%20%20%20while%20(localCount%20!%3D%20-1)%20%7B%0A%20%20%20%20%20%20emptyStr%20%3D%20emptyStr%20%2B%20txt.charAt(localCount)%3B%0A%20%20%20%20%20%20localCount%20-%3D%201%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20emptyStr%3B%0A%20%20%7D%0A%20%20returnCount(args)%20%7B%0A%20%20%20%20return%20count%3B%0A%20%20%7D%0A%20%20incrementCountByNum(args)%20%7B%0A%20%20%20%20if%20((count.toString().indexOf(%22-%22)%20%3D%3D%20-1)%20%7C%7C%20(args.NUM.toString().indexOf(%22-%22)%20%3D%3D%20-1))%20%7B%0A%20%20%20%20%20%20count%20%2B%3D%20Math.floor(args.NUM)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20count%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20decrementCountByNum(args)%20%7B%0A%20%20%20%20if%20((count%20-%20Math.floor(args.NUM)).toString().indexOf(%22-%22)%20%3D%3D%20-1)%20%7B%0A%20%20%20%20%20%20count%20-%3D%20Math.floor(args.NUM)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20count%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20setCount(args)%20%7B%0A%20%20%20%20if%20((count.toString().indexOf(%22-%22)%20%3D%3D%20-1)%20%26%26%20(args.NUM.toString().indexOf(%22-%22)%20%3D%3D%20-1))%20%7B%0A%20%20%20%20%20%20count%20%3D%20Math.floor(args.NUM)%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20count%20%3D%200%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20toUppercase(args)%20%7B%0A%20%20%20%20return%20args.TEXT.toUpperCase()%3B%0A%20%20%7D%0A%20%20toLowercase(args)%20%7B%0A%20%20%20%20return%20args.TEXT.toLowerCase()%3B%0A%20%20%7D%0A%20%20toCapitalize(args)%20%7B%0A%20%20%20%20return%20args.TEXT.charAt(0).toUpperCase()%20%2B%20args.TEXT.slice(1)%3B%0A%20%20%7D%0A%20%20isJsNan(args)%20%7B%0A%20%20%20%20return%20isNaN(args.OBJ)%3B%0A%20%20%7D%0A%20%20returnNum(args)%20%7B%0A%20%20%20%20return%20Math.floor(args.NUM)%3B%0A%20%20%7D%0A%20%20returnBool(args)%20%7B%0A%20%20%20%20try%20%7B%0A%20%20%20%20%20%20if%20((JSON.parse(args.BOOL).toString()%20%3D%3D%20%22true%22)%20%7C%7C%20(JSON.parse(args.BOOL).toString()%20%3D%3D%20%22false%22))%20%7B%0A%20%20%20%20%20%20%20%20return%20JSON.parse(args.BOOL)%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(JSON.parse(args.BOOL).toString()%20%3D%3D%20%221%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(JSON.parse(args.BOOL).toString()%20%3D%3D%20%220%22)%20%7B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20return%20%22%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%20catch%20(err)%20%7B%0A%20%20%20%20%20%20return%20err%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20binToTxt(args)%20%7B%0A%20%20%20%20var%20binary%20%3D%20args.BIN.toString()%3B%0A%20%20%20%20return%20binary.split(%22%20%22).map((x)%20%3D%3E%20x%20%3D%20String.fromCharCode(parseInt(x%2C%202))).join(%22%22)%3B%0A%20%20%7D%0A%20%20txtToBin(args)%20%7B%0A%20%20%20%20var%20text%20%3D%20args.TEXT.toString()%3B%0A%20%20%20%20return%20Array.from(text).map((each)%3D%3Eeach.charCodeAt(0).toString(2)).join(%22%20%22)%3B%0A%20%20%7D%0A%20%20repeatTxtTimes(args)%20%7B%0A%20%20%20%20return%20args.TEXT.repeat(Math.floor(args.NUM))%3B%0A%20%20%7D%0A%20%20returnJsCode(args)%20%7B%0A%20%20%20%20var%20func%20%3D%20eval(args.JS_CODE)%3B%0A%20%20%20%20return%20func%3B%0A%20%20%7D%0A%20%20jsonParse(args)%20%7B%0A%20%20%20%20return%20JSON.parse(args.TEXT.toString())%3B%0A%20%20%7D%0A%20%20execJsCode(args)%20%7B%0A%20%20%20%20var%20func%20%3D%20new%20Function(args.JS_CODE)%3B%0A%20%20%7D%0A%20%20returnENum(args)%20%7B%0A%20%20%20%20return%20Math.E%0A%20%20%7D%0A%09startTime(args)%20%7B%0A%09%09time%20%3D%200%0A%09%09isMeasure%20%3D%20true%0A%09%7D%0A%09endTime(args)%20%7B%0A%09%09isMeasure%20%3D%20false%0A%09%7D%0A%09returnTime(args)%20%7B%0A%09%09if%20(isMeasure%20%3D%3D%20true)%20%7B%0A%09%09%09time%20%2B%3D%201%0A%09%09%7D%0A%09%09return%20time%0A%09%7D%0A%20%20forceFetch()%20%7B%0A%20%20%20%20Scratch.canFetch%20%3D%20function%20()%20%7B%0A%20%20%20%20%20return%20true%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%7D%0AScratch.extensions.register(new%20RixxyX())%3B","data:application/javascript,%2F%2F%20Name%3A%20Cloudlink%0A%2F%2F%20ID%3A%20cloudlink%0A%2F%2F%20Description%3A%20Powerful%20WebSocket%20extension%20for%20Scratch%203.%0A%2F%2F%20By%3A%20MikeDEV%0A%0A%2F%2F%20Copy%20of%20S4-0_nosuite.js%20as%20of%2010%2F31%2F2022%0A%2F*%20eslint-disable%20*%2F%0A%0A(function%20(Scratch)%20%7B%0A%09var%20servers%20%3D%20%7B%7D%3B%20%2F%2F%20Server%20list%0A%09let%20mWS%20%3D%20null%3B%0A%20%20%0A%09%2F%2F%20Get%20the%20server%20URL%20list%0A%09try%20%7B%0A%09%20%20Scratch.fetch(%0A%09%09%22https%3A%2F%2Fraw.githubusercontent.com%2FMikeDev101%2Fcloudlink%2Fmaster%2Fserverlist.json%22%0A%09%20%20)%0A%09%09.then((response)%20%3D%3E%20%7B%0A%09%09%20%20return%20response.text()%3B%0A%09%09%7D)%0A%09%09.then((data)%20%3D%3E%20%7B%0A%09%09%20%20servers%20%3D%20JSON.parse(data)%3B%0A%09%09%7D)%0A%09%09.catch((err)%20%3D%3E%20%7B%0A%09%09%20%20console.log(err)%3B%0A%09%09%20%20servers%20%3D%20%7B%7D%3B%0A%09%09%7D)%3B%0A%09%7D%20catch%20(err)%20%7B%0A%09%20%20console.log(err)%3B%0A%09%20%20servers%20%3D%20%7B%7D%3B%0A%09%7D%0A%20%20%0A%09function%20find_id(ID%2C%20ulist)%20%7B%0A%09%20%20%2F%2F%20Thanks%20StackOverflow!%0A%09%20%20if%20(jsonCheck(ID)%20%26%26%20!intCheck(ID))%20%7B%0A%09%09return%20ulist.some(%0A%09%09%20%20(o)%20%3D%3E%0A%09%09%09o.username%20%3D%3D%3D%20JSON.parse(ID).username%20%26%26%20o.id%20%3D%3D%20JSON.parse(ID).id%0A%09%09)%3B%0A%09%20%20%7D%20else%20%7B%0A%09%09return%20ulist.some((o)%20%3D%3E%20o.username%20%3D%3D%3D%20String(ID)%20%7C%7C%20o.id%20%3D%3D%20ID)%3B%0A%09%20%20%7D%0A%09%7D%0A%20%20%0A%09function%20jsonCheck(JSON_STRING)%20%7B%0A%09%20%20try%20%7B%0A%09%09JSON.parse(JSON_STRING)%3B%0A%09%09return%20true%3B%0A%09%20%20%7D%20catch%20(err)%20%7B%0A%09%09return%20false%3B%0A%09%20%20%7D%0A%09%7D%0A%20%20%0A%09function%20intCheck(value)%20%7B%0A%09%20%20return%20!isNaN(value)%3B%0A%09%7D%0A%20%20%0A%09function%20autoConvert(value)%20%7B%0A%09%20%20%2F%2F%20Check%20if%20the%20value%20is%20JSON%20%2F%20Dict%20first%0A%09%20%20try%20%7B%0A%09%09JSON.parse(value)%3B%0A%09%09return%20JSON.parse(value)%3B%0A%09%20%20%7D%20catch%20(err)%20%7B%7D%0A%20%20%0A%09%20%20%2F%2F%20Check%20if%20the%20value%20is%20an%20array%0A%09%20%20try%20%7B%0A%09%09tmp%20%3D%20value%3B%0A%09%09tmp%20%3D%20tmp.replace(%2F'%2Fg%2C%20'%22')%3B%0A%09%09JSON.parse(tmp)%3B%0A%09%09return%20JSON.parse(tmp)%3B%0A%09%20%20%7D%20catch%20(err)%20%7B%7D%0A%20%20%0A%09%20%20%2F%2F%20Check%20if%20an%20int%2Ffloat%0A%09%20%20if%20(!isNaN(value))%20%7B%0A%09%09return%20Number(value)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20%2F%2F%20Leave%20as%20the%20original%20value%20if%20none%20of%20the%20above%20work%0A%09%20%20return%20value%3B%0A%09%7D%0A%20%20%0A%09class%20CloudLink%20%7B%0A%09%20%20constructor(runtime%2C%20extensionId)%20%7B%0A%09%09%2F%2F%20Extension%20stuff%0A%09%09this.runtime%20%3D%20runtime%3B%0A%09%09this.cl_icon%20%3D%0A%09%09%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIyMjUuMzU0OCIgaGVpZ2h0PSIyMjUuMzU0OCIgdmlld0JveD0iMCwwLDIyNS4zNTQ4LDIyNS4zNTQ4Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTI3LjMyMjYsLTY3LjMyMjYpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0xMjcuMzIyNiwxODBjMCwtNjIuMjMwMDEgNTAuNDQ3MzksLTExMi42Nzc0IDExMi42Nzc0LC0xMTIuNjc3NGM2Mi4yMzAwMSwwIDExMi42Nzc0LDUwLjQ0NzM5IDExMi42Nzc0LDExMi42Nzc0YzAsNjIuMjMwMDEgLTUwLjQ0NzM5LDExMi42Nzc0IC0xMTIuNjc3NCwxMTIuNjc3NGMtNjIuMjMwMDEsMCAtMTEyLjY3NzQsLTUwLjQ0NzM5IC0xMTIuNjc3NCwtMTEyLjY3NzR6IiBmaWxsPSIjMDBjMjhjIiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS13aWR0aD0iMCIvPjxnIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLXdpZHRoPSIxIj48cGF0aCBkPSJNMjg2LjEyMDM3LDE1MC41NTc5NWMyMy4yNDA4NiwwIDQyLjA3ODksMTguODM5NDYgNDIuMDc4OSw0Mi4wNzg5YzAsMjMuMjM5NDQgLTE4LjgzODAzLDQyLjA3ODkgLTQyLjA3ODksNDIuMDc4OWgtOTIuMjQwNzRjLTIzLjI0MDg2LDAgLTQyLjA3ODksLTE4LjgzOTQ2IC00Mi4wNzg5LC00Mi4wNzg5YzAsLTIzLjIzOTQ0IDE4LjgzODAzLC00Mi4wNzg5IDQyLjA3ODksLTQyLjA3ODloNC4xODg4N2MxLjgxMTUzLC0yMS41NzA1NSAxOS44OTM1NywtMzguNTEyODkgNDEuOTMxNSwtMzguNTEyODljMjIuMDM3OTMsMCA0MC4xMTk5NywxNi45NDIzNCA0MS45MzE1LDM4LjUxMjg5eiIgZmlsbD0iI2ZmZmZmZiIvPjxwYXRoIGQ9Ik0yODkuMDg2NTUsMjEwLjM0MTE0djkuMDQ2NjdoLTI2LjkxNjYzaC05LjA0NjY3di05LjA0NjY3di01NC41MDMzOWg5LjA0NjY3djU0LjUwMzM5eiIgZmlsbD0iIzAwYzI4YyIvPjxwYXRoIGQ9Ik0yMjIuNDA5MjUsMjE5LjM4NzgxYy04LjM1MzIsMCAtMTYuMzY0MzEsLTMuMzE4MzQgLTIyLjI3MDksLTkuMjI0OTJjLTUuOTA2NjEsLTUuOTA2NTggLTkuMjI0OTEsLTEzLjkxNzY4IC05LjIyNDkxLC0yMi4yNzA4OWMwLC04LjM1MzIgMy4zMTgyOSwtMTYuMzY0MzEgOS4yMjQ5MSwtMjIuMjcwOWM1LjkwNjU5LC01LjkwNjYxIDEzLjkxNzcsLTkuMjI0OTEgMjIuMjcwOSwtOS4yMjQ5MWgyMS4xMDg5djguOTM0OThoLTIxLjEwODl2MC4xMDI1N2MtNS45NTYyOCwwIC0xMS42Njg2NCwyLjM2NjE2IC0xNS44ODAzNyw2LjU3Nzg5Yy00LjIxMTczLDQuMjExNzMgLTYuNTc3ODksOS45MjQwOCAtNi41Nzc4OSwxNS44ODAzN2MwLDUuOTU2MjggMi4zNjYxNiwxMS42Njg2NCA2LjU3Nzg5LDE1Ljg4MDM3YzQuMjExNzMsNC4yMTE3MyA5LjkyNDA4LDYuNTc3OTMgMTUuODgwMzcsNi41Nzc5M3YwLjEwMjUzaDIxLjEwODl2OC45MzQ5OHoiIGZpbGw9IiMwMGMyOGMiLz48L2c%2BPC9nPjwvZz48L3N2Zz48IS0tcm90YXRpb25DZW50ZXI6MTEyLjY3NzQwNDA4NDA4MzkyOjExMi42Nzc0MDQwODQwODQwMy0tPg%3D%3D%22%3B%0A%09%09this.cl_block%20%3D%0A%09%09%20%20%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNzYuMzk4NTQiIGhlaWdodD0iMTIyLjY3MDY5IiB2aWV3Qm94PSIwLDAsMTc2LjM5ODU0LDEyMi42NzA2OSI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE1MS44MDA3MywtMTE4LjY2NDY2KSI%2BPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2UtbGluZWNhcD0iYnV0dCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBzdHlsZT0ibWl4LWJsZW5kLW1vZGU6IG5vcm1hbCI%2BPGc%2BPHBhdGggZD0iTTI4Ni4xMjAzNywxNTcuMTc3NTVjMjMuMjQwODYsMCA0Mi4wNzg5LDE4LjgzOTQ2IDQyLjA3ODksNDIuMDc4OWMwLDIzLjIzOTQ0IC0xOC44MzgwMyw0Mi4wNzg5IC00Mi4wNzg5LDQyLjA3ODloLTkyLjI0MDc0Yy0yMy4yNDA4NiwwIC00Mi4wNzg5LC0xOC44Mzk0NiAtNDIuMDc4OSwtNDIuMDc4OWMwLC0yMy4yMzk0NCAxOC44MzgwMywtNDIuMDc4OSA0Mi4wNzg5LC00Mi4wNzg5aDQuMTg4ODdjMS44MTE1MywtMjEuNTcwNTUgMTkuODkzNTcsLTM4LjUxMjg5IDQxLjkzMTUsLTM4LjUxMjg5YzIyLjAzNzkzLDAgNDAuMTE5OTcsMTYuOTQyMzQgNDEuOTMxNSwzOC41MTI4OXoiIGZpbGw9IiNmZmZmZmYiLz48cGF0aCBkPSJNMjg5LjA4NjU1LDIxNi45NjA3NHY5LjA0NjY3aC0yNi45MTY2M2gtOS4wNDY2N3YtOS4wNDY2N3YtNTQuNTAzMzloOS4wNDY2N3Y1NC41MDMzOXoiIGZpbGw9IiMwMGMyOGMiLz48cGF0aCBkPSJNMjIyLjQwOTI1LDIyNi4wMDc0MWMtOC4zNTMyLDAgLTE2LjM2NDMxLC0zLjMxODM0IC0yMi4yNzA5LC05LjIyNDkyYy01LjkwNjYxLC01LjkwNjU4IC05LjIyNDkxLC0xMy45MTc2OCAtOS4yMjQ5MSwtMjIuMjcwODljMCwtOC4zNTMyIDMuMzE4MjksLTE2LjM2NDMxIDkuMjI0OTEsLTIyLjI3MDljNS45MDY1OSwtNS45MDY2MSAxMy45MTc3LC05LjIyNDkxIDIyLjI3MDksLTkuMjI0OTFoMjEuMTA4OXY4LjkzNDk4aC0yMS4xMDg5djAuMTAyNTdjLTUuOTU2MjgsMCAtMTEuNjY4NjQsMi4zNjYxNiAtMTUuODgwMzcsNi41Nzc4OWMtNC4yMTE3Myw0LjIxMTczIC02LjU3Nzg5LDkuOTI0MDggLTYuNTc3ODksMTUuODgwMzdjMCw1Ljk1NjI4IDIuMzY2MTYsMTEuNjY4NjQgNi41Nzc4OSwxNS44ODAzN2M0LjIxMTczLDQuMjExNzMgOS45MjQwOCw2LjU3NzkzIDE1Ljg4MDM3LDYuNTc3OTN2MC4xMDI1M2gyMS4xMDg5djguOTM0OTh6IiBmaWxsPSIjMDBjMjhjIi8%2BPC9nPjwvZz48L2c%2BPC9zdmc%2BPCEtLXJvdGF0aW9uQ2VudGVyOjg4LjE5OTI2OTk5OTk5OTk4OjYxLjMzNTM0NDk5OTk5OTk5LS0%2B%22%3B%0A%20%20%0A%09%09%2F%2F%20Socket%20data%0A%09%09this.socketData%20%3D%20%7B%0A%09%09%20%20gmsg%3A%20%5B%5D%2C%0A%09%09%20%20pmsg%3A%20%5B%5D%2C%0A%09%09%20%20direct%3A%20%5B%5D%2C%0A%09%09%20%20statuscode%3A%20%5B%5D%2C%0A%09%09%20%20gvar%3A%20%5B%5D%2C%0A%09%09%20%20pvar%3A%20%5B%5D%2C%0A%09%09%20%20motd%3A%20%22%22%2C%0A%09%09%20%20client_ip%3A%20%22%22%2C%0A%09%09%20%20ulist%3A%20%5B%5D%2C%0A%09%09%20%20server_version%3A%20%22%22%2C%0A%09%09%7D%3B%0A%09%09this.varData%20%3D%20%7B%0A%09%09%20%20gvar%3A%20%7B%7D%2C%0A%09%09%20%20pvar%3A%20%7B%7D%2C%0A%09%09%7D%3B%0A%20%20%0A%09%09this.queueableCmds%20%3D%20%5B%0A%09%09%20%20%22gmsg%22%2C%0A%09%09%20%20%22pmsg%22%2C%0A%09%09%20%20%22gvar%22%2C%0A%09%09%20%20%22pvar%22%2C%0A%09%09%20%20%22direct%22%2C%0A%09%09%20%20%22statuscode%22%2C%0A%09%09%5D%3B%0A%09%09this.varCmds%20%3D%20%5B%22gvar%22%2C%20%22pvar%22%5D%3B%0A%20%20%0A%09%09%2F%2F%20Listeners%0A%09%09this.socketListeners%20%3D%20%7B%7D%3B%0A%09%09this.socketListenersData%20%3D%20%7B%7D%3B%0A%09%09this.newSocketData%20%3D%20%7B%0A%09%09%20%20gmsg%3A%20false%2C%0A%09%09%20%20pmsg%3A%20false%2C%0A%09%09%20%20direct%3A%20false%2C%0A%09%09%20%20statuscode%3A%20false%2C%0A%09%09%20%20gvar%3A%20false%2C%0A%09%09%20%20pvar%3A%20false%2C%0A%09%09%7D%3B%0A%20%20%0A%09%09%2F%2F%20Edge-triggered%20hat%20blocks%0A%09%09this.connect_hat%20%3D%200%3B%0A%09%09this.packet_hat%20%3D%200%3B%0A%09%09this.close_hat%20%3D%200%3B%0A%20%20%0A%09%09%2F%2F%20Status%20stuff%0A%09%09this.isRunning%20%3D%20false%3B%0A%09%09this.isLinked%20%3D%20false%3B%0A%09%09this.version%20%3D%20%22S4.0%22%3B%0A%09%09this.link_status%20%3D%200%3B%0A%09%09this.username%20%3D%20%22%22%3B%0A%09%09this.tmp_username%20%3D%20%22%22%3B%0A%09%09this.isUsernameSyncing%20%3D%20false%3B%0A%09%09this.isUsernameSet%20%3D%20false%3B%0A%09%09this.disconnectWasClean%20%3D%20false%3B%0A%09%09this.wasConnectionDropped%20%3D%20false%3B%0A%09%09this.didConnectionFail%20%3D%20false%3B%0A%09%09this.protocolOk%20%3D%20false%3B%0A%20%20%0A%09%09%2F%2F%20Listeners%20stuff%0A%09%09this.enableListener%20%3D%20false%3B%0A%09%09this.setListener%20%3D%20%22%22%3B%0A%20%20%0A%09%09%2F%2F%20Rooms%20stuff%0A%09%09this.enableRoom%20%3D%20false%3B%0A%09%09this.isRoomSetting%20%3D%20false%3B%0A%09%09this.selectRoom%20%3D%20%22%22%3B%0A%20%20%0A%09%09%2F%2F%20Remapping%20stuff%0A%09%09this.menuRemap%20%3D%20%7B%0A%09%09%20%20%22Global%20data%22%3A%20%22gmsg%22%2C%0A%09%09%20%20%22Private%20data%22%3A%20%22pmsg%22%2C%0A%09%09%20%20%22Global%20variables%22%3A%20%22gvar%22%2C%0A%09%09%20%20%22Private%20variables%22%3A%20%22pvar%22%2C%0A%09%09%20%20%22Direct%20data%22%3A%20%22direct%22%2C%0A%09%09%20%20%22Status%20code%22%3A%20%22statuscode%22%2C%0A%09%09%20%20%22All%20data%22%3A%20%22all%22%2C%0A%09%09%7D%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getInfo()%20%7B%0A%09%09return%20%7B%0A%09%09%20%20id%3A%20%22cloudlink%22%2C%0A%09%09%20%20name%3A%20%22CloudLink%22%2C%0A%09%09%20%20blockIconURI%3A%20this.cl_block%2C%0A%09%09%20%20menuIconURI%3A%20this.cl_icon%2C%0A%09%09%20%20docsURI%3A%20%22https%3A%2F%2Fhackmd.io%2F%40MikeDEV%2FHJiNYwOfo%22%2C%0A%09%09%20%20blocks%3A%20%5B%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnGlobalData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Global%20data%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnPrivateData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Private%20data%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnDirectData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Direct%20Data%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnLinkData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Link%20status%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnStatusCode%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Status%20code%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnUserListData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Usernames%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnUsernameData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22My%20username%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnVersionData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Extension%20version%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnServerVersion%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Server%20version%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnServerList%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Server%20list%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnMOTD%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Server%20MOTD%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnClientIP%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22My%20IP%20address%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnListenerData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Response%20for%20listener%20%5BID%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22readQueueSize%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Size%20of%20queue%20for%20%5BTYPE%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22allmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22All%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22readQueueData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Packet%20queue%20for%20%5BTYPE%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22allmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22All%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnVarData%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22%5BTYPE%5D%20%5BVAR%5D%20data%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22parseJSON%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22%5BPATH%5D%20of%20%5BJSON_STRING%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09PATH%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22fruit%2Fapples%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09JSON_STRING%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%0A%09%09%09%09%09'%7B%22fruit%22%3A%20%7B%22apples%22%3A%202%2C%20%22bananas%22%3A%203%7D%2C%20%22total_fruit%22%3A%205%7D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getFromJSONArray%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Get%20%5BNUM%5D%20from%20JSON%20array%20%5BARRAY%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09NUM%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22number%22%2C%0A%09%09%09%09%20%20defaultValue%3A%200%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ARRAY%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%5B%22foo%22%2C%22bar%22%5D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22fetchURL%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20text%3A%20%22Fetch%20data%20from%20URL%20%5Burl%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09url%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fhello.txt%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22requestURL%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20request%20with%20method%20%5Bmethod%5D%20for%20URL%20%5Burl%5D%20with%20data%20%5Bdata%5D%20and%20headers%20%5Bheaders%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09method%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22GET%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09url%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2Fhello.txt%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09data%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22%7B%7D%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09headers%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22%7B%7D%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22makeJSON%22%2C%0A%09%09%09%20%20blockType%3A%20%22reporter%22%2C%0A%09%09%09%20%20text%3A%20%22Convert%20%5BtoBeJSONified%5D%20to%20JSON%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09toBeJSONified%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%7B%22test%22%3A%20true%7D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onConnect%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20connected%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onClose%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20disconnected%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20I%20receive%20new%20packet%20with%20listener%20%5BID%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onNewPacket%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20I%20receive%20new%20%5BTYPE%5D%20packet%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22almostallmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22onNewVar%22%2C%0A%09%09%09%20%20blockType%3A%20%22hat%22%2C%0A%09%09%09%20%20text%3A%20%22When%20I%20receive%20new%20%5BTYPE%5D%20data%20for%20%5BVAR%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getComState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Connected%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getRoomState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Linked%20to%20rooms%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getComLostConnectionState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Lost%20connection%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getComFailedConnectionState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Failed%20to%20connnect%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22getUsernameState%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Username%20synced%3F%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnIsNewData%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Got%20New%20%5BTYPE%5D%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22datamenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnIsNewVarData%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Got%20New%20%5BTYPE%5D%20data%20for%20variable%20%5BVAR%5D%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22returnIsNewListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Got%20new%20packet%20with%20listener%20%5BID%5D%3F%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22checkForID%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22ID%20%5BID%5D%20connected%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Another%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22isValidJSON%22%2C%0A%09%09%09%20%20blockType%3A%20%22Boolean%22%2C%0A%09%09%09%20%20text%3A%20%22Is%20%5BJSON_STRING%5D%20valid%20JSON%3F%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09JSON_STRING%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%0A%09%09%09%09%09'%7B%22fruit%22%3A%20%7B%22apples%22%3A%202%2C%20%22bananas%22%3A%203%7D%2C%20%22total_fruit%22%3A%205%7D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22openSocket%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Connect%20to%20%5BIP%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09IP%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22ws%3A%2F%2F127.0.0.1%3A3000%2F%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22openSocketPublicServers%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Connect%20to%20server%20%5BID%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22number%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22closeSocket%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20text%3A%20%22Disconnect%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22setMyName%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Set%20%5BNAME%5D%20as%20username%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09NAME%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22A%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22createListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Attach%20listener%20%5BID%5D%20to%20next%20packet%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22linkToRooms%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Link%20to%20room(s)%20%5BROOMS%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ROOMS%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%5B%22test%22%5D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22selectRoomsInNextPacket%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Select%20room(s)%20%5BROOMS%5D%20for%20next%20packet%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ROOMS%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20'%5B%22test%22%5D'%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22unlinkFromRooms%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Unlink%20from%20all%20rooms%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendGData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendPData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20%5BDATA%5D%20to%20%5BID%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Another%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendGDataAsVar%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20variable%20%5BVAR%5D%20with%20data%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Banana%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22sendPDataAsVar%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20variable%20%5BVAR%5D%20to%20%5BID%5D%20with%20data%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Banana%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Another%20name%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22runCMDnoID%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20command%20without%20ID%20%5BCMD%5D%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09CMD%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22direct%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22val%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22runCMD%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Send%20command%20%5BCMD%5D%20%5BID%5D%20%5BDATA%5D%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09CMD%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22direct%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22id%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09DATA%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22val%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22resetNewData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Reset%20got%20new%20%5BTYPE%5D%20status%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22datamenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22resetNewVarData%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Reset%20got%20new%20%5BTYPE%5D%20%5BVAR%5D%20status%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22varmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Global%20variables%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%09VAR%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22Apple%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22resetNewListener%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Reset%20got%20new%20%5BID%5D%20listener%20status%22%2C%0A%09%09%09%20%20blockAllThreads%3A%20%22true%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09ID%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22example-listener%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%09%7B%0A%09%09%09%20%20opcode%3A%20%22clearAllPackets%22%2C%0A%09%09%09%20%20blockType%3A%20%22command%22%2C%0A%09%09%09%20%20text%3A%20%22Clear%20all%20packets%20for%20%5BTYPE%5D%22%2C%0A%09%09%09%20%20arguments%3A%20%7B%0A%09%09%09%09TYPE%3A%20%7B%0A%09%09%09%09%20%20type%3A%20%22string%22%2C%0A%09%09%09%09%20%20menu%3A%20%22allmenu%22%2C%0A%09%09%09%09%20%20defaultValue%3A%20%22All%20data%22%2C%0A%09%09%09%09%7D%2C%0A%09%09%09%20%20%7D%2C%0A%09%09%09%7D%2C%0A%09%09%20%20%5D%2C%0A%09%09%20%20menus%3A%20%7B%0A%09%09%09coms%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%22Connected%22%2C%20%22Username%20synced%22%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09datamenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%0A%09%09%09%09%22Global%20data%22%2C%0A%09%09%09%09%22Private%20data%22%2C%0A%09%09%09%09%22Direct%20data%22%2C%0A%09%09%09%09%22Status%20code%22%2C%0A%09%09%09%20%20%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09varmenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%22Global%20variables%22%2C%20%22Private%20variables%22%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09allmenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%0A%09%09%09%09%22Global%20data%22%2C%0A%09%09%09%09%22Private%20data%22%2C%0A%09%09%09%09%22Direct%20data%22%2C%0A%09%09%09%09%22Status%20code%22%2C%0A%09%09%09%09%22Global%20variables%22%2C%0A%09%09%09%09%22Private%20variables%22%2C%0A%09%09%09%09%22All%20data%22%2C%0A%09%09%09%20%20%5D%2C%0A%09%09%09%7D%2C%0A%09%09%09almostallmenu%3A%20%7B%0A%09%09%09%20%20items%3A%20%5B%0A%09%09%09%09%22Global%20data%22%2C%0A%09%09%09%09%22Private%20data%22%2C%0A%09%09%09%09%22Direct%20data%22%2C%0A%09%09%09%09%22Status%20code%22%2C%0A%09%09%09%09%22Global%20variables%22%2C%0A%09%09%09%09%22Private%20variables%22%2C%0A%09%09%09%20%20%5D%2C%0A%09%09%09%7D%2C%0A%09%09%20%20%7D%2C%0A%09%09%7D%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20%2F%2F%20Code%20for%20blocks%20go%20here%0A%20%20%0A%09%20%20returnGlobalData()%20%7B%0A%09%09if%20(this.socketData.gmsg.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%20this.socketData.gmsg%5Bthis.socketData.gmsg.length%20-%201%5D.val%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnPrivateData()%20%7B%0A%09%09if%20(this.socketData.pmsg.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%20this.socketData.pmsg%5Bthis.socketData.pmsg.length%20-%201%5D.val%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnDirectData()%20%7B%0A%09%09if%20(this.socketData.direct.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%0A%09%09%09this.socketData.direct%5Bthis.socketData.direct.length%20-%201%5D.val%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnLinkData()%20%7B%0A%09%09return%20String(this.link_status)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnStatusCode()%20%7B%0A%09%09if%20(this.socketData.statuscode.length%20!%3D%200)%20%7B%0A%09%09%20%20let%20data%20%3D%0A%09%09%09this.socketData.statuscode%5Bthis.socketData.statuscode.length%20-%201%5D%0A%09%09%09%20%20.code%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnUserListData()%20%7B%0A%09%09return%20JSON.stringify(this.socketData.ulist)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnUsernameData()%20%7B%0A%09%09let%20data%20%3D%20this.username%3B%0A%20%20%0A%09%09if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%20%20data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%7D%0A%20%20%0A%09%09return%20data%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnVersionData()%20%7B%0A%09%09return%20String(this.version)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnServerVersion()%20%7B%0A%09%09return%20String(this.socketData.server_version)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnServerList()%20%7B%0A%09%09return%20JSON.stringify(servers)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnMOTD()%20%7B%0A%09%09return%20String(this.socketData.motd)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnClientIP()%20%7B%0A%09%09return%20String(this.socketData.client_ip)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnListenerData(%7B%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning%20%26%26%20this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%20%20return%20JSON.stringify(this.socketListenersData%5BID%5D)%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%7B%7D%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20readQueueSize(%7B%20TYPE%20%7D)%20%7B%0A%09%09if%20(this.menuRemap%5BString(TYPE)%5D%20%3D%3D%20%22all%22)%20%7B%0A%09%09%20%20let%20tmp_size%20%3D%200%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.gmsg.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.pmsg.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.direct.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.statuscode.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.gvar.length%3B%0A%09%09%20%20tmp_size%20%3D%20tmp_size%20%2B%20this.socketData.pvar.length%3B%0A%09%09%20%20return%20tmp_size%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20this.socketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D.length%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20readQueueData(%7B%20TYPE%20%7D)%20%7B%0A%09%09if%20(this.menuRemap%5BString(TYPE)%5D%20%3D%3D%20%22all%22)%20%7B%0A%09%09%20%20let%20tmp_socketData%20%3D%20JSON.parse(JSON.stringify(this.socketData))%3B%20%2F%2F%20Deep%20copy%0A%20%20%0A%09%09%20%20delete%20tmp_socketData.motd%3B%0A%09%09%20%20delete%20tmp_socketData.client_ip%3B%0A%09%09%20%20delete%20tmp_socketData.ulist%3B%0A%09%09%20%20delete%20tmp_socketData.server_version%3B%0A%20%20%0A%09%09%20%20return%20JSON.stringify(tmp_socketData)%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20JSON.stringify(this.socketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnVarData(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20return%20this.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.value%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20return%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20%22%22%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20parseJSON(%7B%20PATH%2C%20JSON_STRING%20%7D)%20%7B%0A%09%09try%20%7B%0A%09%09%20%20const%20path%20%3D%20PATH.toString()%0A%09%09%09.split(%22%2F%22)%0A%09%09%09.map((prop)%20%3D%3E%20decodeURIComponent(prop))%3B%0A%09%09%20%20if%20(path%5B0%5D%20%3D%3D%3D%20%22%22)%20path.splice(0%2C%201)%3B%0A%09%09%20%20if%20(path%5Bpath.length%20-%201%5D%20%3D%3D%3D%20%22%22)%20path.splice(-1%2C%201)%3B%0A%09%09%20%20let%20json%3B%0A%09%09%20%20try%20%7B%0A%09%09%09json%20%3D%20JSON.parse(%22%20%22%20%2B%20JSON_STRING)%3B%0A%09%09%20%20%7D%20catch%20(e)%20%7B%0A%09%09%09return%20e.message%3B%0A%09%09%20%20%7D%0A%09%09%20%20path.forEach((prop)%20%3D%3E%20(json%20%3D%20json%5Bprop%5D))%3B%0A%09%09%20%20if%20(json%20%3D%3D%3D%20null)%20return%20%22null%22%3B%0A%09%09%20%20else%20if%20(json%20%3D%3D%3D%20undefined)%20return%20%22%22%3B%0A%09%09%20%20else%20if%20(typeof%20json%20%3D%3D%3D%20%22object%22)%20return%20JSON.stringify(json)%3B%0A%09%09%20%20else%20return%20json.toString()%3B%0A%09%09%7D%20catch%20(err)%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20getFromJSONArray(%7B%20NUM%2C%20ARRAY%20%7D)%20%7B%0A%09%09var%20json_array%20%3D%20JSON.parse(ARRAY)%3B%0A%09%09if%20(json_array%5BNUM%5D%20%3D%3D%20%22undefined%22)%20%7B%0A%09%09%20%20return%20%22%22%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20let%20data%20%3D%20json_array%5BNUM%5D%3B%0A%20%20%0A%09%09%20%20if%20(typeof%20data%20%3D%3D%20%22object%22)%20%7B%0A%09%09%09data%20%3D%20JSON.stringify(data)%3B%20%2F%2F%20Make%20the%20JSON%20safe%20for%20Scratch%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20return%20data%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20fetchURL(args)%20%7B%0A%09%09return%20Scratch.fetch(args.url%2C%20%7B%0A%09%09%20%20method%3A%20%22GET%22%2C%0A%09%09%7D).then((response)%20%3D%3E%20response.text())%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20requestURL(args)%20%7B%0A%09%09if%20(args.method%20%3D%3D%20%22GET%22%20%7C%7C%20args.method%20%3D%3D%20%22HEAD%22)%20%7B%0A%09%09%20%20return%20Scratch.fetch(args.url%2C%20%7B%0A%09%09%09method%3A%20args.method%2C%0A%09%09%09headers%3A%20JSON.parse(args.headers)%2C%0A%09%09%20%20%7D).then((response)%20%3D%3E%20response.text())%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20Scratch.fetch(args.url%2C%20%7B%0A%09%09%09method%3A%20args.method%2C%0A%09%09%09headers%3A%20JSON.parse(args.headers)%2C%0A%09%09%09body%3A%20JSON.parse(args.data)%2C%0A%09%09%20%20%7D).then((response)%20%3D%3E%20response.text())%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20isValidJSON(%7B%20JSON_STRING%20%7D)%20%7B%0A%09%09return%20jsonCheck(JSON_STRING)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20makeJSON(%7B%20toBeJSONified%20%7D)%20%7B%0A%09%09if%20(typeof%20toBeJSONified%20%3D%3D%20%22string%22)%20%7B%0A%09%09%20%20try%20%7B%0A%09%09%09JSON.parse(toBeJSONified)%3B%0A%09%09%09return%20String(toBeJSONified)%3B%0A%09%09%20%20%7D%20catch%20(err)%20%7B%0A%09%09%09return%20%22Not%20JSON!%22%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20if%20(typeof%20toBeJSONified%20%3D%3D%20%22object%22)%20%7B%0A%09%09%20%20return%20JSON.stringify(toBeJSONified)%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20%22Not%20JSON!%22%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onConnect()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(self.connect_hat%20%3D%3D%200%20%26%26%20self.isRunning%20%26%26%20self.protocolOk)%20%7B%0A%09%09%20%20self.connect_hat%20%3D%201%3B%0A%09%09%20%20return%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onClose()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(self.close_hat%20%3D%3D%200%20%26%26%20!self.isRunning)%20%7B%0A%09%09%20%20self.close_hat%20%3D%201%3B%0A%09%09%20%20return%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onListener(%7B%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning%20%26%26%20this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%20%20if%20(self.socketListeners%5BString(ID)%5D)%20%7B%0A%09%09%09self.socketListeners%5BString(ID)%5D%20%3D%20false%3B%0A%09%09%09return%20true%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onNewPacket(%7B%20TYPE%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning%20%26%26%20this.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D)%20%7B%0A%09%09%20%20self.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%20%3D%20false%3B%0A%09%09%20%20return%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20onNewVar(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew)%20%7B%0A%09%09%09%09self.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew%20%3D%20false%3B%0A%09%09%09%09return%20true%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09return%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20return%20false%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20getComState()%20%7B%0A%09%09return%20String(this.link_status%20%3D%3D%202%20%7C%7C%20this.protocolOk)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getRoomState()%20%7B%0A%09%09return%20this.isLinked%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getComLostConnectionState()%20%7B%0A%09%09return%20this.wasConnectionDropped%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getComFailedConnectionState()%20%7B%0A%09%09return%20this.didConnectionFail%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20getUsernameState()%20%7B%0A%09%09return%20this.isUsernameSet%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnIsNewData(%7B%20TYPE%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20return%20this.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnIsNewVarData(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20return%20this.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20return%20false%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20returnIsNewListener(%7B%20ID%20%7D)%20%7B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%09return%20this.socketListeners%5BID%5D%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09return%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20return%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20checkForID(%7B%20ID%20%7D)%20%7B%0A%09%09return%20find_id(ID%2C%20this.socketData.ulist)%3B%0A%09%20%20%7D%0A%20%20%0A%09%20%20async%20openSocket(%7B%20IP%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(!self.isRunning)%20%7B%0A%09%09%20%20if%20(!(await%20Scratch.canFetch(IP)))%20%7B%0A%09%09%09return%3B%0A%09%09%20%20%7D%0A%20%20%0A%09%09%20%20console.log(%22Starting%20socket.%22)%3B%0A%09%09%20%20self.link_status%20%3D%201%3B%0A%20%20%0A%09%09%20%20self.disconnectWasClean%20%3D%20false%3B%0A%09%09%20%20self.wasConnectionDropped%20%3D%20false%3B%0A%09%09%20%20self.didConnectionFail%20%3D%20false%3B%0A%20%20%0A%09%09%20%20mWS%20%3D%20new%20WebSocket(String(IP))%3B%0A%20%20%0A%09%09%20%20mWS.onerror%20%3D%20function%20()%20%7B%0A%09%09%09self.isRunning%20%3D%20false%3B%0A%09%09%20%20%7D%3B%0A%20%20%0A%09%09%20%20mWS.onopen%20%3D%20function%20()%20%7B%0A%09%09%09self.isRunning%20%3D%20true%3B%0A%09%09%09self.packet_queue%20%3D%20%7B%7D%3B%0A%09%09%09self.link_status%20%3D%202%3B%0A%20%20%0A%09%09%09%2F%2F%20Send%20the%20handshake%20request%20to%20get%20server%20to%20detect%20client%20protocol%0A%09%09%09mWS.send(%0A%09%09%09%20%20JSON.stringify(%7B%20cmd%3A%20%22handshake%22%2C%20listener%3A%20%22setprotocol%22%20%7D)%0A%09%09%09)%3B%0A%20%20%0A%09%09%09console.log(%22Successfully%20opened%20socket.%22)%3B%0A%09%09%20%20%7D%3B%0A%20%20%0A%09%09%20%20mWS.onmessage%20%3D%20function%20(event)%20%7B%0A%09%09%09let%20tmp_socketData%20%3D%20JSON.parse(event.data)%3B%0A%09%09%09console.log(%22RX%3A%22%2C%20tmp_socketData)%3B%0A%20%20%0A%09%09%09if%20(self.queueableCmds.includes(tmp_socketData.cmd))%20%7B%0A%09%09%09%20%20self.socketData%5Btmp_socketData.cmd%5D.push(tmp_socketData)%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20if%20(tmp_socketData.cmd%20%3D%3D%20%22ulist%22)%20%7B%0A%09%09%09%09%2F%2F%20ulist%20functionality%20has%20been%20changed%20in%20server%200.1.9%0A%09%09%09%09if%20(tmp_socketData.hasOwnProperty(%22mode%22))%20%7B%0A%09%09%09%09%20%20if%20(tmp_socketData.mode%20%3D%3D%20%22set%22)%20%7B%0A%09%09%09%09%09self.socketData%5B%22ulist%22%5D%20%3D%20tmp_socketData.val%3B%0A%09%09%09%09%20%20%7D%20else%20if%20(tmp_socketData.mode%20%3D%3D%20%22add%22)%20%7B%0A%09%09%09%09%09if%20(%0A%09%09%09%09%09%20%20!self.socketData.ulist.some(%0A%09%09%09%09%09%09(o)%20%3D%3E%0A%09%09%09%09%09%09%20%20o.username%20%3D%3D%3D%20tmp_socketData.val.username%20%26%26%0A%09%09%09%09%09%09%20%20o.id%20%3D%3D%20tmp_socketData.val.id%0A%09%09%09%09%09%20%20)%0A%09%09%09%09%09)%20%7B%0A%09%09%09%09%09%20%20self.socketData%5B%22ulist%22%5D.push(tmp_socketData.val)%3B%0A%09%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%09%22Could%20not%20perform%20ulist%20method%20add%2C%20client%22%2C%0A%09%09%09%09%09%09tmp_socketData.val%2C%0A%09%09%09%09%09%09%22already%20exists%22%0A%09%09%09%09%09%20%20)%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%20%20%7D%20else%20if%20(tmp_socketData.mode%20%3D%3D%20%22remove%22)%20%7B%0A%09%09%09%09%09if%20(%0A%09%09%09%09%09%20%20self.socketData.ulist.some(%0A%09%09%09%09%09%09(o)%20%3D%3E%0A%09%09%09%09%09%09%20%20o.username%20%3D%3D%3D%20tmp_socketData.val.username%20%26%26%0A%09%09%09%09%09%09%20%20o.id%20%3D%3D%20tmp_socketData.val.id%0A%09%09%09%09%09%20%20)%0A%09%09%09%09%09)%20%7B%0A%09%09%09%09%09%20%20%2F%2F%20This%20is%20by%20far%20the%20fugliest%20thing%20I%20have%20ever%20written%20in%20JS%2C%20or%20in%20any%20programming%20language...%20thanks%20I%20hate%20it%0A%09%09%09%09%09%20%20self.socketData%5B%22ulist%22%5D%20%3D%20self.socketData%5B%22ulist%22%5D.filter(%0A%09%09%09%09%09%09(user)%20%3D%3E%0A%09%09%09%09%09%09%20%20!(user.username%20%3D%3D%3D%20tmp_socketData.val.username)%20%26%26%0A%09%09%09%09%09%09%20%20!(user.id%20%3D%3D%20tmp_socketData.val.id)%0A%09%09%09%09%09%20%20)%3B%0A%09%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%09%22Could%20not%20perform%20ulist%20method%20remove%2C%20client%22%2C%0A%09%09%09%09%09%09tmp_socketData.val%2C%0A%09%09%09%09%09%09%22was%20not%20found%22%0A%09%09%09%09%09%20%20)%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09%09console.log(%0A%09%09%09%09%09%20%20%22Could%20not%20understand%20ulist%20method%3A%22%2C%0A%09%09%09%09%09%20%20tmp_socketData.mode%0A%09%09%09%09%09)%3B%0A%09%09%09%09%20%20%7D%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20%2F%2F%20Retain%20compatibility%20wtih%20existing%20servers%0A%09%09%09%09%20%20self.socketData%5B%22ulist%22%5D%20%3D%20tmp_socketData.val%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09self.socketData%5Btmp_socketData.cmd%5D%20%3D%20tmp_socketData.val%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%0A%20%20%0A%09%09%09if%20(self.newSocketData.hasOwnProperty(tmp_socketData.cmd))%20%7B%0A%09%09%09%20%20self.newSocketData%5Btmp_socketData.cmd%5D%20%3D%20true%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09if%20(self.varCmds.includes(tmp_socketData.cmd))%20%7B%0A%09%09%09%20%20self.varData%5Btmp_socketData.cmd%5D%5Btmp_socketData.name%5D%20%3D%20%7B%0A%09%09%09%09value%3A%20tmp_socketData.val%2C%0A%09%09%09%09isNew%3A%20true%2C%0A%09%09%09%20%20%7D%3B%0A%09%09%09%7D%0A%09%09%09if%20(tmp_socketData.hasOwnProperty(%22listener%22))%20%7B%0A%09%09%09%20%20if%20(tmp_socketData.listener%20%3D%3D%20%22setusername%22)%20%7B%0A%09%09%09%09self.socketListeners%5B%22setusername%22%5D%20%3D%20true%3B%0A%09%09%09%09if%20(tmp_socketData.code%20%3D%3D%20%22I%3A100%20%7C%20OK%22)%20%7B%0A%09%09%09%09%20%20self.username%20%3D%20tmp_socketData.val%3B%0A%09%09%09%09%20%20self.isUsernameSyncing%20%3D%20false%3B%0A%09%09%09%09%20%20self.isUsernameSet%20%3D%20true%3B%0A%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%22Username%20was%20accepted%20by%20the%20server%2C%20and%20has%20been%20set%20to%3A%22%2C%0A%09%09%09%09%09self.username%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20console.warn(%0A%09%09%09%09%09%22Username%20was%20rejected%20by%20the%20server.%20Error%20code%3A%22%2C%0A%09%09%09%09%09String(tmp_socketData.code)%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%20%20self.isUsernameSyncing%20%3D%20false%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20if%20(tmp_socketData.listener%20%3D%3D%20%22roomLink%22)%20%7B%0A%09%09%09%09self.isRoomSetting%20%3D%20false%3B%0A%09%09%09%09self.socketListeners%5B%22roomLink%22%5D%20%3D%20true%3B%0A%09%09%09%09if%20(tmp_socketData.code%20%3D%3D%20%22I%3A100%20%7C%20OK%22)%20%7B%0A%09%09%09%09%20%20console.log(%22Linking%20to%20room(s)%20was%20accepted%20by%20the%20server!%22)%3B%0A%09%09%09%09%20%20self.isLinked%20%3D%20true%3B%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20console.warn(%0A%09%09%09%09%09%22Linking%20to%20room(s)%20was%20rejected%20by%20the%20server.%20Error%20code%3A%22%2C%0A%09%09%09%09%09String(tmp_socketData.code)%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%09%20%20self.isLinked%20%3D%20false%3B%0A%09%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20if%20(%0A%09%09%09%09tmp_socketData.listener%20%3D%3D%20%22setprotocol%22%20%26%26%0A%09%09%09%09!this.protocolOk%0A%09%09%09%20%20)%20%7B%0A%09%09%09%09console.log(%0A%09%09%09%09%20%20%22Server%20successfully%20set%20client%20protocol%20to%20cloudlink!%22%0A%09%09%09%09)%3B%0A%09%09%09%09self.socketData.statuscode%20%3D%20%5B%5D%3B%0A%09%09%09%09self.protocolOk%20%3D%20true%3B%0A%09%09%09%09self.socketListeners%5B%22setprotocol%22%5D%20%3D%20true%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09if%20(%0A%09%09%09%09%20%20self.socketListeners.hasOwnProperty(tmp_socketData.listener)%0A%09%09%09%09)%20%7B%0A%09%09%09%09%20%20self.socketListeners%5Btmp_socketData.listener%5D%20%3D%20true%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.socketListenersData%5Btmp_socketData.listener%5D%20%3D%20tmp_socketData%3B%0A%09%09%09%7D%0A%09%09%09self.packet_hat%20%3D%200%3B%0A%09%09%20%20%7D%3B%0A%20%20%0A%09%09%20%20mWS.onclose%20%3D%20function%20()%20%7B%0A%09%09%09self.isRunning%20%3D%20false%3B%0A%09%09%09self.connect_hat%20%3D%200%3B%0A%09%09%09self.packet_hat%20%3D%200%3B%0A%09%09%09self.protocolOk%20%3D%20false%3B%0A%09%09%09if%20(self.close_hat%20%3D%3D%201)%20%7B%0A%09%09%09%20%20self.close_hat%20%3D%200%3B%0A%09%09%09%7D%0A%09%09%09self.socketData%20%3D%20%7B%0A%09%09%09%20%20gmsg%3A%20%5B%5D%2C%0A%09%09%09%20%20pmsg%3A%20%5B%5D%2C%0A%09%09%09%20%20direct%3A%20%5B%5D%2C%0A%09%09%09%20%20statuscode%3A%20%5B%5D%2C%0A%09%09%09%20%20gvar%3A%20%5B%5D%2C%0A%09%09%09%20%20pvar%3A%20%5B%5D%2C%0A%09%09%09%20%20motd%3A%20%22%22%2C%0A%09%09%09%20%20client_ip%3A%20%22%22%2C%0A%09%09%09%20%20ulist%3A%20%5B%5D%2C%0A%09%09%09%20%20server_version%3A%20%22%22%2C%0A%09%09%09%7D%3B%0A%09%09%09self.newSocketData%20%3D%20%7B%0A%09%09%09%20%20gmsg%3A%20false%2C%0A%09%09%09%20%20pmsg%3A%20false%2C%0A%09%09%09%20%20direct%3A%20false%2C%0A%09%09%09%20%20statuscode%3A%20false%2C%0A%09%09%09%20%20gvar%3A%20false%2C%0A%09%09%09%20%20pvar%3A%20false%2C%0A%09%09%09%7D%3B%0A%09%09%09self.socketListeners%20%3D%20%7B%7D%3B%0A%09%09%09self.username%20%3D%20%22%22%3B%0A%09%09%09self.tmp_username%20%3D%20%22%22%3B%0A%09%09%09self.isUsernameSyncing%20%3D%20false%3B%0A%09%09%09self.isUsernameSet%20%3D%20false%3B%0A%09%09%09self.enableListener%20%3D%20false%3B%0A%09%09%09self.setListener%20%3D%20%22%22%3B%0A%09%09%09self.enableRoom%20%3D%20false%3B%0A%09%09%09self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09self.isLinked%20%3D%20false%3B%0A%09%09%09self.isRoomSetting%20%3D%20false%3B%0A%20%20%0A%09%09%09if%20(self.link_status%20!%3D%201)%20%7B%0A%09%09%09%20%20if%20(self.disconnectWasClean)%20%7B%0A%09%09%09%09self.link_status%20%3D%203%3B%0A%09%09%09%09console.log(%22Socket%20closed.%22)%3B%0A%09%09%09%09self.wasConnectionDropped%20%3D%20false%3B%0A%09%09%09%09self.didConnectionFail%20%3D%20false%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09self.link_status%20%3D%204%3B%0A%09%09%09%09console.error(%22Lost%20connection%20to%20the%20server.%22)%3B%0A%09%09%09%09self.wasConnectionDropped%20%3D%20true%3B%0A%09%09%09%09self.didConnectionFail%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20self.link_status%20%3D%204%3B%0A%09%09%09%20%20console.error(%22Failed%20to%20connect%20to%20server.%22)%3B%0A%09%09%09%20%20self.wasConnectionDropped%20%3D%20false%3B%0A%09%09%09%20%20self.didConnectionFail%20%3D%20true%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20already%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20openSocketPublicServers(%7B%20ID%20%7D)%20%7B%0A%09%09if%20(servers.hasOwnProperty(ID))%20%7B%0A%09%09%20%20console.log(%22Connecting%20to%3A%22%2C%20servers%5BID%5D.url)%3B%0A%09%09%20%20this.openSocket(%7B%20IP%3A%20servers%5BID%5D.url%20%7D)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20closeSocket()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20console.log(%22Closing%20socket...%22)%3B%0A%09%09%20%20mWS.close(1000%2C%20%22script%20closure%22)%3B%0A%09%09%20%20self.disconnectWasClean%20%3D%20true%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20setMyName(%7B%20NAME%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!this.isUsernameSyncing)%20%7B%0A%09%09%09if%20(!this.isUsernameSet)%20%7B%0A%09%09%09%20%20if%20(String(NAME)%20!%3D%20%22%22)%20%7B%0A%09%09%09%09if%20(!(String(NAME).length%20%3E%2020))%20%7B%0A%09%09%09%09%20%20if%20(%0A%09%09%09%09%09!(%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25CA%25%22%20%7C%7C%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25CC%25%22%20%7C%7C%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25CD%25%22%20%7C%7C%0A%09%09%09%09%09%20%20String(NAME)%20%3D%3D%20%22%25MS%25%22%0A%09%09%09%09%09)%0A%09%09%09%09%20%20)%20%7B%0A%09%09%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%09%09%20%20cmd%3A%20%22setid%22%2C%0A%09%09%09%09%09%20%20val%3A%20String(NAME)%2C%0A%09%09%09%09%09%20%20listener%3A%20%22setusername%22%2C%0A%09%09%09%09%09%7D%3B%0A%20%20%0A%09%09%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09%09%09self.tmp_username%20%3D%20String(NAME)%3B%0A%09%09%09%09%09self.isUsernameSyncing%20%3D%20true%3B%0A%09%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09%09console.log(%22Blocking%20attempt%20to%20use%20reserved%20usernames%22)%3B%0A%09%09%09%09%20%20%7D%0A%09%09%09%09%7D%20else%20%7B%0A%09%09%09%09%20%20console.log(%0A%09%09%09%09%09%22Blocking%20attempt%20to%20use%20username%20larger%20than%2020%20characters%2C%20username%20is%20%22%20%2B%0A%09%09%09%09%09%20%20String(NAME).length%20%2B%0A%09%09%09%09%09%20%20%22%20characters%20long%22%0A%09%09%09%09%20%20)%3B%0A%09%09%09%09%7D%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09console.log(%22Blocking%20attempt%20to%20use%20blank%20username%22)%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20console.warn(%22Username%20already%20has%20been%20set!%22)%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Username%20is%20still%20syncing!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20createListener(%7B%20ID%20%7D)%20%7B%0A%09%09self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!this.enableListener)%20%7B%0A%09%09%09self.enableListener%20%3D%20true%3B%0A%09%09%09self.setListener%20%3D%20String(ID)%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Listeners%20were%20already%20created!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.log(%22Cannot%20assign%20a%20listener%20to%20a%20packet%20while%20disconnected%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20linkToRooms(%7B%20ROOMS%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%20%20%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!this.isRoomSetting)%20%7B%0A%09%09%09if%20(!(String(ROOMS).length%20%3E%201000))%20%7B%0A%09%09%09%20%20let%20tmp_msg%20%3D%20%7B%0A%09%09%09%09cmd%3A%20%22link%22%2C%0A%09%09%09%09val%3A%20autoConvert(ROOMS)%2C%0A%09%09%09%09listener%3A%20%22roomLink%22%2C%0A%09%09%09%20%20%7D%3B%0A%20%20%0A%09%09%09%20%20console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09%20%20mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09%20%20self.isRoomSetting%20%3D%20true%3B%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20console.warn(%0A%09%09%09%09%22Blocking%20attempt%20to%20send%20a%20room%20ID%20%2F%20room%20list%20larger%20than%201000%20bytes%20(1%20KB)%2C%20room%20ID%20%2F%20room%20list%20is%20%22%20%2B%0A%09%09%09%09%20%20String(ROOMS).length%20%2B%0A%09%09%09%09%20%20%22%20bytes%22%0A%09%09%09%20%20)%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Still%20linking%20to%20rooms!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20selectRoomsInNextPacket(%7B%20ROOMS%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.isLinked)%20%7B%0A%09%09%09if%20(!this.enableRoom)%20%7B%0A%09%09%09%20%20if%20(!(String(ROOMS).length%20%3E%201000))%20%7B%0A%09%09%09%09self.enableRoom%20%3D%20true%3B%0A%09%09%09%09self.selectRoom%20%3D%20ROOMS%3B%0A%09%09%09%20%20%7D%20else%20%7B%0A%09%09%09%09console.warn(%0A%09%09%09%09%20%20%22Blocking%20attempt%20to%20select%20a%20room%20ID%20%2F%20room%20list%20larger%20than%201000%20bytes%20(1%20KB)%2C%20room%20ID%20%2F%20room%20list%20is%20%22%20%2B%0A%09%09%09%09%09String(ROOMS).length%20%2B%0A%09%09%09%09%09%22%20bytes%22%0A%09%09%09%09)%3B%0A%09%09%09%20%20%7D%0A%09%09%09%7D%20else%20%7B%0A%09%09%09%20%20console.warn(%22Rooms%20were%20already%20selected!%22)%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Not%20linked%20to%20any%20room(s)!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20unlinkFromRooms()%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.isLinked)%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22unlink%22%2C%0A%09%09%09%20%20val%3A%20%22%22%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20autoConvert(this.setListener)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09self.isLinked%20%3D%20false%3B%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%22Not%20linked%20to%20any%20rooms!%22)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendGData(%7B%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22gmsg%22%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendPData(%7B%20DATA%2C%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22pmsg%22%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%20%20id%3A%20autoConvert(ID)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendGDataAsVar(%7B%20VAR%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22gvar%22%2C%0A%09%09%09%20%20name%3A%20VAR%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20sendPDataAsVar(%7B%20VAR%2C%20ID%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20%22pvar%22%2C%0A%09%09%09%20%20name%3A%20VAR%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%20%20id%3A%20autoConvert(ID)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20autoConvert(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20larger%20than%201000%20bytes%20(1%20KB)%2C%20packet%20is%20%22%20%2B%0A%09%09%09%09String(DATA).length%20%2B%0A%09%09%09%09%22%20bytes%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20runCMDnoID(%7B%20CMD%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(!(String(CMD).length%20%3E%20100)%20%7C%7C%20!(String(DATA).length%20%3E%201000))%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20String(CMD)%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20String(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20with%20questionably%20long%20arguments%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20runCMD(%7B%20CMD%2C%20ID%2C%20DATA%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(%0A%09%09%09!(String(CMD).length%20%3E%20100)%20%7C%7C%0A%09%09%09!(String(ID).length%20%3E%2020)%20%7C%7C%0A%09%09%09!(String(DATA).length%20%3E%201000)%0A%09%09%20%20)%20%7B%0A%09%09%09let%20tmp_msg%20%3D%20%7B%0A%09%09%09%20%20cmd%3A%20String(CMD)%2C%0A%09%09%09%20%20id%3A%20autoConvert(ID)%2C%0A%09%09%09%20%20val%3A%20autoConvert(DATA)%2C%0A%09%09%09%7D%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22listener%22%5D%20%3D%20String(this.setListener)%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20tmp_msg%5B%22rooms%22%5D%20%3D%20String(this.selectRoom)%3B%0A%09%09%09%7D%0A%20%20%0A%09%09%09console.log(%22TX%3A%22%2C%20tmp_msg)%3B%0A%09%09%09mWS.send(JSON.stringify(tmp_msg))%3B%0A%20%20%0A%09%09%09if%20(this.enableListener)%20%7B%0A%09%09%09%20%20if%20(!self.socketListeners.hasOwnProperty(this.setListener))%20%7B%0A%09%09%09%09self.socketListeners%5Bthis.setListener%5D%20%3D%20false%3B%0A%09%09%09%20%20%7D%0A%09%09%09%20%20self.enableListener%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%09if%20(this.enableRoom)%20%7B%0A%09%09%09%20%20self.enableRoom%20%3D%20false%3B%0A%09%09%09%20%20self.selectRoom%20%3D%20%22%22%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%20else%20%7B%0A%09%09%09console.warn(%0A%09%09%09%20%20%22Blocking%20attempt%20to%20send%20packet%20with%20questionably%20long%20arguments%22%0A%09%09%09)%3B%0A%09%09%20%20%7D%0A%09%09%7D%20else%20%7B%0A%09%09%20%20console.warn(%22Socket%20is%20not%20open.%22)%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20resetNewData(%7B%20TYPE%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20self.newSocketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%20%3D%20false%3B%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20resetNewVarData(%7B%20TYPE%2C%20VAR%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.varData.hasOwnProperty(this.menuRemap%5BTYPE%5D))%20%7B%0A%09%09%09if%20(this.varData%5Bthis.menuRemap%5BTYPE%5D%5D.hasOwnProperty(VAR))%20%7B%0A%09%09%09%20%20self.varData%5Bthis.menuRemap%5BTYPE%5D%5D%5BVAR%5D.isNew%20%3D%20false%3B%0A%09%09%09%7D%0A%09%09%20%20%7D%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20resetNewListener(%7B%20ID%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.isRunning)%20%7B%0A%09%09%20%20if%20(this.socketListeners.hasOwnProperty(String(ID)))%20%7B%0A%09%09%09self.socketListeners%5BString(ID)%5D%20%3D%20false%3B%0A%09%09%20%20%7D%0A%09%09%7D%0A%09%20%20%7D%0A%20%20%0A%09%20%20clearAllPackets(%7B%20TYPE%20%7D)%20%7B%0A%09%09const%20self%20%3D%20this%3B%0A%09%09if%20(this.menuRemap%5BString(TYPE)%5D%20%3D%3D%20%22all%22)%20%7B%0A%09%09%20%20self.socketData.gmsg%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.pmsg%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.direct%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.statuscode%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.gvar%20%3D%20%5B%5D%3B%0A%09%09%20%20self.socketData.pvar%20%3D%20%5B%5D%3B%0A%09%09%7D%20else%20%7B%0A%09%09%20%20self.socketData%5Bthis.menuRemap%5BString(TYPE)%5D%5D%20%3D%20%5B%5D%3B%0A%09%09%7D%0A%09%20%20%7D%0A%09%7D%0A%20%20%0A%09console.log(%22CloudLink%204.0%20loaded.%20Detecting%20unsandboxed%20mode.%22)%3B%0A%09Scratch.extensions.register(new%20CloudLink(Scratch.vm.runtime))%3B%0A%20%20%7D)(Scratch)%3B","data:application/javascript,%2F%2F%20Name%3A%20Key%20Simulation%0A%2F%2F%20ID%3A%20cubesterKeySimulation%0A%2F%2F%20Description%3A%20Simulate%20Key%20Presses%20and%20Mouse%20Clicks.%0A%2F%2F%20By%3A%20CubesterYT%20%3Chttps%3A%2F%2Fscratch.mit.edu%2Fusers%2FCubesterYT%2F%3E%0A%0A%2F%2F%20Version%20V.1.0.0%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%0A%20%20const%20icon%20%3D%0A%20%20%20%20%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAAAXNSR0IArs4c6QAAFs9JREFUeF7tnXuwZMVdxz9n5t67e%2B%2BCSGBFMMSERzAkGB9EjVHDkrA8AlSy0TxUqsRS4%2BMPqmI0CbDcvssjkFSMVlnRwtJYqVAQNGAJRBN3F4gkmhAMiJiEd4wGMYCBsK97986xvuecHnr6njPTM3POmYe3q6Zmd26f7v51f8%2Bvf%2F3r3yNiCouBFwOviuD4GI6N4MX6Bl4EHKpPBIfGEAMt0u%2BDwP%2FqE8EzMXwbeBx4LILHVuDBK%2BCxaZuuaNIJugo2L8PrgNdF8JpWuvBHVEFXDE834N4Y7ovgC%2Fvhcx9IgTKxZSIBYOA04GzgHL3pI579fwE%2BB9xiYPeIx9J39xMDgCU4I4Z3AOcDR%2FZNaT0PPCkgADcb%2BHQ9XQ7Xy1gDwMAJwIWkC39cKKmzwEL22QjoMwfo95ns0wAs8VYQWAVWss8ysD%2F77AP2ZL%2BHjgF4BPjEQbjuCnioj%2BdqrTqWAFiCLTG8C3h7yGx8D3AYoO9DsgUPea7fOgLE88BzwLPZd2AbfwV81MAdgfVrqzZWAFiC82J4D%2FBz3WZAb7OkPIn0hwPN2qarsyNxDB0bngGeBsQ1upUIbo%2Fhjw3cNKIhr%2Bl2LABg4CzShX9D0cRokb8P2Jwt%2BiATuCXwodsD6%2FnVBAYdCf4HEDi6lF0tuGYH%2FMOAXZX22EgBYOCHgB3ALxRRJLZ%2BNHCUs2cPSn3VALDjkkwhafC%2Fs62iy3hvXoXtl8MDg9I07HMjA4BJF357EQF6048BvndYCp3n6wKAO%2BTvAN%2FKOEMXUpYMmBJJDW6qdgAYeCPwkaLzu9i81HhS15VdRgEAS8N3gf%2FMtoc8uiJ4QPKPgb8vm%2B5u7dUKAAPXAL%2BfNyAJcz%2BYSfNVTcAoAWBp0unhPzLBsYDOawy8r6o58NutBQA74JQW%2FBnwk%2F4AdEZ%2FWSbgVU30OADA0ihBURcLOlrmlH8GfseAtIyVlsoBsAQXxHBt3vFcrF7ancoHkU3hOAFAQ5Kw%2BGi2NeSssnRSv2rgE1UioNK5L2L50tJJxSe2X2cZNwBY2nV8fBjYmz8ZHzBwcVXzVBkAMuT%2Bkj9wHelOrPGtd%2FsfVwBYbiB98RP5K32DgXdWAYLSAXAlHLUC1wNr5vvl2Zm%2BCkJC2hxnANjx68hYcHGwC3ibSRWPpZVSAXAJHDsLfwv8iDtCCXrS%2BEhfP8oyCQDQ%2FOik8LUcATGC%2B2LYZlLRoZRSGgAuh5etpovfcT%2BvRX8FsKGU4Q7XyKQAQFQeyEAgRZJX%2Fh14k0mtlYYupQAgW%2Fy%2FA05yRyRt3slDD7G8BiYJAJZqrXaOydEDM%2FCmS%2BEbw87O0AAwqbZW%2B9OPuYP5fh8Nw460hOcnEQAi%2B%2BvZvYI7BRHcPwtbLk4vIgcuZQBgp3%2BLJ0lfAt%2B4lUkFgObxwfwTwq5MtT7wVA8FgCW4MfZu8sbxzbezM8kAKOIEwPUGfnFQBAwMAANXAJeM857vT8qkA0D0FMgEVxt4%2FyAgGAgAmXr3426HEgRePcgIanxmGgCg6bo3387ggkHUxn0DwKRn%2FHsA2VUmRed8%2FTgOR71ueJoWAOiIKBC4F0kRHIjhp0z6p%2BAyCAA%2BD%2Fy024MWf9RKnhCKpwUAolXKopyV%2FpLJuXHtNjd9AcDA1cB73Qal15flzjgV2ePJ38sSZ79liRJSBrUJDGm7zDq6N9DpwCt92RMEA8CkXji3uZ2N03Ev9O0OWQBrZazJkcNgXhkXkBQcD8808NkQWvsBwH3AD9tGdaV76ohu9YoIKxME3SZvXBZfY5RNwZe9q%2BQIvroYqIQNAkBmsLjoToqQUPd9fgiiqwbBOC2%2BnQ%2FZE%2Fzr2skJMjTtCYDt8OqmJ2%2FIkuf4kNUYUZ2qQDCOi2%2BnWH5oMjr1yitNqjooLD0BYOBG125fR76fGDPWn0dd2SAY58W3W8GX1l4h32TgrQMDINMzd3iv6GpXptuTUMoCwbgvvl0LGZp%2B1VuYCLYudvFA6soBlmB37Fj2yBfvlElYeWeMw4JgUhbfknz%2FWpPzrhdGhQAw8Gb5ubvrPSkKHx%2Bjg4Jg0hZfdBcoiN5i4G%2Fy3t1CACzBzthx1hTbF%2Fuf1NIvCCZx8e3aaBvQduCUO0yOjab%2BngsAA6dnRh7tNmTtUYW7Vp2ACgXBJC%2B%2B5lNuaDkeJVvy4hMUAUD%2B62%2BxizNupl3DgKYXCCZ98e3c5Fwb32hyAm6sAUBm39dhdapr3jK9dIdZwDKeLQLBtCy%2B5kjGpFLdeuUk410frAGAr%2FWTf%2F6PljHrY9aGD4JpWnw71V9ZG8Zmh4EOje4aACzCo1Hqr5kUmfnKzGvainToEnRUpnHxRZcCVMig1CkPm9Qxq106AJCFapF5d1J0K6YIjD3VhdOGjimhRyCX8YYXruZsNwaBD4A%2FJY3OlZRxuu6dkjWpnYyc6%2BI%2FN%2FBrdiA%2BAMQ1FI4nKeN641f7LE5whzk3hU8aZ1dvA8DAVuAzllaFYnvtGBEezSjEo%2FajFzAbOf%2FuOtTQen4jsZhofyV2n4lj4tVVGKCd%2FnrtXvufvBB2EZy%2BmIk%2BLgA%2BCPzeOvsvc%2Bph7thjWf7mN8tttM%2FWcraBPzDwu8n7ZNsycHdm5JP89MoRB%2BRtzM3RWl5m7uijWX7iCc6fmeFgS5Z%2BadG7qcHbd9T%2Bu9tvVfzNTmIyDr3x2ff8%2FDw371OQ2bQ0N21idY8CztZfnqIzDl0EX1nMXPkSAJj0hleh7drlZ0YYgZOZGbYcPNhxPNvabLIiduqVRqNBKwNGs9lM%2Fi02rN%2F1rc%2BMwHPwBes%2B%2B4y%2FhXSwb6cf1bN%2FUx%2BrOeOw1W3dRhSxy2H90jvcdcQRrDw9lCvfQOjRrN219snNBp5KALAEb4%2FhBltHJt4dDv4DdTvYQ3EUcXo2ce75XGf2vB3ZLroWeWVFYXUkJqSMTYs2Ozvb%2Ft0Fi%2F23nhNo9HEX2h29%2Fd1%2Bz83NsbzcPTCs6u72AKA2dzWbNLoAaLBZ6%2F2UrxSKYNsi3Gw5QEf4NqXWCA7N3bvv8BqNBluyt%2FmYmRmuc97arVHESo4wZRdFC6lFFQi08C4ILCgsZ7AcwwdLyEAtNykCi20jjwPYv93ebELNIJBu35NEPmLg3RYAsvppm82PZP%2BPIrY4C%2FyiRoNPOXv%2BuTMz7HEA4bJcu9h2USzrd7eBkMUNreNyEv8Zl1v4HGDWAXHd2kdfDgB2G3iDBYDizrSNfBXMT7Z%2FdRZXNz%2FbaLAhjrnFAcS5UcSeHA6wYcOG5K3XW92MokQwXLXCWJ0EeH114wBtTlDj%2BORG9sXO%2Fp4ysDkyKbeXUWlSlFShw%2B%2BrhkG6i39Yo8GzrRaboohbnQU%2FJ4rY12ULcFmyK%2B2XNXxXY9ZNO9BNCNTf5FApgI4CBF%2Fwkl7MwEujLBVL24ukbi9f%2F1YuyeTRbLKx1eoAwBldvHTKWuRe7VgQhACgSAjU71KyHRgBCHyv4gjOEQf4TeBPLPF16%2F9dAMxEES19Wi3mo4hPO5MkAaVHDP5e6zf030M4SzcO4Aqj7mDqkgdyFEK%2FJQB8KEvWkIxJ98AvGXqqwhuwABDrf05Cn9hko8Fcq9UBgKJjYHhP9dTsJgS6AJCcs5IJubsbDSJH4K1qpApS7SU%2BvEYA0Pm%2FnZunTrt%2F98yvt6vhKHLGkQOELEw%2FHGAhitgbx9y1eTMr364%2B%2FWCO38ANAkBHkKc6zb9WNm5k6%2F79SWAJqVXcvdUHgHLJvKAIDlmK0dQJBYDqRXGc0FTXFpBjJnanACDZoB3dRR6%2Fm2qau%2BWFBc7cuzc5eaQ6vBfKtAMg2Q4y0NcFAN1EyJPYFkUeFQDkU%2FgD9kddAUtKraMcWFjgrEAAjIMQGDInoRxgFABQaBklInAA8A0BQDYDbaPfOi%2BBLAB00%2B8HYvA5wLQJgS6Y6uIA%2FqVQBM9Gi%2FB85HB9JeyrywbwwKZNnLVnT5LNsxcAppEDWBDUBQDJWEpy7JQD4gDiDG2u%2F%2FoQPldSnX4AMGlCYDdFkH%2FtXBcAtGx3dq7dQQFAnKEd8m0dAMOhux8ZoG4OkAOAWKrgvTHM28GsbwHTCwB%2FC4hgn2QAWYUoFW9S6hQC9y8scPbevYn%2Fga%2FmnfRj4DhuAb4QGMPT2gIUc76t%2Fa31GBggBM6fcAL7Hn44MVYY9V1ACG8Y5y3APwbKRkQAkDu5MrokpU5FkBUCu3GA%2BeOPZ98jjyRZpSdJExjCAUatCFJSEgFgt5vgqU5VcMgpwAJgGjlA3QDIUQXvFgCUmLCd3q3Oy6B1AKT3H3UdA3Mug64TADocQuq8Dg4RAuePO459jz66vgWECCA96uRcB39Ix8CLYvhD%2B2ydBiEhHMCOa30LGB4BOQYhF43UJCyEA1iy14XA4QGgiCFuGjrFENQWoMivbZPxOo1C1zlAvTKAbxS6Ai%2BxZuEdN4J1mYWvA6A%2BAOToAL5j4HDrGnZHDO1rgLocQ0L0AOtbwPCsXy3kOIbcaeA0C4CrYycTSF2uYescoD4OkOMalmQWsVtAR1jYupxD14XA%2BgDgO4e2YNsOxzlUgcA6UtfXcSnUDweYtFNAkWtYngdT1YqgPPfwWTjmEnjCDRAhkLS9wuuQA6YZAPJT3JnjHu4CQEYYbatgubRXFEqmZ4AICQl%2BRrA6FELTLASGcAAXAHKHS%2BIJVVByFEDtzGJtDrAEW%2BL0YigpdQSJCuEA8yeeyL6HHpo4VXAIB7BzrS1AQbDiHPf3MvAQFCQq4wId%2BoCqw8T1IwT2CvJcxkSV0Uaoa5jbVwKAijhATpi45Pxv%2B%2FfjBF4L%2FHpd9wIhHGBS9QAhW4DLAZLwdxXIADns%2F1rjBAP1AaA7l3aOoKpDxU4zAEIMQjoAUAb78dooCBV7RuYOmNRe4wJgUgfSl9q2Xp6FjK1gfKwDIJ3Vqo6BOcGiHzdOIPAiAFwJXGwXvMpw8SEAmFQhcBw4QE64%2BCsNXOq%2BzGs4QJ0JI7oJgQuNBrcpUERmFHq6E6uvCm5UVps2MJUAsMvx%2BbdCbF7gqio4QF7CiCYct90LEZDrBebHDKgqZUw3DtAGQHYMnBSDEAHJxiZ0F7bbKaYKAAycMkYE%2BHGD9FsVSaO6KYI2NZvc6ihG3qjQMWMQ%2FasXp1AcQRW5f%2B10xi8A2BiDfpi5sgGQlzSqKIFkoR%2BogV1OUo0klmzZaeO6cQCFqVPmCmsV%2FOaZGfatriaOpIoloG9rJp6EhtObl8Xhs%2Bnf9Xf9W46nNgaB%2Bzdp4vQ3%2FeZOhNqyDqv6dn3n3H7cMdi21M9yHDPXbHKbBwABww9bW4UQmJM2LokJmAfebgA4F7jFfajsxJHdAHDI7Cy3rKwwe%2BSRrDwlbfZkF3EA%2B%2BZXyQEKEkeeZ%2BDWvgCgyr7PQNmpY60QqOhgerNG6TVbNbwEAD98bRV6AKWRl%2FbPKYVJI3OPge6TBs4BbnN%2FK9NvwHIAse7VLDycG43b7o0hamA9V1S6RfeueuFdGuwW5QawLnMLKEgefc5iupvmlp6xIPwTQZnp4y0AtF8ur65iF3%2Bu0WC51UoUJCGLX%2FUi9tt%2B%2Bz7AiQHkHgPdYNVlAUBav5z08Z808I5u4%2B8JgEvhFTOgU0W7yIz4%2BH5nJae%2BywFsJHD3vtwFQLcAzSUMpZQm2o6hWQ4D%2B3%2BXCySBGJwcB2UBQLF%2BFezJLU04efvajPIddXoCQLUNXAW8332yjJtCfwtQ%2B%2Fbt6If9l7J6FTfSDczDHgNzbvxEzQeMo9EdeAuwDy7BvbETTm4h8yQOQlBB71YI1N6o45grBPrsfxI4QPpypxlMfIGvgwtkOg2fQwyCQbF%2BhX7b2%2FnwfSYw50fw%2Bpk0n0D7plD9DWs1ZDnAhmaTA541jAVASHzeQSZuFM%2F4oC4DADnXvSKt48ZvKBnAfdjAh4F3u78pD%2BkxA86mBYD%2FuPu22DdJdYpy%2BgzYfW2PWeHWp8vSM%2BgW8C3gobVUtDOChRAYzAFsYybNRtqRUmBQBVE3ALjSf9H5OYTAUddxhVqNxXKB2WYzyYImEAwCgAKFz%2BdNGuUnuAwCgFcB97ih5XQ0FAgU87efsjw%2Fz5lOajU7Qfq2ihPtqaM8x%2FdDT1FdcYBYiamyxbbgHnQLkJuX4vsqC4gtkVIQwKkG%2Fq2fMfcNADVu4FeAj7kdDZJowgaLdtvx98leadr6IXZUdYuUW4NGCPETP2R0XWjgL%2FulcSAAZCBYczTs99r4wPw8ZzkcoGOPLEgT1y%2BBo67vGom6e764gDim3uZ%2BtoCca16ReJWBSwahdWAAZCDoCC%2Bj3%2BRidFLgSGysYFt9UjV%2FIeS6x1hfxxEKgK8DMvPyynUGfjlkDHl1hgJABgKFn%2F1Zt%2FHQ46EvBLYFJCWBrMhGftCJGuY5N6NpHthDAFBw3LvLeHPf7ziHBsBVcMQKfCaGH3c7D%2BEELgcoOiL1S9A41rfbgGwBlCRCKXBdensBoODNv2cOzrwYhspFOzQAMi6g6wGlnj%2FZXYAQmUB7oc8SJ0XrFwo2aweo%2BgKDq%2B526c9rr2DP189nZrkeQoeRW68UAKjlS%2BHEWbgl9kQAuZrrCrnXEdEejWZ0Pl5dbatS3VG7SqGhqK7w4TxlVZECS8Dff%2BSRLOzfT%2Bv55ztGpRQ6WmWd970ihnC%2BAe0KQ5fSAKCRLKYxZz7lpqHX79ITKBSpwJBXXKWPPGp0Xq5b%2BVOmyrmfsStjmDyCtDXYokX%2FmnfOz%2F725RnYdumaNMCD46BUAGgY74PDN8JNwGn%2BsHwnk7jRoLmwwOsd9AsAyRuTpYEVGBLWmR0L%2Fe%2FBSe98Us6w6snGzZdtn%2FrS79aLV2%2Bl7BFla2gTXISEr%2FXHbNvTCPz9v0C9q6p37IdtV68x%2BBluBkoHgIZjYCaCj8fwTn94OiHo%2FqCSjoebi5E%2BLfBJr98RpeOFEV1%2FMlzwtgriZVe6DgauIEdBoavkE5xs1bM15c0b6QrndN447DBazz6b2PA9vPZK1z6xxpunTDoqBYAGugQXxiCv49Rg3ik6OihzdeWDKHPGSmxLb72CN%2FmWPFkX2mXeZeAvSuxyTVO1zP0OOKUFH83yUXQMQgKi4hPL7%2BD%2FU5EBp7xw3Qsdh%2F67GvDbl8H9Vc9JLQCwRPh5il3iZHKurBVFJ4WqJ6Ku9iXhK2jzM8UdftjAe%2BoaT60AEFEGtpJGKG9nK3WJFSfQ1nBoXTNQUz9y1xKr15tfUHTJ914Dn61pSEk3tQPA4QY7gO1FxEqLKEujdkbLOmelxL7kpaujXY%2FU0FeYLnNR4nBGIwMUEWBAxiXyV29nL%2FfrKj6Bjo5HjRKtfa6AhLsns5u7HE2e29onG3D5ZfBAn12UVn1kHMClINsWBISOW0W3jvx%2BtD2IM7QjHJU2DeU0pOOc3nSx%2BW4B3yL4xxj01tfK7vOoHAsA2IEtwXkxXESBJ6utJ%2B2c8txJcBQYip3CylnYola0yFp0CXS6kpOmsEfZFcEfLXpOt70eqvLvYwUAS%2BhlcEYDfgP4%2BRDidXLQVqHPIdndQ8hz%2FdbRkU1XNs9lnx7s3W3%2BryO4dtEzq%2B%2B3%2FyrqjyUALKEmDVZ1YfZREPOgIj3%2BJsUWyMAgXYO4hn6XNkof6eMt8dqzpdPXGy1dvz56m7Xg%2BuwD9mS%2FBw0grSShX0qcjxl4vI%2Fnaq061gBwZyKLWrINeGsmCtQ6UYGdKZCB3vabxvFtH3sZIHCSpUuQl5L9dFgihbZRVr0I7olhJ7DTjb9XVvtVtzMxHKBoIgwcE8FrY3hNBKfqOxMHSp%2B7CL4bw92ZJ%2FbdK%2FDFK%2BG%2FSu%2BoxgYnHgB5c5UZpsj8QB9dPEqNYD86PGyMYEOcfqvY7X5%2FnAr29hivb3lePxjDg0upFneqyv8BC0K%2Bo6SYlTUAAAAASUVORK5CYII%3D%22%3B%0A%0A%20%20let%20delay%20%3D%20(ms)%20%3D%3E%20new%20Promise((res)%20%3D%3E%20setTimeout(res%2C%20ms))%3B%0A%20%20let%20clamp%20%3D%20(min%2C%20max%2C%20num)%20%3D%3E%20%7B%0A%20%20%20%20return%20num%20%3C%3D%20min%20%3F%20min%20%3A%20num%20%3E%3D%20max%20%3F%20max%20%3A%20num%3B%0A%20%20%7D%3B%0A%0A%20%20let%20canvasSize%3B%0A%20%20if%20(window.ResizeObserver)%20%7B%0A%20%20%20%20let%20canvasWidth%20%3D%0A%20%20%20%20%20%20Scratch.vm.runtime.renderer._xRight%20-%20Scratch.vm.runtime.renderer._xLeft%3B%0A%20%20%20%20let%20canvasHeight%20%3D%0A%20%20%20%20%20%20Scratch.vm.runtime.renderer._yTop%20-%20Scratch.vm.runtime.renderer._yBottom%3B%0A%20%20%20%20const%20resize%20%3D%20new%20ResizeObserver((entries)%20%3D%3E%20%7B%0A%20%20%20%20%20%20for%20(const%20entry%20of%20entries)%20%7B%0A%20%20%20%20%20%20%20%20canvasWidth%20%3D%20entry.contentRect.width%3B%0A%20%20%20%20%20%20%20%20canvasHeight%20%3D%20entry.contentRect.height%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D)%3B%0A%20%20%20%20resize.observe(Scratch.vm.runtime.renderer.canvas)%3B%0A%20%20%20%20canvasSize%20%3D%20()%20%3D%3E%20%5BcanvasWidth%2C%20canvasHeight%5D%3B%0A%20%20%7D%20else%20%7B%0A%20%20%20%20canvasSize%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20const%20rectangle%20%3D%0A%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer.canvas.getBoundingClientRect()%3B%0A%20%20%20%20%20%20return%20%5Brectangle.width%2C%20rectangle.height%5D%3B%0A%20%20%20%20%7D%3B%0A%20%20%7D%0A%0A%20%20let%20simulatedX%20%3D%200%3B%0A%20%20let%20simulatedY%20%3D%200%3B%0A%20%20const%20postMouseData%20%3D%20(data)%20%3D%3E%20%7B%0A%20%20%20%20const%20%5BrectangleWidth%2C%20rectangleHeight%5D%20%3D%20canvasSize()%3B%0A%20%20%20%20Scratch.vm.postIOData(%22mouse%22%2C%20%7B%0A%20%20%20%20%20%20...data%2C%0A%20%20%20%20%20%20canvasWidth%3A%20rectangleWidth%2C%0A%20%20%20%20%20%20canvasHeight%3A%20rectangleHeight%2C%0A%20%20%20%20%20%20x%3A%0A%20%20%20%20%20%20%20%20(simulatedX%20%2B%0A%20%20%20%20%20%20%20%20%20%20(Scratch.vm.runtime.renderer._xRight%20-%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._xLeft)%20%2F%0A%20%20%20%20%20%20%20%20%20%20%20%202)%20*%0A%20%20%20%20%20%20%20%20(rectangleWidth%20%2F%0A%20%20%20%20%20%20%20%20%20%20(Scratch.vm.runtime.renderer._xRight%20-%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._xLeft))%2C%0A%20%20%20%20%20%20y%3A%0A%20%20%20%20%20%20%20%20((Scratch.vm.runtime.renderer._yTop%20-%0A%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._yBottom)%20%2F%0A%20%20%20%20%20%20%20%20%20%202%20-%0A%20%20%20%20%20%20%20%20%20%20simulatedY)%20*%0A%20%20%20%20%20%20%20%20(rectangleHeight%20%2F%0A%20%20%20%20%20%20%20%20%20%20(Scratch.vm.runtime.renderer._yTop%20-%0A%20%20%20%20%20%20%20%20%20%20%20%20Scratch.vm.runtime.renderer._yBottom))%2C%0A%20%20%20%20%7D)%3B%0A%20%20%7D%3B%0A%0A%20%20class%20KeySimulation%20%7B%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22cubesterKeySimulation%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Key%20Simulation%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%23BF0000%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%23800000%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%3A%20icon%2C%0A%20%20%20%20%20%20%20%20docsURI%3A%20%22https%3A%2F%2Fextensions.turbowarp.org%2FCubesterYT%2FKeySimulation%22%2C%0A%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22pressKey%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22press%20key%20%5BKEY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22KEYS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22holdKey%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22hold%20key%20%5BKEY%5D%20for%20%5BSECONDS%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20KEY%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22KEYS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECONDS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%205%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22clickMouse%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22click%20%5BBUTTON%5D%20mouse%20button%20at%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22BUTTONS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22holdMouse%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22click%20and%20hold%20%5BBUTTON%5D%20mouse%20button%20at%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%20for%20%5BSECONDS%5D%20seconds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.STRING%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20menu%3A%20%22BUTTONS%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SECONDS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%3A%20Scratch.ArgumentType.NUMBER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultValue%3A%205%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20KEYS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22space%22%2C%20value%3A%20%22%20%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22up%20arrow%22%2C%20value%3A%20%22ArrowUp%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22down%20arrow%22%2C%20value%3A%20%22ArrowDown%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22right%20arrow%22%2C%20value%3A%20%22ArrowRight%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22left%20arrow%22%2C%20value%3A%20%22ArrowLeft%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22enter%22%2C%20value%3A%20%22Enter%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22backspace%22%2C%20value%3A%20%22Backspace%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22delete%22%2C%20value%3A%20%22Delete%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22shift%22%2C%20value%3A%20%22Shift%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22caps%20lock%22%2C%20value%3A%20%22CapsLock%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22scroll%20lock%22%2C%20value%3A%20%22ScrollLock%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22control%22%2C%20value%3A%20%22Control%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22escape%22%2C%20value%3A%20%22Escape%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22insert%22%2C%20value%3A%20%22Insert%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22home%22%2C%20value%3A%20%22Home%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22end%22%2C%20value%3A%20%22End%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22page%20up%22%2C%20value%3A%20%22PageUp%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22page%20down%22%2C%20value%3A%20%22PageDown%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22a%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22b%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22c%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22d%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22e%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22f%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22g%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22h%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22i%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22j%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22k%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22l%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22m%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22n%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22p%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22q%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22s%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22t%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22u%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22v%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22w%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22x%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22y%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22z%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%220%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%221%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%222%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%223%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%224%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%225%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%226%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%227%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%228%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%229%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22-%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22.%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%60%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%5C%5C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22'%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22~%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%2B%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22!%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22*%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%23%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22(%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3F%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3C%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%3E%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22%40%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20'%22'%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20BUTTONS%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22left%22%2C%20value%3A%20%220%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22middle%22%2C%20value%3A%20%221%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%20text%3A%20%22right%22%2C%20value%3A%20%222%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20async%20pressKey(args)%20%7B%0A%20%20%20%20%20%20const%20pressKey%20%3D%20new%20KeyboardEvent(%22keydown%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(pressKey)%3B%0A%20%20%20%20%20%20await%20delay(100)%3B%0A%20%20%20%20%20%20const%20releaseKey%20%3D%20new%20KeyboardEvent(%22keyup%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(releaseKey)%3B%0A%20%20%20%20%7D%0A%20%20%20%20async%20holdKey(args)%20%7B%0A%20%20%20%20%20%20const%20pressKey%20%3D%20new%20KeyboardEvent(%22keydown%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(pressKey)%3B%0A%20%20%20%20%20%20await%20delay(args.SECONDS%20*%201000)%3B%0A%20%20%20%20%20%20const%20releaseKey%20%3D%20new%20KeyboardEvent(%22keyup%22%2C%20%7B%0A%20%20%20%20%20%20%20%20key%3A%20args.KEY%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20document.dispatchEvent(releaseKey)%3B%0A%20%20%20%20%7D%0A%20%20%20%20async%20clickMouse(args)%20%7B%0A%20%20%20%20%20%20simulatedX%20%3D%20args.X%3B%0A%20%20%20%20%20%20simulatedY%20%3D%20args.Y%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20true%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20await%20delay(100)%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20false%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20async%20holdMouse(args)%20%7B%0A%20%20%20%20%20%20simulatedX%20%3D%20args.X%3B%0A%20%20%20%20%20%20simulatedY%20%3D%20args.Y%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20true%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20await%20delay(args.SECONDS%20*%201000)%3B%0A%20%20%20%20%20%20postMouseData(%7B%0A%20%20%20%20%20%20%20%20isDown%3A%20false%2C%0A%20%20%20%20%20%20%20%20button%3A%20clamp(0%2C%202%2C%20args.BUTTON)%2C%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20KeySimulation())%3B%0A%7D)(Scratch)%3B","data:application/javascript,(function%20(Scratch)%20%7B%0A%22use%20strict%22%3B%0Aconst%20delay%20%3D%20ms%20%3D%3E%20new%20Promise(res%20%3D%3E%20setTimeout(res%2C%20ms))%3B%0Alet%20topBar%3B%0Alet%20topBar2%3B%0Alet%20css%20%3D%20%22%22%3B%0AtopBar%20%3D%20'div%5Bclass%5E%3D%22menu-bar_main-menu_%22%5D'%3B%0AtopBar2%20%3D%20'div%5Bclass%5E%3D%22menu-bar_account-info-group_%22%5D'%3B%0Aconst%20stylesheet%20%3D%20document.createElement(%22style%22)%3B%0Astylesheet.className%20%3D%20%22shovelcss-style%22%3B%0A%2F%2F%20end%20of%20%3Cbody%3E%20for%20higher%20precedence%20than%20other%20sheets%0Adocument.body.appendChild(stylesheet)%3B%0Acss%20%2B%3D%20%60%24%7BtopBar%7D%2C%20%24%7BtopBar2%7D%20%7B%20background-color%3A%20%23111111%20!important%3B%20%7D%60%3B%0Astylesheet.textContent%20%3D%20css%3B%0Aclass%20darkmodething%20%7B%0AgetInfo()%20%7B%0Areturn%20%7B%0Aid%3A%20%22darkmodething%22%2C%0Aname%3A%20%22%20%22%2C%0Ablocks%3A%20%5B%0A%5D%2C%0A%7D%3B%0A%7D%0A%7D%0AScratch.extensions.register(new%20darkmodething())%3B%0A%7D)(Scratch)%3B%0A%0A","data:application/javascript,%2F%2F%20Name%3A%20Better%20Input%0A%2F%2F%20ID%3A%20BetterInputSP%0A%2F%2F%20Description%3A%20Expansion%20of%20the%20%22ask%20and%20wait%22%20Blocks%0A%2F%2F%20By%3A%20SharkPool%0A%0A%2F%2F%20Version%20V.4.1.0%0A%0A(function%20(Scratch)%20%7B%0A%20%20%22use%20strict%22%3B%0A%20%20if%20(!Scratch.extensions.unsandboxed)%20throw%20new%20Error(%22Better%20Input%20must%20run%20unsandboxed%22)%3B%0A%0A%20%20const%20menuIconURI%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxMzQuMTc2MjgiIGhlaWdodD0iMTM0LjE3NjI4IiB2aWV3Qm94PSIwLDAsMTM0LjE3NjI4LDEzNC4xNzYyOCI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTE3Mi45MTE4NiwtMTEyLjkxMTg2KSI%2BPGcgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aXNQYWludGluZ0xheWVyJnF1b3Q7OnRydWV9IiBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZS1saW5lY2FwPSJidXR0IiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0eWxlPSJtaXgtYmxlbmQtbW9kZTogbm9ybWFsIj48cGF0aCBkPSJNMTcyLjkxMTg2LDE4MGMwLC0zNy4wNTE3NiAzMC4wMzYzOCwtNjcuMDg4MTQgNjcuMDg4MTQsLTY3LjA4ODE0YzM3LjA1MTc2LDAgNjcuMDg4MTQsMzAuMDM2MzggNjcuMDg4MTQsNjcuMDg4MTRjMCwzNy4wNTE3NiAtMzAuMDM2MzgsNjcuMDg4MTQgLTY3LjA4ODE0LDY3LjA4ODE0Yy0zNy4wNTE3NiwwIC02Ny4wODgxNCwtMzAuMDM2MzggLTY3LjA4ODE0LC02Ny4wODgxNHoiIGZpbGw9IiM5NDAwZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIi8%2BPHBhdGggZD0iTTI0OS42Nzg4MiwxNDEuMDQ1NzZsMTAuODMzOSwwLjAzOTgzYzEwLjUxNTI2LDAuMDc5NjYgMTAuODMzOSwwLjExOTQ5IDExLjUxMTAyLDAuNTk3NDVjMi40Mjk2NiwxLjg3MjA0IDIuMzg5ODMsNC45Mzg5OSAtMC4xNTkzMyw2LjY1MTY5Yy0wLjc1Njc4LDAuNTE3OCAtMS4xMTUyNSwwLjU1NzYzIC00LjM0MTUyLDAuNTU3NjNoLTMuNTA1MDl2MzEuMTA3NjN2MzEuMDY3NzloMy40NjUyNmMzLjk0MzIyLDAgNC44OTkxNiwwLjMxODY1IDUuODE1MjYsMS45NTE3YzEuMDM1NiwxLjgzMjIgMC41MTc4LDMuOTQzMjMgLTEuMjc0NTgsNS4yNTc2M2MtMC42NzcxMiwwLjUxNzggLTAuOTk1NzYsMC41MTc4IC0xMS41MTEwMiwwLjU5NzQ1bC0xMC44MzM5LDAuMDc5NjZsLTEuMTE1MjUsLTAuNTU3NjNjLTEuMTU1MDksLTAuNjM3MjkgLTIuMTkwNjgsLTIuMTUwODUgLTIuMTkwNjgsLTMuMzg1NmMwLC0wLjg3NjI3IDAuOTk1NzcsLTIuNjY4NjQgMS43OTIzNywtMy4yNjYxYzAuNTk3NDYsLTAuNDc3OTcgMS4xMTUyNSwtMC41MTc4IDQuMzQxNTIsLTAuNTk3NDVsMy42NjQ0LC0wLjA3OTY3di0zMS4wNjc3OXYtMzEuMDY3NzlsLTMuNjY0NCwtMC4wNzk2N2MtMy4yMjYyNywtMC4wNzk2NiAtMy43NDQwNiwtMC4xMTk0OSAtNC4zNDE1MiwtMC41OTc0NWMtMC43OTY2MSwtMC41NTc2MyAtMS43OTIzNywtMi4zNSAtMS43OTIzNywtMy4yNjYxYzAsLTEuMjM0NzUgMC45OTU3NiwtMi43ODgxNCAyLjE5MDY4LC0zLjM4NTZ6IiBmaWxsPSJub25lIiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNMjI0LjY2NTI2LDE1OC40NTE3aDI4LjA0MDY3djIxLjU0ODMxdjIxLjUwODQ4bC0yOC40Mzg5OCwtMC4wMzk4M2MtMjguMiwtMC4wNzk2NiAtMjguNDM4OTksLTAuMDc5NjcgLTI5LjMxNTI2LC0wLjU5NzQ2Yy0wLjQ3Nzk3LC0wLjI3ODgyIC0xLjExNTI1LC0wLjkxNjEgLTEuMzk0MDcsLTEuNDczNzNsLTAuNTU3NjMsLTAuOTU1OTN2LTE4LjQ0MTUzYzAsLTE3LjcyNDU4IDAuMDM5ODMsLTE4LjQ0MTUzIDAuNDc3OTcsLTE5LjM1NzYzYzAuNTk3NDYsLTEuMDc1NDIgMC45NTU5MywtMS40MzM5IDIuMTUwODUsLTEuODcyMDNjMC43NTY3OCwtMC4yMzg5OSA2LjE3MzczLC0wLjMxODY1IDI5LjAzNjQ0LC0wLjMxODY1ek0yMTQuNjI3OTcsMTY4LjQ0OTE2Yy0wLjYzNzI5LDAuMzk4MyAtMS4zMTQ0MSwxLjc5MjM3IC01LjAxODY0LDkuOTk3NDZjLTQuNjIwMzQsMTAuMjM2NDQgLTQuODU5MzIsMTAuOTEzNTYgLTMuODIzNzIsMTIuMDI4ODJjMS4xNTUwOSwxLjIzNDc1IDIuOTQ3NDUsMS4yNzQ1NyAzLjk4MzA1LDAuMDM5ODNjMC4zMTg2NSwtMC4zOTgzIDAuNzk2NiwtMS4yNzQ1NyAxLjAzNTU5LC0xLjk1MTdsMC40MzgxNCwtMS4yMzQ3NWg0Ljc3OTY2aDQuNzc5NjZsMC41NTc2MywxLjQzMzljMC43MTY5NSwxLjk1MTcgMS40NzM3MywyLjYyODgyIDIuOTA3NjMsMi42Mjg4MmMwLjkxNjEsMCAxLjE5NDkxLC0wLjExOTQ5IDEuNzkyMzcsLTAuNzk2NjFjMC41MTc4LC0wLjU1NzYzIDAuNzE2OTUsLTEuMDM1NTkgMC43MTY5NSwtMS42NzI4OGMwLC0wLjYzNzI5IC0xLjE1NTA4LC0zLjU4NDc0IC0zLjc4MzksLTkuNDM5ODNjLTQuOTc4ODEsLTExLjE5MjM3IC00LjczOTg0LC0xMC43MTQ0MSAtNS41MzY0NSwtMTEuMTEyNzFjLTAuOTE2MSwtMC41MTc4IC0xLjkxMTg3LC0wLjQ3Nzk2IC0yLjgyNzk3LDAuMDc5NjZ6IiBmaWxsPSJub25lIiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNMjE2LjEwMTcsMTc2LjA5NjYxYzAuMTU5MzIsMC4xNTkzMiAyLjU4ODk4LDYuMTMzOSAyLjU4ODk4LDYuMzMzMDVjMCwwLjE1OTMyIC0xLjE5NDkxLDAuMjM4OTggLTIuNzA4NDcsMC4yMzg5OGMtMi4wNzExOCwwIC0yLjY2ODY0LC0wLjA3OTY2IC0yLjU4ODk4LC0wLjMxODY1YzAuMDc5NjYsLTAuMTU5MzIgMC42NzcxMiwtMS42MzMwNSAxLjM5NDA3LC0zLjMwNTkzYzAuNzE2OTUsLTEuNjMzMDUgMS4zMTQ0LC0yLjk4NzI5IDEuMzE0NCwtMi45NDc0NnoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yNjcuNjQyMzgsMTgwdi0yMS41ODgxM2w4LjI4NDc0LDAuMDc5NjZjNy44MDY3OCwwLjA3OTY2IDguMzI0NTgsMC4xMTk1IDkuMTIxMTksMC41OTc0NmMwLjQ3Nzk2LDAuMjc4ODIgMS4xMTUyNSwwLjkxNjEgMS4zOTQwNywxLjQ3MzczbDAuNTU3NjIsMC45NTU5M3YxOC40ODEzNnYxOC40NDE1M2wtMC41NTc2MiwwLjk1NTkzYy0wLjI3ODgyLDAuNTU3NjMgLTAuOTE2MTEsMS4xOTQ5MSAtMS4zOTQwNywxLjQ3MzczYy0wLjgzNjQ0LDAuNTE3OCAtMS4zMTQ0MSwwLjUxNzggLTkuMTIxMTksMC41OTc0NmwtOC4yODQ3NCwwLjA3OTY2di0yMS41NDgzeiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTI0OS42Nzg4MiwxNDEuMDQ1NzZsMTAuODMzOSwwLjAzOTgzYzEwLjUxNTI2LDAuMDc5NjYgMTAuODMzOSwwLjExOTQ5IDExLjUxMTAyLDAuNTk3NDVjMi40Mjk2NiwxLjg3MjA0IDIuMzg5ODMsNC45Mzg5OSAtMC4xNTkzMyw2LjY1MTY5Yy0wLjc1Njc4LDAuNTE3OCAtMS4xMTUyNSwwLjU1NzYzIC00LjM0MTUyLDAuNTU3NjNoLTMuNTA1MDl2MzEuMTA3NjN2MzEuMDY3NzloMy40NjUyNmMzLjk0MzIyLDAgNC44OTkxNiwwLjMxODY1IDUuODE1MjYsMS45NTE3YzEuMDM1NiwxLjgzMjIgMC41MTc4LDMuOTQzMjMgLTEuMjc0NTgsNS4yNTc2M2MtMC42NzcxMiwwLjUxNzggLTAuOTk1NzYsMC41MTc4IC0xMS41MTEwMiwwLjU5NzQ1bC0xMC44MzM5LDAuMDc5NjZsLTEuMTE1MjUsLTAuNTU3NjNjLTEuMTU1MDksLTAuNjM3MjkgLTIuMTkwNjgsLTIuMTUwODUgLTIuMTkwNjgsLTMuMzg1NmMwLC0wLjg3NjI3IDAuOTk1NzcsLTIuNjY4NjQgMS43OTIzNywtMy4yNjYxYzAuNTk3NDYsLTAuNDc3OTcgMS4xMTUyNSwtMC41MTc4IDQuMzQxNTIsLTAuNTk3NDVsMy42NjQ0LC0wLjA3OTY3di0zMS4wNjc3OXYtMzEuMDY3NzlsLTMuNjY0NCwtMC4wNzk2N2MtMy4yMjYyNywtMC4wNzk2NiAtMy43NDQwNiwtMC4xMTk0OSAtNC4zNDE1MiwtMC41OTc0NWMtMC43OTY2MSwtMC41NTc2MyAtMS43OTIzNywtMi4zNSAtMS43OTIzNywtMy4yNjYxYzAsLTEuMjM0NzUgMC45OTU3NiwtMi43ODgxNCAyLjE5MDY4LC0zLjM4NTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjxwYXRoIGQ9Ik0yNTEuMzcyNiwxNTguNDUxN3Y0My4wNTY3OGMwLDAgLTU1LjU0NDYzLC0wLjExOTUgLTU2LjQyMDksLTAuNjM3MjljLTAuNDc3OTcsLTAuMjc4ODIgLTEuMTE1MjUsLTAuOTE2MSAtMS4zOTQwNywtMS40NzM3M2wtMC41NTc2MywtMC45NTU5M3YtMTguNDQxNTNjMCwtMTcuNzI0NTggMC4wMzk4MywtMTguNDQxNTMgMC40Nzc5NywtMTkuMzU3NjNjMC41OTc0NiwtMS4wNzU0MiAwLjk1NTkzLC0xLjQzMzkgMi4xNTA4NSwtMS44NzIwM2MwLjc1Njc4LC0wLjIzODk5IDU1Ljc0Mzc4LC0wLjMxODY1IDU1Ljc0Mzc4LC0wLjMxODY1ek0yMTQuNjI3OTcsMTY4LjQ0OTE2Yy0wLjYzNzI5LDAuMzk4MyAtMS4zMTQ0MSwxLjc5MjM3IC01LjAxODY0LDkuOTk3NDZjLTQuNjIwMzQsMTAuMjM2NDQgLTQuODU5MzIsMTAuOTEzNTYgLTMuODIzNzIsMTIuMDI4ODJjMS4xNTUwOSwxLjIzNDc1IDIuOTQ3NDUsMS4yNzQ1NyAzLjk4MzA1LDAuMDM5ODNjMC4zMTg2NSwtMC4zOTgzIDAuNzk2NiwtMS4yNzQ1NyAxLjAzNTU5LC0xLjk1MTdsMC40MzgxNCwtMS4yMzQ3NWg0Ljc3OTY2aDQuNzc5NjZsMC41NTc2MywxLjQzMzljMC43MTY5NSwxLjk1MTcgMS40NzM3MywyLjYyODgyIDIuOTA3NjMsMi42Mjg4MmMwLjkxNjEsMCAxLjE5NDkxLC0wLjExOTQ5IDEuNzkyMzcsLTAuNzk2NjFjMC41MTc4LC0wLjU1NzYzIDAuNzE2OTUsLTEuMDM1NTkgMC43MTY5NSwtMS42NzI4OGMwLC0wLjYzNzI5IC0xLjE1NTA4LC0zLjU4NDc0IC0zLjc4MzksLTkuNDM5ODNjLTQuOTc4ODEsLTExLjE5MjM3IC00LjczOTg0LC0xMC43MTQ0MSAtNS41MzY0NSwtMTEuMTEyNzFjLTAuOTE2MSwtMC41MTc4IC0xLjkxMTg3LC0wLjQ3Nzk2IC0yLjgyNzk3LDAuMDc5NjZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjxwYXRoIGQ9Ik0yMTYuMTAxNywxNzYuMDk2NjFjMC4xNTkzMiwwLjE1OTMyIDIuNTg4OTgsNi4xMzM5IDIuNTg4OTgsNi4zMzMwNWMwLDAuMTU5MzIgLTEuMTk0OTEsMC4yMzg5OCAtMi43MDg0NywwLjIzODk4Yy0yLjA3MTE4LDAgLTIuNjY4NjQsLTAuMDc5NjYgLTIuNTg4OTgsLTAuMzE4NjVjMC4wNzk2NiwtMC4xNTkzMiAwLjY3NzEyLC0xLjYzMzA1IDEuMzk0MDcsLTMuMzA1OTNjMC43MTY5NSwtMS42MzMwNSAxLjMxNDQsLTIuOTg3MjkgMS4zMTQ0LC0yLjk0NzQ2eiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNMjY4Ljk3NTcxLDE1OC40MTE4N2MwLDAgMTUuMjc1OTksMC4xOTkxNSAxNi4wNzI2LDAuNjc3MTJjMC40Nzc5NiwwLjI3ODgyIDEuMTE1MjUsMC45MTYxIDEuMzk0MDcsMS40NzM3M2wwLjU1NzYyLDAuOTU1OTN2MTguNDgxMzZ2MTguNDQxNTNsLTAuNTU3NjIsMC45NTU5M2MtMC4yNzg4MiwwLjU1NzYzIC0wLjkxNjExLDEuMTk0OTEgLTEuMzk0MDcsMS40NzM3M2MtMC44MzY0NCwwLjUxNzggLTE2LjA3MjYsMC42NzcxMiAtMTYuMDcyNiwwLjY3NzEyeiIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiLz48L2c%2BPC9nPjwvc3ZnPg%3D%3D%22%3B%0A%0A%20%20const%20blockIconURI%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI3OS4zNjMxMyIgaGVpZ2h0PSI4Ny45MjE0OSIgdmlld0JveD0iMCwwLDc5LjM2MzEzLDg3LjkyMTQ5Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAwLjMxODQzLC0xMzYuMDQxNDMpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0yMzIuNjcxMTksMTgwLjAwMDAzdjIxLjU0ODNsLTExLjcwNjUyLC0wLjA3OTY2Yy0xMS4wMzExNiwtMC4wNzk2NiAtMTEuNzA2NTQsLTAuMDc5NjYgLTEyLjg4ODQ1LC0wLjU5NzQ2Yy0wLjY3NTM3LC0wLjI3ODgyIC0xLjU3NTg3LC0wLjkxNjEgLTEuOTY5ODUsLTEuNDczNzNsLTAuNzg3OTMsLTAuOTU1OTN2LTE4LjQ0MTUzdi0xOC40ODEzNmwwLjc4NzkzLC0wLjk1NTkzYzAuMzkzOTgsLTAuNTU3NjMgMS4yOTQ0OCwtMS4xOTQ5MSAxLjk2OTg1LC0xLjQ3MzczYzEuMTI1NjMsLTAuNDc3OTYgMS44NTcyOSwtMC41MTc4IDEyLjg4ODQ1LC0wLjU5NzQ2bDExLjcwNjUyLC0wLjA3OTY2djIxLjU4ODEzeiIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aW5kZXgmcXVvdDs6bnVsbH0iIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yMzAuNzg3MTYsMjAxLjU0ODMzYzAsMCAtMjEuNTI5MDQsLTAuMTU5MzIgLTIyLjcxMDk0LC0wLjY3NzEyYy0wLjY3NTM3LC0wLjI3ODgyIC0xLjU3NTg3LC0wLjkxNjEgLTEuOTY5ODUsLTEuNDczNzNsLTAuNzg3OTMsLTAuOTU1OTN2LTE4LjQ0MTUzdi0xOC40ODEzNmwwLjc4NzkzLC0wLjk1NTkzYzAuMzkzOTgsLTAuNTU3NjMgMS4yOTQ0OCwtMS4xOTQ5MSAxLjk2OTg1LC0xLjQ3MzczYzEuMTI1NjMsLTAuNDc3OTcgMjIuNzEwOTQsLTAuNjc3MTIgMjIuNzEwOTQsLTAuNjc3MTJ6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9IjEiLz48cGF0aCBkPSJNMjQ3LjMyODgxLDE4MC4wMDAwMXYtMjEuNTg4MTNsMTEuNzA2NTIsMC4wNzk2NmMxMS4wMzExNiwwLjA3OTY2IDExLjc2MjgyLDAuMTE5NSAxMi44ODg0NSwwLjU5NzQ2YzAuNjc1MzcsMC4yNzg4MiAxLjU3NTg3LDAuOTE2MSAxLjk2OTg1LDEuNDczNzNsMC43ODc5MywwLjk1NTkzdjE4LjQ4MTM2djE4LjQ0MTUzbC0wLjc4NzkzLDAuOTU1OTNjLTAuMzkzOTgsMC41NTc2MyAtMS4yOTQ0OCwxLjE5NDkxIC0xLjk2OTg1LDEuNDczNzNjLTEuMTgxOTEsMC41MTc4IC0xLjg1NzI5LDAuNTE3OCAtMTIuODg4NDUsMC41OTc0NmwtMTEuNzA2NTIsMC4wNzk2NnYtMjEuNTQ4M3oiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yNDkuMjEyODQsMTU4LjQxMTg4YzAsMCAyMS41ODUzMiwwLjE5OTE1IDIyLjcxMDk0LDAuNjc3MTJjMC42NzUzNywwLjI3ODgyIDEuNTc1ODcsMC45MTYxIDEuOTY5ODUsMS40NzM3M2wwLjc4NzkzLDAuOTU1OTN2MTguNDgxMzZ2MTguNDQxNTNsLTAuNzg3OTMsMC45NTU5M2MtMC4zOTM5OCwwLjU1NzYzIC0xLjI5NDQ4LDEuMTk0OTEgLTEuOTY5ODUsMS40NzM3M2MtMS4xODE5MSwwLjUxNzggLTIyLjcxMDk0LDAuNjc3MTIgLTIyLjcxMDk0LDAuNjc3MTJ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjxwYXRoIGQ9Ik0yMjkuNTk1NTYsMTQxLjA0NTc3bDEwLjgzMzksMC4wMzk4M2MxMC41MTUyNiwwLjA3OTY2IDEwLjgzMzksMC4xMTk0OSAxMS41MTEwMiwwLjU5NzQ1YzIuNDI5NjYsMS44NzIwNCAyLjM4OTgzLDQuOTM4OTkgLTAuMTU5MzMsNi42NTE2OWMtMC43NTY3OCwwLjUxNzggLTEuMTE1MjUsMC41NTc2MyAtNC4zNDE1MiwwLjU1NzYzaC0zLjUwNTA5djMxLjEwNzYzdjMxLjA2Nzc5aDMuNDY1MjZjMy45NDMyMiwwIDQuODk5MTYsMC4zMTg2NSA1LjgxNTI2LDEuOTUxN2MxLjAzNTYsMS44MzIyIDAuNTE3OCwzLjk0MzIzIC0xLjI3NDU4LDUuMjU3NjNjLTAuNjc3MTIsMC41MTc4IC0wLjk5NTc2LDAuNTE3OCAtMTEuNTExMDIsMC41OTc0NWwtMTAuODMzOSwwLjA3OTY2bC0xLjExNTI1LC0wLjU1NzYzYy0xLjE1NTA5LC0wLjYzNzI5IC0yLjE5MDY4LC0yLjE1MDg1IC0yLjE5MDY4LC0zLjM4NTZjMCwtMC44NzYyNyAwLjk5NTc3LC0yLjY2ODY0IDEuNzkyMzcsLTMuMjY2MWMwLjU5NzQ2LC0wLjQ3Nzk3IDEuMTE1MjUsLTAuNTE3OCA0LjM0MTUyLC0wLjU5NzQ1bDMuNjY0NCwtMC4wNzk2N3YtMzEuMDY3Nzl2LTMxLjA2Nzc5bC0zLjY2NDQsLTAuMDc5NjdjLTMuMjI2MjcsLTAuMDc5NjYgLTMuNzQ0MDYsLTAuMTE5NDkgLTQuMzQxNTIsLTAuNTk3NDVjLTAuNzk2NjEsLTAuNTU3NjMgLTEuNzkyMzcsLTIuMzUgLTEuNzkyMzcsLTMuMjY2MWMwLC0xLjIzNDc1IDAuOTk1NzYsLTIuNzg4MTQgMi4xOTA2OCwtMy4zODU2eiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTIyOS41OTU1NiwxNDEuMDQ1NzdsMTAuODMzOSwwLjAzOTgzYzEwLjUxNTI2LDAuMDc5NjYgMTAuODMzOSwwLjExOTQ5IDExLjUxMTAyLDAuNTk3NDVjMi40Mjk2NiwxLjg3MjA0IDIuMzg5ODMsNC45Mzg5OSAtMC4xNTkzMyw2LjY1MTY5Yy0wLjc1Njc4LDAuNTE3OCAtMS4xMTUyNSwwLjU1NzYzIC00LjM0MTUyLDAuNTU3NjNoLTMuNTA1MDl2MzEuMTA3NjN2MzEuMDY3NzloMy40NjUyNmMzLjk0MzIyLDAgNC44OTkxNiwwLjMxODY1IDUuODE1MjYsMS45NTE3YzEuMDM1NiwxLjgzMjIgMC41MTc4LDMuOTQzMjMgLTEuMjc0NTgsNS4yNTc2M2MtMC42NzcxMiwwLjUxNzggLTAuOTk1NzYsMC41MTc4IC0xMS41MTEwMiwwLjU5NzQ1bC0xMC44MzM5LDAuMDc5NjZsLTEuMTE1MjUsLTAuNTU3NjNjLTEuMTU1MDksLTAuNjM3MjkgLTIuMTkwNjgsLTIuMTUwODUgLTIuMTkwNjgsLTMuMzg1NmMwLC0wLjg3NjI3IDAuOTk1NzcsLTIuNjY4NjQgMS43OTIzNywtMy4yNjYxYzAuNTk3NDYsLTAuNDc3OTcgMS4xMTUyNSwtMC41MTc4IDQuMzQxNTIsLTAuNTk3NDVsMy42NjQ0LC0wLjA3OTY3di0zMS4wNjc3OXYtMzEuMDY3NzlsLTMuNjY0NCwtMC4wNzk2N2MtMy4yMjYyNywtMC4wNzk2NiAtMy43NDQwNiwtMC4xMTk0OSAtNC4zNDE1MiwtMC41OTc0NWMtMC43OTY2MSwtMC41NTc2MyAtMS43OTIzNywtMi4zNSAtMS43OTIzNywtMy4yNjYxYzAsLTEuMjM0NzUgMC45OTU3NiwtMi43ODgxNCAyLjE5MDY4LC0zLjM4NTZ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjwvZz48L2c%2BPC9zdmc%2B%22%3B%0A%0A%20%20const%20formatIcon%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSIxNTAuOTAzNTUiIGhlaWdodD0iOTUuNSIgdmlld0JveD0iMCwwLDE1MC45MDM1NSw5NS41Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTY0LjU0ODIyLC0xMzIuMjUpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0yMzkuNzQxOTcsMjAxLjgxODIzYzAsMCAtNDAuMjY2OTcsLTAuMTU5MzIgLTQxLjU1OTI5LC0wLjY3NzEyYy0wLjczODQ2LC0wLjI3ODgyIC0xLjcyMzA5LC0wLjkxNjEgLTIuMTUzODcsLTEuNDczNzNsLTAuODYxNTQsLTAuOTU1OTN2LTE4LjQ0MTUzdi0xOC40ODEzNmwwLjg2MTU0LC0wLjk1NTkzYzAuNDMwNzksLTAuNTU3NjMgMS40MTU0MSwtMS4xOTQ5MSAyLjE1Mzg3LC0xLjQ3MzczYzEuMjMwNzksLTAuNDc3OTYgNDEuNTU5MjksLTAuNjc3MTIgNDEuNTU5MjksLTAuNjc3MTJ6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTIzNC4wOTEzNiwxNTguNjgxNzhjMCwwIDQyLjY2MTg0LDAuMTk5MTYgNDMuODkyNjIsMC42NzcxMmMwLjczODQ2LDAuMjc4ODIgMS43MjMwOSwwLjkxNjEgMi4xNTM4NywxLjQ3MzczbDAuODYxNTQsMC45NTU5M3YxOC40ODEzNnYxOC40NDE1M2wtMC44NjE1NCwwLjk1NTkzYy0wLjQzMDc5LDAuNTU3NjMgLTEuNDE1NDEsMS4xOTQ5MSAtMi4xNTM4NywxLjQ3MzczYy0xLjI5MjMyLDAuNTE3OCAtNDMuODkyNjIsMC42NzcxMiAtNDMuODkyNjIsMC42NzcxMnoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yMzYuMTUxNCwxNTguNjgxNzhjMCwwIDQwLjYwMTgxLDAuMTk5MTUgNDEuODMyNTksMC42NzcxMmMwLjczODQ2LDAuMjc4ODIgMS43MjMwOSwwLjkxNjEgMi4xNTM4NywxLjQ3MzczbDAuODYxNTQsMC45NTU5M3YxOC40ODEzNnYxOC40NDE1M2wtMC44NjE1NCwwLjk1NTkzYy0wLjQzMDc5LDAuNTU3NjMgLTEuNDE1NDEsMS4xOTQ5MSAtMi4xNTM4NywxLjQ3MzczYy0xLjI5MjMyLDAuNTE3OCAtNDEuODMyNTksMC42NzcxMiAtNDEuODMyNTksMC42NzcxMnoiIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIi8%2BPHBhdGggZD0iTTIzNy42ODE5MywyMDEuODE4MjNjMCwwIC0zOC4yMDY5NCwtMC4xNTkzMiAtMzkuNDk5MjYsLTAuNjc3MTJjLTAuNzM4NDYsLTAuMjc4ODIgLTEuNzIzMDksLTAuOTE2MSAtMi4xNTM4NywtMS40NzM3M2wtMC44NjE1NCwtMC45NTU5M3YtMTguNDQxNTN2LTE4LjQ4MTM2bDAuODYxNTQsLTAuOTU1OTNjMC40MzA3OSwtMC41NTc2MyAxLjQxNTQxLC0xLjE5NDkxIDIuMTUzODcsLTEuNDczNzNjMS4yMzA3OCwtMC40Nzc5NyAzOS40OTkyNiwtMC42NzcxMiAzOS40OTkyNiwtMC42NzcxMnoiIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2luZGV4JnF1b3Q7Om51bGx9IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjxwYXRoIGQ9Ik0xNjkuNTQ4MjIsMTU0LjQwNzUydi0xNy4xNTc1MmgxNy4xNTc1MnoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0zMTAuNDUxNzgsMjA1LjU5MjQ4djE3LjE1NzUyaC0xNy4xNTc1MnoiIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2luZGV4JnF1b3Q7Om51bGx9IiBmaWxsPSJub25lIiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNMTY5LjU0ODIzLDE1NC40MDc1MnYtMTcuMTU3NTJoMTcuMTU3NTJ6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIvPjxwYXRoIGQ9Ik0zMTAuNDUxNzgsMjA1LjU5MjQ4djE3LjE1NzUyaC0xNy4xNTc1MnoiIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2luZGV4JnF1b3Q7Om51bGx9IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIvPjxwYXRoIGQ9Ik0xODYuNzA1NzYsMjIyLjc1aC0xNy4xNTc1MnYtMTcuMTU3NTJ6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTI5My4yOTQyNSwxMzcuMjVoMTcuMTU3NTJ2MTcuMTU3NTJ6IiBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpbmRleCZxdW90OzpudWxsfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjkwMGI0IiBzdHJva2Utd2lkdGg9IjEwIi8%2BPHBhdGggZD0iTTE4Ni43MDU3NiwyMjIuNzVoLTE3LjE1NzUydi0xNy4xNTc1MnoiIGRhdGEtcGFwZXItZGF0YT0ieyZxdW90O2luZGV4JnF1b3Q7Om51bGx9IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMCIvPjxwYXRoIGQ9Ik0yOTMuMjk0MjUsMTM3LjI1aDE3LjE1NzUydjE3LjE1NzUyeiIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7aW5kZXgmcXVvdDs6bnVsbH0iIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIwIi8%2BPHBhdGggZD0iTTIzNi4yNjY0NCwxNjUuNjY5ODVjMS4xODI3MiwtMC43MTk5MSAyLjQ4NDMxLC0wLjc3MTMzIDMuNjY3MDMsLTAuMTAyODNjMS4wMjg0NSwwLjUxNDIyIDAuNzc2MzksLTAuMDQwOTQgNy4yMDQyMSwxNC40MDg4YzMuMzkzOSw3LjU1OTEzIDQuODY5NjUsMTEuNDA4NTMgNC44Njk2NSwxMi4yMzEyOWMwLDAuODIyNzYgLTAuMjYyMzgsMS40NDUyOSAtMC45MzA4OCwyLjE2NTIxYy0wLjc3MTM0LDAuODc0MTkgLTEuMTM3ODQsMS4wMzM3NCAtMi4zMjA1NSwxLjAzMzc0Yy0xLjg1MTIxLDAgLTIuODk4MjIsLTAuOTgyNTUgLTMuODIzODIsLTMuNTAyMjdsLTAuNjUyODgsLTEuNzQwOWwtNi4yMDUwNSwwLjAwOTg1bC02LjIwNSwtMC4wMDk5bC0wLjQ5ODQ5LDEuNDgzODZjLTAuMzA4NTQsMC44NzQyIC0wLjk5MDc4LDIuMTE2OTMgLTEuNDAyMTcsMi42MzExNWMtMS4zMzcsMS41OTQwOSAtMy42NjMxMywxLjUzMzU5IC01LjE1NDM5LC0wLjA2MDUxYy0xLjMzNywtMS40Mzk4NCAtMS4wNDcyOSwtMi4zNzMyOCA0LjkxNzczLC0xNS41ODg4OGM0Ljc4MjI5LC0xMC41OTMwNiA1LjcxMTg0LC0xMi40NDQ0MSA2LjUzNDYsLTEyLjk1ODYzeiIgZGF0YS1wYXBlci1kYXRhPSJ7JnF1b3Q7bm9Ib3ZlciZxdW90OzpmYWxzZSwmcXVvdDtvcmlnSXRlbSZxdW90OzpbJnF1b3Q7UGF0aCZxdW90Oyx7JnF1b3Q7YXBwbHlNYXRyaXgmcXVvdDs6dHJ1ZSwmcXVvdDtzZWdtZW50cyZxdW90OzpbW1szMzcuMjU1OTQsMTk4LjIzMTY1XSxbMCwwXSxbLTEuMjc0NTgsMC43OTY2XV0sW1szMjcuMjE4NjYsMjE4LjIyNjU3XSxbNy40MDg0NiwtMTYuNDEwMThdLFstOS4yNDA2OCwyMC40NzI4OF1dLFtbMzE5LjU3MTIyLDI0Mi4yODQyMV0sWy0yLjA3MTIsLTIuMjMwNTJdLFsyLjMxMDE4LDIuNDY5NV1dLFtbMzI3LjUzNzMyLDI0Mi4zNjM4N10sWy0yLjA3MTIsMi40Njk0OF0sWzAuNjM3MywtMC43OTY2XV0sW1szMjkuNjA4NSwyMzguNDYwNDddLFstMC40Nzc5OCwxLjM1NDI2XSxbMCwwXV0sWzMzMC40ODQ3OCwyMzUuOTkwOTddLFszNDAuMDQ0MSwyMzUuOTkwOTddLFszNDkuNjAzNDIsMjM1Ljk5MDk3XSxbWzM1MC43MTg2OCwyMzguODU4NzddLFswLDBdLFsxLjQzMzksMy45MDM0XV0sW1szNTYuNTMzOTQsMjQ0LjExNjQxXSxbLTIuODY3OCwwXSxbMS44MzIyLDBdXSxbWzM2MC4xMTg2OCwyNDIuNTIzMTldLFstMS4xOTQ5MiwxLjM1NDI0XSxbMS4wMzU2LC0xLjExNTI2XV0sW1szNjEuNTUyNTgsMjM5LjE3NzQzXSxbMCwxLjI3NDU4XSxbMCwtMS4yNzQ1OF1dLFtbMzUzLjk4NDc4LDIyMC4yOTc3N10sWzUuMjU3NjQsMTEuNzEwMThdLFstOS45NTc2MiwtMjIuMzg0NzRdXSxbWzM0Mi45MTE4OCwxOTguMDcyMzVdLFsxLjU5MzIyLDAuNzk2Nl0sWy0xLjgzMjIsLTEuMDM1Nl1dLFtbMzM3LjI1NTk0LDE5OC4yMzE2N10sWzEuODMyMiwtMS4xMTUyNF0sWzAsMF1dXSwmcXVvdDtjbG9zZWQmcXVvdDs6dHJ1ZSwmcXVvdDtmaWxsQ29sb3ImcXVvdDs6WzAsMCwwLDFdfV19IiBmaWxsPSIjNjkwMGI0IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMC41Ii8%2BPHBhdGggZD0iTTIzOC4xNzcwNCwxNzUuNjA3MDJjMC4yMDU2OSwwLjIwNTY5IDMuMzQyNDYsNy45MTkwOCAzLjM0MjQ2LDguMTc2MTljMCwwLjIwNTY5IC0xLjU0MjY3LDAuMzA4NTMgLTMuNDk2NzMsMC4zMDg1M2MtMi42NzM5NywwIC0zLjQ0NTMxLC0wLjEwMjg0IC0zLjM0MjQ2LC0wLjQxMTM5YzAuMTAyODQsLTAuMjA1NjkgMC44NzQxOSwtMi4xMDgzMiAxLjc5OTc5LC00LjI2ODA3YzAuOTI1NjEsLTIuMTA4MzIgMS42OTY5NCwtMy44NTY3IDEuNjk2OTQsLTMuODA1Mjd6IiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjwvZz48L2c%2BPC9zdmc%2B%22%3B%0A%0A%20%20const%20colorIcon%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI3NS41MzUxNyIgaGVpZ2h0PSI3MS40OTc0NiIgdmlld0JveD0iMCwwLDc1LjUzNTE3LDcxLjQ5NzQ2Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjAyLjIzMjQxLC0xNDQuMjUxMjcpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGwtcnVsZT0ibm9uemVybyIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0yMjMuNTM4NTYsMTY1LjcxMjcxYzAsLTkuMDkxNDEgNy4zNzAwNCwtMTYuNDYxNDQgMTYuNDYxNDQsLTE2LjQ2MTQ0YzkuMDkxNDEsMCAxNi40NjE0NCw3LjM3MDA0IDE2LjQ2MTQ0LDE2LjQ2MTQ0YzAsOS4wOTE0MSAtNy4zNzAwMywxNi40NjE0NCAtMTYuNDYxNDQsMTYuNDYxNDRjLTkuMDkxNDEsMCAtMTYuNDYxNDQsLTcuMzcwMDMgLTE2LjQ2MTQ0LC0xNi40NjE0NHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yMDcuMjMyNDIsMTk0LjI4NzI5YzAsLTkuMDkxNDEgNy4zNzAwNCwtMTYuNDYxNDQgMTYuNDYxNDQsLTE2LjQ2MTQ0YzkuMDkxNDEsMCAxNi40NjE0NCw3LjM3MDA0IDE2LjQ2MTQ0LDE2LjQ2MTQ0YzAsOS4wOTE0MSAtNy4zNzAwNCwxNi40NjE0NCAtMTYuNDYxNDQsMTYuNDYxNDRjLTkuMDkxNDEsMCAtMTYuNDYxNDQsLTcuMzcwMDMgLTE2LjQ2MTQ0LC0xNi40NjE0NHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yMzkuODQ0NzEsMTk0LjI4NzI5YzAsLTkuMDkxNDEgNy4zNzAwNCwtMTYuNDYxNDQgMTYuNDYxNDQsLTE2LjQ2MTQ0YzkuMDkxNDEsMCAxNi40NjE0NCw3LjM3MDA0IDE2LjQ2MTQ0LDE2LjQ2MTQ0YzAsOS4wOTE0MSAtNy4zNzAwMywxNi40NjE0NCAtMTYuNDYxNDQsMTYuNDYxNDRjLTkuMDkxNDEsMCAtMTYuNDYxNDQsLTcuMzcwMDMgLTE2LjQ2MTQ0LC0xNi40NjE0NHoiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY5MDBiNCIgc3Ryb2tlLXdpZHRoPSIxMCIvPjxwYXRoIGQ9Ik0yMjMuNTM4NTYsMTY1LjcxMjcxYzAsLTkuMDkxNDEgNy4zNzAwMywtMTYuNDYxNDQgMTYuNDYxNDQsLTE2LjQ2MTQ0YzkuMDkxNCwwIDE2LjQ2MTQ0LDcuMzcwMDQgMTYuNDYxNDQsMTYuNDYxNDRjMCw5LjA5MTQxIC03LjM3MDAzLDE2LjQ2MTQ0IC0xNi40NjE0NCwxNi40NjE0NGMtOS4wOTE0LDAgLTE2LjQ2MTQ0LC03LjM3MDAzIC0xNi40NjE0NCwtMTYuNDYxNDR6IiBmaWxsPSIjMDBmZjAxIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0ibm9uZSIvPjxwYXRoIGQ9Ik0yMDcuMjMyNDEsMTk0LjI4NzI5YzAsLTkuMDkxNCA3LjM3MDA0LC0xNi40NjE0NCAxNi40NjE0NCwtMTYuNDYxNDRjOS4wOTE0LDAgMTYuNDYxNDQsNy4zNzAwNCAxNi40NjE0NCwxNi40NjE0NGMwLDkuMDkxNCAtNy4zNzAwNCwxNi40NjE0NCAtMTYuNDYxNDQsMTYuNDYxNDRjLTkuMDkxNCwwIC0xNi40NjE0NCwtNy4zNzAwNCAtMTYuNDYxNDQsLTE2LjQ2MTQ0eiIgZmlsbD0iI2ZmMDAwMCIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9Im5vbmUiLz48cGF0aCBkPSJNMjM5Ljg0NDcxLDE5NC4yODcyOWMwLC05LjA5MTQxIDcuMzcwMDMsLTE2LjQ2MTQ0IDE2LjQ2MTQ0LC0xNi40NjE0NGM5LjA5MTQsMCAxNi40NjE0NCw3LjM3MDA0IDE2LjQ2MTQ0LDE2LjQ2MTQ0YzAsOS4wOTE0MSAtNy4zNzAwMywxNi40NjE0NCAtMTYuNDYxNDQsMTYuNDYxNDRjLTkuMDkxNCwwIC0xNi40NjE0NCwtNy4zNzAwNCAtMTYuNDYxNDQsLTE2LjQ2MTQ0eiIgZmlsbD0iIzAwNzFmZiIgc3Ryb2tlPSJub25lIiBzdHJva2Utd2lkdGg9Im5vbmUiLz48L2c%2BPC9nPjwvc3ZnPg%3D%3D%22%3B%0A%0A%20%20const%20effectIcon%20%3D%0A%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHdpZHRoPSI1Ny40NDI0MSIgaGVpZ2h0PSI3MC40NSIgdmlld0JveD0iMCwwLDU3LjQ0MjQxLDcwLjQ1Ij48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjEwLjI2NjQ1LC0xNDQuODU2NTUpIj48ZyBkYXRhLXBhcGVyLWRhdGE9InsmcXVvdDtpc1BhaW50aW5nTGF5ZXImcXVvdDs6dHJ1ZX0iIGZpbGw9IiNmZmZmZmYiIGZpbGwtcnVsZT0iZXZlbm9kZCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3R5bGU9Im1peC1ibGVuZC1tb2RlOiBub3JtYWwiPjxwYXRoIGQ9Ik0yMTUuMjY2NDUsMTkzLjkwNDFjLTMuOTg4MTUsLTguMTE3MSAtMy45OTYxMSwtMTguMjQzMDUgMC4xNTIyMSwtMjYuNDExMDNjNC42ODc3OSwtOS41NzQzMSAxMi41NzY5MSwtMTMuODE3OTcgMTUuNzQ3NTYsLTE1LjE5Nzc1YzEuOTA1OCwtMC44ODUwOCAzLjkxMzg4LC0xLjU3NDk3IDYuMDc1MzcsLTIuMDgzMTNsMi4xMjA1OSwtMC40NTc2OGMxLjU1ODA1LC0wLjMxOTcgMy4xMDkyOCwwLjY0NjE0IDMuNDQ2OCwyLjE4NzQ1YzAuMzQwOTMsMS41NDQ2OCAtMC42NTExOCwzLjA2NTggLTIuMjE2MDUsMy40MDIzM2wtMi4wNjI2MywwLjQ0NDIyYy0xLjcxNDg4LDAuNDAzODQgLTMuMzU4MTYsMC45NjkyMSAtNC45NjA1MywxLjcxNjMxYy0yLjA4MzA4LDAuOTAxOSAtOC45NzMyOCw0LjM5MTczIC0xMi45NDg1MiwxMi41MTU2Yy0zLjAxNzIzLDUuOTMzMDUgLTMuOTE3MjksMTUuMzY2MDIgMC44MzE4NywyMy4xNDk5OGM0LjMwMjU0LDcuNDk3OTIgMTMuMTEyMTcsMTIuMDk0OTMgMjEuNDY4MzcsMTEuMzIwOTFjNy45MDI3NiwtMC41Njg3NCAxNS4xNTQzNCwtNS44Mjg3MiAxNy42OTc2OCwtMTIuNzk0OTJjMi41ODA4NCwtNi41NTIyNiAwLjg2NTk2LC0xMy4yNjk0MyAtMS45NjcxNywtMTcuMDUyMDRjLTMuNDEyNzEsLTQuNjYwOTYgLTcuNjYwNywtNi4wOTQ1OCAtOS4zMjc4NSwtNi40OTUwNWMtMC4yNDg4OCwtMC4wNzQwNCAtNi4wODU2LC0xLjgyNzM2IC0xMS4yNDA0NiwwLjc1MzgzYy0yLjIxOTQ1LDEuMDYzNDQgLTUuMDkwMDksMy40NTYxOCAtNi42Mjc2OCw3LjA1MDMzYy0xLjY2MDMzLDMuNzExOTQgLTEuMjMwNzYsOC40ODM5NSAxLjAxOTM4LDExLjY1NDA4YzIuMjYzNzgsMy4zOTg5NyA2LjUzMjIyLDUuMzIzOTIgMTAuMjA0MDQsNC42NzEwNWMzLjY1NDc3LC0wLjU3NTQ3IDYuMTI2NTEsLTMuMjk0NjQgNi43MTI5MSwtNS42ODQwMWMwLjY4ODY4LC0yLjU2NzczIC0wLjM2ODIsLTQuNzM4MzYgLTEuMTkzMjYsLTUuNTE5MTFjLTEuNDAxMjIsLTEuMzgzMTQgLTIuNjExNTIsLTEuNDA2NyAtMi42NjI2NiwtMS40MTAwN2MtMC41NzI3NiwtMC4wMTY4MyAtMC44NTU3MywwLjAyNjkyIC0xLjAyNjIsMC4wNTM4NGMtMC42NTQ1OSwwLjIzODk0IC0xLjU4MTkyLDAuNzYzOTMgLTEuODU0NjYsMS4zMTU4NGMtMC4wNDc3MywwLjA5MDg2IC0wLjE3MDQ3LDAuMzM5OSAwLjA2NDc4LDAuOTYyNDhjMC41NjI1MywxLjQ3NzM3IC0wLjE5Nzc0LDMuMTI5NzQgLTEuNjk0NDIsMy42ODUwMmMtMS40ODk4NiwwLjU1ODY0IC0zLjE2NzI0LC0wLjE5MTgyIC0zLjczMzE4LC0xLjY3MjU2Yy0wLjkzMDc0LC0yLjQ0OTk1IC0wLjQxNTkzLC00LjM2ODE4IDAuMTgwNjksLTUuNTQ2MDNjMS41NTgwNSwtMy4wNjU4IDUuMTc1MzIsLTQuMTc2MzUgNS41ODQ0MywtNC4yOTQxNGMwLjE4NzUxLC0wLjA1NzIxIDAuMzg1MjUsLTAuMDkwODYgMC41Nzk1OCwtMC4xMDc2OWMwLjM5ODg5LC0wLjA2MDU4IDEuMTAxMiwtMC4xNTQ4IDIuMDUyNCwtMC4xMTc3OWMyLjE3ODU0LDAuMDI2OTIgNC42NjA1MSwxLjE2NDQgNi41NjI5LDMuMDQ1NjFjMi4yNDY3MywyLjEyMDE1IDQuMDA1OTMsNi4zODA2MyAyLjc1ODEyLDExLjAxMTNjLTEuMjE3MTIsNC45NTcxIC01Ljg5NDY4LDkuMDU2MDYgLTExLjM1Mjk3LDkuOTE0MjFjLTUuODcwODIsMS4wNDY2MSAtMTIuNDgxNDUsLTEuODQ3NTYgLTE1Ljk3MjU3LC03LjA5NDA4Yy0zLjM2NDk4LC00LjcyODI2IC00LjAwOTM0LC0xMS42NDczNSAtMS41NDc4MiwtMTcuMTM2MTdjMi43MDAxNywtNi4zMjAwNiA3Ljg1ODQ0LC05LjE4MDU3IDkuMzcyMTcsLTkuOTA3NDhjNy4yNzg4NiwtMy42MzQ1NCAxNS4wNTg4OCwtMS4yMzUwNyAxNS4zODYxNywtMS4xMzQxMWMyLjA5MzMxLDAuNDk0NyA3LjkxMjk5LDIuNDQzMjIgMTIuNDM3MTMsOC42MjUyOWMzLjQ3NzQ5LDQuNjUwODYgNi4yOTY5OCwxMy4zMzY3MyAyLjcxMzgsMjIuNDI5ODFjLTMuMjcyOTMsOC45NjE4MyAtMTIuNTkwNTUsMTUuNzY5ODUgLTIyLjYzNzc2LDE2LjQ5MzM5Yy0wLjc4NzU1LDAuMDc0MDQgLTEuNTg1MzIsMC4xMTQ0MiAtMi4zNzk2OSwwLjExNDQyYy05Ljc1MDYsMCAtMTkuNjI3MzQsLTUuNjIwMDcgLTI0LjU4MTA2LC0xNC4yNDg3M2MwLDAgLTAuODIwNDksLTEuNDE4MzQgLTEuMTgxODEsLTIuMTUzNzN6IiBzdHJva2U9IiM2OTAwYjQiIHN0cm9rZS13aWR0aD0iMTAiLz48cGF0aCBkPSJNMjE2LjQ0ODI3LDE5Ni4wNTc4NGMtNS4xMzQ0MSwtOC40MjAwMSAtNS41NTM3NSwtMTkuNjU2NzkgLTEuMDI5NjEsLTI4LjU2NDc3YzQuNjg3NzksLTkuNTc0MzEgMTIuNTc2OTEsLTEzLjgxNzk3IDE1Ljc0NzU2LC0xNS4xOTc3NWMxLjkwNTgsLTAuODg1MDggMy45MTM4OCwtMS41NzQ5NyA2LjA3NTM3LC0yLjA4MzEzbDIuMTIwNTksLTAuNDU3NjhjMS41NTgwNSwtMC4zMTk3IDMuMTA5MjgsMC42NDYxNCAzLjQ0NjgsMi4xODc0NWMwLjM0MDkzLDEuNTQ0NjggLTAuNjUxMTgsMy4wNjU4IC0yLjIxNjA1LDMuNDAyMzNsLTIuMDYyNjMsMC40NDQyMmMtMS43MTQ4OCwwLjQwMzg0IC0zLjM1ODE2LDAuOTY5MjEgLTQuOTYwNTMsMS43MTYzMWMtMi4wODMwOCwwLjkwMTkgLTguOTczMjgsNC4zOTE3MyAtMTIuOTQ4NTIsMTIuNTE1NmMtMy4wMTcyMyw1LjkzMzA1IC0zLjkxNzI5LDE1LjM2NjAyIDAuODMxODcsMjMuMTQ5OThjNC4zMDI1NCw3LjQ5NzkyIDEzLjExMjE3LDEyLjA5NDkzIDIxLjQ2ODM3LDExLjMyMDkxYzcuOTAyNzYsLTAuNTY4NzQgMTUuMTU0MzQsLTUuODI4NzIgMTcuNjk3NjgsLTEyLjc5NDkyYzIuNTgwODQsLTYuNTUyMjYgMC44NjU5NiwtMTMuMjY5NDMgLTEuOTY3MTcsLTE3LjA1MjA0Yy0zLjQxMjcxLC00LjY2MDk2IC03LjY2MDcsLTYuMDk0NTggLTkuMzI3ODUsLTYuNDk1MDVjLTAuMjQ4ODgsLTAuMDc0MDQgLTYuMDg1NiwtMS44MjczNiAtMTEuMjQwNDYsMC43NTM4M2MtMi4yMTk0NSwxLjA2MzQ0IC01LjA5MDA5LDMuNDU2MTggLTYuNjI3NjgsNy4wNTAzM2MtMS42NjAzMywzLjcxMTk0IC0xLjIzMDc2LDguNDgzOTUgMS4wMTkzOCwxMS42NTQwOGMyLjI2Mzc4LDMuMzk4OTcgNi41MzIyMiw1LjMyMzkyIDEwLjIwNDA0LDQuNjcxMDVjMy42NTQ3NywtMC41NzU0NyA2LjEyNjUxLC0zLjI5NDY0IDYuNzEyOTEsLTUuNjg0MDFjMC42ODg2OCwtMi41Njc3MyAtMC4zNjgyLC00LjczODM2IC0xLjE5MzI2LC01LjUxOTExYy0xLjQwMTIyLC0xLjM4MzE0IC0yLjYxMTUyLC0xLjQwNjcgLTIuNjYyNjYsLTEuNDEwMDdjLTAuNTcyNzYsLTAuMDE2ODMgLTAuODU1NzMsMC4wMjY5MiAtMS4wMjYyLDAuMDUzODRjLTAuNjU0NTksMC4yMzg5NCAtMS41ODE5MiwwLjc2MzkzIC0xLjg1NDY2LDEuMzE1ODRjLTAuMDQ3NzMsMC4wOTA4NiAtMC4xNzA0NywwLjMzOTkgMC4wNjQ3OCwwLjk2MjQ4YzAuNTYyNTMsMS40NzczNyAtMC4xOTc3NCwzLjEyOTc0IC0xLjY5NDQyLDMuNjg1MDJjLTEuNDg5ODYsMC41NTg2NCAtMy4xNjcyNCwtMC4xOTE4MiAtMy43MzMxOCwtMS42NzI1NmMtMC45MzA3NCwtMi40NDk5NSAtMC40MTU5MywtNC4zNjgxOCAwLjE4MDY5LC01LjU0NjAzYzEuNTU4MDUsLTMuMDY1OCA1LjE3NTMyLC00LjE3NjM1IDUuNTg0NDMsLTQuMjk0MTRjMC4xODc1MSwtMC4wNTcyMSAwLjM4NTI1LC0wLjA5MDg2IDAuNTc5NTgsLTAuMTA3NjljMC4zOTg4OSwtMC4wNjA1OCAxLjEwMTIsLTAuMTU0OCAyLjA1MjQsLTAuMTE3NzljMi4xNzg1NCwwLjAyNjkyIDQuNjYwNTEsMS4xNjQ0IDYuNTYyOSwzLjA0NTYxYzIuMjQ2NzMsMi4xMjAxNSA0LjAwNTkzLDYuMzgwNjMgMi43NTgxMiwxMS4wMTEzYy0xLjIxNzEyLDQuOTU3MSAtNS44OTQ2OCw5LjA1NjA2IC0xMS4zNTI5Nyw5LjkxNDIxYy01Ljg3MDgyLDEuMDQ2NjEgLTEyLjQ4MTQ1LC0xLjg0NzU2IC0xNS45NzI1NywtNy4wOTQwOGMtMy4zNjQ5OCwtNC43MjgyNiAtNC4wMDkzNCwtMTEuNjQ3MzUgLTEuNTQ3ODIsLTE3LjEzNjE3YzIuNzAwMTcsLTYuMzIwMDYgNy44NTg0NCwtOS4xODA1NyA5LjM3MjE3LC05LjkwNzQ4YzcuMjc4ODYsLTMuNjM0NTQgMTUuMDU4ODgsLTEuMjM1MDcgMTUuMzg2MTcsLTEuMTM0MTFjMi4wOTMzMSwwLjQ5NDcgNy45MTI5OSwyLjQ0MzIyIDEyLjQzNzEzLDguNjI1MjljMy40Nzc0OSw0LjY1MDg2IDYuMjk2OTgsMTMuMzM2NzMgMi43MTM4LDIyLjQyOTgxYy0zLjI3MjkzLDguOTYxODMgLTEyLjU5MDU1LDE1Ljc2OTg1IC0yMi42Mzc3NiwxNi40OTMzOWMtMC43ODc1NSwwLjA3NDA0IC0xLjU4NTMyLDAuMTE0NDIgLTIuMzc5NjksMC4xMTQ0MmMtOS43NTA2LDAgLTE5LjYyNzM0LC01LjYyMDA3IC0yNC41ODEwNiwtMTQuMjQ4NzN6IiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIvPjwvZz48L2c%2BPC9zdmc%2B%22%3B%0A%0A%20%20let%20newColorType%20%3D%20%22%22%3B%0A%20%20let%20overlayImageContainer%20%3D%20%22%22%3B%0A%20%20const%20vm%20%3D%20Scratch.vm%3B%0A%20%20const%20fontMenu%20%3D%20%5B%0A%20%20%20%20%22Scratch%22%2C%20%22Sans%20Serif%22%2C%20%22Serif%22%2C%0A%20%20%20%20%22Handwriting%22%2C%20%22Marker%22%2C%20%22Curly%22%2C%20%22Pixel%22%0A%20%20%5D%3B%20%20%0A%0A%20%20const%20xmlEscape%20%3D%20function%20(unsafe)%20%7B%0A%20%20%20%20return%20Scratch.Cast.toString(unsafe).replace(%2F%5B%3C%3E%26'%22%5D%2Fg%2C%20c%20%3D%3E%20%7B%0A%20%20%20%20%20%20switch%20(c)%20%7B%0A%20%20%20%20%20%20%20%20case%20%22%3C%22%3A%20return%20%22%26lt%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22%3E%22%3A%20return%20%22%26gt%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22%26%22%3A%20return%20%22%26amp%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22'%22%3A%20return%20%22%26apos%3B%22%3B%0A%20%20%20%20%20%20%20%20case%20%22%5C%22%22%3A%20return%20%22%26quot%3B%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D)%3B%0A%20%20%7D%3B%0A%0A%20%20class%20BetterInputSP%20%7B%0A%20%20%20%20constructor()%20%7B%0A%20%20%20%20%20%20this.activeOverlays%20%3D%20%5B%5D%3B%20this.activeUI%20%3D%20%5B%5D%3B%20this.askBoxPromises%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20this.isWaitingForInput%20%3D%20false%3B%20this.isDropdownOpen%20%3D%20false%3B%0A%20%20%20%20%20%20this.userInput%20%3D%20%22%20%22%3B%20this.defaultValue%20%3D%20%22%22%3B%0A%20%20%20%20%20%20this.textBoxX%20%3D%200%3B%20this.textBoxY%20%3D%200%3B%0A%20%20%20%20%20%20this.askBoxInfo%20%3D%20%5B0%2C%201%5D%3B%20this.appendTarget%20%3D%20%5B%22window%22%2C%20false%5D%3B%0A%20%20%20%20%20%20this.forceInput%20%3D%20%22Disabled%22%3B%0A%20%20%20%20%20%20this.overlayInput%20%3D%20null%3B%0A%20%20%20%20%20%20this.uiOrder%20%3D%20%5B%22question%22%2C%20%22input%22%2C%20%22buttons%22%5D%3B%0A%0A%20%20%20%20%20%20this.optionList%20%3D%20%5B%22Option%201%22%2C%20%22Option%202%22%2C%20%22Option%203%22%5D%3B%0A%20%20%20%20%20%20this.sliderInfo%20%3D%20%5B0%2C%20100%2C%2050%5D%3B%0A%20%20%20%20%20%20this.Timeout%20%3D%200%3B%0A%0A%20%20%20%20%20%20this.shadowEnabled%20%3D%20true%3B%0A%20%20%20%20%20%20this.isInputEnabled%20%3D%20%22Enabled%22%3B%0A%20%20%20%20%20%20this.DropdownText%20%3D%20%22Dropdown%22%3B%0A%20%20%20%20%20%20this.fontSize%20%3D%20%2214px%22%3B%0A%20%20%20%20%20%20this.textAlign%20%3D%20%22left%22%3B%0A%20%20%20%20%20%20this.fontFamily%20%3D%20%22Sans%20Serif%22%3B%0A%20%20%20%20%20%20%20%2F%2F%20overlay%20%2B%20Image%2C%20input%2C%20dropdown%20button%20%0A%20%20%20%20%20%20this.mainUIinfo%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%2F%2F%20Border%20Radius%0A%20%20%20%20%20%20%20%20dimensions%3A%20%5B%22auto%22%2C%20%22auto%22%5D%2C%0A%20%20%20%20%20%20%20%20overlayRad%3A%205%2C%20%0A%20%20%20%20%20%20%20%20inputRad%3A%204%2C%0A%20%20%20%20%20%20%20%20dropBtnRad%3A%205%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20Border%20Information%0A%20%20%20%20%20%20%20%20overlayBord%3A%20%221px%20none%20%23000000%22%2C%0A%20%20%20%20%20%20%20%20inputBord%3A%20%221px%20solid%20%23000000%22%2C%0A%20%20%20%20%20%20%20%20dropBtnBord%3A%20%221px%20none%20%23000000%22%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20Text%20Padding%0A%20%20%20%20%20%20%20%20overlayPad%3A%20%2215px%22%2C%0A%20%20%20%20%20%20%20%20inputPad%3A%20%225px%22%2C%0A%20%20%20%20%20%20%20%20dropBtnPad%3A%20%225px%2010px%22%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20Text%20Shadow%0A%20%20%20%20%20%20%20%20overlayTxtShad%3A%20%22none%22%2C%0A%20%20%20%20%20%20%20%20inputTxtShad%3A%20%22none%22%2C%0A%20%20%20%20%20%20%20%20dropBtnTxtShad%3A%20%22none%22%2C%0A%20%20%20%20%20%20%20%20%2F%2F%20Outline%3A%20Color%20%2B%20Thickness%0A%20%20%20%20%20%20%20%20overlayOutline%3A%20%5B%22%22%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20inputOutline%3A%20%5B%22%22%2C%200%5D%2C%0A%20%20%20%20%20%20%20%20dropBtnOutline%3A%20%5B%22%22%2C%200%5D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20this.lastPressBtn%20%3D%20%22%22%3B%0A%20%20%20%20%20%20this.buttonJSON%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22Submit%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%22%230074D9%22%2C%20textColor%3A%20%22%23ffffff%22%2C%0A%20%20%20%20%20%20%20%20%20%20name%3A%20%22Submit%22%2C%20image%3A%20%22%22%2C%20imgScale%3A%20100%2C%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%205%2C%20border%3A%20%221px%20none%20%23000000%22%2C%0A%20%20%20%20%20%20%20%20%20%20padding%3A%20%225px%2010px%22%2C%20dropShadow%3A%20%22none%22%2C%20outline%3A%20%5B%22%22%2C%200%5D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Cancel%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%22%23d9534f%22%2C%20textColor%3A%20%22%23ffffff%22%2C%0A%20%20%20%20%20%20%20%20%20%20name%3A%20%22Cancel%22%2C%20image%3A%20%22%22%2C%20imgScale%3A%20100%2C%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%205%2C%20border%3A%20%221px%20none%20%23000000%22%2C%0A%20%20%20%20%20%20%20%20%20%20padding%3A%20%225px%2010px%22%2C%20dropShadow%3A%20%22none%22%2C%20outline%3A%20%5B%22%22%2C%200%5D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%0A%20%20%20%20%20%20this.questionColor%20%3D%20%22%23000000%22%3B%0A%20%20%20%20%20%20this.inputColor%20%3D%20%22%23000000%22%3B%0A%20%20%20%20%20%20this.textBoxColor%20%3D%20%5B%22%23ffffff%22%5D%3B%0A%20%20%20%20%20%20this.inputFieldColor%20%3D%20%22%23ffffff%22%3B%0A%20%20%20%20%20%20this.dropdownButtonColor%20%3D%20%5B%22%235f5f5f%22%2C%20%22%23ffffff%22%5D%3B%0A%20%20%20%20%20%20this.overlayImage%20%3D%20%5B%22%20%22%2C%20%22%20%22%2C%20%22%20%22%5D%3B%0A%0A%20%20%20%20%20%20this.Blur%20%3D%200%3B%20this.Brightness%20%3D%200%3B%20this.Opacity%20%3D%20100%3B%0A%20%20%20%20%20%20this.Invert%20%3D%200%3B%20this.Saturation%20%3D%20100%3B%20this.Hue%20%3D%200%3B%0A%20%20%20%20%20%20this.Sepia%20%3D%200%3B%20this.Contrast%20%3D%20100%3B%20this.Scale%20%3D%20100%3B%20%0A%20%20%20%20%20%20this.SkewX%20%3D%200%3B%20this.SkewY%20%3D%200%3B%20this.Rotation%20%3D%2090%3B%0A%20%20%20%20%20%20this.imgScale%20%3D%20%5B100%2C%20100%2C%20100%5D%3B%0A%20%20%20%20%20%20this.shadowS%20%3D%20%5B0%2C%200%2C%205%2C%20%22%23000000%22%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getInfo()%20%7B%0A%20%20%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20id%3A%20%22BetterInputSP%22%2C%0A%20%20%20%20%20%20%20%20name%3A%20%22Better%20Input%22%2C%0A%20%20%20%20%20%20%20%20color1%3A%20%22%239400ff%22%2C%0A%20%20%20%20%20%20%20%20color2%3A%20%22%237800cd%22%2C%0A%20%20%20%20%20%20%20%20color3%3A%20%22%236900b3%22%2C%0A%20%20%20%20%20%20%20%20menuIconURI%2C%0A%20%20%20%20%20%20%20%20blockIconURI%2C%0A%20%20%20%20%20%20%20%20blocks%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22askAndWait%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22ask%20%5Bquestion%5D%20and%20wait%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20question%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22What%20is%20your%20name%3F%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22askAndWaitForInput%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22ask%20%5Bquestion%5D%20and%20wait%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20question%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22What%20is%20your%20name%3F%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getUserInput%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22user%20input%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDefaultV%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20default%20value%20to%20%5BdefaultV%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20defaultV%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22My%20Name%20Is...%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22removeAskBoxes%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22remove%20all%20ask%20boxes%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Formatting%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setEnable%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%20text%3A%20%22set%20%5BENABLE_MENU%5D%20to%20be%20%5BACTION%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENABLE_MENU%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22enableMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ACTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22inputActionMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getBoxCount%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%20text%3A%20%22box%20count%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getMaxCount%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%20text%3A%20%22box%20limit%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFontSize%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20font%20size%20to%20%5BSIZE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SIZE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2014%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setTextAlignment%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20alignment%20to%20%5BALIGNMENT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ALIGNMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22alignmentMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFontFamily%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20font%20to%20%5BFONT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20FONT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22fontMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDropShadow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20shadow%20to%20x%20%5Bx%5D%20y%20%5By%5D%20z%20%5Bz%5D%20color%20%5BCOLOR%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22textsMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20z%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%202%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%2C%20defaultValue%3A%20%22%23ff0000%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setOutline%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20outline%20to%20%5BCOLOR%5D%20thickness%20%5BTHICK%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22textsMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%2C%20defaultValue%3A%20%22%23ff0000%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20THICK%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setInputType%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20Input%20Box%20to%20be%20%5BACTION%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ACTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22inputActionMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDropdown%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20dropdown%20options%20to%20array%3A%20%5BDROPDOWN%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DROPDOWN%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22%5B%5C%22Option%201%5C%22%2C%20%5C%22Option%202%5C%22%2C%20%5C%22Option%203%5C%22%5D%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setSlider%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20slider%20to%20min%3A%20%5BMIN%5D%20max%3A%20%5BMAX%5D%20default%3A%20%5BDEFAULT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MIN%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MAX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DEFAULT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%2050%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Buttons%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setButton%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22%5BBUTTON%5D%20button%20named%20%5BNAME%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonType%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20NAME%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22Submit%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22deleteAllButtons%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22remove%20all%20buttons%22%2C%20blockIconURI%3A%20formatIcon%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setButtonText%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BBUTTON_MENU%5D%20button%20name%20to%20%5BTEXT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20BUTTON_MENU%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TEXT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22my%20dropdown%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22lastButton%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22last%20pressed%20button%22%2C%20blockIconURI%3A%20formatIcon%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Positioning%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPrePosition%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22preset%20textbox%20position%20to%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPosition%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20textbox%20position%20to%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changePosition%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20textbox%20position%20by%20x%3A%20%5BX%5D%20y%3A%20%5BY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%200%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getXpos%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%20text%3A%20%22x%20position%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getYpos%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%20text%3A%20%22y%20position%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDirection%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20direction%20to%20%5BROTATE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ROTATE%3A%20%7B%20type%3A%20Scratch.ArgumentType.ANGLE%2C%20defaultValue%3A%2090%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changeDirection%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20direction%20by%20%5BROTATE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20formatIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ROTATE%3A%20%7B%20type%3A%20Scratch.ArgumentType.ANGLE%2C%20defaultValue%3A%2015%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22reportDirection%22%2C%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22direction%22%2C%20blockIconURI%3A%20formatIcon%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Visual%20Settings%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setColorSettings%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BCOLOR_TYPE%5D%20color%20to%20%5BCOLOR%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR_TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22colorSettingsMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%2C%20defaultValue%3A%20%22%23000000%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setGradient%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BCOLOR_TYPE%5D%20color%20to%20gradient%20with%20%5BCOLOR1%5D%20and%20%5BCOLOR2%5D%20with%20direction%20%5BDIR%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%20%2F%2Fdeprecated%20but%20needed%20for%20support%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR_TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR1%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%20COLOR2%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20DIR%3A%20%7B%20type%3A%20Scratch.ArgumentType.ANGLE%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setCircleGradient%22%2C%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BCOLOR_TYPE%5D%20color%20to%20radial%20gradient%20with%20%5BCOLOR1%5D%20and%20%5BCOLOR2%5D%20at%20x%20%5BX%5D%20y%20%5BY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20hideFromPalette%3A%20true%2C%20%2F%2Fdeprecated%20but%20needed%20for%20support%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR_TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR1%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%20COLOR2%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%20%7D%2C%20Y%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20image%20to%20%5BIMAGE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20IMAGE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22input-url-here%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22scaleImage%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22scale%20%5BELEMENT%5D%20image%20to%20%5BSCALE%5D%25%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SCALE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22enableShadow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20box%20shadow%20to%20be%20%5BACTION%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ACTION%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonActionMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setShadow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20box%20shadow%20%5BSHADOW%5D%20to%20%5BAMT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20SHADOW%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22shadowStuff%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBorder%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20border%20to%20%5BTYPE%5D%20color%20%5BCOLOR%5D%20width%20%5BWIDTH%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22borderTypes%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20COLOR%3A%20%7B%20type%3A%20Scratch.ArgumentType.COLOR%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WIDTH%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setBorderRadius%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20border%20radius%20to%20%5BVALUE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20VALUE%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setPadding%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20%5BELEMENT%5D%20padding%20to%20T%3A%20%5BN1%5D%20B%3A%20%5BN3%5D%20L%3A%20%5BN4%5D%20R%3A%20%5BN2%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ELEMENT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22elementMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N1%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N2%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N3%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20N4%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setDimension%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20Textbox%20width%20%5BW%5D%20height%20%5BH%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20colorIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20W%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20H%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%20100%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Effects%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22resetEffect%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22reset%20effects%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setEffect%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20effect%20%5BEFFECT%5D%20to%20%5BAMT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EFFECT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22effectMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22changeEffect%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22change%20effect%20%5BEFFECT%5D%20by%20%5BAMT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EFFECT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22effectMenu%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20AMT%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22showEffect%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22effect%20%5BEFFECT%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20EFFECT%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22effectMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setTimeout%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22when%20submitted%20delete%20textbox%20after%20%5BTIME%5D%20secs%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TIME%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%205%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22reportTimeout%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22current%20textbox%20timeout%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockIconURI%3A%20effectIcon%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%20blockType%3A%20Scratch.BlockType.LABEL%2C%20text%3A%20%22Operations%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setUI%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20UI%20order%20to%20%5BARRAY%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ARRAY%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20defaultValue%3A%20%22%5B%5C%22question%5C%22%2C%20%5C%22input%5C%22%2C%20%5C%22buttons%5C%22%5D%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getUIOrder%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22UI%20order%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setAppend%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22append%20next%20textbox%20to%20%5BTARGET%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TARGET%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22appendMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setFocus%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22toggle%20focus%20mode%20to%20%5BTYPE%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20TYPE%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22buttonActionMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%22---%22%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isWaitingInput%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20waiting%3F%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22isDropdown%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.BOOLEAN%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22is%20dropdown%20open%3F%22%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setSubmitEvent%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20force%20input%20to%20%5BENTER%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20ENTER%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22enterMenu%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22setMaxBoxCount%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.COMMAND%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22set%20max%20box%20count%20to%3A%20%5BMAX%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20MAX%3A%20%7B%20type%3A%20Scratch.ArgumentType.NUMBER%2C%20defaultValue%3A%201%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20opcode%3A%20%22getBoxInfo%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20blockType%3A%20Scratch.BlockType.REPORTER%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20%22textbox%20%5BINFO%5D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20arguments%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20INFO%3A%20%7B%20type%3A%20Scratch.ArgumentType.STRING%2C%20menu%3A%20%22boxInfo%22%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20menus%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20enableMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22Button%202%22%2C%20%22Button%203%22%2C%20%22Button%204%22%2C%20%22Textbox%20Shadow%22%5D%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%2F%2F%20%5E%20Old%20Menu%20%5E%20(Needed%20for%20V2%20Support)%0A%20%20%20%20%20%20%20%20%20%20fontMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%22allFonts%22%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20buttonMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%22Dropdown%22%5D%2C%20false)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20elementMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%22Textbox%22%2C%20%22Input%20Box%22%2C%20%22Dropdown%20Button%22%5D%2C%20false)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20colorSettingsMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Textbox%22%2C%20%22Question%20Text%22%2C%20%22Textbox%20Shadow%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Input%20Text%22%2C%20%22Input%20Box%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Dropdown%20Button%22%2C%20%22Dropdown%20Text%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%20true)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20textsMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20this.allButtons(%5B%22Question%20Text%22%2C%20%22Input%20Text%22%2C%20%22Dropdown%20Text%22%5D%2C%20true%2C%20true)%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20appendMenu%3A%20%5B%22window%22%2C%20%22canvas%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20buttonType%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22add%22%2C%20%22remove%22%5D%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20buttonActionMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22Enabled%22%2C%20%22Disabled%22%5D%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20alignmentMenu%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22left%22%2C%20%22right%22%2C%20%22center%22%5D%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20shadowStuff%3A%20%7B%20acceptReporters%3A%20true%2C%20items%3A%20%5B%22Size%22%2C%20%22X%22%2C%20%22Y%22%5D%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20boxInfo%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22count%22%2C%20%22limit%22%2C%20%22button%20count%22%2C%20%22button%20names%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20inputActionMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22None%22%2C%20%22Text%22%2C%20%22Password%22%2C%20%22Number%22%2C%20%22Color%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Dropdown%22%2C%20%22Multi-Select%20Dropdown%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Horizontal%20Slider%22%2C%20%22Vertical%20Slider%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20effectMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Blur%22%2C%20%22Brightness%22%2C%20%22Opacity%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Invert%22%2C%20%22Saturation%22%2C%20%22Hue%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Sepia%22%2C%20%22Contrast%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Scale%22%2C%20%22SkewX%22%2C%20%22SkewY%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20enterMenu%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%22Disabled%22%2C%20%22Enter%20Key%22%2C%20%22Shift%20%2B%20Enter%20Key%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20borderTypes%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20acceptReporters%3A%20true%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20items%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22none%22%2C%20%22solid%22%2C%20%22dotted%22%2C%20%22dashed%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22double%22%2C%20%22groove%22%2C%20%22ridge%22%2C%20%22inset%22%2C%20%22outset%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20allFonts()%20%7B%0A%20%20%20%20%20%20const%20customFonts%20%3D%20Scratch.vm.runtime.fontManager%0A%20%20%20%20%20%20%20%20%3F%20Scratch.vm.runtime.fontManager.getFonts().map((i)%20%3D%3E%20(%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20text%3A%20i.name%2C%20value%3A%20i.family%0A%20%20%20%20%20%20%20%20%20%20%7D))%0A%20%20%20%20%20%20%20%20%3A%20%5B%5D%3B%0A%20%20%20%20%20%20return%20%5B%20...fontMenu%2C%20...customFonts%20%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20allButtons(array%2C%20enableTxt%2C%20justTxt)%20%7B%0A%20%20%20%20%20%20let%20customBtn%20%3D%20Object.keys(this.buttonJSON)%3B%0A%20%20%20%20%20%20if%20(justTxt)%20customBtn%20%3D%20customBtn.map(btn%20%3D%3E%20btn%20%2B%20%22%20Text%22)%3B%0A%20%20%20%20%20%20else%20if%20(enableTxt)%20customBtn.forEach((btn)%20%3D%3E%20%7B%20customBtn.push(btn%20%2B%20%22%20Text%22)%20%7D)%3B%0A%20%20%20%20%20%20return%20%5B%20...array%2C%20...customBtn%20%5D%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20updateOverlayPos(overlay)%20%7B%0A%20%20%20%20%20%20if%20(this.Rotation%20%3E%20359)%20this.Rotation%20%3D%200%3B%0A%20%20%20%20%20%20else%20if%20(this.Rotation%20%3C%201)%20this.Rotation%20%3D%20360%3B%0A%20%20%20%20%20%20if%20(this.textBoxX%20!%3D%3D%20null%20%26%26%20this.textBoxY%20!%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20%60%24%7B50%20%2B%20this.textBoxX%7D%25%60%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20%60%24%7B50%20%2B%20this.textBoxY%7D%25%60%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20overlay.style.transform%20%3D%20%60%0A%20%20%20%20%20%20%20%20%20%20translate%24%7Bthis.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%22(-50%25%2C%20-50%25)%22%20%3A%20%60(%24%7B-50%20%2B%20this.textBoxX%7D%25%2C%20%24%7B-50%20%2B%20this.textBoxY%7D%25)%60%20%7D%0A%20%20%20%20%20%20%20%20%20%20SkewX(%24%7Bthis.SkewX%7Ddeg)%20SkewY(%24%7Bthis.SkewY%7Ddeg)%0A%20%20%20%20%20%20%20%20%20%20rotate(%24%7Bthis.Rotation%20-%2090%7Ddeg)%20scale(%24%7Bthis.Scale%20%2F%20100%7D)%0A%20%20%20%20%20%20%20%20%60%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20%2250%25%22%3B%0A%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20%2250%25%22%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20updateOverlay(overlay)%20%7B%0A%20%20%20%20%20%20const%20newOpacity%20%3D%20%20this.Opacity%20%2F%20100%3B%0A%20%20%20%20%20%20const%20newBrightness%20%3D%20this.Brightness%20%2B%20100%3B%0A%20%20%20%20%20%20overlay.style.backgroundImage%20%3D%20%22%22%3B%0A%20%20%20%20%20%20overlay.style%5Bthis.textBoxColor%5B0%5D.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22backgroundColor%22%5D%20%3D%20this.textBoxColor%5B0%5D%3B%0A%20%20%20%20%20%20overlay.style.boxShadow%20%3D%20this.shadowEnabled%20%3F%20%60%24%7Bthis.shadowS%5B0%5D%7Dpx%20%24%7Bthis.shadowS%5B1%5D%7Dpx%20%24%7Bthis.shadowS%5B2%5D%7Dpx%20%24%7Bthis.shadowS%5B3%5D%7D%60%20%3A%20%22none%22%3B%0A%20%20%20%20%20%20overlay.style.transform%20%3D%20%60%0A%20%20%20%20%20%20%20%20translate%24%7Bthis.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%22(-50%25%2C%20-50%25)%22%20%3A%20%60(%24%7B-50%20%2B%20this.textBoxX%7D%25%2C%20%24%7B-50%20%2B%20this.textBoxY%7D%25)%60%20%7D%0A%20%20%20%20%20%20%20%20SkewX(%24%7Bthis.SkewX%7Ddeg)%20SkewY(%24%7Bthis.SkewY%7Ddeg)%0A%20%20%20%20%20%20%20%20rotate(%24%7Bthis.Rotation%20-%2090%7Ddeg)%20scale(%24%7Bthis.Scale%20%2F%20100%7D)%0A%20%20%20%20%20%20%60%3B%0A%20%20%20%20%20%20overlay.style.filter%20%3D%20%60%0A%20%20%20%20%20%20%20%20blur(%24%7Bthis.Blur%7Dpx)%20brightness(%24%7BnewBrightness%7D%25)%0A%20%20%20%20%20%20%20%20invert(%24%7Bthis.Invert%7D%25)%20saturate(%24%7Bthis.Saturation%7D%25)%0A%20%20%20%20%20%20%20%20hue-rotate(%24%7Bthis.Hue%7Ddeg)%20sepia(%24%7Bthis.Sepia%7D%25)%0A%20%20%20%20%20%20%20%20contrast(%24%7Bthis.Contrast%7D%25)%0A%20%20%20%20%20%20%60%3B%0A%20%20%20%20%20%20overlay.style.opacity%20%3D%20newOpacity%3B%0A%20%20%20%20%20%20overlay.style.border%20%3D%20this.mainUIinfo.overlayBord%3B%0A%20%20%20%20%20%20overlay.style.padding%20%3D%20this.mainUIinfo.overlayPad%3B%0A%20%20%20%20%20%20overlay.style.fontFamily%20%3D%20this.fontFamily%3B%0A%20%20%20%20%20%20overlay.style.textAlign%20%3D%20this.textAlign%3B%0A%20%20%20%20%20%20overlay.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.overlayRad%7Dpx%60%3B%0A%20%20%20%20%20%20overlay.style.width%20%3D%20this.mainUIinfo.dimensions%5B0%5D%3B%0A%20%20%20%20%20%20overlay.style.height%20%3D%20this.mainUIinfo.dimensions%5B1%5D%3B%0A%20%20%20%20%20%20overlayImageContainer.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.overlayRad%7Dpx%60%3B%0A%20%20%20%20%20%20overlayImageContainer.style.background%20%3D%20%22%22%3B%0A%20%20%20%20%20%20this.setImageStyles(overlayImageContainer%2C%20this.overlayImage%5B0%5D%2C%20this.imgScale%5B0%5D)%3B%0A%20%20%20%20%20%20this.updateButtonImages(overlay)%3B%0A%20%20%20%20%7D%0A%20%20%20%20updateButtonImages(overlay)%20%7B%0A%20%20%20%20%20%20let%20text%20%3D%20overlay.querySelector(%22.question%22)%3B%0A%20%20%20%20%20%20if%20(text)%20%7B%0A%20%20%20%20%20%20%20%20text.style.color%20%3D%20this.questionColor%3B%0A%20%20%20%20%20%20%20%20text.style.textShadow%20%3D%20this.mainUIinfo.overlayTxtShad%3B%0A%20%20%20%20%20%20%20%20this.tryOutline(text%2C%20this.mainUIinfo.overlayOutline%5B0%5D%2C%20this.mainUIinfo.overlayOutline%5B1%5D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20inputField%20%3D%20overlay.querySelector(%22input%22)%3B%0A%20%20%20%20%20%20if%20(inputField)%20%7B%0A%20%20%20%20%20%20%20%20inputField.style.width%20%3D%20this.isInputEnabled%20%3D%3D%3D%20%22Color%22%20%3F%20%22100%25%22%20%3A%20%22auto%22%3B%0A%20%20%20%20%20%20%20%20inputField.style.background%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20inputField.style.fontFamily%20%3D%20this.fontFamily%3B%0A%20%20%20%20%20%20%20%20inputField.style%5Bthis.inputFieldColor.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22backgroundColor%22%5D%20%3D%20this.inputFieldColor%3B%0A%20%20%20%20%20%20%20%20inputField.style.color%20%3D%20this.inputColor%3B%0A%20%20%20%20%20%20%20%20inputField.style.textShadow%20%3D%20this.mainUIinfo.inputTxtShad%3B%0A%20%20%20%20%20%20%20%20this.tryOutline(inputField%2C%20this.mainUIinfo.inputOutline%5B0%5D%2C%20this.mainUIinfo.inputOutline%5B1%5D)%3B%0A%20%20%20%20%20%20%20%20inputField.style.border%20%3D%20this.mainUIinfo.inputBord%3B%0A%20%20%20%20%20%20%20%20inputField.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.inputRad%7Dpx%60%3B%0A%20%20%20%20%20%20%20%20inputField.style.padding%20%3D%20this.mainUIinfo.inputPad%3B%0A%20%20%20%20%20%20%20%20this.setImageStyles(inputField%2C%20this.overlayImage%5B1%5D%2C%20this.imgScale%5B1%5D)%3B%0A%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20const%20dropBtn%20%3D%20overlay.querySelector(%22button.dropbtn%22)%3B%0A%20%20%20%20%20%20if%20(dropBtn)%20%7B%0A%20%20%20%20%20%20%20%20dropBtn.style.backgroundImage%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20dropBtn.style.fontFamily%20%3D%20this.fontFamily%3B%0A%20%20%20%20%20%20%20%20dropBtn.style.color%20%3D%20this.dropdownButtonColor%5B1%5D%3B%0A%20%20%20%20%20%20%20%20dropBtn.style.borderRadius%20%3D%20%60%24%7Bthis.mainUIinfo.dropBtnRad%7Dpx%60%3B%0A%20%20%20%20%20%20%20%20dropBtn.style.border%20%3D%20this.mainUIinfo.dropBtnBord%3B%0A%20%20%20%20%20%20%20%20dropBtn.style.padding%20%3D%20this.mainUIinfo.dropBtnPad%3B%0A%20%20%20%20%20%20%20%20dropBtn.style.textShadow%20%3D%20this.mainUIinfo.dropBtnTxtShad%3B%0A%20%20%20%20%20%20%20%20this.tryOutline(dropBtn%2C%20this.mainUIinfo.dropBtnOutline%5B0%5D%2C%20this.mainUIinfo.dropBtnOutline%5B1%5D)%3B%0A%20%20%20%20%20%20%20%20dropBtn.style%5Bthis.dropdownButtonColor%5B0%5D.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22backgroundColor%22%5D%20%3D%20this.dropdownButtonColor%5B0%5D%3B%0A%20%20%20%20%20%20%20%20this.setImageStyles(dropBtn%2C%20this.overlayImage%5B2%5D%2C%20this.imgScale%5B2%5D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20buttonContainer%20%3D%20overlay.querySelector(%22.button-container%22)%3B%0A%20%20%20%20%20%20if%20(buttonContainer)%20%7B%0A%20%20%20%20%20%20%20%20const%20buttons%20%3D%20buttonContainer.querySelectorAll(%22button%22)%3B%0A%20%20%20%20%20%20%20%20buttons.forEach((button%2C%20index)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20buttonName%20%3D%20Object.keys(this.buttonJSON)%5Bindex%5D%3B%0A%20%20%20%20%20%20%20%20%20%20const%20buttonInfo%20%3D%20this.buttonJSON%5BbuttonName%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(buttonInfo)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.color%20%3D%20buttonInfo.textColor%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.fontFamily%20%3D%20this.fontFamily%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.borderRadius%20%3D%20%60%24%7BbuttonInfo.borderRadius%7Dpx%60%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.border%20%3D%20buttonInfo.border%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.padding%20%3D%20buttonInfo.padding%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.textShadow%20%3D%20buttonInfo.dropShadow%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.tryOutline(button%2C%20buttonInfo.outline%5B0%5D%2C%20buttonInfo.outline%5B1%5D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style.background%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20button.style%5BbuttonInfo.color.includes(%22gradient%22)%20%3F%20%22backgroundImage%22%20%3A%20%22background%22%5D%20%3D%20buttonInfo.color%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.setImageStyles(button%2C%20buttonInfo.image%2C%20buttonInfo.imgScale)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20tryOutline(element%2C%20color%2C%20thick)%20%7B%0A%20%20%20%20%20%20element.style.webkitTextStrokeColor%20%3D%20color%3B%0A%20%20%20%20%20%20element.style.webkitTextStrokeWidth%20%3D%20%60%24%7Bthick%7Dpx%60%3B%0A%20%20%20%20%20%20%2F%2Fmulti-platform%20support%20cuz%20we%20cant%20have%20nice%20things%0A%20%20%20%20%20%20element.style.textStrokeColor%20%3D%20color%3B%0A%20%20%20%20%20%20element.style.textStrokeWidth%20%3D%20%60%24%7Bthick%7Dpx%60%3B%0A%20%20%20%20%20%20element.style.mozTextStrokeColor%20%3D%20color%3B%0A%20%20%20%20%20%20element.style.mozTextStrokeWidth%20%3D%20%60%24%7Bthick%7Dpx%60%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setImageStyles(element%2C%20url%2C%20scale)%20%7B%0A%20%20%20%20%20%20if%20(Scratch.Cast.toString(url).length%20%3E%205)%20%7B%0A%20%20%20%20%20%20%20%20Scratch.canFetch(encodeURI(url)).then((canFetch)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(canFetch)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20element.style.background%20%3D%20%60url(%24%7BencodeURI(url)%7D)%60%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20element.style.backgroundSize%20%3D%20%60%24%7Bscale%7D%25%60%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%20console.log(%22Cannot%20fetch%20content%20from%20the%20URL%22)%20%7D%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20showEffect(args)%20%7B%20return%20this%5Bargs.EFFECT%5D%20%7D%0A%0A%20%20%20%20setEffect(args)%20%7B%0A%20%20%20%20%20%20this%5Bargs.EFFECT%5D%20%3D%20args.AMT%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20changeEffect(args)%20%7B%0A%20%20%20%20%20%20const%20effect%20%3D%20args.EFFECT%3B%0A%20%20%20%20%20%20this%5Beffect%5D%20%3D%20this%5Beffect%5D%20%2B%20args.AMT%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20resetEffect()%20%7B%0A%20%20%20%20%20%20this.Blur%20%3D%200%3B%20this.Brightness%20%3D%200%3B%20this.Opacity%20%3D%20100%3B%20this.Invert%20%3D%200%3B%0A%20%20%20%20%20%20this.Saturation%20%3D%20100%3B%20this.Hue%20%3D%200%3B%20this.Sepia%20%3D%200%3B%20this.Contrast%20%3D%20100%3B%0A%20%20%20%20%20%20this.Scale%20%3D%20100%3B%20this.SkewX%20%3D%200%3B%20this.SkewY%20%3D%200%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setColorSettings(args)%20%7B%0A%20%20%20%20%20%20const%20colorType%20%3D%20args.COLOR_TYPE%3B%0A%20%20%20%20%20%20const%20colorValue%20%3D%20args.COLOR%3B%0A%20%20%20%20%20%20const%20colorTypeMap%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22Question%20Text%22%3A%20()%20%3D%3E%20this.questionColor%20%3D%20colorValue%2C%0A%20%20%20%20%20%20%20%20%22Input%20Text%22%3A%20()%20%3D%3E%20this.inputColor%20%3D%20colorValue%2C%0A%20%20%20%20%20%20%20%20%22Textbox%22%3A%20()%20%3D%3E%20%7B%20this.textBoxColor%5B0%5D%20%3D%20colorValue%3B%20this.overlayImage%5B0%5D%20%3D%20%22%20%22%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Textbox%20Shadow%22%3A%20()%20%3D%3E%20%7B%20this.shadowS%5B3%5D%20%3D%20colorValue%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Input%20Box%22%3A%20()%20%3D%3E%20%7B%20this.inputFieldColor%20%3D%20colorValue%3B%20this.overlayImage%5B1%5D%20%3D%20%22%20%22%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Dropdown%20Button%22%3A%20()%20%3D%3E%20%7B%20this.dropdownButtonColor%5B0%5D%20%3D%20colorValue%3B%20this.overlayImage%5B2%5D%20%3D%20%22%20%22%3B%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Dropdown%20Text%22%3A%20()%20%3D%3E%20this.dropdownButtonColor%5B1%5D%20%3D%20colorValue%2C%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20const%20buttonInfo%20%3D%20this.buttonJSON%5BcolorType%5D%20%7C%7C%20this.buttonJSON%5BcolorType.replace(%22%20Text%22%2C%20%22%22)%5D%3B%0A%20%20%20%20%20%20if%20(buttonInfo)%20%7B%0A%20%20%20%20%20%20%20%20if%20(colorType.includes(%22%20Text%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20buttonInfo.textColor%20%3D%20colorValue%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20buttonInfo.color%20%3D%20colorValue%3B%0A%20%20%20%20%20%20%20%20%20%20buttonInfo.image%20%3D%20%22%20%22%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20const%20applyColor%20%3D%20colorTypeMap%5BcolorType%5D%3B%0A%20%20%20%20%20%20if%20(applyColor)%20applyColor()%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20findGradientType(menu)%20%7B%0A%20%20%20%20%20%20const%20colorTypeMap%20%3D%20%7B%0A%20%20%20%20%20%20%20%20Textbox%3A%20%7B%20newColorType%3A%20%22textBoxColor%22%2C%20ind%3A%200%20%7D%2C%0A%20%20%20%20%20%20%20%20%22Dropdown%20Button%22%3A%20%7B%20newColorType%3A%20%22dropdownButtonColor%22%2C%20ind%3A%202%20%7D%0A%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20if%20(colorTypeMap%5Bmenu%5D)%20%7B%0A%20%20%20%20%20%20%20%20const%20%7B%20newColorType%2C%20ind%20%7D%20%3D%20colorTypeMap%5Bmenu%5D%3B%0A%20%20%20%20%20%20%20%20this.overlayImage%5Bind%5D%20%3D%20%22%20%22%3B%0A%20%20%20%20%20%20%20%20return%20newColorType%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(this.buttonJSON%5Bmenu%5D)%20%7B%20return%20%5B%22button%22%2C%20menu%5D%20%7D%0A%20%20%20%20%20%20return%20menu%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setGradient(args)%20%7B%0A%20%20%20%20%20%20if%20(args.COLOR_TYPE%20%3D%3D%3D%20%22Input%20Box%22)%20throw%20new%20Error%20(%22As%20of%20Better%20Input%20V4%2C%20this%20Option%20no%20Longer%20Works%22)%3B%0A%20%20%20%20%20%20const%20newColorType%20%3D%20this.findGradientType(args.COLOR_TYPE)%3B%0A%20%20%20%20%20%20const%20gradientColor%20%3D%20%60linear-gradient(%24%7Bargs.DIR%20-%2090%7Ddeg%2C%20%24%7Bargs.COLOR2%7D%2C%20%24%7Bargs.COLOR1%7D)%60%3B%0A%20%20%20%20%20%20if%20(newColorType%5B0%5D%20!%3D%3D%20%22button%22)%20this%5BnewColorType%5D%5B0%5D%20%3D%20gradientColor%3B%0A%20%20%20%20%20%20else%20this.buttonJSON%5BnewColorType%5B1%5D%5D.color%20%3D%20gradientColor%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%20%20%20%20setCircleGradient(args)%20%7B%0A%20%20%20%20%20%20const%20newColorType%20%3D%20this.findGradientType(args.COLOR_TYPE)%3B%0A%20%20%20%20%20%20const%20newPos%20%3D%20%5Bargs.X%20%2B%2050%2C%20args.Y%20%2B%2050%5D%3B%0A%20%20%20%20%20%20const%20gradientColor%20%3D%20%60radial-gradient(circle%20at%20%24%7BnewPos%5B0%5D%7D%25%20%24%7BnewPos%5B1%5D%7D%25%2C%20%24%7Bargs.COLOR2%7D%2C%20%24%7Bargs.COLOR1%7D)%60%3B%0A%20%20%20%20%20%20if%20(newColorType%5B0%5D%20!%3D%3D%20%22button%22)%20this%5BnewColorType%5D%5B0%5D%20%3D%20gradientColor%3B%0A%20%20%20%20%20%20else%20this.buttonJSON%5BnewColorType%5B1%5D%5D.color%20%3D%20gradientColor%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20callStyling(element%2C%20value%2C%20type%2C%20elements)%20%7B%0A%20%20%20%20%20%20const%20elementID%20%3D%20elements%5Belement%5D%3B%0A%20%20%20%20%20%20if%20(elementID%20!%3D%3D%20undefined)%20this.mainUIinfo%5BelementID%5D%20%3D%20value%3B%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5Belement%5D)%20this.buttonJSON%5Belement%5D%5Btype%5D%20%3D%20value%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setBorder(args)%20%7B%0A%20%20%20%20%20%20const%20width%20%3D%20Scratch.Cast.toNumber(args.WIDTH)%3B%0A%20%20%20%20%20%20const%20string%20%3D%20%60%24%7Bwidth%7Dpx%20%24%7Bargs.TYPE%7D%20%24%7Bargs.COLOR%7D%60%3B%0A%20%20%20%20%20%20this.callStyling(%0A%20%20%20%20%20%20%20%20args.ELEMENT%2C%20string%2C%20%22border%22%2C%0A%20%20%20%20%20%20%20%20%7B%20Textbox%3A%20%22overlayBord%22%2C%20%22Input%20Box%22%3A%20%22inputBord%22%2C%20%22Dropdown%20Button%22%3A%20%22dropBtnBord%22%20%7D%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setBorderRadius(args)%20%7B%0A%20%20%20%20%20%20this.callStyling(%0A%20%20%20%20%20%20%20%20args.ELEMENT%2C%20Math.max(args.VALUE%2C%200)%2C%20%22borderRadius%22%2C%0A%20%20%20%20%20%20%20%20%7B%20Textbox%3A%20%22overlayRad%22%2C%20%22Input%20Box%22%3A%20%22inputRad%22%2C%20%22Dropdown%20Button%22%3A%20%22dropBtnRad%22%20%7D%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setPadding(args)%20%7B%0A%20%20%20%20%20%20const%20casted%20%3D%20%5B%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.N1)%2C%20Scratch.Cast.toNumber(args.N2)%2C%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.N3)%2C%20Scratch.Cast.toNumber(args.N4)%0A%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20let%20pad%20%3D%20%60%24%7Bcasted%5B0%5D%7Dpx%20%24%7Bcasted%5B1%5D%7Dpx%20%24%7Bcasted%5B2%5D%7Dpx%20%24%7Bcasted%5B3%5D%7Dpx%60%3B%0A%20%20%20%20%20%20this.callStyling(%0A%20%20%20%20%20%20%20%20args.ELEMENT%2C%20pad%2C%20%22padding%22%2C%0A%20%20%20%20%20%20%20%20%7B%20Textbox%3A%20%22overlayPad%22%2C%20%22Input%20Box%22%3A%20%22inputPad%22%2C%20%22Dropdown%20Button%22%3A%20%22dropBtnPad%22%20%7D%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setDropShadow(args)%20%7B%0A%20%20%20%20%20%20const%20casted%20%3D%20%5B%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.x)%2C%20Scratch.Cast.toNumber(args.y)%2C%0A%20%20%20%20%20%20%20%20Scratch.Cast.toNumber(args.z)%2C%0A%20%20%20%20%20%20%5D%3B%0A%20%20%20%20%20%20let%20shadow%20%3D%20args.z%20%3D%3D%3D%200%20%3F%20%22none%22%20%3A%20%60%24%7Bcasted%5B0%5D%7Dpx%20%24%7Bcasted%5B1%5D%20*%20-1%7Dpx%20%24%7Bcasted%5B2%5D%7Dpx%20%24%7Bargs.COLOR%7D%60%3B%0A%20%20%20%20%20%20this.callStyling(%0A%20%20%20%20%20%20%20%20args.ELEMENT.slice(0%2C%20-5)%2C%20shadow%2C%20%22dropShadow%22%2C%0A%20%20%20%20%20%20%20%20%7B%20%22Question%22%3A%20%22overlayTxtShad%22%2C%20%22Input%22%3A%20%22inputTxtShad%22%2C%20%22Dropdown%22%3A%20%22dropBtnTxtShad%22%20%7D%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setOutline(args)%20%7B%0A%20%20%20%20%20%20const%20thick%20%3D%20Scratch.Cast.toNumber(args.THICK)%3B%0A%20%20%20%20%20%20this.callStyling(%0A%20%20%20%20%20%20%20%20args.ELEMENT.slice(0%2C%20-5)%2C%20%5Bargs.COLOR%2C%20thick%5D%2C%20%22outline%22%2C%0A%20%20%20%20%20%20%20%20%7B%20%22Question%22%3A%20%22overlayOutline%22%2C%20%22Input%22%3A%20%22inputOutline%22%2C%20%22Dropdown%22%3A%20%22dropBtnOutline%22%20%7D%0A%20%20%20%20%20%20)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setShadow(args)%20%7B%0A%20%20%20%20%20%20const%20shadowMap%20%3D%20%7B%20Size%3A%202%2C%20X%3A%200%2C%20Y%3A%201%20%7D%3B%0A%20%20%20%20%20%20const%20propertyIndex%20%3D%20shadowMap%5Bargs.SHADOW%5D%3B%0A%20%20%20%20%20%20if%20(propertyIndex%20!%3D%3D%20undefined)%20this.shadowS%5BpropertyIndex%5D%20%3D%20args.AMT%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setImage(args)%20%7B%0A%20%20%20%20%20%20const%20elementMap%20%3D%20%7B%20Textbox%3A%200%2C%20%22Input%20Box%22%3A%201%2C%20%22Dropdown%20Button%22%3A%202%20%7D%3B%0A%20%20%20%20%20%20const%20elementIndex%20%3D%20elementMap%5Bargs.ELEMENT%5D%3B%0A%20%20%20%20%20%20if%20(elementIndex%20!%3D%3D%20undefined)%20this.overlayImage%5BelementIndex%5D%20%3D%20args.IMAGE%3B%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5Bargs.ELEMENT%5D)%20this.buttonJSON%5Bargs.ELEMENT%5D.image%20%3D%20args.IMAGE%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20scaleImage(args)%20%7B%0A%20%20%20%20%20%20const%20elementMap%20%3D%20%7B%20Textbox%3A%200%2C%20%22Input%20Box%22%3A%201%2C%20%22Dropdown%20Button%22%3A%202%20%7D%3B%0A%20%20%20%20%20%20const%20elementIndex%20%3D%20elementMap%5Bargs.ELEMENT%5D%3B%0A%20%20%20%20%20%20if%20(elementIndex%20!%3D%3D%20undefined)%20this.imgScale%5BelementIndex%5D%20%3D%20args.SCALE%3B%0A%20%20%20%20%20%20else%20if%20(this.buttonJSON%5Bargs.ELEMENT%5D)%20this.buttonJSON%5Bargs.ELEMENT%5D.imgScale%20%3D%20args.SCALE%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setDimension(args)%20%7B%0A%20%20%20%20%20%20const%20w%20%3D%20%60%24%7BScratch.Cast.toNumber(args.W)%7Dpx%60%3B%0A%20%20%20%20%20%20const%20h%20%3D%20%60%24%7BScratch.Cast.toNumber(args.H)%7Dpx%60%3B%0A%20%20%20%20%20%20%2F%2F%20Negative%20numbers%20result%20in%20auto-dimensions%0A%20%20%20%20%20%20this.mainUIinfo.dimensions%20%3D%20%5Bw.includes(%22-%22)%20%3F%20%22auto%22%20%3A%20w%2C%20h.includes(%22-%22)%20%3F%20%22auto%22%20%3A%20h%5D%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach(overlay%20%3D%3E%20this.updateOverlay(overlay))%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setDirection(args)%20%7B%0A%20%20%20%20%20%20this.Rotation%20%3D%20Scratch.Cast.toNumber(args.ROTATE)%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20changeDirection(args)%20%7B%0A%20%20%20%20%20%20this.Rotation%20%3D%20this.Rotation%20%2B%20Scratch.Cast.toNumber(args.ROTATE)%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20reportDirection()%20%7B%20return%20this.Rotation%20%7D%0A%0A%20%20%20%20setPrePosition(args)%20%7B%0A%20%20%20%20%20%20this.textBoxX%20%3D%20Scratch.Cast.toNumber(args.X)%20%2F%20(screen.width%20%2F%20400)%3B%0A%20%20%20%20%20%20this.textBoxY%20%3D%20Scratch.Cast.toNumber(args.Y)%20%2F%20(screen.height%20%2F%20-300)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setPosition(args)%20%7B%0A%20%20%20%20%20%20this.textBoxX%20%3D%20Scratch.Cast.toNumber(args.X)%20%2F%20(screen.width%20%2F%20400)%3B%0A%20%20%20%20%20%20this.textBoxY%20%3D%20Scratch.Cast.toNumber(args.Y)%20%2F%20(screen.height%20%2F%20-300)%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlayPos(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20changePosition(args)%20%7B%0A%20%20%20%20%20%20this.textBoxX%20%3D%20this.textBoxX%20%2B%20Scratch.Cast.toNumber(args.X)%20%2F%20(screen.width%20%2F%20400)%3B%0A%20%20%20%20%20%20this.textBoxY%20%3D%20this.textBoxY%20%2B%20Scratch.Cast.toNumber(args.Y)%20%2F%20(screen.height%20%2F%20-300)%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlayPos(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getXpos()%20%7B%20return%20this.textBoxX%20*%20(screen.width%20%2F%20400)%20%7D%0A%20%20%20%20getYpos()%20%7B%20return%20this.textBoxY%20*%20(screen.height%20%2F%20-300)%20%7D%0A%0A%20%20%20%20setFontSize(args)%20%7B%20this.fontSize%20%3D%20args.SIZE%20%2B%20%22px%22%20%7D%0A%0A%20%20%20%20setTextAlignment(args)%20%7B%0A%20%20%20%20%20%20this.textAlign%20%3D%20args.ALIGNMENT%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setFontFamily(args)%20%7B%0A%20%20%20%20%20%20this.fontFamily%20%3D%20args.FONT%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%20this.updateOverlay(overlay)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setSlider(args)%20%7B%20this.sliderInfo%20%3D%20%5Bargs.MIN%2C%20args.MAX%2C%20args.DEFAULT%5D%20%7D%0A%0A%20%20%20%20setInputType(args)%20%7B%0A%20%20%20%20%20%20if%20(args.ACTION%20%3D%3D%3D%20%22Text%22%20%7C%7C%20args.ACTION%20%3D%3D%3D%20%20%22None%22)%20%7B%0A%20%20%20%20%20%20%20%20this.isInputEnabled%20%3D%20args.ACTION%20%3D%3D%3D%20%22Text%22%20%3F%20%22Enabled%22%20%3A%20%22Disabled%22%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20this.isInputEnabled%20%3D%20args.ACTION%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20enableShadow(args)%20%7B%20this.shadowEnabled%20%3D%20args.ACTION%20%3D%3D%3D%20%22Enabled%22%20%7D%0A%0A%20%20%20%20setButtonText(args)%20%7B%0A%20%20%20%20%20%20const%20buttonMenu%20%3D%20args.BUTTON_MENU%3B%0A%20%20%20%20%20%20const%20text%20%3D%20args.TEXT%3B%0A%20%20%20%20%20%20if%20(buttonMenu%20%3D%3D%3D%20%22Dropdown%22)%20%7B%0A%20%20%20%20%20%20%20%20this.DropdownText%20%3D%20text%3B%0A%20%20%20%20%20%20%7D%20else%20if%20(this.buttonJSON%5BbuttonMenu%5D)%20%7B%0A%20%20%20%20%20%20%20%20this.buttonJSON%5BbuttonMenu%5D.name%20%3D%20text%3B%0A%20%20%20%20%20%20%20%20Scratch.vm.extensionManager.refreshBlocks()%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setDropdown(args)%20%7B%0A%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20this.optionList%20%3D%20JSON.parse(args.DROPDOWN)%3B%0A%20%20%20%20%20%20%7D%20catch%20%7B%20this.optionList%20%3D%20%5B%22Undefined%20Array%20Error%22%5D%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20removeAskBoxes()%20%7B%0A%20%20%20%20%20%20const%20overlaysToRemove%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20this.activeOverlays.forEach((overlay)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(overlay)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%26%26%20overlay.parentNode)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20overlay.parentNode.removeChild(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(overlay.parentNode.parentNode%20!%3D%3D%20document.documentElement)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20overlay.parentNode.parentNode.removeChild(overlay.parentNode)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20overlaysToRemove.push(overlay)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if%20(this.askBoxPromises)%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20index%20%3D%20this.activeOverlays.indexOf(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(index%20!%3D%3D%20-1)%20this.askBoxPromises%5Bindex%5D.resolve(%22removed%22)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20this.askBoxPromises%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20this.activeOverlays%20%3D%20this.activeOverlays.filter((overlay)%20%3D%3E%20!overlaysToRemove.includes(overlay))%3B%0A%20%20%20%20%20%20this.activeUI%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20this.askBoxInfo%5B0%5D%20%3D%200%3B%0A%20%20%20%20%20%20%2F%2F%20Remove%20%22Bugged%22%20Boxes%2C%20bugged%20boxes%20is%20a%20intentional%20feature%2C%20ask%20for%20more%20info%0A%20%20%20%20%20%20const%20bugged%20%3D%20document.querySelectorAll(%60%5Bclass%5E%3D%22SP-ask-box%22%5D%60)%3B%0A%20%20%20%20%20%20bugged.forEach((box)%20%3D%3E%20%7B%20box.parentNode.removeChild(box)%20%7D)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20askAndWaitForInput(args)%20%7B%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B0%5D%20%3C%20this.askBoxInfo%5B1%5D%20)%20%7B%0A%20%20%20%20%20%20%20%20return%20this.askAndWait(args).then(()%20%3D%3E%20%7B%20return%20this.getUserInput()%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20askAndWait(args)%20%7B%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B0%5D%20%3C%20this.askBoxInfo%5B1%5D)%20%7B%0A%20%20%20%20%20%20%20%20const%20question%20%3D%20args.question%3B%0A%20%20%20%20%20%20%20%20this.isWaitingForInput%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20this.lastPressBtn%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20this.askBoxInfo%5B0%5D%2B%2B%3B%0A%20%20%20%20%20%20%20%20let%20selectedOptions%20%3D%20%5B%5D%3B%0A%20%20%20%20%20%20%20%20return%20new%20Promise((resolve)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20const%20askBoxPromise%20%3D%20%7B%20resolve%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20this.askBoxPromises.push(askBoxPromise)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20overlay%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.classList.add(%22SP-ask-box%22)%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.pointerEvents%20%3D%20%22auto%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.position%20%3D%20%22fixed%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.zIndex%20%3D%20%229999%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.fontSize%20%3D%20this.fontSize%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%60%24%7B50%20%2B%20this.textBoxX%7D%25%60%20%3A%20%220%25%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%60%24%7B50%20%2B%20this.textBoxY%7D%25%60%20%3A%20%220%25%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20const%20focusBG%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20focusBG.style.cssText%20%3D%20%22pointer-events%3A%20auto%3B%20position%3A%20fixed%3B%20width%3A%20100%25%3B%20height%3A%20100%25%3B%20background-color%3A%20rgba(0%2C%200%2C%200%2C%200.5)%3B%20z-index%3A%209998%3B%22%3B%0A%20%20%20%20%20%20%20%20%20%20focusBG.className%20%3D%20%22SP-ask-boxBG%22%3B%0A%20%20%20%20%20%20%20%20%20%20focusBG.id%20%3D%20this.appendTarget%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20focusBG.style.left%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%220%25%22%20%3A%20%22-50%25%22%3B%0A%20%20%20%20%20%20%20%20%20%20focusBG.style.top%20%3D%20this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22%20%3F%20%220%25%22%20%3A%20%22-50%25%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer.style.width%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer.style.height%20%3D%20%22100%25%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer.style.position%20%3D%20%22absolute%22%3B%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer.style.top%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer.style.left%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20overlayImageContainer.style.zIndex%20%3D%20%22-1%22%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.forceInput%20!%3D%3D%20%22Disabled%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20overlayInput%20%3D%20this.forceInput%20%3D%3D%3D%20%22Enter%20Key%22%20%3F%20%22Enter%22%20%3A%20this.forceInput%20%3D%3D%3D%20%22Shift%20%2B%20Enter%20Key%22%20%3F%20%22ShiftEnter%22%20%3A%20this.forceInput%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20handleKeydown%20%3D%20(event)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20((overlayInput%20%3D%3D%3D%20%22ShiftEnter%22%20%26%26%20event.shiftKey%20%26%26%20event.key%20%3D%3D%3D%20%22Enter%22)%20%7C%7C%20event.key%20%3D%3D%3D%20overlayInput)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.userInput%20%3D%20inputField.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.closeOverlay(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20observer%20%3D%20new%20MutationObserver((mutationsList)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20mutation%20of%20mutationsList)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(mutation.type%20%3D%3D%3D%20%22childList%22%20%26%26%20!document.contains(overlay))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22keydown%22%2C%20handleKeydown)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20observer.disconnect()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20observer.observe(document.body%2C%20%7B%20childList%3A%20true%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22keydown%22%2C%20handleKeydown)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20const%20questionText%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20questionText.classList.add(%22question%22)%3B%0A%20%20%20%20%20%20%20%20%20%20questionText.style.fontSize%20%3D%20this.fontSize%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B0%5D%20!%3D%3D%20%22question%22)%20questionText.style.marginTop%20%3D%20%2210px%22%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B0%5D%20%3D%3D%3D%20%22question%22)%20questionText.style.marginBottom%20%3D%20%2210px%22%3B%0A%20%20%20%20%20%20%20%20%20%20questionText.innerHTML%20%3D%20xmlEscape(question).replace(%2F%5Cn%2Fg%2C%20%22%3Cbr%3E%22)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20const%20inputField%20%3D%20document.createElement(%22input%22)%3B%0A%20%20%20%20%20%20%20%20%20%20inputField.style.display%20%3D%20this.isInputEnabled%20%3F%20%22block%22%20%3A%20%22none%22%3B%0A%20%20%20%20%20%20%20%20%20%20inputField.style.fontSize%20%3D%20this.fontSize%3B%0A%20%20%20%20%20%20%20%20%20%20inputField.style.margin%20%3D%20%220%20auto%22%3B%0A%20%20%20%20%20%20%20%20%20%20inputField.type%20%3D%20this.isInputEnabled.toLowerCase()%3B%0A%20%20%20%20%20%20%20%20%20%20inputField.addEventListener(%22input%22%2C%20()%20%3D%3E%20%7B%20this.userInput%20%3D%20inputField.value%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20buttonContainer%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20buttonContainer.classList.add(%22button-container%22)%3B%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20buttonName%20in%20this.buttonJSON)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20buttonInfo%20%3D%20this.buttonJSON%5BbuttonName%5D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(buttonInfo.name.includes(%22%3Cnewline%3E%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20lineBreak%20%3D%20document.createElement(%22br%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20buttonContainer.appendChild(lineBreak)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20const%20button%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B0%5D%20!%3D%3D%20%22buttons%22)%20button.style.marginTop%20%3D%20%2210px%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.uiOrder%5B2%5D%20!%3D%3D%20%22buttons%22)%20button.style.marginBottom%20%3D%20%2210px%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20button.style.marginRight%20%3D%20%225px%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20button.style.cursor%20%3D%20%22pointer%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20button.innerHTML%20%3D%20xmlEscape(buttonInfo.name).replace(%2F%5Cn%2Fg%2C%20%22%3Cbr%3E%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20button.style.display%20%3D%20%22inline-block%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20button.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.lastPressBtn%20%3D%20buttonInfo.name%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.userInput%20%3D%20this.isInputEnabled%20%3D%3D%3D%20%22Disabled%22%20%3F%20buttonInfo.name%20%3A%20inputField.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.closeOverlay(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20resolve()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20buttonContainer.appendChild(button)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20const%20dropdown%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20dropdown.className%20%3D%20%22dropdown%22%3B%0A%20%20%20%20%20%20%20%20%20%20const%20dropdownButton%20%3D%20document.createElement(%22button%22)%3B%0A%20%20%20%20%20%20%20%20%20%20dropdownButton.className%20%3D%20%22dropbtn%22%3B%0A%20%20%20%20%20%20%20%20%20%20dropdownButton.innerHTML%20%3D%20xmlEscape(this.DropdownText).replace(%2F%5Cn%2Fg%2C%20%22%3Cbr%3E%22)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20dropdownContent%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20dropdownContent.id%20%3D%20%22myDropdown%22%3B%0A%20%20%20%20%20%20%20%20%20%20dropdownContent.className%20%3D%20%22dropdown-content%22%3B%0A%20%20%20%20%20%20%20%20%20%20dropdownContent.style.display%20%3D%20%22none%22%3B%0A%0A%20%20%20%20%20%20%20%20%20%20const%20optionLabels%20%3D%20this.optionList%3B%0A%20%20%20%20%20%20%20%20%20%20optionLabels.forEach((label%2C%20index)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20optionLabel%20%3D%20document.createElement(%22label%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionLabel.style.color%20%3D%20this.questionColor%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionLabel.textContent%20%3D%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20optionRadio%20%3D%20document.createElement(%22input%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionRadio.type%20%3D%20this.isInputEnabled%20%3D%3D%3D%20%22Dropdown%22%20%3F%20%22radio%22%20%3A%20%22checkbox%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionRadio.name%20%3D%20%22dropdownOptions%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionRadio.value%20%3D%20index%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionRadio.classList.add(%22dropdown-radio%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionRadio.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.isInputEnabled%20%3D%3D%3D%20%22Multi-Select%20Dropdown%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(selectedOptions.includes(label))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20selectedOptions%20%3D%20selectedOptions.filter(item%20%3D%3E%20item%20!%3D%3D%20label)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%20selectedOptions.push(label)%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20inputField.value%20%3D%20selectedOptions.length%20%3E%200%20%3F%20JSON.stringify(selectedOptions)%20%3A%20%22%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%20inputField.value%20%3D%20label%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.userInput%20%3D%20inputField.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionLabel.appendChild(optionRadio)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionLabel.appendChild(document.createTextNode(%22%20%22%20%2B%20label))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20optionLabel.appendChild(document.createElement(%22br%22))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20dropdownContent.appendChild(optionLabel)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20document.body.appendChild(dropdown)%3B%0A%20%20%20%20%20%20%20%20%20%20dropdownButton.addEventListener(%22click%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.lastPressBtn%20%3D%20this.DropdownText%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20dropdownContent.style.display%20%3D%20this.isDropdownOpen%20%3F%20%22none%22%20%3A%20%22block%22%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.isDropdownOpen%20%3D%20!this.isDropdownOpen%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%0A%20%20%20%20%20%20%20%20%20%20const%20sliderContainer%20%3D%20document.createElement(%22div%22)%3B%0A%20%20%20%20%20%20%20%20%20%20sliderContainer.classList.add(%22slider-container%22)%3B%0A%20%20%20%20%20%20%20%20%20%20const%20slider%20%3D%20document.createElement(%22input%22)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.isInputEnabled.includes(%22Vertical%22))%20slider.style.transform%20%3D%20%22rotate(270deg)%22%3B%0A%20%20%20%20%20%20%20%20%20%20slider.type%20%3D%20%22range%22%3B%0A%20%20%20%20%20%20%20%20%20%20slider.min%20%3D%20this.sliderInfo%5B0%5D%3B%0A%20%20%20%20%20%20%20%20%20%20slider.max%20%3D%20this.sliderInfo%5B1%5D%3B%0A%20%20%20%20%20%20%20%20%20%20slider.value%20%3D%20this.sliderInfo%5B2%5D%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.isInputEnabled.includes(%22Vertical%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%203%3B%20i%2B%2B)%20%7B%20sliderContainer.appendChild(document.createElement(%22br%22))%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20sliderContainer.appendChild(slider)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20(let%20i%20%3D%200%3B%20i%20%3C%204%3B%20i%2B%2B)%20%7B%20sliderContainer.appendChild(document.createElement(%22br%22))%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%20sliderContainer.appendChild(slider)%20%7D%0A%20%20%20%20%20%20%20%20%20%20const%20valueDisplay%20%3D%20document.createElement(%22span%22)%3B%0A%20%20%20%20%20%20%20%20%20%20valueDisplay.classList.add(%22slider-value%22)%3B%0A%20%20%20%20%20%20%20%20%20%20sliderContainer.appendChild(valueDisplay)%3B%0A%20%20%20%20%20%20%20%20%20%20valueDisplay.style.color%20%3D%20this.questionColor%3B%0A%20%20%20%20%20%20%20%20%20%20valueDisplay.textContent%20%3D%20slider.value%3B%0A%20%20%20%20%20%20%20%20%20%20slider.addEventListener(%22input%22%2C%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20valueDisplay.textContent%20%3D%20slider.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20inputField.value%20%3D%20slider.value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20this.userInput%20%3D%20valueDisplay.textContent%3B%0A%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20for%20(const%20item%20of%20this.uiOrder)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20switch%20(item)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20%22question%22%3A%20%7B%20overlay.appendChild(questionText)%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20%22input%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.isInputEnabled%20!%3D%3D%20%22Disabled%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.isInputEnabled%20%3D%3D%3D%20%22Enabled%22%20%7C%7C%20this.isInputEnabled%20%3D%3D%3D%20%22Color%22%20%7C%7C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20this.isInputEnabled%20%3D%3D%3D%20%22Number%22%20%7C%7C%20this.isInputEnabled%20%3D%3D%3D%20%22Password%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(inputField)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(this.isInputEnabled.includes(%22Dropdown%22))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(dropdownButton)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(dropdownContent)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(document.createElement(%22br%22))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(sliderContainer)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(valueDisplay)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.appendChild(document.createElement(%22br%22))%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20break%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20case%20%22buttons%22%3A%20%7B%20overlay.appendChild(buttonContainer)%3B%20break%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20overlay.appendChild(overlayImageContainer)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.body.appendChild(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B1%5D)%20document.body.appendChild(focusBG)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20inputField.focus()%3B%0A%20%20%20%20%20%20%20%20%20%20inputField.value%20%3D%20this.defaultValue%3B%0A%20%20%20%20%20%20%20%20%20%20this.activeOverlays.push(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20this.activeUI.push(%7B%20overlay%3A%20%7B%20button%3A%20buttonContainer%2C%20dropdown%3A%20dropdownButton%2C%20input%3A%20inputField%20%7D%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20resizeHandler%20%3D%20()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.style.left%20%3D%20%60%24%7Bthis.textBoxX%20!%3D%3D%20null%20%3F%2050%20%2B%20this.textBoxX%20%3A%2050%7D%25%60%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20overlay.style.top%20%3D%20%60%24%7Bthis.textBoxY%20!%3D%3D%20null%20%3F%2050%20%2B%20this.textBoxY%20%3A%2050%7D%25%60%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22fullscreenchange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22webkitfullscreenchange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22mozfullscreenchange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.addEventListener(%22MSFullscreenChange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20const%20observer%20%3D%20new%20MutationObserver((mutationsList)%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20(const%20mutation%20of%20mutationsList)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(mutation.type%20%3D%3D%3D%20%22childList%22%20%26%26%20Array.from(mutation.removedNodes).includes(overlay))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22fullscreenchange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22webkitfullscreenchange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22mozfullscreenchange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20document.removeEventListener(%22MSFullscreenChange%22%2C%20resizeHandler)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20observer.disconnect()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20observer.observe(overlay.parentNode%2C%20%7B%20childList%3A%20true%20%7D)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20document.body.appendChild(overlay)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B1%5D)%20vm.renderer.addOverlay(focusBG%2C%20%22scale-centered%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20vm.renderer.addOverlay(overlay%2C%20%22scale-centered%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20inputField.focus()%3B%0A%20%20%20%20%20%20%20%20%20%20this.updateOverlay(overlay)%3B%0A%20%20%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20closeOverlay(overlay)%20%7B%0A%20%20%20%20%20%20if%20(this.askBoxInfo%5B0%5D%20%3C%202)%20this.isWaitingForInput%20%3D%20false%3B%0A%20%20%20%20%20%20this.isDropdownOpen%20%3D%20false%3B%0A%20%20%20%20%20%20this.askBoxInfo%5B0%5D--%3B%0A%20%20%20%20%20%20let%20usedBG%20%3D%20document.querySelectorAll(%22.SP-ask-boxBG%22)%3B%0A%20%20%20%20%20%20usedBG%20%3D%20usedBG%5BusedBG.length%20-%201%5D%3B%0A%20%20%20%20%20%20%2F%2F%20%5E%20Prioritizes%20Textboxes%20on%20Window%0A%20%20%20%20%20%20const%20index%20%3D%20this.activeOverlays.indexOf(overlay)%3B%0A%20%20%20%20%20%20setTimeout(()%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(index%20!%3D%3D%20-1)%20%7B%0A%20%20%20%20%20%20%20%20%20%20this.activeOverlays.splice(index%2C%201)%3B%0A%20%20%20%20%20%20%20%20%20%20this.askBoxPromises.splice(index%2C%201)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20delete%20this.activeUI%5Boverlay%5D%3B%0A%20%20%20%20%20%20%20%20if%20(this.appendTarget%5B0%5D%20%3D%3D%3D%20%22window%22)%20document.body.removeChild(overlay)%3B%0A%20%20%20%20%20%20%20%20else%20vm.renderer.removeOverlay(overlay)%3B%0A%20%20%20%20%20%20%20%20if%20(usedBG)%20%7B%0A%20%20%20%20%20%20%20%20%20%20if%20(usedBG.id%20%3D%3D%3D%20%22window%22)%20document.body.removeChild(usedBG)%3B%0A%20%20%20%20%20%20%20%20%20%20else%20vm.renderer.removeOverlay(usedBG)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%7D%2C%20this.Timeout%20*%201000)%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20setButton(args)%20%7B%0A%20%20%20%20%20%20if%20(args.BUTTON%20%3D%3D%3D%20%22add%22)%20%7B%0A%20%20%20%20%20%20%20%20this.buttonJSON%5Bargs.NAME%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20borderRadius%3A%205%2C%20border%3A%20%221px%20none%20%23000000%22%2C%0A%20%20%20%20%20%20%20%20%20%20color%3A%20%22%230074D9%22%2C%20textColor%3A%20%22%23ffffff%22%2C%0A%20%20%20%20%20%20%20%20%20%20name%3A%20args.NAME%2C%20padding%3A%20%225px%2010px%22%2C%0A%20%20%20%20%20%20%20%20%20%20image%3A%20%22%22%2C%20imgScale%3A%20100%2C%0A%20%20%20%20%20%20%20%20%20%20dropShadow%3A%20%22none%22%2C%20outline%3A%20%5B%22%22%2C%200%5D%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20delete%20this.buttonJSON%5Bargs.NAME%5D%20%7D%0A%20%20%20%20%20%20Scratch.vm.extensionManager.refreshBlocks()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20deleteAllButtons()%20%7B%0A%20%20%20%20%20%20this.buttonJSON%20%3D%20%7B%7D%3B%0A%20%20%20%20%20%20Scratch.vm.extensionManager.refreshBlocks()%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20lastButton()%20%7B%20return%20this.lastPressBtn%20%7D%0A%0A%20%20%20%20isWaitingInput()%20%7B%20return%20this.isWaitingForInput%20%7D%0A%0A%20%20%20%20isDropdown()%20%7B%20return%20this.isDropdownOpen%20%7D%0A%0A%20%20%20%20setMaxBoxCount(args)%20%7B%20this.askBoxInfo%5B1%5D%20%3D%20args.MAX%20%7D%0A%0A%20%20%20%20setTimeout(args)%20%7B%0A%20%20%20%20%20%20this.Timeout%20%3D%20args.TIME%3B%0A%20%20%20%20%20%20this.Condition%20%3D%20args.CONDITION%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20reportTimeout()%20%7B%20return%20this.Timeout%20%7D%0A%0A%20%20%20%20getUserInput()%20%7B%20return%20this.userInput%20%3D%3D%3D%20null%20%3F%20%22%22%20%3A%20this.userInput%20%7D%0A%0A%20%20%20%20getBoxInfo(args)%20%7B%0A%20%20%20%20%20%20if%20(args.INFO.includes(%22button%22))%20%7B%0A%20%20%20%20%20%20%20%20const%20buttons%20%3D%20Object.keys(this.buttonJSON)%3B%0A%20%20%20%20%20%20%20%20return%20args.INFO.includes(%22names%22)%20%3F%20JSON.stringify(buttons)%20%3A%20buttons.length%3B%0A%20%20%20%20%20%20%7D%20else%20%7B%20return%20this.askBoxInfo%5Bargs.INFO%20%3D%3D%3D%20%22count%22%20%3F%200%20%3A%201%5D%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20setSubmitEvent(args)%20%7B%20this.forceInput%20%3D%20args.ENTER%20%7D%0A%0A%20%20%20%20setDefaultV(args)%20%7B%20this.defaultValue%20%3D%20args.defaultV%20%7D%0A%0A%20%20%20%20setAppend(args)%20%7B%20this.appendTarget%5B0%5D%20%3D%20args.TARGET%20%7D%0A%20%20%20%20setFocus(args)%20%7B%20this.appendTarget%5B1%5D%20%3D%20args.TYPE%20%3D%3D%3D%20%22Enabled%22%20%7D%0A%0A%20%20%20%20setUI(args)%20%7B%0A%20%20%20%20%20%20let%20array%3B%0A%20%20%20%20%20%20try%20%7B%20array%20%3D%20JSON.parse(args.ARRAY.toLowerCase())%20%7D%20catch%20%7B%20return%20%7D%0A%20%20%20%20%20%20if%20(!Array.isArray(array))%20return%3B%0A%20%20%20%20%20%20const%20allowedUI%20%3D%20%5B%22question%22%2C%20%22input%22%2C%20%22buttons%22%5D%3B%0A%20%20%20%20%20%20let%20filteredArray%20%3D%20%5B...new%20Set(array.filter(element%20%3D%3E%20allowedUI.includes(element)))%5D%3B%0A%20%20%20%20%20%20allowedUI.forEach(element%20%3D%3E%20%7B%0A%20%20%20%20%20%20%20%20if%20(!filteredArray.includes(element))%20filteredArray.push(element)%3B%0A%20%20%20%20%20%20%7D)%3B%0A%20%20%20%20%20%20this.uiOrder%20%3D%20filteredArray%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20getUIOrder()%20%7B%20return%20JSON.stringify(this.uiOrder)%20%7D%0A%0A%20%20%20%20setEnable()%20%7B%20throw%20new%20Error(%22This%20Block%20has%20been%20removed%20since%20Better%20Input%20V3.%20Please%20use%20the%20New%20Powerful%20Blocks%22)%20%7D%0A%20%20%20%20getBoxCount()%20%7B%20return%20this.askBoxInfo%5B0%5D%20%7D%20%2F%2FLegacy%0A%20%20%20%20getMaxCount()%20%7B%20return%20this.askBoxInfo%5B1%5D%20%7D%20%2F%2FLegacy%0A%20%20%7D%0A%0A%20%20Scratch.extensions.register(new%20BetterInputSP())%3B%0A%7D)(Scratch)%3B%0A","https://extensions.turbowarp.org/sound.js","https://extensions.turbowarp.org/Lily/Skins.js","https://extensions.turbowarp.org/encoding.js","https://extensions.turbowarp.org/-SIPC-/consoles.js","https://extensions.turbowarp.org/-SIPC-/time.js","https://extensions.turbowarp.org/obviousAlexC/SensingPlus.js","https://extensions.turbowarp.org/Lily/MoreTimers.js","https://extensions.turbowarp.org/NOname-awa/global-coordinate.js","https://extensions.turbowarp.org/Lily/Video.js","https://extensions.turbowarp.org/cursor.js"],"bakeExtensions":true} \ No newline at end of file diff --git a/thumb.png b/thumb.png index 52405b2c..54fad24e 100644 Binary files a/thumb.png and b/thumb.png differ diff --git a/thumb.png.kra b/thumb.png.kra index 0ff3d780..8b01f941 100644 Binary files a/thumb.png.kra and b/thumb.png.kra differ diff --git a/turbowarp-addon-settings.json b/turbowarp-addon-settings.json index 0d87ceba..8b39a8d4 100644 --- a/turbowarp-addon-settings.json +++ b/turbowarp-addon-settings.json @@ -1 +1 @@ -{"core":{"lightTheme":false,"version":"v1.0.0-tw-7fcab09"},"addons":{"cat-blocks":{"enabled":true,"settings":{"watch":true}},"editor-devtools":{"enabled":true,"settings":{"enableCleanUpPlus":true,"enablePasteBlocksAtMouse":true}},"find-bar":{"enabled":true,"settings":{}},"middle-click-popup":{"enabled":true,"settings":{"popup_scale":64,"popup_width":16,"popup_max_height":40}},"editor-block-chomping":{"enabled":false,"settings":{}},"jump-to-def":{"enabled":true,"settings":{}},"editor-searchable-dropdowns":{"enabled":true,"settings":{}},"block-palette-icons":{"enabled":true,"settings":{}},"hide-flyout":{"enabled":true,"settings":{"toggle":"hover","speed":"short"}},"mediarecorder":{"enabled":true,"settings":{}},"drag-drop":{"enabled":true,"settings":{"use-hd-upload":false}},"debugger":{"enabled":true,"settings":{"log_clear_greenflag":false,"log_greenflag":false,"log_clone_create":false,"log_failed_clone_creation":true,"log_broadcasts":false}},"mute-project":{"enabled":true,"settings":{}},"vol-slider":{"enabled":true,"settings":{"defVol":100}},"clones":{"enabled":true,"settings":{"showicononly":false}},"mouse-pos":{"enabled":true,"settings":{}},"color-picker":{"enabled":true,"settings":{}},"remove-sprite-confirm":{"enabled":true,"settings":{}},"block-count":{"enabled":true,"settings":{}},"onion-skinning":{"enabled":true,"settings":{"default":false,"previous":1,"next":0,"opacity":25,"opacityStep":10,"layering":"front","mode":"merge","beforeTint":"#FF0000","afterTint":"#0000FF"}},"paint-snap":{"enabled":false,"settings":{"enable-default":true,"guide-color":"#ff0000","pageCenter":true,"pageAxes":true,"pageEdges":true,"pageCorners":false,"objectEdges":true,"objectCenters":true,"objectMidlines":true,"objectCorners":false,"boxCenter":true,"boxCorners":false,"boxEdgeMids":false,"threshold":10}},"default-costume-editor-color":{"enabled":false,"settings":{"fill":"#9966FF","stroke":"#000000","strokeSize":4,"persistence":true}},"bitmap-copy":{"enabled":true,"settings":{}},"2d-color-picker":{"enabled":false,"settings":{}},"better-img-uploads":{"enabled":true,"settings":{"fitting":"full"}},"pick-colors-from-stage":{"enabled":true,"settings":{}},"custom-block-shape":{"enabled":true,"settings":{"paddingSize":50,"cornerSize":100,"notchSize":0}},"zebra-striping":{"enabled":false,"settings":{"shade":"lighter","intensity":100}},"editor-theme3":{"enabled":true,"settings":{"motion-color":"#ffffff","looks-color":"#ffffff","sounds-color":"#ffffff","events-color":"#ffffff","control-color":"#ffffff","sensing-color":"#ffffff","operators-color":"#ffffff","data-color":"#ffffff","data-lists-color":"#ffffff","custom-color":"#ffffff","Pen-color":"#ffffff","tw-color":"#fdfcfc","sa-color":"#ffffff","input-color":"#784545","comment-color":"#FEF49C","text":"black"}},"custom-block-text":{"enabled":true,"settings":{"bold":true,"shadow":false}},"editor-colored-context-menus":{"enabled":true,"settings":{}},"editor-stage-left":{"enabled":false,"settings":{}},"editor-buttons-reverse-order":{"enabled":false,"settings":{}},"variable-manager":{"enabled":true,"settings":{}},"search-sprites":{"enabled":true,"settings":{}},"sprite-properties":{"enabled":true,"settings":{"autoCollapse":false,"hideByDefault":true,"transitionDuration":"none"}},"gamepad":{"enabled":true,"settings":{"hide":true}},"editor-sounds":{"enabled":false,"settings":{}},"folders":{"enabled":true,"settings":{}},"block-switching":{"enabled":true,"settings":{"motion":true,"looks":true,"sound":true,"event":true,"control":true,"operator":true,"sensing":true,"data":true,"extension":true,"sa":true,"customargs":true,"customargsmode":"defOnly","noop":true}},"load-extensions":{"enabled":true,"settings":{"music":false,"pen":false,"text2speech":false,"translate":false}},"custom-zoom":{"enabled":true,"settings":{"maxZoom":500,"minZoom":30,"startZoom":68,"zoomSpeed":100,"autohide":true,"speed":"short"}},"initialise-sprite-position":{"enabled":true,"settings":{"x":0,"y":0,"library":false,"duplicate":"randomize"}},"blocks2image":{"enabled":true,"settings":{}},"remove-curved-stage-border":{"enabled":true,"settings":{}},"transparent-orphans":{"enabled":true,"settings":{"block":0,"orphan":50,"dragged":75}},"paint-by-default":{"enabled":true,"settings":{"sprite":"paint","costume":"paint","backdrop":"paint","sound":"upload"}},"block-cherry-picking":{"enabled":true,"settings":{"invertDrag":false}},"hide-new-variables":{"enabled":true,"settings":{}},"editor-extra-keys":{"enabled":true,"settings":{"experimentalKeys":true,"shiftKeys":true,"twKeys":true}},"hide-delete-button":{"enabled":true,"settings":{"sprites":true,"costumes":false,"sounds":true}},"no-script-bumping":{"enabled":true,"settings":{}},"disable-stage-drag-select":{"enabled":true,"settings":{}},"move-to-top-bottom":{"enabled":true,"settings":{}},"disable-paste-offset":{"enabled":true,"settings":{}},"block-duplicate":{"enabled":true,"settings":{}},"swap-local-global":{"enabled":true,"settings":{}},"editor-comment-previews":{"enabled":true,"settings":{"hover-view":true,"hover-view-block":true,"hover-view-procedure":true,"delay":"short","follow-mouse":true,"reduce-transparency":false,"reduce-animation":false}},"columns":{"enabled":false,"settings":{}},"number-pad":{"enabled":false,"settings":{}},"script-snap":{"enabled":true,"settings":{"grid":40}},"fullscreen":{"enabled":false,"settings":{"browserFullscreen":false,"hideToolbar":true}},"hide-stage":{"enabled":true,"settings":{}},"tw-straighten-comments":{"enabled":false,"settings":{}},"tw-remove-backpack":{"enabled":false,"settings":{}},"tw-remove-feedback":{"enabled":false,"settings":{}},"tw-disable-cloud-variables":{"enabled":false,"settings":{}},"editor-stepping":{"enabled":true,"settings":{"highlight-color":"#00ff88"}}}} \ No newline at end of file +{"core":{"lightTheme":false,"version":"v1.0.0-tw-7fcab09"},"addons":{"cat-blocks":{"enabled":true,"settings":{"watch":true}},"editor-devtools":{"enabled":true,"settings":{"enableCleanUpPlus":true,"enablePasteBlocksAtMouse":true}},"find-bar":{"enabled":true,"settings":{}},"middle-click-popup":{"enabled":true,"settings":{"popup_scale":64,"popup_width":16,"popup_max_height":20,"popup_max_search":1,"popup_max_variants":1}},"editor-block-chomping":{"enabled":false,"settings":{}},"jump-to-def":{"enabled":true,"settings":{}},"editor-searchable-dropdowns":{"enabled":true,"settings":{}},"block-palette-icons":{"enabled":true,"settings":{}},"hide-flyout":{"enabled":true,"settings":{"toggle":"cathover","speed":"short"}},"mediarecorder":{"enabled":true,"settings":{}},"drag-drop":{"enabled":true,"settings":{"use-hd-upload":true}},"debugger":{"enabled":true,"settings":{"log_clear_greenflag":true,"log_greenflag":false,"log_clone_create":false,"log_failed_clone_creation":false,"log_broadcasts":false}},"mute-project":{"enabled":true,"settings":{}},"vol-slider":{"enabled":true,"settings":{"defVol":100}},"clones":{"enabled":true,"settings":{"showicononly":false}},"mouse-pos":{"enabled":true,"settings":{}},"color-picker":{"enabled":true,"settings":{}},"remove-sprite-confirm":{"enabled":true,"settings":{}},"block-count":{"enabled":true,"settings":{}},"onion-skinning":{"enabled":true,"settings":{"default":false,"previous":1,"next":0,"opacity":25,"opacityStep":10,"layering":"front","mode":"merge","beforeTint":"#FF0000","afterTint":"#0000FF"}},"paint-snap":{"enabled":false,"settings":{"enable-default":true,"guide-color":"#ff0000","pageCenter":true,"pageAxes":true,"pageEdges":true,"pageCorners":false,"objectEdges":true,"objectCenters":true,"objectMidlines":true,"objectCorners":false,"boxCenter":true,"boxCorners":false,"boxEdgeMids":false,"threshold":10}},"default-costume-editor-color":{"enabled":false,"settings":{"fill":"#9966FF","stroke":"#000000","strokeSize":4,"persistence":true}},"bitmap-copy":{"enabled":true,"settings":{}},"2d-color-picker":{"enabled":false,"settings":{}},"better-img-uploads":{"enabled":true,"settings":{"fitting":"full"}},"pick-colors-from-stage":{"enabled":true,"settings":{}},"custom-block-shape":{"enabled":true,"settings":{"paddingSize":50,"cornerSize":100,"notchSize":0}},"zebra-striping":{"enabled":true,"settings":{"shade":"darker","intensity":15}},"editor-theme3":{"enabled":true,"settings":{"motion-color":"#ffffff","looks-color":"#ffffff","sounds-color":"#ffffff","events-color":"#ffffff","control-color":"#ffffff","sensing-color":"#ffffff","operators-color":"#ffffff","data-color":"#ffffff","data-lists-color":"#ffffff","custom-color":"#ffffff","Pen-color":"#ffffff","tw-color":"#fdfcfc","sa-color":"#ffffff","input-color":"#784545","comment-color":"#FEF49C","text":"black"}},"custom-block-text":{"enabled":true,"settings":{"bold":true,"shadow":false}},"editor-colored-context-menus":{"enabled":true,"settings":{}},"editor-stage-left":{"enabled":false,"settings":{}},"editor-buttons-reverse-order":{"enabled":false,"settings":{}},"search-sprites":{"enabled":true,"settings":{}},"sprite-properties":{"enabled":true,"settings":{"autoCollapse":false,"hideByDefault":true,"transitionDuration":"none"}},"gamepad":{"enabled":false,"settings":{"hide":true}},"editor-sounds":{"enabled":false,"settings":{}},"folders":{"enabled":true,"settings":{}},"block-switching":{"enabled":true,"settings":{"motion":true,"looks":true,"sound":true,"event":true,"control":true,"operator":true,"sensing":true,"data":true,"extension":true,"sa":true,"customargs":true,"customargsmode":"defOnly","noop":true}},"load-extensions":{"enabled":true,"settings":{"music":false,"pen":false,"text2speech":false,"translate":false}},"custom-zoom":{"enabled":true,"settings":{"maxZoom":500,"minZoom":30,"startZoom":68,"zoomSpeed":100,"autohide":true,"speed":"short"}},"initialise-sprite-position":{"enabled":true,"settings":{"x":0,"y":0,"library":false,"duplicate":"randomize"}},"blocks2image":{"enabled":true,"settings":{}},"remove-curved-stage-border":{"enabled":true,"settings":{}},"transparent-orphans":{"enabled":true,"settings":{"block":0,"orphan":50,"dragged":75}},"paint-by-default":{"enabled":true,"settings":{"sprite":"paint","costume":"paint","backdrop":"paint","sound":"upload"}},"block-cherry-picking":{"enabled":true,"settings":{"invertDrag":false}},"hide-new-variables":{"enabled":true,"settings":{}},"editor-extra-keys":{"enabled":true,"settings":{"experimentalKeys":true,"shiftKeys":true,"twKeys":true}},"hide-delete-button":{"enabled":true,"settings":{"sprites":true,"costumes":false,"sounds":true}},"no-script-bumping":{"enabled":true,"settings":{}},"disable-stage-drag-select":{"enabled":true,"settings":{}},"move-to-top-bottom":{"enabled":true,"settings":{}},"disable-paste-offset":{"enabled":true,"settings":{}},"block-duplicate":{"enabled":true,"settings":{}},"swap-local-global":{"enabled":true,"settings":{}},"editor-comment-previews":{"enabled":true,"settings":{"hover-view":true,"hover-view-block":true,"hover-view-procedure":true,"delay":"short","follow-mouse":true,"reduce-transparency":false,"reduce-animation":false}},"columns":{"enabled":true,"settings":{}},"number-pad":{"enabled":false,"settings":{}},"script-snap":{"enabled":true,"settings":{"grid":40}},"fullscreen":{"enabled":true,"settings":{"browserFullscreen":false,"hideToolbar":true}},"hide-stage":{"enabled":true,"settings":{}},"tw-straighten-comments":{"enabled":false,"settings":{}},"tw-remove-feedback":{"enabled":true,"settings":{}},"tw-remove-backpack":{"enabled":false,"settings":{}},"tw-disable-cloud-variables":{"enabled":false,"settings":{}}}} \ No newline at end of file