Greasy Fork

GeoGuessr country-wise score

Adds an analysis tool to the GeoGuessr website

目前为 2024-08-09 提交的版本。查看 最新版本

// ==UserScript==
// @name         GeoGuessr country-wise score
// @version      0.1
// @description  Adds an analysis tool to the GeoGuessr website
// @match        https://www.geoguessr.com/*
// @run-at document-start
// @author       eru
// @license      MIT
// @require      https://greasyfork.org/scripts/460322-geoguessr-styles-scan/code/Geoguessr%20Styles%20Scan.js?version=1151654
// @icon         https://www.google.com/s2/favicons?sz=64&domain=geoguessr.com
// @grant        none
// @namespace https://greasyfork.org/users/1348455
// ==/UserScript==

/*
                  THIS SCRIPT WAS SUPPOSED TO WORK FOR BOTH SOLO AND MULTIPLAYER
                  HOWEVER, I FOUND OUT THAT IT IS NOT ALLOWED TO QUERY THE API FROM A MULTIPLAYER GAME
                  SO IGNORE ALL CODE SNIPPETS RELATED TO MULTIPLAYER LIKE getDuelData
*/

const AUTOMATIC = true;
//                ^^^^ Replace with false for a manual counter

const API_Key = '';
//               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Replace INSERT_BIGDATACLOUD_API_KEY_HERE with your API key (keep the quote marks)
//               THIS IS OPTIONAL: if you don't provide an API key, the script will use another method to get the country

const statsServerUrl = 'https://ggstats.eu';

