miniflare
Version:
Fun, full-featured, fully-local simulator for Cloudflare Workers
1,629 lines (1,619 loc) • 148 kB
JavaScript
// ../../node_modules/.pnpm/kleur@4.1.5/node_modules/kleur/colors.mjs
var FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY = !0;
typeof process < "u" && ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {}, isTTY = process.stdout && process.stdout.isTTY);
var $ = {
enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== "dumb" && (FORCE_COLOR != null && FORCE_COLOR !== "0" || isTTY)
};
function init(x, y) {
let rgx = new RegExp(`\\x1b\\[${y}m`, "g"), open = `\x1B[${x}m`, close = `\x1B[${y}m`;
return function(txt) {
return !$.enabled || txt == null ? txt : open + (~("" + txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) + close;
};
}
var reset = init(0, 0), bold = init(1, 22), dim = init(2, 22), italic = init(3, 23), underline = init(4, 24), inverse = init(7, 27), hidden = init(8, 28), strikethrough = init(9, 29), black = init(30, 39), red = init(31, 39), green = init(32, 39), yellow = init(33, 39), blue = init(34, 39), magenta = init(35, 39), cyan = init(36, 39), white = init(37, 39), gray = init(90, 39), grey = init(90, 39), bgBlack = init(40, 49), bgRed = init(41, 49), bgGreen = init(42, 49), bgYellow = init(43, 49), bgBlue = init(44, 49), bgMagenta = init(45, 49), bgCyan = init(46, 49), bgWhite = init(47, 49);
// src/workers/core/entry.worker.ts
import { HttpError, LogLevel as LogLevel2, SharedHeaders as SharedHeaders2 } from "miniflare:shared";
// src/shared/mime-types.ts
var compressedByCloudflareFL = /* @__PURE__ */ new Set([
// list copied from https://developers.cloudflare.com/speed/optimization/content/brotli/content-compression/#:~:text=If%20supported%20by%20visitors%E2%80%99%20web%20browsers%2C%20Cloudflare%20will%20return%20Gzip%20or%20Brotli%2Dencoded%20responses%20for%20the%20following%20content%20types%3A
"text/html",
"text/richtext",
"text/plain",
"text/css",
"text/x-script",
"text/x-component",
"text/x-java-source",
"text/x-markdown",
"application/javascript",
"application/x-javascript",
"text/javascript",
"text/js",
"image/x-icon",
"image/vnd.microsoft.icon",
"application/x-perl",
"application/x-httpd-cgi",
"text/xml",
"application/xml",
"application/rss+xml",
"application/vnd.api+json",
"application/x-protobuf",
"application/json",
"multipart/bag",
"multipart/mixed",
"application/xhtml+xml",
"font/ttf",
"font/otf",
"font/x-woff",
"image/svg+xml",
"application/vnd.ms-fontobject",
"application/ttf",
"application/x-ttf",
"application/otf",
"application/x-otf",
"application/truetype",
"application/opentype",
"application/x-opentype",
"application/font-woff",
"application/eot",
"application/font",
"application/font-sfnt",
"application/wasm",
"application/javascript-binast",
"application/manifest+json",
"application/ld+json",
"application/graphql+json",
"application/geo+json"
]);
function isCompressedByCloudflareFL(contentTypeHeader) {
if (!contentTypeHeader) return !0;
let [contentType] = contentTypeHeader.split(";");
return compressedByCloudflareFL.has(contentType);
}
// src/workers/core/constants.ts
var CoreHeaders = {
CUSTOM_FETCH_SERVICE: "MF-Custom-Fetch-Service",
CUSTOM_NODE_SERVICE: "MF-Custom-Node-Service",
ORIGINAL_URL: "MF-Original-URL",
PROXY_SHARED_SECRET: "MF-Proxy-Shared-Secret",
DISABLE_PRETTY_ERROR: "MF-Disable-Pretty-Error",
ERROR_STACK: "MF-Experimental-Error-Stack",
ROUTE_OVERRIDE: "MF-Route-Override",
CF_BLOB: "MF-CF-Blob",
// API Proxy
OP_SECRET: "MF-Op-Secret",
OP: "MF-Op",
OP_TARGET: "MF-Op-Target",
OP_KEY: "MF-Op-Key",
OP_SYNC: "MF-Op-Sync",
OP_STRINGIFIED_SIZE: "MF-Op-Stringified-Size",
OP_RESULT_TYPE: "MF-Op-Result-Type"
}, CoreBindings = {
SERVICE_LOOPBACK: "MINIFLARE_LOOPBACK",
SERVICE_USER_ROUTE_PREFIX: "MINIFLARE_USER_ROUTE_",
SERVICE_USER_FALLBACK: "MINIFLARE_USER_FALLBACK",
TEXT_CUSTOM_SERVICE: "MINIFLARE_CUSTOM_SERVICE",
IMAGES_SERVICE: "MINIFLARE_IMAGES_SERVICE",
TEXT_UPSTREAM_URL: "MINIFLARE_UPSTREAM_URL",
JSON_CF_BLOB: "CF_BLOB",
JSON_ROUTES: "MINIFLARE_ROUTES",
JSON_LOG_LEVEL: "MINIFLARE_LOG_LEVEL",
DATA_LIVE_RELOAD_SCRIPT: "MINIFLARE_LIVE_RELOAD_SCRIPT",
DURABLE_OBJECT_NAMESPACE_PROXY: "MINIFLARE_PROXY",
DATA_PROXY_SECRET: "MINIFLARE_PROXY_SECRET",
DATA_PROXY_SHARED_SECRET: "MINIFLARE_PROXY_SHARED_SECRET",
TRIGGER_HANDLERS: "TRIGGER_HANDLERS",
LOG_REQUESTS: "LOG_REQUESTS",
STRIP_DISABLE_PRETTY_ERROR: "STRIP_DISABLE_PRETTY_ERROR"
}, ProxyOps = {
// Get the target or a property of the target
GET: "GET",
// Get the descriptor for a property of the target
GET_OWN_DESCRIPTOR: "GET_OWN_DESCRIPTOR",
// Get the target's own property names
GET_OWN_KEYS: "GET_OWN_KEYS",
// Call a method on the target
CALL: "CALL",
// Remove the strong reference to the target on the "heap", allowing it to be
// garbage collected
FREE: "FREE"
}, ProxyAddresses = {
GLOBAL: 0,
// globalThis
ENV: 1,
// env
USER_START: 2
};
function isFetcherFetch(targetName, key) {
return (targetName === "Fetcher" || targetName === "DurableObject" || targetName === "WorkerRpc") && key === "fetch";
}
function isR2ObjectWriteHttpMetadata(targetName, key) {
return (targetName === "HeadResult" || targetName === "GetResult") && key === "writeHttpMetadata";
}
function isImagesInput(targetName, key) {
return targetName === "ImagesBindingImpl" && key === "input";
}
// src/workers/core/email.ts
import assert from "node:assert";
import { LogLevel, SharedHeaders } from "miniflare:shared";
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/decode-strings.js
var textEncoder = new TextEncoder(), base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", base64Lookup = new Uint8Array(256);
for (i = 0; i < base64Chars.length; i++)
base64Lookup[base64Chars.charCodeAt(i)] = i;
var i;
function decodeBase64(base64) {
let bufferLength = Math.ceil(base64.length / 4) * 3, len = base64.length, p = 0;
base64.length % 4 === 3 ? bufferLength-- : base64.length % 4 === 2 ? bufferLength -= 2 : base64[base64.length - 1] === "=" && (bufferLength--, base64[base64.length - 2] === "=" && bufferLength--);
let arrayBuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arrayBuffer);
for (let i = 0; i < len; i += 4) {
let encoded1 = base64Lookup[base64.charCodeAt(i)], encoded2 = base64Lookup[base64.charCodeAt(i + 1)], encoded3 = base64Lookup[base64.charCodeAt(i + 2)], encoded4 = base64Lookup[base64.charCodeAt(i + 3)];
bytes[p++] = encoded1 << 2 | encoded2 >> 4, bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2, bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
}
return arrayBuffer;
}
function getDecoder(charset) {
return charset = charset || "utf8", new TextDecoder(charset);
}
async function blobToArrayBuffer(blob) {
if ("arrayBuffer" in blob)
return await blob.arrayBuffer();
let fr = new FileReader();
return new Promise((resolve, reject) => {
fr.onload = function(e) {
resolve(e.target.result);
}, fr.onerror = function(e) {
reject(fr.error);
}, fr.readAsArrayBuffer(blob);
});
}
function getHex(c) {
return c >= 48 && c <= 57 || c >= 97 && c <= 102 || c >= 65 && c <= 70 ? String.fromCharCode(c) : !1;
}
function decodeWord(charset, encoding, str) {
let splitPos = charset.indexOf("*");
splitPos >= 0 && (charset = charset.substr(0, splitPos)), encoding = encoding.toUpperCase();
let byteStr;
if (encoding === "Q") {
str = str.replace(/=\s+([0-9a-fA-F])/g, "=$1").replace(/[_\s]/g, " ");
let buf = textEncoder.encode(str), encodedBytes = [];
for (let i = 0, len = buf.length; i < len; i++) {
let c = buf[i];
if (i <= len - 2 && c === 61) {
let c1 = getHex(buf[i + 1]), c2 = getHex(buf[i + 2]);
if (c1 && c2) {
let c3 = parseInt(c1 + c2, 16);
encodedBytes.push(c3), i += 2;
continue;
}
}
encodedBytes.push(c);
}
byteStr = new ArrayBuffer(encodedBytes.length);
let dataView = new DataView(byteStr);
for (let i = 0, len = encodedBytes.length; i < len; i++)
dataView.setUint8(i, encodedBytes[i]);
} else encoding === "B" ? byteStr = decodeBase64(str.replace(/[^a-zA-Z0-9\+\/=]+/g, "")) : byteStr = textEncoder.encode(str);
return getDecoder(charset).decode(byteStr);
}
function decodeWords(str) {
let joinString = !0, done = !1;
for (; !done; ) {
let result = (str || "").toString().replace(/(=\?([^?]+)\?[Bb]\?([^?]*)\?=)\s*(?==\?([^?]+)\?[Bb]\?[^?]*\?=)/g, (match, left, chLeft, encodedLeftStr, chRight) => joinString && chLeft === chRight && encodedLeftStr.length % 4 === 0 && !/=$/.test(encodedLeftStr) ? left + "__\0JOIN\0__" : match).replace(/(=\?([^?]+)\?[Qq]\?[^?]*\?=)\s*(?==\?([^?]+)\?[Qq]\?[^?]*\?=)/g, (match, left, chLeft, chRight) => joinString && chLeft === chRight ? left + "__\0JOIN\0__" : match).replace(/(\?=)?__\x00JOIN\x00__(=\?([^?]+)\?[QqBb]\?)?/g, "").replace(/(=\?[^?]+\?[QqBb]\?[^?]*\?=)\s+(?==\?[^?]+\?[QqBb]\?[^?]*\?=)/g, "$1").replace(/=\?([\w_\-*]+)\?([QqBb])\?([^?]*)\?=/g, (m, charset, encoding, text) => decodeWord(charset, encoding, text));
if (joinString && result.indexOf("\uFFFD") >= 0)
joinString = !1;
else
return result;
}
}
function decodeURIComponentWithCharset(encodedStr, charset) {
charset = charset || "utf-8";
let encodedBytes = [];
for (let i = 0; i < encodedStr.length; i++) {
let c = encodedStr.charAt(i);
if (c === "%" && /^[a-f0-9]{2}/i.test(encodedStr.substr(i + 1, 2))) {
let byte = encodedStr.substr(i + 1, 2);
i += 2, encodedBytes.push(parseInt(byte, 16));
} else if (c.charCodeAt(0) > 126) {
c = textEncoder.encode(c);
for (let j = 0; j < c.length; j++)
encodedBytes.push(c[j]);
} else
encodedBytes.push(c.charCodeAt(0));
}
let byteStr = new ArrayBuffer(encodedBytes.length), dataView = new DataView(byteStr);
for (let i = 0, len = encodedBytes.length; i < len; i++)
dataView.setUint8(i, encodedBytes[i]);
return getDecoder(charset).decode(byteStr);
}
function decodeParameterValueContinuations(header) {
let paramKeys = /* @__PURE__ */ new Map();
Object.keys(header.params).forEach((key) => {
let match = key.match(/\*((\d+)\*?)?$/);
if (!match)
return;
let actualKey = key.substr(0, match.index).toLowerCase(), nr = Number(match[2]) || 0, paramVal;
paramKeys.has(actualKey) ? paramVal = paramKeys.get(actualKey) : (paramVal = {
charset: !1,
values: []
}, paramKeys.set(actualKey, paramVal));
let value = header.params[key];
nr === 0 && match[0].charAt(match[0].length - 1) === "*" && (match = value.match(/^([^']*)'[^']*'(.*)$/)) && (paramVal.charset = match[1] || "utf-8", value = match[2]), paramVal.values.push({ nr, value }), delete header.params[key];
}), paramKeys.forEach((paramVal, key) => {
header.params[key] = decodeURIComponentWithCharset(
paramVal.values.sort((a, b) => a.nr - b.nr).map((a) => a.value).join(""),
paramVal.charset
);
});
}
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/pass-through-decoder.js
var PassThroughDecoder = class {
constructor() {
this.chunks = [];
}
update(line) {
this.chunks.push(line), this.chunks.push(`
`);
}
finalize() {
return blobToArrayBuffer(new Blob(this.chunks, { type: "application/octet-stream" }));
}
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/base64-decoder.js
var Base64Decoder = class {
constructor(opts) {
opts = opts || {}, this.decoder = opts.decoder || new TextDecoder(), this.maxChunkSize = 100 * 1024, this.chunks = [], this.remainder = "";
}
update(buffer) {
let str = this.decoder.decode(buffer);
if (/[^a-zA-Z0-9+\/]/.test(str) && (str = str.replace(/[^a-zA-Z0-9+\/]+/g, "")), this.remainder += str, this.remainder.length >= this.maxChunkSize) {
let allowedBytes = Math.floor(this.remainder.length / 4) * 4, base64Str;
allowedBytes === this.remainder.length ? (base64Str = this.remainder, this.remainder = "") : (base64Str = this.remainder.substr(0, allowedBytes), this.remainder = this.remainder.substr(allowedBytes)), base64Str.length && this.chunks.push(decodeBase64(base64Str));
}
}
finalize() {
return this.remainder && !/^=+$/.test(this.remainder) && this.chunks.push(decodeBase64(this.remainder)), blobToArrayBuffer(new Blob(this.chunks, { type: "application/octet-stream" }));
}
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/qp-decoder.js
var QPDecoder = class {
constructor(opts) {
opts = opts || {}, this.decoder = opts.decoder || new TextDecoder(), this.maxChunkSize = 100 * 1024, this.remainder = "", this.chunks = [];
}
decodeQPBytes(encodedBytes) {
let buf = new ArrayBuffer(encodedBytes.length), dataView = new DataView(buf);
for (let i = 0, len = encodedBytes.length; i < len; i++)
dataView.setUint8(i, parseInt(encodedBytes[i], 16));
return buf;
}
decodeChunks(str) {
str = str.replace(/=\r?\n/g, "");
let list = str.split(/(?==)/), encodedBytes = [];
for (let part of list) {
if (part.charAt(0) !== "=") {
encodedBytes.length && (this.chunks.push(this.decodeQPBytes(encodedBytes)), encodedBytes = []), this.chunks.push(part);
continue;
}
if (part.length === 3) {
encodedBytes.push(part.substr(1));
continue;
}
part.length > 3 && (encodedBytes.push(part.substr(1, 2)), this.chunks.push(this.decodeQPBytes(encodedBytes)), encodedBytes = [], part = part.substr(3), this.chunks.push(part));
}
encodedBytes.length && (this.chunks.push(this.decodeQPBytes(encodedBytes)), encodedBytes = []);
}
update(buffer) {
let str = this.decoder.decode(buffer) + `
`;
if (str = this.remainder + str, str.length < this.maxChunkSize) {
this.remainder = str;
return;
}
this.remainder = "";
let partialEnding = str.match(/=[a-fA-F0-9]?$/);
if (partialEnding) {
if (partialEnding.index === 0) {
this.remainder = str;
return;
}
this.remainder = str.substr(partialEnding.index), str = str.substr(0, partialEnding.index);
}
this.decodeChunks(str);
}
finalize() {
return this.remainder.length && (this.decodeChunks(this.remainder), this.remainder = ""), blobToArrayBuffer(new Blob(this.chunks, { type: "application/octet-stream" }));
}
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/mime-node.js
var MimeNode = class {
constructor(opts) {
opts = opts || {}, this.postalMime = opts.postalMime, this.root = !!opts.parentNode, this.childNodes = [], opts.parentNode && opts.parentNode.childNodes.push(this), this.state = "header", this.headerLines = [], this.contentType = {
value: "text/plain",
default: !0
}, this.contentTransferEncoding = {
value: "8bit"
}, this.contentDisposition = {
value: ""
}, this.headers = [], this.contentDecoder = !1;
}
setupContentDecoder(transferEncoding) {
/base64/i.test(transferEncoding) ? this.contentDecoder = new Base64Decoder() : /quoted-printable/i.test(transferEncoding) ? this.contentDecoder = new QPDecoder({ decoder: getDecoder(this.contentType.parsed.params.charset) }) : this.contentDecoder = new PassThroughDecoder();
}
async finalize() {
if (this.state === "finished")
return;
this.state === "header" && this.processHeaders();
let boundaries = this.postalMime.boundaries;
for (let i = boundaries.length - 1; i >= 0; i--)
if (boundaries[i].node === this) {
boundaries.splice(i, 1);
break;
}
await this.finalizeChildNodes(), this.content = this.contentDecoder ? await this.contentDecoder.finalize() : null, this.state = "finished";
}
async finalizeChildNodes() {
for (let childNode of this.childNodes)
await childNode.finalize();
}
parseStructuredHeader(str) {
let response = {
value: !1,
params: {}
}, key = !1, value = "", stage = "value", quote = !1, escaped2 = !1, chr;
for (let i = 0, len = str.length; i < len; i++)
switch (chr = str.charAt(i), stage) {
case "key":
if (chr === "=") {
key = value.trim().toLowerCase(), stage = "value", value = "";
break;
}
value += chr;
break;
case "value":
if (escaped2)
value += chr;
else if (chr === "\\") {
escaped2 = !0;
continue;
} else quote && chr === quote ? quote = !1 : !quote && chr === '"' ? quote = chr : !quote && chr === ";" ? (key === !1 ? response.value = value.trim() : response.params[key] = value.trim(), stage = "key", value = "") : value += chr;
escaped2 = !1;
break;
}
return value = value.trim(), stage === "value" ? key === !1 ? response.value = value : response.params[key] = value : value && (response.params[value.toLowerCase()] = ""), response.value && (response.value = response.value.toLowerCase()), decodeParameterValueContinuations(response), response;
}
decodeFlowedText(str, delSp) {
return str.split(/\r?\n/).reduce((previousValue, currentValue) => / $/.test(previousValue) && !/(^|\n)-- $/.test(previousValue) ? delSp ? previousValue.slice(0, -1) + currentValue : previousValue + currentValue : previousValue + `
` + currentValue).replace(/^ /gm, "");
}
getTextContent() {
if (!this.content)
return "";
let str = getDecoder(this.contentType.parsed.params.charset).decode(this.content);
return /^flowed$/i.test(this.contentType.parsed.params.format) && (str = this.decodeFlowedText(str, /^yes$/i.test(this.contentType.parsed.params.delsp))), str;
}
processHeaders() {
for (let i = this.headerLines.length - 1; i >= 0; i--) {
let line = this.headerLines[i];
if (i && /^\s/.test(line))
this.headerLines[i - 1] += `
` + line, this.headerLines.splice(i, 1);
else {
line = line.replace(/\s+/g, " ");
let sep = line.indexOf(":"), key = sep < 0 ? line.trim() : line.substr(0, sep).trim(), value = sep < 0 ? "" : line.substr(sep + 1).trim();
switch (this.headers.push({ key: key.toLowerCase(), originalKey: key, value }), key.toLowerCase()) {
case "content-type":
this.contentType.default && (this.contentType = { value, parsed: {} });
break;
case "content-transfer-encoding":
this.contentTransferEncoding = { value, parsed: {} };
break;
case "content-disposition":
this.contentDisposition = { value, parsed: {} };
break;
case "content-id":
this.contentId = value;
break;
case "content-description":
this.contentDescription = value;
break;
}
}
}
this.contentType.parsed = this.parseStructuredHeader(this.contentType.value), this.contentType.multipart = /^multipart\//i.test(this.contentType.parsed.value) ? this.contentType.parsed.value.substr(this.contentType.parsed.value.indexOf("/") + 1) : !1, this.contentType.multipart && this.contentType.parsed.params.boundary && this.postalMime.boundaries.push({
value: textEncoder.encode(this.contentType.parsed.params.boundary),
node: this
}), this.contentDisposition.parsed = this.parseStructuredHeader(this.contentDisposition.value), this.contentTransferEncoding.encoding = this.contentTransferEncoding.value.toLowerCase().split(/[^\w-]/).shift(), this.setupContentDecoder(this.contentTransferEncoding.encoding);
}
feed(line) {
switch (this.state) {
case "header":
if (!line.length)
return this.state = "body", this.processHeaders();
this.headerLines.push(getDecoder().decode(line));
break;
case "body":
this.contentDecoder.update(line);
}
}
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/html-entities.js
var htmlEntities = {
"Æ": "\xC6",
"Æ": "\xC6",
"&": "&",
"&": "&",
"Á": "\xC1",
"Á": "\xC1",
"Ă": "\u0102",
"Â": "\xC2",
"Â": "\xC2",
"А": "\u0410",
"𝔄": "\u{1D504}",
"À": "\xC0",
"À": "\xC0",
"Α": "\u0391",
"Ā": "\u0100",
"⩓": "\u2A53",
"Ą": "\u0104",
"𝔸": "\u{1D538}",
"⁡": "\u2061",
"Å": "\xC5",
"Å": "\xC5",
"𝒜": "\u{1D49C}",
"≔": "\u2254",
"Ã": "\xC3",
"Ã": "\xC3",
"Ä": "\xC4",
"Ä": "\xC4",
"∖": "\u2216",
"⫧": "\u2AE7",
"⌆": "\u2306",
"Б": "\u0411",
"∵": "\u2235",
"ℬ": "\u212C",
"Β": "\u0392",
"𝔅": "\u{1D505}",
"𝔹": "\u{1D539}",
"˘": "\u02D8",
"ℬ": "\u212C",
"≎": "\u224E",
"Ч": "\u0427",
"©": "\xA9",
"©": "\xA9",
"Ć": "\u0106",
"⋒": "\u22D2",
"ⅅ": "\u2145",
"ℭ": "\u212D",
"Č": "\u010C",
"Ç": "\xC7",
"Ç": "\xC7",
"Ĉ": "\u0108",
"∰": "\u2230",
"Ċ": "\u010A",
"¸": "\xB8",
"·": "\xB7",
"ℭ": "\u212D",
"Χ": "\u03A7",
"⊙": "\u2299",
"⊖": "\u2296",
"⊕": "\u2295",
"⊗": "\u2297",
"∲": "\u2232",
"”": "\u201D",
"’": "\u2019",
"∷": "\u2237",
"⩴": "\u2A74",
"≡": "\u2261",
"∯": "\u222F",
"∮": "\u222E",
"ℂ": "\u2102",
"∐": "\u2210",
"∳": "\u2233",
"⨯": "\u2A2F",
"𝒞": "\u{1D49E}",
"⋓": "\u22D3",
"≍": "\u224D",
"ⅅ": "\u2145",
"⤑": "\u2911",
"Ђ": "\u0402",
"Ѕ": "\u0405",
"Џ": "\u040F",
"‡": "\u2021",
"↡": "\u21A1",
"⫤": "\u2AE4",
"Ď": "\u010E",
"Д": "\u0414",
"∇": "\u2207",
"Δ": "\u0394",
"𝔇": "\u{1D507}",
"´": "\xB4",
"˙": "\u02D9",
"˝": "\u02DD",
"`": "`",
"˜": "\u02DC",
"⋄": "\u22C4",
"ⅆ": "\u2146",
"𝔻": "\u{1D53B}",
"¨": "\xA8",
"⃜": "\u20DC",
"≐": "\u2250",
"∯": "\u222F",
"¨": "\xA8",
"⇓": "\u21D3",
"⇐": "\u21D0",
"⇔": "\u21D4",
"⫤": "\u2AE4",
"⟸": "\u27F8",
"⟺": "\u27FA",
"⟹": "\u27F9",
"⇒": "\u21D2",
"⊨": "\u22A8",
"⇑": "\u21D1",
"⇕": "\u21D5",
"∥": "\u2225",
"↓": "\u2193",
"⤓": "\u2913",
"⇵": "\u21F5",
"̑": "\u0311",
"⥐": "\u2950",
"⥞": "\u295E",
"↽": "\u21BD",
"⥖": "\u2956",
"⥟": "\u295F",
"⇁": "\u21C1",
"⥗": "\u2957",
"⊤": "\u22A4",
"↧": "\u21A7",
"⇓": "\u21D3",
"𝒟": "\u{1D49F}",
"Đ": "\u0110",
"Ŋ": "\u014A",
"Ð": "\xD0",
"Ð": "\xD0",
"É": "\xC9",
"É": "\xC9",
"Ě": "\u011A",
"Ê": "\xCA",
"Ê": "\xCA",
"Э": "\u042D",
"Ė": "\u0116",
"𝔈": "\u{1D508}",
"È": "\xC8",
"È": "\xC8",
"∈": "\u2208",
"Ē": "\u0112",
"◻": "\u25FB",
"▫": "\u25AB",
"Ę": "\u0118",
"𝔼": "\u{1D53C}",
"Ε": "\u0395",
"⩵": "\u2A75",
"≂": "\u2242",
"⇌": "\u21CC",
"ℰ": "\u2130",
"⩳": "\u2A73",
"Η": "\u0397",
"Ë": "\xCB",
"Ë": "\xCB",
"∃": "\u2203",
"ⅇ": "\u2147",
"Ф": "\u0424",
"𝔉": "\u{1D509}",
"◼": "\u25FC",
"▪": "\u25AA",
"𝔽": "\u{1D53D}",
"∀": "\u2200",
"ℱ": "\u2131",
"ℱ": "\u2131",
"Ѓ": "\u0403",
">": ">",
">": ">",
"Γ": "\u0393",
"Ϝ": "\u03DC",
"Ğ": "\u011E",
"Ģ": "\u0122",
"Ĝ": "\u011C",
"Г": "\u0413",
"Ġ": "\u0120",
"𝔊": "\u{1D50A}",
"⋙": "\u22D9",
"𝔾": "\u{1D53E}",
"≥": "\u2265",
"⋛": "\u22DB",
"≧": "\u2267",
"⪢": "\u2AA2",
"≷": "\u2277",
"⩾": "\u2A7E",
"≳": "\u2273",
"𝒢": "\u{1D4A2}",
"≫": "\u226B",
"Ъ": "\u042A",
"ˇ": "\u02C7",
"^": "^",
"Ĥ": "\u0124",
"ℌ": "\u210C",
"ℋ": "\u210B",
"ℍ": "\u210D",
"─": "\u2500",
"ℋ": "\u210B",
"Ħ": "\u0126",
"≎": "\u224E",
"≏": "\u224F",
"Е": "\u0415",
"IJ": "\u0132",
"Ё": "\u0401",
"Í": "\xCD",
"Í": "\xCD",
"Î": "\xCE",
"Î": "\xCE",
"И": "\u0418",
"İ": "\u0130",
"ℑ": "\u2111",
"Ì": "\xCC",
"Ì": "\xCC",
"ℑ": "\u2111",
"Ī": "\u012A",
"ⅈ": "\u2148",
"⇒": "\u21D2",
"∬": "\u222C",
"∫": "\u222B",
"⋂": "\u22C2",
"⁣": "\u2063",
"⁢": "\u2062",
"Į": "\u012E",
"𝕀": "\u{1D540}",
"Ι": "\u0399",
"ℐ": "\u2110",
"Ĩ": "\u0128",
"І": "\u0406",
"Ï": "\xCF",
"Ï": "\xCF",
"Ĵ": "\u0134",
"Й": "\u0419",
"𝔍": "\u{1D50D}",
"𝕁": "\u{1D541}",
"𝒥": "\u{1D4A5}",
"Ј": "\u0408",
"Є": "\u0404",
"Х": "\u0425",
"Ќ": "\u040C",
"Κ": "\u039A",
"Ķ": "\u0136",
"К": "\u041A",
"𝔎": "\u{1D50E}",
"𝕂": "\u{1D542}",
"𝒦": "\u{1D4A6}",
"Љ": "\u0409",
"<": "<",
"<": "<",
"Ĺ": "\u0139",
"Λ": "\u039B",
"⟪": "\u27EA",
"ℒ": "\u2112",
"↞": "\u219E",
"Ľ": "\u013D",
"Ļ": "\u013B",
"Л": "\u041B",
"⟨": "\u27E8",
"←": "\u2190",
"⇤": "\u21E4",
"⇆": "\u21C6",
"⌈": "\u2308",
"⟦": "\u27E6",
"⥡": "\u2961",
"⇃": "\u21C3",
"⥙": "\u2959",
"⌊": "\u230A",
"↔": "\u2194",
"⥎": "\u294E",
"⊣": "\u22A3",
"↤": "\u21A4",
"⥚": "\u295A",
"⊲": "\u22B2",
"⧏": "\u29CF",
"⊴": "\u22B4",
"⥑": "\u2951",
"⥠": "\u2960",
"↿": "\u21BF",
"⥘": "\u2958",
"↼": "\u21BC",
"⥒": "\u2952",
"⇐": "\u21D0",
"⇔": "\u21D4",
"⋚": "\u22DA",
"≦": "\u2266",
"≶": "\u2276",
"⪡": "\u2AA1",
"⩽": "\u2A7D",
"≲": "\u2272",
"𝔏": "\u{1D50F}",
"⋘": "\u22D8",
"⇚": "\u21DA",
"Ŀ": "\u013F",
"⟵": "\u27F5",
"⟷": "\u27F7",
"⟶": "\u27F6",
"⟸": "\u27F8",
"⟺": "\u27FA",
"⟹": "\u27F9",
"𝕃": "\u{1D543}",
"↙": "\u2199",
"↘": "\u2198",
"ℒ": "\u2112",
"↰": "\u21B0",
"Ł": "\u0141",
"≪": "\u226A",
"⤅": "\u2905",
"М": "\u041C",
" ": "\u205F",
"ℳ": "\u2133",
"𝔐": "\u{1D510}",
"∓": "\u2213",
"𝕄": "\u{1D544}",
"ℳ": "\u2133",
"Μ": "\u039C",
"Њ": "\u040A",
"Ń": "\u0143",
"Ň": "\u0147",
"Ņ": "\u0145",
"Н": "\u041D",
"​": "\u200B",
"​": "\u200B",
"​": "\u200B",
"​": "\u200B",
"≫": "\u226B",
"≪": "\u226A",
"
": `
`,
"𝔑": "\u{1D511}",
"⁠": "\u2060",
" ": "\xA0",
"ℕ": "\u2115",
"⫬": "\u2AEC",
"≢": "\u2262",
"≭": "\u226D",
"∦": "\u2226",
"∉": "\u2209",
"≠": "\u2260",
"≂̸": "\u2242\u0338",
"∄": "\u2204",
"≯": "\u226F",
"≱": "\u2271",
"≧̸": "\u2267\u0338",
"≫̸": "\u226B\u0338",
"≹": "\u2279",
"⩾̸": "\u2A7E\u0338",
"≵": "\u2275",
"≎̸": "\u224E\u0338",
"≏̸": "\u224F\u0338",
"⋪": "\u22EA",
"⧏̸": "\u29CF\u0338",
"⋬": "\u22EC",
"≮": "\u226E",
"≰": "\u2270",
"≸": "\u2278",
"≪̸": "\u226A\u0338",
"⩽̸": "\u2A7D\u0338",
"≴": "\u2274",
"⪢̸": "\u2AA2\u0338",
"⪡̸": "\u2AA1\u0338",
"⊀": "\u2280",
"⪯̸": "\u2AAF\u0338",
"⋠": "\u22E0",
"∌": "\u220C",
"⋫": "\u22EB",
"⧐̸": "\u29D0\u0338",
"⋭": "\u22ED",
"⊏̸": "\u228F\u0338",
"⋢": "\u22E2",
"⊐̸": "\u2290\u0338",
"⋣": "\u22E3",
"⊂⃒": "\u2282\u20D2",
"⊈": "\u2288",
"⊁": "\u2281",
"⪰̸": "\u2AB0\u0338",
"⋡": "\u22E1",
"≿̸": "\u227F\u0338",
"⊃⃒": "\u2283\u20D2",
"⊉": "\u2289",
"≁": "\u2241",
"≄": "\u2244",
"≇": "\u2247",
"≉": "\u2249",
"∤": "\u2224",
"𝒩": "\u{1D4A9}",
"Ñ": "\xD1",
"Ñ": "\xD1",
"Ν": "\u039D",
"Œ": "\u0152",
"Ó": "\xD3",
"Ó": "\xD3",
"Ô": "\xD4",
"Ô": "\xD4",
"О": "\u041E",
"Ő": "\u0150",
"𝔒": "\u{1D512}",
"Ò": "\xD2",
"Ò": "\xD2",
"Ō": "\u014C",
"Ω": "\u03A9",
"Ο": "\u039F",
"𝕆": "\u{1D546}",
"“": "\u201C",
"‘": "\u2018",
"⩔": "\u2A54",
"𝒪": "\u{1D4AA}",
"Ø": "\xD8",
"Ø": "\xD8",
"Õ": "\xD5",
"Õ": "\xD5",
"⨷": "\u2A37",
"Ö": "\xD6",
"Ö": "\xD6",
"‾": "\u203E",
"⏞": "\u23DE",
"⎴": "\u23B4",
"⏜": "\u23DC",
"∂": "\u2202",
"П": "\u041F",
"𝔓": "\u{1D513}",
"Φ": "\u03A6",
"Π": "\u03A0",
"±": "\xB1",
"ℌ": "\u210C",
"ℙ": "\u2119",
"⪻": "\u2ABB",
"≺": "\u227A",
"⪯": "\u2AAF",
"≼": "\u227C",
"≾": "\u227E",
"″": "\u2033",
"∏": "\u220F",
"∷": "\u2237",
"∝": "\u221D",
"𝒫": "\u{1D4AB}",
"Ψ": "\u03A8",
""": '"',
""": '"',
"𝔔": "\u{1D514}",
"ℚ": "\u211A",
"𝒬": "\u{1D4AC}",
"⤐": "\u2910",
"®": "\xAE",
"®": "\xAE",
"Ŕ": "\u0154",
"⟫": "\u27EB",
"↠": "\u21A0",
"⤖": "\u2916",
"Ř": "\u0158",
"Ŗ": "\u0156",
"Р": "\u0420",
"ℜ": "\u211C",
"∋": "\u220B",
"⇋": "\u21CB",
"⥯": "\u296F",
"ℜ": "\u211C",
"Ρ": "\u03A1",
"⟩": "\u27E9",
"→": "\u2192",
"⇥": "\u21E5",
"⇄": "\u21C4",
"⌉": "\u2309",
"⟧": "\u27E7",
"⥝": "\u295D",
"⇂": "\u21C2",
"⥕": "\u2955",
"⌋": "\u230B",
"⊢": "\u22A2",
"↦": "\u21A6",
"⥛": "\u295B",
"⊳": "\u22B3",
"⧐": "\u29D0",
"⊵": "\u22B5",
"⥏": "\u294F",
"⥜": "\u295C",
"↾": "\u21BE",
"⥔": "\u2954",
"⇀": "\u21C0",
"⥓": "\u2953",
"⇒": "\u21D2",
"ℝ": "\u211D",
"⥰": "\u2970",
"⇛": "\u21DB",
"ℛ": "\u211B",
"↱": "\u21B1",
"⧴": "\u29F4",
"Щ": "\u0429",
"Ш": "\u0428",
"Ь": "\u042C",
"Ś": "\u015A",
"⪼": "\u2ABC",
"Š": "\u0160",
"Ş": "\u015E",
"Ŝ": "\u015C",
"С": "\u0421",
"𝔖": "\u{1D516}",
"↓": "\u2193",
"←": "\u2190",
"→": "\u2192",
"↑": "\u2191",
"Σ": "\u03A3",
"∘": "\u2218",
"𝕊": "\u{1D54A}",
"√": "\u221A",
"□": "\u25A1",
"⊓": "\u2293",
"⊏": "\u228F",
"⊑": "\u2291",
"⊐": "\u2290",
"⊒": "\u2292",
"⊔": "\u2294",
"𝒮": "\u{1D4AE}",
"⋆": "\u22C6",
"⋐": "\u22D0",
"⋐": "\u22D0",
"⊆": "\u2286",
"≻": "\u227B",
"⪰": "\u2AB0",
"≽": "\u227D",
"≿": "\u227F",
"∋": "\u220B",
"∑": "\u2211",
"⋑": "\u22D1",
"⊃": "\u2283",
"⊇": "\u2287",
"⋑": "\u22D1",
"Þ": "\xDE",
"Þ": "\xDE",
"™": "\u2122",
"Ћ": "\u040B",
"Ц": "\u0426",
"	": " ",
"Τ": "\u03A4",
"Ť": "\u0164",
"Ţ": "\u0162",
"Т": "\u0422",
"𝔗": "\u{1D517}",
"∴": "\u2234",
"Θ": "\u0398",
"  ": "\u205F\u200A",
" ": "\u2009",
"∼": "\u223C",
"≃": "\u2243",
"≅": "\u2245",
"≈": "\u2248",
"𝕋": "\u{1D54B}",
"⃛": "\u20DB",
"𝒯": "\u{1D4AF}",
"Ŧ": "\u0166",
"Ú": "\xDA",
"Ú": "\xDA",
"↟": "\u219F",
"⥉": "\u2949",
"Ў": "\u040E",
"Ŭ": "\u016C",
"Û": "\xDB",
"Û": "\xDB",
"У": "\u0423",
"Ű": "\u0170",
"𝔘": "\u{1D518}",
"Ù": "\xD9",
"Ù": "\xD9",
"Ū": "\u016A",
"_": "_",
"⏟": "\u23DF",
"⎵": "\u23B5",
"⏝": "\u23DD",
"⋃": "\u22C3",
"⊎": "\u228E",
"Ų": "\u0172",
"𝕌": "\u{1D54C}",
"↑": "\u2191",
"⤒": "\u2912",
"⇅": "\u21C5",
"↕": "\u2195",
"⥮": "\u296E",
"⊥": "\u22A5",
"↥": "\u21A5",
"⇑": "\u21D1",
"⇕": "\u21D5",
"↖": "\u2196",
"↗": "\u2197",
"ϒ": "\u03D2",
"Υ": "\u03A5",
"Ů": "\u016E",
"𝒰": "\u{1D4B0}",
"Ũ": "\u0168",
"Ü": "\xDC",
"Ü": "\xDC",
"⊫": "\u22AB",
"⫫": "\u2AEB",
"В": "\u0412",
"⊩": "\u22A9",
"⫦": "\u2AE6",
"⋁": "\u22C1",
"‖": "\u2016",
"‖": "\u2016",
"∣": "\u2223",
"|": "|",
"❘": "\u2758",
"≀": "\u2240",
" ": "\u200A",
"𝔙": "\u{1D519}",
"𝕍": "\u{1D54D}",
"𝒱": "\u{1D4B1}",
"⊪": "\u22AA",
"Ŵ": "\u0174",
"⋀": "\u22C0",
"𝔚": "\u{1D51A}",
"𝕎": "\u{1D54E}",
"𝒲": "\u{1D4B2}",
"𝔛": "\u{1D51B}",
"Ξ": "\u039E",
"𝕏": "\u{1D54F}",
"𝒳": "\u{1D4B3}",
"Я": "\u042F",
"Ї": "\u0407",
"Ю": "\u042E",
"Ý": "\xDD",
"Ý": "\xDD",
"Ŷ": "\u0176",
"Ы": "\u042B",
"𝔜": "\u{1D51C}",
"𝕐": "\u{1D550}",
"𝒴": "\u{1D4B4}",
"Ÿ": "\u0178",
"Ж": "\u0416",
"Ź": "\u0179",
"Ž": "\u017D",
"З": "\u0417",
"Ż": "\u017B",
"​": "\u200B",
"Ζ": "\u0396",
"ℨ": "\u2128",
"ℤ": "\u2124",
"𝒵": "\u{1D4B5}",
"á": "\xE1",
"á": "\xE1",
"ă": "\u0103",
"∾": "\u223E",
"∾̳": "\u223E\u0333",
"∿": "\u223F",
"â": "\xE2",
"â": "\xE2",
"´": "\xB4",
"´": "\xB4",
"а": "\u0430",
"æ": "\xE6",
"æ": "\xE6",
"⁡": "\u2061",
"𝔞": "\u{1D51E}",
"à": "\xE0",
"à": "\xE0",
"ℵ": "\u2135",
"ℵ": "\u2135",
"α": "\u03B1",
"ā": "\u0101",
"⨿": "\u2A3F",
"&": "&",
"&": "&",
"∧": "\u2227",
"⩕": "\u2A55",
"⩜": "\u2A5C",
"⩘": "\u2A58",
"⩚": "\u2A5A",
"∠": "\u2220",
"⦤": "\u29A4",
"∠": "\u2220",
"∡": "\u2221",
"⦨": "\u29A8",
"⦩": "\u29A9",
"⦪": "\u29AA",
"⦫": "\u29AB",
"⦬": "\u29AC",
"⦭": "\u29AD",
"⦮": "\u29AE",
"⦯": "\u29AF",
"∟": "\u221F",
"⊾": "\u22BE",
"⦝": "\u299D",
"∢": "\u2222",
"Å": "\xC5",
"⍼": "\u237C",
"ą": "\u0105",
"𝕒": "\u{1D552}",
"≈": "\u2248",
"⩰": "\u2A70",
"⩯": "\u2A6F",
"≊": "\u224A",
"≋": "\u224B",
"'": "'",
"≈": "\u2248",
"≊": "\u224A",
"å": "\xE5",
"å": "\xE5",
"𝒶": "\u{1D4B6}",
"*": "*",
"≈": "\u2248",
"≍": "\u224D",
"ã": "\xE3",
"ã": "\xE3",
"ä": "\xE4",
"ä": "\xE4",
"∳": "\u2233",
"⨑": "\u2A11",
"⫭": "\u2AED",
"≌": "\u224C",
"϶": "\u03F6",
"‵": "\u2035",
"∽": "\u223D",
"⋍": "\u22CD",
"⊽": "\u22BD",
"⌅": "\u2305",
"⌅": "\u2305",
"⎵": "\u23B5",
"⎶": "\u23B6",
"≌": "\u224C",
"б": "\u0431",
"„": "\u201E",
"∵": "\u2235",
"∵": "\u2235",
"⦰": "\u29B0",
"϶": "\u03F6",
"ℬ": "\u212C",
"β": "\u03B2",
"ℶ": "\u2136",
"≬": "\u226C",
"𝔟": "\u{1D51F}",
"⋂": "\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",
"=⃥": "=\u20E5",
"≡⃥": "\u2261\u20E5",
"⌐": "\u2310",
"𝕓": "\u{1D553}",
"⊥": "\u22A5",
"⊥": "\u22A5",
"⋈": "\u22C8",
"╗": "\u2557",
"╔": "\u2554",
"╖": "\u2556",
"╓": "\u2553",
"═": "\u2550",
"╦": "\u2566",
"╩": "\u2569",
"╤": "\u2564",
"╧": "\u2567",
"╝": "\u255D",
"╚": "\u255A",
"╜": "\u255C",
"╙": "\u2559",
"║": "\u2551",
"╬": "\u256C",
"╣": "\u2563",
"╠": "\u2560",
"╫": "\u256B",
"╢": "\u2562",
"╟": "\u255F",
"⧉": "\u29C9",
"╕": "\u2555",
"╒": "\u2552",
"┐": "\u2510",
"┌": "\u250C",
"─": "\u2500",
"╥": "\u2565",
"╨": "\u2568",
"┬": "\u252C",
"┴": "\u2534",
"⊟": "\u229F",
"⊞": "\u229E",
"⊠": "\u22A0",
"╛": "\u255B",
"╘": "\u2558",
"┘": "\u2518",
"└": "\u2514",
"│": "\u2502",
"╪": "\u256A",
"╡": "\u2561",
"╞": "\u255E",
"┼": "\u253C",
"┤": "\u2524",
"├": "\u251C",
"‵": "\u2035",
"˘": "\u02D8",
"¦": "\xA6",
"¦": "\xA6",
"𝒷": "\u{1D4B7}",
"⁏": "\u204F",
"∽": "\u223D",
"⋍": "\u22CD",
"\": "\\",
"⧅": "\u29C5",
"⟈": "\u27C8",
"•": "\u2022",
"•": "\u2022",
"≎": "\u224E",
"⪮": "\u2AAE",
"≏": "\u224F",
"≏": "\u224F",
"ć": "\u0107",
"∩": "\u2229",
"⩄": "\u2A44",
"⩉": "\u2A49",
"⩋": "\u2A4B",
"⩇": "\u2A47",
"⩀": "\u2A40",
"∩︀": "\u2229\uFE00",
"⁁": "\u2041",
"ˇ": "\u02C7",
"⩍": "\u2A4D",
"č": "\u010D",
"ç": "\xE7",
"ç": "\xE7",
"ĉ": "\u0109",
"⩌": "\u2A4C",
"⩐": "\u2A50",
"ċ": "\u010B",
"¸": "\xB8",
"¸": "\xB8",
"⦲": "\u29B2",
"¢": "\xA2",
"¢": "\xA2",
"·": "\xB7",
"𝔠": "\u{1D520}",
"ч": "\u0447",
"✓": "\u2713",
"✓": "\u2713",
"χ": "\u03C7",
"○": "\u25CB",
"⧃": "\u29C3",
"ˆ": "\u02C6",
"≗": "\u2257",
"↺": "\u21BA",
"↻": "\u21BB",
"®": "\xAE",
"Ⓢ": "\u24C8",
"⊛": "\u229B",
"⊚": "\u229A",
"⊝": "\u229D",
"≗": "\u2257",
"⨐": "\u2A10",
"⫯": "\u2AEF",
"⧂": "\u29C2",
"♣": "\u2663",
"♣": "\u2663",
":": ":",
"≔": "\u2254",
"≔": "\u2254",
",": ",",
"@": "@",
"∁": "\u2201",
"∘": "\u2218",
"∁": "\u2201",
"ℂ": "\u2102",
"≅": "\u2245",
"⩭": "\u2A6D",
"∮": "\u222E",
"𝕔": "\u{1D554}",
"∐": "\u2210",
"©": "\xA9",
"©": "\xA9",
"℗": "\u2117",
"↵": "\u21B5",
"✗": "\u2717",
"𝒸": "\u{1D4B8}",
"⫏": "\u2ACF",
"⫑": "\u2AD1",
"⫐": "\u2AD0",
"⫒": "\u2AD2",
"⋯": "\u22EF",
"⤸": "\u2938",
"⤵": "\u2935",
"⋞": "\u22DE",
"⋟": "\u22DF",
"↶": "\u21B6",
"⤽": "\u293D",
"∪": "\u222A",
"⩈": "\u2A48",
"⩆": "\u2A46",
"⩊": "\u2A4A",
"⊍": "\u228D",
"⩅": "\u2A45",
"∪︀": "\u222A\uFE00",
"↷": "\u21B7",
"⤼": "\u293C",
"⋞": "\u22DE",
"⋟": "\u22DF",
"⋎": "\u22CE",
"⋏": "\u22CF",
"¤": "\xA4",
"¤": "\xA4",
"↶": "\u21B6",
"↷": "\u21B7",
"⋎": "\u22CE",
"⋏": "\u22CF",
"∲": "\u2232",
"∱": "\u2231",
"⌭": "\u232D",
"⇓": "\u21D3",
"⥥": "\u2965",
"†": "\u2020",
"ℸ": "\u2138",
"↓": "\u2193",
"‐": "\u2010",
"⊣": "\u22A3",
"⤏": "\u290F",
"˝": "\u02DD",
"ď": "\u010F",
"д": "\u0434",
"ⅆ": "\u2146",
"‡": "\u2021",
"⇊": "\u21CA",
"⩷": "\u2A77",
"°": "\xB0",
"°": "\xB0",
"δ": "\u03B4",
"⦱": "\u29B1",
"⥿": "\u297F",
"𝔡": "\u{1D521}",
"⇃": "\u21C3",
"⇂": "\u21C2",
"⋄": "\u22C4",
"⋄": "\u22C4",
"♦": "\u2666",
"♦": "\u2666",
"¨": "\xA8",
"ϝ": "\u03DD",
"⋲": "\u22F2",
"÷": "\xF7",
"÷": "\xF7",
"÷": "\xF7",
"⋇": "\u22C7",
"⋇": "\u22C7",
"ђ": "\u0452",
"⌞": "\u231E",
"⌍": "\u230D",
"$": "$",
"𝕕": "\u{1D555}",
"˙": "\u02D9",
"≐": "\u2250",
"≑": "\u2251",
"∸": "\u2238",
"∔": "\u2214",
"⊡": "\u22A1",
"⌆": "\u2306",
"↓": "\u2193",
"⇊": "\u21CA",
"⇃": "\u21C3",
"⇂": "\u21C2",
"⤐": "\u2910",
"⌟": "\u231F",
"⌌": "\u230C",
"𝒹": "\u{1D4B9}",
"ѕ": "\u0455",
"⧶": "\u29F6",
"đ": "\u0111",
"⋱": "\u22F1",
"▿": "\u25BF",
"▾": "\u25BE",
"⇵": "\u21F5",
"⥯": "\u296F",
"⦦": "\u29A6",
"џ": "\u045F",
"⟿": "\u27FF",
"⩷": "\u2A77",
"≑": "\u2251",
"é": "\xE9",
"é": "\xE9",
"⩮": "\u2A6E",
"ě": "\u011B",
"≖": "\u2256",
"ê": "\xEA",
"ê": "\xEA",
"≕": "\u2255",
"э": "\u044D",
"ė": "\u0117",
"ⅇ": "\u2147",
"≒": "\u2252",
"𝔢": "\u{1D522}",
"⪚": "\u2A9A",
"è": "\xE8",
"è": "\xE8",
"⪖": "\u2A96",
"⪘": "\u2A98",
"⪙": "\u2A99",
"⏧": "\u23E7",
"ℓ": "\u2113",
"⪕": "\u2A95",
"⪗": "\u2A97",
"ē": "\u0113",
"∅": "\u2205",
"∅": "\u2205",
"∅": "\u2205",
" ": "\u2004",
" ": "\u2005",
" ": "\u2003",
"ŋ": "\u014B",
" ": "\u2002",
"ę": "\u0119",
"𝕖": "\u{1D556}",
"⋕": "\u22D5",
"⧣": "\u29E3",
"⩱": "\u2A71",
"ε": "\u03B5",
"ε": "\u03B5",
"ϵ": "\u03F5",
"≖": "\u2256",
"≕": "\u2255",
"≂": "\u2242",
"⪖": "\u2A96",
"⪕": "\u2A95",
"=": "=",
"≟": "\u225F",
"≡": "\u2261",
"⩸": "\u2A78",
"⧥": "\u29E5",
"≓": "\u2253",
"⥱": "\u2971",
"ℯ": "\u212F",
"≐": "\u2250",
"≂": "\u2242",
"η": "\u03B7",
"ð": "\xF0",
"ð": "\xF0",
"ë": "\xEB",
"ë": "\xEB",
"€": "\u20AC",
"!": "!",
"∃": "\u2203",
"ℰ": "\u2130",
"ⅇ": "\u2147",
"≒": "\u2252",
"ф": "\u0444",
"♀": "\u2640",
"ffi": "\uFB03",
"ff": "\uFB00",
"ffl": "\uFB04",
"𝔣": "\u{1D523}",
"fi": "\uFB01",
"fj": "fj",
"♭": "\u266D",
"fl": "\uFB02",
"▱": "\u25B1",
"ƒ": "\u0192",
"𝕗": "\u{1D557}",
"∀": "\u2200",
"⋔": "\u22D4",
"⫙": "\u2AD9",
"⨍": "\u2A0D",
"½": "\xBD",
"½": "\xBD",
"⅓": "\u2153",
"¼": "\xBC",
"¼": "\xBC",
"⅕": "\u2155",
"⅙": "\u2159",
"⅛": "\u215B",
"⅔": "\u2154",
"⅖": "\u2156",
"¾": "\xBE",
"¾": "\xBE",
"⅗": "\u2157",
"⅜": "\u215C",
"⅘": "\u2158",
"⅚": "\u215A",
"⅝": "\u215D",
"⅞": "\u215E",
"⁄": "\u2044",
"⌢": "\u2322",
"𝒻": "\u{1D4BB}",
"≧": "\u2267",
"⪌": "\u2A8C",
"ǵ": "\u01F5",
"γ": "\u03B3",
"ϝ": "\u03DD",
"⪆": "\u2A86",
"ğ": "\u011F",
"ĝ": "\u011D",
"г": "\u0433",
"ġ": "\u0121",
"≥": "\u2265",
"⋛": "\u22DB",
"≥": "\u2265",
"≧": "\u2267",
"⩾": "\u2A7E",
"⩾": "\u2A7E",
"⪩": "\u2AA9",
"⪀": "\u2A80",
"⪂": "\u2A82",
"⪄": "\u2A84",
"⋛︀": "\u22DB\uFE00",
"⪔": "\u2A94",
"𝔤": "\u{1D524}",
"≫": "\u226B",
"⋙": "\u22D9",
"ℷ": "\u2137",
"ѓ": "\u0453",
"≷": "\u2277",
"⪒": "\u2A92",
"⪥": "\u2AA5",
"⪤": "\u2AA4",
"≩": "\u2269",
"⪊": "\u2A8A",
"⪊": "\u2A8A",
"⪈": "\u2A88",
"⪈": "\u2A88",
"≩": "\u2269",
"⋧": "\u22E7",
"𝕘": "\u{1D558}",
"`": "`",
"ℊ": "\u210A",
"≳": "\u2273",
"⪎": "\u2A8E",
"⪐": "\u2A90",
">": ">",
">": ">",
"⪧": "\u2AA7",
"⩺": "\u2A7A",
"⋗": "\u22D7",
"⦕": "\u2995",
"⩼": "\u2A7C",
"⪆": "\u2A86",
"⥸": "\u2978",
"⋗": "\u22D7",
"⋛": "\u22DB",
"⪌": "\u2A8C",
"≷": "\u2277",
"≳": "\u2273",
"≩︀": "\u2269\uFE00",
"≩︀": "\u2269\uFE00",
"⇔": "\u21D4",
" ": "\u200A",
"½": "\xBD",
"ℋ": "\u210B",
"ъ": "\u044A",
"↔": "\u2194",
"⥈": "\u2948",
"↭": "\u21AD",
"ℏ": "\u210F",
"ĥ": "\u0125",
"♥": "\u2665",
"♥": "\u2665",
"…": "\u2026",
"⊹": "\u22B9",
"𝔥": "\u{1D525}",
"⤥": "\u2925",
"⤦": "\u2926",
"⇿": "\u21FF",
"∻": "\u223B",
"↩": "\u21A9",
"↪": "\u21AA",
"𝕙": "\u{1D559}",
"―": "\u2015",
"𝒽": "\u{1D4BD}",
"ℏ": "\u210F",
"ħ": "\u0127",
"⁃": "\u2043",
"‐": "\u2010",
"í": "\xED",
"í": "\