From babc1fe4dcca01a6bbfb6551f912c36ba74460f0 Mon Sep 17 00:00:00 2001 From: Martin Onufrak <74785574+MartinOnufrak@users.noreply.github.com> Date: Tue, 29 Oct 2024 21:39:16 +0100 Subject: [PATCH] feat: add JWT implementation (#971) * [INTERNET-MODULE][JWT-TOKEN] Implementation, docstrings and simple test to verification * [JWT][INTERNET] cleanup * [PROJECT] sync * [INTERNET MODULE][JWT] Implementation + test * [INTERNET MODULE][JWT] Refactoring and wider test coverage * [PROJECT] submodule update * [INTERNET DATA] MERGE CONFLICT FIXED * [INTERNET MODULE] namespace for utility methods anonymized --------- Co-authored-by: Martin Onufrak --- externals/fmt | 2 +- externals/googletest | 2 +- include/faker-cxx/internet.h | 39 ++++ src/modules/internet.cpp | 135 +++++++++++++ src/modules/internet_data.h | 334 +++++++++++++++----------------- tests/modules/internet_test.cpp | 22 +++ 6 files changed, 350 insertions(+), 184 deletions(-) diff --git a/externals/fmt b/externals/fmt index 4046f9727..4b8e2838f 160000 --- a/externals/fmt +++ b/externals/fmt @@ -1 +1 @@ -Subproject commit 4046f9727892a9a1baeef00cb20211ee062efa16 +Subproject commit 4b8e2838f0767793e060135f4824c4114e285678 diff --git a/externals/googletest b/externals/googletest index 71815bbf7..5ed218639 160000 --- a/externals/googletest +++ b/externals/googletest @@ -1 +1 @@ -Subproject commit 71815bbf7de6e10c11821d654a2fae2cf42de0f7 +Subproject commit 5ed21863955149a5a877a53d7d5045b6919090ed diff --git a/include/faker-cxx/internet.h b/include/faker-cxx/internet.h index 85b165eff..f976c42fc 100644 --- a/include/faker-cxx/internet.h +++ b/include/faker-cxx/internet.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include #include #include @@ -350,4 +352,41 @@ FAKER_CXX_EXPORT std::string_view domainSuffix(); * @endcode */ FAKER_CXX_EXPORT std::string anonymousUsername(unsigned maxLength); + +/** + * @brief Generates a JSON Web Token (JWT). + * + * This function generates a JWT using the provided header, payload, and reference date. + * If no header or payload is provided, default values will be used. + * The reference date is optional and can be used to set the "iat" (issued at) claim in the payload. + * + * @param header The optional header map to include in the JWT. Defaults to a standard header. + * @param payload The optional payload map to include in the JWT. Defaults to a standard payload. + * @param refDate The optional reference date to set the "iat" claim. Defaults to the current date and time. + * + * @returns A string representing the generated JWT. + * + * @code + * std::map header = {{"alg", "HS256"}, {"typ", "JWT"}}; + * std::map payload = {{"sub", "1234567890"}, {"name", "John Doe"}, {"admin", "true"}}; + * faker::internet::getJWTToken(header, payload); // "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." + * @endcode + */ +FAKER_CXX_EXPORT std::string +getJWTToken(const std::optional>& header = std::nullopt, + const std::optional>& payload = std::nullopt, + const std::optional& refDate = std::nullopt); + +/** + * @brief Returns the algorithm used for signing the JWT. + * + * This function provides the algorithm that is used to sign the JSON Web Token (JWT). + * + * @returns A string view representing the JWT signing algorithm. + * + * @code + * faker::internet::getJWTAlgorithm(); // "HS256" + * @endcode + */ +FAKER_CXX_EXPORT std::string_view getJWTAlgorithm(); } diff --git a/src/modules/internet.cpp b/src/modules/internet.cpp index 7a8f4c98b..384143bc2 100644 --- a/src/modules/internet.cpp +++ b/src/modules/internet.cpp @@ -2,9 +2,11 @@ #include #include +#include #include #include #include +#include #include #include #include @@ -13,6 +15,8 @@ #include "common/algo_helper.h" #include "common/format_helper.h" #include "common/string_helper.h" +#include "faker-cxx/company.h" +#include "faker-cxx/faker.h" #include "faker-cxx/helper.h" #include "faker-cxx/number.h" #include "faker-cxx/person.h" @@ -22,6 +26,89 @@ #include "internet_data.h" #include "modules/string_data.h" +namespace +{ +/** + * @brief Encodes a given string to Base64 URL format. + * + * This function takes an input string and converts it into a Base64 URL encoded string. + * Base64 URL encoding is a variant of Base64 encoding that is URL-safe. + * + * @param input The string to be encoded. + * + * @returns A Base64 URL encoded string. + * + * @code + * std::string input = "Hello, World!"; + * faker::internet::toBase64UrlEncode(input); // "SGVsbG8sIFdvcmxkIQ" + * @endcode + */ +std::string toBase64UrlEncode(const std::string& input) +{ + const std::string base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + std::string encodedInput; + + int value = 0; + int validBits = -6; + + for (unsigned char character : input) + { + value = (value << 8) + character; + validBits += 8; + while (validBits >= 0) + { + encodedInput.push_back(base64Chars[(value >> validBits) & 0x3F]); + validBits -= 6; + } + } + + if (validBits > -6) + { + encodedInput.push_back(base64Chars[((value << 8) >> validBits) & 0x3F]); + } + + while (encodedInput.size() % 4) + { + encodedInput.push_back('='); + } + + std::replace(encodedInput.begin(), encodedInput.end(), '+', '-'); + std::replace(encodedInput.begin(), encodedInput.end(), '/', '_'); + encodedInput = std::regex_replace(encodedInput, std::regex{"=+$"}, ""); + + return encodedInput; +} + +/** + * @brief Converts a map of key-value pairs to a JSON string. + * + * This function takes a map where both keys and values are strings and converts it into a JSON formatted string. + * + * @param data The map containing key-value pairs to be converted to JSON. + * + * @returns A JSON formatted string representing the input map. + * + * @code + * std::map data = {{"name", "John"}, {"age", "30"}}; + * faker::internet::toJSON(data); // json is now "{\"name\":\"John\",\"age\":\"30\"}" + * @endcode + */ +std::string toJSON(std::map& data) +{ + std::string json = "{"; + for (auto it = data.begin(); it != data.end(); ++it) + { + if (it != data.begin()) + { + json += ","; + } + json += "\"" + it->first + "\":\"" + it->second + "\""; + } + json += "}"; + return json; +} +} + namespace faker::internet { namespace @@ -348,4 +435,52 @@ std::string anonymousUsername(unsigned maxLength) return common::format("{}{}", word::adjective(adjectiveLength), word::noun(nounLength)); } +std::string_view getJWTAlgorithm() +{ + return helper::randomElement(jwtAlgorithms); +} + +std::string getJWTToken(const std::optional>& header, + const std::optional>& payload, + const std::optional& refDate) +{ + const auto refDateValue = refDate.value_or(faker::date::anytime()); + + // maybe add option to set ref date to date functions then refactor this + const auto iatDefault = faker::date::recentDate(faker::date::dayOfMonth(), faker::date::DateFormat::Timestamp); + const auto expDefault = faker::date::soonDate(faker::date::dayOfMonth(), faker::date::DateFormat::Timestamp); + const auto nbfDefault = faker::date::anytime(faker::date::DateFormat::Timestamp); + + std::optional> localHeader = header; + std::optional> localPayload = payload; + + std::string algorithm(getJWTAlgorithm()); + + if (!localHeader) + { + localHeader = {{"alg", algorithm}, {"typ", "JWT"}}; + } + + if (!localPayload) + { + localPayload = {{"iat", std::to_string(std::round(std::stoll(iatDefault)))}, + {"exp", std::to_string(std::round(std::stoll(expDefault)))}, + {"nbf", std::to_string(std::round(std::stoll(nbfDefault)))}, + {"iss", faker::company::companyName()}, + {"sub", faker::string::uuid()}, + {"aud", faker::string::uuid()}, + {"jti", faker::string::uuid()}}; + } + + const auto headerToJSON = toJSON(localHeader.value()); + const auto encodedHeader = toBase64UrlEncode(headerToJSON); + + const auto payloadToJSON = toJSON(localPayload.value()); + const auto encodedPayload = toBase64UrlEncode(payloadToJSON); + + const auto signature = faker::string::alphanumeric(64); + + return encodedHeader + "." + encodedPayload + "." + signature; +} + } diff --git a/src/modules/internet_data.h b/src/modules/internet_data.h index b1b96a923..1411a815c 100644 --- a/src/modules/internet_data.h +++ b/src/modules/internet_data.h @@ -187,34 +187,24 @@ const auto smileyEmojis = std::to_array({ }); const auto bodyEmojis = std::to_array({ - "โ˜๏ธ", "โ˜๐Ÿป", "โ˜๐Ÿผ", "โ˜๐Ÿฝ", "โ˜๐Ÿพ", "โ˜๐Ÿฟ", "โœŠ", "โœŠ๐Ÿป", "โœŠ๐Ÿผ", - "โœŠ๐Ÿฝ", "โœŠ๐Ÿพ", "โœŠ๐Ÿฟ", "โœ‹", "โœ‹๐Ÿป", "โœ‹๐Ÿผ", "โœ‹๐Ÿฝ", "โœ‹๐Ÿพ", "โœ‹๐Ÿฟ", - "โœŒ๏ธ", "โœŒ๐Ÿป", "โœŒ๐Ÿผ", "โœŒ๐Ÿฝ", "โœŒ๐Ÿพ", "โœŒ๐Ÿฟ", "โœ๏ธ", "โœ๐Ÿป", "โœ๐Ÿผ", - "โœ๐Ÿฝ", "โœ๐Ÿพ", "โœ๐Ÿฟ", "๐Ÿ‘€", "๐Ÿ‘๏ธ", "๐Ÿ‘‚", "๐Ÿ‘‚๐Ÿป", "๐Ÿ‘‚๐Ÿผ", "๐Ÿ‘‚๐Ÿฝ", - "๐Ÿ‘‚๐Ÿพ", "๐Ÿ‘‚๐Ÿฟ", "๐Ÿ‘ƒ", "๐Ÿ‘ƒ๐Ÿป", "๐Ÿ‘ƒ๐Ÿผ", "๐Ÿ‘ƒ๐Ÿฝ", "๐Ÿ‘ƒ๐Ÿพ", "๐Ÿ‘ƒ๐Ÿฟ", "๐Ÿ‘„", - "๐Ÿ‘…", "๐Ÿ‘†", "๐Ÿ‘†๐Ÿป", "๐Ÿ‘†๐Ÿผ", "๐Ÿ‘†๐Ÿฝ", "๐Ÿ‘†๐Ÿพ", "๐Ÿ‘†๐Ÿฟ", "๐Ÿ‘‡", "๐Ÿ‘‡๐Ÿป", - "๐Ÿ‘‡๐Ÿผ", "๐Ÿ‘‡๐Ÿฝ", "๐Ÿ‘‡๐Ÿพ", "๐Ÿ‘‡๐Ÿฟ", "๐Ÿ‘ˆ", "๐Ÿ‘ˆ๐Ÿป", "๐Ÿ‘ˆ๐Ÿผ", "๐Ÿ‘ˆ๐Ÿฝ", "๐Ÿ‘ˆ๐Ÿพ", - "๐Ÿ‘ˆ๐Ÿฟ", "๐Ÿ‘‰", "๐Ÿ‘‰๐Ÿป", "๐Ÿ‘‰๐Ÿผ", "๐Ÿ‘‰๐Ÿฝ", "๐Ÿ‘‰๐Ÿพ", "๐Ÿ‘‰๐Ÿฟ", "๐Ÿ‘Š", "๐Ÿ‘Š๐Ÿป", - "๐Ÿ‘Š๐Ÿผ", "๐Ÿ‘Š๐Ÿฝ", "๐Ÿ‘Š๐Ÿพ", "๐Ÿ‘Š๐Ÿฟ", "๐Ÿ‘‹", "๐Ÿ‘‹๐Ÿป", "๐Ÿ‘‹๐Ÿผ", "๐Ÿ‘‹๐Ÿฝ", "๐Ÿ‘‹๐Ÿพ", - "๐Ÿ‘‹๐Ÿฟ", "๐Ÿ‘Œ", "๐Ÿ‘Œ๐Ÿป", "๐Ÿ‘Œ๐Ÿผ", "๐Ÿ‘Œ๐Ÿฝ", "๐Ÿ‘Œ๐Ÿพ", "๐Ÿ‘Œ๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", - "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ‘Ž", "๐Ÿ‘Ž๐Ÿป", "๐Ÿ‘Ž๐Ÿผ", "๐Ÿ‘Ž๐Ÿฝ", "๐Ÿ‘Ž๐Ÿพ", - "๐Ÿ‘Ž๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", - "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ’…", "๐Ÿ’…๐Ÿป", "๐Ÿ’…๐Ÿผ", "๐Ÿ’…๐Ÿฝ", "๐Ÿ’…๐Ÿพ", - "๐Ÿ’…๐Ÿฟ", "๐Ÿ’ช", "๐Ÿ’ช๐Ÿป", "๐Ÿ’ช๐Ÿผ", "๐Ÿ’ช๐Ÿฝ", "๐Ÿ’ช๐Ÿพ", "๐Ÿ’ช๐Ÿฟ", "๐Ÿ–๏ธ", "๐Ÿ–๐Ÿป", - "๐Ÿ–๐Ÿผ", "๐Ÿ–๐Ÿฝ", "๐Ÿ–๐Ÿพ", "๐Ÿ–๐Ÿฟ", "๐Ÿ–•", "๐Ÿ–•๐Ÿป", "๐Ÿ–•๐Ÿผ", "๐Ÿ–•๐Ÿฝ", "๐Ÿ–•๐Ÿพ", - "๐Ÿ–•๐Ÿฟ", "๐Ÿ––", "๐Ÿ––๐Ÿป", "๐Ÿ––๐Ÿผ", "๐Ÿ––๐Ÿฝ", "๐Ÿ––๐Ÿพ", "๐Ÿ––๐Ÿฟ", "๐Ÿ™Œ", "๐Ÿ™Œ๐Ÿป", - "๐Ÿ™Œ๐Ÿผ", "๐Ÿ™Œ๐Ÿฝ", "๐Ÿ™Œ๐Ÿพ", "๐Ÿ™Œ๐Ÿฟ", "๐Ÿ™", "๐Ÿ™๐Ÿป", "๐Ÿ™๐Ÿผ", "๐Ÿ™๐Ÿฝ", "๐Ÿ™๐Ÿพ", - "๐Ÿ™๐Ÿฟ", "๐ŸคŒ", "๐ŸคŒ๐Ÿป", "๐ŸคŒ๐Ÿผ", "๐ŸคŒ๐Ÿฝ", "๐ŸคŒ๐Ÿพ", "๐ŸคŒ๐Ÿฟ", "๐Ÿค", "๐Ÿค๐Ÿป", - "๐Ÿค๐Ÿผ", "๐Ÿค๐Ÿฝ", "๐Ÿค๐Ÿพ", "๐Ÿค๐Ÿฟ", "๐Ÿค˜", "๐Ÿค˜๐Ÿป", "๐Ÿค˜๐Ÿผ", "๐Ÿค˜๐Ÿฝ", "๐Ÿค˜๐Ÿพ", - "๐Ÿค˜๐Ÿฟ", "๐Ÿค™", "๐Ÿค™๐Ÿป", "๐Ÿค™๐Ÿผ", "๐Ÿค™๐Ÿฝ", "๐Ÿค™๐Ÿพ", "๐Ÿค™๐Ÿฟ", "๐Ÿคš", "๐Ÿคš๐Ÿป", - "๐Ÿคš๐Ÿผ", "๐Ÿคš๐Ÿฝ", "๐Ÿคš๐Ÿพ", "๐Ÿคš๐Ÿฟ", "๐Ÿค›", "๐Ÿค›๐Ÿป", "๐Ÿค›๐Ÿผ", "๐Ÿค›๐Ÿฝ", "๐Ÿค›๐Ÿพ", - "๐Ÿค›๐Ÿฟ", "๐Ÿคœ", "๐Ÿคœ๐Ÿป", "๐Ÿคœ๐Ÿผ", "๐Ÿคœ๐Ÿฝ", "๐Ÿคœ๐Ÿพ", "๐Ÿคœ๐Ÿฟ", "๐Ÿค", "๐Ÿคž", - "๐Ÿคž๐Ÿป", "๐Ÿคž๐Ÿผ", "๐Ÿคž๐Ÿฝ", "๐Ÿคž๐Ÿพ", "๐Ÿคž๐Ÿฟ", "๐ŸคŸ", "๐ŸคŸ๐Ÿป", "๐ŸคŸ๐Ÿผ", "๐ŸคŸ๐Ÿฝ", - "๐ŸคŸ๐Ÿพ", "๐ŸคŸ๐Ÿฟ", "๐Ÿคฒ", "๐Ÿคฒ๐Ÿป", "๐Ÿคฒ๐Ÿผ", "๐Ÿคฒ๐Ÿฝ", "๐Ÿคฒ๐Ÿพ", "๐Ÿคฒ๐Ÿฟ", "๐Ÿคณ", - "๐Ÿคณ๐Ÿป", "๐Ÿคณ๐Ÿผ", "๐Ÿคณ๐Ÿฝ", "๐Ÿคณ๐Ÿพ", "๐Ÿคณ๐Ÿฟ", "๐Ÿฆด", "๐Ÿฆต", "๐Ÿฆต๐Ÿป", "๐Ÿฆต๐Ÿผ", - "๐Ÿฆต๐Ÿฝ", "๐Ÿฆต๐Ÿพ", "๐Ÿฆต๐Ÿฟ", "๐Ÿฆถ", "๐Ÿฆถ๐Ÿป", "๐Ÿฆถ๐Ÿผ", "๐Ÿฆถ๐Ÿฝ", "๐Ÿฆถ๐Ÿพ", "๐Ÿฆถ๐Ÿฟ", - "๐Ÿฆท", "๐Ÿฆป", "๐Ÿฆป๐Ÿป", "๐Ÿฆป๐Ÿผ", "๐Ÿฆป๐Ÿฝ", "๐Ÿฆป๐Ÿพ", "๐Ÿฆป๐Ÿฟ", "๐Ÿฆพ", "๐Ÿฆฟ", - "๐Ÿง ", "๐Ÿซ€", "๐Ÿซ", + "โ˜๏ธ", "โ˜๐Ÿป", "โ˜๐Ÿผ", "โ˜๐Ÿฝ", "โ˜๐Ÿพ", "โ˜๐Ÿฟ", "โœŠ", "โœŠ๐Ÿป", "โœŠ๐Ÿผ", "โœŠ๐Ÿฝ", "โœŠ๐Ÿพ", "โœŠ๐Ÿฟ", "โœ‹", "โœ‹๐Ÿป", + "โœ‹๐Ÿผ", "โœ‹๐Ÿฝ", "โœ‹๐Ÿพ", "โœ‹๐Ÿฟ", "โœŒ๏ธ", "โœŒ๐Ÿป", "โœŒ๐Ÿผ", "โœŒ๐Ÿฝ", "โœŒ๐Ÿพ", "โœŒ๐Ÿฟ", "โœ๏ธ", "โœ๐Ÿป", "โœ๐Ÿผ", "โœ๐Ÿฝ", + "โœ๐Ÿพ", "โœ๐Ÿฟ", "๐Ÿ‘€", "๐Ÿ‘๏ธ", "๐Ÿ‘‚", "๐Ÿ‘‚๐Ÿป", "๐Ÿ‘‚๐Ÿผ", "๐Ÿ‘‚๐Ÿฝ", "๐Ÿ‘‚๐Ÿพ", "๐Ÿ‘‚๐Ÿฟ", "๐Ÿ‘ƒ", "๐Ÿ‘ƒ๐Ÿป", "๐Ÿ‘ƒ๐Ÿผ", "๐Ÿ‘ƒ๐Ÿฝ", + "๐Ÿ‘ƒ๐Ÿพ", "๐Ÿ‘ƒ๐Ÿฟ", "๐Ÿ‘„", "๐Ÿ‘…", "๐Ÿ‘†", "๐Ÿ‘†๐Ÿป", "๐Ÿ‘†๐Ÿผ", "๐Ÿ‘†๐Ÿฝ", "๐Ÿ‘†๐Ÿพ", "๐Ÿ‘†๐Ÿฟ", "๐Ÿ‘‡", "๐Ÿ‘‡๐Ÿป", "๐Ÿ‘‡๐Ÿผ", "๐Ÿ‘‡๐Ÿฝ", + "๐Ÿ‘‡๐Ÿพ", "๐Ÿ‘‡๐Ÿฟ", "๐Ÿ‘ˆ", "๐Ÿ‘ˆ๐Ÿป", "๐Ÿ‘ˆ๐Ÿผ", "๐Ÿ‘ˆ๐Ÿฝ", "๐Ÿ‘ˆ๐Ÿพ", "๐Ÿ‘ˆ๐Ÿฟ", "๐Ÿ‘‰", "๐Ÿ‘‰๐Ÿป", "๐Ÿ‘‰๐Ÿผ", "๐Ÿ‘‰๐Ÿฝ", "๐Ÿ‘‰๐Ÿพ", "๐Ÿ‘‰๐Ÿฟ", + "๐Ÿ‘Š", "๐Ÿ‘Š๐Ÿป", "๐Ÿ‘Š๐Ÿผ", "๐Ÿ‘Š๐Ÿฝ", "๐Ÿ‘Š๐Ÿพ", "๐Ÿ‘Š๐Ÿฟ", "๐Ÿ‘‹", "๐Ÿ‘‹๐Ÿป", "๐Ÿ‘‹๐Ÿผ", "๐Ÿ‘‹๐Ÿฝ", "๐Ÿ‘‹๐Ÿพ", "๐Ÿ‘‹๐Ÿฟ", "๐Ÿ‘Œ", "๐Ÿ‘Œ๐Ÿป", + "๐Ÿ‘Œ๐Ÿผ", "๐Ÿ‘Œ๐Ÿฝ", "๐Ÿ‘Œ๐Ÿพ", "๐Ÿ‘Œ๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ‘Ž", "๐Ÿ‘Ž๐Ÿป", "๐Ÿ‘Ž๐Ÿผ", "๐Ÿ‘Ž๐Ÿฝ", + "๐Ÿ‘Ž๐Ÿพ", "๐Ÿ‘Ž๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", "๐Ÿ‘", "๐Ÿ‘๐Ÿป", "๐Ÿ‘๐Ÿผ", "๐Ÿ‘๐Ÿฝ", "๐Ÿ‘๐Ÿพ", "๐Ÿ‘๐Ÿฟ", + "๐Ÿ’…", "๐Ÿ’…๐Ÿป", "๐Ÿ’…๐Ÿผ", "๐Ÿ’…๐Ÿฝ", "๐Ÿ’…๐Ÿพ", "๐Ÿ’…๐Ÿฟ", "๐Ÿ’ช", "๐Ÿ’ช๐Ÿป", "๐Ÿ’ช๐Ÿผ", "๐Ÿ’ช๐Ÿฝ", "๐Ÿ’ช๐Ÿพ", "๐Ÿ’ช๐Ÿฟ", "๐Ÿ–๏ธ", "๐Ÿ–๐Ÿป", + "๐Ÿ–๐Ÿผ", "๐Ÿ–๐Ÿฝ", "๐Ÿ–๐Ÿพ", "๐Ÿ–๐Ÿฟ", "๐Ÿ–•", "๐Ÿ–•๐Ÿป", "๐Ÿ–•๐Ÿผ", "๐Ÿ–•๐Ÿฝ", "๐Ÿ–•๐Ÿพ", "๐Ÿ–•๐Ÿฟ", "๐Ÿ––", "๐Ÿ––๐Ÿป", "๐Ÿ––๐Ÿผ", "๐Ÿ––๐Ÿฝ", + "๐Ÿ––๐Ÿพ", "๐Ÿ––๐Ÿฟ", "๐Ÿ™Œ", "๐Ÿ™Œ๐Ÿป", "๐Ÿ™Œ๐Ÿผ", "๐Ÿ™Œ๐Ÿฝ", "๐Ÿ™Œ๐Ÿพ", "๐Ÿ™Œ๐Ÿฟ", "๐Ÿ™", "๐Ÿ™๐Ÿป", "๐Ÿ™๐Ÿผ", "๐Ÿ™๐Ÿฝ", "๐Ÿ™๐Ÿพ", "๐Ÿ™๐Ÿฟ", + "๐ŸคŒ", "๐ŸคŒ๐Ÿป", "๐ŸคŒ๐Ÿผ", "๐ŸคŒ๐Ÿฝ", "๐ŸคŒ๐Ÿพ", "๐ŸคŒ๐Ÿฟ", "๐Ÿค", "๐Ÿค๐Ÿป", "๐Ÿค๐Ÿผ", "๐Ÿค๐Ÿฝ", "๐Ÿค๐Ÿพ", "๐Ÿค๐Ÿฟ", "๐Ÿค˜", "๐Ÿค˜๐Ÿป", + "๐Ÿค˜๐Ÿผ", "๐Ÿค˜๐Ÿฝ", "๐Ÿค˜๐Ÿพ", "๐Ÿค˜๐Ÿฟ", "๐Ÿค™", "๐Ÿค™๐Ÿป", "๐Ÿค™๐Ÿผ", "๐Ÿค™๐Ÿฝ", "๐Ÿค™๐Ÿพ", "๐Ÿค™๐Ÿฟ", "๐Ÿคš", "๐Ÿคš๐Ÿป", "๐Ÿคš๐Ÿผ", "๐Ÿคš๐Ÿฝ", + "๐Ÿคš๐Ÿพ", "๐Ÿคš๐Ÿฟ", "๐Ÿค›", "๐Ÿค›๐Ÿป", "๐Ÿค›๐Ÿผ", "๐Ÿค›๐Ÿฝ", "๐Ÿค›๐Ÿพ", "๐Ÿค›๐Ÿฟ", "๐Ÿคœ", "๐Ÿคœ๐Ÿป", "๐Ÿคœ๐Ÿผ", "๐Ÿคœ๐Ÿฝ", "๐Ÿคœ๐Ÿพ", "๐Ÿคœ๐Ÿฟ", + "๐Ÿค", "๐Ÿคž", "๐Ÿคž๐Ÿป", "๐Ÿคž๐Ÿผ", "๐Ÿคž๐Ÿฝ", "๐Ÿคž๐Ÿพ", "๐Ÿคž๐Ÿฟ", "๐ŸคŸ", "๐ŸคŸ๐Ÿป", "๐ŸคŸ๐Ÿผ", "๐ŸคŸ๐Ÿฝ", "๐ŸคŸ๐Ÿพ", "๐ŸคŸ๐Ÿฟ", "๐Ÿคฒ", + "๐Ÿคฒ๐Ÿป", "๐Ÿคฒ๐Ÿผ", "๐Ÿคฒ๐Ÿฝ", "๐Ÿคฒ๐Ÿพ", "๐Ÿคฒ๐Ÿฟ", "๐Ÿคณ", "๐Ÿคณ๐Ÿป", "๐Ÿคณ๐Ÿผ", "๐Ÿคณ๐Ÿฝ", "๐Ÿคณ๐Ÿพ", "๐Ÿคณ๐Ÿฟ", "๐Ÿฆด", "๐Ÿฆต", "๐Ÿฆต๐Ÿป", + "๐Ÿฆต๐Ÿผ", "๐Ÿฆต๐Ÿฝ", "๐Ÿฆต๐Ÿพ", "๐Ÿฆต๐Ÿฟ", "๐Ÿฆถ", "๐Ÿฆถ๐Ÿป", "๐Ÿฆถ๐Ÿผ", "๐Ÿฆถ๐Ÿฝ", "๐Ÿฆถ๐Ÿพ", "๐Ÿฆถ๐Ÿฟ", "๐Ÿฆท", "๐Ÿฆป", "๐Ÿฆป๐Ÿป", "๐Ÿฆป๐Ÿผ", + "๐Ÿฆป๐Ÿฝ", "๐Ÿฆป๐Ÿพ", "๐Ÿฆป๐Ÿฟ", "๐Ÿฆพ", "๐Ÿฆฟ", "๐Ÿง ", "๐Ÿซ€", "๐Ÿซ", }); const auto personEmojis = std::to_array({ @@ -343,177 +333,141 @@ const auto personEmojis = std::to_array({ }); const auto natureEmojis = std::to_array({ - "โ˜˜๏ธ", "๐ŸŒฑ", - "๐ŸŒฒ", "๐ŸŒณ", - "๐ŸŒด", "๐ŸŒต", - "๐ŸŒท", "๐ŸŒธ", - "๐ŸŒน", "๐ŸŒบ", - "๐ŸŒป", "๐ŸŒผ", - "๐ŸŒพ", "๐ŸŒฟ", - "๐Ÿ€", "๐Ÿ", - "๐Ÿ‚", "๐Ÿƒ", - "๐Ÿต๏ธ", "๐Ÿ€", - "๐Ÿ", "๐Ÿ‚", - "๐Ÿƒ", "๐Ÿ„", - "๐Ÿ…", "๐Ÿ†", - "๐Ÿ‡", "๐Ÿˆ", + "โ˜˜๏ธ", "๐ŸŒฑ", + "๐ŸŒฒ", "๐ŸŒณ", + "๐ŸŒด", "๐ŸŒต", + "๐ŸŒท", "๐ŸŒธ", + "๐ŸŒน", "๐ŸŒบ", + "๐ŸŒป", "๐ŸŒผ", + "๐ŸŒพ", "๐ŸŒฟ", + "๐Ÿ€", "๐Ÿ", + "๐Ÿ‚", "๐Ÿƒ", + "๐Ÿต๏ธ", "๐Ÿ€", + "๐Ÿ", "๐Ÿ‚", + "๐Ÿƒ", "๐Ÿ„", + "๐Ÿ…", "๐Ÿ†", + "๐Ÿ‡", "๐Ÿˆ", "๐Ÿˆโ€โฌ›", "๐Ÿ‰", - "๐ŸŠ", "๐Ÿ‹", - "๐ŸŒ", "๐Ÿ", - "๐ŸŽ", "๐Ÿ", - "๐Ÿ", "๐Ÿ‘", - "๐Ÿ’", "๐Ÿ“", - "๐Ÿ”", "๐Ÿ•", + "๐ŸŠ", "๐Ÿ‹", + "๐ŸŒ", "๐Ÿ", + "๐ŸŽ", "๐Ÿ", + "๐Ÿ", "๐Ÿ‘", + "๐Ÿ’", "๐Ÿ“", + "๐Ÿ”", "๐Ÿ•", "๐Ÿ•โ€๐Ÿฆบ", "๐Ÿ–", - "๐Ÿ—", "๐Ÿ˜", - "๐Ÿ™", "๐Ÿš", - "๐Ÿ›", "๐Ÿœ", - "๐Ÿ", "๐Ÿž", - "๐ŸŸ", "๐Ÿ ", - "๐Ÿก", "๐Ÿข", - "๐Ÿฃ", "๐Ÿค", - "๐Ÿฅ", "๐Ÿฆ", - "๐Ÿง", "๐Ÿจ", - "๐Ÿฉ", "๐Ÿช", - "๐Ÿซ", "๐Ÿฌ", - "๐Ÿญ", "๐Ÿฎ", - "๐Ÿฏ", "๐Ÿฐ", - "๐Ÿฑ", "๐Ÿฒ", - "๐Ÿณ", "๐Ÿด", - "๐Ÿต", "๐Ÿถ", - "๐Ÿท", "๐Ÿธ", - "๐Ÿน", "๐Ÿบ", - "๐Ÿป", "๐Ÿปโ€โ„๏ธ", - "๐Ÿผ", "๐Ÿฝ", - "๐Ÿพ", "๐Ÿฟ๏ธ", - "๐Ÿ’", "๐Ÿ’ฎ", - "๐Ÿ•Š๏ธ", "๐Ÿ•ท๏ธ", - "๐Ÿ•ธ๏ธ", "๐Ÿฅ€", - "๐Ÿฆ", "๐Ÿฆ‚", - "๐Ÿฆƒ", "๐Ÿฆ„", - "๐Ÿฆ…", "๐Ÿฆ†", - "๐Ÿฆ‡", "๐Ÿฆˆ", - "๐Ÿฆ‰", "๐ŸฆŠ", - "๐Ÿฆ‹", "๐ŸฆŒ", - "๐Ÿฆ", "๐ŸฆŽ", - "๐Ÿฆ", "๐Ÿฆ’", - "๐Ÿฆ“", "๐Ÿฆ”", - "๐Ÿฆ•", "๐Ÿฆ–", - "๐Ÿฆ—", "๐Ÿฆ˜", - "๐Ÿฆ™", "๐Ÿฆš", - "๐Ÿฆ›", "๐Ÿฆœ", - "๐Ÿฆ", "๐ŸฆŸ", - "๐Ÿฆ ", "๐Ÿฆก", - "๐Ÿฆข", "๐Ÿฆฃ", - "๐Ÿฆค", "๐Ÿฆฅ", - "๐Ÿฆฆ", "๐Ÿฆง", - "๐Ÿฆจ", "๐Ÿฆฉ", - "๐Ÿฆซ", "๐Ÿฆฌ", - "๐Ÿฆญ", "๐Ÿฆฎ", - "๐Ÿชฐ", "๐Ÿชฑ", - "๐Ÿชฒ", "๐Ÿชณ", - "๐Ÿชด", "๐Ÿชถ", + "๐Ÿ—", "๐Ÿ˜", + "๐Ÿ™", "๐Ÿš", + "๐Ÿ›", "๐Ÿœ", + "๐Ÿ", "๐Ÿž", + "๐ŸŸ", "๐Ÿ ", + "๐Ÿก", "๐Ÿข", + "๐Ÿฃ", "๐Ÿค", + "๐Ÿฅ", "๐Ÿฆ", + "๐Ÿง", "๐Ÿจ", + "๐Ÿฉ", "๐Ÿช", + "๐Ÿซ", "๐Ÿฌ", + "๐Ÿญ", "๐Ÿฎ", + "๐Ÿฏ", "๐Ÿฐ", + "๐Ÿฑ", "๐Ÿฒ", + "๐Ÿณ", "๐Ÿด", + "๐Ÿต", "๐Ÿถ", + "๐Ÿท", "๐Ÿธ", + "๐Ÿน", "๐Ÿบ", + "๐Ÿป", "๐Ÿปโ€โ„๏ธ", + "๐Ÿผ", "๐Ÿฝ", + "๐Ÿพ", "๐Ÿฟ๏ธ", + "๐Ÿ’", "๐Ÿ’ฎ", + "๐Ÿ•Š๏ธ", "๐Ÿ•ท๏ธ", + "๐Ÿ•ธ๏ธ", "๐Ÿฅ€", + "๐Ÿฆ", "๐Ÿฆ‚", + "๐Ÿฆƒ", "๐Ÿฆ„", + "๐Ÿฆ…", "๐Ÿฆ†", + "๐Ÿฆ‡", "๐Ÿฆˆ", + "๐Ÿฆ‰", "๐ŸฆŠ", + "๐Ÿฆ‹", "๐ŸฆŒ", + "๐Ÿฆ", "๐ŸฆŽ", + "๐Ÿฆ", "๐Ÿฆ’", + "๐Ÿฆ“", "๐Ÿฆ”", + "๐Ÿฆ•", "๐Ÿฆ–", + "๐Ÿฆ—", "๐Ÿฆ˜", + "๐Ÿฆ™", "๐Ÿฆš", + "๐Ÿฆ›", "๐Ÿฆœ", + "๐Ÿฆ", "๐ŸฆŸ", + "๐Ÿฆ ", "๐Ÿฆก", + "๐Ÿฆข", "๐Ÿฆฃ", + "๐Ÿฆค", "๐Ÿฆฅ", + "๐Ÿฆฆ", "๐Ÿฆง", + "๐Ÿฆจ", "๐Ÿฆฉ", + "๐Ÿฆซ", "๐Ÿฆฌ", + "๐Ÿฆญ", "๐Ÿฆฎ", + "๐Ÿชฐ", "๐Ÿชฑ", + "๐Ÿชฒ", "๐Ÿชณ", + "๐Ÿชด", "๐Ÿชถ", }); const auto foodEmojis = std::to_array({ - "โ˜•", "๐ŸŒญ", "๐ŸŒฎ", "๐ŸŒฏ", "๐ŸŒฐ", "๐ŸŒถ๏ธ", "๐ŸŒฝ", "๐Ÿ„", "๐Ÿ…", "๐Ÿ†", "๐Ÿ‡", "๐Ÿˆ", "๐Ÿ‰", - "๐ŸŠ", "๐Ÿ‹", "๐ŸŒ", "๐Ÿ", "๐ŸŽ", "๐Ÿ", "๐Ÿ", "๐Ÿ‘", "๐Ÿ’", "๐Ÿ“", "๐Ÿ”", "๐Ÿ•", "๐Ÿ–", - "๐Ÿ—", "๐Ÿ˜", "๐Ÿ™", "๐Ÿš", "๐Ÿ›", "๐Ÿœ", "๐Ÿ", "๐Ÿž", "๐ŸŸ", "๐Ÿ ", "๐Ÿก", "๐Ÿข", "๐Ÿฃ", - "๐Ÿค", "๐Ÿฅ", "๐Ÿฆ", "๐Ÿง", "๐Ÿจ", "๐Ÿฉ", "๐Ÿช", "๐Ÿซ", "๐Ÿฌ", "๐Ÿญ", "๐Ÿฎ", "๐Ÿฏ", "๐Ÿฐ", - "๐Ÿฑ", "๐Ÿฒ", "๐Ÿณ", "๐Ÿด", "๐Ÿต", "๐Ÿถ", "๐Ÿท", "๐Ÿธ", "๐Ÿน", "๐Ÿบ", "๐Ÿป", "๐Ÿผ", "๐Ÿฝ๏ธ", - "๐Ÿพ", "๐Ÿฟ", "๐ŸŽ‚", "๐Ÿบ", "๐Ÿ”ช", "๐Ÿฅ‚", "๐Ÿฅƒ", "๐Ÿฅ„", "๐Ÿฅ", "๐Ÿฅ‘", "๐Ÿฅ’", "๐Ÿฅ“", "๐Ÿฅ”", - "๐Ÿฅ•", "๐Ÿฅ–", "๐Ÿฅ—", "๐Ÿฅ˜", "๐Ÿฅ™", "๐Ÿฅš", "๐Ÿฅ›", "๐Ÿฅœ", "๐Ÿฅ", "๐Ÿฅž", "๐ŸฅŸ", "๐Ÿฅ ", "๐Ÿฅก", - "๐Ÿฅข", "๐Ÿฅฃ", "๐Ÿฅค", "๐Ÿฅฅ", "๐Ÿฅฆ", "๐Ÿฅง", "๐Ÿฅจ", "๐Ÿฅฉ", "๐Ÿฅช", "๐Ÿฅซ", "๐Ÿฅฌ", "๐Ÿฅญ", "๐Ÿฅฎ", - "๐Ÿฅฏ", "๐Ÿฆ€", "๐Ÿฆ", "๐Ÿฆ‘", "๐Ÿฆž", "๐Ÿฆช", "๐Ÿง€", "๐Ÿง", "๐Ÿง‚", "๐Ÿงƒ", "๐Ÿง„", "๐Ÿง…", "๐Ÿง†", - "๐Ÿง‡", "๐Ÿงˆ", "๐Ÿง‰", "๐ŸงŠ", "๐Ÿง‹", "๐Ÿซ", "๐Ÿซ‘", "๐Ÿซ’", "๐Ÿซ“", "๐Ÿซ”", "๐Ÿซ•", "๐Ÿซ–", + "โ˜•", "๐ŸŒญ", "๐ŸŒฎ", "๐ŸŒฏ", "๐ŸŒฐ", "๐ŸŒถ๏ธ", "๐ŸŒฝ", "๐Ÿ„", "๐Ÿ…", "๐Ÿ†", "๐Ÿ‡", "๐Ÿˆ", "๐Ÿ‰", "๐ŸŠ", "๐Ÿ‹", "๐ŸŒ", "๐Ÿ", "๐ŸŽ", "๐Ÿ", + "๐Ÿ", "๐Ÿ‘", "๐Ÿ’", "๐Ÿ“", "๐Ÿ”", "๐Ÿ•", "๐Ÿ–", "๐Ÿ—", "๐Ÿ˜", "๐Ÿ™", "๐Ÿš", "๐Ÿ›", "๐Ÿœ", "๐Ÿ", "๐Ÿž", "๐ŸŸ", "๐Ÿ ", "๐Ÿก", "๐Ÿข", + "๐Ÿฃ", "๐Ÿค", "๐Ÿฅ", "๐Ÿฆ", "๐Ÿง", "๐Ÿจ", "๐Ÿฉ", "๐Ÿช", "๐Ÿซ", "๐Ÿฌ", "๐Ÿญ", "๐Ÿฎ", "๐Ÿฏ", "๐Ÿฐ", "๐Ÿฑ", "๐Ÿฒ", "๐Ÿณ", "๐Ÿด", "๐Ÿต", + "๐Ÿถ", "๐Ÿท", "๐Ÿธ", "๐Ÿน", "๐Ÿบ", "๐Ÿป", "๐Ÿผ", "๐Ÿฝ๏ธ", "๐Ÿพ", "๐Ÿฟ", "๐ŸŽ‚", "๐Ÿบ", "๐Ÿ”ช", "๐Ÿฅ‚", "๐Ÿฅƒ", "๐Ÿฅ„", "๐Ÿฅ", "๐Ÿฅ‘", "๐Ÿฅ’", + "๐Ÿฅ“", "๐Ÿฅ”", "๐Ÿฅ•", "๐Ÿฅ–", "๐Ÿฅ—", "๐Ÿฅ˜", "๐Ÿฅ™", "๐Ÿฅš", "๐Ÿฅ›", "๐Ÿฅœ", "๐Ÿฅ", "๐Ÿฅž", "๐ŸฅŸ", "๐Ÿฅ ", "๐Ÿฅก", "๐Ÿฅข", "๐Ÿฅฃ", "๐Ÿฅค", "๐Ÿฅฅ", + "๐Ÿฅฆ", "๐Ÿฅง", "๐Ÿฅจ", "๐Ÿฅฉ", "๐Ÿฅช", "๐Ÿฅซ", "๐Ÿฅฌ", "๐Ÿฅญ", "๐Ÿฅฎ", "๐Ÿฅฏ", "๐Ÿฆ€", "๐Ÿฆ", "๐Ÿฆ‘", "๐Ÿฆž", "๐Ÿฆช", "๐Ÿง€", "๐Ÿง", "๐Ÿง‚", "๐Ÿงƒ", + "๐Ÿง„", "๐Ÿง…", "๐Ÿง†", "๐Ÿง‡", "๐Ÿงˆ", "๐Ÿง‰", "๐ŸงŠ", "๐Ÿง‹", "๐Ÿซ", "๐Ÿซ‘", "๐Ÿซ’", "๐Ÿซ“", "๐Ÿซ”", "๐Ÿซ•", "๐Ÿซ–", }); const auto travelEmojis = std::to_array({ - "โŒš", "โŒ›", "โฐ", "โฑ๏ธ", "โฒ๏ธ", "โณ", "โ˜€๏ธ", "โ˜๏ธ", "โ˜‚๏ธ", "โ˜ƒ๏ธ", - "โ˜„๏ธ", "โ˜”", "โ™จ๏ธ", "โš“", "โšก", "โ›„", "โ›…", "โ›ˆ๏ธ", "โ›ฉ๏ธ", "โ›ช", - "โ›ฐ๏ธ", "โ›ฑ๏ธ", "โ›ฒ", "โ›ด๏ธ", "โ›ต", "โ›บ", "โ›ฝ", "โœˆ๏ธ", "โ„๏ธ", "โญ", - "๐ŸŒ€", "๐ŸŒ", "๐ŸŒ‚", "๐ŸŒƒ", "๐ŸŒ„", "๐ŸŒ…", "๐ŸŒ†", "๐ŸŒ‡", "๐ŸŒˆ", "๐ŸŒ‰", - "๐ŸŒŠ", "๐ŸŒ‹", "๐ŸŒŒ", "๐ŸŒ", "๐ŸŒŽ", "๐ŸŒ", "๐ŸŒ", "๐ŸŒ‘", "๐ŸŒ’", "๐ŸŒ“", - "๐ŸŒ”", "๐ŸŒ•", "๐ŸŒ–", "๐ŸŒ—", "๐ŸŒ˜", "๐ŸŒ™", "๐ŸŒš", "๐ŸŒ›", "๐ŸŒœ", "๐ŸŒ", - "๐ŸŒž", "๐ŸŒŸ", "๐ŸŒ ", "๐ŸŒก๏ธ", "๐ŸŒค๏ธ", "๐ŸŒฅ๏ธ", "๐ŸŒฆ๏ธ", "๐ŸŒง๏ธ", "๐ŸŒจ๏ธ", "๐ŸŒฉ๏ธ", - "๐ŸŒช๏ธ", "๐ŸŒซ๏ธ", "๐ŸŒฌ๏ธ", "๐ŸŽ ", "๐ŸŽก", "๐ŸŽข", "๐ŸŽช", "๐Ÿ๏ธ", "๐ŸŽ๏ธ", "๐Ÿ”๏ธ", - "๐Ÿ•๏ธ", "๐Ÿ–๏ธ", "๐Ÿ—๏ธ", "๐Ÿ˜๏ธ", "๐Ÿ™๏ธ", "๐Ÿš๏ธ", "๐Ÿ›๏ธ", "๐Ÿœ๏ธ", "๐Ÿ๏ธ", "๐Ÿž๏ธ", - "๐ŸŸ๏ธ", "๐Ÿ ", "๐Ÿก", "๐Ÿข", "๐Ÿฃ", "๐Ÿค", "๐Ÿฅ", "๐Ÿฆ", "๐Ÿจ", "๐Ÿฉ", - "๐Ÿช", "๐Ÿซ", "๐Ÿฌ", "๐Ÿญ", "๐Ÿฏ", "๐Ÿฐ", "๐Ÿ’ˆ", "๐Ÿ’’", "๐Ÿ’ง", "๐Ÿ’บ", - "๐Ÿ”ฅ", "๐Ÿ•‹", "๐Ÿ•Œ", "๐Ÿ•", "๐Ÿ•", "๐Ÿ•‘", "๐Ÿ•’", "๐Ÿ•“", "๐Ÿ•”", "๐Ÿ••", - "๐Ÿ•–", "๐Ÿ•—", "๐Ÿ•˜", "๐Ÿ•™", "๐Ÿ•š", "๐Ÿ•›", "๐Ÿ•œ", "๐Ÿ•", "๐Ÿ•ž", "๐Ÿ•Ÿ", - "๐Ÿ• ", "๐Ÿ•ก", "๐Ÿ•ข", "๐Ÿ•ฃ", "๐Ÿ•ค", "๐Ÿ•ฅ", "๐Ÿ•ฆ", "๐Ÿ•ง", "๐Ÿ•ฐ๏ธ", "๐Ÿ—บ๏ธ", - "๐Ÿ—ป", "๐Ÿ—ผ", "๐Ÿ—ฝ", "๐Ÿ—พ", "๐Ÿš€", "๐Ÿš", "๐Ÿš‚", "๐Ÿšƒ", "๐Ÿš„", "๐Ÿš…", - "๐Ÿš†", "๐Ÿš‡", "๐Ÿšˆ", "๐Ÿš‰", "๐ŸšŠ", "๐Ÿš‹", "๐ŸšŒ", "๐Ÿš", "๐ŸšŽ", "๐Ÿš", - "๐Ÿš", "๐Ÿš‘", "๐Ÿš’", "๐Ÿš“", "๐Ÿš”", "๐Ÿš•", "๐Ÿš–", "๐Ÿš—", "๐Ÿš˜", "๐Ÿš™", - "๐Ÿšš", "๐Ÿš›", "๐Ÿšœ", "๐Ÿš", "๐Ÿšž", "๐ŸšŸ", "๐Ÿš ", "๐Ÿšก", "๐Ÿšข", "๐Ÿšค", - "๐Ÿšฅ", "๐Ÿšฆ", "๐Ÿšง", "๐Ÿšจ", "๐Ÿšฒ", "๐Ÿ›Ž๏ธ", "๐Ÿ›‘", "๐Ÿ›•", "๐Ÿ›–", "๐Ÿ›ข๏ธ", - "๐Ÿ›ฃ๏ธ", "๐Ÿ›ค๏ธ", "๐Ÿ›ฅ๏ธ", "๐Ÿ›ฉ๏ธ", "๐Ÿ›ซ", "๐Ÿ›ฌ", "๐Ÿ›ฐ๏ธ", "๐Ÿ›ณ๏ธ", "๐Ÿ›ด", "๐Ÿ›ต", - "๐Ÿ›ถ", "๐Ÿ›ธ", "๐Ÿ›น", "๐Ÿ›บ", "๐Ÿ›ป", "๐Ÿ›ผ", "๐Ÿฆผ", "๐Ÿฆฝ", "๐Ÿงญ", "๐Ÿงฑ", - "๐Ÿงณ", "๐Ÿช‚", "๐Ÿช", "๐Ÿชจ", "๐Ÿชต", + "โŒš", "โŒ›", "โฐ", "โฑ๏ธ", "โฒ๏ธ", "โณ", "โ˜€๏ธ", "โ˜๏ธ", "โ˜‚๏ธ", "โ˜ƒ๏ธ", "โ˜„๏ธ", "โ˜”", "โ™จ๏ธ", "โš“", "โšก", "โ›„", "โ›…", "โ›ˆ๏ธ", + "โ›ฉ๏ธ", "โ›ช", "โ›ฐ๏ธ", "โ›ฑ๏ธ", "โ›ฒ", "โ›ด๏ธ", "โ›ต", "โ›บ", "โ›ฝ", "โœˆ๏ธ", "โ„๏ธ", "โญ", "๐ŸŒ€", "๐ŸŒ", "๐ŸŒ‚", "๐ŸŒƒ", "๐ŸŒ„", "๐ŸŒ…", + "๐ŸŒ†", "๐ŸŒ‡", "๐ŸŒˆ", "๐ŸŒ‰", "๐ŸŒŠ", "๐ŸŒ‹", "๐ŸŒŒ", "๐ŸŒ", "๐ŸŒŽ", "๐ŸŒ", "๐ŸŒ", "๐ŸŒ‘", "๐ŸŒ’", "๐ŸŒ“", "๐ŸŒ”", "๐ŸŒ•", "๐ŸŒ–", "๐ŸŒ—", + "๐ŸŒ˜", "๐ŸŒ™", "๐ŸŒš", "๐ŸŒ›", "๐ŸŒœ", "๐ŸŒ", "๐ŸŒž", "๐ŸŒŸ", "๐ŸŒ ", "๐ŸŒก๏ธ", "๐ŸŒค๏ธ", "๐ŸŒฅ๏ธ", "๐ŸŒฆ๏ธ", "๐ŸŒง๏ธ", "๐ŸŒจ๏ธ", "๐ŸŒฉ๏ธ", "๐ŸŒช๏ธ", "๐ŸŒซ๏ธ", + "๐ŸŒฌ๏ธ", "๐ŸŽ ", "๐ŸŽก", "๐ŸŽข", "๐ŸŽช", "๐Ÿ๏ธ", "๐ŸŽ๏ธ", "๐Ÿ”๏ธ", "๐Ÿ•๏ธ", "๐Ÿ–๏ธ", "๐Ÿ—๏ธ", "๐Ÿ˜๏ธ", "๐Ÿ™๏ธ", "๐Ÿš๏ธ", "๐Ÿ›๏ธ", "๐Ÿœ๏ธ", "๐Ÿ๏ธ", "๐Ÿž๏ธ", + "๐ŸŸ๏ธ", "๐Ÿ ", "๐Ÿก", "๐Ÿข", "๐Ÿฃ", "๐Ÿค", "๐Ÿฅ", "๐Ÿฆ", "๐Ÿจ", "๐Ÿฉ", "๐Ÿช", "๐Ÿซ", "๐Ÿฌ", "๐Ÿญ", "๐Ÿฏ", "๐Ÿฐ", "๐Ÿ’ˆ", "๐Ÿ’’", + "๐Ÿ’ง", "๐Ÿ’บ", "๐Ÿ”ฅ", "๐Ÿ•‹", "๐Ÿ•Œ", "๐Ÿ•", "๐Ÿ•", "๐Ÿ•‘", "๐Ÿ•’", "๐Ÿ•“", "๐Ÿ•”", "๐Ÿ••", "๐Ÿ•–", "๐Ÿ•—", "๐Ÿ•˜", "๐Ÿ•™", "๐Ÿ•š", "๐Ÿ•›", + "๐Ÿ•œ", "๐Ÿ•", "๐Ÿ•ž", "๐Ÿ•Ÿ", "๐Ÿ• ", "๐Ÿ•ก", "๐Ÿ•ข", "๐Ÿ•ฃ", "๐Ÿ•ค", "๐Ÿ•ฅ", "๐Ÿ•ฆ", "๐Ÿ•ง", "๐Ÿ•ฐ๏ธ", "๐Ÿ—บ๏ธ", "๐Ÿ—ป", "๐Ÿ—ผ", "๐Ÿ—ฝ", "๐Ÿ—พ", + "๐Ÿš€", "๐Ÿš", "๐Ÿš‚", "๐Ÿšƒ", "๐Ÿš„", "๐Ÿš…", "๐Ÿš†", "๐Ÿš‡", "๐Ÿšˆ", "๐Ÿš‰", "๐ŸšŠ", "๐Ÿš‹", "๐ŸšŒ", "๐Ÿš", "๐ŸšŽ", "๐Ÿš", "๐Ÿš", "๐Ÿš‘", + "๐Ÿš’", "๐Ÿš“", "๐Ÿš”", "๐Ÿš•", "๐Ÿš–", "๐Ÿš—", "๐Ÿš˜", "๐Ÿš™", "๐Ÿšš", "๐Ÿš›", "๐Ÿšœ", "๐Ÿš", "๐Ÿšž", "๐ŸšŸ", "๐Ÿš ", "๐Ÿšก", "๐Ÿšข", "๐Ÿšค", + "๐Ÿšฅ", "๐Ÿšฆ", "๐Ÿšง", "๐Ÿšจ", "๐Ÿšฒ", "๐Ÿ›Ž๏ธ", "๐Ÿ›‘", "๐Ÿ›•", "๐Ÿ›–", "๐Ÿ›ข๏ธ", "๐Ÿ›ฃ๏ธ", "๐Ÿ›ค๏ธ", "๐Ÿ›ฅ๏ธ", "๐Ÿ›ฉ๏ธ", "๐Ÿ›ซ", "๐Ÿ›ฌ", "๐Ÿ›ฐ๏ธ", "๐Ÿ›ณ๏ธ", + "๐Ÿ›ด", "๐Ÿ›ต", "๐Ÿ›ถ", "๐Ÿ›ธ", "๐Ÿ›น", "๐Ÿ›บ", "๐Ÿ›ป", "๐Ÿ›ผ", "๐Ÿฆผ", "๐Ÿฆฝ", "๐Ÿงญ", "๐Ÿงฑ", "๐Ÿงณ", "๐Ÿช‚", "๐Ÿช", "๐Ÿชจ", "๐Ÿชต", }); const auto activityEmojis = std::to_array({ - "โ™Ÿ๏ธ", "โ™ ๏ธ", "โ™ฃ๏ธ", "โ™ฅ๏ธ", "โ™ฆ๏ธ", "โšฝ", "โšพ", "โ›ณ", "โ›ธ๏ธ", "โœจ", "๐Ÿ€„", "๐Ÿƒ", - "๐ŸŽ€", "๐ŸŽ", "๐ŸŽƒ", "๐ŸŽ„", "๐ŸŽ†", "๐ŸŽ‡", "๐ŸŽˆ", "๐ŸŽ‰", "๐ŸŽŠ", "๐ŸŽ‹", "๐ŸŽ", "๐ŸŽŽ", - "๐ŸŽ", "๐ŸŽ", "๐ŸŽ‘", "๐ŸŽ–๏ธ", "๐ŸŽ—๏ธ", "๐ŸŽŸ๏ธ", "๐ŸŽฃ", "๐ŸŽจ", "๐ŸŽซ", "๐ŸŽญ", "๐ŸŽฎ", "๐ŸŽฏ", - "๐ŸŽฐ", "๐ŸŽฑ", "๐ŸŽฒ", "๐ŸŽณ", "๐ŸŽด", "๐ŸŽฝ", "๐ŸŽพ", "๐ŸŽฟ", "๐Ÿ€", "๐Ÿ…", "๐Ÿ†", "๐Ÿˆ", - "๐Ÿ‰", "๐Ÿ", "๐Ÿ", "๐Ÿ‘", "๐Ÿ’", "๐Ÿ“", "๐Ÿธ", "๐Ÿ”ฎ", "๐Ÿ•น๏ธ", "๐Ÿ–ผ๏ธ", "๐Ÿ›ท", "๐Ÿคฟ", - "๐Ÿฅ…", "๐Ÿฅ‡", "๐Ÿฅˆ", "๐Ÿฅ‰", "๐ŸฅŠ", "๐Ÿฅ‹", "๐ŸฅŒ", "๐Ÿฅ", "๐ŸฅŽ", "๐Ÿฅ", "๐Ÿงง", "๐Ÿงจ", - "๐Ÿงฉ", "๐Ÿงต", "๐Ÿงถ", "๐Ÿงธ", "๐Ÿงฟ", "๐Ÿช€", "๐Ÿช", "๐Ÿช„", "๐Ÿช…", "๐Ÿช†", "๐Ÿชก", "๐Ÿชข", + "โ™Ÿ๏ธ", "โ™ ๏ธ", "โ™ฃ๏ธ", "โ™ฅ๏ธ", "โ™ฆ๏ธ", "โšฝ", "โšพ", "โ›ณ", "โ›ธ๏ธ", "โœจ", "๐Ÿ€„", "๐Ÿƒ", "๐ŸŽ€", "๐ŸŽ", "๐ŸŽƒ", "๐ŸŽ„", "๐ŸŽ†", + "๐ŸŽ‡", "๐ŸŽˆ", "๐ŸŽ‰", "๐ŸŽŠ", "๐ŸŽ‹", "๐ŸŽ", "๐ŸŽŽ", "๐ŸŽ", "๐ŸŽ", "๐ŸŽ‘", "๐ŸŽ–๏ธ", "๐ŸŽ—๏ธ", "๐ŸŽŸ๏ธ", "๐ŸŽฃ", "๐ŸŽจ", "๐ŸŽซ", "๐ŸŽญ", + "๐ŸŽฎ", "๐ŸŽฏ", "๐ŸŽฐ", "๐ŸŽฑ", "๐ŸŽฒ", "๐ŸŽณ", "๐ŸŽด", "๐ŸŽฝ", "๐ŸŽพ", "๐ŸŽฟ", "๐Ÿ€", "๐Ÿ…", "๐Ÿ†", "๐Ÿˆ", "๐Ÿ‰", "๐Ÿ", "๐Ÿ", + "๐Ÿ‘", "๐Ÿ’", "๐Ÿ“", "๐Ÿธ", "๐Ÿ”ฎ", "๐Ÿ•น๏ธ", "๐Ÿ–ผ๏ธ", "๐Ÿ›ท", "๐Ÿคฟ", "๐Ÿฅ…", "๐Ÿฅ‡", "๐Ÿฅˆ", "๐Ÿฅ‰", "๐ŸฅŠ", "๐Ÿฅ‹", "๐ŸฅŒ", "๐Ÿฅ", + "๐ŸฅŽ", "๐Ÿฅ", "๐Ÿงง", "๐Ÿงจ", "๐Ÿงฉ", "๐Ÿงต", "๐Ÿงถ", "๐Ÿงธ", "๐Ÿงฟ", "๐Ÿช€", "๐Ÿช", "๐Ÿช„", "๐Ÿช…", "๐Ÿช†", "๐Ÿชก", "๐Ÿชข", }); const auto objectEmojis = std::to_array({ - "โŒจ๏ธ", "โ˜Ž๏ธ", "โš’๏ธ", "โš”๏ธ", "โš–๏ธ", "โš—๏ธ", "โš™๏ธ", "โšฐ๏ธ", "โšฑ๏ธ", "โ›๏ธ", - "โ›‘๏ธ", "โ›“๏ธ", "โœ‚๏ธ", "โœ‰๏ธ", "โœ๏ธ", "โœ’๏ธ", "๐ŸŽ’", "๐ŸŽ“", "๐ŸŽ™๏ธ", "๐ŸŽš๏ธ", - "๐ŸŽ›๏ธ", "๐ŸŽž๏ธ", "๐ŸŽค", "๐ŸŽฅ", "๐ŸŽง", "๐ŸŽฉ", "๐ŸŽฌ", "๐ŸŽต", "๐ŸŽถ", "๐ŸŽท", - "๐ŸŽธ", "๐ŸŽน", "๐ŸŽบ", "๐ŸŽป", "๐ŸŽผ", "๐Ÿฎ", "๐Ÿท๏ธ", "๐Ÿน", "๐Ÿ‘‘", "๐Ÿ‘’", - "๐Ÿ‘“", "๐Ÿ‘”", "๐Ÿ‘•", "๐Ÿ‘–", "๐Ÿ‘—", "๐Ÿ‘˜", "๐Ÿ‘™", "๐Ÿ‘š", "๐Ÿ‘›", "๐Ÿ‘œ", - "๐Ÿ‘", "๐Ÿ‘ž", "๐Ÿ‘Ÿ", "๐Ÿ‘ ", "๐Ÿ‘ก", "๐Ÿ‘ข", "๐Ÿ’„", "๐Ÿ’‰", "๐Ÿ’Š", "๐Ÿ’", - "๐Ÿ’Ž", "๐Ÿ’ก", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿ’ด", "๐Ÿ’ต", "๐Ÿ’ถ", "๐Ÿ’ท", "๐Ÿ’ธ", "๐Ÿ’น", - "๐Ÿ’ป", "๐Ÿ’ผ", "๐Ÿ’ฝ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“€", "๐Ÿ“", "๐Ÿ“‚", "๐Ÿ“ƒ", "๐Ÿ“„", - "๐Ÿ“…", "๐Ÿ“†", "๐Ÿ“‡", "๐Ÿ“ˆ", "๐Ÿ“‰", "๐Ÿ“Š", "๐Ÿ“‹", "๐Ÿ“Œ", "๐Ÿ“", "๐Ÿ“Ž", - "๐Ÿ“", "๐Ÿ“", "๐Ÿ“‘", "๐Ÿ“’", "๐Ÿ““", "๐Ÿ“”", "๐Ÿ“•", "๐Ÿ“–", "๐Ÿ“—", "๐Ÿ“˜", - "๐Ÿ“™", "๐Ÿ“š", "๐Ÿ“œ", "๐Ÿ“", "๐Ÿ“ž", "๐Ÿ“Ÿ", "๐Ÿ“ ", "๐Ÿ“ก", "๐Ÿ“ข", "๐Ÿ“ฃ", - "๐Ÿ“ค", "๐Ÿ“ฅ", "๐Ÿ“ฆ", "๐Ÿ“ง", "๐Ÿ“จ", "๐Ÿ“ฉ", "๐Ÿ“ช", "๐Ÿ“ซ", "๐Ÿ“ฌ", "๐Ÿ“ญ", - "๐Ÿ“ฎ", "๐Ÿ“ฏ", "๐Ÿ“ฐ", "๐Ÿ“ฑ", "๐Ÿ“ฒ", "๐Ÿ“ท", "๐Ÿ“ธ", "๐Ÿ“น", "๐Ÿ“บ", "๐Ÿ“ป", - "๐Ÿ“ผ", "๐Ÿ“ฝ๏ธ", "๐Ÿ“ฟ", "๐Ÿ”‡", "๐Ÿ”ˆ", "๐Ÿ”‰", "๐Ÿ”Š", "๐Ÿ”‹", "๐Ÿ”Œ", "๐Ÿ”", - "๐Ÿ”Ž", "๐Ÿ”", "๐Ÿ”", "๐Ÿ”‘", "๐Ÿ”’", "๐Ÿ”“", "๐Ÿ””", "๐Ÿ”•", "๐Ÿ”–", "๐Ÿ”—", - "๐Ÿ”ฆ", "๐Ÿ”ง", "๐Ÿ”จ", "๐Ÿ”ฉ", "๐Ÿ”ซ", "๐Ÿ”ฌ", "๐Ÿ”ญ", "๐Ÿ•ฏ๏ธ", "๐Ÿ•ถ๏ธ", "๐Ÿ–‡๏ธ", - "๐Ÿ–Š๏ธ", "๐Ÿ–‹๏ธ", "๐Ÿ–Œ๏ธ", "๐Ÿ–๏ธ", "๐Ÿ–ฅ๏ธ", "๐Ÿ–จ๏ธ", "๐Ÿ–ฑ๏ธ", "๐Ÿ–ฒ๏ธ", "๐Ÿ—‚๏ธ", "๐Ÿ—ƒ๏ธ", - "๐Ÿ—„๏ธ", "๐Ÿ—‘๏ธ", "๐Ÿ—’๏ธ", "๐Ÿ—“๏ธ", "๐Ÿ—œ๏ธ", "๐Ÿ—๏ธ", "๐Ÿ—ž๏ธ", "๐Ÿ—ก๏ธ", "๐Ÿ—ณ๏ธ", "๐Ÿ—ฟ", - "๐Ÿšช", "๐Ÿšฌ", "๐Ÿšฝ", "๐Ÿšฟ", "๐Ÿ›", "๐Ÿ›‹๏ธ", "๐Ÿ›๏ธ", "๐Ÿ›๏ธ", "๐Ÿ›’", "๐Ÿ›—", - "๐Ÿ› ๏ธ", "๐Ÿ›ก๏ธ", "๐Ÿฅ", "๐Ÿฅป", "๐Ÿฅผ", "๐Ÿฅฝ", "๐Ÿฅพ", "๐Ÿฅฟ", "๐Ÿฆฏ", "๐Ÿฆบ", - "๐Ÿงข", "๐Ÿงฃ", "๐Ÿงค", "๐Ÿงฅ", "๐Ÿงฆ", "๐Ÿงช", "๐Ÿงซ", "๐Ÿงฌ", "๐Ÿงฎ", "๐Ÿงฏ", - "๐Ÿงฐ", "๐Ÿงฒ", "๐Ÿงด", "๐Ÿงท", "๐Ÿงน", "๐Ÿงบ", "๐Ÿงป", "๐Ÿงผ", "๐Ÿงฝ", "๐Ÿงพ", - "๐Ÿฉฐ", "๐Ÿฉฑ", "๐Ÿฉฒ", "๐Ÿฉณ", "๐Ÿฉด", "๐Ÿฉธ", "๐Ÿฉน", "๐Ÿฉบ", "๐Ÿชƒ", "๐Ÿช‘", - "๐Ÿช’", "๐Ÿช“", "๐Ÿช”", "๐Ÿช•", "๐Ÿช–", "๐Ÿช—", "๐Ÿช˜", "๐Ÿช™", "๐Ÿชš", "๐Ÿช›", - "๐Ÿชœ", "๐Ÿช", "๐Ÿชž", "๐ŸชŸ", "๐Ÿช ", "๐Ÿชฃ", "๐Ÿชค", "๐Ÿชฅ", "๐Ÿชฆ", "๐Ÿชง", + "โŒจ๏ธ", "โ˜Ž๏ธ", "โš’๏ธ", "โš”๏ธ", "โš–๏ธ", "โš—๏ธ", "โš™๏ธ", "โšฐ๏ธ", "โšฑ๏ธ", "โ›๏ธ", "โ›‘๏ธ", "โ›“๏ธ", "โœ‚๏ธ", "โœ‰๏ธ", "โœ๏ธ", "โœ’๏ธ", "๐ŸŽ’", "๐ŸŽ“", + "๐ŸŽ™๏ธ", "๐ŸŽš๏ธ", "๐ŸŽ›๏ธ", "๐ŸŽž๏ธ", "๐ŸŽค", "๐ŸŽฅ", "๐ŸŽง", "๐ŸŽฉ", "๐ŸŽฌ", "๐ŸŽต", "๐ŸŽถ", "๐ŸŽท", "๐ŸŽธ", "๐ŸŽน", "๐ŸŽบ", "๐ŸŽป", "๐ŸŽผ", "๐Ÿฎ", + "๐Ÿท๏ธ", "๐Ÿน", "๐Ÿ‘‘", "๐Ÿ‘’", "๐Ÿ‘“", "๐Ÿ‘”", "๐Ÿ‘•", "๐Ÿ‘–", "๐Ÿ‘—", "๐Ÿ‘˜", "๐Ÿ‘™", "๐Ÿ‘š", "๐Ÿ‘›", "๐Ÿ‘œ", "๐Ÿ‘", "๐Ÿ‘ž", "๐Ÿ‘Ÿ", "๐Ÿ‘ ", + "๐Ÿ‘ก", "๐Ÿ‘ข", "๐Ÿ’„", "๐Ÿ’‰", "๐Ÿ’Š", "๐Ÿ’", "๐Ÿ’Ž", "๐Ÿ’ก", "๐Ÿ’ฐ", "๐Ÿ’ณ", "๐Ÿ’ด", "๐Ÿ’ต", "๐Ÿ’ถ", "๐Ÿ’ท", "๐Ÿ’ธ", "๐Ÿ’น", "๐Ÿ’ป", "๐Ÿ’ผ", + "๐Ÿ’ฝ", "๐Ÿ’พ", "๐Ÿ’ฟ", "๐Ÿ“€", "๐Ÿ“", "๐Ÿ“‚", "๐Ÿ“ƒ", "๐Ÿ“„", "๐Ÿ“…", "๐Ÿ“†", "๐Ÿ“‡", "๐Ÿ“ˆ", "๐Ÿ“‰", "๐Ÿ“Š", "๐Ÿ“‹", "๐Ÿ“Œ", "๐Ÿ“", "๐Ÿ“Ž", + "๐Ÿ“", "๐Ÿ“", "๐Ÿ“‘", "๐Ÿ“’", "๐Ÿ““", "๐Ÿ“”", "๐Ÿ“•", "๐Ÿ“–", "๐Ÿ“—", "๐Ÿ“˜", "๐Ÿ“™", "๐Ÿ“š", "๐Ÿ“œ", "๐Ÿ“", "๐Ÿ“ž", "๐Ÿ“Ÿ", "๐Ÿ“ ", "๐Ÿ“ก", + "๐Ÿ“ข", "๐Ÿ“ฃ", "๐Ÿ“ค", "๐Ÿ“ฅ", "๐Ÿ“ฆ", "๐Ÿ“ง", "๐Ÿ“จ", "๐Ÿ“ฉ", "๐Ÿ“ช", "๐Ÿ“ซ", "๐Ÿ“ฌ", "๐Ÿ“ญ", "๐Ÿ“ฎ", "๐Ÿ“ฏ", "๐Ÿ“ฐ", "๐Ÿ“ฑ", "๐Ÿ“ฒ", "๐Ÿ“ท", + "๐Ÿ“ธ", "๐Ÿ“น", "๐Ÿ“บ", "๐Ÿ“ป", "๐Ÿ“ผ", "๐Ÿ“ฝ๏ธ", "๐Ÿ“ฟ", "๐Ÿ”‡", "๐Ÿ”ˆ", "๐Ÿ”‰", "๐Ÿ”Š", "๐Ÿ”‹", "๐Ÿ”Œ", "๐Ÿ”", "๐Ÿ”Ž", "๐Ÿ”", "๐Ÿ”", "๐Ÿ”‘", + "๐Ÿ”’", "๐Ÿ”“", "๐Ÿ””", "๐Ÿ”•", "๐Ÿ”–", "๐Ÿ”—", "๐Ÿ”ฆ", "๐Ÿ”ง", "๐Ÿ”จ", "๐Ÿ”ฉ", "๐Ÿ”ซ", "๐Ÿ”ฌ", "๐Ÿ”ญ", "๐Ÿ•ฏ๏ธ", "๐Ÿ•ถ๏ธ", "๐Ÿ–‡๏ธ", "๐Ÿ–Š๏ธ", "๐Ÿ–‹๏ธ", + "๐Ÿ–Œ๏ธ", "๐Ÿ–๏ธ", "๐Ÿ–ฅ๏ธ", "๐Ÿ–จ๏ธ", "๐Ÿ–ฑ๏ธ", "๐Ÿ–ฒ๏ธ", "๐Ÿ—‚๏ธ", "๐Ÿ—ƒ๏ธ", "๐Ÿ—„๏ธ", "๐Ÿ—‘๏ธ", "๐Ÿ—’๏ธ", "๐Ÿ—“๏ธ", "๐Ÿ—œ๏ธ", "๐Ÿ—๏ธ", "๐Ÿ—ž๏ธ", "๐Ÿ—ก๏ธ", "๐Ÿ—ณ๏ธ", "๐Ÿ—ฟ", + "๐Ÿšช", "๐Ÿšฌ", "๐Ÿšฝ", "๐Ÿšฟ", "๐Ÿ›", "๐Ÿ›‹๏ธ", "๐Ÿ›๏ธ", "๐Ÿ›๏ธ", "๐Ÿ›’", "๐Ÿ›—", "๐Ÿ› ๏ธ", "๐Ÿ›ก๏ธ", "๐Ÿฅ", "๐Ÿฅป", "๐Ÿฅผ", "๐Ÿฅฝ", "๐Ÿฅพ", "๐Ÿฅฟ", + "๐Ÿฆฏ", "๐Ÿฆบ", "๐Ÿงข", "๐Ÿงฃ", "๐Ÿงค", "๐Ÿงฅ", "๐Ÿงฆ", "๐Ÿงช", "๐Ÿงซ", "๐Ÿงฌ", "๐Ÿงฎ", "๐Ÿงฏ", "๐Ÿงฐ", "๐Ÿงฒ", "๐Ÿงด", "๐Ÿงท", "๐Ÿงน", "๐Ÿงบ", + "๐Ÿงป", "๐Ÿงผ", "๐Ÿงฝ", "๐Ÿงพ", "๐Ÿฉฐ", "๐Ÿฉฑ", "๐Ÿฉฒ", "๐Ÿฉณ", "๐Ÿฉด", "๐Ÿฉธ", "๐Ÿฉน", "๐Ÿฉบ", "๐Ÿชƒ", "๐Ÿช‘", "๐Ÿช’", "๐Ÿช“", "๐Ÿช”", "๐Ÿช•", + "๐Ÿช–", "๐Ÿช—", "๐Ÿช˜", "๐Ÿช™", "๐Ÿชš", "๐Ÿช›", "๐Ÿชœ", "๐Ÿช", "๐Ÿชž", "๐ŸชŸ", "๐Ÿช ", "๐Ÿชฃ", "๐Ÿชค", "๐Ÿชฅ", "๐Ÿชฆ", "๐Ÿชง", }); const auto symbolEmojis = std::to_array({ - "#๏ธโƒฃ", "*๏ธโƒฃ", "0๏ธโƒฃ", "1๏ธโƒฃ", "2๏ธโƒฃ", "3๏ธโƒฃ", "4๏ธโƒฃ", "5๏ธโƒฃ", "6๏ธโƒฃ", "7๏ธโƒฃ", - "8๏ธโƒฃ", "9๏ธโƒฃ", "ยฉ๏ธ", "ยฎ๏ธ", "โ€ผ๏ธ", "โ‰๏ธ", "โ„ข๏ธ", "โ„น๏ธ", "โ†”๏ธ", "โ†•๏ธ", - "โ†–๏ธ", "โ†—๏ธ", "โ†˜๏ธ", "โ†™๏ธ", "โ†ฉ๏ธ", "โ†ช๏ธ", "โ๏ธ", "โฉ", "โช", "โซ", - "โฌ", "โญ๏ธ", "โฎ๏ธ", "โฏ๏ธ", "โธ๏ธ", "โน๏ธ", "โบ๏ธ", "โ“‚๏ธ", "โ–ช๏ธ", "โ–ซ๏ธ", - "โ–ถ๏ธ", "โ—€๏ธ", "โ—ป๏ธ", "โ—ผ๏ธ", "โ—ฝ", "โ—พ", "โ˜‘๏ธ", "โ˜ข๏ธ", "โ˜ฃ๏ธ", "โ˜ฆ๏ธ", - "โ˜ช๏ธ", "โ˜ฎ๏ธ", "โ˜ฏ๏ธ", "โ˜ธ๏ธ", "โ™€๏ธ", "โ™‚๏ธ", "โ™ˆ", "โ™‰", "โ™Š", "โ™‹", - "โ™Œ", "โ™", "โ™Ž", "โ™", "โ™", "โ™‘", "โ™’", "โ™“", "โ™ป๏ธ", "โ™พ๏ธ", - "โ™ฟ", "โš•๏ธ", "โš›๏ธ", "โšœ๏ธ", "โš ๏ธ", "โšง๏ธ", "โšช", "โšซ", "โ›Ž", "โ›”", - "โœ…", "โœ”๏ธ", "โœ–๏ธ", "โœ๏ธ", "โœก๏ธ", "โœณ๏ธ", "โœด๏ธ", "โ‡๏ธ", "โŒ", "โŽ", - "โ“", "โ”", "โ•", "โ—", "โž•", "โž–", "โž—", "โžก๏ธ", "โžฐ", "โžฟ", - "โคด๏ธ", "โคต๏ธ", "โฌ…๏ธ", "โฌ†๏ธ", "โฌ‡๏ธ", "โฌ›", "โฌœ", "โญ•", "ใ€ฐ๏ธ", "ใ€ฝ๏ธ", - "ใŠ—๏ธ", "ใŠ™๏ธ", "๐Ÿ…ฐ๏ธ", "๐Ÿ…ฑ๏ธ", "๐Ÿ…พ๏ธ", "๐Ÿ…ฟ๏ธ", "๐Ÿ†Ž", "๐Ÿ†‘", "๐Ÿ†’", "๐Ÿ†“", - "๐Ÿ†”", "๐Ÿ†•", "๐Ÿ†–", "๐Ÿ†—", "๐Ÿ†˜", "๐Ÿ†™", "๐Ÿ†š", "๐Ÿˆ", "๐Ÿˆ‚๏ธ", "๐Ÿˆš", - "๐Ÿˆฏ", "๐Ÿˆฒ", "๐Ÿˆณ", "๐Ÿˆด", "๐Ÿˆต", "๐Ÿˆถ", "๐Ÿˆท๏ธ", "๐Ÿˆธ", "๐Ÿˆน", "๐Ÿˆบ", - "๐Ÿ‰", "๐Ÿ‰‘", "๐ŸŽฆ", "๐Ÿง", "๐Ÿ’ ", "๐Ÿ’ฑ", "๐Ÿ’ฒ", "๐Ÿ“›", "๐Ÿ“ณ", "๐Ÿ“ด", - "๐Ÿ“ต", "๐Ÿ“ถ", "๐Ÿ”€", "๐Ÿ”", "๐Ÿ”‚", "๐Ÿ”ƒ", "๐Ÿ”„", "๐Ÿ”…", "๐Ÿ”†", "๐Ÿ”˜", - "๐Ÿ”™", "๐Ÿ”š", "๐Ÿ”›", "๐Ÿ”œ", "๐Ÿ”", "๐Ÿ”ž", "๐Ÿ”Ÿ", "๐Ÿ” ", "๐Ÿ”ก", "๐Ÿ”ข", - "๐Ÿ”ฃ", "๐Ÿ”ค", "๐Ÿ”ฏ", "๐Ÿ”ฐ", "๐Ÿ”ฑ", "๐Ÿ”ฒ", "๐Ÿ”ณ", "๐Ÿ”ด", "๐Ÿ”ต", "๐Ÿ”ถ", - "๐Ÿ”ท", "๐Ÿ”ธ", "๐Ÿ”น", "๐Ÿ”บ", "๐Ÿ”ป", "๐Ÿ”ผ", "๐Ÿ”ฝ", "๐Ÿ•‰๏ธ", "๐Ÿ•Ž", "๐Ÿšซ", - "๐Ÿšญ", "๐Ÿšฎ", "๐Ÿšฏ", "๐Ÿšฐ", "๐Ÿšฑ", "๐Ÿšณ", "๐Ÿšท", "๐Ÿšธ", "๐Ÿšน", "๐Ÿšบ", - "๐Ÿšป", "๐Ÿšผ", "๐Ÿšพ", "๐Ÿ›‚", "๐Ÿ›ƒ", "๐Ÿ›„", "๐Ÿ›…", "๐Ÿ›", "๐ŸŸ ", "๐ŸŸก", - "๐ŸŸข", "๐ŸŸฃ", "๐ŸŸค", "๐ŸŸฅ", "๐ŸŸฆ", "๐ŸŸง", "๐ŸŸจ", "๐ŸŸฉ", "๐ŸŸช", "๐ŸŸซ", + "#๏ธโƒฃ", "*๏ธโƒฃ", "0๏ธโƒฃ", "1๏ธโƒฃ", "2๏ธโƒฃ", "3๏ธโƒฃ", "4๏ธโƒฃ", "5๏ธโƒฃ", "6๏ธโƒฃ", "7๏ธโƒฃ", "8๏ธโƒฃ", "9๏ธโƒฃ", "ยฉ๏ธ", "ยฎ๏ธ", "โ€ผ๏ธ", "โ‰๏ธ", "โ„ข๏ธ", "โ„น๏ธ", "โ†”๏ธ", + "โ†•๏ธ", "โ†–๏ธ", "โ†—๏ธ", "โ†˜๏ธ", "โ†™๏ธ", "โ†ฉ๏ธ", "โ†ช๏ธ", "โ๏ธ", "โฉ", "โช", "โซ", "โฌ", "โญ๏ธ", "โฎ๏ธ", "โฏ๏ธ", "โธ๏ธ", "โน๏ธ", "โบ๏ธ", "โ“‚๏ธ", + "โ–ช๏ธ", "โ–ซ๏ธ", "โ–ถ๏ธ", "โ—€๏ธ", "โ—ป๏ธ", "โ—ผ๏ธ", "โ—ฝ", "โ—พ", "โ˜‘๏ธ", "โ˜ข๏ธ", "โ˜ฃ๏ธ", "โ˜ฆ๏ธ", "โ˜ช๏ธ", "โ˜ฎ๏ธ", "โ˜ฏ๏ธ", "โ˜ธ๏ธ", "โ™€๏ธ", "โ™‚๏ธ", "โ™ˆ", + "โ™‰", "โ™Š", "โ™‹", "โ™Œ", "โ™", "โ™Ž", "โ™", "โ™", "โ™‘", "โ™’", "โ™“", "โ™ป๏ธ", "โ™พ๏ธ", "โ™ฟ", "โš•๏ธ", "โš›๏ธ", "โšœ๏ธ", "โš ๏ธ", "โšง๏ธ", + "โšช", "โšซ", "โ›Ž", "โ›”", "โœ…", "โœ”๏ธ", "โœ–๏ธ", "โœ๏ธ", "โœก๏ธ", "โœณ๏ธ", "โœด๏ธ", "โ‡๏ธ", "โŒ", "โŽ", "โ“", "โ”", "โ•", "โ—", "โž•", + "โž–", "โž—", "โžก๏ธ", "โžฐ", "โžฟ", "โคด๏ธ", "โคต๏ธ", "โฌ…๏ธ", "โฌ†๏ธ", "โฌ‡๏ธ", "โฌ›", "โฌœ", "โญ•", "ใ€ฐ๏ธ", "ใ€ฝ๏ธ", "ใŠ—๏ธ", "ใŠ™๏ธ", "๐Ÿ…ฐ๏ธ", "๐Ÿ…ฑ๏ธ", + "๐Ÿ…พ๏ธ", "๐Ÿ…ฟ๏ธ", "๐Ÿ†Ž", "๐Ÿ†‘", "๐Ÿ†’", "๐Ÿ†“", "๐Ÿ†”", "๐Ÿ†•", "๐Ÿ†–", "๐Ÿ†—", "๐Ÿ†˜", "๐Ÿ†™", "๐Ÿ†š", "๐Ÿˆ", "๐Ÿˆ‚๏ธ", "๐Ÿˆš", "๐Ÿˆฏ", "๐Ÿˆฒ", "๐Ÿˆณ", + "๐Ÿˆด", "๐Ÿˆต", "๐Ÿˆถ", "๐Ÿˆท๏ธ", "๐Ÿˆธ", "๐Ÿˆน", "๐Ÿˆบ", "๐Ÿ‰", "๐Ÿ‰‘", "๐ŸŽฆ", "๐Ÿง", "๐Ÿ’ ", "๐Ÿ’ฑ", "๐Ÿ’ฒ", "๐Ÿ“›", "๐Ÿ“ณ", "๐Ÿ“ด", "๐Ÿ“ต", "๐Ÿ“ถ", + "๐Ÿ”€", "๐Ÿ”", "๐Ÿ”‚", "๐Ÿ”ƒ", "๐Ÿ”„", "๐Ÿ”…", "๐Ÿ”†", "๐Ÿ”˜", "๐Ÿ”™", "๐Ÿ”š", "๐Ÿ”›", "๐Ÿ”œ", "๐Ÿ”", "๐Ÿ”ž", "๐Ÿ”Ÿ", "๐Ÿ” ", "๐Ÿ”ก", "๐Ÿ”ข", "๐Ÿ”ฃ", + "๐Ÿ”ค", "๐Ÿ”ฏ", "๐Ÿ”ฐ", "๐Ÿ”ฑ", "๐Ÿ”ฒ", "๐Ÿ”ณ", "๐Ÿ”ด", "๐Ÿ”ต", "๐Ÿ”ถ", "๐Ÿ”ท", "๐Ÿ”ธ", "๐Ÿ”น", "๐Ÿ”บ", "๐Ÿ”ป", "๐Ÿ”ผ", "๐Ÿ”ฝ", "๐Ÿ•‰๏ธ", "๐Ÿ•Ž", "๐Ÿšซ", + "๐Ÿšญ", "๐Ÿšฎ", "๐Ÿšฏ", "๐Ÿšฐ", "๐Ÿšฑ", "๐Ÿšณ", "๐Ÿšท", "๐Ÿšธ", "๐Ÿšน", "๐Ÿšบ", "๐Ÿšป", "๐Ÿšผ", "๐Ÿšพ", "๐Ÿ›‚", "๐Ÿ›ƒ", "๐Ÿ›„", "๐Ÿ›…", "๐Ÿ›", "๐ŸŸ ", + "๐ŸŸก", "๐ŸŸข", "๐ŸŸฃ", "๐ŸŸค", "๐ŸŸฅ", "๐ŸŸฆ", "๐ŸŸง", "๐ŸŸจ", "๐ŸŸฉ", "๐ŸŸช", "๐ŸŸซ", }); const auto flagEmojis = std::to_array({ @@ -924,4 +878,20 @@ const auto httpResponseHeaders = std::to_array({ "Warning", }); +const auto jwtAlgorithms = std::to_array({ + "HS256", + "HS384", + "HS512", + "RS256", + "RS384", + "RS512", + "ES256", + "ES384", + "ES512", + "PS256", + "PS384", + "PS512", + "none", +}); + } diff --git a/tests/modules/internet_test.cpp b/tests/modules/internet_test.cpp index 64ac72b3d..11f2caf71 100644 --- a/tests/modules/internet_test.cpp +++ b/tests/modules/internet_test.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -803,3 +804,24 @@ TEST_F(InternetTest, shouldGenerateAnonymousUsernameWithMaxLength) ASSERT_EQ(generatedUsername.length(), 20); } + +TEST_F(InternetTest, shouldGenerateJwtToken) +{ + std::regex pattern(R"([A-Za-z0-9-_]+\.[A-Za-z0-9-_]+\.[A-Za-z0-9-_]+)"); + const std::map header = {{"alg", "HS256"}, {"typ", "JWT"}}; + const std::map payload = {{"sub", "1234567890"}, {"name", "John Doe"}, {"admin", "true"}}; + const auto refDate = std::to_string(std::chrono::system_clock::to_time_t(std::chrono::system_clock::now())); + + ASSERT_TRUE(std::regex_match(getJWTToken(), pattern)); + ASSERT_TRUE(std::regex_match(getJWTToken(header), pattern)); + ASSERT_TRUE(std::regex_match(getJWTToken(header, payload), pattern)); + ASSERT_TRUE(std::regex_match(getJWTToken(header, payload, refDate), pattern)); +} + +TEST_F(InternetTest, shouldGenerateJWTAlgorithm) +{ + const auto generatedJWTAlgorythm = getJWTAlgorithm(); + + ASSERT_TRUE(std::ranges::any_of(jwtAlgorithms, [generatedJWTAlgorythm](const std::string_view& JWTAlgorythm) + { return generatedJWTAlgorythm == JWTAlgorythm; })); +}