const DefaultCountryDict = {
    AF: {referent: 'AF', occ: 0, right: 0, diag: 1142.1295898452154, avgdist: 0, alpha: 175.3515519520104, avgscore: 0, wrong_guesses: {}},
    AX: {referent: 'FI', occ: 0, right: 0, diag: 56.213877290220786, avgdist: 0, alpha: 25.63268878594707, avgscore: 0, wrong_guesses: {}},
    AL: {referent: 'AL', occ: 0, right: 0, diag: 239.78323544401513, avgdist: 0, alpha: 46.309802998440105, avgscore: 0, wrong_guesses: {}},
    DZ: {referent: 'DZ', occ: 0, right: 0, diag: 2182.5402630879457, avgdist: 0, alpha: 318.79648181423624, avgscore: 0, wrong_guesses: {}},
    AS: {referent: 'US', occ: 0, right: 0, diag: 19.949937343260004, avgdist: 0, alpha: 20.632857031043354, avgscore: 0, wrong_guesses: {}},
    AD: {referent: 'AD', occ: 0, right: 0, diag: 30.59411708155671, avgdist: 0, alpha: 22.100406004990372, avgscore: 0, wrong_guesses: {}},
    AO: {referent: 'AO', occ: 0, right: 0, diag: 1579.0503475190396, avgdist: 0, alpha: 235.5912909817255, avgscore: 0, wrong_guesses: {}},
    AI: {referent: 'GB', occ: 0, right: 0, diag: 13.490737563232042, avgdist: 0, alpha: 19.742305364051706, avgscore: 0, wrong_guesses: {}},
    AQ: {referent: 'AQ', occ: 0, right: 0, diag: 5291.502622129181, avgdist: 0, alpha: 747.4396118842076, avgscore: 0, wrong_guesses: {}},
    AG: {referent: 'AG', occ: 0, right: 0, diag: 29.732137494637012, avgdist: 0, alpha: 21.981561971025414, avgscore: 0, wrong_guesses: {}},
    AR: {referent: 'AR', occ: 0, right: 0, diag: 2358.1348561946156, avgdist: 0, alpha: 396.0216955729648, avgscore: 0, wrong_guesses: {}},
    AM: {referent: 'AM', occ: 0, right: 0, diag: 243.89751946258085, avgdist: 0, alpha: 51.50926577625275, avgscore: 0, wrong_guesses: {}},
    AW: {referent: 'NL', occ: 0, right: 0, diag: 18.973665961010276, avgdist: 0, alpha: 20.498255201636095, avgscore: 0, wrong_guesses: {}},
    AU: {referent: 'AU', occ: 0, right: 0, diag: 3922.2503744661685, avgdist: 0, alpha: 512.8761793857648, avgscore: 0, wrong_guesses: {}},
    AT: {referent: 'AT', occ: 0, right: 0, diag: 409.56318193900194, avgdist: 0, alpha: 83.53194032530612, avgscore: 0, wrong_guesses: {}},
    AZ: {referent: 'AZ', occ: 0, right: 0, diag: 416.17304093369626, avgdist: 0, alpha: 75.26147317852835, avgscore: 0, wrong_guesses: {}},
    BS: {referent: 'BS', occ: 0, right: 0, diag: 166.99101772251106, avgdist: 0, alpha: 40.905906899060895, avgscore: 0, wrong_guesses: {}},
    BH: {referent: 'BH', occ: 0, right: 0, diag: 39.11521443121589, avgdist: 0, alpha: 23.275238446742815, avgscore: 0, wrong_guesses: {}},
    BD: {referent: 'BD', occ: 0, right: 0, diag: 543.2678897192434, avgdist: 0, alpha: 74.38755026777277, avgscore: 0, wrong_guesses: {}},
    BB: {referent: 'BB', occ: 0, right: 0, diag: 29.32575659723036, avgdist: 0, alpha: 21.925532865572123, avgscore: 0, wrong_guesses: {}},
    BY: {referent: 'BY', occ: 0, right: 0, diag: 644.3601477434805, avgdist: 0, alpha: 106.72239949695455, avgscore: 0, wrong_guesses: {}},
    BE: {referent: 'BE', occ: 0, right: 0, diag: 247.09512338368802, avgdist: 0, alpha: 34.843829038514336, avgscore: 0, wrong_guesses: {}},
    BZ: {referent: 'BZ', occ: 0, right: 0, diag: 214.31752144890066, avgdist: 0, alpha: 47.43097164728892, avgscore: 0, wrong_guesses: {}},
    BJ: {referent: 'BJ', occ: 0, right: 0, diag: 474.59877791667355, avgdist: 0, alpha: 83.31682666461928, avgscore: 0, wrong_guesses: {}},
    BM: {referent: 'GB', occ: 0, right: 0, diag: 10.392304845413264, avgdist: 0, alpha: 19.315113991144052, avgscore: 0, wrong_guesses: {}},
    BT: {referent: 'BT', occ: 0, right: 0, diag: 277.10647773013176, avgdist: 0, alpha: 54.93711090892961, avgscore: 0, wrong_guesses: {}},
    BO: {referent: 'BO', occ: 0, right: 0, diag: 1482.2826990827357, avgdist: 0, alpha: 163.17070120907988, avgscore: 0, wrong_guesses: {}},
    BQ: {referent: 'NL', occ: 0, right: 0, diag: 25.612496949731394, avgdist: 0, alpha: 37.47968185947722, avgscore: 0, wrong_guesses: {}},
    BA: {referent: 'BA', occ: 0, right: 0, diag: 320.0281237641467, avgdist: 0, alpha: 62.005649055722614, avgscore: 0, wrong_guesses: {}},
    BW: {referent: 'BW', occ: 0, right: 0, diag: 1078.8883167408942, avgdist: 0, alpha: 134.95197865270416, avgscore: 0, wrong_guesses: {}},
    BV: {referent: 'NO', occ: 0, right: 0, diag: 9.899494936611665, avgdist: 0, alpha: 19.247168626278533, avgscore: 0, wrong_guesses: {}},
    BR: {referent: 'BR', occ: 0, right: 0, diag: 4126.927913109217, avgdist: 0, alpha: 591.9923561732209, avgscore: 0, wrong_guesses: {}},
    BN: {referent: 'BN', occ: 0, right: 0, diag: 107.37783756436893, avgdist: 0, alpha: 32.68683661598056, avgscore: 0, wrong_guesses: {}},
    BG: {referent: 'BG', occ: 0, right: 0, diag: 470.91188135361375, avgdist: 0, alpha: 60.05314384559996, avgscore: 0, wrong_guesses: {}},
    BF: {referent: 'BF', occ: 0, right: 0, diag: 738.8734668398913, avgdist: 0, alpha: 119.75326968841003, avgscore: 0, wrong_guesses: {}},
    BI: {referent: 'BI', occ: 0, right: 0, diag: 235.9406705084988, avgdist: 0, alpha: 50.41222816457079, avgscore: 0, wrong_guesses: {}},
    KH: {referent: 'KH', occ: 0, right: 0, diag: 601.7225274160841, avgdist: 0, alpha: 71.12785351923642, avgscore: 0, wrong_guesses: {}},
    CM: {referent: 'CM', occ: 0, right: 0, diag: 975.1328114672381, avgdist: 0, alpha: 152.3271426704479, avgscore: 0, wrong_guesses: {}},
    CA: {referent: 'CA', occ: 0, right: 0, diag: 4468.706748042436, avgdist: 0, alpha: 546.2232473698027, avgscore: 0, wrong_guesses: {}},
    CV: {referent: 'CV', occ: 0, right: 0, diag: 89.81091247727082, avgdist: 0, alpha: 30.26482538347385, avgscore: 0, wrong_guesses: {}},
    KY: {referent: 'UK', occ: 0, right: 0, diag: 22.978250586152114, avgdist: 0, alpha: 21.050380795359988, avgscore: 0, wrong_guesses: {}},
    CF: {referent: 'CF', occ: 0, right: 0, diag: 1116.2293671105415, avgdist: 0, alpha: 171.78060085631307, avgscore: 0, wrong_guesses: {}},
    TD: {referent: 'TD', occ: 0, right: 0, diag: 1602.4980499208104, avgdist: 0, alpha: 238.82410482432982, avgscore: 0, wrong_guesses: {}},
    CL: {referent: 'CL', occ: 0, right: 0, diag: 1229.7170406235737, avgdist: 0, alpha: 412.0259548379801, avgscore: 0, wrong_guesses: {}},
    CN: {referent: 'CN', occ: 0, right: 0, diag: 4406.123239311401, avgdist: 0, alpha: 625.3693691079427, avgscore: 0, wrong_guesses: {}},
    CX: {referent: 'AU', occ: 0, right: 0, diag: 16.431676725154983, avgdist: 0, alpha: 20.147782569025253, avgscore: 0, wrong_guesses: {}},
    CC: {referent: 'AU', occ: 0, right: 0, diag: 5.291502622129181, avgdist: 0, alpha: 18.611849178529653, avgscore: 0, wrong_guesses: {}},
    CO: {referent: 'CO', occ: 0, right: 0, diag: 1511.1240849116264, avgdist: 0, alpha: 234.99234152503587, avgscore: 0, wrong_guesses: {}},
    KM: {referent: 'KM', occ: 0, right: 0, diag: 61.02458520956943, avgdist: 0, alpha: 26.295957318100648, avgscore: 0, wrong_guesses: {}},
    CG: {referent: 'CG', occ: 0, right: 0, diag: 827.0429251254133, avgdist: 0, alpha: 131.90949038570238, avgscore: 0, wrong_guesses: {}},
    CD: {referent: 'CD', occ: 0, right: 0, diag: 2165.575212270403, avgdist: 0, alpha: 316.45745301799496, avgscore: 0, wrong_guesses: {}},
    CK: {referent: 'NZ', occ: 0, right: 0, diag: 21.72556098240043, avgdist: 0, alpha: 20.877668253120067, avgscore: 0, wrong_guesses: {}},
    CR: {referent: 'CR', occ: 0, right: 0, diag: 319.68734726291564, avgdist: 0, alpha: 61.95866504971907, avgscore: 0, wrong_guesses: {}},
    CI: {referent: 'CI', occ: 0, right: 0, diag: 803.072848501305, avgdist: 0, alpha: 128.60465504657546, avgscore: 0, wrong_guesses: {}},
    HR: {referent: 'HR', occ: 0, right: 0, diag: 336.4342432036311, avgdist: 0, alpha: 65.25113670334214, avgscore: 0, wrong_guesses: {}},
    CU: {referent: 'CU', occ: 0, right: 0, diag: 468.7941979163138, avgdist: 0, alpha: 82.51652963533552, avgscore: 0, wrong_guesses: {}},
    CW: {referent: 'NL', occ: 0, right: 0, diag: 29.79932885150268, avgdist: 0, alpha: 21.990825870099904, avgscore: 0, wrong_guesses: {}},
    CY: {referent: 'CY', occ: 0, right: 0, diag: 136.02205703487945, avgdist: 0, alpha: 36.63611179988381, avgscore: 0, wrong_guesses: {}},
    CZ: {referent: 'CZ', occ: 0, right: 0, diag: 397.1523637094459, avgdist: 0, alpha: 58.35867535139994, avgscore: 0, wrong_guesses: {}},
    DK: {referent: 'DK', occ: 0, right: 0, diag: 293.5779283256832, avgdist: 0, alpha: 55.4021156649218, avgscore: 0, wrong_guesses: {}},
    DJ: {referent: 'DJ', occ: 0, right: 0, diag: 215.40659228538016, avgdist: 0, alpha: 47.58112551803583, avgscore: 0, wrong_guesses: {}},
    DM: {referent: 'DM', occ: 0, right: 0, diag: 38.7556447501522, avgdist: 0, alpha: 23.22566336162762, avgscore: 0, wrong_guesses: {}},
    DO: {referent: 'DO', occ: 0, right: 0, diag: 311.9967948553318, avgdist: 0, alpha: 56.78039086631456, avgscore: 0, wrong_guesses: {}},
    EC: {referent: 'EC', occ: 0, right: 0, diag: 744.0981118105327, avgdist: 0, alpha: 176.45960606370554, avgscore: 0, wrong_guesses: {}},
    EG: {referent: 'EG', occ: 0, right: 0, diag: 1415.9449141827517, avgdist: 0, alpha: 213.1033945704463, avgscore: 0, wrong_guesses: {}},
    SV: {referent: 'SV', occ: 0, right: 0, diag: 205.1389772812568, avgdist: 0, alpha: 46.16549479451749, avgscore: 0, wrong_guesses: {}},
    GQ: {referent: 'GQ', occ: 0, right: 0, diag: 236.85860761222085, avgdist: 0, alpha: 50.538787250177776, avgscore: 0, wrong_guesses: {}},
    ER: {referent: 'ER', occ: 0, right: 0, diag: 484.9742261192856, avgdist: 0, alpha: 84.74732471504213, avgscore: 0, wrong_guesses: {}},
    EE: {referent: 'EE', occ: 0, right: 0, diag: 300.7557148251717, avgdist: 0, alpha: 43.71043395836512, avgscore: 0, wrong_guesses: {}},
    ET: {referent: 'ET', occ: 0, right: 0, diag: 1486.1359291801002, avgdist: 0, alpha: 222.7808666323886, avgscore: 0, wrong_guesses: {}},
    FK: {referent: 'GB', occ: 0, right: 0, diag: 156.0320479901485, avgdist: 0, alpha: 39.39495676653159, avgscore: 0, wrong_guesses: {}},
    FO: {referent: 'DK', occ: 0, right: 0, diag: 52.78257288158659, avgdist: 0, alpha: 25.159603269918684, avgscore: 0, wrong_guesses: {}},
    FJ: {referent: 'FJ', occ: 0, right: 0, diag: 191.16485032557634, avgdist: 0, alpha: 44.23883476247862, avgscore: 0, wrong_guesses: {}},
    FI: {referent: 'FI', occ: 0, right: 0, diag: 822.7077245291915, avgdist: 0, alpha: 123.88775064268542, avgscore: 0, wrong_guesses: {}},
    FR: {referent: 'FR', occ: 0, right: 0, diag: 1050.4237240275945, avgdist: 0, alpha: 151.68231721060795, avgscore: 0, wrong_guesses: {}},
    GF: {referent: 'FR', occ: 0, right: 0, diag: 408.7395258596849, avgdist: 0, alpha: 74.23658937461856, avgscore: 0, wrong_guesses: {}},
    PF: {referent: 'FR', occ: 0, right: 0, diag: 91.29074432821763, avgdist: 0, alpha: 30.46885479371177, avgscore: 0, wrong_guesses: {}},
    TF: {referent: 'FR', occ: 0, right: 0, diag: 124.47489706764172, avgdist: 0, alpha: 35.04406589512031, avgscore: 0, wrong_guesses: {}},
    GA: {referent: 'GA', occ: 0, right: 0, diag: 731.6665907365185, avgdist: 0, alpha: 118.75963336406133, avgscore: 0, wrong_guesses: {}},
    GM: {referent: 'GM', occ: 0, right: 0, diag: 146.21217459568817, avgdist: 0, alpha: 38.041057689416235, avgscore: 0, wrong_guesses: {}},
    GE: {referent: 'GE', occ: 0, right: 0, diag: 373.3630940518894, avgdist: 0, alpha: 69.35912136131117, avgscore: 0, wrong_guesses: {}},
    DE: {referent: 'DE', occ: 0, right: 0, diag: 845.1201098068842, avgdist: 0, alpha: 101.1560583838771, avgscore: 0, wrong_guesses: {}},
    GH: {referent: 'GH', occ: 0, right: 0, diag: 690.6996452872985, avgdist: 0, alpha: 109.92069520635856, avgscore: 0, wrong_guesses: {}},
    GI: {referent: 'UK', occ: 0, right: 0, diag: 3.4641016151377544, avgdist: 0, alpha: 18.359899236050648, avgscore: 0, wrong_guesses: {}},
    GR: {referent: 'GR', occ: 0, right: 0, diag: 513.7898403043797, avgdist: 0, alpha: 105.77687733352258, avgscore: 0, wrong_guesses: {}},
    GL: {referent: 'DK', occ: 0, right: 0, diag: 2081.3870375305023, avgdist: 0, alpha: 200.87644835734, avgscore: 0, wrong_guesses: {}},
    GD: {referent: 'GD', occ: 0, right: 0, diag: 26.229754097208, avgdist: 0, alpha: 21.498676554991604, avgscore: 0, wrong_guesses: {}},
    GP: {referent: 'FR', occ: 0, right: 0, diag: 57.06137047074842, avgdist: 0, alpha: 25.749535530185668, avgscore: 0, wrong_guesses: {}},
    GU: {referent: 'US', occ: 0, right: 0, diag: 33.13608305156178, avgdist: 0, alpha: 22.450875429859945, avgscore: 0, wrong_guesses: {}},
    GT: {referent: 'GT', occ: 0, right: 0, diag: 466.666904761844, avgdist: 0, alpha: 66.61979619942836, avgscore: 0, wrong_guesses: {}},
    GG: {referent: 'GB', occ: 0, right: 0, diag: 12.489995996796797, avgdist: 0, alpha: 19.604329747788466, avgscore: 0, wrong_guesses: {}},
    GN: {referent: 'GN', occ: 0, right: 0, diag: 701.2232169573394, avgdist: 0, alpha: 114.56230270528113, avgscore: 0, wrong_guesses: {}},
    GW: {referent: 'GW', occ: 0, right: 0, diag: 268.79360111431225, avgdist: 0, alpha: 54.941772552876024, avgscore: 0, wrong_guesses: {}},
    GY: {referent: 'GY', occ: 0, right: 0, diag: 655.6965761691912, avgdist: 0, alpha: 108.28539113308017, avgscore: 0, wrong_guesses: {}},
    HT: {referent: 'HT', occ: 0, right: 0, diag: 235.58437978779492, avgdist: 0, alpha: 50.363105160783604, avgscore: 0, wrong_guesses: {}},
    HM: {referent: 'AU', occ: 0, right: 0, diag: 28.705400188814647, avgdist: 0, alpha: 21.84000223446333, avgscore: 0, wrong_guesses: {}},
    VA: {referent: 'VA', occ: 0, right: 0, diag: 0.938083151964686, avgdist: 0, alpha: 18.011628547754842, avgscore: 0, wrong_guesses: {}},
    HN: {referent: 'HN', occ: 0, right: 0, diag: 474.3247832445612, avgdist: 0, alpha: 83.27905009471802, avgscore: 0, wrong_guesses: {}},
    HK: {referent: 'CN', occ: 0, right: 0, diag: 46.98936049788292, avgdist: 0, alpha: 24.360873532297592, avgscore: 0, wrong_guesses: {}},
    HU: {referent: 'HU', occ: 0, right: 0, diag: 431.34209161638745, avgdist: 0, alpha: 59.582088688244326, avgscore: 0, wrong_guesses: {}},
    IS: {referent: 'IS', occ: 0, right: 0, diag: 453.8722287164087, avgdist: 0, alpha: 56.83853033920002, avgscore: 0, wrong_guesses: {}},
    IN: {referent: 'IN', occ: 0, right: 0, diag: 2564.2113797423176, avgdist: 0, alpha: 371.4187664244891, avgscore: 0, wrong_guesses: {}},
    ID: {referent: 'ID', occ: 0, right: 0, diag: 1951.7013091146914, avgdist: 0, alpha: 348.24172495205454, avgscore: 0, wrong_guesses: {}},
    IR: {referent: 'IR', occ: 0, right: 0, diag: 1815.5963207717732, avgdist: 0, alpha: 268.2046824194295, avgscore: 0, wrong_guesses: {}},
    IQ: {referent: 'IQ', occ: 0, right: 0, diag: 936.2873490547654, avgdist: 0, alpha: 146.9713877031756, avgscore: 0, wrong_guesses: {}},
    IE: {referent: 'IE', occ: 0, right: 0, diag: 374.8946518690284, avgdist: 0, alpha: 69.57028240503124, avgscore: 0, wrong_guesses: {}},
    IM: {referent: 'GB', occ: 0, right: 0, diag: 33.823069050575526, avgdist: 0, alpha: 22.54559250743251, avgscore: 0, wrong_guesses: {}},
    IL: {referent: 'IL', occ: 0, right: 0, diag: 203.81364036786155, avgdist: 0, alpha: 42.81847201865375, avgscore: 0, wrong_guesses: {}},
    IT: {referent: 'IT', occ: 0, right: 0, diag: 776.3195218465139, avgdist: 0, alpha: 161.12895676195018, avgscore: 0, wrong_guesses: {}},
    JM: {referent: 'JM', occ: 0, right: 0, diag: 148.26327933780502, avgdist: 0, alpha: 38.32385042063267, avgscore: 0, wrong_guesses: {}},
    JP: {referent: 'JP', occ: 0, right: 0, diag: 869.4020933952253, avgdist: 0, alpha: 212.824360424015, avgscore: 0, wrong_guesses: {}},
    JE: {referent: 'GB', occ: 0, right: 0, diag: 15.231546211727817, avgdist: 0, alpha: 19.982316525902576, avgscore: 0, wrong_guesses: {}},
    JO: {referent: 'JO', occ: 0, right: 0, diag: 422.71030268967894, avgdist: 0, alpha: 70.89211961461133, avgscore: 0, wrong_guesses: {}},
    KZ: {referent: 'KZ', occ: 0, right: 0, diag: 2334.480670299071, avgdist: 0, alpha: 339.7450184028771, avgscore: 0, wrong_guesses: {}},
    KE: {referent: 'KE', occ: 0, right: 0, diag: 1077.3736584862284, avgdist: 0, alpha: 146.3362641686688, avgscore: 0, wrong_guesses: {}},
    KI: {referent: 'KI', occ: 0, right: 0, diag: 40.27406113120453, avgdist: 0, alpha: 23.435012551215273, avgscore: 0, wrong_guesses: {}},
    KR: {referent: 'KR', occ: 0, right: 0, diag: 447.6829235072519, avgdist: 0, alpha: 65.55828785694067, avgscore: 0, wrong_guesses: {}},
    KW: {referent: 'KW', occ: 0, right: 0, diag: 188.7749983445901, avgdist: 0, alpha: 43.90933780650718, avgscore: 0, wrong_guesses: {}},
    KG: {referent: 'KG', occ: 0, right: 0, diag: 632.3780514850274, avgdist: 0, alpha: 121.69263454224145, avgscore: 0, wrong_guesses: {}},
    LA: {referent: 'LA', occ: 0, right: 0, diag: 688.1860213634102, avgdist: 0, alpha: 143.57699299871368, avgscore: 0, wrong_guesses: {}},
    LV: {referent: 'LV', occ: 0, right: 0, diag: 359.32993195669076, avgdist: 0, alpha: 50.97009828511159, avgscore: 0, wrong_guesses: {}},
    LB: {referent: 'LB', occ: 0, right: 0, diag: 144.58215657542254, avgdist: 0, alpha: 37.81632160528668, avgscore: 0, wrong_guesses: {}},
    LS: {referent: 'LS', occ: 0, right: 0, diag: 246.39399343328157, avgdist: 0, alpha: 34.56557529652339, avgscore: 0, wrong_guesses: {}},
    LR: {referent: 'LR', occ: 0, right: 0, diag: 471.9512686708237, avgdist: 0, alpha: 82.95180563220632, avgscore: 0, wrong_guesses: {}},
    LY: {referent: 'LY', occ: 0, right: 0, diag: 1875.9211070831311, avgdist: 0, alpha: 276.52186424381057, avgscore: 0, wrong_guesses: {}},
    LI: {referent: 'LI', occ: 0, right: 0, diag: 17.88854381999832, avgdist: 0, alpha: 20.34864575085618, avgscore: 0, wrong_guesses: {}},
    LT: {referent: 'LT', occ: 0, right: 0, diag: 361.386219991853, avgdist: 0, alpha: 46.406637166782296, avgscore: 0, wrong_guesses: {}},
    LU: {referent: 'LU', occ: 0, right: 0, diag: 71.91661838546081, avgdist: 0, alpha: 27.797678681745545, avgscore: 0, wrong_guesses: {}},
    MO: {referent: 'CN', occ: 0, right: 0, diag: 7.745966692414834, avgdist: 0, alpha: 18.950254421253778, avgscore: 0, wrong_guesses: {}},
    MK: {referent: 'MK', occ: 0, right: 0, diag: 226.77301426757109, avgdist: 0, alpha: 30.07702057954948, avgscore: 0, wrong_guesses: {}},
    MG: {referent: 'MG', occ: 0, right: 0, diag: 1083.5506448708338, avgdist: 0, alpha: 202.3942422420552, avgscore: 0, wrong_guesses: {}},
    MW: {referent: 'MW', occ: 0, right: 0, diag: 486.7935907548496, avgdist: 0, alpha: 84.99816665587774, avgscore: 0, wrong_guesses: {}},
    MY: {referent: 'MY', occ: 0, right: 0, diag: 813.3916645749451, avgdist: 0, alpha: 222.18464770088195, avgscore: 0, wrong_guesses: {}},
    MV: {referent: 'MV', occ: 0, right: 0, diag: 24.49489742783178, avgdist: 0, alpha: 21.25948601258391, avgscore: 0, wrong_guesses: {}},
    ML: {referent: 'ML', occ: 0, right: 0, diag: 1574.9234902051592, avgdist: 0, alpha: 235.02230723985758, avgscore: 0, wrong_guesses: {}},
    MT: {referent: 'MT', occ: 0, right: 0, diag: 25.13961017995307, avgdist: 0, alpha: 21.348374734977615, avgscore: 0, wrong_guesses: {}},
    MH: {referent: 'MH', occ: 0, right: 0, diag: 19.026297590440446, avgdist: 0, alpha: 20.50551170196458, avgscore: 0, wrong_guesses: {}},
    MQ: {referent: 'FR', occ: 0, right: 0, diag: 47.49736834815167, avgdist: 0, alpha: 24.430914288630987, avgscore: 0, wrong_guesses: {}},
    MR: {referent: 'MR', occ: 0, right: 0, diag: 1435.7576397150042, avgdist: 0, alpha: 215.8350418876499, avgscore: 0, wrong_guesses: {}},
    MU: {referent: 'MU', occ: 0, right: 0, diag: 63.874877690685246, avgdist: 0, alpha: 26.68893675934971, avgscore: 0, wrong_guesses: {}},
    YT: {referent: 'FR', occ: 0, right: 0, diag: 27.349588662354687, avgdist: 0, alpha: 21.653071924806586, avgscore: 0, wrong_guesses: {}},
    MX: {referent: 'MX', occ: 0, right: 0, diag: 1982.1074642914798, avgdist: 0, alpha: 367.3607466315442, avgscore: 0, wrong_guesses: {}},
    FM: {referent: 'FM', occ: 0, right: 0, diag: 37.469987990390386, avgdist: 0, alpha: 23.048405526357506, avgscore: 0, wrong_guesses: {}},
    MD: {referent: 'MD', occ: 0, right: 0, diag: 260.1768629221284, avgdist: 0, alpha: 53.75375378547282, avgscore: 0, wrong_guesses: {}},
    MC: {referent: 'MC', occ: 0, right: 0, diag: 2.009975124224178, avgdist: 0, alpha: 18.15941391053031, avgscore: 0, wrong_guesses: {}},
    MN: {referent: 'MN', occ: 0, right: 0, diag: 1768.67747201122, avgdist: 0, alpha: 230.1442050070954, avgscore: 0, wrong_guesses: {}},
    ME: {referent: 'ME', occ: 0, right: 0, diag: 166.20469307453385, avgdist: 0, alpha: 28.331453632251147, avgscore: 0, wrong_guesses: {}},
    MS: {referent: 'GB', occ: 0, right: 0, diag: 14.2828568570857, avgdist: 0, alpha: 19.85151752370325, avgscore: 0, wrong_guesses: {}},
    MA: {referent: 'MA', occ: 0, right: 0, diag: 945.0396817065408, avgdist: 0, alpha: 148.17810133621796, avgscore: 0, wrong_guesses: {}},
    MZ: {referent: 'MZ', occ: 0, right: 0, diag: 1266.1674454826266, avgdist: 0, alpha: 192.45306961206452, avgscore: 0, wrong_guesses: {}},
    MM: {referent: 'MM', occ: 0, right: 0, diag: 1163.2523371994573, avgdist: 0, alpha: 178.26381639782107, avgscore: 0, wrong_guesses: {}},
    NA: {referent: 'NA', occ: 0, right: 0, diag: 1285.0019455238191, avgdist: 0, alpha: 195.049845680286, avgscore: 0, wrong_guesses: {}},
    NR: {referent: 'NR', occ: 0, right: 0, diag: 6.48074069840786, avgdist: 0, alpha: 18.77581344459162, avgscore: 0, wrong_guesses: {}},
    NP: {referent: 'NP', occ: 0, right: 0, diag: 542.5513800553824, avgdist: 0, alpha: 92.68568119334317, avgscore: 0, wrong_guesses: {}},
    NL: {referent: 'NL', occ: 0, right: 0, diag: 289.30952282978865, avgdist: 0, alpha: 57.77037190044235, avgscore: 0, wrong_guesses: {}},
    NC: {referent: 'FR', occ: 0, right: 0, diag: 192.74335267396384, avgdist: 0, alpha: 44.45646820711263, avgscore: 0, wrong_guesses: {}},
    NZ: {referent: 'NZ', occ: 0, right: 0, diag: 735.4821547801143, avgdist: 0, alpha: 165.76579835292438, avgscore: 0, wrong_guesses: {}},
    NI: {referent: 'NI', occ: 0, right: 0, diag: 510.63294057473416, avgdist: 0, alpha: 88.2849782494345, avgscore: 0, wrong_guesses: {}},
    NE: {referent: 'NE', occ: 0, right: 0, diag: 1591.8542646863123, avgdist: 0, alpha: 237.35661024195255, avgscore: 0, wrong_guesses: {}},
    NG: {referent: 'NG', occ: 0, right: 0, diag: 1359.2409646563776, avgdist: 0, alpha: 184.09473252281128, avgscore: 0, wrong_guesses: {}},
    NU: {referent: 'NZ', occ: 0, right: 0, diag: 22.80350850198276, avgdist: 0, alpha: 21.02628851463633, avgscore: 0, wrong_guesses: {}},
    NF: {referent: 'AU', occ: 0, right: 0, diag: 8.48528137423857, avgdist: 0, alpha: 19.052186230882164, avgscore: 0, wrong_guesses: {}},
    MP: {referent: 'US', occ: 0, right: 0, diag: 30.463092423455635, avgdist: 0, alpha: 22.082341193301204, avgscore: 0, wrong_guesses: {}},
    NO: {referent: 'NO', occ: 0, right: 0, diag: 804.738466832548, avgdist: 0, alpha: 189.7558067445318, avgscore: 0, wrong_guesses: {}},
    OM: {referent: 'OM', occ: 0, right: 0, diag: 786.7655305108377, avgdist: 0, alpha: 126.35631009439152, avgscore: 0, wrong_guesses: {}},
    PK: {referent: 'PK', occ: 0, right: 0, diag: 1328.0903583717488, avgdist: 0, alpha: 200.99059053979585, avgscore: 0, wrong_guesses: {}},
    PW: {referent: 'PW', occ: 0, right: 0, diag: 30.298514815086232, avgdist: 0, alpha: 22.059650323150997, avgscore: 0, wrong_guesses: {}},
    PS: {referent: 'IL', occ: 0, right: 0, diag: 111.53474794878949, avgdist: 0, alpha: 33.259963876082836, avgscore: 0, wrong_guesses: {}},
    PA: {referent: 'PA', occ: 0, right: 0, diag: 388.37353153890393, avgdist: 0, alpha: 69.64419635716979, avgscore: 0, wrong_guesses: {}},
    PG: {referent: 'PG', occ: 0, right: 0, diag: 962.1226533036212, avgdist: 0, alpha: 150.53338826819842, avgscore: 0, wrong_guesses: {}},
    PY: {referent: 'PY', occ: 0, right: 0, diag: 901.9445659240927, avgdist: 0, alpha: 142.2364323205104, avgscore: 0, wrong_guesses: {}},
    PE: {referent: 'PE', occ: 0, right: 0, diag: 1603.256685624607, avgdist: 0, alpha: 212.25094932780146, avgscore: 0, wrong_guesses: {}},
    PH: {referent: 'PH', occ: 0, right: 0, diag: 827.4696369051858, avgdist: 0, alpha: 173.4537925435466, avgscore: 0, wrong_guesses: {}},
    PN: {referent: 'GB', occ: 0, right: 0, diag: 9.695359714832659, avgdist: 0, alpha: 19.219023814500282, avgscore: 0, wrong_guesses: {}},
    PL: {referent: 'PL', occ: 0, right: 0, diag: 790.7958017086332, avgdist: 0, alpha: 93.6377393081947, avgscore: 0, wrong_guesses: {}},
    PT: {referent: 'PT', occ: 0, right: 0, diag: 429.1619740843776, avgdist: 0, alpha: 104.32658196010533, avgscore: 0, wrong_guesses: {}},
    PR: {referent: 'US', occ: 0, right: 0, diag: 133.19159132617943, avgdist: 0, alpha: 34.953005904661474, avgscore: 0, wrong_guesses: {}},
    QA: {referent: 'QA', occ: 0, right: 0, diag: 152.22351986470423, avgdist: 0, alpha: 26.61177089955384, avgscore: 0, wrong_guesses: {}},
    RE: {referent: 'FR', occ: 0, right: 0, diag: 70.8660708661063, avgdist: 0, alpha: 27.6528361507082, avgscore: 0, wrong_guesses: {}},
    RO: {referent: 'RO', occ: 0, right: 0, diag: 690.4940260422244, avgdist: 0, alpha: 87.61241886754098, avgscore: 0, wrong_guesses: {}},
    RU: {referent: 'RU', occ: 0, right: 0, diag: 5847.775987501574, avgdist: 0, alpha: 714.131946328906, avgscore: 0, wrong_guesses: {}},
    RW: {referent: 'RW', occ: 0, right: 0, diag: 229.5125268912353, avgdist: 0, alpha: 47.34913940834831, avgscore: 0, wrong_guesses: {}},
    BL: {referent: 'FR', occ: 0, right: 0, diag: 6.48074069840786, avgdist: 0, alpha: 18.77581344459162, avgscore: 0, wrong_guesses: {}},
    SH: {referent: 'GB', occ: 0, right: 0, diag: 28.071337695236398, avgdist: 0, alpha: 21.752581899148893, avgscore: 0, wrong_guesses: {}},
    KN: {referent: 'KN', occ: 0, right: 0, diag: 22.847319317591726, avgdist: 0, alpha: 21.03232885960189, avgscore: 0, wrong_guesses: {}},
    LC: {referent: 'LC', occ: 0, right: 0, diag: 35.09985754956849, avgdist: 0, alpha: 22.721627645668942, avgscore: 0, wrong_guesses: {}},
    MF: {referent: 'FR', occ: 0, right: 0, diag: 10.295630140987, avgdist: 0, alpha: 19.30178512346466, avgscore: 0, wrong_guesses: {}},
    PM: {referent: 'FR', occ: 0, right: 0, diag: 22.0, avgdist: 0, alpha: 20.915506086432877, avgscore: 0, wrong_guesses: {}},
    VC: {referent: 'VC', occ: 0, right: 0, diag: 27.892651361962706, avgdist: 0, alpha: 21.727945811493335, avgscore: 0, wrong_guesses: {}},
    WS: {referent: 'WS', occ: 0, right: 0, diag: 75.39230729988306, avgdist: 0, alpha: 28.276883639340106, avgscore: 0, wrong_guesses: {}},
    SM: {referent: 'SM', occ: 0, right: 0, diag: 11.045361017187261, avgdist: 0, alpha: 19.405153048955945, avgscore: 0, wrong_guesses: {}},
    ST: {referent: 'ST', occ: 0, right: 0, diag: 43.9089968002003, avgdist: 0, alpha: 23.936173396160925, avgscore: 0, wrong_guesses: {}},
    SA: {referent: 'SA', occ: 0, right: 0, diag: 2073.4946346687275, avgdist: 0, alpha: 303.76199310448055, avgscore: 0, wrong_guesses: {}},
    SN: {referent: 'SN', occ: 0, right: 0, diag: 627.2511458738039, avgdist: 0, alpha: 73.10745326166858, avgscore: 0, wrong_guesses: {}},
    RS: {referent: 'RS', occ: 0, right: 0, diag: 420.3831585589508, avgdist: 0, alpha: 51.7064056273538, avgscore: 0, wrong_guesses: {}},
    SC: {referent: 'SC', occ: 0, right: 0, diag: 30.066592756745816, avgdist: 0, alpha: 22.027674446463326, avgscore: 0, wrong_guesses: {}},
    SL: {referent: 'SL', occ: 0, right: 0, diag: 378.78753939378737, avgdist: 0, alpha: 70.10700794265969, avgscore: 0, wrong_guesses: {}},
    SG: {referent: 'SG', occ: 0, right: 0, diag: 37.68288736283355, avgdist: 0, alpha: 23.07775868115804, avgscore: 0, wrong_guesses: {}},
    SX: {referent: 'NL', occ: 0, right: 0, diag: 8.246211251235321, avgdist: 0, alpha: 19.019224826401885, avgscore: 0, wrong_guesses: {}},
    SK: {referent: 'SK', occ: 0, right: 0, diag: 313.16768671112925, avgdist: 0, alpha: 45.22964025118811, avgscore: 0, wrong_guesses: {}},
    SI: {referent: 'SI', occ: 0, right: 0, diag: 201.36037346012247, avgdist: 0, alpha: 27.89763900562601, avgscore: 0, wrong_guesses: {}},
    SB: {referent: 'SB', occ: 0, right: 0, diag: 240.39966722106752, avgdist: 0, alpha: 51.027005085973144, avgscore: 0, wrong_guesses: {}},
    SO: {referent: 'SO', occ: 0, right: 0, diag: 1129.2980120411087, avgdist: 0, alpha: 173.58241902645614, avgscore: 0, wrong_guesses: {}},
    ZA: {referent: 'ZA', occ: 0, right: 0, diag: 1562.7136653910723, avgdist: 0, alpha: 211.7170385175186, avgscore: 0, wrong_guesses: {}},
    GS: {referent: 'GB', occ: 0, right: 0, diag: 88.35157044444654, avgdist: 0, alpha: 30.06362097359306, avgscore: 0, wrong_guesses: {}},
    ES: {referent: 'ES', occ: 0, right: 0, diag: 1005.9741547375856, avgdist: 0, alpha: 179.63389384946177, avgscore: 0, wrong_guesses: {}},
    LK: {referent: 'LK', occ: 0, right: 0, diag: 362.2430123549659, avgdist: 0, alpha: 70.56614661578718, avgscore: 0, wrong_guesses: {}},
    SD: {referent: 'SD', occ: 0, right: 0, diag: 1942.1987539899205, avgdist: 0, alpha: 285.6597870434162, avgscore: 0, wrong_guesses: {}},
    SR: {referent: 'SR', occ: 0, right: 0, diag: 572.3984626114924, avgdist: 0, alpha: 96.80079916931417, avgscore: 0, wrong_guesses: {}},
    SJ: {referent: 'NO', occ: 0, right: 0, diag: 349.413794805, avgdist: 0, alpha: 66.05715066928423, avgscore: 0, wrong_guesses: {}},
    SZ: {referent: 'SZ', occ: 0, right: 0, diag: 186.35450088473848, avgdist: 0, alpha: 30.704782861375946, avgscore: 0, wrong_guesses: {}},
    SE: {referent: 'SE', occ: 0, right: 0, diag: 948.9942044080143, avgdist: 0, alpha: 143.33914546925385, avgscore: 0, wrong_guesses: {}},
    CH: {referent: 'CH', occ: 0, right: 0, diag: 287.34648075102643, avgdist: 0, alpha: 39.74273384806, avgscore: 0, wrong_guesses: {}},
    SY: {referent: 'SY', occ: 0, right: 0, diag: 608.5720992618706, avgdist: 0, alpha: 101.78818050403503, avgscore: 0, wrong_guesses: {}},
    TW: {referent: 'TW', occ: 0, right: 0, diag: 269.04646438858845, avgdist: 0, alpha: 46.64074741475143, avgscore: 0, wrong_guesses: {}},
    TJ: {referent: 'TJ', occ: 0, right: 0, diag: 534.9766350038102, avgdist: 0, alpha: 91.64132553591757, avgscore: 0, wrong_guesses: {}},
    TZ: {referent: 'TZ', occ: 0, right: 0, diag: 1374.8359902184698, avgdist: 0, alpha: 207.4355685221141, avgscore: 0, wrong_guesses: {}},
    TH: {referent: 'TH', occ: 0, right: 0, diag: 1013.0350438163529, avgdist: 0, alpha: 182.84593457002995, avgscore: 0, wrong_guesses: {}},
    TL: {referent: 'TL', occ: 0, right: 0, diag: 172.4760852988031, avgdist: 0, alpha: 41.66215167240456, avgscore: 0, wrong_guesses: {}},
    TG: {referent: 'TG', occ: 0, right: 0, diag: 337.0014836762592, avgdist: 0, alpha: 64.34582345486709, avgscore: 0, wrong_guesses: {}},
    TK: {referent: 'NZ', occ: 0, right: 0, diag: 4.898979485566356, avgdist: 0, alpha: 18.55773068931994, avgscore: 0, wrong_guesses: {}},
    TO: {referent: 'TO', occ: 0, right: 0, diag: 38.65229618017538, avgdist: 0, alpha: 23.211414345587176, avgscore: 0, wrong_guesses: {}},
    TT: {referent: 'TT', occ: 0, right: 0, diag: 101.2916580968048, avgdist: 0, alpha: 31.84771451803763, avgscore: 0, wrong_guesses: {}},
    TN: {referent: 'TN', occ: 0, right: 0, diag: 572.0314676658969, avgdist: 0, alpha: 128.11079046380638, avgscore: 0, wrong_guesses: {}},
    TR: {referent: 'TR', occ: 0, right: 0, diag: 1251.8482336130046, avgdist: 0, alpha: 172.31151042579748, avgscore: 0, wrong_guesses: {}},
    TM: {referent: 'TM', occ: 0, right: 0, diag: 988.0283396745257, avgdist: 0, alpha: 154.10509265385716, avgscore: 0, wrong_guesses: {}},
    TC: {referent: 'GB', occ: 0, right: 0, diag: 43.54308211415448, avgdist: 0, alpha: 23.88572350380082, avgscore: 0, wrong_guesses: {}},
    TV: {referent: 'TV', occ: 0, right: 0, diag: 7.211102550927978, avgdist: 0, alpha: 18.8765108974371, avgscore: 0, wrong_guesses: {}},
    UG: {referent: 'UG', occ: 0, right: 0, diag: 695.0539547402058, avgdist: 0, alpha: 93.43761686271378, avgscore: 0, wrong_guesses: {}},
    UA: {referent: 'UA', occ: 0, right: 0, diag: 1098.6355173577815, avgdist: 0, alpha: 131.27558206096515, avgscore: 0, wrong_guesses: {}},
    AE: {referent: 'AE', occ: 0, right: 0, diag: 408.90096600521747, avgdist: 0, alpha: 74.25884767218167, avgscore: 0, wrong_guesses: {}},
    GB: {referent: 'GB', occ: 0, right: 0, diag: 696.993543729065, avgdist: 0, alpha: 52.34154686594558, avgscore: 0, wrong_guesses: {}},
    US: {referent: 'US', occ: 0, right: 0, diag: 4329.57503688295, avgdist: 0, alpha: 833.0938531816965, avgscore: 0, wrong_guesses: {}},
    UM: {referent: 'US', occ: 0, right: 0, diag: 8.270429251254134, avgdist: 0, alpha: 19.02256384377593, avgscore: 0, wrong_guesses: {}},
    UY: {referent: 'UY', occ: 0, right: 0, diag: 601.7208655182235, avgdist: 0, alpha: 68.601955692236, avgscore: 0, wrong_guesses: {}},
    UZ: {referent: 'UZ', occ: 0, right: 0, diag: 945.9386872308373, avgdist: 0, alpha: 148.30205026109445, avgscore: 0, wrong_guesses: {}},
    VU: {referent: 'VU', occ: 0, right: 0, diag: 156.13455735358525, avgdist: 0, alpha: 39.409090078334884, avgscore: 0, wrong_guesses: {}},
    VE: {referent: 'VE', occ: 0, right: 0, diag: 1353.8426791913453, avgdist: 0, alpha: 204.54114989944085, avgscore: 0, wrong_guesses: {}},
    VN: {referent: 'VN', occ: 0, right: 0, diag: 813.8943420370975, avgdist: 0, alpha: 130.09665087203942, avgscore: 0, wrong_guesses: {}},
    VG: {referent: 'GB', occ: 0, right: 0, diag: 17.378147196982766, avgdist: 0, alpha: 20.278275646364467, avgscore: 0, wrong_guesses: {}},
    VI: {referent: 'US', occ: 0, right: 0, diag: 26.343879744638983, avgdist: 0, alpha: 21.51441144306248, avgscore: 0, wrong_guesses: {}},
    WF: {referent: 'FR', occ: 0, right: 0, diag: 16.852299546352718, avgdist: 0, alpha: 20.205775256563825, avgscore: 0, wrong_guesses: {}},
    EH: {referent: 'MA', occ: 0, right: 0, diag: 729.3833011524188, avgdist: 0, alpha: 118.44482852528982, avgscore: 0, wrong_guesses: {}},
    YE: {referent: 'YE', occ: 0, right: 0, diag: 1027.5874658636121, avgdist: 0, alpha: 159.55924285391046, avgscore: 0, wrong_guesses: {}},
    ZM: {referent: 'ZM', occ: 0, right: 0, diag: 1226.8757068260827, avgdist: 0, alpha: 187.0357850332875, avgscore: 0, wrong_guesses: {}},
    ZW: {referent: 'ZW', occ: 0, right: 0, diag: 884.0328048211786, avgdist: 0, alpha: 139.76687738302752, avgscore: 0, wrong_guesses: {}}
};

