From 76ea02840e304f16d8e960317ccd0622f58a1868 Mon Sep 17 00:00:00 2001 From: Timeo Williams Date: Sun, 22 Sep 2024 02:40:55 -0400 Subject: [PATCH] chore: format --- .github/workflows/playwright.yml | 2 +- electron.vite.config.ts | 11 +- playwright-report/index.html | 21043 ++++++++++++++++++++++++++++- playwright.config.cjs | 16 +- src/main/config.ts | 4 +- src/main/index.ts | 26 +- src/main/productivityUtils.d.ts | 2 +- src/main/productivityUtils.ts | 7 +- src/main/types.ts | 2 - src/renderer/src/App.tsx | 2 - src/renderer/src/config.ts | 4 +- tests/e2e/userflow.test.ts | 67 +- 12 files changed, 21059 insertions(+), 127 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index c7f6491..6dece99 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,6 +1,6 @@ name: Playwright Tests -on: +on: push: branches: - main diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 17983d9..7bc715c 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -21,11 +21,12 @@ export default defineConfig({ }, // Externalize unnecessary dependencies from the worker external: ['electron', 'path', 'fs', 'dotenv', '@electron-toolkit/utils', 'electron-store'] - }, - + } }, define: { - 'process.env.API_BASE_URL': JSON.stringify(process.env.VITE_SERVER_URL_PROD || 'https://backend-production-5eec.up.railway.app'), + 'process.env.API_BASE_URL': JSON.stringify( + process.env.VITE_SERVER_URL_PROD || 'https://backend-production-5eec.up.railway.app' + ) } }, preload: { @@ -48,7 +49,9 @@ export default defineConfig({ outDir: 'out/renderer' }, define: { - 'process.env.API_BASE_URL': JSON.stringify(process.env.VITE_SERVER_URL_PROD || 'https://backend-production-5eec.up.railway.app'), + 'process.env.API_BASE_URL': JSON.stringify( + process.env.VITE_SERVER_URL_PROD || 'https://backend-production-5eec.up.railway.app' + ) } } }) diff --git a/playwright-report/index.html b/playwright-report/index.html index 78949f3..9955b4b 100644 --- a/playwright-report/index.html +++ b/playwright-report/index.html @@ -1,68 +1,21001 @@ - - - + - - - + + + Playwright Test Report - - + rgb(0 0 0 / 25%) 0px 6px 12px` + }, + mv = ({ diff: e, noTargetBlank: t }) => { + const [n, r] = U.useState(e.diff ? 'diff' : 'actual'), + [o, s] = U.useState(!1), + [i, l] = U.useState(null), + [c, a] = U.useState(null), + [p, y] = U.useState(null), + [h, x] = Pp() + U.useEffect(() => { + ;(async () => { + var A, S, k + l(await Ci((A = e.expected) == null ? void 0 : A.attachment.path)), + a(await Ci((S = e.actual) == null ? void 0 : S.attachment.path)), + y(await Ci((k = e.diff) == null ? void 0 : k.attachment.path)) + })() + }, [e]) + const E = i && c && p, + g = E ? Math.max(i.naturalWidth, c.naturalWidth, 200) : 500, + v = E ? Math.max(i.naturalHeight, c.naturalHeight, 200) : 500, + u = Math.min(1, (h.width - 30) / g), + f = Math.min(1, (h.width - 50) / g / 2), + d = g * u, + w = v * u, + C = { flex: 'none', margin: '0 10px', cursor: 'pointer', userSelect: 'none' } + return m.jsx('div', { + 'data-testid': 'test-result-image-mismatch', + style: { display: 'flex', flexDirection: 'column', alignItems: 'center', flex: 'auto' }, + ref: x, + children: + E && + m.jsxs(m.Fragment, { + children: [ + m.jsxs('div', { + 'data-testid': 'test-result-image-mismatch-tabs', + style: { display: 'flex', margin: '10px 0 20px' }, + children: [ + e.diff && + m.jsx('div', { + style: { ...C, fontWeight: n === 'diff' ? 600 : 'initial' }, + onClick: () => r('diff'), + children: 'Diff' + }), + m.jsx('div', { + style: { ...C, fontWeight: n === 'actual' ? 600 : 'initial' }, + onClick: () => r('actual'), + children: 'Actual' + }), + m.jsx('div', { + style: { ...C, fontWeight: n === 'expected' ? 600 : 'initial' }, + onClick: () => r('expected'), + children: 'Expected' + }), + m.jsx('div', { + style: { ...C, fontWeight: n === 'sxs' ? 600 : 'initial' }, + onClick: () => r('sxs'), + children: 'Side by side' + }), + m.jsx('div', { + style: { ...C, fontWeight: n === 'slider' ? 600 : 'initial' }, + onClick: () => r('slider'), + children: 'Slider' + }) + ] + }), + m.jsxs('div', { + style: { + display: 'flex', + justifyContent: 'center', + flex: 'auto', + minHeight: w + 60 + }, + children: [ + e.diff && + n === 'diff' && + m.jsx(pt, { + image: p, + alt: 'Diff', + canvasWidth: d, + canvasHeight: w, + scale: u + }), + e.diff && + n === 'actual' && + m.jsx(pt, { + image: c, + alt: 'Actual', + canvasWidth: d, + canvasHeight: w, + scale: u + }), + e.diff && + n === 'expected' && + m.jsx(pt, { + image: i, + alt: 'Expected', + canvasWidth: d, + canvasHeight: w, + scale: u + }), + e.diff && + n === 'slider' && + m.jsx(vv, { + expectedImage: i, + actualImage: c, + canvasWidth: d, + canvasHeight: w, + scale: u + }), + e.diff && + n === 'sxs' && + m.jsxs('div', { + style: { display: 'flex' }, + children: [ + m.jsx(pt, { + image: i, + title: 'Expected', + canvasWidth: f * g, + canvasHeight: f * v, + scale: f + }), + m.jsx(pt, { + image: o ? p : c, + title: o ? 'Diff' : 'Actual', + onClick: () => s(!o), + canvasWidth: f * g, + canvasHeight: f * v, + scale: f + }) + ] + }), + !e.diff && + n === 'actual' && + m.jsx(pt, { + image: c, + title: 'Actual', + canvasWidth: d, + canvasHeight: w, + scale: u + }), + !e.diff && + n === 'expected' && + m.jsx(pt, { + image: i, + title: 'Expected', + canvasWidth: d, + canvasHeight: w, + scale: u + }), + !e.diff && + n === 'sxs' && + m.jsxs('div', { + style: { display: 'flex' }, + children: [ + m.jsx(pt, { + image: i, + title: 'Expected', + canvasWidth: f * g, + canvasHeight: f * v, + scale: f + }), + m.jsx(pt, { + image: c, + title: 'Actual', + canvasWidth: f * g, + canvasHeight: f * v, + scale: f + }) + ] + }) + ] + }), + m.jsxs('div', { + style: { alignSelf: 'start', lineHeight: '18px', marginLeft: '15px' }, + children: [ + m.jsx('div', { + children: + e.diff && + m.jsx('a', { + target: '_blank', + href: e.diff.attachment.path, + rel: 'noreferrer', + children: e.diff.attachment.name + }) + }), + m.jsx('div', { + children: m.jsx('a', { + target: t ? '' : '_blank', + href: e.actual.attachment.path, + rel: 'noreferrer', + children: e.actual.attachment.name + }) + }), + m.jsx('div', { + children: m.jsx('a', { + target: t ? '' : '_blank', + href: e.expected.attachment.path, + rel: 'noreferrer', + children: e.expected.attachment.name + }) + }) + ] + }) + ] + }) + }) + }, + vv = ({ expectedImage: e, actualImage: t, canvasWidth: n, canvasHeight: r, scale: o }) => { + const s = { position: 'absolute', top: 0, left: 0 }, + [i, l] = U.useState(n / 2), + c = e.naturalWidth === t.naturalWidth && e.naturalHeight === t.naturalHeight + return m.jsxs('div', { + style: { + flex: 'none', + display: 'flex', + alignItems: 'center', + flexDirection: 'column', + userSelect: 'none' + }, + children: [ + m.jsxs('div', { + style: { margin: 5 }, + children: [ + !c && + m.jsx('span', { + style: { flex: 'none', margin: '0 5px' }, + children: 'Expected ' + }), + m.jsx('span', { children: e.naturalWidth }), + m.jsx('span', { style: { flex: 'none', margin: '0 5px' }, children: 'x' }), + m.jsx('span', { children: e.naturalHeight }), + !c && + m.jsx('span', { + style: { flex: 'none', margin: '0 5px 0 15px' }, + children: 'Actual ' + }), + !c && m.jsx('span', { children: t.naturalWidth }), + !c && m.jsx('span', { style: { flex: 'none', margin: '0 5px' }, children: 'x' }), + !c && m.jsx('span', { children: t.naturalHeight }) + ] + }), + m.jsxs('div', { + style: { position: 'relative', width: n, height: r, margin: 15, ...Ll }, + children: [ + m.jsx(gv, { + orientation: 'horizontal', + offsets: [i], + setOffsets: (a) => l(a[0]), + resizerColor: '#57606a80', + resizerWidth: 6 + }), + m.jsx('img', { + alt: 'Expected', + style: { width: e.naturalWidth * o, height: e.naturalHeight * o }, + draggable: 'false', + src: e.src + }), + m.jsx('div', { + style: { ...s, bottom: 0, overflow: 'hidden', width: i, ...Ll }, + children: m.jsx('img', { + alt: 'Actual', + style: { width: t.naturalWidth * o, height: t.naturalHeight * o }, + draggable: 'false', + src: t.src + }) + }) + ] + }) + ] + }) + }, + pt = ({ + image: e, + title: t, + alt: n, + canvasWidth: r, + canvasHeight: o, + scale: s, + onClick: i + }) => + m.jsxs('div', { + style: { flex: 'none', display: 'flex', alignItems: 'center', flexDirection: 'column' }, + children: [ + m.jsxs('div', { + style: { margin: 5 }, + children: [ + t && m.jsx('span', { style: { flex: 'none', margin: '0 5px' }, children: t }), + m.jsx('span', { children: e.naturalWidth }), + m.jsx('span', { style: { flex: 'none', margin: '0 5px' }, children: 'x' }), + m.jsx('span', { children: e.naturalHeight }) + ] + }), + m.jsx('div', { + style: { display: 'flex', flex: 'none', width: r, height: o, margin: 15, ...Ll }, + children: m.jsx('img', { + width: e.naturalWidth * s, + height: e.naturalHeight * s, + alt: t || n, + style: { cursor: i ? 'pointer' : 'initial' }, + draggable: 'false', + src: e.src, + onClick: i + }) + }) + ] + }) + var Up = {}, + Et = {} + const yv = 'Á', + wv = 'á', + Av = 'Ă', + xv = 'ă', + Ev = '∾', + Sv = '∿', + Cv = '∾̳', + kv = 'Â', + Dv = 'â', + bv = '´', + Rv = 'А', + Tv = 'а', + Iv = 'Æ', + Nv = 'æ', + Lv = '⁡', + Ov = '𝔄', + jv = '𝔞', + Pv = 'À', + Mv = 'à', + Hv = 'ℵ', + Bv = 'ℵ', + Fv = 'Α', + Uv = 'α', + qv = 'Ā', + Qv = 'ā', + Vv = '⨿', + Wv = '&', + Yv = '&', + Gv = '⩕', + zv = '⩓', + Xv = '∧', + Kv = '⩜', + Zv = '⩘', + Jv = '⩚', + _v = '∠', + $v = '⦤', + ey = '∠', + ty = '⦨', + ny = '⦩', + ry = '⦪', + oy = '⦫', + sy = '⦬', + iy = '⦭', + ly = '⦮', + cy = '⦯', + ay = '∡', + uy = '∟', + fy = '⊾', + dy = '⦝', + py = '∢', + hy = 'Å', + gy = '⍼', + my = 'Ą', + vy = 'ą', + yy = '𝔸', + wy = '𝕒', + Ay = '⩯', + xy = '≈', + Ey = '⩰', + Sy = '≊', + Cy = '≋', + ky = "'", + Dy = '⁡', + by = '≈', + Ry = '≊', + Ty = 'Å', + Iy = 'å', + Ny = '𝒜', + Ly = '𝒶', + Oy = '≔', + jy = '*', + Py = '≈', + My = '≍', + Hy = 'Ã', + By = 'ã', + Fy = 'Ä', + Uy = 'ä', + qy = '∳', + Qy = '⨑', + Vy = '≌', + Wy = '϶', + Yy = '‵', + Gy = '∽', + zy = '⋍', + Xy = '∖', + Ky = '⫧', + Zy = '⊽', + Jy = '⌅', + _y = '⌆', + $y = '⌅', + ew = '⎵', + tw = '⎶', + nw = '≌', + rw = 'Б', + ow = 'б', + sw = '„', + iw = '∵', + lw = '∵', + cw = '∵', + aw = '⦰', + uw = '϶', + fw = 'ℬ', + dw = 'ℬ', + pw = 'Β', + hw = 'β', + gw = 'ℶ', + mw = '≬', + vw = '𝔅', + yw = '𝔟', + ww = '⋂', + Aw = '◯', + xw = '⋃', + Ew = '⨀', + Sw = '⨁', + Cw = '⨂', + kw = '⨆', + Dw = '★', + bw = '▽', + Rw = '△', + Tw = '⨄', + Iw = '⋁', + Nw = '⋀', + Lw = '⤍', + Ow = '⧫', + jw = '▪', + Pw = '▴', + Mw = '▾', + Hw = '◂', + Bw = '▸', + Fw = '␣', + Uw = '▒', + qw = '░', + Qw = '▓', + Vw = '█', + Ww = '=⃥', + Yw = '≡⃥', + Gw = '⫭', + zw = '⌐', + Xw = '𝔹', + Kw = '𝕓', + Zw = '⊥', + Jw = '⊥', + _w = '⋈', + $w = '⧉', + eA = '┐', + tA = '╕', + nA = '╖', + rA = '╗', + oA = '┌', + sA = '╒', + iA = '╓', + lA = '╔', + cA = '─', + aA = '═', + uA = '┬', + fA = '╤', + dA = '╥', + pA = '╦', + hA = '┴', + gA = '╧', + mA = '╨', + vA = '╩', + yA = '⊟', + wA = '⊞', + AA = '⊠', + xA = '┘', + EA = '╛', + SA = '╜', + CA = '╝', + kA = '└', + DA = '╘', + bA = '╙', + RA = '╚', + TA = '│', + IA = '║', + NA = '┼', + LA = '╪', + OA = '╫', + jA = '╬', + PA = '┤', + MA = '╡', + HA = '╢', + BA = '╣', + FA = '├', + UA = '╞', + qA = '╟', + QA = '╠', + VA = '‵', + WA = '˘', + YA = '˘', + GA = '¦', + zA = '𝒷', + XA = 'ℬ', + KA = '⁏', + ZA = '∽', + JA = '⋍', + _A = '⧅', + $A = '\\', + ex = '⟈', + tx = '•', + nx = '•', + rx = '≎', + ox = '⪮', + sx = '≏', + ix = '≎', + lx = '≏', + cx = 'Ć', + ax = 'ć', + ux = '⩄', + fx = '⩉', + dx = '⩋', + px = '∩', + hx = '⋒', + gx = '⩇', + mx = '⩀', + vx = 'ⅅ', + yx = '∩︀', + wx = '⁁', + Ax = 'ˇ', + xx = 'ℭ', + Ex = '⩍', + Sx = 'Č', + Cx = 'č', + kx = 'Ç', + Dx = 'ç', + bx = 'Ĉ', + Rx = 'ĉ', + Tx = '∰', + Ix = '⩌', + Nx = '⩐', + Lx = 'Ċ', + Ox = 'ċ', + jx = '¸', + Px = '¸', + Mx = '⦲', + Hx = '¢', + Bx = '·', + Fx = '·', + Ux = '𝔠', + qx = 'ℭ', + Qx = 'Ч', + Vx = 'ч', + Wx = '✓', + Yx = '✓', + Gx = 'Χ', + zx = 'χ', + Xx = 'ˆ', + Kx = '≗', + Zx = '↺', + Jx = '↻', + _x = '⊛', + $x = '⊚', + e5 = '⊝', + t5 = '⊙', + n5 = '®', + r5 = 'Ⓢ', + o5 = '⊖', + s5 = '⊕', + i5 = '⊗', + l5 = '○', + c5 = '⧃', + a5 = '≗', + u5 = '⨐', + f5 = '⫯', + d5 = '⧂', + p5 = '∲', + h5 = '”', + g5 = '’', + m5 = '♣', + v5 = '♣', + y5 = ':', + w5 = '∷', + A5 = '⩴', + x5 = '≔', + E5 = '≔', + S5 = ',', + C5 = '@', + k5 = '∁', + D5 = '∘', + b5 = '∁', + R5 = 'ℂ', + T5 = '≅', + I5 = '⩭', + N5 = '≡', + L5 = '∮', + O5 = '∯', + j5 = '∮', + P5 = '𝕔', + M5 = 'ℂ', + H5 = '∐', + B5 = '∐', + F5 = '©', + U5 = '©', + q5 = '℗', + Q5 = '∳', + V5 = '↵', + W5 = '✗', + Y5 = '⨯', + G5 = '𝒞', + z5 = '𝒸', + X5 = '⫏', + K5 = '⫑', + Z5 = '⫐', + J5 = '⫒', + _5 = '⋯', + $5 = '⤸', + e8 = '⤵', + t8 = '⋞', + n8 = '⋟', + r8 = '↶', + o8 = '⤽', + s8 = '⩈', + i8 = '⩆', + l8 = '≍', + c8 = '∪', + a8 = '⋓', + u8 = '⩊', + f8 = '⊍', + d8 = '⩅', + p8 = '∪︀', + h8 = '↷', + g8 = '⤼', + m8 = '⋞', + v8 = '⋟', + y8 = '⋎', + w8 = '⋏', + A8 = '¤', + x8 = '↶', + E8 = '↷', + S8 = '⋎', + C8 = '⋏', + k8 = '∲', + D8 = '∱', + b8 = '⌭', + R8 = '†', + T8 = '‡', + I8 = 'ℸ', + N8 = '↓', + L8 = '↡', + O8 = '⇓', + j8 = '‐', + P8 = '⫤', + M8 = '⊣', + H8 = '⤏', + B8 = '˝', + F8 = 'Ď', + U8 = 'ď', + q8 = 'Д', + Q8 = 'д', + V8 = '‡', + W8 = '⇊', + Y8 = 'ⅅ', + G8 = 'ⅆ', + z8 = '⤑', + X8 = '⩷', + K8 = '°', + Z8 = '∇', + J8 = 'Δ', + _8 = 'δ', + $8 = '⦱', + eE = '⥿', + tE = '𝔇', + nE = '𝔡', + rE = '⥥', + oE = '⇃', + sE = '⇂', + iE = '´', + lE = '˙', + cE = '˝', + aE = '`', + uE = '˜', + fE = '⋄', + dE = '⋄', + pE = '⋄', + hE = '♦', + gE = '♦', + mE = '¨', + vE = 'ⅆ', + yE = 'ϝ', + wE = '⋲', + AE = '÷', + xE = '÷', + EE = '⋇', + SE = '⋇', + CE = 'Ђ', + kE = 'ђ', + DE = '⌞', + bE = '⌍', + RE = '$', + TE = '𝔻', + IE = '𝕕', + NE = '¨', + LE = '˙', + OE = '⃜', + jE = '≐', + PE = '≑', + ME = '≐', + HE = '∸', + BE = '∔', + FE = '⊡', + UE = '⌆', + qE = '∯', + QE = '¨', + VE = '⇓', + WE = '⇐', + YE = '⇔', + GE = '⫤', + zE = '⟸', + XE = '⟺', + KE = '⟹', + ZE = '⇒', + JE = '⊨', + _E = '⇑', + $E = '⇕', + e3 = '∥', + t3 = '⤓', + n3 = '↓', + r3 = '↓', + o3 = '⇓', + s3 = '⇵', + i3 = '̑', + l3 = '⇊', + c3 = '⇃', + a3 = '⇂', + u3 = '⥐', + f3 = '⥞', + d3 = '⥖', + p3 = '↽', + h3 = '⥟', + g3 = '⥗', + m3 = '⇁', + v3 = '↧', + y3 = '⊤', + w3 = '⤐', + A3 = '⌟', + x3 = '⌌', + E3 = '𝒟', + S3 = '𝒹', + C3 = 'Ѕ', + k3 = 'ѕ', + D3 = '⧶', + b3 = 'Đ', + R3 = 'đ', + T3 = '⋱', + I3 = '▿', + N3 = '▾', + L3 = '⇵', + O3 = '⥯', + j3 = '⦦', + P3 = 'Џ', + M3 = 'џ', + H3 = '⟿', + B3 = 'É', + F3 = 'é', + U3 = '⩮', + q3 = 'Ě', + Q3 = 'ě', + V3 = 'Ê', + W3 = 'ê', + Y3 = '≖', + G3 = '≕', + z3 = 'Э', + X3 = 'э', + K3 = '⩷', + Z3 = 'Ė', + J3 = 'ė', + _3 = '≑', + $3 = 'ⅇ', + e4 = '≒', + t4 = '𝔈', + n4 = '𝔢', + r4 = '⪚', + o4 = 'È', + s4 = 'è', + i4 = '⪖', + l4 = '⪘', + c4 = '⪙', + a4 = '∈', + u4 = '⏧', + f4 = 'ℓ', + d4 = '⪕', + p4 = '⪗', + h4 = 'Ē', + g4 = 'ē', + m4 = '∅', + v4 = '∅', + y4 = '◻', + w4 = '∅', + A4 = '▫', + x4 = ' ', + E4 = ' ', + S4 = ' ', + C4 = 'Ŋ', + k4 = 'ŋ', + D4 = ' ', + b4 = 'Ę', + R4 = 'ę', + T4 = '𝔼', + I4 = '𝕖', + N4 = '⋕', + L4 = '⧣', + O4 = '⩱', + j4 = 'ε', + P4 = 'Ε', + M4 = 'ε', + H4 = 'ϵ', + B4 = '≖', + F4 = '≕', + U4 = '≂', + q4 = '⪖', + Q4 = '⪕', + V4 = '⩵', + W4 = '=', + Y4 = '≂', + G4 = '≟', + z4 = '⇌', + X4 = '≡', + K4 = '⩸', + Z4 = '⧥', + J4 = '⥱', + _4 = '≓', + $4 = 'ℯ', + e7 = 'ℰ', + t7 = '≐', + n7 = '⩳', + r7 = '≂', + o7 = 'Η', + s7 = 'η', + i7 = 'Ð', + l7 = 'ð', + c7 = 'Ë', + a7 = 'ë', + u7 = '€', + f7 = '!', + d7 = '∃', + p7 = '∃', + h7 = 'ℰ', + g7 = 'ⅇ', + m7 = 'ⅇ', + v7 = '≒', + y7 = 'Ф', + w7 = 'ф', + A7 = '♀', + x7 = 'ffi', + E7 = 'ff', + S7 = 'ffl', + C7 = '𝔉', + k7 = '𝔣', + D7 = 'fi', + b7 = '◼', + R7 = '▪', + T7 = 'fj', + I7 = '♭', + N7 = 'fl', + L7 = '▱', + O7 = 'ƒ', + j7 = '𝔽', + P7 = '𝕗', + M7 = '∀', + H7 = '∀', + B7 = '⋔', + F7 = '⫙', + U7 = 'ℱ', + q7 = '⨍', + Q7 = '½', + V7 = '⅓', + W7 = '¼', + Y7 = '⅕', + G7 = '⅙', + z7 = '⅛', + X7 = '⅔', + K7 = '⅖', + Z7 = '¾', + J7 = '⅗', + _7 = '⅜', + $7 = '⅘', + e6 = '⅚', + t6 = '⅝', + n6 = '⅞', + r6 = '⁄', + o6 = '⌢', + s6 = '𝒻', + i6 = 'ℱ', + l6 = 'ǵ', + c6 = 'Γ', + a6 = 'γ', + u6 = 'Ϝ', + f6 = 'ϝ', + d6 = '⪆', + p6 = 'Ğ', + h6 = 'ğ', + g6 = 'Ģ', + m6 = 'Ĝ', + v6 = 'ĝ', + y6 = 'Г', + w6 = 'г', + A6 = 'Ġ', + x6 = 'ġ', + E6 = '≥', + S6 = '≧', + C6 = '⪌', + k6 = '⋛', + D6 = '≥', + b6 = '≧', + R6 = '⩾', + T6 = '⪩', + I6 = '⩾', + N6 = '⪀', + L6 = '⪂', + O6 = '⪄', + j6 = '⋛︀', + P6 = '⪔', + M6 = '𝔊', + H6 = '𝔤', + B6 = '≫', + F6 = '⋙', + U6 = '⋙', + q6 = 'ℷ', + Q6 = 'Ѓ', + V6 = 'ѓ', + W6 = '⪥', + Y6 = '≷', + G6 = '⪒', + z6 = '⪤', + X6 = '⪊', + K6 = '⪊', + Z6 = '⪈', + J6 = '≩', + _6 = '⪈', + $6 = '≩', + eS = '⋧', + tS = '𝔾', + nS = '𝕘', + rS = '`', + oS = '≥', + sS = '⋛', + iS = '≧', + lS = '⪢', + cS = '≷', + aS = '⩾', + uS = '≳', + fS = '𝒢', + dS = 'ℊ', + pS = '≳', + hS = '⪎', + gS = '⪐', + mS = '⪧', + vS = '⩺', + yS = '>', + wS = '>', + AS = '≫', + xS = '⋗', + ES = '⦕', + SS = '⩼', + CS = '⪆', + kS = '⥸', + DS = '⋗', + bS = '⋛', + RS = '⪌', + TS = '≷', + IS = '≳', + NS = '≩︀', + LS = '≩︀', + OS = 'ˇ', + jS = ' ', + PS = '½', + MS = 'ℋ', + HS = 'Ъ', + BS = 'ъ', + FS = '⥈', + US = '↔', + qS = '⇔', + QS = '↭', + VS = '^', + WS = 'ℏ', + YS = 'Ĥ', + GS = 'ĥ', + zS = '♥', + XS = '♥', + KS = '…', + ZS = '⊹', + JS = '𝔥', + _S = 'ℌ', + $S = 'ℋ', + eC = '⤥', + tC = '⤦', + nC = '⇿', + rC = '∻', + oC = '↩', + sC = '↪', + iC = '𝕙', + lC = 'ℍ', + cC = '―', + aC = '─', + uC = '𝒽', + fC = 'ℋ', + dC = 'ℏ', + pC = 'Ħ', + hC = 'ħ', + gC = '≎', + mC = '≏', + vC = '⁃', + yC = '‐', + wC = 'Í', + AC = 'í', + xC = '⁣', + EC = 'Î', + SC = 'î', + CC = 'И', + kC = 'и', + DC = 'İ', + bC = 'Е', + RC = 'е', + TC = '¡', + IC = '⇔', + NC = '𝔦', + LC = 'ℑ', + OC = 'Ì', + jC = 'ì', + PC = 'ⅈ', + MC = '⨌', + HC = '∭', + BC = '⧜', + FC = '℩', + UC = 'IJ', + qC = 'ij', + QC = 'Ī', + VC = 'ī', + WC = 'ℑ', + YC = 'ⅈ', + GC = 'ℐ', + zC = 'ℑ', + XC = 'ı', + KC = 'ℑ', + ZC = '⊷', + JC = 'Ƶ', + _C = '⇒', + $C = '℅', + ek = '∞', + tk = '⧝', + nk = 'ı', + rk = '⊺', + ok = '∫', + sk = '∬', + ik = 'ℤ', + lk = '∫', + ck = '⊺', + ak = '⋂', + uk = '⨗', + fk = '⨼', + dk = '⁣', + pk = '⁢', + hk = 'Ё', + gk = 'ё', + mk = 'Į', + vk = 'į', + yk = '𝕀', + wk = '𝕚', + Ak = 'Ι', + xk = 'ι', + Ek = '⨼', + Sk = '¿', + Ck = '𝒾', + kk = 'ℐ', + Dk = '∈', + bk = '⋵', + Rk = '⋹', + Tk = '⋴', + Ik = '⋳', + Nk = '∈', + Lk = '⁢', + Ok = 'Ĩ', + jk = 'ĩ', + Pk = 'І', + Mk = 'і', + Hk = 'Ï', + Bk = 'ï', + Fk = 'Ĵ', + Uk = 'ĵ', + qk = 'Й', + Qk = 'й', + Vk = '𝔍', + Wk = '𝔧', + Yk = 'ȷ', + Gk = '𝕁', + zk = '𝕛', + Xk = '𝒥', + Kk = '𝒿', + Zk = 'Ј', + Jk = 'ј', + _k = 'Є', + $k = 'є', + e9 = 'Κ', + t9 = 'κ', + n9 = 'ϰ', + r9 = 'Ķ', + o9 = 'ķ', + s9 = 'К', + i9 = 'к', + l9 = '𝔎', + c9 = '𝔨', + a9 = 'ĸ', + u9 = 'Х', + f9 = 'х', + d9 = 'Ќ', + p9 = 'ќ', + h9 = '𝕂', + g9 = '𝕜', + m9 = '𝒦', + v9 = '𝓀', + y9 = '⇚', + w9 = 'Ĺ', + A9 = 'ĺ', + x9 = '⦴', + E9 = 'ℒ', + S9 = 'Λ', + C9 = 'λ', + k9 = '⟨', + D9 = '⟪', + b9 = '⦑', + R9 = '⟨', + T9 = '⪅', + I9 = 'ℒ', + N9 = '«', + L9 = '⇤', + O9 = '⤟', + j9 = '←', + P9 = '↞', + M9 = '⇐', + H9 = '⤝', + B9 = '↩', + F9 = '↫', + U9 = '⤹', + q9 = '⥳', + Q9 = '↢', + V9 = '⤙', + W9 = '⤛', + Y9 = '⪫', + G9 = '⪭', + z9 = '⪭︀', + X9 = '⤌', + K9 = '⤎', + Z9 = '❲', + J9 = '{', + _9 = '[', + $9 = '⦋', + eD = '⦏', + tD = '⦍', + nD = 'Ľ', + rD = 'ľ', + oD = 'Ļ', + sD = 'ļ', + iD = '⌈', + lD = '{', + cD = 'Л', + aD = 'л', + uD = '⤶', + fD = '“', + dD = '„', + pD = '⥧', + hD = '⥋', + gD = '↲', + mD = '≤', + vD = '≦', + yD = '⟨', + wD = '⇤', + AD = '←', + xD = '←', + ED = '⇐', + SD = '⇆', + CD = '↢', + kD = '⌈', + DD = '⟦', + bD = '⥡', + RD = '⥙', + TD = '⇃', + ID = '⌊', + ND = '↽', + LD = '↼', + OD = '⇇', + jD = '↔', + PD = '↔', + MD = '⇔', + HD = '⇆', + BD = '⇋', + FD = '↭', + UD = '⥎', + qD = '↤', + QD = '⊣', + VD = '⥚', + WD = '⋋', + YD = '⧏', + GD = '⊲', + zD = '⊴', + XD = '⥑', + KD = '⥠', + ZD = '⥘', + JD = '↿', + _D = '⥒', + $D = '↼', + eb = '⪋', + tb = '⋚', + nb = '≤', + rb = '≦', + ob = '⩽', + sb = '⪨', + ib = '⩽', + lb = '⩿', + cb = '⪁', + ab = '⪃', + ub = '⋚︀', + fb = '⪓', + db = '⪅', + pb = '⋖', + hb = '⋚', + gb = '⪋', + mb = '⋚', + vb = '≦', + yb = '≶', + wb = '≶', + Ab = '⪡', + xb = '≲', + Eb = '⩽', + Sb = '≲', + Cb = '⥼', + kb = '⌊', + Db = '𝔏', + bb = '𝔩', + Rb = '≶', + Tb = '⪑', + Ib = '⥢', + Nb = '↽', + Lb = '↼', + Ob = '⥪', + jb = '▄', + Pb = 'Љ', + Mb = 'љ', + Hb = '⇇', + Bb = '≪', + Fb = '⋘', + Ub = '⌞', + qb = '⇚', + Qb = '⥫', + Vb = '◺', + Wb = 'Ŀ', + Yb = 'ŀ', + Gb = '⎰', + zb = '⎰', + Xb = '⪉', + Kb = '⪉', + Zb = '⪇', + Jb = '≨', + _b = '⪇', + $b = '≨', + eR = '⋦', + tR = '⟬', + nR = '⇽', + rR = '⟦', + oR = '⟵', + sR = '⟵', + iR = '⟸', + lR = '⟷', + cR = '⟷', + aR = '⟺', + uR = '⟼', + fR = '⟶', + dR = '⟶', + pR = '⟹', + hR = '↫', + gR = '↬', + mR = '⦅', + vR = '𝕃', + yR = '𝕝', + wR = '⨭', + AR = '⨴', + xR = '∗', + ER = '_', + SR = '↙', + CR = '↘', + kR = '◊', + DR = '◊', + bR = '⧫', + RR = '(', + TR = '⦓', + IR = '⇆', + NR = '⌟', + LR = '⇋', + OR = '⥭', + jR = '‎', + PR = '⊿', + MR = '‹', + HR = '𝓁', + BR = 'ℒ', + FR = '↰', + UR = '↰', + qR = '≲', + QR = '⪍', + VR = '⪏', + WR = '[', + YR = '‘', + GR = '‚', + zR = 'Ł', + XR = 'ł', + KR = '⪦', + ZR = '⩹', + JR = '<', + _R = '<', + $R = '≪', + eT = '⋖', + tT = '⋋', + nT = '⋉', + rT = '⥶', + oT = '⩻', + sT = '◃', + iT = '⊴', + lT = '◂', + cT = '⦖', + aT = '⥊', + uT = '⥦', + fT = '≨︀', + dT = '≨︀', + pT = '¯', + hT = '♂', + gT = '✠', + mT = '✠', + vT = '↦', + yT = '↦', + wT = '↧', + AT = '↤', + xT = '↥', + ET = '▮', + ST = '⨩', + CT = 'М', + kT = 'м', + DT = '—', + bT = '∺', + RT = '∡', + TT = ' ', + IT = 'ℳ', + NT = '𝔐', + LT = '𝔪', + OT = '℧', + jT = 'µ', + PT = '*', + MT = '⫰', + HT = '∣', + BT = '·', + FT = '⊟', + UT = '−', + qT = '∸', + QT = '⨪', + VT = '∓', + WT = '⫛', + YT = '…', + GT = '∓', + zT = '⊧', + XT = '𝕄', + KT = '𝕞', + ZT = '∓', + JT = '𝓂', + _T = 'ℳ', + $T = '∾', + eI = 'Μ', + tI = 'μ', + nI = '⊸', + rI = '⊸', + oI = '∇', + sI = 'Ń', + iI = 'ń', + lI = '∠⃒', + cI = '≉', + aI = '⩰̸', + uI = '≋̸', + fI = 'ʼn', + dI = '≉', + pI = '♮', + hI = 'ℕ', + gI = '♮', + mI = ' ', + vI = '≎̸', + yI = '≏̸', + wI = '⩃', + AI = 'Ň', + xI = 'ň', + EI = 'Ņ', + SI = 'ņ', + CI = '≇', + kI = '⩭̸', + DI = '⩂', + bI = 'Н', + RI = 'н', + TI = '–', + II = '⤤', + NI = '↗', + LI = '⇗', + OI = '↗', + jI = '≠', + PI = '≐̸', + MI = '​', + HI = '​', + BI = '​', + FI = '​', + UI = '≢', + qI = '⤨', + QI = '≂̸', + VI = '≫', + WI = '≪', + YI = ` +`, + GI = '∄', + zI = '∄', + XI = '𝔑', + KI = '𝔫', + ZI = '≧̸', + JI = '≱', + _I = '≱', + $I = '≧̸', + eN = '⩾̸', + tN = '⩾̸', + nN = '⋙̸', + rN = '≵', + oN = '≫⃒', + sN = '≯', + iN = '≯', + lN = '≫̸', + cN = '↮', + aN = '⇎', + uN = '⫲', + fN = '∋', + dN = '⋼', + pN = '⋺', + hN = '∋', + gN = 'Њ', + mN = 'њ', + vN = '↚', + yN = '⇍', + wN = '‥', + AN = '≦̸', + xN = '≰', + EN = '↚', + SN = '⇍', + CN = '↮', + kN = '⇎', + DN = '≰', + bN = '≦̸', + RN = '⩽̸', + TN = '⩽̸', + IN = '≮', + NN = '⋘̸', + LN = '≴', + ON = '≪⃒', + jN = '≮', + PN = '⋪', + MN = '⋬', + HN = '≪̸', + BN = '∤', + FN = '⁠', + UN = ' ', + qN = '𝕟', + QN = 'ℕ', + VN = '⫬', + WN = '¬', + YN = '≢', + GN = '≭', + zN = '∦', + XN = '∉', + KN = '≠', + ZN = '≂̸', + JN = '∄', + _N = '≯', + $N = '≱', + eL = '≧̸', + tL = '≫̸', + nL = '≹', + rL = '⩾̸', + oL = '≵', + sL = '≎̸', + iL = '≏̸', + lL = '∉', + cL = '⋵̸', + aL = '⋹̸', + uL = '∉', + fL = '⋷', + dL = '⋶', + pL = '⧏̸', + hL = '⋪', + gL = '⋬', + mL = '≮', + vL = '≰', + yL = '≸', + wL = '≪̸', + AL = '⩽̸', + xL = '≴', + EL = '⪢̸', + SL = '⪡̸', + CL = '∌', + kL = '∌', + DL = '⋾', + bL = '⋽', + RL = '⊀', + TL = '⪯̸', + IL = '⋠', + NL = '∌', + LL = '⧐̸', + OL = '⋫', + jL = '⋭', + PL = '⊏̸', + ML = '⋢', + HL = '⊐̸', + BL = '⋣', + FL = '⊂⃒', + UL = '⊈', + qL = '⊁', + QL = '⪰̸', + VL = '⋡', + WL = '≿̸', + YL = '⊃⃒', + GL = '⊉', + zL = '≁', + XL = '≄', + KL = '≇', + ZL = '≉', + JL = '∤', + _L = '∦', + $L = '∦', + eO = '⫽⃥', + tO = '∂̸', + nO = '⨔', + rO = '⊀', + oO = '⋠', + sO = '⊀', + iO = '⪯̸', + lO = '⪯̸', + cO = '⤳̸', + aO = '↛', + uO = '⇏', + fO = '↝̸', + dO = '↛', + pO = '⇏', + hO = '⋫', + gO = '⋭', + mO = '⊁', + vO = '⋡', + yO = '⪰̸', + wO = '𝒩', + AO = '𝓃', + xO = '∤', + EO = '∦', + SO = '≁', + CO = '≄', + kO = '≄', + DO = '∤', + bO = '∦', + RO = '⋢', + TO = '⋣', + IO = '⊄', + NO = '⫅̸', + LO = '⊈', + OO = '⊂⃒', + jO = '⊈', + PO = '⫅̸', + MO = '⊁', + HO = '⪰̸', + BO = '⊅', + FO = '⫆̸', + UO = '⊉', + qO = '⊃⃒', + QO = '⊉', + VO = '⫆̸', + WO = '≹', + YO = 'Ñ', + GO = 'ñ', + zO = '≸', + XO = '⋪', + KO = '⋬', + ZO = '⋫', + JO = '⋭', + _O = 'Ν', + $O = 'ν', + ej = '#', + tj = '№', + nj = ' ', + rj = '≍⃒', + oj = '⊬', + sj = '⊭', + ij = '⊮', + lj = '⊯', + cj = '≥⃒', + aj = '>⃒', + uj = '⤄', + fj = '⧞', + dj = '⤂', + pj = '≤⃒', + hj = '<⃒', + gj = '⊴⃒', + mj = '⤃', + vj = '⊵⃒', + yj = '∼⃒', + wj = '⤣', + Aj = '↖', + xj = '⇖', + Ej = '↖', + Sj = '⤧', + Cj = 'Ó', + kj = 'ó', + Dj = '⊛', + bj = 'Ô', + Rj = 'ô', + Tj = '⊚', + Ij = 'О', + Nj = 'о', + Lj = '⊝', + Oj = 'Ő', + jj = 'ő', + Pj = '⨸', + Mj = '⊙', + Hj = '⦼', + Bj = 'Œ', + Fj = 'œ', + Uj = '⦿', + qj = '𝔒', + Qj = '𝔬', + Vj = '˛', + Wj = 'Ò', + Yj = 'ò', + Gj = '⧁', + zj = '⦵', + Xj = 'Ω', + Kj = '∮', + Zj = '↺', + Jj = '⦾', + _j = '⦻', + $j = '‾', + eP = '⧀', + tP = 'Ō', + nP = 'ō', + rP = 'Ω', + oP = 'ω', + sP = 'Ο', + iP = 'ο', + lP = '⦶', + cP = '⊖', + aP = '𝕆', + uP = '𝕠', + fP = '⦷', + dP = '“', + pP = '‘', + hP = '⦹', + gP = '⊕', + mP = '↻', + vP = '⩔', + yP = '∨', + wP = '⩝', + AP = 'ℴ', + xP = 'ℴ', + EP = 'ª', + SP = 'º', + CP = '⊶', + kP = '⩖', + DP = '⩗', + bP = '⩛', + RP = 'Ⓢ', + TP = '𝒪', + IP = 'ℴ', + NP = 'Ø', + LP = 'ø', + OP = '⊘', + jP = 'Õ', + PP = 'õ', + MP = '⨶', + HP = '⨷', + BP = '⊗', + FP = 'Ö', + UP = 'ö', + qP = '⌽', + QP = '‾', + VP = '⏞', + WP = '⎴', + YP = '⏜', + GP = '¶', + zP = '∥', + XP = '∥', + KP = '⫳', + ZP = '⫽', + JP = '∂', + _P = '∂', + $P = 'П', + eM = 'п', + tM = '%', + nM = '.', + rM = '‰', + oM = '⊥', + sM = '‱', + iM = '𝔓', + lM = '𝔭', + cM = 'Φ', + aM = 'φ', + uM = 'ϕ', + fM = 'ℳ', + dM = '☎', + pM = 'Π', + hM = 'π', + gM = '⋔', + mM = 'ϖ', + vM = 'ℏ', + yM = 'ℎ', + wM = 'ℏ', + AM = '⨣', + xM = '⊞', + EM = '⨢', + SM = '+', + CM = '∔', + kM = '⨥', + DM = '⩲', + bM = '±', + RM = '±', + TM = '⨦', + IM = '⨧', + NM = '±', + LM = 'ℌ', + OM = '⨕', + jM = '𝕡', + PM = 'ℙ', + MM = '£', + HM = '⪷', + BM = '⪻', + FM = '≺', + UM = '≼', + qM = '⪷', + QM = '≺', + VM = '≼', + WM = '≺', + YM = '⪯', + GM = '≼', + zM = '≾', + XM = '⪯', + KM = '⪹', + ZM = '⪵', + JM = '⋨', + _M = '⪯', + $M = '⪳', + eH = '≾', + tH = '′', + nH = '″', + rH = 'ℙ', + oH = '⪹', + sH = '⪵', + iH = '⋨', + lH = '∏', + cH = '∏', + aH = '⌮', + uH = '⌒', + fH = '⌓', + dH = '∝', + pH = '∝', + hH = '∷', + gH = '∝', + mH = '≾', + vH = '⊰', + yH = '𝒫', + wH = '𝓅', + AH = 'Ψ', + xH = 'ψ', + EH = ' ', + SH = '𝔔', + CH = '𝔮', + kH = '⨌', + DH = '𝕢', + bH = 'ℚ', + RH = '⁗', + TH = '𝒬', + IH = '𝓆', + NH = 'ℍ', + LH = '⨖', + OH = '?', + jH = '≟', + PH = '"', + MH = '"', + HH = '⇛', + BH = '∽̱', + FH = 'Ŕ', + UH = 'ŕ', + qH = '√', + QH = '⦳', + VH = '⟩', + WH = '⟫', + YH = '⦒', + GH = '⦥', + zH = '⟩', + XH = '»', + KH = '⥵', + ZH = '⇥', + JH = '⤠', + _H = '⤳', + $H = '→', + eB = '↠', + tB = '⇒', + nB = '⤞', + rB = '↪', + oB = '↬', + sB = '⥅', + iB = '⥴', + lB = '⤖', + cB = '↣', + aB = '↝', + uB = '⤚', + fB = '⤜', + dB = '∶', + pB = 'ℚ', + hB = '⤍', + gB = '⤏', + mB = '⤐', + vB = '❳', + yB = '}', + wB = ']', + AB = '⦌', + xB = '⦎', + EB = '⦐', + SB = 'Ř', + CB = 'ř', + kB = 'Ŗ', + DB = 'ŗ', + bB = '⌉', + RB = '}', + TB = 'Р', + IB = 'р', + NB = '⤷', + LB = '⥩', + OB = '”', + jB = '”', + PB = '↳', + MB = 'ℜ', + HB = 'ℛ', + BB = 'ℜ', + FB = 'ℝ', + UB = 'ℜ', + qB = '▭', + QB = '®', + VB = '®', + WB = '∋', + YB = '⇋', + GB = '⥯', + zB = '⥽', + XB = '⌋', + KB = '𝔯', + ZB = 'ℜ', + JB = '⥤', + _B = '⇁', + $B = '⇀', + eF = '⥬', + tF = 'Ρ', + nF = 'ρ', + rF = 'ϱ', + oF = '⟩', + sF = '⇥', + iF = '→', + lF = '→', + cF = '⇒', + aF = '⇄', + uF = '↣', + fF = '⌉', + dF = '⟧', + pF = '⥝', + hF = '⥕', + gF = '⇂', + mF = '⌋', + vF = '⇁', + yF = '⇀', + wF = '⇄', + AF = '⇌', + xF = '⇉', + EF = '↝', + SF = '↦', + CF = '⊢', + kF = '⥛', + DF = '⋌', + bF = '⧐', + RF = '⊳', + TF = '⊵', + IF = '⥏', + NF = '⥜', + LF = '⥔', + OF = '↾', + jF = '⥓', + PF = '⇀', + MF = '˚', + HF = '≓', + BF = '⇄', + FF = '⇌', + UF = '‏', + qF = '⎱', + QF = '⎱', + VF = '⫮', + WF = '⟭', + YF = '⇾', + GF = '⟧', + zF = '⦆', + XF = '𝕣', + KF = 'ℝ', + ZF = '⨮', + JF = '⨵', + _F = '⥰', + $F = ')', + eU = '⦔', + tU = '⨒', + nU = '⇉', + rU = '⇛', + oU = '›', + sU = '𝓇', + iU = 'ℛ', + lU = '↱', + cU = '↱', + aU = ']', + uU = '’', + fU = '’', + dU = '⋌', + pU = '⋊', + hU = '▹', + gU = '⊵', + mU = '▸', + vU = '⧎', + yU = '⧴', + wU = '⥨', + AU = '℞', + xU = 'Ś', + EU = 'ś', + SU = '‚', + CU = '⪸', + kU = 'Š', + DU = 'š', + bU = '⪼', + RU = '≻', + TU = '≽', + IU = '⪰', + NU = '⪴', + LU = 'Ş', + OU = 'ş', + jU = 'Ŝ', + PU = 'ŝ', + MU = '⪺', + HU = '⪶', + BU = '⋩', + FU = '⨓', + UU = '≿', + qU = 'С', + QU = 'с', + VU = '⊡', + WU = '⋅', + YU = '⩦', + GU = '⤥', + zU = '↘', + XU = '⇘', + KU = '↘', + ZU = '§', + JU = ';', + _U = '⤩', + $U = '∖', + eq = '∖', + tq = '✶', + nq = '𝔖', + rq = '𝔰', + oq = '⌢', + sq = '♯', + iq = 'Щ', + lq = 'щ', + cq = 'Ш', + aq = 'ш', + uq = '↓', + fq = '←', + dq = '∣', + pq = '∥', + hq = '→', + gq = '↑', + mq = '­', + vq = 'Σ', + yq = 'σ', + wq = 'ς', + Aq = 'ς', + xq = '∼', + Eq = '⩪', + Sq = '≃', + Cq = '≃', + kq = '⪞', + Dq = '⪠', + bq = '⪝', + Rq = '⪟', + Tq = '≆', + Iq = '⨤', + Nq = '⥲', + Lq = '←', + Oq = '∘', + jq = '∖', + Pq = '⨳', + Mq = '⧤', + Hq = '∣', + Bq = '⌣', + Fq = '⪪', + Uq = '⪬', + qq = '⪬︀', + Qq = 'Ь', + Vq = 'ь', + Wq = '⌿', + Yq = '⧄', + Gq = '/', + zq = '𝕊', + Xq = '𝕤', + Kq = '♠', + Zq = '♠', + Jq = '∥', + _q = '⊓', + $q = '⊓︀', + eQ = '⊔', + tQ = '⊔︀', + nQ = '√', + rQ = '⊏', + oQ = '⊑', + sQ = '⊏', + iQ = '⊑', + lQ = '⊐', + cQ = '⊒', + aQ = '⊐', + uQ = '⊒', + fQ = '□', + dQ = '□', + pQ = '⊓', + hQ = '⊏', + gQ = '⊑', + mQ = '⊐', + vQ = '⊒', + yQ = '⊔', + wQ = '▪', + AQ = '□', + xQ = '▪', + EQ = '→', + SQ = '𝒮', + CQ = '𝓈', + kQ = '∖', + DQ = '⌣', + bQ = '⋆', + RQ = '⋆', + TQ = '☆', + IQ = '★', + NQ = 'ϵ', + LQ = 'ϕ', + OQ = '¯', + jQ = '⊂', + PQ = '⋐', + MQ = '⪽', + HQ = '⫅', + BQ = '⊆', + FQ = '⫃', + UQ = '⫁', + qQ = '⫋', + QQ = '⊊', + VQ = '⪿', + WQ = '⥹', + YQ = '⊂', + GQ = '⋐', + zQ = '⊆', + XQ = '⫅', + KQ = '⊆', + ZQ = '⊊', + JQ = '⫋', + _Q = '⫇', + $Q = '⫕', + eV = '⫓', + tV = '⪸', + nV = '≻', + rV = '≽', + oV = '≻', + sV = '⪰', + iV = '≽', + lV = '≿', + cV = '⪰', + aV = '⪺', + uV = '⪶', + fV = '⋩', + dV = '≿', + pV = '∋', + hV = '∑', + gV = '∑', + mV = '♪', + vV = '¹', + yV = '²', + wV = '³', + AV = '⊃', + xV = '⋑', + EV = '⪾', + SV = '⫘', + CV = '⫆', + kV = '⊇', + DV = '⫄', + bV = '⊃', + RV = '⊇', + TV = '⟉', + IV = '⫗', + NV = '⥻', + LV = '⫂', + OV = '⫌', + jV = '⊋', + PV = '⫀', + MV = '⊃', + HV = '⋑', + BV = '⊇', + FV = '⫆', + UV = '⊋', + qV = '⫌', + QV = '⫈', + VV = '⫔', + WV = '⫖', + YV = '⤦', + GV = '↙', + zV = '⇙', + XV = '↙', + KV = '⤪', + ZV = 'ß', + JV = ' ', + _V = '⌖', + $V = 'Τ', + eW = 'τ', + tW = '⎴', + nW = 'Ť', + rW = 'ť', + oW = 'Ţ', + sW = 'ţ', + iW = 'Т', + lW = 'т', + cW = '⃛', + aW = '⌕', + uW = '𝔗', + fW = '𝔱', + dW = '∴', + pW = '∴', + hW = '∴', + gW = 'Θ', + mW = 'θ', + vW = 'ϑ', + yW = 'ϑ', + wW = '≈', + AW = '∼', + xW = '  ', + EW = ' ', + SW = ' ', + CW = '≈', + kW = '∼', + DW = 'Þ', + bW = 'þ', + RW = '˜', + TW = '∼', + IW = '≃', + NW = '≅', + LW = '≈', + OW = '⨱', + jW = '⊠', + PW = '×', + MW = '⨰', + HW = '∭', + BW = '⤨', + FW = '⌶', + UW = '⫱', + qW = '⊤', + QW = '𝕋', + VW = '𝕥', + WW = '⫚', + YW = '⤩', + GW = '‴', + zW = '™', + XW = '™', + KW = '▵', + ZW = '▿', + JW = '◃', + _W = '⊴', + $W = '≜', + eY = '▹', + tY = '⊵', + nY = '◬', + rY = '≜', + oY = '⨺', + sY = '⃛', + iY = '⨹', + lY = '⧍', + cY = '⨻', + aY = '⏢', + uY = '𝒯', + fY = '𝓉', + dY = 'Ц', + pY = 'ц', + hY = 'Ћ', + gY = 'ћ', + mY = 'Ŧ', + vY = 'ŧ', + yY = '≬', + wY = '↞', + AY = '↠', + xY = 'Ú', + EY = 'ú', + SY = '↑', + CY = '↟', + kY = '⇑', + DY = '⥉', + bY = 'Ў', + RY = 'ў', + TY = 'Ŭ', + IY = 'ŭ', + NY = 'Û', + LY = 'û', + OY = 'У', + jY = 'у', + PY = '⇅', + MY = 'Ű', + HY = 'ű', + BY = '⥮', + FY = '⥾', + UY = '𝔘', + qY = '𝔲', + QY = 'Ù', + VY = 'ù', + WY = '⥣', + YY = '↿', + GY = '↾', + zY = '▀', + XY = '⌜', + KY = '⌜', + ZY = '⌏', + JY = '◸', + _Y = 'Ū', + $Y = 'ū', + eG = '¨', + tG = '_', + nG = '⏟', + rG = '⎵', + oG = '⏝', + sG = '⋃', + iG = '⊎', + lG = 'Ų', + cG = 'ų', + aG = '𝕌', + uG = '𝕦', + fG = '⤒', + dG = '↑', + pG = '↑', + hG = '⇑', + gG = '⇅', + mG = '↕', + vG = '↕', + yG = '⇕', + wG = '⥮', + AG = '↿', + xG = '↾', + EG = '⊎', + SG = '↖', + CG = '↗', + kG = 'υ', + DG = 'ϒ', + bG = 'ϒ', + RG = 'Υ', + TG = 'υ', + IG = '↥', + NG = '⊥', + LG = '⇈', + OG = '⌝', + jG = '⌝', + PG = '⌎', + MG = 'Ů', + HG = 'ů', + BG = '◹', + FG = '𝒰', + UG = '𝓊', + qG = '⋰', + QG = 'Ũ', + VG = 'ũ', + WG = '▵', + YG = '▴', + GG = '⇈', + zG = 'Ü', + XG = 'ü', + KG = '⦧', + ZG = '⦜', + JG = 'ϵ', + _G = 'ϰ', + $G = '∅', + ez = 'ϕ', + tz = 'ϖ', + nz = '∝', + rz = '↕', + oz = '⇕', + sz = 'ϱ', + iz = 'ς', + lz = '⊊︀', + cz = '⫋︀', + az = '⊋︀', + uz = '⫌︀', + fz = 'ϑ', + dz = '⊲', + pz = '⊳', + hz = '⫨', + gz = '⫫', + mz = '⫩', + vz = 'В', + yz = 'в', + wz = '⊢', + Az = '⊨', + xz = '⊩', + Ez = '⊫', + Sz = '⫦', + Cz = '⊻', + kz = '∨', + Dz = '⋁', + bz = '≚', + Rz = '⋮', + Tz = '|', + Iz = '‖', + Nz = '|', + Lz = '‖', + Oz = '∣', + jz = '|', + Pz = '❘', + Mz = '≀', + Hz = ' ', + Bz = '𝔙', + Fz = '𝔳', + Uz = '⊲', + qz = '⊂⃒', + Qz = '⊃⃒', + Vz = '𝕍', + Wz = '𝕧', + Yz = '∝', + Gz = '⊳', + zz = '𝒱', + Xz = '𝓋', + Kz = '⫋︀', + Zz = '⊊︀', + Jz = '⫌︀', + _z = '⊋︀', + $z = '⊪', + eX = '⦚', + tX = 'Ŵ', + nX = 'ŵ', + rX = '⩟', + oX = '∧', + sX = '⋀', + iX = '≙', + lX = '℘', + cX = '𝔚', + aX = '𝔴', + uX = '𝕎', + fX = '𝕨', + dX = '℘', + pX = '≀', + hX = '≀', + gX = '𝒲', + mX = '𝓌', + vX = '⋂', + yX = '◯', + wX = '⋃', + AX = '▽', + xX = '𝔛', + EX = '𝔵', + SX = '⟷', + CX = '⟺', + kX = 'Ξ', + DX = 'ξ', + bX = '⟵', + RX = '⟸', + TX = '⟼', + IX = '⋻', + NX = '⨀', + LX = '𝕏', + OX = '𝕩', + jX = '⨁', + PX = '⨂', + MX = '⟶', + HX = '⟹', + BX = '𝒳', + FX = '𝓍', + UX = '⨆', + qX = '⨄', + QX = '△', + VX = '⋁', + WX = '⋀', + YX = 'Ý', + GX = 'ý', + zX = 'Я', + XX = 'я', + KX = 'Ŷ', + ZX = 'ŷ', + JX = 'Ы', + _X = 'ы', + $X = '¥', + eK = '𝔜', + tK = '𝔶', + nK = 'Ї', + rK = 'ї', + oK = '𝕐', + sK = '𝕪', + iK = '𝒴', + lK = '𝓎', + cK = 'Ю', + aK = 'ю', + uK = 'ÿ', + fK = 'Ÿ', + dK = 'Ź', + pK = 'ź', + hK = 'Ž', + gK = 'ž', + mK = 'З', + vK = 'з', + yK = 'Ż', + wK = 'ż', + AK = 'ℨ', + xK = '​', + EK = 'Ζ', + SK = 'ζ', + CK = '𝔷', + kK = 'ℨ', + DK = 'Ж', + bK = 'ж', + RK = '⇝', + TK = '𝕫', + IK = 'ℤ', + NK = '𝒵', + LK = '𝓏', + OK = '‍', + jK = '‌', + qp = { + Aacute: yv, + aacute: wv, + Abreve: Av, + abreve: xv, + ac: Ev, + acd: Sv, + acE: Cv, + Acirc: kv, + acirc: Dv, + acute: bv, + Acy: Rv, + acy: Tv, + AElig: Iv, + aelig: Nv, + af: Lv, + Afr: Ov, + afr: jv, + Agrave: Pv, + agrave: Mv, + alefsym: Hv, + aleph: Bv, + Alpha: Fv, + alpha: Uv, + Amacr: qv, + amacr: Qv, + amalg: Vv, + amp: Wv, + AMP: Yv, + andand: Gv, + And: zv, + and: Xv, + andd: Kv, + andslope: Zv, + andv: Jv, + ang: _v, + ange: $v, + angle: ey, + angmsdaa: ty, + angmsdab: ny, + angmsdac: ry, + angmsdad: oy, + angmsdae: sy, + angmsdaf: iy, + angmsdag: ly, + angmsdah: cy, + angmsd: ay, + angrt: uy, + angrtvb: fy, + angrtvbd: dy, + angsph: py, + angst: hy, + angzarr: gy, + Aogon: my, + aogon: vy, + Aopf: yy, + aopf: wy, + apacir: Ay, + ap: xy, + apE: Ey, + ape: Sy, + apid: Cy, + apos: ky, + ApplyFunction: Dy, + approx: by, + approxeq: Ry, + Aring: Ty, + aring: Iy, + Ascr: Ny, + ascr: Ly, + Assign: Oy, + ast: jy, + asymp: Py, + asympeq: My, + Atilde: Hy, + atilde: By, + Auml: Fy, + auml: Uy, + awconint: qy, + awint: Qy, + backcong: Vy, + backepsilon: Wy, + backprime: Yy, + backsim: Gy, + backsimeq: zy, + Backslash: Xy, + Barv: Ky, + barvee: Zy, + barwed: Jy, + Barwed: _y, + barwedge: $y, + bbrk: ew, + bbrktbrk: tw, + bcong: nw, + Bcy: rw, + bcy: ow, + bdquo: sw, + becaus: iw, + because: lw, + Because: cw, + bemptyv: aw, + bepsi: uw, + bernou: fw, + Bernoullis: dw, + Beta: pw, + beta: hw, + beth: gw, + between: mw, + Bfr: vw, + bfr: yw, + bigcap: ww, + bigcirc: Aw, + bigcup: xw, + bigodot: Ew, + bigoplus: Sw, + bigotimes: Cw, + bigsqcup: kw, + bigstar: Dw, + bigtriangledown: bw, + bigtriangleup: Rw, + biguplus: Tw, + bigvee: Iw, + bigwedge: Nw, + bkarow: Lw, + blacklozenge: Ow, + blacksquare: jw, + blacktriangle: Pw, + blacktriangledown: Mw, + blacktriangleleft: Hw, + blacktriangleright: Bw, + blank: Fw, + blk12: Uw, + blk14: qw, + blk34: Qw, + block: Vw, + bne: Ww, + bnequiv: Yw, + bNot: Gw, + bnot: zw, + Bopf: Xw, + bopf: Kw, + bot: Zw, + bottom: Jw, + bowtie: _w, + boxbox: $w, + boxdl: eA, + boxdL: tA, + boxDl: nA, + boxDL: rA, + boxdr: oA, + boxdR: sA, + boxDr: iA, + boxDR: lA, + boxh: cA, + boxH: aA, + boxhd: uA, + boxHd: fA, + boxhD: dA, + boxHD: pA, + boxhu: hA, + boxHu: gA, + boxhU: mA, + boxHU: vA, + boxminus: yA, + boxplus: wA, + boxtimes: AA, + boxul: xA, + boxuL: EA, + boxUl: SA, + boxUL: CA, + boxur: kA, + boxuR: DA, + boxUr: bA, + boxUR: RA, + boxv: TA, + boxV: IA, + boxvh: NA, + boxvH: LA, + boxVh: OA, + boxVH: jA, + boxvl: PA, + boxvL: MA, + boxVl: HA, + boxVL: BA, + boxvr: FA, + boxvR: UA, + boxVr: qA, + boxVR: QA, + bprime: VA, + breve: WA, + Breve: YA, + brvbar: GA, + bscr: zA, + Bscr: XA, + bsemi: KA, + bsim: ZA, + bsime: JA, + bsolb: _A, + bsol: $A, + bsolhsub: ex, + bull: tx, + bullet: nx, + bump: rx, + bumpE: ox, + bumpe: sx, + Bumpeq: ix, + bumpeq: lx, + Cacute: cx, + cacute: ax, + capand: ux, + capbrcup: fx, + capcap: dx, + cap: px, + Cap: hx, + capcup: gx, + capdot: mx, + CapitalDifferentialD: vx, + caps: yx, + caret: wx, + caron: Ax, + Cayleys: xx, + ccaps: Ex, + Ccaron: Sx, + ccaron: Cx, + Ccedil: kx, + ccedil: Dx, + Ccirc: bx, + ccirc: Rx, + Cconint: Tx, + ccups: Ix, + ccupssm: Nx, + Cdot: Lx, + cdot: Ox, + cedil: jx, + Cedilla: Px, + cemptyv: Mx, + cent: Hx, + centerdot: Bx, + CenterDot: Fx, + cfr: Ux, + Cfr: qx, + CHcy: Qx, + chcy: Vx, + check: Wx, + checkmark: Yx, + Chi: Gx, + chi: zx, + circ: Xx, + circeq: Kx, + circlearrowleft: Zx, + circlearrowright: Jx, + circledast: _x, + circledcirc: $x, + circleddash: e5, + CircleDot: t5, + circledR: n5, + circledS: r5, + CircleMinus: o5, + CirclePlus: s5, + CircleTimes: i5, + cir: l5, + cirE: c5, + cire: a5, + cirfnint: u5, + cirmid: f5, + cirscir: d5, + ClockwiseContourIntegral: p5, + CloseCurlyDoubleQuote: h5, + CloseCurlyQuote: g5, + clubs: m5, + clubsuit: v5, + colon: y5, + Colon: w5, + Colone: A5, + colone: x5, + coloneq: E5, + comma: S5, + commat: C5, + comp: k5, + compfn: D5, + complement: b5, + complexes: R5, + cong: T5, + congdot: I5, + Congruent: N5, + conint: L5, + Conint: O5, + ContourIntegral: j5, + copf: P5, + Copf: M5, + coprod: H5, + Coproduct: B5, + copy: F5, + COPY: U5, + copysr: q5, + CounterClockwiseContourIntegral: Q5, + crarr: V5, + cross: W5, + Cross: Y5, + Cscr: G5, + cscr: z5, + csub: X5, + csube: K5, + csup: Z5, + csupe: J5, + ctdot: _5, + cudarrl: $5, + cudarrr: e8, + cuepr: t8, + cuesc: n8, + cularr: r8, + cularrp: o8, + cupbrcap: s8, + cupcap: i8, + CupCap: l8, + cup: c8, + Cup: a8, + cupcup: u8, + cupdot: f8, + cupor: d8, + cups: p8, + curarr: h8, + curarrm: g8, + curlyeqprec: m8, + curlyeqsucc: v8, + curlyvee: y8, + curlywedge: w8, + curren: A8, + curvearrowleft: x8, + curvearrowright: E8, + cuvee: S8, + cuwed: C8, + cwconint: k8, + cwint: D8, + cylcty: b8, + dagger: R8, + Dagger: T8, + daleth: I8, + darr: N8, + Darr: L8, + dArr: O8, + dash: j8, + Dashv: P8, + dashv: M8, + dbkarow: H8, + dblac: B8, + Dcaron: F8, + dcaron: U8, + Dcy: q8, + dcy: Q8, + ddagger: V8, + ddarr: W8, + DD: Y8, + dd: G8, + DDotrahd: z8, + ddotseq: X8, + deg: K8, + Del: Z8, + Delta: J8, + delta: _8, + demptyv: $8, + dfisht: eE, + Dfr: tE, + dfr: nE, + dHar: rE, + dharl: oE, + dharr: sE, + DiacriticalAcute: iE, + DiacriticalDot: lE, + DiacriticalDoubleAcute: cE, + DiacriticalGrave: aE, + DiacriticalTilde: uE, + diam: fE, + diamond: dE, + Diamond: pE, + diamondsuit: hE, + diams: gE, + die: mE, + DifferentialD: vE, + digamma: yE, + disin: wE, + div: AE, + divide: xE, + divideontimes: EE, + divonx: SE, + DJcy: CE, + djcy: kE, + dlcorn: DE, + dlcrop: bE, + dollar: RE, + Dopf: TE, + dopf: IE, + Dot: NE, + dot: LE, + DotDot: OE, + doteq: jE, + doteqdot: PE, + DotEqual: ME, + dotminus: HE, + dotplus: BE, + dotsquare: FE, + doublebarwedge: UE, + DoubleContourIntegral: qE, + DoubleDot: QE, + DoubleDownArrow: VE, + DoubleLeftArrow: WE, + DoubleLeftRightArrow: YE, + DoubleLeftTee: GE, + DoubleLongLeftArrow: zE, + DoubleLongLeftRightArrow: XE, + DoubleLongRightArrow: KE, + DoubleRightArrow: ZE, + DoubleRightTee: JE, + DoubleUpArrow: _E, + DoubleUpDownArrow: $E, + DoubleVerticalBar: e3, + DownArrowBar: t3, + downarrow: n3, + DownArrow: r3, + Downarrow: o3, + DownArrowUpArrow: s3, + DownBreve: i3, + downdownarrows: l3, + downharpoonleft: c3, + downharpoonright: a3, + DownLeftRightVector: u3, + DownLeftTeeVector: f3, + DownLeftVectorBar: d3, + DownLeftVector: p3, + DownRightTeeVector: h3, + DownRightVectorBar: g3, + DownRightVector: m3, + DownTeeArrow: v3, + DownTee: y3, + drbkarow: w3, + drcorn: A3, + drcrop: x3, + Dscr: E3, + dscr: S3, + DScy: C3, + dscy: k3, + dsol: D3, + Dstrok: b3, + dstrok: R3, + dtdot: T3, + dtri: I3, + dtrif: N3, + duarr: L3, + duhar: O3, + dwangle: j3, + DZcy: P3, + dzcy: M3, + dzigrarr: H3, + Eacute: B3, + eacute: F3, + easter: U3, + Ecaron: q3, + ecaron: Q3, + Ecirc: V3, + ecirc: W3, + ecir: Y3, + ecolon: G3, + Ecy: z3, + ecy: X3, + eDDot: K3, + Edot: Z3, + edot: J3, + eDot: _3, + ee: $3, + efDot: e4, + Efr: t4, + efr: n4, + eg: r4, + Egrave: o4, + egrave: s4, + egs: i4, + egsdot: l4, + el: c4, + Element: a4, + elinters: u4, + ell: f4, + els: d4, + elsdot: p4, + Emacr: h4, + emacr: g4, + empty: m4, + emptyset: v4, + EmptySmallSquare: y4, + emptyv: w4, + EmptyVerySmallSquare: A4, + emsp13: x4, + emsp14: E4, + emsp: S4, + ENG: C4, + eng: k4, + ensp: D4, + Eogon: b4, + eogon: R4, + Eopf: T4, + eopf: I4, + epar: N4, + eparsl: L4, + eplus: O4, + epsi: j4, + Epsilon: P4, + epsilon: M4, + epsiv: H4, + eqcirc: B4, + eqcolon: F4, + eqsim: U4, + eqslantgtr: q4, + eqslantless: Q4, + Equal: V4, + equals: W4, + EqualTilde: Y4, + equest: G4, + Equilibrium: z4, + equiv: X4, + equivDD: K4, + eqvparsl: Z4, + erarr: J4, + erDot: _4, + escr: $4, + Escr: e7, + esdot: t7, + Esim: n7, + esim: r7, + Eta: o7, + eta: s7, + ETH: i7, + eth: l7, + Euml: c7, + euml: a7, + euro: u7, + excl: f7, + exist: d7, + Exists: p7, + expectation: h7, + exponentiale: g7, + ExponentialE: m7, + fallingdotseq: v7, + Fcy: y7, + fcy: w7, + female: A7, + ffilig: x7, + fflig: E7, + ffllig: S7, + Ffr: C7, + ffr: k7, + filig: D7, + FilledSmallSquare: b7, + FilledVerySmallSquare: R7, + fjlig: T7, + flat: I7, + fllig: N7, + fltns: L7, + fnof: O7, + Fopf: j7, + fopf: P7, + forall: M7, + ForAll: H7, + fork: B7, + forkv: F7, + Fouriertrf: U7, + fpartint: q7, + frac12: Q7, + frac13: V7, + frac14: W7, + frac15: Y7, + frac16: G7, + frac18: z7, + frac23: X7, + frac25: K7, + frac34: Z7, + frac35: J7, + frac38: _7, + frac45: $7, + frac56: e6, + frac58: t6, + frac78: n6, + frasl: r6, + frown: o6, + fscr: s6, + Fscr: i6, + gacute: l6, + Gamma: c6, + gamma: a6, + Gammad: u6, + gammad: f6, + gap: d6, + Gbreve: p6, + gbreve: h6, + Gcedil: g6, + Gcirc: m6, + gcirc: v6, + Gcy: y6, + gcy: w6, + Gdot: A6, + gdot: x6, + ge: E6, + gE: S6, + gEl: C6, + gel: k6, + geq: D6, + geqq: b6, + geqslant: R6, + gescc: T6, + ges: I6, + gesdot: N6, + gesdoto: L6, + gesdotol: O6, + gesl: j6, + gesles: P6, + Gfr: M6, + gfr: H6, + gg: B6, + Gg: F6, + ggg: U6, + gimel: q6, + GJcy: Q6, + gjcy: V6, + gla: W6, + gl: Y6, + glE: G6, + glj: z6, + gnap: X6, + gnapprox: K6, + gne: Z6, + gnE: J6, + gneq: _6, + gneqq: $6, + gnsim: eS, + Gopf: tS, + gopf: nS, + grave: rS, + GreaterEqual: oS, + GreaterEqualLess: sS, + GreaterFullEqual: iS, + GreaterGreater: lS, + GreaterLess: cS, + GreaterSlantEqual: aS, + GreaterTilde: uS, + Gscr: fS, + gscr: dS, + gsim: pS, + gsime: hS, + gsiml: gS, + gtcc: mS, + gtcir: vS, + gt: yS, + GT: wS, + Gt: AS, + gtdot: xS, + gtlPar: ES, + gtquest: SS, + gtrapprox: CS, + gtrarr: kS, + gtrdot: DS, + gtreqless: bS, + gtreqqless: RS, + gtrless: TS, + gtrsim: IS, + gvertneqq: NS, + gvnE: LS, + Hacek: OS, + hairsp: jS, + half: PS, + hamilt: MS, + HARDcy: HS, + hardcy: BS, + harrcir: FS, + harr: US, + hArr: qS, + harrw: QS, + Hat: VS, + hbar: WS, + Hcirc: YS, + hcirc: GS, + hearts: zS, + heartsuit: XS, + hellip: KS, + hercon: ZS, + hfr: JS, + Hfr: _S, + HilbertSpace: $S, + hksearow: eC, + hkswarow: tC, + hoarr: nC, + homtht: rC, + hookleftarrow: oC, + hookrightarrow: sC, + hopf: iC, + Hopf: lC, + horbar: cC, + HorizontalLine: aC, + hscr: uC, + Hscr: fC, + hslash: dC, + Hstrok: pC, + hstrok: hC, + HumpDownHump: gC, + HumpEqual: mC, + hybull: vC, + hyphen: yC, + Iacute: wC, + iacute: AC, + ic: xC, + Icirc: EC, + icirc: SC, + Icy: CC, + icy: kC, + Idot: DC, + IEcy: bC, + iecy: RC, + iexcl: TC, + iff: IC, + ifr: NC, + Ifr: LC, + Igrave: OC, + igrave: jC, + ii: PC, + iiiint: MC, + iiint: HC, + iinfin: BC, + iiota: FC, + IJlig: UC, + ijlig: qC, + Imacr: QC, + imacr: VC, + image: WC, + ImaginaryI: YC, + imagline: GC, + imagpart: zC, + imath: XC, + Im: KC, + imof: ZC, + imped: JC, + Implies: _C, + incare: $C, + in: '∈', + infin: ek, + infintie: tk, + inodot: nk, + intcal: rk, + int: ok, + Int: sk, + integers: ik, + Integral: lk, + intercal: ck, + Intersection: ak, + intlarhk: uk, + intprod: fk, + InvisibleComma: dk, + InvisibleTimes: pk, + IOcy: hk, + iocy: gk, + Iogon: mk, + iogon: vk, + Iopf: yk, + iopf: wk, + Iota: Ak, + iota: xk, + iprod: Ek, + iquest: Sk, + iscr: Ck, + Iscr: kk, + isin: Dk, + isindot: bk, + isinE: Rk, + isins: Tk, + isinsv: Ik, + isinv: Nk, + it: Lk, + Itilde: Ok, + itilde: jk, + Iukcy: Pk, + iukcy: Mk, + Iuml: Hk, + iuml: Bk, + Jcirc: Fk, + jcirc: Uk, + Jcy: qk, + jcy: Qk, + Jfr: Vk, + jfr: Wk, + jmath: Yk, + Jopf: Gk, + jopf: zk, + Jscr: Xk, + jscr: Kk, + Jsercy: Zk, + jsercy: Jk, + Jukcy: _k, + jukcy: $k, + Kappa: e9, + kappa: t9, + kappav: n9, + Kcedil: r9, + kcedil: o9, + Kcy: s9, + kcy: i9, + Kfr: l9, + kfr: c9, + kgreen: a9, + KHcy: u9, + khcy: f9, + KJcy: d9, + kjcy: p9, + Kopf: h9, + kopf: g9, + Kscr: m9, + kscr: v9, + lAarr: y9, + Lacute: w9, + lacute: A9, + laemptyv: x9, + lagran: E9, + Lambda: S9, + lambda: C9, + lang: k9, + Lang: D9, + langd: b9, + langle: R9, + lap: T9, + Laplacetrf: I9, + laquo: N9, + larrb: L9, + larrbfs: O9, + larr: j9, + Larr: P9, + lArr: M9, + larrfs: H9, + larrhk: B9, + larrlp: F9, + larrpl: U9, + larrsim: q9, + larrtl: Q9, + latail: V9, + lAtail: W9, + lat: Y9, + late: G9, + lates: z9, + lbarr: X9, + lBarr: K9, + lbbrk: Z9, + lbrace: J9, + lbrack: _9, + lbrke: $9, + lbrksld: eD, + lbrkslu: tD, + Lcaron: nD, + lcaron: rD, + Lcedil: oD, + lcedil: sD, + lceil: iD, + lcub: lD, + Lcy: cD, + lcy: aD, + ldca: uD, + ldquo: fD, + ldquor: dD, + ldrdhar: pD, + ldrushar: hD, + ldsh: gD, + le: mD, + lE: vD, + LeftAngleBracket: yD, + LeftArrowBar: wD, + leftarrow: AD, + LeftArrow: xD, + Leftarrow: ED, + LeftArrowRightArrow: SD, + leftarrowtail: CD, + LeftCeiling: kD, + LeftDoubleBracket: DD, + LeftDownTeeVector: bD, + LeftDownVectorBar: RD, + LeftDownVector: TD, + LeftFloor: ID, + leftharpoondown: ND, + leftharpoonup: LD, + leftleftarrows: OD, + leftrightarrow: jD, + LeftRightArrow: PD, + Leftrightarrow: MD, + leftrightarrows: HD, + leftrightharpoons: BD, + leftrightsquigarrow: FD, + LeftRightVector: UD, + LeftTeeArrow: qD, + LeftTee: QD, + LeftTeeVector: VD, + leftthreetimes: WD, + LeftTriangleBar: YD, + LeftTriangle: GD, + LeftTriangleEqual: zD, + LeftUpDownVector: XD, + LeftUpTeeVector: KD, + LeftUpVectorBar: ZD, + LeftUpVector: JD, + LeftVectorBar: _D, + LeftVector: $D, + lEg: eb, + leg: tb, + leq: nb, + leqq: rb, + leqslant: ob, + lescc: sb, + les: ib, + lesdot: lb, + lesdoto: cb, + lesdotor: ab, + lesg: ub, + lesges: fb, + lessapprox: db, + lessdot: pb, + lesseqgtr: hb, + lesseqqgtr: gb, + LessEqualGreater: mb, + LessFullEqual: vb, + LessGreater: yb, + lessgtr: wb, + LessLess: Ab, + lesssim: xb, + LessSlantEqual: Eb, + LessTilde: Sb, + lfisht: Cb, + lfloor: kb, + Lfr: Db, + lfr: bb, + lg: Rb, + lgE: Tb, + lHar: Ib, + lhard: Nb, + lharu: Lb, + lharul: Ob, + lhblk: jb, + LJcy: Pb, + ljcy: Mb, + llarr: Hb, + ll: Bb, + Ll: Fb, + llcorner: Ub, + Lleftarrow: qb, + llhard: Qb, + lltri: Vb, + Lmidot: Wb, + lmidot: Yb, + lmoustache: Gb, + lmoust: zb, + lnap: Xb, + lnapprox: Kb, + lne: Zb, + lnE: Jb, + lneq: _b, + lneqq: $b, + lnsim: eR, + loang: tR, + loarr: nR, + lobrk: rR, + longleftarrow: oR, + LongLeftArrow: sR, + Longleftarrow: iR, + longleftrightarrow: lR, + LongLeftRightArrow: cR, + Longleftrightarrow: aR, + longmapsto: uR, + longrightarrow: fR, + LongRightArrow: dR, + Longrightarrow: pR, + looparrowleft: hR, + looparrowright: gR, + lopar: mR, + Lopf: vR, + lopf: yR, + loplus: wR, + lotimes: AR, + lowast: xR, + lowbar: ER, + LowerLeftArrow: SR, + LowerRightArrow: CR, + loz: kR, + lozenge: DR, + lozf: bR, + lpar: RR, + lparlt: TR, + lrarr: IR, + lrcorner: NR, + lrhar: LR, + lrhard: OR, + lrm: jR, + lrtri: PR, + lsaquo: MR, + lscr: HR, + Lscr: BR, + lsh: FR, + Lsh: UR, + lsim: qR, + lsime: QR, + lsimg: VR, + lsqb: WR, + lsquo: YR, + lsquor: GR, + Lstrok: zR, + lstrok: XR, + ltcc: KR, + ltcir: ZR, + lt: JR, + LT: _R, + Lt: $R, + ltdot: eT, + lthree: tT, + ltimes: nT, + ltlarr: rT, + ltquest: oT, + ltri: sT, + ltrie: iT, + ltrif: lT, + ltrPar: cT, + lurdshar: aT, + luruhar: uT, + lvertneqq: fT, + lvnE: dT, + macr: pT, + male: hT, + malt: gT, + maltese: mT, + Map: '⤅', + map: vT, + mapsto: yT, + mapstodown: wT, + mapstoleft: AT, + mapstoup: xT, + marker: ET, + mcomma: ST, + Mcy: CT, + mcy: kT, + mdash: DT, + mDDot: bT, + measuredangle: RT, + MediumSpace: TT, + Mellintrf: IT, + Mfr: NT, + mfr: LT, + mho: OT, + micro: jT, + midast: PT, + midcir: MT, + mid: HT, + middot: BT, + minusb: FT, + minus: UT, + minusd: qT, + minusdu: QT, + MinusPlus: VT, + mlcp: WT, + mldr: YT, + mnplus: GT, + models: zT, + Mopf: XT, + mopf: KT, + mp: ZT, + mscr: JT, + Mscr: _T, + mstpos: $T, + Mu: eI, + mu: tI, + multimap: nI, + mumap: rI, + nabla: oI, + Nacute: sI, + nacute: iI, + nang: lI, + nap: cI, + napE: aI, + napid: uI, + napos: fI, + napprox: dI, + natural: pI, + naturals: hI, + natur: gI, + nbsp: mI, + nbump: vI, + nbumpe: yI, + ncap: wI, + Ncaron: AI, + ncaron: xI, + Ncedil: EI, + ncedil: SI, + ncong: CI, + ncongdot: kI, + ncup: DI, + Ncy: bI, + ncy: RI, + ndash: TI, + nearhk: II, + nearr: NI, + neArr: LI, + nearrow: OI, + ne: jI, + nedot: PI, + NegativeMediumSpace: MI, + NegativeThickSpace: HI, + NegativeThinSpace: BI, + NegativeVeryThinSpace: FI, + nequiv: UI, + nesear: qI, + nesim: QI, + NestedGreaterGreater: VI, + NestedLessLess: WI, + NewLine: YI, + nexist: GI, + nexists: zI, + Nfr: XI, + nfr: KI, + ngE: ZI, + nge: JI, + ngeq: _I, + ngeqq: $I, + ngeqslant: eN, + nges: tN, + nGg: nN, + ngsim: rN, + nGt: oN, + ngt: sN, + ngtr: iN, + nGtv: lN, + nharr: cN, + nhArr: aN, + nhpar: uN, + ni: fN, + nis: dN, + nisd: pN, + niv: hN, + NJcy: gN, + njcy: mN, + nlarr: vN, + nlArr: yN, + nldr: wN, + nlE: AN, + nle: xN, + nleftarrow: EN, + nLeftarrow: SN, + nleftrightarrow: CN, + nLeftrightarrow: kN, + nleq: DN, + nleqq: bN, + nleqslant: RN, + nles: TN, + nless: IN, + nLl: NN, + nlsim: LN, + nLt: ON, + nlt: jN, + nltri: PN, + nltrie: MN, + nLtv: HN, + nmid: BN, + NoBreak: FN, + NonBreakingSpace: UN, + nopf: qN, + Nopf: QN, + Not: VN, + not: WN, + NotCongruent: YN, + NotCupCap: GN, + NotDoubleVerticalBar: zN, + NotElement: XN, + NotEqual: KN, + NotEqualTilde: ZN, + NotExists: JN, + NotGreater: _N, + NotGreaterEqual: $N, + NotGreaterFullEqual: eL, + NotGreaterGreater: tL, + NotGreaterLess: nL, + NotGreaterSlantEqual: rL, + NotGreaterTilde: oL, + NotHumpDownHump: sL, + NotHumpEqual: iL, + notin: lL, + notindot: cL, + notinE: aL, + notinva: uL, + notinvb: fL, + notinvc: dL, + NotLeftTriangleBar: pL, + NotLeftTriangle: hL, + NotLeftTriangleEqual: gL, + NotLess: mL, + NotLessEqual: vL, + NotLessGreater: yL, + NotLessLess: wL, + NotLessSlantEqual: AL, + NotLessTilde: xL, + NotNestedGreaterGreater: EL, + NotNestedLessLess: SL, + notni: CL, + notniva: kL, + notnivb: DL, + notnivc: bL, + NotPrecedes: RL, + NotPrecedesEqual: TL, + NotPrecedesSlantEqual: IL, + NotReverseElement: NL, + NotRightTriangleBar: LL, + NotRightTriangle: OL, + NotRightTriangleEqual: jL, + NotSquareSubset: PL, + NotSquareSubsetEqual: ML, + NotSquareSuperset: HL, + NotSquareSupersetEqual: BL, + NotSubset: FL, + NotSubsetEqual: UL, + NotSucceeds: qL, + NotSucceedsEqual: QL, + NotSucceedsSlantEqual: VL, + NotSucceedsTilde: WL, + NotSuperset: YL, + NotSupersetEqual: GL, + NotTilde: zL, + NotTildeEqual: XL, + NotTildeFullEqual: KL, + NotTildeTilde: ZL, + NotVerticalBar: JL, + nparallel: _L, + npar: $L, + nparsl: eO, + npart: tO, + npolint: nO, + npr: rO, + nprcue: oO, + nprec: sO, + npreceq: iO, + npre: lO, + nrarrc: cO, + nrarr: aO, + nrArr: uO, + nrarrw: fO, + nrightarrow: dO, + nRightarrow: pO, + nrtri: hO, + nrtrie: gO, + nsc: mO, + nsccue: vO, + nsce: yO, + Nscr: wO, + nscr: AO, + nshortmid: xO, + nshortparallel: EO, + nsim: SO, + nsime: CO, + nsimeq: kO, + nsmid: DO, + nspar: bO, + nsqsube: RO, + nsqsupe: TO, + nsub: IO, + nsubE: NO, + nsube: LO, + nsubset: OO, + nsubseteq: jO, + nsubseteqq: PO, + nsucc: MO, + nsucceq: HO, + nsup: BO, + nsupE: FO, + nsupe: UO, + nsupset: qO, + nsupseteq: QO, + nsupseteqq: VO, + ntgl: WO, + Ntilde: YO, + ntilde: GO, + ntlg: zO, + ntriangleleft: XO, + ntrianglelefteq: KO, + ntriangleright: ZO, + ntrianglerighteq: JO, + Nu: _O, + nu: $O, + num: ej, + numero: tj, + numsp: nj, + nvap: rj, + nvdash: oj, + nvDash: sj, + nVdash: ij, + nVDash: lj, + nvge: cj, + nvgt: aj, + nvHarr: uj, + nvinfin: fj, + nvlArr: dj, + nvle: pj, + nvlt: hj, + nvltrie: gj, + nvrArr: mj, + nvrtrie: vj, + nvsim: yj, + nwarhk: wj, + nwarr: Aj, + nwArr: xj, + nwarrow: Ej, + nwnear: Sj, + Oacute: Cj, + oacute: kj, + oast: Dj, + Ocirc: bj, + ocirc: Rj, + ocir: Tj, + Ocy: Ij, + ocy: Nj, + odash: Lj, + Odblac: Oj, + odblac: jj, + odiv: Pj, + odot: Mj, + odsold: Hj, + OElig: Bj, + oelig: Fj, + ofcir: Uj, + Ofr: qj, + ofr: Qj, + ogon: Vj, + Ograve: Wj, + ograve: Yj, + ogt: Gj, + ohbar: zj, + ohm: Xj, + oint: Kj, + olarr: Zj, + olcir: Jj, + olcross: _j, + oline: $j, + olt: eP, + Omacr: tP, + omacr: nP, + Omega: rP, + omega: oP, + Omicron: sP, + omicron: iP, + omid: lP, + ominus: cP, + Oopf: aP, + oopf: uP, + opar: fP, + OpenCurlyDoubleQuote: dP, + OpenCurlyQuote: pP, + operp: hP, + oplus: gP, + orarr: mP, + Or: vP, + or: yP, + ord: wP, + order: AP, + orderof: xP, + ordf: EP, + ordm: SP, + origof: CP, + oror: kP, + orslope: DP, + orv: bP, + oS: RP, + Oscr: TP, + oscr: IP, + Oslash: NP, + oslash: LP, + osol: OP, + Otilde: jP, + otilde: PP, + otimesas: MP, + Otimes: HP, + otimes: BP, + Ouml: FP, + ouml: UP, + ovbar: qP, + OverBar: QP, + OverBrace: VP, + OverBracket: WP, + OverParenthesis: YP, + para: GP, + parallel: zP, + par: XP, + parsim: KP, + parsl: ZP, + part: JP, + PartialD: _P, + Pcy: $P, + pcy: eM, + percnt: tM, + period: nM, + permil: rM, + perp: oM, + pertenk: sM, + Pfr: iM, + pfr: lM, + Phi: cM, + phi: aM, + phiv: uM, + phmmat: fM, + phone: dM, + Pi: pM, + pi: hM, + pitchfork: gM, + piv: mM, + planck: vM, + planckh: yM, + plankv: wM, + plusacir: AM, + plusb: xM, + pluscir: EM, + plus: SM, + plusdo: CM, + plusdu: kM, + pluse: DM, + PlusMinus: bM, + plusmn: RM, + plussim: TM, + plustwo: IM, + pm: NM, + Poincareplane: LM, + pointint: OM, + popf: jM, + Popf: PM, + pound: MM, + prap: HM, + Pr: BM, + pr: FM, + prcue: UM, + precapprox: qM, + prec: QM, + preccurlyeq: VM, + Precedes: WM, + PrecedesEqual: YM, + PrecedesSlantEqual: GM, + PrecedesTilde: zM, + preceq: XM, + precnapprox: KM, + precneqq: ZM, + precnsim: JM, + pre: _M, + prE: $M, + precsim: eH, + prime: tH, + Prime: nH, + primes: rH, + prnap: oH, + prnE: sH, + prnsim: iH, + prod: lH, + Product: cH, + profalar: aH, + profline: uH, + profsurf: fH, + prop: dH, + Proportional: pH, + Proportion: hH, + propto: gH, + prsim: mH, + prurel: vH, + Pscr: yH, + pscr: wH, + Psi: AH, + psi: xH, + puncsp: EH, + Qfr: SH, + qfr: CH, + qint: kH, + qopf: DH, + Qopf: bH, + qprime: RH, + Qscr: TH, + qscr: IH, + quaternions: NH, + quatint: LH, + quest: OH, + questeq: jH, + quot: PH, + QUOT: MH, + rAarr: HH, + race: BH, + Racute: FH, + racute: UH, + radic: qH, + raemptyv: QH, + rang: VH, + Rang: WH, + rangd: YH, + range: GH, + rangle: zH, + raquo: XH, + rarrap: KH, + rarrb: ZH, + rarrbfs: JH, + rarrc: _H, + rarr: $H, + Rarr: eB, + rArr: tB, + rarrfs: nB, + rarrhk: rB, + rarrlp: oB, + rarrpl: sB, + rarrsim: iB, + Rarrtl: lB, + rarrtl: cB, + rarrw: aB, + ratail: uB, + rAtail: fB, + ratio: dB, + rationals: pB, + rbarr: hB, + rBarr: gB, + RBarr: mB, + rbbrk: vB, + rbrace: yB, + rbrack: wB, + rbrke: AB, + rbrksld: xB, + rbrkslu: EB, + Rcaron: SB, + rcaron: CB, + Rcedil: kB, + rcedil: DB, + rceil: bB, + rcub: RB, + Rcy: TB, + rcy: IB, + rdca: NB, + rdldhar: LB, + rdquo: OB, + rdquor: jB, + rdsh: PB, + real: MB, + realine: HB, + realpart: BB, + reals: FB, + Re: UB, + rect: qB, + reg: QB, + REG: VB, + ReverseElement: WB, + ReverseEquilibrium: YB, + ReverseUpEquilibrium: GB, + rfisht: zB, + rfloor: XB, + rfr: KB, + Rfr: ZB, + rHar: JB, + rhard: _B, + rharu: $B, + rharul: eF, + Rho: tF, + rho: nF, + rhov: rF, + RightAngleBracket: oF, + RightArrowBar: sF, + rightarrow: iF, + RightArrow: lF, + Rightarrow: cF, + RightArrowLeftArrow: aF, + rightarrowtail: uF, + RightCeiling: fF, + RightDoubleBracket: dF, + RightDownTeeVector: pF, + RightDownVectorBar: hF, + RightDownVector: gF, + RightFloor: mF, + rightharpoondown: vF, + rightharpoonup: yF, + rightleftarrows: wF, + rightleftharpoons: AF, + rightrightarrows: xF, + rightsquigarrow: EF, + RightTeeArrow: SF, + RightTee: CF, + RightTeeVector: kF, + rightthreetimes: DF, + RightTriangleBar: bF, + RightTriangle: RF, + RightTriangleEqual: TF, + RightUpDownVector: IF, + RightUpTeeVector: NF, + RightUpVectorBar: LF, + RightUpVector: OF, + RightVectorBar: jF, + RightVector: PF, + ring: MF, + risingdotseq: HF, + rlarr: BF, + rlhar: FF, + rlm: UF, + rmoustache: qF, + rmoust: QF, + rnmid: VF, + roang: WF, + roarr: YF, + robrk: GF, + ropar: zF, + ropf: XF, + Ropf: KF, + roplus: ZF, + rotimes: JF, + RoundImplies: _F, + rpar: $F, + rpargt: eU, + rppolint: tU, + rrarr: nU, + Rrightarrow: rU, + rsaquo: oU, + rscr: sU, + Rscr: iU, + rsh: lU, + Rsh: cU, + rsqb: aU, + rsquo: uU, + rsquor: fU, + rthree: dU, + rtimes: pU, + rtri: hU, + rtrie: gU, + rtrif: mU, + rtriltri: vU, + RuleDelayed: yU, + ruluhar: wU, + rx: AU, + Sacute: xU, + sacute: EU, + sbquo: SU, + scap: CU, + Scaron: kU, + scaron: DU, + Sc: bU, + sc: RU, + sccue: TU, + sce: IU, + scE: NU, + Scedil: LU, + scedil: OU, + Scirc: jU, + scirc: PU, + scnap: MU, + scnE: HU, + scnsim: BU, + scpolint: FU, + scsim: UU, + Scy: qU, + scy: QU, + sdotb: VU, + sdot: WU, + sdote: YU, + searhk: GU, + searr: zU, + seArr: XU, + searrow: KU, + sect: ZU, + semi: JU, + seswar: _U, + setminus: $U, + setmn: eq, + sext: tq, + Sfr: nq, + sfr: rq, + sfrown: oq, + sharp: sq, + SHCHcy: iq, + shchcy: lq, + SHcy: cq, + shcy: aq, + ShortDownArrow: uq, + ShortLeftArrow: fq, + shortmid: dq, + shortparallel: pq, + ShortRightArrow: hq, + ShortUpArrow: gq, + shy: mq, + Sigma: vq, + sigma: yq, + sigmaf: wq, + sigmav: Aq, + sim: xq, + simdot: Eq, + sime: Sq, + simeq: Cq, + simg: kq, + simgE: Dq, + siml: bq, + simlE: Rq, + simne: Tq, + simplus: Iq, + simrarr: Nq, + slarr: Lq, + SmallCircle: Oq, + smallsetminus: jq, + smashp: Pq, + smeparsl: Mq, + smid: Hq, + smile: Bq, + smt: Fq, + smte: Uq, + smtes: qq, + SOFTcy: Qq, + softcy: Vq, + solbar: Wq, + solb: Yq, + sol: Gq, + Sopf: zq, + sopf: Xq, + spades: Kq, + spadesuit: Zq, + spar: Jq, + sqcap: _q, + sqcaps: $q, + sqcup: eQ, + sqcups: tQ, + Sqrt: nQ, + sqsub: rQ, + sqsube: oQ, + sqsubset: sQ, + sqsubseteq: iQ, + sqsup: lQ, + sqsupe: cQ, + sqsupset: aQ, + sqsupseteq: uQ, + square: fQ, + Square: dQ, + SquareIntersection: pQ, + SquareSubset: hQ, + SquareSubsetEqual: gQ, + SquareSuperset: mQ, + SquareSupersetEqual: vQ, + SquareUnion: yQ, + squarf: wQ, + squ: AQ, + squf: xQ, + srarr: EQ, + Sscr: SQ, + sscr: CQ, + ssetmn: kQ, + ssmile: DQ, + sstarf: bQ, + Star: RQ, + star: TQ, + starf: IQ, + straightepsilon: NQ, + straightphi: LQ, + strns: OQ, + sub: jQ, + Sub: PQ, + subdot: MQ, + subE: HQ, + sube: BQ, + subedot: FQ, + submult: UQ, + subnE: qQ, + subne: QQ, + subplus: VQ, + subrarr: WQ, + subset: YQ, + Subset: GQ, + subseteq: zQ, + subseteqq: XQ, + SubsetEqual: KQ, + subsetneq: ZQ, + subsetneqq: JQ, + subsim: _Q, + subsub: $Q, + subsup: eV, + succapprox: tV, + succ: nV, + succcurlyeq: rV, + Succeeds: oV, + SucceedsEqual: sV, + SucceedsSlantEqual: iV, + SucceedsTilde: lV, + succeq: cV, + succnapprox: aV, + succneqq: uV, + succnsim: fV, + succsim: dV, + SuchThat: pV, + sum: hV, + Sum: gV, + sung: mV, + sup1: vV, + sup2: yV, + sup3: wV, + sup: AV, + Sup: xV, + supdot: EV, + supdsub: SV, + supE: CV, + supe: kV, + supedot: DV, + Superset: bV, + SupersetEqual: RV, + suphsol: TV, + suphsub: IV, + suplarr: NV, + supmult: LV, + supnE: OV, + supne: jV, + supplus: PV, + supset: MV, + Supset: HV, + supseteq: BV, + supseteqq: FV, + supsetneq: UV, + supsetneqq: qV, + supsim: QV, + supsub: VV, + supsup: WV, + swarhk: YV, + swarr: GV, + swArr: zV, + swarrow: XV, + swnwar: KV, + szlig: ZV, + Tab: JV, + target: _V, + Tau: $V, + tau: eW, + tbrk: tW, + Tcaron: nW, + tcaron: rW, + Tcedil: oW, + tcedil: sW, + Tcy: iW, + tcy: lW, + tdot: cW, + telrec: aW, + Tfr: uW, + tfr: fW, + there4: dW, + therefore: pW, + Therefore: hW, + Theta: gW, + theta: mW, + thetasym: vW, + thetav: yW, + thickapprox: wW, + thicksim: AW, + ThickSpace: xW, + ThinSpace: EW, + thinsp: SW, + thkap: CW, + thksim: kW, + THORN: DW, + thorn: bW, + tilde: RW, + Tilde: TW, + TildeEqual: IW, + TildeFullEqual: NW, + TildeTilde: LW, + timesbar: OW, + timesb: jW, + times: PW, + timesd: MW, + tint: HW, + toea: BW, + topbot: FW, + topcir: UW, + top: qW, + Topf: QW, + topf: VW, + topfork: WW, + tosa: YW, + tprime: GW, + trade: zW, + TRADE: XW, + triangle: KW, + triangledown: ZW, + triangleleft: JW, + trianglelefteq: _W, + triangleq: $W, + triangleright: eY, + trianglerighteq: tY, + tridot: nY, + trie: rY, + triminus: oY, + TripleDot: sY, + triplus: iY, + trisb: lY, + tritime: cY, + trpezium: aY, + Tscr: uY, + tscr: fY, + TScy: dY, + tscy: pY, + TSHcy: hY, + tshcy: gY, + Tstrok: mY, + tstrok: vY, + twixt: yY, + twoheadleftarrow: wY, + twoheadrightarrow: AY, + Uacute: xY, + uacute: EY, + uarr: SY, + Uarr: CY, + uArr: kY, + Uarrocir: DY, + Ubrcy: bY, + ubrcy: RY, + Ubreve: TY, + ubreve: IY, + Ucirc: NY, + ucirc: LY, + Ucy: OY, + ucy: jY, + udarr: PY, + Udblac: MY, + udblac: HY, + udhar: BY, + ufisht: FY, + Ufr: UY, + ufr: qY, + Ugrave: QY, + ugrave: VY, + uHar: WY, + uharl: YY, + uharr: GY, + uhblk: zY, + ulcorn: XY, + ulcorner: KY, + ulcrop: ZY, + ultri: JY, + Umacr: _Y, + umacr: $Y, + uml: eG, + UnderBar: tG, + UnderBrace: nG, + UnderBracket: rG, + UnderParenthesis: oG, + Union: sG, + UnionPlus: iG, + Uogon: lG, + uogon: cG, + Uopf: aG, + uopf: uG, + UpArrowBar: fG, + uparrow: dG, + UpArrow: pG, + Uparrow: hG, + UpArrowDownArrow: gG, + updownarrow: mG, + UpDownArrow: vG, + Updownarrow: yG, + UpEquilibrium: wG, + upharpoonleft: AG, + upharpoonright: xG, + uplus: EG, + UpperLeftArrow: SG, + UpperRightArrow: CG, + upsi: kG, + Upsi: DG, + upsih: bG, + Upsilon: RG, + upsilon: TG, + UpTeeArrow: IG, + UpTee: NG, + upuparrows: LG, + urcorn: OG, + urcorner: jG, + urcrop: PG, + Uring: MG, + uring: HG, + urtri: BG, + Uscr: FG, + uscr: UG, + utdot: qG, + Utilde: QG, + utilde: VG, + utri: WG, + utrif: YG, + uuarr: GG, + Uuml: zG, + uuml: XG, + uwangle: KG, + vangrt: ZG, + varepsilon: JG, + varkappa: _G, + varnothing: $G, + varphi: ez, + varpi: tz, + varpropto: nz, + varr: rz, + vArr: oz, + varrho: sz, + varsigma: iz, + varsubsetneq: lz, + varsubsetneqq: cz, + varsupsetneq: az, + varsupsetneqq: uz, + vartheta: fz, + vartriangleleft: dz, + vartriangleright: pz, + vBar: hz, + Vbar: gz, + vBarv: mz, + Vcy: vz, + vcy: yz, + vdash: wz, + vDash: Az, + Vdash: xz, + VDash: Ez, + Vdashl: Sz, + veebar: Cz, + vee: kz, + Vee: Dz, + veeeq: bz, + vellip: Rz, + verbar: Tz, + Verbar: Iz, + vert: Nz, + Vert: Lz, + VerticalBar: Oz, + VerticalLine: jz, + VerticalSeparator: Pz, + VerticalTilde: Mz, + VeryThinSpace: Hz, + Vfr: Bz, + vfr: Fz, + vltri: Uz, + vnsub: qz, + vnsup: Qz, + Vopf: Vz, + vopf: Wz, + vprop: Yz, + vrtri: Gz, + Vscr: zz, + vscr: Xz, + vsubnE: Kz, + vsubne: Zz, + vsupnE: Jz, + vsupne: _z, + Vvdash: $z, + vzigzag: eX, + Wcirc: tX, + wcirc: nX, + wedbar: rX, + wedge: oX, + Wedge: sX, + wedgeq: iX, + weierp: lX, + Wfr: cX, + wfr: aX, + Wopf: uX, + wopf: fX, + wp: dX, + wr: pX, + wreath: hX, + Wscr: gX, + wscr: mX, + xcap: vX, + xcirc: yX, + xcup: wX, + xdtri: AX, + Xfr: xX, + xfr: EX, + xharr: SX, + xhArr: CX, + Xi: kX, + xi: DX, + xlarr: bX, + xlArr: RX, + xmap: TX, + xnis: IX, + xodot: NX, + Xopf: LX, + xopf: OX, + xoplus: jX, + xotime: PX, + xrarr: MX, + xrArr: HX, + Xscr: BX, + xscr: FX, + xsqcup: UX, + xuplus: qX, + xutri: QX, + xvee: VX, + xwedge: WX, + Yacute: YX, + yacute: GX, + YAcy: zX, + yacy: XX, + Ycirc: KX, + ycirc: ZX, + Ycy: JX, + ycy: _X, + yen: $X, + Yfr: eK, + yfr: tK, + YIcy: nK, + yicy: rK, + Yopf: oK, + yopf: sK, + Yscr: iK, + yscr: lK, + YUcy: cK, + yucy: aK, + yuml: uK, + Yuml: fK, + Zacute: dK, + zacute: pK, + Zcaron: hK, + zcaron: gK, + Zcy: mK, + zcy: vK, + Zdot: yK, + zdot: wK, + zeetrf: AK, + ZeroWidthSpace: xK, + Zeta: EK, + zeta: SK, + zfr: CK, + Zfr: kK, + ZHcy: DK, + zhcy: bK, + zigrarr: RK, + zopf: TK, + Zopf: IK, + Zscr: NK, + zscr: LK, + zwj: OK, + zwnj: jK + }, + PK = 'Á', + MK = 'á', + HK = 'Â', + BK = 'â', + FK = '´', + UK = 'Æ', + qK = 'æ', + QK = 'À', + VK = 'à', + WK = '&', + YK = '&', + GK = 'Å', + zK = 'å', + XK = 'Ã', + KK = 'ã', + ZK = 'Ä', + JK = 'ä', + _K = '¦', + $K = 'Ç', + eZ = 'ç', + tZ = '¸', + nZ = '¢', + rZ = '©', + oZ = '©', + sZ = '¤', + iZ = '°', + lZ = '÷', + cZ = 'É', + aZ = 'é', + uZ = 'Ê', + fZ = 'ê', + dZ = 'È', + pZ = 'è', + hZ = 'Ð', + gZ = 'ð', + mZ = 'Ë', + vZ = 'ë', + yZ = '½', + wZ = '¼', + AZ = '¾', + xZ = '>', + EZ = '>', + SZ = 'Í', + CZ = 'í', + kZ = 'Î', + DZ = 'î', + bZ = '¡', + RZ = 'Ì', + TZ = 'ì', + IZ = '¿', + NZ = 'Ï', + LZ = 'ï', + OZ = '«', + jZ = '<', + PZ = '<', + MZ = '¯', + HZ = 'µ', + BZ = '·', + FZ = ' ', + UZ = '¬', + qZ = 'Ñ', + QZ = 'ñ', + VZ = 'Ó', + WZ = 'ó', + YZ = 'Ô', + GZ = 'ô', + zZ = 'Ò', + XZ = 'ò', + KZ = 'ª', + ZZ = 'º', + JZ = 'Ø', + _Z = 'ø', + $Z = 'Õ', + eJ = 'õ', + tJ = 'Ö', + nJ = 'ö', + rJ = '¶', + oJ = '±', + sJ = '£', + iJ = '"', + lJ = '"', + cJ = '»', + aJ = '®', + uJ = '®', + fJ = '§', + dJ = '­', + pJ = '¹', + hJ = '²', + gJ = '³', + mJ = 'ß', + vJ = 'Þ', + yJ = 'þ', + wJ = '×', + AJ = 'Ú', + xJ = 'ú', + EJ = 'Û', + SJ = 'û', + CJ = 'Ù', + kJ = 'ù', + DJ = '¨', + bJ = 'Ü', + RJ = 'ü', + TJ = 'Ý', + IJ = 'ý', + NJ = '¥', + LJ = 'ÿ', + OJ = { + Aacute: PK, + aacute: MK, + Acirc: HK, + acirc: BK, + acute: FK, + AElig: UK, + aelig: qK, + Agrave: QK, + agrave: VK, + amp: WK, + AMP: YK, + Aring: GK, + aring: zK, + Atilde: XK, + atilde: KK, + Auml: ZK, + auml: JK, + brvbar: _K, + Ccedil: $K, + ccedil: eZ, + cedil: tZ, + cent: nZ, + copy: rZ, + COPY: oZ, + curren: sZ, + deg: iZ, + divide: lZ, + Eacute: cZ, + eacute: aZ, + Ecirc: uZ, + ecirc: fZ, + Egrave: dZ, + egrave: pZ, + ETH: hZ, + eth: gZ, + Euml: mZ, + euml: vZ, + frac12: yZ, + frac14: wZ, + frac34: AZ, + gt: xZ, + GT: EZ, + Iacute: SZ, + iacute: CZ, + Icirc: kZ, + icirc: DZ, + iexcl: bZ, + Igrave: RZ, + igrave: TZ, + iquest: IZ, + Iuml: NZ, + iuml: LZ, + laquo: OZ, + lt: jZ, + LT: PZ, + macr: MZ, + micro: HZ, + middot: BZ, + nbsp: FZ, + not: UZ, + Ntilde: qZ, + ntilde: QZ, + Oacute: VZ, + oacute: WZ, + Ocirc: YZ, + ocirc: GZ, + Ograve: zZ, + ograve: XZ, + ordf: KZ, + ordm: ZZ, + Oslash: JZ, + oslash: _Z, + Otilde: $Z, + otilde: eJ, + Ouml: tJ, + ouml: nJ, + para: rJ, + plusmn: oJ, + pound: sJ, + quot: iJ, + QUOT: lJ, + raquo: cJ, + reg: aJ, + REG: uJ, + sect: fJ, + shy: dJ, + sup1: pJ, + sup2: hJ, + sup3: gJ, + szlig: mJ, + THORN: vJ, + thorn: yJ, + times: wJ, + Uacute: AJ, + uacute: xJ, + Ucirc: EJ, + ucirc: SJ, + Ugrave: CJ, + ugrave: kJ, + uml: DJ, + Uuml: bJ, + uuml: RJ, + Yacute: TJ, + yacute: IJ, + yen: NJ, + yuml: LJ + }, + jJ = '&', + PJ = "'", + MJ = '>', + HJ = '<', + BJ = '"', + Qp = { amp: jJ, apos: PJ, gt: MJ, lt: HJ, quot: BJ } + var Wc = {} + const FJ = { + 0: 65533, + 128: 8364, + 130: 8218, + 131: 402, + 132: 8222, + 133: 8230, + 134: 8224, + 135: 8225, + 136: 710, + 137: 8240, + 138: 352, + 139: 8249, + 140: 338, + 142: 381, + 145: 8216, + 146: 8217, + 147: 8220, + 148: 8221, + 149: 8226, + 150: 8211, + 151: 8212, + 152: 732, + 153: 8482, + 154: 353, + 155: 8250, + 156: 339, + 158: 382, + 159: 376 + } + var UJ = + (Kn && Kn.__importDefault) || + function (e) { + return e && e.__esModule ? e : { default: e } + } + Object.defineProperty(Wc, '__esModule', { value: !0 }) + var _u = UJ(FJ), + qJ = + String.fromCodePoint || + function (e) { + var t = '' + return ( + e > 65535 && + ((e -= 65536), + (t += String.fromCharCode(((e >>> 10) & 1023) | 55296)), + (e = 56320 | (e & 1023))), + (t += String.fromCharCode(e)), + t + ) + } + function QJ(e) { + return (e >= 55296 && e <= 57343) || e > 1114111 + ? '�' + : (e in _u.default && (e = _u.default[e]), qJ(e)) + } + Wc.default = QJ + var Us = + (Kn && Kn.__importDefault) || + function (e) { + return e && e.__esModule ? e : { default: e } + } + Object.defineProperty(Et, '__esModule', { value: !0 }) + Et.decodeHTML = Et.decodeHTMLStrict = Et.decodeXML = void 0 + var Ol = Us(qp), + VJ = Us(OJ), + WJ = Us(Qp), + $u = Us(Wc), + YJ = /&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g + Et.decodeXML = Vp(WJ.default) + Et.decodeHTMLStrict = Vp(Ol.default) + function Vp(e) { + var t = Wp(e) + return function (n) { + return String(n).replace(YJ, t) + } + } + var ef = function (e, t) { + return e < t ? 1 : -1 + } + Et.decodeHTML = (function () { + for ( + var e = Object.keys(VJ.default).sort(ef), + t = Object.keys(Ol.default).sort(ef), + n = 0, + r = 0; + n < t.length; + n++ + ) + e[r] === t[n] ? ((t[n] += ';?'), r++) : (t[n] += ';') + var o = new RegExp('&(?:' + t.join('|') + '|#[xX][\\da-fA-F]+;?|#\\d+;?)', 'g'), + s = Wp(Ol.default) + function i(l) { + return l.substr(-1) !== ';' && (l += ';'), s(l) + } + return function (l) { + return String(l).replace(o, i) + } + })() + function Wp(e) { + return function (n) { + if (n.charAt(1) === '#') { + var r = n.charAt(2) + return r === 'X' || r === 'x' + ? $u.default(parseInt(n.substr(3), 16)) + : $u.default(parseInt(n.substr(2), 10)) + } + return e[n.slice(1, -1)] || n + } + } + var Oe = {}, + Yp = + (Kn && Kn.__importDefault) || + function (e) { + return e && e.__esModule ? e : { default: e } + } + Object.defineProperty(Oe, '__esModule', { value: !0 }) + Oe.escapeUTF8 = Oe.escape = Oe.encodeNonAsciiHTML = Oe.encodeHTML = Oe.encodeXML = void 0 + var GJ = Yp(Qp), + Gp = Xp(GJ.default), + zp = Kp(Gp) + Oe.encodeXML = _p(Gp) + var zJ = Yp(qp), + Yc = Xp(zJ.default), + XJ = Kp(Yc) + Oe.encodeHTML = ZJ(Yc, XJ) + Oe.encodeNonAsciiHTML = _p(Yc) + function Xp(e) { + return Object.keys(e) + .sort() + .reduce(function (t, n) { + return (t[e[n]] = '&' + n + ';'), t + }, {}) + } + function Kp(e) { + for (var t = [], n = [], r = 0, o = Object.keys(e); r < o.length; r++) { + var s = o[r] + s.length === 1 ? t.push('\\' + s) : n.push(s) + } + t.sort() + for (var i = 0; i < t.length - 1; i++) { + for (var l = i; l < t.length - 1 && t[l].charCodeAt(1) + 1 === t[l + 1].charCodeAt(1); ) + l += 1 + var c = 1 + l - i + c < 3 || t.splice(i, c, t[i] + '-' + t[l]) + } + return n.unshift('[' + t.join('') + ']'), new RegExp(n.join('|'), 'g') + } + var Zp = + /(?:[\x80-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, + KJ = + String.prototype.codePointAt != null + ? function (e) { + return e.codePointAt(0) + } + : function (e) { + return (e.charCodeAt(0) - 55296) * 1024 + e.charCodeAt(1) - 56320 + 65536 + } + function qs(e) { + return '&#x' + (e.length > 1 ? KJ(e) : e.charCodeAt(0)).toString(16).toUpperCase() + ';' + } + function ZJ(e, t) { + return function (n) { + return n + .replace(t, function (r) { + return e[r] + }) + .replace(Zp, qs) + } + } + var Jp = new RegExp(zp.source + '|' + Zp.source, 'g') + function JJ(e) { + return e.replace(Jp, qs) + } + Oe.escape = JJ + function _J(e) { + return e.replace(zp, qs) + } + Oe.escapeUTF8 = _J + function _p(e) { + return function (t) { + return t.replace(Jp, function (n) { + return e[n] || qs(n) + }) + } + } + ;(function (e) { + Object.defineProperty(e, '__esModule', { value: !0 }), + (e.decodeXMLStrict = + e.decodeHTML5Strict = + e.decodeHTML4Strict = + e.decodeHTML5 = + e.decodeHTML4 = + e.decodeHTMLStrict = + e.decodeHTML = + e.decodeXML = + e.encodeHTML5 = + e.encodeHTML4 = + e.escapeUTF8 = + e.escape = + e.encodeNonAsciiHTML = + e.encodeHTML = + e.encodeXML = + e.encode = + e.decodeStrict = + e.decode = + void 0) + var t = Et, + n = Oe + function r(c, a) { + return (!a || a <= 0 ? t.decodeXML : t.decodeHTML)(c) + } + e.decode = r + function o(c, a) { + return (!a || a <= 0 ? t.decodeXML : t.decodeHTMLStrict)(c) + } + e.decodeStrict = o + function s(c, a) { + return (!a || a <= 0 ? n.encodeXML : n.encodeHTML)(c) + } + e.encode = s + var i = Oe + Object.defineProperty(e, 'encodeXML', { + enumerable: !0, + get: function () { + return i.encodeXML + } + }), + Object.defineProperty(e, 'encodeHTML', { + enumerable: !0, + get: function () { + return i.encodeHTML + } + }), + Object.defineProperty(e, 'encodeNonAsciiHTML', { + enumerable: !0, + get: function () { + return i.encodeNonAsciiHTML + } + }), + Object.defineProperty(e, 'escape', { + enumerable: !0, + get: function () { + return i.escape + } + }), + Object.defineProperty(e, 'escapeUTF8', { + enumerable: !0, + get: function () { + return i.escapeUTF8 + } + }), + Object.defineProperty(e, 'encodeHTML4', { + enumerable: !0, + get: function () { + return i.encodeHTML + } + }), + Object.defineProperty(e, 'encodeHTML5', { + enumerable: !0, + get: function () { + return i.encodeHTML + } + }) + var l = Et + Object.defineProperty(e, 'decodeXML', { + enumerable: !0, + get: function () { + return l.decodeXML + } + }), + Object.defineProperty(e, 'decodeHTML', { + enumerable: !0, + get: function () { + return l.decodeHTML + } + }), + Object.defineProperty(e, 'decodeHTMLStrict', { + enumerable: !0, + get: function () { + return l.decodeHTMLStrict + } + }), + Object.defineProperty(e, 'decodeHTML4', { + enumerable: !0, + get: function () { + return l.decodeHTML + } + }), + Object.defineProperty(e, 'decodeHTML5', { + enumerable: !0, + get: function () { + return l.decodeHTML + } + }), + Object.defineProperty(e, 'decodeHTML4Strict', { + enumerable: !0, + get: function () { + return l.decodeHTMLStrict + } + }), + Object.defineProperty(e, 'decodeHTML5Strict', { + enumerable: !0, + get: function () { + return l.decodeHTMLStrict + } + }), + Object.defineProperty(e, 'decodeXMLStrict', { + enumerable: !0, + get: function () { + return l.decodeXML + } + }) + })(Up) + function $J(e, t) { + if (!(e instanceof t)) throw new TypeError('Cannot call a class as a function') + } + function tf(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n] + ;(r.enumerable = r.enumerable || !1), + (r.configurable = !0), + 'value' in r && (r.writable = !0), + Object.defineProperty(e, r.key, r) + } + } + function e_(e, t, n) { + return t && tf(e.prototype, t), n && tf(e, n), e + } + function $p(e, t) { + var n = (typeof Symbol < 'u' && e[Symbol.iterator]) || e['@@iterator'] + if (!n) { + if (Array.isArray(e) || (n = t_(e)) || (t && e && typeof e.length == 'number')) { + n && (e = n) + var r = 0, + o = function () {} + return { + s: o, + n: function () { + return r >= e.length ? { done: !0 } : { done: !1, value: e[r++] } + }, + e: function (a) { + throw a + }, + f: o + } + } + throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`) + } + var s = !0, + i = !1, + l + return { + s: function () { + n = n.call(e) + }, + n: function () { + var a = n.next() + return (s = a.done), a + }, + e: function (a) { + ;(i = !0), (l = a) + }, + f: function () { + try { + !s && n.return != null && n.return() + } finally { + if (i) throw l + } + } + } + } + function t_(e, t) { + if (e) { + if (typeof e == 'string') return nf(e, t) + var n = Object.prototype.toString.call(e).slice(8, -1) + if ( + (n === 'Object' && e.constructor && (n = e.constructor.name), + n === 'Map' || n === 'Set') + ) + return Array.from(e) + if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return nf(e, t) + } + } + function nf(e, t) { + ;(t == null || t > e.length) && (t = e.length) + for (var n = 0, r = new Array(t); n < t; n++) r[n] = e[n] + return r + } + var n_ = Up, + rf = { fg: '#FFF', bg: '#000', newline: !1, escapeXML: !1, stream: !1, colors: r_() } + function r_() { + var e = { + 0: '#000', + 1: '#A00', + 2: '#0A0', + 3: '#A50', + 4: '#00A', + 5: '#A0A', + 6: '#0AA', + 7: '#AAA', + 8: '#555', + 9: '#F55', + 10: '#5F5', + 11: '#FF5', + 12: '#55F', + 13: '#F5F', + 14: '#5FF', + 15: '#FFF' + } + return ( + To(0, 5).forEach(function (t) { + To(0, 5).forEach(function (n) { + To(0, 5).forEach(function (r) { + return o_(t, n, r, e) + }) + }) + }), + To(0, 23).forEach(function (t) { + var n = t + 232, + r = e1(t * 10 + 8) + e[n] = '#' + r + r + r + }), + e + ) + } + function o_(e, t, n, r) { + var o = 16 + e * 36 + t * 6 + n, + s = e > 0 ? e * 40 + 55 : 0, + i = t > 0 ? t * 40 + 55 : 0, + l = n > 0 ? n * 40 + 55 : 0 + r[o] = s_([s, i, l]) + } + function e1(e) { + for (var t = e.toString(16); t.length < 2; ) t = '0' + t + return t + } + function s_(e) { + var t = [], + n = $p(e), + r + try { + for (n.s(); !(r = n.n()).done; ) { + var o = r.value + t.push(e1(o)) + } + } catch (s) { + n.e(s) + } finally { + n.f() + } + return '#' + t.join('') + } + function of(e, t, n, r) { + var o + return ( + t === 'text' + ? (o = a_(n, r)) + : t === 'display' + ? (o = l_(e, n, r)) + : t === 'xterm256Foreground' + ? (o = Yo(e, r.colors[n])) + : t === 'xterm256Background' + ? (o = Go(e, r.colors[n])) + : t === 'rgb' && (o = i_(e, n)), + o + ) + } + function i_(e, t) { + t = t.substring(2).slice(0, -1) + var n = +t.substr(0, 2), + r = t.substring(5).split(';'), + o = r + .map(function (s) { + return ('0' + Number(s).toString(16)).substr(-2) + }) + .join('') + return Wo(e, (n === 38 ? 'color:#' : 'background-color:#') + o) + } + function l_(e, t, n) { + t = parseInt(t, 10) + var r = { + '-1': function () { + return '
' + }, + 0: function () { + return e.length && t1(e) + }, + 1: function () { + return Ut(e, 'b') + }, + 3: function () { + return Ut(e, 'i') + }, + 4: function () { + return Ut(e, 'u') + }, + 8: function () { + return Wo(e, 'display:none') + }, + 9: function () { + return Ut(e, 'strike') + }, + 22: function () { + return Wo(e, 'font-weight:normal;text-decoration:none;font-style:normal') + }, + 23: function () { + return lf(e, 'i') + }, + 24: function () { + return lf(e, 'u') + }, + 39: function () { + return Yo(e, n.fg) + }, + 49: function () { + return Go(e, n.bg) + }, + 53: function () { + return Wo(e, 'text-decoration:overline') + } + }, + o + return ( + r[t] + ? (o = r[t]()) + : 4 < t && t < 7 + ? (o = Ut(e, 'blink')) + : 29 < t && t < 38 + ? (o = Yo(e, n.colors[t - 30])) + : 39 < t && t < 48 + ? (o = Go(e, n.colors[t - 40])) + : 89 < t && t < 98 + ? (o = Yo(e, n.colors[8 + (t - 90)])) + : 99 < t && t < 108 && (o = Go(e, n.colors[8 + (t - 100)])), + o + ) + } + function t1(e) { + var t = e.slice(0) + return ( + (e.length = 0), + t + .reverse() + .map(function (n) { + return '' + }) + .join('') + ) + } + function To(e, t) { + for (var n = [], r = e; r <= t; r++) n.push(r) + return n + } + function c_(e) { + return function (t) { + return (e === null || t.category !== e) && e !== 'all' + } + } + function sf(e) { + e = parseInt(e, 10) + var t = null + return ( + e === 0 + ? (t = 'all') + : e === 1 + ? (t = 'bold') + : 2 < e && e < 5 + ? (t = 'underline') + : 4 < e && e < 7 + ? (t = 'blink') + : e === 8 + ? (t = 'hide') + : e === 9 + ? (t = 'strike') + : (29 < e && e < 38) || e === 39 || (89 < e && e < 98) + ? (t = 'foreground-color') + : ((39 < e && e < 48) || e === 49 || (99 < e && e < 108)) && + (t = 'background-color'), + t + ) + } + function a_(e, t) { + return t.escapeXML ? n_.encodeXML(e) : e + } + function Ut(e, t, n) { + return ( + n || (n = ''), e.push(t), '<'.concat(t).concat(n ? ' style="'.concat(n, '"') : '', '>') + ) + } + function Wo(e, t) { + return Ut(e, 'span', t) + } + function Yo(e, t) { + return Ut(e, 'span', 'color:' + t) + } + function Go(e, t) { + return Ut(e, 'span', 'background-color:' + t) + } + function lf(e, t) { + var n + if ((e.slice(-1)[0] === t && (n = e.pop()), n)) return '' + } + function u_(e, t, n) { + var r = !1, + o = 3 + function s() { + return '' + } + function i(C, A) { + return n('xterm256Foreground', A), '' + } + function l(C, A) { + return n('xterm256Background', A), '' + } + function c(C) { + return t.newline ? n('display', -1) : n('text', C), '' + } + function a(C, A) { + ;(r = !0), A.trim().length === 0 && (A = '0'), (A = A.trimRight(';').split(';')) + var S = $p(A), + k + try { + for (S.s(); !(k = S.n()).done; ) { + var b = k.value + n('display', b) + } + } catch (D) { + S.e(D) + } finally { + S.f() + } + return '' + } + function p(C) { + return n('text', C), '' + } + function y(C) { + return n('rgb', C), '' + } + var h = [ + { pattern: /^\x08+/, sub: s }, + { pattern: /^\x1b\[[012]?K/, sub: s }, + { pattern: /^\x1b\[\(B/, sub: s }, + { pattern: /^\x1b\[[34]8;2;\d+;\d+;\d+m/, sub: y }, + { pattern: /^\x1b\[38;5;(\d+)m/, sub: i }, + { pattern: /^\x1b\[48;5;(\d+)m/, sub: l }, + { pattern: /^\n/, sub: c }, + { pattern: /^\r+\n/, sub: c }, + { pattern: /^\r/, sub: c }, + { pattern: /^\x1b\[((?:\d{1,3};?)+|)m/, sub: a }, + { pattern: /^\x1b\[\d?J/, sub: s }, + { pattern: /^\x1b\[\d{0,3};\d{0,3}f/, sub: s }, + { pattern: /^\x1b\[?[\d;]{0,3}/, sub: s }, + { pattern: /^(([^\x1b\x08\r\n])+)/, sub: p } + ] + function x(C, A) { + ;(A > o && r) || ((r = !1), (e = e.replace(C.pattern, C.sub))) + } + var E = [], + g = e, + v = g.length + e: for (; v > 0; ) { + for (var u = 0, f = 0, d = h.length; f < d; u = ++f) { + var w = h[u] + if ((x(w, u), e.length !== v)) { + v = e.length + continue e + } + } + if (e.length === v) break + E.push(0), (v = e.length) + } + return E + } + function f_(e, t, n) { + return ( + t !== 'text' && + ((e = e.filter(c_(sf(n)))), e.push({ token: t, data: n, category: sf(n) })), + e + ) + } + var d_ = (function () { + function e(t) { + $J(this, e), + (t = t || {}), + t.colors && (t.colors = Object.assign({}, rf.colors, t.colors)), + (this.options = Object.assign({}, rf, t)), + (this.stack = []), + (this.stickyStack = []) + } + return ( + e_(e, [ + { + key: 'toHtml', + value: function (n) { + var r = this + n = typeof n == 'string' ? [n] : n + var o = this.stack, + s = this.options, + i = [] + return ( + this.stickyStack.forEach(function (l) { + var c = of(o, l.token, l.data, s) + c && i.push(c) + }), + u_(n.join(''), s, function (l, c) { + var a = of(o, l, c, s) + a && i.push(a), s.stream && (r.stickyStack = f_(r.stickyStack, l, c)) + }), + o.length && i.push(t1(o)), + i.join('') + ) + } + } + ]), + e + ) + })(), + p_ = d_ + const h_ = cf(p_), + Gc = ({ error: e }) => { + const t = U.useMemo(() => { + const n = { bg: 'var(--color-canvas-subtle)', fg: 'var(--color-fg-default)' } + return (n.colors = g_), new h_(n).toHtml(m_(e)) + }, [e]) + return m.jsx('div', { + className: 'test-error-message', + dangerouslySetInnerHTML: { __html: t || '' } + }) + }, + g_ = { + 0: '#000', + 1: '#C00', + 2: '#0C0', + 3: '#C50', + 4: '#00C', + 5: '#C0C', + 6: '#0CC', + 7: '#CCC', + 8: '#555', + 9: '#F55', + 10: '#5F5', + 11: '#FF5', + 12: '#55F', + 13: '#F5F', + 14: '#5FF', + 15: '#FFF' + } + function m_(e) { + return e.replace( + /[&"<>]/g, + (t) => ({ '&': '&', '"': '"', '<': '<', '>': '>' })[t] + ) + } + function v_(e) { + var n + const t = new Map() + for (const r of e) { + const o = r.name.match(/^(.*)-(expected|actual|diff|previous)(\.[^.]+)?$/) + if (!o) continue + const [, s, i, l = ''] = o, + c = s + l + let a = t.get(c) + a || ((a = { name: c }), t.set(c, a)), + i === 'actual' && (a.actual = { attachment: r }), + i === 'expected' && (a.expected = { attachment: r, title: 'Expected' }), + i === 'previous' && (a.expected = { attachment: r, title: 'Previous' }), + i === 'diff' && (a.diff = { attachment: r }) + } + for (const [r, o] of t) + !o.actual || !o.expected + ? t.delete(r) + : (e.delete(o.actual.attachment), + e.delete(o.expected.attachment), + e.delete((n = o.diff) == null ? void 0 : n.attachment)) + return [...t.values()] + } + const y_ = ({ result: e, anchor: t }) => { + const { + screenshots: n, + videos: r, + traces: o, + otherAttachments: s, + diffs: i, + htmls: l + } = U.useMemo(() => { + const h = (e == null ? void 0 : e.attachments) || [], + x = new Set(h.filter((d) => d.contentType.startsWith('image/'))), + E = h.filter((d) => d.name === 'video'), + g = h.filter((d) => d.name === 'trace'), + v = h.filter((d) => d.contentType.startsWith('text/html')), + u = new Set(h) + ;[...x, ...E, ...g, ...v].forEach((d) => u.delete(d)) + const f = v_(x) + return { + screenshots: [...x], + videos: E, + traces: g, + otherAttachments: u, + diffs: f, + htmls: v + } + }, [e]), + c = U.useRef(null), + a = U.useRef(null), + [p, y] = U.useState(!1) + return ( + U.useEffect(() => { + var h, x + p || + (y(!0), + t === 'video' && + ((h = c.current) == null || + h.scrollIntoView({ block: 'start', inline: 'start' })), + t === 'diff' && + ((x = a.current) == null || + x.scrollIntoView({ block: 'start', inline: 'start' }))) + }, [p, t, y, c]), + m.jsxs('div', { + className: 'test-result', + children: [ + !!e.errors.length && + m.jsx(Je, { + header: 'Errors', + children: e.errors.map((h, x) => + m.jsx(Gc, { error: h }, 'test-result-error-message-' + x) + ) + }), + !!e.steps.length && + m.jsx(Je, { + header: 'Test Steps', + children: e.steps.map((h, x) => m.jsx(n1, { step: h, depth: 0 }, `step-${x}`)) + }), + i.map((h, x) => + m.jsx( + Je, + { + header: `Image mismatch: ${h.name}`, + targetRef: a, + children: m.jsx(mv, { diff: h }, 'image-diff') + }, + `diff-${x}` + ) + ), + !!n.length && + m.jsx(Je, { + header: 'Screenshots', + children: n.map((h, x) => + m.jsxs( + 'div', + { + children: [ + m.jsx('a', { + href: h.path, + children: m.jsx('img', { className: 'screenshot', src: h.path }) + }), + m.jsx(mr, { attachment: h }) + ] + }, + `screenshot-${x}` + ) + ) + }), + !!o.length && + m.jsx(Je, { + header: 'Traces', + children: m.jsxs('div', { + children: [ + m.jsx('a', { + href: Hp(o), + children: m.jsx('img', { + className: 'screenshot', + src: dv, + style: { width: 192, height: 117, marginLeft: 20 } + }) + }), + o.map((h, x) => + m.jsx( + mr, + { + attachment: h, + linkName: o.length === 1 ? 'trace' : `trace-${x + 1}` + }, + `trace-${x}` + ) + ) + ] + }) + }), + !!r.length && + m.jsx(Je, { + header: 'Videos', + targetRef: c, + children: r.map((h, x) => + m.jsxs( + 'div', + { + children: [ + m.jsx('video', { + controls: !0, + children: m.jsx('source', { src: h.path, type: h.contentType }) + }), + m.jsx(mr, { attachment: h }) + ] + }, + `video-${x}` + ) + ) + }), + !!(s.size + l.length) && + m.jsxs(Je, { + header: 'Attachments', + children: [ + [...l].map((h, x) => + m.jsx(mr, { attachment: h, openInNewTab: !0 }, `html-link-${x}`) + ), + [...s].map((h, x) => m.jsx(mr, { attachment: h }, `attachment-link-${x}`)) + ] + }) + ] + }) + ) + }, + n1 = ({ step: e, depth: t }) => + m.jsx(jp, { + title: m.jsxs('span', { + children: [ + m.jsx('span', { style: { float: 'right' }, children: $r(e.duration) }), + _r(e.error || e.duration === -1 ? 'failed' : 'passed'), + m.jsx('span', { children: e.title }), + e.count > 1 && + m.jsxs(m.Fragment, { + children: [ + ' ✕ ', + m.jsx('span', { className: 'test-result-counter', children: e.count }) + ] + }), + e.location && + m.jsxs('span', { + className: 'test-result-path', + children: ['— ', e.location.file, ':', e.location.line] + }) + ] + }), + loadChildren: + e.steps.length + (e.snippet ? 1 : 0) + ? () => { + const n = e.steps.map((r, o) => m.jsx(n1, { step: r, depth: t + 1 }, o)) + return e.snippet && n.unshift(m.jsx(Gc, { error: e.snippet }, 'line')), n + } + : void 0, + depth: t + }), + w_ = ({ projectNames: e, test: t, run: n, anchor: r }) => { + const [o, s] = U.useState(n), + i = U.useMemo(() => { + if (t) return t.tags + }, [t]), + l = U.useMemo(() => { + var c + return ( + ((c = t == null ? void 0 : t.annotations) == null + ? void 0 + : c.filter((a) => !a.type.startsWith('_'))) || [] + ) + }, [t == null ? void 0 : t.annotations]) + return m.jsxs('div', { + className: 'test-case-column vbox', + children: [ + t && m.jsx('div', { className: 'test-case-path', children: t.path.join(' › ') }), + t && + m.jsx('div', { + className: 'test-case-title', + children: t == null ? void 0 : t.title + }), + t && + m.jsxs('div', { + className: 'hbox', + children: [ + m.jsxs('div', { + className: 'test-case-location', + children: [t.location.file, ':', t.location.line] + }), + m.jsx('div', { style: { flex: 'auto' } }), + m.jsx('div', { className: 'test-case-duration', children: $r(t.duration) }) + ] + }), + t && + (!!t.projectName || i) && + m.jsxs('div', { + className: 'test-case-project-labels-row', + children: [ + t && + !!t.projectName && + m.jsx(Mp, { projectNames: e, projectName: t.projectName }), + i && m.jsx(E_, { labels: i }) + ] + }), + !!l.length && + m.jsx(Je, { + header: 'Annotations', + children: l.map((c, a) => m.jsx(A_, { annotation: c }, a)) + }), + t && + m.jsx(fv, { + tabs: + t.results.map((c, a) => ({ + id: String(a), + title: m.jsxs('div', { + style: { display: 'flex', alignItems: 'center' }, + children: [_r(c.status), ' ', x_(a)] + }), + render: () => m.jsx(y_, { test: t, result: c, anchor: r }) + })) || [], + selectedTab: String(o), + setSelectedTab: (c) => s(+c) + }) + ] + }) + } + function A_({ annotation: { type: e, description: t } }) { + return m.jsxs('div', { + className: 'test-case-annotation', + children: [ + m.jsx('span', { style: { fontWeight: 'bold' }, children: e }), + t && m.jsxs('span', { children: [': ', Nl(t)] }) + ] + }) + } + function x_(e) { + return e ? `Retry #${e}` : 'Run' + } + const E_ = ({ labels: e }) => + e.length > 0 + ? m.jsx(m.Fragment, { + children: e.map((t) => + m.jsx( + 'a', + { + style: { textDecoration: 'none', color: 'var(--color-fg-default)' }, + href: `#?q=${t}`, + children: m.jsx('span', { + style: { margin: '6px 0 0 6px', cursor: 'pointer' }, + className: wn('label', 'label-color-' + Fp(t)), + children: t.slice(1) + }) + }, + t + ) + ) + }) + : null, + S_ = ({ file: e, report: t, isFileExpanded: n, setFileExpanded: r, filter: o }) => + m.jsx(Bp, { + expanded: n(e.fileId), + noInsets: !0, + setExpanded: (s) => r(e.fileId, s), + header: m.jsx('span', { children: e.fileName }), + children: e.tests + .filter((s) => o.matches(s)) + .map((s) => + m.jsxs( + 'div', + { + className: wn('test-file-test', 'test-file-test-outcome-' + s.outcome), + children: [ + m.jsxs('div', { + className: 'hbox', + style: { alignItems: 'flex-start' }, + children: [ + m.jsxs('div', { + className: 'hbox', + children: [ + m.jsx('span', { + className: 'test-file-test-status-icon', + children: _r(s.outcome) + }), + m.jsxs('span', { + children: [ + m.jsx($e, { + href: `#?testId=${s.testId}`, + title: [...s.path, s.title].join(' › '), + children: m.jsx('span', { + className: 'test-file-title', + children: [...s.path, s.title].join(' › ') + }) + }), + t.projectNames.length > 1 && + !!s.projectName && + m.jsx(Mp, { + projectNames: t.projectNames, + projectName: s.projectName + }), + m.jsx(b_, { labels: s.tags }) + ] + }) + ] + }), + m.jsx('span', { + 'data-testid': 'test-duration', + style: { minWidth: '50px', textAlign: 'right' }, + children: $r(s.duration) + }) + ] + }), + m.jsxs('div', { + className: 'test-file-details-row', + children: [ + m.jsx($e, { + href: `#?testId=${s.testId}`, + title: [...s.path, s.title].join(' › '), + className: 'test-file-path-link', + children: m.jsxs('span', { + className: 'test-file-path', + children: [s.location.file, ':', s.location.line] + }) + }), + C_(s), + k_(s), + D_(s) + ] + }) + ] + }, + `test-${s.testId}` + ) + ) + }) + function C_(e) { + const t = e.results.find((n) => + n.attachments.some( + (r) => r.contentType.startsWith('image/') && !!r.name.match(/-(expected|actual|diff)/) + ) + ) + return t + ? m.jsx($e, { + href: `#?testId=${e.testId}&anchor=diff&run=${e.results.indexOf(t)}`, + title: 'View images', + className: 'test-file-badge', + children: Ip() + }) + : void 0 + } + function k_(e) { + const t = e.results.find((n) => n.attachments.some((r) => r.name === 'video')) + return t + ? m.jsx($e, { + href: `#?testId=${e.testId}&anchor=video&run=${e.results.indexOf(t)}`, + title: 'View video', + className: 'test-file-badge', + children: Np() + }) + : void 0 + } + function D_(e) { + const t = e.results + .map((n) => n.attachments.filter((r) => r.name === 'trace')) + .filter((n) => n.length > 0)[0] + return t + ? m.jsx($e, { + href: Hp(t), + title: 'View trace', + className: 'test-file-badge', + children: Lp() + }) + : void 0 + } + const b_ = ({ labels: e }) => { + const t = (n, r) => { + var l + n.preventDefault() + const i = ( + ((l = new URLSearchParams(window.location.hash.slice(1)).get('q')) == null + ? void 0 + : l.toString()) || '' + ).split(' ') + Vc(ht(i, r, n.metaKey || n.ctrlKey)) + } + return e.length > 0 + ? m.jsx(m.Fragment, { + children: e.map((n) => + m.jsx( + 'span', + { + style: { margin: '6px 0 0 6px', cursor: 'pointer' }, + className: wn('label', 'label-color-' + Fp(n)), + onClick: (r) => t(r, n), + children: n.slice(1) + }, + n + ) + ) + }) + : null + }, + R_ = ({ + report: e, + filter: t, + expandedFiles: n, + setExpandedFiles: r, + projectNames: o, + filteredStats: s + }) => { + const i = U.useMemo(() => { + const l = [] + let c = 0 + for (const a of (e == null ? void 0 : e.files) || []) { + const p = a.tests.filter((y) => t.matches(y)) + ;(c += p.length), p.length && l.push({ file: a, defaultExpanded: c < 200 }) + } + return l + }, [e, t]) + return m.jsxs(m.Fragment, { + children: [ + m.jsxs('div', { + className: 'mt-2 mx-1', + style: { display: 'flex' }, + children: [ + o.length === 1 && + !!o[0] && + m.jsxs('div', { + 'data-testid': 'project-name', + style: { color: 'var(--color-fg-subtle)' }, + children: ['Project: ', o[0]] + }), + !t.empty() && + m.jsxs('div', { + 'data-testid': 'filtered-tests-count', + style: { color: 'var(--color-fg-subtle)', padding: '0 10px' }, + children: [ + 'Filtered: ', + s.total, + ' ', + !!s.total && '(' + $r(s.duration) + ')' + ] + }), + m.jsx('div', { style: { flex: 'auto' } }), + m.jsx('div', { + 'data-testid': 'overall-time', + style: { color: 'var(--color-fg-subtle)', marginRight: '10px' }, + children: e ? new Date(e.startTime).toLocaleString() : '' + }), + m.jsxs('div', { + 'data-testid': 'overall-duration', + style: { color: 'var(--color-fg-subtle)' }, + children: ['Total time: ', $r((e == null ? void 0 : e.duration) ?? 0)] + }) + ] + }), + e && + !!e.errors.length && + m.jsx(Je, { + header: 'Errors', + dataTestId: 'report-errors', + children: e.errors.map((l, c) => + m.jsx(Gc, { error: l }, 'test-report-error-message-' + c) + ) + }), + e && + i.map(({ file: l, defaultExpanded: c }) => + m.jsx( + S_, + { + report: e, + file: l, + isFileExpanded: (a) => { + const p = n.get(a) + return p === void 0 ? c : !!p + }, + setFileExpanded: (a, p) => { + const y = new Map(n) + y.set(a, p), r(y) + }, + filter: t + }, + `file-${l.fileId}` + ) + ) + ] + }) + }, + T_ = (e) => !e.has('testId'), + I_ = (e) => e.has('testId'), + N_ = ({ report: e }) => { + const t = new URLSearchParams(window.location.hash.slice(1)), + [n, r] = U.useState(new Map()), + [o, s] = U.useState(t.get('q') || ''), + i = U.useMemo(() => G2.parse(o), [o]), + l = U.useMemo(() => O_((e == null ? void 0 : e.json().files) || [], i), [e, i]) + return m.jsx('div', { + className: 'htmlreport vbox px-4 pb-4', + children: m.jsxs('main', { + children: [ + (e == null ? void 0 : e.json()) && + m.jsx(iv, { stats: e.json().stats, filterText: o, setFilterText: s }), + (e == null ? void 0 : e.json().metadata) && + m.jsx(av, { ...(e == null ? void 0 : e.json().metadata) }), + m.jsx(Ju, { + predicate: T_, + children: m.jsx(R_, { + report: e == null ? void 0 : e.json(), + filter: i, + expandedFiles: n, + setExpandedFiles: r, + projectNames: (e == null ? void 0 : e.json().projectNames) || [], + filteredStats: l + }) + }), + m.jsx(Ju, { predicate: I_, children: !!e && m.jsx(L_, { report: e }) }) + ] + }) + }) + }, + L_ = ({ report: e }) => { + const t = new URLSearchParams(window.location.hash.slice(1)), + [n, r] = U.useState(), + o = t.get('testId'), + s = t.get('anchor') || '', + i = +(t.get('run') || '0'), + l = U.useMemo(() => { + const c = new Map() + for (const a of e.json().files) for (const p of a.tests) c.set(p.testId, a.fileId) + return c + }, [e]) + return ( + U.useEffect(() => { + ;(async () => { + if (!o || o === (n == null ? void 0 : n.testId)) return + const c = l.get(o) + if (!c) return + const a = await e.entry(`${c}.json`) + for (const p of a.tests) + if (p.testId === o) { + r(p) + break + } + })() + }, [n, e, o, l]), + m.jsx(w_, { projectNames: e.json().projectNames, test: n, anchor: s, run: i }) + ) + } + function O_(e, t) { + const n = { total: 0, duration: 0 } + for (const r of e) { + const o = r.tests.filter((s) => t.matches(s)) + n.total += o.length + for (const s of o) n.duration += s.duration + } + return n + } + const j_ = + "data:image/svg+xml,%3csvg%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M136.444%20221.556C123.558%20225.213%20115.104%20231.625%20109.535%20238.032C114.869%20233.364%20122.014%20229.08%20131.652%20226.348C141.51%20223.554%20149.92%20223.574%20156.869%20224.915V219.481C150.941%20218.939%20144.145%20219.371%20136.444%20221.556ZM108.946%20175.876L61.0895%20188.484C61.0895%20188.484%2061.9617%20189.716%2063.5767%20191.36L104.153%20180.668C104.153%20180.668%20103.578%20188.077%2098.5847%20194.705C108.03%20187.559%20108.946%20175.876%20108.946%20175.876ZM149.005%20288.347C81.6582%20306.486%2046.0272%20228.438%2035.2396%20187.928C30.2556%20169.229%2028.0799%20155.067%2027.5%20145.928C27.4377%20144.979%2027.4665%20144.179%2027.5336%20143.446C24.04%20143.657%2022.3674%20145.473%2022.7077%20150.721C23.2876%20159.855%2025.4633%20174.016%2030.4473%20192.721C41.2301%20233.225%2076.8659%20311.273%20144.213%20293.134C158.872%20289.185%20169.885%20281.992%20178.152%20272.81C170.532%20279.692%20160.995%20285.112%20149.005%20288.347ZM161.661%20128.11V132.903H188.077C187.535%20131.206%20186.989%20129.677%20186.447%20128.11H161.661Z'%20fill='%232D4552'/%3e%3cpath%20d='M193.981%20167.584C205.861%20170.958%20212.144%20179.287%20215.465%20186.658L228.711%20190.42C228.711%20190.42%20226.904%20164.623%20203.57%20157.995C181.741%20151.793%20168.308%20170.124%20166.674%20172.496C173.024%20167.972%20182.297%20164.268%20193.981%20167.584ZM299.422%20186.777C277.573%20180.547%20264.145%20198.916%20262.535%20201.255C268.89%20196.736%20278.158%20193.031%20289.837%20196.362C301.698%20199.741%20307.976%20208.06%20311.307%20215.436L324.572%20219.212C324.572%20219.212%20322.736%20193.41%20299.422%20186.777ZM286.262%20254.795L176.072%20223.99C176.072%20223.99%20177.265%20230.038%20181.842%20237.869L274.617%20263.805C282.255%20259.386%20286.262%20254.795%20286.262%20254.795ZM209.867%20321.102C122.618%20297.71%20133.166%20186.543%20147.284%20133.865C153.097%20112.156%20159.073%2096.0203%20164.029%2085.204C161.072%2084.5953%20158.623%2086.1529%20156.203%2091.0746C150.941%20101.747%20144.212%20119.124%20137.7%20143.45C123.586%20196.127%20113.038%20307.29%20200.283%20330.682C241.406%20341.699%20273.442%20324.955%20297.323%20298.659C274.655%20319.19%20245.714%20330.701%20209.867%20321.102Z'%20fill='%232D4552'/%3e%3cpath%20d='M161.661%20262.296V239.863L99.3324%20257.537C99.3324%20257.537%20103.938%20230.777%20136.444%20221.556C146.302%20218.762%20154.713%20218.781%20161.661%20220.123V128.11H192.869C189.471%20117.61%20186.184%20109.526%20183.423%20103.909C178.856%2094.612%20174.174%20100.775%20163.545%20109.665C156.059%20115.919%20137.139%20129.261%20108.668%20136.933C80.1966%20144.61%2057.179%20142.574%2047.5752%20140.911C33.9601%20138.562%2026.8387%20135.572%2027.5049%20145.928C28.0847%20155.062%2030.2605%20169.224%2035.2445%20187.928C46.0272%20228.433%2081.663%20306.481%20149.01%20288.342C166.602%20283.602%20179.019%20274.233%20187.626%20262.291H161.661V262.296ZM61.0848%20188.484L108.946%20175.876C108.946%20175.876%20107.551%20194.288%2089.6087%20199.018C71.6614%20203.743%2061.0848%20188.484%2061.0848%20188.484Z'%20fill='%23E2574C'/%3e%3cpath%20d='M341.786%20129.174C329.345%20131.355%20299.498%20134.072%20262.612%20124.185C225.716%20114.304%20201.236%2097.0224%20191.537%2088.8994C177.788%2077.3834%20171.74%2069.3802%20165.788%2081.4857C160.526%2092.163%20153.797%20109.54%20147.284%20133.866C133.171%20186.543%20122.623%20297.706%20209.867%20321.098C297.093%20344.47%20343.53%20242.92%20357.644%20190.238C364.157%20165.917%20367.013%20147.5%20367.799%20135.625C368.695%20122.173%20359.455%20126.078%20341.786%20129.174ZM166.497%20172.756C166.497%20172.756%20180.246%20151.372%20203.565%20158C226.899%20164.628%20228.706%20190.425%20228.706%20190.425L166.497%20172.756ZM223.42%20268.713C182.403%20256.698%20176.077%20223.99%20176.077%20223.99L286.262%20254.796C286.262%20254.791%20264.021%20280.578%20223.42%20268.713ZM262.377%20201.495C262.377%20201.495%20276.107%20180.126%20299.422%20186.773C322.736%20193.411%20324.572%20219.208%20324.572%20219.208L262.377%20201.495Z'%20fill='%232EAD33'/%3e%3cpath%20d='M139.88%20246.04L99.3324%20257.532C99.3324%20257.532%20103.737%20232.44%20133.607%20222.496L110.647%20136.33L108.663%20136.933C80.1918%20144.611%2057.1742%20142.574%2047.5704%20140.911C33.9554%20138.563%2026.834%20135.572%2027.5001%20145.929C28.08%20155.063%2030.2557%20169.224%2035.2397%20187.929C46.0225%20228.433%2081.6583%20306.481%20149.005%20288.342L150.989%20287.719L139.88%20246.04ZM61.0848%20188.485L108.946%20175.876C108.946%20175.876%20107.551%20194.288%2089.6087%20199.018C71.6615%20203.743%2061.0848%20188.485%2061.0848%20188.485Z'%20fill='%23D65348'/%3e%3cpath%20d='M225.27%20269.163L223.415%20268.712C182.398%20256.698%20176.072%20223.99%20176.072%20223.99L232.89%20239.872L262.971%20124.281L262.607%20124.185C225.711%20114.304%20201.232%2097.0224%20191.532%2088.8994C177.783%2077.3834%20171.735%2069.3802%20165.783%2081.4857C160.526%2092.163%20153.797%20109.54%20147.284%20133.866C133.171%20186.543%20122.623%20297.706%20209.867%20321.097L211.655%20321.5L225.27%20269.163ZM166.497%20172.756C166.497%20172.756%20180.246%20151.372%20203.565%20158C226.899%20164.628%20228.706%20190.425%20228.706%20190.425L166.497%20172.756Z'%20fill='%231D8D22'/%3e%3cpath%20d='M141.946%20245.451L131.072%20248.537C133.641%20263.019%20138.169%20276.917%20145.276%20289.195C146.513%20288.922%20147.74%20288.687%20149%20288.342C152.302%20287.451%20155.364%20286.348%20158.312%20285.145C150.371%20273.361%20145.118%20259.789%20141.946%20245.451ZM137.7%20143.451C132.112%20164.307%20127.113%20194.326%20128.489%20224.436C130.952%20223.367%20133.554%20222.371%20136.444%20221.551L138.457%20221.101C136.003%20188.939%20141.308%20156.165%20147.284%20133.866C148.799%20128.225%20150.318%20122.978%20151.832%20118.085C149.393%20119.637%20146.767%20121.228%20143.776%20122.867C141.759%20129.093%20139.722%20135.898%20137.7%20143.451Z'%20fill='%23C04B41'/%3e%3c/svg%3e", + ki = qg, + zc = document.createElement('link') + zc.rel = 'shortcut icon' + zc.href = j_ + document.head.appendChild(zc) + const P_ = () => { + const [e, t] = U.useState() + return ( + U.useEffect(() => { + if (e) return + const n = new M_() + n.load().then(() => t(n)) + }, [e]), + m.jsx(N_, { report: e }) + ) + } + window.onload = () => { + kp(document.querySelector('#root')).render(m.jsx(P_, {})) + } + class M_ { + constructor() { + dt(this, '_entries', new Map()) + dt(this, '_json') + } + async load() { + const t = new ki.ZipReader(new ki.Data64URIReader(window.playwrightReportBase64), { + useWebWorkers: !1 + }) + for (const n of await t.getEntries()) this._entries.set(n.filename, n) + this._json = await this.entry('report.json') + } + json() { + return this._json + } + async entry(t) { + const n = this._entries.get(t), + r = new ki.TextWriter() + return await n.getData(r), JSON.parse(await r.getData()) + } + } + + -
+
\ No newline at end of file + window.playwrightReportBase64 = + 'data:application/zip;base64,UEsDBBQAAAgIABgDNln1aSr6IwUAACMiAAAZAAAANmZiNjllOTY5MDQyYjdlOTEyODUuanNvbu1ZXW/iOBT9K5Zfhko0JHa+VztSt9tq56Wz6nS00pbuyCQGsnVslDj9UJf/vnKAEkygIbCj7Qj6QELic+899r2+Pn2Bw4TRTzEMoTscuAEN3MC00cCjgYV8B3bL51ckpTCEA5In0SUTj4akuTRkDrtQXeUwvH0przYCndpDNIjdIfIdGkQe8hEmgRqeSKag87EoWAwIY+IREFDkNANSACZGCYddOMnE3zSScz9gFzIREZkIDsOX0sMN3rGEUxhiuwsjwYqUwxBPuzAusvlgG1tdSDgXsvxBBXLXhZKM5leikJEobRacPk1oJGms3CFyDMNb+FW5eVbIMeUymTkElAfwrgszmhdsTo1mMJckkzdJiYtMZJ+awSlCN6YdIhxiZGDL+xMqBJk9w9BUA+hkTvKcr1/oUGQU/CbEvYrzTURkKsSlH57rWagOeFACnzEGxkLct4J2fN+ug6aMRjIT3GCk4NG4CTZ217DdCvbdjgvBqiwEy5uqm4JLGFrTXZGCJZBbxenqTF6QaNyASju0fQOZzmq4PvLqiBwmT7LIaAgGmXjMadYE2tJmyUZO7fTPEG+eJ7TRNM3BHR3cXJmkKs11VL0GFAku6ZNsYNPVl4ZVS9U8HoPTx/Pm2LalYVvtwpmQEW1izw1W7WHsbglmHoiK6feGBjysG0A7RaQCMUZCis5YyknY66lkYWORy9CxPNwr6/TJm54Ehml6q54g3D6dkV9JZ5WGNMtEBkN4ob5n9Jdeh4BTGYYX19ffzj9fXV2c33z6fPXt+uLy65eLXwGRYEtUfX5OGFM7UdjnAPQL07QGtyg9BZw8JCMiEz5SW1UfbgOBXfBIkvLdgsuEgT5kgsR9uMBDaV9tdK0LkqoUCy78H46KHyiaSladDSXNmuzhs9TBtpY6yNq6OzSqPgpXq94bavc+9bqVFaLoadaJzEz4+pbgBtv6kLPJhM27NiNiIm9EVqBvDfv0I2oCq41p++w3N/QjG6j9Q2T3NAPnjBJeTBrEjRydW2f74mvamtRCN+geFkVBvfNey0L5N7s304WlwEwBcsE/81scpABUnvV65axloDT7RYqMjCiY9ZqAqmZTrY3l4D5fAfY04OrLODWWz5bda2fxo5uS/JlHlfGdl5JzMD0BS5CfP1beeHmNEFvp/MpKP1ZYWHpacdPX3HxlQDmhiK08VR7UhlD2K4tblH7YMl8flqNOllg/baIRgDX/Kp+agP+qDXh1aoJDxEwfCCuIpJ3Otimp2sVmTSzVxVVrJ1JrsFPPFdAMWGsGphtIXuRCJTFQOYJI0FOH7bwnk5SKXkzp5FJERV5eqWrWK4WIHkW0t1YmQ+SHlrucAnU8zyWRRa4qFklYeagnUpJonFJeHtrvVIUR9zAcEpbTsnZu1TeGgU/dOIgHpo8xdggexMN1fSNO8gkjz6AsXSClea7SZygykPAHwpIYRBmNlZpAWL637mEHm3QPD+Pvq3uUBt/WPexD6x6Wp+serll/UNxZ91iDdkx0MN3DWcM29zgo/a91D8/ANtY7AP8w3YXC1qbJD2qbwhbCh2dgB+vgu52rWwgfyNbaJbxNyNlN+EC2r2G31HEaCh/I17pp16rNoNbCB9KPBK4Z7BTRgYQP3whMfY27e5wbjsLHUfh4b9G0FD58I0COrl4eQPjwjQBb/7nw0crKbsKHbwR6lUNebfO0l/Ch1y/koD0K2DsSPrT+wbIP8z+ZWmj37c3pKHwchY+j8HEUPr6T8HE3/RdQSwMEFAAACAgAGAM2WRfCqhiYAQAA9AMAAAsAAAByZXBvcnQuanNvbsVTzYrbMBB+FTFnbYilxLZ066XQy55aelhyGFvjRI1iBWnc7RL87kVOWAIl9NDC3mY0o+9P6AInYnTICPYC2POE4XtMR0oZrJolZMbEX/2JwFaNqk1j1lXVVkqCmxKyjyPYpql1tVJ1LWHwgTLYl8tSfXFgoR662pCpzXqjuoZMpdotXDefseBCh9n3n0N8XTFlXnEGCaW6ApXqIdDTZlCdqwfVbsn0jWqVRlOuew4FOh/iFJzAEOKrQDFlSoKjCHHvR5BwTvEH9XzTARJC7G+mrg4eqAt+JLB6I6GPYTqNYPV8n8hGVxJwHCMvB8XITgLj/lbFifu4cE4j/TpTz+SKHOQD2Bf4VmR+mvhAI/urIFEUQLl6BDtgyCQhUZ7CLSVkxv5wonHpd/Nuln+LbjAt1c64bt1qrbeoOzf8GZ3z+RzwTVBKMYkT5Yx7EkNMwo8/MXgn+kSuCMWQ/znSjXkUaaP1h0e6W/5DaS/AkTGAVRLe2exa3pOX2RDw+LYM8tGfz7eld8K5QN4lVogA/j+NhOX5rj5+A1BLAQI/AxQAAAgIABgDNln1aSr6IwUAACMiAAAZAAAAAAAAAAAAAAC0gQAAAAA2ZmI2OWU5NjkwNDJiN2U5MTI4NS5qc29uUEsBAj8DFAAACAgAGAM2WRfCqhiYAQAA9AMAAAsAAAAAAAAAAAAAALSBWgUAAHJlcG9ydC5qc29uUEsFBgAAAAACAAIAgAAAABsHAAAAAA==' + diff --git a/playwright.config.cjs b/playwright.config.cjs index 1e84cfb..456d1a3 100644 --- a/playwright.config.cjs +++ b/playwright.config.cjs @@ -1,22 +1,22 @@ // @ts-check -import { defineConfig } from "@playwright/test"; -import path from "path"; +import { defineConfig } from '@playwright/test' +import path from 'path' export default defineConfig({ - testDir: "./tests/e2e", + testDir: './tests/e2e', use: { headless: false, viewport: null, use: { - video: "on", - }, + video: 'on' + } }, timeout: 120000, expect: { - timeout: 60000, + timeout: 60000 }, workers: 3, fullyParallel: true, retries: 0, - reporter: "html", -}); + reporter: 'html' +}) diff --git a/src/main/config.ts b/src/main/config.ts index 0ee0d5a..77b6e42 100644 --- a/src/main/config.ts +++ b/src/main/config.ts @@ -3,4 +3,6 @@ dotenv.config() const isProduction = process.env.ENV === 'production' -export const API_BASE_URL = isProduction ? process.env.VITE_SERVER_URL_PROD : process.env.VITE_SERVER_URL_DEV +export const API_BASE_URL = isProduction + ? process.env.VITE_SERVER_URL_PROD + : process.env.VITE_SERVER_URL_DEV diff --git a/src/main/index.ts b/src/main/index.ts index a5dd582..b99920d 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -8,7 +8,6 @@ import { electronApp, optimizer, is } from '@electron-toolkit/utils' const { activeWindow } = await import('get-windows') import Store from 'electron-store' - import { EmailService } from './emailService' import { StoreSchema, SiteTimeTracker, ExtendedResult } from './types' import { getUrlFromResult, formatTime, updateSiteTimeTracker } from './productivityUtils' @@ -28,13 +27,10 @@ setupEnvironment() const isProduction = process.env.ENV === 'production' console.log('isProduction?', isProduction) console.log('email', process.env.EMAIL) -console.log('API_BASE_URL', process.env.VITE_SERVER_URL_PROD ) - - +console.log('API_BASE_URL', process.env.VITE_SERVER_URL_PROD) const emailService = new EmailService(process.env.EMAIL || '', store) - // Initialize environment variables based on the environment function setupEnvironment(): void { if (app.isPackaged) { @@ -49,7 +45,7 @@ function setupEnvironment(): void { } // Store user data in the electron-store and send to worker -function handleUserData(user): void { +function handleUserData(user): void { store.set('user', { username: user.username, firstName: user.firstName, @@ -77,7 +73,7 @@ function loadUserData() { function resetCounters(type: 'daily' | 'weekly') { if (type === 'daily') { console.log('Resetting Daily Trackers') - currentSiteTimeTrackers.forEach(tracker => (tracker.timeSpent = 0)) + currentSiteTimeTrackers.forEach((tracker) => (tracker.timeSpent = 0)) store.set('lastResetDate', dayjs().format('YYYY-MM-DD')) } else if (type === 'weekly') { console.log('Resetting Weekly Trackers') @@ -116,8 +112,12 @@ function startActivityMonitoring() { // Process activity data from active window function processActivityData(_windowInfoData: ExtendedResult | undefined) { if (_windowInfoData?.siteTimeTracker) { - console.log(`Time spent on ${_windowInfoData.siteTimeTracker.title}: ${formatTime(_windowInfoData.siteTimeTracker.timeSpent)}`) - console.log(`Last active timestamp: ${new Date(_windowInfoData.siteTimeTracker.lastActiveTimestamp).toISOString()}`) + console.log( + `Time spent on ${_windowInfoData.siteTimeTracker.title}: ${formatTime(_windowInfoData.siteTimeTracker.timeSpent)}` + ) + console.log( + `Last active timestamp: ${new Date(_windowInfoData.siteTimeTracker.lastActiveTimestamp).toISOString()}` + ) } } @@ -158,7 +158,7 @@ async function createWindow(): Promise { return mainWindow } -app.commandLine.appendSwitch('remote-allow-origins', 'devtools://devtools'); +app.commandLine.appendSwitch('remote-allow-origins', 'devtools://devtools') // Main app ready event app.whenReady().then(async () => { console.log('ready!') @@ -174,7 +174,6 @@ app.whenReady().then(async () => { schedulerWorker.postMessage({ type: 'RESET_DAILY' }) } - await createWindow() setupPeriodicSave() @@ -203,7 +202,7 @@ app.on('window-all-closed', () => { const schedulerWorkerPath = join(__dirname, 'worker.js') const schedulerWorker = new Worker(schedulerWorkerPath, { workerData: { - API_BASE_URL: process.env.VITE_SERVER_URL_PROD + API_BASE_URL: process.env.VITE_SERVER_URL_PROD } }) @@ -213,6 +212,3 @@ schedulerWorker.on('message', (message) => { }) schedulerWorker.on('error', (err) => console.error('Worker Error:', err)) schedulerWorker.on('message', (message) => console.log('Worker Message:', message)) - - - diff --git a/src/main/productivityUtils.d.ts b/src/main/productivityUtils.d.ts index 2c3c888..499a2d2 100644 --- a/src/main/productivityUtils.d.ts +++ b/src/main/productivityUtils.d.ts @@ -4,4 +4,4 @@ export declare function capitalizeFirstLetter(text: string): string export declare function formatUrl(input: string): string export declare function formatTime(milliseconds: number): string export declare function updateSiteTimeTracker(windowInfo: Result): SiteTimeTracker -export declare function getOrSetLastResetDate(store: TypedStore):string +export declare function getOrSetLastResetDate(store: TypedStore): string diff --git a/src/main/productivityUtils.ts b/src/main/productivityUtils.ts index cc709cf..7273643 100644 --- a/src/main/productivityUtils.ts +++ b/src/main/productivityUtils.ts @@ -1,5 +1,5 @@ import { parse } from 'url' -import { MacOSResult, Result, SiteTimeTracker} from './types' +import { MacOSResult, Result, SiteTimeTracker } from './types' //TODO: Needs to be updated with user's specific sites const unproductiveSites = ['instagram.com', 'facebook.com'] @@ -77,7 +77,10 @@ export function formatTime(milliseconds: number): string { } } -export function updateSiteTimeTracker(windowInfo: Result, timeTrackers: SiteTimeTracker[]): SiteTimeTracker { +export function updateSiteTimeTracker( + windowInfo: Result, + timeTrackers: SiteTimeTracker[] +): SiteTimeTracker { const currentTime = Date.now() const url = getUrlFromResult(windowInfo) || windowInfo.title diff --git a/src/main/types.ts b/src/main/types.ts index ea0ba8e..7abfd98 100644 --- a/src/main/types.ts +++ b/src/main/types.ts @@ -1,4 +1,3 @@ - // Currently use electron-store for persisting data in our electron application. export interface User { username: string @@ -23,7 +22,6 @@ export interface SiteTimeTracker { export type ExtendedResult = Result & { url?: string; siteTimeTracker?: SiteTimeTracker } - export type Options = { /** Enable the accessibility permission check. _(macOS)_ diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 3e67435..40d857f 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -2,7 +2,6 @@ import { lazy, Suspense, onMount, createSignal } from 'solid-js' import { Router, Route, A, useLocation } from '@solidjs/router' import { render } from 'solid-js/web' - import { sendUserToBackend } from './lib/utils' import './assets/main.css' import logo from './assets/deepWork.svg' @@ -18,7 +17,6 @@ const App = (props) => { const [isNewUser, setIsNewUser] = createSignal(true) const location = useLocation() - // Check for the token in localStorage on component mount onMount(() => { const token = localStorage.getItem('token') as string diff --git a/src/renderer/src/config.ts b/src/renderer/src/config.ts index c16fd9d..987e9d1 100644 --- a/src/renderer/src/config.ts +++ b/src/renderer/src/config.ts @@ -1,5 +1,5 @@ -const isProduction = import.meta.env.PROD; +const isProduction = import.meta.env.PROD export const API_BASE_URL = isProduction ? import.meta.env.VITE_SERVER_URL_PROD - : import.meta.env.VITE_SERVER_URL_DEV; \ No newline at end of file + : import.meta.env.VITE_SERVER_URL_DEV diff --git a/tests/e2e/userflow.test.ts b/tests/e2e/userflow.test.ts index 60fbe57..f1c2b41 100644 --- a/tests/e2e/userflow.test.ts +++ b/tests/e2e/userflow.test.ts @@ -1,17 +1,17 @@ -import { _electron as electron, ElectronApplication, Page } from 'playwright'; -import { test, expect } from '@playwright/test'; -import { +import { _electron as electron, ElectronApplication, Page } from 'playwright' +import { test, expect } from '@playwright/test' +import { clickMenuItemById, - findLatestBuild, - ipcMainCallFirstListener, - ipcRendererCallFirstListener, + findLatestBuild, + ipcMainCallFirstListener, + ipcRendererCallFirstListener, parseElectronApp, ipcMainInvokeHandler, ipcRendererInvoke } from 'electron-playwright-helpers' test.describe('Electron App', () => { - let electronApp: ElectronApplication; + let electronApp: ElectronApplication test.beforeAll(async () => { // Launch the Electron app @@ -26,7 +26,7 @@ test.describe('Electron App', () => { electronApp.on('window', async (page) => { const filename = page.url()?.split('/').pop() console.log(`Window opened: ${filename}`) - + // capture errors page.on('pageerror', (error) => { console.error(error) @@ -36,51 +36,50 @@ test.describe('Electron App', () => { console.log(msg.text()) }) }) - }) test.afterAll(async () => { // Close the Electron app - await electronApp.close(); - }); + await electronApp.close() + }) test('should load the main window', async () => { // Get the first window of the Electron app - const window = await electronApp.firstWindow(); + const window = await electronApp.firstWindow() // Ensure the Electron app loads correctly - const title = await window.title(); - expect(title).toBe('deepFocus'); - }); + const title = await window.title() + expect(title).toBe('deepFocus') + }) test('should handle user login', async () => { - const window = await electronApp.firstWindow(); + const window = await electronApp.firstWindow() // Interact with the login form - await window.fill('input[name="email"]', 'timeo.j.williams@gmail.com'); - await window.fill('input[name="password"]', 'test'); - await window.click('button:has-text("Login")'); + await window.fill('input[name="email"]', 'timeo.j.williams@gmail.com') + await window.fill('input[name="password"]', 'test') + await window.click('button:has-text("Login")') // Validate login success - const logoutButton = window.locator('button:has-text("Logout")'); - await expect(logoutButton).toBeVisible(); - }); + const logoutButton = window.locator('button:has-text("Logout")') + await expect(logoutButton).toBeVisible() + }) test('should send data via IPC', async () => { - const window = await electronApp.firstWindow(); - + const window = await electronApp.firstWindow() + // Simulate sending data from the renderer process to the main process await window.evaluate(() => { - window?.electron.ipcRenderer.send('send-user-data', { username: 'testuser' }); - }); - + window?.electron.ipcRenderer.send('send-user-data', { username: 'testuser' }) + }) + // Simulate listening on the main process for the IPC event const userData = await electronApp.evaluate(async ({ ipcMain }) => { return new Promise((resolve) => { - ipcMain.on('send-user-data', (_, data) => resolve(data)); - }); - }); - - expect(userData.username).toBe('testuser'); - }); -}); + ipcMain.on('send-user-data', (_, data) => resolve(data)) + }) + }) + + expect(userData.username).toBe('testuser') + }) +})