local base64 = require("base64") local hmac = require("openssl.hmac") local md5 = require("md5") local zlib = require("zlib") local function base64_encode_str(data) return base64.encode(data) end local function base64_decode_str(data) return base64.decode(data) end local function compress_zlib(data) local deflate = zlib.deflate() local compressed_data, eof, bytes_in, bytes_out = deflate(data, "finish") return compressed_data end local function count_table_elements(tbl) local count = 0 for _ in pairs(tbl) do count = count + 1 end return count end local function decompress_zlib(data) local inflate = zlib.inflate() local decompressed_data, eof, bytes_in, bytes_out = inflate(data, "finish") return decompressed_data end local function format_map(map) local result = {} for k, v in pairs(map) do table.insert(result, string.format("%s=%s", k, v)) end return table.concat(result, ", ") end local function get_rand(min, max) if max <= min then return min end math.randomseed(os.time()) return math.random(min, max) end local function hmac_sha256(key, data) local hmac_sha256 = hmac.new(key, "sha256") local digest = hmac_sha256:final(data) return digest end local function md5_hash(data) return md5.sumhexa(data) end local function print_table(t, indent) indent = indent or "" for key, value in pairs(t) do io.write(indent .. tostring(key) .. ": ") if type(value) == "table" then print() print_table(value, indent .. " ") else print(tostring(value)) end end end local function to_hex(data) return (data:gsub('.', function(c) return string.format('%02x', string.byte(c)) end)) end local function pack_int16(x) return string.pack("