const estimate_score = (d, a) => 5000*Math.exp(-d/a);

const ERROR_RESP = -1000000;
let state = JSON.parse(localStorage.getItem("CountryData")) || DefaultCountryDict;

let userNick = null;
let userHexId = null;
let apiUrl = null;
let solo = null;
let ranked = null;
let mode = null;
let teams = null;
let updateUI = true;

function checkGameMode() {
    if (location.pathname.includes("/game/")) {
        solo = true;
        ranked = false;
        teams = false;
        const gameTag = location.href.substring(location.href.lastIndexOf('/') + 1);
        apiUrl = "https://www.geoguessr.com/api/v3/games/"+gameTag;
        return true;
    }
    if (location.pathname.includes("/duels/")) {
        return false; // Not possible to query the game server api from a duel game
        solo = false;
        const gameTag = location.href.substring(location.href.lastIndexOf('/') + 1);
        apiUrl = "https://game-server.geoguessr.com/api/duels/"+gameTag;
        return true;
    }
    return false;
};

if (updateUI) {
    var style = document.createElement("style");
    document.head.appendChild(style);
    style.sheet.insertRule("div[class*='round-result_wrapper__'] { transform: translateX(0); justify-content: space-between }")
    style.sheet.insertRule("div[class*='round-result_distanceIndicatorWrapper__'] { animation-delay: 0s, 0s; animation-duration: 0s, 0s; margin-right: 28px  }")
    style.sheet.insertRule("div[class*='round-result_actions__'] { animation-delay: 0s; animation-duration: 0s; margin: 0px; margin-top: 10px; margin-bottom: 10px }")
    style.sheet.insertRule("div[class*='round-result_pointsIndicatorWrapper__'] { animation-delay: 0s, 0s; animation-duration: 0s, 0s; margin-right: 28px }")
}

