scope ipToCountry2020. sS #dataSnippetID = #1400400; static Lock #lock = lock(); static File #dataDir() { ret javaxCachesDir("ipToCountry2020"); } sS ipToCountry2020(S ip) null on exception { { lock lock; if (directoryEmpty(dataDir())) unzipSnippet(dataSnippetID, dataDir()); } long ipNum = ipToInt(ip); S line = pairB(binarySearchForLineInTextFile(newFile(dataDir(), "IP2LOCATION-LITE-DB1.CSV"), s -> { long a = parseFirstLong(s), b = parseSecondLong(s); ret ipNum > b ? 1 : ipNum < a ? -1 : 0; })); ret get(tok_splitAtComma_unquote(line), 2); }