ImageFont.py 63 KB

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