function parseScore(number) {
    const numberString = parseInt(number).toString();
    if (number >= 1000) {
        const firstDigit = numberString[0];
        const restOfDigits = numberString.slice(1);
        return firstDigit + ',' + restOfDigits;
    } else {
        return numberString;
    }
};

const shadowStyle = `
    text-shadow:
        0 .25rem 0 #006400,
        .125rem .125rem .5rem #32CD32,
        0 -.25rem .5rem #7CFC00,
        -.25rem .5rem .5rem #20B2AA,
        0 .375rem 2rem #32CD32,
        0 0 0 #20B2AA,
        0 0 1.5rem rgba(102, 255, 102, .65),
        .25rem .25rem 1rem #66CDAA;
`;

const newFormat = (score) => `
    <div class="${cn("shadow-text_root__")} ${cn("shadow-text_sizeSmallMedium__")}" style="${shadowStyle}"">
      ${parseScore(score)}&nbsp;
    </div>
    <p class="${cn("round-result_label__")} ${cn("round-result_indicatorLabel__")}"> Country-wise </p>
`

function addCountryResult(score) {
    if (document.getElementById("results-row") == null && !!document.querySelector('div[class*="round-result_distanceIndicatorWrapper__"]')) {
        const resultsContainer = document.querySelector("div[class*='round-result_wrapper__']");
        const topRow = document.createElement("div");
        topRow.id = "results-row";
        topRow.style = "display: flex;flex-direction: row";
        const distanceIndicator = document.querySelector("div[class*='round-result_distanceIndicatorWrapper__']");
        distanceIndicator.parentNode.removeChild(distanceIndicator);
        distanceIndicator.style.marginRight = '3vw';
        const pointsIndicator = document.querySelector("div[class*='round-result_pointsIndicatorWrapper__']");
        pointsIndicator.parentNode.removeChild(pointsIndicator);
        pointsIndicator.style.marginRight = '3vw';
        const newDiv = document.createElement("div");
        newDiv.id = "country-wise";
        newDiv.className = cn("round-result_pointsIndicatorWrapper__");
        newDiv.innerHTML = newFormat(score);
        newDiv.style.marginRight = '3vw';
        topRow.appendChild(distanceIndicator);
        topRow.appendChild(pointsIndicator);
        topRow.appendChild(newDiv);
        resultsContainer.insertBefore(topRow, resultsContainer.firstChild);
        if (document.querySelector("span[class*='button_label__']").textContent == 'Next') {
            document.querySelector("span[class*='button_label__']").textContent += ' >';
        }
        const nextButton = document.querySelector("div[class*='round-result_actions__']");
        nextButton.style.transform = 'translateX(-2vw)';
        const clone = nextButton.cloneNode(true);
        clone.style.opacity = '0';
        resultsContainer.insertBefore(clone, resultsContainer.firstChild);
    };
};

