From 8cc997763dc808a9bf8d827fd95414cf406ccfb3 Mon Sep 17 00:00:00 2001 From: exu Date: Sun, 14 Apr 2024 17:19:52 +0200 Subject: [PATCH] Update Calibre config and plugins --- .../.config/calibre/dynamic.pickle.json | 36 +- .../.config/calibre/fonts/scanner_cache.json | 7544 ++++++++++------- arch-config/.config/calibre/gui.json | 504 +- arch-config/.config/calibre/gui.py.json | 5 +- .../calibre/metadata-sources-cache.json | 24 +- .../__pycache__/__init__.cpython-311.pyc | Bin 11562 -> 11562 bytes .../__pycache__/_asn1.cpython-311.pyc | Bin 1852 -> 1852 bytes .../__pycache__/_asymmetric.cpython-311.pyc | Bin 34182 -> 34182 bytes .../__pycache__/_errors.cpython-311.pyc | Bin 1397 -> 1397 bytes .../oscrypto/__pycache__/_ffi.cpython-311.pyc | Bin 18835 -> 18835 bytes .../__pycache__/_rand.cpython-311.pyc | Bin 1629 -> 1629 bytes .../__pycache__/_types.cpython-311.pyc | Bin 1592 -> 1592 bytes .../__pycache__/asymmetric.cpython-311.pyc | Bin 13871 -> 13871 bytes .../__pycache__/errors.cpython-311.pyc | Bin 4083 -> 4083 bytes .../oscrypto/__pycache__/kdf.cpython-311.pyc | Bin 9730 -> 9730 bytes .../oscrypto/__pycache__/keys.cpython-311.pyc | Bin 881 -> 881 bytes .../__pycache__/symmetric.cpython-311.pyc | Bin 1556 -> 1556 bytes .../oscrypto/__pycache__/util.cpython-311.pyc | Bin 2472 -> 2472 bytes .../__pycache__/version.cpython-311.pyc | Bin 415 -> 415 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 196 -> 196 bytes .../__pycache__/_libcrypto.cpython-311.pyc | Bin 4990 -> 4990 bytes .../_libcrypto_cffi.cpython-311.pyc | Bin 11516 -> 11516 bytes .../__pycache__/asymmetric.cpython-311.pyc | Bin 70662 -> 70662 bytes .../__pycache__/symmetric.cpython-311.pyc | Bin 27426 -> 27426 bytes .../_openssl/__pycache__/util.cpython-311.pyc | Bin 8204 -> 8204 bytes .../.config/calibre/plugins/KFX Input.zip | Bin 2085213 -> 2379862 bytes .../.config/calibre/save_to_disk.py.json | 15 + .../.config/calibre/viewer-webengine.json | 10 +- 28 files changed, 5256 insertions(+), 2882 deletions(-) create mode 100644 arch-config/.config/calibre/save_to_disk.py.json diff --git a/arch-config/.config/calibre/dynamic.pickle.json b/arch-config/.config/calibre/dynamic.pickle.json index 756caffd..cf1183d7 100644 --- a/arch-config/.config/calibre/dynamic.pickle.json +++ b/arch-config/.config/calibre/dynamic.pickle.json @@ -4,7 +4,7 @@ "Export ADE activation files": "/home/marc/Nextcloud/backups/adobe_account_backup_uuid_2d6cfbec-33fd-43ca-bcf9-e8b281114a17.zip", "Export ADE keys": "/home/marc/Nextcloud/backups/adobe_uuid_2d6cfbec-33fd-43ca-bcf9-e8b281114a17.der", "add a plugin dialog": "/home/marc/Downloads/DeDRM_tools_10.0.3", - "add books dialog dir": "/home/marc/Downloads", + "add books dialog dir": "/home/exu/Nextcloud/Reading/books/Sanderson, Brandon/Oathbringer", "add books dialog dir-last-used-filter-spec-all-files": false, "choose calibre library": "/home/exu/.local/share/Calibre-Library", "database location dialog": "/home/marc/Nextcloud/Books", @@ -12,15 +12,39 @@ "notified-version-updates": { "__class__": "set", "__value__": [ - "5.24", - "5.25", "6.0", - "5.28" + "5.28", + "5.24", + "5.25" ] }, - "recursive book import root dir dialog": "/home/marc/Nextcloud/Books/Unterhaltung", - "save to disk dialog": "/home/exu/Downloads", + "recursive book import root dir dialog": "/home/exu/Nextcloud/Reading/books", + "save to disk dialog": "/home/exu/Downloads/newBooks", "sort_history": [ + [ + "authors", + true + ], + [ + "series", + true + ], + [ + "series", + false + ], + [ + "series", + true + ], + [ + "authors", + true + ], + [ + "series", + true + ], [ "timestamp", false diff --git a/arch-config/.config/calibre/fonts/scanner_cache.json b/arch-config/.config/calibre/fonts/scanner_cache.json index 10d201bd..423b778e 100644 --- a/arch-config/.config/calibre/fonts/scanner_cache.json +++ b/arch-config/.config/calibre/fonts/scanner_cache.json @@ -1,5 +1,113 @@ { "fonts": { + "/home/exu/.fonts/CustomTkinter_shapes_font.otf||3528:1703779424.157382": { + "family_name": "CustomTkinter_shapes_font", + "font-family": "CustomTkinter_shapes_font", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "CustomTkinter_shapes_font Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": true, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/exu/.fonts/CustomTkinter_shapes_font.otf", + "preferred_family_name": "CustomTkinter_shapes_font", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/exu/.fonts/Roboto-Medium.ttf||168644:1703779424.157382": { + "family_name": "Roboto Medium", + "font-family": "Roboto Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Roboto Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/exu/.fonts/Roboto-Medium.ttf", + "preferred_family_name": "Roboto", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/home/exu/.fonts/Roboto-Regular.ttf||168260:1703779424.157382": { + "family_name": "Roboto", + "font-family": "Roboto", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Roboto", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/home/exu/.fonts/Roboto-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, "/usr/share/calibre/fonts/liberation/LiberationMono-Bold.ttf||307996:1633027421.0": { "family_name": "Liberation Mono", "font-family": "Liberation Mono", @@ -432,7 +540,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/OTF/Font Awesome 6 Brands-Regular-400.otf||554744:1701447684.0": { + "/usr/share/fonts/OTF/Font Awesome 6 Brands-Regular-400.otf||557868:1712161894.0": { "family_name": "Font Awesome 6 Brands Regular", "font-family": "Font Awesome 6 Brands Regular", "font-stretch": "normal", @@ -468,7 +576,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/OTF/Font Awesome 6 Free-Regular-400.otf||189956:1701447684.0": { + "/usr/share/fonts/OTF/Font Awesome 6 Free-Regular-400.otf||189444:1712161894.0": { "family_name": "Font Awesome 6 Free Regular", "font-family": "Font Awesome 6 Free Regular", "font-stretch": "normal", @@ -504,7 +612,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/OTF/Font Awesome 6 Free-Solid-900.otf||1023996:1701447684.0": { + "/usr/share/fonts/OTF/Font Awesome 6 Free-Solid-900.otf||1025256:1712161894.0": { "family_name": "Font Awesome 6 Free Solid", "font-family": "Font Awesome 6 Free Solid", "font-stretch": "normal", @@ -828,6 +936,798 @@ "wws_family_name": null, "wws_subfamily_name": null }, + "/usr/share/fonts/TTF/DejaVuMathTeXGyre.ttf||577192:1710752851.0": { + "family_name": "DejaVu Math TeX Gyre", + "font-family": "DejaVu Math TeX Gyre", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 12, + "full_name": "DejaVuMathTeXGyre-Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 3, + 0, + 0, + 0, + 0, + 0, + 0 + ], + "path": "/usr/share/fonts/TTF/DejaVuMathTeXGyre.ttf", + "preferred_family_name": "DejaVu Math TeX Gyre", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf||708920:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-Bold.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf||645600:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 3, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-BoldOblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Bold Oblique", + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-ExtraLight.ttf||355824:1710752851.0": { + "family_name": "DejaVu Sans Light", + "font-family": "DejaVu Sans Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "DejaVu Sans ExtraLight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 2, + 3, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-ExtraLight.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "ExtraLight", + "subfamily_name": "ExtraLight", + "weight": 200, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans-Oblique.ttf||637648:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans-Oblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Oblique", + "subfamily_name": "Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSans.ttf||759720:1710752851.0": { + "family_name": "DejaVu Sans", + "font-family": "DejaVu Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 3, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSans.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Book", + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed-Bold.ttf||667844:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-Bold.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed-BoldOblique.ttf||614068:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-BoldOblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed Bold Oblique", + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed-Oblique.ttf||601448:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed-Oblique.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed Oblique", + "subfamily_name": "Oblique", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansCondensed.ttf||682828:1710752851.0": { + "family_name": "DejaVu Sans Condensed", + "font-family": "DejaVu Sans Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Condensed", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansCondensed.ttf", + "preferred_family_name": "DejaVu Sans", + "preferred_subfamily_name": "Condensed", + "subfamily_name": "Book", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf||334268:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Mono Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 6, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf||254960:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Sans Mono Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 7, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Oblique", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf||253448:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Mono Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 3, + 4, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Oblique", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSansMono.ttf||343140:1710752851.0": { + "family_name": "DejaVu Sans Mono", + "font-family": "DejaVu Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Sans Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSansMono.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif-Bold.ttf||356668:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 3, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif-Bold.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif-BoldItalic.ttf||348020:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 3, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif-BoldItalic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif-Italic.ttf||346544:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 3, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif-Italic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerif.ttf||380660:1710752851.0": { + "family_name": "DejaVu Serif", + "font-family": "DejaVu Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 3, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerif.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Book", + "subfamily_name": "Book", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed-Bold.ttf||331820:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 6, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-Bold.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed-BoldItalic.ttf||347076:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 8, + 6, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-BoldItalic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed-Italic.ttf||345868:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 6, + 5, + 3, + 5, + 11, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed-Italic.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/TTF/DejaVuSerifCondensed.ttf||347208:1710752851.0": { + "family_name": "DejaVu Serif Condensed", + "font-family": "DejaVu Serif Condensed", + "font-stretch": "semi-condensed", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "DejaVu Serif Condensed", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 1, + "panose": [ + 2, + 6, + 6, + 6, + 5, + 6, + 5, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/TTF/DejaVuSerifCondensed.ttf", + "preferred_family_name": "DejaVu Serif", + "preferred_subfamily_name": "Condensed", + "subfamily_name": "Book", + "weight": 400, + "width": 4, + "wws_family_name": null, + "wws_subfamily_name": null + }, "/usr/share/fonts/TTF/FiraCode-Bold.ttf||319368:1650723952.0": { "family_name": "Fira Code", "font-family": "Fira Code", @@ -4680,6 +5580,1950 @@ "wws_family_name": null, "wws_subfamily_name": null }, + "/usr/share/fonts/TTF/Iosevka-Bold.ttf||9895104:1712429816.0": { + "family_name": "Iosevka", + "font-family": "Iosevka", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Iosevka Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Bold.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Bold" + }, + "/usr/share/fonts/TTF/Iosevka-BoldItalic.ttf||10242352:1712429816.0": { + "family_name": "Iosevka", + "font-family": "Iosevka", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Iosevka Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-BoldItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Bold Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Bold Italic" + }, + "/usr/share/fonts/TTF/Iosevka-BoldOblique.ttf||10199120:1712429816.0": { + "family_name": "Iosevka Oblique", + "font-family": "Iosevka Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Iosevka Bold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-BoldOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Bold Oblique", + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Bold Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Extended.ttf||9258832:1712429816.0": { + "family_name": "Iosevka Extended", + "font-family": "Iosevka Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Iosevka Extended", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Extended.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extended", + "subfamily_name": "Regular", + "weight": 400, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedBold.ttf||9380700:1712429816.0": { + "family_name": "Iosevka Extended", + "font-family": "Iosevka Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Iosevka Bold Extended", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedBold.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Bold Extended", + "subfamily_name": "Bold", + "weight": 700, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Bold Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedBoldItalic.ttf||9679192:1712429816.0": { + "family_name": "Iosevka Extended", + "font-family": "Iosevka Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Iosevka Bold Extended Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedBoldItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Bold Extended Italic", + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Bold Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedBoldOblique.ttf||9632748:1712429816.0": { + "family_name": "Iosevka Extended Oblique", + "font-family": "Iosevka Extended Oblique", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Iosevka Bold Extended Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 8, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedBoldOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Bold Extended Oblique", + "subfamily_name": "Bold", + "weight": 700, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Bold Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBold.ttf||9395120:1712429816.0": { + "family_name": "Iosevka Extrabold Extended", + "font-family": "Iosevka Extrabold Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Iosevka Extrabold Extended", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 9, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBold.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extrabold Extended", + "subfamily_name": "Regular", + "weight": 800, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extrabold Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldItalic.ttf||9711624:1712429816.0": { + "family_name": "Iosevka Extrabold Extended", + "font-family": "Iosevka Extrabold Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "Iosevka Extrabold Extended Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 9, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extrabold Extended Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extrabold Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldOblique.ttf||9664512:1712429816.0": { + "family_name": "Iosevka XBd Ex Obl", + "font-family": "Iosevka XBd Ex Obl", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "800", + "fs_type": 0, + "full_name": "Iosevka Extrabold Extended Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 9, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraBoldOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extrabold Extended Oblique", + "subfamily_name": "Regular", + "weight": 800, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extrabold Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLight.ttf||9201272:1712429816.0": { + "family_name": "Iosevka Extralight Extended", + "font-family": "Iosevka Extralight Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Iosevka Extralight Extended", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 3, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLight.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extralight Extended", + "subfamily_name": "Regular", + "weight": 200, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extralight Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightItalic.ttf||9491184:1712429816.0": { + "family_name": "Iosevka Extralight Extended", + "font-family": "Iosevka Extralight Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Iosevka Extralight Extended Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 3, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extralight Extended Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extralight Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightOblique.ttf||9445728:1712429816.0": { + "family_name": "Iosevka XLt Ex Obl", + "font-family": "Iosevka XLt Ex Obl", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "200", + "fs_type": 0, + "full_name": "Iosevka Extralight Extended Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 3, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedExtraLightOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extralight Extended Oblique", + "subfamily_name": "Regular", + "weight": 200, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extralight Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedHeavy.ttf||9466084:1712429816.0": { + "family_name": "Iosevka Heavy Extended", + "font-family": "Iosevka Heavy Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Iosevka Heavy Extended", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 10, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedHeavy.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Heavy Extended", + "subfamily_name": "Regular", + "weight": 900, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Heavy Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyItalic.ttf||9704480:1712429816.0": { + "family_name": "Iosevka Heavy Extended", + "font-family": "Iosevka Heavy Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Iosevka Heavy Extended Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 10, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Heavy Extended Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Heavy Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyOblique.ttf||9655472:1712429816.0": { + "family_name": "Iosevka Heavy Extended Oblique", + "font-family": "Iosevka Heavy Extended Oblique", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "900", + "fs_type": 0, + "full_name": "Iosevka Heavy Extended Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 10, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedHeavyOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Heavy Extended Oblique", + "subfamily_name": "Regular", + "weight": 900, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Heavy Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedItalic.ttf||9577888:1712429816.0": { + "family_name": "Iosevka Extended", + "font-family": "Iosevka Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Iosevka Extended Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extended Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedLight.ttf||9269096:1712429816.0": { + "family_name": "Iosevka Light Extended", + "font-family": "Iosevka Light Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Iosevka Light Extended", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 4, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedLight.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Light Extended", + "subfamily_name": "Regular", + "weight": 300, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Light Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedLightItalic.ttf||9591716:1712429816.0": { + "family_name": "Iosevka Light Extended", + "font-family": "Iosevka Light Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Iosevka Light Extended Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 4, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedLightItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Light Extended Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Light Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedLightOblique.ttf||9538784:1712429816.0": { + "family_name": "Iosevka Light Extended Oblique", + "font-family": "Iosevka Light Extended Oblique", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "300", + "fs_type": 0, + "full_name": "Iosevka Light Extended Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 4, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedLightOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Light Extended Oblique", + "subfamily_name": "Regular", + "weight": 300, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Light Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedMedium.ttf||9215848:1712429816.0": { + "family_name": "Iosevka Medium Extended", + "font-family": "Iosevka Medium Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Iosevka Medium Extended", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedMedium.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Medium Extended", + "subfamily_name": "Regular", + "weight": 500, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Medium Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedMediumItalic.ttf||9593472:1712429816.0": { + "family_name": "Iosevka Medium Extended", + "font-family": "Iosevka Medium Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "Iosevka Medium Extended Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedMediumItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Medium Extended Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Medium Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedMediumOblique.ttf||9542408:1712429816.0": { + "family_name": "Iosevka Md Ex Obl", + "font-family": "Iosevka Md Ex Obl", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "500", + "fs_type": 0, + "full_name": "Iosevka Medium Extended Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedMediumOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Medium Extended Oblique", + "subfamily_name": "Regular", + "weight": 500, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Medium Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedOblique.ttf||9524708:1712429816.0": { + "family_name": "Iosevka Extended Oblique", + "font-family": "Iosevka Extended Oblique", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Iosevka Extended Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extended Oblique", + "subfamily_name": "Regular", + "weight": 400, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBold.ttf||9338716:1712429816.0": { + "family_name": "Iosevka Semibold Extended", + "font-family": "Iosevka Semibold Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Iosevka Semibold Extended", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 7, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBold.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Semibold Extended", + "subfamily_name": "Regular", + "weight": 600, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Semibold Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldItalic.ttf||9689968:1712429816.0": { + "family_name": "Iosevka Semibold Extended", + "font-family": "Iosevka Semibold Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Iosevka Semibold Extended Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 7, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Semibold Extended Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Semibold Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldOblique.ttf||9638548:1712429816.0": { + "family_name": "Iosevka SmBd Ex Obl", + "font-family": "Iosevka SmBd Ex Obl", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "600", + "fs_type": 0, + "full_name": "Iosevka Semibold Extended Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 7, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedSemiBoldOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Semibold Extended Oblique", + "subfamily_name": "Regular", + "weight": 600, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Semibold Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedThin.ttf||9095976:1712429816.0": { + "family_name": "Iosevka Thin Extended", + "font-family": "Iosevka Thin Extended", + "font-stretch": "expanded", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Iosevka Thin Extended", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 2, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedThin.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Thin Extended", + "subfamily_name": "Regular", + "weight": 100, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Thin Extended" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedThinItalic.ttf||9373200:1712429816.0": { + "family_name": "Iosevka Thin Extended", + "font-family": "Iosevka Thin Extended", + "font-stretch": "expanded", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "Iosevka Thin Extended Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 2, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedThinItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Thin Extended Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Thin Extended Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtendedThinOblique.ttf||9325256:1712429816.0": { + "family_name": "Iosevka Thin Extended Oblique", + "font-family": "Iosevka Thin Extended Oblique", + "font-stretch": "expanded", + "font-style": "oblique", + "font-weight": "100", + "fs_type": 0, + "full_name": "Iosevka Thin Extended Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 2, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtendedThinOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Thin Extended Oblique", + "subfamily_name": "Regular", + "weight": 100, + "width": 7, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Thin Extended Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtraBold.ttf||9973700:1712429816.0": { + "family_name": "Iosevka Extrabold", + "font-family": "Iosevka Extrabold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "800", + "fs_type": 0, + "full_name": "Iosevka Extrabold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 9, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtraBold.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extrabold", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extrabold" + }, + "/usr/share/fonts/TTF/Iosevka-ExtraBoldItalic.ttf||10274440:1712429816.0": { + "family_name": "Iosevka Extrabold", + "font-family": "Iosevka Extrabold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "800", + "fs_type": 0, + "full_name": "Iosevka Extrabold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 9, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtraBoldItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extrabold Italic", + "subfamily_name": "Italic", + "weight": 800, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extrabold Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtraBoldOblique.ttf||10228788:1712429816.0": { + "family_name": "Iosevka Extrabold Oblique", + "font-family": "Iosevka Extrabold Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "800", + "fs_type": 0, + "full_name": "Iosevka Extrabold Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 9, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtraBoldOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extrabold Oblique", + "subfamily_name": "Regular", + "weight": 800, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extrabold Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-ExtraLight.ttf||9593812:1712429816.0": { + "family_name": "Iosevka Extralight", + "font-family": "Iosevka Extralight", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "200", + "fs_type": 0, + "full_name": "Iosevka Extralight", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 3, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtraLight.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extralight", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extralight" + }, + "/usr/share/fonts/TTF/Iosevka-ExtraLightItalic.ttf||9900612:1712429816.0": { + "family_name": "Iosevka Extralight", + "font-family": "Iosevka Extralight", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "200", + "fs_type": 0, + "full_name": "Iosevka Extralight Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 3, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtraLightItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extralight Italic", + "subfamily_name": "Italic", + "weight": 200, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extralight Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ExtraLightOblique.ttf||9856640:1712429816.0": { + "family_name": "Iosevka Extralight Oblique", + "font-family": "Iosevka Extralight Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "200", + "fs_type": 0, + "full_name": "Iosevka Extralight Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 3, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ExtraLightOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Extralight Oblique", + "subfamily_name": "Regular", + "weight": 200, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Extralight Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Heavy.ttf||9928412:1712429816.0": { + "family_name": "Iosevka Heavy", + "font-family": "Iosevka Heavy", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "900", + "fs_type": 0, + "full_name": "Iosevka Heavy", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 10, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Heavy.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Heavy", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Heavy" + }, + "/usr/share/fonts/TTF/Iosevka-HeavyItalic.ttf||10231688:1712429816.0": { + "family_name": "Iosevka Heavy", + "font-family": "Iosevka Heavy", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "900", + "fs_type": 0, + "full_name": "Iosevka Heavy Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 10, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-HeavyItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Heavy Italic", + "subfamily_name": "Italic", + "weight": 900, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Heavy Italic" + }, + "/usr/share/fonts/TTF/Iosevka-HeavyOblique.ttf||10187852:1712429816.0": { + "family_name": "Iosevka Heavy Oblique", + "font-family": "Iosevka Heavy Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "900", + "fs_type": 0, + "full_name": "Iosevka Heavy Oblique", + "is_bold": true, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 10, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-HeavyOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Heavy Oblique", + "subfamily_name": "Regular", + "weight": 900, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Heavy Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Italic.ttf||10262408:1712429816.0": { + "family_name": "Iosevka", + "font-family": "Iosevka", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Iosevka Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Italic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Italic", + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Italic" + }, + "/usr/share/fonts/TTF/Iosevka-Light.ttf||9706712:1712429816.0": { + "family_name": "Iosevka Light", + "font-family": "Iosevka Light", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "300", + "fs_type": 0, + "full_name": "Iosevka Light", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 4, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Light.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Light", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Light" + }, + "/usr/share/fonts/TTF/Iosevka-LightItalic.ttf||10030860:1712429816.0": { + "family_name": "Iosevka Light", + "font-family": "Iosevka Light", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "300", + "fs_type": 0, + "full_name": "Iosevka Light Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 4, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-LightItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Light Italic", + "subfamily_name": "Italic", + "weight": 300, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Light Italic" + }, + "/usr/share/fonts/TTF/Iosevka-LightOblique.ttf||9980284:1712429816.0": { + "family_name": "Iosevka Light Oblique", + "font-family": "Iosevka Light Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "300", + "fs_type": 0, + "full_name": "Iosevka Light Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 4, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-LightOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Light Oblique", + "subfamily_name": "Regular", + "weight": 300, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Light Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Medium.ttf||9919256:1712429816.0": { + "family_name": "Iosevka Medium", + "font-family": "Iosevka Medium", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "500", + "fs_type": 0, + "full_name": "Iosevka Medium", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Medium.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Medium", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Medium" + }, + "/usr/share/fonts/TTF/Iosevka-MediumItalic.ttf||10271188:1712429816.0": { + "family_name": "Iosevka Medium", + "font-family": "Iosevka Medium", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "500", + "fs_type": 0, + "full_name": "Iosevka Medium Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-MediumItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Medium Italic", + "subfamily_name": "Italic", + "weight": 500, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Medium Italic" + }, + "/usr/share/fonts/TTF/Iosevka-MediumOblique.ttf||10219100:1712429816.0": { + "family_name": "Iosevka Medium Oblique", + "font-family": "Iosevka Medium Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "500", + "fs_type": 0, + "full_name": "Iosevka Medium Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 6, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-MediumOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Medium Oblique", + "subfamily_name": "Regular", + "weight": 500, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Medium Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Oblique.ttf||10214472:1712429816.0": { + "family_name": "Iosevka Oblique", + "font-family": "Iosevka Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Iosevka Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Oblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Oblique", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Regular.ttf||9940724:1712429816.0": { + "family_name": "Iosevka", + "font-family": "Iosevka", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Iosevka", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 5, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Regular.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Regular", + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Regular" + }, + "/usr/share/fonts/TTF/Iosevka-SemiBold.ttf||9898536:1712429816.0": { + "family_name": "Iosevka Semibold", + "font-family": "Iosevka Semibold", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 0, + "full_name": "Iosevka Semibold", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 7, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-SemiBold.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Semibold", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Semibold" + }, + "/usr/share/fonts/TTF/Iosevka-SemiBoldItalic.ttf||10292084:1712429816.0": { + "family_name": "Iosevka Semibold", + "font-family": "Iosevka Semibold", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "600", + "fs_type": 0, + "full_name": "Iosevka Semibold Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 7, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-SemiBoldItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Semibold Italic", + "subfamily_name": "Italic", + "weight": 600, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Semibold Italic" + }, + "/usr/share/fonts/TTF/Iosevka-SemiBoldOblique.ttf||10241500:1712429816.0": { + "family_name": "Iosevka Semibold Oblique", + "font-family": "Iosevka Semibold Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "600", + "fs_type": 0, + "full_name": "Iosevka Semibold Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 7, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-SemiBoldOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Semibold Oblique", + "subfamily_name": "Regular", + "weight": 600, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Semibold Oblique" + }, + "/usr/share/fonts/TTF/Iosevka-Thin.ttf||9627760:1712429816.0": { + "family_name": "Iosevka Thin", + "font-family": "Iosevka Thin", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "100", + "fs_type": 0, + "full_name": "Iosevka Thin", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 2, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-Thin.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Thin", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Thin" + }, + "/usr/share/fonts/TTF/Iosevka-ThinItalic.ttf||9926036:1712429816.0": { + "family_name": "Iosevka Thin", + "font-family": "Iosevka Thin", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "100", + "fs_type": 0, + "full_name": "Iosevka Thin Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 2, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ThinItalic.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Thin Italic", + "subfamily_name": "Italic", + "weight": 100, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Thin Italic" + }, + "/usr/share/fonts/TTF/Iosevka-ThinOblique.ttf||9879476:1712429816.0": { + "family_name": "Iosevka Thin Oblique", + "font-family": "Iosevka Thin Oblique", + "font-stretch": "normal", + "font-style": "oblique", + "font-weight": "100", + "fs_type": 0, + "full_name": "Iosevka Thin Oblique", + "is_bold": false, + "is_italic": true, + "is_oblique": true, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 4, + "panose": [ + 2, + 0, + 2, + 9, + 3, + 0, + 0, + 0, + 0, + 4 + ], + "path": "/usr/share/fonts/TTF/Iosevka-ThinOblique.ttf", + "preferred_family_name": "Iosevka", + "preferred_subfamily_name": "Thin Oblique", + "subfamily_name": "Regular", + "weight": 100, + "width": 5, + "wws_family_name": "Iosevka", + "wws_subfamily_name": "Thin Oblique" + }, "/usr/share/fonts/TTF/Times.TTF||330412:1700237191.0": { "family_name": "Times New Roman", "font-family": "Times New Roman", @@ -6084,1950 +8928,6 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/TTF/iosevka-bold.ttf||8955424:1700237156.0": { - "family_name": "Iosevka", - "font-family": "Iosevka", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Iosevka Bold", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 8, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-bold.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Bold", - "subfamily_name": "Bold", - "weight": 700, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Bold" - }, - "/usr/share/fonts/TTF/iosevka-bolditalic.ttf||9253204:1700237156.0": { - "family_name": "Iosevka", - "font-family": "Iosevka", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Iosevka Bold Italic", - "is_bold": true, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 8, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-bolditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Bold Italic", - "subfamily_name": "Bold Italic", - "weight": 700, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Bold Italic" - }, - "/usr/share/fonts/TTF/iosevka-boldoblique.ttf||9222768:1700237156.0": { - "family_name": "Iosevka Oblique", - "font-family": "Iosevka Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Iosevka Bold Oblique", - "is_bold": true, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 8, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-boldoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Bold Oblique", - "subfamily_name": "Bold", - "weight": 700, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Bold Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extended.ttf||8429420:1700237156.0": { - "family_name": "Iosevka Extended", - "font-family": "Iosevka Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Iosevka Extended", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 5, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extended.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extended", - "subfamily_name": "Regular", - "weight": 400, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedbold.ttf||8506360:1700237156.0": { - "family_name": "Iosevka Extended", - "font-family": "Iosevka Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Iosevka Bold Extended", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 8, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedbold.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Bold Extended", - "subfamily_name": "Bold", - "weight": 700, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Bold Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedbolditalic.ttf||8767616:1700237156.0": { - "family_name": "Iosevka Extended", - "font-family": "Iosevka Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Iosevka Bold Extended Italic", - "is_bold": true, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 8, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedbolditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Bold Extended Italic", - "subfamily_name": "Bold Italic", - "weight": 700, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Bold Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedboldoblique.ttf||8733588:1700237156.0": { - "family_name": "Iosevka Extended Oblique", - "font-family": "Iosevka Extended Oblique", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Iosevka Bold Extended Oblique", - "is_bold": true, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 8, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedboldoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Bold Extended Oblique", - "subfamily_name": "Bold", - "weight": 700, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Bold Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedextrabold.ttf||8520392:1700237156.0": { - "family_name": "Iosevka Extrabold Extended", - "font-family": "Iosevka Extrabold Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "800", - "fs_type": 0, - "full_name": "Iosevka Extrabold Extended", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 9, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedextrabold.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extrabold Extended", - "subfamily_name": "Regular", - "weight": 800, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extrabold Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedextrabolditalic.ttf||8790360:1700237156.0": { - "family_name": "Iosevka Extrabold Extended", - "font-family": "Iosevka Extrabold Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "800", - "fs_type": 0, - "full_name": "Iosevka Extrabold Extended Italic", - "is_bold": true, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 9, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedextrabolditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extrabold Extended Italic", - "subfamily_name": "Italic", - "weight": 800, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extrabold Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedextraboldoblique.ttf||8770356:1700237156.0": { - "family_name": "Iosevka XBd Ex Obl", - "font-family": "Iosevka XBd Ex Obl", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "800", - "fs_type": 0, - "full_name": "Iosevka Extrabold Extended Oblique", - "is_bold": true, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 9, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedextraboldoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extrabold Extended Oblique", - "subfamily_name": "Regular", - "weight": 800, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extrabold Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedextralight.ttf||8406124:1700237156.0": { - "family_name": "Iosevka Extralight Extended", - "font-family": "Iosevka Extralight Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "200", - "fs_type": 0, - "full_name": "Iosevka Extralight Extended", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 3, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedextralight.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extralight Extended", - "subfamily_name": "Regular", - "weight": 200, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extralight Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedextralightitalic.ttf||8656528:1700237156.0": { - "family_name": "Iosevka Extralight Extended", - "font-family": "Iosevka Extralight Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "200", - "fs_type": 0, - "full_name": "Iosevka Extralight Extended Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 3, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedextralightitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extralight Extended Italic", - "subfamily_name": "Italic", - "weight": 200, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extralight Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedextralightoblique.ttf||8618720:1700237156.0": { - "family_name": "Iosevka XLt Ex Obl", - "font-family": "Iosevka XLt Ex Obl", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "200", - "fs_type": 0, - "full_name": "Iosevka Extralight Extended Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 3, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedextralightoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extralight Extended Oblique", - "subfamily_name": "Regular", - "weight": 200, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extralight Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedheavy.ttf||8665584:1700237156.0": { - "family_name": "Iosevka Heavy Extended", - "font-family": "Iosevka Heavy Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "900", - "fs_type": 0, - "full_name": "Iosevka Heavy Extended", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 10, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedheavy.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Heavy Extended", - "subfamily_name": "Regular", - "weight": 900, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Heavy Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedheavyitalic.ttf||8841984:1700237156.0": { - "family_name": "Iosevka Heavy Extended", - "font-family": "Iosevka Heavy Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "900", - "fs_type": 0, - "full_name": "Iosevka Heavy Extended Italic", - "is_bold": true, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 10, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedheavyitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Heavy Extended Italic", - "subfamily_name": "Italic", - "weight": 900, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Heavy Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedheavyoblique.ttf||8806768:1700237156.0": { - "family_name": "Iosevka Heavy Extended Oblique", - "font-family": "Iosevka Heavy Extended Oblique", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "900", - "fs_type": 0, - "full_name": "Iosevka Heavy Extended Oblique", - "is_bold": true, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 10, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedheavyoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Heavy Extended Oblique", - "subfamily_name": "Regular", - "weight": 900, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Heavy Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendeditalic.ttf||8713792:1700237156.0": { - "family_name": "Iosevka Extended", - "font-family": "Iosevka Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Iosevka Extended Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 5, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendeditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extended Italic", - "subfamily_name": "Italic", - "weight": 400, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedlight.ttf||8450900:1700237156.0": { - "family_name": "Iosevka Light Extended", - "font-family": "Iosevka Light Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "300", - "fs_type": 0, - "full_name": "Iosevka Light Extended", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 4, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedlight.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Light Extended", - "subfamily_name": "Regular", - "weight": 300, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Light Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedlightitalic.ttf||8703124:1700237156.0": { - "family_name": "Iosevka Light Extended", - "font-family": "Iosevka Light Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "300", - "fs_type": 0, - "full_name": "Iosevka Light Extended Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 4, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedlightitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Light Extended Italic", - "subfamily_name": "Italic", - "weight": 300, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Light Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedlightoblique.ttf||8661844:1700237156.0": { - "family_name": "Iosevka Light Extended Oblique", - "font-family": "Iosevka Light Extended Oblique", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "300", - "fs_type": 0, - "full_name": "Iosevka Light Extended Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 4, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedlightoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Light Extended Oblique", - "subfamily_name": "Regular", - "weight": 300, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Light Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedmedium.ttf||8378424:1700237156.0": { - "family_name": "Iosevka Medium Extended", - "font-family": "Iosevka Medium Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "500", - "fs_type": 0, - "full_name": "Iosevka Medium Extended", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 6, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedmedium.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Medium Extended", - "subfamily_name": "Regular", - "weight": 500, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Medium Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedmediumitalic.ttf||8700180:1700237156.0": { - "family_name": "Iosevka Medium Extended", - "font-family": "Iosevka Medium Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "500", - "fs_type": 0, - "full_name": "Iosevka Medium Extended Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 6, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedmediumitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Medium Extended Italic", - "subfamily_name": "Italic", - "weight": 500, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Medium Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedmediumoblique.ttf||8661976:1700237156.0": { - "family_name": "Iosevka Md Ex Obl", - "font-family": "Iosevka Md Ex Obl", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "500", - "fs_type": 0, - "full_name": "Iosevka Medium Extended Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 6, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedmediumoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Medium Extended Oblique", - "subfamily_name": "Regular", - "weight": 500, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Medium Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedoblique.ttf||8671816:1700237156.0": { - "family_name": "Iosevka Extended Oblique", - "font-family": "Iosevka Extended Oblique", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Iosevka Extended Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 5, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extended Oblique", - "subfamily_name": "Regular", - "weight": 400, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedsemibold.ttf||8492508:1700237156.0": { - "family_name": "Iosevka Semibold Extended", - "font-family": "Iosevka Semibold Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "600", - "fs_type": 0, - "full_name": "Iosevka Semibold Extended", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 7, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedsemibold.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Semibold Extended", - "subfamily_name": "Regular", - "weight": 600, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Semibold Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedsemibolditalic.ttf||8772988:1700237156.0": { - "family_name": "Iosevka Semibold Extended", - "font-family": "Iosevka Semibold Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "600", - "fs_type": 0, - "full_name": "Iosevka Semibold Extended Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 7, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedsemibolditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Semibold Extended Italic", - "subfamily_name": "Italic", - "weight": 600, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Semibold Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedsemiboldoblique.ttf||8734028:1700237156.0": { - "family_name": "Iosevka SmBd Ex Obl", - "font-family": "Iosevka SmBd Ex Obl", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "600", - "fs_type": 0, - "full_name": "Iosevka Semibold Extended Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 7, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedsemiboldoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Semibold Extended Oblique", - "subfamily_name": "Regular", - "weight": 600, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Semibold Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extendedthin.ttf||8307748:1700237156.0": { - "family_name": "Iosevka Thin Extended", - "font-family": "Iosevka Thin Extended", - "font-stretch": "expanded", - "font-style": "normal", - "font-weight": "100", - "fs_type": 0, - "full_name": "Iosevka Thin Extended", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 2, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedthin.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Thin Extended", - "subfamily_name": "Regular", - "weight": 100, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Thin Extended" - }, - "/usr/share/fonts/TTF/iosevka-extendedthinitalic.ttf||8506236:1700237156.0": { - "family_name": "Iosevka Thin Extended", - "font-family": "Iosevka Thin Extended", - "font-stretch": "expanded", - "font-style": "italic", - "font-weight": "100", - "fs_type": 0, - "full_name": "Iosevka Thin Extended Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 2, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedthinitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Thin Extended Italic", - "subfamily_name": "Italic", - "weight": 100, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Thin Extended Italic" - }, - "/usr/share/fonts/TTF/iosevka-extendedthinoblique.ttf||8466788:1700237156.0": { - "family_name": "Iosevka Thin Extended Oblique", - "font-family": "Iosevka Thin Extended Oblique", - "font-stretch": "expanded", - "font-style": "oblique", - "font-weight": "100", - "fs_type": 0, - "full_name": "Iosevka Thin Extended Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 2, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extendedthinoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Thin Extended Oblique", - "subfamily_name": "Regular", - "weight": 100, - "width": 7, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Thin Extended Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extrabold.ttf||8987064:1700237156.0": { - "family_name": "Iosevka Extrabold", - "font-family": "Iosevka Extrabold", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "800", - "fs_type": 0, - "full_name": "Iosevka Extrabold", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 9, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extrabold.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extrabold", - "subfamily_name": "Regular", - "weight": 800, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extrabold" - }, - "/usr/share/fonts/TTF/iosevka-extrabolditalic.ttf||9292816:1700237156.0": { - "family_name": "Iosevka Extrabold", - "font-family": "Iosevka Extrabold", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "800", - "fs_type": 0, - "full_name": "Iosevka Extrabold Italic", - "is_bold": true, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 9, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extrabolditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extrabold Italic", - "subfamily_name": "Italic", - "weight": 800, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extrabold Italic" - }, - "/usr/share/fonts/TTF/iosevka-extraboldoblique.ttf||9274228:1700237156.0": { - "family_name": "Iosevka Extrabold Oblique", - "font-family": "Iosevka Extrabold Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "800", - "fs_type": 0, - "full_name": "Iosevka Extrabold Oblique", - "is_bold": true, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 9, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extraboldoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extrabold Oblique", - "subfamily_name": "Regular", - "weight": 800, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extrabold Oblique" - }, - "/usr/share/fonts/TTF/iosevka-extralight.ttf||8776092:1700237156.0": { - "family_name": "Iosevka Extralight", - "font-family": "Iosevka Extralight", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "200", - "fs_type": 0, - "full_name": "Iosevka Extralight", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 3, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extralight.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extralight", - "subfamily_name": "Regular", - "weight": 200, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extralight" - }, - "/usr/share/fonts/TTF/iosevka-extralightitalic.ttf||9045140:1700237156.0": { - "family_name": "Iosevka Extralight", - "font-family": "Iosevka Extralight", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "200", - "fs_type": 0, - "full_name": "Iosevka Extralight Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 3, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extralightitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extralight Italic", - "subfamily_name": "Italic", - "weight": 200, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extralight Italic" - }, - "/usr/share/fonts/TTF/iosevka-extralightoblique.ttf||9010472:1700237156.0": { - "family_name": "Iosevka Extralight Oblique", - "font-family": "Iosevka Extralight Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "200", - "fs_type": 0, - "full_name": "Iosevka Extralight Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 3, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-extralightoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Extralight Oblique", - "subfamily_name": "Regular", - "weight": 200, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Extralight Oblique" - }, - "/usr/share/fonts/TTF/iosevka-heavy.ttf||9030252:1700237156.0": { - "family_name": "Iosevka Heavy", - "font-family": "Iosevka Heavy", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "900", - "fs_type": 0, - "full_name": "Iosevka Heavy", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 10, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-heavy.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Heavy", - "subfamily_name": "Regular", - "weight": 900, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Heavy" - }, - "/usr/share/fonts/TTF/iosevka-heavyitalic.ttf||9279340:1700237156.0": { - "family_name": "Iosevka Heavy", - "font-family": "Iosevka Heavy", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "900", - "fs_type": 0, - "full_name": "Iosevka Heavy Italic", - "is_bold": true, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 10, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-heavyitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Heavy Italic", - "subfamily_name": "Italic", - "weight": 900, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Heavy Italic" - }, - "/usr/share/fonts/TTF/iosevka-heavyoblique.ttf||9263120:1700237156.0": { - "family_name": "Iosevka Heavy Oblique", - "font-family": "Iosevka Heavy Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "900", - "fs_type": 0, - "full_name": "Iosevka Heavy Oblique", - "is_bold": true, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 10, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-heavyoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Heavy Oblique", - "subfamily_name": "Regular", - "weight": 900, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Heavy Oblique" - }, - "/usr/share/fonts/TTF/iosevka-italic.ttf||9242328:1700237156.0": { - "family_name": "Iosevka", - "font-family": "Iosevka", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Iosevka Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 5, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-italic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Italic", - "subfamily_name": "Italic", - "weight": 400, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Italic" - }, - "/usr/share/fonts/TTF/iosevka-light.ttf||8867824:1700237156.0": { - "family_name": "Iosevka Light", - "font-family": "Iosevka Light", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "300", - "fs_type": 0, - "full_name": "Iosevka Light", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 4, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-light.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Light", - "subfamily_name": "Regular", - "weight": 300, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Light" - }, - "/usr/share/fonts/TTF/iosevka-lightitalic.ttf||9157408:1700237156.0": { - "family_name": "Iosevka Light", - "font-family": "Iosevka Light", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "300", - "fs_type": 0, - "full_name": "Iosevka Light Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 4, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-lightitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Light Italic", - "subfamily_name": "Italic", - "weight": 300, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Light Italic" - }, - "/usr/share/fonts/TTF/iosevka-lightoblique.ttf||9118624:1700237156.0": { - "family_name": "Iosevka Light Oblique", - "font-family": "Iosevka Light Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "300", - "fs_type": 0, - "full_name": "Iosevka Light Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 4, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-lightoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Light Oblique", - "subfamily_name": "Regular", - "weight": 300, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Light Oblique" - }, - "/usr/share/fonts/TTF/iosevka-medium.ttf||8957732:1700237156.0": { - "family_name": "Iosevka Medium", - "font-family": "Iosevka Medium", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "500", - "fs_type": 0, - "full_name": "Iosevka Medium", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 6, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-medium.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Medium", - "subfamily_name": "Regular", - "weight": 500, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Medium" - }, - "/usr/share/fonts/TTF/iosevka-mediumitalic.ttf||9243236:1700237156.0": { - "family_name": "Iosevka Medium", - "font-family": "Iosevka Medium", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "500", - "fs_type": 0, - "full_name": "Iosevka Medium Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 6, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-mediumitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Medium Italic", - "subfamily_name": "Italic", - "weight": 500, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Medium Italic" - }, - "/usr/share/fonts/TTF/iosevka-mediumoblique.ttf||9205420:1700237156.0": { - "family_name": "Iosevka Medium Oblique", - "font-family": "Iosevka Medium Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "500", - "fs_type": 0, - "full_name": "Iosevka Medium Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 6, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-mediumoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Medium Oblique", - "subfamily_name": "Regular", - "weight": 500, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Medium Oblique" - }, - "/usr/share/fonts/TTF/iosevka-oblique.ttf||9206288:1700237156.0": { - "family_name": "Iosevka Oblique", - "font-family": "Iosevka Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Iosevka Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 5, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-oblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Oblique", - "subfamily_name": "Regular", - "weight": 400, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Oblique" - }, - "/usr/share/fonts/TTF/iosevka-regular.ttf||8976284:1700237156.0": { - "family_name": "Iosevka", - "font-family": "Iosevka", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Iosevka", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 5, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-regular.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Regular", - "subfamily_name": "Regular", - "weight": 400, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Regular" - }, - "/usr/share/fonts/TTF/iosevka-semibold.ttf||8981540:1700237156.0": { - "family_name": "Iosevka Semibold", - "font-family": "Iosevka Semibold", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "600", - "fs_type": 0, - "full_name": "Iosevka Semibold", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 7, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-semibold.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Semibold", - "subfamily_name": "Regular", - "weight": 600, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Semibold" - }, - "/usr/share/fonts/TTF/iosevka-semibolditalic.ttf||9263188:1700237156.0": { - "family_name": "Iosevka Semibold", - "font-family": "Iosevka Semibold", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "600", - "fs_type": 0, - "full_name": "Iosevka Semibold Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 7, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-semibolditalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Semibold Italic", - "subfamily_name": "Italic", - "weight": 600, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Semibold Italic" - }, - "/usr/share/fonts/TTF/iosevka-semiboldoblique.ttf||9227048:1700237156.0": { - "family_name": "Iosevka Semibold Oblique", - "font-family": "Iosevka Semibold Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "600", - "fs_type": 0, - "full_name": "Iosevka Semibold Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 7, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-semiboldoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Semibold Oblique", - "subfamily_name": "Regular", - "weight": 600, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Semibold Oblique" - }, - "/usr/share/fonts/TTF/iosevka-thin.ttf||8775692:1700237156.0": { - "family_name": "Iosevka Thin", - "font-family": "Iosevka Thin", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "100", - "fs_type": 0, - "full_name": "Iosevka Thin", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 2, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-thin.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Thin", - "subfamily_name": "Regular", - "weight": 100, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Thin" - }, - "/usr/share/fonts/TTF/iosevka-thinitalic.ttf||9012312:1700237156.0": { - "family_name": "Iosevka Thin", - "font-family": "Iosevka Thin", - "font-stretch": "normal", - "font-style": "italic", - "font-weight": "100", - "fs_type": 0, - "full_name": "Iosevka Thin Italic", - "is_bold": false, - "is_italic": true, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 2, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-thinitalic.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Thin Italic", - "subfamily_name": "Italic", - "weight": 100, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Thin Italic" - }, - "/usr/share/fonts/TTF/iosevka-thinoblique.ttf||8976396:1700237156.0": { - "family_name": "Iosevka Thin Oblique", - "font-family": "Iosevka Thin Oblique", - "font-stretch": "normal", - "font-style": "oblique", - "font-weight": "100", - "fs_type": 0, - "full_name": "Iosevka Thin Oblique", - "is_bold": false, - "is_italic": true, - "is_oblique": true, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 0, - 2, - 9, - 3, - 0, - 0, - 0, - 0, - 4 - ], - "path": "/usr/share/fonts/TTF/iosevka-thinoblique.ttf", - "preferred_family_name": "Iosevka", - "preferred_subfamily_name": "Thin Oblique", - "subfamily_name": "Regular", - "weight": 100, - "width": 5, - "wws_family_name": "Iosevka", - "wws_subfamily_name": "Thin Oblique" - }, "/usr/share/fonts/TTF/trebuc.ttf||126796:1700237191.0": { "family_name": "Trebuchet MS", "font-family": "Trebuchet MS", @@ -8748,6 +9648,1122 @@ "wws_family_name": null, "wws_subfamily_name": null }, + "/usr/share/fonts/carlito/Carlito-Bold.ttf||682468:1684059993.0": { + "family_name": "Carlito", + "font-family": "Carlito", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Carlito Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 4 + ], + "path": "/usr/share/fonts/carlito/Carlito-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/carlito/Carlito-BoldItalic.ttf||808508:1684059993.0": { + "family_name": "Carlito", + "font-family": "Carlito", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 0, + "full_name": "Carlito Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 4 + ], + "path": "/usr/share/fonts/carlito/Carlito-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/carlito/Carlito-Italic.ttf||615236:1684059993.0": { + "family_name": "Carlito", + "font-family": "Carlito", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Carlito Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 4 + ], + "path": "/usr/share/fonts/carlito/Carlito-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/carlito/Carlito-Regular.ttf||628032:1684059993.0": { + "family_name": "Carlito", + "font-family": "Carlito", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Carlito Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 15, + 5, + 2, + 2, + 2, + 4, + 3, + 2, + 4 + ], + "path": "/usr/share/fonts/carlito/Carlito-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidKufi-Bold.ttf||81220:1616720154.0": { + "family_name": "Droid Arabic Kufi", + "font-family": "Droid Arabic Kufi", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Arabic Kufi Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidKufi-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidKufi-Regular.ttf||81224:1616720154.0": { + "family_name": "Droid Arabic Kufi", + "font-family": "Droid Arabic Kufi", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Arabic Kufi", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidKufi-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidNaskh-Bold.ttf||94620:1616720154.0": { + "family_name": "Droid Arabic Naskh", + "font-family": "Droid Arabic Naskh", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Arabic Naskh Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidNaskh-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidNaskh-Regular-SystemUI.ttf||158148:1616720154.0": { + "family_name": "Droid Naskh Shift Alt", + "font-family": "Droid Naskh Shift Alt", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Naskh Shift Alt", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidNaskh-Regular-SystemUI.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidNaskh-Regular.ttf||91340:1616720154.0": { + "family_name": "Droid Arabic Naskh", + "font-family": "Droid Arabic Naskh", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Arabic Naskh", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidNaskh-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSans-Bold.ttf||194488:1616720154.0": { + "family_name": "Droid Sans", + "font-family": "Droid Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Sans Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSans-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSans.ttf||190776:1616720154.0": { + "family_name": "Droid Sans", + "font-family": "Droid Sans", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSans.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansArabic.ttf||35880:1616720154.0": { + "family_name": "Droid Sans Arabic", + "font-family": "Droid Sans Arabic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Arabic", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 0, + 3, + 5, + 0, + 5, + 0, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSansArabic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansArmenian.ttf||13856:1616720154.0": { + "family_name": "Droid Sans Armenian", + "font-family": "Droid Sans Armenian", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Armenian", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansArmenian.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansDevanagari-Regular.ttf||123372:1616720154.0": { + "family_name": "Droid Sans Devanagari", + "font-family": "Droid Sans Devanagari", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Devanagari", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansDevanagari-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansEthiopic-Bold.ttf||222592:1616720154.0": { + "family_name": "Droid Sans Ethiopic", + "font-family": "Droid Sans Ethiopic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Sans Ethiopic Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansEthiopic-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansEthiopic-Regular.ttf||227928:1616720154.0": { + "family_name": "Droid Sans Ethiopic", + "font-family": "Droid Sans Ethiopic", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Ethiopic", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansEthiopic-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansFallback.ttf||3838696:1616720154.0": { + "family_name": "Droid Sans Fallback", + "font-family": "Droid Sans Fallback", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Fallback", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 2, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "path": "/usr/share/fonts/droid/DroidSansFallback.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansFallbackFull.ttf||5398328:1616720154.0": { + "family_name": "Droid Sans Fallback", + "font-family": "Droid Sans Fallback", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Fallback", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 2, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "path": "/usr/share/fonts/droid/DroidSansFallbackFull.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansFallbackLegacy.ttf||3081908:1616720154.0": { + "family_name": "Droid Sans Fallback", + "font-family": "Droid Sans Fallback", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Fallback", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 2, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "path": "/usr/share/fonts/droid/DroidSansFallbackLegacy.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansGeorgian.ttf||21096:1616720154.0": { + "family_name": "Droid Sans Georgian", + "font-family": "Droid Sans Georgian", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Georgian", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansGeorgian.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansHebrew-Bold.ttf||30280:1616720154.0": { + "family_name": "Droid Sans Hebrew", + "font-family": "Droid Sans Hebrew", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "600", + "fs_type": 8, + "full_name": "Droid Sans Hebrew Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 0, + 3, + 5, + 0, + 5, + 0, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSansHebrew-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 600, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansHebrew-Regular.ttf||30024:1616720154.0": { + "family_name": "Droid Sans Hebrew", + "font-family": "Droid Sans Hebrew", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Hebrew", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 0, + 3, + 5, + 0, + 5, + 0, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSansHebrew-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansJapanese.ttf||1173140:1616720154.0": { + "family_name": "Droid Sans Japanese", + "font-family": "Droid Sans Japanese", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Japanese", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 5, + 2, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "path": "/usr/share/fonts/droid/DroidSansJapanese.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansMono.ttf||119380:1616720154.0": { + "family_name": "Droid Sans Mono", + "font-family": "Droid Sans Mono", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Mono", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 9, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansMono.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansTamil-Bold.ttf||36448:1616720154.0": { + "family_name": "Droid Sans Tamil", + "font-family": "Droid Sans Tamil", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Sans Tamil Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 8, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansTamil-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansTamil-Regular.ttf||36308:1616720154.0": { + "family_name": "Droid Sans Tamil", + "font-family": "Droid Sans Tamil", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Tamil", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansTamil-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSansThai.ttf||35584:1616720154.0": { + "family_name": "Droid Sans Thai", + "font-family": "Droid Sans Thai", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Sans Thai", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 11, + 6, + 6, + 3, + 8, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/droid/DroidSansThai.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSerif-Bold.ttf||185228:1616720154.0": { + "family_name": "Droid Serif", + "font-family": "Droid Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Serif Bold", + "is_bold": true, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 8, + 0, + 6, + 5, + 0, + 2, + 2, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSerif-Bold.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSerif-BoldItalic.ttf||190304:1616720154.0": { + "family_name": "Droid Serif", + "font-family": "Droid Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "bold", + "fs_type": 8, + "full_name": "Droid Serif Bold Italic", + "is_bold": true, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 8, + 0, + 6, + 5, + 0, + 9, + 2, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSerif-BoldItalic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Bold Italic", + "weight": 700, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSerif-Italic.ttf||177560:1616720154.0": { + "family_name": "Droid Serif", + "font-family": "Droid Serif", + "font-stretch": "normal", + "font-style": "italic", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Serif Italic", + "is_bold": false, + "is_italic": true, + "is_oblique": false, + "is_otf": false, + "is_regular": false, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 6, + 0, + 6, + 5, + 0, + 9, + 2, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSerif-Italic.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Italic", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/droid/DroidSerif-Regular.ttf||172916:1616720154.0": { + "family_name": "Droid Serif", + "font-family": "Droid Serif", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 8, + "full_name": "Droid Serif", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": false, + "os2_version": 3, + "panose": [ + 2, + 2, + 6, + 0, + 6, + 5, + 0, + 2, + 2, + 0 + ], + "path": "/usr/share/fonts/droid/DroidSerif-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, "/usr/share/fonts/gnu-free/FreeMono.otf||430884:1589880580.0": { "family_name": "FreeMono", "font-family": "FreeMono", @@ -10908,7 +12924,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoFangsongKSSRotated-Regular.ttf||633564:1701417168.0": { + "/usr/share/fonts/noto/NotoFangsongKSSRotated-Regular.ttf||633564:1711963959.0": { "family_name": "Noto Fangsong KSS Rotated", "font-family": "Noto Fangsong KSS Rotated", "font-stretch": "normal", @@ -10944,7 +12960,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoFangsongKSSVertical-Regular.ttf||221056:1701417168.0": { + "/usr/share/fonts/noto/NotoFangsongKSSVertical-Regular.ttf||221056:1711963959.0": { "family_name": "Noto Fangsong KSS Vertical", "font-family": "Noto Fangsong KSS Vertical", "font-stretch": "normal", @@ -10980,7 +12996,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoKufiArabic-Black.ttf||269324:1701417168.0": { + "/usr/share/fonts/noto/NotoKufiArabic-Black.ttf||266040:1711963959.0": { "family_name": "Noto Kufi Arabic Black", "font-family": "Noto Kufi Arabic Black", "font-stretch": "normal", @@ -11016,7 +13032,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoKufiArabic-Bold.ttf||257232:1701417168.0": { + "/usr/share/fonts/noto/NotoKufiArabic-Bold.ttf||253948:1711963959.0": { "family_name": "Noto Kufi Arabic", "font-family": "Noto Kufi Arabic", "font-stretch": "normal", @@ -11052,7 +13068,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoKufiArabic-Light.ttf||225828:1701417168.0": { + "/usr/share/fonts/noto/NotoKufiArabic-Light.ttf||222564:1711963959.0": { "family_name": "Noto Kufi Arabic Light", "font-family": "Noto Kufi Arabic Light", "font-stretch": "normal", @@ -11088,7 +13104,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoKufiArabic-Medium.ttf||242584:1701417168.0": { + "/usr/share/fonts/noto/NotoKufiArabic-Medium.ttf||239536:1711963959.0": { "family_name": "Noto Kufi Arabic Medium", "font-family": "Noto Kufi Arabic Medium", "font-stretch": "normal", @@ -11124,7 +13140,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoKufiArabic-Regular.ttf||234392:1701417168.0": { + "/usr/share/fonts/noto/NotoKufiArabic-Regular.ttf||231108:1711963959.0": { "family_name": "Noto Kufi Arabic", "font-family": "Noto Kufi Arabic", "font-stretch": "normal", @@ -11160,7 +13176,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoKufiArabic-Thin.ttf||219548:1701417168.0": { + "/usr/share/fonts/noto/NotoKufiArabic-Thin.ttf||216264:1711963959.0": { "family_name": "Noto Kufi Arabic Thin", "font-family": "Noto Kufi Arabic Thin", "font-stretch": "normal", @@ -11196,223 +13212,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoLoopedThai-Black.ttf||69940:1701417168.0": { - "family_name": "Noto Looped Thai Black", - "font-family": "Noto Looped Thai Black", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "900", - "fs_type": 0, - "full_name": "Noto Looped Thai Black", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 11, - 10, - 2, - 4, - 5, - 4, - 2, - 2, - 4 - ], - "path": "/usr/share/fonts/noto/NotoLoopedThai-Black.ttf", - "preferred_family_name": "Noto Looped Thai", - "preferred_subfamily_name": "Black", - "subfamily_name": "Regular", - "weight": 900, - "width": 5, - "wws_family_name": null, - "wws_subfamily_name": null - }, - "/usr/share/fonts/noto/NotoLoopedThai-Bold.ttf||71084:1701417168.0": { - "family_name": "Noto Looped Thai", - "font-family": "Noto Looped Thai", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "bold", - "fs_type": 0, - "full_name": "Noto Looped Thai Bold", - "is_bold": true, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": false, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 11, - 8, - 2, - 4, - 5, - 4, - 2, - 2, - 4 - ], - "path": "/usr/share/fonts/noto/NotoLoopedThai-Bold.ttf", - "preferred_family_name": null, - "preferred_subfamily_name": null, - "subfamily_name": "Bold", - "weight": 700, - "width": 5, - "wws_family_name": null, - "wws_subfamily_name": null - }, - "/usr/share/fonts/noto/NotoLoopedThai-Light.ttf||65672:1701417168.0": { - "family_name": "Noto Looped Thai Light", - "font-family": "Noto Looped Thai Light", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "300", - "fs_type": 0, - "full_name": "Noto Looped Thai Light", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 11, - 4, - 2, - 4, - 5, - 4, - 2, - 2, - 4 - ], - "path": "/usr/share/fonts/noto/NotoLoopedThai-Light.ttf", - "preferred_family_name": "Noto Looped Thai", - "preferred_subfamily_name": "Light", - "subfamily_name": "Regular", - "weight": 300, - "width": 5, - "wws_family_name": null, - "wws_subfamily_name": null - }, - "/usr/share/fonts/noto/NotoLoopedThai-Medium.ttf||68012:1701417168.0": { - "family_name": "Noto Looped Thai Medium", - "font-family": "Noto Looped Thai Medium", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "500", - "fs_type": 0, - "full_name": "Noto Looped Thai Medium", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 11, - 6, - 2, - 4, - 5, - 4, - 2, - 2, - 4 - ], - "path": "/usr/share/fonts/noto/NotoLoopedThai-Medium.ttf", - "preferred_family_name": "Noto Looped Thai", - "preferred_subfamily_name": "Medium", - "subfamily_name": "Regular", - "weight": 500, - "width": 5, - "wws_family_name": null, - "wws_subfamily_name": null - }, - "/usr/share/fonts/noto/NotoLoopedThai-Regular.ttf||66040:1701417168.0": { - "family_name": "Noto Looped Thai", - "font-family": "Noto Looped Thai", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "normal", - "fs_type": 0, - "full_name": "Noto Looped Thai Regular", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 11, - 5, - 2, - 4, - 5, - 4, - 2, - 2, - 4 - ], - "path": "/usr/share/fonts/noto/NotoLoopedThai-Regular.ttf", - "preferred_family_name": null, - "preferred_subfamily_name": null, - "subfamily_name": "Regular", - "weight": 400, - "width": 5, - "wws_family_name": null, - "wws_subfamily_name": null - }, - "/usr/share/fonts/noto/NotoLoopedThai-Thin.ttf||62840:1701417168.0": { - "family_name": "Noto Looped Thai Thin", - "font-family": "Noto Looped Thai Thin", - "font-stretch": "normal", - "font-style": "normal", - "font-weight": "100", - "fs_type": 0, - "full_name": "Noto Looped Thai Thin", - "is_bold": false, - "is_italic": false, - "is_oblique": false, - "is_otf": false, - "is_regular": true, - "is_wws": false, - "os2_version": 4, - "panose": [ - 2, - 11, - 2, - 2, - 4, - 5, - 4, - 2, - 2, - 4 - ], - "path": "/usr/share/fonts/noto/NotoLoopedThai-Thin.ttf", - "preferred_family_name": "Noto Looped Thai", - "preferred_subfamily_name": "Thin", - "subfamily_name": "Regular", - "weight": 100, - "width": 5, - "wws_family_name": null, - "wws_subfamily_name": null - }, - "/usr/share/fonts/noto/NotoMusic-Regular.ttf||82308:1701417168.0": { + "/usr/share/fonts/noto/NotoMusic-Regular.ttf||82308:1711963959.0": { "family_name": "Noto Music", "font-family": "Noto Music", "font-stretch": "normal", @@ -11448,7 +13248,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNaskhArabic-Bold.ttf||298672:1701417168.0": { + "/usr/share/fonts/noto/NotoNaskhArabic-Bold.ttf||298672:1711963959.0": { "family_name": "Noto Naskh Arabic", "font-family": "Noto Naskh Arabic", "font-stretch": "normal", @@ -11484,7 +13284,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNaskhArabic-Medium.ttf||278536:1701417168.0": { + "/usr/share/fonts/noto/NotoNaskhArabic-Medium.ttf||278536:1711963959.0": { "family_name": "Noto Naskh Arabic Medium", "font-family": "Noto Naskh Arabic Medium", "font-stretch": "normal", @@ -11520,7 +13320,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNaskhArabic-Regular.ttf||260252:1701417168.0": { + "/usr/share/fonts/noto/NotoNaskhArabic-Regular.ttf||260252:1711963959.0": { "family_name": "Noto Naskh Arabic", "font-family": "Noto Naskh Arabic", "font-stretch": "normal", @@ -11556,7 +13356,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNaskhArabicUI-Bold.ttf||243056:1701417168.0": { + "/usr/share/fonts/noto/NotoNaskhArabicUI-Bold.ttf||243056:1711963959.0": { "family_name": "Noto Naskh Arabic UI", "font-family": "Noto Naskh Arabic UI", "font-stretch": "normal", @@ -11592,7 +13392,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNaskhArabicUI-Medium.ttf||240964:1701417168.0": { + "/usr/share/fonts/noto/NotoNaskhArabicUI-Medium.ttf||240964:1711963959.0": { "family_name": "Noto Naskh Arabic UI Medium", "font-family": "Noto Naskh Arabic UI Medium", "font-stretch": "normal", @@ -11628,7 +13428,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNaskhArabicUI-Regular.ttf||234764:1701417168.0": { + "/usr/share/fonts/noto/NotoNaskhArabicUI-Regular.ttf||234764:1711963959.0": { "family_name": "Noto Naskh Arabic UI", "font-family": "Noto Naskh Arabic UI", "font-stretch": "normal", @@ -11664,7 +13464,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNastaliqUrdu-Bold.ttf||585268:1701417168.0": { + "/usr/share/fonts/noto/NotoNastaliqUrdu-Bold.ttf||585268:1711963959.0": { "family_name": "Noto Nastaliq Urdu", "font-family": "Noto Nastaliq Urdu", "font-stretch": "normal", @@ -11700,7 +13500,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoNastaliqUrdu-Regular.ttf||584008:1701417168.0": { + "/usr/share/fonts/noto/NotoNastaliqUrdu-Regular.ttf||584008:1711963959.0": { "family_name": "Noto Nastaliq Urdu", "font-family": "Noto Nastaliq Urdu", "font-stretch": "normal", @@ -11736,7 +13536,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoRashiHebrew-Black.ttf||27700:1701417168.0": { + "/usr/share/fonts/noto/NotoRashiHebrew-Black.ttf||27700:1711963959.0": { "family_name": "Noto Rashi Hebrew Black", "font-family": "Noto Rashi Hebrew Black", "font-stretch": "normal", @@ -11772,7 +13572,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoRashiHebrew-Bold.ttf||27700:1701417168.0": { + "/usr/share/fonts/noto/NotoRashiHebrew-Bold.ttf||27700:1711963959.0": { "family_name": "Noto Rashi Hebrew", "font-family": "Noto Rashi Hebrew", "font-stretch": "normal", @@ -11808,7 +13608,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoRashiHebrew-Light.ttf||26804:1701417168.0": { + "/usr/share/fonts/noto/NotoRashiHebrew-Light.ttf||26804:1711963959.0": { "family_name": "Noto Rashi Hebrew Light", "font-family": "Noto Rashi Hebrew Light", "font-stretch": "normal", @@ -11844,7 +13644,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoRashiHebrew-Medium.ttf||26756:1701417168.0": { + "/usr/share/fonts/noto/NotoRashiHebrew-Medium.ttf||26756:1711963959.0": { "family_name": "Noto Rashi Hebrew Medium", "font-family": "Noto Rashi Hebrew Medium", "font-stretch": "normal", @@ -11880,7 +13680,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoRashiHebrew-Regular.ttf||26868:1701417168.0": { + "/usr/share/fonts/noto/NotoRashiHebrew-Regular.ttf||26868:1711963959.0": { "family_name": "Noto Rashi Hebrew", "font-family": "Noto Rashi Hebrew", "font-stretch": "normal", @@ -11916,7 +13716,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoRashiHebrew-Thin.ttf||25676:1701417168.0": { + "/usr/share/fonts/noto/NotoRashiHebrew-Thin.ttf||25676:1711963959.0": { "family_name": "Noto Rashi Hebrew Thin", "font-family": "Noto Rashi Hebrew Thin", "font-stretch": "normal", @@ -11952,7 +13752,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Black.ttf||633020:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Black.ttf||633020:1711963959.0": { "family_name": "Noto Sans Black", "font-family": "Noto Sans Black", "font-stretch": "normal", @@ -11988,7 +13788,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-BlackItalic.ttf||651480:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-BlackItalic.ttf||651480:1711963959.0": { "family_name": "Noto Sans Black", "font-family": "Noto Sans Black", "font-stretch": "normal", @@ -12024,7 +13824,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Bold.ttf||616112:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Bold.ttf||616112:1711963959.0": { "family_name": "Noto Sans", "font-family": "Noto Sans", "font-stretch": "normal", @@ -12060,7 +13860,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-BoldItalic.ttf||637484:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-BoldItalic.ttf||637484:1711963959.0": { "family_name": "Noto Sans", "font-family": "Noto Sans", "font-stretch": "normal", @@ -12096,7 +13896,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Italic.ttf||629208:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Italic.ttf||629208:1711963959.0": { "family_name": "Noto Sans", "font-family": "Noto Sans", "font-stretch": "normal", @@ -12132,7 +13932,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Light.ttf||596052:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Light.ttf||596052:1711963959.0": { "family_name": "Noto Sans Light", "font-family": "Noto Sans Light", "font-stretch": "normal", @@ -12168,7 +13968,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-LightItalic.ttf||624708:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-LightItalic.ttf||624708:1711963959.0": { "family_name": "Noto Sans Light", "font-family": "Noto Sans Light", "font-stretch": "normal", @@ -12204,7 +14004,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Medium.ttf||608276:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Medium.ttf||608276:1711963959.0": { "family_name": "Noto Sans Medium", "font-family": "Noto Sans Medium", "font-stretch": "normal", @@ -12240,7 +14040,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-MediumItalic.ttf||632208:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-MediumItalic.ttf||632208:1711963959.0": { "family_name": "Noto Sans Medium", "font-family": "Noto Sans Medium", "font-stretch": "normal", @@ -12276,7 +14076,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Regular.ttf||610392:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Regular.ttf||610392:1711963959.0": { "family_name": "Noto Sans", "font-family": "Noto Sans", "font-stretch": "normal", @@ -12312,7 +14112,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-Thin.ttf||585592:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-Thin.ttf||585592:1711963959.0": { "family_name": "Noto Sans Thin", "font-family": "Noto Sans Thin", "font-stretch": "normal", @@ -12348,7 +14148,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSans-ThinItalic.ttf||614624:1701417168.0": { + "/usr/share/fonts/noto/NotoSans-ThinItalic.ttf||614624:1711963959.0": { "family_name": "Noto Sans Thin", "font-family": "Noto Sans Thin", "font-stretch": "normal", @@ -12384,7 +14184,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansAdlam-Bold.ttf||93728:1701417168.0": { + "/usr/share/fonts/noto/NotoSansAdlam-Bold.ttf||93728:1711963959.0": { "family_name": "Noto Sans Adlam", "font-family": "Noto Sans Adlam", "font-stretch": "normal", @@ -12420,7 +14220,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansAdlam-Regular.ttf||93820:1701417168.0": { + "/usr/share/fonts/noto/NotoSansAdlam-Regular.ttf||93820:1711963959.0": { "family_name": "Noto Sans Adlam", "font-family": "Noto Sans Adlam", "font-stretch": "normal", @@ -12456,7 +14256,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Bold.ttf||36384:1701417168.0": { + "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Bold.ttf||36384:1711963959.0": { "family_name": "Noto Sans Adlam Unjoined", "font-family": "Noto Sans Adlam Unjoined", "font-stretch": "normal", @@ -12492,7 +14292,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Regular.ttf||36316:1701417168.0": { + "/usr/share/fonts/noto/NotoSansAdlamUnjoined-Regular.ttf||36316:1711963959.0": { "family_name": "Noto Sans Adlam Unjoined", "font-family": "Noto Sans Adlam Unjoined", "font-stretch": "normal", @@ -12528,7 +14328,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansAnatolianHieroglyphs-Regular.ttf||228120:1701417168.0": { + "/usr/share/fonts/noto/NotoSansAnatolianHieroglyphs-Regular.ttf||228120:1711963959.0": { "family_name": "Noto Sans Anatolian Hieroglyphs", "font-family": "Noto Sans Anatolian Hieroglyphs", "font-stretch": "normal", @@ -12564,7 +14364,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArabic-Black.ttf||282488:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArabic-Black.ttf||282488:1711963959.0": { "family_name": "Noto Sans Arabic Blk", "font-family": "Noto Sans Arabic Blk", "font-stretch": "normal", @@ -12600,7 +14400,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArabic-Bold.ttf||278736:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArabic-Bold.ttf||278736:1711963959.0": { "family_name": "Noto Sans Arabic", "font-family": "Noto Sans Arabic", "font-stretch": "normal", @@ -12636,7 +14436,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArabic-Light.ttf||237360:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArabic-Light.ttf||237360:1711963959.0": { "family_name": "Noto Sans Arabic Light", "font-family": "Noto Sans Arabic Light", "font-stretch": "normal", @@ -12672,7 +14472,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArabic-Medium.ttf||275008:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArabic-Medium.ttf||275008:1711963959.0": { "family_name": "Noto Sans Arabic Med", "font-family": "Noto Sans Arabic Med", "font-stretch": "normal", @@ -12708,7 +14508,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArabic-Regular.ttf||247112:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArabic-Regular.ttf||247112:1711963959.0": { "family_name": "Noto Sans Arabic", "font-family": "Noto Sans Arabic", "font-stretch": "normal", @@ -12744,7 +14544,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArabic-Thin.ttf||227704:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArabic-Thin.ttf||227704:1711963959.0": { "family_name": "Noto Sans Arabic Thin", "font-family": "Noto Sans Arabic Thin", "font-stretch": "normal", @@ -12780,7 +14580,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArmenian-Black.ttf||32768:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArmenian-Black.ttf||32768:1711963959.0": { "family_name": "Noto Sans Armenian Black", "font-family": "Noto Sans Armenian Black", "font-stretch": "normal", @@ -12816,7 +14616,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArmenian-Bold.ttf||30784:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArmenian-Bold.ttf||30784:1711963959.0": { "family_name": "Noto Sans Armenian", "font-family": "Noto Sans Armenian", "font-stretch": "normal", @@ -12852,7 +14652,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArmenian-Light.ttf||29596:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArmenian-Light.ttf||29596:1711963959.0": { "family_name": "Noto Sans Armenian Light", "font-family": "Noto Sans Armenian Light", "font-stretch": "normal", @@ -12888,7 +14688,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArmenian-Medium.ttf||30700:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArmenian-Medium.ttf||30700:1711963959.0": { "family_name": "Noto Sans Armenian Medium", "font-family": "Noto Sans Armenian Medium", "font-stretch": "normal", @@ -12924,7 +14724,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArmenian-Regular.ttf||30752:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArmenian-Regular.ttf||30752:1711963959.0": { "family_name": "Noto Sans Armenian", "font-family": "Noto Sans Armenian", "font-stretch": "normal", @@ -12960,7 +14760,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansArmenian-Thin.ttf||30576:1701417168.0": { + "/usr/share/fonts/noto/NotoSansArmenian-Thin.ttf||30576:1711963959.0": { "family_name": "Noto Sans Armenian Thin", "font-family": "Noto Sans Armenian Thin", "font-stretch": "normal", @@ -12996,7 +14796,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansAvestan-Regular.ttf||22584:1701417168.0": { + "/usr/share/fonts/noto/NotoSansAvestan-Regular.ttf||22584:1711963959.0": { "family_name": "Noto Sans Avestan", "font-family": "Noto Sans Avestan", "font-stretch": "normal", @@ -13032,7 +14832,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBalinese-Bold.ttf||133200:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBalinese-Bold.ttf||93064:1711963959.0": { "family_name": "Noto Sans Balinese", "font-family": "Noto Sans Balinese", "font-stretch": "normal", @@ -13068,7 +14868,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBalinese-Medium.ttf||125408:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBalinese-Medium.ttf||92004:1711963959.0": { "family_name": "Noto Sans Balinese Medium", "font-family": "Noto Sans Balinese Medium", "font-stretch": "normal", @@ -13104,7 +14904,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBalinese-Regular.ttf||131112:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBalinese-Regular.ttf||93268:1711963959.0": { "family_name": "Noto Sans Balinese", "font-family": "Noto Sans Balinese", "font-stretch": "normal", @@ -13140,7 +14940,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBamum-Bold.ttf||230444:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBamum-Bold.ttf||230444:1711963959.0": { "family_name": "Noto Sans Bamum", "font-family": "Noto Sans Bamum", "font-stretch": "normal", @@ -13176,7 +14976,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBamum-Medium.ttf||230228:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBamum-Medium.ttf||230228:1711963959.0": { "family_name": "Noto Sans Bamum Medium", "font-family": "Noto Sans Bamum Medium", "font-stretch": "normal", @@ -13212,7 +15012,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBamum-Regular.ttf||230008:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBamum-Regular.ttf||230008:1711963959.0": { "family_name": "Noto Sans Bamum", "font-family": "Noto Sans Bamum", "font-stretch": "normal", @@ -13248,7 +15048,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBassaVah-Bold.ttf||7868:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBassaVah-Bold.ttf||7868:1711963959.0": { "family_name": "Noto Sans Bassa Vah", "font-family": "Noto Sans Bassa Vah", "font-stretch": "normal", @@ -13284,7 +15084,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBassaVah-Medium.ttf||8084:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBassaVah-Medium.ttf||8084:1711963959.0": { "family_name": "Noto Sans Bassa Vah Medium", "font-family": "Noto Sans Bassa Vah Medium", "font-stretch": "normal", @@ -13320,7 +15120,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBassaVah-Regular.ttf||8116:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBassaVah-Regular.ttf||8116:1711963959.0": { "family_name": "Noto Sans Bassa Vah", "font-family": "Noto Sans Bassa Vah", "font-stretch": "normal", @@ -13356,7 +15156,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBatak-Regular.ttf||22336:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBatak-Regular.ttf||22336:1711963959.0": { "family_name": "Noto Sans Batak", "font-family": "Noto Sans Batak", "font-stretch": "normal", @@ -13392,7 +15192,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengali-Black.ttf||218000:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengali-Black.ttf||218000:1711963959.0": { "family_name": "Noto Sans Bengali Black", "font-family": "Noto Sans Bengali Black", "font-stretch": "normal", @@ -13428,7 +15228,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengali-Bold.ttf||212540:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengali-Bold.ttf||212540:1711963959.0": { "family_name": "Noto Sans Bengali", "font-family": "Noto Sans Bengali", "font-stretch": "normal", @@ -13464,7 +15264,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengali-Light.ttf||195904:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengali-Light.ttf||195904:1711963959.0": { "family_name": "Noto Sans Bengali Light", "font-family": "Noto Sans Bengali Light", "font-stretch": "normal", @@ -13500,7 +15300,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengali-Medium.ttf||208384:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengali-Medium.ttf||208384:1711963959.0": { "family_name": "Noto Sans Bengali Medium", "font-family": "Noto Sans Bengali Medium", "font-stretch": "normal", @@ -13536,7 +15336,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengali-Regular.ttf||203696:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengali-Regular.ttf||203696:1711963959.0": { "family_name": "Noto Sans Bengali", "font-family": "Noto Sans Bengali", "font-stretch": "normal", @@ -13572,7 +15372,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengali-Thin.ttf||190188:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengali-Thin.ttf||190188:1711963959.0": { "family_name": "Noto Sans Bengali Thin", "font-family": "Noto Sans Bengali Thin", "font-stretch": "normal", @@ -13608,7 +15408,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengaliUI-Black.ttf||218108:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengaliUI-Black.ttf||218108:1711963959.0": { "family_name": "Noto Sans Bengali UI Black", "font-family": "Noto Sans Bengali UI Black", "font-stretch": "normal", @@ -13644,7 +15444,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengaliUI-Bold.ttf||212652:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengaliUI-Bold.ttf||212652:1711963959.0": { "family_name": "Noto Sans Bengali UI", "font-family": "Noto Sans Bengali UI", "font-stretch": "normal", @@ -13680,7 +15480,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengaliUI-Light.ttf||195944:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengaliUI-Light.ttf||195944:1711963959.0": { "family_name": "Noto Sans Bengali UI Light", "font-family": "Noto Sans Bengali UI Light", "font-stretch": "normal", @@ -13716,7 +15516,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengaliUI-Medium.ttf||208420:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengaliUI-Medium.ttf||208420:1711963959.0": { "family_name": "Noto Sans Bengali UI Medium", "font-family": "Noto Sans Bengali UI Medium", "font-stretch": "normal", @@ -13752,7 +15552,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengaliUI-Regular.ttf||203732:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengaliUI-Regular.ttf||203732:1711963959.0": { "family_name": "Noto Sans Bengali UI", "font-family": "Noto Sans Bengali UI", "font-stretch": "normal", @@ -13788,7 +15588,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBengaliUI-Thin.ttf||190228:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBengaliUI-Thin.ttf||190228:1711963959.0": { "family_name": "Noto Sans Bengali UI Thin", "font-family": "Noto Sans Bengali UI Thin", "font-stretch": "normal", @@ -13824,7 +15624,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBhaiksuki-Regular.ttf||232572:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBhaiksuki-Regular.ttf||232572:1711963959.0": { "family_name": "Noto Sans Bhaiksuki", "font-family": "Noto Sans Bhaiksuki", "font-stretch": "normal", @@ -13860,7 +15660,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBrahmi-Regular.ttf||40876:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBrahmi-Regular.ttf||46972:1711963959.0": { "family_name": "Noto Sans Brahmi", "font-family": "Noto Sans Brahmi", "font-stretch": "normal", @@ -13873,7 +15673,7 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -13896,7 +15696,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBuginese-Regular.ttf||7232:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBuginese-Regular.ttf||7232:1711963959.0": { "family_name": "Noto Sans Buginese", "font-family": "Noto Sans Buginese", "font-stretch": "normal", @@ -13932,7 +15732,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansBuhid-Regular.ttf||5316:1701417168.0": { + "/usr/share/fonts/noto/NotoSansBuhid-Regular.ttf||5316:1711963959.0": { "family_name": "Noto Sans Buhid", "font-family": "Noto Sans Buhid", "font-stretch": "normal", @@ -13968,7 +15768,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Black.ttf||107072:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Black.ttf||171472:1711963959.0": { "family_name": "Noto Sans Canadian Aboriginal Black", "font-family": "Noto Sans Canadian Aboriginal Black", "font-stretch": "normal", @@ -13981,7 +15781,7 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -14004,7 +15804,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Bold.ttf||108052:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Bold.ttf||169356:1711963959.0": { "family_name": "Noto Sans Canadian Aboriginal", "font-family": "Noto Sans Canadian Aboriginal", "font-stretch": "normal", @@ -14017,7 +15817,7 @@ "is_oblique": false, "is_otf": false, "is_regular": false, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -14040,7 +15840,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Light.ttf||100700:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Light.ttf||169792:1711963959.0": { "family_name": "Noto Sans Canadian Aboriginal Light", "font-family": "Noto Sans Canadian Aboriginal Light", "font-stretch": "normal", @@ -14053,7 +15853,7 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -14076,7 +15876,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Medium.ttf||111496:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Medium.ttf||171392:1711963959.0": { "family_name": "Noto Sans Canadian Aboriginal Medium", "font-family": "Noto Sans Canadian Aboriginal Medium", "font-stretch": "normal", @@ -14089,7 +15889,7 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -14112,7 +15912,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Regular.ttf||114300:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Regular.ttf||176372:1711963959.0": { "family_name": "Noto Sans Canadian Aboriginal", "font-family": "Noto Sans Canadian Aboriginal", "font-stretch": "normal", @@ -14125,7 +15925,7 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -14148,7 +15948,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Thin.ttf||100616:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCanadianAboriginal-Thin.ttf||166932:1711963959.0": { "family_name": "Noto Sans Canadian Aboriginal Thin", "font-family": "Noto Sans Canadian Aboriginal Thin", "font-stretch": "normal", @@ -14161,7 +15961,7 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": false, + "is_wws": true, "os2_version": 4, "panose": [ 2, @@ -14184,7 +15984,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCarian-Regular.ttf||12416:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCarian-Regular.ttf||12416:1711963959.0": { "family_name": "Noto Sans Carian", "font-family": "Noto Sans Carian", "font-stretch": "normal", @@ -14220,7 +16020,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCaucasianAlbanian-Regular.ttf||24752:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCaucasianAlbanian-Regular.ttf||24752:1711963959.0": { "family_name": "Noto Sans Caucasian Albanian", "font-family": "Noto Sans Caucasian Albanian", "font-stretch": "normal", @@ -14256,7 +16056,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansChakma-Regular.ttf||82348:1701417168.0": { + "/usr/share/fonts/noto/NotoSansChakma-Regular.ttf||82348:1711963959.0": { "family_name": "Noto Sans Chakma", "font-family": "Noto Sans Chakma", "font-stretch": "normal", @@ -14292,7 +16092,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCham-Black.ttf||32236:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCham-Black.ttf||32236:1711963959.0": { "family_name": "Noto Sans Cham Black", "font-family": "Noto Sans Cham Black", "font-stretch": "normal", @@ -14328,7 +16128,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCham-Bold.ttf||32172:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCham-Bold.ttf||32172:1711963959.0": { "family_name": "Noto Sans Cham", "font-family": "Noto Sans Cham", "font-stretch": "normal", @@ -14364,7 +16164,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCham-Light.ttf||31876:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCham-Light.ttf||31876:1711963959.0": { "family_name": "Noto Sans Cham Light", "font-family": "Noto Sans Cham Light", "font-stretch": "normal", @@ -14400,7 +16200,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCham-Medium.ttf||32176:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCham-Medium.ttf||32176:1711963959.0": { "family_name": "Noto Sans Cham Medium", "font-family": "Noto Sans Cham Medium", "font-stretch": "normal", @@ -14436,7 +16236,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCham-Regular.ttf||32012:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCham-Regular.ttf||32012:1711963959.0": { "family_name": "Noto Sans Cham", "font-family": "Noto Sans Cham", "font-stretch": "normal", @@ -14472,7 +16272,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCham-Thin.ttf||31984:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCham-Thin.ttf||31984:1711963959.0": { "family_name": "Noto Sans Cham Thin", "font-family": "Noto Sans Cham Thin", "font-stretch": "normal", @@ -14508,7 +16308,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCherokee-Black.ttf||106256:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCherokee-Black.ttf||106256:1711963959.0": { "family_name": "Noto Sans Cherokee Black", "font-family": "Noto Sans Cherokee Black", "font-stretch": "normal", @@ -14544,7 +16344,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCherokee-Bold.ttf||108548:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCherokee-Bold.ttf||108548:1711963959.0": { "family_name": "Noto Sans Cherokee", "font-family": "Noto Sans Cherokee", "font-stretch": "normal", @@ -14580,7 +16380,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCherokee-Light.ttf||102516:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCherokee-Light.ttf||102516:1711963959.0": { "family_name": "Noto Sans Cherokee Light", "font-family": "Noto Sans Cherokee Light", "font-stretch": "normal", @@ -14616,7 +16416,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCherokee-Medium.ttf||107224:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCherokee-Medium.ttf||107224:1711963959.0": { "family_name": "Noto Sans Cherokee Medium", "font-family": "Noto Sans Cherokee Medium", "font-stretch": "normal", @@ -14652,7 +16452,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCherokee-Regular.ttf||94732:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCherokee-Regular.ttf||94732:1711963959.0": { "family_name": "Noto Sans Cherokee", "font-family": "Noto Sans Cherokee", "font-stretch": "normal", @@ -14688,7 +16488,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCherokee-Thin.ttf||96928:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCherokee-Thin.ttf||96928:1711963959.0": { "family_name": "Noto Sans Cherokee Thin", "font-family": "Noto Sans Cherokee Thin", "font-stretch": "normal", @@ -14724,7 +16524,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansChorasmian-Regular.ttf||16996:1701417168.0": { + "/usr/share/fonts/noto/NotoSansChorasmian-Regular.ttf||17356:1711963959.0": { "family_name": "Noto Sans Chorasmian", "font-family": "Noto Sans Chorasmian", "font-stretch": "normal", @@ -14760,7 +16560,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCoptic-Regular.ttf||48948:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCoptic-Regular.ttf||48948:1711963959.0": { "family_name": "Noto Sans Coptic", "font-family": "Noto Sans Coptic", "font-stretch": "normal", @@ -14796,7 +16596,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCuneiform-Regular.ttf||819980:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCuneiform-Regular.ttf||819980:1711963959.0": { "family_name": "Noto Sans Cuneiform", "font-family": "Noto Sans Cuneiform", "font-stretch": "normal", @@ -14832,7 +16632,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCypriot-Regular.ttf||14656:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCypriot-Regular.ttf||14656:1711963959.0": { "family_name": "Noto Sans Cypriot", "font-family": "Noto Sans Cypriot", "font-stretch": "normal", @@ -14868,7 +16668,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansCyproMinoan-Regular.ttf||12552:1701417168.0": { + "/usr/share/fonts/noto/NotoSansCyproMinoan-Regular.ttf||12552:1711963959.0": { "family_name": "Noto Sans Cypro Minoan", "font-family": "Noto Sans Cypro Minoan", "font-stretch": "normal", @@ -14904,7 +16704,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDeseret-Regular.ttf||19504:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDeseret-Regular.ttf||19504:1711963959.0": { "family_name": "Noto Sans Deseret", "font-family": "Noto Sans Deseret", "font-stretch": "normal", @@ -14940,7 +16740,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagari-Black.ttf||246024:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagari-Black.ttf||246024:1711963959.0": { "family_name": "Noto Sans Devanagari Black", "font-family": "Noto Sans Devanagari Black", "font-stretch": "normal", @@ -14976,7 +16776,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagari-Bold.ttf||240796:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagari-Bold.ttf||240796:1711963959.0": { "family_name": "Noto Sans Devanagari", "font-family": "Noto Sans Devanagari", "font-stretch": "normal", @@ -15012,7 +16812,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagari-Light.ttf||230556:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagari-Light.ttf||230556:1711963959.0": { "family_name": "Noto Sans Devanagari Light", "font-family": "Noto Sans Devanagari Light", "font-stretch": "normal", @@ -15048,7 +16848,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagari-Medium.ttf||239068:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagari-Medium.ttf||239068:1711963959.0": { "family_name": "Noto Sans Devanagari Medium", "font-family": "Noto Sans Devanagari Medium", "font-stretch": "normal", @@ -15084,7 +16884,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagari-Regular.ttf||234540:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagari-Regular.ttf||234540:1711963959.0": { "family_name": "Noto Sans Devanagari", "font-family": "Noto Sans Devanagari", "font-stretch": "normal", @@ -15120,7 +16920,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagari-Thin.ttf||233196:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagari-Thin.ttf||233196:1711963959.0": { "family_name": "Noto Sans Devanagari Thin", "font-family": "Noto Sans Devanagari Thin", "font-stretch": "normal", @@ -15156,7 +16956,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagariUI-Black.ttf||246020:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagariUI-Black.ttf||246020:1711963959.0": { "family_name": "Noto Sans Devanagari UI Black", "font-family": "Noto Sans Devanagari UI Black", "font-stretch": "normal", @@ -15192,7 +16992,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagariUI-Bold.ttf||240840:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagariUI-Bold.ttf||240840:1711963959.0": { "family_name": "Noto Sans Devanagari UI", "font-family": "Noto Sans Devanagari UI", "font-stretch": "normal", @@ -15228,7 +17028,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagariUI-Light.ttf||230592:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagariUI-Light.ttf||230592:1711963959.0": { "family_name": "Noto Sans Devanagari UI Light", "font-family": "Noto Sans Devanagari UI Light", "font-stretch": "normal", @@ -15264,7 +17064,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagariUI-Medium.ttf||239100:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagariUI-Medium.ttf||239100:1711963959.0": { "family_name": "Noto Sans Devanagari UI Medium", "font-family": "Noto Sans Devanagari UI Medium", "font-stretch": "normal", @@ -15300,7 +17100,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagariUI-Regular.ttf||234516:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagariUI-Regular.ttf||234516:1711963959.0": { "family_name": "Noto Sans Devanagari UI", "font-family": "Noto Sans Devanagari UI", "font-stretch": "normal", @@ -15336,7 +17136,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDevanagariUI-Thin.ttf||232964:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDevanagariUI-Thin.ttf||232964:1711963959.0": { "family_name": "Noto Sans Devanagari UI Thin", "font-family": "Noto Sans Devanagari UI Thin", "font-stretch": "normal", @@ -15372,7 +17172,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDuployan-Bold.ttf||1921848:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDuployan-Bold.ttf||1921848:1711963959.0": { "family_name": "Noto Sans Duployan", "font-family": "Noto Sans Duployan", "font-stretch": "normal", @@ -15408,7 +17208,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansDuployan-Regular.ttf||1903408:1701417168.0": { + "/usr/share/fonts/noto/NotoSansDuployan-Regular.ttf||1903408:1711963959.0": { "family_name": "Noto Sans Duployan", "font-family": "Noto Sans Duployan", "font-stretch": "normal", @@ -15444,7 +17244,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEgyptianHieroglyphs-Regular.ttf||585148:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEgyptianHieroglyphs-Regular.ttf||585148:1711963959.0": { "family_name": "Noto Sans Egyptian Hieroglyphs", "font-family": "Noto Sans Egyptian Hieroglyphs", "font-stretch": "normal", @@ -15480,7 +17280,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansElbasan-Regular.ttf||18888:1701417168.0": { + "/usr/share/fonts/noto/NotoSansElbasan-Regular.ttf||18888:1711963959.0": { "family_name": "Noto Sans Elbasan", "font-family": "Noto Sans Elbasan", "font-stretch": "normal", @@ -15516,7 +17316,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansElymaic-Regular.ttf||8884:1701417168.0": { + "/usr/share/fonts/noto/NotoSansElymaic-Regular.ttf||8884:1711963959.0": { "family_name": "Noto Sans Elymaic", "font-family": "Noto Sans Elymaic", "font-stretch": "normal", @@ -15552,7 +17352,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEthiopic-Black.ttf||374056:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEthiopic-Black.ttf||374056:1711963959.0": { "family_name": "Noto Sans Ethiopic Black", "font-family": "Noto Sans Ethiopic Black", "font-stretch": "normal", @@ -15588,7 +17388,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEthiopic-Bold.ttf||375172:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEthiopic-Bold.ttf||375172:1711963959.0": { "family_name": "Noto Sans Ethiopic", "font-family": "Noto Sans Ethiopic", "font-stretch": "normal", @@ -15624,7 +17424,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEthiopic-Light.ttf||370940:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEthiopic-Light.ttf||370940:1711963959.0": { "family_name": "Noto Sans Ethiopic Light", "font-family": "Noto Sans Ethiopic Light", "font-stretch": "normal", @@ -15660,7 +17460,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEthiopic-Medium.ttf||379976:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEthiopic-Medium.ttf||379976:1711963959.0": { "family_name": "Noto Sans Ethiopic Medium", "font-family": "Noto Sans Ethiopic Medium", "font-stretch": "normal", @@ -15696,7 +17496,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEthiopic-Regular.ttf||376804:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEthiopic-Regular.ttf||376804:1711963959.0": { "family_name": "Noto Sans Ethiopic", "font-family": "Noto Sans Ethiopic", "font-stretch": "normal", @@ -15732,7 +17532,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansEthiopic-Thin.ttf||336968:1701417168.0": { + "/usr/share/fonts/noto/NotoSansEthiopic-Thin.ttf||336968:1711963959.0": { "family_name": "Noto Sans Ethiopic Thin", "font-family": "Noto Sans Ethiopic Thin", "font-stretch": "normal", @@ -15768,9 +17568,9 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGeorgian-Black.ttf||56864:1701417168.0": { - "family_name": "Noto Sans Georgian Blk", - "font-family": "Noto Sans Georgian Blk", + "/usr/share/fonts/noto/NotoSansGeorgian-Black.ttf||56820:1711963959.0": { + "family_name": "Noto Sans Georgian Black", + "font-family": "Noto Sans Georgian Black", "font-stretch": "normal", "font-style": "normal", "font-weight": "900", @@ -15781,19 +17581,19 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": true, + "is_wws": false, "os2_version": 4, "panose": [ - 2, - 11, - 10, - 2, - 4, - 5, - 4, - 2, - 2, - 4 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "path": "/usr/share/fonts/noto/NotoSansGeorgian-Black.ttf", "preferred_family_name": "Noto Sans Georgian", @@ -15804,43 +17604,43 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGeorgian-Bold.ttf||54860:1701417168.0": { - "family_name": "Noto Sans Georgian", - "font-family": "Noto Sans Georgian", + "/usr/share/fonts/noto/NotoSansGeorgian-Bold.ttf||54748:1711963959.0": { + "family_name": "Noto Sans Georgian Bold", + "font-family": "Noto Sans Georgian Bold", "font-stretch": "normal", "font-style": "normal", "font-weight": "bold", "fs_type": 0, "full_name": "Noto Sans Georgian Bold", - "is_bold": true, + "is_bold": false, "is_italic": false, "is_oblique": false, "is_otf": false, - "is_regular": false, - "is_wws": true, + "is_regular": true, + "is_wws": false, "os2_version": 4, "panose": [ - 2, - 11, - 8, - 2, - 4, - 5, - 4, - 2, - 2, - 4 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "path": "/usr/share/fonts/noto/NotoSansGeorgian-Bold.ttf", - "preferred_family_name": null, - "preferred_subfamily_name": null, - "subfamily_name": "Bold", + "preferred_family_name": "Noto Sans Georgian", + "preferred_subfamily_name": "Bold", + "subfamily_name": "Regular", "weight": 700, "width": 5, "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGeorgian-Light.ttf||52488:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGeorgian-Light.ttf||52420:1711963959.0": { "family_name": "Noto Sans Georgian Light", "font-family": "Noto Sans Georgian Light", "font-stretch": "normal", @@ -15853,19 +17653,19 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": true, + "is_wws": false, "os2_version": 4, "panose": [ - 2, - 11, - 4, - 2, - 4, - 5, - 4, - 2, - 2, - 4 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "path": "/usr/share/fonts/noto/NotoSansGeorgian-Light.ttf", "preferred_family_name": "Noto Sans Georgian", @@ -15876,9 +17676,9 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGeorgian-Medium.ttf||53832:1701417168.0": { - "family_name": "Noto Sans Georgian Med", - "font-family": "Noto Sans Georgian Med", + "/usr/share/fonts/noto/NotoSansGeorgian-Medium.ttf||53640:1711963959.0": { + "family_name": "Noto Sans Georgian Medium", + "font-family": "Noto Sans Georgian Medium", "font-stretch": "normal", "font-style": "normal", "font-weight": "500", @@ -15889,19 +17689,19 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": true, + "is_wws": false, "os2_version": 4, "panose": [ - 2, - 11, - 6, - 2, - 4, - 5, - 4, - 2, - 2, - 4 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "path": "/usr/share/fonts/noto/NotoSansGeorgian-Medium.ttf", "preferred_family_name": "Noto Sans Georgian", @@ -15912,7 +17712,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGeorgian-Regular.ttf||52984:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGeorgian-Regular.ttf||52888:1711963959.0": { "family_name": "Noto Sans Georgian", "font-family": "Noto Sans Georgian", "font-stretch": "normal", @@ -15925,19 +17725,19 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": true, + "is_wws": false, "os2_version": 4, "panose": [ - 2, - 11, - 5, - 2, - 4, - 5, - 4, - 2, - 2, - 4 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "path": "/usr/share/fonts/noto/NotoSansGeorgian-Regular.ttf", "preferred_family_name": null, @@ -15948,7 +17748,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGeorgian-Thin.ttf||52836:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGeorgian-Thin.ttf||52752:1711963959.0": { "family_name": "Noto Sans Georgian Thin", "font-family": "Noto Sans Georgian Thin", "font-stretch": "normal", @@ -15961,19 +17761,19 @@ "is_oblique": false, "is_otf": false, "is_regular": true, - "is_wws": true, + "is_wws": false, "os2_version": 4, "panose": [ - 2, - 11, - 2, - 2, - 4, - 5, - 4, - 2, - 2, - 4 + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 ], "path": "/usr/share/fonts/noto/NotoSansGeorgian-Thin.ttf", "preferred_family_name": "Noto Sans Georgian", @@ -15984,7 +17784,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGlagolitic-Regular.ttf||40812:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGlagolitic-Regular.ttf||40812:1711963959.0": { "family_name": "Noto Sans Glagolitic", "font-family": "Noto Sans Glagolitic", "font-stretch": "normal", @@ -16020,7 +17820,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGothic-Regular.ttf||11824:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGothic-Regular.ttf||11824:1711963959.0": { "family_name": "Noto Sans Gothic", "font-family": "Noto Sans Gothic", "font-stretch": "normal", @@ -16056,7 +17856,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGrantha-Regular.ttf||359204:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGrantha-Regular.ttf||359204:1711963959.0": { "family_name": "Noto Sans Grantha", "font-family": "Noto Sans Grantha", "font-stretch": "normal", @@ -16092,7 +17892,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujarati-Black.ttf||205948:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujarati-Black.ttf||205948:1711963959.0": { "family_name": "Noto Sans Gujarati Black", "font-family": "Noto Sans Gujarati Black", "font-stretch": "normal", @@ -16128,7 +17928,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujarati-Bold.ttf||201032:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujarati-Bold.ttf||201032:1711963959.0": { "family_name": "Noto Sans Gujarati", "font-family": "Noto Sans Gujarati", "font-stretch": "normal", @@ -16164,7 +17964,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujarati-Light.ttf||189768:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujarati-Light.ttf||189768:1711963959.0": { "family_name": "Noto Sans Gujarati Light", "font-family": "Noto Sans Gujarati Light", "font-stretch": "normal", @@ -16200,7 +18000,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujarati-Medium.ttf||201304:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujarati-Medium.ttf||201304:1711963959.0": { "family_name": "Noto Sans Gujarati Medium", "font-family": "Noto Sans Gujarati Medium", "font-stretch": "normal", @@ -16236,7 +18036,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujarati-Regular.ttf||200704:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujarati-Regular.ttf||200704:1711963959.0": { "family_name": "Noto Sans Gujarati", "font-family": "Noto Sans Gujarati", "font-stretch": "normal", @@ -16272,7 +18072,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujarati-Thin.ttf||195680:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujarati-Thin.ttf||195680:1711963959.0": { "family_name": "Noto Sans Gujarati Thin", "font-family": "Noto Sans Gujarati Thin", "font-stretch": "normal", @@ -16308,7 +18108,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujaratiUI-Black.ttf||205952:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujaratiUI-Black.ttf||205952:1711963959.0": { "family_name": "Noto Sans Gujarati UI Black", "font-family": "Noto Sans Gujarati UI Black", "font-stretch": "normal", @@ -16344,7 +18144,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujaratiUI-Bold.ttf||201072:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujaratiUI-Bold.ttf||201072:1711963959.0": { "family_name": "Noto Sans Gujarati UI", "font-family": "Noto Sans Gujarati UI", "font-stretch": "normal", @@ -16380,7 +18180,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujaratiUI-Light.ttf||189816:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujaratiUI-Light.ttf||189816:1711963959.0": { "family_name": "Noto Sans Gujarati UI Light", "font-family": "Noto Sans Gujarati UI Light", "font-stretch": "normal", @@ -16416,7 +18216,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujaratiUI-Medium.ttf||201348:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujaratiUI-Medium.ttf||201348:1711963959.0": { "family_name": "Noto Sans Gujarati UI Medium", "font-family": "Noto Sans Gujarati UI Medium", "font-stretch": "normal", @@ -16452,7 +18252,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujaratiUI-Regular.ttf||200744:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujaratiUI-Regular.ttf||200744:1711963959.0": { "family_name": "Noto Sans Gujarati UI", "font-family": "Noto Sans Gujarati UI", "font-stretch": "normal", @@ -16488,7 +18288,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGujaratiUI-Thin.ttf||195724:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGujaratiUI-Thin.ttf||195724:1711963959.0": { "family_name": "Noto Sans Gujarati UI Thin", "font-family": "Noto Sans Gujarati UI Thin", "font-stretch": "normal", @@ -16524,7 +18324,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGunjalaGondi-Bold.ttf||70396:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGunjalaGondi-Bold.ttf||70396:1711963959.0": { "family_name": "Noto Sans Gunjala Gondi", "font-family": "Noto Sans Gunjala Gondi", "font-stretch": "normal", @@ -16560,7 +18360,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGunjalaGondi-Medium.ttf||69324:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGunjalaGondi-Medium.ttf||69324:1711963959.0": { "family_name": "Noto Sans Gunjala Gondi Medium", "font-family": "Noto Sans Gunjala Gondi Medium", "font-stretch": "normal", @@ -16596,7 +18396,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGunjalaGondi-Regular.ttf||69884:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGunjalaGondi-Regular.ttf||69884:1711963959.0": { "family_name": "Noto Sans Gunjala Gondi", "font-family": "Noto Sans Gunjala Gondi", "font-stretch": "normal", @@ -16632,7 +18432,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhi-Black.ttf||56876:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhi-Black.ttf||56876:1711963959.0": { "family_name": "Noto Sans Gurmukhi Black", "font-family": "Noto Sans Gurmukhi Black", "font-stretch": "normal", @@ -16668,7 +18468,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhi-Bold.ttf||55088:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhi-Bold.ttf||55088:1711963959.0": { "family_name": "Noto Sans Gurmukhi", "font-family": "Noto Sans Gurmukhi", "font-stretch": "normal", @@ -16704,7 +18504,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhi-Light.ttf||54792:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhi-Light.ttf||54792:1711963959.0": { "family_name": "Noto Sans Gurmukhi Light", "font-family": "Noto Sans Gurmukhi Light", "font-stretch": "normal", @@ -16740,7 +18540,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhi-Medium.ttf||55260:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhi-Medium.ttf||55260:1711963959.0": { "family_name": "Noto Sans Gurmukhi Medium", "font-family": "Noto Sans Gurmukhi Medium", "font-stretch": "normal", @@ -16776,7 +18576,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhi-Regular.ttf||55172:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhi-Regular.ttf||55172:1711963959.0": { "family_name": "Noto Sans Gurmukhi", "font-family": "Noto Sans Gurmukhi", "font-stretch": "normal", @@ -16812,7 +18612,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhi-Thin.ttf||53752:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhi-Thin.ttf||53752:1711963959.0": { "family_name": "Noto Sans Gurmukhi Thin", "font-family": "Noto Sans Gurmukhi Thin", "font-stretch": "normal", @@ -16848,7 +18648,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhiUI-Black.ttf||56932:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhiUI-Black.ttf||56932:1711963959.0": { "family_name": "Noto Sans Gurmukhi UI Black", "font-family": "Noto Sans Gurmukhi UI Black", "font-stretch": "normal", @@ -16884,7 +18684,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhiUI-Bold.ttf||55144:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhiUI-Bold.ttf||55144:1711963959.0": { "family_name": "Noto Sans Gurmukhi UI", "font-family": "Noto Sans Gurmukhi UI", "font-stretch": "normal", @@ -16920,7 +18720,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhiUI-Light.ttf||54840:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhiUI-Light.ttf||54840:1711963959.0": { "family_name": "Noto Sans Gurmukhi UI Light", "font-family": "Noto Sans Gurmukhi UI Light", "font-stretch": "normal", @@ -16956,7 +18756,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhiUI-Medium.ttf||55308:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhiUI-Medium.ttf||55308:1711963959.0": { "family_name": "Noto Sans Gurmukhi UI Medium", "font-family": "Noto Sans Gurmukhi UI Medium", "font-stretch": "normal", @@ -16992,7 +18792,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhiUI-Regular.ttf||55216:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhiUI-Regular.ttf||55216:1711963959.0": { "family_name": "Noto Sans Gurmukhi UI", "font-family": "Noto Sans Gurmukhi UI", "font-stretch": "normal", @@ -17028,7 +18828,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansGurmukhiUI-Thin.ttf||53800:1701417168.0": { + "/usr/share/fonts/noto/NotoSansGurmukhiUI-Thin.ttf||53800:1711963959.0": { "family_name": "Noto Sans Gurmukhi UI Thin", "font-family": "Noto Sans Gurmukhi UI Thin", "font-stretch": "normal", @@ -17064,7 +18864,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHanifiRohingya-Bold.ttf||28016:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHanifiRohingya-Bold.ttf||28016:1711963959.0": { "family_name": "Noto Sans Hanifi Rohingya", "font-family": "Noto Sans Hanifi Rohingya", "font-stretch": "normal", @@ -17100,7 +18900,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHanifiRohingya-Medium.ttf||27744:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHanifiRohingya-Medium.ttf||27744:1711963959.0": { "family_name": "Noto Sans Hanifi Rohingya Medium", "font-family": "Noto Sans Hanifi Rohingya Medium", "font-stretch": "normal", @@ -17136,7 +18936,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHanifiRohingya-Regular.ttf||27580:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHanifiRohingya-Regular.ttf||27580:1711963959.0": { "family_name": "Noto Sans Hanifi Rohingya", "font-family": "Noto Sans Hanifi Rohingya", "font-stretch": "normal", @@ -17172,7 +18972,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHanunoo-Regular.ttf||7668:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHanunoo-Regular.ttf||7668:1711963959.0": { "family_name": "Noto Sans Hanunoo", "font-family": "Noto Sans Hanunoo", "font-stretch": "normal", @@ -17208,7 +19008,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHatran-Regular.ttf||4756:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHatran-Regular.ttf||4756:1711963959.0": { "family_name": "Noto Sans Hatran", "font-family": "Noto Sans Hatran", "font-stretch": "normal", @@ -17244,7 +19044,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHebrew-Black.ttf||26300:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHebrew-Black.ttf||26300:1711963959.0": { "family_name": "Noto Sans Hebrew Black", "font-family": "Noto Sans Hebrew Black", "font-stretch": "normal", @@ -17280,7 +19080,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHebrew-Bold.ttf||26200:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHebrew-Bold.ttf||26200:1711963959.0": { "family_name": "Noto Sans Hebrew", "font-family": "Noto Sans Hebrew", "font-stretch": "normal", @@ -17316,7 +19116,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHebrew-Light.ttf||25624:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHebrew-Light.ttf||25624:1711963959.0": { "family_name": "Noto Sans Hebrew Light", "font-family": "Noto Sans Hebrew Light", "font-stretch": "normal", @@ -17352,7 +19152,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHebrew-Medium.ttf||26280:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHebrew-Medium.ttf||26280:1711963959.0": { "family_name": "Noto Sans Hebrew Medium", "font-family": "Noto Sans Hebrew Medium", "font-stretch": "normal", @@ -17388,7 +19188,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHebrew-Regular.ttf||25844:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHebrew-Regular.ttf||25844:1711963959.0": { "family_name": "Noto Sans Hebrew", "font-family": "Noto Sans Hebrew", "font-stretch": "normal", @@ -17424,7 +19224,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansHebrew-Thin.ttf||25868:1701417168.0": { + "/usr/share/fonts/noto/NotoSansHebrew-Thin.ttf||25868:1711963959.0": { "family_name": "Noto Sans Hebrew Thin", "font-family": "Noto Sans Hebrew Thin", "font-stretch": "normal", @@ -17460,7 +19260,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansImperialAramaic-Regular.ttf||6112:1701417168.0": { + "/usr/share/fonts/noto/NotoSansImperialAramaic-Regular.ttf||6112:1711963959.0": { "family_name": "Noto Sans Imperial Aramaic", "font-family": "Noto Sans Imperial Aramaic", "font-stretch": "normal", @@ -17496,7 +19296,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansIndicSiyaqNumbers-Regular.ttf||32288:1701417168.0": { + "/usr/share/fonts/noto/NotoSansIndicSiyaqNumbers-Regular.ttf||32288:1711963959.0": { "family_name": "Noto Sans Indic Siyaq Numbers", "font-family": "Noto Sans Indic Siyaq Numbers", "font-stretch": "normal", @@ -17532,7 +19332,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansInscriptionalPahlavi-Regular.ttf||5580:1701417168.0": { + "/usr/share/fonts/noto/NotoSansInscriptionalPahlavi-Regular.ttf||5580:1711963959.0": { "family_name": "Noto Sans Inscriptional Pahlavi", "font-family": "Noto Sans Inscriptional Pahlavi", "font-stretch": "normal", @@ -17568,7 +19368,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansInscriptionalParthian-Regular.ttf||7344:1701417168.0": { + "/usr/share/fonts/noto/NotoSansInscriptionalParthian-Regular.ttf||7344:1711963959.0": { "family_name": "Noto Sans Inscriptional Parthian", "font-family": "Noto Sans Inscriptional Parthian", "font-stretch": "normal", @@ -17604,7 +19404,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansJavanese-Bold.ttf||113336:1701417168.0": { + "/usr/share/fonts/noto/NotoSansJavanese-Bold.ttf||113336:1711963959.0": { "family_name": "Noto Sans Javanese", "font-family": "Noto Sans Javanese", "font-stretch": "normal", @@ -17640,7 +19440,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansJavanese-Regular.ttf||120504:1701417168.0": { + "/usr/share/fonts/noto/NotoSansJavanese-Regular.ttf||120504:1711963959.0": { "family_name": "Noto Sans Javanese", "font-family": "Noto Sans Javanese", "font-stretch": "normal", @@ -17676,7 +19476,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKaithi-Regular.ttf||65908:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKaithi-Regular.ttf||65908:1711963959.0": { "family_name": "Noto Sans Kaithi", "font-family": "Noto Sans Kaithi", "font-stretch": "normal", @@ -17712,7 +19512,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannada-Black.ttf||204676:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannada-Black.ttf||204676:1711963959.0": { "family_name": "Noto Sans Kannada Black", "font-family": "Noto Sans Kannada Black", "font-stretch": "normal", @@ -17748,7 +19548,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannada-Bold.ttf||187520:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannada-Bold.ttf||187520:1711963959.0": { "family_name": "Noto Sans Kannada", "font-family": "Noto Sans Kannada", "font-stretch": "normal", @@ -17784,7 +19584,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannada-Light.ttf||179764:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannada-Light.ttf||179764:1711963959.0": { "family_name": "Noto Sans Kannada Light", "font-family": "Noto Sans Kannada Light", "font-stretch": "normal", @@ -17820,7 +19620,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannada-Medium.ttf||187196:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannada-Medium.ttf||187196:1711963959.0": { "family_name": "Noto Sans Kannada Medium", "font-family": "Noto Sans Kannada Medium", "font-stretch": "normal", @@ -17856,7 +19656,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannada-Regular.ttf||182716:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannada-Regular.ttf||182716:1711963959.0": { "family_name": "Noto Sans Kannada", "font-family": "Noto Sans Kannada", "font-stretch": "normal", @@ -17892,7 +19692,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannada-Thin.ttf||180260:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannada-Thin.ttf||180260:1711963959.0": { "family_name": "Noto Sans Kannada Thin", "font-family": "Noto Sans Kannada Thin", "font-stretch": "normal", @@ -17928,7 +19728,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannadaUI-Black.ttf||205164:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannadaUI-Black.ttf||205164:1711963959.0": { "family_name": "Noto Sans Kannada UI Black", "font-family": "Noto Sans Kannada UI Black", "font-stretch": "normal", @@ -17964,7 +19764,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannadaUI-Bold.ttf||187708:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannadaUI-Bold.ttf||187708:1711963959.0": { "family_name": "Noto Sans Kannada UI", "font-family": "Noto Sans Kannada UI", "font-stretch": "normal", @@ -18000,7 +19800,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannadaUI-Light.ttf||179792:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannadaUI-Light.ttf||179792:1711963959.0": { "family_name": "Noto Sans Kannada UI Light", "font-family": "Noto Sans Kannada UI Light", "font-stretch": "normal", @@ -18036,7 +19836,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannadaUI-Medium.ttf||187208:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannadaUI-Medium.ttf||187208:1711963959.0": { "family_name": "Noto Sans Kannada UI Medium", "font-family": "Noto Sans Kannada UI Medium", "font-stretch": "normal", @@ -18072,7 +19872,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannadaUI-Regular.ttf||182804:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannadaUI-Regular.ttf||182804:1711963959.0": { "family_name": "Noto Sans Kannada UI", "font-family": "Noto Sans Kannada UI", "font-stretch": "normal", @@ -18108,7 +19908,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKannadaUI-Thin.ttf||180284:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKannadaUI-Thin.ttf||180284:1711963959.0": { "family_name": "Noto Sans Kannada UI Thin", "font-family": "Noto Sans Kannada UI Thin", "font-stretch": "normal", @@ -18144,7 +19944,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKawi-Bold.ttf||39508:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKawi-Bold.ttf||39508:1711963959.0": { "family_name": "Noto Sans Kawi", "font-family": "Noto Sans Kawi", "font-stretch": "normal", @@ -18180,7 +19980,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKawi-Regular.ttf||39844:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKawi-Regular.ttf||39844:1711963959.0": { "family_name": "Noto Sans Kawi", "font-family": "Noto Sans Kawi", "font-stretch": "normal", @@ -18216,7 +20016,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKayahLi-Bold.ttf||17424:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKayahLi-Bold.ttf||17424:1711963959.0": { "family_name": "Noto Sans Kayah Li", "font-family": "Noto Sans Kayah Li", "font-stretch": "normal", @@ -18252,7 +20052,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKayahLi-Medium.ttf||17564:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKayahLi-Medium.ttf||17564:1711963959.0": { "family_name": "Noto Sans Kayah Li Medium", "font-family": "Noto Sans Kayah Li Medium", "font-stretch": "normal", @@ -18288,7 +20088,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKayahLi-Regular.ttf||17428:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKayahLi-Regular.ttf||17428:1711963959.0": { "family_name": "Noto Sans Kayah Li", "font-family": "Noto Sans Kayah Li", "font-stretch": "normal", @@ -18324,7 +20124,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKharoshthi-Regular.ttf||34252:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKharoshthi-Regular.ttf||34252:1711963959.0": { "family_name": "Noto Sans Kharoshthi", "font-family": "Noto Sans Kharoshthi", "font-stretch": "normal", @@ -18360,7 +20160,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhmer-Black.ttf||119792:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhmer-Black.ttf||119792:1711963959.0": { "family_name": "Noto Sans Khmer Black", "font-family": "Noto Sans Khmer Black", "font-stretch": "normal", @@ -18396,7 +20196,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhmer-Bold.ttf||113740:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhmer-Bold.ttf||113740:1711963959.0": { "family_name": "Noto Sans Khmer", "font-family": "Noto Sans Khmer", "font-stretch": "normal", @@ -18432,7 +20232,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhmer-Light.ttf||110600:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhmer-Light.ttf||110600:1711963959.0": { "family_name": "Noto Sans Khmer Light", "font-family": "Noto Sans Khmer Light", "font-stretch": "normal", @@ -18468,7 +20268,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhmer-Medium.ttf||114172:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhmer-Medium.ttf||114172:1711963959.0": { "family_name": "Noto Sans Khmer Medium", "font-family": "Noto Sans Khmer Medium", "font-stretch": "normal", @@ -18504,7 +20304,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhmer-Regular.ttf||114576:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhmer-Regular.ttf||114576:1711963959.0": { "family_name": "Noto Sans Khmer", "font-family": "Noto Sans Khmer", "font-stretch": "normal", @@ -18540,7 +20340,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhmer-Thin.ttf||110220:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhmer-Thin.ttf||110220:1711963959.0": { "family_name": "Noto Sans Khmer Thin", "font-family": "Noto Sans Khmer Thin", "font-stretch": "normal", @@ -18576,7 +20376,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhojki-Regular.ttf||70444:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhojki-Regular.ttf||70444:1711963959.0": { "family_name": "Noto Sans Khojki", "font-family": "Noto Sans Khojki", "font-stretch": "normal", @@ -18612,7 +20412,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansKhudawadi-Regular.ttf||18644:1701417168.0": { + "/usr/share/fonts/noto/NotoSansKhudawadi-Regular.ttf||18644:1711963959.0": { "family_name": "Noto Sans Khudawadi", "font-family": "Noto Sans Khudawadi", "font-stretch": "normal", @@ -18648,7 +20448,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLao-Black.ttf||37344:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLao-Black.ttf||37344:1711963959.0": { "family_name": "Noto Sans Lao Black", "font-family": "Noto Sans Lao Black", "font-stretch": "normal", @@ -18684,7 +20484,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLao-Bold.ttf||37252:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLao-Bold.ttf||37252:1711963959.0": { "family_name": "Noto Sans Lao", "font-family": "Noto Sans Lao", "font-stretch": "normal", @@ -18720,7 +20520,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLao-Light.ttf||34288:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLao-Light.ttf||34288:1711963959.0": { "family_name": "Noto Sans Lao Light", "font-family": "Noto Sans Lao Light", "font-stretch": "normal", @@ -18756,7 +20556,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLao-Medium.ttf||36116:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLao-Medium.ttf||36116:1711963959.0": { "family_name": "Noto Sans Lao Medium", "font-family": "Noto Sans Lao Medium", "font-stretch": "normal", @@ -18792,7 +20592,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLao-Regular.ttf||35884:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLao-Regular.ttf||35884:1711963959.0": { "family_name": "Noto Sans Lao", "font-family": "Noto Sans Lao", "font-stretch": "normal", @@ -18828,7 +20628,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLao-Thin.ttf||34256:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLao-Thin.ttf||34256:1711963959.0": { "family_name": "Noto Sans Lao Thin", "font-family": "Noto Sans Lao Thin", "font-stretch": "normal", @@ -18864,7 +20664,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLaoLooped-Black.ttf||57348:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLaoLooped-Black.ttf||57348:1711963959.0": { "family_name": "Noto Sans Lao Looped Black", "font-family": "Noto Sans Lao Looped Black", "font-stretch": "normal", @@ -18900,7 +20700,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLaoLooped-Bold.ttf||56240:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLaoLooped-Bold.ttf||56240:1711963959.0": { "family_name": "Noto Sans Lao Looped", "font-family": "Noto Sans Lao Looped", "font-stretch": "normal", @@ -18936,7 +20736,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLaoLooped-Light.ttf||54032:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLaoLooped-Light.ttf||54032:1711963959.0": { "family_name": "Noto Sans Lao Looped Light", "font-family": "Noto Sans Lao Looped Light", "font-stretch": "normal", @@ -18972,7 +20772,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLaoLooped-Medium.ttf||56516:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLaoLooped-Medium.ttf||56516:1711963959.0": { "family_name": "Noto Sans Lao Looped Medium", "font-family": "Noto Sans Lao Looped Medium", "font-stretch": "normal", @@ -19008,7 +20808,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLaoLooped-Regular.ttf||56300:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLaoLooped-Regular.ttf||56300:1711963959.0": { "family_name": "Noto Sans Lao Looped", "font-family": "Noto Sans Lao Looped", "font-stretch": "normal", @@ -19044,7 +20844,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLaoLooped-Thin.ttf||53508:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLaoLooped-Thin.ttf||53508:1711963959.0": { "family_name": "Noto Sans Lao Looped Thin", "font-family": "Noto Sans Lao Looped Thin", "font-stretch": "normal", @@ -19080,7 +20880,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLepcha-Regular.ttf||26084:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLepcha-Regular.ttf||26084:1711963959.0": { "family_name": "Noto Sans Lepcha", "font-family": "Noto Sans Lepcha", "font-stretch": "normal", @@ -19116,7 +20916,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLimbu-Regular.ttf||12576:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLimbu-Regular.ttf||12576:1711963959.0": { "family_name": "Noto Sans Limbu", "font-family": "Noto Sans Limbu", "font-stretch": "normal", @@ -19152,7 +20952,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLinearA-Regular.ttf||57880:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLinearA-Regular.ttf||57880:1711963959.0": { "family_name": "Noto Sans Linear A", "font-family": "Noto Sans Linear A", "font-stretch": "normal", @@ -19188,7 +20988,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLinearB-Regular.ttf||62596:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLinearB-Regular.ttf||62596:1711963959.0": { "family_name": "Noto Sans Linear B", "font-family": "Noto Sans Linear B", "font-stretch": "normal", @@ -19224,7 +21024,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLisu-Bold.ttf||12704:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLisu-Bold.ttf||12704:1711963959.0": { "family_name": "Noto Sans Lisu", "font-family": "Noto Sans Lisu", "font-stretch": "normal", @@ -19260,7 +21060,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLisu-Medium.ttf||12708:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLisu-Medium.ttf||12708:1711963959.0": { "family_name": "Noto Sans Lisu Medium", "font-family": "Noto Sans Lisu Medium", "font-stretch": "normal", @@ -19296,7 +21096,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLisu-Regular.ttf||12696:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLisu-Regular.ttf||12696:1711963959.0": { "family_name": "Noto Sans Lisu", "font-family": "Noto Sans Lisu", "font-stretch": "normal", @@ -19332,7 +21132,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLycian-Regular.ttf||4200:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLycian-Regular.ttf||4200:1711963959.0": { "family_name": "Noto Sans Lycian", "font-family": "Noto Sans Lycian", "font-stretch": "normal", @@ -19368,7 +21168,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansLydian-Regular.ttf||4680:1701417168.0": { + "/usr/share/fonts/noto/NotoSansLydian-Regular.ttf||4680:1711963959.0": { "family_name": "Noto Sans Lydian", "font-family": "Noto Sans Lydian", "font-stretch": "normal", @@ -19404,7 +21204,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMahajani-Regular.ttf||22376:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMahajani-Regular.ttf||22376:1711963959.0": { "family_name": "Noto Sans Mahajani", "font-family": "Noto Sans Mahajani", "font-stretch": "normal", @@ -19440,7 +21240,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalam-Black.ttf||118572:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalam-Black.ttf||118572:1711963959.0": { "family_name": "Noto Sans Malayalam Black", "font-family": "Noto Sans Malayalam Black", "font-stretch": "normal", @@ -19476,7 +21276,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalam-Bold.ttf||118480:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalam-Bold.ttf||118480:1711963959.0": { "family_name": "Noto Sans Malayalam", "font-family": "Noto Sans Malayalam", "font-stretch": "normal", @@ -19512,7 +21312,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalam-Light.ttf||106412:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalam-Light.ttf||106412:1711963959.0": { "family_name": "Noto Sans Malayalam Light", "font-family": "Noto Sans Malayalam Light", "font-stretch": "normal", @@ -19548,7 +21348,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalam-Medium.ttf||114532:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalam-Medium.ttf||114532:1711963959.0": { "family_name": "Noto Sans Malayalam Medium", "font-family": "Noto Sans Malayalam Medium", "font-stretch": "normal", @@ -19584,7 +21384,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalam-Regular.ttf||112936:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalam-Regular.ttf||112936:1711963959.0": { "family_name": "Noto Sans Malayalam", "font-family": "Noto Sans Malayalam", "font-stretch": "normal", @@ -19620,7 +21420,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalam-Thin.ttf||105640:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalam-Thin.ttf||105640:1711963959.0": { "family_name": "Noto Sans Malayalam Thin", "font-family": "Noto Sans Malayalam Thin", "font-stretch": "normal", @@ -19656,7 +21456,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalamUI-Black.ttf||118392:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalamUI-Black.ttf||118392:1711963959.0": { "family_name": "Noto Sans Malayalam UI Black", "font-family": "Noto Sans Malayalam UI Black", "font-stretch": "normal", @@ -19692,7 +21492,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalamUI-Bold.ttf||118264:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalamUI-Bold.ttf||118264:1711963959.0": { "family_name": "Noto Sans Malayalam UI", "font-family": "Noto Sans Malayalam UI", "font-stretch": "normal", @@ -19728,7 +21528,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalamUI-Light.ttf||106488:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalamUI-Light.ttf||106488:1711963959.0": { "family_name": "Noto Sans Malayalam UI Light", "font-family": "Noto Sans Malayalam UI Light", "font-stretch": "normal", @@ -19764,7 +21564,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalamUI-Medium.ttf||114692:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalamUI-Medium.ttf||114692:1711963959.0": { "family_name": "Noto Sans Malayalam UI Medium", "font-family": "Noto Sans Malayalam UI Medium", "font-stretch": "normal", @@ -19800,7 +21600,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalamUI-Regular.ttf||113092:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalamUI-Regular.ttf||113092:1711963959.0": { "family_name": "Noto Sans Malayalam UI", "font-family": "Noto Sans Malayalam UI", "font-stretch": "normal", @@ -19836,7 +21636,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMalayalamUI-Thin.ttf||105904:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMalayalamUI-Thin.ttf||105904:1711963959.0": { "family_name": "Noto Sans Malayalam UI Thin", "font-family": "Noto Sans Malayalam UI Thin", "font-stretch": "normal", @@ -19872,7 +21672,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMandaic-Regular.ttf||28684:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMandaic-Regular.ttf||28684:1711963959.0": { "family_name": "Noto Sans Mandaic", "font-family": "Noto Sans Mandaic", "font-stretch": "normal", @@ -19908,7 +21708,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansManichaean-Regular.ttf||51996:1701417168.0": { + "/usr/share/fonts/noto/NotoSansManichaean-Regular.ttf||51996:1711963959.0": { "family_name": "Noto Sans Manichaean", "font-family": "Noto Sans Manichaean", "font-stretch": "normal", @@ -19944,7 +21744,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMarchen-Regular.ttf||128164:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMarchen-Regular.ttf||128164:1711963959.0": { "family_name": "Noto Sans Marchen", "font-family": "Noto Sans Marchen", "font-stretch": "normal", @@ -19980,7 +21780,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMasaramGondi-Regular.ttf||30672:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMasaramGondi-Regular.ttf||30672:1711963959.0": { "family_name": "Noto Sans Masaram Gondi", "font-family": "Noto Sans Masaram Gondi", "font-stretch": "normal", @@ -20016,7 +21816,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMath-Regular.ttf||966008:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMath-Regular.ttf||966008:1711963959.0": { "family_name": "Noto Sans Math", "font-family": "Noto Sans Math", "font-stretch": "normal", @@ -20052,7 +21852,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMayanNumerals-Regular.ttf||4444:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMayanNumerals-Regular.ttf||4444:1711963959.0": { "family_name": "Noto Sans Mayan Numerals", "font-family": "Noto Sans Mayan Numerals", "font-stretch": "normal", @@ -20088,7 +21888,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMedefaidrin-Bold.ttf||44492:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMedefaidrin-Bold.ttf||44492:1711963959.0": { "family_name": "Noto Sans Medefaidrin", "font-family": "Noto Sans Medefaidrin", "font-stretch": "normal", @@ -20124,7 +21924,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMedefaidrin-Medium.ttf||42880:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMedefaidrin-Medium.ttf||42880:1711963959.0": { "family_name": "Noto Sans Medefaidrin Medium", "font-family": "Noto Sans Medefaidrin Medium", "font-stretch": "normal", @@ -20160,7 +21960,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMedefaidrin-Regular.ttf||43112:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMedefaidrin-Regular.ttf||43112:1711963959.0": { "family_name": "Noto Sans Medefaidrin", "font-family": "Noto Sans Medefaidrin", "font-stretch": "normal", @@ -20196,7 +21996,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeeteiMayek-Black.ttf||16344:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeeteiMayek-Black.ttf||16344:1711963959.0": { "family_name": "Noto Sans Meetei Mayek Black", "font-family": "Noto Sans Meetei Mayek Black", "font-stretch": "normal", @@ -20232,7 +22032,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeeteiMayek-Bold.ttf||16336:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeeteiMayek-Bold.ttf||16336:1711963959.0": { "family_name": "Noto Sans Meetei Mayek", "font-family": "Noto Sans Meetei Mayek", "font-stretch": "normal", @@ -20268,7 +22068,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeeteiMayek-Light.ttf||16644:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeeteiMayek-Light.ttf||16644:1711963959.0": { "family_name": "Noto Sans Meetei Mayek Light", "font-family": "Noto Sans Meetei Mayek Light", "font-stretch": "normal", @@ -20304,7 +22104,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeeteiMayek-Medium.ttf||16520:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeeteiMayek-Medium.ttf||16520:1711963959.0": { "family_name": "Noto Sans Meetei Mayek Medium", "font-family": "Noto Sans Meetei Mayek Medium", "font-stretch": "normal", @@ -20340,7 +22140,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeeteiMayek-Regular.ttf||16584:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeeteiMayek-Regular.ttf||16584:1711963959.0": { "family_name": "Noto Sans Meetei Mayek", "font-family": "Noto Sans Meetei Mayek", "font-stretch": "normal", @@ -20376,7 +22176,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeeteiMayek-Thin.ttf||16628:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeeteiMayek-Thin.ttf||16628:1711963959.0": { "family_name": "Noto Sans Meetei Mayek Thin", "font-family": "Noto Sans Meetei Mayek Thin", "font-stretch": "normal", @@ -20412,7 +22212,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMendeKikakui-Regular.ttf||35196:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMendeKikakui-Regular.ttf||35196:1711963959.0": { "family_name": "Noto Sans Mende Kikakui", "font-family": "Noto Sans Mende Kikakui", "font-stretch": "normal", @@ -20448,7 +22248,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMeroitic-Regular.ttf||33384:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMeroitic-Regular.ttf||33384:1711963959.0": { "family_name": "Noto Sans Meroitic", "font-family": "Noto Sans Meroitic", "font-stretch": "normal", @@ -20484,7 +22284,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMiao-Regular.ttf||36424:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMiao-Regular.ttf||36424:1711963959.0": { "family_name": "Noto Sans Miao", "font-family": "Noto Sans Miao", "font-stretch": "normal", @@ -20520,7 +22320,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansModi-Regular.ttf||44220:1701417168.0": { + "/usr/share/fonts/noto/NotoSansModi-Regular.ttf||44220:1711963959.0": { "family_name": "Noto Sans Modi", "font-family": "Noto Sans Modi", "font-stretch": "normal", @@ -20556,7 +22356,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMongolian-Regular.ttf||398916:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMongolian-Regular.ttf||398916:1711963959.0": { "family_name": "Noto Sans Mongolian", "font-family": "Noto Sans Mongolian", "font-stretch": "normal", @@ -20592,7 +22392,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMono-Black.ttf||622272:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMono-Black.ttf||622272:1711963959.0": { "family_name": "Noto Sans Mono Black", "font-family": "Noto Sans Mono Black", "font-stretch": "normal", @@ -20628,7 +22428,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMono-Bold.ttf||610908:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMono-Bold.ttf||610908:1711963959.0": { "family_name": "Noto Sans Mono", "font-family": "Noto Sans Mono", "font-stretch": "normal", @@ -20664,7 +22464,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMono-Light.ttf||585580:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMono-Light.ttf||585580:1711963959.0": { "family_name": "Noto Sans Mono Light", "font-family": "Noto Sans Mono Light", "font-stretch": "normal", @@ -20700,7 +22500,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMono-Medium.ttf||597720:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMono-Medium.ttf||597720:1711963959.0": { "family_name": "Noto Sans Mono Medium", "font-family": "Noto Sans Mono Medium", "font-stretch": "normal", @@ -20736,7 +22536,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMono-Regular.ttf||596428:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMono-Regular.ttf||596428:1711963959.0": { "family_name": "Noto Sans Mono", "font-family": "Noto Sans Mono", "font-stretch": "normal", @@ -20772,7 +22572,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMono-Thin.ttf||584136:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMono-Thin.ttf||584136:1711963959.0": { "family_name": "Noto Sans Mono Thin", "font-family": "Noto Sans Mono Thin", "font-stretch": "normal", @@ -20808,7 +22608,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMro-Regular.ttf||6628:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMro-Regular.ttf||6628:1711963959.0": { "family_name": "Noto Sans Mro", "font-family": "Noto Sans Mro", "font-stretch": "normal", @@ -20844,7 +22644,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMultani-Regular.ttf||16496:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMultani-Regular.ttf||16496:1711963959.0": { "family_name": "Noto Sans Multani", "font-family": "Noto Sans Multani", "font-stretch": "normal", @@ -20880,7 +22680,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMyanmar-Black.ttf||222864:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMyanmar-Black.ttf||222864:1711963959.0": { "family_name": "Noto Sans Myanmar Black", "font-family": "Noto Sans Myanmar Black", "font-stretch": "normal", @@ -20916,7 +22716,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMyanmar-Bold.ttf||208760:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMyanmar-Bold.ttf||208760:1711963959.0": { "family_name": "Noto Sans Myanmar", "font-family": "Noto Sans Myanmar", "font-stretch": "normal", @@ -20952,7 +22752,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMyanmar-Light.ttf||194140:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMyanmar-Light.ttf||194140:1711963959.0": { "family_name": "Noto Sans Myanmar Light", "font-family": "Noto Sans Myanmar Light", "font-stretch": "normal", @@ -20988,7 +22788,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMyanmar-Medium.ttf||197360:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMyanmar-Medium.ttf||197360:1711963959.0": { "family_name": "Noto Sans Myanmar Medium", "font-family": "Noto Sans Myanmar Medium", "font-stretch": "normal", @@ -21024,7 +22824,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMyanmar-Regular.ttf||195088:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMyanmar-Regular.ttf||195088:1711963959.0": { "family_name": "Noto Sans Myanmar", "font-family": "Noto Sans Myanmar", "font-stretch": "normal", @@ -21060,7 +22860,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansMyanmar-Thin.ttf||196844:1701417168.0": { + "/usr/share/fonts/noto/NotoSansMyanmar-Thin.ttf||196844:1711963959.0": { "family_name": "Noto Sans Myanmar Thin", "font-family": "Noto Sans Myanmar Thin", "font-stretch": "normal", @@ -21096,7 +22896,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNKo-Regular.ttf||39592:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNKo-Regular.ttf||39592:1711963959.0": { "family_name": "Noto Sans NKo", "font-family": "Noto Sans NKo", "font-stretch": "normal", @@ -21132,7 +22932,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNKoUnjoined-Bold.ttf||20324:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNKoUnjoined-Bold.ttf||20324:1711963959.0": { "family_name": "Noto Sans NKo Unjoined", "font-family": "Noto Sans NKo Unjoined", "font-stretch": "normal", @@ -21168,7 +22968,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNKoUnjoined-Regular.ttf||20148:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNKoUnjoined-Regular.ttf||20148:1711963959.0": { "family_name": "Noto Sans NKo Unjoined", "font-family": "Noto Sans NKo Unjoined", "font-stretch": "normal", @@ -21204,7 +23004,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNabataean-Regular.ttf||8048:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNabataean-Regular.ttf||8048:1711963959.0": { "family_name": "Noto Sans Nabataean", "font-family": "Noto Sans Nabataean", "font-stretch": "normal", @@ -21240,7 +23040,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNagMundari-Bold.ttf||17116:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNagMundari-Bold.ttf||17116:1711963959.0": { "family_name": "Noto Sans Nag Mundari", "font-family": "Noto Sans Nag Mundari", "font-stretch": "normal", @@ -21276,7 +23076,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNagMundari-Regular.ttf||17344:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNagMundari-Regular.ttf||17344:1711963959.0": { "family_name": "Noto Sans Nag Mundari", "font-family": "Noto Sans Nag Mundari", "font-stretch": "normal", @@ -21312,7 +23112,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNandinagari-Regular.ttf||211572:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNandinagari-Regular.ttf||211572:1711963959.0": { "family_name": "Noto Sans Nandinagari", "font-family": "Noto Sans Nandinagari", "font-stretch": "normal", @@ -21348,7 +23148,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNewTaiLue-Bold.ttf||18584:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNewTaiLue-Bold.ttf||18584:1711963959.0": { "family_name": "Noto Sans New Tai Lue", "font-family": "Noto Sans New Tai Lue", "font-stretch": "normal", @@ -21384,7 +23184,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNewTaiLue-Medium.ttf||20032:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNewTaiLue-Medium.ttf||20032:1711963959.0": { "family_name": "Noto Sans New Tai Lue Medium", "font-family": "Noto Sans New Tai Lue Medium", "font-stretch": "normal", @@ -21420,7 +23220,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNewTaiLue-Regular.ttf||20288:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNewTaiLue-Regular.ttf||20288:1711963959.0": { "family_name": "Noto Sans New Tai Lue", "font-family": "Noto Sans New Tai Lue", "font-stretch": "normal", @@ -21456,7 +23256,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNewa-Regular.ttf||152712:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNewa-Regular.ttf||152712:1711963959.0": { "family_name": "Noto Sans Newa", "font-family": "Noto Sans Newa", "font-stretch": "normal", @@ -21492,7 +23292,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansNushu-Regular.ttf||116276:1701417168.0": { + "/usr/share/fonts/noto/NotoSansNushu-Regular.ttf||116276:1711963959.0": { "family_name": "Noto Sans Nushu", "font-family": "Noto Sans Nushu", "font-stretch": "normal", @@ -21528,7 +23328,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOgham-Regular.ttf||4396:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOgham-Regular.ttf||4396:1711963959.0": { "family_name": "Noto Sans Ogham", "font-family": "Noto Sans Ogham", "font-stretch": "normal", @@ -21564,7 +23364,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOlChiki-Bold.ttf||14964:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOlChiki-Bold.ttf||14964:1711963959.0": { "family_name": "Noto Sans Ol Chiki", "font-family": "Noto Sans Ol Chiki", "font-stretch": "normal", @@ -21600,7 +23400,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOlChiki-Medium.ttf||15568:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOlChiki-Medium.ttf||15568:1711963959.0": { "family_name": "Noto Sans Ol Chiki Medium", "font-family": "Noto Sans Ol Chiki Medium", "font-stretch": "normal", @@ -21636,7 +23436,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOlChiki-Regular.ttf||15684:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOlChiki-Regular.ttf||15684:1711963959.0": { "family_name": "Noto Sans Ol Chiki", "font-family": "Noto Sans Ol Chiki", "font-stretch": "normal", @@ -21672,7 +23472,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldHungarian-Regular.ttf||53616:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldHungarian-Regular.ttf||53616:1711963959.0": { "family_name": "Noto Sans Old Hungarian", "font-family": "Noto Sans Old Hungarian", "font-stretch": "normal", @@ -21708,7 +23508,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldItalic-Regular.ttf||7268:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldItalic-Regular.ttf||7268:1711963959.0": { "family_name": "Noto Sans Old Italic", "font-family": "Noto Sans Old Italic", "font-stretch": "normal", @@ -21744,7 +23544,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldNorthArabian-Regular.ttf||6912:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldNorthArabian-Regular.ttf||6912:1711963959.0": { "family_name": "Noto Sans Old North Arabian", "font-family": "Noto Sans Old North Arabian", "font-stretch": "normal", @@ -21780,7 +23580,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldPermic-Regular.ttf||9696:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldPermic-Regular.ttf||9696:1711963959.0": { "family_name": "Noto Sans Old Permic", "font-family": "Noto Sans Old Permic", "font-stretch": "normal", @@ -21816,7 +23616,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldPersian-Regular.ttf||12436:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldPersian-Regular.ttf||12436:1711963959.0": { "family_name": "Noto Sans Old Persian", "font-family": "Noto Sans Old Persian", "font-stretch": "normal", @@ -21852,7 +23652,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldSogdian-Regular.ttf||17648:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldSogdian-Regular.ttf||17648:1711963959.0": { "family_name": "Noto Sans Old Sogdian", "font-family": "Noto Sans Old Sogdian", "font-stretch": "normal", @@ -21888,7 +23688,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldSouthArabian-Regular.ttf||4960:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldSouthArabian-Regular.ttf||4960:1711963959.0": { "family_name": "Noto Sans Old South Arabian", "font-family": "Noto Sans Old South Arabian", "font-stretch": "normal", @@ -21924,7 +23724,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOldTurkic-Regular.ttf||14980:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOldTurkic-Regular.ttf||14980:1711963959.0": { "family_name": "Noto Sans Old Turkic", "font-family": "Noto Sans Old Turkic", "font-stretch": "normal", @@ -21960,9 +23760,9 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOriya-Black.ttf||107716:1701417168.0": { - "family_name": "Noto Sans Oriya Black", - "font-family": "Noto Sans Oriya Black", + "/usr/share/fonts/noto/NotoSansOriya-Black.ttf||112208:1711963959.0": { + "family_name": "Noto Sans Oriya Blk", + "font-family": "Noto Sans Oriya Blk", "font-stretch": "normal", "font-style": "normal", "font-weight": "900", @@ -21996,7 +23796,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOriya-Bold.ttf||109112:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOriya-Bold.ttf||113652:1711963959.0": { "family_name": "Noto Sans Oriya", "font-family": "Noto Sans Oriya", "font-stretch": "normal", @@ -22032,7 +23832,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOriya-Regular.ttf||111656:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOriya-Regular.ttf||114952:1711963959.0": { "family_name": "Noto Sans Oriya", "font-family": "Noto Sans Oriya", "font-stretch": "normal", @@ -22068,7 +23868,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOriya-Thin.ttf||114844:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOriya-Thin.ttf||118112:1711963959.0": { "family_name": "Noto Sans Oriya Thin", "font-family": "Noto Sans Oriya Thin", "font-stretch": "normal", @@ -22104,7 +23904,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOsage-Regular.ttf||20596:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOsage-Regular.ttf||20596:1711963959.0": { "family_name": "Noto Sans Osage", "font-family": "Noto Sans Osage", "font-stretch": "normal", @@ -22140,7 +23940,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansOsmanya-Regular.ttf||16584:1701417168.0": { + "/usr/share/fonts/noto/NotoSansOsmanya-Regular.ttf||16584:1711963959.0": { "family_name": "Noto Sans Osmanya", "font-family": "Noto Sans Osmanya", "font-stretch": "normal", @@ -22176,7 +23976,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansPahawhHmong-Regular.ttf||18168:1701417168.0": { + "/usr/share/fonts/noto/NotoSansPahawhHmong-Regular.ttf||18168:1711963959.0": { "family_name": "Noto Sans Pahawh Hmong", "font-family": "Noto Sans Pahawh Hmong", "font-stretch": "normal", @@ -22212,7 +24012,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansPalmyrene-Regular.ttf||15380:1701417168.0": { + "/usr/share/fonts/noto/NotoSansPalmyrene-Regular.ttf||15380:1711963959.0": { "family_name": "Noto Sans Palmyrene", "font-family": "Noto Sans Palmyrene", "font-stretch": "normal", @@ -22248,7 +24048,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansPauCinHau-Regular.ttf||9048:1701417168.0": { + "/usr/share/fonts/noto/NotoSansPauCinHau-Regular.ttf||9048:1711963959.0": { "family_name": "Noto Sans Pau Cin Hau", "font-family": "Noto Sans Pau Cin Hau", "font-stretch": "normal", @@ -22284,7 +24084,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansPhags-Pa-Regular.ttf||39652:1701417168.0": { + "/usr/share/fonts/noto/NotoSansPhags-Pa-Regular.ttf||39652:1711963959.0": { "family_name": "Noto Sans Phags-Pa", "font-family": "Noto Sans Phags-Pa", "font-stretch": "normal", @@ -22320,7 +24120,43 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansPhoenician-Regular.ttf||5912:1701417168.0": { + "/usr/share/fonts/noto/NotoSansPhagsPa-Regular.ttf||39668:1711963959.0": { + "family_name": "Noto Sans PhagsPa", + "font-family": "Noto Sans PhagsPa", + "font-stretch": "normal", + "font-style": "normal", + "font-weight": "normal", + "fs_type": 0, + "full_name": "Noto Sans PhagsPa Regular", + "is_bold": false, + "is_italic": false, + "is_oblique": false, + "is_otf": false, + "is_regular": true, + "is_wws": true, + "os2_version": 4, + "panose": [ + 2, + 11, + 5, + 2, + 4, + 5, + 4, + 2, + 2, + 4 + ], + "path": "/usr/share/fonts/noto/NotoSansPhagsPa-Regular.ttf", + "preferred_family_name": null, + "preferred_subfamily_name": null, + "subfamily_name": "Regular", + "weight": 400, + "width": 5, + "wws_family_name": null, + "wws_subfamily_name": null + }, + "/usr/share/fonts/noto/NotoSansPhoenician-Regular.ttf||5912:1711963959.0": { "family_name": "Noto Sans Phoenician", "font-family": "Noto Sans Phoenician", "font-stretch": "normal", @@ -22356,7 +24192,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansPsalterPahlavi-Regular.ttf||35384:1701417168.0": { + "/usr/share/fonts/noto/NotoSansPsalterPahlavi-Regular.ttf||35384:1711963959.0": { "family_name": "Noto Sans Psalter Pahlavi", "font-family": "Noto Sans Psalter Pahlavi", "font-stretch": "normal", @@ -22392,7 +24228,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansRejang-Regular.ttf||7536:1701417168.0": { + "/usr/share/fonts/noto/NotoSansRejang-Regular.ttf||7536:1711963959.0": { "family_name": "Noto Sans Rejang", "font-family": "Noto Sans Rejang", "font-stretch": "normal", @@ -22428,7 +24264,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansRunic-Regular.ttf||9856:1701417168.0": { + "/usr/share/fonts/noto/NotoSansRunic-Regular.ttf||9856:1711963959.0": { "family_name": "Noto Sans Runic", "font-family": "Noto Sans Runic", "font-stretch": "normal", @@ -22464,7 +24300,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSamaritan-Regular.ttf||10788:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSamaritan-Regular.ttf||10788:1711963959.0": { "family_name": "Noto Sans Samaritan", "font-family": "Noto Sans Samaritan", "font-stretch": "normal", @@ -22500,7 +24336,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSaurashtra-Regular.ttf||35252:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSaurashtra-Regular.ttf||35252:1711963959.0": { "family_name": "Noto Sans Saurashtra", "font-family": "Noto Sans Saurashtra", "font-stretch": "normal", @@ -22536,7 +24372,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSharada-Regular.ttf||53372:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSharada-Regular.ttf||53372:1711963959.0": { "family_name": "Noto Sans Sharada", "font-family": "Noto Sans Sharada", "font-stretch": "normal", @@ -22572,7 +24408,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansShavian-Regular.ttf||12996:1701417168.0": { + "/usr/share/fonts/noto/NotoSansShavian-Regular.ttf||12996:1711963959.0": { "family_name": "Noto Sans Shavian", "font-family": "Noto Sans Shavian", "font-stretch": "normal", @@ -22608,7 +24444,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSiddham-Regular.ttf||144848:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSiddham-Regular.ttf||144848:1711963959.0": { "family_name": "Noto Sans Siddham", "font-family": "Noto Sans Siddham", "font-stretch": "normal", @@ -22644,7 +24480,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSignWriting-Regular.ttf||5214924:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSignWriting-Regular.ttf||5214924:1711963959.0": { "family_name": "Noto Sans SignWriting", "font-family": "Noto Sans SignWriting", "font-stretch": "normal", @@ -22680,7 +24516,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhala-Black.ttf||358336:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhala-Black.ttf||358336:1711963959.0": { "family_name": "Noto Sans Sinhala Black", "font-family": "Noto Sans Sinhala Black", "font-stretch": "normal", @@ -22716,7 +24552,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhala-Bold.ttf||341216:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhala-Bold.ttf||341216:1711963959.0": { "family_name": "Noto Sans Sinhala", "font-family": "Noto Sans Sinhala", "font-stretch": "normal", @@ -22752,7 +24588,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhala-Light.ttf||324780:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhala-Light.ttf||324780:1711963959.0": { "family_name": "Noto Sans Sinhala Light", "font-family": "Noto Sans Sinhala Light", "font-stretch": "normal", @@ -22788,7 +24624,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhala-Medium.ttf||314240:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhala-Medium.ttf||314240:1711963959.0": { "family_name": "Noto Sans Sinhala Medium", "font-family": "Noto Sans Sinhala Medium", "font-stretch": "normal", @@ -22824,7 +24660,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhala-Regular.ttf||308964:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhala-Regular.ttf||308964:1711963959.0": { "family_name": "Noto Sans Sinhala", "font-family": "Noto Sans Sinhala", "font-stretch": "normal", @@ -22860,7 +24696,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhala-Thin.ttf||287384:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhala-Thin.ttf||287384:1711963959.0": { "family_name": "Noto Sans Sinhala Thin", "font-family": "Noto Sans Sinhala Thin", "font-stretch": "normal", @@ -22896,7 +24732,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhalaUI-Black.ttf||358356:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhalaUI-Black.ttf||358356:1711963959.0": { "family_name": "Noto Sans Sinhala UI Black", "font-family": "Noto Sans Sinhala UI Black", "font-stretch": "normal", @@ -22932,7 +24768,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhalaUI-Bold.ttf||341236:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhalaUI-Bold.ttf||341236:1711963959.0": { "family_name": "Noto Sans Sinhala UI", "font-family": "Noto Sans Sinhala UI", "font-stretch": "normal", @@ -22968,7 +24804,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhalaUI-Light.ttf||324800:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhalaUI-Light.ttf||324800:1711963959.0": { "family_name": "Noto Sans Sinhala UI Light", "font-family": "Noto Sans Sinhala UI Light", "font-stretch": "normal", @@ -23004,7 +24840,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhalaUI-Medium.ttf||314260:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhalaUI-Medium.ttf||314260:1711963959.0": { "family_name": "Noto Sans Sinhala UI Medium", "font-family": "Noto Sans Sinhala UI Medium", "font-stretch": "normal", @@ -23040,7 +24876,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhalaUI-Regular.ttf||308984:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhalaUI-Regular.ttf||308984:1711963959.0": { "family_name": "Noto Sans Sinhala UI", "font-family": "Noto Sans Sinhala UI", "font-stretch": "normal", @@ -23076,7 +24912,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSinhalaUI-Thin.ttf||287404:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSinhalaUI-Thin.ttf||287404:1711963959.0": { "family_name": "Noto Sans Sinhala UI Thin", "font-family": "Noto Sans Sinhala UI Thin", "font-stretch": "normal", @@ -23112,7 +24948,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSogdian-Regular.ttf||96428:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSogdian-Regular.ttf||96428:1711963959.0": { "family_name": "Noto Sans Sogdian", "font-family": "Noto Sans Sogdian", "font-stretch": "normal", @@ -23148,7 +24984,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSoraSompeng-Bold.ttf||8208:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSoraSompeng-Bold.ttf||8208:1711963959.0": { "family_name": "Noto Sans Sora Sompeng", "font-family": "Noto Sans Sora Sompeng", "font-stretch": "normal", @@ -23184,7 +25020,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSoraSompeng-Medium.ttf||8064:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSoraSompeng-Medium.ttf||8064:1711963959.0": { "family_name": "Noto Sans Sora Sompeng Medium", "font-family": "Noto Sans Sora Sompeng Medium", "font-stretch": "normal", @@ -23220,7 +25056,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSoraSompeng-Regular.ttf||8048:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSoraSompeng-Regular.ttf||8048:1711963959.0": { "family_name": "Noto Sans Sora Sompeng", "font-family": "Noto Sans Sora Sompeng", "font-stretch": "normal", @@ -23256,7 +25092,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSoyombo-Regular.ttf||66356:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSoyombo-Regular.ttf||66356:1711963959.0": { "family_name": "Noto Sans Soyombo", "font-family": "Noto Sans Soyombo", "font-stretch": "normal", @@ -23292,7 +25128,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSundanese-Bold.ttf||22712:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSundanese-Bold.ttf||22712:1711963959.0": { "family_name": "Noto Sans Sundanese", "font-family": "Noto Sans Sundanese", "font-stretch": "normal", @@ -23328,7 +25164,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSundanese-Medium.ttf||22452:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSundanese-Medium.ttf||22452:1711963959.0": { "family_name": "Noto Sans Sundanese", "font-family": "Noto Sans Sundanese", "font-stretch": "normal", @@ -23364,7 +25200,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSundanese-Regular.ttf||22640:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSundanese-Regular.ttf||22640:1711963959.0": { "family_name": "Noto Sans Sundanese", "font-family": "Noto Sans Sundanese", "font-stretch": "normal", @@ -23400,7 +25236,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSylotiNagri-Regular.ttf||16740:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSylotiNagri-Regular.ttf||16740:1711963959.0": { "family_name": "Noto Sans Syloti Nagri", "font-family": "Noto Sans Syloti Nagri", "font-stretch": "normal", @@ -23436,7 +25272,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols-Black.ttf||235968:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols-Black.ttf||235968:1711963959.0": { "family_name": "Noto Sans Symbols Black", "font-family": "Noto Sans Symbols Black", "font-stretch": "normal", @@ -23472,7 +25308,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols-Bold.ttf||228028:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols-Bold.ttf||228028:1711963959.0": { "family_name": "Noto Sans Symbols", "font-family": "Noto Sans Symbols", "font-stretch": "normal", @@ -23508,7 +25344,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols-Light.ttf||228800:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols-Light.ttf||228800:1711963959.0": { "family_name": "Noto Sans Symbols Light", "font-family": "Noto Sans Symbols Light", "font-stretch": "normal", @@ -23544,7 +25380,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols-Medium.ttf||227616:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols-Medium.ttf||227616:1711963959.0": { "family_name": "Noto Sans Symbols Medium", "font-family": "Noto Sans Symbols Medium", "font-stretch": "normal", @@ -23580,7 +25416,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols-Regular.ttf||226980:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols-Regular.ttf||226980:1711963959.0": { "family_name": "Noto Sans Symbols", "font-family": "Noto Sans Symbols", "font-stretch": "normal", @@ -23616,7 +25452,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols-Thin.ttf||231428:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols-Thin.ttf||231428:1711963959.0": { "family_name": "Noto Sans Symbols Thin", "font-family": "Noto Sans Symbols Thin", "font-stretch": "normal", @@ -23652,7 +25488,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSymbols2-Regular.ttf||671568:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSymbols2-Regular.ttf||671568:1711963959.0": { "family_name": "Noto Sans Symbols 2", "font-family": "Noto Sans Symbols 2", "font-stretch": "normal", @@ -23688,7 +25524,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriac-Black.ttf||75804:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriac-Black.ttf||75804:1711963959.0": { "family_name": "Noto Sans Syriac Black", "font-family": "Noto Sans Syriac Black", "font-stretch": "normal", @@ -23724,7 +25560,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriac-Regular.ttf||73796:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriac-Regular.ttf||73796:1711963959.0": { "family_name": "Noto Sans Syriac", "font-family": "Noto Sans Syriac", "font-stretch": "normal", @@ -23760,7 +25596,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriac-Thin.ttf||73192:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriac-Thin.ttf||73192:1711963959.0": { "family_name": "Noto Sans Syriac Thin", "font-family": "Noto Sans Syriac Thin", "font-stretch": "normal", @@ -23796,7 +25632,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriacEastern-Black.ttf||62536:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriacEastern-Black.ttf||62536:1711963959.0": { "family_name": "Noto Sans Syriac Eastern Black", "font-family": "Noto Sans Syriac Eastern Black", "font-stretch": "normal", @@ -23832,7 +25668,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriacEastern-Regular.ttf||61312:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriacEastern-Regular.ttf||61312:1711963959.0": { "family_name": "Noto Sans Syriac Eastern", "font-family": "Noto Sans Syriac Eastern", "font-stretch": "normal", @@ -23868,7 +25704,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriacEastern-Thin.ttf||62024:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriacEastern-Thin.ttf||62024:1711963959.0": { "family_name": "Noto Sans Syriac Eastern Thin", "font-family": "Noto Sans Syriac Eastern Thin", "font-stretch": "normal", @@ -23904,7 +25740,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriacWestern-Black.ttf||75472:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriacWestern-Black.ttf||75472:1711963959.0": { "family_name": "Noto Sans Syriac Western Black", "font-family": "Noto Sans Syriac Western Black", "font-stretch": "normal", @@ -23940,7 +25776,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriacWestern-Regular.ttf||75036:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriacWestern-Regular.ttf||75036:1711963959.0": { "family_name": "Noto Sans Syriac Western", "font-family": "Noto Sans Syriac Western", "font-stretch": "normal", @@ -23976,7 +25812,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansSyriacWestern-Thin.ttf||75356:1701417168.0": { + "/usr/share/fonts/noto/NotoSansSyriacWestern-Thin.ttf||75356:1711963959.0": { "family_name": "Noto Sans Syriac Western Thin", "font-family": "Noto Sans Syriac Western Thin", "font-stretch": "normal", @@ -24012,7 +25848,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTagalog-Regular.ttf||7060:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTagalog-Regular.ttf||7060:1711963959.0": { "family_name": "Noto Sans Tagalog", "font-family": "Noto Sans Tagalog", "font-stretch": "normal", @@ -24048,7 +25884,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTagbanwa-Regular.ttf||5940:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTagbanwa-Regular.ttf||5940:1711963959.0": { "family_name": "Noto Sans Tagbanwa", "font-family": "Noto Sans Tagbanwa", "font-stretch": "normal", @@ -24084,7 +25920,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTaiLe-Regular.ttf||19476:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTaiLe-Regular.ttf||19476:1711963959.0": { "family_name": "Noto Sans Tai Le", "font-family": "Noto Sans Tai Le", "font-stretch": "normal", @@ -24120,7 +25956,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTaiTham-Bold.ttf||116848:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTaiTham-Bold.ttf||116848:1711963959.0": { "family_name": "Noto Sans Tai Tham", "font-family": "Noto Sans Tai Tham", "font-stretch": "normal", @@ -24156,7 +25992,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTaiTham-Medium.ttf||118420:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTaiTham-Medium.ttf||118420:1711963959.0": { "family_name": "Noto Sans Tai Tham Medium", "font-family": "Noto Sans Tai Tham Medium", "font-stretch": "normal", @@ -24192,7 +26028,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTaiTham-Regular.ttf||116880:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTaiTham-Regular.ttf||116880:1711963959.0": { "family_name": "Noto Sans Tai Tham", "font-family": "Noto Sans Tai Tham", "font-stretch": "normal", @@ -24228,7 +26064,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTaiViet-Regular.ttf||30580:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTaiViet-Regular.ttf||30580:1711963959.0": { "family_name": "Noto Sans Tai Viet", "font-family": "Noto Sans Tai Viet", "font-stretch": "normal", @@ -24264,7 +26100,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTakri-Regular.ttf||18456:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTakri-Regular.ttf||18456:1711963959.0": { "family_name": "Noto Sans Takri", "font-family": "Noto Sans Takri", "font-stretch": "normal", @@ -24300,7 +26136,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamil-Black.ttf||76300:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamil-Black.ttf||76300:1711963959.0": { "family_name": "Noto Sans Tamil Black", "font-family": "Noto Sans Tamil Black", "font-stretch": "normal", @@ -24336,7 +26172,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamil-Bold.ttf||77176:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamil-Bold.ttf||77176:1711963959.0": { "family_name": "Noto Sans Tamil", "font-family": "Noto Sans Tamil", "font-stretch": "normal", @@ -24372,7 +26208,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamil-Light.ttf||66344:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamil-Light.ttf||66344:1711963959.0": { "family_name": "Noto Sans Tamil Light", "font-family": "Noto Sans Tamil Light", "font-stretch": "normal", @@ -24408,7 +26244,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamil-Medium.ttf||74124:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamil-Medium.ttf||74124:1711963959.0": { "family_name": "Noto Sans Tamil Medium", "font-family": "Noto Sans Tamil Medium", "font-stretch": "normal", @@ -24444,7 +26280,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamil-Regular.ttf||73992:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamil-Regular.ttf||73992:1711963959.0": { "family_name": "Noto Sans Tamil", "font-family": "Noto Sans Tamil", "font-stretch": "normal", @@ -24480,7 +26316,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamil-Thin.ttf||66248:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamil-Thin.ttf||66248:1711963959.0": { "family_name": "Noto Sans Tamil Thin", "font-family": "Noto Sans Tamil Thin", "font-stretch": "normal", @@ -24516,7 +26352,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilSupplement-Regular.ttf||15516:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilSupplement-Regular.ttf||15516:1711963959.0": { "family_name": "Noto Sans Tamil Supplement", "font-family": "Noto Sans Tamil Supplement", "font-stretch": "normal", @@ -24552,7 +26388,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilUI-Black.ttf||76368:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilUI-Black.ttf||76368:1711963959.0": { "family_name": "Noto Sans Tamil UI Black", "font-family": "Noto Sans Tamil UI Black", "font-stretch": "normal", @@ -24588,7 +26424,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilUI-Bold.ttf||77232:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilUI-Bold.ttf||77232:1711963959.0": { "family_name": "Noto Sans Tamil UI", "font-family": "Noto Sans Tamil UI", "font-stretch": "normal", @@ -24624,7 +26460,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilUI-Light.ttf||66400:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilUI-Light.ttf||66400:1711963959.0": { "family_name": "Noto Sans Tamil UI Light", "font-family": "Noto Sans Tamil UI Light", "font-stretch": "normal", @@ -24660,7 +26496,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilUI-Medium.ttf||74172:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilUI-Medium.ttf||74172:1711963959.0": { "family_name": "Noto Sans Tamil UI Medium", "font-family": "Noto Sans Tamil UI Medium", "font-stretch": "normal", @@ -24696,7 +26532,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilUI-Regular.ttf||74060:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilUI-Regular.ttf||74060:1711963959.0": { "family_name": "Noto Sans Tamil UI", "font-family": "Noto Sans Tamil UI", "font-stretch": "normal", @@ -24732,7 +26568,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTamilUI-Thin.ttf||66300:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTamilUI-Thin.ttf||66300:1711963959.0": { "family_name": "Noto Sans Tamil UI Thin", "font-family": "Noto Sans Tamil UI Thin", "font-stretch": "normal", @@ -24768,7 +26604,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTangsa-Bold.ttf||21572:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTangsa-Bold.ttf||21572:1711963959.0": { "family_name": "Noto Sans Tangsa", "font-family": "Noto Sans Tangsa", "font-stretch": "normal", @@ -24804,7 +26640,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTangsa-Medium.ttf||24000:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTangsa-Medium.ttf||24000:1711963959.0": { "family_name": "Noto Sans Tangsa Medium", "font-family": "Noto Sans Tangsa Medium", "font-stretch": "normal", @@ -24840,7 +26676,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTangsa-Regular.ttf||23056:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTangsa-Regular.ttf||23056:1711963959.0": { "family_name": "Noto Sans Tangsa", "font-family": "Noto Sans Tangsa", "font-stretch": "normal", @@ -24876,7 +26712,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTelugu-Black.ttf||247048:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTelugu-Black.ttf||247048:1711963959.0": { "family_name": "Noto Sans Telugu Black", "font-family": "Noto Sans Telugu Black", "font-stretch": "normal", @@ -24912,7 +26748,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTelugu-Bold.ttf||243412:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTelugu-Bold.ttf||243412:1711963959.0": { "family_name": "Noto Sans Telugu", "font-family": "Noto Sans Telugu", "font-stretch": "normal", @@ -24948,7 +26784,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTelugu-Light.ttf||229872:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTelugu-Light.ttf||229872:1711963959.0": { "family_name": "Noto Sans Telugu Light", "font-family": "Noto Sans Telugu Light", "font-stretch": "normal", @@ -24984,7 +26820,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTelugu-Medium.ttf||244580:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTelugu-Medium.ttf||244580:1711963959.0": { "family_name": "Noto Sans Telugu Medium", "font-family": "Noto Sans Telugu Medium", "font-stretch": "normal", @@ -25020,7 +26856,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTelugu-Regular.ttf||235176:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTelugu-Regular.ttf||235176:1711963959.0": { "family_name": "Noto Sans Telugu", "font-family": "Noto Sans Telugu", "font-stretch": "normal", @@ -25056,7 +26892,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTelugu-Thin.ttf||221016:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTelugu-Thin.ttf||221016:1711963959.0": { "family_name": "Noto Sans Telugu Thin", "font-family": "Noto Sans Telugu Thin", "font-stretch": "normal", @@ -25092,7 +26928,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTeluguUI-Black.ttf||248368:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTeluguUI-Black.ttf||248368:1711963959.0": { "family_name": "Noto Sans Telugu UI Black", "font-family": "Noto Sans Telugu UI Black", "font-stretch": "normal", @@ -25128,7 +26964,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTeluguUI-Bold.ttf||244516:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTeluguUI-Bold.ttf||244516:1711963959.0": { "family_name": "Noto Sans Telugu UI", "font-family": "Noto Sans Telugu UI", "font-stretch": "normal", @@ -25164,7 +27000,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTeluguUI-Light.ttf||231016:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTeluguUI-Light.ttf||231016:1711963959.0": { "family_name": "Noto Sans Telugu UI Light", "font-family": "Noto Sans Telugu UI Light", "font-stretch": "normal", @@ -25200,7 +27036,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTeluguUI-Medium.ttf||245696:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTeluguUI-Medium.ttf||245696:1711963959.0": { "family_name": "Noto Sans Telugu UI Medium", "font-family": "Noto Sans Telugu UI Medium", "font-stretch": "normal", @@ -25236,7 +27072,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTeluguUI-Regular.ttf||236276:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTeluguUI-Regular.ttf||236276:1711963959.0": { "family_name": "Noto Sans Telugu UI", "font-family": "Noto Sans Telugu UI", "font-stretch": "normal", @@ -25272,7 +27108,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTeluguUI-Thin.ttf||222172:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTeluguUI-Thin.ttf||222172:1711963959.0": { "family_name": "Noto Sans Telugu UI Thin", "font-family": "Noto Sans Telugu UI Thin", "font-stretch": "normal", @@ -25308,7 +27144,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTest-Regular.ttf||2560:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTest-Regular.ttf||2560:1711963959.0": { "family_name": "Noto Sans Test", "font-family": "Noto Sans Test", "font-stretch": "normal", @@ -25344,7 +27180,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaana-Black.ttf||27160:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaana-Black.ttf||27160:1711963959.0": { "family_name": "Noto Sans Thaana Black", "font-family": "Noto Sans Thaana Black", "font-stretch": "normal", @@ -25380,7 +27216,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaana-Bold.ttf||27000:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaana-Bold.ttf||27000:1711963959.0": { "family_name": "Noto Sans Thaana", "font-family": "Noto Sans Thaana", "font-stretch": "normal", @@ -25416,7 +27252,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaana-Light.ttf||28392:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaana-Light.ttf||28392:1711963959.0": { "family_name": "Noto Sans Thaana Light", "font-family": "Noto Sans Thaana Light", "font-stretch": "normal", @@ -25452,7 +27288,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaana-Medium.ttf||27344:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaana-Medium.ttf||27344:1711963959.0": { "family_name": "Noto Sans Thaana Medium", "font-family": "Noto Sans Thaana Medium", "font-stretch": "normal", @@ -25488,7 +27324,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaana-Regular.ttf||27308:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaana-Regular.ttf||27308:1711963959.0": { "family_name": "Noto Sans Thaana", "font-family": "Noto Sans Thaana", "font-stretch": "normal", @@ -25524,7 +27360,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaana-Thin.ttf||27988:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaana-Thin.ttf||27988:1711963959.0": { "family_name": "Noto Sans Thaana Thin", "font-family": "Noto Sans Thaana Thin", "font-stretch": "normal", @@ -25560,7 +27396,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThai-Black.ttf||39128:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThai-Black.ttf||39128:1711963959.0": { "family_name": "Noto Sans Thai Blk", "font-family": "Noto Sans Thai Blk", "font-stretch": "normal", @@ -25596,7 +27432,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThai-Bold.ttf||37824:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThai-Bold.ttf||37824:1711963959.0": { "family_name": "Noto Sans Thai", "font-family": "Noto Sans Thai", "font-stretch": "normal", @@ -25632,7 +27468,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThai-Light.ttf||35508:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThai-Light.ttf||35508:1711963959.0": { "family_name": "Noto Sans Thai Light", "font-family": "Noto Sans Thai Light", "font-stretch": "normal", @@ -25668,7 +27504,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThai-Medium.ttf||38296:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThai-Medium.ttf||38296:1711963959.0": { "family_name": "Noto Sans Thai Med", "font-family": "Noto Sans Thai Med", "font-stretch": "normal", @@ -25704,7 +27540,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThai-Regular.ttf||37780:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThai-Regular.ttf||37780:1711963959.0": { "family_name": "Noto Sans Thai", "font-family": "Noto Sans Thai", "font-stretch": "normal", @@ -25740,7 +27576,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThai-Thin.ttf||34812:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThai-Thin.ttf||34812:1711963959.0": { "family_name": "Noto Sans Thai Thin", "font-family": "Noto Sans Thai Thin", "font-stretch": "normal", @@ -25776,7 +27612,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaiLooped-Black.ttf||69976:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaiLooped-Black.ttf||69976:1711963959.0": { "family_name": "Noto Sans Thai Looped Black", "font-family": "Noto Sans Thai Looped Black", "font-stretch": "normal", @@ -25812,7 +27648,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaiLooped-Bold.ttf||71120:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaiLooped-Bold.ttf||71120:1711963959.0": { "family_name": "Noto Sans Thai Looped", "font-family": "Noto Sans Thai Looped", "font-stretch": "normal", @@ -25848,7 +27684,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaiLooped-Light.ttf||65708:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaiLooped-Light.ttf||65708:1711963959.0": { "family_name": "Noto Sans Thai Looped Light", "font-family": "Noto Sans Thai Looped Light", "font-stretch": "normal", @@ -25884,7 +27720,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaiLooped-Medium.ttf||68048:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaiLooped-Medium.ttf||68048:1711963959.0": { "family_name": "Noto Sans Thai Looped Medium", "font-family": "Noto Sans Thai Looped Medium", "font-stretch": "normal", @@ -25920,7 +27756,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaiLooped-Regular.ttf||66076:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaiLooped-Regular.ttf||66076:1711963959.0": { "family_name": "Noto Sans Thai Looped", "font-family": "Noto Sans Thai Looped", "font-stretch": "normal", @@ -25956,7 +27792,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansThaiLooped-Thin.ttf||62876:1701417168.0": { + "/usr/share/fonts/noto/NotoSansThaiLooped-Thin.ttf||62876:1711963959.0": { "family_name": "Noto Sans Thai Looped Thin", "font-family": "Noto Sans Thai Looped Thin", "font-stretch": "normal", @@ -25992,7 +27828,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinagh-Regular.ttf||79376:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinagh-Regular.ttf||79376:1711963959.0": { "family_name": "Noto Sans Tifinagh", "font-family": "Noto Sans Tifinagh", "font-stretch": "normal", @@ -26028,7 +27864,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghAPT-Regular.ttf||79372:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghAPT-Regular.ttf||79372:1711963959.0": { "family_name": "Noto Sans Tifinagh APT", "font-family": "Noto Sans Tifinagh APT", "font-stretch": "normal", @@ -26064,7 +27900,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghAdrar-Regular.ttf||79000:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghAdrar-Regular.ttf||79000:1711963959.0": { "family_name": "Noto Sans Tifinagh Adrar", "font-family": "Noto Sans Tifinagh Adrar", "font-stretch": "normal", @@ -26100,7 +27936,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghAgrawImazighen-Regular.ttf||79232:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghAgrawImazighen-Regular.ttf||79232:1711963959.0": { "family_name": "Noto Sans Tifinagh Agraw Imazighen", "font-family": "Noto Sans Tifinagh Agraw Imazighen", "font-stretch": "normal", @@ -26136,7 +27972,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghAhaggar-Regular.ttf||79508:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghAhaggar-Regular.ttf||79508:1711963959.0": { "family_name": "Noto Sans Tifinagh Ahaggar", "font-family": "Noto Sans Tifinagh Ahaggar", "font-stretch": "normal", @@ -26172,7 +28008,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghAir-Regular.ttf||79560:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghAir-Regular.ttf||79560:1711963959.0": { "family_name": "Noto Sans Tifinagh Air", "font-family": "Noto Sans Tifinagh Air", "font-stretch": "normal", @@ -26208,7 +28044,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghAzawagh-Regular.ttf||79660:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghAzawagh-Regular.ttf||79660:1711963959.0": { "family_name": "Noto Sans Tifinagh Azawagh", "font-family": "Noto Sans Tifinagh Azawagh", "font-stretch": "normal", @@ -26244,7 +28080,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghGhat-Regular.ttf||79016:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghGhat-Regular.ttf||79016:1711963959.0": { "family_name": "Noto Sans Tifinagh Ghat", "font-family": "Noto Sans Tifinagh Ghat", "font-stretch": "normal", @@ -26280,7 +28116,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghHawad-Regular.ttf||79184:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghHawad-Regular.ttf||79184:1711963959.0": { "family_name": "Noto Sans Tifinagh Hawad", "font-family": "Noto Sans Tifinagh Hawad", "font-stretch": "normal", @@ -26316,7 +28152,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghRhissaIxa-Regular.ttf||79308:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghRhissaIxa-Regular.ttf||79308:1711963959.0": { "family_name": "Noto Sans Tifinagh Rhissa Ixa", "font-family": "Noto Sans Tifinagh Rhissa Ixa", "font-stretch": "normal", @@ -26352,7 +28188,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghSIL-Regular.ttf||79620:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghSIL-Regular.ttf||79620:1711963959.0": { "family_name": "Noto Sans Tifinagh SIL", "font-family": "Noto Sans Tifinagh SIL", "font-stretch": "normal", @@ -26388,7 +28224,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTifinaghTawellemmet-Regular.ttf||79632:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTifinaghTawellemmet-Regular.ttf||79632:1711963959.0": { "family_name": "Noto Sans Tifinagh Tawellemmet", "font-family": "Noto Sans Tifinagh Tawellemmet", "font-stretch": "normal", @@ -26424,7 +28260,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansTirhuta-Regular.ttf||96848:1701417168.0": { + "/usr/share/fonts/noto/NotoSansTirhuta-Regular.ttf||96848:1711963959.0": { "family_name": "Noto Sans Tirhuta", "font-family": "Noto Sans Tirhuta", "font-stretch": "normal", @@ -26460,7 +28296,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansUgaritic-Regular.ttf||7016:1701417168.0": { + "/usr/share/fonts/noto/NotoSansUgaritic-Regular.ttf||7016:1711963959.0": { "family_name": "Noto Sans Ugaritic", "font-family": "Noto Sans Ugaritic", "font-stretch": "normal", @@ -26496,7 +28332,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansVai-Regular.ttf||91252:1701417168.0": { + "/usr/share/fonts/noto/NotoSansVai-Regular.ttf||91252:1711963959.0": { "family_name": "Noto Sans Vai", "font-family": "Noto Sans Vai", "font-stretch": "normal", @@ -26532,7 +28368,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansVithkuqi-Bold.ttf||18224:1701417168.0": { + "/usr/share/fonts/noto/NotoSansVithkuqi-Bold.ttf||18224:1711963959.0": { "family_name": "Noto Sans Vithkuqi", "font-family": "Noto Sans Vithkuqi", "font-stretch": "normal", @@ -26568,7 +28404,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansVithkuqi-Medium.ttf||18348:1701417168.0": { + "/usr/share/fonts/noto/NotoSansVithkuqi-Medium.ttf||18348:1711963959.0": { "family_name": "Noto Sans Vithkuqi Medium", "font-family": "Noto Sans Vithkuqi Medium", "font-stretch": "normal", @@ -26604,7 +28440,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansVithkuqi-Regular.ttf||18548:1701417168.0": { + "/usr/share/fonts/noto/NotoSansVithkuqi-Regular.ttf||18548:1711963959.0": { "family_name": "Noto Sans Vithkuqi", "font-family": "Noto Sans Vithkuqi", "font-stretch": "normal", @@ -26640,7 +28476,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansWancho-Regular.ttf||18448:1701417168.0": { + "/usr/share/fonts/noto/NotoSansWancho-Regular.ttf||18448:1711963959.0": { "family_name": "Noto Sans Wancho", "font-family": "Noto Sans Wancho", "font-stretch": "normal", @@ -26676,7 +28512,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansWarangCiti-Regular.ttf||27264:1701417168.0": { + "/usr/share/fonts/noto/NotoSansWarangCiti-Regular.ttf||27264:1711963959.0": { "family_name": "Noto Sans Warang Citi", "font-family": "Noto Sans Warang Citi", "font-stretch": "normal", @@ -26712,7 +28548,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansYi-Regular.ttf||183036:1701417168.0": { + "/usr/share/fonts/noto/NotoSansYi-Regular.ttf||183036:1711963959.0": { "family_name": "Noto Sans Yi", "font-family": "Noto Sans Yi", "font-stretch": "normal", @@ -26748,7 +28584,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSansZanabazarSquare-Regular.ttf||20544:1701417168.0": { + "/usr/share/fonts/noto/NotoSansZanabazarSquare-Regular.ttf||20544:1711963959.0": { "family_name": "Noto Sans Zanabazar Square", "font-family": "Noto Sans Zanabazar Square", "font-stretch": "normal", @@ -26784,7 +28620,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Black.ttf||815952:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Black.ttf||815952:1711963959.0": { "family_name": "Noto Serif Black", "font-family": "Noto Serif Black", "font-stretch": "normal", @@ -26820,7 +28656,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-BlackItalic.ttf||807328:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-BlackItalic.ttf||807328:1711963959.0": { "family_name": "Noto Serif Black", "font-family": "Noto Serif Black", "font-stretch": "normal", @@ -26856,7 +28692,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Bold.ttf||769256:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Bold.ttf||769256:1711963959.0": { "family_name": "Noto Serif Bold", "font-family": "Noto Serif Bold", "font-stretch": "normal", @@ -26892,7 +28728,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-BoldItalic.ttf||783700:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-BoldItalic.ttf||783700:1711963959.0": { "family_name": "Noto Serif", "font-family": "Noto Serif", "font-stretch": "normal", @@ -26928,7 +28764,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Italic.ttf||758388:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Italic.ttf||758388:1711963959.0": { "family_name": "Noto Serif", "font-family": "Noto Serif", "font-stretch": "normal", @@ -26964,7 +28800,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Light.ttf||753348:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Light.ttf||753348:1711963959.0": { "family_name": "Noto Serif Light", "font-family": "Noto Serif Light", "font-stretch": "normal", @@ -27000,7 +28836,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-LightItalic.ttf||742292:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-LightItalic.ttf||742292:1711963959.0": { "family_name": "Noto Serif Light", "font-family": "Noto Serif Light", "font-stretch": "normal", @@ -27036,7 +28872,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Medium.ttf||762780:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Medium.ttf||762780:1711963959.0": { "family_name": "Noto Serif Medium", "font-family": "Noto Serif Medium", "font-stretch": "normal", @@ -27072,7 +28908,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-MediumItalic.ttf||781112:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-MediumItalic.ttf||781112:1711963959.0": { "family_name": "Noto Serif Medium", "font-family": "Noto Serif Medium", "font-stretch": "normal", @@ -27108,7 +28944,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Regular.ttf||738844:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Regular.ttf||738844:1711963959.0": { "family_name": "Noto Serif", "font-family": "Noto Serif", "font-stretch": "normal", @@ -27144,7 +28980,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-Thin.ttf||790016:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-Thin.ttf||790016:1711963959.0": { "family_name": "Noto Serif Thin", "font-family": "Noto Serif Thin", "font-stretch": "normal", @@ -27180,7 +29016,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerif-ThinItalic.ttf||753388:1701417168.0": { + "/usr/share/fonts/noto/NotoSerif-ThinItalic.ttf||753388:1711963959.0": { "family_name": "Noto Serif Thin", "font-family": "Noto Serif Thin", "font-stretch": "normal", @@ -27216,7 +29052,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifAhom-Regular.ttf||21212:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifAhom-Regular.ttf||21212:1711963959.0": { "family_name": "Noto Serif Ahom", "font-family": "Noto Serif Ahom", "font-stretch": "normal", @@ -27252,7 +29088,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifArmenian-Black.ttf||32340:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifArmenian-Black.ttf||32340:1711963959.0": { "family_name": "Noto Serif Armenian Black", "font-family": "Noto Serif Armenian Black", "font-stretch": "normal", @@ -27288,7 +29124,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifArmenian-Bold.ttf||30260:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifArmenian-Bold.ttf||30260:1711963959.0": { "family_name": "Noto Serif Armenian", "font-family": "Noto Serif Armenian", "font-stretch": "normal", @@ -27324,7 +29160,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifArmenian-Light.ttf||30748:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifArmenian-Light.ttf||30748:1711963959.0": { "family_name": "Noto Serif Armenian Light", "font-family": "Noto Serif Armenian Light", "font-stretch": "normal", @@ -27360,7 +29196,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifArmenian-Medium.ttf||31656:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifArmenian-Medium.ttf||31656:1711963959.0": { "family_name": "Noto Serif Armenian Medium", "font-family": "Noto Serif Armenian Medium", "font-stretch": "normal", @@ -27396,7 +29232,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifArmenian-Regular.ttf||31040:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifArmenian-Regular.ttf||31040:1711963959.0": { "family_name": "Noto Serif Armenian", "font-family": "Noto Serif Armenian", "font-stretch": "normal", @@ -27432,7 +29268,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifArmenian-Thin.ttf||30504:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifArmenian-Thin.ttf||30504:1711963959.0": { "family_name": "Noto Serif Armenian Thin", "font-family": "Noto Serif Armenian Thin", "font-stretch": "normal", @@ -27468,7 +29304,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBalinese-Regular.ttf||52660:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBalinese-Regular.ttf||52660:1711963959.0": { "family_name": "Noto Serif Balinese", "font-family": "Noto Serif Balinese", "font-stretch": "normal", @@ -27504,7 +29340,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBengali-Black.ttf||269460:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBengali-Black.ttf||269460:1711963959.0": { "family_name": "Noto Serif Bengali Black", "font-family": "Noto Serif Bengali Black", "font-stretch": "normal", @@ -27540,7 +29376,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBengali-Bold.ttf||258628:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBengali-Bold.ttf||258628:1711963959.0": { "family_name": "Noto Serif Bengali", "font-family": "Noto Serif Bengali", "font-stretch": "normal", @@ -27576,7 +29412,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBengali-Light.ttf||233416:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBengali-Light.ttf||233416:1711963959.0": { "family_name": "Noto Serif Bengali Light", "font-family": "Noto Serif Bengali Light", "font-stretch": "normal", @@ -27612,7 +29448,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBengali-Medium.ttf||256104:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBengali-Medium.ttf||256104:1711963959.0": { "family_name": "Noto Serif Bengali Medium", "font-family": "Noto Serif Bengali Medium", "font-stretch": "normal", @@ -27648,7 +29484,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBengali-Regular.ttf||263696:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBengali-Regular.ttf||263696:1711963959.0": { "family_name": "Noto Serif Bengali", "font-family": "Noto Serif Bengali", "font-stretch": "normal", @@ -27684,7 +29520,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifBengali-Thin.ttf||235440:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifBengali-Thin.ttf||235440:1711963959.0": { "family_name": "Noto Serif Bengali Thin", "font-family": "Noto Serif Bengali Thin", "font-stretch": "normal", @@ -27720,7 +29556,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDevanagari-Black.ttf||259444:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDevanagari-Black.ttf||259444:1711963959.0": { "family_name": "Noto Serif Devanagari Black", "font-family": "Noto Serif Devanagari Black", "font-stretch": "normal", @@ -27756,7 +29592,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDevanagari-Bold.ttf||257240:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDevanagari-Bold.ttf||257240:1711963959.0": { "family_name": "Noto Serif Devanagari", "font-family": "Noto Serif Devanagari", "font-stretch": "normal", @@ -27792,7 +29628,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDevanagari-Light.ttf||234536:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDevanagari-Light.ttf||234536:1711963959.0": { "family_name": "Noto Serif Devanagari Light", "font-family": "Noto Serif Devanagari Light", "font-stretch": "normal", @@ -27828,7 +29664,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDevanagari-Medium.ttf||258624:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDevanagari-Medium.ttf||258624:1711963959.0": { "family_name": "Noto Serif Devanagari Medium", "font-family": "Noto Serif Devanagari Medium", "font-stretch": "normal", @@ -27864,7 +29700,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDevanagari-Regular.ttf||252752:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDevanagari-Regular.ttf||252752:1711963959.0": { "family_name": "Noto Serif Devanagari", "font-family": "Noto Serif Devanagari", "font-stretch": "normal", @@ -27900,7 +29736,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDevanagari-Thin.ttf||246808:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDevanagari-Thin.ttf||246808:1711963959.0": { "family_name": "Noto Serif Devanagari Thin", "font-family": "Noto Serif Devanagari Thin", "font-stretch": "normal", @@ -27936,7 +29772,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Black.ttf||732616:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Black.ttf||732616:1711963959.0": { "family_name": "Noto Serif Display Black", "font-family": "Noto Serif Display Black", "font-stretch": "normal", @@ -27972,7 +29808,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-BlackItalic.ttf||700308:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-BlackItalic.ttf||700308:1711963959.0": { "family_name": "Noto Serif Display Black", "font-family": "Noto Serif Display Black", "font-stretch": "normal", @@ -28008,7 +29844,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Bold.ttf||682480:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Bold.ttf||682480:1711963959.0": { "family_name": "Noto Serif Display", "font-family": "Noto Serif Display", "font-stretch": "normal", @@ -28044,7 +29880,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-BoldItalic.ttf||682972:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-BoldItalic.ttf||682972:1711963959.0": { "family_name": "Noto Serif Display", "font-family": "Noto Serif Display", "font-stretch": "normal", @@ -28080,7 +29916,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Italic.ttf||676588:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Italic.ttf||676588:1711963959.0": { "family_name": "Noto Serif Display", "font-family": "Noto Serif Display", "font-stretch": "normal", @@ -28116,7 +29952,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Light.ttf||682184:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Light.ttf||682184:1711963959.0": { "family_name": "Noto Serif Display Light", "font-family": "Noto Serif Display Light", "font-stretch": "normal", @@ -28152,7 +29988,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-LightItalic.ttf||678832:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-LightItalic.ttf||678832:1711963959.0": { "family_name": "Noto Serif Display Light", "font-family": "Noto Serif Display Light", "font-stretch": "normal", @@ -28188,7 +30024,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Medium.ttf||680660:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Medium.ttf||680660:1711963959.0": { "family_name": "Noto Serif Display Medium", "font-family": "Noto Serif Display Medium", "font-stretch": "normal", @@ -28224,7 +30060,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-MediumItalic.ttf||684720:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-MediumItalic.ttf||684720:1711963959.0": { "family_name": "Noto Serif Display Medium", "font-family": "Noto Serif Display Medium", "font-stretch": "normal", @@ -28260,7 +30096,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Regular.ttf||670076:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Regular.ttf||670076:1711963959.0": { "family_name": "Noto Serif Display", "font-family": "Noto Serif Display", "font-stretch": "normal", @@ -28296,7 +30132,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-Thin.ttf||698700:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-Thin.ttf||698700:1711963959.0": { "family_name": "Noto Serif Display Thin", "font-family": "Noto Serif Display Thin", "font-stretch": "normal", @@ -28332,7 +30168,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDisplay-ThinItalic.ttf||686332:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDisplay-ThinItalic.ttf||686332:1711963959.0": { "family_name": "Noto Serif Display Thin", "font-family": "Noto Serif Display Thin", "font-stretch": "normal", @@ -28368,7 +30204,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDivesAkuru-Regular.ttf||47376:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDivesAkuru-Regular.ttf||47376:1711963959.0": { "family_name": "Noto Serif Dives Akuru", "font-family": "Noto Serif Dives Akuru", "font-stretch": "normal", @@ -28404,7 +30240,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifDogra-Regular.ttf||28800:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifDogra-Regular.ttf||28800:1711963959.0": { "family_name": "Noto Serif Dogra", "font-family": "Noto Serif Dogra", "font-stretch": "normal", @@ -28440,7 +30276,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifEthiopic-Black.ttf||311480:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifEthiopic-Black.ttf||311480:1711963959.0": { "family_name": "Noto Serif Ethiopic Black", "font-family": "Noto Serif Ethiopic Black", "font-stretch": "normal", @@ -28476,7 +30312,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifEthiopic-Bold.ttf||308144:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifEthiopic-Bold.ttf||308144:1711963959.0": { "family_name": "Noto Serif Ethiopic", "font-family": "Noto Serif Ethiopic", "font-stretch": "normal", @@ -28512,7 +30348,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifEthiopic-Light.ttf||318708:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifEthiopic-Light.ttf||318708:1711963959.0": { "family_name": "Noto Serif Ethiopic Light", "font-family": "Noto Serif Ethiopic Light", "font-stretch": "normal", @@ -28548,7 +30384,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifEthiopic-Medium.ttf||309428:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifEthiopic-Medium.ttf||309428:1711963959.0": { "family_name": "Noto Serif Ethiopic Medium", "font-family": "Noto Serif Ethiopic Medium", "font-stretch": "normal", @@ -28584,7 +30420,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifEthiopic-Regular.ttf||309844:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifEthiopic-Regular.ttf||309844:1711963959.0": { "family_name": "Noto Serif Ethiopic", "font-family": "Noto Serif Ethiopic", "font-stretch": "normal", @@ -28620,7 +30456,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifEthiopic-Thin.ttf||306760:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifEthiopic-Thin.ttf||306760:1711963959.0": { "family_name": "Noto Serif Ethiopic Thin", "font-family": "Noto Serif Ethiopic Thin", "font-stretch": "normal", @@ -28656,7 +30492,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGeorgian-Black.ttf||65152:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGeorgian-Black.ttf||65152:1711963959.0": { "family_name": "Noto Serif Georgian Bk", "font-family": "Noto Serif Georgian Bk", "font-stretch": "normal", @@ -28692,7 +30528,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGeorgian-Bold.ttf||64396:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGeorgian-Bold.ttf||64396:1711963959.0": { "family_name": "Noto Serif Georgian", "font-family": "Noto Serif Georgian", "font-stretch": "normal", @@ -28728,7 +30564,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGeorgian-Light.ttf||62016:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGeorgian-Light.ttf||62016:1711963959.0": { "family_name": "Noto Serif Georgian Lt", "font-family": "Noto Serif Georgian Lt", "font-stretch": "normal", @@ -28764,7 +30600,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGeorgian-Medium.ttf||63296:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGeorgian-Medium.ttf||63296:1711963959.0": { "family_name": "Noto Serif Georgian Md", "font-family": "Noto Serif Georgian Md", "font-stretch": "normal", @@ -28800,7 +30636,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGeorgian-Regular.ttf||61956:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGeorgian-Regular.ttf||61956:1711963959.0": { "family_name": "Noto Serif Georgian", "font-family": "Noto Serif Georgian", "font-stretch": "normal", @@ -28836,7 +30672,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGeorgian-Thin.ttf||62680:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGeorgian-Thin.ttf||62680:1711963959.0": { "family_name": "Noto Serif Georgian Th", "font-family": "Noto Serif Georgian Th", "font-stretch": "normal", @@ -28872,7 +30708,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGrantha-Regular.ttf||371800:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGrantha-Regular.ttf||371800:1711963959.0": { "family_name": "Noto Serif Grantha", "font-family": "Noto Serif Grantha", "font-stretch": "normal", @@ -28908,7 +30744,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGujarati-Black.ttf||144804:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGujarati-Black.ttf||144804:1711963959.0": { "family_name": "Noto Serif Gujarati Black", "font-family": "Noto Serif Gujarati Black", "font-stretch": "normal", @@ -28944,7 +30780,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGujarati-Bold.ttf||148572:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGujarati-Bold.ttf||148572:1711963959.0": { "family_name": "Noto Serif Gujarati", "font-family": "Noto Serif Gujarati", "font-stretch": "normal", @@ -28980,7 +30816,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGujarati-Light.ttf||144936:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGujarati-Light.ttf||144936:1711963959.0": { "family_name": "Noto Serif Gujarati Light", "font-family": "Noto Serif Gujarati Light", "font-stretch": "normal", @@ -29016,7 +30852,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGujarati-Medium.ttf||146204:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGujarati-Medium.ttf||146204:1711963959.0": { "family_name": "Noto Serif Gujarati Medium", "font-family": "Noto Serif Gujarati Medium", "font-stretch": "normal", @@ -29052,7 +30888,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGujarati-Regular.ttf||146056:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGujarati-Regular.ttf||146056:1711963959.0": { "family_name": "Noto Serif Gujarati", "font-family": "Noto Serif Gujarati", "font-stretch": "normal", @@ -29088,7 +30924,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGujarati-Thin.ttf||140220:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGujarati-Thin.ttf||140220:1711963959.0": { "family_name": "Noto Serif Gujarati Thin", "font-family": "Noto Serif Gujarati Thin", "font-stretch": "normal", @@ -29124,7 +30960,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGurmukhi-Black.ttf||55108:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGurmukhi-Black.ttf||55108:1711963959.0": { "family_name": "Noto Serif Gurmukhi Black", "font-family": "Noto Serif Gurmukhi Black", "font-stretch": "normal", @@ -29160,7 +30996,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGurmukhi-Bold.ttf||54256:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGurmukhi-Bold.ttf||54256:1711963959.0": { "family_name": "Noto Serif Gurmukhi", "font-family": "Noto Serif Gurmukhi", "font-stretch": "normal", @@ -29196,7 +31032,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGurmukhi-Light.ttf||53212:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGurmukhi-Light.ttf||53212:1711963959.0": { "family_name": "Noto Serif Gurmukhi Light", "font-family": "Noto Serif Gurmukhi Light", "font-stretch": "normal", @@ -29232,7 +31068,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGurmukhi-Medium.ttf||53872:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGurmukhi-Medium.ttf||53872:1711963959.0": { "family_name": "Noto Serif Gurmukhi Medium", "font-family": "Noto Serif Gurmukhi Medium", "font-stretch": "normal", @@ -29268,7 +31104,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGurmukhi-Regular.ttf||53316:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGurmukhi-Regular.ttf||53316:1711963959.0": { "family_name": "Noto Serif Gurmukhi", "font-family": "Noto Serif Gurmukhi", "font-stretch": "normal", @@ -29304,7 +31140,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifGurmukhi-Thin.ttf||51532:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifGurmukhi-Thin.ttf||51532:1711963959.0": { "family_name": "Noto Serif Gurmukhi Thin", "font-family": "Noto Serif Gurmukhi Thin", "font-stretch": "normal", @@ -29340,7 +31176,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifHebrew-Black.ttf||31104:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifHebrew-Black.ttf||31104:1711963959.0": { "family_name": "Noto Serif Hebrew Black", "font-family": "Noto Serif Hebrew Black", "font-stretch": "normal", @@ -29376,7 +31212,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifHebrew-Bold.ttf||31944:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifHebrew-Bold.ttf||31944:1711963959.0": { "family_name": "Noto Serif Hebrew", "font-family": "Noto Serif Hebrew", "font-stretch": "normal", @@ -29412,7 +31248,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifHebrew-Light.ttf||30252:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifHebrew-Light.ttf||30252:1711963959.0": { "family_name": "Noto Serif Hebrew Light", "font-family": "Noto Serif Hebrew Light", "font-stretch": "normal", @@ -29448,7 +31284,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifHebrew-Medium.ttf||31768:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifHebrew-Medium.ttf||31768:1711963959.0": { "family_name": "Noto Serif Hebrew Medium", "font-family": "Noto Serif Hebrew Medium", "font-stretch": "normal", @@ -29484,7 +31320,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifHebrew-Regular.ttf||31200:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifHebrew-Regular.ttf||31200:1711963959.0": { "family_name": "Noto Serif Hebrew", "font-family": "Noto Serif Hebrew", "font-stretch": "normal", @@ -29520,7 +31356,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifHebrew-Thin.ttf||29900:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifHebrew-Thin.ttf||29900:1711963959.0": { "family_name": "Noto Serif Hebrew Thin", "font-family": "Noto Serif Hebrew Thin", "font-stretch": "normal", @@ -29556,7 +31392,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKannada-Black.ttf||189696:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKannada-Black.ttf||189696:1711963959.0": { "family_name": "Noto Serif Kannada Black", "font-family": "Noto Serif Kannada Black", "font-stretch": "normal", @@ -29592,7 +31428,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKannada-Bold.ttf||180648:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKannada-Bold.ttf||180648:1711963959.0": { "family_name": "Noto Serif Kannada", "font-family": "Noto Serif Kannada", "font-stretch": "normal", @@ -29628,7 +31464,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKannada-Light.ttf||164904:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKannada-Light.ttf||164904:1711963959.0": { "family_name": "Noto Serif Kannada Light", "font-family": "Noto Serif Kannada Light", "font-stretch": "normal", @@ -29664,7 +31500,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKannada-Medium.ttf||160580:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKannada-Medium.ttf||160580:1711963959.0": { "family_name": "Noto Serif Kannada Medium", "font-family": "Noto Serif Kannada Medium", "font-stretch": "normal", @@ -29700,7 +31536,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKannada-Regular.ttf||194376:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKannada-Regular.ttf||194376:1711963959.0": { "family_name": "Noto Serif Kannada", "font-family": "Noto Serif Kannada", "font-stretch": "normal", @@ -29736,7 +31572,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKannada-Thin.ttf||151164:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKannada-Thin.ttf||151164:1711963959.0": { "family_name": "Noto Serif Kannada Thin", "font-family": "Noto Serif Kannada Thin", "font-stretch": "normal", @@ -29772,7 +31608,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhitanSmallScript-Regular.ttf||609232:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhitanSmallScript-Regular.ttf||609232:1711963959.0": { "family_name": "Noto Serif Khitan Small Script", "font-family": "Noto Serif Khitan Small Script", "font-stretch": "normal", @@ -29808,7 +31644,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhmer-Black.ttf||152288:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhmer-Black.ttf||152288:1711963959.0": { "family_name": "Noto Serif Khmer Black", "font-family": "Noto Serif Khmer Black", "font-stretch": "normal", @@ -29844,7 +31680,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhmer-Bold.ttf||152152:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhmer-Bold.ttf||152152:1711963959.0": { "family_name": "Noto Serif Khmer", "font-family": "Noto Serif Khmer", "font-stretch": "normal", @@ -29880,7 +31716,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhmer-Light.ttf||150796:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhmer-Light.ttf||150796:1711963959.0": { "family_name": "Noto Serif Khmer Light", "font-family": "Noto Serif Khmer Light", "font-stretch": "normal", @@ -29916,7 +31752,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhmer-Medium.ttf||150704:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhmer-Medium.ttf||150704:1711963959.0": { "family_name": "Noto Serif Khmer Medium", "font-family": "Noto Serif Khmer Medium", "font-stretch": "normal", @@ -29952,7 +31788,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhmer-Regular.ttf||154372:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhmer-Regular.ttf||154372:1711963959.0": { "family_name": "Noto Serif Khmer", "font-family": "Noto Serif Khmer", "font-stretch": "normal", @@ -29988,7 +31824,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhmer-Thin.ttf||143328:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhmer-Thin.ttf||143328:1711963959.0": { "family_name": "Noto Serif Khmer Thin", "font-family": "Noto Serif Khmer Thin", "font-stretch": "normal", @@ -30024,7 +31860,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhojki-Bold.ttf||147916:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhojki-Bold.ttf||147916:1711963959.0": { "family_name": "Noto Serif Khojki", "font-family": "Noto Serif Khojki", "font-stretch": "normal", @@ -30060,7 +31896,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifKhojki-Regular.ttf||146988:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifKhojki-Regular.ttf||146988:1711963959.0": { "family_name": "Noto Serif Khojki", "font-family": "Noto Serif Khojki", "font-stretch": "normal", @@ -30096,7 +31932,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifLao-Black.ttf||46388:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifLao-Black.ttf||46388:1711963959.0": { "family_name": "Noto Serif Lao Black", "font-family": "Noto Serif Lao Black", "font-stretch": "normal", @@ -30132,7 +31968,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifLao-Bold.ttf||45336:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifLao-Bold.ttf||45336:1711963959.0": { "family_name": "Noto Serif Lao", "font-family": "Noto Serif Lao", "font-stretch": "normal", @@ -30168,7 +32004,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifLao-Light.ttf||42888:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifLao-Light.ttf||42888:1711963959.0": { "family_name": "Noto Serif Lao Light", "font-family": "Noto Serif Lao Light", "font-stretch": "normal", @@ -30204,7 +32040,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifLao-Medium.ttf||43328:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifLao-Medium.ttf||43328:1711963959.0": { "family_name": "Noto Serif Lao Medium", "font-family": "Noto Serif Lao Medium", "font-stretch": "normal", @@ -30240,7 +32076,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifLao-Regular.ttf||42880:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifLao-Regular.ttf||42880:1711963959.0": { "family_name": "Noto Serif Lao", "font-family": "Noto Serif Lao", "font-stretch": "normal", @@ -30276,7 +32112,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifLao-Thin.ttf||42448:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifLao-Thin.ttf||42448:1711963959.0": { "family_name": "Noto Serif Lao Thin", "font-family": "Noto Serif Lao Thin", "font-stretch": "normal", @@ -30312,7 +32148,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMakasar-Regular.ttf||6992:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMakasar-Regular.ttf||6992:1711963959.0": { "family_name": "Noto Serif Makasar", "font-family": "Noto Serif Makasar", "font-stretch": "normal", @@ -30348,7 +32184,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMalayalam-Black.ttf||116252:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMalayalam-Black.ttf||116252:1711963959.0": { "family_name": "Noto Serif Malayalam Black", "font-family": "Noto Serif Malayalam Black", "font-stretch": "normal", @@ -30384,7 +32220,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMalayalam-Bold.ttf||113036:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMalayalam-Bold.ttf||113036:1711963959.0": { "family_name": "Noto Serif Malayalam", "font-family": "Noto Serif Malayalam", "font-stretch": "normal", @@ -30420,7 +32256,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMalayalam-Light.ttf||109120:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMalayalam-Light.ttf||109120:1711963959.0": { "family_name": "Noto Serif Malayalam Light", "font-family": "Noto Serif Malayalam Light", "font-stretch": "normal", @@ -30456,7 +32292,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMalayalam-Medium.ttf||112316:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMalayalam-Medium.ttf||112316:1711963959.0": { "family_name": "Noto Serif Malayalam Medium", "font-family": "Noto Serif Malayalam Medium", "font-stretch": "normal", @@ -30492,7 +32328,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMalayalam-Regular.ttf||111872:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMalayalam-Regular.ttf||111872:1711963959.0": { "family_name": "Noto Serif Malayalam", "font-family": "Noto Serif Malayalam", "font-stretch": "normal", @@ -30528,7 +32364,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMalayalam-Thin.ttf||106864:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMalayalam-Thin.ttf||106864:1711963959.0": { "family_name": "Noto Serif Malayalam Thin", "font-family": "Noto Serif Malayalam Thin", "font-stretch": "normal", @@ -30564,7 +32400,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMyanmar-Black.ttf||289676:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMyanmar-Black.ttf||289676:1711963959.0": { "family_name": "Noto Serif Myanmar Black", "font-family": "Noto Serif Myanmar Black", "font-stretch": "normal", @@ -30600,7 +32436,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMyanmar-Bold.ttf||283636:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMyanmar-Bold.ttf||283636:1711963959.0": { "family_name": "Noto Serif Myanmar", "font-family": "Noto Serif Myanmar", "font-stretch": "normal", @@ -30636,7 +32472,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMyanmar-Light.ttf||272280:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMyanmar-Light.ttf||272280:1711963959.0": { "family_name": "Noto Serif Myanmar Light", "font-family": "Noto Serif Myanmar Light", "font-stretch": "normal", @@ -30672,7 +32508,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMyanmar-Medium.ttf||278400:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMyanmar-Medium.ttf||278400:1711963959.0": { "family_name": "Noto Serif Myanmar Medium", "font-family": "Noto Serif Myanmar Medium", "font-stretch": "normal", @@ -30708,7 +32544,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMyanmar-Regular.ttf||277152:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMyanmar-Regular.ttf||277152:1711963959.0": { "family_name": "Noto Serif Myanmar", "font-family": "Noto Serif Myanmar", "font-stretch": "normal", @@ -30744,7 +32580,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifMyanmar-Thin.ttf||262364:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifMyanmar-Thin.ttf||262364:1711963959.0": { "family_name": "Noto Serif Myanmar Thin", "font-family": "Noto Serif Myanmar Thin", "font-stretch": "normal", @@ -30780,7 +32616,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifNPHmong-Bold.ttf||24876:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifNPHmong-Bold.ttf||24876:1711963959.0": { "family_name": "Noto Serif NP Hmong", "font-family": "Noto Serif NP Hmong", "font-stretch": "normal", @@ -30816,7 +32652,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifNPHmong-Medium.ttf||24436:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifNPHmong-Medium.ttf||24436:1711963959.0": { "family_name": "Noto Serif NP Hmong Medium", "font-family": "Noto Serif NP Hmong Medium", "font-stretch": "normal", @@ -30852,7 +32688,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifNPHmong-Regular.ttf||24376:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifNPHmong-Regular.ttf||24376:1711963959.0": { "family_name": "Noto Serif NP Hmong", "font-family": "Noto Serif NP Hmong", "font-stretch": "normal", @@ -30888,7 +32724,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifOldUyghur-Regular.ttf||30724:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifOldUyghur-Regular.ttf||30724:1711963959.0": { "family_name": "Noto Serif Old Uyghur", "font-family": "Noto Serif Old Uyghur", "font-stretch": "normal", @@ -30924,7 +32760,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifOriya-Bold.ttf||147812:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifOriya-Bold.ttf||147812:1711963959.0": { "family_name": "Noto Serif Oriya", "font-family": "Noto Serif Oriya", "font-stretch": "normal", @@ -30960,7 +32796,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifOriya-Medium.ttf||150872:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifOriya-Medium.ttf||150872:1711963959.0": { "family_name": "Noto Serif Oriya Medium", "font-family": "Noto Serif Oriya Medium", "font-stretch": "normal", @@ -30996,7 +32832,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifOriya-Regular.ttf||148896:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifOriya-Regular.ttf||148896:1711963959.0": { "family_name": "Noto Serif Oriya", "font-family": "Noto Serif Oriya", "font-stretch": "normal", @@ -31032,7 +32868,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifOttomanSiyaq-Regular.ttf||19268:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifOttomanSiyaq-Regular.ttf||19268:1711963959.0": { "family_name": "Noto Serif Ottoman Siyaq", "font-family": "Noto Serif Ottoman Siyaq", "font-stretch": "normal", @@ -31068,7 +32904,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifSinhala-Black.ttf||343268:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifSinhala-Black.ttf||343268:1711963959.0": { "family_name": "Noto Serif Sinhala Black", "font-family": "Noto Serif Sinhala Black", "font-stretch": "normal", @@ -31104,7 +32940,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifSinhala-Bold.ttf||337684:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifSinhala-Bold.ttf||337684:1711963959.0": { "family_name": "Noto Serif Sinhala", "font-family": "Noto Serif Sinhala", "font-stretch": "normal", @@ -31140,7 +32976,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifSinhala-Light.ttf||338692:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifSinhala-Light.ttf||338692:1711963959.0": { "family_name": "Noto Serif Sinhala Light", "font-family": "Noto Serif Sinhala Light", "font-stretch": "normal", @@ -31176,7 +33012,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifSinhala-Medium.ttf||325508:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifSinhala-Medium.ttf||325508:1711963959.0": { "family_name": "Noto Serif Sinhala Medium", "font-family": "Noto Serif Sinhala Medium", "font-stretch": "normal", @@ -31212,7 +33048,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifSinhala-Regular.ttf||325860:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifSinhala-Regular.ttf||325860:1711963959.0": { "family_name": "Noto Serif Sinhala", "font-family": "Noto Serif Sinhala", "font-stretch": "normal", @@ -31248,7 +33084,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifSinhala-Thin.ttf||323040:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifSinhala-Thin.ttf||323040:1711963959.0": { "family_name": "Noto Serif Sinhala Thin", "font-family": "Noto Serif Sinhala Thin", "font-stretch": "normal", @@ -31284,7 +33120,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Black.ttf||82996:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Black.ttf||82996:1711963959.0": { "family_name": "Noto Serif Tamil Black", "font-family": "Noto Serif Tamil Black", "font-stretch": "normal", @@ -31320,7 +33156,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-BlackItalic.ttf||83264:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-BlackItalic.ttf||83264:1711963959.0": { "family_name": "Noto Serif Tamil Black", "font-family": "Noto Serif Tamil Black", "font-stretch": "normal", @@ -31356,7 +33192,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Bold.ttf||78376:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Bold.ttf||78376:1711963959.0": { "family_name": "Noto Serif Tamil", "font-family": "Noto Serif Tamil", "font-stretch": "normal", @@ -31392,7 +33228,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-BoldItalic.ttf||79740:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-BoldItalic.ttf||79740:1711963959.0": { "family_name": "Noto Serif Tamil", "font-family": "Noto Serif Tamil", "font-stretch": "normal", @@ -31428,7 +33264,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Italic.ttf||78816:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Italic.ttf||78816:1711963959.0": { "family_name": "Noto Serif Tamil", "font-family": "Noto Serif Tamil", "font-stretch": "normal", @@ -31464,7 +33300,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Light.ttf||78424:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Light.ttf||78424:1711963959.0": { "family_name": "Noto Serif Tamil Light", "font-family": "Noto Serif Tamil Light", "font-stretch": "normal", @@ -31500,7 +33336,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-LightItalic.ttf||78916:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-LightItalic.ttf||78916:1711963959.0": { "family_name": "Noto Serif Tamil Light", "font-family": "Noto Serif Tamil Light", "font-stretch": "normal", @@ -31536,7 +33372,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Medium.ttf||80436:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Medium.ttf||80436:1711963959.0": { "family_name": "Noto Serif Tamil Medium", "font-family": "Noto Serif Tamil Medium", "font-stretch": "normal", @@ -31572,7 +33408,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-MediumItalic.ttf||81732:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-MediumItalic.ttf||81732:1711963959.0": { "family_name": "Noto Serif Tamil Medium", "font-family": "Noto Serif Tamil Medium", "font-stretch": "normal", @@ -31608,7 +33444,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Regular.ttf||79476:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Regular.ttf||79476:1711963959.0": { "family_name": "Noto Serif Tamil", "font-family": "Noto Serif Tamil", "font-stretch": "normal", @@ -31644,7 +33480,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-Thin.ttf||80680:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-Thin.ttf||80680:1711963959.0": { "family_name": "Noto Serif Tamil Thin", "font-family": "Noto Serif Tamil Thin", "font-stretch": "normal", @@ -31680,7 +33516,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTamil-ThinItalic.ttf||81268:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTamil-ThinItalic.ttf||81268:1711963959.0": { "family_name": "Noto Serif Tamil Thin", "font-family": "Noto Serif Tamil Thin", "font-stretch": "normal", @@ -31716,7 +33552,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTangut-Regular.ttf||5692096:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTangut-Regular.ttf||5692096:1711963959.0": { "family_name": "Noto Serif Tangut", "font-family": "Noto Serif Tangut", "font-stretch": "normal", @@ -31752,7 +33588,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTelugu-Black.ttf||369992:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTelugu-Black.ttf||369992:1711963959.0": { "family_name": "Noto Serif Telugu Black", "font-family": "Noto Serif Telugu Black", "font-stretch": "normal", @@ -31788,7 +33624,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTelugu-Bold.ttf||331876:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTelugu-Bold.ttf||331876:1711963959.0": { "family_name": "Noto Serif Telugu", "font-family": "Noto Serif Telugu", "font-stretch": "normal", @@ -31824,7 +33660,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTelugu-Light.ttf||288484:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTelugu-Light.ttf||288484:1711963959.0": { "family_name": "Noto Serif Telugu Light", "font-family": "Noto Serif Telugu Light", "font-stretch": "normal", @@ -31860,7 +33696,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTelugu-Medium.ttf||304292:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTelugu-Medium.ttf||304292:1711963959.0": { "family_name": "Noto Serif Telugu Medium", "font-family": "Noto Serif Telugu Medium", "font-stretch": "normal", @@ -31896,7 +33732,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTelugu-Regular.ttf||311724:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTelugu-Regular.ttf||311724:1711963959.0": { "family_name": "Noto Serif Telugu", "font-family": "Noto Serif Telugu", "font-stretch": "normal", @@ -31932,7 +33768,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTelugu-Thin.ttf||290952:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTelugu-Thin.ttf||290952:1711963959.0": { "family_name": "Noto Serif Telugu Thin", "font-family": "Noto Serif Telugu Thin", "font-stretch": "normal", @@ -31968,7 +33804,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTest-Bold.ttf||2796:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTest-Bold.ttf||2796:1711963959.0": { "family_name": "Noto Serif Test", "font-family": "Noto Serif Test", "font-stretch": "normal", @@ -32004,7 +33840,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTest-Regular.ttf||2772:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTest-Regular.ttf||2772:1711963959.0": { "family_name": "Noto Serif Test", "font-family": "Noto Serif Test", "font-stretch": "normal", @@ -32040,7 +33876,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifThai-Black.ttf||48424:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifThai-Black.ttf||48424:1711963959.0": { "family_name": "Noto Serif Thai Black", "font-family": "Noto Serif Thai Black", "font-stretch": "normal", @@ -32076,7 +33912,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifThai-Bold.ttf||46544:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifThai-Bold.ttf||46544:1711963959.0": { "family_name": "Noto Serif Thai", "font-family": "Noto Serif Thai", "font-stretch": "normal", @@ -32112,7 +33948,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifThai-Light.ttf||46448:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifThai-Light.ttf||46448:1711963959.0": { "family_name": "Noto Serif Thai Light", "font-family": "Noto Serif Thai Light", "font-stretch": "normal", @@ -32148,7 +33984,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifThai-Medium.ttf||45488:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifThai-Medium.ttf||45488:1711963959.0": { "family_name": "Noto Serif Thai Medium", "font-family": "Noto Serif Thai Medium", "font-stretch": "normal", @@ -32184,7 +34020,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifThai-Regular.ttf||45424:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifThai-Regular.ttf||45424:1711963959.0": { "family_name": "Noto Serif Thai", "font-family": "Noto Serif Thai", "font-stretch": "normal", @@ -32220,7 +34056,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifThai-Thin.ttf||45168:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifThai-Thin.ttf||45168:1711963959.0": { "family_name": "Noto Serif Thai Thin", "font-family": "Noto Serif Thai Thin", "font-stretch": "normal", @@ -32256,7 +34092,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTibetan-Black.ttf||590864:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTibetan-Black.ttf||590864:1711963959.0": { "family_name": "Noto Serif Tibetan Black", "font-family": "Noto Serif Tibetan Black", "font-stretch": "normal", @@ -32292,7 +34128,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTibetan-Bold.ttf||602368:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTibetan-Bold.ttf||602368:1711963959.0": { "family_name": "Noto Serif Tibetan", "font-family": "Noto Serif Tibetan", "font-stretch": "normal", @@ -32328,7 +34164,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTibetan-Light.ttf||613040:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTibetan-Light.ttf||613040:1711963959.0": { "family_name": "Noto Serif Tibetan Light", "font-family": "Noto Serif Tibetan Light", "font-stretch": "normal", @@ -32364,7 +34200,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTibetan-Medium.ttf||608512:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTibetan-Medium.ttf||608512:1711963959.0": { "family_name": "Noto Serif Tibetan Medium", "font-family": "Noto Serif Tibetan Medium", "font-stretch": "normal", @@ -32400,7 +34236,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTibetan-Regular.ttf||609688:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTibetan-Regular.ttf||609688:1711963959.0": { "family_name": "Noto Serif Tibetan", "font-family": "Noto Serif Tibetan", "font-stretch": "normal", @@ -32436,7 +34272,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifTibetan-Thin.ttf||623556:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifTibetan-Thin.ttf||623556:1711963959.0": { "family_name": "Noto Serif Tibetan Thin", "font-family": "Noto Serif Tibetan Thin", "font-stretch": "normal", @@ -32472,7 +34308,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifToto-Bold.ttf||6896:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifToto-Bold.ttf||6896:1711963959.0": { "family_name": "Noto Serif Toto", "font-family": "Noto Serif Toto", "font-stretch": "normal", @@ -32508,7 +34344,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifToto-Medium.ttf||6996:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifToto-Medium.ttf||6996:1711963959.0": { "family_name": "Noto Serif Toto Medium", "font-family": "Noto Serif Toto Medium", "font-stretch": "normal", @@ -32544,7 +34380,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifToto-Regular.ttf||6964:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifToto-Regular.ttf||6964:1711963959.0": { "family_name": "Noto Serif Toto", "font-family": "Noto Serif Toto", "font-stretch": "normal", @@ -32580,7 +34416,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifVithkuqi-Bold.ttf||19056:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifVithkuqi-Bold.ttf||19056:1711963959.0": { "family_name": "Noto Serif Vithkuqi", "font-family": "Noto Serif Vithkuqi", "font-stretch": "normal", @@ -32616,7 +34452,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifVithkuqi-Medium.ttf||19052:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifVithkuqi-Medium.ttf||19052:1711963959.0": { "family_name": "Noto Serif Vithkuqi Medium", "font-family": "Noto Serif Vithkuqi Medium", "font-stretch": "normal", @@ -32652,7 +34488,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifVithkuqi-Regular.ttf||19092:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifVithkuqi-Regular.ttf||19092:1711963959.0": { "family_name": "Noto Serif Vithkuqi", "font-family": "Noto Serif Vithkuqi", "font-stretch": "normal", @@ -32688,7 +34524,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifYezidi-Bold.ttf||18072:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifYezidi-Bold.ttf||18072:1711963959.0": { "family_name": "Noto Serif Yezidi", "font-family": "Noto Serif Yezidi", "font-stretch": "normal", @@ -32724,7 +34560,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifYezidi-Medium.ttf||18276:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifYezidi-Medium.ttf||18276:1711963959.0": { "family_name": "Noto Serif Yezidi Medium", "font-family": "Noto Serif Yezidi Medium", "font-stretch": "normal", @@ -32760,7 +34596,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoSerifYezidi-Regular.ttf||18252:1701417168.0": { + "/usr/share/fonts/noto/NotoSerifYezidi-Regular.ttf||18252:1711963959.0": { "family_name": "Noto Serif Yezidi", "font-family": "Noto Serif Yezidi", "font-stretch": "normal", @@ -32796,7 +34632,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoTraditionalNushu-Bold.ttf||104624:1701417168.0": { + "/usr/share/fonts/noto/NotoTraditionalNushu-Bold.ttf||104624:1711963959.0": { "family_name": "Noto Traditional Nushu", "font-family": "Noto Traditional Nushu", "font-stretch": "normal", @@ -32832,7 +34668,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoTraditionalNushu-Light.ttf||106828:1701417168.0": { + "/usr/share/fonts/noto/NotoTraditionalNushu-Light.ttf||106828:1711963959.0": { "family_name": "Noto Traditional Nushu Light", "font-family": "Noto Traditional Nushu Light", "font-stretch": "normal", @@ -32868,7 +34704,7 @@ "wws_family_name": null, "wws_subfamily_name": null }, - "/usr/share/fonts/noto/NotoTraditionalNushu-Regular.ttf||104708:1701417168.0": { + "/usr/share/fonts/noto/NotoTraditionalNushu-Regular.ttf||104708:1711963959.0": { "family_name": "Noto Traditional Nushu", "font-family": "Noto Traditional Nushu", "font-stretch": "normal", diff --git a/arch-config/.config/calibre/gui.json b/arch-config/.config/calibre/gui.json index 52e0b95b..23f45851 100644 --- a/arch-config/.config/calibre/gui.json +++ b/arch-config/.config/calibre/gui.json @@ -55,7 +55,7 @@ ], "basic_metadata_widget_splitter_state": { "__class__": "bytearray", - "__value__": "AAAA/wAAAAEAAAADAAAA6wAAAZwAAAEKAf////8BAAAAAQA=" + "__value__": "AAAA/wAAAAEAAAADAAAA6wAAAdoAAAEKAf////8BAAAAAQA=" }, "book_details_splitter_horizontal_state": [ true, @@ -257,6 +257,57 @@ } } }, + "geometry-of-bulk_metadata_window_geometry": { + "frame_geometry": { + "height": 1030, + "width": 1850, + "x": 0, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 1030, + "width": 1850, + "x": 0, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 1030, + "width": 1850, + "x": 0, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAAAAAAAAAAABzkAAAQFAAAAAAAAAAAAAAc5AAAEBQAAAAEAAAAACFUAAAAAAAAAAAAABzkAAAQF" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, "geometry-of-calibre_main_window_geometry": { "frame_geometry": { "height": 1154, @@ -359,19 +410,458 @@ } } }, + "geometry-of-diff_dialog_geom": { + "frame_geometry": { + "height": 980, + "width": 1210, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 980, + "width": 1210, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 980, + "width": 1210, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAADQ4AAAPTAAAIVQAAAAAAAA0OAAAD0wAAAAEAAAAACFUAAAhVAAAAAAAADQ4AAAPT" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-duplicates-question-dialog-geometry": { + "frame_geometry": { + "height": 384, + "width": 748, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 384, + "width": 748, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 384, + "width": 748, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAAC0AAAAF/AAAIVQAAAAAAAAtAAAABfwAAAAEAAAAACFUAAAhVAAAAAAAAC0AAAAF/" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-jobs_dialog_geometry": { + "frame_geometry": { + "height": 542, + "width": 883, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 542, + "width": 883, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 542, + "width": 883, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAAC8cAAAIdAAAIVQAAAAAAAAvHAAACHQAAAAEAAAAACFUAAAhVAAAAAAAAC8cAAAId" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-metadata_single_gui_geom": { + "frame_geometry": { + "height": 600, + "width": 850, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 600, + "width": 850, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 600, + "width": 850, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAAC6YAAAJXAAAIVQAAAAAAAAumAAACVwAAAAEAAAAACFUAAAhVAAAAAAAAC6YAAAJX" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-metasingle_window_geometry3": { + "frame_geometry": { + "height": 1030, + "width": 1850, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 1030, + "width": 1850, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 1030, + "width": 1850, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAAD44AAAQFAAAIVQAAAAAAAA+OAAAEBQAAAAEAAAAACFUAAAhVAAAAAAAAD44AAAQF" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-preferences dialog geometry": { + "frame_geometry": { + "height": 720, + "width": 1295, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 720, + "width": 1295, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 720, + "width": 1295, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAADWMAAALPAAAIVQAAAAAAAA1jAAACzwAAAAEAAAAACFUAAAhVAAAAAAAADWMAAALP" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-single-cover-fetch-dialog-geometry": { + "frame_geometry": { + "height": 600, + "width": 850, + "x": 0, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 600, + "width": 850, + "x": 0, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 600, + "width": 850, + "x": 0, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAAAAAAAAAAAA1EAAAJXAAAAAAAAAAAAAANRAAACVwAAAAEAAAAACFUAAAAAAAAAAAAAA1EAAAJX" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "geometry-of-template_editor_dialog_geometry": { + "frame_geometry": { + "height": 478, + "width": 706, + "x": 2133, + "y": 0 + }, + "full_screened": false, + "geometry": { + "height": 478, + "width": 706, + "x": 2133, + "y": 0 + }, + "maximized": false, + "normal_geometry": { + "height": 478, + "width": 706, + "x": 2133, + "y": 0 + }, + "qt": { + "__class__": "bytearray", + "__value__": "AdnQywADAAAAAAhVAAAAAAAACxYAAAHdAAAIVQAAAAAAAAsWAAAB3QAAAAEAAAAACFUAAAhVAAAAAAAACxYAAAHd" + }, + "screen": { + "depth": 32, + "device_pixel_ratio": 2.0, + "geometry_in_logical_pixels": { + "height": 1200, + "width": 2133, + "x": 2133, + "y": 0 + }, + "index_in_screens_list": 1, + "manufacturer": "HP Inc.", + "model": "OMEN 27q", + "name": "DP-2", + "serial": "", + "size_in_logical_pixels": { + "height": 1200, + "width": 2133 + }, + "virtual_geometry": { + "height": 1200, + "width": 4266, + "x": 0, + "y": 0 + } + } + }, + "gpm_template_editor_font": "Fira Sans", + "gpm_template_editor_word_wrap_mode": true, "grid view visible": false, "jobs view column layout3": { "__class__": "bytearray", - "__value__": "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA04AAAAFAQEBAAAAAAAAAAAAAAAAAGT/////AAAAhAAAAAAAAAAFAAABRAAAAAEAAAAAAAAAtgAAAAEAAAAAAAAAjAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAD6AAAAAAA" + "__value__": "AAAA/wAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA04AAAAFAQEBAAAAAAAAAAAAAAAAAGT/////AAAAhAAAAAAAAAAFAAABRAAAAAEAAAAAAAAAtgAAAAEAAAAAAAAAjAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAAZAAAAAEAAAAAAAAD6AAAAAAAAAAAAA==" }, "jobs_dialog_geometry": { "__class__": "bytearray", "__value__": "AdnQywADAAAAAAGYAAABEQAABQ4AAAMyAAABmgAAARMAAAUMAAADMAAAAAAAAAAAB4AAAAGaAAABEwAABQwAAAMw" }, "library_usage_stats": { - "/home/exu/.local/share/Calibre-Library": 2, + "/home/exu/.local/share/Calibre-Library": 18, "/home/marc/Calibre-Bibliothek": 200 }, + "main_window_central_widget_state": { + "layout": "wide", + "narrow_desires": { + "book_details_height": 0.23066202090592333, + "cover_browser_width": 0.34992954438703616, + "quick_view_height": 0.2564459930313589, + "tag_browser_width": 0.2498825739783936 + }, + "narrow_visibility": { + "book_details": true, + "book_list": true, + "cover_browser": false, + "quick_view": false, + "tag_browser": true + }, + "wide_desires": { + "book_details_width": 0.21042743071864725, + "cover_browser_height": 0.21367521367521367, + "quick_view_height": 0.2621082621082621, + "tag_browser_width": 0.09394081728511038 + }, + "wide_visibility": { + "book_details": true, + "book_list": true, + "cover_browser": false, + "quick_view": false, + "tag_browser": true + } + }, "metadata-download-identify-widget-splitter-state": { "__class__": "bytearray", "__value__": "AAAA/wAAAAEAAAACAAACAAAAAQAA/////wEAAAABAA==" @@ -400,6 +890,7 @@ "authors": true, "rating": true, "series": true, + "timestamp": false, "title": true }, "quick_start_guide_added": true, @@ -419,6 +910,7 @@ "¤ ¤ ¤" ], "search bar visible": true, + "show_files_after_save": false, "single-cover-fetch-dialog-geometry": { "__class__": "bytearray", "__value__": "AdnQywADAAAAAAIhAAAA5wAABXYAAANCAAACIwAAAOkAAAV0AAADQAAAAAAAAAAAB4AAAAIjAAAA6QAABXQAAANA" @@ -432,5 +924,9 @@ "__class__": "bytearray", "__value__": "AdnQywADAAAAAAKTAAAAyAAABRYAAANlAAAClQAAAMoAAAUUAAADYwAAAAAAAAAAB4AAAAKVAAAAygAABRQAAANj" }, - "tag_editor_last_filter": "add_tag_input" + "tag_editor_last_filter": "add_tag_input", + "template_editor_table_widths": [ + 90, + 551 + ] } \ No newline at end of file diff --git a/arch-config/.config/calibre/gui.py.json b/arch-config/.config/calibre/gui.py.json index b7a61032..6a61b2ea 100644 --- a/arch-config/.config/calibre/gui.py.json +++ b/arch-config/.config/calibre/gui.py.json @@ -55,7 +55,10 @@ "oldest_news": 60, "overwrite_author_title_metadata": true, "plugin_search_history": [], - "save_to_disk_template_history": [], + "save_to_disk_template_history": [ + "{authors} - {series}/{series} {series_index} - {title}", + "{author_sort}/{title}/{title} - {authors}" + ], "scheduler_search_history": [], "search_as_you_type": false, "send_to_device_template_history": [], diff --git a/arch-config/.config/calibre/metadata-sources-cache.json b/arch-config/.config/calibre/metadata-sources-cache.json index f83301a3..d1773ecb 100644 --- a/arch-config/.config/calibre/metadata-sources-cache.json +++ b/arch-config/.config/calibre/metadata-sources-cache.json @@ -1,18 +1,18 @@ { - "amazon": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal \nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport re\nimport string\nimport socket\nimport time\nfrom functools import partial\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\nfrom threading import Thread\ntry:\n from urllib.parse import urlparse\nexcept ImportError:\n from urlparse import urlparse\n\nfrom mechanize import HTTPError\n\nfrom calibre import as_unicode, browser, random_user_agent, xml_replace_entities\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Option, Source, fixauthors, fixcase\nfrom calibre.utils.localization import canonicalize_lang\nfrom calibre.utils.random_ua import accept_header_for_ua\nfrom calibre.ebooks.oeb.base import urlquote\n\n\ndef sort_matches_preferring_kindle_editions(matches):\n upos_map = {url:i for i, url in enumerate(matches)}\n\n def skey(url):\n opos = upos_map[url]\n parts = url.split('/')\n try:\n idx = parts.index('dp')\n except Exception:\n idx = -1\n if idx < 0 or idx + 1 >= len(parts) or not parts[idx+1].startswith('B'):\n return 1, opos\n return 0, opos\n matches.sort(key=skey)\n return matches\n\n\ndef iri_quote_plus(url):\n ans = urlquote(url)\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans.replace('%20', '+')\n\n\ndef user_agent_is_ok(ua):\n return 'Mobile/' not in ua and 'Mobile ' not in ua\n\n\nclass CaptchaError(Exception):\n pass\n\n\nclass SearchFailed(ValueError):\n pass\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef parse_details_page(url, log, timeout, browser, domain):\n from calibre.utils.cleantext import clean_ascii_chars\n from calibre.ebooks.chardet import xml_to_unicode\n from lxml.html import tostring\n try:\n from calibre.ebooks.metadata.sources.update import search_engines_module\n get_data_for_cached_url = search_engines_module().get_data_for_cached_url\n except Exception:\n get_data_for_cached_url = lambda *a: None\n raw = get_data_for_cached_url(url)\n if raw:\n log('Using cached details for url:', url)\n else:\n log('Downloading details from:', url)\n try:\n raw = browser.open_novisit(url, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('URL malformed: %r' % url)\n return\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = 'Details page timed out. Try again later.'\n log.error(msg)\n else:\n msg = 'Failed to make details query: %r' % url\n log.exception(msg)\n return\n\n oraw = raw\n if 'amazon.com.br' in url:\n # amazon.com.br serves utf-8 but has an incorrect latin1 tag\n raw = raw.decode('utf-8')\n raw = xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True)[0]\n if '404 - ' in raw:\n raise ValueError('URL malformed: %r' % url)\n if '>Could not find the requested document in the cache.<' in raw:\n raise ValueError('No cached entry for %s found' % url)\n\n try:\n root = parse_html(clean_ascii_chars(raw))\n except Exception:\n msg = 'Failed to parse amazon details page: %r' % url\n log.exception(msg)\n return\n if domain == 'jp':\n for a in root.xpath('//a[@href]'):\n if ('black-curtain-redirect.html' in a.get('href')) or ('/black-curtain/save-eligibility/black-curtain' in a.get('href')):\n url = a.get('href')\n if url:\n if url.startswith('/'):\n url = 'https://amazon.co.jp' + a.get('href')\n log('Black curtain redirect found, following')\n return parse_details_page(url, log, timeout, browser, domain)\n\n errmsg = root.xpath('//*[@id=\"errorMessage\"]')\n if errmsg:\n msg = 'Failed to parse amazon details page: %r' % url\n msg += tostring(errmsg, method='text', encoding='unicode').strip()\n log.error(msg)\n return\n\n from css_selectors import Select\n selector = Select(root)\n return oraw, root, selector\n\n\ndef parse_asin(root, log, url):\n try:\n link = root.xpath('//link[@rel=\"canonical\" and @href]')\n for l in link:\n return l.get('href').rpartition('/')[-1]\n except Exception:\n log.exception('Error parsing ASIN for url: %r' % url)\n\n\nclass Worker(Thread): # Get details {{{\n\n '''\n Get book details from amazons book page in a separate thread\n '''\n\n def __init__(self, url, result_queue, browser, log, relevance, domain,\n plugin, timeout=20, testing=False, preparsed_root=None,\n cover_url_processor=None, filter_result=None):\n Thread.__init__(self)\n self.cover_url_processor = cover_url_processor\n self.preparsed_root = preparsed_root\n self.daemon = True\n self.testing = testing\n self.url, self.result_queue = url, result_queue\n self.log, self.timeout = log, timeout\n self.filter_result = filter_result or (lambda x, log: True)\n self.relevance, self.plugin = relevance, plugin\n self.browser = browser\n self.cover_url = self.amazon_id = self.isbn = None\n self.domain = domain\n from lxml.html import tostring\n self.tostring = tostring\n\n months = { # {{{\n 'de': {\n 1: ['jän', 'januar'],\n 2: ['februar'],\n 3: ['märz'],\n 5: ['mai'],\n 6: ['juni'],\n 7: ['juli'],\n 10: ['okt', 'oktober'],\n 12: ['dez', 'dezember']\n },\n 'it': {\n 1: ['gennaio', 'enn'],\n 2: ['febbraio', 'febbr'],\n 3: ['marzo'],\n 4: ['aprile'],\n 5: ['maggio', 'magg'],\n 6: ['giugno'],\n 7: ['luglio'],\n 8: ['agosto', 'ag'],\n 9: ['settembre', 'sett'],\n 10: ['ottobre', 'ott'],\n 11: ['novembre'],\n 12: ['dicembre', 'dic'],\n },\n 'fr': {\n 1: ['janv'],\n 2: ['févr'],\n 3: ['mars'],\n 4: ['avril'],\n 5: ['mai'],\n 6: ['juin'],\n 7: ['juil'],\n 8: ['août'],\n 9: ['sept'],\n 12: ['déc'],\n },\n 'br': {\n 1: ['janeiro'],\n 2: ['fevereiro'],\n 3: ['março'],\n 4: ['abril'],\n 5: ['maio'],\n 6: ['junho'],\n 7: ['julho'],\n 8: ['agosto'],\n 9: ['setembro'],\n 10: ['outubro'],\n 11: ['novembro'],\n 12: ['dezembro'],\n },\n 'es': {\n 1: ['enero'],\n 2: ['febrero'],\n 3: ['marzo'],\n 4: ['abril'],\n 5: ['mayo'],\n 6: ['junio'],\n 7: ['julio'],\n 8: ['agosto'],\n 9: ['septiembre', 'setiembre'],\n 10: ['octubre'],\n 11: ['noviembre'],\n 12: ['diciembre'],\n },\n 'se': {\n 1: ['januari'],\n 2: ['februari'],\n 3: ['mars'],\n 4: ['april'],\n 5: ['maj'],\n 6: ['juni'],\n 7: ['juli'],\n 8: ['augusti'],\n 9: ['september'],\n 10: ['oktober'],\n 11: ['november'],\n 12: ['december'],\n },\n 'jp': {\n 1: ['1月'],\n 2: ['2月'],\n 3: ['3月'],\n 4: ['4月'],\n 5: ['5月'],\n 6: ['6月'],\n 7: ['7月'],\n 8: ['8月'],\n 9: ['9月'],\n 10: ['10月'],\n 11: ['11月'],\n 12: ['12月'],\n },\n 'nl': {\n 1: ['januari'], 2: ['februari'], 3: ['maart'], 5: ['mei'], 6: ['juni'], 7: ['juli'], 8: ['augustus'], 10: ['oktober'],\n }\n\n } # }}}\n\n self.english_months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n self.months = months.get(self.domain, {})\n\n self.pd_xpath = '''\n //h2[text()=\"Product Details\" or \\\n text()=\"Produktinformation\" or \\\n text()=\"Dettagli prodotto\" or \\\n text()=\"Product details\" or \\\n text()=\"Détails sur le produit\" or \\\n text()=\"Detalles del producto\" or \\\n text()=\"Detalhes do produto\" or \\\n text()=\"Productgegevens\" or \\\n text()=\"基本信息\" or \\\n starts-with(text(), \"登録情報\")]/../div[@class=\"content\"]\n '''\n # Editor: is for Spanish\n self.publisher_xpath = '''\n descendant::*[starts-with(text(), \"Publisher:\") or \\\n starts-with(text(), \"Verlag:\") or \\\n starts-with(text(), \"Editore:\") or \\\n starts-with(text(), \"Editeur\") or \\\n starts-with(text(), \"Editor:\") or \\\n starts-with(text(), \"Editora:\") or \\\n starts-with(text(), \"Uitgever:\") or \\\n starts-with(text(), \"Utgivare:\") or \\\n starts-with(text(), \"出版社:\")]\n '''\n self.pubdate_xpath = '''\n descendant::*[starts-with(text(), \"Publication Date:\") or \\\n starts-with(text(), \"Audible.com Release Date:\")]\n '''\n self.publisher_names = {'Publisher', 'Uitgever', 'Verlag', 'Utgivare', 'Herausgeber',\n 'Editore', 'Editeur', 'Editor', 'Editora', '出版社'}\n\n self.language_xpath = '''\n descendant::*[\n starts-with(text(), \"Language:\") \\\n or text() = \"Language\" \\\n or text() = \"Sprache:\" \\\n or text() = \"Lingua:\" \\\n or text() = \"Idioma:\" \\\n or starts-with(text(), \"Langue\") \\\n or starts-with(text(), \"言語\") \\\n or starts-with(text(), \"Språk\") \\\n or starts-with(text(), \"语种\")\n ]\n '''\n self.language_names = {'Language', 'Sprache', 'Språk',\n 'Lingua', 'Idioma', 'Langue', '言語', 'Taal', '语种'}\n\n self.tags_xpath = '''\n descendant::h2[\n text() = \"Look for Similar Items by Category\" or\n text() = \"Ähnliche Artikel finden\" or\n text() = \"Buscar productos similares por categoría\" or\n text() = \"Ricerca articoli simili per categoria\" or\n text() = \"Rechercher des articles similaires par rubrique\" or\n text() = \"Procure por items similares por categoria\" or\n text() = \"関連商品を探す\"\n ]/../descendant::ul/li\n '''\n\n self.ratings_pat = re.compile(\n r'([0-9.,]+) ?(out of|von|van|su|étoiles sur|つ星のうち|de un máximo de|de|av) '\n r'([\\d\\.]+)( (stars|Sternen|stelle|estrellas|estrelas|sterren|stjärnor)){0,1}'\n )\n self.ratings_pat_cn = re.compile('([0-9.]+) 颗星,最多 5 颗星')\n self.ratings_pat_jp = re.compile(r'\\d+つ星のうち([\\d\\.]+)')\n\n lm = {\n 'eng': ('English', 'Englisch', 'Engels', 'Engelska'),\n 'fra': ('French', 'Français'),\n 'ita': ('Italian', 'Italiano'),\n 'deu': ('German', 'Deutsch'),\n 'spa': ('Spanish', 'Espa\\xf1ol', 'Espaniol'),\n 'jpn': ('Japanese', '日本語'),\n 'por': ('Portuguese', 'Português'),\n 'nld': ('Dutch', 'Nederlands',),\n 'chs': ('Chinese', '中文', '简体中文'),\n 'swe': ('Swedish', 'Svenska'),\n }\n self.lang_map = {}\n for code, names in lm.items():\n for name in names:\n self.lang_map[name] = code\n\n self.series_pat = re.compile(\n r'''\n \\|\\s* # Prefix\n (Series)\\s*:\\s* # Series declaration\n (?P<series>.+?)\\s+ # The series name\n \\((Book)\\s* # Book declaration\n (?P<index>[0-9.]+) # Series index\n \\s*\\)\n ''', re.X)\n\n def delocalize_datestr(self, raw):\n if self.domain == 'cn':\n return raw.replace('年', '-').replace('月', '-').replace('日', '')\n if not self.months:\n return raw\n ans = raw.lower()\n for i, vals in self.months.items():\n for x in vals:\n ans = ans.replace(x, self.english_months[i])\n ans = ans.replace(' de ', ' ')\n return ans\n\n def run(self):\n try:\n self.get_details()\n except:\n self.log.exception('get_details failed for url: %r' % self.url)\n\n def get_details(self):\n if self.preparsed_root is None:\n raw, root, selector = parse_details_page(\n self.url, self.log, self.timeout, self.browser, self.domain)\n else:\n raw, root, selector = self.preparsed_root\n\n from css_selectors import Select\n self.selector = Select(root)\n self.parse_details(raw, root)\n\n def parse_details(self, raw, root):\n asin = parse_asin(root, self.log, self.url)\n if not asin and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError(\n 'Amazon returned a CAPTCHA page, probably because you downloaded too many books. Wait for some time and try again.')\n if self.testing:\n import tempfile\n import uuid\n with tempfile.NamedTemporaryFile(prefix=(asin or type('')(uuid.uuid4())) + '_',\n suffix='.html', delete=False) as f:\n f.write(raw)\n print('Downloaded HTML for', asin, 'saved in', f.name)\n\n try:\n title = self.parse_title(root)\n except:\n self.log.exception('Error parsing title for url: %r' % self.url)\n title = None\n\n try:\n authors = self.parse_authors(root)\n except:\n self.log.exception('Error parsing authors for url: %r' % self.url)\n authors = []\n\n if not title or not authors or not asin:\n self.log.error(\n 'Could not find title/authors/asin for %r' % self.url)\n self.log.error('ASIN: %r Title: %r Authors: %r' % (asin, title,\n authors))\n return\n\n mi = Metadata(title, authors)\n idtype = 'amazon' if self.domain == 'com' else 'amazon_' + self.domain\n mi.set_identifier(idtype, asin)\n self.amazon_id = asin\n\n try:\n mi.rating = self.parse_rating(root)\n except:\n self.log.exception('Error parsing ratings for url: %r' % self.url)\n\n try:\n mi.comments = self.parse_comments(root, raw)\n except:\n self.log.exception('Error parsing comments for url: %r' % self.url)\n\n try:\n series, series_index = self.parse_series(root)\n if series:\n mi.series, mi.series_index = series, series_index\n elif self.testing:\n mi.series, mi.series_index = 'Dummy series for testing', 1\n except:\n self.log.exception('Error parsing series for url: %r' % self.url)\n\n try:\n mi.tags = self.parse_tags(root)\n except:\n self.log.exception('Error parsing tags for url: %r' % self.url)\n\n try:\n self.cover_url = self.parse_cover(root, raw)\n except:\n self.log.exception('Error parsing cover for url: %r' % self.url)\n if self.cover_url_processor is not None and self.cover_url and self.cover_url.startswith('/'):\n self.cover_url = self.cover_url_processor(self.cover_url)\n mi.has_cover = bool(self.cover_url)\n\n detail_bullets = root.xpath('//*[@data-feature-name=\"detailBullets\"]')\n non_hero = tuple(self.selector(\n 'div#bookDetails_container_div div#nonHeroSection')) or tuple(self.selector(\n '#productDetails_techSpec_sections'))\n if detail_bullets:\n self.parse_detail_bullets(root, mi, detail_bullets[0])\n elif non_hero:\n try:\n self.parse_new_details(root, mi, non_hero[0])\n except:\n self.log.exception(\n 'Failed to parse new-style book details section')\n\n else:\n pd = root.xpath(self.pd_xpath)\n if pd:\n pd = pd[0]\n\n try:\n isbn = self.parse_isbn(pd)\n if isbn:\n self.isbn = mi.isbn = isbn\n except:\n self.log.exception(\n 'Error parsing ISBN for url: %r' % self.url)\n\n try:\n mi.publisher = self.parse_publisher(pd)\n except:\n self.log.exception(\n 'Error parsing publisher for url: %r' % self.url)\n\n try:\n mi.pubdate = self.parse_pubdate(pd)\n except:\n self.log.exception(\n 'Error parsing publish date for url: %r' % self.url)\n\n try:\n lang = self.parse_language(pd)\n if lang:\n mi.language = lang\n except:\n self.log.exception(\n 'Error parsing language for url: %r' % self.url)\n\n else:\n self.log.warning(\n 'Failed to find product description for url: %r' % self.url)\n\n mi.source_relevance = self.relevance\n\n if self.amazon_id:\n if self.isbn:\n self.plugin.cache_isbn_to_identifier(self.isbn, self.amazon_id)\n if self.cover_url:\n self.plugin.cache_identifier_to_cover_url(self.amazon_id,\n self.cover_url)\n\n self.plugin.clean_downloaded_metadata(mi)\n\n if self.filter_result(mi, self.log):\n self.result_queue.put(mi)\n\n def totext(self, elem, only_printable=False):\n res = self.tostring(elem, encoding='unicode', method='text')\n if only_printable:\n try:\n filtered_characters = list(s for s in res if s.isprintable())\n except AttributeError:\n filtered_characters = list(s for s in res if s in string.printable)\n res = ''.join(filtered_characters).strip()\n return res\n\n def parse_title(self, root):\n\n def sanitize_title(title):\n ans = title.strip()\n if not ans.startswith('['):\n ans = re.sub(r'[(\\[].*[)\\]]', '', title).strip()\n return ans\n\n h1 = root.xpath('//h1[@id=\"title\"]')\n if h1:\n h1 = h1[0]\n for child in h1.xpath('./*[contains(@class, \"a-color-secondary\")]'):\n h1.remove(child)\n return sanitize_title(self.totext(h1))\n tdiv = root.xpath('//h1[contains(@class, \"parseasinTitle\")]')\n if not tdiv:\n span = root.xpath('//*[@id=\"ebooksTitle\"]')\n if span:\n return sanitize_title(self.totext(span[0]))\n raise ValueError('No title block found')\n tdiv = tdiv[0]\n actual_title = tdiv.xpath('descendant::*[@id=\"btAsinTitle\"]')\n if actual_title:\n title = self.tostring(actual_title[0], encoding='unicode',\n method='text').strip()\n else:\n title = self.tostring(tdiv, encoding='unicode',\n method='text').strip()\n return sanitize_title(title)\n\n def parse_authors(self, root):\n for sel in (\n '#byline .author .contributorNameID',\n '#byline .author a.a-link-normal',\n '#bylineInfo .author .contributorNameID',\n '#bylineInfo .author a.a-link-normal',\n '#bylineInfo #bylineContributor',\n ):\n matches = tuple(self.selector(sel))\n if matches:\n authors = [self.totext(x) for x in matches]\n return [a for a in authors if a]\n\n x = '//h1[contains(@class, \"parseasinTitle\")]/following-sibling::span/*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]'\n aname = root.xpath(x)\n if not aname:\n aname = root.xpath('''\n //h1[contains(@class, \"parseasinTitle\")]/following-sibling::*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]\n ''')\n for x in aname:\n x.tail = ''\n authors = [self.tostring(x, encoding='unicode', method='text').strip() for x\n in aname]\n authors = [a for a in authors if a]\n return authors\n\n def parse_rating(self, root):\n for x in root.xpath('//div[@id=\"cpsims-feature\" or @id=\"purchase-sims-feature\" or @id=\"rhf\"]'):\n # Remove the similar books section as it can cause spurious\n # ratings matches\n x.getparent().remove(x)\n\n rating_paths = (\n '//div[@data-feature-name=\"averageCustomerReviews\" or @id=\"averageCustomerReviews\"]',\n '//div[@class=\"jumpBar\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//div[@class=\"buying\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//span[@class=\"crAvgStars\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]'\n )\n ratings = None\n for p in rating_paths:\n ratings = root.xpath(p)\n if ratings:\n break\n\n def parse_ratings_text(text):\n try:\n m = self.ratings_pat.match(text)\n return float(m.group(1).replace(',', '.')) / float(m.group(3)) * 5\n except Exception:\n pass\n\n if ratings:\n ratings = ratings[0]\n for elem in ratings.xpath('descendant::*[@title]'):\n t = elem.get('title').strip()\n if self.domain == 'cn':\n m = self.ratings_pat_cn.match(t)\n if m is not None:\n return float(m.group(1))\n elif self.domain == 'jp':\n m = self.ratings_pat_jp.match(t)\n if m is not None:\n return float(m.group(1))\n else:\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n for elem in ratings.xpath('descendant::span[@class=\"a-icon-alt\"]'):\n t = self.tostring(\n elem, encoding='unicode', method='text', with_tail=False).strip()\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n\n def _render_comments(self, desc):\n from calibre.library.comments import sanitize_comments_html\n\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for c in desc.xpath('descendant::*[@class=\"seeAll\" or'\n ' @class=\"emptyClear\" or @id=\"collapsePS\" or'\n ' @id=\"expandPS\"]'):\n c.getparent().remove(c)\n for b in desc.xpath('descendant::b[@style]'):\n # Bing highlights search results\n s = b.get('style', '')\n if 'color' in s:\n b.tag = 'span'\n del b.attrib['style']\n\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = self.tostring(desc, method='html', encoding='unicode').strip()\n desc = xml_replace_entities(desc, 'utf-8')\n\n # Encoding bug in Amazon data U+fffd (replacement char)\n # in some examples it is present in place of '\n desc = desc.replace('\\ufffd', \"'\")\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove the notice about text referring to out of print editions\n desc = re.sub(r'(?s)<em>--This text ref.*?</em>', '', desc)\n # Remove comments\n desc = re.sub(r'(?s)<!--.*?-->', '', desc)\n return sanitize_comments_html(desc)\n\n def parse_comments(self, root, raw):\n try:\n from urllib.parse import unquote\n except ImportError:\n from urllib import unquote\n ans = ''\n ns = tuple(self.selector('#bookDescription_feature_div noscript'))\n if ns:\n ns = ns[0]\n if len(ns) == 0 and ns.text:\n import html5lib\n # html5lib parsed noscript as CDATA\n ns = html5lib.parseFragment(\n '<div>%s</div>' % (ns.text), treebuilder='lxml', namespaceHTMLElements=False)[0]\n else:\n ns.tag = 'div'\n ans = self._render_comments(ns)\n else:\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"content\"]')\n if desc:\n ans = self._render_comments(desc[0])\n else:\n ns = tuple(self.selector('#bookDescription_feature_div .a-expander-content'))\n if ns:\n ans = self._render_comments(ns[0])\n\n desc = root.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n else:\n # Idiot chickens from amazon strike again. This data is now stored\n # in a JS variable inside a script tag URL encoded.\n m = re.search(br'var\\s+iframeContent\\s*=\\s*\"([^\"]+)\"', raw)\n if m is not None:\n try:\n text = unquote(m.group(1)).decode('utf-8')\n nr = parse_html(text)\n desc = nr.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n except Exception as e:\n self.log.warn(\n 'Parsing of obfuscated product description failed with error: %s' % as_unicode(e))\n else:\n desc = root.xpath('//div[@id=\"productDescription_fullView\"]')\n if desc:\n ans += self._render_comments(desc[0])\n\n return ans\n\n def parse_series(self, root):\n ans = (None, None)\n\n # This is found on the paperback/hardback pages for books on amazon.com\n series = root.xpath('//div[@data-feature-name=\"seriesTitle\"]')\n if series:\n series = series[0]\n spans = series.xpath('./span')\n if spans:\n raw = self.tostring(\n spans[0], encoding='unicode', method='text', with_tail=False).strip()\n m = re.search(r'\\s+([0-9.]+)$', raw.strip())\n if m is not None:\n series_index = float(m.group(1))\n s = series.xpath('./a[@id=\"series-page-link\"]')\n if s:\n series = self.tostring(\n s[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n else:\n series = root.xpath('//div[@id=\"seriesBulletWidget_feature_div\"]')\n if series:\n a = series[0].xpath('descendant::a')\n if a:\n raw = self.tostring(a[0], encoding='unicode', method='text', with_tail=False)\n if self.domain == 'jp':\n m = re.search(r'(?P<index>[0-9.]+)\\s*(?:巻|冊)\\s*\\(全\\s*([0-9.]+)\\s*(?:巻|冊)\\):\\s*(?P<series>.+)', raw.strip())\n else:\n m = re.search(r'(?:Book|Libro|Buch)\\s+(?P<index>[0-9.]+)\\s+(?:of|de|von)\\s+([0-9.]+)\\s*:\\s*(?P<series>.+)', raw.strip())\n if m is not None:\n ans = (m.group('series').strip(), float(m.group('index')))\n\n # This is found on Kindle edition pages on amazon.com\n if ans == (None, None):\n for span in root.xpath('//div[@id=\"aboutEbooksSection\"]//li/span'):\n text = (span.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = span.xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n # This is found on newer Kindle edition pages on amazon.com\n if ans == (None, None):\n for b in root.xpath('//div[@id=\"reviewFeatureGroup\"]/span/b'):\n text = (b.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = b.getparent().xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).partition('(')[0].strip()\n if series:\n ans = series, series_index\n\n if ans == (None, None):\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"buying\"]')\n if desc:\n raw = self.tostring(desc[0], method='text', encoding='unicode')\n raw = re.sub(r'\\s+', ' ', raw)\n match = self.series_pat.search(raw)\n if match is not None:\n s, i = match.group('series'), float(match.group('index'))\n if s:\n ans = (s, i)\n if ans[0]:\n ans = (re.sub(r'\\s+Series$', '', ans[0]).strip(), ans[1])\n ans = (re.sub(r'\\(.+?\\s+Series\\)$', '', ans[0]).strip(), ans[1])\n return ans\n\n def parse_tags(self, root):\n ans = []\n exclude_tokens = {'kindle', 'a-z'}\n exclude = {'special features', 'by authors',\n 'authors & illustrators', 'books', 'new; used & rental textbooks'}\n seen = set()\n for li in root.xpath(self.tags_xpath):\n for i, a in enumerate(li.iterdescendants('a')):\n if i > 0:\n # we ignore the first category since it is almost always\n # too broad\n raw = (a.text or '').strip().replace(',', ';')\n lraw = icu_lower(raw)\n tokens = frozenset(lraw.split())\n if raw and lraw not in exclude and not tokens.intersection(exclude_tokens) and lraw not in seen:\n ans.append(raw)\n seen.add(lraw)\n return ans\n\n def parse_cover(self, root, raw=b\"\"):\n # Look for the image URL in javascript, using the first image in the\n # image gallery as the cover\n import json\n imgpat = re.compile(r\"\"\"'imageGalleryData'\\s*:\\s*(\\[\\s*{.+])\"\"\")\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n try:\n return json.loads(m.group(1))[0]['mainUrl']\n except Exception:\n continue\n\n def clean_img_src(src):\n parts = src.split('/')\n if len(parts) > 3:\n bn = parts[-1]\n sparts = bn.split('_')\n if len(sparts) > 2:\n bn = re.sub(r'\\.\\.jpg$', '.jpg', (sparts[0] + sparts[-1]))\n return ('/'.join(parts[:-1])) + '/' + bn\n\n imgpat2 = re.compile(r'var imageSrc = \"([^\"]+)\"')\n for script in root.xpath('//script'):\n m = imgpat2.search(script.text or '')\n if m is not None:\n src = m.group(1)\n url = clean_img_src(src)\n if url:\n return url\n\n imgs = root.xpath(\n '//img[(@id=\"prodImage\" or @id=\"original-main-image\" or @id=\"main-image\" or @id=\"main-image-nonjs\") and @src]')\n if not imgs:\n imgs = (\n root.xpath('//div[@class=\"main-image-inner-wrapper\"]/img[@src]') or\n root.xpath('//div[@id=\"main-image-container\" or @id=\"ebooks-main-image-container\"]//img[@src]') or\n root.xpath(\n '//div[@id=\"mainImageContainer\"]//img[@data-a-dynamic-image]')\n )\n for img in imgs:\n try:\n idata = json.loads(img.get('data-a-dynamic-image'))\n except Exception:\n imgs = ()\n else:\n mwidth = 0\n try:\n url = None\n for iurl, (width, height) in idata.items():\n if width > mwidth:\n mwidth = width\n url = iurl\n return url\n except Exception:\n pass\n\n for img in imgs:\n src = img.get('src')\n if 'data:' in src:\n continue\n if 'loading-' in src:\n js_img = re.search(br'\"largeImage\":\"(https?://[^\"]+)\",', raw)\n if js_img:\n src = js_img.group(1).decode('utf-8')\n if ('/no-image-avail' not in src and 'loading-' not in src and '/no-img-sm' not in src):\n self.log('Found image: %s' % src)\n url = clean_img_src(src)\n if url:\n return url\n\n def parse_detail_bullets(self, root, mi, container):\n ul = next(self.selector('.detail-bullet-list', root=container))\n for span in self.selector('.a-list-item', root=ul):\n cells = span.xpath('./span')\n if len(cells) >= 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_new_details(self, root, mi, non_hero):\n table = non_hero.xpath('descendant::table')[0]\n for tr in table.xpath('descendant::tr'):\n cells = tr.xpath('descendant::*[local-name()=\"td\" or local-name()=\"th\"]')\n if len(cells) == 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_detail_cells(self, mi, c1, c2):\n name = self.totext(c1, only_printable=True).strip().strip(':').strip()\n val = self.totext(c2).strip()\n if not val:\n return\n if name in self.language_names:\n ans = self.lang_map.get(val, None)\n if not ans:\n ans = canonicalize_lang(val)\n if ans:\n mi.language = ans\n elif name in self.publisher_names:\n pub = val.partition(';')[0].partition('(')[0].strip()\n if pub:\n mi.publisher = pub\n date = val.rpartition('(')[-1].replace(')', '').strip()\n try:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(date)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n except:\n self.log.exception('Failed to parse pubdate: %s' % val)\n elif name in {'ISBN', 'ISBN-10', 'ISBN-13'}:\n ans = check_isbn(val)\n if ans:\n self.isbn = mi.isbn = ans\n elif name in {'Publication date'}:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(val)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n\n def parse_isbn(self, pd):\n items = pd.xpath(\n 'descendant::*[starts-with(text(), \"ISBN\")]')\n if not items:\n items = pd.xpath(\n 'descendant::b[contains(text(), \"ISBN:\")]')\n for x in reversed(items):\n if x.tail:\n ans = check_isbn(x.tail.strip())\n if ans:\n return ans\n\n def parse_publisher(self, pd):\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail.partition(';')[0]\n return ans.partition('(')[0].strip()\n\n def parse_pubdate(self, pd):\n from calibre.utils.date import parse_only_date\n for x in reversed(pd.xpath(self.pubdate_xpath)):\n if x.tail:\n date = x.tail.strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail\n date = ans.rpartition('(')[-1].replace(')', '').strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n\n def parse_language(self, pd):\n for x in reversed(pd.xpath(self.language_xpath)):\n if x.tail:\n raw = x.tail.strip().partition(',')[0].strip()\n ans = self.lang_map.get(raw, None)\n if ans:\n return ans\n ans = canonicalize_lang(ans)\n if ans:\n return ans\n# }}}\n\n\nclass Amazon(Source):\n\n name = 'Amazon.com'\n version = (1, 3, 0)\n minimum_calibre_version = (2, 82, 0)\n description = _('Downloads metadata and covers from Amazon')\n\n capabilities = frozenset(('identify', 'cover'))\n touched_fields = frozenset(('title', 'authors', 'identifier:amazon',\n 'rating', 'comments', 'publisher', 'pubdate',\n 'languages', 'series', 'tags'))\n has_html_comments = True\n supports_gzip_transfer_encoding = True\n prefer_results_with_isbn = False\n\n AMAZON_DOMAINS = {\n 'com': _('US'),\n 'fr': _('France'),\n 'de': _('Germany'),\n 'uk': _('UK'),\n 'au': _('Australia'),\n 'it': _('Italy'),\n 'jp': _('Japan'),\n 'es': _('Spain'),\n 'br': _('Brazil'),\n 'in': _('India'),\n 'nl': _('Netherlands'),\n 'cn': _('China'),\n 'ca': _('Canada'),\n 'se': _('Sweden'),\n }\n\n SERVERS = {\n 'auto': _('Choose server automatically'),\n 'amazon': _('Amazon servers'),\n 'bing': _('Bing search cache'),\n 'google': _('Google search cache'),\n 'wayback': _('Wayback machine cache (slow)'),\n 'ddg': _('DuckDuckGo search and Google cache'),\n }\n\n options = (\n Option('domain', 'choices', 'com', _('Amazon country website to use:'),\n _('Metadata from Amazon will be fetched using this '\n 'country\\'s Amazon website.'), choices=AMAZON_DOMAINS),\n Option('server', 'choices', 'auto', _('Server to get data from:'),\n _(\n 'Amazon has started blocking attempts to download'\n ' metadata from its servers. To get around this problem,'\n ' calibre can fetch the Amazon data from many different'\n ' places where it is cached. Choose the source you prefer.'\n ), choices=SERVERS),\n Option('use_mobi_asin', 'bool', False, _('Use the MOBI-ASIN for metadata search'),\n _(\n 'Enable this option to search for metadata with an'\n ' ASIN identifier from the MOBI file at the current country website,'\n ' unless any other amazon id is available. Note that if the'\n ' MOBI file came from a different Amazon country store, you could get'\n ' incorrect results.'\n )),\n Option('prefer_kindle_edition', 'bool', False, _('Prefer the Kindle edition, when available'),\n _(\n 'When searching for a book and the search engine returns both paper and Kindle editions,'\n ' always prefer the Kindle edition, instead of whatever the search engine returns at the'\n ' top.')\n ),\n )\n\n def __init__(self, *args, **kwargs):\n Source.__init__(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def id_from_url(self, url):\n from polyglot.urllib import urlparse\n purl = urlparse(url)\n if purl.netloc and purl.path and '/dp/' in purl.path:\n host_parts = tuple(x.lower() for x in purl.netloc.split('.'))\n if 'amazon' in host_parts:\n domain = host_parts[-1]\n parts = purl.path.split('/')\n idx = parts.index('dp')\n try:\n val = parts[idx+1]\n except IndexError:\n return\n aid = 'amazon' if domain == 'com' else ('amazon_' + domain)\n return aid, val\n\n def test_fields(self, mi):\n '''\n Return the first field from self.touched_fields that is null on the\n mi object\n '''\n for key in self.touched_fields:\n if key.startswith('identifier:'):\n key = key.partition(':')[-1]\n if key == 'amazon':\n if self.domain != 'com':\n key += '_' + self.domain\n if not mi.has_identifier(key):\n return 'identifier: ' + key\n elif mi.is_null(key):\n return key\n\n @property\n def browser(self):\n br = self._browser\n if br is None:\n ua = 'Mobile '\n while not user_agent_is_ok(ua):\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n self._browser = br = browser(user_agent=ua)\n br.set_handle_gzip(True)\n if self.use_search_engine:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n else:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ('Referer', self.referrer_for_domain()),\n ]\n return br\n\n def save_settings(self, *args, **kwargs):\n Source.save_settings(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def set_amazon_id_touched_fields(self):\n ident_name = \"identifier:amazon\"\n if self.domain != 'com':\n ident_name += '_' + self.domain\n tf = [x for x in self.touched_fields if not\n x.startswith('identifier:amazon')] + [ident_name]\n self.touched_fields = frozenset(tf)\n\n def get_domain_and_asin(self, identifiers, extra_domains=()):\n identifiers = {k.lower(): v for k, v in identifiers.items()}\n for key, val in identifiers.items():\n if key in ('amazon', 'asin'):\n return 'com', val\n if key.startswith('amazon_'):\n domain = key.partition('_')[-1]\n if domain and (domain in self.AMAZON_DOMAINS or domain in extra_domains):\n return domain, val\n if self.prefs['use_mobi_asin']:\n val = identifiers.get('mobi-asin')\n if val is not None:\n return self.domain, val\n return None, None\n\n def referrer_for_domain(self, domain=None):\n domain = domain or self.domain\n return {\n 'uk': 'https://www.amazon.co.uk/',\n 'au': 'https://www.amazon.com.au/',\n 'br': 'https://www.amazon.com.br/',\n 'jp': 'https://www.amazon.co.jp/',\n }.get(domain, 'https://www.amazon.%s/' % domain)\n\n def _get_book_url(self, identifiers): # {{{\n domain, asin = self.get_domain_and_asin(\n identifiers, extra_domains=('au', 'ca'))\n if domain and asin:\n url = None\n r = self.referrer_for_domain(domain)\n if r is not None:\n url = r + 'dp/' + asin\n if url:\n idtype = 'amazon' if domain == 'com' else 'amazon_' + domain\n return domain, idtype, asin, url\n\n def get_book_url(self, identifiers):\n ans = self._get_book_url(identifiers)\n if ans is not None:\n return ans[1:]\n\n def get_book_url_name(self, idtype, idval, url):\n if idtype == 'amazon':\n return self.name\n return 'A' + idtype.replace('_', '.')[1:]\n # }}}\n\n @property\n def domain(self):\n x = getattr(self, 'testing_domain', None)\n if x is not None:\n return x\n domain = self.prefs['domain']\n if domain not in self.AMAZON_DOMAINS:\n domain = 'com'\n\n return domain\n\n @property\n def server(self):\n x = getattr(self, 'testing_server', None)\n if x is not None:\n return x\n server = self.prefs['server']\n if server not in self.SERVERS:\n server = 'auto'\n return server\n\n @property\n def use_search_engine(self):\n return self.server != 'amazon'\n\n def clean_downloaded_metadata(self, mi):\n docase = (\n mi.language == 'eng' or\n (mi.is_null('language') and self.domain in {'com', 'uk', 'au'})\n )\n if mi.title and docase:\n # Remove series information from title\n m = re.search(r'\\S+\\s+(\\(.+?\\s+Book\\s+\\d+\\))$', mi.title)\n if m is not None:\n mi.title = mi.title.replace(m.group(1), '').strip()\n mi.title = fixcase(mi.title)\n mi.authors = fixauthors(mi.authors)\n if mi.tags and docase:\n mi.tags = list(map(fixcase, mi.tags))\n mi.isbn = check_isbn(mi.isbn)\n if mi.series and docase:\n mi.series = fixcase(mi.series)\n if mi.title and mi.series:\n for pat in (r':\\s*Book\\s+\\d+\\s+of\\s+%s$', r'\\(%s\\)$', r':\\s*%s\\s+Book\\s+\\d+$'):\n pat = pat % re.escape(mi.series)\n q = re.sub(pat, '', mi.title, flags=re.I).strip()\n if q and q != mi.title:\n mi.title = q\n break\n\n def get_website_domain(self, domain):\n return {'uk': 'co.uk', 'jp': 'co.jp', 'br': 'com.br', 'au': 'com.au'}.get(domain, domain)\n\n def create_query(self, log, title=None, authors=None, identifiers={}, # {{{\n domain=None, for_amazon=True):\n try:\n from urllib.parse import urlencode, unquote_plus\n except ImportError:\n from urllib import urlencode, unquote_plus\n if domain is None:\n domain = self.domain\n\n idomain, asin = self.get_domain_and_asin(identifiers)\n if idomain is not None:\n domain = idomain\n\n # See the amazon detailed search page to get all options\n terms = []\n q = {'search-alias': 'aps',\n 'unfiltered': '1',\n }\n\n if domain == 'com':\n q['sort'] = 'relevanceexprank'\n else:\n q['sort'] = 'relevancerank'\n\n isbn = check_isbn(identifiers.get('isbn', None))\n\n if asin is not None:\n q['field-keywords'] = asin\n terms.append(asin)\n elif isbn is not None:\n q['field-isbn'] = isbn\n if len(isbn) == 13:\n terms.extend('({} OR {}-{})'.format(isbn, isbn[:3], isbn[3:]).split())\n else:\n terms.append(isbn)\n else:\n # Only return book results\n q['search-alias'] = {'br': 'digital-text',\n 'nl': 'aps'}.get(domain, 'stripbooks')\n if title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q['field-title'] = ' '.join(title_tokens)\n terms.extend(title_tokens)\n if authors:\n author_tokens = list(self.get_author_tokens(authors,\n only_first_author=True))\n if author_tokens:\n q['field-author'] = ' '.join(author_tokens)\n terms.extend(author_tokens)\n\n if not ('field-keywords' in q or 'field-isbn' in q or\n ('field-title' in q)):\n # Insufficient metadata to make an identify query\n return None, None\n\n if not for_amazon:\n return terms, domain\n\n if domain == 'nl':\n q['__mk_nl_NL'] = 'ÅMÅŽÕÑ'\n if 'field-keywords' not in q:\n q['field-keywords'] = ''\n for f in 'field-isbn field-title field-author'.split():\n q['field-keywords'] += ' ' + q.pop(f, '')\n q['field-keywords'] = q['field-keywords'].strip()\n\n encoded_q = dict([(x.encode('utf-8', 'ignore'), y.encode(\n 'utf-8', 'ignore')) for x, y in q.items()])\n url_query = urlencode(encoded_q)\n # amazon's servers want IRIs with unicode characters not percent esaped\n parts = []\n for x in url_query.split(b'&' if isinstance(url_query, bytes) else '&'):\n k, v = x.split(b'=' if isinstance(x, bytes) else '=', 1)\n parts.append('{}={}'.format(iri_quote_plus(unquote_plus(k)), iri_quote_plus(unquote_plus(v))))\n url_query = '&'.join(parts)\n url = 'https://www.amazon.%s/s/?' % self.get_website_domain(\n domain) + url_query\n return url, domain\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n domain, asin = self.get_domain_and_asin(identifiers)\n if asin is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n asin = self.cached_isbn_to_identifier(isbn)\n if asin is not None:\n url = self.cached_identifier_to_cover_url(asin)\n\n return url\n # }}}\n\n def parse_results_page(self, root, domain): # {{{\n from lxml.html import tostring\n\n matches = []\n\n def title_ok(title):\n title = title.lower()\n bad = ['bulk pack', '[audiobook]', '[audio cd]',\n '(a book companion)', '( slipcase with door )', ': free sampler']\n if self.domain == 'com':\n bad.extend(['(%s edition)' % x for x in ('spanish', 'german')])\n for x in bad:\n if x in title:\n return False\n if title and title[0] in '[{' and re.search(r'\\(\\s*author\\s*\\)', title) is not None:\n # Bad entries in the catalog\n return False\n return True\n\n for query in (\n '//div[contains(@class, \"s-result-list\")]//h2/a[@href]',\n '//div[contains(@class, \"s-result-list\")]//div[@data-index]//h5//a[@href]',\n r'//li[starts-with(@id, \"result_\")]//a[@href and contains(@class, \"s-access-detail-page\")]',\n ):\n result_links = root.xpath(query)\n if result_links:\n break\n for a in result_links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n\n if not matches:\n # Previous generation of results page markup\n for div in root.xpath(r'//div[starts-with(@id, \"result_\")]'):\n links = div.xpath(r'descendant::a[@class=\"title\" and @href]')\n if not links:\n # New amazon markup\n links = div.xpath('descendant::h3/a[@href]')\n for a in links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n\n if not matches:\n # This can happen for some user agents that Amazon thinks are\n # mobile/less capable\n for td in root.xpath(\n r'//div[@id=\"Results\"]/descendant::td[starts-with(@id, \"search:Td:\")]'):\n for a in td.xpath(r'descendant::td[@class=\"dataColumn\"]/descendant::a[@href]/span[@class=\"srTitle\"]/..'):\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n if not matches and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError('Amazon returned a CAPTCHA page. Recently Amazon has begun using statistical'\n ' profiling to block access to its website. As such this metadata plugin is'\n ' unlikely to ever work reliably.')\n\n # Keep only the top 3 matches as the matches are sorted by relevance by\n # Amazon so lower matches are not likely to be very relevant\n return matches[:3]\n # }}}\n\n def search_amazon(self, br, testing, log, abort, title, authors, identifiers, timeout): # {{{\n from calibre.utils.cleantext import clean_ascii_chars\n from calibre.ebooks.chardet import xml_to_unicode\n matches = []\n query, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if query is None:\n log.error('Insufficient metadata to construct query')\n raise SearchFailed()\n try:\n raw = br.open_novisit(query, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('Query malformed: %r' % query)\n raise SearchFailed()\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = _('Amazon timed out. Try again later.')\n log.error(msg)\n else:\n msg = 'Failed to make identify query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n raw = clean_ascii_chars(xml_to_unicode(raw,\n strip_encoding_pats=True, resolve_entities=True)[0])\n\n if testing:\n import tempfile\n with tempfile.NamedTemporaryFile(prefix='amazon_results_',\n suffix='.html', delete=False) as f:\n f.write(raw.encode('utf-8'))\n print('Downloaded html for results page saved in', f.name)\n\n matches = []\n found = '<title>404 - ' not in raw\n\n if found:\n try:\n root = parse_html(raw)\n except Exception:\n msg = 'Failed to parse amazon page for query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n matches = self.parse_results_page(root, domain)\n\n return matches, query, domain, None\n # }}}\n\n def search_search_engine(self, br, testing, log, abort, title, authors, identifiers, timeout, override_server=None): # {{{\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n terms, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers, for_amazon=False)\n site = self.referrer_for_domain(\n domain)[len('https://'):].partition('/')[0]\n matches = []\n server = override_server or self.server\n urlproc, sfunc = se.google_url_processor, se.google_search\n if server == 'bing':\n urlproc, sfunc = se.bing_url_processor, se.bing_search\n elif server == 'wayback':\n urlproc, sfunc = se.wayback_url_processor, se.ddg_search\n elif server == 'ddg':\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n try:\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n except HTTPError as err:\n if err.code == 429 and sfunc is se.google_search:\n log('Got too many requests error from Google, trying via DuckDuckGo')\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n else:\n raise\n\n br.set_current_header('Referer', qurl)\n for result in results:\n if abort.is_set():\n return matches, terms, domain, None\n\n purl = urlparse(result.url)\n if '/dp/' in purl.path and site in purl.netloc:\n url = result.cached_url\n if url is None:\n url = se.get_cached_url(result.url, br, timeout=timeout)\n if url is None:\n log('Failed to find cached page for:', result.url)\n continue\n if url not in matches:\n matches.append(url)\n if len(matches) >= 3:\n break\n else:\n log('Skipping non-book result:', result)\n if not matches:\n log('No search engine results for terms:', ' '.join(terms))\n if urlproc is se.google_url_processor:\n # Google does not cache adult titles\n log('Trying the bing search engine instead')\n return self.search_search_engine(br, testing, log, abort, title, authors, identifiers, timeout, 'bing')\n return matches, terms, domain, urlproc\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=60):\n '''\n Note this method will retry without identifiers automatically if no\n match is found with identifiers.\n '''\n\n testing = getattr(self, 'running_a_test', False)\n\n udata = self._get_book_url(identifiers)\n br = self.browser\n log('User-agent:', br.current_user_agent())\n log('Server:', self.server)\n if testing:\n print('User-agent:', br.current_user_agent())\n if udata is not None and not self.use_search_engine:\n # Try to directly get details page instead of running a search\n # Cannot use search engine as the directly constructed URL is\n # usually redirected to a full URL by amazon, and is therefore\n # not cached\n domain, idtype, asin, durl = udata\n if durl is not None:\n preparsed_root = parse_details_page(\n durl, log, timeout, br, domain)\n if preparsed_root is not None:\n qasin = parse_asin(preparsed_root[1], log, durl)\n if qasin == asin:\n w = Worker(durl, result_queue, br, log, 0, domain,\n self, testing=testing, preparsed_root=preparsed_root, timeout=timeout)\n try:\n w.get_details()\n return\n except Exception:\n log.exception(\n 'get_details failed for url: %r' % durl)\n func = self.search_search_engine if self.use_search_engine else self.search_amazon\n try:\n matches, query, domain, cover_url_processor = func(\n br, testing, log, abort, title, authors, identifiers, timeout)\n except SearchFailed:\n return\n\n if abort.is_set():\n return\n\n if not matches:\n if identifiers and title and authors:\n log('No matches found with identifiers, retrying using only'\n ' title and authors. Query: %r' % query)\n time.sleep(1)\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n log.error('No matches found with query: %r' % query)\n return\n\n if self.prefs['prefer_kindle_edition']:\n matches = sort_matches_preferring_kindle_editions(matches)\n\n workers = [Worker(\n url, result_queue, br, log, i, domain, self, testing=testing, timeout=timeout,\n cover_url_processor=cover_url_processor, filter_result=partial(\n self.filter_result, title, authors, identifiers)) for i, url in enumerate(matches)]\n\n for w in workers:\n # Don't send all requests at the same time\n time.sleep(1)\n w.start()\n if abort.is_set():\n return\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n return None\n # }}}\n\n def filter_result(self, title, authors, identifiers, mi, log): # {{{\n if not self.use_search_engine:\n return True\n if title is not None:\n\n def tokenize_title(x):\n return icu_lower(x).replace(\"'\", '').replace('\"', '').rstrip(':')\n\n tokens = {tokenize_title(x) for x in title.split() if len(x) > 3}\n if tokens:\n result_tokens = {tokenize_title(x) for x in mi.title.split()}\n if not tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'as its title does not match')\n return False\n if authors:\n author_tokens = set()\n for author in authors:\n author_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n result_tokens = set()\n for author in mi.authors:\n result_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n if author_tokens and not author_tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'by', ' & '.join(mi.authors), 'as its author does not match')\n return False\n return True\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=60, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n log('Downloading cover from:', cached_url)\n br = self.browser\n if self.use_search_engine:\n br = br.clone_browser()\n br.set_current_header('Referer', self.referrer_for_domain(self.domain))\n try:\n time.sleep(1)\n cdata = br.open_novisit(\n cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\ndef manual_tests(domain, **kw): # {{{\n # To run these test use:\n # calibre-debug -c \"from calibre.ebooks.metadata.sources.amazon import *; manual_tests('com')\"\n from calibre.ebooks.metadata.sources.test import (test_identify_plugin,\n isbn_test, title_test, authors_test, comments_test, series_test)\n all_tests = {}\n all_tests['com'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus',\n exact=True), series_test('The Heroes of Olympus', 5)]\n ),\n\n ( # Kindle edition with series\n {'identifiers': {'amazon': 'B0085UEQDO'}},\n [title_test('Three Parts Dead', exact=True),\n series_test('Craft Sequence', 1)]\n ),\n\n ( # + in title and uses id=\"main-image\" for cover\n {'identifiers': {'amazon': '1933988770'}},\n [title_test(\n 'C++ Concurrency in Action: Practical Multithreading', exact=True)]\n ),\n\n\n ( # Different comments markup, using Book Description section\n {'identifiers': {'amazon': '0982514506'}},\n [title_test(\n \"Griffin's Destiny: Book Three: The Griffin's Daughter Trilogy\",\n exact=True),\n comments_test('Jelena'), comments_test('Ashinji'),\n ]\n ),\n\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C#'),\n authors_test(['Rockford Lhotka'])\n ]\n ),\n\n ( # No specific problems\n {'identifiers': {'isbn': '0743273567'}},\n [title_test('the great gatsby: the only authorized edition', exact=True),\n authors_test(['Francis Scott Fitzgerald'])]\n ),\n\n ]\n\n # }}}\n\n all_tests['de'] = [ # {{{\n # series\n (\n {'identifiers': {'isbn': '3499275120'}},\n [title_test('Vespasian: Das Schwert des Tribuns: Historischer Roman',\n exact=False), authors_test(['Robert Fabbri']), series_test('Die Vespasian-Reihe', 1)\n ]\n\n ),\n\n ( # umlaut in title/authors\n {'title': 'Flüsternde Wälder',\n 'authors': ['Nicola Förg']},\n [title_test('Flüsternde Wälder'),\n authors_test(['Nicola Förg'], subset=True)\n ]\n ),\n\n (\n {'identifiers': {'isbn': '9783453314979'}},\n [title_test('Die letzten Wächter: Roman',\n exact=False), authors_test(['Sergej Lukianenko'])\n ]\n\n ),\n\n (\n {'identifiers': {'isbn': '3548283519'}},\n [title_test('Wer Wind Sät: Der Fünfte Fall Für Bodenstein Und Kirchhoff',\n exact=False), authors_test(['Nele Neuhaus'])\n ]\n\n ),\n ] # }}}\n\n all_tests['it'] = [ # {{{\n (\n {'identifiers': {'isbn': '8838922195'}},\n [title_test('La briscola in cinque',\n exact=True), authors_test(['Marco Malvaldi'])\n ]\n\n ),\n ] # }}}\n\n all_tests['fr'] = [ # {{{\n (\n {'identifiers': {'amazon_fr': 'B07L7ST4RS'}},\n [title_test('Le secret de Lola', exact=True),\n authors_test(['Amélie BRIZIO'])\n ]\n ),\n (\n {'identifiers': {'isbn': '2221116798'}},\n [title_test('L\\'étrange voyage de Monsieur Daldry',\n exact=True), authors_test(['Marc Levy'])\n ]\n\n ),\n ] # }}}\n\n all_tests['es'] = [ # {{{\n (\n {'identifiers': {'isbn': '8483460831'}},\n [title_test('Tiempos Interesantes',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['se'] = [ # {{{\n (\n {'identifiers': {'isbn': '9780552140287'}},\n [title_test('Men At Arms: A Discworld Novel: 14',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['jp'] = [ # {{{\n ( # Adult filtering test\n {'identifiers': {'isbn': '4799500066'}},\n [title_test('Bitch Trap'), ]\n ),\n\n ( # isbn -> title, authors\n {'identifiers': {'isbn': '9784101302720'}},\n [title_test('精霊の守り人',\n exact=True), authors_test(['上橋 菜穂子'])\n ]\n ),\n ( # title, authors -> isbn (will use Shift_JIS encoding in query.)\n {'title': '考えない練習',\n 'authors': ['小池 龍之介']},\n [isbn_test('9784093881067'), ]\n ),\n ] # }}}\n\n all_tests['br'] = [ # {{{\n (\n {'title': 'Guerra dos Tronos'},\n [title_test('A Guerra dos Tronos - As Crônicas de Gelo e Fogo',\n exact=True), authors_test(['George R. R. Martin'])\n ]\n\n ),\n ] # }}}\n\n all_tests['nl'] = [ # {{{\n (\n {'title': 'Freakonomics'},\n [title_test('Freakonomics',\n exact=True), authors_test(['Steven Levitt & Stephen Dubner & R. Kuitenbrouwer & O. Brenninkmeijer & A. van Den Berg'])\n ]\n\n ),\n ] # }}}\n\n all_tests['cn'] = [ # {{{\n (\n {'identifiers': {'isbn': '9787115369512'}},\n [title_test('若为自由故 自由软件之父理查德斯托曼传', exact=True),\n authors_test(['[美]sam Williams', '邓楠,李凡希'])]\n ),\n (\n {'title': '爱上Raspberry Pi'},\n [title_test('爱上Raspberry Pi',\n exact=True), authors_test(['Matt Richardson', 'Shawn Wallace', '李凡希'])\n ]\n\n ),\n ] # }}}\n\n all_tests['ca'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'isbn': '9781623808747'}},\n [title_test('Parting Shot', exact=True),\n authors_test(['Mary Calmes'])]\n ),\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C# 2008 Business Objects'),\n authors_test(['Rockford Lhotka'])]\n ),\n ( # noscript description\n {'identifiers': {'amazon_ca': '162380874X'}},\n [title_test('Parting Shot', exact=True), authors_test(['Mary Calmes'])\n ]\n ),\n ] # }}}\n\n all_tests['in'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon_in': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus', exact=True)]\n ),\n ] # }}}\n\n def do_test(domain, start=0, stop=None, server='auto'):\n tests = all_tests[domain]\n if stop is None:\n stop = len(tests)\n tests = tests[start:stop]\n test_identify_plugin(Amazon.name, tests, modify_plugin=lambda p: (\n setattr(p, 'testing_domain', domain),\n setattr(p, 'touched_fields', p.touched_fields - {'tags'}),\n setattr(p, 'testing_server', server),\n ))\n\n do_test(domain, **kw)\n# }}}\n", - "big_book_search": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Source, Option\n\n\ndef get_urls(br, tokens):\n from urllib.parse import quote_plus\n from html5_parser import parse\n escaped = (quote_plus(x) for x in tokens if x and x.strip())\n q = '+'.join(escaped)\n url = 'https://bigbooksearch.com/please-dont-scrape-my-site-you-will-put-my-api-key-over-the-usage-limit-and-the-site-will-break/books/'+q\n raw = br.open(url).read()\n root = parse(raw.decode('utf-8'))\n urls = [i.get('src') for i in root.xpath('//img[@src]')]\n return urls\n\n\nclass BigBookSearch(Source):\n\n name = 'Big Book Search'\n version = (1, 0, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads multiple book covers from Amazon. Useful to find alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the search result')),\n )\n supports_gzip_transfer_encoding = True\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n br = self.browser\n tokens = tuple(self.get_title_tokens(title)) + tuple(self.get_author_tokens(authors))\n urls = get_urls(br, tokens)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n\ndef test():\n from calibre import browser\n import pprint\n br = browser()\n urls = get_urls(br, ['consider', 'phlebas', 'banks'])\n pprint.pprint(urls)\n\n\nif __name__ == '__main__':\n test()\n", - "edelweiss": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nimport time, re\nfrom threading import Thread\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, random_user_agent\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\ndef clean_html(raw):\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n return clean_ascii_chars(xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True, assume_utf8=True)[0])\n\n\ndef parse_html(raw):\n raw = clean_html(raw)\n from html5_parser import parse\n return parse(raw)\n\n\ndef astext(node):\n from lxml import etree\n return etree.tostring(node, method='text', encoding='unicode',\n with_tail=False).strip()\n\n\nclass Worker(Thread): # {{{\n\n def __init__(self, basic_data, relevance, result_queue, br, timeout, log, plugin):\n Thread.__init__(self)\n self.daemon = True\n self.basic_data = basic_data\n self.br, self.log, self.timeout = br, log, timeout\n self.result_queue, self.plugin, self.sku = result_queue, plugin, self.basic_data['sku']\n self.relevance = relevance\n\n def run(self):\n url = ('https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/product/two_Enhanced.ascx&'\n 'sku={0}&idPrefix=content_1_{0}&mode=0'.format(self.sku))\n try:\n raw = self.br.open_novisit(url, timeout=self.timeout).read()\n except:\n self.log.exception('Failed to load comments page: %r'%url)\n return\n\n try:\n mi = self.parse(raw)\n mi.source_relevance = self.relevance\n self.plugin.clean_downloaded_metadata(mi)\n self.result_queue.put(mi)\n except:\n self.log.exception('Failed to parse details for sku: %s'%self.sku)\n\n def parse(self, raw):\n from calibre.ebooks.metadata.book.base import Metadata\n from calibre.utils.date import UNDEFINED_DATE\n root = parse_html(raw)\n mi = Metadata(self.basic_data['title'], self.basic_data['authors'])\n\n # Identifiers\n if self.basic_data['isbns']:\n mi.isbn = self.basic_data['isbns'][0]\n mi.set_identifier('edelweiss', self.sku)\n\n # Tags\n if self.basic_data['tags']:\n mi.tags = self.basic_data['tags']\n mi.tags = [t[1:].strip() if t.startswith('&') else t for t in mi.tags]\n\n # Publisher\n mi.publisher = self.basic_data['publisher']\n\n # Pubdate\n if self.basic_data['pubdate'] and self.basic_data['pubdate'].year != UNDEFINED_DATE:\n mi.pubdate = self.basic_data['pubdate']\n\n # Rating\n if self.basic_data['rating']:\n mi.rating = self.basic_data['rating']\n\n # Comments\n comments = ''\n for cid in ('summary', 'contributorbio', 'quotes_reviews'):\n cid = 'desc_{}{}-content'.format(cid, self.sku)\n div = root.xpath('//*[@id=\"{}\"]'.format(cid))\n if div:\n comments += self.render_comments(div[0])\n if comments:\n mi.comments = comments\n\n mi.has_cover = self.plugin.cached_identifier_to_cover_url(self.sku) is not None\n return mi\n\n def render_comments(self, desc):\n from lxml import etree\n from calibre.library.comments import sanitize_comments_html\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = etree.tostring(desc, method='html', encoding='unicode').strip()\n\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove comments\n desc = re.sub(r'(?s)<!--.*?-->', '', desc)\n return sanitize_comments_html(desc)\n# }}}\n\n\ndef get_basic_data(browser, log, *skus):\n from calibre.utils.date import parse_only_date\n from mechanize import Request\n zeroes = ','.join('0' for sku in skus)\n data = {\n 'skus': ','.join(skus),\n 'drc': zeroes,\n 'startPosition': '0',\n 'sequence': '1',\n 'selected': zeroes,\n 'itemID': '0',\n 'orderID': '0',\n 'mailingID': '',\n 'tContentWidth': '926',\n 'originalOrder': ','.join(type('')(i) for i in range(len(skus))),\n 'selectedOrderID': '0',\n 'selectedSortColumn': '0',\n 'listType': '1',\n 'resultType': '32',\n 'blockView': '1',\n }\n items_data_url = 'https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/listviews/ListView_Title_Multi.ascx'\n req = Request(items_data_url, data)\n response = browser.open_novisit(req)\n raw = response.read()\n root = parse_html(raw)\n for item in root.xpath('//div[@data-priority]'):\n row = item.getparent().getparent()\n sku = item.get('id').split('-')[-1]\n isbns = [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_sku\")]/text()')[0].split(',') if check_isbn(x.strip())]\n isbns.sort(key=len, reverse=True)\n try:\n tags = [x.strip() for x in astext(row.xpath('descendant::*[contains(@class, \"pev_categories\")]')[0]).split('/')]\n except IndexError:\n tags = []\n rating = 0\n for bar in row.xpath('descendant::*[contains(@class, \"bgdColorCommunity\")]/@style'):\n m = re.search(r'width: (\\d+)px;.*max-width: (\\d+)px', bar)\n if m is not None:\n rating = float(m.group(1)) / float(m.group(2))\n break\n try:\n pubdate = parse_only_date(astext(row.xpath('descendant::*[contains(@class, \"pev_shipDate\")]')[0]\n ).split(':')[-1].split(u'\\xa0')[-1].strip(), assume_utc=True)\n except Exception:\n log.exception('Error parsing published date')\n pubdate = None\n authors = []\n for x in [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_contributor\")]/@title')]:\n authors.extend(a.strip() for a in x.split(','))\n entry = {\n 'sku': sku,\n 'cover': row.xpath('descendant::img/@src')[0].split('?')[0],\n 'publisher': astext(row.xpath('descendant::*[contains(@class, \"headerPublisher\")]')[0]),\n 'title': astext(row.xpath('descendant::*[@id=\"title_{}\"]'.format(sku))[0]),\n 'authors': authors,\n 'isbns': isbns,\n 'tags': tags,\n 'pubdate': pubdate,\n 'format': ' '.join(row.xpath('descendant::*[contains(@class, \"pev_format\")]/text()')).strip(),\n 'rating': rating,\n }\n if entry['cover'].startswith('/'):\n entry['cover'] = None\n yield entry\n\n\nclass Edelweiss(Source):\n\n name = 'Edelweiss'\n version = (2, 0, 1)\n minimum_calibre_version = (3, 6, 0)\n description = _('Downloads metadata and covers from Edelweiss - A catalog updated by book publishers')\n\n capabilities = frozenset(['identify', 'cover'])\n touched_fields = frozenset([\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:edelweiss', 'rating'])\n supports_gzip_transfer_encoding = True\n has_html_comments = True\n\n @property\n def user_agent(self):\n # Pass in an index to random_user_agent() to test with a particular\n # user agent\n return random_user_agent(allow_ie=False)\n\n def _get_book_url(self, sku):\n if sku:\n return 'https://www.edelweiss.plus/#sku={}&page=1'.format(sku)\n\n def get_book_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if sku:\n return 'edelweiss', sku, self._get_book_url(sku)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if not sku:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n sku = self.cached_isbn_to_identifier(isbn)\n return self.cached_identifier_to_cover_url(sku)\n # }}}\n\n def create_query(self, log, title=None, authors=None, identifiers={}):\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n import time\n BASE_URL = ('https://www.edelweiss.plus/GetTreelineControl.aspx?'\n 'controlName=/uc/listviews/controls/ListView_data.ascx&itemID=0&resultType=32&dashboardType=8&itemType=1&dataType=products&keywordSearch&')\n keywords = []\n isbn = check_isbn(identifiers.get('isbn', None))\n if isbn is not None:\n keywords.append(isbn)\n elif title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n keywords.extend(title_tokens)\n author_tokens = self.get_author_tokens(authors, only_first_author=True)\n if author_tokens:\n keywords.extend(author_tokens)\n if not keywords:\n return None\n params = {\n 'q': (' '.join(keywords)).encode('utf-8'),\n '_': type('')(int(time.time()))\n }\n return BASE_URL+urlencode(params)\n\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=30):\n import json\n\n br = self.browser\n br.addheaders = [\n ('Referer', 'https://www.edelweiss.plus/'),\n ('X-Requested-With', 'XMLHttpRequest'),\n ('Cache-Control', 'no-cache'),\n ('Pragma', 'no-cache'),\n ]\n if 'edelweiss' in identifiers:\n items = [identifiers['edelweiss']]\n else:\n log.error('Currently Edelweiss returns random books for search queries')\n return\n query = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n log('Using query URL:', query)\n try:\n raw = br.open(query, timeout=timeout).read().decode('utf-8')\n except Exception as e:\n log.exception('Failed to make identify query: %r'%query)\n return as_unicode(e)\n items = re.search(r'window[.]items\\s*=\\s*(.+?);', raw)\n if items is None:\n log.error('Failed to get list of matching items')\n log.debug('Response text:')\n log.debug(raw)\n return\n items = json.loads(items.group(1))\n\n if (not items and identifiers and title and authors and\n not abort.is_set()):\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n\n if not items:\n return\n\n workers = []\n items = items[:5]\n for i, item in enumerate(get_basic_data(self.browser, log, *items)):\n sku = item['sku']\n for isbn in item['isbns']:\n self.cache_isbn_to_identifier(isbn, sku)\n if item['cover']:\n self.cache_identifier_to_cover_url(sku, item['cover'])\n fmt = item['format'].lower()\n if 'audio' in fmt or 'mp3' in fmt:\n continue # Audio-book, ignore\n workers.append(Worker(item, i, result_queue, br.clone_browser(), timeout, log, self))\n\n if not workers:\n return\n\n for w in workers:\n w.start()\n # Don't send all requests at the same time\n time.sleep(0.1)\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n br = self.browser\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\nif __name__ == '__main__':\n from calibre.ebooks.metadata.sources.test import (\n test_identify_plugin, title_test, authors_test, comments_test, pubdate_test)\n tests = [\n ( # A title and author search\n {'title': 'The Husband\\'s Secret', 'authors':['Liane Moriarty']},\n [title_test('The Husband\\'s Secret', exact=True),\n authors_test(['Liane Moriarty'])]\n ),\n\n ( # An isbn present in edelweiss\n {'identifiers':{'isbn': '9780312621360'}, },\n [title_test('Flame: A Sky Chasers Novel', exact=True),\n authors_test(['Amy Kathleen Ryan'])]\n ),\n\n # Multiple authors and two part title and no general description\n ({'identifiers':{'edelweiss':'0321180607'}},\n [title_test(\n \"XQuery From the Experts: A Guide to the W3C XML Query Language\"\n , exact=True), authors_test([\n 'Howard Katz', 'Don Chamberlin', 'Denise Draper', 'Mary Fernandez',\n 'Michael Kay', 'Jonathan Robie', 'Michael Rys', 'Jerome Simeon',\n 'Jim Tivy', 'Philip Wadler']), pubdate_test(2003, 8, 22),\n comments_test('Jérôme Siméon'), lambda mi: bool(mi.comments and 'No title summary' not in mi.comments)\n ]),\n ]\n start, stop = 0, len(tests)\n\n tests = tests[start:stop]\n test_identify_plugin(Edelweiss.name, tests)\n", - "google": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __future__ import absolute_import, division, print_function, unicode_literals\nimport hashlib\nimport os\nimport re\nimport regex\nimport sys\nimport tempfile\nimport time\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, replace_entities, prepare_string_for_xml\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.ebooks.metadata import authors_to_string, check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Source\nfrom calibre.utils.cleantext import clean_ascii_chars\nfrom calibre.utils.localization import canonicalize_lang\n\nNAMESPACES = {\n 'openSearch': 'http://a9.com/-/spec/opensearchrss/1.0/',\n 'atom': 'http://www.w3.org/2005/Atom',\n 'dc': 'http://purl.org/dc/terms',\n 'gd': 'http://schemas.google.com/g/2005'\n}\n\n\ndef pretty_google_books_comments(raw):\n raw = replace_entities(raw)\n # Paragraphs in the comments are removed but whatever software googl uses\n # to do this does not insert a space so we often find the pattern\n # word.Capital in the comments which can be used to find paragraph markers.\n parts = []\n for x in re.split(r'([a-z)\"”])(\\.)([A-Z(\"“])', raw):\n if x == '.':\n parts.append('.</p>\\n\\n<p>')\n else:\n parts.append(prepare_string_for_xml(x))\n raw = '<p>' + ''.join(parts) + '</p>'\n return raw\n\n\ndef get_details(browser, url, timeout): # {{{\n try:\n raw = browser.open_novisit(url, timeout=timeout).read()\n except Exception as e:\n gc = getattr(e, 'getcode', lambda: -1)\n if gc() != 403:\n raise\n # Google is throttling us, wait a little\n time.sleep(2)\n raw = browser.open_novisit(url, timeout=timeout).read()\n\n return raw\n\n\n# }}}\n\nxpath_cache = {}\n\n\ndef XPath(x):\n ans = xpath_cache.get(x)\n if ans is None:\n from lxml import etree\n ans = xpath_cache[x] = etree.XPath(x, namespaces=NAMESPACES)\n return ans\n\n\ndef to_metadata(browser, log, entry_, timeout, running_a_test=False): # {{{\n from lxml import etree\n\n # total_results = XPath('//openSearch:totalResults')\n # start_index = XPath('//openSearch:startIndex')\n # items_per_page = XPath('//openSearch:itemsPerPage')\n entry = XPath('//atom:entry')\n entry_id = XPath('descendant::atom:id')\n url = XPath('descendant::atom:link[@rel=\"self\"]/@href')\n creator = XPath('descendant::dc:creator')\n identifier = XPath('descendant::dc:identifier')\n title = XPath('descendant::dc:title')\n date = XPath('descendant::dc:date')\n publisher = XPath('descendant::dc:publisher')\n subject = XPath('descendant::dc:subject')\n description = XPath('descendant::dc:description')\n language = XPath('descendant::dc:language')\n\n # print(etree.tostring(entry_, pretty_print=True))\n\n def get_text(extra, x):\n try:\n ans = x(extra)\n if ans:\n ans = ans[0].text\n if ans and ans.strip():\n return ans.strip()\n except:\n log.exception('Programming error:')\n return None\n\n def get_extra_details():\n raw = get_details(browser, details_url, timeout)\n if running_a_test:\n with open(os.path.join(tempfile.gettempdir(), 'Google-' + details_url.split('/')[-1] + '.xml'), 'wb') as f:\n f.write(raw)\n print('Book details saved to:', f.name, file=sys.stderr)\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return entry(feed)[0]\n\n if isinstance(entry_, str):\n google_id = entry_\n details_url = 'https://www.google.com/books/feeds/volumes/' + google_id\n extra = get_extra_details()\n title_ = ': '.join([x.text for x in title(extra)]).strip()\n authors = [x.text.strip() for x in creator(extra) if x.text]\n else:\n id_url = entry_id(entry_)[0].text\n google_id = id_url.split('/')[-1]\n details_url = url(entry_)[0]\n title_ = ': '.join([x.text for x in title(entry_)]).strip()\n authors = [x.text.strip() for x in creator(entry_) if x.text]\n if not id_url or not title:\n # Silently discard this entry\n return None\n extra = None\n\n if not authors:\n authors = [_('Unknown')]\n if not title:\n return None\n if extra is None:\n extra = get_extra_details()\n mi = Metadata(title_, authors)\n mi.identifiers = {'google': google_id}\n mi.comments = get_text(extra, description)\n lang = canonicalize_lang(get_text(extra, language))\n if lang:\n mi.language = lang\n mi.publisher = get_text(extra, publisher)\n\n # ISBN\n isbns = []\n for x in identifier(extra):\n t = type('')(x.text).strip()\n if t[:5].upper() in ('ISBN:', 'LCCN:', 'OCLC:'):\n if t[:5].upper() == 'ISBN:':\n t = check_isbn(t[5:])\n if t:\n isbns.append(t)\n if isbns:\n mi.isbn = sorted(isbns, key=len)[-1]\n mi.all_isbns = isbns\n\n # Tags\n try:\n btags = [x.text for x in subject(extra) if x.text]\n tags = []\n for t in btags:\n atags = [y.strip() for y in t.split('/')]\n for tag in atags:\n if tag not in tags:\n tags.append(tag)\n except:\n log.exception('Failed to parse tags:')\n tags = []\n if tags:\n mi.tags = [x.replace(',', ';') for x in tags]\n\n # pubdate\n pubdate = get_text(extra, date)\n if pubdate:\n from calibre.utils.date import parse_date, utcnow\n try:\n default = utcnow().replace(day=15)\n mi.pubdate = parse_date(pubdate, assume_utc=True, default=default)\n except:\n log.error('Failed to parse pubdate %r' % pubdate)\n\n # Cover\n mi.has_google_cover = None\n for x in extra.xpath(\n '//*[@href and @rel=\"http://schemas.google.com/books/2008/thumbnail\"]'\n ):\n mi.has_google_cover = x.get('href')\n break\n\n return mi\n\n\n# }}}\n\n\nclass GoogleBooks(Source):\n\n name = 'Google'\n version = (1, 1, 0)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads metadata and covers from Google Books')\n\n capabilities = frozenset({'identify'})\n touched_fields = frozenset({\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:google', 'languages'\n })\n supports_gzip_transfer_encoding = True\n cached_cover_url_is_reliable = False\n\n GOOGLE_COVER = 'https://books.google.com/books?id=%s&printsec=frontcover&img=1'\n\n DUMMY_IMAGE_MD5 = frozenset(\n ('0de4383ebad0adad5eeb8975cd796657', 'a64fa89d7ebc97075c1d363fc5fea71f')\n )\n\n def get_book_url(self, identifiers): # {{{\n goog = identifiers.get('google', None)\n if goog is not None:\n return ('google', goog, 'https://books.google.com/books?id=%s' % goog)\n # }}}\n\n def id_from_url(self, url): # {{{\n from polyglot.urllib import parse_qs, urlparse\n purl = urlparse(url)\n if purl.netloc == 'books.google.com':\n q = parse_qs(purl.query)\n gid = q.get('id')\n if gid:\n return 'google', gid[0]\n # }}}\n\n def create_query(self, title=None, authors=None, identifiers={}, capitalize_isbn=False): # {{{\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n BASE_URL = 'https://books.google.com/books/feeds/volumes?'\n isbn = check_isbn(identifiers.get('isbn', None))\n q = ''\n if isbn is not None:\n q += ('ISBN:' if capitalize_isbn else 'isbn:') + isbn\n elif title or authors:\n\n def build_term(prefix, parts):\n return ' '.join('in' + prefix + ':' + x for x in parts)\n\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += build_term('title', title_tokens)\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += ('+' if q else '') + build_term('author', author_tokens)\n\n if not q:\n return None\n if not isinstance(q, bytes):\n q = q.encode('utf-8')\n return BASE_URL + urlencode({\n 'q': q,\n 'max-results': 20,\n 'start-index': 1,\n 'min-viewability': 'none',\n })\n\n # }}}\n\n def download_cover( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30,\n get_best_cover=False\n ):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(\n log,\n rq,\n abort,\n title=title,\n authors=authors,\n identifiers=identifiers\n )\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(\n key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers\n )\n )\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n br = self.browser\n for candidate in (0, 1):\n if abort.is_set():\n return\n url = cached_url + '&zoom={}'.format(candidate)\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(url, timeout=timeout).read()\n if cdata:\n if hashlib.md5(cdata).hexdigest() in self.DUMMY_IMAGE_MD5:\n log.warning('Google returned a dummy image, ignoring')\n else:\n result_queue.put((self, cdata))\n break\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n goog = identifiers.get('google', None)\n if goog is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n goog = self.cached_isbn_to_identifier(isbn)\n if goog is not None:\n url = self.cached_identifier_to_cover_url(goog)\n\n return url\n\n # }}}\n\n def postprocess_downloaded_google_metadata(self, ans, relevance=0): # {{{\n if not isinstance(ans, Metadata):\n return ans\n ans.source_relevance = relevance\n goog = ans.identifiers['google']\n for isbn in getattr(ans, 'all_isbns', []):\n self.cache_isbn_to_identifier(isbn, goog)\n if getattr(ans, 'has_google_cover', False):\n self.cache_identifier_to_cover_url(goog, self.GOOGLE_COVER % goog)\n if ans.comments:\n ans.comments = pretty_google_books_comments(ans.comments)\n self.clean_downloaded_metadata(ans)\n return ans\n # }}}\n\n def get_all_details( # {{{\n self,\n br,\n log,\n entries,\n abort,\n result_queue,\n timeout\n ):\n from lxml import etree\n for relevance, i in enumerate(entries):\n try:\n ans = self.postprocess_downloaded_google_metadata(to_metadata(br, log, i, timeout, self.running_a_test), relevance)\n if isinstance(ans, Metadata):\n result_queue.put(ans)\n except Exception:\n log.exception(\n 'Failed to get metadata for identify entry:', etree.tostring(i)\n )\n if abort.is_set():\n break\n\n # }}}\n\n def identify_via_web_search( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n isbn = check_isbn(identifiers.get('isbn', None))\n q = []\n strip_punc_pat = regex.compile(r'[\\p{C}|\\p{M}|\\p{P}|\\p{S}|\\p{Z}]+', regex.UNICODE)\n google_ids = []\n check_tokens = set()\n has_google_id = 'google' in identifiers\n\n def to_check_tokens(*tokens):\n for t in tokens:\n if len(t) < 3:\n continue\n t = t.lower()\n if t in ('and', 'not', 'the'):\n continue\n yield strip_punc_pat.sub('', t)\n\n if has_google_id:\n google_ids.append(identifiers['google'])\n elif isbn is not None:\n q.append(isbn)\n elif title or authors:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += title_tokens\n check_tokens |= set(to_check_tokens(*title_tokens))\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += author_tokens\n check_tokens |= set(to_check_tokens(*author_tokens))\n if not q and not google_ids:\n return None\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n br = se.google_specialize_browser(se.browser())\n if not has_google_id:\n url = se.google_format_query(q, tbm='bks')\n log('Making query:', url)\n r = []\n root = se.query(br, url, 'google', timeout=timeout, save_raw=r.append)\n pat = re.compile(r'id=([^&]+)')\n for q in se.google_parse_results(root, r[0], log=log, ignore_uncached=False):\n m = pat.search(q.url)\n if m is None or not q.url.startswith('https://books.google'):\n continue\n google_ids.append(m.group(1))\n\n if not google_ids and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n found = False\n seen = set()\n for relevance, gid in enumerate(google_ids):\n if gid in seen:\n continue\n seen.add(gid)\n try:\n ans = to_metadata(br, log, gid, timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n if isbn:\n if isbn not in ans.all_isbns:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the ISBN:', isbn,\n 'not in', ' '.join(ans.all_isbns))\n continue\n elif check_tokens:\n candidate = set(to_check_tokens(*self.get_title_tokens(ans.title)))\n candidate |= set(to_check_tokens(*self.get_author_tokens(ans.authors)))\n if candidate.intersection(check_tokens) != check_tokens:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the query')\n continue\n ans = self.postprocess_downloaded_google_metadata(ans, relevance)\n result_queue.put(ans)\n found = True\n except:\n log.exception('Failed to get metadata for google books id:', gid)\n if abort.is_set():\n break\n if not found and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n # }}}\n\n def identify( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from lxml import etree\n entry = XPath('//atom:entry')\n identifiers = identifiers.copy()\n br = self.browser\n if 'google' in identifiers:\n try:\n ans = to_metadata(br, log, identifiers['google'], timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n self.postprocess_downloaded_google_metadata(ans)\n result_queue.put(ans)\n return\n except Exception:\n log.exception('Failed to get metadata for Google identifier:', identifiers['google'])\n del identifiers['google']\n\n query = self.create_query(\n title=title, authors=authors, identifiers=identifiers\n )\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n\n def make_query(query):\n log('Making query:', query)\n try:\n raw = br.open_novisit(query, timeout=timeout).read()\n except Exception as e:\n log.exception('Failed to make identify query: %r' % query)\n return False, as_unicode(e)\n\n try:\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return True, entry(feed)\n except Exception as e:\n log.exception('Failed to parse identify results')\n return False, as_unicode(e)\n ok, entries = make_query(query)\n if not ok:\n return entries\n if not entries and not abort.is_set():\n log('No results found, doing a web search instead')\n return self.identify_via_web_search(log, result_queue, abort, title, authors, identifiers, timeout)\n\n # There is no point running these queries in threads as google\n # throttles requests returning 403 Forbidden errors\n self.get_all_details(br, log, entries, abort, result_queue, timeout)\n\n # }}}\n\n\nif __name__ == '__main__': # tests {{{\n # To run these test use:\n # calibre-debug src/calibre/ebooks/metadata/sources/google.py\n from calibre.ebooks.metadata.sources.test import (\n authors_test, test_identify_plugin, title_test\n )\n tests = [\n ({\n 'identifiers': {'google': 's7NIrgEACAAJ'},\n }, [title_test('Ride Every Stride', exact=False)]),\n\n ({\n 'identifiers': {'isbn': '0743273567'},\n 'title': 'Great Gatsby',\n 'authors': ['Fitzgerald']\n }, [\n title_test('The great gatsby', exact=True),\n authors_test(['F. Scott Fitzgerald'])\n ]),\n\n ({\n 'title': 'Flatland',\n 'authors': ['Abbott']\n }, [title_test('Flatland', exact=False)]),\n\n ({\n 'title': 'The Blood Red Indian Summer: A Berger and Mitry Mystery',\n 'authors': ['David Handler'],\n }, [title_test('The Blood Red Indian Summer: A Berger and Mitry Mystery')\n ]),\n\n ({\n # requires using web search to find the book\n 'title': 'Dragon Done It',\n 'authors': ['Eric Flint'],\n }, [\n title_test('The dragon done it', exact=True),\n authors_test(['Eric Flint', 'Mike Resnick'])\n ]),\n\n ]\n test_identify_plugin(GoogleBooks.name, tests[:])\n\n# }}}\n", - "google_images": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom collections import OrderedDict\n\nfrom calibre import random_user_agent\nfrom calibre.ebooks.metadata.sources.base import Source, Option\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef imgurl_from_id(raw, tbnid):\n from json import JSONDecoder\n q = '\"{}\",['.format(tbnid)\n start_pos = raw.index(q)\n if start_pos < 100:\n return\n jd = JSONDecoder()\n data = jd.raw_decode('[' + raw[start_pos:])[0]\n # from pprint import pprint\n # pprint(data)\n url_num = 0\n for x in data:\n if isinstance(x, list) and len(x) == 3:\n q = x[0]\n if hasattr(q, 'lower') and q.lower().startswith('http'):\n url_num += 1\n if url_num > 1:\n return q\n\n\nclass GoogleImages(Source):\n\n name = 'Google Images'\n version = (1, 0, 3)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from a Google Image search. Useful to find larger/alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n supports_gzip_transfer_encoding = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the Google search result')),\n Option('size', 'choices', 'svga', _('Cover size'),\n _('Search for covers larger than the specified size'),\n choices=OrderedDict((\n ('any', _('Any size'),),\n ('l', _('Large'),),\n ('qsvga', _('Larger than %s')%'400x300',),\n ('vga', _('Larger than %s')%'640x480',),\n ('svga', _('Larger than %s')%'600x800',),\n ('xga', _('Larger than %s')%'1024x768',),\n ('2mp', _('Larger than %s')%'2 MP',),\n ('4mp', _('Larger than %s')%'4 MP',),\n ))),\n )\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n timeout = max(60, timeout) # Needs at least a minute\n title = ' '.join(self.get_title_tokens(title))\n author = ' '.join(self.get_author_tokens(authors))\n urls = self.get_image_urls(title, author, log, abort, timeout)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n @property\n def user_agent(self):\n return random_user_agent(allow_ie=False)\n\n def get_image_urls(self, title, author, log, abort, timeout):\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n from collections import OrderedDict\n ans = OrderedDict()\n br = self.browser\n q = urlencode({'as_q': ('%s %s'%(title, author)).encode('utf-8')})\n if isinstance(q, bytes):\n q = q.decode('utf-8')\n sz = self.prefs['size']\n if sz == 'any':\n sz = ''\n elif sz == 'l':\n sz = 'isz:l,'\n else:\n sz = 'isz:lt,islt:%s,' % sz\n # See https://www.google.com/advanced_image_search to understand this\n # URL scheme\n url = 'https://www.google.com/search?as_st=y&tbm=isch&{}&as_epq=&as_oq=&as_eq=&cr=&as_sitesearch=&safe=images&tbs={}iar:t,ift:jpg'.format(q, sz)\n log('Search URL: ' + url)\n br.set_simple_cookie('CONSENT', 'YES+', '.google.com', path='/')\n raw = clean_ascii_chars(br.open(url).read().decode('utf-8'))\n root = parse_html(raw)\n results = root.xpath('//div/@data-tbnid') # could also use data-id\n # from calibre.utils.ipython import ipython\n # ipython({'root': root, 'raw': raw, 'url': url, 'results': results})\n for tbnid in results:\n try:\n imgurl = imgurl_from_id(raw, tbnid)\n except Exception:\n continue\n if imgurl:\n ans[imgurl] = True\n return list(ans)\n\n\ndef test():\n try:\n from queue import Queue\n except ImportError:\n from Queue import Queue\n from threading import Event\n from calibre.utils.logging import default_log\n p = GoogleImages(None)\n p.log = default_log\n rq = Queue()\n p.download_cover(default_log, rq, Event(), title='The Heroes',\n authors=('Joe Abercrombie',))\n print('Downloaded', rq.qsize(), 'covers')\n\n\nif __name__ == '__main__':\n test()\n", + "amazon": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport re\nimport socket\nimport string\nimport time\nfrom functools import partial\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom threading import Thread\n\ntry:\n from urllib.parse import urlparse\nexcept ImportError:\n from urlparse import urlparse\n\nfrom mechanize import HTTPError\n\nfrom calibre import as_unicode, browser, random_user_agent, xml_replace_entities\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Option, Source, fixauthors, fixcase\nfrom calibre.ebooks.oeb.base import urlquote\nfrom calibre.utils.icu import lower as icu_lower\nfrom calibre.utils.localization import canonicalize_lang\nfrom calibre.utils.random_ua import accept_header_for_ua\n\n\ndef sort_matches_preferring_kindle_editions(matches):\n upos_map = {url:i for i, url in enumerate(matches)}\n\n def skey(url):\n opos = upos_map[url]\n parts = url.split('/')\n try:\n idx = parts.index('dp')\n except Exception:\n idx = -1\n if idx < 0 or idx + 1 >= len(parts) or not parts[idx+1].startswith('B'):\n return 1, opos\n return 0, opos\n matches.sort(key=skey)\n return matches\n\n\ndef iri_quote_plus(url):\n ans = urlquote(url)\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans.replace('%20', '+')\n\n\ndef user_agent_is_ok(ua):\n return 'Mobile/' not in ua and 'Mobile ' not in ua\n\n\nclass CaptchaError(Exception):\n pass\n\n\nclass SearchFailed(ValueError):\n pass\n\n\nclass UrlNotFound(ValueError):\n\n def __init__(self, url):\n ValueError.__init__(self, 'The URL {} was not found (HTTP 404)'.format(url))\n\n\nclass UrlTimedOut(ValueError):\n\n def __init__(self, url):\n ValueError.__init__(self, 'Timed out fetching {} try again later'.format(url))\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef parse_details_page(url, log, timeout, browser, domain):\n from lxml.html import tostring\n\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from calibre.ebooks.metadata.sources.update import search_engines_module\n get_data_for_cached_url = search_engines_module().get_data_for_cached_url\n except Exception:\n def get_data_for_cached_url(*a):\n return None\n raw = get_data_for_cached_url(url)\n if raw:\n log('Using cached details for url:', url)\n else:\n log('Downloading details from:', url)\n try:\n raw = browser.open_novisit(url, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and e.getcode() == 404:\n log.error('URL not found: %r' % url)\n raise UrlNotFound(url)\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = 'Details page timed out. Try again later.'\n log.error(msg)\n raise UrlTimedOut(url)\n else:\n msg = 'Failed to make details query: %r' % url\n log.exception(msg)\n raise ValueError('Could not make details query for {}'.format(url))\n\n oraw = raw\n if 'amazon.com.br' in url:\n # amazon.com.br serves utf-8 but has an incorrect latin1 <meta> tag\n raw = raw.decode('utf-8')\n raw = xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True)[0]\n if '<title>404 - ' in raw:\n raise ValueError('Got a 404 page for: %r' % url)\n if '>Could not find the requested document in the cache.<' in raw:\n raise ValueError('No cached entry for %s found' % url)\n\n try:\n root = parse_html(clean_ascii_chars(raw))\n except Exception:\n msg = 'Failed to parse amazon details page: %r' % url\n log.exception(msg)\n raise ValueError(msg)\n if domain == 'jp':\n for a in root.xpath('//a[@href]'):\n if ('black-curtain-redirect.html' in a.get('href')) or ('/black-curtain/save-eligibility/black-curtain' in a.get('href')):\n url = a.get('href')\n if url:\n if url.startswith('/'):\n url = 'https://amazon.co.jp' + a.get('href')\n log('Black curtain redirect found, following')\n return parse_details_page(url, log, timeout, browser, domain)\n\n errmsg = root.xpath('//*[@id=\"errorMessage\"]')\n if errmsg:\n msg = 'Failed to parse amazon details page: %r' % url\n msg += tostring(errmsg, method='text', encoding='unicode').strip()\n log.error(msg)\n raise ValueError(msg)\n\n from css_selectors import Select\n selector = Select(root)\n return oraw, root, selector\n\n\ndef parse_asin(root, log, url):\n try:\n link = root.xpath('//link[@rel=\"canonical\" and @href]')\n for l in link:\n return l.get('href').rpartition('/')[-1]\n except Exception:\n log.exception('Error parsing ASIN for url: %r' % url)\n\n\nclass Worker(Thread): # Get details {{{\n\n '''\n Get book details from amazons book page in a separate thread\n '''\n\n def __init__(self, url, result_queue, browser, log, relevance, domain,\n plugin, timeout=20, testing=False, preparsed_root=None,\n cover_url_processor=None, filter_result=None):\n Thread.__init__(self)\n self.cover_url_processor = cover_url_processor\n self.preparsed_root = preparsed_root\n self.daemon = True\n self.testing = testing\n self.url, self.result_queue = url, result_queue\n self.log, self.timeout = log, timeout\n self.filter_result = filter_result or (lambda x, log: True)\n self.relevance, self.plugin = relevance, plugin\n self.browser = browser\n self.cover_url = self.amazon_id = self.isbn = None\n self.domain = domain\n from lxml.html import tostring\n self.tostring = tostring\n\n months = { # {{{\n 'de': {\n 1: ['jän', 'januar'],\n 2: ['februar'],\n 3: ['märz'],\n 5: ['mai'],\n 6: ['juni'],\n 7: ['juli'],\n 10: ['okt', 'oktober'],\n 12: ['dez', 'dezember']\n },\n 'it': {\n 1: ['gennaio', 'enn'],\n 2: ['febbraio', 'febbr'],\n 3: ['marzo'],\n 4: ['aprile'],\n 5: ['maggio', 'magg'],\n 6: ['giugno'],\n 7: ['luglio'],\n 8: ['agosto', 'ag'],\n 9: ['settembre', 'sett'],\n 10: ['ottobre', 'ott'],\n 11: ['novembre'],\n 12: ['dicembre', 'dic'],\n },\n 'fr': {\n 1: ['janv'],\n 2: ['févr'],\n 3: ['mars'],\n 4: ['avril'],\n 5: ['mai'],\n 6: ['juin'],\n 7: ['juil'],\n 8: ['août'],\n 9: ['sept'],\n 10: ['oct', 'octobre'],\n 11: ['nov', 'novembre'],\n 12: ['déc', 'décembre'],\n },\n 'br': {\n 1: ['janeiro'],\n 2: ['fevereiro'],\n 3: ['março'],\n 4: ['abril'],\n 5: ['maio'],\n 6: ['junho'],\n 7: ['julho'],\n 8: ['agosto'],\n 9: ['setembro'],\n 10: ['outubro'],\n 11: ['novembro'],\n 12: ['dezembro'],\n },\n 'es': {\n 1: ['enero'],\n 2: ['febrero'],\n 3: ['marzo'],\n 4: ['abril'],\n 5: ['mayo'],\n 6: ['junio'],\n 7: ['julio'],\n 8: ['agosto'],\n 9: ['septiembre', 'setiembre'],\n 10: ['octubre'],\n 11: ['noviembre'],\n 12: ['diciembre'],\n },\n 'se': {\n 1: ['januari'],\n 2: ['februari'],\n 3: ['mars'],\n 4: ['april'],\n 5: ['maj'],\n 6: ['juni'],\n 7: ['juli'],\n 8: ['augusti'],\n 9: ['september'],\n 10: ['oktober'],\n 11: ['november'],\n 12: ['december'],\n },\n 'jp': {\n 1: ['1月'],\n 2: ['2月'],\n 3: ['3月'],\n 4: ['4月'],\n 5: ['5月'],\n 6: ['6月'],\n 7: ['7月'],\n 8: ['8月'],\n 9: ['9月'],\n 10: ['10月'],\n 11: ['11月'],\n 12: ['12月'],\n },\n 'nl': {\n 1: ['januari'], 2: ['februari'], 3: ['maart'], 5: ['mei'], 6: ['juni'], 7: ['juli'], 8: ['augustus'], 10: ['oktober'],\n }\n\n } # }}}\n\n self.english_months = [None, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n self.months = months.get(self.domain, {})\n\n self.pd_xpath = '''\n //h2[text()=\"Product Details\" or \\\n text()=\"Produktinformation\" or \\\n text()=\"Dettagli prodotto\" or \\\n text()=\"Product details\" or \\\n text()=\"Détails sur le produit\" or \\\n text()=\"Detalles del producto\" or \\\n text()=\"Detalhes do produto\" or \\\n text()=\"Productgegevens\" or \\\n text()=\"基本信息\" or \\\n starts-with(text(), \"登録情報\")]/../div[@class=\"content\"]\n '''\n # Editor: is for Spanish\n self.publisher_xpath = '''\n descendant::*[starts-with(text(), \"Publisher:\") or \\\n starts-with(text(), \"Verlag:\") or \\\n starts-with(text(), \"Editore:\") or \\\n starts-with(text(), \"Editeur\") or \\\n starts-with(text(), \"Editor:\") or \\\n starts-with(text(), \"Editora:\") or \\\n starts-with(text(), \"Uitgever:\") or \\\n starts-with(text(), \"Utgivare:\") or \\\n starts-with(text(), \"出版社:\")]\n '''\n self.pubdate_xpath = '''\n descendant::*[starts-with(text(), \"Publication Date:\") or \\\n starts-with(text(), \"Audible.com Release Date:\")]\n '''\n self.publisher_names = {'Publisher', 'Uitgever', 'Verlag', 'Utgivare', 'Herausgeber',\n 'Editore', 'Editeur', 'Éditeur', 'Editor', 'Editora', '出版社'}\n\n self.language_xpath = '''\n descendant::*[\n starts-with(text(), \"Language:\") \\\n or text() = \"Language\" \\\n or text() = \"Sprache:\" \\\n or text() = \"Lingua:\" \\\n or text() = \"Idioma:\" \\\n or starts-with(text(), \"Langue\") \\\n or starts-with(text(), \"言語\") \\\n or starts-with(text(), \"Språk\") \\\n or starts-with(text(), \"语种\")\n ]\n '''\n self.language_names = {'Language', 'Sprache', 'Språk',\n 'Lingua', 'Idioma', 'Langue', '言語', 'Taal', '语种'}\n\n self.tags_xpath = '''\n descendant::h2[\n text() = \"Look for Similar Items by Category\" or\n text() = \"Ähnliche Artikel finden\" or\n text() = \"Buscar productos similares por categoría\" or\n text() = \"Ricerca articoli simili per categoria\" or\n text() = \"Rechercher des articles similaires par rubrique\" or\n text() = \"Procure por items similares por categoria\" or\n text() = \"関連商品を探す\"\n ]/../descendant::ul/li\n '''\n\n self.ratings_pat = re.compile(\n r'([0-9.,]+) ?(out of|von|van|su|étoiles sur|つ星のうち|de un máximo de|de|av) '\n r'([\\d\\.]+)( (stars|Sternen|stelle|estrellas|estrelas|sterren|stjärnor)){0,1}'\n )\n self.ratings_pat_cn = re.compile('([0-9.]+) 颗星,最多 5 颗星')\n self.ratings_pat_jp = re.compile(r'\\d+つ星のうち([\\d\\.]+)')\n\n lm = {\n 'eng': ('English', 'Englisch', 'Engels', 'Engelska'),\n 'fra': ('French', 'Français'),\n 'ita': ('Italian', 'Italiano'),\n 'deu': ('German', 'Deutsch'),\n 'spa': ('Spanish', 'Espa\\xf1ol', 'Espaniol'),\n 'jpn': ('Japanese', '日本語'),\n 'por': ('Portuguese', 'Português'),\n 'nld': ('Dutch', 'Nederlands',),\n 'chs': ('Chinese', '中文', '简体中文'),\n 'swe': ('Swedish', 'Svenska'),\n }\n self.lang_map = {}\n for code, names in lm.items():\n for name in names:\n self.lang_map[name] = code\n\n self.series_pat = re.compile(\n r'''\n \\|\\s* # Prefix\n (Series)\\s*:\\s* # Series declaration\n (?P<series>.+?)\\s+ # The series name\n \\((Book)\\s* # Book declaration\n (?P<index>[0-9.]+) # Series index\n \\s*\\)\n ''', re.X)\n\n def delocalize_datestr(self, raw):\n if self.domain == 'cn':\n return raw.replace('年', '-').replace('月', '-').replace('日', '')\n if not self.months:\n return raw\n ans = raw.lower()\n for i, vals in self.months.items():\n for x in vals:\n ans = ans.replace(x, self.english_months[i])\n ans = ans.replace(' de ', ' ')\n return ans\n\n def run(self):\n try:\n self.get_details()\n except:\n self.log.exception('get_details failed for url: %r' % self.url)\n\n def get_details(self):\n if self.preparsed_root is None:\n raw, root, selector = parse_details_page(\n self.url, self.log, self.timeout, self.browser, self.domain)\n else:\n raw, root, selector = self.preparsed_root\n\n from css_selectors import Select\n self.selector = Select(root)\n self.parse_details(raw, root)\n\n def parse_details(self, raw, root):\n asin = parse_asin(root, self.log, self.url)\n if not asin and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError(\n 'Amazon returned a CAPTCHA page, probably because you downloaded too many books. Wait for some time and try again.')\n if self.testing:\n import tempfile\n import uuid\n with tempfile.NamedTemporaryFile(prefix=(asin or type('')(uuid.uuid4())) + '_',\n suffix='.html', delete=False) as f:\n f.write(raw)\n print('Downloaded HTML for', asin, 'saved in', f.name)\n\n try:\n title = self.parse_title(root)\n except:\n self.log.exception('Error parsing title for url: %r' % self.url)\n title = None\n\n try:\n authors = self.parse_authors(root)\n except:\n self.log.exception('Error parsing authors for url: %r' % self.url)\n authors = []\n\n if not title or not authors or not asin:\n self.log.error(\n 'Could not find title/authors/asin for %r' % self.url)\n self.log.error('ASIN: %r Title: %r Authors: %r' % (asin, title,\n authors))\n return\n\n mi = Metadata(title, authors)\n idtype = 'amazon' if self.domain == 'com' else 'amazon_' + self.domain\n mi.set_identifier(idtype, asin)\n self.amazon_id = asin\n\n try:\n mi.rating = self.parse_rating(root)\n except:\n self.log.exception('Error parsing ratings for url: %r' % self.url)\n\n try:\n mi.comments = self.parse_comments(root, raw)\n except:\n self.log.exception('Error parsing comments for url: %r' % self.url)\n\n try:\n series, series_index = self.parse_series(root)\n if series:\n mi.series, mi.series_index = series, series_index\n elif self.testing:\n mi.series, mi.series_index = 'Dummy series for testing', 1\n except:\n self.log.exception('Error parsing series for url: %r' % self.url)\n\n try:\n mi.tags = self.parse_tags(root)\n except:\n self.log.exception('Error parsing tags for url: %r' % self.url)\n\n try:\n self.cover_url = self.parse_cover(root, raw)\n except:\n self.log.exception('Error parsing cover for url: %r' % self.url)\n if self.cover_url_processor is not None and self.cover_url and self.cover_url.startswith('/'):\n self.cover_url = self.cover_url_processor(self.cover_url)\n mi.has_cover = bool(self.cover_url)\n\n detail_bullets = root.xpath('//*[@data-feature-name=\"detailBullets\"]')\n non_hero = tuple(self.selector(\n 'div#bookDetails_container_div div#nonHeroSection')) or tuple(self.selector(\n '#productDetails_techSpec_sections'))\n feature_and_detail_bullets = root.xpath('//*[@data-feature-name=\"featureBulletsAndDetailBullets\"]')\n if detail_bullets:\n self.parse_detail_bullets(root, mi, detail_bullets[0])\n elif non_hero:\n try:\n self.parse_new_details(root, mi, non_hero[0])\n except:\n self.log.exception(\n 'Failed to parse new-style book details section')\n elif feature_and_detail_bullets:\n self.parse_detail_bullets(root, mi, feature_and_detail_bullets[0], ul_selector='ul')\n\n else:\n pd = root.xpath(self.pd_xpath)\n if pd:\n pd = pd[0]\n\n try:\n isbn = self.parse_isbn(pd)\n if isbn:\n self.isbn = mi.isbn = isbn\n except:\n self.log.exception(\n 'Error parsing ISBN for url: %r' % self.url)\n\n try:\n mi.publisher = self.parse_publisher(pd)\n except:\n self.log.exception(\n 'Error parsing publisher for url: %r' % self.url)\n\n try:\n mi.pubdate = self.parse_pubdate(pd)\n except:\n self.log.exception(\n 'Error parsing publish date for url: %r' % self.url)\n\n try:\n lang = self.parse_language(pd)\n if lang:\n mi.language = lang\n except:\n self.log.exception(\n 'Error parsing language for url: %r' % self.url)\n\n else:\n self.log.warning(\n 'Failed to find product description for url: %r' % self.url)\n\n mi.source_relevance = self.relevance\n\n if self.amazon_id:\n if self.isbn:\n self.plugin.cache_isbn_to_identifier(self.isbn, self.amazon_id)\n if self.cover_url:\n self.plugin.cache_identifier_to_cover_url(self.amazon_id,\n self.cover_url)\n\n self.plugin.clean_downloaded_metadata(mi)\n\n if self.filter_result(mi, self.log):\n self.result_queue.put(mi)\n\n def totext(self, elem, only_printable=False):\n res = self.tostring(elem, encoding='unicode', method='text')\n if only_printable:\n try:\n filtered_characters = list(s for s in res if s.isprintable())\n except AttributeError:\n filtered_characters = list(s for s in res if s in string.printable)\n res = ''.join(filtered_characters).strip()\n return res\n\n def parse_title(self, root):\n\n def sanitize_title(title):\n ans = title.strip()\n if not ans.startswith('['):\n ans = re.sub(r'[(\\[].*[)\\]]', '', title).strip()\n return ans\n\n h1 = root.xpath('//h1[@id=\"title\"]')\n if h1:\n h1 = h1[0]\n for child in h1.xpath('./*[contains(@class, \"a-color-secondary\")]'):\n h1.remove(child)\n return sanitize_title(self.totext(h1))\n tdiv = root.xpath('//h1[contains(@class, \"parseasinTitle\")]')\n if not tdiv:\n span = root.xpath('//*[@id=\"ebooksTitle\"]')\n if span:\n return sanitize_title(self.totext(span[0]))\n h1 = root.xpath('//h1[@data-feature-name=\"title\"]')\n if h1:\n return sanitize_title(self.totext(h1[0]))\n raise ValueError('No title block found')\n tdiv = tdiv[0]\n actual_title = tdiv.xpath('descendant::*[@id=\"btAsinTitle\"]')\n if actual_title:\n title = self.tostring(actual_title[0], encoding='unicode',\n method='text').strip()\n else:\n title = self.tostring(tdiv, encoding='unicode',\n method='text').strip()\n return sanitize_title(title)\n\n def parse_authors(self, root):\n for sel in (\n '#byline .author .contributorNameID',\n '#byline .author a.a-link-normal',\n '#bylineInfo .author .contributorNameID',\n '#bylineInfo .author a.a-link-normal',\n '#bylineInfo #bylineContributor',\n '#bylineInfo #contributorLink',\n ):\n matches = tuple(self.selector(sel))\n if matches:\n authors = [self.totext(x) for x in matches]\n return [a for a in authors if a]\n\n x = '//h1[contains(@class, \"parseasinTitle\")]/following-sibling::span/*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]'\n aname = root.xpath(x)\n if not aname:\n aname = root.xpath('''\n //h1[contains(@class, \"parseasinTitle\")]/following-sibling::*[(name()=\"a\" and @href) or (name()=\"span\" and @class=\"contributorNameTrigger\")]\n ''')\n for x in aname:\n x.tail = ''\n authors = [self.tostring(x, encoding='unicode', method='text').strip() for x\n in aname]\n authors = [a for a in authors if a]\n return authors\n\n def parse_rating(self, root):\n for x in root.xpath('//div[@id=\"cpsims-feature\" or @id=\"purchase-sims-feature\" or @id=\"rhf\"]'):\n # Remove the similar books section as it can cause spurious\n # ratings matches\n x.getparent().remove(x)\n\n rating_paths = (\n '//div[@data-feature-name=\"averageCustomerReviews\" or @id=\"averageCustomerReviews\"]',\n '//div[@class=\"jumpBar\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//div[@class=\"buying\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]',\n '//span[@class=\"crAvgStars\"]/descendant::span[contains(@class,\"asinReviewsSummary\")]'\n )\n ratings = None\n for p in rating_paths:\n ratings = root.xpath(p)\n if ratings:\n break\n\n def parse_ratings_text(text):\n try:\n m = self.ratings_pat.match(text)\n return float(m.group(1).replace(',', '.')) / float(m.group(3)) * 5\n except Exception:\n pass\n\n if ratings:\n ratings = ratings[0]\n for elem in ratings.xpath('descendant::*[@title]'):\n t = elem.get('title').strip()\n if self.domain == 'cn':\n m = self.ratings_pat_cn.match(t)\n if m is not None:\n return float(m.group(1))\n elif self.domain == 'jp':\n m = self.ratings_pat_jp.match(t)\n if m is not None:\n return float(m.group(1))\n else:\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n for elem in ratings.xpath('descendant::span[@class=\"a-icon-alt\"]'):\n t = self.tostring(\n elem, encoding='unicode', method='text', with_tail=False).strip()\n ans = parse_ratings_text(t)\n if ans is not None:\n return ans\n else:\n # found in kindle book pages on amazon.com\n for x in root.xpath('//a[@id=\"acrCustomerReviewLink\"]'):\n spans = x.xpath('./span')\n if spans:\n txt = self.tostring(spans[0], method='text', encoding='unicode', with_tail=False).strip()\n try:\n return float(txt.replace(',', '.'))\n except Exception:\n pass\n\n def _render_comments(self, desc):\n from calibre.library.comments import sanitize_comments_html\n\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for c in desc.xpath('descendant::*[@class=\"seeAll\" or'\n ' @class=\"emptyClear\" or @id=\"collapsePS\" or'\n ' @id=\"expandPS\"]'):\n c.getparent().remove(c)\n for b in desc.xpath('descendant::b[@style]'):\n # Bing highlights search results\n s = b.get('style', '')\n if 'color' in s:\n b.tag = 'span'\n del b.attrib['style']\n\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n for a in desc.xpath('descendant::span[@class=\"a-text-italic\"]'):\n a.tag = 'i'\n for a in desc.xpath('descendant::span[@class=\"a-text-bold\"]'):\n a.tag = 'b'\n desc = self.tostring(desc, method='html', encoding='unicode').strip()\n desc = xml_replace_entities(desc, 'utf-8')\n\n # Encoding bug in Amazon data U+fffd (replacement char)\n # in some examples it is present in place of '\n desc = desc.replace('\\ufffd', \"'\")\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove the notice about text referring to out of print editions\n desc = re.sub(r'(?s)<em>--This text ref.*?</em>', '', desc)\n # Remove comments\n desc = re.sub(r'(?s)<!--.*?-->', '', desc)\n return sanitize_comments_html(desc)\n\n def parse_comments(self, root, raw):\n try:\n from urllib.parse import unquote\n except ImportError:\n from urllib import unquote\n ans = ''\n ovr = tuple(self.selector('#drengr_MobileTabbedDescriptionOverviewContent_feature_div')) or tuple(\n self.selector('#drengr_DesktopTabbedDescriptionOverviewContent_feature_div'))\n if ovr:\n ovr = ovr[0]\n ovr.tag = 'div'\n ans = self._render_comments(ovr)\n ovr = tuple(self.selector('#drengr_MobileTabbedDescriptionEditorialsContent_feature_div')) or tuple(\n self.selector('#drengr_DesktopTabbedDescriptionEditorialsContent_feature_div'))\n if ovr:\n ovr = ovr[0]\n ovr.tag = 'div'\n ans += self._render_comments(ovr)\n else:\n ns = tuple(self.selector('#bookDescription_feature_div noscript'))\n if ns:\n ns = ns[0]\n if len(ns) == 0 and ns.text:\n import html5lib\n\n # html5lib parsed noscript as CDATA\n ns = html5lib.parseFragment(\n '<div>%s</div>' % (ns.text), treebuilder='lxml', namespaceHTMLElements=False)[0]\n else:\n ns.tag = 'div'\n ans = self._render_comments(ns)\n else:\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"content\"]')\n if desc:\n ans = self._render_comments(desc[0])\n else:\n ns = tuple(self.selector('#bookDescription_feature_div .a-expander-content'))\n if ns:\n ans = self._render_comments(ns[0])\n\n desc = root.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n else:\n # Idiot chickens from amazon strike again. This data is now stored\n # in a JS variable inside a script tag URL encoded.\n m = re.search(br'var\\s+iframeContent\\s*=\\s*\"([^\"]+)\"', raw)\n if m is not None:\n try:\n text = unquote(m.group(1)).decode('utf-8')\n nr = parse_html(text)\n desc = nr.xpath(\n '//div[@id=\"productDescription\"]/*[@class=\"content\"]')\n if desc:\n ans += self._render_comments(desc[0])\n except Exception as e:\n self.log.warn(\n 'Parsing of obfuscated product description failed with error: %s' % as_unicode(e))\n else:\n desc = root.xpath('//div[@id=\"productDescription_fullView\"]')\n if desc:\n ans += self._render_comments(desc[0])\n\n return ans\n\n def parse_series(self, root):\n ans = (None, None)\n\n # This is found on kindle pages for books on amazon.com\n series = root.xpath('//*[@id=\"rpi-attribute-book_details-series\"]')\n if series:\n spans = series[0].xpath('descendant::span')\n if spans:\n texts = [self.tostring(x, encoding='unicode', method='text', with_tail=False).strip() for x in spans]\n texts = list(filter(None, texts))\n if len(texts) == 2:\n idxinfo, series = texts\n m = re.search(r'[0-9.]+', idxinfo.strip())\n if m is not None:\n ans = series, float(m.group())\n return ans\n\n # This is found on the paperback/hardback pages for books on amazon.com\n series = root.xpath('//div[@data-feature-name=\"seriesTitle\"]')\n if series:\n series = series[0]\n spans = series.xpath('./span')\n if spans:\n raw = self.tostring(\n spans[0], encoding='unicode', method='text', with_tail=False).strip()\n m = re.search(r'\\s+([0-9.]+)$', raw.strip())\n if m is not None:\n series_index = float(m.group(1))\n s = series.xpath('./a[@id=\"series-page-link\"]')\n if s:\n series = self.tostring(\n s[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n else:\n series = root.xpath('//div[@id=\"seriesBulletWidget_feature_div\"]')\n if series:\n a = series[0].xpath('descendant::a')\n if a:\n raw = self.tostring(a[0], encoding='unicode', method='text', with_tail=False)\n if self.domain == 'jp':\n m = re.search(r'(?P<index>[0-9.]+)\\s*(?:巻|冊)\\s*\\(全\\s*([0-9.]+)\\s*(?:巻|冊)\\):\\s*(?P<series>.+)', raw.strip())\n else:\n m = re.search(r'(?:Book|Libro|Buch)\\s+(?P<index>[0-9.]+)\\s+(?:of|de|von)\\s+([0-9.]+)\\s*:\\s*(?P<series>.+)', raw.strip())\n if m is not None:\n ans = (m.group('series').strip(), float(m.group('index')))\n\n # This is found on Kindle edition pages on amazon.com\n if ans == (None, None):\n for span in root.xpath('//div[@id=\"aboutEbooksSection\"]//li/span'):\n text = (span.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = span.xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).strip()\n if series:\n ans = (series, series_index)\n # This is found on newer Kindle edition pages on amazon.com\n if ans == (None, None):\n for b in root.xpath('//div[@id=\"reviewFeatureGroup\"]/span/b'):\n text = (b.text or '').strip()\n m = re.match(r'Book\\s+([0-9.]+)', text)\n if m is not None:\n series_index = float(m.group(1))\n a = b.getparent().xpath('./a[@href]')\n if a:\n series = self.tostring(\n a[0], encoding='unicode', method='text', with_tail=False).partition('(')[0].strip()\n if series:\n ans = series, series_index\n\n if ans == (None, None):\n desc = root.xpath('//div[@id=\"ps-content\"]/div[@class=\"buying\"]')\n if desc:\n raw = self.tostring(desc[0], method='text', encoding='unicode')\n raw = re.sub(r'\\s+', ' ', raw)\n match = self.series_pat.search(raw)\n if match is not None:\n s, i = match.group('series'), float(match.group('index'))\n if s:\n ans = (s, i)\n if ans[0]:\n ans = (re.sub(r'\\s+Series$', '', ans[0]).strip(), ans[1])\n ans = (re.sub(r'\\(.+?\\s+Series\\)$', '', ans[0]).strip(), ans[1])\n return ans\n\n def parse_tags(self, root):\n ans = []\n exclude_tokens = {'kindle', 'a-z'}\n exclude = {'special features', 'by authors',\n 'authors & illustrators', 'books', 'new; used & rental textbooks'}\n seen = set()\n for li in root.xpath(self.tags_xpath):\n for i, a in enumerate(li.iterdescendants('a')):\n if i > 0:\n # we ignore the first category since it is almost always\n # too broad\n raw = (a.text or '').strip().replace(',', ';')\n lraw = icu_lower(raw)\n tokens = frozenset(lraw.split())\n if raw and lraw not in exclude and not tokens.intersection(exclude_tokens) and lraw not in seen:\n ans.append(raw)\n seen.add(lraw)\n return ans\n\n def parse_cover(self, root, raw=b\"\"):\n # Look for the image URL in javascript, using the first image in the\n # image gallery as the cover\n import json\n imgpat = re.compile(r'\"hiRes\":\"(.+?)\",\"thumb\"')\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n return m.group(1)\n imgpat = re.compile(r\"\"\"'imageGalleryData'\\s*:\\s*(\\[\\s*{.+])\"\"\")\n for script in root.xpath('//script'):\n m = imgpat.search(script.text or '')\n if m is not None:\n try:\n return json.loads(m.group(1))[0]['mainUrl']\n except Exception:\n continue\n\n def clean_img_src(src):\n parts = src.split('/')\n if len(parts) > 3:\n bn = parts[-1]\n sparts = bn.split('_')\n if len(sparts) > 2:\n bn = re.sub(r'\\.\\.jpg$', '.jpg', (sparts[0] + sparts[-1]))\n return ('/'.join(parts[:-1])) + '/' + bn\n\n imgpat2 = re.compile(r'var imageSrc = \"([^\"]+)\"')\n for script in root.xpath('//script'):\n m = imgpat2.search(script.text or '')\n if m is not None:\n src = m.group(1)\n url = clean_img_src(src)\n if url:\n return url\n\n imgs = root.xpath(\n '//img[(@id=\"prodImage\" or @id=\"original-main-image\" or @id=\"main-image\" or @id=\"main-image-nonjs\") and @src]')\n if not imgs:\n imgs = (\n root.xpath('//div[@class=\"main-image-inner-wrapper\"]/img[@src]') or\n root.xpath('//div[@id=\"main-image-container\" or @id=\"ebooks-main-image-container\"]//img[@src]') or\n root.xpath(\n '//div[@id=\"mainImageContainer\"]//img[@data-a-dynamic-image]')\n )\n for img in imgs:\n try:\n idata = json.loads(img.get('data-a-dynamic-image'))\n except Exception:\n imgs = ()\n else:\n mwidth = 0\n try:\n url = None\n for iurl, (width, height) in idata.items():\n if width > mwidth:\n mwidth = width\n url = iurl\n\n return url\n except Exception:\n pass\n\n for img in imgs:\n src = img.get('src')\n if 'data:' in src:\n continue\n if 'loading-' in src:\n js_img = re.search(br'\"largeImage\":\"(https?://[^\"]+)\",', raw)\n if js_img:\n src = js_img.group(1).decode('utf-8')\n if ('/no-image-avail' not in src and 'loading-' not in src and '/no-img-sm' not in src):\n self.log('Found image: %s' % src)\n url = clean_img_src(src)\n if url:\n return url\n\n def parse_detail_bullets(self, root, mi, container, ul_selector='.detail-bullet-list'):\n try:\n ul = next(self.selector(ul_selector, root=container))\n except StopIteration:\n return\n for span in self.selector('.a-list-item', root=ul):\n cells = span.xpath('./span')\n if len(cells) >= 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_new_details(self, root, mi, non_hero):\n table = non_hero.xpath('descendant::table')[0]\n for tr in table.xpath('descendant::tr'):\n cells = tr.xpath('descendant::*[local-name()=\"td\" or local-name()=\"th\"]')\n if len(cells) == 2:\n self.parse_detail_cells(mi, cells[0], cells[1])\n\n def parse_detail_cells(self, mi, c1, c2):\n name = self.totext(c1, only_printable=True).strip().strip(':').strip()\n val = self.totext(c2).strip()\n val = val.replace('\\u200e', '').replace('\\u200f', '')\n if not val:\n return\n if name in self.language_names:\n ans = self.lang_map.get(val)\n if not ans:\n ans = canonicalize_lang(val)\n if ans:\n mi.language = ans\n elif name in self.publisher_names:\n pub = val.partition(';')[0].partition('(')[0].strip()\n if pub:\n mi.publisher = pub\n date = val.rpartition('(')[-1].replace(')', '').strip()\n try:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(date)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n except:\n self.log.exception('Failed to parse pubdate: %s' % val)\n elif name in {'ISBN', 'ISBN-10', 'ISBN-13'}:\n ans = check_isbn(val)\n if ans:\n self.isbn = mi.isbn = ans\n elif name in {'Publication date'}:\n from calibre.utils.date import parse_only_date\n date = self.delocalize_datestr(val)\n mi.pubdate = parse_only_date(date, assume_utc=True)\n\n def parse_isbn(self, pd):\n items = pd.xpath(\n 'descendant::*[starts-with(text(), \"ISBN\")]')\n if not items:\n items = pd.xpath(\n 'descendant::b[contains(text(), \"ISBN:\")]')\n for x in reversed(items):\n if x.tail:\n ans = check_isbn(x.tail.strip())\n if ans:\n return ans\n\n def parse_publisher(self, pd):\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail.partition(';')[0]\n return ans.partition('(')[0].strip()\n\n def parse_pubdate(self, pd):\n from calibre.utils.date import parse_only_date\n for x in reversed(pd.xpath(self.pubdate_xpath)):\n if x.tail:\n date = x.tail.strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n for x in reversed(pd.xpath(self.publisher_xpath)):\n if x.tail:\n ans = x.tail\n date = ans.rpartition('(')[-1].replace(')', '').strip()\n date = self.delocalize_datestr(date)\n try:\n return parse_only_date(date, assume_utc=True)\n except Exception:\n pass\n\n def parse_language(self, pd):\n for x in reversed(pd.xpath(self.language_xpath)):\n if x.tail:\n raw = x.tail.strip().partition(',')[0].strip()\n ans = self.lang_map.get(raw, None)\n if ans:\n return ans\n ans = canonicalize_lang(ans)\n if ans:\n return ans\n# }}}\n\n\nclass Amazon(Source):\n\n name = 'Amazon.com'\n version = (1, 3, 7)\n minimum_calibre_version = (2, 82, 0)\n description = _('Downloads metadata and covers from Amazon')\n\n capabilities = frozenset(('identify', 'cover'))\n touched_fields = frozenset(('title', 'authors', 'identifier:amazon',\n 'rating', 'comments', 'publisher', 'pubdate',\n 'languages', 'series', 'tags'))\n has_html_comments = True\n supports_gzip_transfer_encoding = True\n prefer_results_with_isbn = False\n\n AMAZON_DOMAINS = {\n 'com': _('US'),\n 'fr': _('France'),\n 'de': _('Germany'),\n 'uk': _('UK'),\n 'au': _('Australia'),\n 'it': _('Italy'),\n 'jp': _('Japan'),\n 'es': _('Spain'),\n 'br': _('Brazil'),\n 'in': _('India'),\n 'nl': _('Netherlands'),\n 'cn': _('China'),\n 'ca': _('Canada'),\n 'se': _('Sweden'),\n }\n\n SERVERS = {\n 'auto': _('Choose server automatically'),\n 'amazon': _('Amazon servers'),\n 'bing': _('Bing search cache'),\n 'google': _('Google search cache'),\n 'wayback': _('Wayback machine cache (slow)'),\n 'ddg': _('DuckDuckGo search and Google cache'),\n }\n\n options = (\n Option('domain', 'choices', 'com', _('Amazon country website to use:'),\n _('Metadata from Amazon will be fetched using this '\n 'country\\'s Amazon website.'), choices=AMAZON_DOMAINS),\n Option('server', 'choices', 'auto', _('Server to get data from:'),\n _(\n 'Amazon has started blocking attempts to download'\n ' metadata from its servers. To get around this problem,'\n ' calibre can fetch the Amazon data from many different'\n ' places where it is cached. Choose the source you prefer.'\n ), choices=SERVERS),\n Option('use_mobi_asin', 'bool', False, _('Use the MOBI-ASIN for metadata search'),\n _(\n 'Enable this option to search for metadata with an'\n ' ASIN identifier from the MOBI file at the current country website,'\n ' unless any other amazon id is available. Note that if the'\n ' MOBI file came from a different Amazon country store, you could get'\n ' incorrect results.'\n )),\n Option('prefer_kindle_edition', 'bool', False, _('Prefer the Kindle edition, when available'),\n _(\n 'When searching for a book and the search engine returns both paper and Kindle editions,'\n ' always prefer the Kindle edition, instead of whatever the search engine returns at the'\n ' top.')\n ),\n )\n\n def __init__(self, *args, **kwargs):\n Source.__init__(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def id_from_url(self, url):\n from polyglot.urllib import urlparse\n purl = urlparse(url)\n if purl.netloc and purl.path and '/dp/' in purl.path:\n host_parts = tuple(x.lower() for x in purl.netloc.split('.'))\n if 'amazon' in host_parts:\n domain = host_parts[-1]\n parts = purl.path.split('/')\n idx = parts.index('dp')\n try:\n val = parts[idx+1]\n except IndexError:\n return\n aid = 'amazon' if domain == 'com' else ('amazon_' + domain)\n return aid, val\n\n def test_fields(self, mi):\n '''\n Return the first field from self.touched_fields that is null on the\n mi object\n '''\n for key in self.touched_fields:\n if key.startswith('identifier:'):\n key = key.partition(':')[-1]\n if key == 'amazon':\n if self.domain != 'com':\n key += '_' + self.domain\n if not mi.has_identifier(key):\n return 'identifier: ' + key\n elif mi.is_null(key):\n return key\n\n @property\n def browser(self):\n br = self._browser\n if br is None:\n ua = 'Mobile '\n while not user_agent_is_ok(ua):\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n self._browser = br = browser(user_agent=ua)\n br.set_handle_gzip(True)\n if self.use_search_engine:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n else:\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ('Referer', self.referrer_for_domain()),\n ]\n return br\n\n def save_settings(self, *args, **kwargs):\n Source.save_settings(self, *args, **kwargs)\n self.set_amazon_id_touched_fields()\n\n def set_amazon_id_touched_fields(self):\n ident_name = \"identifier:amazon\"\n if self.domain != 'com':\n ident_name += '_' + self.domain\n tf = [x for x in self.touched_fields if not\n x.startswith('identifier:amazon')] + [ident_name]\n self.touched_fields = frozenset(tf)\n\n def get_domain_and_asin(self, identifiers, extra_domains=()):\n identifiers = {k.lower(): v for k, v in identifiers.items()}\n for key, val in identifiers.items():\n if key in ('amazon', 'asin'):\n return 'com', val\n if key.startswith('amazon_'):\n domain = key.partition('_')[-1]\n if domain and (domain in self.AMAZON_DOMAINS or domain in extra_domains):\n return domain, val\n if self.prefs['use_mobi_asin']:\n val = identifiers.get('mobi-asin')\n if val is not None:\n return self.domain, val\n return None, None\n\n def referrer_for_domain(self, domain=None):\n domain = domain or self.domain\n return {\n 'uk': 'https://www.amazon.co.uk/',\n 'au': 'https://www.amazon.com.au/',\n 'br': 'https://www.amazon.com.br/',\n 'jp': 'https://www.amazon.co.jp/',\n 'mx': 'https://www.amazon.com.mx/',\n }.get(domain, 'https://www.amazon.%s/' % domain)\n\n def _get_book_url(self, identifiers): # {{{\n domain, asin = self.get_domain_and_asin(\n identifiers, extra_domains=('au', 'ca'))\n if domain and asin:\n url = None\n r = self.referrer_for_domain(domain)\n if r is not None:\n url = r + 'dp/' + asin\n if url:\n idtype = 'amazon' if domain == 'com' else 'amazon_' + domain\n return domain, idtype, asin, url\n\n def get_book_url(self, identifiers):\n ans = self._get_book_url(identifiers)\n if ans is not None:\n return ans[1:]\n\n def get_book_url_name(self, idtype, idval, url):\n if idtype == 'amazon':\n return self.name\n return 'A' + idtype.replace('_', '.')[1:]\n # }}}\n\n @property\n def domain(self):\n x = getattr(self, 'testing_domain', None)\n if x is not None:\n return x\n domain = self.prefs['domain']\n if domain not in self.AMAZON_DOMAINS:\n domain = 'com'\n\n return domain\n\n @property\n def server(self):\n x = getattr(self, 'testing_server', None)\n if x is not None:\n return x\n server = self.prefs['server']\n if server not in self.SERVERS:\n server = 'auto'\n return server\n\n @property\n def use_search_engine(self):\n return self.server != 'amazon'\n\n def clean_downloaded_metadata(self, mi):\n docase = (\n mi.language == 'eng' or\n (mi.is_null('language') and self.domain in {'com', 'uk', 'au'})\n )\n if mi.title and docase:\n # Remove series information from title\n m = re.search(r'\\S+\\s+(\\(.+?\\s+Book\\s+\\d+\\))$', mi.title)\n if m is not None:\n mi.title = mi.title.replace(m.group(1), '').strip()\n mi.title = fixcase(mi.title)\n mi.authors = fixauthors(mi.authors)\n if mi.tags and docase:\n mi.tags = list(map(fixcase, mi.tags))\n mi.isbn = check_isbn(mi.isbn)\n if mi.series and docase:\n mi.series = fixcase(mi.series)\n if mi.title and mi.series:\n for pat in (r':\\s*Book\\s+\\d+\\s+of\\s+%s$', r'\\(%s\\)$', r':\\s*%s\\s+Book\\s+\\d+$'):\n pat = pat % re.escape(mi.series)\n q = re.sub(pat, '', mi.title, flags=re.I).strip()\n if q and q != mi.title:\n mi.title = q\n break\n\n def get_website_domain(self, domain):\n return {'uk': 'co.uk', 'jp': 'co.jp', 'br': 'com.br', 'au': 'com.au'}.get(domain, domain)\n\n def create_query(self, log, title=None, authors=None, identifiers={}, # {{{\n domain=None, for_amazon=True):\n try:\n from urllib.parse import unquote_plus, urlencode\n except ImportError:\n from urllib import unquote_plus, urlencode\n if domain is None:\n domain = self.domain\n\n idomain, asin = self.get_domain_and_asin(identifiers)\n if idomain is not None:\n domain = idomain\n\n # See the amazon detailed search page to get all options\n terms = []\n q = {'search-alias': 'aps',\n 'unfiltered': '1',\n }\n\n if domain == 'com':\n q['sort'] = 'relevanceexprank'\n else:\n q['sort'] = 'relevancerank'\n\n isbn = check_isbn(identifiers.get('isbn', None))\n\n if asin is not None:\n q['field-keywords'] = asin\n terms.append(asin)\n elif isbn is not None:\n q['field-isbn'] = isbn\n if len(isbn) == 13:\n terms.extend('({} OR {}-{})'.format(isbn, isbn[:3], isbn[3:]).split())\n else:\n terms.append(isbn)\n else:\n # Only return book results\n q['search-alias'] = {'br': 'digital-text',\n 'nl': 'aps'}.get(domain, 'stripbooks')\n if title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q['field-title'] = ' '.join(title_tokens)\n terms.extend(title_tokens)\n if authors:\n author_tokens = list(self.get_author_tokens(authors,\n only_first_author=True))\n if author_tokens:\n q['field-author'] = ' '.join(author_tokens)\n terms.extend(author_tokens)\n\n if not ('field-keywords' in q or 'field-isbn' in q or\n ('field-title' in q)):\n # Insufficient metadata to make an identify query\n log.error('Insufficient metadata to construct query, none of title, ISBN or ASIN supplied')\n raise SearchFailed()\n\n if not for_amazon:\n return terms, domain\n\n if domain == 'nl':\n q['__mk_nl_NL'] = 'ÅMÅŽÕÑ'\n if 'field-keywords' not in q:\n q['field-keywords'] = ''\n for f in 'field-isbn field-title field-author'.split():\n q['field-keywords'] += ' ' + q.pop(f, '')\n q['field-keywords'] = q['field-keywords'].strip()\n\n encoded_q = dict([(x.encode('utf-8', 'ignore'), y.encode(\n 'utf-8', 'ignore')) for x, y in q.items()])\n url_query = urlencode(encoded_q)\n # amazon's servers want IRIs with unicode characters not percent esaped\n parts = []\n for x in url_query.split(b'&' if isinstance(url_query, bytes) else '&'):\n k, v = x.split(b'=' if isinstance(x, bytes) else '=', 1)\n parts.append('{}={}'.format(iri_quote_plus(unquote_plus(k)), iri_quote_plus(unquote_plus(v))))\n url_query = '&'.join(parts)\n url = 'https://www.amazon.%s/s/?' % self.get_website_domain(\n domain) + url_query\n return url, domain\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n domain, asin = self.get_domain_and_asin(identifiers)\n if asin is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n asin = self.cached_isbn_to_identifier(isbn)\n if asin is not None:\n url = self.cached_identifier_to_cover_url(asin)\n\n return url\n # }}}\n\n def parse_results_page(self, root, domain): # {{{\n from lxml.html import tostring\n\n matches = []\n\n def title_ok(title):\n title = title.lower()\n bad = ['bulk pack', '[audiobook]', '[audio cd]',\n '(a book companion)', '( slipcase with door )', ': free sampler']\n if self.domain == 'com':\n bad.extend(['(%s edition)' % x for x in ('spanish', 'german')])\n for x in bad:\n if x in title:\n return False\n if title and title[0] in '[{' and re.search(r'\\(\\s*author\\s*\\)', title) is not None:\n # Bad entries in the catalog\n return False\n return True\n\n for query in (\n '//div[contains(@class, \"s-result-list\")]//h2/a[@href]',\n '//div[contains(@class, \"s-result-list\")]//div[@data-index]//h5//a[@href]',\n r'//li[starts-with(@id, \"result_\")]//a[@href and contains(@class, \"s-access-detail-page\")]',\n ):\n result_links = root.xpath(query)\n if result_links:\n break\n for a in result_links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n\n if not matches:\n # Previous generation of results page markup\n for div in root.xpath(r'//div[starts-with(@id, \"result_\")]'):\n links = div.xpath(r'descendant::a[@class=\"title\" and @href]')\n if not links:\n # New amazon markup\n links = div.xpath('descendant::h3/a[@href]')\n for a in links:\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n\n if not matches:\n # This can happen for some user agents that Amazon thinks are\n # mobile/less capable\n for td in root.xpath(\n r'//div[@id=\"Results\"]/descendant::td[starts-with(@id, \"search:Td:\")]'):\n for a in td.xpath(r'descendant::td[@class=\"dataColumn\"]/descendant::a[@href]/span[@class=\"srTitle\"]/..'):\n title = tostring(a, method='text', encoding='unicode')\n if title_ok(title):\n url = a.get('href')\n if url.startswith('/'):\n url = 'https://www.amazon.%s%s' % (\n self.get_website_domain(domain), url)\n matches.append(url)\n break\n if not matches and root.xpath('//form[@action=\"/errors/validateCaptcha\"]'):\n raise CaptchaError('Amazon returned a CAPTCHA page. Recently Amazon has begun using statistical'\n ' profiling to block access to its website. As such this metadata plugin is'\n ' unlikely to ever work reliably.')\n\n # Keep only the top 3 matches as the matches are sorted by relevance by\n # Amazon so lower matches are not likely to be very relevant\n return matches[:3]\n # }}}\n\n def search_amazon(self, br, testing, log, abort, title, authors, identifiers, timeout): # {{{\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n matches = []\n query, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n time.sleep(1)\n try:\n raw = br.open_novisit(query, timeout=timeout).read().strip()\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and \\\n e.getcode() == 404:\n log.error('Query malformed: %r' % query)\n raise SearchFailed()\n attr = getattr(e, 'args', [None])\n attr = attr if attr else [None]\n if isinstance(attr[0], socket.timeout):\n msg = _('Amazon timed out. Try again later.')\n log.error(msg)\n else:\n msg = 'Failed to make identify query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n raw = clean_ascii_chars(xml_to_unicode(raw,\n strip_encoding_pats=True, resolve_entities=True)[0])\n\n if testing:\n import tempfile\n with tempfile.NamedTemporaryFile(prefix='amazon_results_',\n suffix='.html', delete=False) as f:\n f.write(raw.encode('utf-8'))\n print('Downloaded html for results page saved in', f.name)\n\n matches = []\n found = '<title>404 - ' not in raw\n\n if found:\n try:\n root = parse_html(raw)\n except Exception:\n msg = 'Failed to parse amazon page for query: %r' % query\n log.exception(msg)\n raise SearchFailed()\n\n matches = self.parse_results_page(root, domain)\n\n return matches, query, domain, None\n # }}}\n\n def search_search_engine(self, br, testing, log, abort, title, authors, identifiers, timeout, override_server=None): # {{{\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n terms, domain = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers, for_amazon=False)\n site = self.referrer_for_domain(\n domain)[len('https://'):].partition('/')[0]\n matches = []\n server = override_server or self.server\n urlproc, sfunc = se.google_url_processor, se.google_search\n if server == 'bing':\n urlproc, sfunc = se.bing_url_processor, se.bing_search\n elif server == 'wayback':\n urlproc, sfunc = se.wayback_url_processor, se.ddg_search\n elif server == 'ddg':\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n try:\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n except HTTPError as err:\n if err.code == 429 and sfunc is se.google_search:\n log('Got too many requests error from Google, trying via DuckDuckGo')\n urlproc, sfunc = se.ddg_url_processor, se.ddg_search\n results, qurl = sfunc(terms, site, log=log, br=br, timeout=timeout)\n else:\n raise\n\n br.set_current_header('Referer', qurl)\n for result in results:\n if abort.is_set():\n return matches, terms, domain, None\n\n purl = urlparse(result.url)\n if '/dp/' in purl.path and site in purl.netloc:\n url = result.cached_url\n if url is None:\n url = se.get_cached_url(result.url, br, timeout=timeout)\n if url is None:\n log('Failed to find cached page for:', result.url)\n continue\n if url not in matches:\n matches.append(url)\n if len(matches) >= 3:\n break\n else:\n log('Skipping non-book result:', result)\n if not matches:\n log('No search engine results for terms:', ' '.join(terms))\n if urlproc is se.google_url_processor:\n # Google does not cache adult titles\n log('Trying the bing search engine instead')\n return self.search_search_engine(br, testing, log, abort, title, authors, identifiers, timeout, 'bing')\n return matches, terms, domain, urlproc\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=60):\n '''\n Note this method will retry without identifiers automatically if no\n match is found with identifiers.\n '''\n\n testing = getattr(self, 'running_a_test', False)\n\n udata = self._get_book_url(identifiers)\n br = self.browser\n log('User-agent:', br.current_user_agent())\n log('Server:', self.server)\n if testing:\n print('User-agent:', br.current_user_agent())\n if udata is not None and not self.use_search_engine:\n # Try to directly get details page instead of running a search\n # Cannot use search engine as the directly constructed URL is\n # usually redirected to a full URL by amazon, and is therefore\n # not cached\n domain, idtype, asin, durl = udata\n if durl is not None:\n preparsed_root = parse_details_page(\n durl, log, timeout, br, domain)\n if preparsed_root is not None:\n qasin = parse_asin(preparsed_root[1], log, durl)\n if qasin == asin:\n w = Worker(durl, result_queue, br, log, 0, domain,\n self, testing=testing, preparsed_root=preparsed_root, timeout=timeout)\n try:\n w.get_details()\n return\n except Exception:\n log.exception(\n 'get_details failed for url: %r' % durl)\n func = self.search_search_engine if self.use_search_engine else self.search_amazon\n try:\n matches, query, domain, cover_url_processor = func(\n br, testing, log, abort, title, authors, identifiers, timeout)\n except SearchFailed:\n return\n\n if abort.is_set():\n return\n\n if not matches:\n if identifiers and title and authors:\n log('No matches found with identifiers, retrying using only'\n ' title and authors. Query: %r' % query)\n time.sleep(1)\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n log.error('No matches found with query: %r' % query)\n return\n\n if self.prefs['prefer_kindle_edition']:\n matches = sort_matches_preferring_kindle_editions(matches)\n\n workers = [Worker(\n url, result_queue, br, log, i, domain, self, testing=testing, timeout=timeout,\n cover_url_processor=cover_url_processor, filter_result=partial(\n self.filter_result, title, authors, identifiers)) for i, url in enumerate(matches)]\n\n for w in workers:\n # Don't send all requests at the same time\n time.sleep(1)\n w.start()\n if abort.is_set():\n return\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n return None\n # }}}\n\n def filter_result(self, title, authors, identifiers, mi, log): # {{{\n if not self.use_search_engine:\n return True\n if title is not None:\n\n def tokenize_title(x):\n return icu_lower(x).replace(\"'\", '').replace('\"', '').rstrip(':')\n\n tokens = {tokenize_title(x) for x in title.split() if len(x) > 3}\n if tokens:\n result_tokens = {tokenize_title(x) for x in mi.title.split()}\n if not tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'as its title does not match')\n return False\n if authors:\n author_tokens = set()\n for author in authors:\n author_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n result_tokens = set()\n for author in mi.authors:\n result_tokens |= {icu_lower(x) for x in author.split() if len(x) > 2}\n if author_tokens and not author_tokens.intersection(result_tokens):\n log('Ignoring result:', mi.title, 'by', ' & '.join(mi.authors), 'as its author does not match')\n return False\n return True\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=60, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n log('Downloading cover from:', cached_url)\n br = self.browser\n if self.use_search_engine:\n br = br.clone_browser()\n br.set_current_header('Referer', self.referrer_for_domain(self.domain))\n try:\n time.sleep(1)\n cdata = br.open_novisit(\n cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\ndef manual_tests(domain, **kw): # {{{\n # To run these test use:\n # calibre-debug -c \"from calibre.ebooks.metadata.sources.amazon import *; manual_tests('com')\"\n from calibre.ebooks.metadata.sources.test import authors_test, comments_test, isbn_test, series_test, test_identify_plugin, title_test\n all_tests = {}\n all_tests['com'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon': '1423146786'}},\n [title_test('Heroes of Olympus', exact=False), series_test('The Heroes of Olympus', 5)]\n ),\n\n ( # Kindle edition with series\n {'identifiers': {'amazon': 'B0085UEQDO'}},\n [title_test('Three Parts Dead', exact=True),\n series_test('Craft Sequence', 1)]\n ),\n\n ( # + in title and uses id=\"main-image\" for cover\n {'identifiers': {'amazon': '1933988770'}},\n [title_test(\n 'C++ Concurrency in Action: Practical Multithreading', exact=True)]\n ),\n\n\n ( # Different comments markup, using Book Description section\n {'identifiers': {'amazon': '0982514506'}},\n [title_test(\n \"Griffin's Destiny\",\n exact=True),\n comments_test('Jelena'), comments_test('Ashinji'),\n ]\n ),\n\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C#'),\n authors_test(['Rockford Lhotka'])\n ]\n ),\n\n ( # No specific problems\n {'identifiers': {'isbn': '0743273567'}},\n [title_test('the great gatsby'),\n authors_test(['f. Scott Fitzgerald'])]\n ),\n\n ]\n\n # }}}\n\n all_tests['de'] = [ # {{{\n # series\n (\n {'identifiers': {'isbn': '3499275120'}},\n [title_test('Vespasian: Das Schwert des Tribuns: Historischer Roman',\n exact=False), authors_test(['Robert Fabbri']), series_test('Die Vespasian-Reihe', 1)\n ]\n\n ),\n\n ( # umlaut in title/authors\n {'title': 'Flüsternde Wälder',\n 'authors': ['Nicola Förg']},\n [title_test('Flüsternde Wälder'),\n authors_test(['Nicola Förg'], subset=True)\n ]\n ),\n\n (\n {'identifiers': {'isbn': '9783453314979'}},\n [title_test('Die letzten Wächter: Roman',\n exact=False), authors_test(['Sergej Lukianenko'])\n ]\n\n ),\n\n (\n {'identifiers': {'isbn': '3548283519'}},\n [title_test('Wer Wind Sät: Der Fünfte Fall Für Bodenstein Und Kirchhoff',\n exact=False), authors_test(['Nele Neuhaus'])\n ]\n\n ),\n ] # }}}\n\n all_tests['it'] = [ # {{{\n (\n {'identifiers': {'isbn': '8838922195'}},\n [title_test('La briscola in cinque',\n exact=True), authors_test(['Marco Malvaldi'])\n ]\n\n ),\n ] # }}}\n\n all_tests['fr'] = [ # {{{\n (\n {'identifiers': {'amazon_fr': 'B07L7ST4RS'}},\n [title_test('Le secret de Lola', exact=True),\n authors_test(['Amélie BRIZIO'])\n ]\n ),\n (\n {'identifiers': {'isbn': '2221116798'}},\n [title_test('L\\'étrange voyage de Monsieur Daldry',\n exact=True), authors_test(['Marc Levy'])\n ]\n\n ),\n ] # }}}\n\n all_tests['es'] = [ # {{{\n (\n {'identifiers': {'isbn': '8483460831'}},\n [title_test('Tiempos Interesantes',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['se'] = [ # {{{\n (\n {'identifiers': {'isbn': '9780552140287'}},\n [title_test('Men At Arms: A Discworld Novel: 14',\n exact=False), authors_test(['Terry Pratchett'])\n ]\n\n ),\n ] # }}}\n\n all_tests['jp'] = [ # {{{\n ( # Adult filtering test\n {'identifiers': {'isbn': '4799500066'}},\n [title_test('Bitch Trap'), ]\n ),\n\n ( # isbn -> title, authors\n {'identifiers': {'isbn': '9784101302720'}},\n [title_test('精霊の守り人',\n exact=True), authors_test(['上橋 菜穂子'])\n ]\n ),\n ( # title, authors -> isbn (will use Shift_JIS encoding in query.)\n {'title': '考えない練習',\n 'authors': ['小池 龍之介']},\n [isbn_test('9784093881067'), ]\n ),\n ] # }}}\n\n all_tests['br'] = [ # {{{\n (\n {'title': 'A Ascensão da Sombra'},\n [title_test('A Ascensão da Sombra'), authors_test(['Robert Jordan'])]\n ),\n\n (\n {'title': 'Guerra dos Tronos'},\n [title_test('A Guerra dos Tronos. As Crônicas de Gelo e Fogo - Livro 1'), authors_test(['George R. R. Martin'])\n ]\n\n ),\n ] # }}}\n\n all_tests['nl'] = [ # {{{\n (\n {'title': 'Freakonomics'},\n [title_test('Freakonomics',\n exact=True), authors_test(['Steven Levitt & Stephen Dubner & R. Kuitenbrouwer & O. Brenninkmeijer & A. van Den Berg'])\n ]\n\n ),\n ] # }}}\n\n all_tests['cn'] = [ # {{{\n (\n {'identifiers': {'isbn': '9787115369512'}},\n [title_test('若为自由故 自由软件之父理查德斯托曼传', exact=True),\n authors_test(['[美]sam Williams', '邓楠,李凡希'])]\n ),\n (\n {'title': '爱上Raspberry Pi'},\n [title_test('爱上Raspberry Pi',\n exact=True), authors_test(['Matt Richardson', 'Shawn Wallace', '李凡希'])\n ]\n\n ),\n ] # }}}\n\n all_tests['ca'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'isbn': '9781623808747'}},\n [title_test('Parting Shot', exact=True),\n authors_test(['Mary Calmes'])]\n ),\n ( # # in title\n {'title': 'Expert C# 2008 Business Objects',\n 'authors': ['Lhotka']},\n [title_test('Expert C# 2008 Business Objects'),\n authors_test(['Rockford Lhotka'])]\n ),\n ( # noscript description\n {'identifiers': {'amazon_ca': '162380874X'}},\n [title_test('Parting Shot', exact=True), authors_test(['Mary Calmes'])\n ]\n ),\n ] # }}}\n\n all_tests['in'] = [ # {{{\n ( # Paperback with series\n {'identifiers': {'amazon_in': '1423146786'}},\n [title_test('The Heroes of Olympus, Book Five The Blood of Olympus', exact=True)]\n ),\n ] # }}}\n\n def do_test(domain, start=0, stop=None, server='auto'):\n tests = all_tests[domain]\n if stop is None:\n stop = len(tests)\n tests = tests[start:stop]\n test_identify_plugin(Amazon.name, tests, modify_plugin=lambda p: (\n setattr(p, 'testing_domain', domain),\n setattr(p, 'touched_fields', p.touched_fields - {'tags'}),\n setattr(p, 'testing_server', server),\n ))\n\n do_test(domain, **kw)\n# }}}\n", + "big_book_search": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Option, Source\n\n\ndef get_urls(br, tokens):\n from urllib.parse import quote_plus\n\n from html5_parser import parse\n escaped = (quote_plus(x) for x in tokens if x and x.strip())\n q = '+'.join(escaped)\n url = 'https://bigbooksearch.com/please-dont-scrape-my-site-you-will-put-my-api-key-over-the-usage-limit-and-the-site-will-break/books/'+q\n raw = br.open(url).read()\n root = parse(raw.decode('utf-8'))\n urls = [i.get('src') for i in root.xpath('//img[@src]')]\n return urls\n\n\nclass BigBookSearch(Source):\n\n name = 'Big Book Search'\n version = (1, 0, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads multiple book covers from Amazon. Useful to find alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the search result')),\n )\n supports_gzip_transfer_encoding = True\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n br = self.browser\n tokens = tuple(self.get_title_tokens(title)) + tuple(self.get_author_tokens(authors))\n urls = get_urls(br, tokens)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n\ndef test():\n import pprint\n\n from calibre import browser\n br = browser()\n urls = get_urls(br, ['consider', 'phlebas', 'banks'])\n pprint.pprint(urls)\n\n\nif __name__ == '__main__':\n test()\n", + "edelweiss": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:fdm=marker:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nimport re\nimport time\nfrom threading import Thread\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, random_user_agent\nfrom calibre.ebooks.metadata import check_isbn\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\ndef clean_html(raw):\n from calibre.ebooks.chardet import xml_to_unicode\n from calibre.utils.cleantext import clean_ascii_chars\n return clean_ascii_chars(xml_to_unicode(raw, strip_encoding_pats=True,\n resolve_entities=True, assume_utf8=True)[0])\n\n\ndef parse_html(raw):\n raw = clean_html(raw)\n from html5_parser import parse\n return parse(raw)\n\n\ndef astext(node):\n from lxml import etree\n return etree.tostring(node, method='text', encoding='unicode',\n with_tail=False).strip()\n\n\nclass Worker(Thread): # {{{\n\n def __init__(self, basic_data, relevance, result_queue, br, timeout, log, plugin):\n Thread.__init__(self)\n self.daemon = True\n self.basic_data = basic_data\n self.br, self.log, self.timeout = br, log, timeout\n self.result_queue, self.plugin, self.sku = result_queue, plugin, self.basic_data['sku']\n self.relevance = relevance\n\n def run(self):\n url = ('https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/product/two_Enhanced.ascx&'\n 'sku={0}&idPrefix=content_1_{0}&mode=0'.format(self.sku))\n try:\n raw = self.br.open_novisit(url, timeout=self.timeout).read()\n except:\n self.log.exception('Failed to load comments page: %r'%url)\n return\n\n try:\n mi = self.parse(raw)\n mi.source_relevance = self.relevance\n self.plugin.clean_downloaded_metadata(mi)\n self.result_queue.put(mi)\n except:\n self.log.exception('Failed to parse details for sku: %s'%self.sku)\n\n def parse(self, raw):\n from calibre.ebooks.metadata.book.base import Metadata\n from calibre.utils.date import UNDEFINED_DATE\n root = parse_html(raw)\n mi = Metadata(self.basic_data['title'], self.basic_data['authors'])\n\n # Identifiers\n if self.basic_data['isbns']:\n mi.isbn = self.basic_data['isbns'][0]\n mi.set_identifier('edelweiss', self.sku)\n\n # Tags\n if self.basic_data['tags']:\n mi.tags = self.basic_data['tags']\n mi.tags = [t[1:].strip() if t.startswith('&') else t for t in mi.tags]\n\n # Publisher\n mi.publisher = self.basic_data['publisher']\n\n # Pubdate\n if self.basic_data['pubdate'] and self.basic_data['pubdate'].year != UNDEFINED_DATE:\n mi.pubdate = self.basic_data['pubdate']\n\n # Rating\n if self.basic_data['rating']:\n mi.rating = self.basic_data['rating']\n\n # Comments\n comments = ''\n for cid in ('summary', 'contributorbio', 'quotes_reviews'):\n cid = 'desc_{}{}-content'.format(cid, self.sku)\n div = root.xpath('//*[@id=\"{}\"]'.format(cid))\n if div:\n comments += self.render_comments(div[0])\n if comments:\n mi.comments = comments\n\n mi.has_cover = self.plugin.cached_identifier_to_cover_url(self.sku) is not None\n return mi\n\n def render_comments(self, desc):\n from lxml import etree\n\n from calibre.library.comments import sanitize_comments_html\n for c in desc.xpath('descendant::noscript'):\n c.getparent().remove(c)\n for a in desc.xpath('descendant::a[@href]'):\n del a.attrib['href']\n a.tag = 'span'\n desc = etree.tostring(desc, method='html', encoding='unicode').strip()\n\n # remove all attributes from tags\n desc = re.sub(r'<([a-zA-Z0-9]+)\\s[^>]+>', r'<\\1>', desc)\n # Collapse whitespace\n # desc = re.sub('\\n+', '\\n', desc)\n # desc = re.sub(' +', ' ', desc)\n # Remove comments\n desc = re.sub(r'(?s)<!--.*?-->', '', desc)\n return sanitize_comments_html(desc)\n# }}}\n\n\ndef get_basic_data(browser, log, *skus):\n from mechanize import Request\n\n from calibre.utils.date import parse_only_date\n zeroes = ','.join('0' for sku in skus)\n data = {\n 'skus': ','.join(skus),\n 'drc': zeroes,\n 'startPosition': '0',\n 'sequence': '1',\n 'selected': zeroes,\n 'itemID': '0',\n 'orderID': '0',\n 'mailingID': '',\n 'tContentWidth': '926',\n 'originalOrder': ','.join(type('')(i) for i in range(len(skus))),\n 'selectedOrderID': '0',\n 'selectedSortColumn': '0',\n 'listType': '1',\n 'resultType': '32',\n 'blockView': '1',\n }\n items_data_url = 'https://www.edelweiss.plus/GetTreelineControl.aspx?controlName=/uc/listviews/ListView_Title_Multi.ascx'\n req = Request(items_data_url, data)\n response = browser.open_novisit(req)\n raw = response.read()\n root = parse_html(raw)\n for item in root.xpath('//div[@data-priority]'):\n row = item.getparent().getparent()\n sku = item.get('id').split('-')[-1]\n isbns = [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_sku\")]/text()')[0].split(',') if check_isbn(x.strip())]\n isbns.sort(key=len, reverse=True)\n try:\n tags = [x.strip() for x in astext(row.xpath('descendant::*[contains(@class, \"pev_categories\")]')[0]).split('/')]\n except IndexError:\n tags = []\n rating = 0\n for bar in row.xpath('descendant::*[contains(@class, \"bgdColorCommunity\")]/@style'):\n m = re.search(r'width: (\\d+)px;.*max-width: (\\d+)px', bar)\n if m is not None:\n rating = float(m.group(1)) / float(m.group(2))\n break\n try:\n pubdate = parse_only_date(astext(row.xpath('descendant::*[contains(@class, \"pev_shipDate\")]')[0]\n ).split(':')[-1].split(u'\\xa0')[-1].strip(), assume_utc=True)\n except Exception:\n log.exception('Error parsing published date')\n pubdate = None\n authors = []\n for x in [x.strip() for x in row.xpath('descendant::*[contains(@class, \"pev_contributor\")]/@title')]:\n authors.extend(a.strip() for a in x.split(','))\n entry = {\n 'sku': sku,\n 'cover': row.xpath('descendant::img/@src')[0].split('?')[0],\n 'publisher': astext(row.xpath('descendant::*[contains(@class, \"headerPublisher\")]')[0]),\n 'title': astext(row.xpath('descendant::*[@id=\"title_{}\"]'.format(sku))[0]),\n 'authors': authors,\n 'isbns': isbns,\n 'tags': tags,\n 'pubdate': pubdate,\n 'format': ' '.join(row.xpath('descendant::*[contains(@class, \"pev_format\")]/text()')).strip(),\n 'rating': rating,\n }\n if entry['cover'].startswith('/'):\n entry['cover'] = None\n yield entry\n\n\nclass Edelweiss(Source):\n\n name = 'Edelweiss'\n version = (2, 0, 1)\n minimum_calibre_version = (3, 6, 0)\n description = _('Downloads metadata and covers from Edelweiss - A catalog updated by book publishers')\n\n capabilities = frozenset(['identify', 'cover'])\n touched_fields = frozenset([\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:edelweiss', 'rating'])\n supports_gzip_transfer_encoding = True\n has_html_comments = True\n\n @property\n def user_agent(self):\n # Pass in an index to random_user_agent() to test with a particular\n # user agent\n return random_user_agent(allow_ie=False)\n\n def _get_book_url(self, sku):\n if sku:\n return 'https://www.edelweiss.plus/#sku={}&page=1'.format(sku)\n\n def get_book_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if sku:\n return 'edelweiss', sku, self._get_book_url(sku)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n sku = identifiers.get('edelweiss', None)\n if not sku:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n sku = self.cached_isbn_to_identifier(isbn)\n return self.cached_identifier_to_cover_url(sku)\n # }}}\n\n def create_query(self, log, title=None, authors=None, identifiers={}):\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n import time\n BASE_URL = ('https://www.edelweiss.plus/GetTreelineControl.aspx?'\n 'controlName=/uc/listviews/controls/ListView_data.ascx&itemID=0&resultType=32&dashboardType=8&itemType=1&dataType=products&keywordSearch&')\n keywords = []\n isbn = check_isbn(identifiers.get('isbn', None))\n if isbn is not None:\n keywords.append(isbn)\n elif title:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n keywords.extend(title_tokens)\n author_tokens = self.get_author_tokens(authors, only_first_author=True)\n if author_tokens:\n keywords.extend(author_tokens)\n if not keywords:\n return None\n params = {\n 'q': (' '.join(keywords)).encode('utf-8'),\n '_': type('')(int(time.time()))\n }\n return BASE_URL+urlencode(params)\n\n # }}}\n\n def identify(self, log, result_queue, abort, title=None, authors=None, # {{{\n identifiers={}, timeout=30):\n import json\n\n br = self.browser\n br.addheaders = [\n ('Referer', 'https://www.edelweiss.plus/'),\n ('X-Requested-With', 'XMLHttpRequest'),\n ('Cache-Control', 'no-cache'),\n ('Pragma', 'no-cache'),\n ]\n if 'edelweiss' in identifiers:\n items = [identifiers['edelweiss']]\n else:\n log.error('Currently Edelweiss returns random books for search queries')\n return\n query = self.create_query(log, title=title, authors=authors,\n identifiers=identifiers)\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n log('Using query URL:', query)\n try:\n raw = br.open(query, timeout=timeout).read().decode('utf-8')\n except Exception as e:\n log.exception('Failed to make identify query: %r'%query)\n return as_unicode(e)\n items = re.search(r'window[.]items\\s*=\\s*(.+?);', raw)\n if items is None:\n log.error('Failed to get list of matching items')\n log.debug('Response text:')\n log.debug(raw)\n return\n items = json.loads(items.group(1))\n\n if (not items and identifiers and title and authors and\n not abort.is_set()):\n return self.identify(log, result_queue, abort, title=title,\n authors=authors, timeout=timeout)\n\n if not items:\n return\n\n workers = []\n items = items[:5]\n for i, item in enumerate(get_basic_data(self.browser, log, *items)):\n sku = item['sku']\n for isbn in item['isbns']:\n self.cache_isbn_to_identifier(isbn, sku)\n if item['cover']:\n self.cache_identifier_to_cover_url(sku, item['cover'])\n fmt = item['format'].lower()\n if 'audio' in fmt or 'mp3' in fmt:\n continue # Audio-book, ignore\n workers.append(Worker(item, i, result_queue, br.clone_browser(), timeout, log, self))\n\n if not workers:\n return\n\n for w in workers:\n w.start()\n # Don't send all requests at the same time\n time.sleep(0.1)\n\n while not abort.is_set():\n a_worker_is_alive = False\n for w in workers:\n w.join(0.2)\n if abort.is_set():\n break\n if w.is_alive():\n a_worker_is_alive = True\n if not a_worker_is_alive:\n break\n\n # }}}\n\n def download_cover(self, log, result_queue, abort, # {{{\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(log, rq, abort, title=title, authors=authors,\n identifiers=identifiers)\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers))\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n if abort.is_set():\n return\n br = self.browser\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(cached_url, timeout=timeout).read()\n result_queue.put((self, cdata))\n except:\n log.exception('Failed to download cover from:', cached_url)\n # }}}\n\n\nif __name__ == '__main__':\n from calibre.ebooks.metadata.sources.test import authors_test, comments_test, pubdate_test, test_identify_plugin, title_test\n tests = [\n ( # A title and author search\n {'title': 'The Husband\\'s Secret', 'authors':['Liane Moriarty']},\n [title_test('The Husband\\'s Secret', exact=True),\n authors_test(['Liane Moriarty'])]\n ),\n\n ( # An isbn present in edelweiss\n {'identifiers':{'isbn': '9780312621360'}, },\n [title_test('Flame: A Sky Chasers Novel', exact=True),\n authors_test(['Amy Kathleen Ryan'])]\n ),\n\n # Multiple authors and two part title and no general description\n ({'identifiers':{'edelweiss':'0321180607'}},\n [title_test(\n \"XQuery From the Experts: A Guide to the W3C XML Query Language\"\n , exact=True), authors_test([\n 'Howard Katz', 'Don Chamberlin', 'Denise Draper', 'Mary Fernandez',\n 'Michael Kay', 'Jonathan Robie', 'Michael Rys', 'Jerome Simeon',\n 'Jim Tivy', 'Philip Wadler']), pubdate_test(2003, 8, 22),\n comments_test('Jérôme Siméon'), lambda mi: bool(mi.comments and 'No title summary' not in mi.comments)\n ]),\n ]\n start, stop = 0, len(tests)\n\n tests = tests[start:stop]\n test_identify_plugin(Edelweiss.name, tests)\n", + "google": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\n# License: GPLv3 Copyright: 2011, Kovid Goyal <kovid at kovidgoyal.net>\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport hashlib\nimport os\nimport re\nimport sys\nimport tempfile\nimport time\n\nimport regex\n\ntry:\n from queue import Empty, Queue\nexcept ImportError:\n from Queue import Empty, Queue\n\nfrom calibre import as_unicode, prepare_string_for_xml, replace_entities\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.ebooks.metadata import authors_to_string, check_isbn\nfrom calibre.ebooks.metadata.book.base import Metadata\nfrom calibre.ebooks.metadata.sources.base import Source\nfrom calibre.utils.cleantext import clean_ascii_chars\nfrom calibre.utils.localization import canonicalize_lang\n\nNAMESPACES = {\n 'openSearch': 'http://a9.com/-/spec/opensearchrss/1.0/',\n 'atom': 'http://www.w3.org/2005/Atom',\n 'dc': 'http://purl.org/dc/terms',\n 'gd': 'http://schemas.google.com/g/2005'\n}\n\n\ndef pretty_google_books_comments(raw):\n raw = replace_entities(raw)\n # Paragraphs in the comments are removed but whatever software googl uses\n # to do this does not insert a space so we often find the pattern\n # word.Capital in the comments which can be used to find paragraph markers.\n parts = []\n for x in re.split(r'([a-z)\"”])(\\.)([A-Z(\"“])', raw):\n if x == '.':\n parts.append('.</p>\\n\\n<p>')\n else:\n parts.append(prepare_string_for_xml(x))\n raw = '<p>' + ''.join(parts) + '</p>'\n return raw\n\n\ndef get_details(browser, url, timeout): # {{{\n try:\n raw = browser.open_novisit(url, timeout=timeout).read()\n except Exception as e:\n gc = getattr(e, 'getcode', lambda: -1)\n if gc() != 403:\n raise\n # Google is throttling us, wait a little\n time.sleep(2)\n raw = browser.open_novisit(url, timeout=timeout).read()\n\n return raw\n\n\n# }}}\n\nxpath_cache = {}\n\n\ndef XPath(x):\n ans = xpath_cache.get(x)\n if ans is None:\n from lxml import etree\n ans = xpath_cache[x] = etree.XPath(x, namespaces=NAMESPACES)\n return ans\n\n\ndef to_metadata(browser, log, entry_, timeout, running_a_test=False): # {{{\n from lxml import etree\n\n # total_results = XPath('//openSearch:totalResults')\n # start_index = XPath('//openSearch:startIndex')\n # items_per_page = XPath('//openSearch:itemsPerPage')\n entry = XPath('//atom:entry')\n entry_id = XPath('descendant::atom:id')\n url = XPath('descendant::atom:link[@rel=\"self\"]/@href')\n creator = XPath('descendant::dc:creator')\n identifier = XPath('descendant::dc:identifier')\n title = XPath('descendant::dc:title')\n date = XPath('descendant::dc:date')\n publisher = XPath('descendant::dc:publisher')\n subject = XPath('descendant::dc:subject')\n description = XPath('descendant::dc:description')\n language = XPath('descendant::dc:language')\n\n # print(etree.tostring(entry_, pretty_print=True))\n\n def get_text(extra, x):\n try:\n ans = x(extra)\n if ans:\n ans = ans[0].text\n if ans and ans.strip():\n return ans.strip()\n except:\n log.exception('Programming error:')\n return None\n\n def get_extra_details():\n raw = get_details(browser, details_url, timeout)\n if running_a_test:\n with open(os.path.join(tempfile.gettempdir(), 'Google-' + details_url.split('/')[-1] + '.xml'), 'wb') as f:\n f.write(raw)\n print('Book details saved to:', f.name, file=sys.stderr)\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return entry(feed)[0]\n\n if isinstance(entry_, str):\n google_id = entry_\n details_url = 'https://www.google.com/books/feeds/volumes/' + google_id\n extra = get_extra_details()\n title_ = ': '.join([x.text for x in title(extra)]).strip()\n authors = [x.text.strip() for x in creator(extra) if x.text]\n else:\n id_url = entry_id(entry_)[0].text\n google_id = id_url.split('/')[-1]\n details_url = url(entry_)[0]\n title_ = ': '.join([x.text for x in title(entry_)]).strip()\n authors = [x.text.strip() for x in creator(entry_) if x.text]\n if not id_url or not title:\n # Silently discard this entry\n return None\n extra = None\n\n if not authors:\n authors = [_('Unknown')]\n if not title:\n return None\n if extra is None:\n extra = get_extra_details()\n mi = Metadata(title_, authors)\n mi.identifiers = {'google': google_id}\n mi.comments = get_text(extra, description)\n lang = canonicalize_lang(get_text(extra, language))\n if lang:\n mi.language = lang\n mi.publisher = get_text(extra, publisher)\n\n # ISBN\n isbns = []\n for x in identifier(extra):\n t = type('')(x.text).strip()\n if t[:5].upper() in ('ISBN:', 'LCCN:', 'OCLC:'):\n if t[:5].upper() == 'ISBN:':\n t = check_isbn(t[5:])\n if t:\n isbns.append(t)\n if isbns:\n mi.isbn = sorted(isbns, key=len)[-1]\n mi.all_isbns = isbns\n\n # Tags\n try:\n btags = [x.text for x in subject(extra) if x.text]\n tags = []\n for t in btags:\n atags = [y.strip() for y in t.split('/')]\n for tag in atags:\n if tag not in tags:\n tags.append(tag)\n except:\n log.exception('Failed to parse tags:')\n tags = []\n if tags:\n mi.tags = [x.replace(',', ';') for x in tags]\n\n # pubdate\n pubdate = get_text(extra, date)\n if pubdate:\n from calibre.utils.date import parse_date, utcnow\n try:\n default = utcnow().replace(day=15)\n mi.pubdate = parse_date(pubdate, assume_utc=True, default=default)\n except:\n log.error('Failed to parse pubdate %r' % pubdate)\n\n # Cover\n mi.has_google_cover = None\n for x in extra.xpath(\n '//*[@href and @rel=\"http://schemas.google.com/books/2008/thumbnail\"]'\n ):\n mi.has_google_cover = x.get('href')\n break\n\n return mi\n\n\n# }}}\n\n\nclass GoogleBooks(Source):\n\n name = 'Google'\n version = (1, 1, 1)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads metadata and covers from Google Books')\n\n capabilities = frozenset({'identify'})\n touched_fields = frozenset({\n 'title', 'authors', 'tags', 'pubdate', 'comments', 'publisher',\n 'identifier:isbn', 'identifier:google', 'languages'\n })\n supports_gzip_transfer_encoding = True\n cached_cover_url_is_reliable = False\n\n GOOGLE_COVER = 'https://books.google.com/books?id=%s&printsec=frontcover&img=1'\n\n DUMMY_IMAGE_MD5 = frozenset(\n ('0de4383ebad0adad5eeb8975cd796657', 'a64fa89d7ebc97075c1d363fc5fea71f')\n )\n\n def get_book_url(self, identifiers): # {{{\n goog = identifiers.get('google', None)\n if goog is not None:\n return ('google', goog, 'https://books.google.com/books?id=%s' % goog)\n # }}}\n\n def id_from_url(self, url): # {{{\n from polyglot.urllib import parse_qs, urlparse\n purl = urlparse(url)\n if purl.netloc == 'books.google.com':\n q = parse_qs(purl.query)\n gid = q.get('id')\n if gid:\n return 'google', gid[0]\n # }}}\n\n def create_query(self, title=None, authors=None, identifiers={}, capitalize_isbn=False): # {{{\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n BASE_URL = 'https://books.google.com/books/feeds/volumes?'\n isbn = check_isbn(identifiers.get('isbn', None))\n q = ''\n if isbn is not None:\n q += ('ISBN:' if capitalize_isbn else 'isbn:') + isbn\n elif title or authors:\n\n def build_term(prefix, parts):\n return ' '.join('in' + prefix + ':' + x for x in parts)\n\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += build_term('title', title_tokens)\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += ('+' if q else '') + build_term('author', author_tokens)\n\n if not q:\n return None\n if not isinstance(q, bytes):\n q = q.encode('utf-8')\n return BASE_URL + urlencode({\n 'q': q,\n 'max-results': 20,\n 'start-index': 1,\n 'min-viewability': 'none',\n })\n\n # }}}\n\n def download_cover( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30,\n get_best_cover=False\n ):\n cached_url = self.get_cached_cover_url(identifiers)\n if cached_url is None:\n log.info('No cached cover found, running identify')\n rq = Queue()\n self.identify(\n log,\n rq,\n abort,\n title=title,\n authors=authors,\n identifiers=identifiers\n )\n if abort.is_set():\n return\n results = []\n while True:\n try:\n results.append(rq.get_nowait())\n except Empty:\n break\n results.sort(\n key=self.identify_results_keygen(\n title=title, authors=authors, identifiers=identifiers\n )\n )\n for mi in results:\n cached_url = self.get_cached_cover_url(mi.identifiers)\n if cached_url is not None:\n break\n if cached_url is None:\n log.info('No cover found')\n return\n\n br = self.browser\n for candidate in (0, 1):\n if abort.is_set():\n return\n url = cached_url + '&zoom={}'.format(candidate)\n log('Downloading cover from:', cached_url)\n try:\n cdata = br.open_novisit(url, timeout=timeout).read()\n if cdata:\n if hashlib.md5(cdata).hexdigest() in self.DUMMY_IMAGE_MD5:\n log.warning('Google returned a dummy image, ignoring')\n else:\n result_queue.put((self, cdata))\n break\n except Exception:\n log.exception('Failed to download cover from:', cached_url)\n\n # }}}\n\n def get_cached_cover_url(self, identifiers): # {{{\n url = None\n goog = identifiers.get('google', None)\n if goog is None:\n isbn = identifiers.get('isbn', None)\n if isbn is not None:\n goog = self.cached_isbn_to_identifier(isbn)\n if goog is not None:\n url = self.cached_identifier_to_cover_url(goog)\n\n return url\n\n # }}}\n\n def postprocess_downloaded_google_metadata(self, ans, relevance=0): # {{{\n if not isinstance(ans, Metadata):\n return ans\n ans.source_relevance = relevance\n goog = ans.identifiers['google']\n for isbn in getattr(ans, 'all_isbns', []):\n self.cache_isbn_to_identifier(isbn, goog)\n if getattr(ans, 'has_google_cover', False):\n self.cache_identifier_to_cover_url(goog, self.GOOGLE_COVER % goog)\n if ans.comments:\n ans.comments = pretty_google_books_comments(ans.comments)\n self.clean_downloaded_metadata(ans)\n return ans\n # }}}\n\n def get_all_details( # {{{\n self,\n br,\n log,\n entries,\n abort,\n result_queue,\n timeout\n ):\n from lxml import etree\n for relevance, i in enumerate(entries):\n try:\n ans = self.postprocess_downloaded_google_metadata(to_metadata(br, log, i, timeout, self.running_a_test), relevance)\n if isinstance(ans, Metadata):\n result_queue.put(ans)\n except Exception:\n log.exception(\n 'Failed to get metadata for identify entry:', etree.tostring(i)\n )\n if abort.is_set():\n break\n\n # }}}\n\n def identify_via_web_search( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from calibre.utils.filenames import ascii_text\n isbn = check_isbn(identifiers.get('isbn', None))\n q = []\n strip_punc_pat = regex.compile(r'[\\p{C}|\\p{M}|\\p{P}|\\p{S}|\\p{Z}]+', regex.UNICODE)\n google_ids = []\n check_tokens = set()\n has_google_id = 'google' in identifiers\n\n def to_check_tokens(*tokens):\n for t in tokens:\n if len(t) < 3:\n continue\n t = t.lower()\n if t in ('and', 'not', 'the'):\n continue\n yield ascii_text(strip_punc_pat.sub('', t))\n\n if has_google_id:\n google_ids.append(identifiers['google'])\n elif isbn is not None:\n q.append(isbn)\n elif title or authors:\n title_tokens = list(self.get_title_tokens(title))\n if title_tokens:\n q += title_tokens\n check_tokens |= set(to_check_tokens(*title_tokens))\n author_tokens = list(self.get_author_tokens(authors, only_first_author=True))\n if author_tokens:\n q += author_tokens\n check_tokens |= set(to_check_tokens(*author_tokens))\n if not q and not google_ids:\n return None\n from calibre.ebooks.metadata.sources.update import search_engines_module\n se = search_engines_module()\n br = se.google_specialize_browser(se.browser())\n if not has_google_id:\n url = se.google_format_query(q, tbm='bks')\n log('Making query:', url)\n r = []\n root = se.query(br, url, 'google', timeout=timeout, save_raw=r.append)\n pat = re.compile(r'id=([^&]+)')\n for q in se.google_parse_results(root, r[0], log=log, ignore_uncached=False):\n m = pat.search(q.url)\n if m is None or not q.url.startswith('https://books.google'):\n continue\n google_ids.append(m.group(1))\n\n if not google_ids and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n found = False\n seen = set()\n for relevance, gid in enumerate(google_ids):\n if gid in seen:\n continue\n seen.add(gid)\n try:\n ans = to_metadata(br, log, gid, timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n if isbn:\n if isbn not in ans.all_isbns:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the ISBN:', isbn,\n 'not in', ' '.join(ans.all_isbns))\n continue\n elif check_tokens:\n candidate = set(to_check_tokens(*self.get_title_tokens(ans.title)))\n candidate |= set(to_check_tokens(*self.get_author_tokens(ans.authors)))\n if candidate.intersection(check_tokens) != check_tokens:\n log('Excluding', ans.title, 'by', authors_to_string(ans.authors), 'as it does not match the query')\n continue\n ans = self.postprocess_downloaded_google_metadata(ans, relevance)\n result_queue.put(ans)\n found = True\n except:\n log.exception('Failed to get metadata for google books id:', gid)\n if abort.is_set():\n break\n if not found and isbn and (title or authors):\n return self.identify_via_web_search(log, result_queue, abort, title, authors, {}, timeout)\n # }}}\n\n def identify( # {{{\n self,\n log,\n result_queue,\n abort,\n title=None,\n authors=None,\n identifiers={},\n timeout=30\n ):\n from lxml import etree\n entry = XPath('//atom:entry')\n identifiers = identifiers.copy()\n br = self.browser\n if 'google' in identifiers:\n try:\n ans = to_metadata(br, log, identifiers['google'], timeout, self.running_a_test)\n if isinstance(ans, Metadata):\n self.postprocess_downloaded_google_metadata(ans)\n result_queue.put(ans)\n return\n except Exception:\n log.exception('Failed to get metadata for Google identifier:', identifiers['google'])\n del identifiers['google']\n\n query = self.create_query(\n title=title, authors=authors, identifiers=identifiers\n )\n if not query:\n log.error('Insufficient metadata to construct query')\n return\n\n def make_query(query):\n log('Making query:', query)\n try:\n raw = br.open_novisit(query, timeout=timeout).read()\n except Exception as e:\n log.exception('Failed to make identify query: %r' % query)\n return False, as_unicode(e)\n\n try:\n feed = etree.fromstring(\n xml_to_unicode(clean_ascii_chars(raw), strip_encoding_pats=True)[0],\n parser=etree.XMLParser(recover=True, no_network=True, resolve_entities=False)\n )\n return True, entry(feed)\n except Exception as e:\n log.exception('Failed to parse identify results')\n return False, as_unicode(e)\n ok, entries = make_query(query)\n if not ok:\n return entries\n if not entries and not abort.is_set():\n log('No results found, doing a web search instead')\n return self.identify_via_web_search(log, result_queue, abort, title, authors, identifiers, timeout)\n\n # There is no point running these queries in threads as google\n # throttles requests returning 403 Forbidden errors\n self.get_all_details(br, log, entries, abort, result_queue, timeout)\n\n # }}}\n\n\nif __name__ == '__main__': # tests {{{\n # To run these test use:\n # calibre-debug src/calibre/ebooks/metadata/sources/google.py\n from calibre.ebooks.metadata.sources.test import authors_test, test_identify_plugin, title_test\n tests = [\n ({\n 'identifiers': {'google': 's7NIrgEACAAJ'},\n }, [title_test('Ride Every Stride', exact=False)]),\n\n ({\n 'identifiers': {'isbn': '0743273567'},\n 'title': 'Great Gatsby',\n 'authors': ['Fitzgerald']\n }, [\n title_test('The great gatsby', exact=True),\n authors_test(['F. Scott Fitzgerald'])\n ]),\n\n ({\n 'title': 'Flatland',\n 'authors': ['Abbott']\n }, [title_test('Flatland', exact=False)]),\n\n ({\n 'title': 'The Blood Red Indian Summer: A Berger and Mitry Mystery',\n 'authors': ['David Handler'],\n }, [title_test('The Blood Red Indian Summer: A Berger and Mitry Mystery')\n ]),\n\n ({\n # requires using web search to find the book\n 'title': 'Dragon Done It',\n 'authors': ['Eric Flint'],\n }, [\n title_test('The dragon done it', exact=True),\n authors_test(['Eric Flint', 'Mike Resnick'])\n ]),\n\n ]\n test_identify_plugin(GoogleBooks.name, tests[:])\n\n# }}}\n", + "google_images": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2013, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom collections import OrderedDict\n\nfrom calibre import random_user_agent\nfrom calibre.ebooks.metadata.sources.base import Option, Source\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef imgurl_from_id(raw, tbnid):\n from json import JSONDecoder\n q = '\"{}\",['.format(tbnid)\n start_pos = raw.index(q)\n if start_pos < 100:\n return\n jd = JSONDecoder()\n data = jd.raw_decode('[' + raw[start_pos:])[0]\n # from pprint import pprint\n # pprint(data)\n url_num = 0\n for x in data:\n if isinstance(x, list) and len(x) == 3:\n q = x[0]\n if hasattr(q, 'lower') and q.lower().startswith('http'):\n url_num += 1\n if url_num > 1:\n return q\n\n\nclass GoogleImages(Source):\n\n name = 'Google Images'\n version = (1, 0, 5)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from a Google Image search. Useful to find larger/alternate covers.')\n capabilities = frozenset(['cover'])\n can_get_multiple_covers = True\n supports_gzip_transfer_encoding = True\n options = (Option('max_covers', 'number', 5, _('Maximum number of covers to get'),\n _('The maximum number of covers to process from the Google search result')),\n Option('size', 'choices', 'svga', _('Cover size'),\n _('Search for covers larger than the specified size'),\n choices=OrderedDict((\n ('any', _('Any size'),),\n ('l', _('Large'),),\n ('qsvga', _('Larger than %s')%'400x300',),\n ('vga', _('Larger than %s')%'640x480',),\n ('svga', _('Larger than %s')%'600x800',),\n ('xga', _('Larger than %s')%'1024x768',),\n ('2mp', _('Larger than %s')%'2 MP',),\n ('4mp', _('Larger than %s')%'4 MP',),\n ))),\n )\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if not title:\n return\n timeout = max(60, timeout) # Needs at least a minute\n title = ' '.join(self.get_title_tokens(title))\n author = ' '.join(self.get_author_tokens(authors))\n urls = self.get_image_urls(title, author, log, abort, timeout)\n self.download_multiple_covers(title, authors, urls, get_best_cover, timeout, result_queue, abort, log)\n\n @property\n def user_agent(self):\n return random_user_agent(allow_ie=False)\n\n def get_image_urls(self, title, author, log, abort, timeout):\n from calibre.utils.cleantext import clean_ascii_chars\n try:\n from urllib.parse import urlencode\n except ImportError:\n from urllib import urlencode\n from collections import OrderedDict\n ans = OrderedDict()\n br = self.browser\n q = urlencode({'as_q': ('%s %s'%(title, author)).encode('utf-8')})\n if isinstance(q, bytes):\n q = q.decode('utf-8')\n sz = self.prefs['size']\n if sz == 'any':\n sz = ''\n elif sz == 'l':\n sz = 'isz:l,'\n else:\n sz = 'isz:lt,islt:%s,' % sz\n # See https://www.google.com/advanced_image_search to understand this\n # URL scheme\n url = 'https://www.google.com/search?as_st=y&tbm=isch&{}&as_epq=&as_oq=&as_eq=&cr=&as_sitesearch=&safe=images&tbs={}iar:t,ift:jpg'.format(q, sz)\n log('Search URL: ' + url)\n # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies\n br.set_simple_cookie('CONSENT', 'PENDING+987', '.google.com', path='/')\n template = b'\\x08\\x01\\x128\\x08\\x14\\x12+boq_identityfrontenduiserver_20231107.05_p0\\x1a\\x05en-US \\x03\\x1a\\x06\\x08\\x80\\xf1\\xca\\xaa\\x06'\n from base64 import standard_b64encode\n from datetime import date\n template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))\n br.set_simple_cookie('SOCS', standard_b64encode(template).decode('ascii').rstrip('='), '.google.com', path='/')\n # br.set_debug_http(True)\n raw = clean_ascii_chars(br.open(url).read().decode('utf-8'))\n # with open('/t/raw.html', 'w') as f:\n # f.write(raw)\n root = parse_html(raw)\n results = root.xpath('//div/@data-tbnid') # could also use data-id\n # from calibre.utils.ipython import ipython\n # ipython({'root': root, 'raw': raw, 'url': url, 'results': results})\n for tbnid in results:\n try:\n imgurl = imgurl_from_id(raw, tbnid)\n except Exception:\n continue\n if imgurl:\n ans[imgurl] = True\n return list(ans)\n\n\ndef test():\n try:\n from queue import Queue\n except ImportError:\n from Queue import Queue\n from threading import Event\n\n from calibre.utils.logging import default_log\n p = GoogleImages(None)\n p.log = default_log\n rq = Queue()\n p.download_cover(default_log, rq, Event(), title='The Heroes',\n authors=('Joe Abercrombie',))\n print('Downloaded', rq.qsize(), 'covers')\n\nif __name__ == '__main__':\n test()\n", "hashes": { - "amazon": "e2dc988ace313e5689de47912c4c1446e2311868", - "big_book_search": "9b468ff223b7ddbf6bbd26e58194c0fa8fbbfb69", - "edelweiss": "efd8f281a56435895b7916f85598d469bb53bb02", - "google": "bfe34ba5e1be36511f2228a350bd91c676724aac", - "google_images": "3323061049afe11a42422f325783de220991149d", + "amazon": "5562fc28b52557096628c7c1b8e21bb5de6e8c2d", + "big_book_search": "7a8b67c0f19ecbfe8a9d28b961aab1119f31c3e3", + "edelweiss": "a8ec3d6919265c52d896d4688e366302495cc525", + "google": "dd793082f1ba0aba3157197487aae8f147cf05cf", + "google_images": "d1caecef58d7198d8bd5620e27ea53c7ae167e40", "openlibrary": "8707d3b3161de476b46ed967dea1116707dcfb0a", - "search_engines": "52a24c5004033fc9f393a260a09e6f8afb80b0ba" + "search_engines": "63d2c158b5e9bd108c94773b68c784b05895b5f6" }, "openlibrary": "#!/usr/bin/env python\n# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\n__license__ = 'GPL v3'\n__copyright__ = '2011, Kovid Goyal <kovid@kovidgoyal.net>'\n__docformat__ = 'restructuredtext en'\n\nfrom calibre.ebooks.metadata.sources.base import Source\n\n\nclass OpenLibrary(Source):\n\n name = 'Open Library'\n version = (1, 0, 0)\n minimum_calibre_version = (2, 80, 0)\n description = _('Downloads covers from The Open Library')\n\n capabilities = frozenset(['cover'])\n\n OPENLIBRARY = 'https://covers.openlibrary.org/b/isbn/%s-L.jpg?default=false'\n\n def download_cover(self, log, result_queue, abort,\n title=None, authors=None, identifiers={}, timeout=30, get_best_cover=False):\n if 'isbn' not in identifiers:\n return\n isbn = identifiers['isbn']\n br = self.browser\n try:\n ans = br.open_novisit(self.OPENLIBRARY%isbn, timeout=timeout).read()\n result_queue.put((self, ans))\n except Exception as e:\n if callable(getattr(e, 'getcode', None)) and e.getcode() == 404:\n log.error('No cover for ISBN: %r found'%isbn)\n else:\n log.exception('Failed to download cover for ISBN:', isbn)\n", - "search_engines": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n# License: GPLv3 Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>\n\nfrom __future__ import absolute_import, division, print_function, unicode_literals\nimport json\nimport os\nimport re\nimport time\nfrom collections import namedtuple\nfrom contextlib import contextmanager\nfrom threading import Lock\n\ntry:\n from urllib.parse import parse_qs, quote_plus, unquote, urlencode, quote\nexcept ImportError:\n from urlparse import parse_qs\n from urllib import quote_plus, urlencode, unquote, quote\n\nfrom lxml import etree\n\nfrom calibre import browser as _browser, prints, random_user_agent\nfrom calibre.constants import cache_dir\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.utils.lock import ExclusiveFile\nfrom calibre.utils.random_ua import accept_header_for_ua\n\ncurrent_version = (1, 2, 0)\nminimum_calibre_version = (2, 80, 0)\nwebcache = {}\nwebcache_lock = Lock()\n\n\nResult = namedtuple('Result', 'url title cached_url')\n\n\n@contextmanager\ndef rate_limit(name='test', time_between_visits=2, max_wait_seconds=5 * 60, sleep_time=0.2):\n lock_file = os.path.join(cache_dir(), 'search-engine.' + name + '.lock')\n with ExclusiveFile(lock_file, timeout=max_wait_seconds, sleep_time=sleep_time) as f:\n try:\n lv = float(f.read().decode('utf-8').strip())\n except Exception:\n lv = 0\n # we cannot use monotonic() as this is cross process and historical\n # data as well\n delta = time.time() - lv\n if delta < time_between_visits:\n time.sleep(time_between_visits - delta)\n try:\n yield\n finally:\n f.seek(0)\n f.truncate()\n f.write(repr(time.time()).encode('utf-8'))\n\n\ndef tostring(elem):\n return etree.tostring(elem, encoding='unicode', method='text', with_tail=False)\n\n\ndef browser():\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n br = _browser(user_agent=ua)\n br.set_handle_gzip(True)\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n return br\n\n\ndef encode_query(**query):\n q = {k.encode('utf-8'): v.encode('utf-8') for k, v in query.items()}\n return urlencode(q).decode('utf-8')\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef query(br, url, key, dump_raw=None, limit=1, parser=parse_html, timeout=60, save_raw=None, simple_scraper=None):\n with rate_limit(key):\n if simple_scraper is None:\n raw = br.open_novisit(url, timeout=timeout).read()\n raw = xml_to_unicode(raw, strip_encoding_pats=True)[0]\n else:\n raw = simple_scraper(url, timeout=timeout)\n if dump_raw is not None:\n with open(dump_raw, 'w') as f:\n f.write(raw)\n if save_raw is not None:\n save_raw(raw)\n return parser(raw)\n\n\ndef quote_term(x):\n ans = quote_plus(x.encode('utf-8'))\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans\n\n\n# DDG + Wayback machine {{{\n\n\ndef ddg_url_processor(url):\n return url\n\n\ndef ddg_term(t):\n t = t.replace('\"', '')\n if t.lower() in {'map', 'news'}:\n t = '\"' + t + '\"'\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef ddg_href(url):\n if url.startswith('/'):\n q = url.partition('?')[2]\n url = parse_qs(q.encode('utf-8'))['uddg'][0].decode('utf-8')\n return url\n\n\ndef wayback_machine_cached_url(url, br=None, log=prints, timeout=60):\n q = quote_term(url)\n br = br or browser()\n data = query(br, 'https://archive.org/wayback/available?url=' +\n q, 'wayback', parser=json.loads, limit=0.25, timeout=timeout)\n try:\n closest = data['archived_snapshots']['closest']\n if closest['available']:\n return closest['url'].replace('http:', 'https:')\n except Exception:\n pass\n from pprint import pformat\n log('Response from wayback machine:', pformat(data))\n\n\ndef wayback_url_processor(url):\n if url.startswith('/'):\n # Use original URL instead of absolutizing to wayback URL as wayback is\n # slow\n m = re.search('https?:', url)\n if m is None:\n url = 'https://web.archive.org' + url\n else:\n url = url[m.start():]\n return url\n\n\ndef ddg_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n # https://duck.co/help/results/syntax\n terms = [quote_term(ddg_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://duckduckgo.com/html/?q={q}&kp={kp}'.format(\n q=q, kp=1 if safe_search else -1)\n log('Making ddg query: ' + url)\n br = br or browser()\n root = query(br, url, 'ddg', dump_raw, timeout=timeout)\n ans = []\n for a in root.xpath('//*[@class=\"results\"]//*[@class=\"result__title\"]/a[@href and @class=\"result__a\"]'):\n try:\n ans.append(Result(ddg_href(a.get('href')), tostring(a), None))\n except KeyError:\n log('Failed to find ddg href in:', a.get('href'))\n return ans, url\n\n\ndef ddg_develop():\n br = browser()\n for result in ddg_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', get_cached_url(result.url, br))\n print()\n# }}}\n\n# Bing {{{\n\n\ndef bing_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef bing_url_processor(url):\n return url\n\n\ndef bing_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60, show_user_agent=False):\n # http://vlaurie.com/computers2/Articles/bing_advanced_search.htm\n terms = [quote_term(bing_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.bing.com/search?q={q}'.format(q=q)\n log('Making bing query: ' + url)\n br = br or browser()\n br.addheaders = [x for x in br.addheaders if x[0].lower() != 'user-agent']\n ua = ''\n from calibre.utils.random_ua import random_common_chrome_user_agent\n while not ua or 'Edg/' in ua:\n ua = random_common_chrome_user_agent()\n if show_user_agent:\n print('User-agent:', ua)\n br.addheaders.append(('User-agent', ua))\n\n root = query(br, url, 'bing', dump_raw, timeout=timeout)\n ans = []\n for li in root.xpath('//*[@id=\"b_results\"]/li[@class=\"b_algo\"]'):\n a = li.xpath('descendant::h2/a[@href]') or li.xpath('descendant::div[@class=\"b_algoheader\"]/a[@href]')\n a = a[0]\n title = tostring(a)\n try:\n div = li.xpath('descendant::div[@class=\"b_attribution\" and @u]')[0]\n except IndexError:\n log('Ignoring {!r} as it has no cached page'.format(title))\n continue\n d, w = div.get('u').split('|')[-2:]\n cached_url = 'https://cc.bingj.com/cache.aspx?q={q}&d={d}&mkt=en-US&setlang=en-US&w={w}'.format(\n q=q, d=d, w=w)\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans, url\n\n\ndef bing_develop():\n for result in bing_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', show_user_agent=True)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n# Google {{{\n\n\ndef google_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef google_url_processor(url):\n return url\n\n\ndef google_get_cached_url(url, br=None, log=prints, timeout=60):\n ourl = url\n if not isinstance(url, bytes):\n url = url.encode('utf-8')\n cu = quote(url, safe='')\n if isinstance(cu, bytes):\n cu = cu.decode('utf-8')\n cached_url = 'https://webcache.googleusercontent.com/search?q=cache:' + cu\n br = google_specialize_browser(br or browser())\n try:\n raw = query(br, cached_url, 'google-cache', parser=lambda x: x.encode('utf-8'), timeout=timeout)\n except Exception as err:\n log('Failed to get cached URL from google for URL: {} with error: {}'.format(ourl, err))\n else:\n with webcache_lock:\n webcache[cached_url] = raw\n return cached_url\n\n\ndef google_extract_cache_urls(raw):\n if isinstance(raw, bytes):\n raw = raw.decode('utf-8', 'replace')\n pat = re.compile(r'\\\\x22(https://webcache\\.googleusercontent\\.com/.+?)\\\\x22')\n upat = re.compile(r'\\\\\\\\u([0-9a-fA-F]{4})')\n cache_pat = re.compile('cache:([^:]+):(.+)')\n\n def urepl(m):\n return chr(int(m.group(1), 16))\n\n seen = set()\n ans = {}\n for m in pat.finditer(raw):\n cache_url = upat.sub(urepl, m.group(1))\n m = cache_pat.search(cache_url)\n cache_id, src_url = m.group(1), m.group(2)\n if cache_id in seen:\n continue\n seen.add(cache_id)\n src_url = src_url.split('+')[0]\n src_url = unquote(src_url)\n ans[src_url] = cache_url\n return ans\n\n\ndef google_parse_results(root, raw, log=prints, ignore_uncached=True):\n cache_url_map = google_extract_cache_urls(raw)\n # print('\\n'.join(cache_url_map))\n ans = []\n for div in root.xpath('//*[@id=\"search\"]//*[@id=\"rso\"]//div[descendant::h3]'):\n try:\n a = div.xpath('descendant::a[@href]')[0]\n except IndexError:\n log('Ignoring div with no main result link')\n continue\n title = tostring(a)\n src_url = a.get('href')\n if src_url in cache_url_map:\n cached_url = cache_url_map[src_url]\n else:\n try:\n c = div.xpath('descendant::*[@role=\"menuitem\"]//a[@class=\"fl\"]')[0]\n except IndexError:\n if ignore_uncached:\n log('Ignoring {!r} as it has no cached page'.format(title))\n continue\n c = {'href': ''}\n cached_url = c.get('href')\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans\n\n\ndef google_specialize_browser(br):\n with webcache_lock:\n if not hasattr(br, 'google_consent_cookie_added'):\n br.set_simple_cookie('CONSENT', 'YES+', '.google.com', path='/')\n br.google_consent_cookie_added = True\n return br\n\n\ndef google_format_query(terms, site=None, tbm=None):\n terms = [quote_term(google_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.google.com/search?q={q}'.format(q=q)\n if tbm:\n url += '&tbm=' + tbm\n return url\n\n\ndef google_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n url = google_format_query(terms, site)\n log('Making google query: ' + url)\n br = google_specialize_browser(br or browser())\n r = []\n root = query(br, url, 'google', dump_raw, timeout=timeout, save_raw=r.append)\n return google_parse_results(root, r[0], log=log), url\n\n\ndef google_develop(search_terms='1423146786', raw_from=''):\n if raw_from:\n with open(raw_from, 'rb') as f:\n raw = f.read()\n results = google_parse_results(parse_html(raw), raw)\n else:\n br = browser()\n results = google_search(search_terms.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]\n for result in results:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n\ndef get_cached_url(url, br=None, log=prints, timeout=60):\n return google_get_cached_url(url, br, log, timeout) or wayback_machine_cached_url(url, br, log, timeout)\n\n\ndef get_data_for_cached_url(url):\n with webcache_lock:\n return webcache.get(url)\n\n\ndef resolve_url(url):\n prefix, rest = url.partition(':')[::2]\n if prefix == 'bing':\n return bing_url_processor(rest)\n if prefix == 'wayback':\n return wayback_url_processor(rest)\n return url\n\n\n# if __name__ == '__main__':\n# import sys\n# func = sys.argv[-1]\n# globals()[func]()\n" + "search_engines": "#!/usr/bin/env python\n# vim:fileencoding=utf-8\n# License: GPLv3 Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>\n\nfrom __future__ import absolute_import, division, print_function, unicode_literals\n\nimport json\nimport os\nimport re\nimport sys\nimport time\nfrom collections import namedtuple\nfrom contextlib import contextmanager\nfrom functools import partial\nfrom threading import Lock\n\ntry:\n from urllib.parse import parse_qs, quote, quote_plus, urlencode, urlparse\nexcept ImportError:\n from urllib import quote, quote_plus, urlencode\n\n from urlparse import parse_qs, urlparse\n\nfrom lxml import etree\n\nfrom calibre import browser as _browser\nfrom calibre import prints as safe_print\nfrom calibre import random_user_agent\nfrom calibre.constants import cache_dir\nfrom calibre.ebooks.chardet import xml_to_unicode\nfrom calibre.utils.lock import ExclusiveFile\nfrom calibre.utils.random_ua import accept_header_for_ua\n\ncurrent_version = (1, 2, 5)\nminimum_calibre_version = (2, 80, 0)\nwebcache = {}\nwebcache_lock = Lock()\nprints = partial(safe_print, file=sys.stderr)\n\n\nResult = namedtuple('Result', 'url title cached_url')\n\n\n@contextmanager\ndef rate_limit(name='test', time_between_visits=2, max_wait_seconds=5 * 60, sleep_time=0.2):\n lock_file = os.path.join(cache_dir(), 'search-engine.' + name + '.lock')\n with ExclusiveFile(lock_file, timeout=max_wait_seconds, sleep_time=sleep_time) as f:\n try:\n lv = float(f.read().decode('utf-8').strip())\n except Exception:\n lv = 0\n # we cannot use monotonic() as this is cross process and historical\n # data as well\n delta = time.time() - lv\n if delta < time_between_visits:\n time.sleep(time_between_visits - delta)\n try:\n yield\n finally:\n f.seek(0)\n f.truncate()\n f.write(repr(time.time()).encode('utf-8'))\n\n\ndef tostring(elem):\n return etree.tostring(elem, encoding='unicode', method='text', with_tail=False)\n\n\ndef browser():\n ua = random_user_agent(allow_ie=False)\n # ua = 'Mozilla/5.0 (Linux; Android 8.0.0; VTR-L29; rv:63.0) Gecko/20100101 Firefox/63.0'\n br = _browser(user_agent=ua)\n br.set_handle_gzip(True)\n br.addheaders += [\n ('Accept', accept_header_for_ua(ua)),\n ('Upgrade-insecure-requests', '1'),\n ]\n return br\n\n\ndef encode_query(**query):\n q = {k.encode('utf-8'): v.encode('utf-8') for k, v in query.items()}\n return urlencode(q).decode('utf-8')\n\n\ndef parse_html(raw):\n try:\n from html5_parser import parse\n except ImportError:\n # Old versions of calibre\n import html5lib\n return html5lib.parse(raw, treebuilder='lxml', namespaceHTMLElements=False)\n else:\n return parse(raw)\n\n\ndef query(br, url, key, dump_raw=None, limit=1, parser=parse_html, timeout=60, save_raw=None, simple_scraper=None):\n with rate_limit(key):\n if simple_scraper is None:\n raw = br.open_novisit(url, timeout=timeout).read()\n raw = xml_to_unicode(raw, strip_encoding_pats=True)[0]\n else:\n raw = simple_scraper(url, timeout=timeout)\n if dump_raw is not None:\n with open(dump_raw, 'w') as f:\n f.write(raw)\n if save_raw is not None:\n save_raw(raw)\n return parser(raw)\n\n\ndef quote_term(x):\n ans = quote_plus(x.encode('utf-8'))\n if isinstance(ans, bytes):\n ans = ans.decode('utf-8')\n return ans\n\n\n# DDG + Wayback machine {{{\n\n\ndef ddg_url_processor(url):\n return url\n\n\ndef ddg_term(t):\n t = t.replace('\"', '')\n if t.lower() in {'map', 'news'}:\n t = '\"' + t + '\"'\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef ddg_href(url):\n if url.startswith('/'):\n q = url.partition('?')[2]\n url = parse_qs(q.encode('utf-8'))['uddg'][0].decode('utf-8')\n return url\n\n\ndef wayback_machine_cached_url(url, br=None, log=prints, timeout=60):\n q = quote_term(url)\n br = br or browser()\n data = query(br, 'https://archive.org/wayback/available?url=' +\n q, 'wayback', parser=json.loads, limit=0.25, timeout=timeout)\n try:\n closest = data['archived_snapshots']['closest']\n if closest['available']:\n ans = closest['url'].replace('http:', 'https:', 1)\n # get unmodified HTML\n ans = ans.replace(closest['timestamp'], closest['timestamp'] + 'id_', 1)\n return ans\n except Exception:\n pass\n from pprint import pformat\n log('Response from wayback machine:', pformat(data))\n\n\ndef wayback_url_processor(url):\n if url.startswith('/'):\n # Use original URL instead of absolutizing to wayback URL as wayback is\n # slow\n m = re.search('https?:', url)\n if m is None:\n url = 'https://web.archive.org' + url\n else:\n url = url[m.start():]\n return url\n\n\nddg_scraper_storage = []\n\n\ndef ddg_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n # https://duck.co/help/results/syntax\n terms = [quote_term(ddg_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://duckduckgo.com/html/?q={q}&kp={kp}'.format(\n q=q, kp=1 if safe_search else -1)\n log('Making ddg query: ' + url)\n from calibre.scraper.simple import read_url\n br = br or browser()\n root = query(br, url, 'ddg', dump_raw, timeout=timeout, simple_scraper=partial(read_url, ddg_scraper_storage))\n ans = []\n for a in root.xpath('//*[@class=\"results\"]//*[@class=\"result__title\"]/a[@href and @class=\"result__a\"]'):\n try:\n ans.append(Result(ddg_href(a.get('href')), tostring(a), None))\n except KeyError:\n log('Failed to find ddg href in:', a.get('href'))\n return ans, url\n\n\ndef ddg_develop():\n br = browser()\n for result in ddg_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', get_cached_url(result.url, br))\n print()\n# }}}\n\n# Bing {{{\n\n\ndef bing_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef bing_url_processor(url):\n return url\n\n\ndef bing_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60, show_user_agent=False):\n # http://vlaurie.com/computers2/Articles/bing_advanced_search.htm\n terms = [quote_term(bing_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.bing.com/search?q={q}'.format(q=q)\n log('Making bing query: ' + url)\n br = br or browser()\n br.addheaders = [x for x in br.addheaders if x[0].lower() != 'user-agent']\n ua = ''\n from calibre.utils.random_ua import random_common_chrome_user_agent\n while not ua or 'Edg/' in ua:\n ua = random_common_chrome_user_agent()\n if show_user_agent:\n print('User-agent:', ua)\n br.addheaders.append(('User-agent', ua))\n\n root = query(br, url, 'bing', dump_raw, timeout=timeout)\n ans = []\n for li in root.xpath('//*[@id=\"b_results\"]/li[@class=\"b_algo\"]'):\n a = li.xpath('descendant::h2/a[@href]') or li.xpath('descendant::div[@class=\"b_algoheader\"]/a[@href]')\n a = a[0]\n title = tostring(a)\n try:\n div = li.xpath('descendant::div[@class=\"b_attribution\" and @u]')[0]\n except IndexError:\n log('Ignoring {!r} as it has no cached page'.format(title))\n continue\n d, w = div.get('u').split('|')[-2:]\n cached_url = 'https://cc.bingj.com/cache.aspx?q={q}&d={d}&mkt=en-US&setlang=en-US&w={w}'.format(\n q=q, d=d, w=w)\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans, url\n\n\ndef bing_develop():\n for result in bing_search('heroes abercrombie'.split(), 'www.amazon.com', dump_raw='/t/raw.html', show_user_agent=True)[0]:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n# Google {{{\n\n\ndef google_term(t):\n t = t.replace('\"', '')\n if t in {'OR', 'AND', 'NOT'}:\n t = t.lower()\n return t\n\n\ndef google_url_processor(url):\n return url\n\n\ndef google_cache_url_for_url(url):\n if not isinstance(url, bytes):\n url = url.encode('utf-8')\n cu = quote(url, safe='')\n if isinstance(cu, bytes):\n cu = cu.decode('utf-8')\n return 'https://webcache.googleusercontent.com/search?q=cache:' + cu\n\n\ndef google_get_cached_url(url, br=None, log=prints, timeout=60):\n cached_url = google_cache_url_for_url(url)\n br = google_specialize_browser(br or browser())\n try:\n raw = query(br, cached_url, 'google-cache', parser=lambda x: x.encode('utf-8'), timeout=timeout)\n except Exception as err:\n log('Failed to get cached URL from google for URL: {} with error: {}'.format(url, err))\n else:\n with webcache_lock:\n webcache[cached_url] = raw\n return cached_url\n\n\ndef canonicalize_url_for_cache_map(url):\n try:\n purl = urlparse(url)\n except Exception:\n return url\n if '.amazon.' in purl.netloc:\n url = url.split('&', 1)[0]\n return url\n\n\ndef google_parse_results(root, raw, log=prints, ignore_uncached=True):\n ans = []\n seen = set()\n for div in root.xpath('//*[@id=\"search\"]//*[@id=\"rso\"]//div[descendant::h3]'):\n try:\n a = div.xpath('descendant::a[@href]')[0]\n except IndexError:\n log('Ignoring div with no main result link')\n continue\n title = tostring(a)\n src_url = a.get('href')\n # print(f'{src_url=}')\n curl = canonicalize_url_for_cache_map(src_url)\n if curl in seen:\n continue\n seen.add(curl)\n cached_url = google_cache_url_for_url(curl)\n ans.append(Result(a.get('href'), title, cached_url))\n if not ans:\n title = ' '.join(root.xpath('//title/text()'))\n log('Failed to find any results on results page, with title:', title)\n return ans\n\n\ndef google_consent_cookies():\n # See https://github.com/benbusby/whoogle-search/pull/1054 for cookies\n from base64 import standard_b64encode\n from datetime import date\n base = {'domain': '.google.com', 'path': '/'}\n b = base.copy()\n b['name'], b['value'] = 'CONSENT', 'PENDING+987'\n yield b\n template = b'\\x08\\x01\\x128\\x08\\x14\\x12+boq_identityfrontenduiserver_20231107.05_p0\\x1a\\x05en-US \\x03\\x1a\\x06\\x08\\x80\\xf1\\xca\\xaa\\x06'\n template.replace(b'20231107', date.today().strftime('%Y%m%d').encode('ascii'))\n b = base.copy()\n b['name'], b['value'] = 'SOCS', standard_b64encode(template).decode('ascii').rstrip('=')\n yield b\n\n\ndef google_specialize_browser(br):\n with webcache_lock:\n if not hasattr(br, 'google_consent_cookie_added'):\n for c in google_consent_cookies():\n br.set_simple_cookie(c['name'], c['value'], c['domain'], path=c['path'])\n br.google_consent_cookie_added = True\n return br\n\n\ndef is_probably_book_asin(t):\n return t and len(t) == 10 and t.startswith('B') and t.upper() == t\n\n\ndef is_asin_or_isbn(t):\n from calibre.ebooks.metadata import check_isbn\n return bool(check_isbn(t) or is_probably_book_asin(t))\n\n\ndef google_format_query(terms, site=None, tbm=None):\n prevent_spelling_correction = False\n for t in terms:\n if is_asin_or_isbn(t):\n prevent_spelling_correction = True\n break\n terms = [quote_term(google_term(t)) for t in terms]\n if site is not None:\n terms.append(quote_term(('site:' + site)))\n q = '+'.join(terms)\n url = 'https://www.google.com/search?q={q}'.format(q=q)\n if tbm:\n url += '&tbm=' + tbm\n if prevent_spelling_correction:\n url += '&nfpr=1'\n return url\n\n\ndef google_search(terms, site=None, br=None, log=prints, safe_search=False, dump_raw=None, timeout=60):\n url = google_format_query(terms, site)\n log('Making google query: ' + url)\n br = google_specialize_browser(br or browser())\n r = []\n root = query(br, url, 'google', dump_raw, timeout=timeout, save_raw=r.append)\n return google_parse_results(root, r[0], log=log), url\n\n\ndef google_develop(search_terms='1423146786', raw_from=''):\n if raw_from:\n with open(raw_from, 'rb') as f:\n raw = f.read()\n results = google_parse_results(parse_html(raw), raw)\n else:\n br = browser()\n results = google_search(search_terms.split(), 'www.amazon.com', dump_raw='/t/raw.html', br=br)[0]\n for result in results:\n if '/dp/' in result.url:\n print(result.title)\n print(' ', result.url)\n print(' ', result.cached_url)\n print()\n# }}}\n\n\ndef get_cached_url(url, br=None, log=prints, timeout=60):\n return google_get_cached_url(url, br, log, timeout) or wayback_machine_cached_url(url, br, log, timeout)\n\n\ndef get_data_for_cached_url(url):\n with webcache_lock:\n return webcache.get(url)\n\n\ndef resolve_url(url):\n prefix, rest = url.partition(':')[::2]\n if prefix == 'bing':\n return bing_url_processor(rest)\n if prefix == 'wayback':\n return wayback_url_processor(rest)\n return url\n\n\n# if __name__ == '__main__':\n# import sys\n# func = sys.argv[-1]\n# globals()[func]()\n" } \ No newline at end of file diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/__init__.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/__init__.cpython-311.pyc index 4e68432a38fda12fb9e13685c3c4334ab212391f..f9a61551ba1e8a4e2bf9877455da3c3fed971ca2 100644 GIT binary patch delta 21 bcmZ1#wJM5dIWI340}y;p=S<tkBc}@hMJ5HY delta 21 bcmZ1#wJM5dIWI340}y<kQ;@omM@|<2Nd5*) diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_asn1.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_asn1.cpython-311.pyc index 74cda635a022787d4566923ad5988fcacc50cf59..92728781d933de0567b340006e038540ac76f49a 100644 GIT binary patch delta 21 bcmdnPw}+2sIWI340}y;p=S<tkW55moJgfyN delta 21 bcmdnPw}+2sIWI340}y<kQ;@om$ABFGK!gRv diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_asymmetric.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_asymmetric.cpython-311.pyc index 814e2144dacc592eb66a0265a64547c73c89effd..02e47dc4d1866897029db5139979c4bfc9c4cd42 100644 GIT binary patch delta 23 dcmZqcW@_tZ;#tni%f$c$pVK+hHu6-p0su>227>?q delta 23 dcmZqcW@_tZ;#tni%f$c$pXU^$Zse(I1prSs2Oa<b diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_errors.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_errors.cpython-311.pyc index 985e597a0bcae9353d2c39e4f2ff7af432145be8..33291757dbb7bce46b4db1cc1f2568fc723e6220 100644 GIT binary patch delta 21 bcmey$^_7cfIWI340}y;p=S<tklgSDIMQjDi delta 21 bcmey$^_7cfIWI340}y<kQ;@omCzBNbNkj%^ diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_ffi.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_ffi.cpython-311.pyc index 23fa2535f0c0b5ff76fc412ad96e3e24578c45af..06ccbb7b5d704bd38263162b74d619460fbe361e 100644 GIT binary patch delta 23 dcmbO{nQ`)DMxN!oyj%=G@Hw3`Z6i;+Cjd^327CYj delta 23 dcmbO{nQ`)DMxN!oyj%=G@Oe%_>PDV+PXJP72NwVU diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_rand.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_rand.cpython-311.pyc index 06ea41a46752abe529710f1e02c68b81f631b6ad..799852ffe9c9965ba51b182d8bfead61c687987c 100644 GIT binary patch delta 21 bcmcc1bC-u_IWI340}y;p=S<tk6UYVtLCFP& delta 21 bcmcc1bC-u_IWI340}y<kQ;@omCy)&QMWF^F diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_types.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/_types.cpython-311.pyc index 0133a84f0c94f08edee0c84b6874d32542e8eb53..8be6dabe0c8e04b972744df7f874701b3b90dd0a 100644 GIT binary patch delta 21 bcmdnNvxA3cIWI340}y;p=S<tkqr(OOJGTWG delta 21 bcmdnNvxA3cIWI340}y<kQ;@omM~4jnKaT~o diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/asymmetric.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/asymmetric.cpython-311.pyc index 1b71e286e2ece6043793c195c4aec9576cfa51fd..45bd353aa4adaf5a9200cdc00a0edc0af04ef4b1 100644 GIT binary patch delta 21 bcmZ3Vvp$DsIWI340}y;p=S<tkqihBMNUa6! delta 21 bcmZ3Vvp$DsIWI340}y<kQ;@omN7)PjOoaxB diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/errors.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/errors.cpython-311.pyc index 13cabcf3dbf038635a7e58bf2a59935da1840976..83b75cefea734ff0343a795a65f0d9c085a1521f 100644 GIT binary patch delta 21 bcmew?|5=`AIWI340}y;p=S<tk^PC?5Nk9g8 delta 21 bcmew?|5=`AIWI340}y<kQ;@om=Q%$BO&A9g diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/kdf.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/kdf.cpython-311.pyc index bee46af2172c7d4be8c8fd5671d4c7e2de2b86c6..7517ad360c29a95b8bf0727e47e9b1db6259f04b 100644 GIT binary patch delta 21 bcmZqjY4YJ&&dbZi00f`YIny@sd{YGgK6(Zf delta 21 bcmZqjY4YJ&&dbZi00f`s6r^tC`KAg0LQ)2> diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/keys.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/keys.cpython-311.pyc index f9cf06e30ee39e225b038623df59601d50d7d5cb..1e101d5327b8c5a50f1e867edda2b850592b2137 100644 GIT binary patch delta 21 bcmey!_K}TeIWI340}y;p=S<tklgbPLL@EWe delta 21 bcmey!_K}TeIWI340}y<kQ;@omCzTlhNCE~= diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/symmetric.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/symmetric.cpython-311.pyc index 280cea7c5a394bbedc5e7c43b63eb33c389f841c..497fda3ea4623d32d6ca491cb98c7eae8d9f7b79 100644 GIT binary patch delta 21 bcmbQjGlhp|IWI340}y;p=S<tk!@&jsHO~aB delta 21 bcmbQjGlhp|IWI340}y<kQ;@omhl33OIj03j diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/util.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/util.cpython-311.pyc index c8fe5ffdbb0048fbc6df89dbb3b98b0fabbcdf0e..31bbbabb6c5f34988b5d92b41812d6e836b1d973 100644 GIT binary patch delta 21 bcmZ1>yh4~~IWI340}y;p=S<tkGlvrZJ0t~p delta 21 bcmZ1>yh4~~IWI340}y<kQ;@omXAUO-KKuq0 diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/version.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/__pycache__/version.cpython-311.pyc index 18100f5d3eab26448a7856bc4f146942091007be..feb701ba4110377dcbfc8710aaf68f3594449aa5 100644 GIT binary patch delta 21 bcmbQwJfE3oIWI340}y;p=S<tkGno+pH$nwA delta 21 bcmbQwJfE3oIWI340}y<kQ;@omXEGxII~oPi diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/__init__.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/__init__.cpython-311.pyc index a00699f3cde6dbf7237b75d6a70fad50aef0cd49..d85fd96660dc18df8a9ab212a86b03a2d032cf44 100644 GIT binary patch delta 20 acmX@Yc!ZH>IWI340}y;p=S-W(vjYG(2L*rt delta 20 acmX@Yc!ZH>IWI340}y<kQ;<55X9oZ}L<SoG diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/_libcrypto.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/_libcrypto.cpython-311.pyc index ea9aad7598367e45d25f3624eae8b1fc108349a5..0b591a7cbc36a3c02e81dcc5734ee932210f442a 100644 GIT binary patch delta 21 bcmeyT_D_vxIWI340}y;p=S<tkQzQ%kOB@C( delta 21 bcmeyT_D_vxIWI340}y<kQ;@omr$`t8PV@%G diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/_libcrypto_cffi.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/_libcrypto_cffi.cpython-311.pyc index 75f136d36aaab3d7c53aedef6008259d4e50231a..ce7e775e9a90cdeb525844eb9187de6f8c172cda 100644 GIT binary patch delta 21 bcmewp`6rTRIWI340}y;p=S<tk^FapyQ*#F- delta 21 bcmewp`6rTRIWI340}y<kQ;@om=YtLaS4#)K diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/asymmetric.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/asymmetric.cpython-311.pyc index 86b539c278097b1c2449d3dee36bc6a280828adc..5f9eed872f0dbbf510c5fdad67eb0b665181148e 100644 GIT binary patch delta 26 gcmZo$!P2&Zg=aZ0FBbz4d`{;~YvkF=!}v=W0A!K}VE_OC delta 26 gcmZo$!P2&Zg=aZ0FBbz4e4bN~+Q_q&hw+y%0BSo2`~Uy| diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/symmetric.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/symmetric.cpython-311.pyc index 75bd3cb7b61a69bd74eba345877befbf19aa9e85..4d0168326dea4f7f4afaa69dca036f6ddd73b110 100644 GIT binary patch delta 23 dcmZ2<jd9U6MxN!oyj%=G@Hw3`Z6l9ZHUL`<2GIZj delta 23 dcmZ2<jd9U6MxN!oyj%=G@Oe%_>P8;1Yye*62W$WU diff --git a/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/util.cpython-311.pyc b/arch-config/.config/calibre/plugins/DeACSM/modules/oscrypto/oscrypto/_openssl/__pycache__/util.cpython-311.pyc index 37d4c4c58076d7f472590a0614d7f5f357a40425..5ceda6b3f9572e4a58eb34e0430700a5e352fbde 100644 GIT binary patch delta 20 acmeBi=yBj#&dbZi00f`YInx&MC;$LAD+LAs delta 20 acmeBi=yBj#&dbZi00f`s6r?WXQ2+osXa%7F diff --git a/arch-config/.config/calibre/plugins/KFX Input.zip b/arch-config/.config/calibre/plugins/KFX Input.zip index 450f49c1b3588a528dfbb63043881f350ddafbdb..7ad1f36874893931bc0157ceb4baa1c6376d876f 100644 GIT binary patch delta 242928 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 (N;x|-HgW>Y77GS)+uf@~*542^%y*N$jnvA&c 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∾(MSB=Id6Pf2d<a7!&Z)RzWA162QI+k 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 JKOD#d`riiTeMJBO delta 41390 zcmd3P33wDm`gbOoneLgK({tzS%p@=a$>bs&;Y=W4xDsw5gvpRhNFWzUfFN>tq2Pg{ zc|iriRlxNCL~RuX)b*CjT`v>_@AU#?S5a5^e$_oQNdR5{&-4GD@53ifcXf5uTUBqp z_1^vN=G#@r?q6;z8xx_{hp~TipII_(S@?`48{)#kHpH#dKlhU=k6vg_>Or@D>D2D_ zJU>gbd)JG_;f|U{kH4|Hbx~bgt;^w=SJUori%l(JO`|w?u;^IWw4kcv>x2~ATwzx4 z_P*Rxwfojr8dSR@UaM5?p7;8$h^WpkuW8@i@8B!b)H4gNo<^!3s#Jaku5KLI`&Ow} z4^>5Y008MRm#Xw_`Pr61x5rAFUsZ*w;IoGRs3y7PXJtpfIxoGJ9=<>L9_?SJiIw)c z!c7z93Zqnq=1WJf3V$c?a+>sytHU43m7nDt7`{ikamU3kFMB*Z|0cP@*N5ZQNqYuH z3=8$_7#xutCqEl}{D@1sVqAnL@GNCj$M^`TW4!vq>*VK#Yi1PF;=ikp2WON4MgUAN z(LdDFqvT4@pUV1CI(I^Sx;yyEpQ*)Ba)snWxm%=>y)~}}D@c7jnnAPWXVpuq)1>yb zn$(Ekyr7FO$49gI>~pv&{^{_ru&3#XPc#RDAZ-6sGoMyAtE`mwnZ`xi%2m<Q&7Wy< zR59$GEq8^D{`l3fu#aDr-uzr+2(=pVPt7S6MSY|BMIVj-#*|I;P8m<LPHB>_oZaZi zh}Mhv=csB8UDo<Tm(BH|%a*3lWm|3MWlQLCVO{XDLi+m|O^sbDiqujr@k6vT>F~`F zYHMv%OPjae*EnZ^Z;oHAYZL>pd^c3<p<#Iu9Q7Ec?L&uWXw)<~Uu&X;!?e9<#VD;v zaYMB+5&p)W^l-5@pB#nSBwAakjiE<wQAJVn>xn!a&P&lIUeZIkV?krJBSUm7Xr=j? zDXEmbOvTauqC}3GinWQCHkn4}AJlR*jI<`{nnLYe)1<%Lt^KQ>mOQ8(M0+084yEVs z#dFP8Z83vDL(vatc`Dzkb<?n0)lqckR;`at*QRJF<t{vp*rrWm^%ALh9bOyzkT#Zl z+q4eK?vt#h#)q^9x_6t_M%fcn)b!joZMxFva}R0zk+=pk;(b7?rT;vn?Xm8}A~jWR z*G}rv`U~5&y`|ImU$n9xQ=ZbMniSG7+k4a0m*x!{VH_G3W*jP=JfoeZQt4^sb6O(} zS*g=X-m}^~leClL?ubzL_2g#LNjH}-bwqO2DoT&$eA3s^+=CI)CIk1+a5|XA#nOEy zZVWw;%zZCywsD`@r0a6HAraP2((qYw_0*^TJ@r<vHZ065y_wH_7eRAY8q%a$*BKUs z$GjfBWonb*zLw;=u(0Ghsd5l^Moasi#WJfCh2C`GYg=^qY%i@`sY|qGfI3xsGsI?} zzpd8W+~TjUt7>a%p(7t!Y-Aq6?V-1Oa8`}zYZXT+g@;FQtEv7QTNK6g;H`99G3TWT zC$ttS5(I$`SmR^po%eKhDu2glpgU~wi8`lPR$M0L_wP%)*rd$<)|N;gKc}5Y`?kb8 zsCiyIM<2bXGZ-4`TB|b9Q)}Iv#s+_5TZQy(F*hNC=3URZX=l4xN8;67Hl3&vqA2Am zj+5>$;XYK6YAn}4&3<bPtr^3)==3rUIJ!MtO&O~&mqW*L@wESpj+a+C%8^wT9HWCy zuHxMCYB!GMtWo7%p3#I=CL^u5n~Rt5><tw)j<&|q&11Npw4#*bsBAp`cWgWtL*vie zI9grCWzsbZRi=ykWZ0(58s1dDprNr<>5w+9;w(Bxu#oi>Zy7sdny08_@+5Cr@kH<N z(s5;_<BP{nmI0)lrJUJO?XPO8_IsOsEe++rQ#tiUE{!#=r|TA&ECX}Ix*D;|Ypr5k zt2n-?(J%VzTm9Xhc;@)qT&&gMrDLaz8$XFA%;L?o^C6=kcP_U_=SsP##8Aykfz6<( z@mvC>7W0;<u02y}s?A2tYgKBw0=CBYqk%W#AuP$?%D8K&bOJY)Y*R3of1SV?$Uljj zLWd@CiKJT3iBx9iO(ag{_C>U|wa{mixm<12g0|)bZM5rUi<vA_xDE8u6wbxf;FxV` zT0|4J8H^EPRu&DL&e?S+srI$`#KCm(kk(klkloep7Fp$XMi|+{au;fez1Z9J{>C|N zwQjLMbjgLi#T<9HCl%y759kjc)T-&3soWi^TpBu^b5PWk82fG0xTx@)3NlRROw<^q z(Nfu!7}l%Pxaa8GX&B7uGP{~e%emONoC>x)b>a{)M_vy~on|)D=|v6=-8!A)oDIIV zT2D=VQ&Wqp-e1!u_7<@>7kUH3DX*(=i?m}pm#435Y;(!=+!uEnJA+IAQ{Bp2U{N_Y z;_^_*kB`md_|%JtgbZ1RxS*N+c^Q~==5O&<ie_{1(+ti=<L$hKPE>G%sC+UeV(2U` zLFJ|uv$!Eii(2a1{I1!H+x)(k7T;nv+wxlE6jZp~H2-C*F&c}^@NJ>5eu3XbTXqRa zr1x?HeS4R|q)>rzUapc_`v?vaE4d-$ujJm<08KLV)I6KBbSE6C^ud)TJ0l!==`A1k zor(^O=C&C{(J3}I&G!|EBm4Ksk&kG~uGE=g*<oGlZ^xFaYY_*FG@_b&oNDKBu~9W* zRjm(YVCaU>$;mn+4fFB>4Y5RMsl?B1jH{|`aj|s?zD~EN=@VmucWBJv(9=vmmqNug zoH5+tAm3S?O}epx8yNL_Kp&IAjp+_9#V_GL>;6XeW$PI}3b#`BW-d}%do@>f2}xx$ zadFeTo((tA+FJ}ds$aof`DZ!_zM+>UtmKBPqbf4kmTE1)K5L_AuIIMXiC2v=v|(&~ z6t(W=lS5S6PVsB(F$$ITuj0;kxs~bJEjNOwZMl)VqRRu_O+cvBo3Q)49S=IXTD0=? z-A!D7HW53eXV-A|Xy~JRxH$6P&izMfxr2K@JPJtS_ceID4CSO5cX5AHQTTeC$`Wy- zRgsRY(PdYTkSVUbzLL0sI}joLa4)A;=_(X94vRKe5UkYjlEpx`+Tump_nj?)R@iwp z9sSPMm!iJ64OTNGqKEI}uA=HK+~GcBf%7fC`f^7O<CG?jDq=rn?0;he1%-|Zh9B&a z+>gJW#^29n*nn&~1#$^%vH@oStCr)S)W<BwyXM+ssqz8NoCKOOsn9dBWbEYPiHy9p zdz)s@^;fmAp91=BD^7@;AK^thp5~09ug=@jDE}{<ky393k&R0+YOFY_np!3``>Ono zuJ6;PVJ1sQDW{>Bvo>9P*Jg2Sc6o_zPco*^=~bZiLl%QRuX#xqNxyC8qN(8mScY>$ zaIhR6f;lQW3ofAQaJ+%UB^GP2X)W!zV6)Tp3$Rnm4rnxV;DW6O@egnYnF^gB&2!4h z5fy8Xr;LZu?u+eUI|lw_i>0Y&Z6FSlb^N*$JvH>uPlh;ZFVV%V`y@+H_=9W}R;LIg zhq5`WRpoQ>k@QNmT}<>fR*NA0F3{U~3!2?*YuDC+?ttv(P|g#4JlXViw5_$90S9j> zS1Oj*;h?Bvl`3#Z<WbHQoQV&#;U-@>XOW>6-;1}<)zNk{4W9|}#kdOP_Uqkz5<MDi zFQE^1a?uG@Z0^0SZ1UMz-PqKooY#Pk3eVasbjuGIVEqNNp2}kE#dJ@uQBM?uiD-V= ztfqT@0M=#yWaQ<^tpCv#L!bR%OQ)S%ZED(Izg^+3NyUz^`6cct_+Sgfn60_WFM zQ&;cDVipD}(XKS3DY!1WtjoO{!bgUa>>tBRZ-cKH$8F&Otx+C*+s`&5oh>(;>GaPw zlYC`zWR37ItgG@5A2)rBqd-RYLMki;C9R*Ji{XP!(MpB~ul{1orNbjkQGIY|FUdi5 zwpsF&*KpM*(12s9%$+E+Sk=_f3|<F>=cL_cRpZSD@?8%s&pv6^kaj(1r))RSFoZ{j zZiB%-8bz)hT;D=@T=<`_zPT1`gjmu5k;+rk($v7tu2z=}Ol#d${)}#$t$dVcl6PF; zq%jpFuX3+lU}$c8oJ;S|8mw!W<Ed(DT<C9UbFsZ%=x}>leGC0AJn*u1y*Lyz7?%P* zV6dZX{3wT;R&E9d|IOo^Ed(iu!;f3J<SJLFgf(71a<T`^oOeX=@X`^*6&aU2ESxmF zq{Q1l|MzPQA6_zfvUg<Rm7yw>v(#>*SzEaR2wvQHim_U>^x0OR^AB5bI*511t7%vc zh{~1QI1k01vRjl}na13(SsR-<+v{S~)*S-JUyoVtMoB`XtAaMK$LYwZRK(ooIW%({ zXB#-T**`}iifojB^tOC7chYc20Ub$mCeVdAdk^;NAHGX7Hh^uC=_7{HgL*t>iJ|sb z98dC4ig)86$uipG$n!84Nvj{{u836DM;;fQcpM_g*4>;XR?p-$ldL_GRXB%tb6GJf zmfSdX!rZ~%zdt-I?ET?X_#NaS@d-{xNndGGnT!@oe}5LT>GpKqKp#J)HPc%wbv<ZI z58R&r$Rg0%Bq5G&*`tl8zg(lU(e#t1B(0udBiO+`kbqyjR@avjp3~~%GQ|3(Idl9i z-bKEa#=6Eil=`eTMXT3W`)fpM{5wSb4?ff;(5~r5bn?9Rt?;@=x_hrSk^Mfs7n+0$ zNvo&+H|csWufkyoTo;*aSl86(YpKIciys_mD|QRyGA6n%}LSUy&v)uWeZV{&a1 zlQg=%Rpo0GXZsnUsH>^-SK}H;?ibr?{fk8(E_~J1C~a#JePUU4%{0a&w)B=8t7~j+ z^EHArF0Av3m6bC8*y2HbZ)eAqm9*m~-I}<z#m#`Q4kVzZO&nR*MlT!}jFfi{;@tAp zx*p+CPH}Q!(b!_Kzb7}3Doc5jr?uH%1(2$gzT5omZCwTw!dX_%&QhB2Io50QD6B~3 z>)L3#Z>rTygFn*_iJ0tfr^3&mci8+H^cW4VL(L-BsQCtp3-NWRA&$MI<xB<Q_yrBK z{Vk>P@eB^$H;3s>tWFyCo51m*esa!niPHL8bjQ@vZLetE;kud@zu(IqQ_jDQ$$apZ z_G@f;wBnd{ip0OJy<63#-qts?KX$p@{HAshRelR0nf27=!Gyo+lBw=aU9G(^w2~tM z7l_{YQt!yIg`*~sC)JohZ!Lzv^Uu{lzhP-64Mp9i>m|*+OLt4SuDPihlE5F$4=t;O zyd3$B_Bv%U_<!1r>dwL6S76l8_HVS)HF8tXQSe5(?HWFkQohxWqkT3$mUe!tUEDE- z*U<j!jZu84M>bOwzd`pL2j-43M;*86a;1d3b^36=zOK>#M_?7w)d!%qnM{T^u;n)I z2jUB_Yg4472ekSK8ZyA9Ojeh6{;CtDo*Q)~D(UtkTD>Z&xv75ff9qukee<?<UuSdO zUjqEe(v16bw}$Im=P$rs_#=Ra(8zbRH|jd;9eGFFPH~)(r{6AExh^e8NAA~s6i(wG zG-+w_=i21UA+7ZCd)jnWCtwtJHeN^l&T$s$<W}8n;gSCO`nu-U{{qo<N42ZE)$9&a zw@1LW8p6yq(xV?~H%9y+#=LV(``cw<+xxI?j7Ea)>AncIGV}gu!p?WrIN~<ub-b%p zcl_08q0R3>w;7vhHAoMCuGPqxqO@~vANbS5UuyMv@{xi6wfNf>v^0vro@Dy2r~niD zY?`{)bCbE$7Z%3;lE@(H?2`Kl?y!aqt~2ly_bk`WD0?D_i9!qrJ-3O5d|-*UFriSE zSXnQ)@i#I(k96A}Zf*pfI%n!9W$fcVP|@iZAQoj0NQjK9s%JVJ5J!b{IJQlBiBr?@ zsb;hE%B$Q6wer^Bx42x@UC-)brQCzu=PJ7CJ#3_+44p^1;xJR1$xTmvn_C}FkECn# z(j)J1C4pKG>=NRsG7Be8?AM%@?){vLBJpc*P4~Xf#Yv;z<3<M{d-W(cMn(RYA?OPq zaUFE;60<<FiY!`b|1s`V1RZ<JVxdDlq29~(L+(3vk~`I<?AuSc4FE7k<)z}!AeYSl zjQdFevpWD10MJLM*(^z0zv9|e(wwh33Rgyu^BtG0qB-Alxe+;iGo=mRb0gTOqe<Mv zYox!N=Az|6nWQJqa0dgUe)250L9Qgl{>a7tmqANaKXHExjCaPboIaf1)$uW;%7jed zJE1ivd0YKe3vf&=4jwlXhxhSf6<ZcJx9RB=$6K9UN?d^_I3&IE{EIWhfC7Z+y5a$N z9J$VOHX(!vK?RAMc1=Z(&F7UlGSR#XP(^0^qKlDsUEpR0Mm9{vzXE#vDYsb4=6Iiq z^qE-2KM7{qp8(TM6N)TGdNf5a=mL<t^)!65HJd&>2yNkse;7DwPJ?DIPR~a{XyTcE z7qSU#4m=g<`7Bu^n6Kw;^2JSh-Vg`Iu%*T^b4gV}_K>`$r4Bk1Ww+9c!8%9v{0LUL zqY<(n+U8=sF2~H7>DhTr4l!M<qSWWjnW2Z&770YZXDa^J5y_up2xX!>qWDz$TNFQ= zilTWRJsr(ICZi7(#PiX#dWA8H4xi<U=wC7XS0U`des7eIXqVf~v@Q(HU`eaLz6MIF zAjV1$8hAHHhj*K8beo-bL^0mT)#z*RyO+9Y><k-hD}}sz-DwdP5i1U}UUq&}_e#6Q znT*m~cHXO^%xb8%3ley{D(3L`C#Swu+Svc&cVTUMSMnwDH*4uaf)L4<Fh#=bdOsa` z7BpQZDhr+b4YcEC;1H;Xma@}$2NxhOtYkFJ;mm@xJ&liwh^Vh?rKMkURyvf&w<}v| znTuZ(L7U%(jNiP(9IJ)|;+D?!<^`FI(1A?8n$4yl<$3tHF1tnosTiY<0GD@Bi*!{V z{#WVQd_Ge}caP@v^h;lUE9*<7`3_5b$4*T9-FNW=$=9D>Ed5r%M`?|Y5kY2gae%y4 z(60M!sWP?<E#xbOOKV6w3i)eQ($HdlNq9tShDd9PcT1U9@OMPfXooJHnm)Bf68|vN z9<fecygUe+chVjOt_|$OA(bwQ+MPPF^MQm1X<dhSVj90JT=LG~-w0O-k-LJg)hL&@ z&*op!NZV`qf2pO74ScLhDSo7p-x^L?appnNr}KGHo!JUu&s$YnS6}U7=#v2@BCZR> z!bV00WHvZ((_CFcg-4;5+44`D*$gdlBjj^11dVvVX+a}a-bE>2f#JO6h&76aF685= z?ua!qIzw!fb#00ya^yFil{P=ksPA1WEzN3&Dz@?nGzKUBVbsy<b>LdPFM)k~dLiGN zvcEB^X?c+aME*{w7lyoOvQg!Jhn6Z|H1(kVH$ZDMdJ*3n%KOa^8PjO-3ec5Zi}-Zu zswMoIaJk8K&n62bEyIQ?xYK5oMlR#8Rvt)4R`AK;lKNWyy$D+I9#(zZ8|YlT0VuKZ zFVK{)T?#=w?hdF>QO48qrRYt*J#;&7kcO_}{~e`~HFcD|A9kiwV*qCFYaldv?}RE| zx*G#qeJ8)AJ8DTlt^32FZ7zJC%auHL^FOO-$8enxXz6eZ@9gQ7TUBJ0Ve+-7)!&Bs zm1mF%N=mo$j&SZ6r7{>xSszU&|HEBNCq5R`l>Cx5ifT9VK8Rf1$veHiksnQUDMAqb zKYMI2QD6Kcddwtg%JJ}4b@0kA4d2AyuA;{`@tM+Z_wleq_us-NknMhcYorIl6Vo+h zV|N^R0Hxa>f%dd45;OPc-;!~f?u2%UsgBYc{flZmzUF2)F}TKqfGNAs<;a30(B@Zk zq7HiDZQh~})vKYCH}gggQ^Vd~w<{TzkO%qLxb83Epb$6nS!CSG_o5p&W9Qw!6;yim z-2i9pDI6J}Zsk36<Pcyw+QQqZVgnH3p7r?OiVeVu8^-{%`gicr(%b9#43$=2RS!!c z<rpm{`fV$SeEkP79^EHFpvJ0bI&nkG<d>#Ky8T-;y5VmATY6wSzgg+%aqJOQ0S$hH zPmy*%1hU4-3l8<w%6mDphEaJao<G#sC?#FcG8*z~N*A1A7y<*u2rP!Yr`=-a5Zd({ z1fwtS0bXy;2Jy+<z-QC24@_z;TPc^DZe7o(upy<9ZWd?MIfgUgn#t#EC`m!ZA9xD3 z;p-QRtqYo&80)Ww3TXBQeiiLc&__iBPh~)4oeE_?#^<sLi0<fNPNBkGIQR-4=bxtQ zuLO&WLs=^o?B=so6gO3;G0O_3R?JEfQ(%>pDoyO_&8OiMg#z{oeui9;U1=giwP7)C zdfW`o(8sg0SnCKq3AUps)n%}hXY|5z5WDO5U=7DT2`W{v$Pz^d`<k^*M$aHmKnK>w z$eQw|E6@PrELz>P<p`HUL(g)<mGdd$DSnfRaGcnsuO!~od8YKEy?62r-FH7bSpGtZ zd-%l6re>U!vQ`2^#<|z#s`BA~j^Rq*lVnQ()QGJuRc;SW+Qavb|NRPd-5&noD7Qi~ zWC9@#e~yogpwfN(mD2Woyef|RJ);#U?rzvOp1DRFN#bD)zwcoz`sq!^Wb*9A`M=C& zi>9^g!HEyyg0cBJSQB?10e|!4VP;%B%=e&Xn@vL(4&!*dsLHq_e8$CPHy`0`-OJqF zZ#nw*2sYck-q>BTZTzp-m|`dk+n7q;=5sEtd<%PUQNK^U4F+`S5fJ_X;kxKi0ci+3 zUS9A{LtS8U{(zna&Oe2YK3rf;qKqC^oxE)!42<~)pUTP4+-_;Zd;Fu3YAjqey)Z~` zS(oL}P~E3|q6S5<z|4QzltLBTpi%hkQ*b86&-f-o1P)YM_iw&0o%sa{<r9C`T04dq zZFFlir1+`Vn^UBsANdXyJ#vo!w{+-dzMmE>-!$d$H>z}Ac4efopW6Am-pBiERnWgN zzK8J8MJH6cp`A6PUg5erUd{Y5B+~2Z%rQ(9?6KziwU4XA!X8&sjHqj*H$De>+PG53 zk*5bllf9zuea4u4tTcNOC-TckoWF4|hjUcr)a7@tk_d=Q^sW<d1R;{a6$m_;l^&Z4 zcKhx$-Dd^{(7iRTu~#|5!q}ff7D(xMURo6O5ka4he+^5*sb{r1nju1lIF+uuQyV99 zt?~|$`CGSiTZV26uNjLyQ%;pSqg6idq#60Tsj7=h>CgZjtgb@<^4wuMfqM7T{dP$m zys4LF_J`Kw;ztr*|2BfQ++>cIULLGlsW-U#R!_}dJo6TfJuHm<B`Y#@^A)-lT?8y5 z(y<A;vnma<+%(eh2|C6i^3uO2>CT0#TIjo}y3C0FJ>7KsLjaqpjihnYbOw!)N!L}a zo}$um-YJtu=JfRz71POOV1$SHK>MDah50>LuG4nR)bY}*Gj)g5G0eYb%aspKdf5;b z_OgMkXrlD=Rk}O0^!IdKBAvPd?Blg7b))s2YDiK|F&ep|1>o=eEgj5Sz3D5ho#uQ5 zc^InPc4@^mx(h1luh;38sikp`>kQ%2q9=5<su;Fz8`sC5JrN%kb|RkOOJscNDcw%h zK*ucC5?E1}UakBLbrs0Bp<nk<x7(fO@F*4oW_%v(Eg3)AJF(aeYN_+bF~K`aTK<}D z5pTT5K67gR-r=`T*Mx<!KXgXF<)<Z3+7VsP>9C*F!(zzPxIvMYNix-K3!3Zwdi{tx zxaPFVPjTLd9=O1l2Oof#mOB>JRWt83(NXKKn^W87sBla7AJKiPR)3v&-xP>SToP@4 zS0@-}Pgy#(`QfvgX?$21`!fTW!+p~%bn;zYZyI?7Td>!A*fleLGL?lKi=xT#mBt7f zY1h!3Kbev{oro-#I1%afZ7qvw`6^2#mAnJn<VA0mKCg|GcD}E>S}X6}FOQFW{CII# z*zsbi;A0(_sBQvPvb5x+t|5^&_b~JHz<EWOFjCqf?gm;h$ZY6%+6Yejf^LsYBA!gt zA4!+JvA%Y#p7MABC_(}Knyx=V`6o?gdU}d6mLhuUowW8NFfsm<CS#Ox8YxT{-P%*X zhlD*iO?D2pa8&Qomn4TY(X#Q*E6;MLU6}T7gzLpk8T$C}tXz6FL!U%Xx%E#<y)yOv zISo@W)kx)i^i6Tnlwv(JDThYt*Q+%0ai;)r?G^eYY0DM*2yG0k$FA89tl(^i2-f4T z<Mq>|9;JFW-0CXLCTZO){dHOgYcg;Wv^FcyT*mH^L``!Id_t!K8^eK3r^ju)?k;T@ z`%5G5T!W2P^iPYGG!6Q@c%uil1e~wTI5=}bHvTy>R;^p0$6qA=qVN}uzZm?*O6wNH z<=srap@!Wua!IyfhR@^F49g|e1j7=&Qo5qta4<%>oH*C;evDGVv)Hg#8}Q^~eslNy z^@H!mKNA)<{u$|6vyi6cOB&mXp$7;!^g;H{mL2FqOBh2555mxF=&4WW&_n-K`w^_( zwMl}7e$|^}X-ASUj!xWc_$X4wLuIL`{BeUbi76GBp#n17oJJTy$`yNs;$J|^Q6>3z zt0*E~*<FSd8r2Bu_3?v-q>kOtiJ$)3qNa-7hFCiN7-W;#WXPd6%S@4^d%_S;dv_Zk zRjxPWhsxZFi^4A*f2yUIo-nu**_y+`E9UeSGi9qeV{F|}#pLwW)6ge)vs*Td2J}O4 z?P-?Xt-Q>ipanjuepfSyl`;a=lZFE7T@D|Cq9+ZB3TSWaQ$^C@chy?@WDJgcS!wc- zMy*laIJh2=u7*L8&aF4ZkmgB4UkbgUW<by`X5GE<DMO4hw%4CB^pLBBSG(!t7`>G> zse(!Uh_M&#x!a)l<uYb&;&3{2Hzw?a5d!JP-3BX7lt8=>>^ATbkj7}&!v-^nk|Ci> zjVFUOxWeK|-s0g!bog!qoD>61@D%;D!7Vots&HvDa;^CAYCrAYZ7|CfhZhZJEtzT9 zGXTF^b7tb6!ERw-g{q=WaEe_!HPf}vU<9dOX-u&Cu|*@`OFR|rFx%-_DL$H-`(ci| zVNQ=pK^|FIsNDR%ft6zKvww3@A)9tgOGu&>OAOI;bt%WkvO?Ef_(3qf!83_`TMfPG z+iO(1j7jiR18Xf8m(OLcEurgBaa~0Kyjf((x3f+{P$-oHxT4->=tF(BVdT$FF-Oys zZH8p#jH#wpTp5DE$#Af4nLC`#ssJ!a>6`szi1NcjDvLQ`Qn`!W0C4t%p)dv<*nelX zVcG7c@JPB%8?L3E+p!d#J7)z4-;~AM4Y8r^bJ>Zd=5}Dx@~d<(Ry_`rio6|vT@A&@ z)ejlsq8(+6hci8KQ*~2=pQb)&NZ|t9v(nWc)r{^UgmlB(=bwjbYUM77z+XKSz>>=$ zZ)dd;f9;A)-7$FKLk7!bz!bW49z^?#u=-EFc^NeSAH3O#^}q8HeU~Kk9VE84HOLcP zAj&^QzE-$vK-#>t&|h;=8J)?1-T((aH%@7T;c%cic~>#Slkqgzo?Jm`x_gB{+jx#E z`aW4G;b4a@9Z?FcnkgZfW^NWTD9b4{sD{%fr*OAT2E_x0l_80%Y4%*jVGXVz4k4NL zrwS?b=!Y6OL#GR;mdjGJ;t5h7>NmSRw|}PtNOpVC$gX#Nio4$Bcf0HUtY3cDn*9sA z-u200cgxv4h+=ko-#%R*W@mT3>)vR7->%O_b^~o>w=S~fE`mK|cN<c!0=CjW#@lTa z-McU9*5Qb5p!Mz6XkNEg`gg0D+YQj{;mRPUD5EbN&}~fJn(00>`FUMy_U-mwzrg4# zr2BdZg$d!<;GYx<+wd!`DH5KGU>7ALg{4~d<h8NFT2?S)oN&R&3d()LJFFmgw(v`A z@Pv@^T7<I^!8^)aD4bM{q1Z*jbo|sU5=M_3lLO3bhEi=2yre-B$KY=PJKICp#D-Xm zN^Hwx;|9%Kt}*2WIekG{$CT&vEy&AdR~_xb9ht>)Iist23RP8BP(;&ku=BOndTSb8 z#coe^-5h@_sSX;Abf8Gf=?9B_`@s96S}dkd+l2wDF;dcE;U)!m&?o89s|BM<ieDzw zbD;t4x<%+EN!JT!Lq!sbhAVfBsQr4UaJSUbA&6WIR8B36**0XqdfN4rkSJ~0C~Q|r z{>{Q2G1z`TKPHS(gBc%AB|C(1N<kt$u|p^}$(s_VNPv1k=UX#eirXoS*E5TGJbm=C zFoib1CW!GP>zFH@qtoLF{!VbRLzy(`6(L+TY*JgpNPywUnws0`*o1~JEi4|{Sr%H3 zskHAPOtr7RDhR5n@U0a}!>2B#6L(teYV<UfX1pd8VGs=?m3sRD6B|?DR{gplMxb5! zp#v9S^;zWrX%8+HT9Uy`r6Ie71Ufxgr%njKt&F9$oZVJ1H_(ye9JEqni>DR4jcT3z zCdShJO?hygZ?;_KO&)Ku0e5*ZUYUU4d$<dBSV3oYnUm@HH-yp3SPgFq6P2rmHwA|> zV3dub6K@KU$}M{!4;|&jv8?HFh<<6R7MI|fu6j#IR86FfZwZ;IGWH`H%OJjnrhTj& zBcRNw^MGKc0f&WHy5fM)N4`qKiWV#OU$p9D8^|N8vzWtw@B!^VAoP$<9}vD!4Vl_W z2iT-f96Ygmfzsb#<){0jvcY9^<nK5O_C6)p;Y}-y&1)Drn5{?mdTiBE+;UMdMmv~| z_+N(wcfWvVR<*z04`uVv&~V*d939s9)=lMpTsY{5MPXs=&kA9^bZDB5+RmF?(wKLI zR8G42BjJMxTAXT*US3%VH-&Nj7I>jmR*E>kpjQaEhIN0`!0NP$4GZeq>Y!y{?qpCt zG|FyZt<a4tMIITZk~Wcn3e|BHEE3F{6-RkJoJlkA2D5UokS0)%#bP#`KxfyX2DBAo zQw?)66MeIr7WxA)O!CW)XJXBQMn&I2XWDGGi7vce&;W!es0<iF+=G;hA(aXiFwzvL zp@cEG2g$!fDrHG$L8}sVrzm64Ijy)I(Nv#0%#Y9=YU6PFKn=D0L7QGrkDU-U$%@Z) z_r++Wdru0BR5aHHrnBh;!W0@m74{6ItuMo{v9>u?M-x(v|Djv2L|oPBYg8KAyC6a< zEfS5NN7CpmHq`kW7}e~Pa57<WB+~sE#^qXqTYHk?>N@N}M82(f)s`Yv<r#0b$;RcA zGu9TKD^i7>E0TU2V;rQVj(06F(u9e|msIpg71Y(YzG2krM#3{#Mkp$4FxsW-CL5<C z#I57JAq|EC<Ga$ism53A(i8KI2&2=VwZuvti;evto2`dyVaj@Af)sb7u_&CTtu`K` zAJ-U@sDFV)koG-l+^FKGG-86v;d8iSfG(9%UV_Ga(^Gimz8%Ji@y_N2I3(Z-=AF~p z>Es%)8X&NM*-q*7E5?3w+Z)Ez<xb{4*b3LdIW4~C+PbP%aB9F0(ZQN=$R~;ejX9W) zA47)O{yBAx%r{bg1d~??>75K;d<@B$eS)!yEL=boC)dI;yRNl~8N+bVCd#gt2nT^! z+bW2y3#w`nz}DFeHF=F@O%?nlJv9GSBf={yO&pDU(-_CR)L5Ie>mA+|y7}}S*i>JA z-DruB!Vek$uA)r@P4K)UaG&|`urXP>`iOCyib{?dBdIynltAsrj3!box4ESQ$Bg0O zlzhVYIL&gIw9?5F#(!z)#H18WN2yk;X39w_e9LMhabA*^k``;YsMesNuf<;@efOnt zZ3HEM3EQw%WtvI<(U=4pe4o*lR|afWG*TXK*Y#*>sl)X7>VsCCfItW9HM~_enrzZr zD%17|`dMv?l@}nmj?HK<H!!oE??^XmOoLU5F?H=xV;tEyQz|Vv19)D1No$ujoiT0+ zr}nSmW%BCh*h95n7)MJF|J(Q$A1UjvWc6eQEj({@&<{~|+4DZSH%J9+J%MMB|G~5G z|KM4#3xPJ}khpbgZFcGA3&s`z`~P&d2B;|hFjR;a-Zk23+0&*tV)Hfu^Y8I8w^)VV zx`ubPbGcXmAfi37Mx6&*9mrWgFmLfK^0HvSvQdZy96uQ`h?Cru`U;eaJ8nUEY~}Ru z$Ou%Y=6_pKXl+!yhIV#DXejQz1inWI>)9zLLji+AJ%Sm6kl;nwpJ$vgrbgf~UHIJS z>V!MI873aGrO3}|0B4G(U$_K=bWUsfM;5i8GR7u%MZQb$2ktmen-Hsf)F?{!ex@%Y zXk&pXiK}XAY4o?W(l1f46vaoI66xInAT|O_43Q1Kc31FuMYIVPgg)wSg{z~{V($%z z{45xVm-a`SQY2i}A=G3WZ<HNa5P=pgofvJZQqi_a2tgfk7&LElR0>b~$0CCC#CyhQ zY28>8{Nz48Y804_g1G}n(%s*~6zVAE%^k(?!N}iZjHk!mHJYTK#+f9Qbk_t^O&p!B zG4Zrvw#l}<+tlWGx`-oeuCxDZ!T<1;3Z{2lR99aQ!pFR`%~cJE>S$}JYe$$%Tku+X zsLC`^MfVqDoU)$dR;vvmx_*<$p$-dIq;LG7QF3v+-_$Do>^IF-(MQWH1qk{vsp;eS zCPlv&S8KYrd$}NuuQLr*cQ3R^#~Mu6sc2b^NiV(7Wcuuq#@ODhZZR#<(^prUCWhcR zIS+6gZ@_eJo@a`u!R;m;$z^-yVTDgDHN8nEtUM<TTyA;}!D0ZA?Q&{PggSrh^`;KB zV`ig+jxMtdlIv02zf_UZsT)kY!fEJI%P>~hLvc<%yxR0yApGGvlOUzsY%<C~=1P^f zm`1=c;6Zfw$RQJ=@!mG6W3bOA7EdajGI4nEBv?pnTTR;p5{Sh&!fq-3__XONwKVo` zCYLI*w3+cS2p*f{r<FGwP09X-*#%;k(zbFODHTk|#x}Wh+smfXa1D6QnnqfgYBct# z!9m8hd7Dew`gnvUf>FVpMg&$EtVgOvc4HJM2@E;#S8RnLV3$W{)T0eXy75CFylN_t zg>SUy$YQFMk)Swo^cddjY!=-!Z+*r34oJbK&7KRXA@l~~K4m<Y+hJ`m|C3-l@(Equ z-Wj-Cg9;2H##OiLnQj@)RTSvy&bLg%3owSub{1-ubtd-)CQU>;fd=q?)?rhYyf_9F zS74X`970~hY`B8l__nEUOs5$`w)<8dHC>TtWOm;#_D6lXiVF*4f6S(K%P`o~-u=<^ z(Pa!zg<J-+R8_z!2DTu{dCoK$wDehoJKgo0=?R%Pi+cHF!v|%mun)?lY3EH3^YqXj zE}8ms=3nWXG`JJw@#ZzO_Cw2ZYSWoF($bGClW39N{0z;zR%e!GMw)d3#{vbgn6x~} zECv+l{nuDPCQHnbgk2X+AAgKUfJ#d^pMy04iZ%FM>?KctcDo!snGw%{d2oy<NS~hG zkY1gBMf$k(N$FS7>2O%U{+S46?8`~!N9lXfJe$1n@Dx6pZ2mRW_o)<f!vCede@!+U zSl<xZM02YI0E)oF#F?X?>S0a`C!-tjbqAlfiqZs^d3g%GB*0bKdy<coJ{n~{r<e9k zGe4vXm0D=|bn{y@>LhOuA5%xFTdXD;d6JKhC@jn%Rh<Qng)A(7(+qQ&{El>LhWQEQ z^>9xa4Sf+b=7pK&Cc5K0Xbf{J%v0nmL=~_|KnW>d`bVf)Fbw6i;{HFC=0kdV;}*<b z;lpMtjs`UgdE`6PP7T@W%~qHm%^WRmG~1=s_2w&8v_CgdOL2|np7Ik3PZE=u^cyeT zx5j)>OJ^-sL|xs)sij4CnAH*VY#(D3HFhBK?y8rqF_MYQJL2dX4M-&4ZY@_)&xg!U zc4Qf~9fQog<i5&!g-UwlVRKUilNszZW12cv%G+T+9o<ESkYg9K7I8Xh+VkeMdiErR z;u3M@WiJ9Ap%6OxR}uK0{U#9X(PRh{Wv`hl5YTjxi{Zd$mKWqzNPE9CAJ8eS?i_34 zrOiK?pNXcG3ss1rdCAC0%QTjI`e_j#RA22O@7uujos-R+R5I8yC7OC2ir3S_WtN`N z%rlZHR3HRGeSYLs2o~uREOxqeq9roU%L+prE?ClWlPn3+XQM3}dD^lac95Y_;Tk$V z+88N4ImvP=JYWNqW-On2`hmwj{8vs`*uQdQ3%oAm;w{ZTZ!&0SI2;ZL9&NQuaA@%} zQ9zDZ>h%2+vsiisrnCjc_Mp06ABaW59$Qe=rUYy;1z3F@2(S{S)KHx-8yQWMC&B35 z^Q0*Tz6Zhl9C*=7aXs}GIiyvi7`1c0!yy$+w$arlKJr`Jb5ky333meCngYh0<#_sw zEaVA9T$X*sJWswS7g3ILz}C0bHsC&2A5`#R6mZz8u4Z0pkv)WgHbq-C+cC4frUrk$ zneEv*`0G!zdI&B)_>^wwAvkBC$-G=ecnc~Q3z$HqXehuX6o|pF=v;(#BAzo4vIz2v zqyj7-gY4C+)Nfh@b`EesaaTZRR_d&Y&4D{0Lz_~kt~#e{4WtDS;$jQL*-cILpoNoL z7C@M#)He;bUL_6CHn3D9Ass=t2?#0;ppKveBqY+hv%Eng&lEj$7T$`lwIZ0~P>zs6 z+lL7Kv%5eX;@G+Z94ZXJOhfMw#!`}37*5|@CFr9<&%xADVV;mjhCIO(o}ED}*I2ET zFhvk)#X2Fmd&NyCA#)#i+S#jwID3I8x<>eGe9)yRuBw4CyXnXVi?wfIqd0CvzN~#^ z!|McDPHNz*f_4(&dyK7Qc*}mBVvdJWTtY##SRyM?lv0}O!nn7%1Oy<;)sVAEaQ8w) zgQ#dr*!Eyjc8h=hf;uE!5fyj(K$}f9l<GzU(|QRp3V-VqU6(;Pw*pKMbwW;uaK~r< zf?ikfiJRFUS;6HRaf9yU26T8%G1nuOG}g7%`RWn33m9q7C?S>VdJD1ooS^vbq%l_r zNn!(L4?8o|i_*Wss5r4n=#kz+#`2!6Vpgf5P7dl8f|DE=ZcxXhjHbb}pc#rmzpD#& zctY~D;{O<Uv5yBB3lC9wDiu9qK$VqM7U<E}4?2%VaRJ<N<}_lS`(&~f*naRs^Cojn zY?1;EVo4B`Dfa<h4r;@!Od+u}fRUl;#Y}=wc@T>}&*d0|gi~UmhBEZf0J^;woR)kK zO~@3SZcGa!&thFQwit`|1TZYwN0&KLfa>rFrhcI|L;Lr4rlhY&bWKG3IP*e6)crt@ zkd`S&%g^>RoD0xlf3-ploU%<r?4t}BVhz^&UXRcx5{x6Lk2qv7+E|e<*dsf6)dt#; zFQg81iv2tYA8o8_t(B*rQS871R_A-!9m5XAd=ccToroy~c=TO=c#3>gBE%`-+D=7N z#P$P|jOv;ev{Fl!kRRMT4FjObe=AFfHwNHT7Fn4dI-eyBpt9jYq^)Og8M739uz~^} zJ^iN;OZoIrK^zEl4Z#M?4c?X)bnf+vfX$^7=m8#alD~~6GzliUCR@n%17N1y2@#77 zaZ#-wvS1?<7<~1Md|<uvWp<nmM_!6tarOeR%8a89mE}Ph8$i4{42}KZ`>XxTy}VU~ zVsuw;q30;Jdz8@xYRcqYndpFX(PamrSAv<n?1ag4>1pRQ!8DAWEaC#_fpKCfrYz;O zVIW=Rr0GHcmDq_tb1+~~iZ(fLFvJ@bRO@z@DksFb3c*GtJ|UX23kAJ=Ohk6B0|L`Q zlb08YZSc2fW%^=lUt|T4r!&xpOd{k>%#eqTEM%mUr>m1px3>A4TaiyFQ|u!@K|jDx zWqQ0h0a_EB735~|FU*jKAE%tMU3M?1y_tS05PB`o!B7LM((PzeR;SxMhiC^Q&E1~- zdCH8f9Waq7M+Yq$D8#7psj&puy=5TGeoh5P4-OOzL;5ICfGT2~UBe|X@{5q5JKe^% zR<>wQ`WP+${uXT<B=l2GTj-Wqcmq|87DlL?9fO5DCypC`GYAVa2f)dkEg$GlaJCx7 zD@!NRqQOF6su&}1!HvFeu+X!k2-C~>Yq~I2FfC_3)XG{p9G<yNb&W2TKuAti#ZZMM z8*+=Y#5yHyRj`OLzqnRbjUB-3-=$L#Xgq^G3a&6H)FfH4!!W9e&J7lNCm_Kay9=H$ zfl;ucEE+RJ=s}fZ1@-8_c0{din-AC(#H&BM+i1l-mZbPe3d&~oVLPfTf`KI84oA8# zRwKC!<E<{)G|0^H2b(4cjXaFb9ilKYX4=+I=xzU9)Fyj>A>anKZ#ebox41)J@L z>cPT4kL9@@dUTYKby<$X`QJE>KY6%J86fnx1j%OiW2*D4=+(7Cm$TxM<Drj-)(sG@ z!0tOaKybMK#1Wt%5Y-n5Hl&>BO7Ihd>>iVanM$i=apwsTJkJ<1D|;dcVz={4ZasjE zsMZx3`~0q~5oEU1e_nVn(m$6A$+<xc`eS)PMq;*Oepg;#=$se?gFzvWgN^lnT_Vtj zxG3e2=~*aFW**$4YeA;G$z|HFP=w&{WKMs_aA5>2Y1RJLs+PLhIFCSQy6()};KAJW zIAvPLTzN2zJSpc1it>X+xR%eM+z_4Ua{egQA?b!>yA+V`z>L7E8x-e)<O|zp@CYGS z-oV{K3vhhYRDx6Yu5y^=kB<-%Cdp8M4{Y&QA-^S9L`JxkVN3yJmz*4zlOO_Z<ON74 z%^xV3ko+&FSTLKjrUW=~OcmB&sY*E+Z~~q+R?tF)E@uvyB2Rf&T+RPoT)jNE5}eNe zJ-L`y<YEZK|LchU|Bp<phox8+|NTBXyuo5i$JwFmh5zwRDD0{rQBX)BQ~wk6{x8_w zRXC+*MhQb4U^Qy7JJ?o~c@B1TiQPb<E3Od4KEbm?*(o7`>JRZ*7S&WeX;G%o6ZHKB zw9^;#7>6rFx0cTAJ&OlISL7Ebv#4_jzByom8-p8*`8)K3wxUGn4O4)NIaWZc)kU=u zs0gQiKYVQ2I11$$Q&^O)@LU9KXun@p{0klj*teHRUXYcGsiZ_0j&U3sA@s~wCQDf+ zEcNB~da%79ae?f5phPG_3*h|*8vyFUCODeloC<8~7X}GVS~FTOfCq$UH6z|m+A~^6 z%7%w#n-7_0WRfX&o$J1cIm9hv3j=QjnL|UcnZ_~5arvZAi0c?9#CG8eX9rX<tTQHF z&0{kNyz4wa*pnb1*?TZcR?x{qD$JuYKvwV4nYbL2*jMGD+s6o_FcZhe2*aZk)-VA1 zkYdob=|eze8C!_s0-4JK>kXV?%UmFqh}BJvJ=?^2jmWOLs1_;=hp%OJ9S{r7cL8-G z%sX(>U=gmZn6|birFpTz?`wp8sR?b=A}tz|dYJkM21!|O5p=`=J~jYTo0f~PPBPC6 zvBtkhYyt@m%AC#qCV&NW4uPkHf+~~I$<2ayL$C`}nAr}PICJ{K+|kKaTy#DZh>FjO zENRN{uuPY*bTfqu%geOhZtM-Mne5ri<~!uhez8-%>`V{;!(SqhLUgMkW_iewKH!!f zlmU=vFkKF{08nn2t`tvod9vgVWH0+moZRK-bs37!eukJW-($?m`j;y%nGBtRu$x(e z0%SG?as`XpU=f?Q&EV(`+W!Oq1|YLR{eiPRtD?Xa^hoK7zcMIsY-&TIP#a4Td%|F` zC~qk)YF%=zJvP<S-!MPDe(IYyJ(p+e85YL=+_Yz^B~`Lbv)mSG3|Od{MgY-`NTBO$ zBX^7C-*l?Va#eUm0j+7ZjG#4si$T>!_xdd<_}SyPl&jh#YmH@tieQP>$<}1qa3fok zCp-)fot<+nr7EeU&XV+pb>@ZtUJHa4?vj3Ku)P1f4aijpRqm&E2vNBW^DR1hV!p*J zy*=OZjEZh<wfJbu^T^@waht^;WwcrLY7$)8?Rkabpuu8$yG)eugPZL3KG|;4TxH2l zL4{ldT3x0}Zg$_1ZkimbRCw7+IU`59rN3Nd;Z@0KDm#C`<!WX3hrc1q5uFOWL$#4b zIU_F9<H!*gRV(gyxz<K9??u*H4r^`rlu45j*Ew<WSns%!@t3sP^>N{qv~s-J*ip+Y zX2^#xt-jiFA>7FP8yDQNdB8Bl>ajlythnQf(yWSq<A=*FMT&=<O$j3nnr`4R1EnJ( zOIxVm28)ZH+HXjroi|v@>9vXQ+$w#+;EaRYVGFPfN=X==!TSGkL?R&~Q7hSRv`kY; zTV68ES4lU%W;nx15$i2;4D`285%kpYslg*1e8}=#cr=S$3Z)F9)1Mpcc``KEb)BHO z5Q*6iUoBXs0xrqyntA@nbzQSr4kAlxfF{b%%CixgBPR?D<dJbfg-<I#Ga1=-Wy!Em z&dS`K=3+UKE!+fFJ!0uA311p|=*aSv<tv`$MqvJWRJa341mY#jI2MVNLJK9!UuZ%v zy+ulS+A>`Ow6(<3%5#QnHS;>8O?xdZ+8RgjdKkI(SrWUX!v7E%axQFHb_^>OW}zn! zS+X4iJlT#eKC3K;POtk97H|Aq6~_LU&uYr>G@B$Iwp3~<<_7e)NewIP>US;i!lgzz zY16wP0`&2RLIM4zF}tbkeM@PNi?co{TDA;D%IOpM&6kb)<kiAt`}g-P8|fYn_Uf_^ zkvg+Fm+MW|qfl{_e~94E`aD=q-A65@wCX4f`nx&wll7q`H7TGC1N*@;;}o{R2?t76 z_#Q%EQ%q+##B#v}U^-<L!_D*O50Hy^ybf82tUdK+T6|21jSHpn3xp%n%4336n*5Qa zzlz>tVT#WjvwVxBwJcR6@?PwE(t@+7C$A5Ocj~xCtDW{9x2&*EF1~UyFooqm^7t0C zH3eKqNIU_1>+Fv$^QD#(mSH@-{E3htE%>J;UrlR%v_wmvd~bP5t%P;of7bGyieer` zmV-O~ZLw16cZg|~3X#?0*gnKfu3Z8n@`_~$nf&+zq#)Y+iG`;@Kf-Nx=Z}_H<`WxD z2|vLGAAZ)-!5U1Eihr`4RfUTV>i@H49Q(cgXG^95`~=t!u^Rk+9di(_mR|nZ@`Ie- zIf;foiV(@ye}%^mGjU78e=Mt2vM-lZe!=pSiVi)8u&Esft<kix(wdlF-stxuy(BnQ zACB%Se=8Gni(p0sds3<-Zk*ggx7V8!>BGltakOFx;*l#Vk?A7#9kZ7A_*+_#zuiGs z|7J<FyWxw-n3MuB9bW*!211G`e|r^@96X}2z86C`o2=t#ep$SUR&0b(`jEwXC|b7G zGjDoc+L31c3Q^FH@-fmwxz<$zy;E-8LiLSSy|i<t_5N@g(-(p0%Y4>Uddz2io>sjZ z5o>~E4S{=(zZ`x>h2zJUPKJ{a4P)Ex)+%ePaM2^gz|psB;K{_?_vynbz|-g7MnR53 zt?|{@&xSEb&RX9FhKfxxW3>EK_@&XPEi0VJK3H%?t<^!d&arZ|v>v&M(yOhpsjPG5 zarYn)#(Bs#{*E!2z|NG>cwL~EzJL$K>1yk>w4o+&8#!{aoS7LeLoig-Ta*-HsEr)Z z8e|sU++kGXFpffAzhwDPmL2U_?jqd9u^pEj;VGQ7?#xxG@owbbgnvL_5oIV^%jF*` zeAJ#Gzs^z-uN#jvQF8v~OZwqiKZ-Noi(l~Zh``u&7zug<{Y6D}Yc!Ax8Xuu}FFsyQ za*UScJLK6|juaqM=2?5u3mO}o2QNDe)`faxjk|z)-M~B9fYdB!C{0MUF;`a^$mC$d zQOdU)nwNmk?3-uxgl4mZ`qx`0bnEATV;D%w4TNp5Hbl_!SFMqff4+4(5*P*kG3F1S z)&Lr|I%w}AtH&-o<;v_c!@$<^vO>?~>1D;h&HC-;Jyf+AEB@^YSiIMMVN{1B70mfs zV92zG%-45ySMh3S%omnu+PB<#pS+*x*)I^^zwc)xSowUIHG_sGrXlXKHylb{Ut!%I z9_?k$+Cgt+Y5uj=Eh?IKgEgO`zXP#3{G3@m7G6%?k`ef36VvI-QGK|TZ`f7}7RYFr z+g<o78R2E|Q^6`YI$0v52ozKNDr<UTx6T9PlT8pR<Wj;aYg+6@HE7x@YpRYlo53nc z%U4+|R5a`hAw|l%$%-g%dBaaXV@aR`XDr<ErbZ+S3W+(bOsfTY9rQwB!c>i~#UpkG z8nNCTlcBC;H9IwYAfPOc0ttxx5T{`+#km0a3&ItgRb<(%jmdI>v_!4J1_SYbq65KU zvW(iLZzf_aP%PL`jWY29VsPL&I1uK`%j9Ml?k<9kkqCdgkBOGuUzt%-CYzQ$p%>_b z2jJsmyVd%&;%ml6S64%W?y}korea|f?IbH@|Daw&SzbtjVr7u6u*fKe9Ouf(?GG=W z{&eJ^G114~S3V8F>al;y``z2@_I{si_IjtxU4|xLBZ5zkoIAtIHgBl+Qd+rBFy$&d z#3gpRZl<(OwJBhA)7sNQ0@9@`pRl0sN8pQ9x7=k-xFTTNMjrc%&{WYu0vNfoKHcqf z8DeRMSQhZf2jZ7!)9p*lN%EmRT^{nqbJo4N{EM5zJF*}RSTAiGLi0!;K1IU@k;Vnk zfn_yLNl?(XybFmAr3R;?dxdnZQk%waL*BBlo)@CcQ#+>`W5<HAk<;1(FlW!)$oKRG z7N=L&H3@XtwVUD*o{4VRg|=&UW(=dV`OCjmO3U{N7DwrSt2afiH+IT@t5<d@6lI<7 zC{!jmWoP<Z&01y3=q<9^cnlURJkL+3$$FB`B)~CFPIkZEWsa53thXLk(aG<4t90yc zYpz<(*h+Dmt=b%T(83$6721RlYBFSZ2K;`Qhi%YZSX|@>KSS-az)K__$LBecKQvp` zZSJk6%oGTtgYL6Vw?l{rk$2TqGYNsY=OB|vHfw}d%!E^7wo|XAv|Hg)dCRNjSQjI` zfe{7hul%Bz8YHTr;qEjmN5AG#hWzXkJ@D?4oh&K$Q6XNFjr&~Xp7mkqHe1ZnN*_K7 zbMl_)NNl_RHAKtrcj?qll*@D-U$qHR`aqBD6$XC3ENa?=8beGmE?w+lAcA#E9pY<P zm!4pq@&XYyVOLIHWMlu`W|6Ba1_%Gd%~oqT0wiAe#BN4{H96U-o^IZ3J;A=#HE)Ym zL^ea@{IelR)?c?EYu2GH))7q8SL0aHR8s?QY$Q<4$zCch$;L(gQn+fsYhCJpzja4= z=Ml#Tk2orP(3(cZ2dxR650OH$%ObEEgNYur4q*WN<3X!i(rmSsB#|cttot+jt!63X zZ`Rak%75FM!oJO=qt%7RVRYcQb(rLQ+qy4;UOQtQMq3slIaS*G)&uG6xc9=cgnW0h z9?lDQ#9;DEh3r5$rrRGw{>VW`tp||H_$ZukPi#b7!Q4BLGHt@g*5o91D9nRBo1G(a zwkmuNN>069*XC~^!^7z8`4a%B<pfe>ve%@mKeldF(SRSokq$fwwjw9fm`>txOku+h zR$hASq}8FJ$dO>@GQWUIb8J6jwRGc`)(a8J-kJ3+V)6EUW5su5KKUFAb;}v6i}szd zc1W{+us&&`AAYuibGcwJP&#KD<78Wg{cEiDKxf4gDVDd@wIPCz+0@$DkSnBzINPRZ zdfj4kNVk}6gH*Ix6R+bDdnw8)#M2gAQF0yo(ge%X7tqwPHZgW+JXsOF5RdO_47A#; zl=3V5MMDu7G0J<&*CSdpNOYmf^H$rn)O#<li^HVNUC@9e?Q&W?eCci18RQ8?3Qi66 zh`05mvL6s7c)SUo;mfZ>k|O!jc$?d~c&E&?DGc)n79$Fglx2s{fc_Or%7R8AvKm2; z4<y;rqFL+k@c|ozWuo(XJKM6zqQ1+<C;y2?)J))9S7^7(AB%~Rf$eN=Y%0Fqaw5`> z#E}8Gv7BoVhqU6TsHVr}LY$Nxm6snCHQ_n%^?U_!*@r&ib>Y=@lvAk3dtfZ7GSQaM z@rAJ`J(q~D$DB{JIVn8}5lC_jPgx4G%GD;>KswWro$r9fmaHuqS2(J85`B|oOQv3{ z5s6lLTS_DiOUB#H#}T9{!*EBkO=OWHYI-)=mPv8P@FluaavA$XU22N0H=%8j;Pjl# zu8{m8#g-+<4Dms)K&nhb7l`8I!{_DD1`!E_KXn@8nOK6r6eSxj8@djh6P%^WQ7I&0 zus{~tf18=rj-z3>BQVsPYU8z4Oloz}5e-)L&}`J%bToyd(%DGGdWfxbvmbFzTT^Yl z8IMi-KEW3MB-NIo!1=NR5PzUS&cL;IS`i0UhV0X58ejEEw|U}ZIg)(_NQMSn{`^^( z<Dq3>;}3aFWBLG(JI^kL#tJMlMs*8MLsDF&4d{1Q-p?l(E^fJk=I=%xUpa-Ls|Z?z z$`dwqG>bhC_FW;Ta|?|jyu67H#v&vg3luG{Z0HfCE;d={{JU0rWS0iWce~BZxjpjX zLnqrg7NG_C?0p2;-FBx{9=1Uv!^MO@D>c6a^!QhQD?aStK!(AwJ&?GOoj4hEArt*h z&a@3CO;1}NYV3<i-`T@vl8$HE?o<V^NjlZrmZhS5vTdo7JJZ${MMeKa4%6f*$ke-O zfNfxx+oJ<)gSy;W3$Qw&$~w<PoZXOX@$JTNEGJ-#rltaX6rxKN_We753xvoCEZlMR zr}%OK+~y)oPPw}DX@M<OZS4H|LqKKZsh6xnZ8fUPJ)s@Dbi;{zTqj6>A7*O~PrS_A zNX_r^csy9sBb#(d($&LlH##)T`6Gk8b8LxHR*mglF#@@1CCw_^*Wom94ff50t8D|- z5cM7O^=jKI@)f@2WouAT<!%Ug`TJ}xCHoK1P#wW+aFrLJdl-9%Ej9v9rt4BYMrrEp zHa^^{WHfB4Vr$l_gyOd%r}tfF1dDX*I@|gPdiNmWv6jyV{{Qx&iN`5xsL~sy3bI{@ ziz@T6guu)ih5Yl^Znq5#R|8unD<6oINkjR=w#CM_+7=X-I9OVO$&A`NLWsyoJsz?3 zSL>kkky8Y=k|EY+m9E`syIvaswG!prX-iZ=VQ)nePf!$%q(cg`OiIt@6JuowsGc2l z;G1BJ@%?PH_VB`iKM+(|SF_mVukRAf8Bok(3J7`Jpi)a0G!lJgyGtWy7wp;VXx7`v zP5HK3df#MkSJ9IiP|Mpa_FDSQVt<T|9J3_SS62HF`oU&TlSbR^A1NQb-FDCXj&bE- zVdKiFPlEjkx;s80(!yL=l=N8;JlVHanisRkPE~$FLIl%sXC&F}TDdHmZn4GVGm!lg zv~i3A$b~q_Sg0C(lVE><t~{9#W5o&H><xx=xY<{9qxI0`)7WHueQ0j7eG*(Q_9olo zrE|&lbG*d4>|0_bez3isr?2192$ZqZY3?Y1&gR}?dm5RGoXABn#EuV0Ziq0@4cX2V zYAdiO(X#`Pt9n_hGnUGhIe9w5X^m<&r(_t0uXKG@Y@bCBk3_vUM%q84<+Gd|W%`^* zPrbxh#MJ}_IpJHCk;)%Ujm%cY!d#_+VT?hRrM$*D9vBK`YdONrl~3p}&mic=Pd7XJ zs#)|L70!3g)yR=*bZogZoszBwIR6}x7)cQ=&OTJu<}}gh7AM%6iOKMz3NVp)QMJ@* z<J@8oC>+|9YPYpGHF}2QUa;HHnW$bA<7rQ;6W>q46Z)jZSxU`)oH}~G!VbU}Iq_w! z9vIZ#!yxx#D(&fX;JgNE5L1LkTHfk(;rocuh&_M2&FP|b3!P20--}4qh(*qRRJk-I zhPE$qj+enuWzf=Ad|oNL9jz5Cau(2A?M_}Tuk87SPPaz>z-7l$r(H^2>_pV^w5w2O ze4Ep10#^+4o40jw!|bN|R+qd}$+yI5!5%!m(%F+fxXRg|P5TUGy6#%yoc+7gWvAM! zoqwZ`vz#K0Tk5RVu@6Sc$!TdqNn#4ajcDpwjL)T=UFb}v50^Sq)`_pP0~Mb~i$Y@Y zgD)aK|6_X)9)E5Ca7IR<>C5m<tFm@{&JO3Qtl>4?sj+uQrTFfslt?in?Rm7*mxK=u z&jcE-xYC|T2OmgHq{I>SXtEapn0^&@15G@HEUXR7oC!8ZT5kV*5C|naI|R5}QUNPe zRIt*yiul`;qPt8^4t;u+(@aAhPJ^^>l)VZX<f-;oX!SG<@YoD|uWH3KyIR8SzapgN z<@Tj2Jv^*ffFEKW$jc>}>AoUo6j>|mqo}FEZdF&cG&R%LUVC!NV8r_c_O*;q?1^`F zQ@hNKE?G*CRoJhj@KXra%08=7kHOACpa6)gJNTBo!vm;@O<u=@G=)wCpP)4K8sts3 z&)Fl&m<2?fxjV@~vu2@_6*qx<5+~vFhC_Vz#PaTKcst=L4<bI3-2tgr_V1B(-yT*A zMKU#EeFP}vMI)0i2dz3OVUFFcj!{1A!oKx=^v(3UrE~U#gy46@<qy6~!x9q~TI3Ii zr>(9zRxvRwtU`JzH{r2hEopsz!cv{IacDwxj`VnQg2OC-iTwMp$+h&+^$Dv|@^YYI zazuBrQ?cIk-`4kiDK9MSCFz<Q5{?8vEUt99Vs%3Q=+vs&S9$S~K+Ijx_&8?dl}N@k z!&^Gh3+e(H=}u%DPI(|fM+>%t%6&g3DV7=@R>jgVE<$U-^mKoL%<B_+(7h9oPL)-l zBlQvZuG9L2ivJ5;{c`!Pa`9P@M731DA)$ws3|qsE(!KX3tcax#o=gC(S%GN6;}IGi zRc^(YdOVt7lh*7=xIZF1T2B?ENs*@RPFNDoDqkVFpGw#pA<uNl^*?WvPCb)Q5&9y1 z>z;)EY4Z2mzcCFgxOPKW*tHv^XFg8&F1Tidufl7jw?9c(nT4E=i7#f-$nlA3>_pa* zX8`srz5>cgwxYxbBXx!2CzlkCEh(Hth3z;7<ZUifiLxqy`|S8cy%ak>F(OljWx|(( zilz7^iD`kJGNt;Zi9dcX!!muMyT`1L!@_2LEH&3Bm8n&E(hJQ=pG8RDw<Yy|mhQ+- z9wg1pN)}ZTE{DfUeZ0x-DjD(4&Hwu0d9YE>qh~6U9}RxF{?;#@T4|jxdHaC>Q`?n? zMRjER+uig6vUE2MO+)v+-S=KL5d;F}Y1{}Zf+!H9QCV69R76%aF>2h$n3;SoL&Axp zMlfSEFL6s=ym3LzOY%kEXxx)%B4Es95)%`g7tLhDck1?9jqm;UKEC>(>3gcqtvYq; z)Hzk>H@e)7IFEwwyRuBAtmy8E_x>2qFr?r;Wu|WSVsz~eetMo0w{kuKgUS?jDO4?0 zvhdMTs}UA&W2Zw}gUyK1Z<1H1#_8H=I?-P$(+xtqUx*?L=^)791(O3E*JKa-Sj~dQ zMJ*&jPjU5Z>OYYFTwJ1R0(xW&zbUd^?;zrmV;cs~#|f#>JY7f#@d-C{Ocz?9CkB@# zOQm39kyn>b9;4hiE6}vXaGi@OH1MFLEzSf-D+H^TB*r59f*$lZOsvH9?1s@QO7B++ zU#ej5M#Q?mUce^9sWLW7S~h{*t$@dCaiKdfMvW=D7h3gDIEh8~1c~3IXR5Vr58Dt_ zv{Qw_n8_I289fWljgu4EM76wcgp#*y9N7d*_DSqOCA1a@W+*FW9}U8biFMGCZFNY; zi&?V*HeJRr;->elPN=wsmO#FRGeG-R2jUJ+Mn=v&#uh4lG_bteiuYl!S|gxj3VRQn z*R5d?{fRXLwyi}r_ZvB5+X+;sD~j0A;MwSo<;9GwY)sI?*`PRq3xQXsvJFuAS2i2U zyEufA{Z6HanO)YK(Ed0Z2HbR3O*a++&rV~vd;iBvW2dtx6|j9u|ED|uZjFTtrR+}c z(+(HAY5%Z>!|P@2dg%Qp8x5b8v%xT}oQ*<L;-HqpBN;Ug>{3212zqZLJjDy;Y>M~E z!PG-(dPg`Mc$C!y%Ofjy<;g!=V_-xI>b<5=6qWfEY$6opVm%vb&;nqcY_zneMwlBU zIpztk2f;H#EFn<egqBfngJ97=iSUM%n5$sE``90hX%sTyn=CXIpE`;w@DyVAZ3;#_ z<&pEzxH{h`oQR?47yG@mv>}UO8nUFOt?UuE8c#J%%%40te^Q=vToI;KK}Ae%qDm8Y zu-DWub{Ct82|(E>HOXtR033~~NNL?J_Onpfw^yNqgKx49Sdk`#4DhQ24zAZkwY6eo zy!%Zy4My!(sw3T|r;}9Ux&oaHcV1N`K<^RN01b&g;2qw^x7ddv>@5~^C;g0`uW@g& zGo^iRvDf1aL_K6{Zgy0UQ!u1hVU*4hB^^A+e&beNqIBXSYdZ_)b95S8%Pc2)e(Fi` ze-}VaQZliBNo*LifAnN=iQwF>(MCStIbi>4v&b%rvoCYn@U(?8&>-J3D|J?7HLN<q zneod|!~s<s5?W@V2`S&xm8-_QOawZIoPljwgx5{o-$C=|oLPzOrY+%kGSQ&EoePup zwsXrAa9}GJV)VeE)I5n!6Pa^Zwv+pyErkn)mrY!V6t<iDw-k8uNregSpW@UoGLsWw z(=clgOuxhx!t0l~jd-{R?dtQ0l?<O==8E9b0d*WSb)rFh>l2QLxmufvEE(tws^CJQ z=PDNm`k(E%6*pi`m}8%E0vsse)WKC`OGjP<Zis01kk*3n5KTQE6H2Or$|{8Cl*yW| za$0Rwm2A8~<!QSaW_*P_wO62{>-$oLR;s+lg$dGAzjH$z^60(G=IwqI?GaKE<<Wyt z1!9!+HES>Nu7xx0_RGccDw4J3{BN&hGt4VePP6@U?*n5N*#BnK%R)4}vc7iy(@t_y z8r}dt4s!pdLZte7T<7dXLXcFk&VJM`uX9PCY%7o)yX}AQtf<o2*X)%Qay#kY=538B z!Gn0xBRa>c-ga~$jvEE=d@W{tPMqSXfaA3aowQ+!BRNQ}@#vH)G;XImVm&n;Ds!l3 zL=Y+M4evN_tWq#oV1&+LmQoHmyyn-T!;Z5{z?#JeLr@kU1It3~I;ee<jew9WeuPw) z#h(!1y)ND$jh)8#sL7vZ*yH3w;oO(38rrM)5UH|)Ke$4E2vWOvOlyECe+QD=S+2R| z*DW;&3`Pdd={<C^AgL6(v#`#Q-F$eiteF<zd6b0@ASL};L(X)1Oki@DtKY-WJX9Gk zmdZ6PYG_`B2W)*)Tt*s8L;pl=6Xs*VCQ}ms7d{ESd=qR@jgxG);N38#2@1P--AGs6 zfi-*8i0kf|_al*BnRB@s4BVG@^93;UEE^jAVD_ZtJ^WM*Uk`L3T+a=DDR4!&DV=%~ z<*EG(es!e$X5Q+_edcP2y2(H68oH93yxpb3i?0U-NyoqBSI5AB&y*2}CZp2o%S$U$ zm*k|*NKYM_T0T%je4=dB(T!Iyk6wBopN@72x=}C>mHc)ih}xxkdr<>ee&-WI$OUX! z&TC+^6Z>WR+Boef*Z9~+;=M|8CP4n^@@gZ<ft(wqj7Q9N>N^ZRx}HnTfP<%%F(jo& za%sk})C})NhipVJP>D5oyON|W<gqen4nh<BnV({`2`+AArH36Z_Ys1DH6k<+Lb}Vn zMP3PR1lyu<9SDcQ&uuyf9s`hHv>M+UQ~tOFRX%lu$A-x}LQWEAftkOs8h9>?j|!Ik z5Aqj=YLwZ&aZ#E!gHj($m_d61v8e--!MMh;`@iE5T&#}|gZ2+_n^uoq4KMd$4LACD z0YgcCoeqwp*rB#pmD-3Tzkee;@J=7kAppJFtinE%&3~}m=PPxkWr*@uR#q;pz0a?) zK!`;skrmwg<HlRojba#5SeJrZWfAJ&{(Kv%-+!oW5F9J4Q{#PeG((HWs!gyzR;Yn} z4YtVOmc~ZxH*&6UbE#vz+h&%~)O=F~osB}IbX*iT1sopDAzlb4Tu=g<2z^qjAS_o% z*W-nD%otK8M8oeR(8VM>3EoaYFU86TO#+;J8;yhY>4MGWVmg(Mw#Mddaptz&Dl_O$ z*aj1<@lZ&8#G(%(%)#bdD_H=8oQ<>VNroX3D<X#jeA{%i5t3wZX&i;LriM8<8gj%O z7g@6Xo0CTH)@8738ADw5vmix5@z^{vaA^pgjlZF%1!tLSi?S2<QQF~_Tqq`g4gXIY zLT3=4kg41vxZE7FV<J0Pqlfx@bO$wM2*aiFK|-7YcBP^vy(<aL-W{pv5xY)4zVNf> zV^kXY+I9(^j}y`an<5<y&nisP>NH_}lDyl=Z$5PYP9ekGDTKt;!X?iDIMxUY^pO58 zx+CttAPkT?TZPS5>B|FxQYSSX7OqCX^W@*#PYZEcd0qH*$oLlN<auF`cOi+qDBM%( zrq;bP_3F0dg_7ZlFxvf{C_VYHkg3yMt~x$-)N7NUg#%r}b!xkGq+2+t3I7bgU-M#C z`7t%aU=pzPUkS}HnzJL+T(@9pJ$@|L!!2&H)JjKF<-)mSzf?m^&NOnLon#hB;?r<9 zmAa(1iHD4HaaL6eDwo^e2&1(4hZDbQy>on7>qM0a&IO4k>9bqHVnyqfGe#}OFlD)1 zrBFpixj*>t+wQK1Ew_c?;VV}!exm2r4E7$b+4r)go418E%GT#{EsBs<!-;rU+$%if z;?oXidW9{DA<~>X!k?5<{*QuD(Hb%~3vS$sj+8dt6^>|I=cI8gxz}Hd#}eJ?Ur`EM zND`20Jo7_L#p}Nd=i$BEMzd)gs;5~Pz(oJa0?aM4fE)@UUt1*hzL2MYy`RQLs!%gR zeFDa1nhct#aj4@E;)0~il#|KLs&PS*SChl5XfG}#795^0Lea0Pk#ps^!ata@3bkD^ zX4oP59YWy3eMRJpbs`6smSCoO^yg||#kUyE`TuS4?PKC8wX{Jaeh>`n^<pZ?7eO}1 zB%v?b<57`te>MUUp3sZST)0|2g_Z%(BeCk%k5gmdj6n>C-wk3sI1gcLwah3cks5Gw z{D2x#rK3i1i9&@MK&mi_4O+=$6?+s?Br9%FNC)krQf;4ic<B?%l{1!Z(K8GwMn;su z<r&5<|AxXu(XM&v4`+Wk-~h*9k+rX0oIl~Ay*r1#@&wv<ShN(yX+0cB6o&@M;Pkf> z#aP?sxn5sDh`Uk+6T>uK=?%N<s?tF$ul0|lY}j*|VMvLhsysB8fvO~t*9<Iwae$jd zp06FlH%Gw1Br#gKc?6tJ665+kQGD&|KF}wN(W=MiDgd#J9GX$b!BdIcZl2;?^OLx( zA|;k;cXp=&HYSUSn#uORP$U^=bC0T?XBblG{xac_;9rwPPBVP%Hj3odd420N1H+JF zrdr8ct_0^mQS>K~-)=<Lg(TQN5P846Q3<C8;xHKUJ3O`8NuL>3&lp=2hUm~(Xhzi0 zFev2#6rDc|zGo?57*c3H)*@g~iWsl?*K4nM+K|~`&t-PNjTB_#Vto*lq@YJHY>*hL zc_!>t&vSA=RzFiMDsgu}3SD#1B|Hr@2;Z=~aSuh3b-pq79VNq%Vxc<ak$5#6`9d9Q z^p_ah#eesZ%WvQDB2&=)Awt+<VJY%~Nq87T9HcptwbxC7F`^7nlS8D^E#C64FfUm; zejeMa_IR!2;LBkD)|-F($t$k}yz9NX(PJXfSRjRFzNuFYrRidV)-2lEg6giqop{ma zAX)w1xjS`(Q^PQ%M0=aIW79_lqmMKjA$P8)i=o<Y-aj1l)Fd|{!4GOQ>}X+Y@ino~ zojY*|x)C!(QL8w#uj5}!Wg66z__D4kxFkc2RkiQXz~=a1gyqb@k>mby*ZU?bm#&{$ zGH=B9pXM?QDI&$yB^R9;6obWBt>LA0Tc^!)bJY)=oFcq^Q*O`<QJG?-cEyxStDbPN zW^>Ts!wi!|5k56mOE@*dGgh53(!c+Q{5?M5$3MARm!a|CzcTUFwxK&sCg{r)jdaJ+ zpm{{0`Kz|zOgG{DheSN*>d#_7oI8r}=OHqo0JjkLj&89Zx*SFL)^vA^h&HE#8Cghe zel%j*M$bUgkZ^(g{@8*U=9XYG>)&z+VW4RF@ZAE%@u#&q_;WUjV@l-_pH%fnYxD1% z@OB-+ZcEgj6%rN|PH^|SjImZY1bcnQF5LJI5qa$|*E4g}Hn&Xl2VL{8^CHq91RJmY zb>olmQ)c<ekq;dWrxVp>W&3pS@WY~=9v?CzeAs7!%SGLfy0(OnXi9kgugOt7I2bDD z8KN;i2Tl(EY2FV{jN)yLhYs<@;<QI{{5paV&QZT|YA-IRq|n+a{{sX&BMpuiZ3u?@ z*eXp;h6ayQEFFjOB2wb0W-~u_Q_miX0zctfF<^Y!hvN7g>~TMIX{Z=Q)$Rhy(+|Uk z*8Ctp<bX-T9>hY%xzBt4h>D67dg?g)+_k?wOf*w0IB2l5K;9G8dca#bR_GgvE&2_L z&CwqNz+ZOu9oG{?08x9W<2%b2EpFK%s>GLSUJ+n6Tp41(%vC6F_s07)hpdLDC_={@ zt+-@ju~MDOEHMH%T1?iymgJ{_`)6VG=dG~KNOH0!YDXWwNUJ$ts#S77%%5h!%SI^c z!<&>}Pr{DyXK)goDl%{~TYiY7mnd%*$+V`Y{nh23+v~pgu1fAG*K*(pT>E@NN!GqG z=t1e68qHBFuK#3c4!rkDz0gWGIo!!XkvQ~Xg!RM6-J{h1_M?AKbdNWYyO4tR-iX`2 zk)`h6A$KuUW0Til0OlNC5&P&-?7fsX#ysR%806K3zLw|T*bXGbOM0T#e=(6o!gqir zu(9S^+?eNz@w7+~>&tg`B~WcW-4G3P#-RE2ZQFj2$s!v`B<{N*hG9sdjm@7<<LW#X zjm<z3ZzLG)Dq1;qet|k`9JZ48^FgW=5)W>{UL(ao_1uJPGb|q`vi(TBAz};@(<I*^ z$qhoXvh+WwR!AUO>Tp^cfYS~HBv69vtIV}~dbUx+kNY46-<hU49F(UkbH++m8G zL_AG*7={#|^xE+)rzOWg{8B3|y=!iEQslm%XduITVlA*{JTkl@?<7UyjfP@GlvcyT zezCxbnXHv!c-gtr9`Z><Lg<jFza(~L#d_v(V1P7WB4<2w##5&(LcTB%b_6xJ?K5Iw zT0U-Z0!gUQ3q>+|V=Uz89FcG#UyRmN&$vW2MLGQ`x~?m6E;<YXI5bViu26Jd?>~AI zY!qEhlGR0bW;=_y><h$*e#FGx-!&7VQnAo>b#8^5c+_q@QIj?SS8D_JDb=z!9#FzC z9M$r)6Ed+Kb`ZL}Ro5sw5)p_j!wH6k=6J8(MmRP>*K|h+gcl-l$IZ_vV!xO{K%>9T zmx&_*qX>BNnGh$`e?<{fen*Pqg7d7auWlBKF`Aj@zNYAWKCi&36sqUojfuEj?#%es zLy|<Kk+`=UK@39*y<1E#=iJf=y*b!e{Y#rXlwRi-R7?`1g;kaElNg-Gt5*S%`udcQ z^6NLawZ6wMwo}V6q|go8>o~YFN#wL2UTa)nZFSSozOq1d_s<p%h8CeMc;U;sWgZ$O zdaza$iB?tjVh&y|5=(g6mBlavs7|##%`x&CrMZ<b;g>jc5f2tkCN-Kk4D%TN3_w`x J;rluK^go{0SK0so diff --git a/arch-config/.config/calibre/save_to_disk.py.json b/arch-config/.config/calibre/save_to_disk.py.json new file mode 100644 index 00000000..016731e8 --- /dev/null +++ b/arch-config/.config/calibre/save_to_disk.py.json @@ -0,0 +1,15 @@ +{ + "asciiize": false, + "formats": "all", + "replace_whitespace": false, + "save_cover": false, + "save_extra_files": true, + "send_template": "{author_sort}/{title} - {authors}", + "send_timefmt": "%b, %Y", + "single_dir": false, + "template": "{authors} - {series}/{series} {series_index} - {title}", + "timefmt": "%b, %Y", + "to_lowercase": false, + "update_metadata": true, + "write_opf": false +} \ No newline at end of file diff --git a/arch-config/.config/calibre/viewer-webengine.json b/arch-config/.config/calibre/viewer-webengine.json index 9560acb2..6b22d23e 100644 --- a/arch-config/.config/calibre/viewer-webengine.json +++ b/arch-config/.config/calibre/viewer-webengine.json @@ -2,27 +2,27 @@ "geometry-of-main_window_geometry": { "frame_geometry": { "height": 1154, - "width": 1062, + "width": 2129, "x": 0, "y": 0 }, "full_screened": false, "geometry": { "height": 1154, - "width": 1062, + "width": 2129, "x": 0, "y": 0 }, "maximized": false, "normal_geometry": { "height": 1154, - "width": 1062, + "width": 2129, "x": 0, "y": 0 }, "qt": { "__class__": "bytearray", - "__value__": "AdnQywADAAAAAAAAAAAAAAAABCUAAASBAAAAAAAAAAAAAAQlAAAEgQAAAAEAAAAACFUAAAAAAAAAAAAABCUAAASB" + "__value__": "AdnQywADAAAAAAAAAAAAAAAACFAAAASBAAAAAAAAAAAAAAhQAAAEgQAAAAEAAAAACFUAAAAAAAAAAAAACFAAAASB" }, "screen": { "depth": 32, @@ -56,7 +56,7 @@ }, "main_window_state": { "__class__": "bytearray", - "__value__": "AAAA/wAAAAH9AAAAAgAAAAAAAAAAAAAAAPwCAAAAAvsAAAAQAHQAbwBjAC0AZABvAGMAawAAAAAA/////wAAAHIA////+wAAABYAcwBlAGEAcgBjAGgALQBkAG8AYwBrAAAAAAD/////AAAAgQD///8AAAABAAAAAAAAAAD8AgAAAAT7AAAAFgBsAG8AbwBrAHUAcAAtAGQAbwBjAGsAAAAAAP////8AAACIAP////sAAAAcAGIAbwBvAGsAbQBhAHIAawBzAC0AZABvAGMAawAAAAAA/////wAAANwA////+wAAABwAaQBuAHMAcABlAGMAdABvAHIALQBkAG8AYwBrAAAAAAD/////AAAAFQD////7AAAAHgBoAGkAZwBoAGwAaQBnAGgAdABzAC0AZABvAGMAawAAAAAA/////wAAALsA////AAAEJgAABIIAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAAAAAAAAQAAAB4AYQBjAHQAaQBvAG4AcwBfAHQAbwBvAGwAYgBhAHICAAAAAP////8AAAAAAAAAAA==" + "__value__": "AAAA/wAAAAH9AAAAAgAAAAAAAAAAAAAAAPwCAAAAAvsAAAAQAHQAbwBjAC0AZABvAGMAawAAAAAA/////wAAAI0A////+wAAABYAcwBlAGEAcgBjAGgALQBkAG8AYwBrAAAAAAD/////AAAAnwD///8AAAABAAAAAAAAAAD8AgAAAAT7AAAAFgBsAG8AbwBrAHUAcAAtAGQAbwBjAGsAAAAAAP////8AAACKAP////sAAAAcAGIAbwBvAGsAbQBhAHIAawBzAC0AZABvAGMAawAAAAAA/////wAAAP0A////+wAAABwAaQBuAHMAcABlAGMAdABvAHIALQBkAG8AYwBrAAAAAAD/////AAAAFQD////7AAAAHgBoAGkAZwBoAGwAaQBnAGgAdABzAC0AZABvAGMAawAAAAAA/////wAAANsA////AAAIUQAABIIAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAAAAAAAAQAAAB4AYQBjAHQAaQBvAG4AcwBfAHQAbwBvAGwAYgBhAHICAAAAAP////8AAAAAAAAAAA==" }, "old_prefs_migrated": true, "session_data": {