miniflare
Version:
Fun, full-featured, fully-local simulator for Cloudflare Workers
3,187 lines • 101 kB
JavaScript
// src/workers/email/send_email.worker.ts
import { WorkerEntrypoint } from "cloudflare:workers";
// ../../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/email/send_email.worker.ts
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, escaped = !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 (escaped)
value += chr;
else if (chr === "\\") {
escaped = !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;
escaped = !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",
"í": "\xED",
"⁣": "\u2063",
"î": "\xEE",
"î": "\xEE",
"и": "\u0438",
"е": "\u0435",
"¡": "\xA1",
"¡": "\xA1",
"⇔": "\u21D4",
"𝔦": "\u{1D526}",
"ì": "\xEC",
"ì": "\xEC",
"ⅈ": "\u2148",
"⨌": "\u2A0C",
"∭": "\u222D",
"⧜": "\u29DC",
"℩": "\u2129",
"ij": "\u0133",
"ī": "\u012B",
"ℑ": "\u2111",
"ℐ": "\u2110",
"ℑ": "\u2111",
"ı": "\u0131",
"⊷": "\u22B7",
"Ƶ": "\u01B5",
"∈": "\u2208",
"℅": "\u2105",
"∞": "\u221E",
"⧝": "\u29DD",
"ı": "\u0131",
"∫": "\u222B",
"⊺": "\u22BA",
"ℤ": "\u2124",
"⊺": "\u22BA",
"⨗": "\u2A17",
"⨼": "\u2A3C",
"ё": "\u0451",
"į": "\u012F",
"𝕚": "\u{1D55A}",
"ι": "\u03B9",
"⨼": "\u2A3C",
"¿": "\xBF",
"¿": "\xBF",
"𝒾": "\u{1D4BE}",
"∈": "\u2208",
"⋹": "\u22F9",
"⋵": "\u22F5",
"⋴": "\u22F4",
"⋳": "\u22F3",
"∈": "\u2208",
"⁢": "\u2062",
"ĩ": "\u0129",
"і": "\u0456",
"ï": "\xEF",
"ï": "\xEF",
"ĵ": "\u0135",
"й": "\u0439",
"𝔧": "\u{1D527}",
"ȷ": "\u0237",
"𝕛": "\u{1D55B}",
"𝒿": "\u{1D4BF}",
"ј": "\u0458",
"є": "\u0454",
"κ": "\u03BA",
"ϰ": "\u03F0",
"ķ": "\u0137",
"к": "\u043A",
"𝔨": "\u{1D528}",
"ĸ": "\u0138",
"х": "\u0445",
"ќ": "\u045C",
"𝕜": "\u{1D55C}",
"𝓀": "\u{1D4C0}",
"⇚": "\u21DA",
"⇐": "\u21D0",
"⤛": "\u291B",
"⤎": "\u290E",
"≦": "\u2266",
"⪋": "\u2A8B",
"⥢": "\u2962",
"ĺ": "\u013A",
"⦴": "\u29B4",
"ℒ": "\u2112",
"λ": "\u03BB",
"⟨": "\u27E8",
"⦑": "\u2991",
"⟨": "\u27E8",
"⪅": "\u2A85",
"«": "\xAB",
"«": "\xAB",
"←": "\u2190",
"⇤": "\u21E4",
"⤟": "\u291F",
"⤝": "\u291D",
"↩": "\u21A9",
"↫": "\u21AB",
"⤹": "\u2939",
"⥳": "\u2973",
"↢": "\u21A2",
"⪫": "\u2AAB",
"⤙": "\u2919",
"⪭": "\u2AAD",
"⪭︀": "\u2AAD\uFE00",
"⤌": "\u290C",
"❲": "\u2772",
"{": "{",
"[": "[",
"⦋": "\u298B",
"⦏": "\u298F",
"⦍": "\u298D",
"ľ": "\u013E",
"ļ": "\u013C",
"⌈": "\u2308",
"{": "{",
"л": "\u043B",
"⤶": "\u2936",
"“": "\u201C",
"„": "\u201E",
"⥧": "\u2967",
"⥋": "\u294B",
"↲": "\u21B2",
"≤": "\u2264",
"←": "\u2190",
"↢": "\u21A2",
"↽": "\u21BD",
"↼": "\u21BC",
"⇇": "\u21C7",
"↔": "\u2194",
"⇆": "\u21C6",
"⇋": "\u21CB",
"↭": "\u21AD",
"⋋": "\u22CB",
"⋚": "\u22DA",
"≤": "\u2264",
"≦": "\u2266",
"⩽": "\u2A7D",
"⩽": "\u2A7D",
"⪨": "\u2AA8",
"⩿": "\u2A7F",
"⪁": "\u2A81",
"⪃": "\u2A83",
"⋚︀": "\u22DA\uFE00",
"⪓": "\u2A93",
"⪅": "\u2A85",
"⋖": "\u22D6",
"⋚": "\u22DA",
"⪋": "\u2A8B",
"≶": "\u2276",
"≲": "\u2272",
"⥼": "\u297C",
"⌊": "\u230A",
"𝔩": "\u{1D529}",
"≶": "\u2276",
"⪑": "\u2A91",
"↽": "\u21BD",
"↼": "\u21BC",
"⥪": "\u296A",
"▄": "\u2584",
"љ": "\u0459",
"≪": "\u226A",
"⇇": "\u21C7",
"⌞": "\u231E",
"⥫": "\u296B",
"◺": "\u25FA",
"ŀ": "\u0140",
"⎰": "\u23B0",
"⎰": "\u23B0",
"≨": "\u2268",
"⪉": "\u2A89",
"⪉": "\u2A89",
"⪇": "\u2A87",
"⪇": "\u2A87",
"≨": "\u2268",
"⋦": "\u22E6",
"⟬": "\u27EC",
"⇽": "\u21FD",
"⟦": "\u27E6",
"⟵": "\u27F5",
"⟷": "\u27F7",
"⟼": "\u27FC",
"⟶": "\u27F6",
"↫": "\u21AB",
"↬": "\u21AC",
"⦅": "\u2985",
"𝕝": "\u{1D55D}",
"⨭": "\u2A2D",
"⨴": "\u2A34",
"∗": "\u2217",
"_": "_",
"◊": "\u25CA",
"◊": "\u25CA",
"⧫": "\u29EB",
"(": "(",
"⦓": "\u2993",
"⇆": "\u21C6",
"⌟": "\u231F",
"⇋": "\u21CB",
"⥭": "\u296D",
"‎": "\u200E",
"⊿": "\u22BF",
"‹": "\u2039",
"𝓁": "\u{1D4C1}",
"↰": "\u21B0",
"≲": "\u2272",
"⪍": "\u2A8D",
"⪏": "\u2A8F",
"[": "[",
"‘": "\u2018",
"‚": "\u201A",
"ł": "\u0142",
"<": "<",
"<": "<",
"⪦": "\u2AA6",
"⩹": "\u2A79",
"⋖": "\u22D6",
"⋋": "\u22CB",
"⋉": "\u22C9",
"⥶": "\u2976",
"⩻": "\u2A7B",
"⦖": "\u2996",
"◃": "\u25C3",
"⊴": "\u22B4",
"◂": "\u25C2",
"⥊": "\u294A",
"⥦": "\u2966",
"≨︀": "\u2268\uFE00",
"≨︀": "\u2268\uFE00",
"∺": "\u223A",
"¯": "\xAF",
"¯": "\xAF",
"♂": "\u2642",
"✠": "\u2720",
"✠": "\u2720",
"↦": "\u21A6",
"↦": "\u21A6",
"↧": "\u21A7",
"↤": "\u21A4",
"↥": "\u21A5",
"▮": "\u25AE",
"⨩": "\u2A29",
"м": "\u043C",
"—": "\u2014",
"∡": "\u2221",
"𝔪": "\u{1D52A}",
"℧": "\u2127",
"µ": "\xB5",
"µ": "\xB5",
"∣": "\u2223",
"*": "*",
"⫰": "\u2AF0",
"·": "\xB7",
"·": "\xB7",
"−": "\u2212",
"⊟": "\u229F",
"∸": "\u2238",
"⨪": "\u2A2A",
"⫛": "\u2ADB",
"…": "\u2026",
"∓": "\u2213",
"⊧": "\u22A7",
"𝕞": "\u{1D55E}",
"∓": "\u2213",
"𝓂": "\u{1D4C2}",
"∾": "\u223E",
"μ": "\u03BC",
"⊸": "\u22B8",
"⊸": "\u22B8",
"⋙̸": "\u22D9\u0338",
"≫⃒": "\u226B\u20D2",
"≫̸": "\u226B\u0338",
"⇍": "\u21CD",
"⇎": "\u21CE",
"⋘̸": "\u22D8\u0338",
"≪⃒": "\u226A\u20D2",
"≪̸": "\u226A\u0338",
"⇏": "\u21CF",
"⊯": "\u22AF",
"⊮": "\u22AE",
"∇": "\u2207",
"ń": "\u0144",
"∠⃒": "\u2220\u20D2",
"≉": "\u2249",
"⩰̸": "\u2A70\u0338",
"≋̸": "\u224B\u0338",
"ʼn": "\u0149",
"≉": "\u2249",
"♮": "\u266E",
"♮": "\u266E",
"ℕ": "\u2115",
" ": "\xA0",
" ": "\xA0",
"≎̸": "\u224E\u0338",
"≏̸": "\u224F\u0338",
"⩃": "\u2A43",
"ň": "\u0148",
"ņ": "\u0146",
"≇": "\u2247",
"⩭̸": "\u2A6D\u0338",
"⩂": "\u2A42",
"н": "\u043D",
"–": "\u2013",
"≠": "\u2260",
"⇗": "\u21D7",
"⤤": "\u2924",
"↗": "\u2197",
"↗": "\u2197",
"≐̸": "\u2250\u0338",
"≢": "\u2262",
"⤨": "\u2928",
"≂̸": "\u2242\u0338",
"∄": "\u2204",
"∄": "\u2204",
"𝔫": "\u{1D52B}",
"≧̸": "\u2267\u0338",
"≱": "\u2271",
"≱": "\u2271",
"≧̸": "\u2267\u0338",
"⩾̸": "\u2A7E\u0338",
"⩾̸": "\u2A7E\u0338",
"≵": "\u2275",
"≯": "\u226F",
"≯": "\u226F",
"⇎": "\u21CE",
"↮": "\u21AE",
"⫲": "\u2AF2",
"∋": "\u220B",
"⋼": "\u22FC",
"⋺": "\u22FA",
"∋": "\u220B",
"њ": "\u045A",
"⇍": "\u21CD",
"≦̸": "\u2266\u0338",
"↚": "\u219A",
"‥": "\u2025",
"≰": "\u2270",
"↚": "\u219A",
"↮": "\u21AE",
"≰": "\u2270",
"≦̸": "\u2266\u0338",
"⩽̸": "\u2A7D\u0338",
"⩽̸": "\u2A7D\u0338",
"≮": "\u226E",
"≴": "\u2274",
"≮": "\u226E",
"⋪": "\u22EA",
"⋬": "\u22EC",
"∤": "\u2224",
"𝕟": "\u{1D55F}",
"¬": "\xAC",
"¬": "\xAC",
"∉": "\u2209",
"⋹̸": "\u22F9\u0338",
"⋵̸": "\u22F5\u0338",
"∉": "\u2209",
"⋷": "\u22F7",
"⋶": "\u22F6",
"∌": "\u220C",
"∌": "\u220C",
"⋾": "\u22FE",
"⋽": "\u22FD",
"∦": "\u2226",
"∦": "\u2226",
"⫽⃥": "\u2AFD\u20E5",
"∂̸": "\u2202\u0338",
"⨔": "\u2A14",
"⊀": "\u2280",
"⋠": "\u22E0",
"⪯̸": "\u2AAF\u0338",
"⊀": "\u2280",
"⪯̸": "\u2AAF\u0338",
"⇏": "\u21CF",
"↛": "\u219B",
"⤳̸": "\u2933\u0338",
"↝̸": "\u219D\u0338",
"↛": "\u219B",
"⋫": "\u22EB",
"⋭": "\u22ED",
"⊁": "\u2281",
"⋡": "\u22E1",
"⪰̸": "\u2AB0\u0338",
"𝓃": "\u{1D4C3}",
"∤": "\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",
"ñ": "\xF1",
"ñ": "\xF1",
"≸": "\u2278",
"⋪": "\u22EA",
"⋬": "\u22EC",
"⋫": "\u22EB",
"⋭": "\u22ED",
"ν": "\u03BD",
"#": "#",
"№": "\u2116",
" ": "\u2007",
"⊭": "\u22AD",
"⤄": "\u2904",
"≍⃒": "\u224D\u20D2",
"⊬": "\u22AC",
"≥⃒": "\u2265\u20D2",
">⃒": ">\u20D2",
"⧞": "\u29DE",
"⤂": "\u2902",
"≤⃒": "\u2264\u20D2",
"<⃒": "<\u20D2",
"⊴⃒": "\u22B4\u20D2",
"⤃": "\u2903",
"⊵⃒": "\u22B5\u20D2",
"∼⃒": "\u223C\u20D2",
"⇖": "\u21D6",
"⤣": "\u2923",
"↖": "\u2196",
"↖": "\u2196",
"⤧": "\u2927",
"Ⓢ": "\u24C8",
"ó": "\xF3",
"ó": "\xF3",
"⊛": "\u229B",
"⊚": "\u229A",
"ô": "\xF4",
"ô": "\xF4",
"о": "\u043E",
"⊝": "\u229D",
"ő": "\u0151",
"⨸": "\u2A38",
"⊙": "\u2299",
"⦼": "\u29BC",
"œ": "\u0153",
"⦿": "\u29BF",
"𝔬": "\u{1D52C}",
"˛": "\u02DB",
"ò": "\xF2",
"ò": "\xF2",
"⧁": "\u29C1",
"⦵": "\u29B5",
"Ω": "\u03A9",
"∮": "\u222E",
"↺": "\u21BA",
"⦾": "\u29BE",
"⦻": "\u29BB",
"‾": "\u203E",
"⧀": "\u29C0",
"ō": "\u014D",
"ω": "\u03C9",
"ο": "\u03BF",
"⦶": "\u29B6",
"⊖": "\u2296",
"𝕠": "\u{1D560}",
"⦷": "\u29B7",
"⦹": "\u29B9",
"⊕": "\u2295",
"∨": "\u2228",
"↻": "\u21BB",
"⩝": "\u2A5D",
"ℴ": "\u2134",
"ℴ": "\u2134",
"ª": "\xAA",
"ª": "\xAA",
"º": "\xBA",
"º": "\xBA",
"⊶": "\u22B6",
"⩖": "\u2A56",
"⩗": "\u2A57",
"⩛": "\u2A5B",
"ℴ": "\u2134",
"ø": "\xF8",
"ø": "\xF8",
"⊘": "\u2298",
"õ": "\xF5",
"õ": "\xF5",
"⊗": "\u2297",
"⨶": "\u2A36",
"ö": "\xF6",
"ö": "\xF6",
"⌽": "\u233D",
"∥": "\u2225",
"¶": "\xB6",
"¶": "\xB6",
"∥": "\u2225",
"⫳": "\u2AF3",
"⫽": "\u2AFD",
"∂": "\u2202",
"п": "\u043F",
"%": "%",
".": ".",
"‰": "\u2030",
"⊥": "\u22A5",
"‱": "\u2031",
"𝔭": "\u{1D52D}",
"φ": "\u03C6",
"ϕ": "\u03D5",
"ℳ": "\u2133",
"☎": "\u260E",
"π": "\u03C0",
"⋔": "\u22D4",
"ϖ": "\u03D6",
"ℏ": "\u210F",
"ℎ": "\u210E",
"ℏ": "\u210F",
"+": "+",
"⨣": "\u2A23",
"⊞": "\u229E",
"⨢": "\u2A22",
"∔": "\u2214",
"⨥": "\u2A25",
"⩲": "\u2A72",
"±": "\xB1",
"±": "\xB1",
"⨦": "\u2A26",
"⨧": "\u2A27",
"±": "\xB1",
"⨕": "\u2A15",
"𝕡": "\u{1D561}",
"£": "\xA3",
"£": "\xA3",
"≺": "\u227A",
"⪳": "\u2AB3",
"⪷": "\u2AB7",
"≼": "\u227C",
"⪯": "\u2AAF",
"≺": "\u227A",
"⪷": "\u2AB7",
"≼": "\u227C",
"⪯": "\u2AAF",
"⪹": "\u2AB9",
"⪵": "\u2AB5",
"⋨": "\u22E8",
"≾": "\u227E",
"′": "\u2032",
"ℙ": "\u2119",
"⪵": "\u2AB5",
"⪹": "\u2AB9",
"⋨": "\u22E8",
"∏": "\u220F",
"⌮": "\u232E",
"⌒": "\u2312",
"⌓": "\u2313",
"∝": "\u221D",
"∝": "\u221D",
"≾": "\u227E",
"⊰": "\u22B0",
"𝓅": "\u{1D4C5}",
"ψ": "\u03C8",
" ": "\u2008",
"𝔮": "\u{1D52E}",
"⨌": "\u2A0C",
"𝕢": "\u{1D562}",
"⁗": "\u2057",
"𝓆": "\u{1D4C6}",
"ℍ": "\u210D",
"⨖": "\u2A16",
"?": "?",
"≟": "\u225F",
""": '"',
""": '"',
"⇛": "\u21DB",
"⇒": "\u21D2",
"⤜": "\u291C",
"⤏": "\u290F",
"⥤": "\u2964",
"∽̱": "\u223D\u0331",
"ŕ": "\u0155",
"√": "\u221A",
"⦳": "\u29B3",
"⟩": "\u27E9",
"⦒": "\u2992",
"⦥": "\u29A5",
"⟩": "\u27E9",
"»": "\xBB",
"»": "\xBB",
"→": "\u2192",
"⥵": "\u2975",
"⇥": "\u21E5",
"⤠": "\u2920",
"⤳": "\u2933",
"⤞": "\u291E",
"↪": "\u21AA",
"↬": "\u21AC",
"⥅": "\u2945",
"⥴": "\u2974",
"↣": "\u21A3",
"↝": "\u219D",
"⤚": "\u291A",
"∶": "\u2236",
"ℚ": "\u211A",
"⤍": "\u290D",
"❳": "\u2773",
"}": "}",
"]": "]",
"⦌": "\u298C",
"⦎": "\u298E",
"⦐": "\u2990",
"ř": "\u0159",
"ŗ": "\u0157",
"⌉": "\u2309",
"}": "}",
"р": "\u0440",
"⤷": "\u2937",
"⥩": "\u2969",
"”": "\u201D",
"”": "\u201D",
"↳": "\u21B3",
"ℜ": "\u211C",
"ℛ": "\u211B",
"ℜ": "\u211C",
"ℝ": "\u211D",
"▭": "\u25AD",
"®": "\xAE",
"®": "\xAE",
"⥽": "\u297D",
"⌋": "\u230B",
"𝔯": "\u{1D52F}",
"⇁": "\u21C1",
"⇀": "\u21C0",
"⥬": "\u296C",
"ρ": "\u03C1",
"ϱ": "\u03F1",
"→": "\u2192",
"↣": "\u21A3",
"⇁": "\u21C1",
"⇀": "\u21C0",
"⇄": "\u21C4",
"⇌": "\u21CC",
"⇉": "\u21C9",
"↝": "\u219D",
"⋌": "\u22CC",
"˚": "\u02DA",
"≓": "\u2253",
"⇄": "\u21C4",
"⇌": "\u21CC",
"‏": "\u200F",
"⎱": "\u23B1",
"⎱": "\u23B1",
"⫮": "\u2AEE",
"⟭": "\u27ED",
"⇾": "\u21FE",
"⟧": "\u27E7",
"⦆": "\u2986",
"𝕣": "\u{1D563}",
"⨮": "\u2A2E",
"⨵": "\u2A35",
")": ")",
"⦔": "\u2994",
"⨒": "\u2A12",
"⇉": "\u21C9",
"›": "\u203A",
"𝓇": "\u{1D4C7}",
"↱": "\u21B1",
"]": "]",
"’": "\u2019",
"’": "\u2019",
"⋌": "\u22CC",
"⋊": "\u22CA",
"▹": "\u25B9",
"⊵": "\u22B5",
"▸": "\u25B8",
"⧎": "\u29CE",
"⥨": "\u2968",
"℞": "\u211E",
"ś": "\u015B",
"‚": "\u201A",
"≻": "\u227B",
"⪴": "\u2AB4",
"⪸": "\u2AB8",
"š": "\u0161",
"≽": "\u227D",
"⪰": "\u2AB0",
"ş": "\u015F",
"ŝ": "\u015D",
"⪶": "\u2AB6",
"⪺": "\u2ABA",
"⋩": "\u22E9",
"⨓": "\u2A13",
"≿": "\u227F",
"с": "\u0441",
"⋅": "\u22C5",
"⊡": "\u22A1",
"⩦": "\u2A66",
"⇘": "\u21D8",
"⤥": "\u2925",
"↘": "\u2198",
"↘": "\u2198",
"§": "\xA7",
"§": "\xA7",
";": ";",
"⤩": "\u2929",
"∖": "\u2216",
"∖": "\u2216",
"✶": "\u2736",
"𝔰": "\u{1D530}",
"⌢": "\u2322",
"♯": "\u266F",
"щ": "\u0449",
"ш": "\u0448",
"∣": "\u2223",
"∥": "\u2225",
"­": "\xAD",
"­": "\xAD",
"σ": "\u03C3",
"ς": "\u03C2",
"ς": "\u03C2",
"∼": "\u223C",
"⩪": "\u2A6A",
"≃": "\u2243",
"≃": "\u2243",
"⪞": "\u2A9E",
"⪠": "\u2AA0",
"⪝": "\u2A9D",
"⪟": "\u2A9F",
"≆": "\u2246",
"⨤": "\u2A24",
"⥲": "\u2972",
"←": "\u2190",
"∖": "\u2216",
"⨳": "\u2A33",
"⧤": "\u29E4",
"∣": "\u2223",
"⌣": "\u2323",
"⪪": "\u2AAA",
"⪬": "\u2AAC",
"⪬︀": "\u2AAC\uFE00",
"ь": "\u044C",
"/": "/",
"⧄": "\u29C4",
"⌿": "\u233F",
"𝕤": "\u{1D564}",
"♠": "\u2660",
"♠": "\u2660",
"∥": "\u2225",
"⊓": "\u2293",
"⊓︀": "\u2293\uFE00",
"⊔": "\u2294",
"⊔︀": "\u2294\uFE00",
"⊏": "\u228F",
"⊑": "\u2291",
"⊏": "\u228F",
"⊑": "\u2291",
"⊐": "\u2290",
"⊒": "\u2292",
"⊐": "\u2290",
"⊒": "\u2292",
"□": "\u25A1",
"□": "\u25A1",
"▪": "\u25AA",
"▪": "\u25AA",
"→": "\u2192",
"𝓈": "\u{1D4C8}",
"∖": "\u2216",
"⌣": "\u2323",
"⋆": "\u22C6",
"☆": "\u2606",
"★": "\u2605",
"ϵ": "\u03F5",
"ϕ": "\u03D5",
"¯": "\xAF",
"⊂": "\u2282",
"⫅": "\u2AC5",
"⪽": "\u2ABD",
"⊆": "\u2286",
"⫃": "\u2AC3",
"⫁": "\u2AC1",
"⫋": "\u2ACB",
"⊊": "\u228A",
"⪿": "\u2ABF",
"⥹": "\u2979",
"⊂": "\u2282",
"⊆": "\u2286",
"⫅": "\u2AC5",
"⊊": "\u228A",
"⫋": "\u2ACB",
"⫇": "\u2AC7",
"⫕": "\u2AD5",
"⫓": "\u2AD3",
"≻": "\u227B",
"⪸": "\u2AB8",
"≽": "\u227D",
"⪰": "\u2AB0",
"⪺": "\u2ABA",
"⪶": "\u2AB6",
"⋩": "\u22E9",
"≿": "\u227F",
"∑": "\u2211",
"♪": "\u266A",
"¹": "\xB9",
"¹": "\xB9",
"²": "\xB2",
"²": "\xB2",
"³": "\xB3",
"³": "\xB3",
"⊃": "\u2283",
"⫆": "\u2AC6",
"⪾": "\u2ABE",
"⫘": "\u2AD8",
"⊇": "\u2287",
"⫄": "\u2AC4",
"⟉": "\u27C9",
"⫗": "\u2AD7",
"⥻": "\u297B",
"⫂": "\u2AC2",
"⫌": "\u2ACC",
"⊋": "\u228B",
"⫀": "\u2AC0",
"⊃": "\u2283",
"⊇": "\u2287",
"⫆": "\u2AC6",
"⊋": "\u228B",
"⫌": "\u2ACC",
"⫈": "\u2AC8",
"⫔": "\u2AD4",
"⫖": "\u2AD6",
"⇙": "\u21D9",
"⤦": "\u2926",
"↙": "\u2199",
"↙": "\u2199",
"⤪": "\u292A",
"ß": "\xDF",
"ß": "\xDF",
"⌖": "\u2316",
"τ": "\u03C4",
"⎴": "\u23B4",
"ť": "\u0165",
"ţ": "\u0163",
"т": "\u0442",
"⃛": "\u20DB",
"⌕": "\u2315",
"𝔱": "\u{1D531}",
"∴": "\u2234",
"∴": "\u2234",
"θ": "\u03B8",
"ϑ": "\u03D1",
"ϑ": "\u03D1",
"≈": "\u2248",
"∼": "\u223C",
" ": "\u2009",
"≈": "\u2248",
"∼": "\u223C",
"þ": "\xFE",
"þ": "\xFE",
"˜": "\u02DC",
"×": "\xD7",
"×": "\xD7",
"⊠": "\u22A0",
"⨱": "\u2A31",
"⨰": "\u2A30",
"∭": "\u222D",
"⤨": "\u2928",
"⊤": "\u22A4",
"⌶": "\u2336",
"⫱": "\u2AF1",
"𝕥": "\u{1D565}",
"⫚": "\u2ADA",
"⤩": "\u2929",
"‴": "\u2034",
"™": "\u2122",
"▵": "\u25B5",
"▿": "\u25BF",
"◃": "\u25C3",
"⊴": "\u22B4",
"≜": "\u225C",
"▹": "\u25B9",
"⊵": "\u22B5",
"◬": "\u25EC",
"≜": "\u225C",
"⨺": "\u2A3A",
"⨹": "\u2A39",
"⧍": "\u29CD",
"⨻": "\u2A3B",
"⏢": "\u23E2",
"𝓉": "\u{1D4C9}",
"ц": "\u0446",
"ћ": "\u045B",
"ŧ": "\u0167",
"≬": "\u226C",
"↞": "\u219E",
"↠": "\u21A0",
"⇑": "\u21D1",
"⥣": "\u2963",
"ú": "\xFA",
"ú": "\xFA",
"↑": "\u2191",
"ў": "\u045E",
"ŭ": "\u016D",
"û": "\xFB",
"û": "\xFB",
"у": "\u0443",
"⇅": "\u21C5",
"ű": "\u0171",
"⥮": "\u296E",
"⥾": "\u297E",
"𝔲": "\u{1D532}",
"ù": "\xF9",
"ù": "\xF9",
"↿": "\u21BF",
"↾": "\u21BE",
"▀": "\u2580",
"⌜": "\u231C",
"⌜": "\u231C",
"⌏": "\u230F",
"◸": "\u25F8",
"ū": "\u016B",
"¨": "\xA8",
"¨": "\xA8",
"ų": "\u0173",
"𝕦": "\u{1D566}",
"↑": "\u2191",
"↕": "\u2195",
"↿": "\u21BF",
"↾": "\u21BE",
"⊎": "\u228E",
"υ": "\u03C5",
"ϒ": "\u03D2",
"υ": "\u03C5",
"⇈": "\u21C8",
"⌝": "\u231D",
"⌝": "\u231D",
"⌎": "\u230E",
"ů": "\u016F",
"◹": "\u25F9",
"𝓊": "\u{1D4CA}",
"⋰": "\u22F0",
"ũ": "\u0169",
"▵": "\u25B5",
"▴": "\u25B4",
"⇈": "\u21C8",
"ü": "\xFC",
"ü": "\xFC",
"⦧": "\u29A7",
"⇕": "\u21D5",
"⫨": "\u2AE8",
"⫩": "\u2AE9",
"⊨": "\u22A8",
"⦜": "\u299C",
"ϵ": "\u03F5",
"ϰ": "\u03F0",
"∅": "\u2205",
"ϕ": "\u03D5",
"ϖ": "\u03D6",
"∝": "\u221D",
"↕": "\u2195",
"ϱ": "\u03F1",
"ς": "\u03C2",
"⊊︀": "\u228A\uFE00",
"⫋︀": "\u2ACB\uFE00",
"⊋︀": "\u228B\uFE00",
"⫌︀": "\u2ACC\uFE00",
"ϑ": "\u03D1",
"⊲": "\u22B2",
"⊳": "\u22B3",
"в": "\u0432",
"⊢": "\u22A2",
"∨": "\u2228",
"⊻": "\u22BB",
"≚": "\u225A",
"⋮": "\u22EE",
"|": "|",
"|": "|",
"𝔳": "\u{1D533}",
"⊲": "\u22B2",
"⊂⃒": "\u2282\u20D2",
"⊃⃒": "\u2283\u20D2",
"𝕧": "\u{1D567}",
"∝": "\u221D",
"⊳": "\u22B3",
"𝓋": "\u{1D4CB}",
"⫋︀": "\u2ACB\uFE00",
"⊊︀": "\u228A\uFE00",
"⫌︀": "\u2ACC\uFE00",
"⊋︀": "\u228B\uFE00",
"⦚": "\u299A",
"ŵ": "\u0175",
"⩟": "\u2A5F",
"∧": "\u2227",
"≙": "\u2259",
"℘": "\u2118",
"𝔴": "\u{1D534}",
"𝕨": "\u{1D568}",
"℘": "\u2118",
"≀": "\u2240",
"≀": "\u2240",
"𝓌": "\u{1D4CC}",
"⋂": "\u22C2",
"◯": "\u25EF",
"⋃": "\u22C3",
"▽": "\u25BD",
"𝔵": "\u{1D535}",
"⟺": "\u27FA",
"⟷": "\u27F7",
"ξ": "\u03BE",
"⟸": "\u27F8",
"⟵": "\u27F5",
"⟼": "\u27FC",
"⋻": "\u22FB",
"⨀": "\u2A00",
"𝕩": "\u{1D569}",
"⨁": "\u2A01",
"⨂": "\u2A02",
"⟹": "\u27F9",
"⟶": "\u27F6",
"𝓍": "\u{1D4CD}",
"⨆": "\u2A06",
"⨄": "\u2A04",
"△": "\u25B3",
"⋁": "\u22C1",
"⋀": "\u22C0",
"ý": "\xFD",
"ý": "\xFD",
"я": "\u044F",
"ŷ": "\u0177",
"ы": "\u044B",
"¥": "\xA5",
"¥": "\xA5",
"𝔶": "\u{1D536}",
"ї": "\u0457",
"𝕪": "\u{1D56A}",
"𝓎": "\u{1D4CE}",
"ю": "\u044E",
"ÿ": "\xFF",
"ÿ": "\xFF",
"ź": "\u017A",
"ž": "\u017E",
"з": "\u0437",
"ż": "\u017C",
"ℨ": "\u2128",
"ζ": "\u03B6",
"𝔷": "\u{1D537}",
"ж": "\u0436",
"⇝": "\u21DD",
"𝕫": "\u{1D56B}",
"𝓏": "\u{1D4CF}",
"‍": "\u200D",
"‌": "\u200C"
}, html_entities_default = htmlEntities;
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/text-format.js
function decodeHTMLEntities(str) {
return str.replace(/&(#\d+|#x[a-f0-9]+|[a-z]+\d*);?/gi, (match, entity) => {
if (typeof html_entities_default[match] == "string")
return html_entities_default[match];
if (entity.charAt(0) !== "#" || match.charAt(match.length - 1) !== ";")
return match;
let codePoint;
entity.charAt(1) === "x" ? codePoint = parseInt(entity.substr(2), 16) : codePoint = parseInt(entity.substr(1), 10);
var output = "";
return codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111 ? "\uFFFD" : (codePoint > 65535 && (codePoint -= 65536, output += String.fromCharCode(codePoint >>> 10 & 1023 | 55296), codePoint = 56320 | codePoint & 1023), output += String.fromCharCode(codePoint), output);
});
}
function escapeHtml(str) {
return str.trim().replace(/[<>"'?&]/g, (c) => {
let hex = c.charCodeAt(0).toString(16);
return hex.length < 2 && (hex = "0" + hex), "&#x" + hex.toUpperCase() + ";";
});
}
function textToHtml(str) {
return "<div>" + escapeHtml(str).replace(/\n/g, "<br />") + "</div>";
}
function htmlToText(str) {
return str = str.replace(/\r?\n/g, "").replace(/<\!\-\-.*?\-\->/gi, " ").replace(/<br\b[^>]*>/gi, `
`).replace(/<\/?(p|div|table|tr|td|th)\b[^>]*>/gi, `
`).replace(/<script\b[^>]*>.*?<\/script\b[^>]*>/gi, " ").replace(/^.*<body\b[^>]*>/i, "").replace(/^.*<\/head\b[^>]*>/i, "").replace(/^.*<\!doctype\b[^>]*>/i, "").replace(/<\/body\b[^>]*>.*$/i, "").replace(/<\/html\b[^>]*>.*$/i, "").replace(/<a\b[^>]*href\s*=\s*["']?([^\s"']+)[^>]*>/gi, " ($1) ").replace(/<\/?(span|em|i|strong|b|u|a)\b[^>]*>/gi, "").replace(/<li\b[^>]*>[\n\u0001\s]*/gi, "* ").replace(/<hr\b[^>]*>/g, `
-------------
`).replace(/<[^>]*>/g, " ").replace(/\u0001/g, `
`).replace(/[ \t]+/g, " ").replace(/^\s+$/gm, "").replace(/\n\n+/g, `
`).replace(/^\n+/, `
`).replace(/\n+$/, `
`), str = decodeHTMLEntities(str), str;
}
function formatTextAddress(address) {
return [].concat(address.name || []).concat(address.name ? `<${address.address}>` : address.address).join(" ");
}
function formatTextAddresses(addresses) {
let parts = [], processAddress = (address, partCounter) => {
if (partCounter && parts.push(", "), address.group) {
let groupStart = `${address.name}:`, groupEnd = ";";
parts.push(groupStart), address.group.forEach(processAddress), parts.push(groupEnd);
} else
parts.push(formatTextAddress(address));
};
return addresses.forEach(processAddress), parts.join("");
}
function formatHtmlAddress(address) {
return `<a href="mailto:${escapeHtml(address.address)}" class="postal-email-address">${escapeHtml(address.name || `<${address.address}>`)}</a>`;
}
function formatHtmlAddresses(addresses) {
let parts = [], processAddress = (address, partCounter) => {
if (partCounter && parts.push('<span class="postal-email-address-separator">, </span>'), address.group) {
let groupStart = `<span class="postal-email-address-group">${escapeHtml(address.name)}:</span>`, groupEnd = '<span class="postal-email-address-group">;</span>';
parts.push(groupStart), address.group.forEach(processAddress), parts.push(groupEnd);
} else
parts.push(formatHtmlAddress(address));
};
return addresses.forEach(processAddress), parts.join(" ");
}
function foldLines(str, lineLength, afterSpace) {
str = (str || "").toString(), lineLength = lineLength || 76;
let pos = 0, len = str.length, result = "", line, match;
for (; pos < len; ) {
if (line = str.substr(pos, lineLength), line.length < lineLength) {
result += line;
break;
}
if (match = line.match(/^[^\n\r]*(\r?\n|\r)/)) {
line = match[0], result += line, pos += line.length;
continue;
} else (match = line.match(/(\s+)[^\s]*$/)) && match[0].length - (afterSpace ? (match[1] || "").length : 0) < line.length ? line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || "").length : 0))) : (match = str.substr(pos + line.length).match(/^[^\s]+(\s*)/)) && (line = line + match[0].substr(0, match[0].length - (afterSpace ? 0 : (match[1] || "").length)));
result += line, pos += line.length, pos < len && (result += `\r
`);
}
return result;
}
function formatTextHeader(message) {
let rows = [];
if (message.from && rows.push({ key: "From", val: formatTextAddress(message.from) }), message.subject && rows.push({ key: "Subject", val: message.subject }), message.date) {
let dateOptions = {
year: "numeric",
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "numeric",
second: "numeric",
hour12: !1
}, dateStr = typeof Intl > "u" ? message.date : new Intl.DateTimeFormat("default", dateOptions).format(new Date(message.date));
rows.push({ key: "Date", val: dateStr });
}
message.to && message.to.length && rows.push({ key: "To", val: formatTextAddresses(message.to) }), message.cc && message.cc.length && rows.push({ key: "Cc", val: formatTextAddresses(message.cc) }), message.bcc && message.bcc.length && rows.push({ key: "Bcc", val: formatTextAddresses(message.bcc) });
let maxKeyLength = rows.map((r) => r.key.length).reduce((acc, cur) => cur > acc ? cur : acc, 0);
rows = rows.flatMap((row) => {
let sepLen = maxKeyLength - row.key.length, prefix = `${row.key}: ${" ".repeat(sepLen)}`, emptyPrefix = `${" ".repeat(row.key.length + 1)} ${" ".repeat(sepLen)}`;
return foldLines(row.val, 80, !0).split(/\r?\n/).map((line) => line.trim()).map((line, i) => `${i ? emptyPrefix : prefix}${line}`);
});
let maxLineLength = rows.map((r) => r.length).reduce((acc, cur) => cur > acc ? cur : acc, 0), lineMarker = "-".repeat(maxLineLength);
return `
${lineMarker}
${rows.join(`
`)}
${lineMarker}
`;
}
function formatHtmlHeader(message) {
let rows = [];
if (message.from && rows.push(`<div class="postal-email-header-key">From</div><div class="postal-email-header-value">${formatHtmlAddress(message.from)}</div>`), message.subject && rows.push(
`<div class="postal-email-header-key">Subject</div><div class="postal-email-header-value postal-email-header-subject">${escapeHtml(
message.subject
)}</div>`
), message.date) {
let dateOptions = {
year: "numeric",
month: "numeric",
day: "numeric",
hour: "numeric",
minute: "numeric",
second: "numeric",
hour12: !1
}, dateStr = typeof Intl > "u" ? message.date : new Intl.DateTimeFormat("default", dateOptions).format(new Date(message.date));
rows.push(
`<div class="postal-email-header-key">Date</div><div class="postal-email-header-value postal-email-header-date" data-date="${escapeHtml(
message.date
)}">${escapeHtml(dateStr)}</div>`
);
}
return message.to && message.to.length && rows.push(`<div class="postal-email-header-key">To</div><div class="postal-email-header-value">${formatHtmlAddresses(message.to)}</div>`), message.cc && message.cc.length && rows.push(`<div class="postal-email-header-key">Cc</div><div class="postal-email-header-value">${formatHtmlAddresses(message.cc)}</div>`), message.bcc && message.bcc.length && rows.push(`<div class="postal-email-header-key">Bcc</div><div class="postal-email-header-value">${formatHtmlAddresses(message.bcc)}</div>`), `<div class="postal-email-header">${rows.length ? '<div class="postal-email-header-row">' : ""}${rows.join(
`</div>
<div class="postal-email-header-row">`
)}${rows.length ? "</div>" : ""}</div>`;
}
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/address-parser.js
function _handleAddress(tokens) {
let token, isGroup = !1, state = "text", address, addresses = [], data = {
address: [],
comment: [],
group: [],
text: []
}, i, len;
for (i = 0, len = tokens.length; i < len; i++)
if (token = tokens[i], token.type === "operator")
switch (token.value) {
case "<":
state = "address";
break;
case "(":
state = "comment";
break;
case ":":
state = "group", isGroup = !0;
break;
default:
state = "text";
}
else token.value && (state === "address" && (token.value = token.value.replace(/^[^<]*<\s*/, "")), data[state].push(token.value));
if (!data.text.length && data.comment.length && (data.text = data.comment, data.comment = []), isGroup)
data.text = data.text.join(" "), addresses.push({
name: decodeWords(data.text || address && address.name),
group: data.group.length ? addressParser(data.group.join(",")) : []
});
else {
if (!data.address.length && data.text.length) {
for (i = data.text.length - 1; i >= 0; i--)
if (data.text[i].match(/^[^@\s]+@[^@\s]+$/)) {
data.address = data.text.splice(i, 1);
break;
}
let _regexHandler = function(address2) {
return data.address.length ? address2 : (data.address = [address2.trim()], " ");
};
if (!data.address.length)
for (i = data.text.length - 1; i >= 0 && (data.text[i] = data.text[i].replace(/\s*\b[^@\s]+@[^\s]+\b\s*/, _regexHandler).trim(), !data.address.length); i--)
;
}
if (!data.text.length && data.comment.length && (data.text = data.comment, data.comment = []), data.address.length > 1 && (data.text = data.text.concat(data.address.splice(1))), data.text = data.text.join(" "), data.address = data.address.join(" "), !data.address && /^=\?[^=]+?=$/.test(data.text.trim())) {
let parsedSubAddresses = addressParser(decodeWords(data.text));
if (parsedSubAddresses && parsedSubAddresses.length)
return parsedSubAddresses;
}
if (!data.address && isGroup)
return [];
address = {
address: data.address || data.text || "",
name: decodeWords(data.text || data.address || "")
}, address.address === address.name && ((address.address || "").match(/@/) ? address.name = "" : address.address = ""), addresses.push(address);
}
return addresses;
}
var Tokenizer = class {
constructor(str) {
this.str = (str || "").toString(), this.operatorCurrent = "", this.operatorExpecting = "", this.node = null, this.escaped = !1, this.list = [], this.operators = {
'"': '"',
"(": ")",
"<": ">",
",": "",
":": ";",
// Semicolons are not a legal delimiter per the RFC2822 grammar other
// than for terminating a group, but they are also not valid for any
// other use in this context. Given that some mail clients have
// historically allowed the semicolon as a delimiter equivalent to the
// comma in their UI, it makes sense to treat them the same as a comma
// when used outside of a group.
";": ""
};
}
/**
* Tokenizes the original input string
*
* @return {Array} An array of operator|text tokens
*/
tokenize() {
let chr, list = [];
for (let i = 0, len = this.str.length; i < len; i++)
chr = this.str.charAt(i), this.checkChar(chr);
return this.list.forEach((node) => {
node.value = (node.value || "").toString().trim(), node.value && list.push(node);
}), list;
}
/**
* Checks if a character is an operator or text and acts accordingly
*
* @param {String} chr Character from the address field
*/
checkChar(chr) {
if (!this.escaped) {
if (chr === this.operatorExpecting) {
this.node = {
type: "operator",
value: chr
}, this.list.push(this.node), this.node = null, this.operatorExpecting = "", this.escaped = !1;
return;
} else if (!this.operatorExpecting && chr in this.operators) {
this.node = {
type: "operator",
value: chr
}, this.list.push(this.node), this.node = null, this.operatorExpecting = this.operators[chr], this.escaped = !1;
return;
} else if (['"', "'"].includes(this.operatorExpecting) && chr === "\\") {
this.escaped = !0;
return;
}
}
this.node || (this.node = {
type: "text",
value: ""
}, this.list.push(this.node)), chr === `
` && (chr = " "), (chr.charCodeAt(0) >= 33 || [" ", " "].includes(chr)) && (this.node.value += chr), this.escaped = !1;
}
};
function addressParser(str, options) {
options = options || {};
let tokens = new Tokenizer(str).tokenize(), addresses = [], address = [], parsedAddresses = [];
if (tokens.forEach((token) => {
token.type === "operator" && (token.value === "," || token.value === ";") ? (address.length && addresses.push(address), address = []) : address.push(token);
}), address.length && addresses.push(address), addresses.forEach((address2) => {
address2 = _handleAddress(address2), address2.length && (parsedAddresses = parsedAddresses.concat(address2));
}), options.flatten) {
let addresses2 = [], walkAddressList = (list) => {
list.forEach((address2) => {
if (address2.group)
return walkAddressList(address2.group);
addresses2.push(address2);
});
};
return walkAddressList(parsedAddresses), addresses2;
}
return parsedAddresses;
}
var address_parser_default = addressParser;
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/base64-encoder.js
function base64ArrayBuffer(arrayBuffer) {
for (var base64 = "", encodings = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", bytes = new Uint8Array(arrayBuffer), byteLength = bytes.byteLength, byteRemainder = byteLength % 3, mainLength = byteLength - byteRemainder, a, b, c, d, chunk, i = 0; i < mainLength; i = i + 3)
chunk = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2], a = (chunk & 16515072) >> 18, b = (chunk & 258048) >> 12, c = (chunk & 4032) >> 6, d = chunk & 63, base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];
return byteRemainder == 1 ? (chunk = bytes[mainLength], a = (chunk & 252) >> 2, b = (chunk & 3) << 4, base64 += encodings[a] + encodings[b] + "==") : byteRemainder == 2 && (chunk = bytes[mainLength] << 8 | bytes[mainLength + 1], a = (chunk & 64512) >> 10, b = (chunk & 1008) >> 4, c = (chunk & 15) << 2, base64 += encodings[a] + encodings[b] + encodings[c] + "="), base64;
}
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/postal-mime.js
var PostalMime = class _PostalMime {
static parse(buf, options) {
return new _PostalMime(options).parse(buf);
}
constructor(options) {
this.options = options || {}, this.root = this.currentNode = new MimeNode({
postalMime: this
}), this.boundaries = [], this.textContent = {}, this.attachments = [], this.attachmentEncoding = (this.options.attachmentEncoding || "").toString().replace(/[-_\s]/g, "").trim().toLowerCase() || "arraybuffer", this.started = !1;
}
async finalize() {
await this.root.finalize();
}
async processLine(line, isFinal) {
let boundaries = this.boundaries;
if (boundaries.length && line.length > 2 && line[0] === 45 && line[1] === 45)
for (let i = boundaries.length - 1; i >= 0; i--) {
let boundary = boundaries[i];
if (line.length !== boundary.value.length + 2 && line.length !== boundary.value.length + 4)
continue;
let isTerminator = line.length === boundary.value.length + 4;
if (isTerminator && (line[line.length - 2] !== 45 || line[line.length - 1] !== 45))
continue;
let boudaryMatches = !0;
for (let i2 = 0; i2 < boundary.value.length; i2++)
if (line[i2 + 2] !== boundary.value[i2]) {
boudaryMatches = !1;
break;
}
if (boudaryMatches)
return isTerminator ? (await boundary.node.finalize(), this.currentNode = boundary.node.parentNode || this.root) : (await boundary.node.finalizeChildNodes(), this.currentNode = new MimeNode({
postalMime: this,
parentNode: boundary.node
})), isFinal ? this.finalize() : void 0;
}
if (this.currentNode.feed(line), isFinal)
return this.finalize();
}
readLine() {
let startPos = this.readPos, endPos = this.readPos, res = () => ({
bytes: new Uint8Array(this.buf, startPos, endPos - startPos),
done: this.readPos >= this.av.length
});
for (; this.readPos < this.av.length; ) {
let c = this.av[this.readPos++];
if (c !== 13 && c !== 10 && (endPos = this.readPos), c === 10)
return res();
}
return res();
}
async processNodeTree() {
let textContent = {}, textTypes = /* @__PURE__ */ new Set(), textMap = this.textMap = /* @__PURE__ */ new Map(), forceRfc822Attachments = this.forceRfc822Attachments(), walk = async (node, alternative, related) => {
if (alternative = alternative || !1, related = related || !1, node.contentType.multipart)
node.contentType.multipart === "alternative" ? alternative = node : node.contentType.multipart === "related" && (related = node);
else if (this.isInlineMessageRfc822(node) && !forceRfc822Attachments) {
let subParser = new _PostalMime();
node.subMessage = await subParser.parse(node.content), textMap.has(node) || textMap.set(node, {});
let textEntry = textMap.get(node);
(node.subMessage.text || !node.subMessage.html) && (textEntry.plain = textEntry.plain || [], textEntry.plain.push({ type: "subMessage", value: node.subMessage }), textTypes.add("plain")), node.subMessage.html && (textEntry.html = textEntry.html || [], textEntry.html.push({ type: "subMessage", value: node.subMessage }), textTypes.add("html")), subParser.textMap && subParser.textMap.forEach((subTextEntry, subTextNode) => {
textMap.set(subTextNode, subTextEntry);
});
for (let attachment of node.subMessage.attachments || [])
this.attachments.push(attachment);
} else if (this.isInlineTextNode(node)) {
let textType = node.contentType.parsed.value.substr(node.contentType.parsed.value.indexOf("/") + 1), selectorNode = alternative || node;
textMap.has(selectorNode) || textMap.set(selectorNode, {});
let textEntry = textMap.get(selectorNode);
textEntry[textType] = textEntry[textType] || [], textEntry[textType].push({ type: "text", value: node.getTextContent() }), textTypes.add(textType);
} else if (node.content) {
let filename = node.contentDisposition.parsed.params.filename || node.contentType.parsed.params.name || null, attachment = {
filename: filename ? decodeWords(filename) : null,
mimeType: node.contentType.parsed.value,
disposition: node.contentDisposition.parsed.value || null
};
switch (related && node.contentId && (attachment.related = !0), node.contentDescription && (attachment.description = node.contentDescription), node.contentId && (attachment.contentId = node.contentId), node.contentType.parsed.value) {
// Special handling for calendar events
case "text/calendar":
case "application/ics": {
node.contentType.parsed.params.method && (attachment.method = node.contentType.parsed.params.method.toString().toUpperCase().trim());
let decodedText = node.getTextContent().replace(/\r?\n/g, `
`).replace(/\n*$/, `
`);
attachment.content = textEncoder.encode(decodedText);
break;
}
// Regular attachments
default:
attachment.content = node.content;
}
this.attachments.push(attachment);
}
for (let childNode of node.childNodes)
await walk(childNode, alternative, related);
};
await walk(this.root, !1, []), textMap.forEach((mapEntry) => {
textTypes.forEach((textType) => {
if (textContent[textType] || (textContent[textType] = []), mapEntry[textType])
mapEntry[textType].forEach((textEntry) => {
switch (textEntry.type) {
case "text":
textContent[textType].push(textEntry.value);
break;
case "subMessage":
switch (textType) {
case "html":
textContent[textType].push(formatHtmlHeader(textEntry.value));
break;
case "plain":
textContent[textType].push(formatTextHeader(textEntry.value));
break;
}
break;
}
});
else {
let alternativeType;
switch (textType) {
case "html":
alternativeType = "plain";
break;
case "plain":
alternativeType = "html";
break;
}
(mapEntry[alternativeType] || []).forEach((textEntry) => {
switch (textEntry.type) {
case "text":
switch (textType) {
case "html":
textContent[textType].push(textToHtml(textEntry.value));
break;
case "plain":
textContent[textType].push(htmlToText(textEntry.value));
break;
}
break;
case "subMessage":
switch (textType) {
case "html":
textContent[textType].push(formatHtmlHeader(textEntry.value));
break;
case "plain":
textContent[textType].push(formatTextHeader(textEntry.value));
break;
}
break;
}
});
}
});
}), Object.keys(textContent).forEach((textType) => {
textContent[textType] = textContent[textType].join(`
`);
}), this.textContent = textContent;
}
isInlineTextNode(node) {
if (node.contentDisposition.parsed.value === "attachment")
return !1;
switch (node.contentType.parsed.value) {
case "text/html":
case "text/plain":
return !0;
case "text/calendar":
case "text/csv":
default:
return !1;
}
}
isInlineMessageRfc822(node) {
return node.contentType.parsed.value !== "message/rfc822" ? !1 : (node.contentDisposition.parsed.value || (this.options.rfc822Attachments ? "attachment" : "inline")) === "inline";
}
// Check if this is a specially crafted report email where message/rfc822 content should not be inlined
forceRfc822Attachments() {
if (this.options.forceRfc822Attachments)
return !0;
let forceRfc822Attachments = !1, walk = (node) => {
node.contentType.multipart || ["message/delivery-status", "message/feedback-report"].includes(node.contentType.parsed.value) && (forceRfc822Attachments = !0);
for (let childNode of node.childNodes)
walk(childNode);
};
return walk(this.root), forceRfc822Attachments;
}
async resolveStream(stream) {
let chunkLen = 0, chunks = [], reader = stream.getReader();
for (; ; ) {
let { done, value } = await reader.read();
if (done)
break;
chunks.push(value), chunkLen += value.length;
}
let result = new Uint8Array(chunkLen), chunkPointer = 0;
for (let chunk of chunks)
result.set(chunk, chunkPointer), chunkPointer += chunk.length;
return result;
}
async parse(buf) {
if (this.started)
throw new Error("Can not reuse parser, create a new PostalMime object");
for (this.started = !0, buf && typeof buf.getReader == "function" && (buf = await this.resolveStream(buf)), buf = buf || new ArrayBuffer(0), typeof buf == "string" && (buf = textEncoder.encode(buf)), (buf instanceof Blob || Object.prototype.toString.call(buf) === "[object Blob]") && (buf = await blobToArrayBuffer(buf)), buf.buffer instanceof ArrayBuffer && (buf = new Uint8Array(buf).buffer), this.buf = buf, this.av = new Uint8Array(buf), this.readPos = 0; this.readPos < this.av.length; ) {
let line = this.readLine();
await this.processLine(line.bytes, line.done);
}
await this.processNodeTree();
let message = {
headers: this.root.headers.map((entry) => ({ key: entry.key, value: entry.value })).reverse()
};
for (let key of ["from", "sender"]) {
let addressHeader = this.root.headers.find((line) => line.key === key);
if (addressHeader && addressHeader.value) {
let addresses = address_parser_default(addressHeader.value);
addresses && addresses.length && (message[key] = addresses[0]);
}
}
for (let key of ["delivered-to", "return-path"]) {
let addressHeader = this.root.headers.find((line) => line.key === key);
if (addressHeader && addressHeader.value) {
let addresses = address_parser_default(addressHeader.value);
if (addresses && addresses.length && addresses[0].address) {
let camelKey = key.replace(/\-(.)/g, (o, c) => c.toUpperCase());
message[camelKey] = addresses[0].address;
}
}
}
for (let key of ["to", "cc", "bcc", "reply-to"]) {
let addressHeaders = this.root.headers.filter((line) => line.key === key), addresses = [];
if (addressHeaders.filter((entry) => entry && entry.value).map((entry) => address_parser_default(entry.value)).forEach((parsed) => addresses = addresses.concat(parsed || [])), addresses && addresses.length) {
let camelKey = key.replace(/\-(.)/g, (o, c) => c.toUpperCase());
message[camelKey] = addresses;
}
}
for (let key of ["subject", "message-id", "in-reply-to", "references"]) {
let header = this.root.headers.find((line) => line.key === key);
if (header && header.value) {
let camelKey = key.replace(/\-(.)/g, (o, c) => c.toUpperCase());
message[camelKey] = decodeWords(header.value);
}
}
let dateHeader = this.root.headers.find((line) => line.key === "date");
if (dateHeader) {
let date = new Date(dateHeader.value);
!date || date.toString() === "Invalid Date" ? date = dateHeader.value : date = date.toISOString(), message.date = date;
}
switch (this.textContent?.html && (message.html = this.textContent.html), this.textContent?.plain && (message.text = this.textContent.plain), message.attachments = this.attachments, this.attachmentEncoding) {
case "arraybuffer":
break;
case "base64":
for (let attachment of message.attachments || [])
attachment?.content && (attachment.content = base64ArrayBuffer(attachment.content), attachment.encoding = "base64");
break;
case "utf8":
let attachmentDecoder = new TextDecoder("utf8");
for (let attachment of message.attachments || [])
attachment?.content && (attachment.content = attachmentDecoder.decode(attachment.content), attachment.encoding = "utf8");
break;
default:
throw new Error("Unknwon attachment encoding");
}
return message;
}
};
// src/workers/core/constants.ts
var 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"
};
// src/workers/email/constants.ts
var RAW_EMAIL = "EmailMessage::raw";
// src/workers/email/send_email.worker.ts
var SendEmailBinding = class extends WorkerEntrypoint {
checkDestinationAllowed(to) {
if (this.env.destination_address !== void 0 && to !== this.env.destination_address)
throw new Error(`email to ${to} not allowed`);
if (this.env.allowed_destination_addresses !== void 0 && !this.env.allowed_destination_addresses.includes(to))
throw new Error(`email to ${to} not allowed`);
}
checkSenderAllowed(from) {
if (this.env.allowed_sender_addresses !== void 0 && !this.env.allowed_sender_addresses.includes(from))
throw new Error(`email from ${from} not allowed`);
}
async send(emailMessage) {
this.checkDestinationAllowed(emailMessage.to), this.checkSenderAllowed(emailMessage.from);
let rawEmail = emailMessage[RAW_EMAIL], rawEmailBuffer = new Uint8Array(
await new Response(rawEmail).arrayBuffer()
), parsedEmail;
try {
parsedEmail = await PostalMime.parse(rawEmailBuffer);
} catch (e) {
let error = e;
throw new Error(`could not parse email: ${error.message}`);
}
if (parsedEmail.messageId === void 0)
throw new Error("invalid message-id");
let emailHeaders;
try {
emailHeaders = new Headers(
parsedEmail.headers.map((header) => [header.key, header.value])
);
} catch (e) {
let error = e;
throw new Error(`could not parse email: ${error.message}`);
}
if (emailMessage.from !== parsedEmail.from.address)
throw new Error("From: header does not match mail from");
if (emailHeaders.get("received") !== null)
throw new Error("invalid headers set");
let file = await (await this.env[CoreBindings.SERVICE_LOOPBACK].fetch(
"http://localhost/core/store-temp-file?extension=eml&prefix=email",
{
method: "POST",
body: rawEmailBuffer
}
)).text();
this.ctx.waitUntil(
this.env[CoreBindings.SERVICE_LOOPBACK].fetch(
"http://localhost/core/log",
{
method: "POST",
headers: { [SharedHeaders.LOG_LEVEL]: LogLevel.INFO.toString() },
body: `${blue("send_email binding called with the following message:")}
${file}`
}
)
);
}
};
export {
SendEmailBinding
};
//# sourceMappingURL=send_email.worker.js.map