function updateState(guess, ans, dist) {
    if ((guess === ERROR_RESP) || (ans === ERROR_RESP)) {
        return;
    }
    let good = (guess == ans);
    //state[ans].occ += 1;
    let score = estimate_score(dist, state[ans].alpha);
    if (updateUI) addCountryResult(score);
    const data = {
        username: userNick,
        player_hexid: userHexId,
        actualCountryCode: ans,
        guessedCountryCode: guess,
        mode: mode,
        score: score.toFixed(1),
        distance: dist,
    };
    fetch(statsServerUrl+'/guess', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(data)
    }).then(response => response.json()).then(data => console.log('Success:', data)).catch((error) => console.error('Error:', error));
    /*if (good) {
        state[ans].avgdist = (state[ans].avgdist*state[ans].right + dist)/(state[ans].right+1);
        console.log(score);
        state[ans].avgscore = (state[ans].avgscore*state[ans].right + score)/(state[ans].right+1);
        state[ans].right += 1;
    } else {
        if (!(guess in state[ans].wrong_guesses)) {
            state[ans].wrong_guesses[guess] = 0;
        }
        state[ans].wrong_guesses[guess] += 1;
    }
    console.log(state[ans]);
    localStorage.setItem("CountryData", JSON.stringify(state));*/
};

