ImageFont.py 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338
  1. #
  2. # The Python Imaging Library.
  3. # $Id$
  4. #
  5. # PIL raster font management
  6. #
  7. # History:
  8. # 1996-08-07 fl created (experimental)
  9. # 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3
  10. # 1999-02-06 fl rewrote most font management stuff in C
  11. # 1999-03-17 fl take pth files into account in load_path (from Richard Jones)
  12. # 2001-02-17 fl added freetype support
  13. # 2001-05-09 fl added TransposedFont wrapper class
  14. # 2002-03-04 fl make sure we have a "L" or "1" font
  15. # 2002-12-04 fl skip non-directory entries in the system path
  16. # 2003-04-29 fl add embedded default font
  17. # 2003-09-27 fl added support for truetype charmap encodings
  18. #
  19. # Todo:
  20. # Adapt to PILFONT2 format (16-bit fonts, compressed, single file)
  21. #
  22. # Copyright (c) 1997-2003 by Secret Labs AB
  23. # Copyright (c) 1996-2003 by Fredrik Lundh
  24. #
  25. # See the README file for information on usage and redistribution.
  26. #
  27. from __future__ import annotations
  28. import base64
  29. import os
  30. import sys
  31. import warnings
  32. from enum import IntEnum
  33. from io import BytesIO
  34. from types import ModuleType
  35. from typing import IO, TYPE_CHECKING, Any, BinaryIO, TypedDict, cast
  36. from . import Image, features
  37. from ._typing import StrOrBytesPath
  38. from ._util import DeferredError, is_path
  39. if TYPE_CHECKING:
  40. from . import ImageFile
  41. from ._imaging import ImagingFont
  42. from ._imagingft import Font
  43. class Axis(TypedDict):
  44. minimum: int | None
  45. default: int | None
  46. maximum: int | None
  47. name: bytes | None
  48. class Layout(IntEnum):
  49. BASIC = 0
  50. RAQM = 1
  51. MAX_STRING_LENGTH = 1_000_000
  52. core: ModuleType | DeferredError
  53. try:
  54. from . import _imagingft as core
  55. except ImportError as ex:
  56. core = DeferredError.new(ex)
  57. def _string_length_check(text: str | bytes | bytearray) -> None:
  58. if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH:
  59. msg = "too many characters in string"
  60. raise ValueError(msg)
  61. # FIXME: add support for pilfont2 format (see FontFile.py)
  62. # --------------------------------------------------------------------
  63. # Font metrics format:
  64. # "PILfont" LF
  65. # fontdescriptor LF
  66. # (optional) key=value... LF
  67. # "DATA" LF
  68. # binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox)
  69. #
  70. # To place a character, cut out srcbox and paste at dstbox,
  71. # relative to the character position. Then move the character
  72. # position according to dx, dy.
  73. # --------------------------------------------------------------------
  74. class ImageFont:
  75. """PIL font wrapper"""
  76. font: ImagingFont
  77. def _load_pilfont(self, filename: str) -> None:
  78. with open(filename, "rb") as fp:
  79. image: ImageFile.ImageFile | None = None
  80. root = os.path.splitext(filename)[0]
  81. for ext in (".png", ".gif", ".pbm"):
  82. if image:
  83. image.close()
  84. try:
  85. fullname = root + ext
  86. image = Image.open(fullname)
  87. except Exception:
  88. pass
  89. else:
  90. if image and image.mode in ("1", "L"):
  91. break
  92. else:
  93. if image:
  94. image.close()
  95. msg = f"cannot find glyph data file {root}.{{gif|pbm|png}}"
  96. raise OSError(msg)
  97. self.file = fullname
  98. self._load_pilfont_data(fp, image)
  99. image.close()
  100. def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None:
  101. # read PILfont header
  102. if file.readline() != b"PILfont\n":
  103. msg = "Not a PILfont file"
  104. raise SyntaxError(msg)
  105. file.readline().split(b";")
  106. self.info = [] # FIXME: should be a dictionary
  107. while True:
  108. s = file.readline()
  109. if not s or s == b"DATA\n":
  110. break
  111. self.info.append(s)
  112. # read PILfont metrics
  113. data = file.read(256 * 20)
  114. # check image
  115. if image.mode not in ("1", "L"):
  116. msg = "invalid font image mode"
  117. raise TypeError(msg)
  118. image.load()
  119. self.font = Image.core.font(image.im, data)
  120. def getmask(
  121. self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any
  122. ) -> Image.core.ImagingCore:
  123. """
  124. Create a bitmap for the text.
  125. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  126. maximum value of 255. Otherwise, it should have mode ``1``.
  127. :param text: Text to render.
  128. :param mode: Used by some graphics drivers to indicate what mode the
  129. driver prefers; if empty, the renderer may return either
  130. mode. Note that the mode is always a string, to simplify
  131. C-level implementations.
  132. .. versionadded:: 1.1.5
  133. :return: An internal PIL storage memory instance as defined by the
  134. :py:mod:`PIL.Image.core` interface module.
  135. """
  136. _string_length_check(text)
  137. Image._decompression_bomb_check(self.font.getsize(text))
  138. return self.font.getmask(text, mode)
  139. def getbbox(
  140. self, text: str | bytes | bytearray, *args: Any, **kwargs: Any
  141. ) -> tuple[int, int, int, int]:
  142. """
  143. Returns bounding box (in pixels) of given text.
  144. .. versionadded:: 9.2.0
  145. :param text: Text to render.
  146. :return: ``(left, top, right, bottom)`` bounding box
  147. """
  148. _string_length_check(text)
  149. width, height = self.font.getsize(text)
  150. return 0, 0, width, height
  151. def getlength(
  152. self, text: str | bytes | bytearray, *args: Any, **kwargs: Any
  153. ) -> int:
  154. """
  155. Returns length (in pixels) of given text.
  156. This is the amount by which following text should be offset.
  157. .. versionadded:: 9.2.0
  158. """
  159. _string_length_check(text)
  160. width, height = self.font.getsize(text)
  161. return width
  162. ##
  163. # Wrapper for FreeType fonts. Application code should use the
  164. # <b>truetype</b> factory function to create font objects.
  165. class FreeTypeFont:
  166. """FreeType font wrapper (requires _imagingft service)"""
  167. font: Font
  168. font_bytes: bytes
  169. def __init__(
  170. self,
  171. font: StrOrBytesPath | BinaryIO,
  172. size: float = 10,
  173. index: int = 0,
  174. encoding: str = "",
  175. layout_engine: Layout | None = None,
  176. ) -> None:
  177. # FIXME: use service provider instead
  178. if isinstance(core, DeferredError):
  179. raise core.ex
  180. if size <= 0:
  181. msg = f"font size must be greater than 0, not {size}"
  182. raise ValueError(msg)
  183. self.path = font
  184. self.size = size
  185. self.index = index
  186. self.encoding = encoding
  187. try:
  188. from packaging.version import parse as parse_version
  189. except ImportError:
  190. pass
  191. else:
  192. if freetype_version := features.version_module("freetype2"):
  193. if parse_version(freetype_version) < parse_version("2.9.1"):
  194. warnings.warn(
  195. "Support for FreeType 2.9.0 is deprecated and will be removed "
  196. "in Pillow 12 (2025-10-15). Please upgrade to FreeType 2.9.1 "
  197. "or newer, preferably FreeType 2.10.4 which fixes "
  198. "CVE-2020-15999.",
  199. DeprecationWarning,
  200. )
  201. if layout_engine not in (Layout.BASIC, Layout.RAQM):
  202. layout_engine = Layout.BASIC
  203. if core.HAVE_RAQM:
  204. layout_engine = Layout.RAQM
  205. elif layout_engine == Layout.RAQM and not core.HAVE_RAQM:
  206. warnings.warn(
  207. "Raqm layout was requested, but Raqm is not available. "
  208. "Falling back to basic layout."
  209. )
  210. layout_engine = Layout.BASIC
  211. self.layout_engine = layout_engine
  212. def load_from_bytes(f: IO[bytes]) -> None:
  213. self.font_bytes = f.read()
  214. self.font = core.getfont(
  215. "", size, index, encoding, self.font_bytes, layout_engine
  216. )
  217. if is_path(font):
  218. font = os.fspath(font)
  219. if sys.platform == "win32":
  220. font_bytes_path = font if isinstance(font, bytes) else font.encode()
  221. try:
  222. font_bytes_path.decode("ascii")
  223. except UnicodeDecodeError:
  224. # FreeType cannot load fonts with non-ASCII characters on Windows
  225. # So load it into memory first
  226. with open(font, "rb") as f:
  227. load_from_bytes(f)
  228. return
  229. self.font = core.getfont(
  230. font, size, index, encoding, layout_engine=layout_engine
  231. )
  232. else:
  233. load_from_bytes(cast(IO[bytes], font))
  234. def __getstate__(self) -> list[Any]:
  235. return [self.path, self.size, self.index, self.encoding, self.layout_engine]
  236. def __setstate__(self, state: list[Any]) -> None:
  237. path, size, index, encoding, layout_engine = state
  238. FreeTypeFont.__init__(self, path, size, index, encoding, layout_engine)
  239. def getname(self) -> tuple[str | None, str | None]:
  240. """
  241. :return: A tuple of the font family (e.g. Helvetica) and the font style
  242. (e.g. Bold)
  243. """
  244. return self.font.family, self.font.style
  245. def getmetrics(self) -> tuple[int, int]:
  246. """
  247. :return: A tuple of the font ascent (the distance from the baseline to
  248. the highest outline point) and descent (the distance from the
  249. baseline to the lowest outline point, a negative value)
  250. """
  251. return self.font.ascent, self.font.descent
  252. def getlength(
  253. self,
  254. text: str | bytes,
  255. mode: str = "",
  256. direction: str | None = None,
  257. features: list[str] | None = None,
  258. language: str | None = None,
  259. ) -> float:
  260. """
  261. Returns length (in pixels with 1/64 precision) of given text when rendered
  262. in font with provided direction, features, and language.
  263. This is the amount by which following text should be offset.
  264. Text bounding box may extend past the length in some fonts,
  265. e.g. when using italics or accents.
  266. The result is returned as a float; it is a whole number if using basic layout.
  267. Note that the sum of two lengths may not equal the length of a concatenated
  268. string due to kerning. If you need to adjust for kerning, include the following
  269. character and subtract its length.
  270. For example, instead of ::
  271. hello = font.getlength("Hello")
  272. world = font.getlength("World")
  273. hello_world = hello + world # not adjusted for kerning
  274. assert hello_world == font.getlength("HelloWorld") # may fail
  275. use ::
  276. hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning
  277. world = font.getlength("World")
  278. hello_world = hello + world # adjusted for kerning
  279. assert hello_world == font.getlength("HelloWorld") # True
  280. or disable kerning with (requires libraqm) ::
  281. hello = draw.textlength("Hello", font, features=["-kern"])
  282. world = draw.textlength("World", font, features=["-kern"])
  283. hello_world = hello + world # kerning is disabled, no need to adjust
  284. assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"])
  285. .. versionadded:: 8.0.0
  286. :param text: Text to measure.
  287. :param mode: Used by some graphics drivers to indicate what mode the
  288. driver prefers; if empty, the renderer may return either
  289. mode. Note that the mode is always a string, to simplify
  290. C-level implementations.
  291. :param direction: Direction of the text. It can be 'rtl' (right to
  292. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  293. Requires libraqm.
  294. :param features: A list of OpenType font features to be used during text
  295. layout. This is usually used to turn on optional
  296. font features that are not enabled by default,
  297. for example 'dlig' or 'ss01', but can be also
  298. used to turn off default font features for
  299. example '-liga' to disable ligatures or '-kern'
  300. to disable kerning. To get all supported
  301. features, see
  302. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  303. Requires libraqm.
  304. :param language: Language of the text. Different languages may use
  305. different glyph shapes or ligatures. This parameter tells
  306. the font which language the text is in, and to apply the
  307. correct substitutions as appropriate, if available.
  308. It should be a `BCP 47 language code
  309. <https://www.w3.org/International/articles/language-tags/>`_
  310. Requires libraqm.
  311. :return: Either width for horizontal text, or height for vertical text.
  312. """
  313. _string_length_check(text)
  314. return self.font.getlength(text, mode, direction, features, language) / 64
  315. def getbbox(
  316. self,
  317. text: str | bytes,
  318. mode: str = "",
  319. direction: str | None = None,
  320. features: list[str] | None = None,
  321. language: str | None = None,
  322. stroke_width: float = 0,
  323. anchor: str | None = None,
  324. ) -> tuple[float, float, float, float]:
  325. """
  326. Returns bounding box (in pixels) of given text relative to given anchor
  327. when rendered in font with provided direction, features, and language.
  328. Use :py:meth:`getlength()` to get the offset of following text with
  329. 1/64 pixel precision. The bounding box includes extra margins for
  330. some fonts, e.g. italics or accents.
  331. .. versionadded:: 8.0.0
  332. :param text: Text to render.
  333. :param mode: Used by some graphics drivers to indicate what mode the
  334. driver prefers; if empty, the renderer may return either
  335. mode. Note that the mode is always a string, to simplify
  336. C-level implementations.
  337. :param direction: Direction of the text. It can be 'rtl' (right to
  338. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  339. Requires libraqm.
  340. :param features: A list of OpenType font features to be used during text
  341. layout. This is usually used to turn on optional
  342. font features that are not enabled by default,
  343. for example 'dlig' or 'ss01', but can be also
  344. used to turn off default font features for
  345. example '-liga' to disable ligatures or '-kern'
  346. to disable kerning. To get all supported
  347. features, see
  348. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  349. Requires libraqm.
  350. :param language: Language of the text. Different languages may use
  351. different glyph shapes or ligatures. This parameter tells
  352. the font which language the text is in, and to apply the
  353. correct substitutions as appropriate, if available.
  354. It should be a `BCP 47 language code
  355. <https://www.w3.org/International/articles/language-tags/>`_
  356. Requires libraqm.
  357. :param stroke_width: The width of the text stroke.
  358. :param anchor: The text anchor alignment. Determines the relative location of
  359. the anchor to the text. The default alignment is top left,
  360. specifically ``la`` for horizontal text and ``lt`` for
  361. vertical text. See :ref:`text-anchors` for details.
  362. :return: ``(left, top, right, bottom)`` bounding box
  363. """
  364. _string_length_check(text)
  365. size, offset = self.font.getsize(
  366. text, mode, direction, features, language, anchor
  367. )
  368. left, top = offset[0] - stroke_width, offset[1] - stroke_width
  369. width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width
  370. return left, top, left + width, top + height
  371. def getmask(
  372. self,
  373. text: str | bytes,
  374. mode: str = "",
  375. direction: str | None = None,
  376. features: list[str] | None = None,
  377. language: str | None = None,
  378. stroke_width: float = 0,
  379. anchor: str | None = None,
  380. ink: int = 0,
  381. start: tuple[float, float] | None = None,
  382. ) -> Image.core.ImagingCore:
  383. """
  384. Create a bitmap for the text.
  385. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  386. maximum value of 255. If the font has embedded color data, the bitmap
  387. should have mode ``RGBA``. Otherwise, it should have mode ``1``.
  388. :param text: Text to render.
  389. :param mode: Used by some graphics drivers to indicate what mode the
  390. driver prefers; if empty, the renderer may return either
  391. mode. Note that the mode is always a string, to simplify
  392. C-level implementations.
  393. .. versionadded:: 1.1.5
  394. :param direction: Direction of the text. It can be 'rtl' (right to
  395. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  396. Requires libraqm.
  397. .. versionadded:: 4.2.0
  398. :param features: A list of OpenType font features to be used during text
  399. layout. This is usually used to turn on optional
  400. font features that are not enabled by default,
  401. for example 'dlig' or 'ss01', but can be also
  402. used to turn off default font features for
  403. example '-liga' to disable ligatures or '-kern'
  404. to disable kerning. To get all supported
  405. features, see
  406. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  407. Requires libraqm.
  408. .. versionadded:: 4.2.0
  409. :param language: Language of the text. Different languages may use
  410. different glyph shapes or ligatures. This parameter tells
  411. the font which language the text is in, and to apply the
  412. correct substitutions as appropriate, if available.
  413. It should be a `BCP 47 language code
  414. <https://www.w3.org/International/articles/language-tags/>`_
  415. Requires libraqm.
  416. .. versionadded:: 6.0.0
  417. :param stroke_width: The width of the text stroke.
  418. .. versionadded:: 6.2.0
  419. :param anchor: The text anchor alignment. Determines the relative location of
  420. the anchor to the text. The default alignment is top left,
  421. specifically ``la`` for horizontal text and ``lt`` for
  422. vertical text. See :ref:`text-anchors` for details.
  423. .. versionadded:: 8.0.0
  424. :param ink: Foreground ink for rendering in RGBA mode.
  425. .. versionadded:: 8.0.0
  426. :param start: Tuple of horizontal and vertical offset, as text may render
  427. differently when starting at fractional coordinates.
  428. .. versionadded:: 9.4.0
  429. :return: An internal PIL storage memory instance as defined by the
  430. :py:mod:`PIL.Image.core` interface module.
  431. """
  432. return self.getmask2(
  433. text,
  434. mode,
  435. direction=direction,
  436. features=features,
  437. language=language,
  438. stroke_width=stroke_width,
  439. anchor=anchor,
  440. ink=ink,
  441. start=start,
  442. )[0]
  443. def getmask2(
  444. self,
  445. text: str | bytes,
  446. mode: str = "",
  447. direction: str | None = None,
  448. features: list[str] | None = None,
  449. language: str | None = None,
  450. stroke_width: float = 0,
  451. anchor: str | None = None,
  452. ink: int = 0,
  453. start: tuple[float, float] | None = None,
  454. *args: Any,
  455. **kwargs: Any,
  456. ) -> tuple[Image.core.ImagingCore, tuple[int, int]]:
  457. """
  458. Create a bitmap for the text.
  459. If the font uses antialiasing, the bitmap should have mode ``L`` and use a
  460. maximum value of 255. If the font has embedded color data, the bitmap
  461. should have mode ``RGBA``. Otherwise, it should have mode ``1``.
  462. :param text: Text to render.
  463. :param mode: Used by some graphics drivers to indicate what mode the
  464. driver prefers; if empty, the renderer may return either
  465. mode. Note that the mode is always a string, to simplify
  466. C-level implementations.
  467. .. versionadded:: 1.1.5
  468. :param direction: Direction of the text. It can be 'rtl' (right to
  469. left), 'ltr' (left to right) or 'ttb' (top to bottom).
  470. Requires libraqm.
  471. .. versionadded:: 4.2.0
  472. :param features: A list of OpenType font features to be used during text
  473. layout. This is usually used to turn on optional
  474. font features that are not enabled by default,
  475. for example 'dlig' or 'ss01', but can be also
  476. used to turn off default font features for
  477. example '-liga' to disable ligatures or '-kern'
  478. to disable kerning. To get all supported
  479. features, see
  480. https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist
  481. Requires libraqm.
  482. .. versionadded:: 4.2.0
  483. :param language: Language of the text. Different languages may use
  484. different glyph shapes or ligatures. This parameter tells
  485. the font which language the text is in, and to apply the
  486. correct substitutions as appropriate, if available.
  487. It should be a `BCP 47 language code
  488. <https://www.w3.org/International/articles/language-tags/>`_
  489. Requires libraqm.
  490. .. versionadded:: 6.0.0
  491. :param stroke_width: The width of the text stroke.
  492. .. versionadded:: 6.2.0
  493. :param anchor: The text anchor alignment. Determines the relative location of
  494. the anchor to the text. The default alignment is top left,
  495. specifically ``la`` for horizontal text and ``lt`` for
  496. vertical text. See :ref:`text-anchors` for details.
  497. .. versionadded:: 8.0.0
  498. :param ink: Foreground ink for rendering in RGBA mode.
  499. .. versionadded:: 8.0.0
  500. :param start: Tuple of horizontal and vertical offset, as text may render
  501. differently when starting at fractional coordinates.
  502. .. versionadded:: 9.4.0
  503. :return: A tuple of an internal PIL storage memory instance as defined by the
  504. :py:mod:`PIL.Image.core` interface module, and the text offset, the
  505. gap between the starting coordinate and the first marking
  506. """
  507. _string_length_check(text)
  508. if start is None:
  509. start = (0, 0)
  510. def fill(width: int, height: int) -> Image.core.ImagingCore:
  511. size = (width, height)
  512. Image._decompression_bomb_check(size)
  513. return Image.core.fill("RGBA" if mode == "RGBA" else "L", size)
  514. return self.font.render(
  515. text,
  516. fill,
  517. mode,
  518. direction,
  519. features,
  520. language,
  521. stroke_width,
  522. anchor,
  523. ink,
  524. start[0],
  525. start[1],
  526. )
  527. def font_variant(
  528. self,
  529. font: StrOrBytesPath | BinaryIO | None = None,
  530. size: float | None = None,
  531. index: int | None = None,
  532. encoding: str | None = None,
  533. layout_engine: Layout | None = None,
  534. ) -> FreeTypeFont:
  535. """
  536. Create a copy of this FreeTypeFont object,
  537. using any specified arguments to override the settings.
  538. Parameters are identical to the parameters used to initialize this
  539. object.
  540. :return: A FreeTypeFont object.
  541. """
  542. if font is None:
  543. try:
  544. font = BytesIO(self.font_bytes)
  545. except AttributeError:
  546. font = self.path
  547. return FreeTypeFont(
  548. font=font,
  549. size=self.size if size is None else size,
  550. index=self.index if index is None else index,
  551. encoding=self.encoding if encoding is None else encoding,
  552. layout_engine=layout_engine or self.layout_engine,
  553. )
  554. def get_variation_names(self) -> list[bytes]:
  555. """
  556. :returns: A list of the named styles in a variation font.
  557. :exception OSError: If the font is not a variation font.
  558. """
  559. try:
  560. names = self.font.getvarnames()
  561. except AttributeError as e:
  562. msg = "FreeType 2.9.1 or greater is required"
  563. raise NotImplementedError(msg) from e
  564. return [name.replace(b"\x00", b"") for name in names]
  565. def set_variation_by_name(self, name: str | bytes) -> None:
  566. """
  567. :param name: The name of the style.
  568. :exception OSError: If the font is not a variation font.
  569. """
  570. names = self.get_variation_names()
  571. if not isinstance(name, bytes):
  572. name = name.encode()
  573. index = names.index(name) + 1
  574. if index == getattr(self, "_last_variation_index", None):
  575. # When the same name is set twice in a row,
  576. # there is an 'unknown freetype error'
  577. # https://savannah.nongnu.org/bugs/?56186
  578. return
  579. self._last_variation_index = index
  580. self.font.setvarname(index)
  581. def get_variation_axes(self) -> list[Axis]:
  582. """
  583. :returns: A list of the axes in a variation font.
  584. :exception OSError: If the font is not a variation font.
  585. """
  586. try:
  587. axes = self.font.getvaraxes()
  588. except AttributeError as e:
  589. msg = "FreeType 2.9.1 or greater is required"
  590. raise NotImplementedError(msg) from e
  591. for axis in axes:
  592. if axis["name"]:
  593. axis["name"] = axis["name"].replace(b"\x00", b"")
  594. return axes
  595. def set_variation_by_axes(self, axes: list[float]) -> None:
  596. """
  597. :param axes: A list of values for each axis.
  598. :exception OSError: If the font is not a variation font.
  599. """
  600. try:
  601. self.font.setvaraxes(axes)
  602. except AttributeError as e:
  603. msg = "FreeType 2.9.1 or greater is required"
  604. raise NotImplementedError(msg) from e
  605. class TransposedFont:
  606. """Wrapper for writing rotated or mirrored text"""
  607. def __init__(
  608. self, font: ImageFont | FreeTypeFont, orientation: Image.Transpose | None = None
  609. ):
  610. """
  611. Wrapper that creates a transposed font from any existing font
  612. object.
  613. :param font: A font object.
  614. :param orientation: An optional orientation. If given, this should
  615. be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM,
  616. Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or
  617. Image.Transpose.ROTATE_270.
  618. """
  619. self.font = font
  620. self.orientation = orientation # any 'transpose' argument, or None
  621. def getmask(
  622. self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any
  623. ) -> Image.core.ImagingCore:
  624. im = self.font.getmask(text, mode, *args, **kwargs)
  625. if self.orientation is not None:
  626. return im.transpose(self.orientation)
  627. return im
  628. def getbbox(
  629. self, text: str | bytes, *args: Any, **kwargs: Any
  630. ) -> tuple[int, int, float, float]:
  631. # TransposedFont doesn't support getmask2, move top-left point to (0, 0)
  632. # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont
  633. left, top, right, bottom = self.font.getbbox(text, *args, **kwargs)
  634. width = right - left
  635. height = bottom - top
  636. if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
  637. return 0, 0, height, width
  638. return 0, 0, width, height
  639. def getlength(self, text: str | bytes, *args: Any, **kwargs: Any) -> float:
  640. if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270):
  641. msg = "text length is undefined for text rotated by 90 or 270 degrees"
  642. raise ValueError(msg)
  643. return self.font.getlength(text, *args, **kwargs)
  644. def load(filename: str) -> ImageFont:
  645. """
  646. Load a font file. This function loads a font object from the given
  647. bitmap font file, and returns the corresponding font object. For loading TrueType
  648. or OpenType fonts instead, see :py:func:`~PIL.ImageFont.truetype`.
  649. :param filename: Name of font file.
  650. :return: A font object.
  651. :exception OSError: If the file could not be read.
  652. """
  653. f = ImageFont()
  654. f._load_pilfont(filename)
  655. return f
  656. def truetype(
  657. font: StrOrBytesPath | BinaryIO,
  658. size: float = 10,
  659. index: int = 0,
  660. encoding: str = "",
  661. layout_engine: Layout | None = None,
  662. ) -> FreeTypeFont:
  663. """
  664. Load a TrueType or OpenType font from a file or file-like object,
  665. and create a font object. This function loads a font object from the given
  666. file or file-like object, and creates a font object for a font of the given
  667. size. For loading bitmap fonts instead, see :py:func:`~PIL.ImageFont.load`
  668. and :py:func:`~PIL.ImageFont.load_path`.
  669. Pillow uses FreeType to open font files. On Windows, be aware that FreeType
  670. will keep the file open as long as the FreeTypeFont object exists. Windows
  671. limits the number of files that can be open in C at once to 512, so if many
  672. fonts are opened simultaneously and that limit is approached, an
  673. ``OSError`` may be thrown, reporting that FreeType "cannot open resource".
  674. A workaround would be to copy the file(s) into memory, and open that instead.
  675. This function requires the _imagingft service.
  676. :param font: A filename or file-like object containing a TrueType font.
  677. If the file is not found in this filename, the loader may also
  678. search in other directories, such as:
  679. * The :file:`fonts/` directory on Windows,
  680. * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/`
  681. and :file:`~/Library/Fonts/` on macOS.
  682. * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`,
  683. and :file:`/usr/share/fonts` on Linux; or those specified by
  684. the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables
  685. for user-installed and system-wide fonts, respectively.
  686. :param size: The requested size, in pixels.
  687. :param index: Which font face to load (default is first available face).
  688. :param encoding: Which font encoding to use (default is Unicode). Possible
  689. encodings include (see the FreeType documentation for more
  690. information):
  691. * "unic" (Unicode)
  692. * "symb" (Microsoft Symbol)
  693. * "ADOB" (Adobe Standard)
  694. * "ADBE" (Adobe Expert)
  695. * "ADBC" (Adobe Custom)
  696. * "armn" (Apple Roman)
  697. * "sjis" (Shift JIS)
  698. * "gb " (PRC)
  699. * "big5"
  700. * "wans" (Extended Wansung)
  701. * "joha" (Johab)
  702. * "lat1" (Latin-1)
  703. This specifies the character set to use. It does not alter the
  704. encoding of any text provided in subsequent operations.
  705. :param layout_engine: Which layout engine to use, if available:
  706. :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`.
  707. If it is available, Raqm layout will be used by default.
  708. Otherwise, basic layout will be used.
  709. Raqm layout is recommended for all non-English text. If Raqm layout
  710. is not required, basic layout will have better performance.
  711. You can check support for Raqm layout using
  712. :py:func:`PIL.features.check_feature` with ``feature="raqm"``.
  713. .. versionadded:: 4.2.0
  714. :return: A font object.
  715. :exception OSError: If the file could not be read.
  716. :exception ValueError: If the font size is not greater than zero.
  717. """
  718. def freetype(font: StrOrBytesPath | BinaryIO) -> FreeTypeFont:
  719. return FreeTypeFont(font, size, index, encoding, layout_engine)
  720. try:
  721. return freetype(font)
  722. except OSError:
  723. if not is_path(font):
  724. raise
  725. ttf_filename = os.path.basename(font)
  726. dirs = []
  727. if sys.platform == "win32":
  728. # check the windows font repository
  729. # NOTE: must use uppercase WINDIR, to work around bugs in
  730. # 1.5.2's os.environ.get()
  731. windir = os.environ.get("WINDIR")
  732. if windir:
  733. dirs.append(os.path.join(windir, "fonts"))
  734. elif sys.platform in ("linux", "linux2"):
  735. data_home = os.environ.get("XDG_DATA_HOME")
  736. if not data_home:
  737. # The freedesktop spec defines the following default directory for
  738. # when XDG_DATA_HOME is unset or empty. This user-level directory
  739. # takes precedence over system-level directories.
  740. data_home = os.path.expanduser("~/.local/share")
  741. xdg_dirs = [data_home]
  742. data_dirs = os.environ.get("XDG_DATA_DIRS")
  743. if not data_dirs:
  744. # Similarly, defaults are defined for the system-level directories
  745. data_dirs = "/usr/local/share:/usr/share"
  746. xdg_dirs += data_dirs.split(":")
  747. dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs]
  748. elif sys.platform == "darwin":
  749. dirs += [
  750. "/Library/Fonts",
  751. "/System/Library/Fonts",
  752. os.path.expanduser("~/Library/Fonts"),
  753. ]
  754. ext = os.path.splitext(ttf_filename)[1]
  755. first_font_with_a_different_extension = None
  756. for directory in dirs:
  757. for walkroot, walkdir, walkfilenames in os.walk(directory):
  758. for walkfilename in walkfilenames:
  759. if ext and walkfilename == ttf_filename:
  760. return freetype(os.path.join(walkroot, walkfilename))
  761. elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename:
  762. fontpath = os.path.join(walkroot, walkfilename)
  763. if os.path.splitext(fontpath)[1] == ".ttf":
  764. return freetype(fontpath)
  765. if not ext and first_font_with_a_different_extension is None:
  766. first_font_with_a_different_extension = fontpath
  767. if first_font_with_a_different_extension:
  768. return freetype(first_font_with_a_different_extension)
  769. raise
  770. def load_path(filename: str | bytes) -> ImageFont:
  771. """
  772. Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a
  773. bitmap font along the Python path.
  774. :param filename: Name of font file.
  775. :return: A font object.
  776. :exception OSError: If the file could not be read.
  777. """
  778. if not isinstance(filename, str):
  779. filename = filename.decode("utf-8")
  780. for directory in sys.path:
  781. try:
  782. return load(os.path.join(directory, filename))
  783. except OSError:
  784. pass
  785. msg = f'cannot find font file "{filename}" in sys.path'
  786. if os.path.exists(filename):
  787. msg += f', did you mean ImageFont.load("{filename}") instead?'
  788. raise OSError(msg)
  789. def load_default_imagefont() -> ImageFont:
  790. f = ImageFont()
  791. f._load_pilfont_data(
  792. # courB08
  793. BytesIO(
  794. base64.b64decode(
  795. b"""
  796. UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  797. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  798. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  799. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  800. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  801. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  802. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  803. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  804. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  805. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  806. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  807. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA
  808. BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL
  809. AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA
  810. AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB
  811. ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A
  812. BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB
  813. //kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA
  814. AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH
  815. AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA
  816. ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv
  817. AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/
  818. /gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5
  819. AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA
  820. AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG
  821. AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA
  822. BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA
  823. AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA
  824. 2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF
  825. AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA////
  826. +gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA
  827. ////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA
  828. BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv
  829. AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA
  830. AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA
  831. AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA
  832. BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP//
  833. //kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA
  834. AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF
  835. AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB
  836. mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn
  837. AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA
  838. AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7
  839. AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA
  840. Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA
  841. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  842. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  843. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  844. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  845. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  846. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  847. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  848. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  849. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  850. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  851. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  852. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB
  853. //sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA
  854. AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ
  855. AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC
  856. DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ
  857. AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/
  858. +wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5
  859. AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/
  860. ///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG
  861. AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA
  862. BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA
  863. Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC
  864. eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG
  865. AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA////
  866. +gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA
  867. ////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA
  868. BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT
  869. AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A
  870. AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA
  871. Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA
  872. Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP//
  873. //cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA
  874. AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ
  875. AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA
  876. LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5
  877. AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA
  878. AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5
  879. AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA
  880. AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG
  881. AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA
  882. EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK
  883. AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA
  884. pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG
  885. AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA////
  886. +QAGAAIAzgAKANUAEw==
  887. """
  888. )
  889. ),
  890. Image.open(
  891. BytesIO(
  892. base64.b64decode(
  893. b"""
  894. iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u
  895. Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9
  896. M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g
  897. LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F
  898. IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA
  899. Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791
  900. NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx
  901. in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9
  902. SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY
  903. AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt
  904. y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG
  905. ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY
  906. lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H
  907. /Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3
  908. AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47
  909. c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/
  910. /yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw
  911. pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv
  912. oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR
  913. evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA
  914. AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v//
  915. Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR
  916. w7IkEbzhVQAAAABJRU5ErkJggg==
  917. """
  918. )
  919. )
  920. ),
  921. )
  922. return f
  923. def load_default(size: float | None = None) -> FreeTypeFont | ImageFont:
  924. """If FreeType support is available, load a version of Aileron Regular,
  925. https://dotcolon.net/font/aileron, with a more limited character set.
  926. Otherwise, load a "better than nothing" font.
  927. .. versionadded:: 1.1.4
  928. :param size: The font size of Aileron Regular.
  929. .. versionadded:: 10.1.0
  930. :return: A font object.
  931. """
  932. if isinstance(core, ModuleType) or size is not None:
  933. return truetype(
  934. BytesIO(
  935. base64.b64decode(
  936. b"""
  937. AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA
  938. AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA
  939. MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh
  940. tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk
  941. OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/
  942. 2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ
  943. AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI
  944. BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA
  945. AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ
  946. AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk
  947. QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB
  948. kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC
  949. ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA
  950. EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg
  951. JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y
  952. AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q
  953. AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq
  954. QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB//
  955. //4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  956. AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT
  957. FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT
  958. U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA
  959. AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9
  960. ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO
  961. AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ
  962. gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG
  963. oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz
  964. qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA
  965. DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA
  966. P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA
  967. LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc
  968. jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb
  969. 2ziMONvb29s4jAAAAAMANf+mAg4DDAAfACYALAAAJRQGBxUjNS4BJzMeARcRLgE0Njc1MxUeARcjJ
  970. icVHgEBFBYXNQ4BExU+ATU0Ag5xWDpgcgRcBz41Xl9oVTpVYwpcC1ttXP6cLTQuM5szOrVRZwlOTQ
  971. ZqVzZECAEAGlukZAlOTQdrUG8O7iNlAQgxNhDlCDj+8/YGOjReAAAAAAUAKf/yArsCvAAHAAsAFQA
  972. dACcAABIyFhQGIiY0EyMBMwQiBhUUFjI2NTQSMhYUBiImNDYiBhUUFjI2NTR5iFBQiFCVVwHAV/5c
  973. OiMjOiPmiFBQiFCxOiMjOiMCvFaSVlaS/ZoCsjIzMC80NC8w/uNWklZWkhozMC80NC8wAAAAAgBA/
  974. /ICbgLAACIALgAAARUjEQYjIiY1NDY3LgE1NDYzMhcVJiMiBhUUFhcWOwE1MxUFFBYzMjc1IyIHDg
  975. ECbmBcYYOOVkg7R4hsQjY4Q0RNRD4SLDxW/pJUXzksPCkUUk0BgUb+zBVUZ0BkDw5RO1huCkULQzp
  976. COAMBcHDHRz0J/AIHRQAAAAEAKwHlAIUC3wADAAATIycze0YKWgHl+gAAAAABAGT/sAEXAwwACQAA
  977. EzMGEBcjLgE0Nt06dXU6OUBAAwzG/jDGVePs4wAAAAEAHv+wANEDDAAJAAATMx4BFAYHIzYQHjo5Q
  978. EA5OnUDDFXj7ONVxgHQAAAAAQBVAFIB2wHbAA4AAAE3FwcXBycHJzcnNxcnMwEtmxOfcTJjYzJxnx
  979. ObCj4BKD07KYolmZkliik7PbMAAQBQAFUB9AIlAAsAAAEjFSM1IzUzNTMVMwH0tTq1tTq1AR/Kyjj
  980. OzgAAAAAB/+H/iACMAGQABAAANwcjNzOMWlFOXVrS3AAAAQAgAP8A8gE3AAMAABMjNTPy0tIA/zgA
  981. AQAl//IApQByAAcAADYyFhQGIiY0STgkJDgkciQ4JCQ4AAAAAf/7/+IBNALQAAMAABcjEzM5Pvs+H
  982. gLuAAAAAAIAKf/yAhsCwAADAAcAABIgECA2IBAgKQHy/g5gATL+zgLA/TJEAkYAAAAAAQCCAAABlg
  983. KyAAgAAAERIxEHNTc2MwGWVr6SIygCsv1OAldxW1sWAAEAPAAAAg4CwAAZAAA3IRUhNRM+ATU0JiM
  984. iDwEjNz4BMzIWFRQGB7kBUv4x+kI2QTt+EAFWAQp8aGVtSl5GRjEA/0RVLzlLmAoKa3FsUkNxXQAA
  985. AAEALf/yAhYCwAAqAAABHgEVFAYjIi8BMxceATMyNjU0KwE1MzI2NTQmIyIGDwEjNz4BMzIWFRQGA
  986. YxBSZJo2RUBVgEHV0JBUaQREUBUQzc5TQcBVgEKfGhfcEMBbxJbQl1x0AoKRkZHPn9GSD80QUVCCg
  987. pfbGBPOlgAAAACACEAAAIkArIACgAPAAAlIxUjNSE1ATMRMyMRBg8BAiRXVv6qAVZWV60dHLCurq4
  988. rAdn+QgFLMibzAAABADn/8gIZArIAHQAAATIWFRQGIyIvATMXFjMyNjU0JiMiByMTIRUhBzc2ATNv
  989. d5Fl1RQBVgIad0VSTkVhL1IwAYj+vh8rMAHHgGdtgcUKCoFXTU5bYgGRRvAuHQAAAAACACv/8gITA
  990. sAAFwAjAAABMhYVFAYjIhE0NjMyFh8BIycmIyIDNzYTMjY1NCYjIgYVFBYBLmp7imr0l3RZdAgBXA
  991. IYZ5wKJzU6QVNJSz5SUAHSgWltiQFGxcNlVQoKdv7sPiz+ZF1LTmJbU0lhAAAAAQAyAAACGgKyAAY
  992. AAAEVASMBITUCGv6oXAFL/oECsij9dgJsRgAAAAMALP/xAhgCwAAWACAALAAAAR4BFRQGIyImNTQ2
  993. Ny4BNTQ2MhYVFAYmIgYVFBYyNjU0AzI2NTQmIyIGFRQWAZQ5S5BmbIpPOjA7ecp5P2F8Q0J8RIVJS
  994. 0pLTEtOAW0TXTxpZ2ZqPF0SE1A3VWVlVTdQ/UU0N0RENzT9/ko+Ok1NOj1LAAIAMf/yAhkCwAAXAC
  995. MAAAEyERQGIyImLwEzFxYzMhMHBiMiJjU0NhMyNjU0JiMiBhUUFgEl9Jd0WXQIAVwCGGecCic1SWp
  996. 7imo+UlBAQVNJAsD+usXDZVUKCnYBFD4sgWltif5kW1NJYV1LTmIAAAACACX/8gClAiAABwAPAAAS
  997. MhYUBiImNBIyFhQGIiY0STgkJDgkJDgkJDgkAiAkOCQkOP52JDgkJDgAAAAC/+H/iAClAiAABwAMA
  998. AASMhYUBiImNBMHIzczSTgkJDgkaFpSTl4CICQ4JCQ4/mba5gAAAQBnAB4B+AH0AAYAAAENARUlNS
  999. UB+P6qAVb+bwGRAbCmpkbJRMkAAAIAUAC7AfQBuwADAAcAAAEhNSERITUhAfT+XAGk/lwBpAGDOP8
  1000. AOAABAEQAHgHVAfQABgAAARUFNS0BNQHV/m8BVv6qAStEyUSmpkYAAAAAAgAj//IB1ALAABgAIAAA
  1001. ATIWFRQHDgEHIz4BNz4BNTQmIyIGByM+ARIyFhQGIiY0AQRibmktIAJWBSEqNig+NTlHBFoDezQ4J
  1002. CQ4JALAZ1BjaS03JS1DMD5LLDQ/SUVgcv2yJDgkJDgAAAAAAgA2/5gDFgKYADYAQgAAAQMGFRQzMj
  1003. Y1NCYjIg4CFRQWMzI2NxcGIyImNTQ+AjMyFhUUBiMiJwcGIyImNTQ2MzIfATcHNzYmIyIGFRQzMjY
  1004. Cej8EJjJJlnBAfGQ+oHtAhjUYg5OPx0h2k06Os3xRWQsVLjY5VHtdPBwJETcJDyUoOkZEJz8B0f74
  1005. EQ8kZl6EkTFZjVOLlyknMVm1pmCiaTq4lX6CSCknTVRmmR8wPdYnQzxuSWVGAAIAHQAAAncCsgAHA
  1006. AoAACUjByMTMxMjATMDAcj+UVz4dO5d/sjPZPT0ArL9TgE6ATQAAAADAGQAAAJMArIAEAAbACcAAA
  1007. EeARUUBgcGKwERMzIXFhUUJRUzMjc2NTQnJiMTPgE1NCcmKwEVMzIBvkdHZkwiNt7LOSGq/oeFHBt
  1008. hahIlSTM+cB8Yj5UWAW8QT0VYYgwFArIEF5Fv1eMED2NfDAL93AU+N24PBP0AAAAAAQAv//ICjwLA
  1009. ABsAAAEyFh8BIycmIyIGFRQWMzI/ATMHDgEjIiY1NDYBdX+PCwFWAiKiaHx5ZaIiAlYBCpWBk6a0A
  1010. sCAagoKpqN/gaOmCgplhcicn8sAAAIAZAAAAp8CsgAMABkAAAEeARUUBgcGKwERMzITPgE1NCYnJi
  1011. sBETMyAY59lJp8IzXN0jUVWmdjWRs5d3I4Aq4QqJWUug8EArL9mQ+PeHGHDgX92gAAAAABAGQAAAI
  1012. vArIACwAAJRUhESEVIRUhFSEVAi/+NQHB/pUBTf6zRkYCskbwRvAAAAABAGQAAAIlArIACQAAExUh
  1013. FSERIxEhFboBQ/69VgHBAmzwRv7KArJGAAAAAAEAL//yAo8CwAAfAAABMxEjNQcGIyImNTQ2MzIWH
  1014. wEjJyYjIgYVFBYzMjY1IwGP90wfPnWTprSSf48LAVYCIqJofHllVG+hAU3+s3hARsicn8uAagoKpq
  1015. N/gaN1XAAAAAEAZAAAAowCsgALAAABESMRIREjETMRIRECjFb+hFZWAXwCsv1OAS7+0gKy/sQBPAA
  1016. AAAABAGQAAAC6ArIAAwAAMyMRM7pWVgKyAAABADf/8gHoArIAEwAAAREUBw4BIyImLwEzFxYzMjc2
  1017. NREB6AIFcGpgbQIBVgIHfXQKAQKy/lYxIltob2EpKYyEFD0BpwAAAAABAGQAAAJ0ArIACwAACQEjA
  1018. wcVIxEzEQEzATsBJ3ntQlZWAVVlAWH+nwEnR+ACsv6RAW8AAQBkAAACLwKyAAUAACUVIREzEQIv/j
  1019. VWRkYCsv2UAAABAGQAAAMUArIAFAAAAREjETQ3BgcDIwMmJxYVESMRMxsBAxRWAiMxemx8NxsCVo7
  1020. MywKy/U4BY7ZLco7+nAFmoFxLtP6dArL9lwJpAAAAAAEAZAAAAoACsgANAAAhIwEWFREjETMBJjUR
  1021. MwKAhP67A1aEAUUDVAJeeov+pwKy/aJ5jAFZAAAAAgAv//ICuwLAAAkAEwAAEiAWFRQGICY1NBIyN
  1022. jU0JiIGFRTbATSsrP7MrNrYenrYegLAxaKhxsahov47nIeIm5uIhwACAGQAAAJHArIADgAYAAABHg
  1023. EVFAYHBisBESMRMzITNjQnJisBETMyAZRUX2VOHzuAVtY7GlxcGDWIiDUCrgtnVlVpCgT+5gKy/rU
  1024. V1BUF/vgAAAACAC//zAK9AsAAEgAcAAAlFhcHJiMiBwYjIiY1NDYgFhUUJRQWMjY1NCYiBgI9PUMx
  1025. UDcfKh8omqysATSs/dR62Hp62HpICTg7NgkHxqGixcWitbWHnJyHiJubAAIAZAAAAlgCsgAXACMAA
  1026. CUWFyMmJyYnJisBESMRMzIXHgEVFAYHFiUzMjc+ATU0JyYrAQIqDCJfGQwNWhAhglbiOx9QXEY1Tv
  1027. 6bhDATMj1lGSyMtYgtOXR0BwH+1wKyBApbU0BSESRAAgVAOGoQBAABADT/8gIoAsAAJQAAATIWFyM
  1028. uASMiBhUUFhceARUUBiMiJiczHgEzMjY1NCYnLgE1NDYBOmd2ClwGS0E6SUNRdW+HZnKKC1wPWkQ9
  1029. Uk1cZGuEAsBwXUJHNjQ3OhIbZVZZbm5kREo+NT5DFRdYUFdrAAAAAAEAIgAAAmQCsgAHAAABIxEjE
  1030. SM1IQJk9lb2AkICbP2UAmxGAAEAXv/yAmQCsgAXAAABERQHDgEiJicmNREzERQXHgEyNjc2NRECZA
  1031. IIgfCBCAJWAgZYmlgGAgKy/k0qFFxzc1wUKgGz/lUrEkRQUEQSKwGrAAAAAAEAIAAAAnoCsgAGAAA
  1032. hIwMzGwEzAYJ07l3N1FwCsv2PAnEAAAEAGgAAA7ECsgAMAAABAyMLASMDMxsBMxsBA7HAcZyicrZi
  1033. kaB0nJkCsv1OAlP9rQKy/ZsCW/2kAmYAAAEAGQAAAm8CsgALAAAhCwEjEwMzGwEzAxMCCsrEY/bkY
  1034. re+Y/D6AST+3AFcAVb+5gEa/q3+oQAAAQATAAACUQKyAAgAAAERIxEDMxsBMwFdVvRjwLphARD+8A
  1035. EQAaL+sQFPAAABAC4AAAI5ArIACQAAJRUhNQEhNSEVAQI5/fUBof57Aen+YUZGQgIqRkX92QAAAAA
  1036. BAGL/sAEFAwwABwAAARUjETMVIxEBBWlpowMMOP0UOANcAAAB//v/4gE0AtAAAwAABSMDMwE0Pvs+
  1037. HgLuAAAAAQAi/7AAxQMMAAcAABcjNTMRIzUzxaNpaaNQOALsOAABAFAA1wH0AmgABgAAJQsBIxMzE
  1038. wGwjY1GsESw1wFZ/qcBkf5vAAAAAQAy/6oBwv/iAAMAAAUhNSEBwv5wAZBWOAAAAAEAKQJEALYCsg
  1039. ADAAATIycztjhVUAJEbgAAAAACACT/8gHQAiAAHQAlAAAhJwcGIyImNTQ2OwE1NCcmIyIHIz4BMzI
  1040. XFh0BFBcnMjY9ASYVFAF6CR0wVUtgkJoiAgdgaQlaBm1Zrg4DCuQ9R+5MOSFQR1tbDiwUUXBUXowf
  1041. J8c9SjRORzYSgVwAAAAAAgBK//ICRQLfABEAHgAAATIWFRQGIyImLwEVIxEzETc2EzI2NTQmIyIGH
  1042. QEUFgFUcYCVbiNJEyNWVigySElcU01JXmECIJd4i5QTEDRJAt/+3jkq/hRuZV55ZWsdX14AAQAe//
  1043. IB9wIgABgAAAEyFhcjJiMiBhUUFjMyNjczDgEjIiY1NDYBF152DFocbEJXU0A1Rw1aE3pbaoKQAiB
  1044. oWH5qZm1tPDlaXYuLgZcAAAACAB7/8gIZAt8AEQAeAAABESM1BwYjIiY1NDYzMhYfAREDMjY9ATQm
  1045. IyIGFRQWAhlWKDJacYCVbiNJEyOnSV5hQUlcUwLf/SFVOSqXeIuUExA0ARb9VWVrHV9ebmVeeQACA
  1046. B7/8gH9AiAAFQAbAAABFAchHgEzMjY3Mw4BIyImNTQ2MzIWJyIGByEmAf0C/oAGUkA1SwlaD4FXbI
  1047. WObmt45UBVBwEqDQEYFhNjWD84W16Oh3+akU9aU60AAAEAFQAAARoC8gAWAAATBh0BMxUjESMRIzU
  1048. zNTQ3PgEzMhcVJqcDbW1WOTkDB0k8Hx5oAngVITRC/jQBzEIsJRs5PwVHEwAAAAIAHv8uAhkCIAAi
  1049. AC8AAAERFAcOASMiLwEzFx4BMzI2NzY9AQcGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZAQSEd
  1050. NwRAVcBBU5DTlUDASgyWnGAlW4jSRMjp0leYUFJXFMCEv5wSh1zeq8KCTI8VU0ZIQk5Kpd4i5QTED
  1051. RJ/iJlax1fXm5lXnkAAQBKAAACCgLkABcAAAEWFREjETQnLgEHDgEdASMRMxE3NjMyFgIIAlYCBDs
  1052. 6RVRWViE5UVViAYUbQP7WASQxGzI7AQJyf+kC5P7TPSxUAAACAD4AAACsAsAABwALAAASMhYUBiIm
  1053. NBMjETNeLiAgLiBiVlYCwCAuICAu/WACEgAC//P/LgCnAsAABwAVAAASMhYUBiImNBcRFAcGIyInN
  1054. RY3NjURWS4gIC4gYgMLcRwNSgYCAsAgLiAgLo79wCUbZAJGBzMOHgJEAAAAAQBKAAACCALfAAsAAC
  1055. EnBxUjETMREzMHEwGTwTJWVvdu9/rgN6kC3/4oAQv6/ugAAQBG//wA3gLfAA8AABMRFBceATcVBiM
  1056. iJicmNRGcAQIcIxkkKi4CAQLf/bkhERoSBD4EJC8SNAJKAAAAAQBKAAADEAIgACQAAAEWFREjETQn
  1057. JiMiFREjETQnJiMiFREjETMVNzYzMhYXNzYzMhYDCwVWBAxedFYEDF50VlYiJko7ThAvJkpEVAGfI
  1058. jn+vAEcQyRZ1v76ARxDJFnW/voCEk08HzYtRB9HAAAAAAEASgAAAgoCIAAWAAABFhURIxE0JyYjIg
  1059. YdASMRMxU3NjMyFgIIAlYCCXBEVVZWITlRVWIBhRtA/tYBJDEbbHR/6QISWz0sVAAAAAACAB7/8gI
  1060. sAiAABwARAAASIBYUBiAmNBIyNjU0JiIGFRSlAQCHh/8Ah7ieWlqeWgIgn/Cfn/D+s3ZfYHV1YF8A
  1061. AgBK/zwCRQIgABEAHgAAATIWFRQGIyImLwERIxEzFTc2EzI2NTQmIyIGHQEUFgFUcYCVbiNJEyNWV
  1062. igySElcU01JXmECIJd4i5QTEDT+8wLWVTkq/hRuZV55ZWsdX14AAgAe/zwCGQIgABEAHgAAAREjEQ
  1063. cGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZVigyWnGAlW4jSRMjp0leYUFJXFMCEv0qARk5Kpd
  1064. 4i5QTEDRJ/iJlax1fXm5lXnkAAQBKAAABPgIeAA0AAAEyFxUmBhURIxEzFTc2ARoWDkdXVlYwIwIe
  1065. B0EFVlf+0gISU0cYAAEAGP/yAa0CIAAjAAATMhYXIyYjIgYVFBYXHgEVFAYjIiYnMxYzMjY1NCYnL
  1066. gE1NDbkV2MJWhNdKy04PF1XbVhWbgxaE2ktOjlEUllkAiBaS2MrJCUoEBlPQkhOVFZoKCUmLhIWSE
  1067. BIUwAAAAEAFP/4ARQCiQAXAAATERQXHgE3FQYjIiYnJjURIzUzNTMVMxWxAQMmMx8qMjMEAUdHVmM
  1068. BzP7PGw4mFgY/BSwxDjQBNUJ7e0IAAAABAEL/8gICAhIAFwAAAREjNQcGIyImJyY1ETMRFBceATMy
  1069. Nj0BAgJWITlRT2EKBVYEBkA1RFECEv3uWj4qTToiOQE+/tIlJC43c4DpAAAAAAEAAQAAAfwCEgAGA
  1070. AABAyMDMxsBAfzJaclfop8CEv3uAhL+LQHTAAABAAEAAAMLAhIADAAAAQMjCwEjAzMbATMbAQMLqW
  1071. Z2dmapY3t0a3Z7AhL97gG+/kICEv5AAcD+QwG9AAAB//oAAAHWAhIACwAAARMjJwcjEwMzFzczARq
  1072. 8ZIuKY763ZoWFYwEO/vLV1QEMAQbNzQAAAQAB/y4B+wISABEAAAEDDgEjIic1FjMyNj8BAzMbAQH7
  1073. 2iFZQB8NDRIpNhQH02GenQIS/cFVUAJGASozEwIt/i4B0gABABQAAAGxAg4ACQAAJRUhNQEhNSEVA
  1074. QGx/mMBNP7iAYL+zkREQgGIREX+ewAAAAABAED/sAEOAwwALAAAASMiBhUUFxYVFAYHHgEVFAcGFR
  1075. QWOwEVIyImNTQ3NjU0JzU2NTQnJjU0NjsBAQ4MKiMLDS4pKS4NCyMqDAtERAwLUlILDERECwLUGBk
  1076. WTlsgKzUFBTcrIFtOFhkYOC87GFVMIkUIOAhFIkxVGDsvAAAAAAEAYP84AJoDIAADAAAXIxEzmjo6
  1077. yAPoAAEAIf+wAO8DDAAsAAATFQYVFBcWFRQGKwE1MzI2NTQnJjU0NjcuATU0NzY1NCYrATUzMhYVF
  1078. AcGFRTvUgsMREQLDCojCw0uKSkuDQsjKgwLREQMCwF6OAhFIkxVGDsvOBgZFk5bICs1BQU3KyBbTh
  1079. YZGDgvOxhVTCJFAAABAE0A3wH2AWQAEwAAATMUIyImJyYjIhUjNDMyFhcWMzIBvjhuGywtQR0xOG4
  1080. bLC1BHTEBZIURGCNMhREYIwAAAwAk/94DIgLoAAcAEQApAAAAIBYQBiAmECQgBhUUFiA2NTQlMhYX
  1081. IyYjIgYUFjMyNjczDgEjIiY1NDYBAQFE3d3+vN0CB/7wubkBELn+xVBnD1wSWDo+QTcqOQZcEmZWX
  1082. HN2Aujg/rbg4AFKpr+Mjb6+jYxbWEldV5ZZNShLVn5na34AAgB4AFIB9AGeAAUACwAAAQcXIyc3Mw
  1083. cXIyc3AUqJiUmJifOJiUmJiQGepqampqampqYAAAIAHAHSAQ4CwAAHAA8AABIyFhQGIiY0NiIGFBY
  1084. yNjRgakREakSTNCEhNCECwEJqQkJqCiM4IyM4AAAAAAIAUAAAAfQCCwALAA8AAAEzFSMVIzUjNTM1
  1085. MxMhNSEBP7W1OrW1OrX+XAGkAVs4tLQ4sP31OAAAAQB0AkQBAQKyAAMAABMjNzOsOD1QAkRuAAAAA
  1086. AEAIADsAKoBdgAHAAASMhYUBiImNEg6KCg6KAF2KDooKDoAAAIAOQBSAbUBngAFAAsAACUHIzcnMw
  1087. UHIzcnMwELiUmJiUkBM4lJiYlJ+KampqampqYAAAABADYB5QDhAt8ABAAAEzczByM2Xk1OXQHv8Po
  1088. AAQAWAeUAwQLfAAQAABMHIzczwV5NTl0C1fD6AAIANgHlAYsC3wAEAAkAABM3MwcjPwEzByM2Xk1O
  1089. XapeTU5dAe/w+grw+gAAAgAWAeUBawLfAAQACQAAEwcjNzMXByM3M8FeTU5dql5NTl0C1fD6CvD6A
  1090. AADACX/8gI1AHIABwAPABcAADYyFhQGIiY0NjIWFAYiJjQ2MhYUBiImNEk4JCQ4JOw4JCQ4JOw4JC
  1091. Q4JHIkOCQkOCQkOCQkOCQkOCQkOAAAAAEAeABSAUoBngAFAAABBxcjJzcBSomJSYmJAZ6mpqamAAA
  1092. AAAEAOQBSAQsBngAFAAAlByM3JzMBC4lJiYlJ+KampgAAAf9qAAABgQKyAAMAACsBATM/VwHAVwKy
  1093. AAAAAAIAFAHIAdwClAAHABQAABMVIxUjNSM1BRUjNwcjJxcjNTMXN9pKMkoByDICKzQqATJLKysCl
  1094. CmjoykBy46KiY3Lm5sAAQAVAAABvALyABgAAAERIxEjESMRIzUzNTQ3NjMyFxUmBgcGHQEBvFbCVj
  1095. k5AxHHHx5iVgcDAg798gHM/jQBzEIOJRuWBUcIJDAVIRYAAAABABX//AHkAvIAJQAAJR4BNxUGIyI
  1096. mJyY1ESYjIgcGHQEzFSMRIxEjNTM1NDc2MzIXERQBowIcIxkkKi4CAR4nXgwDbW1WLy8DEbNdOmYa
  1097. EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA
  1098. QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA
  1099. AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA
  1100. BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A
  1101. AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA
  1102. gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm
  1103. lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV
  1104. ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy
  1105. AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA
  1106. HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg
  1107. B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk
  1108. AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41
  1109. ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA
  1110. HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3
  1111. JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB
  1112. odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs
  1113. AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA
  1114. AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB
  1115. QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA
  1116. xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A
  1117. TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A
  1118. LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA
  1119. AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ
  1120. ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG
  1121. AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE
  1122. AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE
  1123. kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ
  1124. PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA
  1125. AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA
  1126. AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1127. AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1128. AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA
  1129. ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA
  1130. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA
  1131. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA
  1132. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA
  1133. AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1134. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA
  1135. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD
  1136. /4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA
  1137. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA
  1138. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA
  1139. AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1140. AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA
  1141. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA
  1142. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA
  1143. AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1144. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1145. AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1146. AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  1147. AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA
  1148. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA
  1149. BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA
  1150. AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA
  1151. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA
  1152. AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ
  1153. ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA
  1154. gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC
  1155. YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA
  1156. AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ==
  1157. """
  1158. )
  1159. ),
  1160. 10 if size is None else size,
  1161. layout_engine=Layout.BASIC,
  1162. )
  1163. return load_default_imagefont()