diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx index 8150508bf1..88348706a6 100644 --- a/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx +++ b/dev-docs/docs/@excalidraw/excalidraw/api/children-components/welcome-screen.mdx @@ -31,7 +31,7 @@ The welcome screen consists of two main groups of subcomponents: Excalidraw logo: Sketch handrawn like diagrams. ### Center diff --git a/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx b/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx index 029f5b05ca..411cbb4429 100644 --- a/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx +++ b/dev-docs/docs/@excalidraw/excalidraw/api/constants.mdx @@ -12,7 +12,7 @@ import { FONT_FAMILY } from "@excalidraw/excalidraw"; | Font Family | Description | | ----------- | ---------------------- | -| `Virgil` | The `handwritten` font | +| `Virgil` | The `Hand-drawn` font | | `Helvetica` | The `Normal` Font | | `Cascadia` | The `Code` Font | diff --git a/excalidraw-app/index.html b/excalidraw-app/index.html index 02f153d8c3..e1a319d0b8 100644 --- a/excalidraw-app/index.html +++ b/excalidraw-app/index.html @@ -133,7 +133,7 @@ diff --git a/excalidraw-app/vite.config.mts b/excalidraw-app/vite.config.mts index 264ae9fb7c..e9aac95714 100644 --- a/excalidraw-app/vite.config.mts +++ b/excalidraw-app/vite.config.mts @@ -25,8 +25,14 @@ export default defineConfig({ output: { assetFileNames(chunkInfo) { if (chunkInfo?.name?.endsWith(".woff2")) { + // TODO: consider splitting all fonts similar to Xiaolai + // fonts don't change often, so hash is not necessary // put on root so we are flexible about the CDN path - return "[name]-[hash][extname]"; + if (chunkInfo.name.includes("Xiaolai")) { + return "[name][extname]"; + } else { + return "[name]-[hash][extname]"; + } } return "assets/[name]-[hash][extname]"; @@ -75,17 +81,21 @@ export default defineConfig({ }, workbox: { - // Don't push fonts, locales and wasm to app precache - globIgnores: ["fonts.css", "**/locales/**", "service-worker.js", "**/*.wasm-*.js"], + // don't precache fonts, locales and separate chunks + globIgnores: ["fonts.css", "**/locales/**", "service-worker.js", "**/*.chunk-*.js"], runtimeCaching: [ { - urlPattern: new RegExp("/.+.(ttf|woff2|otf)"), - handler: "CacheFirst", + urlPattern: new RegExp(".+.woff2"), + handler: 'CacheFirst', options: { - cacheName: "fonts", + cacheName: 'fonts', expiration: { - maxEntries: 50, - maxAgeSeconds: 60 * 60 * 24 * 90, // <== 90 days + maxEntries: 1000, + maxAgeSeconds: 60 * 60 * 24 * 90, // 90 days + }, + cacheableResponse: { + // 0 to cache "opaque" responses from cross-origin requests (i.e. CDN) + statuses: [0, 200], }, }, }, @@ -111,10 +121,10 @@ export default defineConfig({ }, }, { - urlPattern: new RegExp(".wasm-.+.js"), + urlPattern: new RegExp(".chunk-.+.js"), handler: "CacheFirst", options: { - cacheName: "wasm", + cacheName: "chunk", expiration: { maxEntries: 50, maxAgeSeconds: 60 * 60 * 24 * 90, // <== 90 days diff --git a/packages/excalidraw/CHANGELOG.md b/packages/excalidraw/CHANGELOG.md index b4dcb5759d..ab3edeba10 100644 --- a/packages/excalidraw/CHANGELOG.md +++ b/packages/excalidraw/CHANGELOG.md @@ -15,6 +15,8 @@ Please add the latest change on the top under the correct section. ### Features +- Added hand-drawn font for Chinese, Japanese and Korean (CJK) as a fallback for Excalifont. Improved overal text wrapping algorithm, not only accounting for CJK, but covering various edge cases with white spaces and text-align center/right. Added support for multi-codepoint emojis wrapping. Offloaded SVG export to Web Workers, with an automatic fallback to the main thread if not supported or not desired.[#8530](https://github.com/excalidraw/excalidraw/pull/8530) + - Prefer user defined coordinates and dimensions when creating a frame using [`convertToExcalidrawElements`](https://docs.excalidraw.com/docs/@excalidraw/excalidraw/api/excalidraw-element-skeleton#converttoexcalidrawelements) [#8517](https://github.com/excalidraw/excalidraw/pull/8517) - `props.initialData` can now be a function that returns `ExcalidrawInitialDataState` or `Promise`. [#8107](https://github.com/excalidraw/excalidraw/pull/8135) diff --git a/packages/excalidraw/actions/actionClipboard.tsx b/packages/excalidraw/actions/actionClipboard.tsx index 4d34bf968c..0956747b98 100644 --- a/packages/excalidraw/actions/actionClipboard.tsx +++ b/packages/excalidraw/actions/actionClipboard.tsx @@ -147,14 +147,32 @@ export const actionCopyAsSvg = register({ name: app.getName(), }, ); + + const selectedElements = app.scene.getSelectedElements({ + selectedElementIds: appState.selectedElementIds, + includeBoundTextElement: true, + includeElementsInFrames: true, + }); + return { + appState: { + toast: { + message: t("toast.copyToClipboardAsSvg", { + exportSelection: selectedElements.length + ? t("toast.selection") + : t("toast.canvas"), + exportColorScheme: appState.exportWithDarkMode + ? t("buttons.darkMode") + : t("buttons.lightMode"), + }), + }, + }, storeAction: StoreAction.NONE, }; } catch (error: any) { console.error(error); return { appState: { - ...appState, errorMessage: error.message, }, storeAction: StoreAction.NONE, @@ -164,6 +182,7 @@ export const actionCopyAsSvg = register({ predicate: (elements) => { return probablySupportsClipboardWriteText && elements.length > 0; }, + keyTest: (event) => event.code === CODES.C && event.ctrlKey && event.shiftKey, keywords: ["svg", "clipboard", "copy"], }); diff --git a/packages/excalidraw/actions/shortcuts.ts b/packages/excalidraw/actions/shortcuts.ts index 025d91037c..1f424fb571 100644 --- a/packages/excalidraw/actions/shortcuts.ts +++ b/packages/excalidraw/actions/shortcuts.ts @@ -88,7 +88,7 @@ const shortcutMap: Record = { : getShortcutKey("CtrlOrCmd+Shift+]"), ], copyAsPng: [getShortcutKey("Shift+Alt+C")], - copyAsSvg: [], + copyAsSvg: [getShortcutKey("Shift+Ctrl+C")], group: [getShortcutKey("CtrlOrCmd+G")], ungroup: [getShortcutKey("CtrlOrCmd+Shift+G")], gridMode: [getShortcutKey("CtrlOrCmd+'")], diff --git a/packages/excalidraw/actions/types.ts b/packages/excalidraw/actions/types.ts index 15364d21f3..bef3dfcaca 100644 --- a/packages/excalidraw/actions/types.ts +++ b/packages/excalidraw/actions/types.ts @@ -10,7 +10,6 @@ import type { BinaryFiles, UIAppState, } from "../types"; -import type { MarkOptional } from "../utility-types"; import type { StoreActionType } from "../store"; export type ActionSource = @@ -24,10 +23,7 @@ export type ActionSource = export type ActionResult = | { elements?: readonly ExcalidrawElement[] | null; - appState?: MarkOptional< - AppState, - "offsetTop" | "offsetLeft" | "width" | "height" - > | null; + appState?: Partial | null; files?: BinaryFiles | null; storeAction: StoreActionType; replaceFiles?: boolean; diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index b5f592651d..db11c1ed97 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -2150,11 +2150,12 @@ class App extends React.Component { editingTextElement = null; } - this.setState((state) => { - // using Object.assign instead of spread to fool TS 4.2.2+ into - // regarding the resulting type as not containing undefined - // (which the following expression will never contain) - return Object.assign(actionResult.appState || {}, { + this.setState((prevAppState) => { + const actionAppState = actionResult.appState || {}; + + return { + ...prevAppState, + ...actionAppState, // NOTE this will prevent opening context menu using an action // or programmatically from the host, so it will need to be // rewritten later @@ -2165,7 +2166,7 @@ class App extends React.Component { theme, name, errorMessage, - }); + }; }); didUpdate = true; diff --git a/packages/excalidraw/components/FontPicker/FontPicker.tsx b/packages/excalidraw/components/FontPicker/FontPicker.tsx index e32c952d0f..4585c58415 100644 --- a/packages/excalidraw/components/FontPicker/FontPicker.tsx +++ b/packages/excalidraw/components/FontPicker/FontPicker.tsx @@ -21,7 +21,7 @@ export const DEFAULT_FONTS = [ value: FONT_FAMILY.Excalifont, icon: FreedrawIcon, text: t("labels.handDrawn"), - testId: "font-family-handrawn", + testId: "font-family-hand-drawn", }, { value: FONT_FAMILY.Nunito, diff --git a/packages/excalidraw/components/FontPicker/FontPickerList.tsx b/packages/excalidraw/components/FontPicker/FontPickerList.tsx index 91d537ebfc..6e1bf56c3f 100644 --- a/packages/excalidraw/components/FontPicker/FontPickerList.tsx +++ b/packages/excalidraw/components/FontPicker/FontPickerList.tsx @@ -21,6 +21,7 @@ import { t } from "../../i18n"; import { fontPickerKeyHandler } from "./keyboardNavHandlers"; import { Fonts } from "../../fonts"; import type { ValueOf } from "../../utility-types"; +import { FontFamilyNormalIcon } from "../icons"; export interface FontDescriptor { value: number; @@ -62,12 +63,14 @@ export const FontPickerList = React.memo( const allFonts = useMemo( () => Array.from(Fonts.registered.entries()) - .filter(([_, { metadata }]) => !metadata.serverSide) - .map(([familyId, { metadata, fonts }]) => { + .filter( + ([_, { metadata }]) => !metadata.serverSide && !metadata.fallback, + ) + .map(([familyId, { metadata, fontFaces }]) => { const fontDescriptor = { value: familyId, - icon: metadata.icon, - text: fonts[0].fontFace.family, + icon: metadata.icon ?? FontFamilyNormalIcon, + text: fontFaces[0]?.fontFace?.family ?? "Unknown", }; if (metadata.deprecated) { @@ -89,7 +92,7 @@ export const FontPickerList = React.memo( ); const sceneFamilies = useMemo( - () => new Set(fonts.getSceneFontFamilies()), + () => new Set(fonts.getSceneFamilies()), // cache per selected font family, so hover re-render won't mess it up // eslint-disable-next-line react-hooks/exhaustive-deps [selectedFontFamily], diff --git a/packages/excalidraw/components/HelpDialog.tsx b/packages/excalidraw/components/HelpDialog.tsx index 886c7bb7a1..7b0dff79f0 100644 --- a/packages/excalidraw/components/HelpDialog.tsx +++ b/packages/excalidraw/components/HelpDialog.tsx @@ -374,6 +374,10 @@ export const HelpDialog = ({ onClose }: { onClose?: () => void }) => { shortcuts={[getShortcutKey("Shift+Alt+C")]} /> )} + => { + switch (fontFamily) { + case FONT_FAMILY.Excalifont: + return [CJK_HAND_DRAWN_FALLBACK_FONT, WINDOWS_EMOJI_FALLBACK_FONT]; + default: + return [WINDOWS_EMOJI_FALLBACK_FONT]; + } +}; + export const THEME = { LIGHT: "light", DARK: "dark", @@ -157,8 +176,6 @@ export const FRAME_STYLE = { nameLineHeight: 1.25, }; -export const WINDOWS_EMOJI_FALLBACK_FONT = "Segoe UI Emoji"; - export const MIN_FONT_SIZE = 1; export const DEFAULT_FONT_SIZE = 20; export const DEFAULT_FONT_FAMILY: FontFamilyValues = FONT_FAMILY.Excalifont; diff --git a/packages/excalidraw/data/__snapshots__/transform.test.ts.snap b/packages/excalidraw/data/__snapshots__/transform.test.ts.snap index 967de923e1..2ab3ee1fe6 100644 --- a/packages/excalidraw/data/__snapshots__/transform.test.ts.snap +++ b/packages/excalidraw/data/__snapshots__/transform.test.ts.snap @@ -2171,7 +2171,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "strokeColor": "#1098ad", "strokeStyle": "solid", "strokeWidth": 2, - "text": "ANOTHER STYLED + "text": "ANOTHER STYLED LABELLED ARROW", "textAlign": "center", "type": "text", @@ -2179,8 +2179,8 @@ LABELLED ARROW", "version": 3, "versionNonce": Any, "verticalAlign": "middle", - "width": 150, - "x": 75, + "width": 140, + "x": 80, "y": 275, } `; @@ -2213,7 +2213,7 @@ exports[`Test Transform > should transform to labelled arrows when label provide "strokeColor": "#099268", "strokeStyle": "solid", "strokeWidth": 2, - "text": "ANOTHER STYLED + "text": "ANOTHER STYLED LABELLED ARROW", "textAlign": "center", "type": "text", @@ -2221,8 +2221,8 @@ LABELLED ARROW", "version": 3, "versionNonce": Any, "verticalAlign": "middle", - "width": 150, - "x": 75, + "width": 140, + "x": 80, "y": 375, } `; @@ -2518,7 +2518,7 @@ exports[`Test Transform > should transform to text containers when label provide "strokeColor": "#1e1e1e", "strokeStyle": "solid", "strokeWidth": 2, - "text": "ELLIPSE TEXT + "text": "ELLIPSE TEXT CONTAINER", "textAlign": "center", "type": "text", @@ -2526,8 +2526,8 @@ CONTAINER", "version": 3, "versionNonce": Any, "verticalAlign": "middle", - "width": 130, - "x": 534.7893218813452, + "width": 120, + "x": 539.7893218813452, "y": 117.44796179957173, } `; @@ -2562,7 +2562,7 @@ TEXT CONTAINER", "strokeStyle": "solid", "strokeWidth": 2, "text": "DIAMOND -TEXT +TEXT CONTAINER", "textAlign": "center", "type": "text", @@ -2646,8 +2646,8 @@ exports[`Test Transform > should transform to text containers when label provide "strokeColor": "#c2255c", "strokeStyle": "solid", "strokeWidth": 2, - "text": "TOP LEFT ALIGNED -RECTANGLE TEXT + "text": "TOP LEFT ALIGNED +RECTANGLE TEXT CONTAINER", "textAlign": "left", "type": "text", @@ -2655,7 +2655,7 @@ CONTAINER", "version": 3, "versionNonce": Any, "verticalAlign": "top", - "width": 170, + "width": 160, "x": 505, "y": 305, } @@ -2689,8 +2689,8 @@ exports[`Test Transform > should transform to text containers when label provide "strokeColor": "#c2255c", "strokeStyle": "solid", "strokeWidth": 2, - "text": "STYLED -ELLIPSE TEXT + "text": "STYLED +ELLIPSE TEXT CONTAINER", "textAlign": "center", "type": "text", @@ -2698,8 +2698,8 @@ CONTAINER", "version": 3, "versionNonce": Any, "verticalAlign": "middle", - "width": 130, - "x": 534.7893218813452, + "width": 120, + "x": 539.7893218813452, "y": 522.5735931288071, } `; diff --git a/packages/excalidraw/element/textElement.test.ts b/packages/excalidraw/element/textElement.test.ts index 178b30cd5d..59727c22ff 100644 --- a/packages/excalidraw/element/textElement.test.ts +++ b/packages/excalidraw/element/textElement.test.ts @@ -14,20 +14,23 @@ import { import type { ExcalidrawTextElementWithContainer, FontString } from "./types"; describe("Test wrapText", () => { - const font = "20px Cascadia, width: Segoe UI Emoji" as FontString; + // font is irrelevant as jsdom does not support FontFace API + // `measureText` width is mocked to return `text.length` by `jest-canvas-mock` + // https://github.com/hustcc/jest-canvas-mock/blob/master/src/classes/TextMetrics.js + const font = "10px Cascadia, Segoe UI Emoji" as FontString; - it("shouldn't add new lines for trailing spaces", () => { - const text = "Hello whats up "; - const maxWidth = 200 - BOUND_TEXT_PADDING * 2; - const res = wrapText(text, font, maxWidth); - expect(res).toBe(text); + it("should wrap the text correctly when word length is exactly equal to max width", () => { + const text = "Hello Excalidraw"; + // Length of "Excalidraw" is 100 and exacty equal to max width + const res = wrapText(text, font, 100); + expect(res).toEqual(`Hello\nExcalidraw`); }); - it("should work with emojis", () => { - const text = "😀"; - const maxWidth = 1; - const res = wrapText(text, font, maxWidth); - expect(res).toBe("😀"); + it("should return the text as is if max width is invalid", () => { + const text = "Hello Excalidraw"; + expect(wrapText(text, font, NaN)).toEqual(text); + expect(wrapText(text, font, -1)).toEqual(text); + expect(wrapText(text, font, Infinity)).toEqual(text); }); it("should show the text correctly when max width reached", () => { @@ -37,6 +40,237 @@ describe("Test wrapText", () => { expect(res).toBe("H\ne\nl\nl\no\n😀"); }); + it("should not wrap number when wrapping line", () => { + const text = "don't wrap this number 99,100.99"; + const maxWidth = 300; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("don't wrap this number\n99,100.99"); + }); + + it("should support multiple (multi-codepoint) emojis", () => { + const text = "😀🗺🔥👩🏽‍🦰👨‍👩‍👧‍👦🇨🇿"; + const maxWidth = 1; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("😀\n🗺\n🔥\n👩🏽‍🦰\n👨‍👩‍👧‍👦\n🇨🇿"); + }); + + it("should wrap the text correctly when text contains hyphen", () => { + let text = + "Wikipedia is hosted by Wikimedia- Foundation, a non-profit organization that also hosts a range-of other projects"; + const res = wrapText(text, font, 110); + expect(res).toBe( + `Wikipedia\nis hosted\nby\nWikimedia-\nFoundation,\na non-\nprofit\norganizatio\nn that also\nhosts a\nrange-of\nother\nprojects`, + ); + + text = "Hello thereusing-now"; + expect(wrapText(text, font, 100)).toEqual("Hello\nthereusing\n-now"); + }); + + it("should support wrapping nested lists", () => { + const text = `\tA) one tab\t\t- two tabs - 8 spaces`; + + const maxWidth = 100; + const res = wrapText(text, font, maxWidth); + expect(res).toBe(`\tA) one\ntab\t\t- two\ntabs\n- 8 spaces`); + + const maxWidth2 = 50; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe(`\tA)\none\ntab\n- two\ntabs\n- 8\nspace\ns`); + }); + + describe("When text is CJK", () => { + it("should break each CJK character when width is very small", () => { + // "안녕하세요" (Hangul) + "こんにちは世界" (Hiragana, Kanji) + "コンニチハ" (Katakana) + "你好" (Han) = "Hello Hello World Hello Hi" + const text = "안녕하세요こんにちは世界コンニチハ你好"; + const maxWidth = 10; + const res = wrapText(text, font, maxWidth); + expect(res).toBe( + "안\n녕\n하\n세\n요\nこ\nん\nに\nち\nは\n世\n界\nコ\nン\nニ\nチ\nハ\n你\n好", + ); + }); + + it("should break CJK text into longer segments when width is larger", () => { + // "안녕하세요" (Hangul) + "こんにちは世界" (Hiragana, Kanji) + "コンニチハ" (Katakana) + "你好" (Han) = "Hello Hello World Hello Hi" + const text = "안녕하세요こんにちは世界コンニチハ你好"; + const maxWidth = 30; + const res = wrapText(text, font, maxWidth); + + // measureText is mocked, so it's not precisely what would happen in prod + expect(res).toBe("안녕하\n세요こ\nんにち\nは世界\nコンニ\nチハ你\n好"); + }); + + it("should handle a combination of CJK, latin, emojis and whitespaces", () => { + const text = `a醫 醫 bb 你好 world-i-😀🗺🔥`; + + const maxWidth = 150; + const res = wrapText(text, font, maxWidth); + expect(res).toBe(`a醫 醫 bb 你\n好 world-i-😀🗺\n🔥`); + + const maxWidth2 = 50; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe(`a醫 醫\nbb 你\n好\nworld\n-i-😀\n🗺🔥`); + + const maxWidth3 = 30; + const res3 = wrapText(text, font, maxWidth3); + expect(res3).toBe(`a醫\n醫\nbb\n你好\nwor\nld-\ni-\n😀\n🗺\n🔥`); + }); + + it("should break before and after a regular CJK character", () => { + const text = "HelloたWorld"; + const maxWidth1 = 50; + const res1 = wrapText(text, font, maxWidth1); + expect(res1).toBe("Hello\nた\nWorld"); + + const maxWidth2 = 60; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe("Helloた\nWorld"); + }); + + it("should break before and after certain CJK symbols", () => { + const text = "こんにちは〃世界"; + const maxWidth1 = 50; + const res1 = wrapText(text, font, maxWidth1); + expect(res1).toBe("こんにちは\n〃世界"); + + const maxWidth2 = 60; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe("こんにちは〃\n世界"); + }); + + it("should break after, not before for certain CJK pairs", () => { + const text = "Hello た。"; + const maxWidth = 70; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("Hello\nた。"); + }); + + it("should break before, not after for certain CJK pairs", () => { + const text = "Hello「たWorld」"; + const maxWidth = 60; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("Hello\n「た\nWorld」"); + }); + + it("should break after, not before for certain CJK character pairs", () => { + const text = "「Helloた」World"; + const maxWidth = 70; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("「Hello\nた」World"); + }); + + it("should break Chinese sentences", () => { + const text = `中国你好!这是一个测试。 +我们来看看:人民币¥1234「很贵」 +(括号)、逗号,句号。空格 换行 全角符号…—`; + + const maxWidth1 = 80; + const res1 = wrapText(text, font, maxWidth1); + expect(res1).toBe(`中国你好!这是一\n个测试。 +我们来看看:人民\n币¥1234「很\n贵」 +(括号)、逗号,\n句号。空格 换行\n全角符号…—`); + + const maxWidth2 = 50; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe(`中国你好!\n这是一个测\n试。 +我们来看\n看:人民币\n¥1234\n「很贵」 +(括号)、\n逗号,句\n号。空格\n换行 全角\n符号…—`); + }); + }); + + it("should break Japanese sentences", () => { + const text = `日本こんにちは!これはテストです。 + 見てみましょう:円¥1234「高い」 + (括弧)、読点、句点。 + 空白 改行 全角記号…ー`; + + const maxWidth1 = 80; + const res1 = wrapText(text, font, maxWidth1); + expect(res1).toBe(`日本こんにちは!\nこれはテストで\nす。 + 見てみましょ\nう:円¥1234\n「高い」 + (括弧)、読\n点、句点。 + 空白 改行\n全角記号…ー`); + + const maxWidth2 = 50; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe(`日本こんに\nちは!これ\nはテストで\nす。 + 見てみ\nましょう:\n円\n¥1234\n「高い」 + (括\n弧)、読\n点、句点。 + 空白\n改行 全角\n記号…ー`); + }); + + it("should break Korean sentences", () => { + const text = `한국 안녕하세요! 이것은 테스트입니다. +우리 보자: 원화₩1234「비싸다」 +(괄호), 쉼표, 마침표. +공백 줄바꿈 전각기호…—`; + + const maxWidth1 = 80; + const res1 = wrapText(text, font, maxWidth1); + expect(res1).toBe(`한국 안녕하세\n요! 이것은 테\n스트입니다. +우리 보자: 원\n화₩1234「비\n싸다」 +(괄호), 쉼\n표, 마침표. +공백 줄바꿈 전\n각기호…—`); + + const maxWidth2 = 60; + const res2 = wrapText(text, font, maxWidth2); + expect(res2).toBe(`한국 안녕하\n세요! 이것\n은 테스트입\n니다. +우리 보자:\n원화\n₩1234\n「비싸다」 +(괄호),\n쉼표, 마침\n표. +공백 줄바꿈\n전각기호…—`); + }); + + describe("When text contains leading whitespaces", () => { + const text = " \t Hello world"; + + it("should preserve leading whitespaces", () => { + const maxWidth = 120; + const res = wrapText(text, font, maxWidth); + expect(res).toBe(" \t Hello\nworld"); + }); + + it("should break and collapse leading whitespaces when line breaks", () => { + const maxWidth = 60; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("\nHello\nworld"); + }); + + it("should break and collapse leading whitespaces whe words break", () => { + const maxWidth = 30; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("\nHel\nlo\nwor\nld"); + }); + }); + + describe("When text contains trailing whitespaces", () => { + it("shouldn't add new lines for trailing spaces", () => { + const text = "Hello whats up "; + const maxWidth = 200 - BOUND_TEXT_PADDING * 2; + const res = wrapText(text, font, maxWidth); + expect(res).toBe(text); + }); + + it("should ignore trailing whitespaces when line breaks", () => { + const text = "Hippopotomonstrosesquippedaliophobia ??????"; + const maxWidth = 400; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("Hippopotomonstrosesquippedaliophobia\n??????"); + }); + + it("should not ignore trailing whitespaces when word breaks", () => { + const text = "Hippopotomonstrosesquippedaliophobia ??????"; + const maxWidth = 300; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("Hippopotomonstrosesquippedalio\nphobia ??????"); + }); + + it("should ignore trailing whitespaces when word breaks and line breaks", () => { + const text = "Hippopotomonstrosesquippedaliophobia ??????"; + const maxWidth = 180; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("Hippopotomonstrose\nsquippedaliophobia\n??????"); + }); + }); + describe("When text doesn't contain new lines", () => { const text = "Hello whats up"; @@ -44,7 +278,7 @@ describe("Test wrapText", () => { { desc: "break all words when width of each word is less than container width", width: 80, - res: `Hello \nwhats \nup`, + res: `Hello\nwhats\nup`, }, { desc: "break all characters when width of each character is less than container width", @@ -66,7 +300,7 @@ p`, desc: "break words as per the width", width: 140, - res: `Hello whats \nup`, + res: `Hello whats\nup`, }, { desc: "fit the container", @@ -96,7 +330,7 @@ whats up`; { desc: "break all words when width of each word is less than container width", width: 80, - res: `Hello\nwhats \nup`, + res: `Hello\nwhats\nup`, }, { desc: "break all characters when width of each character is less than container width", @@ -142,26 +376,24 @@ whats up`, { desc: "fit characters of long string as per container width", width: 170, - res: `hellolongtextth\nisiswhatsupwith\nyouIamtypingggg\ngandtypinggg \nbreak it now`, + res: `hellolongtextthi\nsiswhatsupwithyo\nuIamtypingggggan\ndtypinggg break\nit now`, }, - { desc: "fit characters of long string as per container width and break words as per the width", width: 130, - res: `hellolongte -xtthisiswha -tsupwithyou -Iamtypinggg -ggandtyping -gg break it -now`, + res: `hellolongtex +tthisiswhats +upwithyouIam +typingggggan +dtypinggg +break it now`, }, { desc: "fit the long text when container width is greater than text length and move the rest to next line", width: 600, - res: `hellolongtextthisiswhatsupwithyouIamtypingggggandtypinggg \nbreak it now`, + res: `hellolongtextthisiswhatsupwithyouIamtypingggggandtypinggg\nbreak it now`, }, ].forEach((data) => { it(`should ${data.desc}`, () => { @@ -171,68 +403,243 @@ now`, }); }); - it("should wrap the text correctly when word length is exactly equal to max width", () => { - const text = "Hello Excalidraw"; - // Length of "Excalidraw" is 100 and exacty equal to max width - const res = wrapText(text, font, 100); - expect(res).toEqual(`Hello \nExcalidraw`); - }); + describe("Test parseTokens", () => { + it("should tokenize latin", () => { + let text = "Excalidraw is a virtual collaborative whiteboard"; - it("should return the text as is if max width is invalid", () => { - const text = "Hello Excalidraw"; - expect(wrapText(text, font, NaN)).toEqual(text); - expect(wrapText(text, font, -1)).toEqual(text); - expect(wrapText(text, font, Infinity)).toEqual(text); - }); + expect(parseTokens(text)).toEqual([ + "Excalidraw", + " ", + "is", + " ", + "a", + " ", + "virtual", + " ", + "collaborative", + " ", + "whiteboard", + ]); - it("should wrap the text correctly when text contains hyphen", () => { - let text = - "Wikipedia is hosted by Wikimedia- Foundation, a non-profit organization that also hosts a range-of other projects"; - const res = wrapText(text, font, 110); - expect(res).toBe( - `Wikipedia \nis hosted \nby \nWikimedia-\nFoundation,\na non-\nprofit \norganizati\non that \nalso hosts\na range-of\nother \nprojects`, - ); + text = + "Wikipedia is hosted by Wikimedia- Foundation, a non-profit organization that also hosts a range-of other projects"; + expect(parseTokens(text)).toEqual([ + "Wikipedia", + " ", + "is", + " ", + "hosted", + " ", + "by", + " ", + "Wikimedia-", + " ", + "Foundation,", + " ", + "a", + " ", + "non-", + "profit", + " ", + "organization", + " ", + "that", + " ", + "also", + " ", + "hosts", + " ", + "a", + " ", + "range-", + "of", + " ", + "other", + " ", + "projects", + ]); + }); - text = "Hello thereusing-now"; - expect(wrapText(text, font, 100)).toEqual("Hello \nthereusin\ng-now"); - }); -}); + it("should not tokenize number", () => { + const text = "99,100.99"; + const tokens = parseTokens(text); + expect(tokens).toEqual(["99,100.99"]); + }); -describe("Test parseTokens", () => { - it("should split into tokens correctly", () => { - let text = "Excalidraw is a virtual collaborative whiteboard"; - expect(parseTokens(text)).toEqual([ - "Excalidraw", - "is", - "a", - "virtual", - "collaborative", - "whiteboard", - ]); + it("should tokenize joined emojis", () => { + const text = `😬🌍🗺🔥☂️👩🏽‍🦰👨‍👩‍👧‍👦👩🏾‍🔬🏳️‍🌈🧔‍♀️🧑‍🤝‍🧑🙅🏽‍♂️✅0️⃣🇨🇿🦅`; + const tokens = parseTokens(text); - text = - "Wikipedia is hosted by Wikimedia- Foundation, a non-profit organization that also hosts a range-of other projects"; - expect(parseTokens(text)).toEqual([ - "Wikipedia", - "is", - "hosted", - "by", - "Wikimedia-", - "", - "Foundation,", - "a", - "non-", - "profit", - "organization", - "that", - "also", - "hosts", - "a", - "range-", - "of", - "other", - "projects", - ]); + expect(tokens).toEqual([ + "😬", + "🌍", + "🗺", + "🔥", + "☂️", + "👩🏽‍🦰", + "👨‍👩‍👧‍👦", + "👩🏾‍🔬", + "🏳️‍🌈", + "🧔‍♀️", + "🧑‍🤝‍🧑", + "🙅🏽‍♂️", + "✅", + "0️⃣", + "🇨🇿", + "🦅", + ]); + }); + + it("should tokenize emojis mixed with mixed text", () => { + const text = `😬a🌍b🗺c🔥d☂️《👩🏽‍🦰》👨‍👩‍👧‍👦德👩🏾‍🔬こ🏳️‍🌈안🧔‍♀️g🧑‍🤝‍🧑h🙅🏽‍♂️e✅f0️⃣g🇨🇿10🦅#hash`; + const tokens = parseTokens(text); + + expect(tokens).toEqual([ + "😬", + "a", + "🌍", + "b", + "🗺", + "c", + "🔥", + "d", + "☂️", + "《", + "👩🏽‍🦰", + "》", + "👨‍👩‍👧‍👦", + "德", + "👩🏾‍🔬", + "こ", + "🏳️‍🌈", + "안", + "🧔‍♀️", + "g", + "🧑‍🤝‍🧑", + "h", + "🙅🏽‍♂️", + "e", + "✅", + "f0️⃣g", // bummer, but ok, as we traded kecaps not breaking (less common) for hash and numbers not breaking (more common) + "🇨🇿", + "10", // nice! do not break the number, as it's by default matched by \p{Emoji} + "🦅", + "#hash", // nice! do not break the hash, as it's by default matched by \p{Emoji} + ]); + }); + + it("should tokenize decomposed chars into their composed variants", () => { + // each input character is in a decomposed form + const text = "čでäぴέ다й한"; + expect(text.normalize("NFC").length).toEqual(8); + expect(text).toEqual(text.normalize("NFD")); + + const tokens = parseTokens(text); + expect(tokens.length).toEqual(8); + expect(tokens).toEqual(["č", "で", "ä", "ぴ", "έ", "다", "й", "한"]); + }); + + it("should tokenize artificial CJK", () => { + const text = `《道德經》醫-醫こんにちは世界!안녕하세요세계;다.다...원/달(((다)))[[1]]〚({((한))>)〛た…[Hello] World?ニューヨーク・¥3700.55す。090-1234-5678¥1,000〜$5,000「素晴らしい!」〔重要〕#1:Taro君30%は、(たなばた)〰¥110±¥570で20℃〜9:30〜10:00【一番】`; + + // [ + // '《道', '德', '經》', '醫-', + // '醫', 'こ', 'ん', 'に', + // 'ち', 'は', '世', '界!', + // '안', '녕', '하', '세', + // '요', '세', '계;', '다.', + // '다...', '원/', '달', '(((다)))', + // '[[1]]', '〚({((한))>)〛', 'た…', '[Hello]', + // ' ', 'World?', 'ニ', 'ュ', + // 'ー', 'ヨ', 'ー', 'ク・', + // '¥3700.55', 'す。', '090-', '1234-', + // '5678¥1,000', '〜', '$5,000', '「素', + // '晴', 'ら', 'し', 'い!」', + // '〔重', '要〕', '#', '1:', + // 'Taro', '君', '30%', 'は、', + // '(た', 'な', 'ば', 'た)', + // '〰', '¥110±', '¥570', 'で', + // '20℃', '〜', '9:30', '〜', + // '10:00', '【一', '番】' + // ] + const tokens = parseTokens(text); + + // Latin + expect(tokens).toContain("[[1]]"); + expect(tokens).toContain("[Hello]"); + expect(tokens).toContain("World?"); + expect(tokens).toContain("Taro"); + + // Chinese + expect(tokens).toContain("《道"); + expect(tokens).toContain("德"); + expect(tokens).toContain("經》"); + expect(tokens).toContain("醫-"); + expect(tokens).toContain("醫"); + + // Japanese + expect(tokens).toContain("こ"); + expect(tokens).toContain("ん"); + expect(tokens).toContain("に"); + expect(tokens).toContain("ち"); + expect(tokens).toContain("は"); + expect(tokens).toContain("世"); + expect(tokens).toContain("ニ"); + expect(tokens).toContain("ク・"); + expect(tokens).toContain("界!"); + expect(tokens).toContain("た…"); + expect(tokens).toContain("す。"); + expect(tokens).toContain("ュ"); + expect(tokens).toContain("ー"); + expect(tokens).toContain("「素"); + expect(tokens).toContain("晴"); + expect(tokens).toContain("ら"); + expect(tokens).toContain("し"); + expect(tokens).toContain("い!」"); + expect(tokens).toContain("君"); + expect(tokens).toContain("は、"); + expect(tokens).toContain("(た"); + expect(tokens).toContain("な"); + expect(tokens).toContain("ば"); + expect(tokens).toContain("た)"); + expect(tokens).toContain("で"); + expect(tokens).toContain("【一"); + expect(tokens).toContain("番】"); + + // Check for Korean + expect(tokens).toContain("안"); + expect(tokens).toContain("녕"); + expect(tokens).toContain("하"); + expect(tokens).toContain("세"); + expect(tokens).toContain("요"); + expect(tokens).toContain("세"); + expect(tokens).toContain("계;"); + expect(tokens).toContain("다."); + expect(tokens).toContain("다..."); + expect(tokens).toContain("원/"); + expect(tokens).toContain("달"); + expect(tokens).toContain("(((다)))"); + expect(tokens).toContain("〚({((한))>)〛"); + + // Numbers and units + expect(tokens).toContain("¥3700.55"); + expect(tokens).toContain("090-"); + expect(tokens).toContain("1234-"); + expect(tokens).toContain("5678¥1,000"); + expect(tokens).toContain("$5,000"); + expect(tokens).toContain("1:"); + expect(tokens).toContain("30%"); + expect(tokens).toContain("¥110±"); + expect(tokens).toContain("¥570"); + expect(tokens).toContain("20℃"); + expect(tokens).toContain("9:30"); + expect(tokens).toContain("10:00"); + + // Punctuation and symbols + expect(tokens).toContain("〜"); + expect(tokens).toContain("〰"); + expect(tokens).toContain("#"); + }); }); }); diff --git a/packages/excalidraw/element/textElement.ts b/packages/excalidraw/element/textElement.ts index 9abebc3563..7618dba804 100644 --- a/packages/excalidraw/element/textElement.ts +++ b/packages/excalidraw/element/textElement.ts @@ -16,6 +16,7 @@ import { BOUND_TEXT_PADDING, DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, + ENV, TEXT_ALIGN, VERTICAL_ALIGN, } from "../constants"; @@ -30,6 +31,172 @@ import { } from "./containerCache"; import type { ExtractSetType } from "../utility-types"; +/** + * Matches various emoji types. + * + * 1. basic emojis (😀, 🌍) + * 2. flags (🇨🇿) + * 3. multi-codepoint emojis: + * - skin tones (👍🏽) + * - variation selectors (☂️) + * - keycaps (1️⃣) + * - tag sequences (🏴󠁧󠁢󠁥󠁮󠁧󠁿) + * - emoji sequences (👨‍👩‍👧‍👦, 👩‍🚀, 🏳️‍🌈) + * + * Unicode points: + * - \uFE0F: presentation selector + * - \u20E3: enclosing keycap + * - \u200D: ZWJ (zero width joiner) + * - \u{E0020}-\u{E007E}: tags + * - \u{E007F}: cancel tag + * + * @see https://unicode.org/reports/tr51/#EBNF_and_Regex, with changes: + * - replaced \p{Emoji} with [\p{Extended_Pictographic}\p{Emoji_Presentation}], see more in `should tokenize emojis mixed with mixed text` test + * - replaced \p{Emod} with \p{Emoji_Modifier} as some do not understand the abbreviation (i.e. https://devina.io/redos-checker) + */ +const _EMOJI_CHAR = + /(\p{RI}\p{RI}|[\p{Extended_Pictographic}\p{Emoji_Presentation}](?:\p{Emoji_Modifier}|\uFE0F\u20E3?|[\u{E0020}-\u{E007E}]+\u{E007F})?(?:\u200D(?:\p{RI}\p{RI}|[\p{Emoji}](?:\p{Emoji_Modifier}|\uFE0F\u20E3?|[\u{E0020}-\u{E007E}]+\u{E007F})?))*)/u; + +/** + * Detect a CJK char, though does not include every possible char used in CJK texts, + * such as symbols and punctuations. + * + * By default every CJK is a breaking point, though CJK has additional breaking points, + * including full width punctuations or symbols (Chinese and Japanese) and western punctuations (Korean). + * + * Additional CJK breaking point rules: + * - expect a break before (lookahead), but not after (negative lookbehind), i.e. "(" or "(" + * - expect a break after (lookbehind), but not before (negative lookahead), i.e. ")" or ")" + * - expect a break always (lookahead and lookbehind), i.e. "〃" + */ +const _CJK_CHAR = + /\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Hangul}/u; + +/** + * Following characters break only with CJK, not with alphabetic characters. + * This is essential for Korean, as it uses alphabetic punctuation, but expects CJK-like breaking points. + * + * Hello((た)) → ["Hello", "((た))"] + * Hello((World)) → ["Hello((World))"] + */ +const _CJK_BREAK_NOT_AFTER_BUT_BEFORE = /<\(\[\{/u; +const _CJK_BREAK_NOT_BEFORE_BUT_AFTER = />\)\]\}.,:;\?!/u; +const _CJK_BREAK_ALWAYS = / 〃〜~〰#&*+-ー/=|¬ ̄¦/u; +const _CJK_SYMBOLS_AND_PUNCTUATION = + /()[]{}〈〉《》⦅⦆「」「」『』【】〖〗〔〕〘〙〚〛<>〝〞'〟・。゚゙,、.:;?!%ー/u; + +/** + * Following characters break with any character, even though are mostly used with CJK. + * + * Hello た。→ ["Hello", "た。"] + * ↑ DON'T BREAK "た。" (negative lookahead) + * Hello「た」 World → ["Hello", "「た」", "World"] + * ↑ DON'T BREAK "「た" (negative lookbehind) + * ↑ DON'T BREAK "た」"(negative lookahead) + * ↑ BREAK BEFORE "「" (lookahead) + * ↑ BREAK AFTER "」" (lookbehind) + */ +const _ANY_BREAK_NOT_AFTER_BUT_BEFORE = /([{〈《⦅「「『【〖〔〘〚<〝/u; +const _ANY_BREAK_NOT_BEFORE_BUT_AFTER = + /)]}〉》⦆」」』】〗〕〙〛>〞'〟・。゚゙,、.:;?!%±‥…\//u; + +/** + * Natural breaking points for any grammars. + * + * Hello-world + * ↑ BREAK AFTER "-" → ["Hello-", "world"] + * Hello world + * ↑ BREAK ALWAYS " " → ["Hello", " ", "world"] + */ +const _ANY_BREAK_AFTER = /-/u; +const _ANY_BREAK_ALWAYS = /\s/u; + +/** + * Simple fallback for browsers (mainly Safari < 16.4) that don't support "Lookbehind assertion". + * + * Browser support as of 10/2024: + * - 91% Lookbehind assertion https://caniuse.com/mdn-javascript_regular_expressions_lookbehind_assertion + * - 94% Unicode character class escape https://caniuse.com/mdn-javascript_regular_expressions_unicode_character_class_escape + * + * Does not include advanced CJK breaking rules, but covers most of the core cases, especially for latin. + */ +const BREAK_LINE_REGEX_SIMPLE = new RegExp( + `${_EMOJI_CHAR.source}|([${_ANY_BREAK_ALWAYS.source}${_CJK_CHAR.source}${_CJK_BREAK_ALWAYS.source}${_ANY_BREAK_AFTER.source}])`, + "u", +); + +// Hello World → ["Hello", " World"] +// ↑ BREAK BEFORE " " +// HelloたWorld → ["Hello", "たWorld"] +// ↑ BREAK BEFORE "た" +// Hello「World」→ ["Hello", "「World」"] +// ↑ BREAK BEFORE "「" +const getLookaheadBreakingPoints = () => { + const ANY_BREAKING_POINT = `(? { + const ANY_BREAKING_POINT = `(?![${_ANY_BREAK_NOT_BEFORE_BUT_AFTER.source}])(?<=[${_ANY_BREAK_NOT_BEFORE_BUT_AFTER.source}${_ANY_BREAK_ALWAYS.source}${_ANY_BREAK_AFTER.source}])`; + const CJK_BREAKING_POINT = `(?![${_ANY_BREAK_NOT_BEFORE_BUT_AFTER.source}${_CJK_BREAK_NOT_BEFORE_BUT_AFTER.source}${_ANY_BREAK_AFTER.source}])(?<=[${_CJK_CHAR.source}${_CJK_BREAK_ALWAYS.source}][${_CJK_BREAK_NOT_BEFORE_BUT_AFTER.source}]*)`; + return new RegExp(`(?:${ANY_BREAKING_POINT}|${CJK_BREAKING_POINT})`, "u"); +}; + +/** + * Break a line based on the whitespaces, CJK / emoji chars and language specific breaking points, + * like hyphen for alphabetic and various full-width codepoints for CJK - especially Japanese, e.g.: + * + * "Hello 世界。🌎🗺" → ["Hello", " ", "世", "界。", "🌎", "🗺"] + * "Hello-world" → ["Hello-", "world"] + * "「Hello World」" → ["「Hello", " ", "World」"] + */ +const getBreakLineRegexAdvanced = () => + new RegExp( + `${_EMOJI_CHAR.source}|${getLookaheadBreakingPoints().source}|${ + getLookbehindBreakingPoints().source + }`, + "u", + ); + +let cachedBreakLineRegex: RegExp | undefined; + +// Lazy-load for browsers that don't support "Lookbehind assertion" +const getBreakLineRegex = () => { + if (!cachedBreakLineRegex) { + try { + cachedBreakLineRegex = getBreakLineRegexAdvanced(); + } catch { + cachedBreakLineRegex = BREAK_LINE_REGEX_SIMPLE; + } + } + + return cachedBreakLineRegex; +}; + +const CJK_REGEX = new RegExp( + `[${_CJK_CHAR.source}${_CJK_BREAK_ALWAYS.source}${_CJK_SYMBOLS_AND_PUNCTUATION.source}]`, + "u", +); + +const EMOJI_REGEX = new RegExp(`${_EMOJI_CHAR.source}`, "u"); + +export const containsCJK = (text: string) => { + return CJK_REGEX.test(text); +}; + +export const containsEmoji = (text: string) => { + return EMOJI_REGEX.test(text); +}; + export const normalizeText = (text: string) => { return ( normalizeEOL(text) @@ -408,22 +575,132 @@ export const getTextHeight = ( return getLineHeightInPx(fontSize, lineHeight) * lineCount; }; -export const parseTokens = (text: string) => { - // Splitting words containing "-" as those are treated as separate words - // by css wrapping algorithm eg non-profit => non-, profit - const words = text.split("-"); - if (words.length > 1) { - // non-proft org => ['non-', 'profit org'] - words.forEach((word, index) => { - if (index !== words.length - 1) { - words[index] = word += "-"; - } - }); +export const parseTokens = (line: string) => { + const breakLineRegex = getBreakLineRegex(); + + // normalizing to single-codepoint composed chars due to canonical equivalence of multi-codepoint versions for chars like č, で (~ so that we don't break a line in between c and ˇ) + // filtering due to multi-codepoint chars like 👨‍👩‍👧‍👦, 👩🏽‍🦰 + return line.normalize("NFC").split(breakLineRegex).filter(Boolean); +}; + +// handles multi-byte chars (é, 中) and purposefully does not handle multi-codepoint char (👨‍👩‍👧‍👦, 👩🏽‍🦰) +const isSingleCharacter = (maybeSingleCharacter: string) => { + return ( + maybeSingleCharacter.codePointAt(0) !== undefined && + maybeSingleCharacter.codePointAt(1) === undefined + ); +}; + +const satisfiesWordInvariant = (word: string) => { + if (import.meta.env.MODE === ENV.TEST || import.meta.env.DEV) { + if (/\s/.test(word)) { + throw new Error("Word should not contain any whitespaces!"); + } } - // Joining the words with space and splitting them again with space to get the - // final list of tokens - // ['non-', 'profit org'] =>,'non- proft org' => ['non-','profit','org'] - return words.join(" ").split(" "); +}; + +const wrapWord = ( + word: string, + font: FontString, + maxWidth: number, +): Array => { + // multi-codepoint emojis are already broken apart and shouldn't be broken further + if (EMOJI_REGEX.test(word)) { + return [word]; + } + + satisfiesWordInvariant(word); + + const lines: Array = []; + const chars = Array.from(word); + + let currentLine = ""; + let currentLineWidth = 0; + + for (const char of chars) { + const _charWidth = charWidth.calculate(char, font); + const testLineWidth = currentLineWidth + _charWidth; + + if (testLineWidth <= maxWidth) { + currentLine = currentLine + char; + currentLineWidth = testLineWidth; + continue; + } + + if (currentLine) { + lines.push(currentLine); + } + + currentLine = char; + currentLineWidth = _charWidth; + } + + if (currentLine) { + lines.push(currentLine); + } + + return lines; +}; + +const wrapLine = ( + line: string, + font: FontString, + maxWidth: number, +): string[] => { + const lines: Array = []; + const tokens = parseTokens(line); + const tokenIterator = tokens[Symbol.iterator](); + + let currentLine = ""; + let currentLineWidth = 0; + + let iterator = tokenIterator.next(); + + while (!iterator.done) { + const token = iterator.value; + const testLine = currentLine + token; + + // cache single codepoint whitespace, CJK or emoji width calc. as kerning should not apply here + const testLineWidth = isSingleCharacter(token) + ? currentLineWidth + charWidth.calculate(token, font) + : getLineWidth(testLine, font, true); + + // build up the current line, skipping length check for possibly trailing whitespaces + if (/\s/.test(token) || testLineWidth <= maxWidth) { + currentLine = testLine; + currentLineWidth = testLineWidth; + iterator = tokenIterator.next(); + continue; + } + + // current line is empty => just the token (word) is longer than `maxWidth` and needs to be wrapped + if (!currentLine) { + const wrappedWord = wrapWord(token, font, maxWidth); + const trailingLine = wrappedWord[wrappedWord.length - 1] ?? ""; + const precedingLines = wrappedWord.slice(0, -1); + + lines.push(...precedingLines); + + // trailing line of the wrapped word might still be joined with next token/s + currentLine = trailingLine; + currentLineWidth = getLineWidth(trailingLine, font, true); + iterator = tokenIterator.next(); + } else { + // push & reset, but don't iterate on the next token, as we didn't use it yet! + lines.push(currentLine.trimEnd()); + + // purposefully not iterating and not setting `currentLine` to `token`, so that we could use a simple !currentLine check above + currentLine = ""; + currentLineWidth = 0; + } + } + + // iterator done, push the trailing line if exists + if (currentLine) { + lines.push(currentLine.trimEnd()); + } + + return lines; }; export const wrapText = ( @@ -440,134 +717,17 @@ export const wrapText = ( const lines: Array = []; const originalLines = text.split("\n"); - const spaceAdvanceWidth = getLineWidth(" ", font, true); - - let currentLine = ""; - let currentLineWidthTillNow = 0; - - const push = (str: string) => { - if (str.trim()) { - lines.push(str); - } - }; - - const resetParams = () => { - currentLine = ""; - currentLineWidthTillNow = 0; - }; for (const originalLine of originalLines) { const currentLineWidth = getLineWidth(originalLine, font, true); - // Push the line if its <= maxWidth if (currentLineWidth <= maxWidth) { lines.push(originalLine); continue; } - const words = parseTokens(originalLine); - resetParams(); - - let index = 0; - - while (index < words.length) { - const currentWordWidth = getLineWidth(words[index], font, true); - - // This will only happen when single word takes entire width - if (currentWordWidth === maxWidth) { - push(words[index]); - index++; - } - - // Start breaking longer words exceeding max width - else if (currentWordWidth > maxWidth) { - // push current line since the current word exceeds the max width - // so will be appended in next line - push(currentLine); - - resetParams(); - - while (words[index].length > 0) { - const currentChar = String.fromCodePoint( - words[index].codePointAt(0)!, - ); - - const line = currentLine + currentChar; - // use advance width instead of the actual width as it's closest to the browser wapping algo - // use width of the whole line instead of calculating individual chars to accomodate for kerning - const lineAdvanceWidth = getLineWidth(line, font, true); - const charAdvanceWidth = charWidth.calculate(currentChar, font); - - currentLineWidthTillNow = lineAdvanceWidth; - words[index] = words[index].slice(currentChar.length); - - if (currentLineWidthTillNow >= maxWidth) { - push(currentLine); - currentLine = currentChar; - currentLineWidthTillNow = charAdvanceWidth; - } else { - currentLine = line; - } - } - // push current line if appending space exceeds max width - if (currentLineWidthTillNow + spaceAdvanceWidth >= maxWidth) { - push(currentLine); - resetParams(); - // space needs to be appended before next word - // as currentLine contains chars which couldn't be appended - // to previous line unless the line ends with hyphen to sync - // with css word-wrap - } else if (!currentLine.endsWith("-")) { - currentLine += " "; - currentLineWidthTillNow += spaceAdvanceWidth; - } - index++; - } else { - // Start appending words in a line till max width reached - while (currentLineWidthTillNow < maxWidth && index < words.length) { - const word = words[index]; - currentLineWidthTillNow = getLineWidth( - currentLine + word, - font, - true, - ); - - if (currentLineWidthTillNow > maxWidth) { - push(currentLine); - resetParams(); - - break; - } - index++; - - // if word ends with "-" then we don't need to add space - // to sync with css word-wrap - const shouldAppendSpace = !word.endsWith("-"); - currentLine += word; - - if (shouldAppendSpace) { - currentLine += " "; - } - - // Push the word if appending space exceeds max width - if (currentLineWidthTillNow + spaceAdvanceWidth >= maxWidth) { - if (shouldAppendSpace) { - lines.push(currentLine.slice(0, -1)); - } else { - lines.push(currentLine); - } - resetParams(); - break; - } - } - } - } - - if (currentLine.slice(-1) === " ") { - // only remove last trailing space which we have added when joining words - currentLine = currentLine.slice(0, -1); - push(currentLine); - } + const wrappedLine = wrapLine(originalLine, font, maxWidth); + lines.push(...wrappedLine); } return lines.join("\n"); @@ -577,24 +737,30 @@ export const charWidth = (() => { const cachedCharWidth: { [key: FontString]: Array } = {}; const calculate = (char: string, font: FontString) => { - const ascii = char.charCodeAt(0); + const unicode = char.charCodeAt(0); if (!cachedCharWidth[font]) { cachedCharWidth[font] = []; } - if (!cachedCharWidth[font][ascii]) { + if (!cachedCharWidth[font][unicode]) { const width = getLineWidth(char, font, true); - cachedCharWidth[font][ascii] = width; + cachedCharWidth[font][unicode] = width; } - return cachedCharWidth[font][ascii]; + return cachedCharWidth[font][unicode]; }; const getCache = (font: FontString) => { return cachedCharWidth[font]; }; + + const clearCache = (font: FontString) => { + cachedCharWidth[font] = []; + }; + return { calculate, getCache, + clearCache, }; })(); diff --git a/packages/excalidraw/element/textWysiwyg.test.tsx b/packages/excalidraw/element/textWysiwyg.test.tsx index ea57ca190c..2dc397a2d4 100644 --- a/packages/excalidraw/element/textWysiwyg.test.tsx +++ b/packages/excalidraw/element/textWysiwyg.test.tsx @@ -917,7 +917,7 @@ describe("textWysiwyg", () => { Keyboard.exitTextEditor(editor); text = h.elements[1] as ExcalidrawTextElementWithContainer; - expect(text.text).toBe("Hello \nWorld!"); + expect(text.text).toBe("Hello\nWorld!"); expect(text.originalText).toBe("Hello World!"); expect(text.y).toBe( rectangle.y + h.elements[0].height / 2 - text.height / 2, @@ -1220,7 +1220,7 @@ describe("textWysiwyg", () => { ); expect((h.elements[1] as ExcalidrawTextElementWithContainer).text).toBe( - "Online \nwhitebo\nard \ncollabo\nration \nmade \neasy", + "Online\nwhiteboa\nrd\ncollabor\nation\nmade\neasy", ); fireEvent.contextMenu(GlobalTestState.interactiveCanvas, { button: 2, diff --git a/packages/excalidraw/errors.ts b/packages/excalidraw/errors.ts index 705ba7a6ff..8509deb52f 100644 --- a/packages/excalidraw/errors.ts +++ b/packages/excalidraw/errors.ts @@ -36,3 +36,28 @@ export class ImageSceneDataError extends Error { export class InvalidFractionalIndexError extends Error { public code = "ELEMENT_HAS_INVALID_INDEX" as const; } + +type WorkerErrorCodes = "WORKER_URL_NOT_DEFINED" | "WORKER_IN_THE_MAIN_CHUNK"; + +export class WorkerUrlNotDefinedError extends Error { + public code; + constructor( + message = "Worker URL is not defined!", + code: WorkerErrorCodes = "WORKER_URL_NOT_DEFINED", + ) { + super(message); + this.name = "WorkerUrlNotDefinedError"; + this.code = code; + } +} +export class WorkerInTheMainChunkError extends Error { + public code; + constructor( + message = "Worker has to be in a separate chunk!", + code: WorkerErrorCodes = "WORKER_IN_THE_MAIN_CHUNK", + ) { + super(message); + this.name = "WorkerInTheMainChunkError"; + this.code = code; + } +} diff --git a/packages/excalidraw/fonts/ExcalidrawFont.ts b/packages/excalidraw/fonts/ExcalidrawFont.ts deleted file mode 100644 index 51d6578c6a..0000000000 --- a/packages/excalidraw/fonts/ExcalidrawFont.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { - base64ToArrayBuffer, - stringToBase64, - toByteString, -} from "../data/encode"; -import { LOCAL_FONT_PROTOCOL } from "./metadata"; -import loadWoff2 from "./wasm/woff2.loader"; -import loadHbSubset from "./wasm/hb-subset.loader"; - -export interface Font { - urls: URL[]; - fontFace: FontFace; - getContent(codePoints: ReadonlySet): Promise; -} -export const UNPKG_FALLBACK_URL = `https://unpkg.com/${ - import.meta.env.VITE_PKG_NAME - ? `${import.meta.env.VITE_PKG_NAME}@${import.meta.env.PKG_VERSION}` // should be provided by vite during package build - : "@excalidraw/excalidraw" // fallback to latest package version (i.e. for app) -}/dist/prod/`; - -export class ExcalidrawFont implements Font { - public readonly urls: URL[]; - public readonly fontFace: FontFace; - - constructor(family: string, uri: string, descriptors?: FontFaceDescriptors) { - this.urls = ExcalidrawFont.createUrls(uri); - - const sources = this.urls - .map((url) => `url(${url}) ${ExcalidrawFont.getFormat(url)}`) - .join(", "); - - this.fontFace = new FontFace(family, sources, { - display: "swap", - style: "normal", - weight: "400", - ...descriptors, - }); - } - - /** - * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks). - * - * NOTE: assumes usage of `dataurl` outside the browser environment - * - * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise - */ - public async getContent(codePoints: ReadonlySet): Promise { - let i = 0; - const errorMessages = []; - - while (i < this.urls.length) { - const url = this.urls[i]; - - // it's dataurl (server), the font is inlined as base64, no need to fetch - if (url.protocol === "data:") { - const arrayBuffer = base64ToArrayBuffer(url.toString().split(",")[1]); - - const base64 = await ExcalidrawFont.subsetGlyphsByCodePoints( - arrayBuffer, - codePoints, - ); - - return base64; - } - - try { - const response = await fetch(url, { - headers: { - Accept: "font/woff2", - }, - }); - - if (response.ok) { - const arrayBuffer = await response.arrayBuffer(); - const base64 = await ExcalidrawFont.subsetGlyphsByCodePoints( - arrayBuffer, - codePoints, - ); - - return base64; - } - - // response not ok, try to continue - errorMessages.push( - `"${url.toString()}" returned status "${response.status}"`, - ); - } catch (e) { - errorMessages.push(`"${url.toString()}" returned error "${e}"`); - } - - i++; - } - - console.error( - `Failed to fetch font "${ - this.fontFace.family - }" from urls "${this.urls.toString()}`, - JSON.stringify(errorMessages, undefined, 2), - ); - - // in case of issues, at least return the last url as a content - // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others - return this.urls.length ? this.urls[this.urls.length - 1].toString() : ""; - } - - /** - * Tries to subset glyphs in a font based on the used codepoints, returning the font as daturl. - * - * @param arrayBuffer font data buffer, preferrably in the woff2 format, though others should work as well - * @param codePoints codepoints used to subset the glyphs - * - * @returns font with subsetted glyphs (all glyphs in case of errors) converted into a dataurl - */ - private static async subsetGlyphsByCodePoints( - arrayBuffer: ArrayBuffer, - codePoints: ReadonlySet, - ): Promise { - try { - // lazy loaded wasm modules to avoid multiple initializations in case of concurrent triggers - const { compress, decompress } = await loadWoff2(); - const { subset } = await loadHbSubset(); - - const decompressedBinary = decompress(arrayBuffer).buffer; - const subsetSnft = subset(decompressedBinary, codePoints); - const compressedBinary = compress(subsetSnft.buffer); - - return ExcalidrawFont.toBase64(compressedBinary.buffer); - } catch (e) { - console.error("Skipped glyph subsetting", e); - // Fallback to encoding whole font in case of errors - return ExcalidrawFont.toBase64(arrayBuffer); - } - } - - private static async toBase64(arrayBuffer: ArrayBuffer) { - let base64: string; - - if (typeof Buffer !== "undefined") { - // node + server-side - base64 = Buffer.from(arrayBuffer).toString("base64"); - } else { - base64 = await stringToBase64(await toByteString(arrayBuffer), true); - } - - return `data:font/woff2;base64,${base64}`; - } - - private static createUrls(uri: string): URL[] { - if (uri.startsWith(LOCAL_FONT_PROTOCOL)) { - // no url for local fonts - return []; - } - - if (uri.startsWith("http") || uri.startsWith("data")) { - // one url for http imports or data url - return [new URL(uri)]; - } - - // absolute assets paths, which are found in tests and excalidraw-app build, won't work with base url, so we are stripping initial slash away - const assetUrl: string = uri.replace(/^\/+/, ""); - const urls: URL[] = []; - - if (typeof window.EXCALIDRAW_ASSET_PATH === "string") { - const normalizedBaseUrl = this.normalizeBaseUrl( - window.EXCALIDRAW_ASSET_PATH, - ); - - urls.push(new URL(assetUrl, normalizedBaseUrl)); - } else if (Array.isArray(window.EXCALIDRAW_ASSET_PATH)) { - window.EXCALIDRAW_ASSET_PATH.forEach((path) => { - const normalizedBaseUrl = this.normalizeBaseUrl(path); - urls.push(new URL(assetUrl, normalizedBaseUrl)); - }); - } - - // fallback url for bundled fonts - urls.push(new URL(assetUrl, UNPKG_FALLBACK_URL)); - - return urls; - } - - private static getFormat(url: URL) { - try { - const parts = new URL(url).pathname.split("."); - - if (parts.length === 1) { - return ""; - } - - return `format('${parts.pop()}')`; - } catch (error) { - return ""; - } - } - - private static normalizeBaseUrl(baseUrl: string) { - let result = baseUrl; - - // in case user passed a root-relative url (~absolute path), - // like "/" or "/some/path", or relative (starts with "./"), - // prepend it with `location.origin` - if (/^\.?\//.test(result)) { - result = new URL( - result.replace(/^\.?\/+/, ""), - window?.location?.origin, - ).toString(); - } - - // ensure there is a trailing slash, otherwise url won't be correctly concatenated - result = `${result.replace(/\/+$/, "")}/`; - - return result; - } -} diff --git a/packages/excalidraw/fonts/ExcalidrawFontFace.ts b/packages/excalidraw/fonts/ExcalidrawFontFace.ts new file mode 100644 index 0000000000..182b8e50cd --- /dev/null +++ b/packages/excalidraw/fonts/ExcalidrawFontFace.ts @@ -0,0 +1,213 @@ +import { promiseTry } from "../utils"; +import { LOCAL_FONT_PROTOCOL } from "./metadata"; +import { subsetWoff2GlyphsByCodepoints } from "./subset/subset-main"; + +type DataURL = string; + +export interface IExcalidrawFontFace { + urls: URL[] | DataURL[]; + fontFace: FontFace; + toCSS( + characters: string, + codePoints: Array, + ): Promise | undefined; +} + +export class ExcalidrawFontFace implements IExcalidrawFontFace { + public readonly urls: URL[] | DataURL[]; + public readonly fontFace: FontFace; + + private static readonly UNPKG_FALLBACK_URL = `https://unpkg.com/${ + import.meta.env.VITE_PKG_NAME + ? `${import.meta.env.VITE_PKG_NAME}@${import.meta.env.PKG_VERSION}` // should be provided by vite during package build + : "@excalidraw/excalidraw" // fallback to latest package version (i.e. for app) + }/dist/prod/`; + + constructor(family: string, uri: string, descriptors?: FontFaceDescriptors) { + this.urls = ExcalidrawFontFace.createUrls(uri); + + const sources = this.urls + .map((url) => `url(${url}) ${ExcalidrawFontFace.getFormat(url)}`) + .join(", "); + + this.fontFace = new FontFace(family, sources, { + display: "swap", + style: "normal", + weight: "400", + ...descriptors, + }); + } + + /** + * Generates CSS `@font-face` definition with the (subsetted) font source as a data url for the characters within the unicode range. + * + * Retrieves `undefined` otherwise. + */ + public toCSS( + characters: string, + codePoints: Array, + ): Promise | undefined { + // quick exit in case the characters are not within this font face's unicode range + if (!this.getUnicodeRangeRegex().test(characters)) { + return; + } + + return this.getContent(codePoints).then( + (content) => + `@font-face { font-family: ${this.fontFace.family}; src: url(${content}); }`, + ); + } + + /** + * Tries to fetch woff2 content, based on the registered urls (from first to last, treated as fallbacks). + * + * @returns base64 with subsetted glyphs based on the passed codepoint, last defined url otherwise + */ + public async getContent(codePoints: Array): Promise { + let i = 0; + const errorMessages = []; + + while (i < this.urls.length) { + const url = this.urls[i]; + + try { + const arrayBuffer = await this.fetchFont(url); + const base64 = await subsetWoff2GlyphsByCodepoints( + arrayBuffer, + codePoints, + ); + + return base64; + } catch (e) { + errorMessages.push(`"${url.toString()}" returned error "${e}"`); + } + + i++; + } + + console.error( + `Failed to fetch font family "${this.fontFace.family}"`, + JSON.stringify(errorMessages, undefined, 2), + ); + + // in case of issues, at least return the last url as a content + // defaults to unpkg for bundled fonts (so that we don't have to host them forever) and http url for others + return this.urls.length ? this.urls[this.urls.length - 1].toString() : ""; + } + + public fetchFont(url: URL | DataURL): Promise { + return promiseTry(async () => { + const response = await fetch(url, { + headers: { + Accept: "font/woff2", + }, + }); + + if (!response.ok) { + const urlString = url instanceof URL ? url.toString() : "dataurl"; + throw new Error( + `Failed to fetch "${urlString}": ${response.statusText}`, + ); + } + + const arrayBuffer = await response.arrayBuffer(); + return arrayBuffer; + }); + } + + private getUnicodeRangeRegex() { + // using \u{h} or \u{hhhhh} to match any number of hex digits, + // otherwise we would get an "Invalid Unicode escape" error + // e.g. U+0-1007F -> \u{0}-\u{1007F} + const unicodeRangeRegex = this.fontFace.unicodeRange + .split(/,\s*/) + .map((range) => { + const [start, end] = range.replace("U+", "").split("-"); + if (end) { + return `\\u{${start}}-\\u{${end}}`; + } + + return `\\u{${start}}`; + }) + .join(""); + + return new RegExp(`[${unicodeRangeRegex}]`, "u"); + } + + private static createUrls(uri: string): URL[] | DataURL[] { + if (uri.startsWith("data")) { + // don't create the URL instance, as parsing the huge dataurl string is expensive + return [uri]; + } + + if (uri.startsWith(LOCAL_FONT_PROTOCOL)) { + // no url for local fonts + return []; + } + + if (uri.startsWith("http")) { + // one url for http imports or data url + return [new URL(uri)]; + } + + // absolute assets paths, which are found in tests and excalidraw-app build, won't work with base url, so we are stripping initial slash away + const assetUrl: string = uri.replace(/^\/+/, ""); + const urls: URL[] = []; + + if (typeof window.EXCALIDRAW_ASSET_PATH === "string") { + const normalizedBaseUrl = this.normalizeBaseUrl( + window.EXCALIDRAW_ASSET_PATH, + ); + + urls.push(new URL(assetUrl, normalizedBaseUrl)); + } else if (Array.isArray(window.EXCALIDRAW_ASSET_PATH)) { + window.EXCALIDRAW_ASSET_PATH.forEach((path) => { + const normalizedBaseUrl = this.normalizeBaseUrl(path); + urls.push(new URL(assetUrl, normalizedBaseUrl)); + }); + } + + // fallback url for bundled fonts + urls.push(new URL(assetUrl, ExcalidrawFontFace.UNPKG_FALLBACK_URL)); + + return urls; + } + + private static getFormat(url: URL | DataURL) { + if (!(url instanceof URL)) { + // format is irrelevant for data url + return ""; + } + + try { + const parts = new URL(url).pathname.split("."); + + if (parts.length === 1) { + return ""; + } + + return `format('${parts.pop()}')`; + } catch (error) { + return ""; + } + } + + private static normalizeBaseUrl(baseUrl: string) { + let result = baseUrl; + + // in case user passed a root-relative url (~absolute path), + // like "/" or "/some/path", or relative (starts with "./"), + // prepend it with `location.origin` + if (/^\.?\//.test(result)) { + result = new URL( + result.replace(/^\.?\/+/, ""), + window?.location?.origin, + ).toString(); + } + + // ensure there is a trailing slash, otherwise url won't be correctly concatenated + result = `${result.replace(/\/+$/, "")}/`; + + return result; + } +} diff --git a/packages/excalidraw/fonts/assets/fonts.css b/packages/excalidraw/fonts/css/fonts.css similarity index 68% rename from packages/excalidraw/fonts/assets/fonts.css rename to packages/excalidraw/fonts/css/fonts.css index 09bb0cd3a7..8a8fec349b 100644 --- a/packages/excalidraw/fonts/assets/fonts.css +++ b/packages/excalidraw/fonts/css/fonts.css @@ -4,7 +4,7 @@ @font-face { font-family: "Assistant"; - src: url(./Assistant-Regular.woff2) format("woff2"); + src: url(../woff2/Assistant/Assistant-Regular.woff2) format("woff2"); font-weight: 400; style: normal; display: swap; @@ -12,7 +12,7 @@ @font-face { font-family: "Assistant"; - src: url(./Assistant-Medium.woff2) format("woff2"); + src: url(../woff2/Assistant/Assistant-Medium.woff2) format("woff2"); font-weight: 500; style: normal; display: swap; @@ -20,7 +20,7 @@ @font-face { font-family: "Assistant"; - src: url(./Assistant-SemiBold.woff2) format("woff2"); + src: url(../woff2/Assistant/Assistant-SemiBold.woff2) format("woff2"); font-weight: 600; style: normal; display: swap; @@ -28,7 +28,7 @@ @font-face { font-family: "Assistant"; - src: url(./Assistant-Bold.woff2) format("woff2"); + src: url(../woff2/Assistant/Assistant-Bold.woff2) format("woff2"); font-weight: 700; style: normal; display: swap; diff --git a/packages/excalidraw/fonts/index.ts b/packages/excalidraw/fonts/index.ts index 1de1f99c9a..825688475f 100644 --- a/packages/excalidraw/fonts/index.ts +++ b/packages/excalidraw/fonts/index.ts @@ -8,30 +8,28 @@ import type { import { ShapeCache } from "../scene/ShapeCache"; import { isTextElement } from "../element"; import { getFontString } from "../utils"; -import { FONT_FAMILY } from "../constants"; import { - LOCAL_FONT_PROTOCOL, - FONT_METADATA, - RANGES, - type FontMetadata, -} from "./metadata"; -import { ExcalidrawFont, type Font } from "./ExcalidrawFont"; -import { getContainerElement } from "../element/textElement"; - -import Virgil from "./assets/Virgil-Regular.woff2"; -import Excalifont from "./assets/Excalifont-Regular.woff2"; -import Cascadia from "./assets/CascadiaCode-Regular.woff2"; -import ComicShanns from "./assets/ComicShanns-Regular.woff2"; -import LiberationSans from "./assets/LiberationSans-Regular.woff2"; - -import LilitaLatin from "./assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2"; -import LilitaLatinExt from "./assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2"; - -import NunitoLatin from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2"; -import NunitoLatinExt from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2"; -import NunitoCyrilic from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2"; -import NunitoCyrilicExt from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2"; -import NunitoVietnamese from "./assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2"; + FONT_FAMILY, + FONT_FAMILY_FALLBACKS, + WINDOWS_EMOJI_FALLBACK_FONT, + CJK_HAND_DRAWN_FALLBACK_FONT, +} from "../constants"; +import { FONT_METADATA, type FontMetadata } from "./metadata"; +import { charWidth, getContainerElement } from "../element/textElement"; +import { + ExcalidrawFontFace, + type IExcalidrawFontFace, +} from "./ExcalidrawFontFace"; +import { CascadiaFontFaces } from "./woff2/Cascadia"; +import { ComicFontFaces } from "./woff2/Comic"; +import { ExcalifontFontFaces } from "./woff2/Excalifont"; +import { HelveticaFontFaces } from "./woff2/Helvetica"; +import { LiberationFontFaces } from "./woff2/Liberation"; +import { LilitaFontFaces } from "./woff2/Lilita"; +import { NunitoFontFaces } from "./woff2/Nunito"; +import { VirgilFontFaces } from "./woff2/Virgil"; +import { XiaolaiFontFaces } from "./woff2/Xiaolai"; +import { EmojiFontFaces } from "./woff2/Emoji"; export class Fonts { // it's ok to track fonts across multiple instances only once, so let's use @@ -43,7 +41,7 @@ export class Fonts { number, { metadata: FontMetadata; - fonts: Font[]; + fontFaces: IExcalidrawFontFace[]; } > | undefined; @@ -85,20 +83,23 @@ export class Fonts { * of the supplied fontFaces has not already been processed. */ public onLoaded = (fontFaces: readonly FontFace[]) => { - if ( - // bail if all fonts with have been processed. We're checking just a - // subset of the font properties (though it should be enough), so it - // can technically bail on a false positive. - fontFaces.every((fontFace) => { - const sig = `${fontFace.family}-${fontFace.style}-${fontFace.weight}-${fontFace.unicodeRange}`; - if (Fonts.loadedFontsCache.has(sig)) { - return true; - } + // bail if all fonts with have been processed. We're checking just a + // subset of the font properties (though it should be enough), so it + // can technically bail on a false positive. + let shouldBail = true; + + for (const fontFace of fontFaces) { + const sig = `${fontFace.family}-${fontFace.style}-${fontFace.weight}-${fontFace.unicodeRange}`; + + // make sure to update our cache with all the loaded font faces + if (!Fonts.loadedFontsCache.has(sig)) { Fonts.loadedFontsCache.add(sig); - return false; - }) - ) { - return false; + shouldBail = false; + } + } + + if (shouldBail) { + return; } let didUpdate = false; @@ -109,6 +110,10 @@ export class Fonts { if (isTextElement(element)) { didUpdate = true; ShapeCache.delete(element); + + // clear the width cache, so that we don't perform subsequent wrapping based on the stale fallback font metrics + charWidth.clearCache(getFontString(element)); + const container = getContainerElement(element, elementsMap); if (container) { ShapeCache.delete(container); @@ -125,26 +130,27 @@ export class Fonts { * Load font faces for a given scene and trigger scene update. */ public loadSceneFonts = async (): Promise => { - const sceneFamilies = this.getSceneFontFamilies(); + const sceneFamilies = this.getSceneFamilies(); const loaded = await Fonts.loadFontFaces(sceneFamilies); this.onLoaded(loaded); return loaded; }; /** - * Gets all the font families for the given scene. + * Load all registered font faces. */ - public getSceneFontFamilies = () => { - return Fonts.getFontFamilies(this.scene.getNonDeletedElements()); + public static loadAllFonts = async (): Promise => { + const allFamilies = Fonts.getAllFamilies(); + return Fonts.loadFontFaces(allFamilies); }; /** * Load font faces for passed elements - use when the scene is unavailable (i.e. export). */ - public static loadFontsForElements = async ( + public static loadElementsFonts = async ( elements: readonly ExcalidrawElement[], ): Promise => { - const fontFamilies = Fonts.getFontFamilies(elements); + const fontFamilies = Fonts.getElementsFamilies(elements); return await Fonts.loadFontFaces(fontFamilies); }; @@ -152,13 +158,13 @@ export class Fonts { fontFamilies: Array, ) { // add all registered font faces into the `document.fonts` (if not added already) - for (const { fonts, metadata } of Fonts.registered.values()) { + for (const { fontFaces, metadata } of Fonts.registered.values()) { // skip registering font faces for local fonts (i.e. Helvetica) if (metadata.local) { continue; } - for (const { fontFace } of fonts) { + for (const { fontFace } of fontFaces) { if (!window.document.fonts.has(fontFace)) { window.document.fonts.add(fontFace); } @@ -183,7 +189,7 @@ export class Fonts { console.error( `Failed to load font "${fontString}" from urls "${Fonts.registered .get(fontFamily) - ?.fonts.map((x) => x.urls)}"`, + ?.fontFaces.map((x) => x.urls)}"`, e, ); } @@ -202,82 +208,58 @@ export class Fonts { private static init() { const fonts = { registered: new Map< - ValueOf, - { metadata: FontMetadata; fonts: Font[] } + ValueOf, + { metadata: FontMetadata; fontFaces: IExcalidrawFontFace[] } >(), }; - // TODO: let's tweak this once we know how `register` will be exposed as part of the custom fonts API - const _register = register.bind(fonts); + const init = ( + family: keyof typeof FONT_FAMILY | keyof typeof FONT_FAMILY_FALLBACKS, + ...fontFacesDescriptors: ExcalidrawFontFaceDescriptor[] + ) => { + const fontFamily = + FONT_FAMILY[family as keyof typeof FONT_FAMILY] ?? + FONT_FAMILY_FALLBACKS[family as keyof typeof FONT_FAMILY_FALLBACKS]; - _register("Virgil", FONT_METADATA[FONT_FAMILY.Virgil], { - uri: Virgil, - }); + // default to Excalifont metrics + const metadata = + FONT_METADATA[fontFamily] ?? FONT_METADATA[FONT_FAMILY.Excalifont]; - _register("Excalifont", FONT_METADATA[FONT_FAMILY.Excalifont], { - uri: Excalifont, - }); + register.call(fonts, family, metadata, ...fontFacesDescriptors); + }; + init("Cascadia", ...CascadiaFontFaces); + init("Comic Shanns", ...ComicFontFaces); + init("Excalifont", ...ExcalifontFontFaces); // keeping for backwards compatibility reasons, uses system font (Helvetica on MacOS, Arial on Win) - _register("Helvetica", FONT_METADATA[FONT_FAMILY.Helvetica], { - uri: LOCAL_FONT_PROTOCOL, - }); - + init("Helvetica", ...HelveticaFontFaces); // used for server-side pdf & png export instead of helvetica (technically does not need metrics, but kept in for consistency) - _register( - "Liberation Sans", - FONT_METADATA[FONT_FAMILY["Liberation Sans"]], - { - uri: LiberationSans, - }, - ); + init("Liberation Sans", ...LiberationFontFaces); + init("Lilita One", ...LilitaFontFaces); + init("Nunito", ...NunitoFontFaces); + init("Virgil", ...VirgilFontFaces); - _register("Cascadia", FONT_METADATA[FONT_FAMILY.Cascadia], { - uri: Cascadia, - }); - - _register("Comic Shanns", FONT_METADATA[FONT_FAMILY["Comic Shanns"]], { - uri: ComicShanns, - }); - - _register( - "Lilita One", - FONT_METADATA[FONT_FAMILY["Lilita One"]], - { uri: LilitaLatinExt, descriptors: { unicodeRange: RANGES.LATIN_EXT } }, - { uri: LilitaLatin, descriptors: { unicodeRange: RANGES.LATIN } }, - ); - - _register( - "Nunito", - FONT_METADATA[FONT_FAMILY.Nunito], - { - uri: NunitoCyrilicExt, - descriptors: { unicodeRange: RANGES.CYRILIC_EXT, weight: "500" }, - }, - { - uri: NunitoCyrilic, - descriptors: { unicodeRange: RANGES.CYRILIC, weight: "500" }, - }, - { - uri: NunitoVietnamese, - descriptors: { unicodeRange: RANGES.VIETNAMESE, weight: "500" }, - }, - { - uri: NunitoLatinExt, - descriptors: { unicodeRange: RANGES.LATIN_EXT, weight: "500" }, - }, - { - uri: NunitoLatin, - descriptors: { unicodeRange: RANGES.LATIN, weight: "500" }, - }, - ); + // fallback font faces + init(CJK_HAND_DRAWN_FALLBACK_FONT, ...XiaolaiFontFaces); + init(WINDOWS_EMOJI_FALLBACK_FONT, ...EmojiFontFaces); Fonts._initialized = true; return fonts.registered; } - private static getFontFamilies( + /** + * Gets all the font families for the given scene. + */ + public getSceneFamilies = () => { + return Fonts.getElementsFamilies(this.scene.getNonDeletedElements()); + }; + + private static getAllFamilies() { + return Array.from(Fonts.registered.keys()); + } + + private static getElementsFamilies( elements: ReadonlyArray, ): Array { return Array.from( @@ -296,30 +278,34 @@ export class Fonts { * * @param family font family * @param metadata font metadata - * @param params array of the rest of the FontFace parameters [uri: string, descriptors: FontFaceDescriptors?] , + * @param fontFacesDecriptors font faces descriptors */ function register( this: | Fonts | { registered: Map< - ValueOf, - { metadata: FontMetadata; fonts: Font[] } + number, + { metadata: FontMetadata; fontFaces: IExcalidrawFontFace[] } >; }, family: string, metadata: FontMetadata, - ...params: Array<{ uri: string; descriptors?: FontFaceDescriptors }> + ...fontFacesDecriptors: ExcalidrawFontFaceDescriptor[] ) { - // TODO: likely we will need to abandon number "id" in order to support custom fonts - const familyId = FONT_FAMILY[family as keyof typeof FONT_FAMILY]; - const registeredFamily = this.registered.get(familyId); + // TODO: likely we will need to abandon number value in order to support custom fonts + const fontFamily = + FONT_FAMILY[family as keyof typeof FONT_FAMILY] ?? + FONT_FAMILY_FALLBACKS[family as keyof typeof FONT_FAMILY_FALLBACKS]; + + const registeredFamily = this.registered.get(fontFamily); if (!registeredFamily) { - this.registered.set(familyId, { + this.registered.set(fontFamily, { metadata, - fonts: params.map( - ({ uri, descriptors }) => new ExcalidrawFont(family, uri, descriptors), + fontFaces: fontFacesDecriptors.map( + ({ uri, descriptors }) => + new ExcalidrawFontFace(family, uri, descriptors), ), }); } @@ -357,3 +343,8 @@ export const getLineHeight = (fontFamily: FontFamilyValues) => { return lineHeight as ExcalidrawTextElement["lineHeight"]; }; + +export interface ExcalidrawFontFaceDescriptor { + uri: string; + descriptors?: FontFaceDescriptors; +} diff --git a/packages/excalidraw/fonts/metadata.ts b/packages/excalidraw/fonts/metadata.ts index 0dec8e427c..a7d2115735 100644 --- a/packages/excalidraw/fonts/metadata.ts +++ b/packages/excalidraw/fonts/metadata.ts @@ -4,7 +4,7 @@ import { FontFamilyNormalIcon, FreedrawIcon, } from "../components/icons"; -import { FONT_FAMILY } from "../constants"; +import { FONT_FAMILY, FONT_FAMILY_FALLBACKS } from "../constants"; /** * Encapsulates font metrics with additional font metadata. @@ -22,13 +22,15 @@ export interface FontMetadata { lineHeight: number; }; /** element to be displayed as an icon */ - icon: JSX.Element; + icon?: JSX.Element; /** flag to indicate a deprecated font */ deprecated?: true; /** flag to indicate a server-side only font */ serverSide?: true; /** flag to indiccate a local-only font */ local?: true; + /** flag to indicate a fallback font */ + fallback?: true; } export const FONT_METADATA: Record = { @@ -106,13 +108,32 @@ export const FONT_METADATA: Record = { descender: -434, lineHeight: 1.15, }, - icon: FontFamilyNormalIcon, serverSide: true, }, + [FONT_FAMILY_FALLBACKS.Xiaolai]: { + metrics: { + unitsPerEm: 1000, + ascender: 880, + descender: -144, + lineHeight: 1.15, + }, + fallback: true, + }, + [FONT_FAMILY_FALLBACKS["Segoe UI Emoji"]]: { + metrics: { + // reusing Excalifont metrics + unitsPerEm: 1000, + ascender: 886, + descender: -374, + lineHeight: 1.25, + }, + local: true, + fallback: true, + }, }; -/** Unicode ranges */ -export const RANGES = { +/** Unicode ranges defined by google fonts */ +export const GOOGLE_FONTS_RANGES = { LATIN: "U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD", LATIN_EXT: diff --git a/packages/excalidraw/fonts/subset/subset-main.ts b/packages/excalidraw/fonts/subset/subset-main.ts new file mode 100644 index 0000000000..1cbf66fb59 --- /dev/null +++ b/packages/excalidraw/fonts/subset/subset-main.ts @@ -0,0 +1,131 @@ +import { + WorkerInTheMainChunkError, + WorkerUrlNotDefinedError, +} from "../../errors"; +import { isServerEnv, promiseTry } from "../../utils"; +import { WorkerPool } from "../../workers"; +import type { Commands } from "./subset-shared.chunk"; + +let shouldUseWorkers = typeof Worker !== "undefined"; + +/** + * Tries to subset glyphs in a font based on the used codepoints, returning the font as dataurl. + * Under the hood utilizes worker threads (Web Workers, if available), otherwise fallbacks to the main thread. + * + * Check the following diagram for details: link.excalidraw.com/readonly/MbbnWPSWXgadXdtmzgeO + * + * @param arrayBuffer font data buffer in the woff2 format + * @param codePoints codepoints used to subset the glyphs + * + * @returns font with subsetted glyphs (all glyphs in case of errors) converted into a dataurl + */ +export const subsetWoff2GlyphsByCodepoints = async ( + arrayBuffer: ArrayBuffer, + codePoints: Array, +): Promise => { + const { Commands, subsetToBase64, toBase64 } = + await lazyLoadSharedSubsetChunk(); + + if (!shouldUseWorkers) { + return subsetToBase64(arrayBuffer, codePoints); + } + + return promiseTry(async () => { + try { + const workerPool = await getOrCreateWorkerPool(); + // copy the buffer to avoid working on top of the detached array buffer in the fallback + // i.e. in case the worker throws, the array buffer does not get automatically detached, even if the worker is terminated + const arrayBufferCopy = arrayBuffer.slice(0); + const result = await workerPool.postMessage( + { + command: Commands.Subset, + arrayBuffer: arrayBufferCopy, + codePoints, + } as const, + { transfer: [arrayBufferCopy] }, + ); + + // encode on the main thread to avoid copying large binary strings (as dataurl) between threads + return toBase64(result); + } catch (e) { + // don't use workers if they are failing + shouldUseWorkers = false; + + if ( + // don't log the expected errors server-side + !( + isServerEnv() && + (e instanceof WorkerUrlNotDefinedError || + e instanceof WorkerInTheMainChunkError) + ) + ) { + // eslint-disable-next-line no-console + console.error( + "Failed to use workers for subsetting, falling back to the main thread.", + e, + ); + } + + // fallback to the main thread + return subsetToBase64(arrayBuffer, codePoints); + } + }); +}; + +// lazy-loaded and cached chunks +let subsetWorker: Promise | null = null; +let subsetShared: Promise | null = null; + +const lazyLoadWorkerSubsetChunk = async () => { + if (!subsetWorker) { + subsetWorker = import("./subset-worker.chunk"); + } + + return subsetWorker; +}; + +const lazyLoadSharedSubsetChunk = async () => { + if (!subsetShared) { + // load dynamically to force create a shared chunk reused between main thread and the worker thread + subsetShared = import("./subset-shared.chunk"); + } + + return subsetShared; +}; + +// could be extended with multiple commands in the future +type SubsetWorkerData = { + command: typeof Commands.Subset; + arrayBuffer: ArrayBuffer; + codePoints: Array; +}; + +type SubsetWorkerResult = + T extends typeof Commands.Subset ? ArrayBuffer : never; + +let workerPool: Promise< + WorkerPool> +> | null = null; + +/** + * Lazy initialize or get the worker pool singleton. + * + * @throws implicitly if anything goes wrong - worker pool creation, loading wasm, initializing worker, etc. + */ +const getOrCreateWorkerPool = () => { + if (!workerPool) { + // immediate concurrent-friendly return, to ensure we have only one pool instance + workerPool = promiseTry(async () => { + const { WorkerUrl } = await lazyLoadWorkerSubsetChunk(); + + const pool = WorkerPool.create< + SubsetWorkerData, + SubsetWorkerResult + >(WorkerUrl); + + return pool; + }); + } + + return workerPool; +}; diff --git a/packages/excalidraw/fonts/subset/subset-shared.chunk.ts b/packages/excalidraw/fonts/subset/subset-shared.chunk.ts new file mode 100644 index 0000000000..ddaf6cecc7 --- /dev/null +++ b/packages/excalidraw/fonts/subset/subset-shared.chunk.ts @@ -0,0 +1,81 @@ +/** + * DON'T depend on anything from the outside like `promiseTry`, as this module is part of a separate lazy-loaded chunk. + * + * Including anything from the main chunk would include the whole chunk by default. + * Even it it would be tree-shaken during build, it won't be tree-shaken in dev. + * + * In the future consider separating common utils into a separate shared chunk. + */ + +import loadWoff2 from "../wasm/woff2-loader"; +import loadHbSubset from "../wasm/hb-subset-loader"; + +/** + * Shared commands between the main thread and worker threads. + */ +export const Commands = { + Subset: "SUBSET", +} as const; + +/** + * Used by browser (main thread), node and jsdom, to subset the font based on the passed codepoints. + * + * @returns woff2 font as a base64 encoded string + */ +export const subsetToBase64 = async ( + arrayBuffer: ArrayBuffer, + codePoints: Array, +): Promise => { + try { + const buffer = await subsetToBinary(arrayBuffer, codePoints); + return toBase64(buffer); + } catch (e) { + console.error("Skipped glyph subsetting", e); + // Fallback to encoding whole font in case of errors + return toBase64(arrayBuffer); + } +}; + +/** + * Used by browser (worker thread) and as part of `subsetToBase64`, to subset the font based on the passed codepoints. + * + * @eturns woff2 font as an ArrayBuffer, to avoid copying large strings between worker threads and the main thread. + */ +export const subsetToBinary = async ( + arrayBuffer: ArrayBuffer, + codePoints: Array, +): Promise => { + // lazy loaded wasm modules to avoid multiple initializations in case of concurrent triggers + // IMPORTANT: could be expensive, as each new worker instance lazy loads these to their own memory ~ keep the # of workes small! + const { compress, decompress } = await loadWoff2(); + const { subset } = await loadHbSubset(); + + const decompressedBinary = decompress(arrayBuffer).buffer; + const snftSubset = subset(decompressedBinary, new Set(codePoints)); + const compressedBinary = compress(snftSubset.buffer); + + return compressedBinary.buffer; +}; + +/** + * Util for isomoprhic browser (main thread), node and jsdom usage. + * + * Isn't used inside the worker to avoid copying large binary strings (as dataurl) between worker threads and the main thread. + */ +export const toBase64 = async (arrayBuffer: ArrayBuffer) => { + let base64: string; + + if (typeof Buffer !== "undefined") { + // node, jsdom + base64 = Buffer.from(arrayBuffer).toString("base64"); + } else { + // browser (main thread) + // it's perfectly fine to treat each byte independently, + // as we care only about turning individual bytes into codepoints, + // not about multi-byte unicode characters + const byteString = String.fromCharCode(...new Uint8Array(arrayBuffer)); + base64 = btoa(byteString); + } + + return `data:font/woff2;base64,${base64}`; +}; diff --git a/packages/excalidraw/fonts/subset/subset-worker.chunk.ts b/packages/excalidraw/fonts/subset/subset-worker.chunk.ts new file mode 100644 index 0000000000..5f4e92bfcf --- /dev/null +++ b/packages/excalidraw/fonts/subset/subset-worker.chunk.ts @@ -0,0 +1,42 @@ +/** + * DON'T depend on anything from the outside like `promiseTry`, as this module is part of a separate lazy-loaded chunk. + * + * Including anything from the main chunk would include the whole chunk by default. + * Even it it would be tree-shaken during build, it won't be tree-shaken in dev. + * + * In the future consider separating common utils into a separate shared chunk. + */ + +import { Commands, subsetToBinary } from "./subset-shared.chunk"; + +/** + * Due to this export (and related dynamic import), this worker code will be included in the bundle automatically (as a separate chunk), + * without the need for esbuild / vite /rollup plugins and special browser / server treatment. + * + * `import.meta.url` is undefined in nodejs + */ +export const WorkerUrl: URL | undefined = import.meta.url + ? new URL(import.meta.url) + : undefined; + +// run only in the worker context +if (typeof window === "undefined" && typeof self !== "undefined") { + self.onmessage = async (e: { + data: { + command: typeof Commands.Subset; + arrayBuffer: ArrayBuffer; + codePoints: Array; + }; + }) => { + switch (e.data.command) { + case Commands.Subset: + const buffer = await subsetToBinary( + e.data.arrayBuffer, + e.data.codePoints, + ); + + self.postMessage(buffer, { transfer: [buffer] }); + break; + } + }; +} diff --git a/packages/excalidraw/fonts/wasm/hb-subset.bindings.ts b/packages/excalidraw/fonts/wasm/hb-subset-bindings.ts similarity index 100% rename from packages/excalidraw/fonts/wasm/hb-subset.bindings.ts rename to packages/excalidraw/fonts/wasm/hb-subset-bindings.ts diff --git a/packages/excalidraw/fonts/wasm/hb-subset-loader.ts b/packages/excalidraw/fonts/wasm/hb-subset-loader.ts new file mode 100644 index 0000000000..353b24f48e --- /dev/null +++ b/packages/excalidraw/fonts/wasm/hb-subset-loader.ts @@ -0,0 +1,57 @@ +/** + * DON'T depend on anything from the outside like `promiseTry`, as this module is part of a separate lazy-loaded chunk. + * + * Including anything from the main chunk would include the whole chunk by default. + * Even it it would be tree-shaken during build, it won't be tree-shaken in dev. + * + * In the future consider separating common utils into a separate shared chunk. + */ + +import binary from "./hb-subset-wasm"; +import bindings from "./hb-subset-bindings"; + +/** + * Lazy loads wasm and respective bindings for font subsetting based on the harfbuzzjs. + */ +let loadedWasm: ReturnType | null = null; + +// TODO: consider adding support for fetching the wasm from an URL (external CDN, data URL, etc.) +const load = (): Promise<{ + subset: ( + fontBuffer: ArrayBuffer, + codePoints: ReadonlySet, + ) => Uint8Array; +}> => { + return new Promise(async (resolve, reject) => { + try { + const module = await WebAssembly.instantiate(binary); + const harfbuzzJsWasm = module.instance.exports; + // @ts-expect-error since `.buffer` is custom prop + const heapu8 = new Uint8Array(harfbuzzJsWasm.memory.buffer); + + const hbSubset = { + subset: (fontBuffer: ArrayBuffer, codePoints: ReadonlySet) => { + return bindings.subset( + harfbuzzJsWasm, + heapu8, + fontBuffer, + codePoints, + ); + }, + }; + + resolve(hbSubset); + } catch (e) { + reject(e); + } + }); +}; + +// lazy load the default export +export default (): ReturnType => { + if (!loadedWasm) { + loadedWasm = load(); + } + + return loadedWasm; +}; diff --git a/packages/excalidraw/fonts/wasm/hb-subset.wasm.ts b/packages/excalidraw/fonts/wasm/hb-subset-wasm.ts similarity index 100% rename from packages/excalidraw/fonts/wasm/hb-subset.wasm.ts rename to packages/excalidraw/fonts/wasm/hb-subset-wasm.ts diff --git a/packages/excalidraw/fonts/wasm/hb-subset.loader.ts b/packages/excalidraw/fonts/wasm/hb-subset.loader.ts deleted file mode 100644 index a9a3035bea..0000000000 --- a/packages/excalidraw/fonts/wasm/hb-subset.loader.ts +++ /dev/null @@ -1,58 +0,0 @@ -/** - * Lazy loads wasm and respective bindings for font subsetting based on the harfbuzzjs. - */ -let loadedWasm: ReturnType | null = null; - -// TODO: add support for fetching the wasm from an URL (external CDN, data URL, etc.) -const load = (): Promise<{ - subset: ( - fontBuffer: ArrayBuffer, - codePoints: ReadonlySet, - ) => Uint8Array; -}> => { - return new Promise(async (resolve, reject) => { - try { - const [binary, bindings] = await Promise.all([ - import("./hb-subset.wasm"), - import("./hb-subset.bindings"), - ]); - - WebAssembly.instantiate(binary.default).then((module) => { - try { - const harfbuzzJsWasm = module.instance.exports; - // @ts-expect-error since `.buffer` is custom prop - const heapu8 = new Uint8Array(harfbuzzJsWasm.memory.buffer); - - const hbSubset = { - subset: ( - fontBuffer: ArrayBuffer, - codePoints: ReadonlySet, - ) => { - return bindings.default.subset( - harfbuzzJsWasm, - heapu8, - fontBuffer, - codePoints, - ); - }, - }; - - resolve(hbSubset); - } catch (e) { - reject(e); - } - }); - } catch (error) { - reject(error); - } - }); -}; - -// lazy load the default export -export default (): ReturnType => { - if (!loadedWasm) { - loadedWasm = load(); - } - - return loadedWasm; -}; diff --git a/packages/excalidraw/fonts/wasm/woff2.bindings.ts b/packages/excalidraw/fonts/wasm/woff2-bindings.ts similarity index 99% rename from packages/excalidraw/fonts/wasm/woff2.bindings.ts rename to packages/excalidraw/fonts/wasm/woff2-bindings.ts index 16b3fa144a..a861de681a 100644 --- a/packages/excalidraw/fonts/wasm/woff2.bindings.ts +++ b/packages/excalidraw/fonts/wasm/woff2-bindings.ts @@ -47,6 +47,7 @@ const Module = (function () { moduleOverrides[key] = Module[key]; } } + let arguments_ = []; let thisProgram = "./this.program"; let quit_ = function (status, toThrow) { @@ -4046,3 +4047,5 @@ const Module = (function () { })(); export default Module; + + diff --git a/packages/excalidraw/fonts/wasm/woff2-loader.ts b/packages/excalidraw/fonts/wasm/woff2-loader.ts new file mode 100644 index 0000000000..446dc9f8b7 --- /dev/null +++ b/packages/excalidraw/fonts/wasm/woff2-loader.ts @@ -0,0 +1,76 @@ +/** + * DON'T depend on anything from the outside like `promiseTry`, as this module is part of a separate lazy-loaded chunk. + * + * Including anything from the main chunk would include the whole chunk by default. + * Even it it would be tree-shaken during build, it won't be tree-shaken in dev. + * + * In the future consider separating common utils into a separate shared chunk. + */ + +import binary from "./woff2-wasm"; +import bindings from "./woff2-bindings"; + +/** + * Lazy loads wasm and respective bindings for woff2 compression and decompression. + */ +type Vector = any; + +let loadedWasm: ReturnType | null = null; + +// re-map from internal vector into byte array +function convertFromVecToUint8Array(vector: Vector): Uint8Array { + const arr = []; + for (let i = 0, l = vector.size(); i < l; i++) { + arr.push(vector.get(i)); + } + + return new Uint8Array(arr); +} + +// TODO: consider adding support for fetching the wasm from an URL (external CDN, data URL, etc.) +const load = (): Promise<{ + compress: (buffer: ArrayBuffer) => Uint8Array; + decompress: (buffer: ArrayBuffer) => Uint8Array; +}> => { + return new Promise((resolve, reject) => { + try { + // initializing the module manually, so that we could pass in the wasm binary + // note that the `bindings.then` is not not promise/A+ compliant, hence the need for another explicit try/catch + bindings({ wasmBinary: binary }).then( + (module: { + woff2Enc: (buffer: ArrayBuffer, byteLength: number) => Vector; + woff2Dec: (buffer: ArrayBuffer, byteLength: number) => Vector; + }) => { + try { + // re-exporting only compress and decompress functions (also avoids infinite loop inside emscripten bindings) + const woff2 = { + compress: (buffer: ArrayBuffer) => + convertFromVecToUint8Array( + module.woff2Enc(buffer, buffer.byteLength), + ), + decompress: (buffer: ArrayBuffer) => + convertFromVecToUint8Array( + module.woff2Dec(buffer, buffer.byteLength), + ), + }; + + resolve(woff2); + } catch (e) { + reject(e); + } + }, + ); + } catch (e) { + reject(e); + } + }); +}; + +// lazy loaded default export +export default (): ReturnType => { + if (!loadedWasm) { + loadedWasm = load(); + } + + return loadedWasm; +}; diff --git a/packages/excalidraw/fonts/wasm/woff2.wasm.ts b/packages/excalidraw/fonts/wasm/woff2-wasm.ts similarity index 100% rename from packages/excalidraw/fonts/wasm/woff2.wasm.ts rename to packages/excalidraw/fonts/wasm/woff2-wasm.ts diff --git a/packages/excalidraw/fonts/wasm/woff2.loader.ts b/packages/excalidraw/fonts/wasm/woff2.loader.ts deleted file mode 100644 index 4ec4424721..0000000000 --- a/packages/excalidraw/fonts/wasm/woff2.loader.ts +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Lazy loads wasm and respective bindings for woff2 compression and decompression. - */ -type Vector = any; - -let loadedWasm: ReturnType | null = null; - -// TODO: add support for fetching the wasm from an URL (external CDN, data URL, etc.) -const load = (): Promise<{ - compress: (buffer: ArrayBuffer) => Uint8Array; - decompress: (buffer: ArrayBuffer) => Uint8Array; -}> => { - return new Promise(async (resolve, reject) => { - try { - const [binary, bindings] = await Promise.all([ - import("./woff2.wasm"), - import("./woff2.bindings"), - ]); - - // initializing the module manually, so that we could pass in the wasm binary - bindings - .default({ wasmBinary: binary.default }) - .then( - (module: { - woff2Enc: (buffer: ArrayBuffer, byteLength: number) => Vector; - woff2Dec: (buffer: ArrayBuffer, byteLength: number) => Vector; - }) => { - try { - // re-map from internal vector into byte array - function convertFromVecToUint8Array(vector: Vector): Uint8Array { - const arr = []; - for (let i = 0, l = vector.size(); i < l; i++) { - arr.push(vector.get(i)); - } - - return new Uint8Array(arr); - } - - // re-exporting only compress and decompress functions (also avoids infinite loop inside emscripten bindings) - const woff2 = { - compress: (buffer: ArrayBuffer) => - convertFromVecToUint8Array( - module.woff2Enc(buffer, buffer.byteLength), - ), - decompress: (buffer: ArrayBuffer) => - convertFromVecToUint8Array( - module.woff2Dec(buffer, buffer.byteLength), - ), - }; - - resolve(woff2); - } catch (e) { - reject(e); - } - }, - ); - } catch (e) { - reject(e); - } - }); -}; - -// lazy loaded default export -export default (): ReturnType => { - if (!loadedWasm) { - loadedWasm = load(); - } - - return loadedWasm; -}; diff --git a/packages/excalidraw/fonts/assets/Assistant-Bold.woff2 b/packages/excalidraw/fonts/woff2/Assistant/Assistant-Bold.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Assistant-Bold.woff2 rename to packages/excalidraw/fonts/woff2/Assistant/Assistant-Bold.woff2 diff --git a/packages/excalidraw/fonts/assets/Assistant-Medium.woff2 b/packages/excalidraw/fonts/woff2/Assistant/Assistant-Medium.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Assistant-Medium.woff2 rename to packages/excalidraw/fonts/woff2/Assistant/Assistant-Medium.woff2 diff --git a/packages/excalidraw/fonts/assets/Assistant-Regular.woff2 b/packages/excalidraw/fonts/woff2/Assistant/Assistant-Regular.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Assistant-Regular.woff2 rename to packages/excalidraw/fonts/woff2/Assistant/Assistant-Regular.woff2 diff --git a/packages/excalidraw/fonts/assets/Assistant-SemiBold.woff2 b/packages/excalidraw/fonts/woff2/Assistant/Assistant-SemiBold.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Assistant-SemiBold.woff2 rename to packages/excalidraw/fonts/woff2/Assistant/Assistant-SemiBold.woff2 diff --git a/packages/excalidraw/fonts/assets/CascadiaCode-Regular.woff2 b/packages/excalidraw/fonts/woff2/Cascadia/CascadiaCode-Regular.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/CascadiaCode-Regular.woff2 rename to packages/excalidraw/fonts/woff2/Cascadia/CascadiaCode-Regular.woff2 diff --git a/packages/excalidraw/fonts/woff2/Cascadia/index.ts b/packages/excalidraw/fonts/woff2/Cascadia/index.ts new file mode 100644 index 0000000000..65baee52ab --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Cascadia/index.ts @@ -0,0 +1,8 @@ +import CascadiaCodeRegular from "./CascadiaCode-Regular.woff2"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const CascadiaFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: CascadiaCodeRegular, + }, +]; diff --git a/packages/excalidraw/fonts/assets/ComicShanns-Regular.woff2 b/packages/excalidraw/fonts/woff2/Comic/ComicShanns-Regular.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/ComicShanns-Regular.woff2 rename to packages/excalidraw/fonts/woff2/Comic/ComicShanns-Regular.woff2 diff --git a/packages/excalidraw/fonts/woff2/Comic/index.ts b/packages/excalidraw/fonts/woff2/Comic/index.ts new file mode 100644 index 0000000000..51b1f2c9ee --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Comic/index.ts @@ -0,0 +1,8 @@ +import ComicShannsRegular from "./ComicShanns-Regular.woff2"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const ComicFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: ComicShannsRegular, + }, +]; diff --git a/packages/excalidraw/fonts/woff2/Emoji/index.ts b/packages/excalidraw/fonts/woff2/Emoji/index.ts new file mode 100644 index 0000000000..491676d5c6 --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Emoji/index.ts @@ -0,0 +1,8 @@ +import { LOCAL_FONT_PROTOCOL } from "../../metadata"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const EmojiFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: LOCAL_FONT_PROTOCOL, + }, +]; diff --git a/packages/excalidraw/fonts/assets/Excalifont-Regular.woff2 b/packages/excalidraw/fonts/woff2/Excalifont/Excalifont-Regular.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Excalifont-Regular.woff2 rename to packages/excalidraw/fonts/woff2/Excalifont/Excalifont-Regular.woff2 diff --git a/packages/excalidraw/fonts/woff2/Excalifont/index.ts b/packages/excalidraw/fonts/woff2/Excalifont/index.ts new file mode 100644 index 0000000000..21514971f0 --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Excalifont/index.ts @@ -0,0 +1,8 @@ +import Excalifont from "./Excalifont-Regular.woff2"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const ExcalifontFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: Excalifont, + }, +]; diff --git a/packages/excalidraw/fonts/woff2/Helvetica/index.ts b/packages/excalidraw/fonts/woff2/Helvetica/index.ts new file mode 100644 index 0000000000..7204b304a6 --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Helvetica/index.ts @@ -0,0 +1,8 @@ +import { LOCAL_FONT_PROTOCOL } from "../../metadata"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const HelveticaFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: LOCAL_FONT_PROTOCOL, + }, +]; diff --git a/packages/excalidraw/fonts/assets/LiberationSans-Regular.woff2 b/packages/excalidraw/fonts/woff2/Liberation/LiberationSans-Regular.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/LiberationSans-Regular.woff2 rename to packages/excalidraw/fonts/woff2/Liberation/LiberationSans-Regular.woff2 diff --git a/packages/excalidraw/fonts/woff2/Liberation/index.ts b/packages/excalidraw/fonts/woff2/Liberation/index.ts new file mode 100644 index 0000000000..df6d3dbf36 --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Liberation/index.ts @@ -0,0 +1,8 @@ +import LiberationSansRegular from "./LiberationSans-Regular.woff2"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const LiberationFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: LiberationSansRegular, + }, +]; diff --git a/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 b/packages/excalidraw/fonts/woff2/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 rename to packages/excalidraw/fonts/woff2/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2 diff --git a/packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 b/packages/excalidraw/fonts/woff2/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 rename to packages/excalidraw/fonts/woff2/Lilita/Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2 diff --git a/packages/excalidraw/fonts/woff2/Lilita/index.ts b/packages/excalidraw/fonts/woff2/Lilita/index.ts new file mode 100644 index 0000000000..0a31eb11fc --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Lilita/index.ts @@ -0,0 +1,16 @@ +import LilitaLatin from "./Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYEF8RXi4EwQ.woff2"; +import LilitaLatinExt from "./Lilita-Regular-i7dPIFZ9Zz-WBtRtedDbYE98RXi4EwSsbg.woff2"; + +import { GOOGLE_FONTS_RANGES } from "../../metadata"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const LilitaFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: LilitaLatinExt, + descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.LATIN_EXT }, + }, + { + uri: LilitaLatin, + descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.LATIN }, + }, +]; diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 rename to packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2 diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 b/packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 rename to packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2 diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 rename to packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2 diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 rename to packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2 diff --git a/packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 b/packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 rename to packages/excalidraw/fonts/woff2/Nunito/Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2 diff --git a/packages/excalidraw/fonts/woff2/Nunito/index.ts b/packages/excalidraw/fonts/woff2/Nunito/index.ts new file mode 100644 index 0000000000..9d2edbe92c --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Nunito/index.ts @@ -0,0 +1,37 @@ +import Latin from "./Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTQ3j6zbXWjgeg.woff2"; +import LatinExt from "./Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTo3j6zbXWjgevT5.woff2"; +import Cyrilic from "./Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTA3j6zbXWjgevT5.woff2"; +import CyrilicExt from "./Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTk3j6zbXWjgevT5.woff2"; +import Vietnamese from "./Nunito-Regular-XRXI3I6Li01BKofiOc5wtlZ2di8HDIkhdTs3j6zbXWjgevT5.woff2"; + +import { GOOGLE_FONTS_RANGES } from "../../metadata"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const NunitoFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: CyrilicExt, + descriptors: { + unicodeRange: GOOGLE_FONTS_RANGES.CYRILIC_EXT, + weight: "500", + }, + }, + { + uri: Cyrilic, + descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.CYRILIC, weight: "500" }, + }, + { + uri: Vietnamese, + descriptors: { + unicodeRange: GOOGLE_FONTS_RANGES.VIETNAMESE, + weight: "500", + }, + }, + { + uri: LatinExt, + descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.LATIN_EXT, weight: "500" }, + }, + { + uri: Latin, + descriptors: { unicodeRange: GOOGLE_FONTS_RANGES.LATIN, weight: "500" }, + }, +]; diff --git a/packages/excalidraw/fonts/assets/Virgil-Regular.woff2 b/packages/excalidraw/fonts/woff2/Virgil/Virgil-Regular.woff2 similarity index 100% rename from packages/excalidraw/fonts/assets/Virgil-Regular.woff2 rename to packages/excalidraw/fonts/woff2/Virgil/Virgil-Regular.woff2 diff --git a/packages/excalidraw/fonts/woff2/Virgil/index.ts b/packages/excalidraw/fonts/woff2/Virgil/index.ts new file mode 100644 index 0000000000..62c32162e5 --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Virgil/index.ts @@ -0,0 +1,8 @@ +import Virgil from "./Virgil-Regular.woff2"; +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +export const VirgilFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: Virgil, + }, +]; diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 new file mode 100644 index 0000000000..81b95cdbbb Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 new file mode 100644 index 0000000000..79820b04ac Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 new file mode 100644 index 0000000000..bd70e5a044 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 new file mode 100644 index 0000000000..9da21221f1 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 new file mode 100644 index 0000000000..80f9987f41 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 new file mode 100644 index 0000000000..4e6d27c9d1 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 new file mode 100644 index 0000000000..5e910573f1 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 new file mode 100644 index 0000000000..04f2ef56f6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 new file mode 100644 index 0000000000..caad7f53c0 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 new file mode 100644 index 0000000000..6314821277 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 new file mode 100644 index 0000000000..bd521b53f7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 new file mode 100644 index 0000000000..95fb272fa4 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 new file mode 100644 index 0000000000..34d911a124 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 new file mode 100644 index 0000000000..5bafb59504 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 new file mode 100644 index 0000000000..777116d467 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 new file mode 100644 index 0000000000..dbf57e6ab5 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 new file mode 100644 index 0000000000..8d5fce5187 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 new file mode 100644 index 0000000000..4848f43d3a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 new file mode 100644 index 0000000000..5c8def8681 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 new file mode 100644 index 0000000000..4e40bc9a55 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 new file mode 100644 index 0000000000..27cc705472 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 new file mode 100644 index 0000000000..63214d8046 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 new file mode 100644 index 0000000000..6531a40729 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 new file mode 100644 index 0000000000..800923128e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 new file mode 100644 index 0000000000..9e137bfd87 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 new file mode 100644 index 0000000000..ff657bf2e5 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 new file mode 100644 index 0000000000..d03ae01c7c Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 new file mode 100644 index 0000000000..b8bd9f0ad7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 new file mode 100644 index 0000000000..0aa6ab3abf Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 new file mode 100644 index 0000000000..ed51e39e54 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 new file mode 100644 index 0000000000..2a9ec5ff9b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 new file mode 100644 index 0000000000..5d7ce92b2d Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 new file mode 100644 index 0000000000..e3cd0037fa Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 new file mode 100644 index 0000000000..c2a593a8c3 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 new file mode 100644 index 0000000000..0ca14319ec Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 new file mode 100644 index 0000000000..5526001b4b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 new file mode 100644 index 0000000000..ccc74180b8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 new file mode 100644 index 0000000000..0ce8117465 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 new file mode 100644 index 0000000000..fdd99d7477 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 new file mode 100644 index 0000000000..67773507ff Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 new file mode 100644 index 0000000000..172776402a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 new file mode 100644 index 0000000000..5d70854109 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 new file mode 100644 index 0000000000..c8979350ab Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 new file mode 100644 index 0000000000..aa1c6a650f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 new file mode 100644 index 0000000000..696432ba29 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 new file mode 100644 index 0000000000..6a97b01cf0 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 new file mode 100644 index 0000000000..17ada0f1c3 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 new file mode 100644 index 0000000000..9afb6e48e2 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 new file mode 100644 index 0000000000..bc3219ddb6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 new file mode 100644 index 0000000000..b6ba8099ca Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 new file mode 100644 index 0000000000..4777bb2330 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 new file mode 100644 index 0000000000..135b1eb156 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 new file mode 100644 index 0000000000..565b85d355 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 new file mode 100644 index 0000000000..37bdf8de10 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 new file mode 100644 index 0000000000..4cd78a7dcb Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 new file mode 100644 index 0000000000..993a4d1aa4 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 new file mode 100644 index 0000000000..9690959ca5 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 new file mode 100644 index 0000000000..8b965c02c9 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 new file mode 100644 index 0000000000..7f10bdd959 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 new file mode 100644 index 0000000000..ff84070772 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 new file mode 100644 index 0000000000..c261290d5e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 new file mode 100644 index 0000000000..806c4fe429 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 new file mode 100644 index 0000000000..650c4527a1 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 new file mode 100644 index 0000000000..02f0bc4eb4 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 new file mode 100644 index 0000000000..cea5c3a40a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 new file mode 100644 index 0000000000..2aac12fad9 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 new file mode 100644 index 0000000000..932a1b4c66 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 new file mode 100644 index 0000000000..f6a27d337f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 new file mode 100644 index 0000000000..f8e6713efb Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 new file mode 100644 index 0000000000..010d328f57 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 new file mode 100644 index 0000000000..2bf343cfcb Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 new file mode 100644 index 0000000000..1595a33f4c Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 new file mode 100644 index 0000000000..c0bb9a971e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 new file mode 100644 index 0000000000..e58ed6693b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 new file mode 100644 index 0000000000..dec09cf477 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 new file mode 100644 index 0000000000..c9a327768b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 new file mode 100644 index 0000000000..940c2ecf6e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 new file mode 100644 index 0000000000..f41209f66d Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 new file mode 100644 index 0000000000..6922fa7330 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 new file mode 100644 index 0000000000..471d8a7409 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 new file mode 100644 index 0000000000..972ea00c64 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 new file mode 100644 index 0000000000..e3bae155c8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 new file mode 100644 index 0000000000..30036f98d6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 new file mode 100644 index 0000000000..528f95d57a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 new file mode 100644 index 0000000000..bdb0148ca7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 new file mode 100644 index 0000000000..f1a62b14cf Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 new file mode 100644 index 0000000000..8a7fb3fc6b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 new file mode 100644 index 0000000000..e0f8553a3f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 new file mode 100644 index 0000000000..77baffa4ef Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 new file mode 100644 index 0000000000..fc7ecf3ff6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 new file mode 100644 index 0000000000..8185dc65ca Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 new file mode 100644 index 0000000000..85321b98f8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 new file mode 100644 index 0000000000..4a1c38ec46 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 new file mode 100644 index 0000000000..3fab5f5d7f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 new file mode 100644 index 0000000000..4b3039e3d3 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 new file mode 100644 index 0000000000..8a73852bd9 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 new file mode 100644 index 0000000000..1851d267ca Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 new file mode 100644 index 0000000000..2b128b1215 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 new file mode 100644 index 0000000000..f71f25db41 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 new file mode 100644 index 0000000000..5895c1f613 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 new file mode 100644 index 0000000000..327774e455 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 new file mode 100644 index 0000000000..5dfdd7d3ac Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 new file mode 100644 index 0000000000..90cb1a098f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 new file mode 100644 index 0000000000..de01131833 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 new file mode 100644 index 0000000000..a5c6c403b8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 new file mode 100644 index 0000000000..9e5151a0e7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 new file mode 100644 index 0000000000..6bbf82baba Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 new file mode 100644 index 0000000000..978dbb1b80 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 new file mode 100644 index 0000000000..084c6ce802 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 new file mode 100644 index 0000000000..0ae886906c Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 new file mode 100644 index 0000000000..b9a227f956 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 new file mode 100644 index 0000000000..7a64e6ebf7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 new file mode 100644 index 0000000000..bf9be6dc60 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 new file mode 100644 index 0000000000..b480792537 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 new file mode 100644 index 0000000000..08677cba9a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 new file mode 100644 index 0000000000..18babd98ed Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 new file mode 100644 index 0000000000..9c003a4dfb Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 new file mode 100644 index 0000000000..2b31eac663 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 new file mode 100644 index 0000000000..a6349c8b3e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 new file mode 100644 index 0000000000..82ef29c638 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 new file mode 100644 index 0000000000..7ab780e4bf Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 new file mode 100644 index 0000000000..f13acc7fa7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 new file mode 100644 index 0000000000..b7e74d3932 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 new file mode 100644 index 0000000000..7584a37660 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 new file mode 100644 index 0000000000..0a7b155096 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 new file mode 100644 index 0000000000..1e987276e9 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 new file mode 100644 index 0000000000..aeeb35e5d2 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 new file mode 100644 index 0000000000..79fcbacf48 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 new file mode 100644 index 0000000000..e5a6626076 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 new file mode 100644 index 0000000000..44075a1468 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 new file mode 100644 index 0000000000..9d20c3548d Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 new file mode 100644 index 0000000000..80dc156a3c Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 new file mode 100644 index 0000000000..c0ac153402 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 new file mode 100644 index 0000000000..844692ac22 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 new file mode 100644 index 0000000000..0e6dfa5779 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 new file mode 100644 index 0000000000..17d183e31a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 new file mode 100644 index 0000000000..d5d7387542 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 new file mode 100644 index 0000000000..203cbafe53 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 new file mode 100644 index 0000000000..1e092eb327 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 new file mode 100644 index 0000000000..6270a1ec5a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 new file mode 100644 index 0000000000..43d12c42fc Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 new file mode 100644 index 0000000000..215485d3d2 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 new file mode 100644 index 0000000000..67e19fd711 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 new file mode 100644 index 0000000000..edd85e0ebe Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 new file mode 100644 index 0000000000..8a42037072 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 new file mode 100644 index 0000000000..879b7ebf56 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 new file mode 100644 index 0000000000..9298d3e607 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 new file mode 100644 index 0000000000..b9c45b303c Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 new file mode 100644 index 0000000000..7f61f3b066 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 new file mode 100644 index 0000000000..ca3a60d3fd Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 new file mode 100644 index 0000000000..6da852f68f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 new file mode 100644 index 0000000000..93e11e3b24 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 new file mode 100644 index 0000000000..1e78feef3a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 new file mode 100644 index 0000000000..10f3c5ed49 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 new file mode 100644 index 0000000000..a5122e75cc Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 new file mode 100644 index 0000000000..27a0f150b8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 new file mode 100644 index 0000000000..350d64cf23 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 new file mode 100644 index 0000000000..88a558e61b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 new file mode 100644 index 0000000000..6b1df7d0af Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 new file mode 100644 index 0000000000..2d44fa2f50 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 new file mode 100644 index 0000000000..c23b637a45 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 new file mode 100644 index 0000000000..f4b1c13f8d Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 new file mode 100644 index 0000000000..eb2f860fa3 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 new file mode 100644 index 0000000000..36cfc89d57 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 new file mode 100644 index 0000000000..41352d115e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 new file mode 100644 index 0000000000..e83bcf72f0 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 new file mode 100644 index 0000000000..f8c1fa8943 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 new file mode 100644 index 0000000000..fe9dd69185 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 new file mode 100644 index 0000000000..a0ae6ad6de Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 new file mode 100644 index 0000000000..b9e6e2edf8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 new file mode 100644 index 0000000000..0c09d389d3 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 new file mode 100644 index 0000000000..1bd3938741 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 new file mode 100644 index 0000000000..8074897f4a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 new file mode 100644 index 0000000000..349abfc45f Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 new file mode 100644 index 0000000000..1850c3551b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 new file mode 100644 index 0000000000..86f3d6fad8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 new file mode 100644 index 0000000000..9eb9006993 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 new file mode 100644 index 0000000000..66e98a1b5b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 new file mode 100644 index 0000000000..1fbdcb12a8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 new file mode 100644 index 0000000000..3a9379e12e Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 new file mode 100644 index 0000000000..5c92148f89 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 new file mode 100644 index 0000000000..372bb8a097 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 new file mode 100644 index 0000000000..162ec032a3 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 new file mode 100644 index 0000000000..98029c09a9 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 new file mode 100644 index 0000000000..10ff3af602 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 new file mode 100644 index 0000000000..f8be55b4a6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 new file mode 100644 index 0000000000..225731bbf6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 new file mode 100644 index 0000000000..34257ea9ad Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 new file mode 100644 index 0000000000..66f76a65d1 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 new file mode 100644 index 0000000000..c27100ad46 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 new file mode 100644 index 0000000000..19b8f2f7cc Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 new file mode 100644 index 0000000000..1784616c12 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 new file mode 100644 index 0000000000..0dd8aed95d Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 new file mode 100644 index 0000000000..0974345315 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 new file mode 100644 index 0000000000..6bc4fe730a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 new file mode 100644 index 0000000000..73d1e49dd4 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 new file mode 100644 index 0000000000..9d465dc729 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 new file mode 100644 index 0000000000..5914fe1108 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 new file mode 100644 index 0000000000..3374a633cb Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 new file mode 100644 index 0000000000..584cdbd230 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 new file mode 100644 index 0000000000..ab7c72a332 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 new file mode 100644 index 0000000000..97d75530a7 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 new file mode 100644 index 0000000000..aea85463b8 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 new file mode 100644 index 0000000000..4155260527 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 new file mode 100644 index 0000000000..d990ae9bcf Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 new file mode 100644 index 0000000000..b5e5ff5f7b Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 new file mode 100644 index 0000000000..f6b625a39a Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 new file mode 100644 index 0000000000..2e034d9a69 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 new file mode 100644 index 0000000000..94b67510f6 Binary files /dev/null and b/packages/excalidraw/fonts/woff2/Xiaolai/Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2 differ diff --git a/packages/excalidraw/fonts/woff2/Xiaolai/index.ts b/packages/excalidraw/fonts/woff2/Xiaolai/index.ts new file mode 100644 index 0000000000..4c0517854d --- /dev/null +++ b/packages/excalidraw/fonts/woff2/Xiaolai/index.ts @@ -0,0 +1,1324 @@ +// The following file content was generated with https://chinese-font.netlify.app/online-split, +// but has been manully rewritten from `@font-face` rules into TS while leveraging FontFace API. + +import _0 from "./Xiaolai-Regular-09850c4077f3fffe707905872e0e2460.woff2"; +import _1 from "./Xiaolai-Regular-7eb9fffd1aa890d07d0f88cc82e6cfe4.woff2"; +import _2 from "./Xiaolai-Regular-60a3089806700d379f11827ee9843b6b.woff2"; +import _3 from "./Xiaolai-Regular-6fe5c5973cc06f74b2387a631ea36b88.woff2"; +import _4 from "./Xiaolai-Regular-b96d9226ce77ec94ceca043d712182e6.woff2"; +import _5 from "./Xiaolai-Regular-6ae5b42180ad70b971c91e7eefb8eba2.woff2"; +import _6 from "./Xiaolai-Regular-a4c34be6d42152e64b0df90bc4607f64.woff2"; +import _7 from "./Xiaolai-Regular-c69f61a4ab18d0488c8d1fc12e7028e8.woff2"; +import _8 from "./Xiaolai-Regular-e3fcf5180fd466c8915c4e8069491054.woff2"; +import _9 from "./Xiaolai-Regular-c1f94158256bb1f3bf665b053d895af9.woff2"; +import _10 from "./Xiaolai-Regular-544fc28abe2c5c30e62383fd4dac255f.woff2"; +import _11 from "./Xiaolai-Regular-7197d6fda6cba7c3874c53d6381ca239.woff2"; +import _12 from "./Xiaolai-Regular-70c2eb8d64e71a42a834eb857ea9df51.woff2"; +import _13 from "./Xiaolai-Regular-069e77aac84590e2e991d0a0176d34f2.woff2"; +import _14 from "./Xiaolai-Regular-41521fade99856108931b4768b1b2648.woff2"; +import _15 from "./Xiaolai-Regular-a004ddfcb26e67bd6e678c8ed19e25ce.woff2"; +import _16 from "./Xiaolai-Regular-04b718e5623574919c8b0dea5f301444.woff2"; +import _17 from "./Xiaolai-Regular-7e4bde7e9c7f84cd34d8a845e384c746.woff2"; +import _18 from "./Xiaolai-Regular-23686f7f29da6e8008c36dd3a80c83d6.woff2"; +import _19 from "./Xiaolai-Regular-69c09cc5fa3e55c74fc4821f76909cc3.woff2"; +import _20 from "./Xiaolai-Regular-25b7f38e18f035f96cb5e547bd2bd08c.woff2"; +import _21 from "./Xiaolai-Regular-ba3de316d63c7e339987b16f41a0b879.woff2"; +import _22 from "./Xiaolai-Regular-12b52b58eb3df36804b9a654ec9ee194.woff2"; +import _23 from "./Xiaolai-Regular-b1220a3c61f85cc0408deedb4c5f57a2.woff2"; +import _24 from "./Xiaolai-Regular-4535823663ad81405188a528d8f2b1a2.woff2"; +import _25 from "./Xiaolai-Regular-3eaa538115d76932653c21d8dc28f207.woff2"; +import _26 from "./Xiaolai-Regular-7e929f262f30c8ee78bf398150b1a7cd.woff2"; +import _27 from "./Xiaolai-Regular-73e309718fd16cea44b4d54a33581811.woff2"; +import _28 from "./Xiaolai-Regular-9eb5a99df4e76ac3363453ac9ca288b1.woff2"; +import _29 from "./Xiaolai-Regular-3e63ed8162808a9e425ed80a8bc79114.woff2"; +import _30 from "./Xiaolai-Regular-cb17fc3db95f6d139afc9d31a8e93293.woff2"; +import _31 from "./Xiaolai-Regular-c8b71798409ccc126ee264a00aadcf21.woff2"; +import _32 from "./Xiaolai-Regular-11c345711937f0ba4b8f7b6b919c8440.woff2"; +import _33 from "./Xiaolai-Regular-e480d9c614742d05f0e78f274f1e69e6.woff2"; +import _34 from "./Xiaolai-Regular-95429962233afd82db1c27df1500a28c.woff2"; +import _35 from "./Xiaolai-Regular-2cf96d082d35ea3d8106851223ad0d16.woff2"; +import _36 from "./Xiaolai-Regular-2d43040e86ff03ba677f6f9c04cd0805.woff2"; +import _37 from "./Xiaolai-Regular-2a26d20a23b00898ce82f09d2ee47c3f.woff2"; +import _38 from "./Xiaolai-Regular-a365e82ed54697a52f27adcea1315fe8.woff2"; +import _39 from "./Xiaolai-Regular-f5d079153c99a25b9be5b8583c4cc8a7.woff2"; +import _40 from "./Xiaolai-Regular-10a7ae9a371830a80c3d844acf1c02d7.woff2"; +import _41 from "./Xiaolai-Regular-e4bca6cfa53e499cae0a6be4894a90e9.woff2"; +import _42 from "./Xiaolai-Regular-60a41c7e1c68f22424e6d22df544bc82.woff2"; +import _43 from "./Xiaolai-Regular-7ab2bed91166a9dca83a5ebfbe2a7f38.woff2"; +import _44 from "./Xiaolai-Regular-670ba603758d94268e8606f240a42e12.woff2"; +import _45 from "./Xiaolai-Regular-e656f091b9dc4709722c9f4b84d3c797.woff2"; +import _46 from "./Xiaolai-Regular-15dc6d811c9cd078f9086a740d5a1038.woff2"; +import _47 from "./Xiaolai-Regular-f0f13b5c60e0af5553bd359f5513be1b.woff2"; +import _48 from "./Xiaolai-Regular-8c2f33cee3993174f7e87c28e4bf42ee.woff2"; +import _49 from "./Xiaolai-Regular-761d05e3cd968cf574166867998ef06a.woff2"; +import _50 from "./Xiaolai-Regular-642b26e2e5f5fb780b51b593dbc8c851.woff2"; +import _51 from "./Xiaolai-Regular-5572b3513ba8df57a3d5d7303ee6b11b.woff2"; +import _52 from "./Xiaolai-Regular-3c9de2ae0ea4bc91a510942dfa4be8d2.woff2"; +import _53 from "./Xiaolai-Regular-671a2c20b1eb9e4ef8a192833940e319.woff2"; +import _54 from "./Xiaolai-Regular-4dc6d5f188d5c96d44815cd1e81aa885.woff2"; +import _55 from "./Xiaolai-Regular-ce4884f96f11589608b76b726a755803.woff2"; +import _56 from "./Xiaolai-Regular-8f476c4c99813d57cbe6eca4727388ad.woff2"; +import _57 from "./Xiaolai-Regular-5935a5775af3d5c6307ac667bd9ae74e.woff2"; +import _58 from "./Xiaolai-Regular-79f007c1c6d07557120982951ea67998.woff2"; +import _59 from "./Xiaolai-Regular-bafff7a14c27403dcc6cf1432e8ea836.woff2"; +import _60 from "./Xiaolai-Regular-543fa46ace099a7099dad69123399400.woff2"; +import _61 from "./Xiaolai-Regular-4ddc14ed3eb0c3e46364317dfc0144a3.woff2"; +import _62 from "./Xiaolai-Regular-0fa55a080fcd0f9dc2e0b0058b793df8.woff2"; +import _63 from "./Xiaolai-Regular-66493ba5a8367f2928812f446f47b56a.woff2"; +import _64 from "./Xiaolai-Regular-57862b464a55b18c7bf234ce22907d73.woff2"; +import _65 from "./Xiaolai-Regular-8d3bcabb847b56243b16afe62adaaf21.woff2"; +import _66 from "./Xiaolai-Regular-2b77e8ebfb2367ab2662396a60e7d320.woff2"; +import _67 from "./Xiaolai-Regular-0b5d723fdc4e249c140f0909e87d03b4.woff2"; +import _68 from "./Xiaolai-Regular-cdbce89e82cc1ab53a2decbf5819278f.woff2"; +import _69 from "./Xiaolai-Regular-739bc1a567439c7cffcd1614644593d2.woff2"; +import _70 from "./Xiaolai-Regular-72252d73220fa3cd856677888cee1635.woff2"; +import _71 from "./Xiaolai-Regular-08e0dc436ad0ad61ba5558db0674d762.woff2"; +import _72 from "./Xiaolai-Regular-cf6ff4e0f491ca0cf3038187a997b9b4.woff2"; +import _73 from "./Xiaolai-Regular-9cfb2a77a4e45025105ad29a1748b90d.woff2"; +import _74 from "./Xiaolai-Regular-450da755d5bcb70906e1295e559b9602.woff2"; +import _75 from "./Xiaolai-Regular-0986d134c05864f5025962eef9f994a0.woff2"; +import _76 from "./Xiaolai-Regular-1ee544f0f1dac422545c505baa788992.woff2"; +import _77 from "./Xiaolai-Regular-4806e761d750087c2d734fc64596eaff.woff2"; +import _78 from "./Xiaolai-Regular-33432927cd87d40cfe393c7482bf221f.woff2"; +import _79 from "./Xiaolai-Regular-be549ab72f0719d606a5c01e2c0219b6.woff2"; +import _80 from "./Xiaolai-Regular-019d66dcad46dc156b162d267f981c20.woff2"; +import _81 from "./Xiaolai-Regular-b5c1596551c256e0e9cf02028595b092.woff2"; +import _82 from "./Xiaolai-Regular-e5f453bb04da18eed01675eeebd88bf8.woff2"; +import _83 from "./Xiaolai-Regular-cf2cc71752631e579e35b0e423bf2638.woff2"; +import _84 from "./Xiaolai-Regular-6f3256af8454371776bc46670d33cc65.woff2"; +import _85 from "./Xiaolai-Regular-23f228f3999c01983860012330e4be08.woff2"; +import _86 from "./Xiaolai-Regular-21430ee05a1248901da8d0de08744d47.woff2"; +import _87 from "./Xiaolai-Regular-5330a2119a716e4e7224ed108b085dac.woff2"; +import _88 from "./Xiaolai-Regular-cd145ce4a0ea18469358df53c207bc1b.woff2"; +import _89 from "./Xiaolai-Regular-36925dfe329a45086cbb7fc5c20d45ac.woff2"; +import _90 from "./Xiaolai-Regular-4bfaa8ffa64c5ee560aa2daba7c9cbd3.woff2"; +import _91 from "./Xiaolai-Regular-112c051027b2d766c19a519f6ee1f4f7.woff2"; +import _92 from "./Xiaolai-Regular-5b0ed6971aaab9c8ad563230bd5471a7.woff2"; +import _93 from "./Xiaolai-Regular-98f2ad84457de7f3740d9920b8fa8667.woff2"; +import _94 from "./Xiaolai-Regular-733171b4ffcd17ea1fe1c0ba627173bf.woff2"; +import _95 from "./Xiaolai-Regular-684d65f1793cac449dde5d59cb3c47fb.woff2"; +import _96 from "./Xiaolai-Regular-cbaaefaaf326668277aa24dfa93c4d28.woff2"; +import _97 from "./Xiaolai-Regular-58fd02350d0bc52cf1ca3bb32ce9766e.woff2"; +import _98 from "./Xiaolai-Regular-7ccce86603f80a099ddb0cb21d4ae3e3.woff2"; +import _99 from "./Xiaolai-Regular-3717077e38f98d89eae729b6c14e56dc.woff2"; +import _100 from "./Xiaolai-Regular-dbea1af6dcd9860be40c3d18254338f5.woff2"; +import _101 from "./Xiaolai-Regular-4a0fdb40036e87b40aa08dd30584cb85.woff2"; +import _102 from "./Xiaolai-Regular-0f626226ba1272e832aea87bafd9720e.woff2"; +import _103 from "./Xiaolai-Regular-938d90c10ff8c20386af7f242c05d6b0.woff2"; +import _104 from "./Xiaolai-Regular-b6d128682ee29e471486354d486a1b90.woff2"; +import _105 from "./Xiaolai-Regular-e51ef413167c6e14e0c0fdcc585f2fc9.woff2"; +import _106 from "./Xiaolai-Regular-9d81066dd2b337c938df6e90380a00dc.woff2"; +import _107 from "./Xiaolai-Regular-20e7bf72fa05de9adf7dbcc7bf51dde6.woff2"; +import _108 from "./Xiaolai-Regular-4095eb84ef3874e2600247bee0b04026.woff2"; +import _109 from "./Xiaolai-Regular-4ee10ae43505e2e0bc62656ced49c0fa.woff2"; +import _110 from "./Xiaolai-Regular-7494dc504ae00ee9cd0505f990f88c5d.woff2"; +import _111 from "./Xiaolai-Regular-8de5b863cb50dfefdd07cb11c774d579.woff2"; +import _112 from "./Xiaolai-Regular-3e1f8f654357353bf0e04ba5c34b5f7f.woff2"; +import _113 from "./Xiaolai-Regular-2e33e8dc771ef5e1d9127d60a6b73679.woff2"; +import _114 from "./Xiaolai-Regular-173945821411c09f70c95f98d590e697.woff2"; +import _115 from "./Xiaolai-Regular-b358f7a51ece39a3247942b1feabdb29.woff2"; +import _116 from "./Xiaolai-Regular-23ad2d71b280f00b1363b95b7bea94eb.woff2"; +import _117 from "./Xiaolai-Regular-5882ffa04f32584d26109137e2da4352.woff2"; +import _118 from "./Xiaolai-Regular-a203b91dad570bf05a58c3c3ddb529bf.woff2"; +import _119 from "./Xiaolai-Regular-bd77e3c7f9e0b072d96af37f73d1aa32.woff2"; +import _120 from "./Xiaolai-Regular-5a45d991244d4c7140217e1e5f5ca4f4.woff2"; +import _121 from "./Xiaolai-Regular-f56414bf9bced67990def8660e306759.woff2"; +import _122 from "./Xiaolai-Regular-583d166e56ba0de4b77eabb47ef67839.woff2"; +import _123 from "./Xiaolai-Regular-7f855356ab893b0d2b9c1c83b8116f0e.woff2"; +import _124 from "./Xiaolai-Regular-b57aaedfd8ebdf3931f25119dc6a5eb2.woff2"; +import _125 from "./Xiaolai-Regular-b6fd38ca30869792244804b04bc058da.woff2"; +import _126 from "./Xiaolai-Regular-452225341522a7942f0f6aab1a5c91a3.woff2"; +import _127 from "./Xiaolai-Regular-866fa7613df6b3fd272bcfd4530c0bb9.woff2"; +import _128 from "./Xiaolai-Regular-52a84a22fd1369bffeaf21da2d6158dc.woff2"; +import _129 from "./Xiaolai-Regular-829615148e6357d826b9242eb7fbbd1e.woff2"; +import _130 from "./Xiaolai-Regular-c99eda15fc26a2941579560f76c3a5cf.woff2"; +import _131 from "./Xiaolai-Regular-395c35dd584b56b0789f58a0559beaf1.woff2"; +import _132 from "./Xiaolai-Regular-203b0e569e3b14aac86a003dc3fa523e.woff2"; +import _133 from "./Xiaolai-Regular-51a0e808bbc8361236ac521a119758a3.woff2"; +import _134 from "./Xiaolai-Regular-6e092f71c1e634059ada0e52abadce67.woff2"; +import _135 from "./Xiaolai-Regular-0f7fb1e0d5015bb1371343153ecf7ce3.woff2"; +import _136 from "./Xiaolai-Regular-d0cf73942fea1c74edbdf0b3011f4656.woff2"; +import _137 from "./Xiaolai-Regular-968cffdc8ee679da094e77ebf50f58ef.woff2"; +import _138 from "./Xiaolai-Regular-7a07ddc0f0c0f5f4a9bad6ee3dda66b5.woff2"; +import _139 from "./Xiaolai-Regular-ec181b795ac1fb5a50d700b6e996d745.woff2"; +import _140 from "./Xiaolai-Regular-cfb211578629b7e8153b37240de6a9d5.woff2"; +import _141 from "./Xiaolai-Regular-59e9ff77b0efaf684bc09274fb6908c9.woff2"; +import _142 from "./Xiaolai-Regular-2adbc89c11e65905393d3dfc468b9d5b.woff2"; +import _143 from "./Xiaolai-Regular-70e811fd7994e61f408c923de6ddd078.woff2"; +import _144 from "./Xiaolai-Regular-c4a687ac4f0c2766eefc9f77ed99cddf.woff2"; +import _145 from "./Xiaolai-Regular-51502f1206be09c565f1547c406e9558.woff2"; +import _146 from "./Xiaolai-Regular-1fdc0c67ed57263a80fd108c1f6ccf24.woff2"; +import _147 from "./Xiaolai-Regular-e11567fd2accf9957cd0d3c2be937d87.woff2"; +import _148 from "./Xiaolai-Regular-20cc1bbf50e7efb442756cb605672c1f.woff2"; +import _149 from "./Xiaolai-Regular-5d2898fbc097a7e24c6f38d80587621e.woff2"; +import _150 from "./Xiaolai-Regular-ac9ceb44437becc3e9c4dbfebab7fc2d.woff2"; +import _151 from "./Xiaolai-Regular-c16ed9740b85badf16e86ea782a3062f.woff2"; +import _152 from "./Xiaolai-Regular-aa0d470430e6391eca720c7cfa44446f.woff2"; +import _153 from "./Xiaolai-Regular-f2b54d4e7be0eaefe1c2c56836fa5368.woff2"; +import _154 from "./Xiaolai-Regular-99a16ef6a64934d5781933dbd9c46b2e.woff2"; +import _155 from "./Xiaolai-Regular-c40533fdf4cc57177b12803598af7e59.woff2"; +import _156 from "./Xiaolai-Regular-91ddb2969bf2d31ba02ad82998d1314c.woff2"; +import _157 from "./Xiaolai-Regular-774d4f764a1299da5d28ec2f2ffe0d69.woff2"; +import _158 from "./Xiaolai-Regular-7718fe60986d8b42b1be9c5ace5ccf25.woff2"; +import _159 from "./Xiaolai-Regular-aa5c9ca6cf4fba00433b7aa3fa10671a.woff2"; +import _160 from "./Xiaolai-Regular-4f50e5136e136527280bc902c5817561.woff2"; +import _161 from "./Xiaolai-Regular-093b9ef39a46ceae95a1df18a0a3a326.woff2"; +import _162 from "./Xiaolai-Regular-a0ca5df4258213d7fc9fce80f65ce760.woff2"; +import _163 from "./Xiaolai-Regular-d2666cbed13462c5dc36fa2f15c202ca.woff2"; +import _164 from "./Xiaolai-Regular-1e6fd68f1f3902ce48ce8c69df385622.woff2"; +import _165 from "./Xiaolai-Regular-87599f94b6cc129d505b375798d0d751.woff2"; +import _166 from "./Xiaolai-Regular-06c77b8c66e51ed6c63ccb502dd8b8af.woff2"; +import _167 from "./Xiaolai-Regular-13ae07ed2e272d26d59bc0691cd7117a.woff2"; +import _168 from "./Xiaolai-Regular-353f33792a8f60dc69323ddf635a269e.woff2"; +import _169 from "./Xiaolai-Regular-0facdf1ea213ba40261022f5d5ed4493.woff2"; +import _170 from "./Xiaolai-Regular-f8ee5d36068a42b51d0e4a1116cfcec1.woff2"; +import _171 from "./Xiaolai-Regular-79d494361ae093b69e74ee9dbe65bfd4.woff2"; +import _172 from "./Xiaolai-Regular-74e2263a91439c25b91d5132ce9f4d62.woff2"; +import _173 from "./Xiaolai-Regular-ee8bae97908d5147b423f77ad0d3c1bb.woff2"; +import _174 from "./Xiaolai-Regular-56467a5c8840c4d23a60b2f935114848.woff2"; +import _175 from "./Xiaolai-Regular-145aa02cdd91946e67dc934e1acffe75.woff2"; +import _176 from "./Xiaolai-Regular-54acdfc2166ad7fcbd074f75fd4a56ba.woff2"; +import _177 from "./Xiaolai-Regular-29cec36cd205b211da97acabaa62f055.woff2"; +import _178 from "./Xiaolai-Regular-3756e81d3e149cf6099163ee79944fec.woff2"; +import _179 from "./Xiaolai-Regular-8e9f97f01034820170065b2921b4fb5e.woff2"; +import _180 from "./Xiaolai-Regular-13d2887ec8ee73c43acdabc52a05af7b.woff2"; +import _181 from "./Xiaolai-Regular-72536a3d71b694a0d53dd90ddceae41e.woff2"; +import _182 from "./Xiaolai-Regular-603aefd23e350ba7eb124273e3c9bcf1.woff2"; +import _183 from "./Xiaolai-Regular-095c169f3314805276f603a362766abd.woff2"; +import _184 from "./Xiaolai-Regular-9544732d2e62d1a429674f8ee41b5d3a.woff2"; +import _185 from "./Xiaolai-Regular-d3716376641d615e2995605b29bca7b6.woff2"; +import _186 from "./Xiaolai-Regular-5a1ce3117cfe90c48e8fb4a9a00f694d.woff2"; +import _187 from "./Xiaolai-Regular-b7d203b051eff504ff59ddca7576b6a9.woff2"; +import _188 from "./Xiaolai-Regular-4a38cc3e9cf104e69ba246d37f8cf135.woff2"; +import _189 from "./Xiaolai-Regular-982b630266d87db93d2539affb1275c6.woff2"; +import _190 from "./Xiaolai-Regular-9592bfc861f07bcb8d75c196b370e548.woff2"; +import _191 from "./Xiaolai-Regular-a7accba310e821da5505f71c03b76bdb.woff2"; +import _192 from "./Xiaolai-Regular-dac48066b5883d8b4551fc584f0c2a3e.woff2"; +import _193 from "./Xiaolai-Regular-a1f916d6039285c4ffb900cd654e418f.woff2"; +import _194 from "./Xiaolai-Regular-95bfd249da4902577b4b7d76ebdd0b44.woff2"; +import _195 from "./Xiaolai-Regular-93fc8f28a33234bcadf1527cafabd502.woff2"; +import _196 from "./Xiaolai-Regular-903bb6865f3452e2fda42e3a25547bc5.woff2"; +import _197 from "./Xiaolai-Regular-4aca6a43e59aceee2166b0c7e4e85ef1.woff2"; +import _198 from "./Xiaolai-Regular-24476a126f129212beb33f66853ea151.woff2"; +import _199 from "./Xiaolai-Regular-1b611157cd46bb184d4fa4dae2d6a2b8.woff2"; +import _200 from "./Xiaolai-Regular-56a32a7689abd0326e57c10c6c069bb4.woff2"; +import _201 from "./Xiaolai-Regular-3cc70dbb64df5b21f1326cc24dee2195.woff2"; +import _202 from "./Xiaolai-Regular-f6032fc06eb20480f096199713f70885.woff2"; +import _203 from "./Xiaolai-Regular-e2ead7ea7da0437f085f42ffc05f8d13.woff2"; +import _204 from "./Xiaolai-Regular-97f7f48ce90c9429bf32ae51469db74d.woff2"; +import _205 from "./Xiaolai-Regular-24a21c1e4449222e8d1898d69ff3a404.woff2"; +import _206 from "./Xiaolai-Regular-726303e0774b4e678bff8c2deb6ca603.woff2"; +import _207 from "./Xiaolai-Regular-5a7fac4b8b23a6e4e5ba0c9bf1756c91.woff2"; +import _208 from "./Xiaolai-Regular-2b7441d46298788ac94e610ffcc709b6.woff2"; + +import { type ExcalidrawFontFaceDescriptor } from "../.."; + +/* Generated By cn-font-split@5.2.2 https://www.npmjs.com/package/cn-font-split +CreateTime: Tue, 08 Oct 2024 18:34:44 GMT; +Origin File Name Table: +fontFamily: Xiaolai SC +fontSubfamily: Regular +preferredFamily: 小賴字體 SC +postScriptFindFontName: +copyright: Copyright © 2020 LXGW +uniqueID: Xiaolai SC:Version 3.11 +fullName: Xiaolai SC +version: Version 3.11;December 4, 2020;FontCreator 13.0.0.2613 64-bit +postScriptName: XiaolaiSC +trademark: 小赖字体 SC +designer: Nozomi Seto 瀬戸のぞみ +description: This font was created using FontCreator from High-Logic.com +license: This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software. +licenseURL: http://scripts.sil.org/OFL + */ + +/** + * The original font was modified with the following changes: + * - removed non-CJK codepoints + * - reduced any Hangul side-bearings to 40% + * - centered in width of inproperly centered CJK codepoints + */ + +export const XiaolaiFontFaces: ExcalidrawFontFaceDescriptor[] = [ + { + uri: _0, + descriptors: { + unicodeRange: + "U+f9b8-fa6d,U+fe32,U+fe45-fe4f,U+ff02-ff0b,U+ff0d-ff1e,U+ff20-ff2a", + }, + }, + { + uri: _1, + descriptors: { + unicodeRange: + "U+20dd-20de,U+25ef,U+ff2b-ffbe,U+ffc2-ffc7,U+ffca-ffcf,U+ffd2-ffd7,U+ffda-ffdc,U+ffe0-ffe6,U+ffe8-ffee", + }, + }, + { uri: _2, descriptors: { unicodeRange: "U+d7eb-d7fb,U+f900-f9b7" } }, + { + uri: _3, + descriptors: { unicodeRange: "U+d6f2-d7a3,U+d7b0-d7c6,U+d7cb-d7ea" }, + }, + { uri: _4, descriptors: { unicodeRange: "U+d609-d6f1" } }, + { uri: _5, descriptors: { unicodeRange: "U+d520-d608" } }, + { uri: _6, descriptors: { unicodeRange: "U+d437-d51f" } }, + { uri: _7, descriptors: { unicodeRange: "U+d34e-d436" } }, + { uri: _8, descriptors: { unicodeRange: "U+d265-d34d" } }, + { uri: _9, descriptors: { unicodeRange: "U+d17c-d264" } }, + { uri: _10, descriptors: { unicodeRange: "U+d093-d17b" } }, + { uri: _11, descriptors: { unicodeRange: "U+cfaa-d092" } }, + { uri: _12, descriptors: { unicodeRange: "U+cec1-cfa9" } }, + { uri: _13, descriptors: { unicodeRange: "U+cdd8-cec0" } }, + { uri: _14, descriptors: { unicodeRange: "U+ccf1-cdd7" } }, + { uri: _15, descriptors: { unicodeRange: "U+cc08-ccf0" } }, + { uri: _16, descriptors: { unicodeRange: "U+cb43-cc07" } }, + { uri: _17, descriptors: { unicodeRange: "U+ca83-cb42" } }, + { uri: _18, descriptors: { unicodeRange: "U+c9a1-ca82" } }, + { uri: _19, descriptors: { unicodeRange: "U+c8b8-c9a0" } }, + { uri: _20, descriptors: { unicodeRange: "U+c7cf-c8b7" } }, + { uri: _21, descriptors: { unicodeRange: "U+c6e6-c7ce" } }, + { uri: _22, descriptors: { unicodeRange: "U+c5fd-c6e5" } }, + { uri: _23, descriptors: { unicodeRange: "U+c514-c5fc" } }, + { uri: _24, descriptors: { unicodeRange: "U+c42b-c513" } }, + { uri: _25, descriptors: { unicodeRange: "U+c341-c34e,U+c350-c42a" } }, + { uri: _26, descriptors: { unicodeRange: "U+c258-c340" } }, + { uri: _27, descriptors: { unicodeRange: "U+c16f-c257" } }, + { uri: _28, descriptors: { unicodeRange: "U+c086-c16e" } }, + { uri: _29, descriptors: { unicodeRange: "U+bf9d-c085" } }, + { uri: _30, descriptors: { unicodeRange: "U+beb4-bf9c" } }, + { uri: _31, descriptors: { unicodeRange: "U+bdcb-beb3" } }, + { uri: _32, descriptors: { unicodeRange: "U+bce2-bdca" } }, + { uri: _33, descriptors: { unicodeRange: "U+bbf9-bce1" } }, + { uri: _34, descriptors: { unicodeRange: "U+bb10-bbf8" } }, + { uri: _35, descriptors: { unicodeRange: "U+ba27-bb0f" } }, + { uri: _36, descriptors: { unicodeRange: "U+b93e-ba26" } }, + { uri: _37, descriptors: { unicodeRange: "U+b855-b93d" } }, + { uri: _38, descriptors: { unicodeRange: "U+b76c-b854" } }, + { uri: _39, descriptors: { unicodeRange: "U+b683-b76b" } }, + { uri: _40, descriptors: { unicodeRange: "U+b59a-b682" } }, + { uri: _41, descriptors: { unicodeRange: "U+b4b1-b599" } }, + { uri: _42, descriptors: { unicodeRange: "U+11fb-11ff,U+b3cd-b4b0" } }, + { uri: _43, descriptors: { unicodeRange: "U+11e6-11fa,U+b2f9-b3cc" } }, + { uri: _44, descriptors: { unicodeRange: "U+11d1-11e5,U+b225-b2f8" } }, + { uri: _45, descriptors: { unicodeRange: "U+11bc-11d0,U+b151-b224" } }, + { uri: _46, descriptors: { unicodeRange: "U+11a7-11bb,U+b07d-b150" } }, + { uri: _47, descriptors: { unicodeRange: "U+1191-11a6,U+afaa-b07c" } }, + { uri: _48, descriptors: { unicodeRange: "U+117c-1190,U+aed6-afa9" } }, + { uri: _49, descriptors: { unicodeRange: "U+1167-117b,U+ae02-aed5" } }, + { + uri: _50, + descriptors: { unicodeRange: "U+1152-115e,U+1160-1166,U+ad2d-ae01" }, + }, + { uri: _51, descriptors: { unicodeRange: "U+113d-1151,U+ac59-ad2c" } }, + { + uri: _52, + descriptors: { + unicodeRange: + "U+1100-113c,U+9f95-9f98,U+9f9c-9f9e,U+9fa1-9fce,U+9fd0,U+a960-a97c,U+ac00-ac58", + }, + }, + { + uri: _53, + descriptors: { + unicodeRange: + "U+9771-9772,U+9775,U+9777-977b,U+977d-9784,U+9786-978a,U+978c,U+978e-9790,U+9793,U+9795-9797,U+9799-979f,U+97a1-97a2,U+97a4-97aa,U+97ac,U+97ae,U+97b0-97b1,U+97b3,U+97b5-97e5,U+97e8,U+97ee-97f2,U+97f4,U+97f7-982d", + }, + }, + { + uri: _54, + descriptors: { + unicodeRange: + "U+9491,U+9496,U+9498,U+94c7,U+94cf,U+94d3-94d4,U+94da,U+94e6,U+94fb,U+951c,U+9520,U+9527,U+9533,U+953d,U+9543,U+9548,U+954b,U+9555,U+955a,U+9560,U+956e,U+9574-9575,U+9577-957e,U+9580-95e7,U+95ec,U+95ff,U+9607,U+9613,U+9618,U+961b,U+961e,U+9620,U+9623-9629,U+962b-962d,U+962f-9630,U+9637-963a,U+963e,U+9641,U+9643,U+964a,U+964e-964f,U+9651-9653,U+9656-965a,U+965c-965e,U+9660,U+9663,U+9665-9666,U+966b,U+966d-9671,U+9673,U+9678-9684,U+9687,U+9689-968a,U+968c,U+968e,U+9691-9693", + }, + }, + { + uri: _55, + descriptors: { + unicodeRange: + "U+923c-9273,U+9275-928d,U+928f-92ad,U+92af-92c7,U+92c9-92ee", + }, + }, + { + uri: _56, + descriptors: { + unicodeRange: + "U+9159,U+915b-915c,U+915f-9160,U+9166-9168,U+916b,U+916d,U+9173,U+917a-917c,U+9180-9184,U+9186,U+9188,U+918a,U+918e-918f,U+9193-9199,U+919c-91a1,U+91a4-91a9,U+91ab-91ac,U+91b0-91b3,U+91b6-91b9,U+91bb-91c6,U+91c8,U+91cb,U+91d0,U+91d2-91db,U+91dd-923b", + }, + }, + { + uri: _57, + descriptors: { + unicodeRange: + "U+902b-902c,U+9030-9034,U+9037,U+9039-903a,U+903d,U+903f-9040,U+9043,U+9045-9046,U+9048-904c,U+904e,U+9054-9056,U+9059-905a,U+905c-9061,U+9064,U+9066-9067,U+9069-906c,U+906f-9073,U+9076-907c,U+907e,U+9081,U+9084-9087,U+9089-908a,U+908c-9090,U+9092,U+9094,U+9096,U+9098,U+909a,U+909c,U+909e-90a0,U+90a4-90a5,U+90a7-90a9,U+90ab,U+90ad,U+90b2,U+90b7,U+90bc-90bd,U+90bf-90c0,U+90c2-90c3,U+90c6,U+90c8-90c9,U+90cb-90cd,U+90d2,U+90d4-90d6,U+90d8-90da,U+90de-90e0,U+90e3-90e5,U+90e9-90ea,U+90ec,U+90ee,U+90f0-90f3,U+90f5-90f7,U+90f9-90fc,U+90ff-9101,U+9103,U+9105-9118,U+911a-911d,U+911f-9121,U+9124-912e,U+9130,U+9132-9138,U+913a-9142,U+9144-9145,U+9147-9148,U+9151,U+9153-9156,U+9158", + }, + }, + { + uri: _58, + descriptors: { + unicodeRange: + "U+8f03-8f65,U+8f6a,U+8f80,U+8f8c,U+8f92,U+8f9d,U+8fa0-8fa2,U+8fa4-8fa7,U+8faa,U+8fac-8faf,U+8fb2-8fb5,U+8fb7-8fb8,U+8fba-8fbc,U+8fbf-8fc0,U+8fc3,U+8fc6,U+8fc9-8fcd,U+8fcf,U+8fd2,U+8fd6-8fd7,U+8fda,U+8fe0-8fe1,U+8fe3,U+8fe7,U+8fec,U+8fef,U+8ff1-8ff2,U+8ff4-8ff6,U+8ffa-8ffc,U+8ffe-8fff,U+9007-9008,U+900c,U+900e,U+9013,U+9015,U+9018-9019,U+901c,U+9023-9025,U+9027-902a", + }, + }, + { + uri: _59, + descriptors: { + unicodeRange: + "U+8d03-8d1c,U+8d20,U+8d51-8d52,U+8d57,U+8d5f,U+8d65,U+8d68-8d6a,U+8d6c,U+8d6e-8d6f,U+8d71-8d72,U+8d78-8d80,U+8d82-8d83,U+8d86-8d89,U+8d8c-8d90,U+8d92-8d93,U+8d95-8d9e,U+8da0-8da2,U+8da4-8db0,U+8db2,U+8db6-8db7,U+8db9,U+8dbb,U+8dbd,U+8dc0-8dc2,U+8dc5,U+8dc7-8dca,U+8dcd,U+8dd0,U+8dd2-8dd5,U+8dd8-8dd9,U+8ddc,U+8de0-8de2,U+8de5-8de7,U+8de9,U+8ded-8dee,U+8df0-8df2,U+8df4,U+8df6,U+8dfc,U+8dfe-8e04,U+8e06-8e08,U+8e0b,U+8e0d-8e0e,U+8e10-8e13,U+8e15-8e1c,U+8e20-8e21,U+8e24-8e28,U+8e2b,U+8e2d,U+8e30,U+8e32-8e34,U+8e36-8e38,U+8e3b-8e3c,U+8e3e-8e3f,U+8e43,U+8e45-8e46", + }, + }, + { + uri: _60, + descriptors: { + unicodeRange: + "U+8bea,U+8c09,U+8c1e,U+8c38-8c40,U+8c42-8c45,U+8c48,U+8c4a-8c4b,U+8c4d-8c54,U+8c56-8c59,U+8c5b-8c60,U+8c63-8c69,U+8c6c-8c72,U+8c74-8c77,U+8c7b-8c81,U+8c83-8c84,U+8c86-8c88,U+8c8b,U+8c8d-8c93,U+8c95-8c97,U+8c99-8d02", + }, + }, + { + uri: _61, + descriptors: { + unicodeRange: + "U+8a64-8a78,U+8a7a-8a88,U+8a8b-8a92,U+8a94-8b06,U+8b08-8b1b", + }, + }, + { + uri: _62, + descriptors: { + unicodeRange: + "U+8987-89c0,U+89c3,U+89cd,U+89d3-89d5,U+89d7-89d9,U+89db,U+89dd,U+89df-89e2,U+89e4,U+89e7-89ea,U+89ec-89ee,U+89f0-89f2,U+89f4-89ff,U+8a01-8a06,U+8a08-8a3d,U+8a3f-8a47,U+8a49-8a63", + }, + }, + { + uri: _63, + descriptors: { + unicodeRange: + "U+87e3-87e4,U+87e6-87e9,U+87eb-87ed,U+87ef-87f8,U+87fa-87fd,U+87ff-8802,U+8804-8809,U+880b-8812,U+8814,U+8817-881a,U+881c-8820,U+8823-8831,U+8833-8838,U+883a-883b,U+883d-883f,U+8841-8843,U+8846-884b,U+884e-8853,U+8855-8856,U+8858,U+885a-8860,U+8866-8867,U+886a,U+886d,U+886f,U+8871,U+8873-8876,U+8878-887c,U+8880,U+8883,U+8886-8887,U+8889-888a,U+888c,U+888e-8891,U+8893-8895,U+8897-889b,U+889d-88a1,U+88a3,U+88a5-88aa,U+88ac,U+88ae-88b0,U+88b2-88b6,U+88b8-88bb", + }, + }, + { + uri: _64, + descriptors: { + unicodeRange: + "U+86e7-86e8,U+86ea-86ec,U+86ef,U+86f5-86f7,U+86fa-86fd,U+86ff,U+8701,U+8704-8706,U+870b-870c,U+870e-8711,U+8714,U+8716,U+8719,U+871b,U+871d,U+871f-8720,U+8724,U+8726-8728,U+872a-872d,U+872f-8730,U+8732-8733,U+8735-8736,U+8738-873a,U+873c-873d,U+8740-8746,U+874a-874b,U+874d,U+874f-8752,U+8754-8756,U+8758,U+875a-875f,U+8761-8762,U+8766-876d,U+876f,U+8771-8773,U+8775,U+8777-877a,U+877f-8781,U+8784,U+8786-8787,U+8789-878a,U+878c,U+878e-8792,U+8794-8796,U+8798-879e,U+87a0-87a7,U+87a9-87aa,U+87ae,U+87b0-87b2,U+87b4,U+87b6-87b9,U+87bb-87bc,U+87be-87bf,U+87c1-87c5,U+87c7-87c9,U+87cc-87d0,U+87d4-87da,U+87dc-87df,U+87e1-87e2", + }, + }, + { + uri: _65, + descriptors: { + unicodeRange: + "U+8604,U+8606-8610,U+8612-8615,U+8617-8626,U+8628,U+862a-8637,U+8639-863b,U+863d-864c,U+8652-8653,U+8655-8659,U+865b-865d,U+865f-8661,U+8663-866a,U+866d,U+866f-8670,U+8672-8678,U+8683-8689,U+868e-8692,U+8694,U+8696-869b,U+869e-86a2,U+86a5-86a6,U+86ab,U+86ad-86ae,U+86b2-86b3,U+86b7-86b9,U+86bb-86bf,U+86c1-86c3,U+86c5,U+86c8,U+86cc-86cd,U+86d2-86d3,U+86d5-86d7,U+86da,U+86dc-86dd,U+86e0-86e3,U+86e5-86e6", + }, + }, + { + uri: _66, + descriptors: { + unicodeRange: + "U+8456,U+8458,U+845d-8460,U+8462,U+8464-8468,U+846a,U+846e-8470,U+8472,U+8474,U+8477,U+8479,U+847b-8481,U+8483-8486,U+848a,U+848d,U+848f-8496,U+8498,U+849a-849b,U+849d-84a0,U+84a2-84ae,U+84b0-84b1,U+84b3,U+84b5-84b7,U+84bb-84bc,U+84be,U+84c0,U+84c2-84c3,U+84c5-84c8,U+84cb-84cc,U+84ce-84cf,U+84d2,U+84d4-84d5,U+84d7-84dc,U+84de,U+84e1-84e2,U+84e4,U+84e7-84eb,U+84ed-84ef,U+84f1-84fb,U+84fd-84fe,U+8500-850b,U+850d-8510,U+8512,U+8514-8516,U+8518-8519,U+851b-851e,U+8520,U+8522-852a,U+852d-8536,U+853e-8542,U+8544-8547,U+854b-854f", + }, + }, + { + uri: _67, + descriptors: { + unicodeRange: + "U+82c2-82c3,U+82c5-82c6,U+82c9,U+82d0,U+82d6,U+82d9-82da,U+82dd,U+82e2,U+82e7-82ea,U+82ec-82ee,U+82f0,U+82f2-82f3,U+82f5-82f6,U+82f8,U+82fa,U+82fc-8300,U+830a-830b,U+830d,U+8310,U+8312-8313,U+8316,U+8318-8319,U+831d-8326,U+8329-832a,U+832e,U+8330,U+8332,U+8337,U+833b,U+833d-833f,U+8341-8342,U+8344-8345,U+8348,U+834a-834e,U+8353,U+8355-8359,U+835d,U+8362,U+8370-8376,U+8379-837a,U+837e-8384,U+8387-8388,U+838a-838d,U+838f-8391,U+8394-8397,U+8399-839a,U+839d,U+839f,U+83a1-83a7,U+83ac-83af,U+83b5,U+83bb,U+83be-83bf,U+83c2-83c4,U+83c6,U+83c8-83c9,U+83cb,U+83cd-83ce,U+83d0-83d3,U+83d5,U+83d7,U+83d9-83db,U+83de,U+83e2-83e4,U+83e6-83e8,U+83eb-83ef,U+83f3-83f7,U+83fa-83fc,U+83fe-8400,U+8402,U+8405,U+8407-840a,U+8410,U+8412-8417,U+8419-841b,U+841e-8423,U+8429-8430,U+8432-8437,U+8439-843b,U+843e-8445,U+8447-8450,U+8452-8455", + }, + }, + { + uri: _68, + descriptors: { + unicodeRange: + "U+81a4-81a5,U+81a7,U+81a9,U+81ab-81b2,U+81b4-81b9,U+81bc-81bf,U+81c4-81c5,U+81c7-81c9,U+81cb,U+81cd-81e2,U+81e4-81e6,U+81e8-81e9,U+81eb,U+81ee-81f2,U+81f5-81fa,U+81fd,U+81ff,U+8203,U+8207-820b,U+820e-820f,U+8211,U+8213,U+8215-821a,U+821d,U+8220,U+8224-8227,U+8229,U+822e,U+8232,U+823a,U+823c-823d,U+823f-8243,U+8245-8246,U+8248,U+824a,U+824c-824e,U+8250-8257,U+8259,U+825b-825e,U+8260-8267,U+8269-826d,U+8271,U+8275-8278,U+827b-827c,U+8280-8281,U+8283,U+8285-8287,U+8289,U+828c,U+8290,U+8293-8296,U+829a-829b,U+829e,U+82a0,U+82a2-82a3,U+82a7,U+82b2,U+82b5-82b6,U+82ba-82bc,U+82bf-82c0", + }, + }, + { + uri: _69, + descriptors: { + unicodeRange: + "U+8059,U+805b-8068,U+806b-8070,U+8072-807e,U+8081-8082,U+8085,U+8088,U+808a,U+808d-8092,U+8094-8095,U+8097,U+8099,U+809e,U+80a3,U+80a6-80a8,U+80ac,U+80b0,U+80b3,U+80b5-80b6,U+80b8-80b9,U+80bb,U+80c5,U+80c7-80cb,U+80cf-80d5,U+80d8,U+80df-80e0,U+80e2-80e3,U+80e6,U+80ee,U+80f5,U+80f7,U+80f9,U+80fb,U+80fe-8101,U+8103-8105,U+8107-8108,U+810b-810c,U+8115,U+8117,U+8119,U+811b-811d,U+811f-812b,U+812d-812e,U+8130,U+8133-8135,U+8137,U+8139-813d,U+813f-8145,U+8147,U+8149,U+814d-814f,U+8152,U+8156-8158,U+815b-815f,U+8161-8164,U+8166,U+8168,U+816a-816c,U+816f,U+8172-8173,U+8175-8178,U+8181,U+8183-8187,U+8189,U+818b-818e,U+8190,U+8192-8197,U+8199-819a,U+819e-81a2", + }, + }, + { + uri: _70, + descriptors: { + unicodeRange: + "U+7f3c-7f41,U+7f43,U+7f46-7f4f,U+7f52-7f53,U+7f56,U+7f59,U+7f5b-7f5e,U+7f60,U+7f63-7f67,U+7f6b-7f6d,U+7f6f-7f70,U+7f73,U+7f75-7f78,U+7f7a-7f7d,U+7f7f-7f80,U+7f82-7f89,U+7f8b,U+7f8d,U+7f8f-7f93,U+7f95-7f99,U+7f9b-7f9c,U+7fa0,U+7fa2-7fa3,U+7fa5-7fa6,U+7fa8-7fae,U+7fb1,U+7fb3-7fb7,U+7fba-7fbb,U+7fbe,U+7fc0,U+7fc2-7fc4,U+7fc6-7fc9,U+7fcb,U+7fcd,U+7fcf-7fd3,U+7fd6-7fd7,U+7fd9-7fde,U+7fe2-7fe4,U+7fe7-7fe8,U+7fea-7fed,U+7fef,U+7ff2,U+7ff4-7ffa,U+7ffd-7fff,U+8002,U+8007-800a,U+800e-800f,U+8011,U+8013,U+801a-801b,U+801d-801f,U+8021,U+8023-8024,U+802b-8030,U+8032,U+8034,U+8039-803a,U+803c,U+803e,U+8040-8041,U+8044-8045,U+8047-8049,U+804e-8051,U+8053,U+8055-8057", + }, + }, + { + uri: _71, + descriptors: { + unicodeRange: + "U+7cd8,U+7cda-7cdb,U+7cdd-7cde,U+7ce1-7ce7,U+7ce9-7cee,U+7cf0-7cf7,U+7cf9-7cfa,U+7cfc-7d09,U+7d0b-7d1f,U+7d21,U+7d23-7d26,U+7d28-7d2a,U+7d2c-7d2e,U+7d30-7d6d,U+7d6f-7d76,U+7d78-7d94", + }, + }, + { + uri: _72, + descriptors: { + unicodeRange: + "U+7afe,U+7b00-7b02,U+7b05,U+7b07,U+7b09,U+7b0c-7b0e,U+7b10,U+7b12-7b13,U+7b16-7b18,U+7b1a,U+7b1c-7b1d,U+7b1f,U+7b21-7b23,U+7b27,U+7b29,U+7b2d,U+7b2f-7b30,U+7b32,U+7b34-7b37,U+7b39,U+7b3b,U+7b3d,U+7b3f-7b44,U+7b46,U+7b48,U+7b4a,U+7b4d-7b4e,U+7b53,U+7b55,U+7b57,U+7b59,U+7b5c,U+7b5e-7b5f,U+7b61,U+7b63-7b6d,U+7b6f-7b70,U+7b73-7b74,U+7b76,U+7b78,U+7b7a,U+7b7c-7b7d,U+7b7f,U+7b81-7b84,U+7b86-7b8c,U+7b8e-7b8f,U+7b91-7b93,U+7b96,U+7b98-7b9b,U+7b9e-7ba0,U+7ba3-7ba5,U+7bae-7bb0,U+7bb2-7bb3,U+7bb5-7bb7,U+7bb9-7bc0,U+7bc2-7bc5,U+7bc8-7bcb,U+7bcd-7bd0,U+7bd2,U+7bd4-7bd8,U+7bdb-7bdc,U+7bde-7be0,U+7be2-7be4,U+7be7-7be9,U+7beb-7bed,U+7bef-7bf0,U+7bf2-7bf6,U+7bf8-7bfb,U+7bfd,U+7bff-7c06,U+7c08-7c0a,U+7c0d-7c0e,U+7c10-7c13", + }, + }, + { + uri: _73, + descriptors: { + unicodeRange: + "U+7a10-7a13,U+7a15-7a16,U+7a18-7a19,U+7a1b-7a1d,U+7a1f,U+7a21-7a22,U+7a24-7a32,U+7a34-7a36,U+7a38,U+7a3a,U+7a3e,U+7a40-7a45,U+7a47-7a50,U+7a52-7a56,U+7a58-7a6f,U+7a71-7a73,U+7a75,U+7a7b-7a7e,U+7a82,U+7a85,U+7a87,U+7a89-7a8c,U+7a8e-7a90,U+7a93-7a94,U+7a99-7a9b,U+7a9e,U+7aa1-7aa4,U+7aa7,U+7aa9-7aab,U+7aae-7ab2,U+7ab4-7abe,U+7ac0-7aca,U+7acc-7ad5,U+7ad7-7ad8,U+7ada-7add,U+7ae1-7ae2,U+7ae4,U+7ae7-7aec,U+7aee,U+7af0-7af8,U+7afb-7afc", + }, + }, + { + uri: _74, + descriptors: { + unicodeRange: + "U+790d-7912,U+7914-791d,U+791f-7923,U+7925-7933,U+7935-7939,U+793d,U+793f,U+7942-7945,U+7947,U+794a-7952,U+7954-7955,U+7958-7959,U+7961,U+7963-7964,U+7966,U+7969-796c,U+796e,U+7970-7976,U+7979,U+797b-797f,U+7982-7983,U+7986-7989,U+798b-798e,U+7990-7999,U+799b-79a6,U+79a8-79b2,U+79b4-79b8,U+79bc,U+79bf,U+79c2,U+79c4-79c5,U+79c7-79c8,U+79ca,U+79cc,U+79ce-79d0,U+79d3-79d4,U+79d6-79d7,U+79d9-79de,U+79e0-79e2,U+79e5,U+79e8,U+79ea,U+79ec,U+79ee,U+79f1-79f7,U+79f9-79fa,U+79fc,U+79fe-79ff,U+7a01,U+7a04-7a05,U+7a07-7a0a,U+7a0c,U+7a0f", + }, + }, + { + uri: _75, + descriptors: { + unicodeRange: + "U+77d8-77da,U+77dd-77e1,U+77e4,U+77e6,U+77e8,U+77ea,U+77ef-77f2,U+77f4-77f5,U+77f7,U+77f9-77fc,U+7803-7808,U+780a-780b,U+780e-7810,U+7813,U+7815,U+7819,U+781b,U+781e,U+7820-7822,U+7824,U+7828,U+782a-782b,U+782e-782f,U+7831-7833,U+7835-7836,U+783d,U+783f,U+7841-7844,U+7846,U+7848-784b,U+784d,U+784f,U+7851,U+7853-7854,U+7858-785c,U+785e-7869,U+786f-7876,U+7878-787b,U+787d-7886,U+7888,U+788a-788b,U+788f-7890,U+7892,U+7894-7896,U+7899,U+789d-789e,U+78a0,U+78a2,U+78a4,U+78a6,U+78a8-78af,U+78b5-78b8,U+78ba-78bd,U+78bf-78c0,U+78c2-78c4,U+78c6-78c8,U+78cc-78cf,U+78d1-78d3,U+78d6-78d8,U+78da-78e7,U+78e9-78eb,U+78ed-78f1,U+78f3,U+78f5-78f6,U+78f8-78f9,U+78fb-7900,U+7902-7904,U+7906-790c", + }, + }, + { + uri: _76, + descriptors: { + unicodeRange: + "U+76af-76b0,U+76b3,U+76b5-76be,U+76c0-76c1,U+76c3-76c4,U+76c7,U+76c9,U+76cb-76cc,U+76d3,U+76d5,U+76d9-76da,U+76dc-76de,U+76e0-76e4,U+76e6-76ed,U+76f0,U+76f3,U+76f5-76f7,U+76fa-76fb,U+76fd,U+76ff-7703,U+7705-7706,U+770a,U+770c,U+770e-7718,U+771b-771e,U+7721,U+7723-7725,U+7727,U+772a-772c,U+772e,U+7730-7734,U+7739,U+773b,U+773d-773f,U+7742,U+7744-7746,U+7748-774f,U+7752-7759,U+775c-7760,U+7764,U+7767,U+7769-776a,U+776d-7778,U+777a-777c,U+7781-7783,U+7786-778b,U+778f-7790,U+7793-779e,U+77a1,U+77a3-77a4,U+77a6,U+77a8,U+77ab,U+77ad-77af,U+77b1-77b2,U+77b4,U+77b6-77ba,U+77bc,U+77be,U+77c0-77cc,U+77ce-77d6", + }, + }, + { + uri: _77, + descriptors: { + unicodeRange: + "U+7589-758a,U+758c-758e,U+7590,U+7593,U+7595,U+7598,U+759b-759c,U+759e,U+75a2,U+75a6-75aa,U+75ad,U+75b6-75b7,U+75ba-75bb,U+75bf-75c1,U+75c6,U+75cb-75cc,U+75ce-75d1,U+75d3,U+75d7,U+75d9-75da,U+75dc-75dd,U+75df-75e1,U+75e5,U+75e9,U+75ec-75ef,U+75f2-75f3,U+75f5-75f8,U+75fa-75fb,U+75fd-75fe,U+7602,U+7604,U+7606-7609,U+760b,U+760d-760f,U+7611-7614,U+7616,U+761a,U+761c-761e,U+7621,U+7623,U+7627-7628,U+762c,U+762e-762f,U+7631-7632,U+7636-7637,U+7639-763b,U+763d,U+7641-7642,U+7644-764b,U+764e-7653,U+7655,U+7657-765b,U+765d,U+765f-7662,U+7664-766a,U+766c-766e,U+7670-7677,U+7679-767a,U+767c,U+767f-7681,U+7683,U+7685,U+7689-768a,U+768c-768d,U+768f-7690,U+7692,U+7694-7695,U+7697-7698,U+769a-76a3,U+76a5-76ad", + }, + }, + { + uri: _78, + descriptors: { + unicodeRange: + "U+7492-749b,U+749d,U+749f-74a6,U+74aa-74b9,U+74bb-74d1,U+74d3-74db,U+74dd,U+74df,U+74e1,U+74e5,U+74e7-74ed,U+74f0-74f3,U+74f5,U+74f8-74fe,U+7500-7503,U+7505-750c,U+750e,U+7510,U+7512,U+7514-7517,U+751b,U+751d-751e,U+7520-7524,U+7526-7527,U+752a,U+752e,U+7534,U+7536,U+7539,U+753c-753d,U+753f,U+7541-7544,U+7546-7547,U+7549-754a,U+754d,U+7550-7553,U+7555-7558,U+755d-7564,U+7567-7569,U+756b-7571,U+7573,U+7575-7577,U+757a-757e,U+7580-7582,U+7584-7585,U+7587-7588", + }, + }, + { + uri: _79, + descriptors: { + unicodeRange: + "U+7372-737d,U+737f-7383,U+7385-7386,U+7388,U+738a,U+738c-738d,U+738f-7390,U+7392-7395,U+7397-739a,U+739c-739e,U+73a0-73a1,U+73a3-73a8,U+73aa,U+73ac-73ad,U+73b1,U+73b4-73b6,U+73b8-73b9,U+73bc-73bf,U+73c1,U+73c3-73c7,U+73cb-73cc,U+73ce,U+73d2-73d8,U+73da-73dd,U+73df,U+73e1-73e4,U+73e6,U+73e8,U+73ea-73ec,U+73ee-73f1,U+73f3-7402,U+7404,U+7407-7408,U+740b-740e,U+7411-7419,U+741c-7421,U+7423-7424,U+7427,U+7429,U+742b,U+742d,U+742f,U+7431-7432,U+7437-743b,U+743d-7440,U+7442-7454,U+7456,U+7458,U+745d,U+7460-746c,U+746e-746f,U+7471-7475,U+7478-747d,U+747f,U+7482,U+7484-7486,U+7488-748a,U+748c-748d,U+748f,U+7491", + }, + }, + { + uri: _80, + descriptors: { + unicodeRange: + "U+7054-705d,U+705f-706a,U+706e,U+7071-7074,U+7077,U+7079-707b,U+707d,U+7081-7084,U+7086-7088,U+708b-708d,U+708f-7091,U+7093,U+7097-7098,U+709a-709b,U+709e-70aa,U+70b0,U+70b2,U+70b4-70b6,U+70ba,U+70be-70bf,U+70c4-70c7,U+70c9,U+70cb-70d7,U+70da,U+70dc-70de,U+70e0-70e3,U+70e5,U+70ea,U+70ee,U+70f0-70f6,U+70f8,U+70fa-70fc,U+70fe-7108,U+710b-710f,U+7111-7112,U+7114,U+7117,U+711b-7125,U+7127-712e,U+7132-7135,U+7137-7144,U+7146-7149,U+714b,U+714d,U+714f-715b,U+715d,U+715f-7163,U+7165,U+7169-716d,U+716f-7171,U+7174-7177", + }, + }, + { + uri: _81, + descriptors: { + unicodeRange: + "U+722e-722f,U+7232-7234,U+723a,U+723c,U+723e,U+7240-7246,U+7249-724b,U+724e-7251,U+7253-7255,U+7257-7258,U+725a,U+725c,U+725e,U+7260,U+7263-7265,U+7268,U+726a-726d,U+7270-7271,U+7273-7274,U+7276-7278,U+727b-727d,U+7282-7283,U+7285-7289,U+728c,U+728e,U+7290-7291,U+7293-729e,U+72a0-72ab,U+72ae,U+72b1-72b3,U+72b5,U+72ba-72c0,U+72c5-72c7,U+72c9-72cc,U+72cf,U+72d1,U+72d3-72d6,U+72d8,U+72da-72dd,U+72df,U+72e2-72e7,U+72ea-72eb,U+72f5-72f6,U+72f9,U+72fd-7300,U+7302,U+7304-7309,U+730b-730d,U+730f-7312,U+7314,U+7318-731a,U+731f-7320,U+7323-7324,U+7326-7328,U+732d,U+732f-7330,U+7332-7333,U+7335-7336,U+733a-733d,U+7340-734c,U+734e-734f,U+7351,U+7353-7356,U+7358-735f,U+7361-736b,U+736e,U+7370-7371", + }, + }, + { + uri: _82, + descriptors: { + unicodeRange: + "U+6ec5-6ec6,U+6ec8-6eca,U+6ecc-6ece,U+6ed0,U+6ed2,U+6ed6,U+6ed8-6ed9,U+6edb-6edd,U+6ee3,U+6ee7,U+6eea-6ef3,U+6ef5-6ef8,U+6efa-6f01,U+6f03-6f05,U+6f07-6f08,U+6f0a-6f0e,U+6f10-6f12,U+6f16-6f1f,U+6f21-6f23,U+6f25-6f28,U+6f2c,U+6f2e,U+6f30,U+6f32,U+6f34-6f35,U+6f37-6f3d,U+6f3f-6f45,U+6f48-6f4a,U+6f4c,U+6f4e-6f57,U+6f59-6f5b,U+6f5d,U+6f5f-6f61,U+6f63-6f65,U+6f67-6f6c,U+6f6f-6f71,U+6f73,U+6f75-6f77,U+6f79,U+6f7b,U+6f7d-6f83,U+6f85-6f87,U+6f8a-6f8b,U+6f8f-6f9b,U+6f9d-6fa0,U+6fa2-6fa6,U+6fa8-6fb1", + }, + }, + { + uri: _83, + descriptors: { + unicodeRange: + "U+6d73,U+6d75-6d76,U+6d79-6d7b,U+6d7d-6d81,U+6d83-6d84,U+6d86-6d87,U+6d8a-6d8b,U+6d8d,U+6d8f-6d90,U+6d92,U+6d96-6d9a,U+6d9c,U+6da2,U+6da5,U+6dac-6dad,U+6db0-6db1,U+6db3-6db4,U+6db6-6db7,U+6db9-6dbe,U+6dc1-6dc3,U+6dc8-6dca,U+6dcd-6dd0,U+6dd2-6dd5,U+6dd7,U+6dda-6ddc,U+6ddf,U+6de2-6de3,U+6de5,U+6de7-6dea,U+6ded,U+6def-6df0,U+6df2,U+6df4-6df6,U+6df8,U+6dfa,U+6dfd-6e04,U+6e06-6e09,U+6e0b,U+6e0f,U+6e12-6e13,U+6e15,U+6e18-6e19,U+6e1b-6e1c,U+6e1e-6e1f,U+6e22,U+6e26-6e28,U+6e2a,U+6e2c,U+6e2e,U+6e30-6e31,U+6e33,U+6e35-6e37,U+6e39,U+6e3b-6e42,U+6e45-6e4c,U+6e4f-6e52,U+6e55,U+6e57,U+6e59-6e5a,U+6e5c-6e5e,U+6e60-6e6a,U+6e6c-6e6d,U+6e6f-6e7d,U+6e80-6e82,U+6e84,U+6e87-6e88,U+6e8a-6e8e,U+6e91-6e97,U+6e99-6e9b,U+6e9d-6e9e,U+6ea0-6ea1,U+6ea3-6ea4,U+6ea6,U+6ea8-6ea9,U+6eab-6eae,U+6eb0,U+6eb3,U+6eb5,U+6eb8-6eb9,U+6ebc,U+6ebe-6ec0,U+6ec3-6ec4", + }, + }, + { + uri: _84, + descriptors: { + unicodeRange: + "U+6bbb-6bbe,U+6bc0,U+6bc3-6bc4,U+6bc6-6bca,U+6bcc,U+6bce,U+6bd0-6bd1,U+6bd8,U+6bda,U+6bdc-6be0,U+6be2-6be9,U+6bec-6bee,U+6bf0-6bf2,U+6bf4,U+6bf6-6bf8,U+6bfa-6bfc,U+6bfe-6c04,U+6c08-6c0c,U+6c0e,U+6c12,U+6c17,U+6c1c-6c1e,U+6c20,U+6c23,U+6c25,U+6c2b-6c2d,U+6c31,U+6c33,U+6c36-6c37,U+6c39-6c3c,U+6c3e-6c3f,U+6c43-6c45,U+6c48,U+6c4b-6c4f,U+6c51-6c53,U+6c56,U+6c58-6c5a,U+6c62-6c63,U+6c65-6c67,U+6c6b-6c6f,U+6c71,U+6c73,U+6c75,U+6c77-6c78,U+6c7a-6c7c,U+6c7f-6c80,U+6c84,U+6c87,U+6c8a-6c8b,U+6c8d-6c8e,U+6c91-6c92,U+6c95-6c98,U+6c9a,U+6c9c-6c9e,U+6ca0,U+6ca2,U+6ca8,U+6cac,U+6caf-6cb0,U+6cb4-6cb7,U+6cba,U+6cc0-6cc3,U+6cc6-6cc8,U+6ccb,U+6ccd-6ccf,U+6cd1-6cd2,U+6cd8-6cda,U+6cdc-6cdd,U+6cdf,U+6ce4,U+6ce6-6ce7,U+6ce9,U+6cec-6ced,U+6cf2,U+6cf4,U+6cf9,U+6cff-6d00,U+6d02-6d03,U+6d05-6d06,U+6d08-6d0a,U+6d0d,U+6d0f-6d11,U+6d13-6d16,U+6d18,U+6d1c-6d1d,U+6d1f-6d24,U+6d26,U+6d28-6d29,U+6d2c-6d2d,U+6d2f-6d30,U+6d34,U+6d36-6d38,U+6d3a,U+6d3f-6d40,U+6d42,U+6d44,U+6d49,U+6d4c,U+6d50,U+6d55-6d58,U+6d5b,U+6d5d,U+6d5f,U+6d61-6d62,U+6d64-6d65,U+6d67-6d68,U+6d6b-6d6d,U+6d70-6d72", + }, + }, + { + uri: _85, + descriptors: { + unicodeRange: + "U+6967-696a,U+696c-696d,U+696f-6970,U+6972-6976,U+697a-697b,U+697d-697f,U+6981,U+6983,U+6985,U+698a-698c,U+698e-6993,U+6996-6997,U+6999-699a,U+699d-69a6,U+69a9-69aa,U+69ac,U+69ae-69b0,U+69b2-69b3,U+69b5-69b6,U+69b8-69ba,U+69bc-69c0,U+69c2-69c9,U+69cb,U+69cd,U+69cf,U+69d1-69d3,U+69d5-69da,U+69dc-69de,U+69e1-69ec,U+69ee-69f1,U+69f3-69fc,U+69fe,U+6a00-6a09,U+6a0b-6a16,U+6a19-6a1e,U+6a20,U+6a22-6a27,U+6a29,U+6a2b-6a2e,U+6a30,U+6a32-6a34,U+6a36-6a3c,U+6a3f-6a43,U+6a45-6a46,U+6a48-6a4a", + }, + }, + { + uri: _86, + descriptors: { + unicodeRange: + "U+6830-6831,U+6834-6836,U+683a-683b,U+683f,U+6847,U+684b,U+684d,U+684f,U+6852,U+6856-685f,U+686a,U+686c-6873,U+6875,U+6878-6880,U+6882,U+6884,U+6887-688e,U+6890-6892,U+6894-6896,U+6898-68a1,U+68a3-68a5,U+68a9-68ac,U+68ae,U+68b1-68b2,U+68b4,U+68b6-68bf,U+68c1,U+68c3-68c8,U+68ca,U+68cc,U+68ce-68d1,U+68d3-68d4,U+68d6-68d7,U+68d9,U+68db-68df,U+68e1-68e2,U+68e4-68ed,U+68ef,U+68f2-68f4,U+68f6-68f8,U+68fb,U+68fd-6900,U+6902-6904,U+6906-690a,U+690c,U+690f,U+6911,U+6913-691e,U+6921-6923,U+6925-692c,U+692e-692f,U+6931-6933,U+6935-6938,U+693a-693c,U+693e,U+6940-6941,U+6943-6953,U+6955-6956,U+6958-6959,U+695b-695c,U+695f,U+6961-6962,U+6964-6965", + }, + }, + { + uri: _87, + descriptors: { + unicodeRange: + "U+66b8,U+66ba-66bd,U+66bf-66d8,U+66da,U+66de-66e5,U+66e7-66e8,U+66ea-66ef,U+66f1,U+66f5-66f6,U+66f8,U+66fa-66fb,U+66fd,U+6701-6707,U+670c,U+670e-670f,U+6711-6713,U+6716,U+6718-671a,U+671c,U+671e,U+6720-6725,U+6727,U+6729,U+672e,U+6730,U+6732-6733,U+6736-6739,U+673b-673c,U+673e-673f,U+6741,U+6744-6745,U+6747,U+674a-674b,U+674d,U+6752,U+6754-6755,U+6757-675b,U+675d,U+6762-6764,U+6766-6767,U+676b-676c,U+676e,U+6771,U+6774,U+6776,U+6778-677b,U+677d,U+6780,U+6782-6783,U+6785-6786,U+6788,U+678a,U+678c-678f,U+6791-6794,U+6796,U+6799,U+679b,U+679f-67a1,U+67a4,U+67a6,U+67a9,U+67ac,U+67ae,U+67b1-67b2,U+67b4,U+67b9-67c0,U+67c2,U+67c5-67ce,U+67d5-67d7,U+67db,U+67df,U+67e1,U+67e3-67e4,U+67e6-67e8,U+67ea-67eb,U+67ed-67ee,U+67f2,U+67f5-67fc,U+67fe,U+6801-6804,U+6806,U+680d,U+6810,U+6812,U+6814-6815,U+6818-681c,U+681e-6820,U+6822-6828,U+682b-682f", + }, + }, + { + uri: _88, + descriptors: { + unicodeRange: + "U+6569-656a,U+656d-656f,U+6571,U+6573,U+6575-6576,U+6578-6586,U+6588-658a,U+658d-658f,U+6592,U+6594-6596,U+6598,U+659a,U+659d-659e,U+65a0,U+65a2-65a3,U+65a6,U+65a8,U+65aa,U+65ac,U+65ae,U+65b1-65b8,U+65ba-65bb,U+65be-65c0,U+65c2,U+65c7-65ca,U+65cd,U+65d0-65d1,U+65d3-65d5,U+65d8-65df,U+65e1,U+65e3-65e4,U+65ea-65eb,U+65f2-65f5,U+65f8-65f9,U+65fb-65ff,U+6601,U+6604-6605,U+6607-6609,U+660b,U+660d,U+6610-6612,U+6616-6618,U+661a-661c,U+661e,U+6621-6624,U+6626,U+6629-662c,U+662e,U+6630,U+6632-6633,U+6637-663b,U+663d,U+663f-6640,U+6642,U+6644-664a,U+664d-664e,U+6650-6651,U+6658-6659,U+665b-665e,U+6660,U+6662-6663,U+6665,U+6667,U+6669-666d,U+6671-6673,U+6675,U+6678-6679,U+667b-667d,U+667f-6681,U+6683,U+6685-6686,U+6688-668b,U+668d-6690,U+6692-6695,U+6698-669c,U+669e-66a6,U+66a9-66ad,U+66af-66b3,U+66b5-66b7", + }, + }, + { + uri: _89, + descriptors: { + unicodeRange: + "U+5f30,U+5f32-5f38,U+5f3b,U+5f3d-5f3f,U+5f41-5f4f,U+5f51,U+5f54,U+5f59-5f5c,U+5f5e-5f60,U+5f63,U+5f65,U+5f67-5f68,U+5f6b,U+5f6e-5f6f,U+5f72,U+5f74-5f76,U+5f78,U+5f7a,U+5f7d-5f7f,U+5f83,U+5f86,U+5f8d-5f8f,U+5f91,U+5f93-5f94,U+5f96,U+5f9a-5f9b,U+5f9d-5fa0,U+5fa2-5fa7,U+5fa9,U+5fab-5fac,U+5faf-5fb4,U+5fb6,U+5fb8-5fbb,U+5fbe-5fc2,U+5fc7-5fc8,U+5fca-5fcb,U+5fce,U+5fd3-5fd5,U+5fda-5fdc,U+5fde-5fdf,U+5fe2-5fe3,U+5fe5-5fe6,U+5fe8-5fe9,U+5fec,U+5fef-5ff0,U+5ff2-5ff4,U+5ff6-5ff7,U+5ff9-5ffa,U+5ffc,U+6007-6009,U+600b-600c,U+6010-6011,U+6013,U+6017-6018,U+601a,U+601e-601f,U+6022-6024,U+602c-602e,U+6030-6034,U+6036-603a,U+603d-603e,U+6040,U+6044-604a,U+604c,U+604e-604f,U+6051,U+6053-6054,U+6056-6058,U+605b-605c,U+605e-6061,U+6065-6066,U+606e,U+6071-6072,U+6074-6075,U+6077,U+607e,U+6080-6082,U+6085-6088,U+608a-608b,U+608e-6091,U+6093,U+6095,U+6097-6099,U+609c,U+609e,U+60a1-60a2,U+60a4-60a5,U+60a7,U+60a9-60aa,U+60ae,U+60b0,U+60b3,U+60b5-60b7,U+60b9-60ba,U+60bd-60c4,U+60c7-60c9,U+60cc", + }, + }, + { + uri: _90, + descriptors: { + unicodeRange: + "U+635a-635d,U+6360,U+6364-6366,U+6368,U+636a-636c,U+636f-6370,U+6372-6375,U+6378-6379,U+637c-637f,U+6381,U+6383-6386,U+638b,U+638d,U+6391,U+6393-6395,U+6397,U+6399-639f,U+63a1,U+63a4,U+63a6,U+63ab,U+63af,U+63b1-63b2,U+63b5-63b6,U+63b9,U+63bb,U+63bd,U+63bf-63c3,U+63c5,U+63c7-63c8,U+63ca-63cc,U+63d1,U+63d3-63d5,U+63d7-63dd,U+63df,U+63e2,U+63e4-63e8,U+63eb-63ec,U+63ee-63f1,U+63f3,U+63f5,U+63f7,U+63f9-63fc,U+63fe,U+6403-6404,U+6406-640a,U+640d-640e,U+6411-6412,U+6415-641a,U+641d,U+641f,U+6422-6425,U+6427-6429,U+642b,U+642e-6433,U+6435-6439,U+643b-643c,U+643e,U+6440,U+6442-6443,U+6449,U+644b-6451,U+6453,U+6455-6457,U+6459-645d,U+645f-6466,U+6468,U+646a-646c,U+646e-6477,U+647b-6481,U+6483,U+6486,U+6488-648f", + }, + }, + { + uri: _91, + descriptors: { + unicodeRange: + "U+61c5-61c7,U+61c9,U+61cc-61d0,U+61d3,U+61d5-61e5,U+61e7-61f4,U+61f6-61fe,U+6200-6205,U+6207,U+6209,U+6213-6214,U+6219,U+621c-621e,U+6220,U+6223,U+6226-6229,U+622b,U+622d,U+622f-6232,U+6235-6236,U+6238-623c,U+6242,U+6244-6246,U+624a,U+624f-6250,U+6255-6257,U+6259-625a,U+625c-6262,U+6264-6265,U+6268,U+6271-6272,U+6274-6275,U+6277-6278,U+627a-627b,U+627d,U+6281-6283,U+6285-6288,U+628b-6290,U+6294,U+6299,U+629c-629e,U+62a3,U+62a6-62a7,U+62a9-62aa,U+62ad-62b0,U+62b2-62b4,U+62b6-62b8,U+62ba,U+62be,U+62c0-62c1,U+62c3,U+62cb,U+62cf,U+62d1,U+62d5,U+62dd-62de,U+62e0-62e1,U+62e4,U+62ea-62eb,U+62f0,U+62f2,U+62f5,U+62f8-62fb,U+6300,U+6303-6306,U+630a-630d,U+630f-6310,U+6312-6315,U+6317-6319,U+631c,U+6326-6327,U+6329,U+632c-632e,U+6330-6331,U+6333-6338,U+633b-633c,U+633e-6341,U+6344,U+6347-6348,U+634a,U+6351-6354,U+6356-6359", + }, + }, + { + uri: _92, + descriptors: { + unicodeRange: + "U+5dd0-5dda,U+5ddc,U+5ddf-5de0,U+5de3-5de4,U+5dea,U+5dec-5ded,U+5df0,U+5df5-5df6,U+5df8-5dfc,U+5dff-5e00,U+5e04,U+5e07,U+5e09-5e0b,U+5e0d-5e0e,U+5e12-5e13,U+5e17,U+5e1e-5e25,U+5e28-5e2c,U+5e2f-5e30,U+5e32-5e36,U+5e39-5e3a,U+5e3e-5e41,U+5e43,U+5e46-5e4b,U+5e4d-5e53,U+5e56-5e5a,U+5e5c-5e5d,U+5e5f-5e60,U+5e63-5e71,U+5e75,U+5e77,U+5e79,U+5e7e,U+5e81-5e83,U+5e85,U+5e88-5e89,U+5e8c-5e8e,U+5e92,U+5e98,U+5e9b,U+5e9d,U+5ea1-5ea4,U+5ea8-5eac,U+5eae-5eb2,U+5eb4,U+5eba-5ebd,U+5ebf-5ec8,U+5ecb-5ed0,U+5ed4-5ed5,U+5ed7-5eda,U+5edc-5ee7,U+5ee9,U+5eeb-5ef3,U+5ef5,U+5ef8-5ef9,U+5efb-5efd,U+5f05-5f07,U+5f09,U+5f0c-5f0e,U+5f10,U+5f12,U+5f14,U+5f16,U+5f19-5f1a,U+5f1c-5f1e,U+5f21-5f24,U+5f28,U+5f2b-5f2c,U+5f2e", + }, + }, + { + uri: _93, + descriptors: { + unicodeRange: + "U+60cd-60d0,U+60d2-60d4,U+60d6-60d7,U+60d9,U+60db,U+60de,U+60e1-60e5,U+60ea,U+60f1-60f2,U+60f5,U+60f7-60f8,U+60fb-60ff,U+6102-6105,U+6107,U+610a-610c,U+6110-6114,U+6116-6119,U+611b-611e,U+6121-6122,U+6125,U+6128-612a,U+612c-613e,U+6140-6147,U+6149,U+614b,U+614d,U+614f-6150,U+6152-6154,U+6156-615c,U+615e-6161,U+6163-6166,U+6169-616f,U+6171-6174,U+6176,U+6178-618a,U+618c-618d,U+618f-6193,U+6195-619c,U+619e-61a6,U+61aa-61ab,U+61ad-61b6,U+61b8-61bd,U+61bf-61c1,U+61c3-61c4", + }, + }, + { + uri: _94, + descriptors: { + unicodeRange: + "U+5cf4-5cfa,U+5cfc-5d01,U+5d04-5d05,U+5d08-5d0d,U+5d0f-5d13,U+5d15,U+5d17-5d1a,U+5d1c-5d1d,U+5d1f-5d23,U+5d25,U+5d28,U+5d2a-5d2c,U+5d2f-5d33,U+5d35-5d3c,U+5d3f-5d46,U+5d48-5d49,U+5d4d-5d57,U+5d59-5d5a,U+5d5c,U+5d5e-5d68,U+5d6a,U+5d6d-5d6e,U+5d70-5d73,U+5d75-5d81,U+5d83-5d98,U+5d9a-5d9c,U+5d9e-5db6,U+5db8-5dc4,U+5dc6-5dcc,U+5dce-5dcf", + }, + }, + { + uri: _95, + descriptors: { + unicodeRange: + "U+5b52,U+5b56,U+5b5e,U+5b60-5b61,U+5b67-5b68,U+5b6b,U+5b6d-5b6f,U+5b72,U+5b74,U+5b76-5b79,U+5b7b-5b7c,U+5b7e-5b7f,U+5b82,U+5b86,U+5b8a,U+5b8d-5b8e,U+5b90-5b92,U+5b94,U+5b96,U+5b9f,U+5ba7-5ba9,U+5bac-5baf,U+5bb1-5bb2,U+5bb7,U+5bba-5bbc,U+5bc0-5bc1,U+5bc3,U+5bc8-5bcb,U+5bcd-5bcf,U+5bd1,U+5bd4-5bdc,U+5be0,U+5be2-5be3,U+5be6-5be7,U+5be9-5bed,U+5bef,U+5bf1-5bf7,U+5bfd-5bfe,U+5c00,U+5c02-5c03,U+5c05,U+5c07-5c08,U+5c0b-5c0e,U+5c10,U+5c12-5c13,U+5c17,U+5c19,U+5c1b,U+5c1e-5c21,U+5c23,U+5c26,U+5c28-5c2b,U+5c2d-5c30,U+5c32-5c33,U+5c35-5c37,U+5c43-5c44,U+5c46-5c47,U+5c4c-5c4d,U+5c52-5c54,U+5c56-5c58,U+5c5a-5c5d,U+5c5f,U+5c62,U+5c64,U+5c67-5c6d,U+5c70,U+5c72-5c78,U+5c7b-5c7e,U+5c80,U+5c83-5c87,U+5c89-5c8b,U+5c8e-5c8f,U+5c92-5c93,U+5c95,U+5c9d-5ca1,U+5ca4-5ca8,U+5caa,U+5cae-5cb0,U+5cb2,U+5cb4,U+5cb6,U+5cb9-5cbc,U+5cbe,U+5cc0,U+5cc2-5cc3,U+5cc5-5cca,U+5ccc-5cd1,U+5cd3-5cd8,U+5cda-5ce0,U+5ce2-5ce3,U+5ce7,U+5ce9,U+5ceb-5cec,U+5cee-5cef,U+5cf1-5cf3", + }, + }, + { + uri: _96, + descriptors: { + unicodeRange: + "U+593b,U+593d-5940,U+5943,U+5945-5946,U+594a,U+594c-594d,U+5950,U+5952-5953,U+5959,U+595b-595f,U+5961,U+5963-5964,U+5966-5972,U+5975,U+5977,U+597a-597c,U+597e-5980,U+5985,U+5989,U+598b-598c,U+598e-5991,U+5994-5995,U+5998,U+599a-599d,U+599f-59a2,U+59a6-59a7,U+59ac-59ad,U+59b0-59b1,U+59b3-59b8,U+59ba,U+59bc-59bd,U+59bf-59c5,U+59c7-59c9,U+59cc-59cf,U+59d5-59d6,U+59d9,U+59db,U+59de-59e2,U+59e4,U+59e6-59e7,U+59e9-59eb,U+59ed-59f8,U+59fa,U+59fc-59fe,U+5a00,U+5a02,U+5a0a-5a0b,U+5a0d-5a10,U+5a12,U+5a14-5a17,U+5a19-5a1b,U+5a1d-5a1e,U+5a21-5a22,U+5a24,U+5a26-5a28,U+5a2a-5a30,U+5a33,U+5a35,U+5a37-5a3b,U+5a3d-5a3f,U+5a41-5a45,U+5a47-5a48,U+5a4b-5a54,U+5a56-5a59,U+5a5b-5a61,U+5a63-5a66,U+5a68-5a69,U+5a6b-5a73,U+5a78-5a79,U+5a7b-5a7e,U+5a80-5a90", + }, + }, + { + uri: _97, + descriptors: { + unicodeRange: + "U+5a91,U+5a93-5a99,U+5a9c-5aa9,U+5aab-5ab1,U+5ab4,U+5ab6-5ab7,U+5ab9-5abd,U+5abf-5ac0,U+5ac3-5ac8,U+5aca-5acb,U+5acd-5ad1,U+5ad3,U+5ad5,U+5ad7,U+5ad9-5adb,U+5add-5adf,U+5ae2,U+5ae4-5ae5,U+5ae7-5ae8,U+5aea,U+5aec-5af0,U+5af2-5b08,U+5b0a-5b15,U+5b18-5b31,U+5b33,U+5b35-5b36,U+5b38-5b3f,U+5b41-5b4f", + }, + }, + { + uri: _98, + descriptors: { + unicodeRange: + "U+5843,U+5845-584b,U+584e-5850,U+5852-5853,U+5855-5857,U+5859-585d,U+585f-5864,U+5866-586a,U+586d-587d,U+587f,U+5882,U+5884,U+5886-5888,U+588a-5891,U+5894-5898,U+589b-589d,U+58a0-58a7,U+58aa-58bb,U+58bd-58c0,U+58c2-58c4,U+58c6-58d0,U+58d2-58d4,U+58d6-58e3,U+58e5-58ea,U+58ed,U+58ef,U+58f1-58f2,U+58f4-58f5,U+58f7-58f8,U+58fa-5901,U+5903,U+5905-5906,U+5908-590c,U+590e,U+5910-5913,U+5917-5918,U+591b,U+591d-591e,U+5920-5923,U+5926,U+5928,U+592c,U+5930,U+5932-5933,U+5935-5936", + }, + }, + { + uri: _99, + descriptors: { + unicodeRange: + "U+56d0-56d3,U+56d5-56d6,U+56d8-56d9,U+56dc,U+56e3,U+56e5-56ea,U+56ec,U+56ee-56ef,U+56f2-56f3,U+56f6-56f8,U+56fb-56fc,U+5700-5702,U+5705,U+5707,U+570b-571b,U+571d-571e,U+5720-5722,U+5724-5727,U+572b,U+5731-5732,U+5734-5738,U+573c-573d,U+573f,U+5741,U+5743-5746,U+5748-5749,U+574b,U+5752-5756,U+5758-5759,U+5762-5763,U+5765,U+5767,U+576c,U+576e,U+5770-5772,U+5774-5775,U+5778-577a,U+577d-5781,U+5787-578a,U+578d-5791,U+5794-579a,U+579c-579f,U+57a5,U+57a8,U+57aa,U+57ac,U+57af-57b1,U+57b3,U+57b5-57b7,U+57b9-57c1,U+57c4-57ca,U+57cc-57cd,U+57d0-57d1,U+57d3,U+57d6-57d7,U+57db-57dc,U+57de,U+57e1-57e3,U+57e5-57ec,U+57ee,U+57f0-57f3,U+57f5-57f7,U+57fb-57fc,U+57fe-57ff,U+5801,U+5803-5805,U+5808-580a,U+580c,U+580e-5810,U+5812-5814,U+5816-5818,U+581a-581d,U+581f,U+5822-5823,U+5825-5829,U+582b-582f,U+5831-5834,U+5836-5842", + }, + }, + { + uri: _100, + descriptors: { + unicodeRange: + "U+55f9-55fc,U+55ff,U+5602-5607,U+560a-560b,U+560d,U+5610-5617,U+5619-561a,U+561c-561d,U+5620-5622,U+5625-5626,U+5628-562b,U+562e-5630,U+5633,U+5635,U+5637-5638,U+563a,U+563c-563e,U+5640-564b,U+564f-5653,U+5655-5656,U+565a-565b,U+565d-5661,U+5663,U+5665-5667,U+566d-5670,U+5672-5675,U+5677-567a,U+567d-5684,U+5687-568d,U+5690-5692,U+5694-56a2,U+56a4-56ae,U+56b0-56b6,U+56b8-56bb,U+56bd-56c9,U+56cb-56cf", + }, + }, + { + uri: _101, + descriptors: { + unicodeRange: + "U+5286-5287,U+5289-528f,U+5291-5292,U+5294-529a,U+529c,U+52a4-52a7,U+52ae-52b0,U+52b4-52bd,U+52c0-52c2,U+52c4-52c6,U+52c8,U+52ca,U+52cc-52cf,U+52d1,U+52d3-52d5,U+52d7,U+52d9-52de,U+52e0-52e3,U+52e5-52ef,U+52f1-52f8,U+52fb-52fd,U+5301-5304,U+5307,U+5309-530c,U+530e,U+5311-5314,U+5318,U+531b-531c,U+531e-531f,U+5322,U+5324-5325,U+5327-5329,U+532b-532d,U+532f-5338,U+533c-533d,U+5340,U+5342,U+5344,U+5346,U+534b-534d,U+5350,U+5354,U+5358-5359,U+535b,U+535d,U+5365,U+5368,U+536a,U+536c-536d,U+5372,U+5376,U+5379,U+537b-537e,U+5380-5381,U+5383,U+5387-5388,U+538a,U+538e-5394,U+5396-5397,U+5399,U+539b-539c,U+539e,U+53a0-53a1,U+53a4,U+53a7,U+53aa-53ad,U+53af-53b5,U+53b7-53ba,U+53bc-53be,U+53c0,U+53c3-53c7,U+53ce-53d0,U+53d2-53d3,U+53d5,U+53da,U+53dc-53de,U+53e1-53e2,U+53e7,U+53f4,U+53fa,U+53fe-5400,U+5402,U+5405,U+5407,U+540b,U+5414,U+5418-541a,U+541c,U+5422,U+5424-5425,U+542a,U+5430,U+5433,U+5436-5437,U+543a", + }, + }, + { + uri: _102, + descriptors: { + unicodeRange: + "U+5101-5105,U+5108-510a,U+510c-5111,U+5113-5120,U+5122-513e,U+5142,U+5147,U+514a,U+514c,U+514e-5150,U+5152-5153,U+5157-5159,U+515b,U+515d-5161,U+5163-5164,U+5166-5167,U+5169-516a,U+516f,U+5172,U+517a,U+517e-517f,U+5183-5184,U+5186-5187,U+518a-518b,U+518e-5191,U+5193-5194,U+5198,U+519a,U+519d-519f,U+51a1,U+51a3,U+51a6-51aa,U+51ad-51ae,U+51b4,U+51b8-51ba,U+51be-51bf,U+51c1-51c3,U+51c5,U+51c8,U+51ca,U+51cd-51ce,U+51d0,U+51d2-51da,U+51dc,U+51de-51df,U+51e2-51e3,U+51e5-51ea,U+51ec,U+51ee,U+51f1-51f2,U+51f4,U+51f7,U+51fe,U+5204-5205,U+5209,U+520b-520c,U+520f-5210,U+5213-5215,U+521c,U+521e-521f,U+5221-5223,U+5225-5227,U+522a,U+522c,U+522f,U+5231-5232,U+5234-5235,U+523c,U+523e,U+5244-5249,U+524b,U+524e-524f,U+5252-5253,U+5255,U+5257-525b,U+525d,U+525f-5260,U+5262-5264,U+5266,U+5268,U+526b-526e,U+5270-5271,U+5273-527c,U+527e,U+5280,U+5283-5285", + }, + }, + { + uri: _103, + descriptors: { + unicodeRange: + "U+543d,U+543f,U+5441-5442,U+5444-5445,U+5447,U+5449,U+544c-544f,U+5451,U+545a,U+545d-5461,U+5463,U+5465,U+5467,U+5469-5470,U+5474,U+5479-547a,U+547e-547f,U+5481,U+5483,U+5485,U+5487-548a,U+548d,U+5491,U+5493,U+5497-5498,U+549c,U+549e-54a2,U+54a5,U+54ae,U+54b0,U+54b2,U+54b5-54b7,U+54b9-54ba,U+54bc,U+54be,U+54c3,U+54c5,U+54ca-54cb,U+54d6,U+54d8,U+54db,U+54e0-54e4,U+54eb-54ec,U+54ef-54f1,U+54f4-54f9,U+54fb,U+54fe,U+5500,U+5502-5505,U+5508,U+550a-550e,U+5512-5513,U+5515-551a,U+551c-551f,U+5521,U+5525-5526,U+5528-5529,U+552b,U+552d,U+5532,U+5534-5536,U+5538-553b,U+553d,U+5540,U+5542,U+5545,U+5547-5548,U+554b-554f,U+5551-5554,U+5557-555b,U+555d-5560,U+5562-5563,U+5568-5569,U+556b,U+556f-5574,U+5579-557a,U+557d,U+557f,U+5585-5586,U+558c-558e,U+5590,U+5592-5593,U+5595-5597,U+559a-559b,U+559e,U+55a0-55a6,U+55a8-55b0,U+55b2,U+55b4,U+55b6,U+55b8,U+55ba,U+55bc,U+55bf-55c3,U+55c6-55c8,U+55ca-55cb,U+55ce-55d0,U+55d5,U+55d7-55db,U+55de,U+55e0,U+55e2,U+55e7,U+55e9,U+55ed-55ee,U+55f0-55f1,U+55f4,U+55f6,U+55f8", + }, + }, + { + uri: _104, + descriptors: { + unicodeRange: + "U+4fe0,U+4fe2,U+4fe4-4fe5,U+4fe7,U+4feb-4fec,U+4ff0,U+4ff2,U+4ff4-4ff7,U+4ff9,U+4ffb-4ffd,U+4fff-500b,U+500e,U+5010-5011,U+5013,U+5015-5017,U+501b,U+501d-501e,U+5020,U+5022-5024,U+5027,U+502b,U+502f-5039,U+503b,U+503d,U+503f-5042,U+5044-5046,U+5049-504b,U+504d,U+5050-5054,U+5056-5059,U+505b,U+505d-5064,U+5066-506b,U+506d-5075,U+5078-507a,U+507c-507d,U+5081-5084,U+5086-5087,U+5089-508c,U+508e-50a2,U+50a4,U+50a6,U+50aa-50ab,U+50ad-50b1,U+50b3-50b9,U+50bc-50ce,U+50d0-50d5,U+50d7-50d9,U+50db-50e5,U+50e8-50eb,U+50ef-50f2,U+50f4,U+50f6-50fa,U+50fc-5100", + }, + }, + { uri: _105, descriptors: { unicodeRange: "U+49d5-4a77" } }, + { + uri: _106, + descriptors: { + unicodeRange: + "U+4dac-4dad,U+4daf-4db5,U+4e02,U+4e04-4e06,U+4e0f,U+4e12,U+4e17,U+4e1f-4e21,U+4e23,U+4e26,U+4e29,U+4e2e-4e2f,U+4e31,U+4e33,U+4e35,U+4e37,U+4e3c,U+4e40-4e42,U+4e44,U+4e46,U+4e4a,U+4e51,U+4e55,U+4e57,U+4e5a-4e5b,U+4e62-4e65,U+4e67-4e68,U+4e6a-4e6f,U+4e72,U+4e74-4e7d,U+4e7f-4e85,U+4e87,U+4e8a,U+4e90,U+4e96-4e97,U+4e99,U+4e9c-4e9e,U+4ea3,U+4eaa,U+4eaf-4eb1,U+4eb4,U+4eb6-4eb9,U+4ebc-4ebe,U+4ec8,U+4ecc,U+4ecf-4ed0,U+4ed2,U+4eda-4edc,U+4ee0,U+4ee2,U+4ee6-4ee7,U+4ee9,U+4eed-4eef,U+4ef1,U+4ef4,U+4ef8-4efa,U+4efc,U+4efe,U+4f00,U+4f02-4f08,U+4f0b-4f0c,U+4f12-4f16,U+4f1c-4f1d,U+4f21,U+4f23,U+4f28-4f29,U+4f2c-4f2e,U+4f31,U+4f33,U+4f35,U+4f37,U+4f39,U+4f3b,U+4f3e-4f42,U+4f44-4f45,U+4f47-4f4c,U+4f52,U+4f54,U+4f56,U+4f61-4f62,U+4f66,U+4f68,U+4f6a-4f6b,U+4f6d-4f6e,U+4f71-4f72,U+4f75,U+4f77-4f7a,U+4f7d,U+4f80-4f82,U+4f85-4f87,U+4f8a,U+4f8c,U+4f8e,U+4f90,U+4f92-4f93,U+4f95-4f96,U+4f98-4f9a,U+4f9c,U+4f9e-4f9f,U+4fa1-4fa2,U+4fa4,U+4fab,U+4fad,U+4fb0-4fb4,U+4fb6-4fbe,U+4fc0-4fc2,U+4fc6-4fc9,U+4fcb-4fcd,U+4fd2-4fd6,U+4fd9,U+4fdb", + }, + }, + { uri: _107, descriptors: { unicodeRange: "U+4933-49d4" } }, + { uri: _108, descriptors: { unicodeRange: "U+487a-4932" } }, + { + uri: _109, + descriptors: { unicodeRange: "U+47d2-4879,U+2ce7c,U+2ce88,U+2ce93" }, + }, + { + uri: _110, + descriptors: { + unicodeRange: + "U+4756-47d1,U+2ca02,U+2ca0e,U+2ca7d,U+2caa9,U+2cb29,U+2cb2e,U+2cb31,U+2cb38-2cb39,U+2cb3f,U+2cb41,U+2cb4e,U+2cb5a,U+2cb64,U+2cb69,U+2cb6c,U+2cb6f,U+2cb76,U+2cb78,U+2cb7c,U+2cbb1,U+2cbbf-2cbc0,U+2cbce,U+2cc5f,U+2ccf5-2ccf6,U+2ccfd,U+2ccff,U+2cd02-2cd03,U+2cd0a,U+2cd8b,U+2cd8d,U+2cd8f-2cd90,U+2cd9f-2cda0,U+2cda8,U+2cdad-2cdae,U+2cdd5,U+2ce18,U+2ce1a,U+2ce23,U+2ce26,U+2ce2a", + }, + }, + { + uri: _111, + descriptors: { + unicodeRange: + "U+46c3-4755,U+2c488,U+2c494,U+2c497,U+2c542,U+2c613,U+2c618,U+2c621,U+2c629,U+2c62b-2c62d,U+2c62f,U+2c642,U+2c64a-2c64b,U+2c72c,U+2c72f,U+2c79f,U+2c7c1,U+2c7fd,U+2c8d9,U+2c8de,U+2c8e1,U+2c8f3,U+2c907,U+2c90a,U+2c91d", + }, + }, + { + uri: _112, + descriptors: { + unicodeRange: + "U+4629-46c2,U+2bdf7,U+2be29,U+2c029-2c02a,U+2c0a9,U+2c0ca,U+2c1d5,U+2c1d9,U+2c1f9,U+2c27c,U+2c288,U+2c2a4,U+2c317,U+2c35b,U+2c361,U+2c364", + }, + }, + { + uri: _113, + descriptors: { + unicodeRange: + "U+458e-4628,U+2b7a9,U+2b7c5,U+2b7e6,U+2b7f9,U+2b806,U+2b80a,U+2b81c,U+2b8b8,U+2bac7,U+2bb5f,U+2bb62,U+2bb7c,U+2bb83,U+2bc1b,U+2bd77,U+2bd87", + }, + }, + { + uri: _114, + descriptors: { + unicodeRange: "U+4449-4511,U+2afa2,U+2b127-2b128,U+2b137-2b138,U+2b1ed", + }, + }, + { + uri: _115, + descriptors: { + unicodeRange: + "U+439b-4448,U+2a437,U+2a5f1,U+2a602,U+2a61a,U+2a6b2,U+2a7dd,U+2a8fb,U+2a917,U+2aa30,U+2aa36,U+2aa58", + }, + }, + { + uri: _116, + descriptors: { + unicodeRange: + "U+4275-430d,U+298c6,U+29a72,U+29d98,U+29ddb,U+29e15,U+29e3d,U+29e49", + }, + }, + { + uri: _117, + descriptors: { + unicodeRange: + "U+4132-41de,U+28bef,U+28c47,U+28c4f,U+28c51,U+28c54,U+28d10,U+28d71,U+28dfb,U+28e1f,U+28e36,U+28e89,U+28e99,U+28eeb,U+28f32,U+28ff8,U+292a0", + }, + }, + { + uri: _118, + descriptors: { + unicodeRange: + "U+41df-4274,U+292b1,U+29490,U+295cf,U+2967f,U+296f0,U+29719,U+29750", + }, + }, + { + uri: _119, + descriptors: { + unicodeRange: + "U+408e-4131,U+285c8-285c9,U+28678,U+28695,U+286d7,U+286fa,U+287e0,U+28946,U+28949,U+2896b,U+28987-28988,U+289ba-289bb,U+28a1e,U+28a29,U+28a43,U+28a71,U+28a99,U+28acd,U+28add,U+28ae4,U+28b49,U+28bc1", + }, + }, + { + uri: _120, + descriptors: { + unicodeRange: + "U+3e83-3f2f,U+27139,U+273da-273db,U+273fe,U+27410,U+27449,U+27614-27615,U+27631,U+27684,U+27693,U+2770e,U+27723,U+27752", + }, + }, + { + uri: _121, + descriptors: { + unicodeRange: + "U+3f30-3fdb,U+27985,U+27a84,U+27bb3,U+27bbe,U+27bc7,U+27cb8,U+27da0,U+27e10", + }, + }, + { + uri: _122, + descriptors: { + unicodeRange: + "U+3fdc-408d,U+27fb7,U+27ff9,U+2808a,U+280bb,U+2815d,U+28277,U+28282,U+282e2,U+282f3,U+283cd,U+28408,U+2840c,U+28455,U+28468,U+2856b", + }, + }, + { + uri: _123, + descriptors: { + unicodeRange: + "U+3dd2-3e82,U+26a58,U+26a8c,U+26ab7,U+26aff,U+26b5c,U+26c21,U+26c29,U+26c73,U+26cdd,U+26e40,U+26e65,U+26f94,U+26ff6-26ff8,U+270f4,U+2710d", + }, + }, + { + uri: _124, + descriptors: { + unicodeRange: + "U+3d34-3dd1,U+2648d,U+26676,U+2667e,U+266b0,U+2671d,U+2677c,U+267cc,U+268dd,U+268ea,U+26951,U+2696f,U+269dd,U+269fa,U+26a1e", + }, + }, + { + uri: _125, + descriptors: { + unicodeRange: + "U+3c76-3d33,U+25d0a,U+25da1,U+25e2e,U+25e56,U+25e62,U+25e65,U+25ec2,U+25ed7-25ed8,U+25ee8,U+25f23,U+25f5c,U+25fd4,U+25fe0,U+25ffb,U+2600c,U+26017,U+26060,U+260ed,U+26221,U+26270,U+26286,U+2634c,U+26402", + }, + }, + { + uri: _126, + descriptors: { + unicodeRange: + "U+3bda-3c75,U+25771,U+257a9,U+257b4,U+259c4,U+259d4,U+25ae3-25ae4,U+25af1,U+25bb2,U+25c14,U+25c4b,U+25c64", + }, + }, + { + uri: _127, + descriptors: { + unicodeRange: + "U+3b25-3bd9,U+2504a,U+25055,U+25122,U+2512b,U+251a9,U+251cd,U+251e5,U+2521e,U+2524c,U+2542e,U+2548e,U+254d9,U+2550e,U+25532,U+25562,U+255a7-255a8", + }, + }, + { + uri: _128, + descriptors: { + unicodeRange: + "U+3a6b-3b24,U+24896,U+249db,U+24a4d,U+24a7d,U+24ac9,U+24b56,U+24b6f,U+24c16,U+24d14,U+24dea,U+24e0e,U+24e37,U+24e6a,U+24e8b,U+24eaa", + }, + }, + { + uri: _129, + descriptors: { + unicodeRange: + "U+39a9-3a6a,U+24096,U+24103,U+241ac,U+241c6,U+241fe,U+243bc,U+243f8,U+244d3,U+24629,U+246a5,U+247f1", + }, + }, + { + uri: _130, + descriptors: { + unicodeRange: + "U+38e3-39a8,U+23a98,U+23c7f,U+23c97-23c98,U+23cfe,U+23d00,U+23d0e,U+23d40,U+23dd3,U+23df9-23dfa,U+23e23,U+23f7e", + }, + }, + { + uri: _131, + descriptors: { + unicodeRange: + "U+3760-382a,U+22ab8,U+22b43,U+22b46,U+22b4f-22b50,U+22ba6,U+22bca,U+22c1d,U+22c24,U+22c55,U+22d4c,U+22de1", + }, + }, + { + uri: _132, + descriptors: { + unicodeRange: + "U+382b-38e2,U+231b6,U+231c3-231c4,U+231f5,U+23350,U+23372,U+233d0,U+233d2-233d3,U+233d5,U+233da,U+233df,U+233e4,U+2344a-2344b,U+23451,U+23465,U+234e4,U+2355a,U+23594,U+235c4,U+235cb,U+23638-2363a,U+23647,U+2370c,U+2371c,U+2373f,U+23763-23764,U+237e7,U+237ff,U+23824,U+2383d", + }, + }, + { + uri: _133, + descriptors: { + unicodeRange: + "U+3698-375f,U+22218,U+2231e,U+223ad,U+224dc,U+226f3,U+2285b,U+228ab,U+2298f", + }, + }, + { + uri: _134, + descriptors: { + unicodeRange: + "U+35e6-3697,U+21c56,U+21cde,U+21d2d,U+21d45,U+21d62,U+21d78,U+21d92,U+21d9c,U+21da1,U+21db7,U+21de0,U+21e33-21e34,U+21f1e,U+21f76,U+21ffa,U+2217b", + }, + }, + { + uri: _135, + descriptors: { + unicodeRange: + "U+3444-350e,U+20ad3,U+20b1d,U+20b9f,U+20c41,U+20cbf,U+20cd0,U+20d45,U+20de1,U+20e64,U+20e6d,U+20e95,U+20e9d,U+20ea2,U+20f5f,U+210c1,U+21201,U+2123d,U+21255,U+21274,U+2127b", + }, + }, + { + uri: _136, + descriptors: { + unicodeRange: + "U+350f-35e5,U+212d7,U+212e4,U+212fd,U+2131b,U+21336,U+21344,U+2139a,U+213c4,U+21413,U+2146d-2146e,U+215d7,U+21647,U+216b4,U+21706,U+21742,U+218bd,U+219c3", + }, + }, + { + uri: _137, + descriptors: { + unicodeRange: + "U+336d-3443,U+2032b,U+20371,U+20381,U+203f9,U+2044a,U+20509,U+20547,U+205d6,U+20628,U+20676,U+2074f,U+20779,U+20807,U+2083a,U+20895,U+208b9,U+2097c,U+2099d", + }, + }, + { + uri: _138, + descriptors: { + unicodeRange: + "U+328b-336c,U+2000b,U+20089,U+200a2,U+200a4,U+20164,U+201a2,U+20213", + }, + }, + { + uri: _139, + descriptors: { + unicodeRange: + "U+3192-31ba,U+31c0-31e3,U+31f0-321e,U+3220-328a,U+1f250-1f251", + }, + }, + { + uri: _140, + descriptors: { + unicodeRange: + "U+2f74-2fd5,U+3000,U+3003-3007,U+3012-3013,U+3018-301c,U+3020-3029,U+302f-303f,U+3041-3096,U+3099-30a1", + }, + }, + { + uri: _141, + descriptors: { + unicodeRange: "U+30a2-30ff,U+3105-312f,U+3131-318e,U+3190-3191", + }, + }, + { + uri: _142, + descriptors: { + unicodeRange: + "U+4e36,U+4ea0,U+4f74,U+4f91,U+4f94,U+4fc5,U+507e,U+50ed,U+5182,U+51f5,U+525e,U+5282,U+52f9,U+5326,U+537a,U+53a3,U+5423,U+5459,U+54b4,U+54d9,U+55c9,U+57f4,U+580b,U+5902,U+5925,U+5a08,U+5ab5,U+5b84,U+5be4,U+5c22,U+5cb5,U+5cbd,U+5d3e,U+5e31,U+5e5e,U+5e80,U+5ee8,U+5f82,U+5fc9,U+5fed,U+600a,U+605d,U+609b,U+609d,U+60dd,U+6243,U+6322,U+63ce,U+640c,U+643f,U+6445,U+64d7,U+6534,U+6549,U+656b,U+6603,U+674c,U+680a,U+6864,U+69d4,U+6a65,U+6c2a,U+6c46,U+6c5c,U+6d0e,U+6d48,U+6e2b,U+6eb2,U+6eb7,U+6f89,U+706c,U+70b1,U+7113,U+71d4,U+727f,U+72f3,U+7303,U+7321,U+736c,U+736f,U+74a9,U+74de,U+750d,U+7513,U+7592,U+75c4,U+7605,U+760a,U+761b,U+7625,U+762d,U+7643,U+7707,U+7747,U+77b5,U+7839,U+784e,U+78a5,U+7924,U+793b,U+798a,U+7a03,U+7a06,U+7a78,U+7a80,U+7aad,U+7ba8,U+7be5,U+7cc8,U+7ec1,U+7f0b,U+7f0f,U+7f12,U+7f68,U+7f9d,U+8025,U+809c,U+80ad,U+80b7,U+80e8,U+811e,U+8204,U+8223,U+822d,U+823b,U+824b,U+825a,U+827d,U+827f,U+828f,U+82c8,U+8307,U+831b,U+8347,U+837d,U+839b,U+83a9,U+83f9,U+84b9,U+8579,U+864d,U+867f,U+86b0,U+86d1,U+86d8,U+86f2,U+8764,U+8770,U+8788,U+8797,U+87ac-87ad,U+87b5,U+881b,U+8844,U+88bc,U+88fc,U+8930,U+89cf,U+89d6,U+8ba0,U+8bd4,U+8c02,U+8c2b,U+8c85,U+8e23,U+8f81-8f82,U+8fd5,U+90b6,U+90db,U+914e,U+9164,U+91ad,U+943e,U+94b7-94b8,U+94eb,U+950d,U+9514,U+9516,U+9518,U+9529,U+9538,U+953f,U+954e,U+955f,U+95fc,U+9667,U+96b3,U+9792,U+97b2,U+98a1,U+9969,U+9987,U+9998,U+9a80,U+9a92,U+9a96,U+9adf,U+9cb4,U+9cbd,U+9cd0,U+9cd4,U+9e31,U+9e3a,U+9e71,U+9ee5,U+9eea,U+9ef9,U+9fa0", + }, + }, + { + uri: _143, + descriptors: { + unicodeRange: + "U+4e0c,U+4e28,U+4e3f,U+4ec2,U+502e,U+50ba,U+5155,U+5181,U+522d,U+5281,U+5290,U+5369,U+53b6,U+54d5,U+54dc,U+54ff,U+552a,U+553c,U+5588,U+55b5,U+5686,U+570a,U+5776,U+5786,U+57a4,U+5820,U+5865,U+58bc,U+5b32,U+5b65,U+5c1c,U+5c66,U+5c6e,U+5c8d,U+5ddb,U+5f2a,U+5f50,U+5f61,U+6067,U+614a,U+615d,U+619d,U+61d4,U+620b,U+6224-6225,U+6343,U+63ad,U+63f2,U+640b,U+6420,U+6434,U+6496,U+64d0,U+6509,U+652e,U+67a8,U+6833,U+6844,U+684a,U+6920,U+6957,U+6971,U+6a8e,U+6a91,U+6aa0,U+6b43,U+6bea,U+6bf5,U+6c15,U+6cd0,U+6ee0,U+6f24,U+6f2d,U+70c0,U+721d,U+728b,U+72c3,U+72e8,U+730a,U+7338-7339,U+734d,U+746d,U+752f,U+754e,U+770d,U+7735,U+778d,U+77a2,U+77e7,U+7857,U+786d,U+78c9,U+78f2,U+791e,U+7953,U+7b58,U+7b9d,U+7bda,U+7cd7,U+7f32-7f33,U+8022,U+8028-8029,U+8035,U+804d,U+8080,U+80c2,U+80e9,U+80ec,U+80f2,U+810e,U+8221,U+8274,U+82b0,U+82e0,U+83b0,U+8487-8488,U+848e,U+84cd,U+84d0,U+8539,U+857a,U+85a8,U+85b7,U+867c,U+871e,U+8723,U+877e,U+878b,U+8793,U+8803,U+88d2,U+8966,U+89cc,U+89eb,U+8b26,U+8c8a,U+8c98,U+8d33,U+8d47,U+8d55,U+8dbc,U+8e40,U+8e94,U+8f77,U+8f79,U+9058,U+91a2,U+91b5,U+928e,U+9494,U+94b6,U+94de,U+94f4,U+94f9,U+950a,U+950e,U+951e,U+952b,U+953c,U+953e,U+9544,U+9561,U+9564,U+9569,U+95f6,U+9603,U+960d,U+963d,U+9674,U+9794,U+97ab,U+98a5,U+9a9f,U+9ab1,U+9ad1,U+9b0f,U+9b2f,U+9c92,U+9c95,U+9cba,U+9cbc,U+9cc6,U+9ccb,U+9cd8,U+9e32,U+9e38,U+9e5b,U+9e7e,U+9eb4,U+9efb-9efc,U+9f3d", + }, + }, + { + uri: _144, + descriptors: { + unicodeRange: "U+2e3b,U+2e80-2e99,U+2e9b-2ef3,U+2f00-2f73,U+ffffd", + }, + }, + { + uri: _145, + descriptors: { + unicodeRange: + "U+4e69,U+4f1b,U+4f67,U+4f7e,U+4fdc,U+50e6,U+5196,U+5202,U+5233,U+523f,U+52a2,U+536e,U+5476,U+54ad,U+54cf,U+5537,U+561e,U+56dd,U+56df,U+5709,U+572c,U+57cf,U+57f8,U+580d,U+5881,U+589a,U+5941,U+59b2,U+5c25,U+5d24,U+5d74,U+5e42,U+5e8b,U+5eb3,U+5ed2,U+5fad,U+6003,U+603c,U+6083,U+6100,U+6126,U+6206,U+62ca,U+638e,U+63b4,U+6426,U+646d,U+6535,U+65c4,U+66db,U+6715,U+6769,U+6798,U+67c3,U+6861,U+698d,U+69ca,U+69ed,U+69f2,U+69ff,U+6a18,U+6b39,U+6bb3,U+6c0d,U+6cb2,U+6cd6,U+6cf7,U+6cfa,U+6d33,U+6e16,U+6e53-6e54,U+6ebb,U+6fb6,U+709d,U+72ad,U+72f7,U+72fb,U+7313,U+739f,U+74ba,U+754b,U+755b,U+758b,U+75ac,U+75d6,U+7617,U+7635,U+7640,U+76a4,U+76b2,U+775a,U+77bd,U+781f,U+79b3,U+7b2b,U+7b31,U+7b3e,U+7b6e,U+7b9c,U+7c0b,U+7c9e,U+7cc1,U+7ce8,U+7ea5,U+7f21,U+7f27,U+7f74,U+7fb0,U+8031,U+8071,U+80ea,U+8114,U+8160,U+81a6,U+81c1,U+829f,U+82a4,U+82fb,U+831a,U+8333,U+836c,U+83b6,U+83f8,U+8411,U+841c,U+8489,U+848c,U+85a4,U+8627,U+8629,U+866e,U+86b5,U+872e,U+8731,U+877b,U+877d,U+87ea,U+8813,U+8816,U+8864,U+88ce,U+88e5,U+897b,U+89cb,U+89f3,U+8bfc,U+8c35,U+8d46,U+8d4d,U+8dba,U+8e3a,U+8f75,U+8f7e,U+8fd3,U+9161,U+9179,U+917e,U+91a3,U+94ac,U+94d7,U+94e5,U+952a,U+952c,U+9545,U+9565,U+9568,U+956a,U+961d,U+96e0,U+972a,U+9730,U+989f,U+98e7,U+990d,U+9967,U+9993,U+9aa3,U+9ac0,U+9ae1,U+9aeb,U+9af9,U+9c86,U+9c8b,U+9ca0-9ca1,U+9ca3,U+9ce2,U+9e48,U+9e6a,U+9e87,U+9ee2,U+9ee9,U+9f17,U+9f19,U+9f2c,U+9f80", + }, + }, + { + uri: _146, + descriptors: { + unicodeRange: + "U+4ef3,U+50d6,U+50ec,U+51ab,U+51b1,U+52d6,U+54a9,U+54da,U+55be,U+55cd,U+564d,U+572f,U+574c,U+576b,U+57d8,U+57fd,U+5844,U+59d2,U+5ae0,U+5b16,U+5b37,U+5b5b,U+5b80,U+5d1e,U+5d6b,U+5efe,U+5f11,U+5f56,U+5f58,U+5f73,U+5f8c,U+5fc4,U+5fe4,U+602b,U+6106,U+610d,U+63de,U+63f8,U+641b,U+64e4,U+6634,U+676a,U+67b5,U+681d,U+6883,U+69b1,U+69e0,U+6b37,U+6b9b,U+6d7c,U+6ed7,U+6f36,U+6f72,U+6f8c,U+7035,U+7039,U+7173,U+7178,U+7228,U+728f,U+72b4,U+72ef,U+72f4,U+7331,U+7481,U+74e0,U+7540,U+75c3,U+75e6,U+763c,U+764d,U+76cd,U+7704,U+7743,U+7780,U+7847,U+786a,U+78b9,U+7962,U+7a02,U+7aac,U+7ab3,U+7b0a,U+7b4c,U+7b7b,U+7bfc,U+7c0f,U+7c16,U+7c40,U+7ca2,U+7cc7,U+7cf8,U+7d77,U+7e3b,U+7ea1,U+7ea9,U+7ef2,U+7f02,U+7f07,U+7f0c,U+7f23,U+7f2f,U+7fbc,U+8016,U+8020,U+812c,U+8136,U+8182,U+822f,U+8233,U+825f,U+8268,U+8284,U+8288,U+8291,U+8308,U+8311,U+835b,U+836d,U+83dd,U+8406,U+840f,U+845c,U+84b4,U+84e3,U+850c,U+855e,U+863c,U+86ba,U+86c4,U+86de,U+86f1,U+873e,U+87bd,U+87db,U+880a,U+883c,U+887f,U+88f0,U+890a,U+892b,U+895e,U+89ef,U+8a48,U+8bdc,U+8c18,U+8c33,U+8c94,U+8db1,U+8dcf,U+8dd6,U+8de3,U+8e6f,U+8e90,U+8f7a,U+8fb6,U+902d,U+90be,U+91af,U+936a,U+948b,U+94d8,U+9513,U+953a,U+956c,U+963c,U+9654,U+966c,U+9688,U+97b4,U+996b,U+9a75,U+9a7a,U+9aba,U+9aed,U+9b08,U+9b43,U+9c8e,U+9c94,U+9c9a,U+9e2b,U+9e36,U+9e4b,U+9e4e,U+9e55,U+9e63,U+9e68-9e69,U+9ebd,U+9ec9,U+9f0d,U+9f37,U+9f51", + }, + }, + { + uri: _147, + descriptors: { + unicodeRange: + "U+50a7,U+5240,U+5261,U+52ac,U+531a,U+5363,U+5432,U+5452,U+5456,U+5472,U+5478,U+553f,U+5575,U+5581,U+55cc,U+55fe,U+5601,U+572e,U+57d2,U+57ef,U+581e,U+5924,U+5981,U+5997,U+59a3,U+5aaa,U+5ab8,U+5b34,U+5d5d,U+5def,U+5e11,U+5e91,U+5ed1,U+5ef4,U+5f40,U+600d,U+6019,U+601b,U+605a,U+6092,U+60ab,U+6217,U+623d,U+6369,U+65d2,U+6661,U+670a,U+6753,U+67a7,U+6855,U+68f9,U+6939,U+696e,U+6980,U+6a7c,U+6aab,U+6b82,U+6bf3,U+6bf9,U+6c05,U+6c19-6c1a,U+6ca9,U+6cf6,U+6d1a,U+6dab,U+6f74,U+7085,U+7198,U+71b5,U+7256,U+725d,U+727e,U+72fa,U+7322,U+738e,U+73e5,U+750f,U+755a,U+7594,U+75b3,U+760c,U+7615,U+7630,U+763f,U+77ec,U+7817,U+78a1,U+78d9,U+7905,U+7b2a,U+7b2e,U+7b62,U+7b85,U+7bcc,U+7bea,U+7c26,U+7c74,U+7c9c-7c9d,U+7e47,U+7e9b,U+7e9f,U+7ee0,U+7ee8,U+7ef1,U+7f01,U+7f11,U+7f17,U+7f36,U+7f7e,U+7fee,U+802a,U+80cd,U+8112,U+8169,U+8234,U+8279,U+8298,U+82ca,U+82d8,U+82e1,U+83c0,U+83d4,U+83df,U+8401,U+8451,U+845a,U+8476,U+8478,U+84ba,U+84bd,U+84e0,U+851f,U+8548,U+8556,U+8585,U+868d,U+86e9,U+86f4,U+86f8,U+8765,U+8785,U+87ab,U+87ee,U+8832,U+8872,U+88b7,U+88e2-88e3,U+89da,U+8bce,U+8bd3,U+8bd6,U+8bf9,U+8c16,U+8c73,U+8d5c,U+8dde,U+8f6d,U+8f94,U+8fe8,U+9011,U+915e,U+9185,U+918c,U+94ab,U+94d1,U+94f3,U+9515,U+951d,U+9558,U+9567,U+96ce,U+96e9,U+9785,U+9878,U+987c,U+9883,U+98d1,U+9954,U+9963,U+9a93,U+9ac1,U+9acc,U+9b1f,U+9b49,U+9b4d,U+9b51,U+9ca7,U+9cae,U+9cce,U+9cd3,U+9e37,U+9e39,U+9e41,U+9e46,U+9f22,U+9f2f,U+9f39,U+9f85", + }, + }, + { + uri: _148, + descriptors: { + unicodeRange: + "U+4e5c,U+4edf,U+4f25,U+4f32,U+4f5e,U+4f76,U+4faa,U+4fe6,U+5028,U+5048,U+5250,U+535f,U+538d,U+53c1,U+5412,U+5443,U+54d4,U+54dd,U+5541,U+5550,U+5577,U+55dd,U+55f3,U+560f,U+562c,U+5657-5658,U+5664,U+56af,U+575c,U+577c,U+57b2,U+57da,U+5800,U+5a62,U+5aeb,U+5c3b,U+5ca3,U+5d26,U+5d9d,U+5f01,U+5fb5,U+5fdd,U+5ff8,U+6029,U+6041,U+6079,U+60b1,U+6222,U+629f,U+6332,U+63bc,U+63e0,U+6485,U+65ab,U+65c3,U+65c6,U+668c,U+669d,U+66be,U+67fd,U+6800,U+68fc,U+690b,U+6924,U+6978,U+69a7,U+6a3e,U+6a50,U+6a5b,U+6a97,U+6b24,U+6b8d,U+6baa,U+6c10,U+6c54,U+6ceb,U+6d04,U+6d4d,U+6eb1,U+6ebd,U+7110,U+71b3,U+71f9,U+7230,U+728d,U+7292,U+72b8,U+72d2,U+7360,U+73a2,U+7511,U+75a0,U+75c8,U+779f,U+7826,U+7877,U+7a39,U+7aa8,U+7ae6,U+7b04,U+7b0f,U+7baa,U+7bac,U+7c1f,U+7ccd,U+7ecb,U+7ed4,U+7ed7,U+7efb,U+7f0d,U+7f5f,U+7faf,U+7fd5,U+7fe5,U+8027,U+80bc,U+80dd,U+80fc,U+8132,U+815a,U+8167,U+816d,U+81ca,U+8228,U+82a1,U+82a9,U+82ab,U+82cc,U+8351,U+8368,U+83b8,U+83d8,U+83ea,U+83f0,U+8497,U+84c1,U+858f,U+85ff,U+867b,U+86a8-86a9,U+870a,U+8722,U+876e,U+877c,U+87e5,U+8888,U+88df,U+8919,U+8bcc,U+8bdf,U+8be8,U+8bee,U+8c20,U+8c2f,U+8d36,U+8df8,U+8e05,U+8e2f,U+8f9a,U+9021,U+908b,U+90b4,U+90ba,U+90d0,U+90eb,U+90fe,U+91aa,U+933e,U+9486-9487,U+948d,U+9490,U+94ad,U+94bd,U+94d6,U+94d9,U+9507,U+9546,U+955e,U+956b,U+95e9,U+9604,U+960b,U+9612,U+9615,U+9617,U+96b9,U+989a-989b,U+989e,U+9a78,U+9a7d,U+9aa0,U+9aa2,U+9ac2,U+9b23,U+9b3b,U+9c82,U+9cca,U+9cd9,U+9e28,U+9e5a,U+9e5e,U+9e6c,U+9efe,U+9f0b", + }, + }, + { + uri: _149, + descriptors: { + unicodeRange: + "U+4e47,U+4e8d,U+4f65,U+4f89,U+50ee,U+520e,U+5416,U+5454,U+54bb,U+54c2,U+54d3,U+54de,U+5591,U+55e5,U+560c,U+566b,U+5769,U+578c,U+5793,U+57e4,U+5889,U+593c,U+59ab,U+5ad4,U+5ad8,U+5af1,U+5b53,U+5ba5,U+5c59,U+5c63,U+5d5b,U+5e0f,U+5e14,U+5edb,U+5fbc,U+6004,U+60ad,U+610e,U+61b7,U+624c,U+634c,U+647a,U+64ba,U+65f0,U+6600,U+66f7,U+67e2,U+67f0,U+680c,U+686b,U+6874,U+691f,U+6989,U+6a17,U+6b81,U+6b84,U+6c06-6c07,U+6c3d,U+6d07,U+6d27,U+6d2b,U+6d91,U+6e6b,U+6e8f,U+6fde,U+70bb,U+723b,U+726e,U+72b0,U+72ce,U+72f2,U+7301,U+731e,U+737e,U+7477,U+748e,U+74ff,U+7633,U+7654,U+771a,U+7726,U+7765,U+7768,U+781c,U+7829,U+78d4,U+7913,U+7957,U+79d5,U+79eb,U+7a70,U+7a86,U+7b25,U+7b38,U+7b47,U+7b72,U+7ba6-7ba7,U+7dae,U+7ee1,U+7efe,U+7f26,U+7f31,U+7f35,U+801c,U+8043,U+809f,U+80ab,U+80d7,U+8118,U+8188,U+81cc,U+823e,U+8244,U+824f,U+82b4,U+82c1,U+82e4,U+82f4,U+8306,U+833a,U+835c,U+839c,U+83b3,U+83bc,U+846d,U+867a,U+868b,U+8734,U+87ca,U+886e,U+887e,U+88a2,U+88c9,U+8921,U+8bb5,U+8bf3,U+8c04,U+8c17,U+8c1d,U+8c25,U+8c36,U+8c55,U+8c78,U+8d3d,U+8d40,U+8d59,U+8d67,U+8d91,U+8dbf,U+8deb-8dec,U+8dfd,U+8e14,U+8e41,U+8f8e,U+900b,U+9044,U+9062,U+90cf,U+9123,U+9146,U+9162,U+9172,U+918d,U+9190,U+92c8,U+93ca,U+948c,U+94aa,U+94b2,U+94c8,U+94ca,U+94d5,U+94df,U+94e9-94ea,U+94f7,U+94fc-94fd,U+951b,U+954f,U+9554,U+9559,U+9566,U+9571-9572,U+95f1,U+9608,U+960f,U+97af,U+988f,U+98d5,U+992e,U+9955,U+9ab0,U+9b32,U+9c90,U+9c9e,U+9ca5,U+9ca9,U+9cad,U+9cb1,U+9cc3,U+9e47,U+9ee7,U+9f87", + }, + }, + { + uri: _150, + descriptors: { + unicodeRange: + "U+4e93,U+4ec4,U+4ef5,U+4f27,U+4f7b,U+4fe3,U+5080,U+5121,U+51eb,U+5208,U+52f0,U+53f5,U+5453,U+5466,U+54a6,U+54bf,U+54d0,U+5533,U+5549,U+5556,U+556d,U+558f,U+55f2,U+55f5,U+5627,U+567b,U+56d4,U+571c,U+5739,U+57b4,U+5807,U+58c5,U+59a4,U+59af,U+59d8,U+5a09,U+5a0c,U+5a4a,U+5ad2,U+5b6c,U+5ca2,U+5cac,U+5d03,U+5d6c,U+5db7,U+5ebe,U+5f2d,U+5fea,U+6042,U+6120,U+6175,U+6221,U+623e,U+6339,U+638a,U+643d,U+64b8,U+64e2,U+66e9,U+67b3,U+67c1,U+67d2,U+6832,U+6877,U+68f0,U+6934,U+6966,U+6987,U+6998,U+69c1,U+69ce,U+6a3d,U+6a84,U+6aa9,U+6b87,U+6bd6,U+6c16,U+6c18,U+6cd4,U+6cee,U+6de0,U+6e0c,U+6ecf,U+6f4b,U+70b7,U+7168,U+72d9,U+7352,U+73b3,U+73d0,U+7441,U+74d2,U+75a5,U+75e7-75e8,U+7610,U+7619,U+765e,U+772d,U+7812,U+782c,U+784c,U+7850,U+7856,U+789b,U+78f4,U+7a51,U+7b15,U+7b1e,U+7b24,U+7b5a,U+7bb8,U+7bc1,U+7bd9,U+7ed0,U+7ee6,U+7efa,U+7f1b,U+7f1f,U+7f22,U+7f45,U+7f71,U+7fa7,U+7fbf,U+7ff3,U+8052,U+80b1,U+80db,U+80f4,U+81bb,U+81ec,U+8202,U+8210,U+8249,U+828a,U+828e,U+82e3,U+8315,U+8369,U+8378,U+83a8,U+83aa,U+83b4,U+83e1,U+84fc,U+8538,U+853b,U+859c,U+85ae,U+86b4,U+86c9,U+86cf,U+8725,U+879f,U+87b3,U+887d,U+88fe,U+8a8a,U+8ba7,U+8c07,U+8c14,U+8c30,U+8c47,U+8db5,U+8dd7,U+8e1f,U+8e69,U+8e70,U+8e85,U+8f78,U+8f87,U+8f8b,U+8f8f,U+90c4,U+9143,U+917d,U+948f,U+94cd,U+94d2,U+94ef,U+954a,U+9609-960a,U+96d2,U+9708,U+9765,U+97ea,U+9880,U+98a7,U+996c,U+9980,U+9991,U+9a88,U+9ab6,U+9afb,U+9b47,U+9c87,U+9c9b,U+9cb5,U+9cc7,U+9e2c,U+9e42,U+9e58,U+9ecd,U+9ecf,U+9f8a,U+9f8c", + }, + }, + { + uri: _151, + descriptors: { + unicodeRange: + "U+4ebb,U+4edd,U+4fa9,U+502c,U+50a5,U+51c7,U+51fc,U+523d,U+5241,U+530f,U+5464,U+549d,U+54a3,U+5514,U+5527,U+555c,U+556e,U+5576,U+55b1,U+55b9,U+55eb,U+5624,U+564c,U+5671,U+5685,U+568f,U+56d7,U+56e1,U+57a1,U+57d9,U+5942,U+5a67,U+5c50,U+5c7a,U+5c98,U+5d06,U+5d27,U+5d6f,U+5df3,U+5dfd,U+5e19,U+5ea0,U+5eb9,U+5eea,U+5ffe,U+600f,U+606b,U+6215,U+622c,U+6266,U+62bb,U+62bf,U+6308,U+6387,U+63b8,U+63c4,U+63c6,U+63f6,U+6441,U+6555,U+659b,U+6677,U+66a7,U+6775,U+678b,U+679e,U+6840,U+6849,U+6860,U+68c2,U+6910,U+6a28,U+6a2f,U+6a79,U+6b92-6b93,U+6bc2,U+6bfd,U+6c29,U+6c32,U+6c86,U+6cc5,U+6d0c,U+6d60,U+6da0,U+6ddd,U+6e86,U+6ed3,U+6edf,U+6fb9,U+6fd1,U+6fef,U+7023,U+7080,U+70ca,U+712f,U+7145,U+7284,U+732c,U+73c8,U+73d9,U+740a,U+7457,U+7596,U+759d,U+75a3,U+75d8,U+75e3-75e4,U+75ff,U+7622,U+7688,U+76b4,U+76e5,U+7818,U+7887,U+789a,U+78b2,U+7b08,U+7b33,U+7c2a,U+7ccc,U+7ea8,U+7ec0,U+7fe6,U+8012,U+8084,U+8093,U+80e4,U+80ef,U+8297,U+82a8,U+82be,U+8331,U+8366,U+83c5,U+83fd,U+8473,U+84a1,U+84ca,U+84d1,U+857b,U+85c1,U+85d3,U+8605,U+8662,U+86aa,U+86b1,U+86d4,U+86ed,U+86f3,U+8709,U+8748,U+874c,U+8763,U+89c7,U+89de,U+89e5,U+8a3e,U+8ba6,U+8c00,U+8c21,U+8c49,U+8c7a,U+8d30,U+8df9,U+8e51,U+8e59,U+8f6b,U+8f73,U+8ff3,U+9016,U+9026,U+902f,U+9099,U+909b,U+90c7,U+914a,U+91ae,U+91ba,U+9495,U+94a3,U+94af,U+94ba,U+94bf,U+94cc,U+94e1,U+94f0,U+9531,U+955d,U+95f3,U+9697,U+96bc,U+975b,U+977c,U+98a2,U+998a,U+9994-9995,U+9a9b,U+9ab7,U+9ac5,U+9c91,U+9ccf,U+9cd5,U+9e29,U+9edc,U+9edf,U+9f83,U+9f88-9f89", + }, + }, + { + uri: _152, + descriptors: { + unicodeRange: + "U+4ee8,U+4f22,U+4f43,U+4f57,U+4f5d,U+4f6f,U+4ff8,U+502d,U+507b,U+5345,U+53df,U+53fb,U+544b,U+5482,U+54a7,U+54cc,U+550f,U+5544,U+5555,U+5594,U+55e8,U+55ec,U+55ef,U+564e,U+56f9,U+5704,U+576d,U+5785,U+57ad,U+5914,U+5958,U+599e,U+59aa,U+59be,U+5a06,U+5abe,U+5ae1,U+5b40,U+5bee,U+5cbf,U+5cc4,U+5ccb,U+5d47,U+603f,U+6078,U+607d,U+607f,U+608c,U+609a,U+60fa,U+61ff,U+621b,U+622e,U+626a,U+6371,U+63ae,U+63cd,U+63d6,U+6410,U+6414,U+6421,U+6448,U+64d8,U+6710,U+6748,U+6772,U+680e,U+6954,U+69ab,U+6c68,U+6c8f,U+6ca4,U+6d2e,U+6e4e,U+6e98,U+6fe0,U+7094,U+70e9,U+7116,U+7119,U+723f,U+73c9,U+74e4,U+753e,U+7548,U+75bd,U+75cd,U+7618,U+7634,U+76c5,U+76f1,U+7708,U+7719,U+777e,U+7791,U+77b3,U+7823,U+7827,U+7830,U+7889,U+7893,U+7949,U+795c,U+79e3,U+7a14,U+7a88,U+7a95,U+7aa0,U+7afd,U+7b90,U+7bd1,U+7bfe,U+7da6,U+7ec2,U+7eef,U+7f03-7f04,U+7f08,U+7f58,U+7f61,U+7f9f,U+8174,U+8200,U+828d,U+82c4,U+82d5,U+82dc,U+82f7,U+832d,U+835a,U+840b,U+8438,U+852b,U+869d,U+86ac,U+86d0,U+86f0,U+8782,U+87a8,U+87d1-87d2,U+87e0,U+8839,U+8913,U+891b,U+8934,U+8941,U+89ca,U+89ce,U+8a07,U+8ba3,U+8bc5,U+8bcb,U+8bdb,U+8c11,U+8c15,U+8c29,U+8c32,U+8dc4,U+8dce,U+8ddb,U+8dfa,U+8e09,U+8e1d,U+8e39,U+8e42,U+8e49,U+8e4b,U+8e8f,U+8f71-8f72,U+9004,U+9036,U+9097,U+90dc,U+90e2,U+90e6,U+90ef,U+9104,U+919a,U+91b4,U+938f,U+9497,U+950f,U+9557,U+9562-9563,U+9573,U+9606,U+9649,U+972d,U+973e,U+97a3,U+97eb,U+988c,U+9894,U+98a6,U+9974,U+9977,U+997d,U+9a90,U+9a9d,U+9aef,U+9ca2,U+9ccd,U+9cdf,U+9e20,U+9e4c,U+9e6b,U+9f3e", + }, + }, + { + uri: _153, + descriptors: { + unicodeRange: + "U+4ede,U+4ee1,U+4eeb,U+4fda,U+4ffe,U+5025,U+506c,U+50f3,U+5106,U+520d,U+525c,U+52ad,U+530d,U+5310,U+539d,U+53a9,U+53fc,U+5421,U+5477,U+54e7,U+551b,U+5530,U+557e,U+5599,U+55c4,U+55d1,U+55d4,U+55df,U+55e4,U+55ea,U+5623,U+562d,U+5654,U+56eb,U+56f5,U+57a7,U+57d5,U+57dd,U+584d,U+5880,U+58ec,U+59dd,U+5a32,U+5a55,U+5a75,U+5b51,U+5b71,U+5b73,U+5cd2,U+5ce4,U+5e5b,U+5e96,U+5fd2,U+607b,U+61d1,U+634b,U+636d,U+63b3,U+63ff,U+64c0,U+661d,U+6657,U+66dc,U+67a5,U+6841,U+6867,U+6901,U+699b,U+6a47,U+6b46,U+6c21,U+6c24,U+6c35,U+6c4a,U+6c94,U+6ca3,U+6d39,U+6d63,U+6d6f,U+6d94,U+705e,U+71e7,U+726f,U+72cd,U+72de,U+72f0,U+7325,U+7350,U+7391,U+741a,U+757f,U+7583,U+75b1,U+75b4,U+75b8,U+75c2,U+75f1,U+766f,U+7699,U+7751,U+789c,U+7a17,U+7be6,U+7cb2,U+7ea3,U+7eb0,U+7ebe,U+7eeb,U+7f25,U+7f2c,U+7fb8,U+8026,U+8037,U+8153,U+8171,U+8191,U+8214,U+821b,U+8222,U+826e,U+82eb,U+830c,U+8314,U+8334,U+83d6,U+8418,U+843c,U+84ff,U+8564,U+8572,U+8616,U+866c,U+8693,U+86a3,U+86a7,U+86af,U+86b6,U+86c6,U+86ca,U+8708,U+870d,U+8759,U+8760,U+87af,U+87c6,U+8869,U+88c6,U+89d0,U+8b07,U+8baa-8bab,U+8bc2,U+8be4,U+8bf0,U+8c2a,U+8c62,U+8c89,U+8d49,U+8d6d,U+8d84,U+8d94,U+8db8,U+8dc6,U+8e2e,U+8e3d,U+8e47,U+8e7f,U+9005,U+9051,U+907d,U+9082,U+9088,U+90b0,U+90d3,U+9150,U+949c,U+94a4,U+94b9,U+94cb,U+94e0,U+9509,U+9512,U+951f,U+9534,U+9552-9553,U+965f,U+96b0,U+9791,U+9889,U+9990,U+9a9c,U+9aa7,U+9c88,U+9cb2-9cb3,U+9cb6-9cb7,U+9cc5,U+9cdc,U+9e22,U+9e2a,U+9e57,U+9e67,U+9e73,U+9e82,U+9eb8,U+9ee0,U+9f9b", + }, + }, + { + uri: _154, + descriptors: { + unicodeRange: + "U+4eb5,U+4f09,U+4f5a,U+4f8f,U+4fce,U+4fdf,U+4fea,U+4ff3,U+500c,U+500f,U+504e,U+5088,U+52be,U+5420,U+5457,U+5499,U+549b,U+54c6,U+54d2,U+558b,U+559f,U+55bd,U+55d6,U+565c,U+567c,U+568e,U+5768,U+577b,U+57a9,U+57ed,U+59f9,U+5a11,U+5a40,U+5ae6,U+5b6a,U+5b93,U+5bb8,U+5c15,U+5c99,U+5c9c,U+5cc1,U+5d2e,U+5d4b,U+5d99,U+5e54,U+5e61,U+5fcf-5fd1,U+6002,U+6006,U+6014,U+60af,U+60c6,U+60da,U+60f4,U+621f,U+62c8,U+631b,U+631e,U+63e9,U+64b5,U+655d,U+6619,U+6635,U+6641,U+67ad,U+67b0,U+67b7,U+67e9,U+684e,U+688f,U+695d,U+696b,U+69b7,U+6a58,U+6c26,U+6d35,U+6d43,U+6d9e,U+6dd9,U+6dec,U+6e11,U+6e6e,U+6e9f,U+6ec2,U+6ee2,U+6ef9,U+6f09,U+6f66,U+6f8d,U+6fc2,U+6fc9,U+729f,U+72c8,U+73de,U+7430,U+7566,U+7579,U+75c9,U+75e2,U+75fc,U+762a,U+7638,U+7678,U+76c2,U+76f9,U+778c,U+77cd,U+77dc,U+7800,U+781d,U+782d,U+783b-783c,U+78a3,U+78ec,U+7980,U+7a23,U+7b95,U+7bdd,U+7c0c,U+7c41,U+7c91,U+7cb3,U+7cc5,U+7ecc,U+7f19,U+7fca,U+8006,U+8069,U+807f,U+80bd,U+80ed,U+814b,U+8198,U+82cb,U+82d2,U+834f,U+8360,U+847a,U+84d6,U+84e5,U+8537,U+85d0,U+8671,U+86a4,U+86ce,U+86f9,U+8703,U+8707,U+8737,U+873b,U+8815,U+8936,U+8bc3,U+8bcf,U+8bd2,U+8bd8,U+8be9,U+8c0c,U+8c0f,U+8c4c,U+8d45,U+8d5d,U+8d73,U+8e31,U+8e6d,U+8e76,U+8fe4,U+9041,U+90d7,U+9169,U+92ae,U+94a1,U+94c4,U+94c9,U+94db,U+94e7,U+9503,U+9506,U+9517,U+9528,U+9537,U+9542,U+9549,U+95fe,U+9616,U+961a,U+96c9,U+96f3,U+9701,U+970e,U+9739,U+9753,U+9798,U+98d2-98d3,U+98d9-98da,U+9968,U+996f,U+9984,U+9997,U+9acb,U+9b03,U+9c85,U+9ca8,U+9cab,U+9e49,U+9e51,U+9e66,U+9f10", + }, + }, + { + uri: _155, + descriptors: { + unicodeRange: + "U+4e15,U+4e1e,U+4e2b,U+4eb3,U+4ec9,U+4f0e,U+4f64,U+501c,U+50a9,U+510b,U+51a2,U+51bc,U+527d,U+52d0,U+53fd,U+5429,U+542e,U+5486,U+54af,U+5506,U+5511,U+5522,U+552c,U+556c,U+55b3,U+55d2,U+55e6,U+55fd,U+561f,U+5639,U+5659,U+5662,U+5693,U+572a,U+5892,U+598a,U+5992,U+59a9,U+5a20,U+5ae3,U+5b17,U+5b7d,U+5d34,U+5d3d,U+5d4a,U+5d82,U+5e1a-5e1b,U+5ea5,U+5f0b,U+5f77,U+5fd6,U+5fff,U+6026,U+6035,U+6063,U+60b4,U+60bb,U+60ee,U+612b,U+6194,U+61ca,U+61e6,U+61f5,U+620a,U+6248,U+62a1,U+62d7,U+6376,U+637b,U+652b,U+65bc,U+65cc,U+65ce,U+65d6,U+664c,U+665f,U+6666,U+6684,U+66b9,U+6773,U+6777,U+6787,U+67de,U+6845,U+693d,U+6994,U+6a35,U+6d54,U+6d5c,U+6d8e,U+6dd6,U+6eb4,U+6f2a,U+6f78,U+704f,U+70ec,U+7118,U+714a,U+7172,U+71b9,U+724d,U+728a,U+7337,U+733e,U+7396,U+73b7,U+73cf,U+7428,U+742c,U+742e,U+74ee,U+74f4,U+7525,U+753a,U+7572,U+75d4,U+765c,U+768e,U+7762,U+777d,U+77fd,U+7825,U+7837,U+78b4,U+795f,U+79ed,U+7a1e,U+7b06,U+7b20,U+7ba9,U+7bab,U+7c7c,U+7cbd,U+7cdc,U+7ec9,U+7ef6,U+7f30,U+7f42,U+7f44,U+7f54,U+7f94,U+8004,U+800b,U+8019,U+809b,U+80ae,U+80c4,U+80f1,U+8146,U+816e,U+817c,U+81c0,U+81fc,U+81fe,U+822b,U+830f,U+832f,U+8340,U+8365,U+8385,U+8392,U+83a0,U+8424,U+84af,U+869c,U+8713,U+8717-8718,U+87c0,U+87cb,U+87fe,U+8821,U+8902,U+89d1,U+8bb9,U+8c12,U+8d32,U+8d53,U+8df7,U+8e7c,U+8f7c,U+8f95,U+8fab,U+9052,U+905b,U+9095,U+909d,U+90c5,U+911e,U+9122,U+916a,U+919b,U+948e,U+9492,U+949a,U+94b5,U+94bc,U+94c6,U+94f1,U+9502,U+9511,U+9536,U+956f-9570,U+9602,U+9621,U+9631,U+998b,U+99a5,U+9a81,U+9a9e,U+9ebe,U+9f8b", + }, + }, + { + uri: _156, + descriptors: { + unicodeRange: + "U+4f2b,U+4f3d,U+4fac,U+5043,U+5055,U+5140,U+5156,U+51cb,U+5243,U+531d,U+536f,U+53a5,U+53ae,U+53f1,U+541d,U+5431,U+547b,U+5492,U+5494,U+54a4,U+54aa,U+54ce,U+54fd,U+5509,U+5520,U+553e,U+557b,U+55c5,U+55e1,U+55f7,U+5608,U+5636,U+563b,U+5773,U+57a0,U+5811,U+587e,U+58d5,U+59e3,U+5a29,U+5a6a,U+5a76,U+5a7a,U+5ac9,U+5b62,U+5b95,U+5c49,U+5c8c,U+5cab,U+5cb7,U+5d02,U+5d58,U+5e44,U+5e7a,U+5eff,U+5f29,U+5f89,U+5f9c,U+5fa8,U+6005,U+6043,U+60b8,U+60d8,U+60ec,U+60f0,U+6115,U+618e,U+630e,U+637a,U+6390,U+63ac,U+63b0,U+64de,U+6525,U+6538,U+65ee-65ef,U+6631,U+6636,U+6654,U+677c,U+67b8,U+67d8,U+683e,U+6886,U+68b5,U+692d,U+6963,U+6979,U+6988,U+6b59,U+6b9a,U+6c69,U+6c74,U+6cae,U+6ce0,U+6cef,U+6d95,U+6dc5,U+6dde,U+6de6,U+6dfc,U+6ea7,U+6f15,U+6f29,U+7096,U+70c3,U+7131,U+715c,U+7166,U+7266,U+7317,U+731d,U+7329,U+73e9,U+7425,U+7455,U+7490,U+74ef,U+7519,U+75b5,U+75b9,U+75de,U+7656,U+7663,U+7691,U+7729,U+77fe,U+783e,U+787c,U+795a,U+7a79,U+7abf,U+7b3a,U+7b4f,U+7b60,U+7b75,U+7b8d,U+7bb4,U+7bd3,U+7be1,U+7cbc,U+7edb,U+7f1c,U+7f8c,U+7fb2,U+7fb9,U+7fce,U+7ff1,U+810d,U+81c6,U+82a5,U+82aa,U+82de,U+8317,U+8343,U+835e,U+8364,U+836a,U+853a,U+8543,U+854a,U+8559,U+8568,U+85b0,U+85b9,U+864f,U+86e4,U+8715,U+8845,U+8884,U+88e8,U+88f1,U+8983,U+8be1,U+8c1f,U+8c27,U+8c5a,U+8c82,U+8d58,U+8dbe,U+8f98,U+9035,U+9074,U+90a1,U+9149,U+9157,U+93d6,U+949d,U+94c2,U+94e3-94e4,U+95eb,U+95f0,U+9611,U+9619,U+9642,U+968d,U+9706,U+970f,U+97ed,U+988a,U+9893,U+98e8,U+9a77,U+9a87,U+9aa1,U+9abc,U+9cdd,U+9e2f,U+9e33,U+9e44,U+9e5c,U+9e9d,U+9edd", + }, + }, + { + uri: _157, + descriptors: { + unicodeRange: + "U+4f58,U+4f6c,U+4f70,U+4fd0,U+5014,U+51bd,U+524c,U+5315,U+5323,U+535e,U+540f,U+542d,U+545b,U+548e,U+549a,U+54ab,U+54fc,U+5567,U+556a,U+5600,U+5618,U+563f,U+5669,U+56f1,U+56ff,U+573b,U+574d,U+579b,U+57b8,U+57c2,U+586c,U+58f9,U+595a,U+598d,U+5993,U+5996,U+59d7,U+5b7a,U+5ba6,U+5c4e,U+5c96,U+5ce5,U+5eb6,U+5f08,U+5f99,U+602f,U+6059,U+606c,U+607a,U+60ed,U+61a9,U+620c,U+6249,U+62a8,U+62c4,U+62ed,U+62fd,U+6342,U+6345,U+6396,U+63a3,U+6402,U+6413,U+642a,U+6487,U+64a9,U+64ac,U+64ae,U+64b7,U+659f,U+65a1,U+667e,U+66f3,U+67e0,U+69db,U+69df,U+6aac,U+6b86,U+6c50,U+6c5e,U+6c76,U+6c85,U+6c8c,U+6cde,U+6d19,U+6d52,U+6da7,U+6db8,U+6e1a,U+6e25,U+6e4d,U+6e5f,U+6ec1,U+6f31,U+6f7a,U+6fa7,U+6fe1,U+701b,U+70ab,U+70f7,U+717d,U+71a8,U+7252,U+72c4,U+72e1,U+7315,U+736d,U+73ae,U+73c0,U+73c2,U+740f,U+75a4,U+7600-7601,U+768b,U+76bf,U+76d4,U+7728,U+772f,U+776c,U+77a0,U+77b0,U+77f8,U+783a,U+78d0,U+78fa,U+7977,U+7a37,U+7a92,U+7afa,U+7b71,U+7b94,U+7cef,U+7f28,U+7fe1,U+808b,U+80e5,U+80eb,U+8110,U+8113,U+812f,U+814c,U+81c3,U+8235,U+82d4,U+8309,U+83c1,U+8431,U+8469,U+84bf,U+84d3,U+84df,U+84e6,U+8511,U+8638,U+86c0,U+86db,U+86fe,U+8757,U+8822,U+8882,U+8885,U+8892,U+88f3,U+892a,U+8ba5,U+8bd9,U+8be0,U+8be7,U+8bfd,U+8c1a,U+8d4a,U+8d4e,U+8d66,U+8dda,U+8e0c,U+8e52,U+8e74,U+8e87,U+8f76,U+8fc2,U+8fe6,U+900d,U+9068,U+90ac,U+90b3,U+90b8,U+90e7,U+9119,U+9131,U+915a,U+916e,U+94b4,U+94d0,U+94e2,U+94ec,U+94ff,U+9522,U+9535,U+9556,U+965b,U+96f9,U+9774,U+9981,U+998d,U+998f,U+9a6e,U+9a7f,U+9a8a,U+9b13,U+9c9f,U+9e3e,U+9e43,U+9e6d,U+9e8b,U+9e92,U+9edb,U+9eef", + }, + }, + { + uri: _158, + descriptors: { + unicodeRange: + "U+4e10,U+4e56,U+4e98,U+4ec3,U+4f3a,U+4f5f,U+4f88,U+4f97,U+4fa5,U+4fe8,U+504c,U+5197,U+52fa,U+5364,U+53e8,U+5406,U+543c,U+545c,U+5471,U+5480,U+5495,U+54b3,U+54df,U+54e6,U+54ee,U+557c,U+5583,U+55dc,U+55e3,U+566c,U+592f,U+5944,U+5983,U+59ca,U+59e5,U+5a13,U+5a7f,U+5b09,U+5bd0,U+5e4c,U+5eb5,U+5f1b,U+5f3c,U+608d,U+60cb,U+61a7,U+61ac,U+61cb,U+6233,U+62a0,U+62e7,U+62ee,U+62f4,U+62f7,U+634e,U+6382,U+63c9,U+63ea,U+6400,U+645e,U+6482,U+6556,U+6593,U+6615,U+664f,U+66e6,U+672d,U+675e,U+67da,U+6805,U+6808,U+6868,U+68a2,U+695e,U+69ad,U+6a80,U+6a90,U+6b83,U+6be1,U+6c30,U+6cad,U+6cb1,U+6cf1,U+6d31,U+6d93,U+6dae,U+6dbf,U+6dc6-6dc7,U+6e0d,U+6e32,U+6e3a,U+6e85,U+6eba,U+6f3e,U+6f5e,U+6f7c,U+6fee,U+71ee,U+722a,U+72b7,U+72e9,U+73ba,U+73d1,U+7409,U+7435-7436,U+7459-745a,U+747e,U+7487,U+74e2,U+7504,U+752c-752d,U+7599,U+759f,U+75a1,U+75ca,U+75f0,U+761f,U+7629,U+777f,U+7785,U+77a5,U+77bf,U+78d5,U+7934,U+7940,U+79a7,U+7b19,U+7c38,U+7c95,U+7cb1,U+7ce0,U+7eca,U+7ef7,U+7f2b,U+7f81,U+7fcc,U+8046,U+8148,U+8165,U+819b,U+81ba,U+828b,U+82ae,U+82b7,U+82d3,U+8301,U+830e,U+831c,U+8338,U+837c,U+8393,U+8398,U+83ba,U+83e0,U+83e9,U+853c,U+8654,U+86df,U+8712,U+873f,U+874e,U+8783,U+8859,U+88a4,U+8925,U+8bb7,U+8bff,U+8c19,U+8c1b,U+8c24,U+8c2c,U+8d61,U+8db4,U+8e6c,U+8f8a,U+8fe5,U+8ff8,U+901e,U+90f4,U+912f,U+9163,U+9170,U+91dc,U+949b,U+94a8,U+94b3,U+94c0,U+94e8,U+9525,U+9530,U+9539,U+954c-954d,U+9550,U+955b,U+962a,U+9685,U+96cc,U+9776,U+988d,U+9975,U+9985,U+9a6f,U+9aa5,U+9ab8,U+9c7f,U+9ca4,U+9cb8,U+9e25,U+9e35,U+9e4a", + }, + }, + { + uri: _159, + descriptors: { + unicodeRange: + "U+4ea2,U+4ea5,U+4f36,U+4f84,U+4f8d,U+501a,U+5029,U+516e,U+51a5,U+51c4,U+51f8,U+5201,U+527f,U+5321,U+5352,U+5366,U+53e9,U+54c7,U+5632,U+5676,U+56b7,U+56bc,U+56da,U+56e4,U+5703,U+5729,U+5742,U+57a2-57a3,U+5815,U+58d1,U+5919,U+592d,U+5955,U+5a05,U+5a25,U+5a34,U+5b70,U+5b75,U+5bdd,U+5bf0,U+5c41,U+5c79,U+5c91,U+5c94,U+5ce6,U+5ced,U+5d69,U+5dc5,U+5e16,U+5e27,U+5f27,U+5f95,U+5ffb,U+6020,U+604d,U+6055,U+60e6,U+60eb,U+6123,U+618b,U+61a8,U+620d,U+62c7,U+62ce,U+62d9,U+631f,U+634d,U+6452,U+6479,U+64ce,U+64d2,U+655b,U+660a,U+6726,U+67c4,U+6809,U+6853,U+68e3,U+68f1,U+68fa,U+693f,U+6942,U+6995,U+69a8,U+69b4,U+6a71,U+6b89,U+6bcb,U+6bd3,U+6bd9,U+6c40,U+6cf8,U+6cfe,U+6d85,U+6da3,U+6daa,U+6e0e,U+6e43-6e44,U+6f88,U+7078,U+7099,U+70bd,U+70d9,U+70fd,U+7109,U+7184,U+7239,U+733f,U+73f2,U+748b,U+749c,U+749e,U+759a,U+75d2,U+75eb,U+7620,U+766b,U+7693,U+76cf,U+7738,U+773a,U+776b,U+778e,U+77aa,U+7852,U+78be,U+7948,U+795b,U+7960,U+796f,U+79ba,U+7a20,U+7a96,U+7aa5,U+7b03,U+7b28,U+7b50,U+7b77,U+7bc6,U+7bf1,U+7c27,U+7d0a,U+7ead,U+7ec5,U+7ee2,U+7ef0,U+7efd,U+7f0e,U+7f2e,U+7f79,U+7f9a,U+8098,U+80da,U+80e7,U+80f0,U+80f3,U+80fa,U+818a,U+81e7,U+8237-8238,U+8299,U+82b8,U+82ce,U+837b,U+83bd,U+83cf,U+8426,U+8475,U+85c9,U+85d5,U+85dc,U+85e9,U+871a,U+8747,U+8749,U+888d,U+8910,U+891a,U+8bb4,U+8be3,U+8bec,U+8bf2,U+8c06,U+8c0d,U+8d31,U+8d48,U+8de4,U+8e1e,U+8e4a,U+8e66,U+8f84,U+8f97,U+9083,U+90e1,U+9165,U+91c9,U+94b0,U+94f5,U+9504,U+9532,U+956d,U+95f5,U+95fa,U+9668,U+9698,U+96bd,U+9704,U+9773,U+9890,U+996a,U+997a,U+9a74,U+9a8b,U+9cc4,U+9ccc", + }, + }, + { + uri: _160, + descriptors: { + unicodeRange: + "U+4ea8,U+4f1e,U+4f51,U+4f63,U+4f7c,U+4f83,U+4fa0,U+4fd1,U+4ffa,U+5018,U+5026,U+508d,U+50bb,U+50f5,U+50fb,U+5162,U+5319,U+5320,U+538c,U+5413,U+541f,U+5475,U+54bd,U+54d1,U+5589,U+5598,U+575f,U+57ae,U+57e0,U+5937,U+5974,U+5978,U+59ae,U+5a1f,U+5a49,U+5ab3,U+5b99,U+5b9b,U+5ba0,U+5be1,U+5be5,U+5c09,U+5c27,U+5de2,U+5e9a,U+5f26,U+5f8a,U+5f98,U+6021,U+606d,U+60bc,U+60d5,U+60e7,U+611a,U+614c,U+6254,U+626f,U+6292,U+6296,U+62b9,U+62e2,U+631a,U+631d,U+6320,U+6346,U+63ba,U+6467,U+64bc,U+658b,U+663c,U+6643,U+6652,U+6656,U+6687,U+66d9,U+66dd,U+66f0,U+673d,U+67ab,U+6816-6817,U+68a7,U+68ad,U+68cd,U+68e0,U+6986,U+69fd,U+6b47,U+6bd7,U+6c1f,U+6c2e-6c2f,U+6cbe,U+6de4,U+6e1d,U+6e83,U+6e9c,U+6ed4-6ed5,U+6f4d,U+70f9,U+7130,U+716e,U+718f,U+71ac,U+71e5,U+72fc,U+731c,U+7334,U+73ca,U+7422,U+7426,U+745f,U+7470,U+75af,U+75f4,U+762b,U+763e,U+7696,U+7737,U+7741,U+77a7,U+77bb,U+77ee,U+785d,U+788c,U+78ca,U+7901,U+796d,U+7985,U+79fd,U+7a3c,U+7a57,U+7a74,U+7b5b,U+7caa,U+7cb9,U+7cd5,U+7eac,U+7eb6,U+7ed1,U+7ee5,U+7f20,U+7f2a,U+7f38,U+7f69,U+7fa1,U+8018,U+8038,U+803f,U+804b,U+80a2,U+80be,U+80d6,U+817a,U+81fb,U+820c,U+82ad,U+82af,U+82bd,U+8327,U+8354,U+835f,U+8367,U+836b,U+840c,U+841d,U+8471,U+849c,U+84b2,U+84c9,U+8517,U+851a,U+8549,U+8681,U+8721,U+8776,U+88d9,U+88f9,U+89c5,U+8c1c,U+8c34,U+8d81,U+8d9f,U+8e0a,U+8e72,U+8eb2,U+8fed,U+901b,U+902e,U+906e,U+9091,U+90aa,U+90af,U+915d,U+9171,U+946b,U+9489,U+9499,U+94a5,U+9508,U+9524,U+952d,U+9551,U+9576,U+95f7,U+9600,U+96b6,U+96c0,U+9756,U+97f6,U+98a0,U+98a4,U+997f,U+9a73,U+9a86,U+9ad3,U+9e3d,U+9ed4", + }, + }, + { + uri: _161, + descriptors: { + unicodeRange: + "U+4e4d,U+4e5e,U+4ec7,U+4ed5,U+50da,U+50e7,U+515c,U+51a4,U+51ff,U+5203,U+5254,U+5300,U+533e,U+5375,U+53ee,U+5435,U+543b,U+5455,U+548b,U+548f,U+54d7,U+54fa,U+5578,U+5587,U+55a7,U+560e,U+5760,U+576f,U+5777,U+5830,U+58a9,U+5962,U+59e8,U+5a07,U+5a23,U+5a3c,U+5b5a,U+5bb5,U+5bc5,U+5bde,U+5c7f,U+5cb1,U+5ce8,U+5cea,U+5d29,U+5d4c,U+5e18,U+5f57,U+5f5d,U+5f87,U+5ff1,U+6016,U+601c,U+6064,U+6177,U+61d2,U+625b,U+62e3,U+62f1,U+634f,U+63a0,U+6401,U+6405,U+6495,U+64c2,U+6512,U+6577,U+6590,U+65a7,U+65a9,U+65f7,U+6627,U+6655,U+6714,U+6795,U+67d1,U+67ff,U+68b3,U+68d5,U+68d8,U+6930,U+6960,U+6977,U+69bb,U+69d0,U+6a31,U+6b7c,U+6bb4,U+6c22,U+6c72,U+6c79,U+6c7e,U+6c81,U+6c93,U+6ca5,U+6cbc,U+6ce3,U+6cfb,U+6d3c,U+6da9,U+6df3,U+6e2d,U+6eaf,U+6ec7,U+6f13,U+6f33,U+6f62,U+6fa1,U+7011,U+707c,U+708a,U+70c1,U+70d8,U+70eb,U+711a,U+7194,U+7281,U+7316,U+7357,U+7384,U+7405,U+742a,U+745b,U+7574,U+7578,U+75ea,U+7682,U+7792,U+77d7,U+77e9,U+77eb,U+77f6,U+780c,U+78c5,U+7941,U+79e4,U+7a1a,U+7a9c,U+7ad6,U+7b5d,U+7bf7,U+7c07,U+7c3f,U+7c9f,U+7ca5,U+7cdf,U+7e82,U+7eab,U+7ece,U+7eda,U+7f09,U+7f15,U+7f9e,U+7fdf,U+7fe9,U+803b,U+803d,U+80aa,U+80b4,U+813e,U+8155,U+817b,U+819d,U+821c,U+82b9,U+82df,U+82ef,U+8304,U+83b9,U+8446,U+853d,U+85af,U+85fb,U+8650,U+865e,U+86d9,U+86ee,U+8700,U+8862,U+889c,U+88d4,U+88f8,U+895f,U+8a79,U+8bb3,U+8bb6,U+8bc0,U+8beb,U+8bf5,U+8c23,U+8c79,U+8d1e,U+8dcb,U+8e29,U+8e44,U+8e81,U+8eac,U+8eaf,U+8f8d,U+9050,U+90f8,U+914b,U+948a,U+94be,U+94ee,U+950c,U+9540,U+962e,U+9647,U+9661,U+9699,U+96cf,U+9716,U+9761,U+97a0,U+97e7,U+9a7c,U+9a8f,U+9ae6,U+9cd6,U+9e26", + }, + }, + { + uri: _162, + descriptors: { + unicodeRange: + "U+4fa3,U+4fae,U+4fd8,U+4fef,U+50a3,U+5189,U+5195,U+51db,U+51f3,U+51f9,U+5220,U+5228,U+5288,U+52ff,U+532e,U+533f,U+5351,U+53db,U+53ed,U+5450,U+5484,U+5490,U+54c9,U+54e9,U+5501,U+5507,U+5543,U+55d3,U+56a3,U+575e,U+589f,U+5984,U+59ec,U+5a04,U+5a36,U+5a77,U+5a9a-5a9b,U+5ab2,U+5ac2,U+5ad6,U+5bc7,U+5c2c,U+5c34,U+5c51,U+5cd9,U+5d0e,U+5deb,U+5e3c,U+5e87,U+5ed3,U+5f13,U+5f64,U+5fe1,U+606a,U+6096,U+60df,U+60f6,U+60f9,U+6151,U+620e,U+6241,U+6252,U+6273,U+627c,U+6289,U+62c2,U+62cc,U+62ef,U+6361,U+6363,U+63b7,U+63e3,U+6518,U+66ae,U+6756,U+6789,U+6813,U+6829,U+6862,U+6866,U+6893,U+6897,U+690e,U+6984,U+69cc,U+6a1f,U+6a44,U+6a59,U+6ba1,U+6c13,U+6c90,U+6ca6,U+6cbd,U+6ccc,U+6cd3,U+6cd7,U+6d4a,U+6d4f,U+6d5a,U+6d9f,U+6da1,U+6dcc,U+6ea5,U+6ee4,U+6ee6,U+6f2f,U+6f8e,U+701a,U+7095,U+709c,U+70af,U+70db,U+70e8,U+714e,U+715e,U+71a0,U+71ce,U+7235,U+7280,U+72d0,U+72f8,U+73ab,U+7410,U+745c,U+7480,U+74a7-74a8,U+74e3,U+75ae,U+75f9,U+76b1,U+76ce,U+7736,U+77e2-77e3,U+781a,U+789f,U+797a,U+79be,U+79c3,U+79c6,U+79f8,U+7a8d,U+7a98,U+7aa6,U+7aff,U+7b1b,U+7cd9,U+7d6e,U+7ede,U+7eee,U+7f00,U+7f24,U+7f2d,U+7fd8,U+800d,U+8116,U+8151,U+81b3,U+8205,U+82c7,U+82db,U+832c,U+8335,U+8339,U+8386,U+846b,U+8587,U+8611,U+8682,U+868a,U+868c,U+8774,U+88d8,U+88f4,U+8912,U+8b6c,U+8bbd,U+8c0e,U+8c41,U+8d26,U+8d3b-8d3c,U+8d50,U+8dea,U+8e35,U+8f99,U+8fe2,U+8fe9,U+9017,U+914c,U+916f,U+9175-9176,U+918b,U+94a0,U+94ae,U+94ce,U+94f2,U+951a,U+952f,U+9541,U+9640,U+9672,U+968b,U+96cd,U+96ef,U+9713,U+97ec,U+9885,U+9992,U+9a6d,U+9a79,U+9a85,U+9cbb,U+9cd7,U+9cde,U+9e93,U+9f9f", + }, + }, + { + uri: _163, + descriptors: { + unicodeRange: + "U+4e11,U+4ed7,U+4fcf,U+4fe9,U+4fed,U+50ac,U+50b2,U+5112,U+5180,U+5188,U+51f6,U+522e,U+5265,U+52cb,U+52df,U+5349,U+5367,U+5378,U+537f,U+5395,U+5398,U+53d4,U+543e,U+5440,U+5446,U+54b8,U+5565-5566,U+5580,U+55bb,U+56ca,U+572d,U+573e,U+574e,U+5782-5784,U+58f3,U+5938-5939,U+5948,U+594e,U+5a1c,U+5a74,U+5ae9,U+5b55,U+5b5c,U+5bb0,U+5bd3,U+5bf8,U+5c3f,U+5d14,U+5d2d,U+5df7,U+5dfe,U+5e05-5e06,U+5e1c,U+5e62,U+5e7b,U+5e7d,U+5ed6,U+5f2f,U+5f66,U+5f6c,U+5fa1,U+604b,U+609f,U+60a6,U+60e8,U+6101,U+6124,U+6127,U+6148,U+61be,U+6247,U+62d8,U+62da,U+633d,U+635e,U+6367,U+6380,U+638f,U+63a9,U+63fd,U+641c,U+64e6,U+655e,U+6572,U+6591,U+65a5,U+6691,U+6735,U+67a2-67a3,U+67ef,U+680b,U+6876,U+6905,U+6a0a,U+6a61,U+6b79,U+6bb7,U+6bbf,U+6c41,U+6c55,U+6c83,U+6c9b,U+6ca7,U+6cfc,U+6d46,U+6d51,U+6d74,U+6d9d,U+6daf,U+6dc0,U+6deb,U+6e17,U+6e24,U+6e89,U+6ea2,U+6ef4,U+6f6d,U+707f,U+70b3,U+70e4,U+70ef,U+710a,U+722c,U+725f,U+7261,U+72ee,U+72f1,U+730e,U+732b,U+7433,U+7538,U+75bc,U+7624,U+7709,U+7750,U+7779,U+7802,U+7898,U+78a7,U+78b1,U+78cb,U+78f7,U+7984,U+7a83,U+7aed,U+7b3c,U+7b4b,U+7c92,U+7c98,U+7ca4,U+7eb9,U+7ee3,U+7ef3,U+7ef5,U+7f05,U+7f55,U+7f62,U+7fc1,U+7fd4,U+7fe0,U+8042,U+806a,U+80a0,U+80a4,U+80c3,U+8102,U+8106,U+814a,U+8154,U+8247,U+8258,U+82cd,U+8328,U+832b,U+8389,U+83ca,U+845b,U+846c,U+84b8,U+8574,U+859b,U+8680,U+8695,U+86c7,U+8702,U+886c,U+8896,U+88b1,U+88e4,U+8bc8,U+8c10,U+8c26,U+8c28,U+8c2d,U+8d4c,U+8d63,U+8f67,U+8f74,U+8fc4,U+9006,U+9063,U+90a2,U+90b1,U+90c1,U+9177,U+9189,U+9493,U+949e,U+94fe,U+9610,U+961c,U+96a7,U+96fe,U+978d,U+97f5,U+9888,U+997c,U+9a84,U+9b3c,U+9b44-9b45,U+9b54,U+9e64,U+9f0e,U+9f9a", + }, + }, + { + uri: _164, + descriptors: { + unicodeRange: + "U+4e19,U+4e38,U+4e53,U+4e7e,U+4e9f,U+4ec6,U+4f50,U+4fde,U+502a,U+5154,U+517d,U+51d1,U+51f0,U+5239,U+5256,U+52c9,U+52fe,U+5308,U+532a,U+535c,U+5384,U+53a2,U+53a8,U+53c9,U+53e0,U+5496,U+54ac,U+54c0,U+54c4,U+54e8,U+5561,U+5582,U+561b,U+5631,U+566a,U+5764,U+576a,U+5792,U+57ab,U+584c,U+5885,U+58f6,U+59a8,U+5acc,U+5bc2,U+5c38-5c39,U+5c60,U+5c6f,U+5c82,U+5c90,U+5d16,U+5dcd,U+5e37,U+5e90,U+5eb8,U+5f6a,U+5fcc,U+6012,U+6068,U+6073,U+607c,U+6094,U+6109,U+621a,U+626e,U+6284,U+62d0,U+62e6,U+62fe,U+6321,U+6328,U+632b,U+6349,U+6454,U+65ed,U+660f,U+6674,U+66a8,U+6749,U+674f,U+6760,U+67af,U+6850,U+6854,U+6869,U+68a8,U+68d2,U+68f5,U+6912,U+6b49,U+6b6a,U+6bef,U+6c28,U+6c5d,U+6c82,U+6cab,U+6cb8,U+6cc4,U+6cf5,U+6d47,U+6d78,U+6da4,U+6dc4,U+6dcb,U+6df9,U+6e0a,U+6e23,U+6e5b,U+6eb6,U+6f06,U+6f47,U+6f84,U+6f9c,U+6fd2,U+7076,U+70ac,U+7199,U+723d,U+72ac,U+72ed,U+7476,U+7529,U+752b,U+754f,U+7554,U+75d5,U+7626,U+76ef,U+7720,U+7766,U+7784,U+77ac,U+780d,U+7838,U+7845,U+786b,U+78b3,U+7978,U+79b9,U+79c9,U+79e7,U+7a3d,U+7a84,U+7a9f,U+7b0b,U+7b52,U+7c7d,U+7f1a,U+7fc5,U+7ff0,U+804a,U+8086-8087,U+808c,U+809a,U+80ba,U+810a,U+8180,U+818f,U+81c2,U+81ed,U+8231,U+8292,U+829c,U+82a6,U+82d1,U+8346,U+838e,U+839e,U+83c7,U+83f1,U+8403,U+840e,U+8513,U+857e,U+85e4,U+867e,U+871c,U+87ba,U+87f9,U+884d,U+8944,U+8a93,U+8c05,U+8d2c,U+8d2e,U+8d42-8d43,U+8dfb,U+8e22,U+8eba,U+8f69,U+8f9c,U+8fa3,U+8fa8,U+8fb1,U+900a,U+9038,U+903b,U+9042,U+904f,U+90b5,U+90dd,U+9102,U+9187,U+94a7,U+94c5,U+9523,U+95f8,U+95fd,U+960e,U+964b-964c,U+96c1,U+9709,U+971c,U+97ad,U+9882,U+9965,U+9976,U+9988,U+99a8,U+9a82,U+9a9a,U+9b41,U+9c8d,U+9e45,U+9e70,U+9e9f,U+9f3b,U+9f7f", + }, + }, + { + uri: _165, + descriptors: { + unicodeRange: + "U+4e08,U+4e18,U+4e1b,U+4e22,U+4e27,U+4e32,U+4e52,U+4e73,U+4ead,U+4ed4,U+4ed9,U+4ef0,U+4fa6,U+5076,U+5179,U+51bb,U+51c9,U+51ef,U+51fd,U+524a,U+526a,U+529d,U+52ab,U+5306,U+5339,U+53d9,U+540a,U+5410,U+541e,U+5439,U+54b1,U+54ed,U+5564,U+558a,U+55b7,U+5634,U+574a,U+5751,U+57a6,U+57cb,U+57d4,U+5824,U+582a,U+5835,U+5858,U+5893,U+58e4,U+5951,U+5986,U+59da,U+59fb,U+59ff,U+5a03,U+5a46,U+5ac1,U+5b5d,U+5bfa,U+5c18,U+5c3a,U+5c48,U+5c4f,U+5c61,U+5cb3,U+5d1b,U+5e15,U+5e3d,U+5e99,U+5e9e,U+5eca,U+5f0a,U+5f17-5f18,U+5f25,U+5f7c,U+5fcd,U+6028,U+60a0,U+60ac,U+60d1,U+614e,U+6155,U+6168,U+61c8,U+6208,U+6212,U+6251,U+629a-629b,U+62ab-62ac,U+62fc,U+6323,U+632a,U+63d2,U+643a,U+6491-6492,U+649e,U+64b0,U+64c5,U+659c,U+6614,U+662d,U+6664,U+6670,U+6676,U+6746,U+67cf,U+67d4,U+682a,U+6843,U+6846,U+68da,U+6b3a,U+6b67,U+6c27,U+6c5b,U+6c64,U+6c70,U+6caa,U+6cca,U+6ce1,U+6d12,U+6d45,U+6dd1,U+6dd8,U+6e34,U+6e7f,U+6ee5,U+6f02,U+7092,U+70c2,U+70e6,U+7115,U+7237,U+7272,U+727a,U+72c2,U+739b,U+73b2,U+743c,U+751c,U+758f,U+75b2,U+7686,U+76c6,U+76d2,U+76fc,U+775b,U+77a9,U+7816,U+788e,U+7897,U+78b0,U+79bd,U+7a0d,U+7a91,U+7a9d,U+7ae3,U+7bad,U+7cca,U+7d2b,U+7eb1,U+7f06,U+7f14,U+7f1d,U+7f50,U+7ffc,U+8036,U+80bf,U+80c1,U+80ce,U+80f8,U+8109,U+810f,U+8170,U+8179,U+819c,U+821f,U+8230,U+8236,U+8273,U+829d,U+82f9,U+8305,U+8350,U+83b2,U+83cc,U+8404,U+840d,U+8427,U+8482,U+8679,U+8854,U+886b,U+8bbc,U+8be6,U+8c31,U+8c6b,U+8d4b,U+8dcc,U+8e2a,U+8e48,U+8f90,U+8fb0,U+9022,U+903c,U+903e,U+9065,U+916c,U+917f,U+94a9,U+94c3,U+94dd,U+94ed,U+9510,U+953b,U+96c7,U+970d,U+9738,U+9877,U+987d,U+989c,U+98d8,U+9a70,U+9a91,U+9aa4,U+9b42,U+9b4f,U+9e2d,U+9e3f,U+9e7f,U+9f20", + }, + }, + { + uri: _166, + descriptors: { + unicodeRange: + "U+4e59,U+4ed3,U+4f0f,U+4f38,U+4f69,U+4fa7,U+4faf,U+4ff1,U+5077,U+5085,U+5144,U+5151,U+51af,U+51b6,U+51cc,U+523a,U+5251,U+5269,U+5272,U+52d8,U+5353,U+5389,U+53f9,U+5401,U+5415,U+541b,U+54f2,U+5524,U+554a,U+559d,U+5609,U+5740,U+575d,U+5806,U+5821,U+586b,U+5915,U+594f,U+5960,U+5999,U+59a5,U+59b9,U+59c6,U+59d1,U+59dc,U+5b5f,U+5b64,U+5b87,U+5bb4,U+5bbf,U+5c16,U+5c1d,U+5c3e,U+5c9a,U+5ca9,U+5cad,U+5cfb,U+5de1,U+5de7,U+5de9,U+5ef7,U+5f04,U+5f70,U+5f79,U+5fc6,U+602a,U+6050,U+6052,U+6070,U+6084,U+60b2,U+60dc,U+60e9,U+6167,U+6170,U+61c2,U+6270,U+6291,U+62b1,U+62bc,U+62dc,U+62df,U+62f3,U+6324,U+633a,U+6377,U+6398,U+63cf,U+640f,U+642c-642d,U+6458,U+6478,U+6500,U+654c,U+6566,U+658c,U+65c1,U+65cb,U+65e8,U+65ec,U+6696-6697,U+6734,U+679a,U+679d,U+67dc,U+67f3-67f4,U+680f,U+683d,U+684c,U+68af,U+699c,U+6bc1,U+6c0f,U+6c1b,U+6c57,U+6c6a,U+6d3d,U+6d6e,U+6d82,U+6db5,U+6dee,U+6e58,U+6eaa,U+6ecb,U+6ede,U+6ee9,U+6f0f,U+6f20,U+6f58,U+704c,U+7070,U+70b8,U+718a,U+7238,U+7262,U+7275,U+72b9,U+72d7,U+72e0,U+741b,U+7434,U+7483,U+74f6-74f7,U+75ab,U+764c,U+7761,U+7855,U+7891,U+78c1,U+79d2,U+7a00,U+7a3b,U+7c97,U+7ea4,U+7eb2,U+7ed2,U+7eea,U+7ef8,U+7f18,U+7fbd,U+8000,U+8010,U+8096,U+809d,U+80a9,U+817f,U+81e3,U+8206,U+8212,U+82ac,U+8302,U+8361,U+8377,U+83f2,U+8461,U+848b,U+84ec,U+8521,U+85aa,U+8870,U+8877,U+8881,U+888b,U+88ad,U+88c2,U+8986,U+8bd1,U+8bf1,U+8d24,U+8d2a,U+8d3e-8d3f,U+8d41,U+8d56,U+8d64,U+8d6b,U+8e0f,U+8f70,U+8f85,U+8f88,U+8fa9,U+9003,U+901d,U+90b9,U+90ce,U+94a6,U+94f8,U+9505,U+95ea,U+95ef,U+95f2,U+95f9,U+9601,U+9605,U+9634,U+966a,U+9677,U+9690,U+9694,U+96d5,U+971e,U+9896-9897,U+9972,U+9a71,U+9a76,U+9a7e,U+9e1f,U+9e23", + }, + }, + { + uri: _167, + descriptors: { + unicodeRange: + "U+4e01,U+4e43,U+4ea6,U+4ef2,U+4eff,U+4f26,U+4f2a,U+4f2f,U+4f5b,U+4fa8,U+4fca,U+4fd7,U+5021,U+504f,U+5141,U+51c0,U+51dd,U+51e4,U+51ed,U+5200,U+5237,U+5427,U+5448,U+54a8,U+5706,U+5708,U+5723,U+575b,U+57c3,U+5899,U+58a8,U+58c1,U+5976,U+5988,U+59bb,U+59d0,U+59d3,U+5a18,U+5a31,U+5a92,U+5b54,U+5b85,U+5baa-5bab,U+5bc4,U+5bd2,U+5be8,U+5bff,U+5c65,U+5d07,U+5e1d,U+5e78,U+5e7c,U+5f03,U+5f1f,U+5f39,U+5f6d,U+5f92,U+5faa,U+5fbd,U+5fe7,U+5ffd,U+60a8,U+60ef,U+6108,U+6162,U+622a,U+6234,U+626b,U+626d,U+62c6,U+62d2,U+62d4,U+62d6,U+62e8,U+6316,U+6355,U+63ed,U+6447,U+64a4,U+65f1,U+6606,U+6628,U+664b,U+6668,U+6682,U+66f9,U+66fc,U+66ff,U+6717,U+6740,U+676d,U+67aa,U+67ec,U+67f1,U+6842,U+6851,U+695a,U+6982,U+6a2a,U+6b20,U+6b23,U+6b32,U+6b96,U+6bc5,U+6beb,U+6c60,U+6c9f,U+6cea,U+6cf3,U+6d1e,U+6d53,U+6d66,U+6d69,U+6d8c,U+6d9b,U+6db2,U+6de1,U+6dfb,U+6e14,U+6ed1,U+6eda,U+6ee8,U+6f2b,U+706d,U+7089,U+708e,U+70ad-70ae,U+70e7,U+7126,U+714c,U+71c3,U+71d5,U+7206,U+7259,U+731b,U+73a9,U+73bb,U+74dc,U+7532,U+7545,U+755c,U+75c7,U+7687,U+76d7,U+76f2,U+788d,U+78e8,U+79e6,U+79e9,U+7a3f,U+7a46,U+7a97,U+7af9,U+7bee,U+7c4d,U+7c89,U+7cd6,U+7eb5,U+7ebd,U+7ed8,U+8017,U+8033,U+80c0,U+80de,U+80f6,U+8138,U+817e,U+81a8,U+820d,U+827e,U+82b3,U+82d7,U+83b1,U+84c4,U+84dd,U+8584,U+864e,U+865a,U+866b,U+86cb,U+88d5,U+89e6,U+8bca,U+8bde,U+8bfa,U+8c0a,U+8c37,U+8c46,U+8c6a,U+8c8c,U+8d1d,U+8d29,U+8d4f,U+8d54,U+8d5a,U+8d60,U+8d62,U+8f7f,U+8f96,U+8f9e-8f9f,U+8fc1,U+8fdf,U+8fea,U+8ff7,U+9012,U+906d,U+9075,U+90a6,U+90bb,U+90ca,U+9178,U+9192,U+91ca,U+94bb,U+94dc,U+94fa,U+9501,U+950b,U+9521,U+955c,U+963b,U+9655,U+9675-9676,U+9887,U+9891,U+9971,U+9a97,U+9ece,U+9ed8", + }, + }, + { + uri: _168, + descriptors: { + unicodeRange: + "U+4e1d,U+4e39,U+4e4c,U+4e4f,U+4e54,U+4e58,U+4e95,U+4ea1,U+4eab,U+4eae,U+4ec1,U+4f10,U+4f19,U+4f30,U+4f34,U+4fb5,U+503e,U+518c,U+5192,U+51a0,U+51ac,U+51b0,U+51e1,U+5211,U+5242,U+52a3,U+52b2,U+52c3,U+52c7,U+52d2,U+52e4,U+5377,U+539a,U+53a6,U+53e5,U+5417,U+5510,U+552f,U+5531,U+574f-5750,U+5761,U+5851,U+5854,U+58ee,U+593a,U+5949,U+5954,U+5a5a,U+5b8b,U+5bbd,U+5c04,U+5c0a,U+5c4b,U+5ce1,U+5cf0,U+5e10,U+5e8a,U+5e9f,U+5ec9,U+5f31,U+5f84,U+5fd8-5fd9,U+5fe0,U+6015,U+6062,U+6069,U+6076,U+6089,U+60a3,U+60ca,U+620f,U+624e,U+6263,U+6298,U+62a2,U+62bd,U+6311,U+6350,U+6389,U+638c,U+63f4,U+6446,U+644a,U+6469,U+64cd,U+654f,U+6562,U+656c,U+65d7,U+65e6,U+65fa,U+660c,U+6653,U+66b4,U+670b,U+672b,U+676f-6770,U+6881,U+6885,U+68a6,U+68cb,U+68ee,U+6b8a,U+6c88-6c89,U+6cc9,U+6ce5,U+6d01,U+6d17,U+6d1b,U+6d59,U+6d6a,U+6da8,U+6df7,U+6e10,U+6e20-6e21,U+6f5c,U+706f,U+70bc,U+719f,U+7267,U+732a,U+73cd,U+7518,U+756a,U+7586,U+7591,U+75db,U+76c8,U+76d0,U+76d6,U+76d8,U+76df,U+76fe,U+77db,U+7801,U+786c,U+795d,U+7965,U+79cb,U+7a77,U+7a7f,U+7aef,U+7b11,U+7bb1,U+7bc7,U+7ea0,U+7eaf,U+7ed5,U+7edc,U+7f13,U+7f29,U+7f34,U+7f8a,U+7ffb,U+8015,U+8058,U+805a,U+8083,U+80af,U+80c6,U+80cc,U+811a,U+8150,U+82e5,U+8336,U+8352,U+83ab,U+8428,U+8463,U+852c,U+8861,U+89c8,U+8bcd,U+8bd7,U+8bda,U+8be2,U+8bef,U+8bf8,U+8c0b,U+8c13,U+8d34,U+8d3a,U+8d74,U+8d76,U+8da3,U+8dd1,U+8ddd,U+8ddf,U+8df3,U+8f68,U+8f6f,U+8f7d,U+8f91,U+8f9b,U+8fbd,U+8fc8,U+8fd4,U+8feb,U+8ff9,U+900f,U+9057,U+907f-9080,U+90d1,U+90ed,U+91ce,U+9519,U+9526,U+95ed,U+9614,U+9635,U+9644,U+9686,U+96c5,U+96ea,U+9707,U+9732,U+9759,U+978b,U+9876,U+9881,U+9910,U+996e,U+9970,U+9c81,U+9e21,U+9ebb,U+9f84", + }, + }, + { + uri: _169, + descriptors: { + unicodeRange: + "U+4e3d,U+4e4e,U+4e71,U+4e8f,U+4ed8,U+4eea,U+4f0a,U+4f0d,U+4f11,U+4f1f,U+4f24,U+4f3c,U+4f73,U+4fc4,U+500d,U+5012,U+501f,U+503a,U+505c,U+507f,U+50a8,U+514d,U+5178,U+517c,U+51b2,U+51b7,U+520a,U+5238,U+523b,U+52b1,U+535a,U+5371,U+5385,U+53eb-53ec,U+53f3,U+53f6,U+5409,U+542b,U+542f,U+5434,U+5462,U+5473,U+547c,U+54c8,U+54ea,U+56fa,U+5733,U+5757,U+5766,U+5802,U+585e,U+590f,U+591c,U+591f,U+5947,U+594b,U+5987,U+5a01,U+5b59,U+5b63,U+5b88,U+5b97,U+5b9c,U+5bbe,U+5bfb,U+5c01,U+5c1a,U+5c24,U+5c3c,U+5c97,U+5c9b,U+5cb8,U+5de6,U+5e01,U+5e2e,U+5e45,U+5e55,U+5e84,U+5ef6,U+5f02,U+5f52,U+5f69,U+5f7b,U+5f90,U+5fae,U+6000,U+600e,U+6025,U+60e0,U+6276,U+6297,U+62b5,U+62cd,U+62d3,U+62e5,U+62e9,U+62ff,U+6302,U+632f,U+63e1,U+6444,U+64ad,U+653b,U+6551,U+6563,U+65a4,U+65e7,U+6620,U+667a,U+66f2,U+671d,U+6731,U+6742,U+675f,U+6768,U+677e-677f,U+6790,U+67b6,U+67d3,U+6863,U+68b0,U+68c9,U+690d,U+6b8b,U+6bcd,U+6bd2,U+6bd5,U+6c38,U+6c61,U+6cbf,U+6cdb,U+6cf0,U+6d2a,U+6d89,U+6da6,U+6f6e,U+6fb3,U+7075,U+707e,U+70df,U+7164,U+7236,U+725b,U+7389,U+73e0,U+745e,U+74e6,U+751a,U+7537,U+75be,U+76ae,U+76db,U+793c,U+7956,U+7981,U+79d8,U+79df,U+79fb,U+7adf,U+7ae5,U+7b14,U+7b26,U+7b54,U+7b79,U+7d2f,U+7eb8,U+7eba,U+7ec6,U+7ee9,U+7eff,U+7f5a,U+7f6a,U+7f72,U+8089,U+80a5,U+80e1,U+8111,U+8131,U+821e,U+822c,U+8270,U+8499,U+8651,U+867d,U+8840,U+8857,U+8863,U+88c1,U+89c9,U+89d2,U+8a89,U+8bed,U+8bfe,U+8c01,U+8c22,U+8d21,U+8d25,U+8d2f,U+8d5e,U+8d75,U+8d8b,U+8dc3,U+8de8,U+8df5,U+8f6e,U+8f86,U+8f89,U+8fc5,U+8ff0,U+8ffd,U+9014,U+904d,U+90ae,U+9274,U+949f,U+952e,U+969c,U+96c4,U+96e8,U+96f6-96f7,U+97e9,U+987f,U+996d,U+9a7b,U+9aa8,U+9c7c,U+9c9c,U+9e4f,U+9f13,U+9f50", + }, + }, + { + uri: _170, + descriptors: { + unicodeRange: + "U+4e13,U+4e16,U+4e1c,U+4e24,U+4e3e,U+4e49,U+4e61,U+4e66,U+4e89,U+4e8c,U+4e94,U+4e9b,U+4ea4,U+4eac,U+4ebf,U+4eca,U+4ef6-4ef7,U+4efb,U+4f18,U+4f20,U+4f46,U+4f7f,U+4fe1,U+503c,U+505a,U+5146,U+5148,U+515a,U+5171,U+5177,U+519b,U+51b3,U+51c6,U+51e0,U+5212,U+521b,U+522b,U+529e,U+52bf,U+534e-534f,U+5355,U+5357,U+5382,U+539f,U+53bb,U+53bf,U+53c2,U+53c8,U+53ca,U+53d6-53d8,U+53e3,U+53ea,U+53f0,U+540d,U+5411,U+56db,U+56de,U+56e0,U+56e2,U+578b,U+57ce,U+57fa,U+589e,U+5904,U+5934,U+5982,U+5b89,U+5b8c,U+5bfc,U+5c06,U+5c11,U+5c40,U+5c71,U+5e38,U+5e72,U+5e76,U+5e7f,U+5e94,U+5e9c,U+5f0f,U+5f15,U+5f20,U+5f3a,U+5f62,U+5f88,U+5fc5,U+5fd7,U+5feb,U+601d,U+6027,U+60c5,U+60f3,U+610f,U+6216,U+6218,U+624b,U+624d,U+6279,U+628a,U+6295,U+6301,U+6307,U+636e,U+63a5,U+63a8,U+652f,U+6536,U+653e,U+6548,U+6559,U+6570,U+65bd,U+65e0,U+6602,U+660e,U+6613,U+66f4,U+6700,U+670d,U+671f,U+672f,U+6743,U+674e,U+6751,U+6761,U+6784,U+6797,U+679c,U+67e5,U+6807,U+6837,U+683c,U+6b21,U+6b63-6b65,U+6bcf,U+6bd4,U+6c42,U+6c5f,U+6ca1,U+6cbb,U+6d3b,U+6d41,U+6d88,U+6df1,U+70b9,U+7136,U+7269,U+7279,U+7531,U+754c,U+767e,U+76ca,U+76f8,U+770b,U+7740,U+7814,U+79ef,U+7a0b,U+7a0e,U+7a76,U+7b80,U+7cbe,U+7cfb,U+7e41,U+7ea7,U+7ec4,U+7ec7,U+7ed3,U+7ed9,U+7edf,U+7f8e,U+8001,U+804c,U+8054,U+80b2,U+81f3,U+8425,U+8868,U+88ab,U+897f,U+89c1-89c2,U+89c4,U+89c6,U+89e3,U+8ba1,U+8ba4,U+8bae,U+8bb0,U+8bba,U+8bc1,U+8c03,U+8d28,U+8d39,U+8def,U+8f66,U+8f6c,U+8fd0-8fd1,U+9020,U+9053,U+90a3,U+90fd,U+91cc,U+9500,U+9547,U+95e8,U+95f4,U+961f,U+9645,U+9662,U+96be,U+96c6,U+9700,U+9769,U+97e6,U+9875,U+9879,U+9886,U+9898,U+98ce,U+9996,U+2b5af,U+2cc56,U+2e9f5,U+30edd-30ede", + }, + }, + { + uri: _171, + descriptors: { + unicodeRange: + "U+4e03,U+4e30,U+4e34,U+4e45,U+4e60,U+4e70,U+4e88,U+4e91-4e92,U+4ea9,U+4eb2,U+4ec0,U+4ecb,U+4ecd,U+4ee4,U+4fee,U+5019,U+5047,U+50cf,U+5145,U+516d,U+5170,U+5175,U+5199,U+51cf,U+51fb,U+521a,U+5224,U+5267,U+52aa,U+5347-5348,U+534a,U+5356,U+5361,U+536b,U+5370,U+538b,U+53e4,U+53e6,U+5403,U+5426,U+5428,U+542c,U+5438,U+5668,U+56ed,U+56f4,U+56fe,U+57df,U+592a,U+5957,U+5b69,U+5b81,U+5b8f,U+5b98,U+5b9d,U+5ba1,U+5ba4,U+5bb3,U+5bc6,U+5bdf,U+5c3d,U+5c5e,U+5c81,U+5ddd,U+5de8,U+5dee,U+5e0c,U+5e86,U+5e8f,U+5e93,U+5e95,U+5e97,U+5ea7,U+5ead,U+5eb7,U+5f55,U+5f81,U+5f85,U+5ff5,U+6001,U+613f,U+6258,U+6267,U+6269,U+626c,U+627e,U+62db,U+62ec,U+6325,U+635f,U+6362,U+6388,U+6392,U+63a2,U+63a7,U+63aa,U+641e,U+6545,U+6597,U+65e2,U+65e9,U+661f,U+665a,U+666e-666f,U+66fe,U+6728,U+67d0,U+6811,U+6838,U+6865,U+697c,U+6b22,U+6b27,U+6b4c,U+6b62,U+6b66,U+6b7b,U+6bdb,U+6c47,U+6c49,U+6c7d,U+6c99,U+6cfd,U+6d0b,U+6d25,U+6d32,U+6d3e,U+6d4b,U+6e29,U+6e56,U+6e7e,U+6f14,U+6fc0,U+706b,U+70c8,U+7247,U+72af,U+72b6,U+72ec,U+732e,U+73ed,U+7403,U+7533,U+753b,U+7559,U+7565,U+7597,U+767b,U+773c,U+7763,U+77ed,U+77ff,U+7968,U+798f,U+79bb,U+79c0-79c1,U+7ad9,U+7ae0,U+7b51,U+7b7e,U+7cae,U+7d22,U+7ea2,U+7eb3,U+7eb7,U+7ec3,U+7ec8,U+7ecd,U+7edd,U+7efc,U+7f16,U+7f3a,U+7f51,U+7f57,U+7f6e,U+80dc,U+822a,U+8239,U+826f,U+82cf,U+82e6,U+8349,U+8363,U+83dc,U+8457,U+85cf,U+878d,U+8865,U+8a00,U+8b66,U+8ba2,U+8ba8,U+8bad,U+8bb2,U+8bc9,U+8bd5,U+8bfb,U+8d2b,U+8d35,U+8d37,U+8f7b,U+8f93,U+8fce,U+8fdd,U+9000-9002,U+9010,U+9047,U+9093,U+9152,U+9488,U+94a2,U+9633,U+9636,U+963f,U+9646,U+9648,U+964d,U+9664,U+9669,U+9760,U+97f3,U+987a,U+987e,U+9884,U+98de,U+9986,U+9ed1", + }, + }, + { + uri: _172, + descriptors: { + unicodeRange: + "U+4e14,U+4e25,U+4e48,U+4e50,U+4e5d,U+4e9a,U+4ec5,U+4efd,U+4f17,U+4f4e-4f4f,U+4f55,U+4f59,U+4f60,U+4f8b,U+4f9b,U+4f9d,U+4fbf,U+4fc3,U+5065,U+513f,U+5149,U+514b,U+516b,U+5174,U+517b,U+518d,U+51b5,U+5207,U+5217-5219,U+521d,U+526f,U+529f,U+52a9,U+52b3,U+5305,U+533b,U+5343,U+5360,U+5373-5374,U+5386,U+53cb-53cd,U+53f2,U+53f7,U+544a,U+5468,U+547d,U+54cd,U+552e,U+5584,U+56f0,U+571f,U+5747,U+575a,U+57f9,U+5883,U+58eb,U+58f0,U+5907,U+590d,U+592e,U+5931,U+5956,U+5965,U+5973,U+5979,U+59cb,U+5b57-5b58,U+5b83,U+5ba2-5ba3,U+5bb9,U+5bcc,U+5c42,U+5c45,U+5c4a,U+5dde,U+5df1,U+5df4,U+5e03,U+5e08,U+5e26,U+5e2d,U+5f71,U+5f80,U+5f8b,U+5fb7,U+606f,U+611f,U+6237,U+623f,U+6253,U+627f,U+6293,U+62a4,U+62c5,U+62c9,U+6309,U+6574,U+6599,U+65ad,U+65af,U+65c5,U+65cf,U+6625,U+663e,U+671b,U+672a,U+6750,U+6781,U+6821,U+6839,U+6848,U+68c0,U+6a21,U+6b3e,U+6bb5,U+6c14,U+6cb3,U+6cb9,U+6ce8,U+6e05,U+6e2f,U+6e38,U+6e90,U+6ee1,U+70ed,U+7167,U+7231,U+7248,U+724c,U+7387,U+738b,U+73af,U+7530,U+75c5,U+767d,U+76d1,U+76f4,U+771f,U+77e5,U+77f3,U+7834,U+7840,U+786e,U+793a,U+795e,U+79f0,U+7a33,U+7a7a,U+7a81,U+7ade,U+7b56,U+7b97,U+7c73,U+7c7b,U+7d20,U+7d27,U+7ea6,U+7eaa,U+7ebf,U+7ee7,U+7eed,U+7ef4,U+7fa4,U+8003,U+80a1,U+81f4,U+8272,U+827a,U+8282,U+82b1,U+82f1,U+8303,U+836f,U+83b7,U+843d,U+88c5,U+8ba9,U+8baf,U+8bb8,U+8bbf,U+8bc4,U+8bc6,U+8bdd,U+8be5,U+8bf7,U+8c08,U+8c61,U+8d1f,U+8d22-8d23,U+8d27,U+8d2d,U+8d38,U+8d5b,U+8d70,U+8d85,U+8d8a,U+8db3,U+8eab,U+8f83,U+8fb9,U+8fdc,U+8fde,U+9009,U+901f,U+914d,U+91c7,U+94b1,U+94c1,U+94f6,U+95fb,U+9632,U+9650,U+968f,U+9752,U+975e,U+987b,U+989d,U+98df,U+9999,U+9a6c,U+9a8c,U+9ec4,U+9feb-9fec", + }, + }, + { + uri: _173, + descriptors: { + unicodeRange: + "U+98fb-990c,U+990e-990f,U+9911-992d,U+992f-9953,U+9956-9962,U+9964,U+9966,U+9973,U+9978-9979,U+997b,U+997e,U+9982-9983,U+9989,U+998c,U+998e,U+999a-99a4,U+99a6-99a7,U+99a9-99c8", + }, + }, + { + uri: _174, + descriptors: { + unicodeRange: + "U+8e4c-8e50,U+8e53-8e58,U+8e5a-8e65,U+8e67-8e68,U+8e6a-8e6b,U+8e6e,U+8e71,U+8e73,U+8e75,U+8e77-8e7b,U+8e7d-8e7e,U+8e80,U+8e82-8e84,U+8e86,U+8e88-8e8e,U+8e91-8e93,U+8e95-8e9b,U+8e9d,U+8e9f-8eaa,U+8ead-8eae,U+8eb0-8eb1,U+8eb3-8eb9,U+8ebb-8ecd,U+8ecf-8f02", + }, + }, + { + uri: _175, + descriptors: { + unicodeRange: + "U+2e3a,U+3001-3002,U+3008-3011,U+3014-3017,U+301d-301f,U+4dae,U+4e00,U+4e07,U+4e09-4e0b,U+4e0d-4e0e,U+4e1a,U+4e2a,U+4e2d,U+4e3a-4e3b,U+4e4b,U+4e5f,U+4e86,U+4e8b,U+4e8e,U+4ea7,U+4eba,U+4ece,U+4ed1,U+4ed6,U+4ee3,U+4ee5,U+4eec,U+4f01,U+4f1a,U+4f4d,U+4f53,U+4f5c,U+4fdd,U+5143,U+5165,U+5168,U+516c,U+5173,U+5176,U+5185,U+519c,U+51fa,U+5206,U+5229,U+5230,U+5236,U+524d,U+529b,U+52a0-52a1,U+52a8,U+5316-5317,U+533a,U+5341,U+5362,U+53d1,U+53ef,U+53f8,U+5404,U+5408,U+540c,U+540e,U+5458,U+548c,U+54c1,U+54e5,U+5546,U+559c,U+56fd,U+5728,U+5730,U+573a,U+5916,U+591a,U+5927,U+5929,U+592b,U+597d,U+59d4,U+5b50,U+5b66,U+5b9a,U+5b9e,U+5bb6,U+5bf9,U+5c0f,U+5c14,U+5c31,U+5c55,U+5de5,U+5df2,U+5e02,U+5e73-5e74,U+5ea6,U+5efa,U+5f00,U+5f53,U+5f97,U+5fc3,U+603b,U+6210-6211,U+6240,U+6280,U+62a5,U+63d0,U+6539,U+653f,U+6587,U+65b0,U+65b9,U+65e5,U+65f6,U+662f,U+6708-6709,U+672c,U+673a,U+675c,U+6765,U+6c11,U+6c34,U+6cd5,U+6ce2,U+6d4e,U+6d77,U+73b0,U+7406,U+751f,U+7528,U+7535,U+7684,U+76ee,U+793e,U+79cd,U+79d1,U+7acb,U+7b2c,U+7b49,U+7ba1,U+7ecf,U+8005,U+800c,U+80fd,U+81ea,U+884c,U+8981,U+8bbe,U+8bf4,U+8d44,U+8d77,U+8fbe,U+8fc7,U+8fd8-8fd9,U+8fdb,U+901a,U+90e8,U+91cd,U+91cf,U+91d1,U+9485,U+957f,U+95ee,U+9762,U+9ad8,U+9ea6,U+9f99,U+9fcf,U+9fd4,U+9fed,U+fe10-fe19,U+fe30-fe31,U+fe33-fe44,U+ff01,U+ff0c,U+ff1f,U+2b4e7,U+2b7f7,U+2b7fc,U+2cb2d,U+2cb3b,U+2cb4a,U+2cb5b,U+2cb73", + }, + }, + { + uri: _176, + descriptors: { + unicodeRange: + "U+6490,U+6493-6494,U+6497-6498,U+649a-649d,U+649f-64a3,U+64a5-64a8,U+64aa-64ab,U+64af,U+64b1-64b4,U+64b6,U+64b9,U+64bb,U+64bd-64bf,U+64c1,U+64c3-64c4,U+64c6-64cc,U+64cf,U+64d1,U+64d3-64d6,U+64d9-64dd,U+64df-64e1,U+64e3,U+64e5,U+64e7-64ff,U+6501-6508,U+650a-6511,U+6513-6517,U+6519-6524,U+6526-652a,U+652c-652d,U+6530-6533,U+6537,U+653a,U+653c-653d,U+6540-6544,U+6546-6547,U+654a-654b,U+654d-654e,U+6550,U+6552-6554,U+6557-6558,U+655a,U+655c,U+655f-6561,U+6564-6565,U+6567-6568", + }, + }, + { + uri: _177, + descriptors: { + unicodeRange: + "U+9695-9696,U+969a-969b,U+969d-96a6,U+96a8-96af,U+96b1-96b2,U+96b4-96b5,U+96b7-96b8,U+96ba-96bb,U+96bf,U+96c2-96c3,U+96c8,U+96ca-96cb,U+96d0-96d1,U+96d3-96d4,U+96d6-96df,U+96e1-96e7,U+96eb-96ee,U+96f0-96f2,U+96f4-96f5,U+96f8,U+96fa-96fd,U+96ff,U+9702-9703,U+9705,U+970a-970c,U+9710-9712,U+9714-9715,U+9717-971b,U+971d,U+971f-9729,U+972b-972c,U+972e-972f,U+9731,U+9733-9737,U+973a-973d,U+973f-9751,U+9754-9755,U+9757-9758,U+975a,U+975c-975d,U+975f,U+9763-9764,U+9766-9768,U+976a-9770", + }, + }, + { + uri: _178, + descriptors: { + unicodeRange: + "U+6af0-6b1f,U+6b25-6b26,U+6b28-6b31,U+6b33-6b36,U+6b38,U+6b3b-6b3d,U+6b3f-6b42,U+6b44-6b45,U+6b48,U+6b4a-6b4b,U+6b4d-6b58,U+6b5a-6b61,U+6b68-6b69,U+6b6b-6b78,U+6b7a,U+6b7d-6b80,U+6b85,U+6b88,U+6b8c,U+6b8e-6b91,U+6b94-6b95,U+6b97-6b99,U+6b9c-6ba0,U+6ba2-6ba9,U+6bab-6bb2,U+6bb6,U+6bb8-6bba", + }, + }, + { + uri: _179, + descriptors: { + unicodeRange: + "U+430e-439a,U+29e8a,U+29ec4,U+29edb,U+29ee9,U+29f7e,U+29f83,U+29f8c,U+29fce,U+2a01a,U+2a02f,U+2a082,U+2a0f9,U+2a190,U+2a38c", + }, + }, + { + uri: _180, + descriptors: { unicodeRange: "U+92ef-933d,U+933f-9369,U+936b-9388" }, + }, + { + uri: _181, + descriptors: { + unicodeRange: + "U+4512-458d,U+2b300,U+2b363,U+2b36f,U+2b372,U+2b37d,U+2b404,U+2b410,U+2b413,U+2b461,U+2b4ef,U+2b4f6,U+2b4f9,U+2b50d-2b50e,U+2b536,U+2b5ae,U+2b5b3,U+2b5e7,U+2b5f4,U+2b61c-2b61d,U+2b626-2b628,U+2b62a,U+2b62c,U+2b695-2b696,U+2b6ad,U+2b6ed", + }, + }, + { + uri: _182, + descriptors: { + unicodeRange: + "U+88bd-88c0,U+88c3-88c4,U+88c7-88c8,U+88ca-88cd,U+88cf-88d1,U+88d3,U+88d6-88d7,U+88da-88de,U+88e0-88e1,U+88e6-88e7,U+88e9-88ef,U+88f2,U+88f5-88f7,U+88fa-88fb,U+88fd,U+88ff-8901,U+8903-8909,U+890b-890f,U+8911,U+8914-8918,U+891c-8920,U+8922-8924,U+8926-8929,U+892c-892f,U+8931-8933,U+8935,U+8937-8940,U+8942-8943,U+8945-895d,U+8960-8965,U+8967-897a,U+897c-897e,U+8980,U+8982,U+8984-8985", + }, + }, + { uri: _183, descriptors: { unicodeRange: "U+4b0b-4ba0" } }, + { + uri: _184, + descriptors: { + unicodeRange: + "U+7179,U+717b-717c,U+717e-7183,U+7185-7189,U+718b-718e,U+7190-7193,U+7195-7197,U+719a-719e,U+71a1-71a7,U+71a9-71ab,U+71ad-71b2,U+71b4,U+71b6-71b8,U+71ba-71c2,U+71c4-71cd,U+71cf-71d3,U+71d6-71df,U+71e1-71e4,U+71e6,U+71e8-71ed,U+71ef-71f8,U+71fa-7205,U+7207-721c,U+721e-7227,U+7229,U+722b,U+722d", + }, + }, + { + uri: _185, + descriptors: { + unicodeRange: + "U+982e-9874,U+988b,U+988e,U+9892,U+9895,U+9899,U+98a3,U+98a8-98cd,U+98cf-98d0,U+98d4,U+98d6-98d7,U+98db-98dd,U+98e0-98e6,U+98e9-98fa", + }, + }, + { + uri: _186, + descriptors: { + unicodeRange: + "U+7c14-7c15,U+7c17-7c1e,U+7c20-7c25,U+7c28-7c29,U+7c2b-7c37,U+7c39-7c3e,U+7c42-7c4c,U+7c4e-7c72,U+7c75-7c7a,U+7c7e-7c88,U+7c8a-7c90,U+7c93-7c94,U+7c96,U+7c99-7c9b,U+7ca0-7ca1,U+7ca3,U+7ca6-7ca9,U+7cab-7cad,U+7caf-7cb0,U+7cb4-7cb8,U+7cba-7cbb,U+7cbf-7cc0,U+7cc2-7cc4,U+7cc6,U+7cc9,U+7ccb,U+7cce-7cd4", + }, + }, + { + uri: _187, + descriptors: { unicodeRange: "U+7d95-7da5,U+7da7-7dad,U+7daf-7e2a" }, + }, + { uri: _188, descriptors: { unicodeRange: "U+4a78-4b0a" } }, + { + uri: _189, + descriptors: { + unicodeRange: + "U+9b30-9b31,U+9b33-9b3a,U+9b3d-9b40,U+9b46,U+9b4a-9b4c,U+9b4e,U+9b50,U+9b52-9b53,U+9b55-9bcf", + }, + }, + { + uri: _190, + descriptors: { + unicodeRange: + "U+6a4b-6a4f,U+6a51-6a57,U+6a5a,U+6a5c-6a60,U+6a62-6a64,U+6a66-6a70,U+6a72-6a78,U+6a7a-6a7b,U+6a7d-6a7f,U+6a81-6a83,U+6a85-6a8d,U+6a8f,U+6a92-6a96,U+6a98-6a9f,U+6aa1-6aa8,U+6aaa,U+6aad-6aef", + }, + }, + { uri: _191, descriptors: { unicodeRange: "U+99c9-9a53" } }, + { + uri: _192, + descriptors: { + unicodeRange: + "U+8550-8555,U+8557-8558,U+855a-855d,U+855f-8563,U+8565-8567,U+8569-8571,U+8573,U+8575-8578,U+857c-857d,U+857f-8583,U+8586,U+8588-858e,U+8590-859a,U+859d-85a3,U+85a5-85a7,U+85a9,U+85ab-85ad,U+85b1-85b6,U+85b8,U+85ba-85c0,U+85c2-85c8,U+85ca-85ce,U+85d1-85d2,U+85d4,U+85d6-85db,U+85dd-85e3,U+85e5-85e8,U+85ea-85fa,U+85fc-85fe,U+8600-8603", + }, + }, + { + uri: _193, + descriptors: { + unicodeRange: + "U+6fb2,U+6fb4-6fb5,U+6fb7-6fb8,U+6fba-6fbf,U+6fc1,U+6fc3-6fc8,U+6fca-6fd0,U+6fd3-6fdd,U+6fdf,U+6fe2-6fed,U+6ff0-7010,U+7012-7019,U+701c-7022,U+7024-7034,U+7036-7038,U+703a-704b,U+704d-704e,U+7050-7053", + }, + }, + { uri: _194, descriptors: { unicodeRange: "U+4ba1-4c2c" } }, + { + uri: _195, + descriptors: { + unicodeRange: + "U+9a54-9a6b,U+9a72,U+9a83,U+9a89,U+9a8d-9a8e,U+9a94-9a95,U+9a99,U+9aa6,U+9aa9-9aaf,U+9ab2-9ab5,U+9ab9,U+9abb,U+9abd-9abf,U+9ac3-9ac4,U+9ac6-9aca,U+9acd-9ad0,U+9ad2,U+9ad4-9ad7,U+9ad9-9ade,U+9ae0,U+9ae2-9ae5,U+9ae7-9aea,U+9aec,U+9aee,U+9af0-9af8,U+9afa,U+9afc-9b02,U+9b04-9b07,U+9b09-9b0e,U+9b10-9b12,U+9b14-9b1e,U+9b20-9b22,U+9b24-9b2e", + }, + }, + { uri: _196, descriptors: { unicodeRange: "U+9d1a-9da1" } }, + { + uri: _197, + descriptors: { + unicodeRange: + "U+9e13-9e1e,U+9e24,U+9e27,U+9e2e,U+9e30,U+9e34,U+9e3b-9e3c,U+9e40,U+9e4d,U+9e50,U+9e52-9e54,U+9e56,U+9e59,U+9e5d,U+9e5f-9e62,U+9e65,U+9e6e-9e6f,U+9e72,U+9e74-9e7d,U+9e80-9e81,U+9e83-9e86,U+9e89-9e8a,U+9e8c-9e91,U+9e94-9e9c,U+9e9e,U+9ea0-9ea5,U+9ea7-9eb3,U+9eb5-9eb7,U+9eb9-9eba,U+9ebc,U+9ebf-9ec3,U+9ec5-9ec8,U+9eca-9ecc,U+9ed0,U+9ed2-9ed3,U+9ed5-9ed7,U+9ed9-9eda,U+9ede,U+9ee1,U+9ee3-9ee4,U+9ee6,U+9ee8,U+9eeb-9eee,U+9ef0-9ef8", + }, + }, + { + uri: _198, + descriptors: { + unicodeRange: + "U+8b1c-8b25,U+8b27-8b65,U+8b67-8b6b,U+8b6d-8b9f,U+8bac,U+8bb1,U+8bbb,U+8bc7,U+8bd0", + }, + }, + { uri: _199, descriptors: { unicodeRange: "U+4cad-4d2f" } }, + { + uri: _200, + descriptors: { + unicodeRange: + "U+9c4b-9c7b,U+9c7d-9c7e,U+9c80,U+9c83-9c84,U+9c89-9c8a,U+9c8c,U+9c8f,U+9c93,U+9c96-9c99,U+9c9d,U+9caa,U+9cac,U+9caf,U+9cb9,U+9cbe-9cc2,U+9cc8-9cc9,U+9cd1-9cd2,U+9cda-9cdb,U+9ce0-9ce1,U+9ce3-9d19", + }, + }, + { + uri: _201, + descriptors: { + unicodeRange: "U+9389-938e,U+9390-93c9,U+93cb-93d5,U+93d7-9410", + }, + }, + { + uri: _202, + descriptors: { + unicodeRange: + "U+20a0-20b5,U+20b9-20ba,U+20bc-20bd,U+4e2c,U+5107,U+5216,U+5293,U+54f3,U+5523,U+5819,U+5adc,U+5c88,U+5e3b,U+5fee,U+62f6,U+63be,U+6484,U+6499,U+67d9,U+67dd,U+6d5e,U+6f46,U+717a,U+71e0,U+72c1,U+73e7,U+75b0,U+7603,U+7722,U+7809,U+7811,U+7946,U+7967,U+799a,U+7b45,U+7ba2,U+8014,U+80d9,U+8159,U+817d,U+81a3,U+81aa,U+8201,U+833c,U+836e,U+83e5,U+8459,U+84f0,U+8729,U+8753,U+87d3,U+89dc,U+8bf6,U+8c2e,U+8e2c,U+8e9c,U+8e9e,U+8ece,U+8fee,U+9139,U+914f,U+9174,U+9191,U+960c,U+9622,U+9a98,U+9b48,U+9ca6,U+9cb0,U+9da2-9e12,U+9e88,U+9f44,U+9f86", + }, + }, + { uri: _203, descriptors: { unicodeRange: "U+9bd0-9c4a" } }, + { uri: _204, descriptors: { unicodeRange: "U+4c2d-4cac" } }, + { uri: _205, descriptors: { unicodeRange: "U+4d30-4dab" } }, + { + uri: _206, + descriptors: { unicodeRange: "U+9411-943d,U+943f-946a,U+946c-9484" }, + }, + { + uri: _207, + descriptors: { + unicodeRange: + "U+9efa,U+9efd,U+9eff-9f0a,U+9f0c,U+9f0f,U+9f11-9f12,U+9f14-9f16,U+9f18,U+9f1a-9f1f,U+9f21,U+9f23-9f2b,U+9f2d-9f2e,U+9f30-9f36,U+9f38,U+9f3a,U+9f3c,U+9f3f-9f43,U+9f45-9f4f,U+9f52-9f7e,U+9f81-9f82,U+9f8d-9f94", + }, + }, + { + uri: _208, + descriptors: { + unicodeRange: + "U+7e2b-7e3a,U+7e3c-7e40,U+7e42-7e46,U+7e48-7e81,U+7e83-7e9a,U+7e9c-7e9e,U+7eae,U+7eb4,U+7ebb-7ebc,U+7ed6,U+7ee4,U+7eec,U+7ef9,U+7f0a,U+7f10,U+7f1e,U+7f37,U+7f39,U+7f3b", + }, + }, +]; diff --git a/packages/excalidraw/index.tsx b/packages/excalidraw/index.tsx index 2e34eb7a6d..239118443c 100644 --- a/packages/excalidraw/index.tsx +++ b/packages/excalidraw/index.tsx @@ -5,7 +5,7 @@ import { isShallowEqual } from "./utils"; import "./css/app.scss"; import "./css/styles.scss"; -import "./fonts/assets/fonts.css"; +import "./fonts/css/fonts.css"; import polyfill from "./polyfill"; import type { AppProps, ExcalidrawProps } from "./types"; diff --git a/packages/excalidraw/locales/en.json b/packages/excalidraw/locales/en.json index e4c5eea449..b6c9244f3a 100644 --- a/packages/excalidraw/locales/en.json +++ b/packages/excalidraw/locales/en.json @@ -490,6 +490,7 @@ "copyStyles": "Copied styles.", "copyToClipboard": "Copied to clipboard.", "copyToClipboardAsPng": "Copied {{exportSelection}} to clipboard as PNG\n({{exportColorScheme}})", + "copyToClipboardAsSvg": "Copied {{exportSelection}} to clipboard as SVG\n({{exportColorScheme}})", "fileSaved": "File saved.", "fileSavedToFilename": "Saved to {filename}", "canvas": "canvas", diff --git a/packages/excalidraw/package.json b/packages/excalidraw/package.json index 5d556c04f3..0f6f6b8a11 100644 --- a/packages/excalidraw/package.json +++ b/packages/excalidraw/package.json @@ -67,6 +67,7 @@ "canvas-roundrect-polyfill": "0.0.1", "clsx": "1.1.1", "cross-env": "7.0.3", + "es6-promise-pool": "2.5.0", "fractional-indexing": "3.2.0", "fuzzy": "0.1.3", "image-blob-reduce": "3.0.1", diff --git a/packages/excalidraw/scene/export.ts b/packages/excalidraw/scene/export.ts index 6d1b963fcc..fc6152bd5c 100644 --- a/packages/excalidraw/scene/export.ts +++ b/packages/excalidraw/scene/export.ts @@ -9,7 +9,14 @@ import type { import type { Bounds } from "../element/bounds"; import { getCommonBounds, getElementAbsoluteCoords } from "../element/bounds"; import { renderSceneToSvg } from "../renderer/staticSvgScene"; -import { arrayToMap, distance, getFontString, toBrandedType } from "../utils"; +import { + arrayToMap, + distance, + getFontString, + PromisePool, + promiseTry, + toBrandedType, +} from "../utils"; import type { AppState, BinaryFiles } from "../types"; import { DEFAULT_EXPORT_PADDING, @@ -18,6 +25,9 @@ import { SVG_NS, THEME, THEME_FILTER, + FONT_FAMILY_FALLBACKS, + getFontFamilyFallbacks, + CJK_HAND_DRAWN_FALLBACK_FONT, } from "../constants"; import { getDefaultAppState } from "../appState"; import { serializeAsJSON } from "../data/json"; @@ -39,7 +49,7 @@ import type { RenderableElementsMap } from "./types"; import { syncInvalidIndices } from "../fractionalIndex"; import { renderStaticScene } from "../renderer/staticScene"; import { Fonts } from "../fonts"; -import type { Font } from "../fonts/ExcalidrawFont"; +import { containsCJK } from "../element/textElement"; const SVG_EXPORT_TAG = ``; @@ -175,7 +185,7 @@ export const exportToCanvas = async ( return { canvas, scale: appState.exportScale }; }, loadFonts: () => Promise = async () => { - await Fonts.loadFontsForElements(elements); + await Fonts.loadElementsFonts(elements); }, ) => { // load font faces before continuing, by default leverages browsers' [FontFace API](https://developer.mozilla.org/en-US/docs/Web/API/FontFace) @@ -367,13 +377,13 @@ export const exportToSvg = async ( } const fontFaces = opts?.skipInliningFonts ? [] : await getFontFaces(elements); + const delimiter = "\n "; // 6 spaces svgRoot.innerHTML = ` ${SVG_EXPORT_TAG} ${metadata} - ${exportingFrameClipPath} @@ -449,6 +459,7 @@ const getFontFaces = async ( elements: readonly ExcalidrawElement[], ): Promise => { const fontFamilies = new Set(); + const characters = new Set(); const codePoints = new Set(); for (const element of elements) { @@ -459,52 +470,88 @@ const getFontFaces = async ( fontFamilies.add(element.fontFamily); // gather unique codepoints only when inlining fonts - for (const codePoint of Array.from(element.originalText, (u) => - u.codePointAt(0), - )) { - if (codePoint) { - codePoints.add(codePoint); + for (const char of element.originalText) { + if (!characters.has(char)) { + characters.add(char); + codePoints.add(char.codePointAt(0)!); } } } - const getSource = (font: Font) => { - try { - // retrieve font source as dataurl based on the used codepoints - return font.getContent(codePoints); - } catch { - // fallback to font source as a url - return font.urls[0].toString(); - } - }; + const orderedFamilies = Array.from(fontFamilies); + const uniqueChars = Array.from(characters).join(""); + const uniqueCodePoints = Array.from(codePoints); - const fontFaces = await Promise.all( - Array.from(fontFamilies).map(async (x) => { - const { fonts, metadata } = Fonts.registered.get(x) ?? {}; - - if (!Array.isArray(fonts)) { - console.error( - `Couldn't find registered fonts for font-family "${x}"`, - Fonts.registered, - ); - return []; - } - - if (metadata?.local) { - // don't inline local fonts - return []; - } - - return Promise.all( - fonts.map( - async (font) => `@font-face { - font-family: ${font.fontFace.family}; - src: url(${await getSource(font)}); - }`, - ), - ); - }), + const containsCJKFallback = orderedFamilies.find((x) => + getFontFamilyFallbacks(x).includes(CJK_HAND_DRAWN_FALLBACK_FONT), ); - return fontFaces.flat(); + // quick check for Han might match a bit more, which is fine + if (containsCJKFallback && containsCJK(uniqueChars)) { + // the order between the families and fallbacks is important, as fallbacks need to be defined first and in the reversed order + // so that they get overriden with the later defined font faces, i.e. in case they share some codepoints + orderedFamilies.unshift( + FONT_FAMILY_FALLBACKS[CJK_HAND_DRAWN_FALLBACK_FONT], + ); + } + + const iterator = fontFacesIterator( + orderedFamilies, + uniqueChars, + uniqueCodePoints, + ); + + // don't trigger hundreds of concurrent requests (each performing fetch, creating a worker, etc.), + // instead go three requests at a time, in a controlled manner, without completely blocking the main thread + // and avoiding potential issues such as rate limits + const concurrency = 3; + const fontFaces = await new PromisePool(iterator, concurrency).all(); + + // dedup just in case (i.e. could be the same font faces with 0 glyphs) + return Array.from(new Set(fontFaces)); }; + +function* fontFacesIterator( + families: Array, + characters: string, + codePoints: Array, +): Generator> { + for (const [familyIndex, family] of families.entries()) { + const { fontFaces, metadata } = Fonts.registered.get(family) ?? {}; + + if (!Array.isArray(fontFaces)) { + console.error( + `Couldn't find registered fonts for font-family "${family}"`, + Fonts.registered, + ); + continue; + } + + if (metadata?.local) { + // don't inline local fonts + continue; + } + + for (const [fontFaceIndex, fontFace] of fontFaces.entries()) { + yield promiseTry(async () => { + try { + const fontFaceCSS = await fontFace.toCSS(characters, codePoints); + + if (!fontFaceCSS) { + return; + } + + const fontFaceOrder = familyIndex + fontFaceIndex; + const fontFaceTuple = [fontFaceOrder, fontFaceCSS] as const; + + return fontFaceTuple; + } catch (error) { + console.error( + `Couldn't transform font-face to css for family "${fontFace.fontFace.family}"`, + error, + ); + } + }); + } + } +} diff --git a/packages/excalidraw/tests/__snapshots__/contextmenu.test.tsx.snap b/packages/excalidraw/tests/__snapshots__/contextmenu.test.tsx.snap index 3a5e140658..147f00cf76 100644 --- a/packages/excalidraw/tests/__snapshots__/contextmenu.test.tsx.snap +++ b/packages/excalidraw/tests/__snapshots__/contextmenu.test.tsx.snap @@ -206,6 +206,7 @@ exports[`contextMenu element > right-clicking on a group should select whole gro /> , + "keyTest": [Function], "keywords": [ "svg", "clipboard", @@ -4723,6 +4724,7 @@ exports[`contextMenu element > shows 'Group selection' in context menu for multi /> , + "keyTest": [Function], "keywords": [ "svg", "clipboard", @@ -5850,6 +5852,7 @@ exports[`contextMenu element > shows 'Ungroup selection' in context menu for gro /> , + "keyTest": [Function], "keywords": [ "svg", "clipboard", @@ -6929,6 +6932,7 @@ exports[`contextMenu element > shows context menu for canvas > [end of test] app /> , + "keyTest": [Function], "keywords": [ "svg", "clipboard", @@ -7697,6 +7701,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap /> , + "keyTest": [Function], "keywords": [ "svg", "clipboard", @@ -8591,6 +8596,7 @@ exports[`contextMenu element > shows context menu for element > [end of test] ap /> , + "keyTest": [Function], "keywords": [ "svg", "clipboard", diff --git a/packages/excalidraw/tests/__snapshots__/linearElementEditor.test.tsx.snap b/packages/excalidraw/tests/__snapshots__/linearElementEditor.test.tsx.snap index 8ba8195197..399fab29b7 100644 --- a/packages/excalidraw/tests/__snapshots__/linearElementEditor.test.tsx.snap +++ b/packages/excalidraw/tests/__snapshots__/linearElementEditor.test.tsx.snap @@ -1,14 +1,14 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`Test Linear Elements > Test bound text element > should bind text to arrow when clicked on arrow and enter pressed 1`] = ` -"Online whiteboard -collaboration made +"Online whiteboard +collaboration made easy" `; exports[`Test Linear Elements > Test bound text element > should bind text to arrow when double clicked 1`] = ` -"Online whiteboard -collaboration made +"Online whiteboard +collaboration made easy" `; @@ -17,41 +17,41 @@ exports[`Test Linear Elements > Test bound text element > should match styles fo class="excalidraw-wysiwyg" data-type="wysiwyg" dir="auto" - style="position: absolute; display: inline-block; min-height: 1em; backface-visibility: hidden; margin: 0px; border: 0px; outline: 0; resize: none; background: transparent; overflow: hidden; z-index: var(--zIndex-wysiwyg); word-break: break-word; white-space: pre-wrap; overflow-wrap: break-word; box-sizing: content-box; width: 10.5px; height: 26.25px; left: 25px; top: 7.5px; transform: translate(0px, 0px) scale(1) rotate(0deg); padding: 0px 10px; text-align: center; vertical-align: middle; color: rgb(30, 30, 30); opacity: 1; filter: var(--theme-filter); max-height: 992.5px; font: Emoji 20px 20px; line-height: 1.25; font-family: Excalifont, Segoe UI Emoji;" + style="position: absolute; display: inline-block; min-height: 1em; backface-visibility: hidden; margin: 0px; border: 0px; outline: 0; resize: none; background: transparent; overflow: hidden; z-index: var(--zIndex-wysiwyg); word-break: break-word; white-space: pre-wrap; overflow-wrap: break-word; box-sizing: content-box; width: 10.5px; height: 26.25px; left: 25px; top: 7.5px; transform: translate(0px, 0px) scale(1) rotate(0deg); padding: 0px 10px; text-align: center; vertical-align: middle; color: rgb(30, 30, 30); opacity: 1; filter: var(--theme-filter); max-height: 992.5px; font: Emoji 20px 20px; line-height: 1.25; font-family: Excalifont, Xiaolai, Segoe UI Emoji;" tabindex="0" wrap="off" /> `; exports[`Test Linear Elements > Test bound text element > should resize and position the bound text and bounding box correctly when 3 pointer arrow element resized 2`] = ` -"Online whiteboard -collaboration made +"Online whiteboard +collaboration made easy" `; exports[`Test Linear Elements > Test bound text element > should resize and position the bound text and bounding box correctly when 3 pointer arrow element resized 6`] = ` -"Online whiteboard +"Online whiteboard collaboration made easy" `; exports[`Test Linear Elements > Test bound text element > should resize and position the bound text correctly when 2 pointer linear element resized 2`] = ` -"Online whiteboard -collaboration made +"Online whiteboard +collaboration made easy" `; exports[`Test Linear Elements > Test bound text element > should resize and position the bound text correctly when 2 pointer linear element resized 5`] = ` -"Online whiteboard +"Online whiteboard collaboration made easy" `; exports[`Test Linear Elements > Test bound text element > should wrap the bound text when arrow bound container moves 1`] = ` -"Online whiteboard +"Online whiteboard collaboration made easy" `; exports[`Test Linear Elements > Test bound text element > should wrap the bound text when arrow bound container moves 2`] = ` -"Online whiteboard -collaboration made +"Online whiteboard +collaboration made easy" `; diff --git a/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap b/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap index a75a36d0b4..ca705be9a1 100644 --- a/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap +++ b/packages/excalidraw/tests/scene/__snapshots__/export.test.ts.snap @@ -21,30 +21,12 @@ exports[`exportToSvg > with default arguments 1`] = ` class="style-fonts" > - @font-face { - font-family: Excalifont; - src: url(data:font/woff2;base64,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); - } -@font-face { - font-family: Nunito; - src: url(data:font/woff2;base64,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); - } -@font-face { - font-family: Nunito; - src: url(data:font/woff2;base64,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); - } -@font-face { - font-family: Nunito; - src: url(data:font/woff2;base64,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); - } -@font-face { - font-family: Nunito; - src: url(data:font/woff2;base64,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); - } -@font-face { - font-family: Nunito; - src: url(data:font/woff2;base64,d09GMgABAAAAAEBcAA8AAAAAmgwAAD/7AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoE+G8ckHIouBmA/U1RBVEQAhTIRCAqBt3iBj1QLhEwAATYCJAOJFAQgBYUgB4wlG5SCFWxcZYaNAzAQyv6IokzNmhFJOGnP2f/fk44xHFQbgGq+gx5BgSaSVaYj2QlCQUWNmuxaW03kxBuIMJuJPG79npf+sad3HJr1DWS6pDt8XaA/Pf0bU5bXRZeWywpz3bOOHivSl8Ls/BLTZnhEePv+M8Ad0ziR8zz8/uJ/7XNn5oFqrynR/s4Q6w9NSICj78/z2/xz73uPEhEfOccUMQrRXhBmYxQ/rMSuVZRzXT08P7cegjgZbP///f2/giXbWDA2cgFrtsEK2NiIkqoRpSAYEah3ivaFYlx5nnEYkZelF3rnlTz//QGsc+99FpY2E2AQZUniQRP4ygLqymqff+oPfufu+6BNmEZBgkEUWFHziyCKMo6w8cDXD+e+XtJ8TqYp8SwC2RVarZBH/iy3QSIxGInWGKESq1lrt1q6yd3m/fEJ7g1AVLtbCQACbCY4+bDTuZI5AiUOS+N2akrR/581XyVD0j7ZRS15WzaVgAWfee5hX7U97nLCNgcQT/j/dNUWdXnWXafl9eJrmlFnTCBxJpAl+4nxgH9Jlz2vxnaijBYV5AnxUUf1NWX3C+D/f+fsne1OGLaOUJ8xne3ZQpqM7wfaEVCWUWTn5vIpNH7wgEWr2VyZaqXbGK4IyHxxD2eot8J5k3PFd0a6ty778KPZ7SHWYQhLA0CQIWVIypHiiXJUFXb5uFqscIbnnAUlniPfUGftO+8jY+PP/qMLPw2dyT5Is4f/r73T8jnURa1ESMZjHEqjy/vUS6tLTWxkqS6qVB9pYoyOsCrw2D7bvnDWijeIO5kYEVds7eNLtO/2ftUoTH+64DCUshTxpEgIErwgIkGk99rd+7qzGFu5MNZVgAW9ep85jLn6fLy9aiszUMZMoPwAF1g+MAvoDhAYGAt0hFE++wr85QfC71BAhYW4wAs/NAIICgNYMCk+BGvVBiGhBBxvG0sYD6KGaGhgWuGQSGmQDKWQck2QFi2QVu1wzkoiyACCEHRdt90JQG8N0J5KGmLGzwUrCF8Hjh0gvFadOESIBNSvVEBgxP7fxw6x/e5Uk300txCCGCbxUjTkZ7PZRpzOCHzDxcCHcCDIPp6QWFxcclvTogOBauseKC9kuD7zVxYlhCjJBHENlDNDBlq3vR7rlwqspFYmgCQjAzHCVYC6EALNd+v9NqKAYEHNY3Rw0x8XJsOAK90y8HGgwgeSk90PN0qvTmRMzgpnUO6FGm1IoqqmOx1ofDhvGy6Hbs0te61pwc26KTfuRlzXEmy53pcVuqar+eqVX/Dyz3nZZzjNpVzi0lV8vGMdpg8EXRRJEn/2bR94Ga/2ZPe0MHNjl/L8FO3qju3Adm3L+rZqSzZvMzZpYzbMXHfHmta9tjVs2kpXOO+waM4sALn2y1TQLJvQ0+2gccaAVw4diWARGP+67i991xegfNM7oHzQC0Ntp9JHus8ut6Ob2tsVXdQ53ninycuY0FHtoeMxYE1t7W9nW1rXSvjqFddXd+01Vde0JlWyvGZB40or0mjMwID+zqdluDd5BshXQPzokN3wDrzl8mgaInAZVQgR2ABgJ8tYBgkZLLofHMjl66KbwE+Y5v77PPk8op4bwQ6AWWyx5QqXJeWCFKmsAlkBfck+Z+dMXUPrz9lv2muGxXpvQ3xOATreG6mzOBkmJydP0w9qwQHLg4PsTZAAY7Fofh07ZY6Ahzk+eHvlqoIrAAt8OOiFw3lxBLvFMCjTqBxBOeW4yx3QoSGVFBppJExhGUggQZ2kdNKp6oBqqkMv2O3E2/uDnp9xjs0chdB9sqwDlkqbWg0TGYUTLgrJRggh1FBDl3qAFJJ5xlMZ0Rgj42OMCVGDEYeaMFIoUt348vUGfP61V/UjLcCpLQJyeeAnyDeDIc3A7F9NCGPB/b+DA/f+ChL0fccuADV3bqE9BcdLHnkuzmcTc03sauRfpOX9W6kCVYmsm4ASJMQZWogWPJWym83TLikAeMMVrzKMQ14iXAmvafqH4DFXwabKZuYqhFzo2f9Nhtm01vkXpDMOBrkkif4bFG2EjFNaOZJhV89s21Mztc4aNui5ifRgooCo0iOQLUPerjxFtfGWGI97gx+Lp7VuyFDzgOpSwmKr8QNgC6+gX/jP1RDA0b997qXmMnodfR4aEJUWibGYB5cbNyicMzMymscx3AqFdLBXYvhO5+WOoresfiKM0R5psVVIbDqYu11A5PCci0AUIxuK1SerRrWOQ4jt68W5RiYcUWyviTy8b7fsX5sa84H0+PQldNVl/+9dWfxv/AidNoE7PYZWr1fAHqSCOVjYAwD7EgZf/+1bMlYN9tICL5JGMlaWJ6BHi/ZjJph6KNqUHmti6ptzEKEsxIm1O9h85INhtH1ImtAudjagXpLTrqwb5Jfoa/WxNsBzi8E4IeqxDBdvrjxsmKWtKPt+Nh7f/mraV7V/wIBmDe2KvvreU13oEjU5zd6vxCF25x2nurlpyMQzCi031MzmT4C1JsRuKx2WNhfZazOk1doNDZMmmqLAe6Pk4tQVWbje2Kw9i1ZxiZ2R8+A6k9ru+BF1zrfPzvR9fGTPLEw20mL4tWjpS+x5r4/aaM8iuvbN6DgCFjLQNZfZsUz5f9aNVfGY7PDOEAu9Vpxv2HFWh4xXdH5LPKyAspT2aXSF7a7pkWkYZwX+fEkAKxZWV1QH27U61Bx1jW1YlpOKIgobaTFNnDzVBrg0PLUP71QjFMsLA0uoauvB/Qqfq8CWAwTTIkZPhFNn/qRXY2JnOTPoTDsToHvol1pV/3wtmXUOhep7EBSOtCp1fd882ljfg8yxceWgEJtQG6plwB2tQ+TDEdiBooSDhR4ABEBUAx69CKjUVlpFgxatrPoTDt3ayKT0bI2N/KpzU2jrldIKtEeCNPL1wfv8oxLFy8yVUa5Iz8jp3JfifvholGHG6Mr4rVjRfpMCnHWWRdQMcl4PfGi6XjNdVTElZzLn86B2qMsLM5vrrbliz5OIbTS52oKibHuEmTi9OCf0HdIAXhLEU2hwJOakrklLLrplTyC7J3Grvps5OXMu7/K6YO2vIsXEag+kdSbDq0VEzFqbsthutuPYvs/u9uZzYZKSU4p2W9O8Zpauje3iVRfnLuXWdz1QS2HvsrkhT0iCZ50W7J75Hdm3Q1rWgOqZmHEcDfv+JbVE4Y3FNTwHvTDt4/M4HPH6ZDdFZ2pI7Pi6kl2KL44Vfm2MSmY+VIJRsysngLkcFfFZDCcVKPyHHT4N9qZHnszBTucHlSfTy7I53ORpNY10f6kOrk5iBRfg4efz2S+UiX9VMf7g2JvbWQ/jqSG1uPssh92wppKyrEqwOgjLwbpDiINXNstMsTyN8rp5PHI1g7fQQSlbEjGHzoA6WcSVTbEFQ9nIrDKDN2iJsfXuFJ8dRVU+lOx3J0mdz+2Uv1Ry2jyOHho7rK08Qx5+PY8G0karJrc7YREyVl9AZYl4JDR1o4XMRSuOhWcQSvsdT+gTbHse5bBabgDmvdf6r6rTOB109mqyuGnzqmFfAD+qwL41m1si4tCP1Onw7J/EW9P8MJX96XJoALuTu/d1ucEi3zYVSAuNWTX17C+D+3zb/wS9g5Se2F/2Ti3hKNWu+SWPt2zWL+zO6Uxdszw6j1JmcI9jyvlnVwnlTVqXwfR8bIHcq3eBLEEH/0zuEZiJLNUEguuXytl7jOWPmkpyDzJouveVToYu1W1hTX7Q/Rxj/ytrqWhh3d8qW19ocRW3wUhgnN1Dm9j4m4b8HCwG3Qs9hb2qpyp8N8eennuqwVtY/L0Wg8mT2QARHtlfexio6LDhT3ENYXDZZgQtbEH72aI7wIFGY1CD9+5cUWfMkwTz9QgIrao3exIQ8nGAIIWowz+Fc82r73x31yP8ns4cKLgQLTBDM602nWpNM1+jJZbr1mu74XbaZbI9DprqsKNmO+6qea67Z62PPtpsdAj/ZJ+S5ExEOgXFWdRutMSFfa4ugCcNGVjBpVd4vzxkRZhQRFAbtCmoMUSYiMCkkNCmp5EOQC+4oLdFSwIiSWkeVyh1EgwfKG66b9yEaTMMYwQwZxRglnZfLo0kVRE8MdlStRoxO3QMmzLLyc4bC48ISXa1xcIc0o82NtQyLAZR2XrJaQlnfm6EdxYLeF0tM2YJPi3VX6CQ5hiplHt0uWDzSBkVbZv0KnhAFSvYqBboyqXUJs9+XYis/RxeH/Aw2wYhawxCAWXysYFaes5xNwAqGL3plWUrNmxyuRYAWxYB7tJeGYIlcBmCs8mMmzDYjiFhntNdEKYshUz4gc4pQN0fdGfHjBN/nPbTo+gTW/QZW/K5qywxCzaaYJZhKrzvIJaUwuklSZYiVZp0GQxq1KrXoFGbdnMt0GudDbY44KDDjjruBCxdmgzKd8glScA1TX5PHNhb0oK9bZUHf4t272dMhQBLgWXACmAlsApYjS0NWA9sAPYCB4HLQG8hKAkoepQklGSUFJRUlDSUTBQDShFKGUo7ymbmthM7ROUIlWNUTnJxiovTXJzhQgoiEIEIRCACEYhABCIQgQhEIAIxeIIEJCABa7AGa8maOdBAAw000EADDTTQQAMNNNBdTRwS5MgeHDORJCgp8IC3OGhvRsKP55AGseEXtx4x/ceKoXTPzhlDOb/kzx9KDOpX2gBBIFFY2GFtTJEBLbEsZCPBWpnBOdt/HTih7nX7wSNK97N8O3T4oPx/JXMYhuve3VulXA9vPyB+IZFrDv48efAYHRDchTAJi7BB0L3CY4YPYGpVlmXvLCQ5c+e9U93bXTVAPuVepiUjzmGglAiDJMUJu4bQFDruHNHPQ1LwCFBTthhOx5dOAl0NsQ6Yo+Qc6O2FQ6MXpIylmOoNbY7EoucWxO1cDG2LkkGrpU9xx/EI6vbF8IU9DgJCQ1Tg2uq+zR1jKoiDTKRJN2ma+RD3AsIso/46rLnzYEKcSyUHfJIuo0EMCw/Lwl7AyyFbtyBiSSyhAzEQw7T2SNyKvkhKClK0RGqx0t8r20FNZJWajIRUmew8JQpy64nfdPMwjFElTSglGkGIhxUxHBMkgsNCEjjcKAiCwsCExsokw9mKp6YJRLXvwdU+h2zywwoQCoI/RvvLCJK+WvOLRbbW5w+q0cVp/KBFtOPwgDfOsRHn42tfLhwklKChBgseWkNu95FwnsJBaHts0AQJwM8iPnRAECBVriyGP3hAkAuxuMzZ40uUwcTCqjtXD6ytlUpNMKG+2kwMoKGUnjNe45KyHqKuSUNWQXyIrm7oWZpiQRkBfEMYUa6gkECKGB8KRLobppeOLL75AwXKbU0D5h8XCdlEFo/b5RWwG5hP/W/YXj/2geE3zu9/HwKNcZF9AboLkG+6HxiKgMiXBT13YeQKp//sOREA/kq4EQsnWiC2iGMNADh7IE306bdfVs8UE5Lfp8s8YBp/FAx04mawNn/DijxS0GM90hu9NUSQBJuw+dLjfOB84pxrHuZxXuFtPuWc4DzPHT7sD0f/X4FO5NwNsQC/Xn4/3ASIimBt9JFTLndtmbc+9J8xG1gGqMMeD/D/mv+t/1v+ewn472uP2WlPwBc//tcTGvpMvpj4+Ss//Ox9CGASsM4DQO7PPADk7sw69duXSuDesc/a6KIdHvrkiksOOmS7Z9bZo9dOfdZ745XXNrsM4TBhyoyQiHiO/jtryYqcgjMlVypu3PnwNdAgQxy1yzEfHEhGK0SocJHixEugly6TwT/+9b9CxUqUKmdUo1adek0Ou+uId1bb5L7HHnjinmv1d12Hs97b60bWbnlrqWUN8NFVW1NYotM5iyy02BYMGIllKH8gcQnwmaP1J9WPBR5r9mzYcmTnBQfePHjyMpiLMgF0/ATxFyhYmFhRosVIm/T+oEb4T64s2fLleClPtQqVqjQo0shJQYLw/Q6Cz6HgtDOOO+mUE4AMsbkA0RgAyCdA3AHFA8B/qH+cewCAJNdip5viGL2ZYdrl7OPqgM6/hbIrZzOWsCNAIA0e9ogtwMu+8z6EY4M+udtQTUSqlmc/cMJVrZucWBmG9ZacNG42CR35OjFlCsz2iLI2aZyeKLwtqv20gHn2Eu2lFp7QhwDvW8RFFe3FdtLrTXmDoWKFKRkNptin4UHQS3quT2O9zaTJpibLeuOroamG1ml2apZGSVOko5F8a9Qnn/Q2Nc/7ulo5nhvNZibL6mBeL1lNmmf2m9bahE1ZmwlrbT252bSWh3WSaz08qJQeK4ipGGBKT2ht1x8VGcph81m2vp6m8ciCwL2lTXKL8zgMR8JwqDeZ2LhuqNzepr1+394nppovaMqjfcuwH8+gKpZhXEOrTia0eozrGBuWqQHVcTP8QHgQgZ4TDI81TEmh3z2K4/itY9rfpqOtHa5YbC8mSeJ41nyE6qD8gvgk9xkLxWLfq/nqwAfKrxmLASd5x0ME5F7rf/Vv1KdJdY/hdwEKAtk+ztaShDinO1npw1+xKGH2PIfVVBTgx+pxpe7q54PCuja154btun5SRSl5G8hXMqZrA9oIHISeltRUELlNJ3LvOrw/zIkn+imJH+yX2sR8IpkqmJH+NoaZCoAsNpsQPS4p4UYqn/7Rj1BhmtO5lMAubVeiVEftqFSuHcPgkMLB5G0LGE9mA941pFPPT3vh/Ximz0BN4jSKi3SoNQ2zCT9uR5b0uYBXNUAyeb2mafMgCNI1F7psY2bK1AsrBGzcekyKgZIel2h6hWR52Bb7NROPglj9oHHzB+mua5Q0l9X9+dzURbyIks5aLkRyZkPLuEFmtHIPtZ22/94FY7StFSU+Tnot7cRpxyEcCoW2xbpwMrf38+OZVUdgWg8PnoPEXHd1iNS0NcTIFhZijWSteQioLdLInAvFeGIkbk5uDcNo8hMzh1I+MAgJvHtsDKIBTPQb7IfB9sjsw/0vDw2r6lgVrTX9zoDfp1LrRPveS20KVF3ixF5EOaC7L0aj0JzDwOI3+hGdCNKUPGZvbk90thNhxmAay3Dn0TJlnJJ8ZFzq1DHZ3LuNAvcmdmjjwqGzTQ1z4w4IQA7naU1dNRvzpg5pQL0ogKibUYVEXRnFM7jKD4Um2GV4B+CYKATX352kZscClU8JN7ZlL+TGwT8PHVvbKSJQmNf1UBUSVmdxUpFas1Huvpqt0pFTQlm2aBQWmXHHJotX+DjsBAFqL7LUUZ9OKEZ1QSxQ8VOs7NLi5R1oiathWlqg8XGSWG4ak+2vGT76bk3jUmx53sUBoimy+JAurbS+MiDdJK3uhhG2QuGw95wwl8VJYKQu94y+fR+0pzYiZ26iDAepwExgXkPpfTnDMQJrd9CiC02yy7s3dwRk4LRmQyplx1xQ0iuoq8PnQjM+HR6sEVG4ej9/FIW6fN8JjQ1Wc3wVLsEjkdL5vmL1UzQAVfkug4CYGAzOPGiy019aJhB4ViSKxTA6BDpiRdBzG1ZrfCiu0uMJgSgs5q2A9gdR1LOq//TOrw9GaI+ee62Xnaim0Ayj3gmnevd0bREi7V8e8EE7/daJXJ9/mMhmRnNSjahbsiVm334UZn5v7U/PzrE1RvsowneKLXZv7/RBivTdP9yWSGyscZABujYuqgRhmMhrka10KITFExqzATqlgjyvhw47jTEYtmaXmmalWQu+8t1ndPG1KgDyYUwdOvevHzcPqsPIIrxeg+AFmvuEhr9UVOBvTV/H/KBoCmMM7dqgTTG2WZMzPI306AH9KrWbJXEGVMCJYvXOEuaybpwY0mtAR6vYpQT43f6RDIjoKRYpHZvKNDnxVnosnrhvWk7gyppTrqfgB6gajXNTiD17fHHUEqJNpMkUTu9dZeUPdeRMWZnFAkXLJJtgH3eOOeWoOnpV/qnNt+VXJ5DIlVwcLSJMlK6nzrlAqn86kjW/PAa7ZHmJeLjCPFbjnE0f4TYvuVUUu+6KoHalJi6ZrfvJ8yYnuW/XbVbs3n6NwJcONwnLU5ttQfk2txnTO8+T+5xhmCRXmRmFv1E2m3Ca0TybWMpOgf/IvqLnA5VtOB4INALNUTBhmK4wtrqRZnqJuibm2hjXApAgmrXeUibmpyiy8aocGvHvFoW/WVGBlHRvqZ3cRKSlhbSN1GYMIlAwOSl1IfQhAf24CVQGDIUJrOqZQgUU/dcBIk0LoQRU00hh6ziFaxg0eZDVwoUmTjy6V9JlekdYTWtNpvgpqaUXxdYOISm0+4V2d5oDS6FbUhrS3lgyFWJxetS+EDEayj5ip8aTo98VI/A6Hrv8X1L0stteJnqdzLj43Hldu/dWX9ckxSyxc0Gvu88OHFdw9Rin43QOWVd/vlan4nFZrjIbnj1GPqrXpBu/zUt8bEiL1RmuJUvcFDExAmpxkAnXPJeygmx5CJSFzT1EXVYQhIXAFbZlCRTzTel+f5koyoQ92zUZedLLTZJ6rlNfWfpAD4VKwoAuJkmV+cMFCxloNOBOI6J8xCdihjbsIV/RoMK06lKlV7cmz1c8qX8zS9s/BYAP2gwUIRGzCqNla4TqTc2m7If+3FwYk1S9dlJYobEX41rmQ//WPBbZ649MVwtKoOSOA3bq8b3e21nPRTOSuV2LpwgyGgf7qB+olAt7kukP/q9EVQplF1WgaJS9MpTc2XNq89nXtzNaozlWSzuE7noiBfsPEt03CCc0xGxX6TJd+ME/ItXIg5iMR0j62Jb6L6txT6fMhUHl6w7WZcoO6zmUoa2EyvBL+7+0s4fEy9t8gDItNB3ihGS7QCHoEbAEGhnsjezT9eLFS9e0n5kXr1X3733PaXNIig/ZtZ++PXNv4kLOYJ5P48voTfFB9fhqvF5dhdoB4TNvFE9t8yWs+sLOzuRmalLWQeeVZtAZYHkitUGOuDk6VLdoTT8DnV8zgRryLfoOfmN4EJlhe+mRm+Wb3U60rWIvi3y2Jzt6pZ1SUH5BjErAFtvknYDEtFKQpU/Mfv3VSrguK5zMUQrVRfpywm4Mp/4sj9TTHDfAzCH9MaUnYXYKbiBBHQxBuNhT/p0w3dMZOrF8l8XgW+oMSx/5i3AUDsIusS+5oMAiYI6Fwp6ZzOEtglcmy7vvp8G6OsLGdHOn65OJuahYK14eJVpdymtIFz/4QeO/Llpc+u8wN/jT/ulJ0/zPoVt0+neHw7j4H9nhGvq/bRedJfnbhYI/dTelZW3jKw8mft7JW2ZlbqaJmBGuHA/WHslPVLvl1jkQ0yeMqq3GQitQ55hx0F5xVbObh7lNvdvIeTXYF7wW6la5ydg7Tg5pSkM5PJengr0V02Tz7bOibjsX5shcOKowvPbjRhdCxCCK0bSmv/4QkYsn6TifWXiJSKzmoK2GFH48XZbLgHYiyvhjVS9eOcC5WUHtHlgWD0J4jdHGOZQpk2gihBPjR2rhzOTE0YuHkUkbSY/hcbW/wrrQckaZ0xeak5UyWTOTZmzflqbP1SfqZbJpR9fk7hWt/JKzW54UtquV2Vf9EZp1Cpi81Gx9hXXmootEwiMxeRxWpgiR19SZQKTbmq221I797grJuWGZGXVhkmeEbYquSaaNKFaa7ScAiKIsdIvwSc+wHR6qN0eFR/pCJznq6TjCtlmVSBfFFodkQ/FWUbv361l52nAjyjaSaO8UceqdDnEym06eRcPc8dTQjZNdUMJ0zRHfNrZ1iWMGg29BS2xeASoBSpH8FoZjU4yTAgpBo0wKcFTggLXHhYIXCOGTQHlOuzVVCl5zVtmkJw9lcI2BAuoyfUmzEVTzhLUuxNERE81HJSt6juz3KIMXTMFYwTYkYeWAZwD7ZTXDUYS1j1nzMV+zYI3wSTI2O82iNXYR4baSzirFXYQElqftmP+I8YNDTHN4+/medBv/Gj++61ix8FT7U9G8fRdFlJQfMN499nHxWp8phICDNAqDRKsh+cd8jWuNnUzuNpnnmsVE/Uez5TEQh9n50iz51uxb2DPZ61Ovp46jBFGscZMMbU40zdF9BkdBqxtCXgwx9JErD/es7ClTymAZyIlEPNoQ1Dj3EAxvX6vLhmRZCNo9J3vXnrf2NO9x8/LJ5ZtD3U01W0LgLNXAnDmzY2gQuoCaEIoZfd2lY/8VRJMRigq1B/RinQQ1USgmVCbo4u+Omm9vPLi8vLPkQds86xR3CCygjdLKcO/97KiTpuZpjLkBI4nsIPiKHeXTa0LX7efcuTq9PlfrPpfzntOp02iKd6HzPbCY0Lgu4N3eXiCf6y8fVHp0bdyZf29u4Iz/LcmnKVxNhrTpRcG0wSaDS+Gja/4ei2sYeDA7xDvSPTv19tEjb/oVc0qCcxMD69wrLdVck5lbZ100f8H8lRCJEGUwHRT798mUG3rJ/GGnPLVRwLxIPGbUxKvqUdWEZFT3k1iHqzcnRYyowCihY0uhdyzkk88Nls9UerO6OH+8Xx8Im31/WZCe6mk1pA0WLRpZNqwIwiuUvy5EzDBsRA6qEVPCoHdvr+yigtmRWD/eTuvD8D4acSOx9uNYczveb1LfyakbqXhDp9Euyj439CGkCOiLcG3KozaGYezdPtKK8z2JR6BGh/DXC45P0soeLyFTBbrLjlRS0Pw/ZKHCrb84Uibx8AYwF1uE1YEPq+wsqpmCWqhgJBINoH3UOhRxjRBfsIkvRjIRtJDah9qoVBvKxJ6eHIwmk+TNv52isVAbGI5E66ldeACBmfv3KOkcrI5KLcR6qDYYcu7frcS51ACYRahZFfRubyuQz/WV9ytzDSngGbvD83wVfcqcPHutMW0oOK93VZu9zpA6WDS3bw3Y8daH775hqI558kI+RdkzKY7vUzSSTvnDcVWa4Vnu6fzp5hqOycKptS6atxAMu0wjvgD7pXN6e23d+Vo6T/6MN2D1R9zubIvFXelH4hAOTe1YL1p4KmeLdbXTQ52nWiZ8+47bY6Xyh1X3O2D68DYNcuToVkPjyxJhTpyi8o2LshHYeflL2zTNkF7cqMh9DRPvaS7ZuyJWRUFDI81niqYr+v/DG7Dug16PyWj0GL0HgZagCJBcsV+f32cP63rwSQ0zM5ivT5GOZ8c0UssopSUuRbzTml4eq8lq4Y6/328jz/p+RgFNlZzDXihM7DLGNKDVaGWhI1HgMKdUsYAiEu/HHY8oPgqlgEJBzRSKBX3kwBtAKyG7SWCzC1rsw7ReDO+lDTZXNVRUVDU0D5oC9ld7uMIwa6YRlERSV88hNXU2tUFUY0dYIR8UduShkCenitzUNRtoI9Gunget89uZlLya8y7BldzuAoRirr2Qw7noqs5H8YreR201XSi1q+djBTaR1F0N8iORTvn+pwbB54px+TSY3LLtHBR7BtrWAiHT5Cc/Vwh+MeyP7aTEDJ24zePf4p0YAtJIrJ9mzvwz8BqpgEIeOnCFiV9hbiuFEVPMiT8DmWYlKEHaFq4Y36jmzqGOMk59mwLDJ6tWUws+KH1U8CVB5RXJzJK0smFGi0IjdwVjVGxRVZJwbVxCl/YPNdcK53/j+zhy1+13ChGhsUCc4DMR8AAVrcdtU7vfMbDAD4S0fJHcLElrHaa3ytXYq1OK13GMkhYdNZ3Xjqs59NFq96v/pi+s015PcnFaWcGMcJIcsasVPyXHZu+SyY0JPHf6lGJvWV6sBfryu5H/Uzbcx4I0ib87F8uhxlirvcBGMJUZ/9wfxOsxah/eifdSsV6cS3xeZjAaK3UpIbcrtbNC57dJDQl8jzboKjHJDGLe75u/FDAJOc1Z6k63hlOSaQhyM/guKmGPz/pL1bkODy1+QQvFIPV7Kh20rFnn8n9Jqd39Zy4VTCIYKnWpnS53Sqga0mgsMzwncvE6DOvFO/E+9oOVjH1bbpTaZIYE3rEEKfAF998blGBtVKvrrVZ1XZ3akpTDVhnW4KDCvcIooa414ovWjoqaEmUJK+vQe/WD/MXW2C9GZqROWbhrAR4USoXWWv6A3RbXkplTJFTb5AYhz5bkcPrM8ue8bGVubgFIIHhCusyQy6nraNJblW7OECuYAXGQQo0+JiXOvkuWZJbxvamRxf6SPI6J/JUq6fQjkAZWR2J9+IAOUUGwEvEviK8qrymZ8vnnrALLp9u8R0p14qtdFCUMqSh1AwrAP5ZWgy88N9f6mWX3+x5YYMu2Z7dMvVdpNJiqdKkt9vS44HIPT2WsMN57O4j3YtRefFNHZ0cfJDeIec4Uj6vY3F8UPzfV7S4BPZEGGyo2xl6uztTmSuL9xki8Plr/ogwzMtMNTrf5JwXoiaAO4Cto/VSsn7YCb8RKmT/RGD8wYy8yaJcPDA6IHz0r6U755aQJSbvCvvfZLLHbI4o4TEHxsx6W9riPnafXy+JJE8d/GaZQVLFPrl2Qf/HwSYwJRlc8u3Vu0lEF+JyQ6wr6XkAN/TRlu3jq9cptr1EpEbwRCPRRgI2vN2od7h8T+rTarFzNJRJWqs9Kz5bwfaZIvI+K9eGTDB+mqE1u6w8D1lYVysdO5e+XjZBQi2lInGBvzFR3uDSc0kxjIS9tDUK+slWm2uLu3f+WaMoGu7R9y6ThQ53aviFAJdgakHU/3Z85jQ7cRKtodjqMZWpVUy7EQfI06n9T4my7ZAqDjONNjSzKK/WwjeQ/3O5rv+c8FqQlFHTZMSsDNzXk2gRcpOcotQ9zSXf4Orxk7EWZ0WSs0KWG3K6UTu8TjKf6L9a3+6V3I55P9CLsxfnRa7h1FKvH/iU+LzNGkeZOl3tH9W4NxnLjN2Ml5E7VhfXdeCnutL5IXGcf966ofwKZpvBnSeGT0oyQMTLbpv8BrwfPCPJidGD3XMGnpndr7bAgvY/LcteXIk+yDMnyJFOAr5a5sRfv1lie5J+dOBmX1shjhKWXIoYYoy7F0uQGmwjSIC56tyf1af65iGw4LjGNxzqz0kN7lUQ9y7jwYIDGmZBY7Xm5JxLS6+9w58Bge7qLPZoQz+yq3jKfRJ8Yc+JGS6pcbiwQAISgdScIPZoXhvAfxNCK92JYHd46EPJrMfBL+r1UyvqokSsU0vyJw73gRbYlDVFMe70jsxhpuhyP6efVe3WjQobV44GT6qAOhEVSDq/bt6RSW4XC+jlbZrO2ze7yUGCudviNpfMmwPPY9g71rF06raQCubaaBcO0JbOqKmEkZFw0Cz91ri6HEFhWkVq6ZoJCmeheviCRRtx9GORPJufFnHzrrnzs3PVYIwQ3b1m0n1O0bWmGIGNoR9vOiN+89Wms6dux9ih79dHNLeD9o5BB1m4eFR57TwhhK6n44/yf7LVuECTH1ja+hbbgk2EeBHNhJeyqDb5JC9ERAR/iweAwIbmIhr3Xm/1ZwXu/G2CB2WrSanOz3JVwAUJRQi5Djl6r82a6KiqDJVvxfhzrx8d85o4RdYmzVaYt0BjMZcfJAkei2JmsTwlMS0y411pZWl1COBWmq7Z+Sjw4J1NT3GAYa6AtxotwbADvuTugiChnPKYxHjJY6e69YMFo0i2xPF+Uo4nPUH5DQy9x6KkBlporF1A2BE/T8mYfWZJOl44eFG6LiyV/HhM7ifQYvLFJahIILYkKockkkC4nmBSJQsu9OiaeUKkmxKJbKtUtICVMn3n0QF/G1ra8vBlD7x7syRhrLchze12LVq92zs/TwnxKdw5spvgRSgFlZnzSqrL7s6HAwm8XFX33Rgw5Dy3ozp9e72A2rQ6Nfu/Dhz+g0qJETbbOInEych90gLqB8yua+Wr7NFmyL1PC9KYVvHXtIdOO8V4HeARNF/vAg9Fs9urv3vTREpVmllisc+lys6k+hFJAzZJ9IhKnWTNM0lxay/mV5MKBByuaeGrrNGmyVy1lZ28bJdqjveW2TE1xswJsk/F7VzOG7aBGf/C1eHz/CgiZT3vPghVQ0ALM0oz3mb/rpMcspoMMQkaIc+P8wgA06/4MP0OhMPM9UpOrwJxgYd2oz42hpCAB1I/moWXShyrKITL2FEvTzZUZqTVmk6auWQ0sBF9PXuZoa6lwSU5Fk9KSWMHx7mkoJHfcZ1hxvj6QJZ9RVhRVn+LxS1OyytVp1SaTuqFWY3NKnwvMMpnA/Fz6Wx7sjYTac2bpKuMrUZ/4JPOhS9C5FKh3pjxneDmQErwhuS6gV4qdNsXXkDHGWW7UanyNUrujUar2aaU8x9O9kHVqoNKh1wVCck9OfoFebyjIzM/zZRr0Pr3XrjCy0oVqtz4726VXa1wG8JIgr+RW7GkoBB0PePUPlm6pMNXrk6ZOqDGa1fU9TP5ub+amAf6Z5hdJDEK+WSbnmwzxEulzgUkuE5hfgI8i7P6W1jTMO3eTwOFrakmj5q3fpKV+kb0pwSvOkVA/zx4V54mdoJ3LJYNq5nPzlS/3vFP0Mi9pvY1I/K6NmK3icSAIAgHISI7esbBrxtvDNDabi16V3a877Li/2kzhSY79IeA9FYR6o97kciAAgQ/CRWbKqgvBI3Uvy36i849z2fuESTAEkSE4Xvh2HKOcj16Rvpx3xD5XsPxXqHdoVQmYOGqXNVFYa2CCyeGICk7agiSTiDtn7PotO5+CpFB+45DIZIRM4iTBqrS1E8iq2wg4GR5voXRcsO2oO6+LYwrPxYt64rHm/2r/JERfivmYw7kIkSEIQDuGIBDOFh6QSGXlZg64EO7xN1fbZNO8qRmx4/pz6YfT3pXNoKRp3bmxhIbwCJbGZlcneAy8dwWb44X7+IILQtEFMBROTkxv3+eNO8njQmT4eziLTFxQMmZploGPwh3+rAyJY/3U4Iv41Hyt2ZyvTY3/pmHq+iJJRmGWPU0azmGHS6XhbE645CPh4bi4Q0Lhobi4w2BbeOy4/nzaYdtu5r/v6Nw5sVPs/N9ZWptNk+Ay8qUef1NNtrQmL0V4T3BBKLwg4O8Txe8DjrBBW8ov6YPDGwdtlqfCQdAdzoAZDDaD9ZTB+BzMrNpSTcTfnnyJks7iMBmvmMwIAXW5HmI6s58BKR2aCJ+V9Fn/frEnepTpfj8GROo44wTzpDP00cKeRR9jme4+yvR9ZkvDQI4BDV3KOEBXYL4Zbn1A+hXm/eP8csal85h4ebI8hyH6m0W2Hf1hqJGbog2IlNlJHHwAeVpDlhL/J33EDKuqyUzmqzfXr+DhMW0gPskskwpzk/71sISsX0ikX2HWN+nAvys2fplK5qSJpo6zbUenzqjhiJXMZ3TmM6b0M+mJ7mscoHgKvbknB5R5iUqPKjHRm6dKScqXK73JyiRPngLMbLmvOWBu/ng4nNMOkyu5wxEHzc3btHfPvx1KayKmNo28ff+eNFq+aXw4guslwxWc4fBDxeYPJNz/dvNIqpB2H28B/ZHwnWTWhhf50dgyItmDlAsVvy0MRePLoiA3MngudiPXA0F3+IyFG1grByVz88yVC3JjIpduPokSPK/4fQFgZfWUwbPsrVw9BH+d3BgbltwKvf7lBukX68F1t5Qm6dH/+Nilw7XdevAFR3bWd0txnesnfSt7NLgWsAXMMDoTMJnPmPRfQe1XkB+CfNCn5BqsvpYM+s8kKDoaIk3E/IvGrIvvzbhJ7BjAZn8M+9579qTXpdxvz8FWJS0XmIfeXfxhNd3ImwXNMpuhWfwRmqnr0qJ3QeeeweCWjnYxTNyRdeBZvE4fbto9lFG78C0WysFXK5aBl4e5367gPU74euV1lExGSau+Fj9OrlPZ4AIyOYWcSPVjT+JCyxgRjCUh9hPMT00MdCUXwEB0GEpOEJAVVKvEDm2p2hKKC1mpCrLgzQHZeN8O8x6LX4yQJ5NJEZ8lvEh4nFyYDNYchnohEdwDLYaTyeQUOPBtAE4hk5NhEC/VLYB8kCLOs1pYBNXBXpNsPLRvfMRlJM1Pf+afzH8OD5j5TFfsxGf/SwQnAqfnN3nnvR631T13cP6ZO1tGdIO6oVArcARuD4UyhzIHQ1vunJnf4pm7InaFd17TetAxFsNjky9jVzFy6zk26TKZB77aUbFFF+rUba2p1o9194xlVXXvL63a1R5QDPutGl2mRWJcVqJPdvur/I70zipjVpoldVvMfpMApiTHP5SLiNxPY4X17FpLed6iVc6a9l3lpW909QT2bA222rvitz9acyvh4bcL5cOxUlNyfIkm/blKYkmK92doMgGXYKuTpXnTuXRTe1rEx58LnRKFNNsrSrMXuczx14yZsyPfvYjeyyVZhTwVQkmlKKlBdm4WYVrjE2IeAmmPObz46t4MvSPDL4tm3PxCeWuAlMdJdWjLLZIkMXo66nrl49LpNOEjgB+FEfhcZrFKWazVKotKVJmPsT5MIhDACIwOoQLw97G0Ujxyd03ypwXnbrhQoWghic+3UEMp9ok3BVKJUz1wJZqjTvNUSTNTimjUPd0pT03nbuSgQkHfq2GBCQ8l2yc2x0sTnBkDV2I46eneadIT0fx3N1fKODdPruJKaYL3NlXJoJufjnGkYAPBNSetqiptjsuVNqeqck6ayxxbWemvrCrnlJs7FD5/YqfZfI75fCPVeqcUfbpf/BbbW10V6q2uDnVUcU2U7eun8S/z3m37GdPbXLZsW54ee7zifmCX7f3tZpTRR4lkWryoiFpHnWOxG9Vqu870gN1wh13YE0RjyM74xgUcuu3BGhH4rlQ8IuB3JJSCq1Q4GamJWflXFMQcWhWBrowYIsJkE1ojFCB8BIFnfR18d+rUs8HZXyOIUI36qdpGmJt/x+KR8/0LcZFGLdUKjr4uNYtEZolEZDKLpFKTUGiSSoQWk/AN4SSxKFwoCheJJ1lzGS6ALgs/wfArIvQGXDD/Q6weE5+TxMSJU2ipeNX6KlEuAkI99P2lAlkDkB+uffFNqTG52aJk+dIMzoQ7P4ZgPwT54ZYikRe7+16t5f+8+20jsYJFyypE3vxKO2vFipf5T+Pn7T6TR6vsqYKtgDHKGN3UTndKpDTnzM2j9NFFjDcW389lJCQ46N82bBpf9AbjjYXDNKdUSncOj26ijy5kLlp0z8GQJOQyv1k0OvJLudwul7gUSRKnPfGkbGx2JilMqu9zkDoA+aEqrhV08IvPb8wI63r5vJRjTbex+FzWgpLztdQiSrA4V5NRUpdqnvSkPFNp3zPK//usXmDYW18bM/L9FDcz3e6zZMhMx+qxCkpJoUOd4a9RGiPCpkFWMJtgC2XZBqILb/lIKhJZRfLeYJkSrueRkkmyS5EgOmDrj35cp5RyLPtsPf+OHN1rQgWJOeKk/APwFjKPROKTt3PEJil7jMwnxfDJG04dSCrIESfGf3X/YWV0TfYmfgUPeKA6CK6FvGTqbwUkM4lsJBX8utiYVFKldCTXcVgXGubFhh78lU0VGV7tL936OtlIJpnJa39jw7UwVAfPcA4waxThQmQuMhro/GRoxMPQaXiZzISQnVsvxOLnY7eWkpF81oFTYa8hqMFHZynBA45bi2t6PD9MZeU9QMqBEfj9d2AYgs7pdw4hxtQw5ND1su/Dk8D6F+JCp8ih7RGBedkfjvGiPty5a8+e0fhVkvx9u/cc2y6NqehXNPUoVS963uiuXaDgX9jI+FenJzexBRh+om1PHOvDlmALV/R+lrwyceDstw5NVUDrsqBEecd6MmLN6WOnE08jPb1m8jXrne1Hs3gIDQf/KnccVfBhfIqac8Z/gtq9WnTcD6TTYQRedASh0IwcWXSmvT7JDA9KWNT/++ksby147S5jdU/PVoiq/G5Zl65+KPV2PH2kVnULoRq/G5pt6YPrXuDfJQgCH54HPZK9MA+5KQDlc/Ef5xzbU1kKca6ooeY8okVHtx0fl58Yb/sXzL8EU+FafnIWPV2b4zb9NNeGswS3klqHOKd879ElSz4hECMuYvVABYYafJ/hrUMbhor0CNKHrs3MK+6os4grnKo0b0lHbS1UXmuqIW4l1ZScq8yRxW7DTCrnCMgh18CsAILFtFEabePb9EUXaftaa+/y1o6C2I0LVX/nN2U1DDXUfoa9dfoObScV3UmjrUWpa0eJEllbdi7o+xhik0hx0DOYepLI8LV5tF29hHWj1n0YzAPF9A9p9PfpjL10+huAJ6vesCwd6ukf9r5eWq0pAHzZdLOmqzTv9fb+eZB4EMyzt1QnmJsKFxcubjInVLd41qw6AMMnZgEet/05h/tHG5dX/geX87wijt0QF1fPjuujN28/eM0RfTUx7c/9Khqt8N/nFOyzXNqD6PGria7t+zk0f/RzBHuaS38AFvC3Xcuc+5zHGg2icJlX83Db+Anzhk/msvYFKXCrQfKDYDltF4ruotHWoei60YVEo88rEO2rOdrTr3yZ35xVP9TQ8yzyTdXsn1ev414L6G/jxJH+h37nxJLIZPgMwPaRE9dauBJ2j1ovrIf5NEuu/qquLfdWv4k97WkY0jeUmKYqu7ZXXD6gnGoq0X9sNfQ8xd4EXNI/RHpiHZ9EKsOnFmy/HZGgrfz6RS1VYeLRW88UUYk/gAn6URr9AzpjH532Bph0klLz4vCcfNqRw2sh5udIdCxK+Gx2B9GsYk4lutKjczcc6oqK/50b/zOYvIZNG6XhozTaKO5gdCT7Vh4FYbe6BpRRJkUd8+TNZ++pHJtTnAemzHnNxcbuRv3o+rHr0Y8PdD6YVD2ptmdz5Gf185b6ZzaZWXlgUtekRVUsc1PhzKU9fZ9FbgaTb4VtqmKaZvi6t30Ewx+NF3TPMBGrNpW1gb90pVZStv534sqz07E1hoR44cs12PS7I8Tf9aTsUit4zm3/g+t46rfDYu2Ia6aOP5Xv/FvOen5sHspgO6Tfr4y2Hv4okRUZkzzcPPK/beOyp1qrYX7Yl139Rrc6X2o/p255fpeMs8L216vXoQcizJFzYkmvLMyJw/EHaQ7T9ZCzrLd6s7PR/dk25/+tmua/OzqYMgfdSBSVJxflmaDzSZvBi38hKN6hIBJLcIJp9ZeoJqHj9tfzqIlKFhb82EchvASvGxEeDHORTDgJgVUwOMSYYfO/mhhMyN7C/tkisTfbal+NDyVkv8X+yQKO2KebXlKWHlhNUjB/wGkXGYwrbMr0P8HfSsaTOMp02vHF5h/4S/evJiuYD+j4BRApBGEgoBMWHdYOADyTk+QxcoKcKCeLECEGp4TNJjFBOviAkCeNDrPKY+QEkUjwSaPBIY+RE0Qi5zRFujhvYvcskcfICXLipIyw2RzSeVI9d5vIY+QEkcgzSgSZoACPTFy3xTABWGGRBrmKG6ioWJnZpBYGyyWHnPItOs++vwjOc6q76SKXHCKh4ChtYL2ppmqi5k/Iy1shbF45uZsW5JJDTtFJ+2YWxgBhcskhkveVTCvLCAB8nyONds3R128xGCPDa5dVoFtxBA35LD1mui202seA9I/iWHGcOF6cIE4UJ4mTxSm+qakT1dg+BwvqAk5t3HgCLThhGLWOL6gVpaRLrxdA9HfRr9UNtFqw59qR49nj1mTktHianBHPkPPB83aSC+IFcmnXL9lAJfjZW+m7D/i4UqTlpzck+MutdX6n38MQgt/vGCbsAZO/nvHNI2fW/xlXZv3j3RtBVQ+TBwZ/TwIAQ/4AQ/dl92zTIK4SN3p1WeK9tZ1PvfoO9OIDUF7ufsmgDPEwEQ+7ZmvTl7Eg8J6GpDv8/tJ51tbez3VqQ7ITa6b/7LGcBXGju0sTboztO8UL8TCaibgx2iXz+fuyUbV5Xgv6740Yb5mZs8NxXP967NHGzXTZu5Srz4m8g2K8sVDG9W90j7RFrMIk8Pf7EIn/vvrFQEEPZAvWzL7nWEs8GeZzTVoSKIlhHP7rtUejHiFsVl6NkApo6l5pl641T70oy3SPiJ35K98hUf/Ztp6nWbuxHiCPmtKeFREj3p5mxw4DPUMRFhdYQhO4hop7ip1RCjhAAKygnMgpW43YtxrVS1AhKgqqfV2D9992q+LvcSVJkqplDFT8fRroafiMyrKDJLY6+3kDy7ara3tSev66c6ck03tc9sSFQGDIGsQp6cG+skK8+BfT7sj13s0ntGdDV70+diSZ8Pckmbzg35sfp/v/XZpXk7+9V//qOHf/1rXD/73afod+0RcCqns/T/xlztxM1v1PIIhngI9vn7iDgM8en0itpzzdyQ4CWjBAQI8sY4khTDk4RD6PMyp/8Jwn5HtrPPcRZbnk2UE9VP0o+RV+0EjJIDIe2MK/jUUS+PsU/ur6c6Le1yZ0ATs6xVLna8kv0AkHtf9Cj8+QhwzTBGOf7SbuU/G8N8XLcO8ybcSzmxXspwh/kPI4keRniMrbf8p3NLkiukFJUYDUWrAu+RAllq46EV7TUBERWM+gQGCH431dY3P5JSJ5yykT5UeeoSRK/1mhtlHHQMpaRfQl1wnFc173dn2EsWwkSI+TzSCeqZNBylp1k2ouS+4TEaNBlE5EGlhTDosKiSfIC6gCP/AEJUSDFgaDKuTRIDlEgB0owJK75uDArezCPZvTt53bnzyzg7fC33UyAESUgFfBZD8avLc5lmZ0AoEl0YaKhoQmWE2QIt77nZ3Q7VdZzX/CHy/dsx3kE9OEyg8518gxhBOs1ML1XOvQpkifMYi0d1ERotrW0XmA+oYx7HxEOz4uI+J4FFR03YFILVvb1PpaIkGGjJ+gdHAEFeclEMM48AB3EsYAF+4L10QYvHLG2cUH1D0CdXAJQvAjdMFCcNSshPqadXx7idfOOtAEz6BZ9IHMXSVeQWAH6Jadkjtya5SNlNUT/YM8MCrjHw02fHflKOsPByGQUQwoxcjXKyavqbNeBNRgA3i0+LQJ4h5nE4wXehNCsDNu0t6EYmHTJgwqwzbh8RW/CZ+CamNzXIo4AkQxIJHjpvjgssYBljEqk6VchBpZShXJkSpPkQKFasTIk6tIrTKxapUrUsNILkSDGlWyRDtxjy5usUK1Idx+PqrlqFKkQo1qKtWKlFIxqlLATZxQ0TX7Xix2bcBISVZVlS/XqJycFxVf7jzXd6gWK06skN2xMugv3wK1SmWpurbF8sKLDmJUoVGVNZAndx68ySWNIM+hohHv7G5ULE/OUjZA7a1oGa/hIcs53qLZAkXmorWyqeTcf6jQAEYqmTz5twve3gd1Uz5RqxNs++XV45F5F2YUMNLxMByVba0cvSawYy+Xg+cc5TnmhJOcOHOhdMppZ5ztinjLPeTzdM55BS6aaJ0+Xl7z7pf4gXnJZYWuGGwINY2XtIUjEoIVKVGqWLkyC4QIZRTmhXAVqlSrFCFSlGhX1ahT32SoFVMkxHZbvGkN9Bo1a9FkoVbrJXrTvfBNOVKqNG06dGqXLkMmg1d2+KcpiAX77I8Nc80j6P3I+ibm+pN1OT0VU8RDZr1O/88WehhhhpVYu3zy2ZdYhh1OuOGFj4ht4iNkzswAllYjLaawyEHDmWKg+SXCT2yDjQKZ4PrX/3T8HXLYJpttsdVKq+yxF4XDBtsIw4w2yhjdOUXiP8/02I0ZF0NNS4nnrXe2kbNmZbIsS5zKSJ6ueQARJpRhOV4wmS1Wm93ByMTMwiqbjZ1DjlxOLm4eXnnyFeRizum+jYWlbYx/GU9nbW8tdFVV93TXVuQk/turW9xOC9GRklMbF6+vLz93Ss80JrG49r6drVVtNdNauhK7Q6eg96yVTZHGgKi/Qkh9z+iZhPapPUp1/5EV9fn+uGRO/eE/bN7QXs+6Xe3HrznA1vBXC+Haum1tY/XV95xG8EgBYeAGgnMEQdCDIAxcQxC84jlM6iiqfMnLqdBpdu6I/4SMaWNjUgMGUgn7vgK8+msq4E2TMxt9p01ZIr/rQSTyCw+YEd+oE4tyTGYSFh8h6Etlz02Jq9Xf5X8rQXHtfxxgTr1PcF6nc17vFqd2t6VmnRBxp8mPCq8osltYXY1iqfrzU03sTfXz2purprU30Rpd87q/kEHeyrrsKtP/JwNu6Bo5niAaJW2wdbx8Gjz62tnWZZbEKGnNdgF4zREP2tXv21Wk50nUDd0ajicmioTcyI1jb7+fmGPEs6ddQzJH0wQA); - } + @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,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); } + @font-face { font-family: Nunito; src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPIrgp4Mt6IIcJZFNCfWmZY6KzqazTt6AiVHCFawzJ7V0CQBKoSQQEpFKrCVxiSFbqqqsaTevKs/q7s6uBYmujMyA9wxb6a7XnEOcNnDLgG4nW8PoPzHzYpS2uqp51pL3eB/xZoxIllCQc80B9o4j/4xMbxQB+j+SC3hsm6JmI8RMaHj+aJApW6ZbkXlg4vXSE5FECg0og6LzxP9pOarug4tF1RLpbHeZqLX0pIt2mfy3pNG6eyGaRIjrnrr/gv2c//yGdjpJ/7DuJLin5eIZRLaObBMM/NpYpuXJ8z3SE088mEFANcCARESfwChCioAwESsVxBgeyxp6+vZ3Xzv8uz7Ae8tRk+p6RUTPOR7BmlEgh+STsAimNuKibilyluhBNe5/wCACSBKrcykVfgyb+RYcK/TGq9yMyCt3bOskSnR1FqTLMSVBsMGLQVltDKKw2IYA+wcGxHJCINY9mDOCaN4IZEo1ChY4xNg8DaB0RxDqnbMNjXJJRzF9iInqahtm67M8dOHFvXaYbn+wrGxKG3YZI+2V4CW58ovdfV1tFHXFJJiPH7T1FAJxEgYo5BKkA5iDIVQluOqZYWhQapGF6TAFhaFAAoTBIZsCFHi/0oV3gpVKwbAA==); } + @font-face { font-family: Nunito; src: url(data:font/woff2;base64,d09GMgABAAAAAAI0AA4AAAAABLQAAAHeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPIrgpsY9TYDjGuJ1F+MUed8Q+Do8lDKF1uhErOw/f7/X7tcy+iEk0SUSWRLDGExBCqZYuETCJVS3jlW/rvPv/y4Fra6szKjvjBubd/Nui7lGEMuAbidbw+g/MfFilLa6qnnWkvd4H/FmjEiWUJBzzQH2jiP/jExvFAH6P5ILeGybomYjxExoeP5okC5TpFmecWVieTSw4FIFBuSJ4Vngd7SlWTd4eom7xMLI/zNBO/FJHO0i6T1Zo29kTTT5Ecc9Nf4b9kP/+RT8dQL/MVxGuKXlYhlEpoZMEgy8mRiGYc/001h9DIJhNS9DEhEBBF8QsQokANCJCI5QoKZLddfb/er5n9XZpln/DYYniZkJR+fpjdo1gCwS/pEkByzEzFRPwywYywwWaOVQCAJFDhTCbyMtz5NzKM+ZdJtQeZmfPVzlkWafcoio0oVoJK/QGDNsMiWn6lPh7sAJo3ujXOJwmjmUNvVJIPNzgSgQhtMDoJAmM/EPVmRd2Cwb7gUMZdoCNqiprKqu32bGxtjOs0w8O+gFG9obdhkj7ZHgJXvyi9V1VWUUeciDjE+P07FJBxPiCij0EiQBmINBFCV4aukhKBBImYd0UfgKZEAIBAxeEBHTKU6I9yhpVChXUCAAAA); } + @font-face { font-family: Nunito; src: url(data:font/woff2;base64,d09GMgABAAAAAAIsAA4AAAAABLQAAAHYAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wPILgps9xRFkFEihAtyRcm3sWFhmEeo5Dz8tx/rvpmPqESTBE0lkSBySERCJxSLhLR5U7Uk2jzt3GfnB66lLWNU8Qd04uTtzX70HcgYcA3E63iUZs1n9bQz7eUu8N8CjTixwAIOeKA/0MR/8IlNNx7oYzQf5NYwWddEjIfI+PDR3FGg0bAs9+b23pkrpIJSQKDRjCovPE/2jZqu6Di0XVEulttVWotfakj36YLLQQ0bl7KZpEiOueu9/Jf8839UqzEzzv0A8SF9YJxXCPUSunkwzXN3raIbN+dMdwjdfLKQYoILgYCoiV+AEKVoAwESscqBAvl55Pju68dV2/rv+py/wJu+4f2SMlM2UqnaudRKIPgl5Qwg9QWdJuKXJW6EE163fAIAZIEm97KoGvDi38iw4F8mrV7LbNNzvWJZY9CdqDWnXgiaTQYM2gtraOOVJkRwDlg4tn0SkYaxbEMck0ZwSaJRqNABxqZBYOkVojh71KwZ7AsSyrkLbERHXV9Tu92JA4cOLMs0w5N1BWPi0Fs3SZ8sz4GNN5Tea2tq6SLOqCTE+P1HKKCTCBAxxSAVoBxEkQqhDcdYQ4NCg1QMr04ALA0KABQmiQzYkKPBfpRLvBQqrwwDAA==); } + @font-face { font-family: Nunito; src: url(data:font/woff2;base64,d09GMgABAAAAAAIoAA4AAAAABLQAAAHVAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cLgZgP1NUQVREAAQRCAoAKgsEAAE2AiQDBAQgBYQkByAb5wMRFZQHZF8mb0PNXjkIbeHQ4UpbWDTlYMnK5cOfavAw/zzrESo5EbTf6+zdCyBIAqHiUlkJRMJHmIKskVWRFZ4Uelb50Iz7S0IKNNGB0oyDDbgkjnxA+VCvYpk1vog5la7RoxGwSoMFQHNIwf6bvMXbb7uB/zbQEScWUOABB/oDJf6DJ5YWB/oY5UFuDZN1TcR4iIwPH80dBd1mzcrh6sxZnRpoDQTd1qyp8Hzy6v/JPaP30LMHRmG53ZSD/CblWFLgqIbNBWE2y5SSY+mk9V/qr9Nr9rO2mFcC8rUMi6qITgWjClaVl+6tZxG4/ezyvYhiVKOKkiUQBNKW3wCR1gQCConGgYL6Vik5uYHBH+T6E3yc6OHLTplP/6g2k2hXQPgla1sH3lJf6DTJbxPEedV9bQIAqqDHcZWmC+/+j44tH3TR772uDr2oN6zbTDun2m3YKIReywFCxkEb6b7Skm4ghBglR9vyebxlKPLNt+27HjvxxGew/DGCDtQsGvyXTehdSPR6qVWpddg/nU/LMs3gtu7yCJFbt56xvjyH9E/ovVql2tAfnq0bv/9CILBNpk8584BQPeMxltJeuez6zONGyYS47AK4ke1Awmg5eZRnZSUd); } + @font-face { font-family: Nunito; src: url(data:font/woff2;base64,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); } @@ -97,7 +79,7 @@ exports[`exportToSvg > with default arguments 1`] = ` direction="ltr" dominant-baseline="alphabetic" fill="#000000" - font-family="Excalifont, Segoe UI Emoji" + font-family="Excalifont, Xiaolai, Segoe UI Emoji" font-size="20px" style="white-space: pre;" text-anchor="start" @@ -147,32 +129,14 @@ exports[`exportToSvg > with exportEmbedScene 1`] = ` eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1WW2vbMFx1MDAxNH7vrzDaa1llJ2myvGXrLoWxwTIorPRBtY5tYVlyJTmXhfz3SvJiOV7Z81x1MDAxYeJcdTAwMDfD+c5Vn76DvbuIXCJktjWgeYRgk1x1MDAxMs6oXCJrdOnwXHUwMDE1KM2ksK7E21o2KvWRhTH1/OqKS5tQSG3mI4xxm1x1MDAwNFx1MDAxYypcdTAwMTBG27B7a0fRzr+th1GXurpTT99cdTAwMTdZyVx1MDAwNE2e0mr69Wbx+ZdP9UFcdTAwMWJcdTAwMWIzjsedvXXdR9POXjNqXG6LxVx1MDAxOHdYXHUwMDAxLC/MXHUwMDAwJFwi527WgGijZFx0XHUwMDFmJJfKXHLyXHUwMDA2+ye0fiRpmSvZXGJcdTAwMWFi4lx0IY9ZiMlcdTAwMTjnS7PlLVx1MDAwYiQtXHUwMDFhXHUwMDA1aNDh7jDiXHUwMDAw7/K0tCyHLNsyL1x1MDAwNGh9lCNrkjKzXHUwMDFknMrNV99Sz+5DmEqRXG5uXHUwMDFkvaLhvF9Y0D+Fj1x1MDAxY5Z7cEQj0ju+XHUwMDA2oL7bOL6eTN/hWedcdDqIXHUwMDEzPES/SeE1XHUwMDExx7NcdTAwMTnG42R6XHUwMDFk2uhcdTAwMWKrXHUwMDA248tmhGtcYlS7yT5cdTAwMDalXHUwMDFjTdfUlLRJgVxyzkQ5jLPqK1+ofVAzZaSSglwij+8vz1r837VcdTAwMTifrlx1MDAxNoFzVms4a/G1aDE5XS1cdTAwMWHYmN7FSWGW7Lfz9M7g0E+kYtzxPFx0JVxcqi0hXHUwMDE1y5kgPDqudYB//jvMWVx1MDAwYs5yR1x1MDAxY+KQ9VxcljvD7D9F5zayXHUwMDBl3tRORZhcdTAwMDD195VaXHUwMDFl4Esn97dJmJk0Rv5cdTAwMDDdXHUwMDFl0TNyXsJXsoSj81x1MDAxMnZLXHUwMDE4XHUwMDA2P6UltG8vXHUwMDE0ROp6aSyx1t2uJFoxWL9/QfSZf9yX1K+wXHUwMDEzPbhb2u0v9s9cdTAwMGXWRI8ifQ== - original textoriginal text" + original textoriginal text" `; diff --git a/packages/excalidraw/utils.ts b/packages/excalidraw/utils.ts index ef8ab83082..8176b1a747 100644 --- a/packages/excalidraw/utils.ts +++ b/packages/excalidraw/utils.ts @@ -1,9 +1,11 @@ +import Pool from "es6-promise-pool"; import { average } from "../math"; import { COLOR_PALETTE } from "./colors"; import type { EVENT } from "./constants"; import { DEFAULT_VERSION, FONT_FAMILY, + getFontFamilyFallbacks, isDarwin, WINDOWS_EMOJI_FALLBACK_FONT, } from "./constants"; @@ -89,8 +91,10 @@ export const getFontFamilyString = ({ }) => { for (const [fontFamilyString, id] of Object.entries(FONT_FAMILY)) { if (id === fontFamily) { - // TODO: we should fallback first to generic family names first, rather than directly to the emoji font - return `${fontFamilyString}, ${WINDOWS_EMOJI_FALLBACK_FONT}`; + // TODO: we should fallback first to generic family names first + return `${fontFamilyString}${getFontFamilyFallbacks(id) + .map((x) => `, ${x}`) + .join("")}`; } } return WINDOWS_EMOJI_FALLBACK_FONT; @@ -721,6 +725,9 @@ export const isTestEnv = () => import.meta.env.MODE === "test"; export const isDevEnv = () => import.meta.env.MODE === "development"; +export const isServerEnv = () => + typeof process !== "undefined" && !!process?.env?.NODE_ENV; + export const wrapEvent = (name: EVENT, nativeEvent: T) => { return new CustomEvent(name, { detail: { @@ -1170,3 +1177,51 @@ export const safelyParseJSON = (json: string): Record | null => { return null; } }; +// extending the missing types +// relying on the [Index, T] to keep a correct order +type TPromisePool = Pool<[Index, T][]> & { + addEventListener: ( + type: "fulfilled", + listener: (event: { data: { result: [Index, T] } }) => void, + ) => (event: { data: { result: [Index, T] } }) => void; + removeEventListener: ( + type: "fulfilled", + listener: (event: { data: { result: [Index, T] } }) => void, + ) => void; +}; + +export class PromisePool { + private readonly pool: TPromisePool; + private readonly entries: Record = {}; + + constructor( + source: IterableIterator>, + concurrency: number, + ) { + this.pool = new Pool( + source as unknown as () => void | PromiseLike<[number, T][]>, + concurrency, + ) as TPromisePool; + } + + public all() { + const listener = (event: { data: { result: void | [number, T] } }) => { + if (event.data.result) { + // by default pool does not return the results, so we are gathering them manually + // with the correct call order (represented by the index in the tuple) + const [index, value] = event.data.result; + this.entries[index] = value; + } + }; + + this.pool.addEventListener("fulfilled", listener); + + return this.pool.start().then(() => { + setTimeout(() => { + this.pool.removeEventListener("fulfilled", listener); + }); + + return Object.values(this.entries); + }); + } +} diff --git a/packages/excalidraw/workers.ts b/packages/excalidraw/workers.ts new file mode 100644 index 0000000000..f56698aa55 --- /dev/null +++ b/packages/excalidraw/workers.ts @@ -0,0 +1,153 @@ +import { WorkerInTheMainChunkError, WorkerUrlNotDefinedError } from "./errors"; +import { debounce } from "./utils"; + +class IdleWorker { + public instance: Worker; + + constructor(workerUrl: URL) { + this.instance = new Worker(workerUrl, { type: "module" }); + } + + /** + * Use to prolong the worker's life by `workerTTL` or terminate it with a flush immediately. + */ + public debounceTerminate!: ReturnType; +} + +/** + * Pool of idle short-lived workers. + * + * IMPORTANT: for simplicity it does not limit the number of newly created workers, leaving it up to the caller to manage the pool size. + */ +export class WorkerPool { + private idleWorkers: Set = new Set(); + private readonly workerUrl: URL; + private readonly workerTTL: number; + + private constructor( + workerUrl: URL, + options: { + ttl?: number; + }, + ) { + this.workerUrl = workerUrl; + // by default, active & idle workers will be terminated after 500ms of inactivity + this.workerTTL = options.ttl || 500; + } + + /** + * Create a new worker pool. + * + * @param workerUrl - The URL of the worker file. + * @param options - The options for the worker pool. + * @throws If the worker is bundled into the main chunk. + * @returns A new worker pool instance. + */ + public static create( + workerUrl: URL | undefined, + options: { + ttl?: number; + } = {}, + ): WorkerPool { + if (!workerUrl) { + throw new WorkerUrlNotDefinedError(); + } + + if (!import.meta.url || workerUrl.toString() === import.meta.url) { + // in case the worker code is bundled into the main chunk + throw new WorkerInTheMainChunkError(); + } + + return new WorkerPool(workerUrl, options); + } + + /** + * Take idle worker from the pool or create a new one and post a message to it. + */ + public async postMessage( + data: T, + options: StructuredSerializeOptions, + ): Promise { + let worker: IdleWorker; + + const idleWorker = Array.from(this.idleWorkers).shift(); + if (idleWorker) { + this.idleWorkers.delete(idleWorker); + worker = idleWorker; + } else { + worker = await this.createWorker(); + } + + return new Promise((resolve, reject) => { + worker.instance.onmessage = this.onMessageHandler(worker, resolve); + worker.instance.onerror = this.onErrorHandler(worker, reject); + + worker.instance.postMessage(data, options); + worker.debounceTerminate(() => + reject( + new Error(`Active worker did not respond for ${this.workerTTL}ms!`), + ), + ); + }); + } + + /** + * Terminate the idle workers in the pool. + */ + public async clear() { + for (const worker of this.idleWorkers) { + worker.debounceTerminate.cancel(); + worker.instance.terminate(); + } + + this.idleWorkers.clear(); + } + + /** + * Used to get a worker from the pool or create a new one if there is no idle available. + */ + private async createWorker(): Promise { + const worker = new IdleWorker(this.workerUrl); + + worker.debounceTerminate = debounce((reject?: () => void) => { + worker.instance.terminate(); + + if (this.idleWorkers.has(worker)) { + this.idleWorkers.delete(worker); + + // eslint-disable-next-line no-console + console.debug( + "Job finished! Idle worker has been released from the pool.", + ); + } else if (reject) { + reject(); + } else { + console.error("Worker has been terminated!"); + } + }, this.workerTTL); + + return worker; + } + + private onMessageHandler(worker: IdleWorker, resolve: (value: R) => void) { + return (e: { data: R }) => { + worker.debounceTerminate(); + this.idleWorkers.add(worker); + resolve(e.data); + }; + } + + private onErrorHandler( + worker: IdleWorker, + reject: (reason: ErrorEvent) => void, + ) { + return (e: ErrorEvent) => { + // terminate the worker immediately before rejection + worker.debounceTerminate(() => reject(e)); + worker.debounceTerminate.flush(); + + // clear the worker pool in case there are some idle workers left + this.clear(); + }; + } +} diff --git a/scripts/buildPackage.js b/scripts/buildPackage.js index a1699e3d6c..4efd8663f4 100644 --- a/scripts/buildPackage.js +++ b/scripts/buildPackage.js @@ -97,8 +97,7 @@ const createESMBrowserBuild = async () => { // ); // }); -const rawConfig = { - entryPoints: ["index.tsx"], +const rawConfigCommon = { bundle: true, format: "esm", plugins: [sassPlugin()], @@ -107,28 +106,55 @@ const rawConfig = { ".woff2": "file", }, packages: "external", + // chunks are always external, so they are not bundled within and get build separately + external: ["*.chunk"], }; -const createESMRawBuild = async () => { - // Development unminified build with source maps - await build({ - ...rawConfig, +const rawConfigIndex = { + ...rawConfigCommon, + entryPoints: ["index.tsx"], +}; + +const rawConfigChunks = { + ...rawConfigCommon, + // create a separate chunk for each + entryPoints: ["**/*.chunk.ts"], +}; + +function buildDev(chunkConfig) { + const config = { + ...chunkConfig, sourcemap: true, - outdir: "dist/dev", define: { "import.meta.env": JSON.stringify({ DEV: true }), }, - }); + outdir: "dist/dev", + }; - // production minified build without sourcemaps - await build({ - ...rawConfig, + return build(config); +} + +function buildProd(chunkConfig) { + const config = { + ...chunkConfig, minify: true, - outdir: "dist/prod", define: { "import.meta.env": JSON.stringify({ PROD: true }), }, - }); + outdir: "dist/prod", + }; + + return build(config); +} + +const createESMRawBuild = async () => { + // development unminified build with source maps + await buildDev(rawConfigIndex); + await buildDev(rawConfigChunks); + + // production minified buld without sourcemaps + await buildProd(rawConfigIndex); + await buildProd(rawConfigChunks); }; createESMRawBuild(); diff --git a/scripts/buildUtils.js b/scripts/buildUtils.js index 269119cbd7..6e4780a816 100644 --- a/scripts/buildUtils.js +++ b/scripts/buildUtils.js @@ -82,7 +82,6 @@ const rawConfig = { entryPoints: ["index.ts"], bundle: true, format: "esm", - packages: "external", }; // const BASE_PATH = `${path.resolve(`${__dirname}/..`)}`; diff --git a/scripts/buildWasm.js b/scripts/buildWasm.js index aaae5e2c9f..062e733afd 100644 --- a/scripts/buildWasm.js +++ b/scripts/buildWasm.js @@ -8,12 +8,12 @@ const wasmModules = [ { pkg: `../node_modules/fonteditor-core`, src: `./wasm/woff2.wasm`, - dest: `../packages/excalidraw/fonts/wasm/woff2.wasm.ts`, + dest: `../packages/excalidraw/fonts/wasm/woff2-wasm.ts`, }, { pkg: `../node_modules/harfbuzzjs`, src: `./wasm/hb-subset.wasm`, - dest: `../packages/excalidraw/fonts/wasm/hb-subset.wasm.ts`, + dest: `../packages/excalidraw/fonts/wasm/hb-subset-wasm.ts`, }, ]; @@ -35,7 +35,7 @@ for (const { pkg, src, dest } of wasmModules) { const licenseContent = fs.readFileSync(licensePath, "utf-8") || ""; const base64 = fs.readFileSync(sourcePath, "base64"); const content = `// GENERATED CODE -- DO NOT EDIT! -/* eslint-disable prettier/prettier */ +/* eslint-disable */ // @ts-nocheck /** diff --git a/scripts/woff2/assets/NotoEmoji-Regular-2048.ttf b/scripts/woff2/assets/NotoEmoji-Regular-2048.ttf new file mode 100644 index 0000000000..608947be4f Binary files /dev/null and b/scripts/woff2/assets/NotoEmoji-Regular-2048.ttf differ diff --git a/scripts/woff2/assets/NotoEmoji-Regular.ttf b/scripts/woff2/assets/NotoEmoji-Regular.ttf index a01efc0898..f68173bd46 100644 Binary files a/scripts/woff2/assets/NotoEmoji-Regular.ttf and b/scripts/woff2/assets/NotoEmoji-Regular.ttf differ diff --git a/scripts/woff2/assets/Xiaolai-Regular.ttf b/scripts/woff2/assets/Xiaolai-Regular.ttf new file mode 100644 index 0000000000..c8673de7c3 Binary files /dev/null and b/scripts/woff2/assets/Xiaolai-Regular.ttf differ diff --git a/scripts/woff2/woff2-esbuild-plugins.js b/scripts/woff2/woff2-esbuild-plugins.js index d332edf30f..bcb59ec1d2 100644 --- a/scripts/woff2/woff2-esbuild-plugins.js +++ b/scripts/woff2/woff2-esbuild-plugins.js @@ -11,7 +11,7 @@ const { Font } = require("fonteditor-core"); * 2. convert all the imported fonts (including those from cdn) at build time into .ttf (since Resvg does not support woff2, neither inlined dataurls - https://github.com/RazrFalcon/resvg/issues/541) * - merging multiple woff2 into one ttf (for same families with different unicode ranges) * - deduplicating glyphs due to the merge process - * - merging emoji font for each + * - merging fallback font for each * - printing out font metrics * * @returns {import("esbuild").Plugin} @@ -93,7 +93,6 @@ module.exports.woff2ServerPlugin = (options = {}) => { }, ); - // TODO: strip away some unnecessary glyphs build.onEnd(async () => { if (!generateTtf) { return; @@ -109,15 +108,48 @@ module.exports.woff2ServerPlugin = (options = {}) => { return; } + const xiaolaiPath = path.resolve( + __dirname, + "./assets/Xiaolai-Regular.ttf", + ); + const emojiPath = path.resolve( + __dirname, + "./assets/NotoEmoji-Regular.ttf", + ); + + // need to use the same em size as built-in fonts, otherwise pyftmerge throws (modified manually with font forge) + const emojiPath_2048 = path.resolve( + __dirname, + "./assets/NotoEmoji-Regular-2048.ttf", + ); + + const xiaolaiFont = Font.create(fs.readFileSync(xiaolaiPath), { + type: "ttf", + }); + const emojiFont = Font.create(fs.readFileSync(emojiPath), { + type: "ttf", + }); + const sortedFonts = Array.from(fonts.entries()).sort( ([family1], [family2]) => (family1 > family2 ? 1 : -1), ); // for now we are interested in the regular families only for (const [family, { Regular }] of sortedFonts) { - const baseFont = Regular[0]; + if (family.includes("Xiaolai")) { + // don't generate ttf for Xiaolai, as we have it hardcoded as one ttf + continue; + } - const tempFilePaths = Regular.map((_, index) => + const fallbackFontsPaths = []; + const shouldIncludeXiaolaiFallback = family.includes("Excalifont"); + + if (shouldIncludeXiaolaiFallback) { + fallbackFontsPaths.push(xiaolaiPath); + } + + const baseFont = Regular[0]; + const tempPaths = Regular.map((_, index) => path.resolve(outputDir, `temp_${family}_${index}.ttf`), ); @@ -128,45 +160,28 @@ module.exports.woff2ServerPlugin = (options = {}) => { } // write down the buffer - fs.writeFileSync(tempFilePaths[index], font.write({ type: "ttf" })); + fs.writeFileSync(tempPaths[index], font.write({ type: "ttf" })); } - const emojiFilePath = path.resolve( - __dirname, - "./assets/NotoEmoji-Regular.ttf", - ); - - const emojiBuffer = fs.readFileSync(emojiFilePath); - const emojiFont = Font.create(emojiBuffer, { type: "ttf" }); - - // hack so that: - // - emoji font has same metrics as the base font, otherwise pyftmerge throws due to different unitsPerEm - // - emoji font glyphs are adjusted based to the base font glyphs, otherwise the glyphs don't match - const patchedEmojiFont = Font.create({ - ...baseFont.data, - glyf: baseFont.find({ unicode: [65] }), // adjust based on the "A" glyph (does not have to be first) - }).merge(emojiFont, { adjustGlyf: true }); - - const emojiTempFilePath = path.resolve( - outputDir, - `temp_${family}_Emoji.ttf`, - ); - fs.writeFileSync( - emojiTempFilePath, - patchedEmojiFont.write({ type: "ttf" }), - ); - const mergedFontPath = path.resolve(outputDir, `${family}.ttf`); + if (baseFont.data.head.unitsPerEm === 2048) { + fallbackFontsPaths.push(emojiPath_2048); + } else { + fallbackFontsPaths.push(emojiPath); + } + + // drop Vertical related metrics, otherwise it does not allow us to merge the fonts + // vhea (Vertical Header Table) + // vmtx (Vertical Metrics Table) execSync( - `pyftmerge --output-file="${mergedFontPath}" "${tempFilePaths.join( + `pyftmerge --drop-tables=vhea,vmtx --output-file="${mergedFontPath}" "${tempPaths.join( '" "', - )}" "${emojiTempFilePath}"`, + )}" "${fallbackFontsPaths.join('" "')}"`, ); // cleanup - fs.rmSync(emojiTempFilePath); - for (const path of tempFilePaths) { + for (const path of tempPaths) { fs.rmSync(path); } @@ -177,13 +192,22 @@ module.exports.woff2ServerPlugin = (options = {}) => { hinting: true, }); - // keep copyright & licence per both fonts, as per the OFL licence + const getNameField = (field) => { + const base = baseFont.data.name[field]; + const xiaolai = xiaolaiFont.data.name[field]; + const emoji = emojiFont.data.name[field]; + + return shouldIncludeXiaolaiFallback + ? `${base} & ${xiaolai} & ${emoji}` + : `${base} & ${emoji}`; + }; + mergedFont.set({ ...mergedFont.data, name: { ...mergedFont.data.name, - copyright: `${baseFont.data.name.copyright} & ${emojiFont.data.name.copyright}`, - licence: `${baseFont.data.name.licence} & ${emojiFont.data.name.licence}`, + copyright: getNameField("copyright"), + licence: getNameField("licence"), }, }); @@ -194,7 +218,7 @@ module.exports.woff2ServerPlugin = (options = {}) => { console.info(`Generated "${family}"`); if (Regular.length > 1) { console.info( - `- by merging ${Regular.length} woff2 files and 1 emoji ttf file`, + `- by merging ${Regular.length} woff2 fonts and related fallback fonts`, ); } console.info( diff --git a/setupTests.ts b/setupTests.ts index 56a16db5c2..b8bcd156ca 100644 --- a/setupTests.ts +++ b/setupTests.ts @@ -34,12 +34,14 @@ Object.defineProperty(window, "FontFace", { private source: string; private descriptors: any; private status: string; + private unicodeRange: string; constructor(family, source, descriptors) { this.family = family; this.source = source; this.descriptors = descriptors; this.status = "unloaded"; + this.unicodeRange = "U+0000-00FF"; } load() { @@ -61,27 +63,26 @@ Object.defineProperty(window, "EXCALIDRAW_ASSET_PATH", { value: `file://${__dirname}/`, }); +// mock the font fetch only, so that everything else, as font subsetting, can run inside of the (snapshot) tests vi.mock( - "./packages/excalidraw/fonts/ExcalidrawFont", + "./packages/excalidraw/fonts/ExcalidrawFontFace", async (importOriginal) => { const mod = await importOriginal< - typeof import("./packages/excalidraw/fonts/ExcalidrawFont") + typeof import("./packages/excalidraw/fonts/ExcalidrawFontFace") >(); - const ExcalidrawFontImpl = mod.ExcalidrawFont; + const ExcalidrawFontFaceImpl = mod.ExcalidrawFontFace; return { ...mod, - ExcalidrawFont: class extends ExcalidrawFontImpl { - public async getContent(): Promise { - const url = this.urls[0]; - - if (url.protocol !== "file:") { - return super.getContent(new Set()); + ExcalidrawFontFace: class extends ExcalidrawFontFaceImpl { + public async fetchFont(url: URL): Promise { + if (!url.toString().startsWith("file://")) { + return super.fetchFont(url); } // read local assets directly, without running a server const content = await fs.promises.readFile(url); - return `data:font/woff2;base64,${content.toString("base64")}`; + return content.buffer; } }, }; diff --git a/yarn.lock b/yarn.lock index 6c022abe32..d593b2a635 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5699,6 +5699,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise-pool@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz#147c612b36b47f105027f9d2bf54a598a99d9ccb" + integrity sha512-VHErXfzR/6r/+yyzPKeBvO0lgjfC5cbDCQWjWwMZWSb6YU39TGIl51OUmCfWCq4ylMdJSB8zkz2vIuIeIxXApA== + esbuild-plugin-external-global@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esbuild-plugin-external-global/-/esbuild-plugin-external-global-1.0.1.tgz#e3bba0e3a561f61b395bec0984a90ed0de06c4ce"