async function getCountryCode(coords) {
    if (coords[0] <= -85.05) return 'AQ';
    if (API_Key.toLowerCase().match("^(bdc_)?[a-f0-9]{32}$") != null) {
        const api = "https://api.bigdatacloud.net/data/reverse-geocode?latitude="+coords.lat+"&longitude="+coords.lng+"&localityLanguage=en&key="+API_Key;
        return await fetch(api)
            .then(res => (res.status !== 200) ? ERROR_RESP : res.json())
            .then(out => (out === ERROR_RESP) ? ERROR_RESP : out.countryCode);
    } else {
        const api = `https://nominatim.openstreetmap.org/reverse.php?lat=${coords.lat}&lon=${coords.lng}&zoom=21&format=jsonv2&accept-language=en`;
        return await fetch(api)
            .then(res => (res.status !== 200) ? ERROR_RESP : res.json())
            .then(out => (out === ERROR_RESP) ? ERROR_RESP : state[out?.address?.country_code?.toUpperCase()].referent);
    }
};

function deductMode(m, p, z) {
    if (m && p && z) {
        mode = 'move';
    } else if (!m && p && z) {
        mode = 'nm';
    } else if (!m && !p && !z) {
        mode = 'nmpz';
    } else {
        console.error("game mode not supported");
    }
}

