# HG changeset patch # User David Demelier # Date 1646559230 -3600 # Node ID a388a6193131a454d127c9763f8de37727ccc0b2 # Parent 47ed24577389758b2cc25079aee598031a4ea531 plugin links: rewrite in Javascript diff -r 47ed24577389 -r a388a6193131 CHANGES.md --- a/CHANGES.md Fri Mar 04 20:31:04 2022 +0100 +++ b/CHANGES.md Sun Mar 06 10:33:50 2022 +0100 @@ -6,6 +6,18 @@ - Add `irc_bot_pollable_add` to insert a custom interface into the main irccd loop. +- A new option `IRCCD_WITH_HTTP` has been added to accommodate the new curl + dependency for `Irccd.Http` API. + +javascript API +-------------- + +- Brand new asynchronous `Irccd.Http` API. + +plugins +------- + +- links: rewritten in Javascript using the brand new `Irccd.Http` API. irccd 4.0.1 2022-02-07 ====================== diff -r 47ed24577389 -r a388a6193131 INSTALL.md --- a/INSTALL.md Fri Mar 04 20:31:04 2022 +0100 +++ b/INSTALL.md Sun Mar 06 10:33:50 2022 +0100 @@ -15,7 +15,7 @@ Optional runtime dependencies: - [OpenSSL][]: Used for SSL connections to IRC servers (recommended). -- [CURL][]: Required for the links plugin. +- [CURL][]: Required for the Http Javascript API (and links plugin).. Basic installation ------------------ diff -r 47ed24577389 -r a388a6193131 irccd/jsapi-http.c --- a/irccd/jsapi-http.c Fri Mar 04 20:31:04 2022 +0100 +++ b/irccd/jsapi-http.c Sun Mar 06 10:33:50 2022 +0100 @@ -106,6 +106,7 @@ CURLPROTO_HTTP | CURLPROTO_HTTPS); curl_easy_setopt(op->curl, CURLOPT_WRITEFUNCTION, op_write); curl_easy_setopt(op->curl, CURLOPT_WRITEDATA, op); + curl_easy_setopt(op->curl, CURLOPT_FOLLOWLOCATION, 1L); return op; diff -r 47ed24577389 -r a388a6193131 plugins/links/CMakeLists.txt --- a/plugins/links/CMakeLists.txt Fri Mar 04 20:31:04 2022 +0100 +++ b/plugins/links/CMakeLists.txt Sun Mar 06 10:33:50 2022 +0100 @@ -18,11 +18,8 @@ project(plugin-links) -find_package(CURL REQUIRED) - -irccd_define_native_plugin( +irccd_define_javascript_plugin( NAME links + SCRIPT ${plugin-links_SOURCE_DIR}/links.js MAN ${plugin-links_SOURCE_DIR}/links.7 - SOURCES ${plugin-links_SOURCE_DIR}/links.c - LIBRARIES CURL::libcurl ) diff -r 47ed24577389 -r a388a6193131 plugins/links/links.c --- a/plugins/links/links.c Fri Mar 04 20:31:04 2022 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,443 +0,0 @@ -/* - * links.c -- links plugin - * - * Copyright (c) 2013-2022 David Demelier - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include - -/* - * Since most websites are now bloated, we need a very large page size to - * analyse. Use 5MB for now. - */ -#define PAGE_MAX 5242880 - -struct req { - CURL *curl; - CURLM *multi; - struct irc_server *server; - struct irc_pollable pollable; - int status; - char *link; - char *chan; - char *nickname; - char *origin; - FILE *fp; - char buf[]; -}; - -enum { - TPL_INFO -}; - -static unsigned long timeout = 3; - -static char templates[][512] = { - [TPL_INFO] = "link from #{nickname}: #{title}" -}; - -static const struct { - const char *key; - int repl; -} entities[] = { - { "quot", '"' }, - { "amp", '&' }, - { "apos", '\'' }, - { "lt", '<' }, - { "gt", '>' }, - { NULL, 0 } -}; - -static size_t -callback(char *ptr, size_t size, size_t nmemb, struct req *req) -{ - fprintf(req->fp, "%.*s", (int)(size * nmemb), ptr); - - if (feof(req->fp) || ferror(req->fp)) - return 0; - - return size * nmemb; -} - -static char * -parse(struct req *req) -{ - regex_t regex; - regmatch_t match[2]; - char *ret = NULL; - - if (regcomp(®ex, "([^<]+)<\\/title>", REG_EXTENDED | REG_ICASE) != 0) - return NULL; - - if (regexec(®ex, req->buf, 2, match, 0) == 0) { - ret = &req->buf[match[1].rm_so]; - ret[match[1].rm_eo - match[1].rm_so] = '\0'; - } - - regfree(®ex); - - return ret; -} - -static int -find_entity(const char *key) -{ - for (size_t i = 0; entities[i].key; ++i) - if (strcmp(entities[i].key, key) == 0) - return entities[i].repl; - - return EOF; -} - -static const char * -untitle(char *title) -{ - static char ret[256] = {0}; - char *save; - int repl; - FILE *fp = NULL; - - if (!(fp = fmemopen(ret, sizeof (ret) - 1, "w"))) - goto fallback; - - for (char *p = title; *p; ) { - /* Standard character. */ - if (*p != '&') { - if (fputc(*p++, fp) == EOF) - goto fallback; - - continue; - } - - /* HTML entity. */ - save = ++p; - - while (*p && *p != ';') - ++p; - - /* Found an entity. */ - if (*p == ';') { - *p++ = '\0'; - - if ((repl = find_entity(save)) != EOF) - fputc(repl, fp); - } - } - - fclose(fp); - - return ret; - -fallback: - if (fp) - fclose(fp); - - return title; -} - -static const char * -fmt(const struct req *req, char *title) -{ - static char line[IRC_MESSAGE_LEN]; - - struct irc_subst subst = { - .time = time(NULL), - .flags = IRC_SUBST_DATE | IRC_SUBST_KEYWORDS | IRC_SUBST_IRC_ATTRS, - .keywords = (const struct irc_subst_keyword []) { - { "channel", req->chan }, - { "nickname", req->nickname }, - { "origin", req->origin }, - { "server", req->server->name }, - { "title", untitle(title) } - }, - .keywordsz = 5 - }; - - irc_subst(line, sizeof (line), templates[TPL_INFO], &subst); - - return line; -} - -static void -complete(struct req *req) -{ - char *title; - - if ((title = parse(req))) - irc_server_message(req->server, req->chan, fmt(req, title)); -} - -static void -req_finish(struct req *req) -{ - if (!req) - return; - - if (req->server) - irc_server_decref(req->server); - - if (req->curl) { - if (req->multi) - curl_multi_remove_handle(req->multi, req->curl); - - curl_easy_cleanup(req->curl); - } - if (req->multi) - curl_multi_cleanup(req->multi); - - if (req->fp) - fclose(req->fp); - - free(req->link); - free(req->chan); - free(req->nickname); - free(req->origin); - free(req); -} - -static int -pollable_fd(void *data) -{ - struct req *r = data; - fd_set in, out, exc; - int fd = 0; - - FD_ZERO(&in); - FD_ZERO(&out); - FD_ZERO(&exc); - - curl_multi_fdset(r->multi, &in, &out, &exc, &fd); - - return fd; -} - -static void -pollable_want(int *frecv, int *fsend, void *data) -{ - struct req *r = data; - fd_set in, out, exc; - int maxfd = 0; - - FD_ZERO(&in); - FD_ZERO(&out); - FD_ZERO(&exc); - - curl_multi_fdset(r->multi, &in, &out, &exc, &maxfd); - - if (FD_ISSET(maxfd, &in)) - *frecv = 1; - if (FD_ISSET(maxfd, &out)) - *fsend = 1; -} - -static int -pollable_sync(int frecv, int fsend, void *data) -{ - (void)frecv; - (void)fsend; - - CURLMsg *msg; - struct req *r = data; - int pending, msgsz; - - /* - * CURL does its own job reading/sending without taking action on what - * have been found. - */ - if (curl_multi_perform(r->multi, &pending) < 0) - return -1; - - /* We only have one handle so we can just assume 0 means complete. */ - if (pending) - return 0; - - while ((msg = curl_multi_info_read(r->multi, &msgsz))) { - if (msg->msg != CURLMSG_DONE) - continue; - - switch (msg->data.result) { - case CURLE_OPERATION_TIMEDOUT: - irc_log_warn("links: %s timed out", r->link); - break; - case CURLE_OK: - complete(r); - break; - default: - break; - } - } - - return -1; -} - -static void -pollable_finish(void *data) -{ - req_finish(data); -} - -static void -req(struct irc_server *server, const char *origin, const char *channel, char *link) -{ - assert(link); - - struct req *req; - struct irc_server_user user; - int pending; - - if (!(req = calloc(1, sizeof (*req) + PAGE_MAX + 1))) - goto enomem; - if (!(req->curl = curl_easy_init())) - goto enomem; - if (!(req->multi = curl_multi_init())) - goto enomem; - if (!(req->fp = fmemopen(req->buf, PAGE_MAX, "w"))) - goto enomem; - - irc_server_incref(server); - irc_server_split(origin, &user); - - req->link = link; - req->server = server; - req->chan = irc_util_strdup(channel); - req->nickname = irc_util_strdup(user.nickname); - req->origin = irc_util_strdup(origin); - - curl_easy_setopt(req->curl, CURLOPT_URL, link); - curl_easy_setopt(req->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(req->curl, CURLOPT_WRITEFUNCTION, callback); - curl_easy_setopt(req->curl, CURLOPT_WRITEDATA, req); - curl_easy_setopt(req->curl, CURLOPT_TIMEOUT, timeout); - curl_easy_setopt(req->curl, CURLOPT_NOSIGNAL, 1L); - curl_multi_add_handle(req->multi, req->curl); - - /* - * Try immediately to create a socket, otherwise we would poll for a - * long time before trying to fetch data. - */ - if (curl_multi_perform(req->multi, &pending) != CURLM_OK) { - req_finish(req); - return; - } - - req->pollable.data = req; - req->pollable.fd = pollable_fd; - req->pollable.want = pollable_want; - req->pollable.sync = pollable_sync; - req->pollable.finish = pollable_finish; - irc_bot_pollable_add(&req->pollable); - - return; - -enomem: - free(link); - req_finish(req); - - errno = ENOMEM; -} - -void -links_event(const struct irc_event *ev) -{ - char *loc, *end; - - if (ev->type != IRC_EVENT_MESSAGE) - return; - - /* Parse link. */ - if (!(loc = strstr(ev->message.message, "http://")) && - !(loc = strstr(ev->message.message, "https://"))) - return; - - /* Compute end to allocate only what's needed. */ - for (end = loc; *end && !isspace(*end); ) - ++end; - - req(ev->server, ev->message.origin, ev->message.channel, - irc_util_strndup(loc, end - loc)); -} - -void -links_set_template(const char *key, const char *value) -{ - if (strcmp(key, "info") == 0) - irc_util_strlcpy(templates[TPL_INFO], value, sizeof (templates[TPL_INFO])); -} - -const char * -links_get_template(const char *key) -{ - if (strcmp(key, "info") == 0) - return templates[TPL_INFO]; - - return NULL; -} - -const char * const * -links_get_templates(void) -{ - static const char *keys[] = { "info", NULL }; - - return keys; -} - -void -links_set_option(const char *key, const char *value) -{ - if (strcmp(key, "timeout") == 0) - timeout = atol(value); -} - -const char * -links_get_option(const char *key) -{ - static char out[32]; - - if (strcmp(key, "timeout") == 0) { - snprintf(out, sizeof (out), "%lu", timeout); - return out; - } - - return NULL; -} - -const char * const * -links_get_options(void) -{ - static const char *keys[] = { "timeout", NULL }; - - return keys; -} - -const char *links_description = "Parse links from messages"; -const char *links_version = IRCCD_VERSION; -const char *links_license = "ISC"; -const char *links_author = "David Demelier <markand@malikania.fr>"; diff -r 47ed24577389 -r a388a6193131 plugins/links/links.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/links/links.js Sun Mar 06 10:33:50 2022 +0100 @@ -0,0 +1,2331 @@ +/* + * links.js -- retrieve website titles + * + * Copyright (c) 2013-2022 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// Plugin information. +info = { + author: "David Demelier <markand@malikania.fr>", + license: "ISC", + summary: "Retrieve website titles", + version: "@irccd_VERSION@" +}; + +// Modules. +const Plugin = Irccd.Plugin; +const Http = Irccd.Http; +const Util = Irccd.Util; + +// HTML entities (from w3c). +const entities = { + "Á": "\u00C1", + "Á": "\u00C1", + "á": "\u00E1", + "á": "\u00E1", + "Ă": "\u0102", + "ă": "\u0103", + "∾": "\u223E", + "∿": "\u223F", + "∾̳": "\u223E\u0333", + "Â": "\u00C2", + "Â": "\u00C2", + "â": "\u00E2", + "â": "\u00E2", + "´": "\u00B4", + "´": "\u00B4", + "А": "\u0410", + "а": "\u0430", + "Æ": "\u00C6", + "Æ": "\u00C6", + "æ": "\u00E6", + "æ": "\u00E6", + "⁡": "\u2061", + "𝔄": "\uD835\uDD04", + "𝔞": "\uD835\uDD1E", + "À": "\u00C0", + "À": "\u00C0", + "à": "\u00E0", + "à": "\u00E0", + "ℵ": "\u2135", + "ℵ": "\u2135", + "Α": "\u0391", + "α": "\u03B1", + "Ā": "\u0100", + "ā": "\u0101", + "⨿": "\u2A3F", + "&": "\u0026", + "&": "\u0026", + "&": "\u0026", + "&": "\u0026", + "⩕": "\u2A55", + "⩓": "\u2A53", + "∧": "\u2227", + "⩜": "\u2A5C", + "⩘": "\u2A58", + "⩚": "\u2A5A", + "∠": "\u2220", + "⦤": "\u29A4", + "∠": "\u2220", + "⦨": "\u29A8", + "⦩": "\u29A9", + "⦪": "\u29AA", + "⦫": "\u29AB", + "⦬": "\u29AC", + "⦭": "\u29AD", + "⦮": "\u29AE", + "⦯": "\u29AF", + "∡": "\u2221", + "∟": "\u221F", + "⊾": "\u22BE", + "⦝": "\u299D", + "∢": "\u2222", + "Å": "\u00C5", + "⍼": "\u237C", + "Ą": "\u0104", + "ą": "\u0105", + "𝔸": "\uD835\uDD38", + "𝕒": "\uD835\uDD52", + "⩯": "\u2A6F", + "≈": "\u2248", + "⩰": "\u2A70", + "≊": "\u224A", + "≋": "\u224B", + "'": "\u0027", + "⁡": "\u2061", + "≈": "\u2248", + "≊": "\u224A", + "Å": "\u00C5", + "Å": "\u00C5", + "å": "\u00E5", + "å": "\u00E5", + "𝒜": "\uD835\uDC9C", + "𝒶": "\uD835\uDCB6", + "≔": "\u2254", + "*": "\u002A", + "≈": "\u2248", + "≍": "\u224D", + "Ã": "\u00C3", + "Ã": "\u00C3", + "ã": "\u00E3", + "ã": "\u00E3", + "Ä": "\u00C4", + "Ä": "\u00C4", + "ä": "\u00E4", + "ä": "\u00E4", + "∳": "\u2233", + "⨑": "\u2A11", + "≌": "\u224C", + "϶": "\u03F6", + "‵": "\u2035", + "∽": "\u223D", + "⋍": "\u22CD", + "∖": "\u2216", + "⫧": "\u2AE7", + "⊽": "\u22BD", + "⌅": "\u2305", + "⌆": "\u2306", + "⌅": "\u2305", + "⎵": "\u23B5", + "⎶": "\u23B6", + "≌": "\u224C", + "Б": "\u0411", + "б": "\u0431", + "„": "\u201E", + "∵": "\u2235", + "∵": "\u2235", + "∵": "\u2235", + "⦰": "\u29B0", + "϶": "\u03F6", + "ℬ": "\u212C", + "ℬ": "\u212C", + "Β": "\u0392", + "β": "\u03B2", + "ℶ": "\u2136", + "≬": "\u226C", + "𝔅": "\uD835\uDD05", + "𝔟": "\uD835\uDD1F", + "⋂": "\u22C2", + "◯": "\u25EF", + "⋃": "\u22C3", + "⨀": "\u2A00", + "⨁": "\u2A01", + "⨂": "\u2A02", + "⨆": "\u2A06", + "★": "\u2605", + "▽": "\u25BD", + "△": "\u25B3", + "⨄": "\u2A04", + "⋁": "\u22C1", + "⋀": "\u22C0", + "⤍": "\u290D", + "⧫": "\u29EB", + "▪": "\u25AA", + "▴": "\u25B4", + "▾": "\u25BE", + "◂": "\u25C2", + "▸": "\u25B8", + "␣": "\u2423", + "▒": "\u2592", + "░": "\u2591", + "▓": "\u2593", + "█": "\u2588", + "=⃥": "\u003D\u20E5", + "≡⃥": "\u2261\u20E5", + "⫭": "\u2AED", + "⌐": "\u2310", + "𝔹": "\uD835\uDD39", + "𝕓": "\uD835\uDD53", + "⊥": "\u22A5", + "⊥": "\u22A5", + "⋈": "\u22C8", + "⧉": "\u29C9", + "┐": "\u2510", + "╕": "\u2555", + "╖": "\u2556", + "╗": "\u2557", + "┌": "\u250C", + "╒": "\u2552", + "╓": "\u2553", + "╔": "\u2554", + "─": "\u2500", + "═": "\u2550", + "┬": "\u252C", + "╤": "\u2564", + "╥": "\u2565", + "╦": "\u2566", + "┴": "\u2534", + "╧": "\u2567", + "╨": "\u2568", + "╩": "\u2569", + "⊟": "\u229F", + "⊞": "\u229E", + "⊠": "\u22A0", + "┘": "\u2518", + "╛": "\u255B", + "╜": "\u255C", + "╝": "\u255D", + "└": "\u2514", + "╘": "\u2558", + "╙": "\u2559", + "╚": "\u255A", + "│": "\u2502", + "║": "\u2551", + "┼": "\u253C", + "╪": "\u256A", + "╫": "\u256B", + "╬": "\u256C", + "┤": "\u2524", + "╡": "\u2561", + "╢": "\u2562", + "╣": "\u2563", + "├": "\u251C", + "╞": "\u255E", + "╟": "\u255F", + "╠": "\u2560", + "‵": "\u2035", + "˘": "\u02D8", + "˘": "\u02D8", + "¦": "\u00A6", + "¦": "\u00A6", + "𝒷": "\uD835\uDCB7", + "ℬ": "\u212C", + "⁏": "\u204F", + "∽": "\u223D", + "⋍": "\u22CD", + "⧅": "\u29C5", + "\": "\u005C", + "⟈": "\u27C8", + "•": "\u2022", + "•": "\u2022", + "≎": "\u224E", + "⪮": "\u2AAE", + "≏": "\u224F", + "≎": "\u224E", + "≏": "\u224F", + "Ć": "\u0106", + "ć": "\u0107", + "⩄": "\u2A44", + "⩉": "\u2A49", + "⩋": "\u2A4B", + "∩": "\u2229", + "⋒": "\u22D2", + "⩇": "\u2A47", + "⩀": "\u2A40", + "ⅅ": "\u2145", + "∩︀": "\u2229\uFE00", + "⁁": "\u2041", + "ˇ": "\u02C7", + "ℭ": "\u212D", + "⩍": "\u2A4D", + "Č": "\u010C", + "č": "\u010D", + "Ç": "\u00C7", + "Ç": "\u00C7", + "ç": "\u00E7", + "ç": "\u00E7", + "Ĉ": "\u0108", + "ĉ": "\u0109", + "∰": "\u2230", + "⩌": "\u2A4C", + "⩐": "\u2A50", + "Ċ": "\u010A", + "ċ": "\u010B", + "¸": "\u00B8", + "¸": "\u00B8", + "¸": "\u00B8", + "⦲": "\u29B2", + "¢": "\u00A2", + "¢": "\u00A2", + "·": "\u00B7", + "·": "\u00B7", + "𝔠": "\uD835\uDD20", + "ℭ": "\u212D", + "Ч": "\u0427", + "ч": "\u0447", + "✓": "\u2713", + "✓": "\u2713", + "Χ": "\u03A7", + "χ": "\u03C7", + "ˆ": "\u02C6", + "≗": "\u2257", + "↺": "\u21BA", + "↻": "\u21BB", + "⊛": "\u229B", + "⊚": "\u229A", + "⊝": "\u229D", + "⊙": "\u2299", + "®": "\u00AE", + "Ⓢ": "\u24C8", + "⊖": "\u2296", + "⊕": "\u2295", + "⊗": "\u2297", + "○": "\u25CB", + "⧃": "\u29C3", + "≗": "\u2257", + "⨐": "\u2A10", + "⫯": "\u2AEF", + "⧂": "\u29C2", + "∲": "\u2232", + "”": "\u201D", + "’": "\u2019", + "♣": "\u2663", + "♣": "\u2663", + ":": "\u003A", + "∷": "\u2237", + "⩴": "\u2A74", + "≔": "\u2254", + "≔": "\u2254", + ",": "\u002C", + "@": "\u0040", + "∁": "\u2201", + "∘": "\u2218", + "∁": "\u2201", + "ℂ": "\u2102", + "≅": "\u2245", + "⩭": "\u2A6D", + "≡": "\u2261", + "∮": "\u222E", + "∯": "\u222F", + "∮": "\u222E", + "𝕔": "\uD835\uDD54", + "ℂ": "\u2102", + "∐": "\u2210", + "∐": "\u2210", + "©": "\u00A9", + "©": "\u00A9", + "©": "\u00A9", + "©": "\u00A9", + "℗": "\u2117", + "∳": "\u2233", + "↵": "\u21B5", + "✗": "\u2717", + "⨯": "\u2A2F", + "𝒞": "\uD835\uDC9E", + "𝒸": "\uD835\uDCB8", + "⫏": "\u2ACF", + "⫑": "\u2AD1", + "⫐": "\u2AD0", + "⫒": "\u2AD2", + "⋯": "\u22EF", + "⤸": "\u2938", + "⤵": "\u2935", + "⋞": "\u22DE", + "⋟": "\u22DF", + "↶": "\u21B6", + "⤽": "\u293D", + "⩈": "\u2A48", + "⩆": "\u2A46", + "≍": "\u224D", + "∪": "\u222A", + "⋓": "\u22D3", + "⩊": "\u2A4A", + "⊍": "\u228D", + "⩅": "\u2A45", + "∪︀": "\u222A\uFE00", + "↷": "\u21B7", + "⤼": "\u293C", + "⋞": "\u22DE", + "⋟": "\u22DF", + "⋎": "\u22CE", + "⋏": "\u22CF", + "¤": "\u00A4", + "¤": "\u00A4", + "↶": "\u21B6", + "↷": "\u21B7", + "⋎": "\u22CE", + "⋏": "\u22CF", + "∲": "\u2232", + "∱": "\u2231", + "⌭": "\u232D", + "†": "\u2020", + "‡": "\u2021", + "ℸ": "\u2138", + "↓": "\u2193", + "↡": "\u21A1", + "⇓": "\u21D3", + "‐": "\u2010", + "⫤": "\u2AE4", + "⊣": "\u22A3", + "⤏": "\u290F", + "˝": "\u02DD", + "Ď": "\u010E", + "ď": "\u010F", + "Д": "\u0414", + "д": "\u0434", + "‡": "\u2021", + "⇊": "\u21CA", + "ⅅ": "\u2145", + "ⅆ": "\u2146", + "⤑": "\u2911", + "⩷": "\u2A77", + "°": "\u00B0", + "°": "\u00B0", + "∇": "\u2207", + "Δ": "\u0394", + "δ": "\u03B4", + "⦱": "\u29B1", + "⥿": "\u297F", + "𝔇": "\uD835\uDD07", + "𝔡": "\uD835\uDD21", + "⥥": "\u2965", + "⇃": "\u21C3", + "⇂": "\u21C2", + "´": "\u00B4", + "˙": "\u02D9", + "˝": "\u02DD", + "`": "\u0060", + "˜": "\u02DC", + "⋄": "\u22C4", + "⋄": "\u22C4", + "⋄": "\u22C4", + "♦": "\u2666", + "♦": "\u2666", + "¨": "\u00A8", + "ⅆ": "\u2146", + "ϝ": "\u03DD", + "⋲": "\u22F2", + "÷": "\u00F7", + "÷": "\u00F7", + "÷": "\u00F7", + "⋇": "\u22C7", + "⋇": "\u22C7", + "Ђ": "\u0402", + "ђ": "\u0452", + "⌞": "\u231E", + "⌍": "\u230D", + "$": "\u0024", + "𝔻": "\uD835\uDD3B", + "𝕕": "\uD835\uDD55", + "¨": "\u00A8", + "˙": "\u02D9", + "⃜": "\u20DC", + "≐": "\u2250", + "≑": "\u2251", + "≐": "\u2250", + "∸": "\u2238", + "∔": "\u2214", + "⊡": "\u22A1", + "⌆": "\u2306", + "∯": "\u222F", + "¨": "\u00A8", + "⇓": "\u21D3", + "⇐": "\u21D0", + "⇔": "\u21D4", + "⫤": "\u2AE4", + "⟸": "\u27F8", + "⟺": "\u27FA", + "⟹": "\u27F9", + "⇒": "\u21D2", + "⊨": "\u22A8", + "⇑": "\u21D1", + "⇕": "\u21D5", + "∥": "\u2225", + "⤓": "\u2913", + "↓": "\u2193", + "↓": "\u2193", + "⇓": "\u21D3", + "⇵": "\u21F5", + "̑": "\u0311", + "⇊": "\u21CA", + "⇃": "\u21C3", + "⇂": "\u21C2", + "⥐": "\u2950", + "⥞": "\u295E", + "⥖": "\u2956", + "↽": "\u21BD", + "⥟": "\u295F", + "⥗": "\u2957", + "⇁": "\u21C1", + "↧": "\u21A7", + "⊤": "\u22A4", + "⤐": "\u2910", + "⌟": "\u231F", + "⌌": "\u230C", + "𝒟": "\uD835\uDC9F", + "𝒹": "\uD835\uDCB9", + "Ѕ": "\u0405", + "ѕ": "\u0455", + "⧶": "\u29F6", + "Đ": "\u0110", + "đ": "\u0111", + "⋱": "\u22F1", + "▿": "\u25BF", + "▾": "\u25BE", + "⇵": "\u21F5", + "⥯": "\u296F", + "⦦": "\u29A6", + "Џ": "\u040F", + "џ": "\u045F", + "⟿": "\u27FF", + "É": "\u00C9", + "É": "\u00C9", + "é": "\u00E9", + "é": "\u00E9", + "⩮": "\u2A6E", + "Ě": "\u011A", + "ě": "\u011B", + "Ê": "\u00CA", + "Ê": "\u00CA", + "ê": "\u00EA", + "ê": "\u00EA", + "≖": "\u2256", + "≕": "\u2255", + "Э": "\u042D", + "э": "\u044D", + "⩷": "\u2A77", + "Ė": "\u0116", + "ė": "\u0117", + "≑": "\u2251", + "ⅇ": "\u2147", + "≒": "\u2252", + "𝔈": "\uD835\uDD08", + "𝔢": "\uD835\uDD22", + "⪚": "\u2A9A", + "È": "\u00C8", + "È": "\u00C8", + "è": "\u00E8", + "è": "\u00E8", + "⪖": "\u2A96", + "⪘": "\u2A98", + "⪙": "\u2A99", + "∈": "\u2208", + "⏧": "\u23E7", + "ℓ": "\u2113", + "⪕": "\u2A95", + "⪗": "\u2A97", + "Ē": "\u0112", + "ē": "\u0113", + "∅": "\u2205", + "∅": "\u2205", + "◻": "\u25FB", + "∅": "\u2205", + "▫": "\u25AB", + " ": "\u2004", + " ": "\u2005", + " ": "\u2003", + "Ŋ": "\u014A", + "ŋ": "\u014B", + " ": "\u2002", + "Ę": "\u0118", + "ę": "\u0119", + "𝔼": "\uD835\uDD3C", + "𝕖": "\uD835\uDD56", + "⋕": "\u22D5", + "⧣": "\u29E3", + "⩱": "\u2A71", + "ε": "\u03B5", + "Ε": "\u0395", + "ε": "\u03B5", + "ϵ": "\u03F5", + "≖": "\u2256", + "≕": "\u2255", + "≂": "\u2242", + "⪖": "\u2A96", + "⪕": "\u2A95", + "⩵": "\u2A75", + "=": "\u003D", + "≂": "\u2242", + "≟": "\u225F", + "⇌": "\u21CC", + "≡": "\u2261", + "⩸": "\u2A78", + "⧥": "\u29E5", + "⥱": "\u2971", + "≓": "\u2253", + "ℯ": "\u212F", + "ℰ": "\u2130", + "≐": "\u2250", + "⩳": "\u2A73", + "≂": "\u2242", + "Η": "\u0397", + "η": "\u03B7", + "Ð": "\u00D0", + "Ð": "\u00D0", + "ð": "\u00F0", + "ð": "\u00F0", + "Ë": "\u00CB", + "Ë": "\u00CB", + "ë": "\u00EB", + "ë": "\u00EB", + "€": "\u20AC", + "!": "\u0021", + "∃": "\u2203", + "∃": "\u2203", + "ℰ": "\u2130", + "ⅇ": "\u2147", + "ⅇ": "\u2147", + "≒": "\u2252", + "Ф": "\u0424", + "ф": "\u0444", + "♀": "\u2640", + "ffi": "\uFB03", + "ff": "\uFB00", + "ffl": "\uFB04", + "𝔉": "\uD835\uDD09", + "𝔣": "\uD835\uDD23", + "fi": "\uFB01", + "◼": "\u25FC", + "▪": "\u25AA", + "fj": "\u0066\u006A", + "♭": "\u266D", + "fl": "\uFB02", + "▱": "\u25B1", + "ƒ": "\u0192", + "𝔽": "\uD835\uDD3D", + "𝕗": "\uD835\uDD57", + "∀": "\u2200", + "∀": "\u2200", + "⋔": "\u22D4", + "⫙": "\u2AD9", + "ℱ": "\u2131", + "⨍": "\u2A0D", + "½": "\u00BD", + "½": "\u00BD", + "⅓": "\u2153", + "¼": "\u00BC", + "¼": "\u00BC", + "⅕": "\u2155", + "⅙": "\u2159", + "⅛": "\u215B", + "⅔": "\u2154", + "⅖": "\u2156", + "¾": "\u00BE", + "¾": "\u00BE", + "⅗": "\u2157", + "⅜": "\u215C", + "⅘": "\u2158", + "⅚": "\u215A", + "⅝": "\u215D", + "⅞": "\u215E", + "⁄": "\u2044", + "⌢": "\u2322", + "𝒻": "\uD835\uDCBB", + "ℱ": "\u2131", + "ǵ": "\u01F5", + "Γ": "\u0393", + "γ": "\u03B3", + "Ϝ": "\u03DC", + "ϝ": "\u03DD", + "⪆": "\u2A86", + "Ğ": "\u011E", + "ğ": "\u011F", + "Ģ": "\u0122", + "Ĝ": "\u011C", + "ĝ": "\u011D", + "Г": "\u0413", + "г": "\u0433", + "Ġ": "\u0120", + "ġ": "\u0121", + "≥": "\u2265", + "≧": "\u2267", + "⪌": "\u2A8C", + "⋛": "\u22DB", + "≥": "\u2265", + "≧": "\u2267", + "⩾": "\u2A7E", + "⪩": "\u2AA9", + "⩾": "\u2A7E", + "⪀": "\u2A80", + "⪂": "\u2A82", + "⪄": "\u2A84", + "⋛︀": "\u22DB\uFE00", + "⪔": "\u2A94", + "𝔊": "\uD835\uDD0A", + "𝔤": "\uD835\uDD24", + "≫": "\u226B", + "⋙": "\u22D9", + "⋙": "\u22D9", + "ℷ": "\u2137", + "Ѓ": "\u0403", + "ѓ": "\u0453", + "⪥": "\u2AA5", + "≷": "\u2277", + "⪒": "\u2A92", + "⪤": "\u2AA4", + "⪊": "\u2A8A", + "⪊": "\u2A8A", + "⪈": "\u2A88", + "≩": "\u2269", + "⪈": "\u2A88", + "≩": "\u2269", + "⋧": "\u22E7", + "𝔾": "\uD835\uDD3E", + "𝕘": "\uD835\uDD58", + "`": "\u0060", + "≥": "\u2265", + "⋛": "\u22DB", + "≧": "\u2267", + "⪢": "\u2AA2", + "≷": "\u2277", + "⩾": "\u2A7E", + "≳": "\u2273", + "𝒢": "\uD835\uDCA2", + "ℊ": "\u210A", + "≳": "\u2273", + "⪎": "\u2A8E", + "⪐": "\u2A90", + "⪧": "\u2AA7", + "⩺": "\u2A7A", + ">": "\u003E", + ">": "\u003E", + ">": "\u003E", + ">": "\u003E", + "≫": "\u226B", + "⋗": "\u22D7", + "⦕": "\u2995", + "⩼": "\u2A7C", + "⪆": "\u2A86", + "⥸": "\u2978", + "⋗": "\u22D7", + "⋛": "\u22DB", + "⪌": "\u2A8C", + "≷": "\u2277", + "≳": "\u2273", + "≩︀": "\u2269\uFE00", + "≩︀": "\u2269\uFE00", + "ˇ": "\u02C7", + " ": "\u200A", + "½": "\u00BD", + "ℋ": "\u210B", + "Ъ": "\u042A", + "ъ": "\u044A", + "⥈": "\u2948", + "↔": "\u2194", + "⇔": "\u21D4", + "↭": "\u21AD", + "^": "\u005E", + "ℏ": "\u210F", + "Ĥ": "\u0124", + "ĥ": "\u0125", + "♥": "\u2665", + "♥": "\u2665", + "…": "\u2026", + "⊹": "\u22B9", + "𝔥": "\uD835\uDD25", + "ℌ": "\u210C", + "ℋ": "\u210B", + "⤥": "\u2925", + "⤦": "\u2926", + "⇿": "\u21FF", + "∻": "\u223B", + "↩": "\u21A9", + "↪": "\u21AA", + "𝕙": "\uD835\uDD59", + "ℍ": "\u210D", + "―": "\u2015", + "─": "\u2500", + "𝒽": "\uD835\uDCBD", + "ℋ": "\u210B", + "ℏ": "\u210F", + "Ħ": "\u0126", + "ħ": "\u0127", + "≎": "\u224E", + "≏": "\u224F", + "⁃": "\u2043", + "‐": "\u2010", + "Í": "\u00CD", + "Í": "\u00CD", + "í": "\u00ED", + "í": "\u00ED", + "⁣": "\u2063", + "Î": "\u00CE", + "Î": "\u00CE", + "î": "\u00EE", + "î": "\u00EE", + "И": "\u0418", + "и": "\u0438", + "İ": "\u0130", + "Е": "\u0415", + "е": "\u0435", + "¡": "\u00A1", + "¡": "\u00A1", + "⇔": "\u21D4", + "𝔦": "\uD835\uDD26", + "ℑ": "\u2111", + "Ì": "\u00CC", + "Ì": "\u00CC", + "ì": "\u00EC", + "ì": "\u00EC", + "ⅈ": "\u2148", + "⨌": "\u2A0C", + "∭": "\u222D", + "⧜": "\u29DC", + "℩": "\u2129", + "IJ": "\u0132", + "ij": "\u0133", + "Ī": "\u012A", + "ī": "\u012B", + "ℑ": "\u2111", + "ⅈ": "\u2148", + "ℐ": "\u2110", + "ℑ": "\u2111", + "ı": "\u0131", + "ℑ": "\u2111", + "⊷": "\u22B7", + "Ƶ": "\u01B5", + "⇒": "\u21D2", + "℅": "\u2105", + "∈": "\u2208", + "∞": "\u221E", + "⧝": "\u29DD", + "ı": "\u0131", + "⊺": "\u22BA", + "∫": "\u222B", + "∬": "\u222C", + "ℤ": "\u2124", + "∫": "\u222B", + "⊺": "\u22BA", + "⋂": "\u22C2", + "⨗": "\u2A17", + "⨼": "\u2A3C", + "⁣": "\u2063", + "⁢": "\u2062", + "Ё": "\u0401", + "ё": "\u0451", + "Į": "\u012E", + "į": "\u012F", + "𝕀": "\uD835\uDD40", + "𝕚": "\uD835\uDD5A", + "Ι": "\u0399", + "ι": "\u03B9", + "⨼": "\u2A3C", + "¿": "\u00BF", + "¿": "\u00BF", + "𝒾": "\uD835\uDCBE", + "ℐ": "\u2110", + "∈": "\u2208", + "⋵": "\u22F5", + "⋹": "\u22F9", + "⋴": "\u22F4", + "⋳": "\u22F3", + "∈": "\u2208", + "⁢": "\u2062", + "Ĩ": "\u0128", + "ĩ": "\u0129", + "І": "\u0406", + "і": "\u0456", + "Ï": "\u00CF", + "Ï": "\u00CF", + "ï": "\u00EF", + "ï": "\u00EF", + "Ĵ": "\u0134", + "ĵ": "\u0135", + "Й": "\u0419", + "й": "\u0439", + "𝔍": "\uD835\uDD0D", + "𝔧": "\uD835\uDD27", + "ȷ": "\u0237", + "𝕁": "\uD835\uDD41", + "𝕛": "\uD835\uDD5B", + "𝒥": "\uD835\uDCA5", + "𝒿": "\uD835\uDCBF", + "Ј": "\u0408", + "ј": "\u0458", + "Є": "\u0404", + "є": "\u0454", + "Κ": "\u039A", + "κ": "\u03BA", + "ϰ": "\u03F0", + "Ķ": "\u0136", + "ķ": "\u0137", + "К": "\u041A", + "к": "\u043A", + "𝔎": "\uD835\uDD0E", + "𝔨": "\uD835\uDD28", + "ĸ": "\u0138", + "Х": "\u0425", + "х": "\u0445", + "Ќ": "\u040C", + "ќ": "\u045C", + "𝕂": "\uD835\uDD42", + "𝕜": "\uD835\uDD5C", + "𝒦": "\uD835\uDCA6", + "𝓀": "\uD835\uDCC0", + "⇚": "\u21DA", + "Ĺ": "\u0139", + "ĺ": "\u013A", + "⦴": "\u29B4", + "ℒ": "\u2112", + "Λ": "\u039B", + "λ": "\u03BB", + "⟨": "\u27E8", + "⟪": "\u27EA", + "⦑": "\u2991", + "⟨": "\u27E8", + "⪅": "\u2A85", + "ℒ": "\u2112", + "«": "\u00AB", + "«": "\u00AB", + "⇤": "\u21E4", + "⤟": "\u291F", + "←": "\u2190", + "↞": "\u219E", + "⇐": "\u21D0", + "⤝": "\u291D", + "↩": "\u21A9", + "↫": "\u21AB", + "⤹": "\u2939", + "⥳": "\u2973", + "↢": "\u21A2", + "⤙": "\u2919", + "⤛": "\u291B", + "⪫": "\u2AAB", + "⪭": "\u2AAD", + "⪭︀": "\u2AAD\uFE00", + "⤌": "\u290C", + "⤎": "\u290E", + "❲": "\u2772", + "{": "\u007B", + "[": "\u005B", + "⦋": "\u298B", + "⦏": "\u298F", + "⦍": "\u298D", + "Ľ": "\u013D", + "ľ": "\u013E", + "Ļ": "\u013B", + "ļ": "\u013C", + "⌈": "\u2308", + "{": "\u007B", + "Л": "\u041B", + "л": "\u043B", + "⤶": "\u2936", + "“": "\u201C", + "„": "\u201E", + "⥧": "\u2967", + "⥋": "\u294B", + "↲": "\u21B2", + "≤": "\u2264", + "≦": "\u2266", + "⟨": "\u27E8", + "⇤": "\u21E4", + "←": "\u2190", + "←": "\u2190", + "⇐": "\u21D0", + "⇆": "\u21C6", + "↢": "\u21A2", + "⌈": "\u2308", + "⟦": "\u27E6", + "⥡": "\u2961", + "⥙": "\u2959", + "⇃": "\u21C3", + "⌊": "\u230A", + "↽": "\u21BD", + "↼": "\u21BC", + "⇇": "\u21C7", + "↔": "\u2194", + "↔": "\u2194", + "⇔": "\u21D4", + "⇆": "\u21C6", + "⇋": "\u21CB", + "↭": "\u21AD", + "⥎": "\u294E", + "↤": "\u21A4", + "⊣": "\u22A3", + "⥚": "\u295A", + "⋋": "\u22CB", + "⧏": "\u29CF", + "⊲": "\u22B2", + "⊴": "\u22B4", + "⥑": "\u2951", + "⥠": "\u2960", + "⥘": "\u2958", + "↿": "\u21BF", + "⥒": "\u2952", + "↼": "\u21BC", + "⪋": "\u2A8B", + "⋚": "\u22DA", + "≤": "\u2264", + "≦": "\u2266", + "⩽": "\u2A7D", + "⪨": "\u2AA8", + "⩽": "\u2A7D", + "⩿": "\u2A7F", + "⪁": "\u2A81", + "⪃": "\u2A83", + "⋚︀": "\u22DA\uFE00", + "⪓": "\u2A93", + "⪅": "\u2A85", + "⋖": "\u22D6", + "⋚": "\u22DA", + "⪋": "\u2A8B", + "⋚": "\u22DA", + "≦": "\u2266", + "≶": "\u2276", + "≶": "\u2276", + "⪡": "\u2AA1", + "≲": "\u2272", + "⩽": "\u2A7D", + "≲": "\u2272", + "⥼": "\u297C", + "⌊": "\u230A", + "𝔏": "\uD835\uDD0F", + "𝔩": "\uD835\uDD29", + "≶": "\u2276", + "⪑": "\u2A91", + "⥢": "\u2962", + "↽": "\u21BD", + "↼": "\u21BC", + "⥪": "\u296A", + "▄": "\u2584", + "Љ": "\u0409", + "љ": "\u0459", + "⇇": "\u21C7", + "≪": "\u226A", + "⋘": "\u22D8", + "⌞": "\u231E", + "⇚": "\u21DA", + "⥫": "\u296B", + "◺": "\u25FA", + "Ŀ": "\u013F", + "ŀ": "\u0140", + "⎰": "\u23B0", + "⎰": "\u23B0", + "⪉": "\u2A89", + "⪉": "\u2A89", + "⪇": "\u2A87", + "≨": "\u2268", + "⪇": "\u2A87", + "≨": "\u2268", + "⋦": "\u22E6", + "⟬": "\u27EC", + "⇽": "\u21FD", + "⟦": "\u27E6", + "⟵": "\u27F5", + "⟵": "\u27F5", + "⟸": "\u27F8", + "⟷": "\u27F7", + "⟷": "\u27F7", + "⟺": "\u27FA", + "⟼": "\u27FC", + "⟶": "\u27F6", + "⟶": "\u27F6", + "⟹": "\u27F9", + "↫": "\u21AB", + "↬": "\u21AC", + "⦅": "\u2985", + "𝕃": "\uD835\uDD43", + "𝕝": "\uD835\uDD5D", + "⨭": "\u2A2D", + "⨴": "\u2A34", + "∗": "\u2217", + "_": "\u005F", + "↙": "\u2199", + "↘": "\u2198", + "◊": "\u25CA", + "◊": "\u25CA", + "⧫": "\u29EB", + "(": "\u0028", + "⦓": "\u2993", + "⇆": "\u21C6", + "⌟": "\u231F", + "⇋": "\u21CB", + "⥭": "\u296D", + "‎": "\u200E", + "⊿": "\u22BF", + "‹": "\u2039", + "𝓁": "\uD835\uDCC1", + "ℒ": "\u2112", + "↰": "\u21B0", + "↰": "\u21B0", + "≲": "\u2272", + "⪍": "\u2A8D", + "⪏": "\u2A8F", + "[": "\u005B", + "‘": "\u2018", + "‚": "\u201A", + "Ł": "\u0141", + "ł": "\u0142", + "⪦": "\u2AA6", + "⩹": "\u2A79", + "<": "\u003C", + "<": "\u003C", + "<": "\u003C", + "<": "\u003C", + "≪": "\u226A", + "⋖": "\u22D6", + "⋋": "\u22CB", + "⋉": "\u22C9", + "⥶": "\u2976", + "⩻": "\u2A7B", + "◃": "\u25C3", + "⊴": "\u22B4", + "◂": "\u25C2", + "⦖": "\u2996", + "⥊": "\u294A", + "⥦": "\u2966", + "≨︀": "\u2268\uFE00", + "≨︀": "\u2268\uFE00", + "¯": "\u00AF", + "¯": "\u00AF", + "♂": "\u2642", + "✠": "\u2720", + "✠": "\u2720", + "⤅": "\u2905", + "↦": "\u21A6", + "↦": "\u21A6", + "↧": "\u21A7", + "↤": "\u21A4", + "↥": "\u21A5", + "▮": "\u25AE", + "⨩": "\u2A29", + "М": "\u041C", + "м": "\u043C", + "—": "\u2014", + "∺": "\u223A", + "∡": "\u2221", + " ": "\u205F", + "ℳ": "\u2133", + "𝔐": "\uD835\uDD10", + "𝔪": "\uD835\uDD2A", + "℧": "\u2127", + "µ": "\u00B5", + "µ": "\u00B5", + "*": "\u002A", + "⫰": "\u2AF0", + "∣": "\u2223", + "·": "\u00B7", + "·": "\u00B7", + "⊟": "\u229F", + "−": "\u2212", + "∸": "\u2238", + "⨪": "\u2A2A", + "∓": "\u2213", + "⫛": "\u2ADB", + "…": "\u2026", + "∓": "\u2213", + "⊧": "\u22A7", + "𝕄": "\uD835\uDD44", + "𝕞": "\uD835\uDD5E", + "∓": "\u2213", + "𝓂": "\uD835\uDCC2", + "ℳ": "\u2133", + "∾": "\u223E", + "Μ": "\u039C", + "μ": "\u03BC", + "⊸": "\u22B8", + "⊸": "\u22B8", + "∇": "\u2207", + "Ń": "\u0143", + "ń": "\u0144", + "∠⃒": "\u2220\u20D2", + "≉": "\u2249", + "⩰̸": "\u2A70\u0338", + "≋̸": "\u224B\u0338", + "ʼn": "\u0149", + "≉": "\u2249", + "♮": "\u266E", + "ℕ": "\u2115", + "♮": "\u266E", + " ": "\u00A0", + " ": "\u00A0", + "≎̸": "\u224E\u0338", + "≏̸": "\u224F\u0338", + "⩃": "\u2A43", + "Ň": "\u0147", + "ň": "\u0148", + "Ņ": "\u0145", + "ņ": "\u0146", + "≇": "\u2247", + "⩭̸": "\u2A6D\u0338", + "⩂": "\u2A42", + "Н": "\u041D", + "н": "\u043D", + "–": "\u2013", + "⤤": "\u2924", + "↗": "\u2197", + "⇗": "\u21D7", + "↗": "\u2197", + "≠": "\u2260", + "≐̸": "\u2250\u0338", + "​": "\u200B", + "​": "\u200B", + "​": "\u200B", + "​": "\u200B", + "≢": "\u2262", + "⤨": "\u2928", + "≂̸": "\u2242\u0338", + "≫": "\u226B", + "≪": "\u226A", + " ": "\u000A", + "∄": "\u2204", + "∄": "\u2204", + "𝔑": "\uD835\uDD11", + "𝔫": "\uD835\uDD2B", + "≧̸": "\u2267\u0338", + "≱": "\u2271", + "≱": "\u2271", + "≧̸": "\u2267\u0338", + "⩾̸": "\u2A7E\u0338", + "⩾̸": "\u2A7E\u0338", + "⋙̸": "\u22D9\u0338", + "≵": "\u2275", + "≫⃒": "\u226B\u20D2", + "≯": "\u226F", + "≯": "\u226F", + "≫̸": "\u226B\u0338", + "↮": "\u21AE", + "⇎": "\u21CE", + "⫲": "\u2AF2", + "∋": "\u220B", + "⋼": "\u22FC", + "⋺": "\u22FA", + "∋": "\u220B", + "Њ": "\u040A", + "њ": "\u045A", + "↚": "\u219A", + "⇍": "\u21CD", + "‥": "\u2025", + "≦̸": "\u2266\u0338", + "≰": "\u2270", + "↚": "\u219A", + "⇍": "\u21CD", + "↮": "\u21AE", + "⇎": "\u21CE", + "≰": "\u2270", + "≦̸": "\u2266\u0338", + "⩽̸": "\u2A7D\u0338", + "⩽̸": "\u2A7D\u0338", + "≮": "\u226E", + "⋘̸": "\u22D8\u0338", + "≴": "\u2274", + "≪⃒": "\u226A\u20D2", + "≮": "\u226E", + "⋪": "\u22EA", + "⋬": "\u22EC", + "≪̸": "\u226A\u0338", + "∤": "\u2224", + "⁠": "\u2060", + " ": "\u00A0", + "𝕟": "\uD835\uDD5F", + "ℕ": "\u2115", + "⫬": "\u2AEC", + "¬": "\u00AC", + "¬": "\u00AC", + "≢": "\u2262", + "≭": "\u226D", + "∦": "\u2226", + "∉": "\u2209", + "≠": "\u2260", + "≂̸": "\u2242\u0338", + "∄": "\u2204", + "≯": "\u226F", + "≱": "\u2271", + "≧̸": "\u2267\u0338", + "≫̸": "\u226B\u0338", + "≹": "\u2279", + "⩾̸": "\u2A7E\u0338", + "≵": "\u2275", + "≎̸": "\u224E\u0338", + "≏̸": "\u224F\u0338", + "∉": "\u2209", + "⋵̸": "\u22F5\u0338", + "⋹̸": "\u22F9\u0338", + "∉": "\u2209", + "⋷": "\u22F7", + "⋶": "\u22F6", + "⧏̸": "\u29CF\u0338", + "⋪": "\u22EA", + "⋬": "\u22EC", + "≮": "\u226E", + "≰": "\u2270", + "≸": "\u2278", + "≪̸": "\u226A\u0338", + "⩽̸": "\u2A7D\u0338", + "≴": "\u2274", + "⪢̸": "\u2AA2\u0338", + "⪡̸": "\u2AA1\u0338", + "∌": "\u220C", + "∌": "\u220C", + "⋾": "\u22FE", + "⋽": "\u22FD", + "⊀": "\u2280", + "⪯̸": "\u2AAF\u0338", + "⋠": "\u22E0", + "∌": "\u220C", + "⧐̸": "\u29D0\u0338", + "⋫": "\u22EB", + "⋭": "\u22ED", + "⊏̸": "\u228F\u0338", + "⋢": "\u22E2", + "⊐̸": "\u2290\u0338", + "⋣": "\u22E3", + "⊂⃒": "\u2282\u20D2", + "⊈": "\u2288", + "⊁": "\u2281", + "⪰̸": "\u2AB0\u0338", + "⋡": "\u22E1", + "≿̸": "\u227F\u0338", + "⊃⃒": "\u2283\u20D2", + "⊉": "\u2289", + "≁": "\u2241", + "≄": "\u2244", + "≇": "\u2247", + "≉": "\u2249", + "∤": "\u2224", + "∦": "\u2226", + "∦": "\u2226", + "⫽⃥": "\u2AFD\u20E5", + "∂̸": "\u2202\u0338", + "⨔": "\u2A14", + "⊀": "\u2280", + "⋠": "\u22E0", + "⊀": "\u2280", + "⪯̸": "\u2AAF\u0338", + "⪯̸": "\u2AAF\u0338", + "⤳̸": "\u2933\u0338", + "↛": "\u219B", + "⇏": "\u21CF", + "↝̸": "\u219D\u0338", + "↛": "\u219B", + "⇏": "\u21CF", + "⋫": "\u22EB", + "⋭": "\u22ED", + "⊁": "\u2281", + "⋡": "\u22E1", + "⪰̸": "\u2AB0\u0338", + "𝒩": "\uD835\uDCA9", + "𝓃": "\uD835\uDCC3", + "∤": "\u2224", + "∦": "\u2226", + "≁": "\u2241", + "≄": "\u2244", + "≄": "\u2244", + "∤": "\u2224", + "∦": "\u2226", + "⋢": "\u22E2", + "⋣": "\u22E3", + "⊄": "\u2284", + "⫅̸": "\u2AC5\u0338", + "⊈": "\u2288", + "⊂⃒": "\u2282\u20D2", + "⊈": "\u2288", + "⫅̸": "\u2AC5\u0338", + "⊁": "\u2281", + "⪰̸": "\u2AB0\u0338", + "⊅": "\u2285", + "⫆̸": "\u2AC6\u0338", + "⊉": "\u2289", + "⊃⃒": "\u2283\u20D2", + "⊉": "\u2289", + "⫆̸": "\u2AC6\u0338", + "≹": "\u2279", + "Ñ": "\u00D1", + "Ñ": "\u00D1", + "ñ": "\u00F1", + "ñ": "\u00F1", + "≸": "\u2278", + "⋪": "\u22EA", + "⋬": "\u22EC", + "⋫": "\u22EB", + "⋭": "\u22ED", + "Ν": "\u039D", + "ν": "\u03BD", + "#": "\u0023", + "№": "\u2116", + " ": "\u2007", + "≍⃒": "\u224D\u20D2", + "⊬": "\u22AC", + "⊭": "\u22AD", + "⊮": "\u22AE", + "⊯": "\u22AF", + "≥⃒": "\u2265\u20D2", + ">⃒": "\u003E\u20D2", + "⤄": "\u2904", + "⧞": "\u29DE", + "⤂": "\u2902", + "≤⃒": "\u2264\u20D2", + "<⃒": "\u003C\u20D2", + "⊴⃒": "\u22B4\u20D2", + "⤃": "\u2903", + "⊵⃒": "\u22B5\u20D2", + "∼⃒": "\u223C\u20D2", + "⤣": "\u2923", + "↖": "\u2196", + "⇖": "\u21D6", + "↖": "\u2196", + "⤧": "\u2927", + "Ó": "\u00D3", + "Ó": "\u00D3", + "ó": "\u00F3", + "ó": "\u00F3", + "⊛": "\u229B", + "Ô": "\u00D4", + "Ô": "\u00D4", + "ô": "\u00F4", + "ô": "\u00F4", + "⊚": "\u229A", + "О": "\u041E", + "о": "\u043E", + "⊝": "\u229D", + "Ő": "\u0150", + "ő": "\u0151", + "⨸": "\u2A38", + "⊙": "\u2299", + "⦼": "\u29BC", + "Œ": "\u0152", + "œ": "\u0153", + "⦿": "\u29BF", + "𝔒": "\uD835\uDD12", + "𝔬": "\uD835\uDD2C", + "˛": "\u02DB", + "Ò": "\u00D2", + "Ò": "\u00D2", + "ò": "\u00F2", + "ò": "\u00F2", + "⧁": "\u29C1", + "⦵": "\u29B5", + "Ω": "\u03A9", + "∮": "\u222E", + "↺": "\u21BA", + "⦾": "\u29BE", + "⦻": "\u29BB", + "‾": "\u203E", + "⧀": "\u29C0", + "Ō": "\u014C", + "ō": "\u014D", + "Ω": "\u03A9", + "ω": "\u03C9", + "Ο": "\u039F", + "ο": "\u03BF", + "⦶": "\u29B6", + "⊖": "\u2296", + "𝕆": "\uD835\uDD46", + "𝕠": "\uD835\uDD60", + "⦷": "\u29B7", + "“": "\u201C", + "‘": "\u2018", + "⦹": "\u29B9", + "⊕": "\u2295", + "↻": "\u21BB", + "⩔": "\u2A54", + "∨": "\u2228", + "⩝": "\u2A5D", + "ℴ": "\u2134", + "ℴ": "\u2134", + "ª": "\u00AA", + "ª": "\u00AA", + "º": "\u00BA", + "º": "\u00BA", + "⊶": "\u22B6", + "⩖": "\u2A56", + "⩗": "\u2A57", + "⩛": "\u2A5B", + "Ⓢ": "\u24C8", + "𝒪": "\uD835\uDCAA", + "ℴ": "\u2134", + "Ø": "\u00D8", + "Ø": "\u00D8", + "ø": "\u00F8", + "ø": "\u00F8", + "⊘": "\u2298", + "Õ": "\u00D5", + "Õ": "\u00D5", + "õ": "\u00F5", + "õ": "\u00F5", + "⨶": "\u2A36", + "⨷": "\u2A37", + "⊗": "\u2297", + "Ö": "\u00D6", + "Ö": "\u00D6", + "ö": "\u00F6", + "ö": "\u00F6", + "⌽": "\u233D", + "‾": "\u203E", + "⏞": "\u23DE", + "⎴": "\u23B4", + "⏜": "\u23DC", + "¶": "\u00B6", + "¶": "\u00B6", + "∥": "\u2225", + "∥": "\u2225", + "⫳": "\u2AF3", + "⫽": "\u2AFD", + "∂": "\u2202", + "∂": "\u2202", + "П": "\u041F", + "п": "\u043F", + "%": "\u0025", + ".": "\u002E", + "‰": "\u2030", + "⊥": "\u22A5", + "‱": "\u2031", + "𝔓": "\uD835\uDD13", + "𝔭": "\uD835\uDD2D", + "Φ": "\u03A6", + "φ": "\u03C6", + "ϕ": "\u03D5", + "ℳ": "\u2133", + "☎": "\u260E", + "Π": "\u03A0", + "π": "\u03C0", + "⋔": "\u22D4", + "ϖ": "\u03D6", + "ℏ": "\u210F", + "ℎ": "\u210E", + "ℏ": "\u210F", + "⨣": "\u2A23", + "⊞": "\u229E", + "⨢": "\u2A22", + "+": "\u002B", + "∔": "\u2214", + "⨥": "\u2A25", + "⩲": "\u2A72", + "±": "\u00B1", + "±": "\u00B1", + "±": "\u00B1", + "⨦": "\u2A26", + "⨧": "\u2A27", + "±": "\u00B1", + "ℌ": "\u210C", + "⨕": "\u2A15", + "𝕡": "\uD835\uDD61", + "ℙ": "\u2119", + "£": "\u00A3", + "£": "\u00A3", + "⪷": "\u2AB7", + "⪻": "\u2ABB", + "≺": "\u227A", + "≼": "\u227C", + "⪷": "\u2AB7", + "≺": "\u227A", + "≼": "\u227C", + "≺": "\u227A", + "⪯": "\u2AAF", + "≼": "\u227C", + "≾": "\u227E", + "⪯": "\u2AAF", + "⪹": "\u2AB9", + "⪵": "\u2AB5", + "⋨": "\u22E8", + "⪯": "\u2AAF", + "⪳": "\u2AB3", + "≾": "\u227E", + "′": "\u2032", + "″": "\u2033", + "ℙ": "\u2119", + "⪹": "\u2AB9", + "⪵": "\u2AB5", + "⋨": "\u22E8", + "∏": "\u220F", + "∏": "\u220F", + "⌮": "\u232E", + "⌒": "\u2312", + "⌓": "\u2313", + "∝": "\u221D", + "∝": "\u221D", + "∷": "\u2237", + "∝": "\u221D", + "≾": "\u227E", + "⊰": "\u22B0", + "𝒫": "\uD835\uDCAB", + "𝓅": "\uD835\uDCC5", + "Ψ": "\u03A8", + "ψ": "\u03C8", + " ": "\u2008", + "𝔔": "\uD835\uDD14", + "𝔮": "\uD835\uDD2E", + "⨌": "\u2A0C", + "𝕢": "\uD835\uDD62", + "ℚ": "\u211A", + "⁗": "\u2057", + "𝒬": "\uD835\uDCAC", + "𝓆": "\uD835\uDCC6", + "ℍ": "\u210D", + "⨖": "\u2A16", + "?": "\u003F", + "≟": "\u225F", + """: "\u0022", + """: "\u0022", + """: "\u0022", + """: "\u0022", + "⇛": "\u21DB", + "∽̱": "\u223D\u0331", + "Ŕ": "\u0154", + "ŕ": "\u0155", + "√": "\u221A", + "⦳": "\u29B3", + "⟩": "\u27E9", + "⟫": "\u27EB", + "⦒": "\u2992", + "⦥": "\u29A5", + "⟩": "\u27E9", + "»": "\u00BB", + "»": "\u00BB", + "⥵": "\u2975", + "⇥": "\u21E5", + "⤠": "\u2920", + "⤳": "\u2933", + "→": "\u2192", + "↠": "\u21A0", + "⇒": "\u21D2", + "⤞": "\u291E", + "↪": "\u21AA", + "↬": "\u21AC", + "⥅": "\u2945", + "⥴": "\u2974", + "⤖": "\u2916", + "↣": "\u21A3", + "↝": "\u219D", + "⤚": "\u291A", + "⤜": "\u291C", + "∶": "\u2236", + "ℚ": "\u211A", + "⤍": "\u290D", + "⤏": "\u290F", + "⤐": "\u2910", + "❳": "\u2773", + "}": "\u007D", + "]": "\u005D", + "⦌": "\u298C", + "⦎": "\u298E", + "⦐": "\u2990", + "Ř": "\u0158", + "ř": "\u0159", + "Ŗ": "\u0156", + "ŗ": "\u0157", + "⌉": "\u2309", + "}": "\u007D", + "Р": "\u0420", + "р": "\u0440", + "⤷": "\u2937", + "⥩": "\u2969", + "”": "\u201D", + "”": "\u201D", + "↳": "\u21B3", + "ℜ": "\u211C", + "ℛ": "\u211B", + "ℜ": "\u211C", + "ℝ": "\u211D", + "ℜ": "\u211C", + "▭": "\u25AD", + "®": "\u00AE", + "®": "\u00AE", + "®": "\u00AE", + "®": "\u00AE", + "∋": "\u220B", + "⇋": "\u21CB", + "⥯": "\u296F", + "⥽": "\u297D", + "⌋": "\u230B", + "𝔯": "\uD835\uDD2F", + "ℜ": "\u211C", + "⥤": "\u2964", + "⇁": "\u21C1", + "⇀": "\u21C0", + "⥬": "\u296C", + "Ρ": "\u03A1", + "ρ": "\u03C1", + "ϱ": "\u03F1", + "⟩": "\u27E9", + "⇥": "\u21E5", + "→": "\u2192", + "→": "\u2192", + "⇒": "\u21D2", + "⇄": "\u21C4", + "↣": "\u21A3", + "⌉": "\u2309", + "⟧": "\u27E7", + "⥝": "\u295D", + "⥕": "\u2955", + "⇂": "\u21C2", + "⌋": "\u230B", + "⇁": "\u21C1", + "⇀": "\u21C0", + "⇄": "\u21C4", + "⇌": "\u21CC", + "⇉": "\u21C9", + "↝": "\u219D", + "↦": "\u21A6", + "⊢": "\u22A2", + "⥛": "\u295B", + "⋌": "\u22CC", + "⧐": "\u29D0", + "⊳": "\u22B3", + "⊵": "\u22B5", + "⥏": "\u294F", + "⥜": "\u295C", + "⥔": "\u2954", + "↾": "\u21BE", + "⥓": "\u2953", + "⇀": "\u21C0", + "˚": "\u02DA", + "≓": "\u2253", + "⇄": "\u21C4", + "⇌": "\u21CC", + "‏": "\u200F", + "⎱": "\u23B1", + "⎱": "\u23B1", + "⫮": "\u2AEE", + "⟭": "\u27ED", + "⇾": "\u21FE", + "⟧": "\u27E7", + "⦆": "\u2986", + "𝕣": "\uD835\uDD63", + "ℝ": "\u211D", + "⨮": "\u2A2E", + "⨵": "\u2A35", + "⥰": "\u2970", + ")": "\u0029", + "⦔": "\u2994", + "⨒": "\u2A12", + "⇉": "\u21C9", + "⇛": "\u21DB", + "›": "\u203A", + "𝓇": "\uD835\uDCC7", + "ℛ": "\u211B", + "↱": "\u21B1", + "↱": "\u21B1", + "]": "\u005D", + "’": "\u2019", + "’": "\u2019", + "⋌": "\u22CC", + "⋊": "\u22CA", + "▹": "\u25B9", + "⊵": "\u22B5", + "▸": "\u25B8", + "⧎": "\u29CE", + "⧴": "\u29F4", + "⥨": "\u2968", + "℞": "\u211E", + "Ś": "\u015A", + "ś": "\u015B", + "‚": "\u201A", + "⪸": "\u2AB8", + "Š": "\u0160", + "š": "\u0161", + "⪼": "\u2ABC", + "≻": "\u227B", + "≽": "\u227D", + "⪰": "\u2AB0", + "⪴": "\u2AB4", + "Ş": "\u015E", + "ş": "\u015F", + "Ŝ": "\u015C", + "ŝ": "\u015D", + "⪺": "\u2ABA", + "⪶": "\u2AB6", + "⋩": "\u22E9", + "⨓": "\u2A13", + "≿": "\u227F", + "С": "\u0421", + "с": "\u0441", + "⊡": "\u22A1", + "⋅": "\u22C5", + "⩦": "\u2A66", + "⤥": "\u2925", + "↘": "\u2198", + "⇘": "\u21D8", + "↘": "\u2198", + "§": "\u00A7", + "§": "\u00A7", + ";": "\u003B", + "⤩": "\u2929", + "∖": "\u2216", + "∖": "\u2216", + "✶": "\u2736", + "𝔖": "\uD835\uDD16", + "𝔰": "\uD835\uDD30", + "⌢": "\u2322", + "♯": "\u266F", + "Щ": "\u0429", + "щ": "\u0449", + "Ш": "\u0428", + "ш": "\u0448", + "↓": "\u2193", + "←": "\u2190", + "∣": "\u2223", + "∥": "\u2225", + "→": "\u2192", + "↑": "\u2191", + "­": "\u00AD", + "­": "\u00AD", + "Σ": "\u03A3", + "σ": "\u03C3", + "ς": "\u03C2", + "ς": "\u03C2", + "∼": "\u223C", + "⩪": "\u2A6A", + "≃": "\u2243", + "≃": "\u2243", + "⪞": "\u2A9E", + "⪠": "\u2AA0", + "⪝": "\u2A9D", + "⪟": "\u2A9F", + "≆": "\u2246", + "⨤": "\u2A24", + "⥲": "\u2972", + "←": "\u2190", + "∘": "\u2218", + "∖": "\u2216", + "⨳": "\u2A33", + "⧤": "\u29E4", + "∣": "\u2223", + "⌣": "\u2323", + "⪪": "\u2AAA", + "⪬": "\u2AAC", + "⪬︀": "\u2AAC\uFE00", + "Ь": "\u042C", + "ь": "\u044C", + "⌿": "\u233F", + "⧄": "\u29C4", + "/": "\u002F", + "𝕊": "\uD835\uDD4A", + "𝕤": "\uD835\uDD64", + "♠": "\u2660", + "♠": "\u2660", + "∥": "\u2225", + "⊓": "\u2293", + "⊓︀": "\u2293\uFE00", + "⊔": "\u2294", + "⊔︀": "\u2294\uFE00", + "√": "\u221A", + "⊏": "\u228F", + "⊑": "\u2291", + "⊏": "\u228F", + "⊑": "\u2291", + "⊐": "\u2290", + "⊒": "\u2292", + "⊐": "\u2290", + "⊒": "\u2292", + "□": "\u25A1", + "□": "\u25A1", + "⊓": "\u2293", + "⊏": "\u228F", + "⊑": "\u2291", + "⊐": "\u2290", + "⊒": "\u2292", + "⊔": "\u2294", + "▪": "\u25AA", + "□": "\u25A1", + "▪": "\u25AA", + "→": "\u2192", + "𝒮": "\uD835\uDCAE", + "𝓈": "\uD835\uDCC8", + "∖": "\u2216", + "⌣": "\u2323", + "⋆": "\u22C6", + "⋆": "\u22C6", + "☆": "\u2606", + "★": "\u2605", + "ϵ": "\u03F5", + "ϕ": "\u03D5", + "¯": "\u00AF", + "⊂": "\u2282", + "⋐": "\u22D0", + "⪽": "\u2ABD", + "⫅": "\u2AC5", + "⊆": "\u2286", + "⫃": "\u2AC3", + "⫁": "\u2AC1", + "⫋": "\u2ACB", + "⊊": "\u228A", + "⪿": "\u2ABF", + "⥹": "\u2979", + "⊂": "\u2282", + "⋐": "\u22D0", + "⊆": "\u2286", + "⫅": "\u2AC5", + "⊆": "\u2286", + "⊊": "\u228A", + "⫋": "\u2ACB", + "⫇": "\u2AC7", + "⫕": "\u2AD5", + "⫓": "\u2AD3", + "⪸": "\u2AB8", + "≻": "\u227B", + "≽": "\u227D", + "≻": "\u227B", + "⪰": "\u2AB0", + "≽": "\u227D", + "≿": "\u227F", + "⪰": "\u2AB0", + "⪺": "\u2ABA", + "⪶": "\u2AB6", + "⋩": "\u22E9", + "≿": "\u227F", + "∋": "\u220B", + "∑": "\u2211", + "∑": "\u2211", + "♪": "\u266A", + "¹": "\u00B9", + "¹": "\u00B9", + "²": "\u00B2", + "²": "\u00B2", + "³": "\u00B3", + "³": "\u00B3", + "⊃": "\u2283", + "⋑": "\u22D1", + "⪾": "\u2ABE", + "⫘": "\u2AD8", + "⫆": "\u2AC6", + "⊇": "\u2287", + "⫄": "\u2AC4", + "⊃": "\u2283", + "⊇": "\u2287", + "⟉": "\u27C9", + "⫗": "\u2AD7", + "⥻": "\u297B", + "⫂": "\u2AC2", + "⫌": "\u2ACC", + "⊋": "\u228B", + "⫀": "\u2AC0", + "⊃": "\u2283", + "⋑": "\u22D1", + "⊇": "\u2287", + "⫆": "\u2AC6", + "⊋": "\u228B", + "⫌": "\u2ACC", + "⫈": "\u2AC8", + "⫔": "\u2AD4", + "⫖": "\u2AD6", + "⤦": "\u2926", + "↙": "\u2199", + "⇙": "\u21D9", + "↙": "\u2199", + "⤪": "\u292A", + "ß": "\u00DF", + "ß": "\u00DF", + " ": "\u0009", + "⌖": "\u2316", + "Τ": "\u03A4", + "τ": "\u03C4", + "⎴": "\u23B4", + "Ť": "\u0164", + "ť": "\u0165", + "Ţ": "\u0162", + "ţ": "\u0163", + "Т": "\u0422", + "т": "\u0442", + "⃛": "\u20DB", + "⌕": "\u2315", + "𝔗": "\uD835\uDD17", + "𝔱": "\uD835\uDD31", + "∴": "\u2234", + "∴": "\u2234", + "∴": "\u2234", + "Θ": "\u0398", + "θ": "\u03B8", + "ϑ": "\u03D1", + "ϑ": "\u03D1", + "≈": "\u2248", + "∼": "\u223C", + "  ": "\u205F\u200A", + " ": "\u2009", + " ": "\u2009", + "≈": "\u2248", + "∼": "\u223C", + "Þ": "\u00DE", + "Þ": "\u00DE", + "þ": "\u00FE", + "þ": "\u00FE", + "˜": "\u02DC", + "∼": "\u223C", + "≃": "\u2243", + "≅": "\u2245", + "≈": "\u2248", + "⨱": "\u2A31", + "⊠": "\u22A0", + "×": "\u00D7", + "×": "\u00D7", + "⨰": "\u2A30", + "∭": "\u222D", + "⤨": "\u2928", + "⌶": "\u2336", + "⫱": "\u2AF1", + "⊤": "\u22A4", + "𝕋": "\uD835\uDD4B", + "𝕥": "\uD835\uDD65", + "⫚": "\u2ADA", + "⤩": "\u2929", + "‴": "\u2034", + "™": "\u2122", + "™": "\u2122", + "▵": "\u25B5", + "▿": "\u25BF", + "◃": "\u25C3", + "⊴": "\u22B4", + "≜": "\u225C", + "▹": "\u25B9", + "⊵": "\u22B5", + "◬": "\u25EC", + "≜": "\u225C", + "⨺": "\u2A3A", + "⃛": "\u20DB", + "⨹": "\u2A39", + "⧍": "\u29CD", + "⨻": "\u2A3B", + "⏢": "\u23E2", + "𝒯": "\uD835\uDCAF", + "𝓉": "\uD835\uDCC9", + "Ц": "\u0426", + "ц": "\u0446", + "Ћ": "\u040B", + "ћ": "\u045B", + "Ŧ": "\u0166", + "ŧ": "\u0167", + "≬": "\u226C", + "↞": "\u219E", + "↠": "\u21A0", + "Ú": "\u00DA", + "Ú": "\u00DA", + "ú": "\u00FA", + "ú": "\u00FA", + "↑": "\u2191", + "↟": "\u219F", + "⇑": "\u21D1", + "⥉": "\u2949", + "Ў": "\u040E", + "ў": "\u045E", + "Ŭ": "\u016C", + "ŭ": "\u016D", + "Û": "\u00DB", + "Û": "\u00DB", + "û": "\u00FB", + "û": "\u00FB", + "У": "\u0423", + "у": "\u0443", + "⇅": "\u21C5", + "Ű": "\u0170", + "ű": "\u0171", + "⥮": "\u296E", + "⥾": "\u297E", + "𝔘": "\uD835\uDD18", + "𝔲": "\uD835\uDD32", + "Ù": "\u00D9", + "Ù": "\u00D9", + "ù": "\u00F9", + "ù": "\u00F9", + "⥣": "\u2963", + "↿": "\u21BF", + "↾": "\u21BE", + "▀": "\u2580", + "⌜": "\u231C", + "⌜": "\u231C", + "⌏": "\u230F", + "◸": "\u25F8", + "Ū": "\u016A", + "ū": "\u016B", + "¨": "\u00A8", + "¨": "\u00A8", + "_": "\u005F", + "⏟": "\u23DF", + "⎵": "\u23B5", + "⏝": "\u23DD", + "⋃": "\u22C3", + "⊎": "\u228E", + "Ų": "\u0172", + "ų": "\u0173", + "𝕌": "\uD835\uDD4C", + "𝕦": "\uD835\uDD66", + "⤒": "\u2912", + "↑": "\u2191", + "↑": "\u2191", + "⇑": "\u21D1", + "⇅": "\u21C5", + "↕": "\u2195", + "↕": "\u2195", + "⇕": "\u21D5", + "⥮": "\u296E", + "↿": "\u21BF", + "↾": "\u21BE", + "⊎": "\u228E", + "↖": "\u2196", + "↗": "\u2197", + "υ": "\u03C5", + "ϒ": "\u03D2", + "ϒ": "\u03D2", + "Υ": "\u03A5", + "υ": "\u03C5", + "↥": "\u21A5", + "⊥": "\u22A5", + "⇈": "\u21C8", + "⌝": "\u231D", + "⌝": "\u231D", + "⌎": "\u230E", + "Ů": "\u016E", + "ů": "\u016F", + "◹": "\u25F9", + "𝒰": "\uD835\uDCB0", + "𝓊": "\uD835\uDCCA", + "⋰": "\u22F0", + "Ũ": "\u0168", + "ũ": "\u0169", + "▵": "\u25B5", + "▴": "\u25B4", + "⇈": "\u21C8", + "Ü": "\u00DC", + "Ü": "\u00DC", + "ü": "\u00FC", + "ü": "\u00FC", + "⦧": "\u29A7", + "⦜": "\u299C", + "ϵ": "\u03F5", + "ϰ": "\u03F0", + "∅": "\u2205", + "ϕ": "\u03D5", + "ϖ": "\u03D6", + "∝": "\u221D", + "↕": "\u2195", + "⇕": "\u21D5", + "ϱ": "\u03F1", + "ς": "\u03C2", + "⊊︀": "\u228A\uFE00", + "⫋︀": "\u2ACB\uFE00", + "⊋︀": "\u228B\uFE00", + "⫌︀": "\u2ACC\uFE00", + "ϑ": "\u03D1", + "⊲": "\u22B2", + "⊳": "\u22B3", + "⫨": "\u2AE8", + "⫫": "\u2AEB", + "⫩": "\u2AE9", + "В": "\u0412", + "в": "\u0432", + "⊢": "\u22A2", + "⊨": "\u22A8", + "⊩": "\u22A9", + "⊫": "\u22AB", + "⫦": "\u2AE6", + "⊻": "\u22BB", + "∨": "\u2228", + "⋁": "\u22C1", + "≚": "\u225A", + "⋮": "\u22EE", + "|": "\u007C", + "‖": "\u2016", + "|": "\u007C", + "‖": "\u2016", + "∣": "\u2223", + "|": "\u007C", + "❘": "\u2758", + "≀": "\u2240", + " ": "\u200A", + "𝔙": "\uD835\uDD19", + "𝔳": "\uD835\uDD33", + "⊲": "\u22B2", + "⊂⃒": "\u2282\u20D2", + "⊃⃒": "\u2283\u20D2", + "𝕍": "\uD835\uDD4D", + "𝕧": "\uD835\uDD67", + "∝": "\u221D", + "⊳": "\u22B3", + "𝒱": "\uD835\uDCB1", + "𝓋": "\uD835\uDCCB", + "⫋︀": "\u2ACB\uFE00", + "⊊︀": "\u228A\uFE00", + "⫌︀": "\u2ACC\uFE00", + "⊋︀": "\u228B\uFE00", + "⊪": "\u22AA", + "⦚": "\u299A", + "Ŵ": "\u0174", + "ŵ": "\u0175", + "⩟": "\u2A5F", + "∧": "\u2227", + "⋀": "\u22C0", + "≙": "\u2259", + "℘": "\u2118", + "𝔚": "\uD835\uDD1A", + "𝔴": "\uD835\uDD34", + "𝕎": "\uD835\uDD4E", + "𝕨": "\uD835\uDD68", + "℘": "\u2118", + "≀": "\u2240", + "≀": "\u2240", + "𝒲": "\uD835\uDCB2", + "𝓌": "\uD835\uDCCC", + "⋂": "\u22C2", + "◯": "\u25EF", + "⋃": "\u22C3", + "▽": "\u25BD", + "𝔛": "\uD835\uDD1B", + "𝔵": "\uD835\uDD35", + "⟷": "\u27F7", + "⟺": "\u27FA", + "Ξ": "\u039E", + "ξ": "\u03BE", + "⟵": "\u27F5", + "⟸": "\u27F8", + "⟼": "\u27FC", + "⋻": "\u22FB", + "⨀": "\u2A00", + "𝕏": "\uD835\uDD4F", + "𝕩": "\uD835\uDD69", + "⨁": "\u2A01", + "⨂": "\u2A02", + "⟶": "\u27F6", + "⟹": "\u27F9", + "𝒳": "\uD835\uDCB3", + "𝓍": "\uD835\uDCCD", + "⨆": "\u2A06", + "⨄": "\u2A04", + "△": "\u25B3", + "⋁": "\u22C1", + "⋀": "\u22C0", + "Ý": "\u00DD", + "Ý": "\u00DD", + "ý": "\u00FD", + "ý": "\u00FD", + "Я": "\u042F", + "я": "\u044F", + "Ŷ": "\u0176", + "ŷ": "\u0177", + "Ы": "\u042B", + "ы": "\u044B", + "¥": "\u00A5", + "¥": "\u00A5", + "𝔜": "\uD835\uDD1C", + "𝔶": "\uD835\uDD36", + "Ї": "\u0407", + "ї": "\u0457", + "𝕐": "\uD835\uDD50", + "𝕪": "\uD835\uDD6A", + "𝒴": "\uD835\uDCB4", + "𝓎": "\uD835\uDCCE", + "Ю": "\u042E", + "ю": "\u044E", + "ÿ": "\u00FF", + "ÿ": "\u00FF", + "Ÿ": "\u0178", + "Ź": "\u0179", + "ź": "\u017A", + "Ž": "\u017D", + "ž": "\u017E", + "З": "\u0417", + "з": "\u0437", + "Ż": "\u017B", + "ż": "\u017C", + "ℨ": "\u2128", + "​": "\u200B", + "Ζ": "\u0396", + "ζ": "\u03B6", + "𝔷": "\uD835\uDD37", + "ℨ": "\u2128", + "Ж": "\u0416", + "ж": "\u0436", + "⇝": "\u21DD", + "𝕫": "\uD835\uDD6B", + "ℤ": "\u2124", + "𝒵": "\uD835\uDCB5", + "𝓏": "\uD835\uDCCF", + "‍": "\u200D", + "‌": "\u200C" +} + +Plugin.config = { + "timeout": "3" +}; + +Plugin.templates = { + "info": "link from #{nickname}: #{title}" +}; + +function replaceAll(string, search, replace) +{ + return string.split(search).join(replace); +} + +function parse(server, origin, channel, result) +{ + const regex = /<title>([^<]+)<\/title>/i; + + if (result.status !== 0 || !result.body) { + Irccd.Logger.info("Fialed"); + return; + } + + const match = regex.exec(result.body); + + if (match) { + title = new String(match[1]); + + for (var o in entities) + title = replaceAll(title, o, entities[o]); + + const kw = { + channel: channel, + nickname: Util.splituser(origin), + origin: origin, + server: server.toString(), + title: title + }; + + server.message(channel, Util.format(Plugin.templates.info, kw)); + } +} + +function start(server, origin, channel, url) +{ + const options = { + url: url, + timeout: parseInt(Plugin.config.timeout) + }; + + if (isNaN(options.timeout)) + options.timeout = 3; + + Http.request(options, function (result) { + parse(server, origin, channel, result); + }); +} + +function onMessage(server, origin, channel, message) +{ + const regex = /(https?:\/\/[^\s]+)/; + const ret = regex.exec(message); + + if (ret) + start(server, origin, channel, ret[1]); +}