function getUserInfo() {
    fetch('https://www.geoguessr.com/api/v3/profiles')
    .then(res => res.json())
    .then((out) => {
        userHexId = out.user.id;
        userNick = out.user.nick;
    }).catch(err => { throw err });
}

function checkModesSolo(out) {
    const m = !out.forbidMoving;
    const p = !out.forbidRotating;
    const z = !out.forbidZooming;
    deductMode(m, p, z);
}

function checkModesDuel(out) {
    const m = !out.movementOptions.forbidMoving;
    const p = !out.movementOptions.forbidRotating;
    const z = !out.movementOptions.forbidZooming;
    deductMode(m, p, z);
    teams = out.options.isTeamDuels;
    ranked = out.options.isRated;
}

function checkModes() {
    getUserInfo();
    fetch(apiUrl)
    .then(res => res.json())
    .then((out) => {
        if (solo) {
            checkModesSolo(out);
        } else {
            checkModesDuel(out);
        }
        console.log(solo);
        console.log(ranked);
        console.log(mode);
        console.log(teams);
        console.log(apiUrl);
        console.log(userHexId);
    }).catch(err => { throw err });
}

function getSoloData(out) {
    const guessCounter = out.player.guesses.length;
    const round = out.rounds[guessCounter-1];
    const guess = out.player.guesses[guessCounter-1];
    let dist = parseFloat(guess.distance.meters.amount);
    const unit = guess.distance.meters.unit;
    if (unit === 'm') {
        dist = dist/1000;
    }
    if (guess.lat == lastGuess.lat && guess.lng == lastGuess.lng) return;
    lastGuess = guess;
    const roundCountryCode = round.streakLocationCode.toUpperCase();
    getCountryCode(guess).then(guessCountryCode => {
        console.log(guessCountryCode);
        console.log(roundCountryCode);
        if (guessCountryCode == ERROR_RESP || roundCountryCode == ERROR_RESP) {
            updateState(ERROR_RESP, ERROR_RESP, false, dist);
        } else {
            updateState(guessCountryCode, roundCountryCode, dist);
        }
    });
}

function getDuelData(out) {
    const roundIdx = out.teams[0].roundResults.length - 1;
    const round = out.rounds[roundIdx].panorama;
    let guess = null;
    out.teams.forEach(team => {
        team.players.forEach(player => {
            if (player.playerId == userHexId) {
                guess = player.guesses[roundIdx];
            }
        });
    });
    let dist = parseFloat(guess.distance)/1000;
    const roundCountryCode = round.countryCode.toUpperCase();
    getCountryCode(guess).then(guessCountryCode => {
        console.log(guessCountryCode);
        console.log(roundCountryCode);
        if (guessCountryCode == ERROR_RESP || roundCountryCode == ERROR_RESP) {
            updateState(ERROR_RESP, ERROR_RESP, false, dist);
        } else {
            updateState(guessCountryCode, roundCountryCode, dist);
        }
    });
}

let lastGuess = { lat: 91, lng: 0 };
function run() {
    fetch(apiUrl)
    .then(res => res.json())
    .then((out) => {
        if (solo) {
            getSoloData(out);
        } else {
            getDuelData(out);
        }
    }).catch(err => { throw err });
};

let lastDoCheckCall = 0;
// Any changes in the DOM triggers the MutationObserver callback
new MutationObserver(async (mutations) => {
    // First make sure we are in a game
    if (!checkGameMode()) {
        sessionStorage.setItem("modesChecked", 0);
        return;
    }
    if (lastDoCheckCall >= (Date.now() - 50)) return;
    lastDoCheckCall = Date.now();
    await scanStyles();
    // Then check the different modes (solo, ranked, teams, nmpz)
    if ((sessionStorage.getItem("modesChecked") || 0) == 0) { // for team duels there should be a delay because it needs time to find opponents
        checkModes();
        sessionStorage.setItem("modesChecked", 1);
    }
    // Then make sure we are in the round results screen
    if (!document.querySelector('div[class*="result-layout_root__"]')) {
        sessionStorage.setItem("roundChecked", 0);
        return;
    } else if ((sessionStorage.getItem("roundChecked") || 0) == 0) {
        run();
        sessionStorage.setItem("roundChecked", 1);
    }
}).observe(document.body, { subtree: true, childList: true });

// document.addEventListener('keypress', (e) => {
//     if (e.key == '1') {
//         updateStreak(streak + 1);
//     } else if (e.key == '2') {
//         updateStreak(streak - 1);
//     } else if (e.key == '8') {
//         const streakBackup = parseInt(sessionStorage.getItem("StreakBackup") || 0, 10);
//         updateStreak(streakBackup + 1);
//     } else if (e.key == '0') {
//         updateStreak(0);
//         sessionStorage.setItem("StreakBackup", 0);
//     };
// });